diff --git a/.buildkite/ftr_configs.yml b/.buildkite/ftr_configs.yml index 7f84f8e38d2e6..b03abf9a15c67 100644 --- a/.buildkite/ftr_configs.yml +++ b/.buildkite/ftr_configs.yml @@ -7,6 +7,7 @@ disabled: - x-pack/test/functional/config.base.js - x-pack/test/detection_engine_api_integration/security_and_spaces/config.base.ts - x-pack/test/functional_enterprise_search/base_config.ts + - x-pack/test/localization/config.base.ts - test/server_integration/config.base.js # QA suites that are run out-of-band @@ -116,6 +117,9 @@ enabled: - test/server_integration/http/ssl/config.js - test/ui_capabilities/newsfeed_err/config.ts - x-pack/test/accessibility/config.ts + - x-pack/test/localization/config.ja_jp.ts + - x-pack/test/localization/config.fr_fr.ts + - x-pack/test/localization/config.zh_cn.ts - x-pack/test/alerting_api_integration/basic/config.ts - x-pack/test/alerting_api_integration/security_and_spaces/group1/config.ts - x-pack/test/alerting_api_integration/security_and_spaces/group2/config.ts @@ -156,7 +160,6 @@ enabled: - x-pack/test/functional_embedded/config.ts - x-pack/test/functional_enterprise_search/without_host_configured.config.ts - x-pack/test/functional_execution_context/config.ts - - x-pack/test/functional_synthetics/config.js - x-pack/test/functional_with_es_ssl/config.ts - x-pack/test/functional/apps/advanced_settings/config.ts - x-pack/test/functional/apps/aiops/config.ts diff --git a/.buildkite/pipeline-utils/ci-stats/pick_test_group_run_order.ts b/.buildkite/pipeline-utils/ci-stats/pick_test_group_run_order.ts index dfb384d7e3998..2468111d6933b 100644 --- a/.buildkite/pipeline-utils/ci-stats/pick_test_group_run_order.ts +++ b/.buildkite/pipeline-utils/ci-stats/pick_test_group_run_order.ts @@ -389,7 +389,7 @@ export async function pickTestGroupRunOrder() { label: 'Jest Tests', command: getRequiredEnv('JEST_UNIT_SCRIPT'), parallelism: unit.count, - timeout_in_minutes: 90, + timeout_in_minutes: 60, key: 'jest', agents: { queue: 'n2-4-spot', @@ -409,7 +409,7 @@ export async function pickTestGroupRunOrder() { label: 'Jest Integration Tests', command: getRequiredEnv('JEST_INTEGRATION_SCRIPT'), parallelism: integration.count, - timeout_in_minutes: 120, + timeout_in_minutes: 60, key: 'jest-integration', agents: { queue: 'n2-4-spot', @@ -446,7 +446,7 @@ export async function pickTestGroupRunOrder() { ({ title, key, queue = defaultQueue }): BuildkiteStep => ({ label: title, command: getRequiredEnv('FTR_CONFIGS_SCRIPT'), - timeout_in_minutes: 150, + timeout_in_minutes: 60, agents: { queue, }, diff --git a/.buildkite/scripts/pipelines/pull_request/pipeline.ts b/.buildkite/scripts/pipelines/pull_request/pipeline.ts index ca18f62c60866..5722d8ea7d5a3 100644 --- a/.buildkite/scripts/pipelines/pull_request/pipeline.ts +++ b/.buildkite/scripts/pipelines/pull_request/pipeline.ts @@ -56,6 +56,7 @@ const uploadPipeline = (pipelineContent: string | object) => { if ( (await doAnyChangesMatch([ + /^packages\/kbn-securitysolution-.*/, /^x-pack\/plugins\/lists/, /^x-pack\/plugins\/security_solution/, /^x-pack\/plugins\/timelines/, diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 396e58d4b16ea..4b598ff43309d 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -12,6 +12,7 @@ /src/plugins/discover/ @elastic/kibana-data-discovery /src/plugins/saved_search/ @elastic/kibana-data-discovery /x-pack/plugins/discover_enhanced/ @elastic/kibana-data-discovery +/x-pack/test/functional/apps/discover/ @elastic/kibana-data-discovery /test/functional/apps/discover/ @elastic/kibana-data-discovery /test/functional/apps/context/ @elastic/kibana-data-discovery /test/api_integration/apis/unified_field_list/ @elastic/kibana-data-discovery @@ -22,6 +23,14 @@ /src/plugins/data_view_editor/ @elastic/kibana-data-discovery /src/plugins/data_view_field_editor/ @elastic/kibana-data-discovery /src/plugins/data_view_management/ @elastic/kibana-data-discovery +/src/plugins/data/ @elastic/kibana-visualizations @elastic/kibana-data-discovery +/src/plugins/field_formats/ @elastic/kibana-data-discovery +/x-pack/test/search_sessions_integration/ @elastic/kibana-data-discovery +/test/plugin_functional/test_suites/data_plugin @elastic/kibana-data-discovery +/examples/field_formats_example/ @elastic/kibana-data-discovery +/examples/partial_results_example/ @elastic/kibana-data-discovery +/examples/search_examples/ @elastic/kibana-data-discovery +/examples/demo_search/ @elastic/kibana-data-discovery # Vis Editors /x-pack/plugins/lens/ @elastic/kibana-visualizations @@ -55,29 +64,6 @@ /x-pack/plugins/graph/ @elastic/kibana-visualizations /x-pack/test/functional/apps/graph @elastic/kibana-visualizations -# Application Services -/examples/dashboard_embeddable_examples/ @elastic/kibana-app-services -/examples/demo_search/ @elastic/kibana-app-services -/examples/developer_examples/ @elastic/kibana-app-services -/examples/embeddable_examples/ @elastic/kibana-app-services -/examples/embeddable_explorer/ @elastic/kibana-app-services -/examples/field_formats_example/ @elastic/kibana-app-services -/examples/partial_results_example/ @elastic/kibana-app-services -/examples/search_examples/ @elastic/kibana-app-services -/src/plugins/data/ @elastic/kibana-visualizations @elastic/kibana-data-discovery -/src/plugins/embeddable/ @elastic/kibana-app-services -/src/plugins/field_formats/ @elastic/kibana-app-services -/src/plugins/inspector/ @elastic/kibana-app-services -/src/plugins/kibana_utils/ @elastic/kibana-app-services -/src/plugins/navigation/ @elastic/kibana-app-services -/src/plugins/inspector/ @elastic/kibana-app-services -/x-pack/plugins/embeddable_enhanced/ @elastic/kibana-app-services -/x-pack/plugins/runtime_fields @elastic/kibana-app-services -/src/plugins/dashboard/public/application/embeddable/viewport/print_media @elastic/kibana-app-services -/x-pack/test/search_sessions_integration/ @elastic/kibana-app-services -/test/plugin_functional/test_suites/panel_actions @elastic/kibana-app-services -/test/plugin_functional/test_suites/data_plugin @elastic/kibana-app-services - # Global Experience /src/plugins/bfetch/ @elastic/kibana-global-experience @@ -86,7 +72,7 @@ /src/plugins/share/ @elastic/kibana-global-experience /src/plugins/ui_actions/ @elastic/kibana-global-experience /src/plugins/ui_actions_enhanced/ @elastic/kibana-global-experience - +/src/plugins/navigation/ @elastic/kibana-global-experience /x-pack/plugins/notifications/ @elastic/kibana-global-experience ## Examples @@ -95,6 +81,7 @@ /examples/state_containers_examples/ @elastic/kibana-global-experience /examples/ui_action_examples/ @elastic/kibana-global-experience /examples/ui_actions_explorer/ @elastic/kibana-global-experience +/examples/developer_examples/ @elastic/kibana-global-experience /x-pack/examples/ui_actions_enhanced_examples/ @elastic/kibana-global-experience ### Overview Plugin and Packages @@ -119,7 +106,7 @@ /docs/setup/configuring-reporting.asciidoc @elastic/kibana-global-experience ### Global Experience Tagging -/src/plugins/saved_objects_tagging_oss @elastic/kibana-global-experience +/src/plugins/saved_objects_tagging_oss @elastic/kibana-global-experience /x-pack/plugins/saved_objects_tagging/ @elastic/kibana-global-experience /x-pack/test/saved_object_tagging/ @elastic/kibana-global-experience @@ -234,7 +221,14 @@ /test/functional/services/dashboard/ @elastic/kibana-presentation /x-pack/plugins/canvas/ @elastic/kibana-presentation /x-pack/plugins/dashboard_enhanced/ @elastic/kibana-presentation -/x-pack/test/functional/apps/canvas/ @elastic/kibana-presentation +/x-pack/test/functional/apps/canvas/ @elastic/kibana-presentation +/examples/dashboard_embeddable_examples/ @elastic/kibana-presentation +/examples/embeddable_examples/ @elastic/kibana-presentation +/examples/embeddable_explorer/ @elastic/kibana-presentation +/src/plugins/embeddable/ @elastic/kibana-presentation +/src/plugins/inspector/ @elastic/kibana-presentation +/x-pack/plugins/embeddable_enhanced/ @elastic/kibana-presentation +/test/plugin_functional/test_suites/panel_actions @elastic/kibana-presentation #CC# /src/plugins/kibana_react/public/code_editor/ @elastic/kibana-presentation # Machine Learning @@ -416,7 +410,8 @@ /x-pack/plugins/cross_cluster_replication/ @elastic/platform-deployment-management /x-pack/plugins/index_lifecycle_management/ @elastic/platform-deployment-management /x-pack/plugins/grokdebugger/ @elastic/platform-deployment-management -/x-pack/plugins/index_management/ @elastic/platform-deployment-management +/x-pack/plugins/index_management/ @elastic/platform-deployment-management +/x-pack/plugins/runtime_fields @elastic/platform-deployment-management /x-pack/plugins/license_api_guard/ @elastic/platform-deployment-management /x-pack/plugins/license_management/ @elastic/platform-deployment-management /x-pack/plugins/painless_lab/ @elastic/platform-deployment-management @@ -971,6 +966,7 @@ packages/kbn-plugin-helpers @elastic/kibana-operations packages/kbn-react-field @elastic/kibana-app-services packages/kbn-repo-source-classifier @elastic/kibana-operations packages/kbn-repo-source-classifier-cli @elastic/kibana-operations +packages/kbn-rison @elastic/kibana-operations packages/kbn-rule-data-utils @elastic/security-detections-response @elastic/actionable-observability @elastic/response-ops packages/kbn-safer-lodash-set @elastic/kibana-security packages/kbn-securitysolution-autocomplete @elastic/security-solution-platform @@ -1061,6 +1057,7 @@ packages/shared-ux/page/solution_nav @elastic/kibana-global-experience packages/shared-ux/prompt/no_data_views/impl @elastic/kibana-global-experience packages/shared-ux/prompt/no_data_views/mocks @elastic/kibana-global-experience packages/shared-ux/prompt/no_data_views/types @elastic/kibana-global-experience +packages/shared-ux/prompt/not_found @elastic/kibana-global-experience packages/shared-ux/router/impl @elastic/kibana-global-experience packages/shared-ux/router/mocks @elastic/kibana-global-experience packages/shared-ux/router/types @elastic/kibana-global-experience diff --git a/api_docs/actions.devdocs.json b/api_docs/actions.devdocs.json index daf7786bf9b0c..22b480c048a51 100644 --- a/api_docs/actions.devdocs.json +++ b/api_docs/actions.devdocs.json @@ -1967,7 +1967,7 @@ }, "<", "ActionTypeConfig", - ">[]>; getOAuthAccessToken: ({ type, options }: Readonly<{} & { options: Readonly<{} & { config: Readonly<{} & { clientId: string; jwtKeyId: string; userIdentifierValue: string; }>; tokenUrl: string; secrets: Readonly<{ privateKeyPassword?: string | undefined; } & { clientSecret: string; privateKey: string; }>; }> | Readonly<{} & { scope: string; config: Readonly<{} & { clientId: string; tenantId: string; }>; tokenUrl: string; secrets: Readonly<{} & { clientSecret: string; }>; }>; type: \"client\" | \"jwt\"; }>, configurationUtilities: ", + ">[]>; getOAuthAccessToken: ({ type, options }: Readonly<{} & { options: Readonly<{} & { config: Readonly<{} & { clientId: string; jwtKeyId: string; userIdentifierValue: string; }>; tokenUrl: string; secrets: Readonly<{ privateKeyPassword?: string | undefined; } & { clientSecret: string; privateKey: string; }>; }> | Readonly<{} & { scope: string; config: Readonly<{} & { clientId: string; tenantId: string; }>; tokenUrl: string; secrets: Readonly<{} & { clientSecret: string; }>; }>; type: \"jwt\" | \"client\"; }>, configurationUtilities: ", "ActionsConfigurationUtilities", ") => Promise<{ accessToken: string | null; }>; enqueueExecution: (options: ", "ExecuteOptions", diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index bfd911f56b0c1..c4374b7c4c40f 100644 --- a/api_docs/actions.mdx +++ b/api_docs/actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/actions title: "actions" image: https://source.unsplash.com/400x175/?github description: API docs for the actions plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'actions'] --- import actionsObj from './actions.devdocs.json'; diff --git a/api_docs/advanced_settings.mdx b/api_docs/advanced_settings.mdx index 1cd9b91a3ff85..cdcf9322a4530 100644 --- a/api_docs/advanced_settings.mdx +++ b/api_docs/advanced_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/advancedSettings title: "advancedSettings" image: https://source.unsplash.com/400x175/?github description: API docs for the advancedSettings plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index b02a001e37228..e7d1087a174f6 100644 --- a/api_docs/aiops.mdx +++ b/api_docs/aiops.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiops title: "aiops" image: https://source.unsplash.com/400x175/?github description: API docs for the aiops plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops'] --- import aiopsObj from './aiops.devdocs.json'; diff --git a/api_docs/alerting.devdocs.json b/api_docs/alerting.devdocs.json index 9ad42cdce240f..a40e234fabe53 100644 --- a/api_docs/alerting.devdocs.json +++ b/api_docs/alerting.devdocs.json @@ -3010,7 +3010,7 @@ "section": "def-common.SanitizedRule", "text": "SanitizedRule" }, - ">; muteAll: ({ id }: { id: string; }) => Promise; getAlertState: ({ id }: { id: string; }) => Promise; getAlertSummary: ({ id, dateStart, numberOfExecutions, }: ", + ">; muteAll: ({ id }: { id: string; }) => Promise; getAlertState: ({ id }: { id: string; }) => Promise; getAlertSummary: ({ id, dateStart, numberOfExecutions, }: ", "GetAlertSummaryParams", ") => Promise<", { @@ -6522,7 +6522,7 @@ "label": "AlertInstanceMeta", "description": [], "signature": [ - "{ lastScheduledActions?: ({ subgroup?: string | undefined; } & { group: string; date: Date; }) | undefined; }" + "{ lastScheduledActions?: ({ subgroup?: string | undefined; } & { group: string; date: Date; }) | undefined; flappingHistory?: boolean[] | undefined; flapping?: boolean | undefined; }" ], "path": "x-pack/plugins/alerting/common/alert_instance.ts", "deprecated": false, @@ -6716,7 +6716,7 @@ "label": "RawAlertInstance", "description": [], "signature": [ - "{ state?: { [x: string]: unknown; } | undefined; meta?: { lastScheduledActions?: ({ subgroup?: string | undefined; } & { group: string; date: Date; }) | undefined; } | undefined; }" + "{ state?: { [x: string]: unknown; } | undefined; meta?: { lastScheduledActions?: ({ subgroup?: string | undefined; } & { group: string; date: Date; }) | undefined; flappingHistory?: boolean[] | undefined; flapping?: boolean | undefined; } | undefined; }" ], "path": "x-pack/plugins/alerting/common/alert_instance.ts", "deprecated": false, @@ -6976,7 +6976,7 @@ "label": "RuleTaskState", "description": [], "signature": [ - "{ alertTypeState?: { [x: string]: unknown; } | undefined; alertInstances?: { [x: string]: { state?: { [x: string]: unknown; } | undefined; meta?: { lastScheduledActions?: ({ subgroup?: string | undefined; } & { group: string; date: Date; }) | undefined; } | undefined; }; } | undefined; previousStartedAt?: Date | null | undefined; }" + "{ alertTypeState?: { [x: string]: unknown; } | undefined; alertInstances?: { [x: string]: { state?: { [x: string]: unknown; } | undefined; meta?: { lastScheduledActions?: ({ subgroup?: string | undefined; } & { group: string; date: Date; }) | undefined; flappingHistory?: boolean[] | undefined; flapping?: boolean | undefined; } | undefined; }; } | undefined; alertRecoveredInstances?: { [x: string]: { state?: { [x: string]: unknown; } | undefined; meta?: { lastScheduledActions?: ({ subgroup?: string | undefined; } & { group: string; date: Date; }) | undefined; flappingHistory?: boolean[] | undefined; flapping?: boolean | undefined; } | undefined; }; } | undefined; previousStartedAt?: Date | null | undefined; }" ], "path": "x-pack/plugins/alerting/common/rule_task_instance.ts", "deprecated": false, @@ -7304,7 +7304,13 @@ "StringC", "; date: ", "Type", - "; }>]>; }>; }>" + "; }>]>; flappingHistory: ", + "ArrayC", + "<", + "BooleanC", + ">; flapping: ", + "BooleanC", + "; }>; }>" ], "path": "x-pack/plugins/alerting/common/alert_instance.ts", "deprecated": false, @@ -7436,7 +7442,45 @@ "StringC", "; date: ", "Type", - "; }>]>; }>; }>>; previousStartedAt: ", + "; }>]>; flappingHistory: ", + "ArrayC", + "<", + "BooleanC", + ">; flapping: ", + "BooleanC", + "; }>; }>>; alertRecoveredInstances: ", + "RecordC", + "<", + "StringC", + ", ", + "PartialC", + "<{ state: ", + "RecordC", + "<", + "StringC", + ", ", + "UnknownC", + ">; meta: ", + "PartialC", + "<{ lastScheduledActions: ", + "IntersectionC", + "<[", + "PartialC", + "<{ subgroup: ", + "StringC", + "; }>, ", + "TypeC", + "<{ group: ", + "StringC", + "; date: ", + "Type", + "; }>]>; flappingHistory: ", + "ArrayC", + "<", + "BooleanC", + ">; flapping: ", + "BooleanC", + "; }>; }>>; previousStartedAt: ", "UnionC", "<[", "NullC", diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index bd8f048f8a408..42f1af78a3f2c 100644 --- a/api_docs/alerting.mdx +++ b/api_docs/alerting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/alerting title: "alerting" image: https://source.unsplash.com/400x175/?github description: API docs for the alerting plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] --- import alertingObj from './alerting.devdocs.json'; diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index 6a43c1143adb4..9aa3d829c6c8c 100644 --- a/api_docs/apm.mdx +++ b/api_docs/apm.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apm title: "apm" image: https://source.unsplash.com/400x175/?github description: API docs for the apm plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] --- import apmObj from './apm.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index 946e5ae7c5928..6236f809eac8c 100644 --- a/api_docs/banners.mdx +++ b/api_docs/banners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/banners title: "banners" image: https://source.unsplash.com/400x175/?github description: API docs for the banners plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'banners'] --- import bannersObj from './banners.devdocs.json'; diff --git a/api_docs/bfetch.mdx b/api_docs/bfetch.mdx index 043b576f22483..d7be3b7702a85 100644 --- a/api_docs/bfetch.mdx +++ b/api_docs/bfetch.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/bfetch title: "bfetch" image: https://source.unsplash.com/400x175/?github description: API docs for the bfetch plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'bfetch'] --- import bfetchObj from './bfetch.devdocs.json'; diff --git a/api_docs/canvas.mdx b/api_docs/canvas.mdx index 2686ecbdb5fbe..1d2bccf29b315 100644 --- a/api_docs/canvas.mdx +++ b/api_docs/canvas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/canvas title: "canvas" image: https://source.unsplash.com/400x175/?github description: API docs for the canvas plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'canvas'] --- import canvasObj from './canvas.devdocs.json'; diff --git a/api_docs/cases.mdx b/api_docs/cases.mdx index f939a6becb496..7cdbb597966cd 100644 --- a/api_docs/cases.mdx +++ b/api_docs/cases.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cases title: "cases" image: https://source.unsplash.com/400x175/?github description: API docs for the cases plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cases'] --- import casesObj from './cases.devdocs.json'; diff --git a/api_docs/charts.mdx b/api_docs/charts.mdx index 275a82f5e9d90..fc31ee2828ab0 100644 --- a/api_docs/charts.mdx +++ b/api_docs/charts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/charts title: "charts" image: https://source.unsplash.com/400x175/?github description: API docs for the charts plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'charts'] --- import chartsObj from './charts.devdocs.json'; diff --git a/api_docs/cloud.mdx b/api_docs/cloud.mdx index d717c5e1725af..20653f51262a4 100644 --- a/api_docs/cloud.mdx +++ b/api_docs/cloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloud title: "cloud" image: https://source.unsplash.com/400x175/?github description: API docs for the cloud plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] --- import cloudObj from './cloud.devdocs.json'; diff --git a/api_docs/cloud_chat.mdx b/api_docs/cloud_chat.mdx index ef20eabe57160..498afbad1b359 100644 --- a/api_docs/cloud_chat.mdx +++ b/api_docs/cloud_chat.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudChat title: "cloudChat" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudChat plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudChat'] --- import cloudChatObj from './cloud_chat.devdocs.json'; diff --git a/api_docs/cloud_experiments.mdx b/api_docs/cloud_experiments.mdx index d402d63ee2945..63c52c124532e 100644 --- a/api_docs/cloud_experiments.mdx +++ b/api_docs/cloud_experiments.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudExperiments title: "cloudExperiments" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudExperiments plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudExperiments'] --- import cloudExperimentsObj from './cloud_experiments.devdocs.json'; diff --git a/api_docs/cloud_security_posture.mdx b/api_docs/cloud_security_posture.mdx index 0f94942318b9b..4baf5ff29550b 100644 --- a/api_docs/cloud_security_posture.mdx +++ b/api_docs/cloud_security_posture.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudSecurityPosture title: "cloudSecurityPosture" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudSecurityPosture plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudSecurityPosture'] --- import cloudSecurityPostureObj from './cloud_security_posture.devdocs.json'; diff --git a/api_docs/console.mdx b/api_docs/console.mdx index 816d764a2a3e6..24e5b78d436ad 100644 --- a/api_docs/console.mdx +++ b/api_docs/console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/console title: "console" image: https://source.unsplash.com/400x175/?github description: API docs for the console plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'console'] --- import consoleObj from './console.devdocs.json'; diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index 51f6726478302..dc1b1398e1c2f 100644 --- a/api_docs/controls.mdx +++ b/api_docs/controls.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/controls title: "controls" image: https://source.unsplash.com/400x175/?github description: API docs for the controls plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] --- import controlsObj from './controls.devdocs.json'; diff --git a/api_docs/core.mdx b/api_docs/core.mdx index ea23977c90339..2a2f04e91986b 100644 --- a/api_docs/core.mdx +++ b/api_docs/core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/core title: "core" image: https://source.unsplash.com/400x175/?github description: API docs for the core plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'core'] --- import coreObj from './core.devdocs.json'; diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index c445593ea8e88..2ecbb3a0f4e88 100644 --- a/api_docs/custom_integrations.mdx +++ b/api_docs/custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/customIntegrations title: "customIntegrations" image: https://source.unsplash.com/400x175/?github description: API docs for the customIntegrations plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'customIntegrations'] --- import customIntegrationsObj from './custom_integrations.devdocs.json'; diff --git a/api_docs/dashboard.mdx b/api_docs/dashboard.mdx index f3e35ecfaf947..37839353c9902 100644 --- a/api_docs/dashboard.mdx +++ b/api_docs/dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboard title: "dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboard plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboard'] --- import dashboardObj from './dashboard.devdocs.json'; diff --git a/api_docs/dashboard_enhanced.mdx b/api_docs/dashboard_enhanced.mdx index d219538b64e16..540d033578d84 100644 --- a/api_docs/dashboard_enhanced.mdx +++ b/api_docs/dashboard_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboardEnhanced title: "dashboardEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboardEnhanced plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboardEnhanced'] --- import dashboardEnhancedObj from './dashboard_enhanced.devdocs.json'; diff --git a/api_docs/data.mdx b/api_docs/data.mdx index 589209b5b7a87..e67d53c2fd129 100644 --- a/api_docs/data.mdx +++ b/api_docs/data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data title: "data" image: https://source.unsplash.com/400x175/?github description: API docs for the data plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index ee15def10af1c..3b9059da89f36 100644 --- a/api_docs/data_query.mdx +++ b/api_docs/data_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-query title: "data.query" image: https://source.unsplash.com/400x175/?github description: API docs for the data.query plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.query'] --- import dataQueryObj from './data_query.devdocs.json'; diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx index 428135f8d5847..2bb3b4590c9cd 100644 --- a/api_docs/data_search.mdx +++ b/api_docs/data_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-search title: "data.search" image: https://source.unsplash.com/400x175/?github description: API docs for the data.search plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index 968189de2ddb9..ec3cd189213af 100644 --- a/api_docs/data_view_editor.mdx +++ b/api_docs/data_view_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewEditor title: "dataViewEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewEditor plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewEditor'] --- import dataViewEditorObj from './data_view_editor.devdocs.json'; diff --git a/api_docs/data_view_field_editor.mdx b/api_docs/data_view_field_editor.mdx index ba4e656235994..1c99a5414df2c 100644 --- a/api_docs/data_view_field_editor.mdx +++ b/api_docs/data_view_field_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewFieldEditor title: "dataViewFieldEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewFieldEditor plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewFieldEditor'] --- import dataViewFieldEditorObj from './data_view_field_editor.devdocs.json'; diff --git a/api_docs/data_view_management.mdx b/api_docs/data_view_management.mdx index 22a840e79a570..446c57cdfb0a5 100644 --- a/api_docs/data_view_management.mdx +++ b/api_docs/data_view_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewManagement title: "dataViewManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewManagement plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewManagement'] --- import dataViewManagementObj from './data_view_management.devdocs.json'; diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index b023ceb250f89..9685c5ba5cca6 100644 --- a/api_docs/data_views.mdx +++ b/api_docs/data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViews title: "dataViews" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViews plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViews'] --- import dataViewsObj from './data_views.devdocs.json'; diff --git a/api_docs/data_visualizer.mdx b/api_docs/data_visualizer.mdx index dfd9fd7b7d4c1..9c3d77642d0e4 100644 --- a/api_docs/data_visualizer.mdx +++ b/api_docs/data_visualizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataVisualizer title: "dataVisualizer" image: https://source.unsplash.com/400x175/?github description: API docs for the dataVisualizer plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] --- import dataVisualizerObj from './data_visualizer.devdocs.json'; diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index 8e7b0b557758e..0081c1e5f2c9f 100644 --- a/api_docs/deprecations_by_api.mdx +++ b/api_docs/deprecations_by_api.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByApi slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-api title: Deprecated API usage by API description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index a6b569ba9ed18..72f256c977cd0 100644 --- a/api_docs/deprecations_by_plugin.mdx +++ b/api_docs/deprecations_by_plugin.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByPlugin slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-plugin title: Deprecated API usage by plugin description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index e4a7b90c05eea..bc457fa265b13 100644 --- a/api_docs/deprecations_by_team.mdx +++ b/api_docs/deprecations_by_team.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsDueByTeam slug: /kibana-dev-docs/api-meta/deprecations-due-by-team title: Deprecated APIs due to be removed, by team description: Lists the teams that are referencing deprecated APIs with a remove by date. -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index f6ec38372735f..d57df7b0c8802 100644 --- a/api_docs/dev_tools.mdx +++ b/api_docs/dev_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/devTools title: "devTools" image: https://source.unsplash.com/400x175/?github description: API docs for the devTools plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'devTools'] --- import devToolsObj from './dev_tools.devdocs.json'; diff --git a/api_docs/discover.mdx b/api_docs/discover.mdx index 960be9cb2ca2b..bff8b5a33f5a8 100644 --- a/api_docs/discover.mdx +++ b/api_docs/discover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discover title: "discover" image: https://source.unsplash.com/400x175/?github description: API docs for the discover plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discover'] --- import discoverObj from './discover.devdocs.json'; diff --git a/api_docs/discover_enhanced.mdx b/api_docs/discover_enhanced.mdx index 6acd323a8399a..eae87a7501ee3 100644 --- a/api_docs/discover_enhanced.mdx +++ b/api_docs/discover_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverEnhanced title: "discoverEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverEnhanced plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index 6a89dc52f3556..6534bb537c0d3 100644 --- a/api_docs/embeddable.mdx +++ b/api_docs/embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddable title: "embeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddable plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddable'] --- import embeddableObj from './embeddable.devdocs.json'; diff --git a/api_docs/embeddable_enhanced.mdx b/api_docs/embeddable_enhanced.mdx index 7bc58d4f14c52..ca33e0d1df2b2 100644 --- a/api_docs/embeddable_enhanced.mdx +++ b/api_docs/embeddable_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddableEnhanced title: "embeddableEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddableEnhanced plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddableEnhanced'] --- import embeddableEnhancedObj from './embeddable_enhanced.devdocs.json'; diff --git a/api_docs/encrypted_saved_objects.mdx b/api_docs/encrypted_saved_objects.mdx index 25326a1747fa2..8d73a05319774 100644 --- a/api_docs/encrypted_saved_objects.mdx +++ b/api_docs/encrypted_saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/encryptedSavedObjects title: "encryptedSavedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the encryptedSavedObjects plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'encryptedSavedObjects'] --- import encryptedSavedObjectsObj from './encrypted_saved_objects.devdocs.json'; diff --git a/api_docs/enterprise_search.mdx b/api_docs/enterprise_search.mdx index 9ffad9328a9fe..98b354889f8a6 100644 --- a/api_docs/enterprise_search.mdx +++ b/api_docs/enterprise_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/enterpriseSearch title: "enterpriseSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the enterpriseSearch plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] --- import enterpriseSearchObj from './enterprise_search.devdocs.json'; diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index c0b5edb29bff4..a9d34d801c1a2 100644 --- a/api_docs/es_ui_shared.mdx +++ b/api_docs/es_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esUiShared title: "esUiShared" image: https://source.unsplash.com/400x175/?github description: API docs for the esUiShared plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] --- import esUiSharedObj from './es_ui_shared.devdocs.json'; diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index bc2ab212ef9bd..a749b7e087074 100644 --- a/api_docs/event_annotation.mdx +++ b/api_docs/event_annotation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotation title: "eventAnnotation" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotation plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] --- import eventAnnotationObj from './event_annotation.devdocs.json'; diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index c279f6e5b05e1..50c975efdc159 100644 --- a/api_docs/event_log.mdx +++ b/api_docs/event_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventLog title: "eventLog" image: https://source.unsplash.com/400x175/?github description: API docs for the eventLog plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] --- import eventLogObj from './event_log.devdocs.json'; diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx index 7b9e87ee96ed2..55e3e99f629e8 100644 --- a/api_docs/expression_error.mdx +++ b/api_docs/expression_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionError title: "expressionError" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionError plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionError'] --- import expressionErrorObj from './expression_error.devdocs.json'; diff --git a/api_docs/expression_gauge.mdx b/api_docs/expression_gauge.mdx index 0d1c2cbe68b72..29bd66ce64990 100644 --- a/api_docs/expression_gauge.mdx +++ b/api_docs/expression_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionGauge title: "expressionGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionGauge plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionGauge'] --- import expressionGaugeObj from './expression_gauge.devdocs.json'; diff --git a/api_docs/expression_heatmap.mdx b/api_docs/expression_heatmap.mdx index 9c66b9ad05a38..f3c3be1062a38 100644 --- a/api_docs/expression_heatmap.mdx +++ b/api_docs/expression_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionHeatmap title: "expressionHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionHeatmap plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionHeatmap'] --- import expressionHeatmapObj from './expression_heatmap.devdocs.json'; diff --git a/api_docs/expression_image.mdx b/api_docs/expression_image.mdx index 2a36e47356513..6eba92b8d5a80 100644 --- a/api_docs/expression_image.mdx +++ b/api_docs/expression_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionImage title: "expressionImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionImage plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionImage'] --- import expressionImageObj from './expression_image.devdocs.json'; diff --git a/api_docs/expression_legacy_metric_vis.mdx b/api_docs/expression_legacy_metric_vis.mdx index 5bfb6eebc8188..68fc847b19fde 100644 --- a/api_docs/expression_legacy_metric_vis.mdx +++ b/api_docs/expression_legacy_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionLegacyMetricVis title: "expressionLegacyMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionLegacyMetricVis plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionLegacyMetricVis'] --- import expressionLegacyMetricVisObj from './expression_legacy_metric_vis.devdocs.json'; diff --git a/api_docs/expression_metric.mdx b/api_docs/expression_metric.mdx index 10fea40dc0e4c..9aa29e6bd1ca4 100644 --- a/api_docs/expression_metric.mdx +++ b/api_docs/expression_metric.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetric title: "expressionMetric" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetric plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetric'] --- import expressionMetricObj from './expression_metric.devdocs.json'; diff --git a/api_docs/expression_metric_vis.mdx b/api_docs/expression_metric_vis.mdx index 0c83a2c76614d..38ce92a7c2076 100644 --- a/api_docs/expression_metric_vis.mdx +++ b/api_docs/expression_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetricVis title: "expressionMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetricVis plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetricVis'] --- import expressionMetricVisObj from './expression_metric_vis.devdocs.json'; diff --git a/api_docs/expression_partition_vis.devdocs.json b/api_docs/expression_partition_vis.devdocs.json index cd8bf44d3cfa0..46b022d98fc9b 100644 --- a/api_docs/expression_partition_vis.devdocs.json +++ b/api_docs/expression_partition_vis.devdocs.json @@ -472,6 +472,20 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "expressionPartitionVis", + "id": "def-common.LabelsParams.colorOverrides", + "type": "Object", + "tags": [], + "label": "colorOverrides", + "description": [], + "signature": [ + "{ [x: string]: string; }" + ], + "path": "src/plugins/chart_expressions/expression_partition_vis/common/types/expression_renderers.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "expressionPartitionVis", "id": "def-common.LabelsParams.truncate", @@ -542,7 +556,7 @@ "section": "def-common.MosaicVisConfig", "text": "MosaicVisConfig" }, - " extends Omit" + " extends Omit" ], "path": "src/plugins/chart_expressions/expression_partition_vis/common/types/expression_renderers.ts", "deprecated": false, @@ -1078,7 +1092,7 @@ "section": "def-common.ValueFormats", "text": "ValueFormats" }, - "; percentDecimals: number; truncate?: number | null | undefined; last_level?: boolean | undefined; }" + "; percentDecimals: number; colorOverrides: Record; truncate?: number | null | undefined; last_level?: boolean | undefined; }" ], "path": "src/plugins/chart_expressions/expression_partition_vis/common/types/expression_functions.ts", "deprecated": false, diff --git a/api_docs/expression_partition_vis.mdx b/api_docs/expression_partition_vis.mdx index 9519a3a8756c8..26eea9625a6b6 100644 --- a/api_docs/expression_partition_vis.mdx +++ b/api_docs/expression_partition_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionPartitionVis title: "expressionPartitionVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionPartitionVis plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionPartitionVis'] --- import expressionPartitionVisObj from './expression_partition_vis.devdocs.json'; @@ -21,7 +21,7 @@ Contact [Vis Editors](https://github.com/orgs/elastic/teams/kibana-visualization | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 71 | 0 | 71 | 2 | +| 72 | 0 | 72 | 2 | ## Client diff --git a/api_docs/expression_repeat_image.mdx b/api_docs/expression_repeat_image.mdx index 9aeaddb52218a..fb3d29b976885 100644 --- a/api_docs/expression_repeat_image.mdx +++ b/api_docs/expression_repeat_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRepeatImage title: "expressionRepeatImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRepeatImage plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRepeatImage'] --- import expressionRepeatImageObj from './expression_repeat_image.devdocs.json'; diff --git a/api_docs/expression_reveal_image.mdx b/api_docs/expression_reveal_image.mdx index 9300f2300876a..b01beb1a702ec 100644 --- a/api_docs/expression_reveal_image.mdx +++ b/api_docs/expression_reveal_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRevealImage title: "expressionRevealImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRevealImage plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRevealImage'] --- import expressionRevealImageObj from './expression_reveal_image.devdocs.json'; diff --git a/api_docs/expression_shape.mdx b/api_docs/expression_shape.mdx index bb63ccf91561a..75912bc2cc263 100644 --- a/api_docs/expression_shape.mdx +++ b/api_docs/expression_shape.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionShape title: "expressionShape" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionShape plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionShape'] --- import expressionShapeObj from './expression_shape.devdocs.json'; diff --git a/api_docs/expression_tagcloud.mdx b/api_docs/expression_tagcloud.mdx index a44cc313e03bf..ff6fa16fd2d4f 100644 --- a/api_docs/expression_tagcloud.mdx +++ b/api_docs/expression_tagcloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionTagcloud title: "expressionTagcloud" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionTagcloud plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionTagcloud'] --- import expressionTagcloudObj from './expression_tagcloud.devdocs.json'; diff --git a/api_docs/expression_x_y.mdx b/api_docs/expression_x_y.mdx index a82a93f13b88a..587ced1610b23 100644 --- a/api_docs/expression_x_y.mdx +++ b/api_docs/expression_x_y.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionXY title: "expressionXY" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionXY plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionXY'] --- import expressionXYObj from './expression_x_y.devdocs.json'; diff --git a/api_docs/expressions.mdx b/api_docs/expressions.mdx index 2f16aaf8e2938..bae637fdb1d7c 100644 --- a/api_docs/expressions.mdx +++ b/api_docs/expressions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressions title: "expressions" image: https://source.unsplash.com/400x175/?github description: API docs for the expressions plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressions'] --- import expressionsObj from './expressions.devdocs.json'; diff --git a/api_docs/features.mdx b/api_docs/features.mdx index 9566eee5c52d0..3ad4ecd1fdeb8 100644 --- a/api_docs/features.mdx +++ b/api_docs/features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/features title: "features" image: https://source.unsplash.com/400x175/?github description: API docs for the features plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'features'] --- import featuresObj from './features.devdocs.json'; diff --git a/api_docs/field_formats.mdx b/api_docs/field_formats.mdx index 4d97e92a2b2bd..d526453049f02 100644 --- a/api_docs/field_formats.mdx +++ b/api_docs/field_formats.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldFormats title: "fieldFormats" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldFormats plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] --- import fieldFormatsObj from './field_formats.devdocs.json'; diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index f0b3663dc0538..f123f91efd4b4 100644 --- a/api_docs/file_upload.mdx +++ b/api_docs/file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fileUpload title: "fileUpload" image: https://source.unsplash.com/400x175/?github description: API docs for the fileUpload plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fileUpload'] --- import fileUploadObj from './file_upload.devdocs.json'; diff --git a/api_docs/files.devdocs.json b/api_docs/files.devdocs.json index 761cb3e7578f2..664a95623f5a9 100644 --- a/api_docs/files.devdocs.json +++ b/api_docs/files.devdocs.json @@ -2,655 +2,109 @@ "id": "files", "client": { "classes": [], - "functions": [ - { - "parentPluginId": "files", - "id": "def-public.FilePicker", - "type": "Function", - "tags": [], - "label": "FilePicker", - "description": [], - "signature": [ - "(props: ", - { - "pluginId": "files", - "scope": "public", - "docId": "kibFilesPluginApi", - "section": "def-public.Props", - "text": "Props" - }, - ") => JSX.Element" - ], - "path": "src/plugins/files/public/components/file_picker/index.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "files", - "id": "def-public.FilePicker.$1", - "type": "Object", - "tags": [], - "label": "props", - "description": [], - "signature": [ - { - "pluginId": "files", - "scope": "public", - "docId": "kibFilesPluginApi", - "section": "def-public.Props", - "text": "Props" - }, - "" - ], - "path": "src/plugins/files/public/components/file_picker/index.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - }, - { - "parentPluginId": "files", - "id": "def-public.FilesContext", - "type": "Function", - "tags": [], - "label": "FilesContext", - "description": [], - "signature": [ - "({ client, children }: React.PropsWithChildren) => JSX.Element" - ], - "path": "src/plugins/files/public/components/context.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "files", - "id": "def-public.FilesContext.$1", - "type": "CompoundType", - "tags": [], - "label": "{ client, children }", - "description": [], - "signature": [ - "React.PropsWithChildren" - ], - "path": "src/plugins/files/public/components/context.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - }, - { - "parentPluginId": "files", - "id": "def-public.UploadFile", - "type": "Function", - "tags": [], - "label": "UploadFile", - "description": [], - "signature": [ - "(props: ", - { - "pluginId": "files", - "scope": "public", - "docId": "kibFilesPluginApi", - "section": "def-public.UploadFileProps", - "text": "UploadFileProps" - }, - ") => JSX.Element" - ], - "path": "src/plugins/files/public/components/upload_file/index.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "files", - "id": "def-public.UploadFile.$1", - "type": "CompoundType", - "tags": [], - "label": "props", - "description": [], - "signature": [ - { - "pluginId": "files", - "scope": "public", - "docId": "kibFilesPluginApi", - "section": "def-public.UploadFileProps", - "text": "UploadFileProps" - } - ], - "path": "src/plugins/files/public/components/upload_file/index.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - } - ], - "interfaces": [ - { - "parentPluginId": "files", - "id": "def-public.FilesClient", - "type": "Interface", - "tags": [], - "label": "FilesClient", - "description": [ - "\nA client that can be used to manage a specific {@link FileKind}." - ], - "signature": [ - { - "pluginId": "files", - "scope": "public", - "docId": "kibFilesPluginApi", - "section": "def-public.FilesClient", - "text": "FilesClient" - }, - " extends GlobalEndpoints" - ], - "path": "src/plugins/files/public/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "files", - "id": "def-public.FilesClient.create", - "type": "Function", - "tags": [], - "label": "create", - "description": [ - "\nCreate a new file object with the provided metadata.\n" - ], - "signature": [ - "(args: Readonly<{ meta?: Readonly<{} & {}> | undefined; alt?: string | undefined; mimeType?: string | undefined; } & { name: string; }> & { abortSignal?: AbortSignal | undefined; } & { kind: string; }) => Promise<{ file: ", - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.FileJSON", - "text": "FileJSON" - }, - "; }>" - ], - "path": "src/plugins/files/public/types.ts", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [ - { - "parentPluginId": "files", - "id": "def-public.FilesClient.create.$1", - "type": "CompoundType", - "tags": [], - "label": "args", - "description": [ - "- create file args" - ], - "signature": [ - "E[\"inputs\"][\"body\"] & E[\"inputs\"][\"params\"] & E[\"inputs\"][\"query\"] & { abortSignal?: AbortSignal | undefined; } & { kind: string; } & ExtraArgs" - ], - "path": "src/plugins/files/public/types.ts", - "deprecated": false, - "trackAdoption": false - } - ] - }, - { - "parentPluginId": "files", - "id": "def-public.FilesClient.delete", - "type": "Function", - "tags": [], - "label": "delete", - "description": [ - "\nDelete a file object and all associated share and content objects.\n" - ], - "signature": [ - "(args: Readonly<{} & { id: string; }> & { abortSignal?: AbortSignal | undefined; } & { kind: string; }) => Promise<{ ok: true; }>" - ], - "path": "src/plugins/files/public/types.ts", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [ - { - "parentPluginId": "files", - "id": "def-public.FilesClient.delete.$1", - "type": "CompoundType", - "tags": [], - "label": "args", - "description": [ - "- delete file args" - ], - "signature": [ - "E[\"inputs\"][\"body\"] & E[\"inputs\"][\"params\"] & E[\"inputs\"][\"query\"] & { abortSignal?: AbortSignal | undefined; } & { kind: string; } & ExtraArgs" - ], - "path": "src/plugins/files/public/types.ts", - "deprecated": false, - "trackAdoption": false - } - ] - }, - { - "parentPluginId": "files", - "id": "def-public.FilesClient.getById", - "type": "Function", - "tags": [], - "label": "getById", - "description": [ - "\nGet a file object by ID.\n" - ], - "signature": [ - "(args: Readonly<{} & { id: string; }> & { abortSignal?: AbortSignal | undefined; } & { kind: string; }) => Promise<{ file: ", - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.FileJSON", - "text": "FileJSON" - }, - "; }>" - ], - "path": "src/plugins/files/public/types.ts", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [ - { - "parentPluginId": "files", - "id": "def-public.FilesClient.getById.$1", - "type": "CompoundType", - "tags": [], - "label": "args", - "description": [ - "- get file by ID args" - ], - "signature": [ - "E[\"inputs\"][\"body\"] & E[\"inputs\"][\"params\"] & E[\"inputs\"][\"query\"] & { abortSignal?: AbortSignal | undefined; } & { kind: string; } & ExtraArgs" - ], - "path": "src/plugins/files/public/types.ts", - "deprecated": false, - "trackAdoption": false - } - ] - }, - { - "parentPluginId": "files", - "id": "def-public.FilesClient.list", - "type": "Function", - "tags": [], - "label": "list", - "description": [ - "\nList all file objects, of a given {@link FileKind}.\n" - ], - "signature": [ - "(args: Readonly<{ name?: string | string[] | undefined; status?: string | string[] | undefined; meta?: Readonly<{} & {}> | undefined; extension?: string | string[] | undefined; } & {}> & Readonly<{ page?: number | undefined; perPage?: number | undefined; } & {}> & { abortSignal?: AbortSignal | undefined; } & { kind: string; }) => Promise<{ files: ", - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.FileJSON", - "text": "FileJSON" - }, - "[]; total: number; }>" - ], - "path": "src/plugins/files/public/types.ts", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [ - { - "parentPluginId": "files", - "id": "def-public.FilesClient.list.$1", - "type": "CompoundType", - "tags": [], - "label": "args", - "description": [ - "- list files args" - ], - "signature": [ - "E[\"inputs\"][\"body\"] & E[\"inputs\"][\"params\"] & E[\"inputs\"][\"query\"] & { abortSignal?: AbortSignal | undefined; } & { kind: string; } & ExtraArgs" - ], - "path": "src/plugins/files/public/types.ts", - "deprecated": false, - "trackAdoption": false - } - ] - }, - { - "parentPluginId": "files", - "id": "def-public.FilesClient.update", - "type": "Function", - "tags": [], - "label": "update", - "description": [ - "\nUpdate a set of of metadata values of the file object.\n" - ], - "signature": [ - "(args: Readonly<{ name?: string | undefined; meta?: Readonly<{} & {}> | undefined; alt?: string | undefined; } & {}> & Readonly<{} & { id: string; }> & { abortSignal?: AbortSignal | undefined; } & { kind: string; }) => Promise<{ file: ", - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.FileJSON", - "text": "FileJSON" - }, - "; }>" - ], - "path": "src/plugins/files/public/types.ts", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [ - { - "parentPluginId": "files", - "id": "def-public.FilesClient.update.$1", - "type": "CompoundType", - "tags": [], - "label": "args", - "description": [ - "- update file args" - ], - "signature": [ - "E[\"inputs\"][\"body\"] & E[\"inputs\"][\"params\"] & E[\"inputs\"][\"query\"] & { abortSignal?: AbortSignal | undefined; } & { kind: string; } & ExtraArgs" - ], - "path": "src/plugins/files/public/types.ts", - "deprecated": false, - "trackAdoption": false - } - ] - }, - { - "parentPluginId": "files", - "id": "def-public.FilesClient.upload", - "type": "Function", - "tags": [], - "label": "upload", - "description": [ - "\nStream the contents of the file to Kibana server for storage.\n" - ], - "signature": [ - "(args: Readonly<{} & { id: string; }> & Readonly<{ selfDestructOnAbort?: boolean | undefined; } & {}> & { body: unknown; kind: string; abortSignal?: AbortSignal | undefined; contentType?: string | undefined; }) => Promise<{ ok: true; size: number; }>" - ], - "path": "src/plugins/files/public/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "files", - "id": "def-public.FilesClient.upload.$1", - "type": "CompoundType", - "tags": [], - "label": "args", - "description": [ - "- upload file args" - ], - "signature": [ - "Readonly<{} & { id: string; }> & Readonly<{ selfDestructOnAbort?: boolean | undefined; } & {}> & { body: unknown; kind: string; abortSignal?: AbortSignal | undefined; contentType?: string | undefined; }" - ], - "path": "src/plugins/files/public/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] - }, - { - "parentPluginId": "files", - "id": "def-public.FilesClient.download", - "type": "Function", - "tags": [], - "label": "download", - "description": [ - "\nStream a download of the file object's content.\n" - ], - "signature": [ - "(args: Readonly<{ fileName?: string | undefined; } & { id: string; }> & { abortSignal?: AbortSignal | undefined; } & { kind: string; }) => Promise" - ], - "path": "src/plugins/files/public/types.ts", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [ - { - "parentPluginId": "files", - "id": "def-public.FilesClient.download.$1", - "type": "CompoundType", - "tags": [], - "label": "args", - "description": [ - "- download file args" - ], - "signature": [ - "E[\"inputs\"][\"body\"] & E[\"inputs\"][\"params\"] & E[\"inputs\"][\"query\"] & { abortSignal?: AbortSignal | undefined; } & { kind: string; } & ExtraArgs" - ], - "path": "src/plugins/files/public/types.ts", - "deprecated": false, - "trackAdoption": false - } - ] - }, - { - "parentPluginId": "files", - "id": "def-public.FilesClient.getDownloadHref", - "type": "Function", - "tags": [], - "label": "getDownloadHref", - "description": [ - "\nGet a string for downloading a file that can be passed to a button element's\nhref for download.\n" - ], - "signature": [ - "(args: Pick<", - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.FileJSON", - "text": "FileJSON" - }, - ", \"id\" | \"fileKind\">) => string" - ], - "path": "src/plugins/files/public/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "files", - "id": "def-public.FilesClient.getDownloadHref.$1", - "type": "Object", - "tags": [], - "label": "args", - "description": [ - "- get download URL args" - ], - "signature": [ - "Pick<", - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.FileJSON", - "text": "FileJSON" - }, - ", \"id\" | \"fileKind\">" - ], - "path": "src/plugins/files/public/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] - }, + "functions": [], + "interfaces": [ + { + "parentPluginId": "files", + "id": "def-public.FilesClient", + "type": "Interface", + "tags": [], + "label": "FilesClient", + "description": [ + "\nA client that can be used to manage a specific {@link FileKind}." + ], + "signature": [ + "FilesClient", + " extends ", + "BaseFilesClient", + "" + ], + "path": "src/plugins/files/common/files_client.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ { "parentPluginId": "files", - "id": "def-public.FilesClient.share", + "id": "def-public.FilesClient.getMetrics", "type": "Function", - "tags": [ - "note" - ], - "label": "share", + "tags": [], + "label": "getMetrics", "description": [ - "\nShare a file by creating a new file share instance.\n" + "\nGet metrics of file system, like storage usage.\n" ], "signature": [ - "(args: Readonly<{ name?: string | undefined; validUntil?: number | undefined; } & {}> & Readonly<{} & { fileId: string; }> & { abortSignal?: AbortSignal | undefined; } & { kind: string; }) => Promise<", + "() => Promise<", { "pluginId": "files", "scope": "common", "docId": "kibFilesPluginApi", - "section": "def-common.FileShareJSONWithToken", - "text": "FileShareJSONWithToken" + "section": "def-common.FilesMetrics", + "text": "FilesMetrics" }, ">" ], - "path": "src/plugins/files/public/types.ts", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [ - { - "parentPluginId": "files", - "id": "def-public.FilesClient.share.$1", - "type": "CompoundType", - "tags": [], - "label": "args", - "description": [ - "- File share arguments" - ], - "signature": [ - "E[\"inputs\"][\"body\"] & E[\"inputs\"][\"params\"] & E[\"inputs\"][\"query\"] & { abortSignal?: AbortSignal | undefined; } & { kind: string; } & ExtraArgs" - ], - "path": "src/plugins/files/public/types.ts", - "deprecated": false, - "trackAdoption": false - } - ] - }, - { - "parentPluginId": "files", - "id": "def-public.FilesClient.unshare", - "type": "Function", - "tags": [], - "label": "unshare", - "description": [ - "\nDelete a file share instance.\n" - ], - "signature": [ - "(args: Readonly<{} & { id: string; }> & { abortSignal?: AbortSignal | undefined; } & { kind: string; }) => Promise<{ ok: true; }>" - ], - "path": "src/plugins/files/public/types.ts", + "path": "src/plugins/files/common/files_client.ts", "deprecated": false, "trackAdoption": false, - "returnComment": [], - "children": [ - { - "parentPluginId": "files", - "id": "def-public.FilesClient.unshare.$1", - "type": "CompoundType", - "tags": [], - "label": "args", - "description": [ - "- File unshare arguments" - ], - "signature": [ - "E[\"inputs\"][\"body\"] & E[\"inputs\"][\"params\"] & E[\"inputs\"][\"query\"] & { abortSignal?: AbortSignal | undefined; } & { kind: string; } & ExtraArgs" - ], - "path": "src/plugins/files/public/types.ts", - "deprecated": false, - "trackAdoption": false - } - ] + "children": [], + "returnComment": [] }, { "parentPluginId": "files", - "id": "def-public.FilesClient.getShare", + "id": "def-public.FilesClient.publicDownload", "type": "Function", "tags": [], - "label": "getShare", + "label": "publicDownload", "description": [ - "\nGet a file share instance.\n" + "\nDownload a file, bypassing regular security by way of a\nsecret share token.\n" ], "signature": [ - "(args: Readonly<{} & { id: string; }> & { abortSignal?: AbortSignal | undefined; } & { kind: string; }) => Promise<{ share: ", - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.FileShareJSON", - "text": "FileShareJSON" - }, - "; }>" + "(args: { token: string; fileName?: string | undefined; }) => any" ], - "path": "src/plugins/files/public/types.ts", + "path": "src/plugins/files/common/files_client.ts", "deprecated": false, "trackAdoption": false, - "returnComment": [], "children": [ { "parentPluginId": "files", - "id": "def-public.FilesClient.getShare.$1", - "type": "CompoundType", + "id": "def-public.FilesClient.publicDownload.$1", + "type": "Object", "tags": [], "label": "args", - "description": [ - "- Get file share arguments" - ], - "signature": [ - "E[\"inputs\"][\"body\"] & E[\"inputs\"][\"params\"] & E[\"inputs\"][\"query\"] & { abortSignal?: AbortSignal | undefined; } & { kind: string; } & ExtraArgs" - ], - "path": "src/plugins/files/public/types.ts", + "description": [], + "path": "src/plugins/files/common/files_client.ts", "deprecated": false, - "trackAdoption": false + "trackAdoption": false, + "children": [ + { + "parentPluginId": "files", + "id": "def-public.FilesClient.publicDownload.$1.token", + "type": "string", + "tags": [], + "label": "token", + "description": [], + "path": "src/plugins/files/common/files_client.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "files", + "id": "def-public.FilesClient.publicDownload.$1.fileName", + "type": "string", + "tags": [], + "label": "fileName", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/files/common/files_client.ts", + "deprecated": false, + "trackAdoption": false + } + ] } - ] - }, - { - "parentPluginId": "files", - "id": "def-public.FilesClient.listShares", - "type": "Function", - "tags": [], - "label": "listShares", - "description": [ - "\nList all file shares. Optionally scoping to a specific\nfile.\n" - ], - "signature": [ - "(args: Readonly<{ page?: number | undefined; perPage?: number | undefined; forFileId?: string | undefined; } & {}> & { abortSignal?: AbortSignal | undefined; } & { kind: string; }) => Promise<{ shares: ", - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.FileShareJSON", - "text": "FileShareJSON" - }, - "[]; }>" ], - "path": "src/plugins/files/public/types.ts", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [ - { - "parentPluginId": "files", - "id": "def-public.FilesClient.listShares.$1", - "type": "CompoundType", - "tags": [], - "label": "args", - "description": [ - "- Get file share arguments" - ], - "signature": [ - "E[\"inputs\"][\"body\"] & E[\"inputs\"][\"params\"] & E[\"inputs\"][\"query\"] & { abortSignal?: AbortSignal | undefined; } & { kind: string; } & ExtraArgs" - ], - "path": "src/plugins/files/public/types.ts", - "deprecated": false, - "trackAdoption": false - } - ] + "returnComment": [] } ], "initialIsOpen": false @@ -664,7 +118,7 @@ "description": [ "\nA factory for creating a {@link ScopedFilesClient}" ], - "path": "src/plugins/files/public/types.ts", + "path": "src/plugins/files/common/files_client.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -679,16 +133,10 @@ ], "signature": [ "() => ", - { - "pluginId": "files", - "scope": "public", - "docId": "kibFilesPluginApi", - "section": "def-public.FilesClient", - "text": "FilesClient" - }, + "FilesClient", "" ], - "path": "src/plugins/files/public/types.ts", + "path": "src/plugins/files/common/files_client.ts", "deprecated": false, "trackAdoption": false, "children": [], @@ -705,16 +153,10 @@ ], "signature": [ "(fileKind: string) => ", - { - "pluginId": "files", - "scope": "public", - "docId": "kibFilesPluginApi", - "section": "def-public.ScopedFilesClient", - "text": "ScopedFilesClient" - }, + "ScopedFilesClient", "" ], - "path": "src/plugins/files/public/types.ts", + "path": "src/plugins/files/common/files_client.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -724,197 +166,19 @@ "type": "string", "tags": [], "label": "fileKind", - "description": [ - "- The {@link FileKind } to create a client for." - ], - "signature": [ - "string" - ], - "path": "src/plugins/files/public/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "files", - "id": "def-public.Props", - "type": "Interface", - "tags": [], - "label": "Props", - "description": [], - "signature": [ - { - "pluginId": "files", - "scope": "public", - "docId": "kibFilesPluginApi", - "section": "def-public.Props", - "text": "Props" - }, - "" - ], - "path": "src/plugins/files/public/components/file_picker/file_picker.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "files", - "id": "def-public.Props.kind", - "type": "Uncategorized", - "tags": [], - "label": "kind", - "description": [ - "\nThe file kind that was passed to the registry." - ], - "signature": [ - "Kind" - ], - "path": "src/plugins/files/public/components/file_picker/file_picker.tsx", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "files", - "id": "def-public.Props.onClose", - "type": "Function", - "tags": [], - "label": "onClose", - "description": [ - "\nWill be called when the modal is closed" - ], - "signature": [ - "() => void" - ], - "path": "src/plugins/files/public/components/file_picker/file_picker.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [], - "returnComment": [] - }, - { - "parentPluginId": "files", - "id": "def-public.Props.onDone", - "type": "Function", - "tags": [], - "label": "onDone", - "description": [ - "\nWill be called after a user has a selected a set of files" - ], - "signature": [ - "(files: ", - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.FileJSON", - "text": "FileJSON" - }, - "[]) => void" - ], - "path": "src/plugins/files/public/components/file_picker/file_picker.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "files", - "id": "def-public.Props.onDone.$1", - "type": "Array", - "tags": [], - "label": "files", - "description": [], - "signature": [ - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.FileJSON", - "text": "FileJSON" - }, - "[]" - ], - "path": "src/plugins/files/public/components/file_picker/file_picker.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] - }, - { - "parentPluginId": "files", - "id": "def-public.Props.onUpload", - "type": "Function", - "tags": [], - "label": "onUpload", - "description": [ - "\nWhen a user has successfully uploaded some files this callback will be called" - ], - "signature": [ - "((done: ", - "DoneNotification", - "[]) => void) | undefined" - ], - "path": "src/plugins/files/public/components/file_picker/file_picker.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "files", - "id": "def-public.Props.onUpload.$1", - "type": "Array", - "tags": [], - "label": "done", - "description": [], + "description": [ + "- The {@link FileKind } to create a client for." + ], "signature": [ - "DoneNotification", - "[]" + "string" ], - "path": "src/plugins/files/public/components/file_picker/file_picker.tsx", + "path": "src/plugins/files/common/files_client.ts", "deprecated": false, "trackAdoption": false, "isRequired": true } ], "returnComment": [] - }, - { - "parentPluginId": "files", - "id": "def-public.Props.pageSize", - "type": "number", - "tags": [], - "label": "pageSize", - "description": [ - "\nThe number of results to show per page." - ], - "signature": [ - "number | undefined" - ], - "path": "src/plugins/files/public/components/file_picker/file_picker.tsx", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "files", - "id": "def-public.Props.multiple", - "type": "CompoundType", - "tags": [ - "default" - ], - "label": "multiple", - "description": [ - "\nWhether you can select one or more files\n" - ], - "signature": [ - "boolean | undefined" - ], - "path": "src/plugins/files/public/components/file_picker/file_picker.tsx", - "deprecated": false, - "trackAdoption": false } ], "initialIsOpen": false @@ -930,63 +194,7 @@ "label": "FilesClientResponses", "description": [], "signature": [ - "{ create: { file: ", - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.FileJSON", - "text": "FileJSON" - }, - "; }; delete: { ok: true; }; getById: { file: ", - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.FileJSON", - "text": "FileJSON" - }, - "; }; list: { files: ", - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.FileJSON", - "text": "FileJSON" - }, - "[]; total: number; }; update: { file: ", - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.FileJSON", - "text": "FileJSON" - }, - "; }; upload: { ok: true; size: number; }; download: any; getDownloadHref: string; share: ", - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.FileShareJSON", - "text": "FileShareJSON" - }, - " & { token: string; }; unshare: { ok: true; }; getShare: { share: ", - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.FileShareJSON", - "text": "FileShareJSON" - }, - "; }; listShares: { shares: ", - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.FileShareJSON", - "text": "FileShareJSON" - }, - "[]; }; getMetrics: ", + "{ getMetrics: ", { "pluginId": "files", "scope": "common", @@ -995,16 +203,20 @@ "text": "FilesMetrics" }, "; publicDownload: any; find: { files: ", - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.FileJSON", - "text": "FileJSON" - }, - "[]; total: number; }; bulkDelete: Result; }" + "FileJSON", + "[]; total: number; }; bulkDelete: { succeeded: string[]; failed?: [id: string, reason: string][] | undefined; }; create: { file: ", + "FileJSON", + "; }; delete: { ok: true; }; getById: { file: ", + "FileJSON", + "; }; list: { files: ", + "FileJSON", + "[]; total: number; }; update: { file: ", + "FileJSON", + "; }; upload: { ok: true; size: number; }; download: any; getDownloadHref: string; share: any; unshare: { ok: true; }; getShare: { share: FileShareJSON; }; listShares: { shares: FileShareJSON[]; }; getFileKind: ", + "FileKind", + "; }" ], - "path": "src/plugins/files/public/types.ts", + "path": "src/plugins/files/common/files_client.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -1019,71 +231,7 @@ "\nA files client that is scoped to a specific {@link FileKind}.\n\nMore convenient if you want to re-use the same client for the same file kind\nand not specify the kind every time." ], "signature": [ - "{ create: (arg: Omit | undefined; alt?: string | undefined; mimeType?: string | undefined; } & { name: string; }> & { abortSignal?: AbortSignal | undefined; } & { kind: string; }, \"kind\">) => Promise<{ file: ", - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.FileJSON", - "text": "FileJSON" - }, - "; }>; delete: (arg: Omit & { abortSignal?: AbortSignal | undefined; } & { kind: string; }, \"kind\">) => Promise<{ ok: true; }>; getById: (arg: Omit & { abortSignal?: AbortSignal | undefined; } & { kind: string; }, \"kind\">) => Promise<{ file: ", - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.FileJSON", - "text": "FileJSON" - }, - "; }>; list: (arg?: Omit | undefined; extension?: string | string[] | undefined; } & {}> & Readonly<{ page?: number | undefined; perPage?: number | undefined; } & {}> & { abortSignal?: AbortSignal | undefined; } & { kind: string; }, \"kind\"> | undefined) => Promise<{ files: ", - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.FileJSON", - "text": "FileJSON" - }, - "[]; total: number; }>; update: (arg: Omit | undefined; alt?: string | undefined; } & {}> & Readonly<{} & { id: string; }> & { abortSignal?: AbortSignal | undefined; } & { kind: string; }, \"kind\">) => Promise<{ file: ", - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.FileJSON", - "text": "FileJSON" - }, - "; }>; upload: (arg: Omit & Readonly<{ selfDestructOnAbort?: boolean | undefined; } & {}> & { body: unknown; kind: string; abortSignal?: AbortSignal | undefined; contentType?: string | undefined; }, \"kind\">) => Promise<{ ok: true; size: number; }>; download: (arg: Omit & { abortSignal?: AbortSignal | undefined; } & { kind: string; }, \"kind\">) => Promise; getDownloadHref: (arg: Omit, \"id\" | \"fileKind\">, \"kind\">) => string; share: (arg: Omit & Readonly<{} & { fileId: string; }> & { abortSignal?: AbortSignal | undefined; } & { kind: string; }, \"kind\">) => Promise<", - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.FileShareJSONWithToken", - "text": "FileShareJSONWithToken" - }, - ">; unshare: (arg: Omit & { abortSignal?: AbortSignal | undefined; } & { kind: string; }, \"kind\">) => Promise<{ ok: true; }>; getShare: (arg: Omit & { abortSignal?: AbortSignal | undefined; } & { kind: string; }, \"kind\">) => Promise<{ share: ", - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.FileShareJSON", - "text": "FileShareJSON" - }, - "; }>; listShares: (arg: Omit & { abortSignal?: AbortSignal | undefined; } & { kind: string; }, \"kind\">) => Promise<{ shares: ", - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.FileShareJSON", - "text": "FileShareJSON" - }, - "[]; }>; getMetrics: (arg: Omit) => Promise<", + "{ getMetrics: (arg: Omit) => Promise<", { "pluginId": "files", "scope": "common", @@ -1091,39 +239,55 @@ "section": "def-common.FilesMetrics", "text": "FilesMetrics" }, - ">; publicDownload: (arg: Omit & Readonly<{} & { token: string; }> & { abortSignal?: AbortSignal | undefined; }, \"kind\">) => Promise; find: (arg: Omit | undefined; extension?: string | string[] | undefined; kind?: string | string[] | undefined; } & {}> & Readonly<{ page?: number | undefined; perPage?: number | undefined; } & {}> & { abortSignal?: AbortSignal | undefined; }, \"kind\">) => Promise<{ files: ", - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.FileJSON", - "text": "FileJSON" - }, - "[]; total: number; }>; bulkDelete: (arg: Omit & { abortSignal?: AbortSignal | undefined; }, \"kind\">) => Promise; }" - ], - "path": "src/plugins/files/public/types.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "files", - "id": "def-public.UploadFileProps", - "type": "Type", - "tags": [], - "label": "UploadFileProps", - "description": [], - "signature": [ - { - "pluginId": "files", - "scope": "public", - "docId": "kibFilesPluginApi", - "section": "def-public.Props", - "text": "Props" - }, - " & { lazyLoadFallback?: React.ReactNode; }" + ">; publicDownload: (arg: Omit<{ token: string; fileName?: string | undefined; }, \"kind\">) => any; find: (arg: Omit<{ kind?: string | string[] | undefined; status?: string | string[] | undefined; extension?: string | string[] | undefined; name?: string | string[] | undefined; meta?: M | undefined; } & ", + "Pagination", + " & ", + "Abortable", + ", \"kind\">) => Promise<{ files: ", + "FileJSON", + "[]; total: number; }>; bulkDelete: (arg: Omit<{ ids: string[]; } & ", + "Abortable", + ", \"kind\">) => Promise<{ succeeded: string[]; failed?: [id: string, reason: string][] | undefined; }>; create: (arg: Omit<{ name: string; meta?: M | undefined; alt?: string | undefined; mimeType?: string | undefined; kind: string; } & ", + "Abortable", + ", \"kind\">) => Promise<{ file: ", + "FileJSON", + "; }>; delete: (arg: Omit<{ id: string; kind: string; } & ", + "Abortable", + ", \"kind\">) => Promise<{ ok: true; }>; getById: (arg: Omit<{ id: string; kind: string; } & ", + "Abortable", + ", \"kind\">) => Promise<{ file: ", + "FileJSON", + "; }>; list: (arg?: Omit<{ kind: string; status?: string | string[] | undefined; extension?: string | string[] | undefined; name?: string | string[] | undefined; meta?: M | undefined; } & ", + "Pagination", + " & ", + "Abortable", + ", \"kind\"> | undefined) => Promise<{ files: ", + "FileJSON", + "[]; total: number; }>; update: (arg: Omit<{ id: string; kind: string; name?: string | undefined; meta?: M | undefined; alt?: string | undefined; } & ", + "Abortable", + ", \"kind\">) => Promise<{ file: ", + "FileJSON", + "; }>; upload: (arg: Omit<{ id: string; body: unknown; kind: string; abortSignal?: AbortSignal | undefined; contentType?: string | undefined; selfDestructOnAbort?: boolean | undefined; } & ", + "Abortable", + ", \"kind\">) => Promise<{ ok: true; size: number; }>; download: (arg: Omit<{ fileName?: string | undefined; id: string; kind: string; } & ", + "Abortable", + ", \"kind\">) => Promise; getDownloadHref: (arg: Omit, \"id\" | \"fileKind\">, \"kind\">) => string; share: (arg: Omit<{ name?: string | undefined; validUntil?: number | undefined; fileId: string; kind: string; } & ", + "Abortable", + ", \"kind\">) => Promise; unshare: (arg: Omit<{ id: string; kind: string; } & ", + "Abortable", + ", \"kind\">) => Promise<{ ok: true; }>; getShare: (arg: Omit<{ id: string; kind: string; } & ", + "Abortable", + ", \"kind\">) => Promise<{ share: FileShareJSON; }>; listShares: (arg: Omit<{ forFileId?: string | undefined; kind: string; } & ", + "Pagination", + " & ", + "Abortable", + ", \"kind\">) => Promise<{ shares: FileShareJSON[]; }>; getFileKind: (arg: Omit) => ", + "FileKind", + "; }" ], - "path": "src/plugins/files/public/components/upload_file/index.tsx", + "path": "src/plugins/files/common/files_client.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -1427,13 +591,7 @@ "\nA factory for creating an {@link FilesClient} instance. This requires a\nregistered {@link FileKind}.\n" ], "signature": [ - { - "pluginId": "files", - "scope": "public", - "docId": "kibFilesPluginApi", - "section": "def-public.FilesClientFactory", - "text": "FilesClientFactory" - } + "FilesClientFactory" ], "path": "src/plugins/files/public/plugin.ts", "deprecated": false, @@ -1456,13 +614,7 @@ ], "signature": [ "(fileKind: ", - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.FileKind", - "text": "FileKind" - }, + "FileKind", ") => void" ], "path": "src/plugins/files/public/plugin.ts", @@ -1479,13 +631,7 @@ "- the file kind to register" ], "signature": [ - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.FileKind", - "text": "FileKind" - } + "FileKind" ], "path": "src/plugins/files/public/plugin.ts", "deprecated": false, @@ -1508,13 +654,7 @@ "description": [], "signature": [ "{ filesClientFactory: ", - { - "pluginId": "files", - "scope": "public", - "docId": "kibFilesPluginApi", - "section": "def-public.FilesClientFactory", - "text": "FilesClientFactory" - }, + "FilesClientFactory", "; }" ], "path": "src/plugins/files/public/plugin.ts", @@ -3649,21 +2789,9 @@ ], "signature": [ "Required> & ", - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.BaseFileMetadata", - "text": "BaseFileMetadata" - }, + "BaseFileMetadata", " & { FileKind: string; Meta?: M | undefined; }" ], "path": "src/plugins/files/server/file_client/file_metadata_client/file_metadata_client.ts", @@ -4382,13 +3510,7 @@ "text": "FindFileArgs" }, ") => Promise<{ files: ", - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.FileJSON", - "text": "FileJSON" - }, + "FileJSON", "[]; total: number; }>" ], "path": "src/plugins/files/server/file_service/file_service.ts", @@ -5246,13 +4368,7 @@ ], "signature": [ "{ name?: string | undefined; created?: string | undefined; Status?: \"AWAITING_UPLOAD\" | \"UPLOADING\" | \"READY\" | \"UPLOAD_ERROR\" | \"DELETED\" | undefined; Updated?: string | undefined; mime_type?: string | undefined; size?: number | undefined; hash?: { [hashName: string]: string | undefined; md5?: string | undefined; sha1?: string | undefined; sha256?: string | undefined; sha384?: string | undefined; sha512?: string | undefined; ssdeep?: string | undefined; tlsh?: string | undefined; } | undefined; user?: { name?: string | undefined; id?: string | undefined; } | undefined; extension?: string | undefined; Alt?: string | undefined; ChunkSize?: number | undefined; Compression?: ", - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.FileCompression", - "text": "FileCompression" - }, + "FileCompression", " | undefined; FileKind?: string | undefined; Meta?: M | undefined; }" ], "path": "src/plugins/files/server/file_client/file_metadata_client/file_metadata_client.ts", @@ -5417,13 +4533,7 @@ ], "signature": [ "(fileKind: ", - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.FileKind", - "text": "FileKind" - }, + "FileKind", ") => void" ], "path": "src/plugins/files/server/types.ts", @@ -5441,13 +4551,7 @@ "- the file kind to register" ], "signature": [ - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.FileKind", - "text": "FileKind" - } + "FileKind" ], "path": "src/plugins/files/server/types.ts", "deprecated": false, @@ -5586,13 +4690,7 @@ "\nFile metadata in camelCase form." ], "signature": [ - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.FileJSON", - "text": "FileJSON" - }, + "FileJSON", "" ], "path": "src/plugins/files/common/types.ts", @@ -5913,13 +5011,7 @@ ], "signature": [ "() => ", - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.FileJSON", - "text": "FileJSON" - }, + "FileJSON", "" ], "path": "src/plugins/files/common/types.ts", @@ -5941,16 +5033,10 @@ "\nAttributes of a file that represent a serialised version of the file." ], "signature": [ - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.FileJSON", - "text": "FileJSON" - }, + "FileJSON", "" ], - "path": "src/plugins/files/common/types.ts", + "path": "packages/shared-ux/file/types/index.d.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -5963,7 +5049,7 @@ "description": [ "\nUnique file ID." ], - "path": "src/plugins/files/common/types.ts", + "path": "packages/shared-ux/file/types/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -5976,7 +5062,7 @@ "description": [ "\nISO string of when this file was created" ], - "path": "src/plugins/files/common/types.ts", + "path": "packages/shared-ux/file/types/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -5989,7 +5075,7 @@ "description": [ "\nISO string of when the file was updated" ], - "path": "src/plugins/files/common/types.ts", + "path": "packages/shared-ux/file/types/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -6004,7 +5090,7 @@ "description": [ "\nFile name.\n" ], - "path": "src/plugins/files/common/types.ts", + "path": "packages/shared-ux/file/types/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -6020,7 +5106,7 @@ "signature": [ "string | undefined" ], - "path": "src/plugins/files/common/types.ts", + "path": "packages/shared-ux/file/types/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -6036,7 +5122,7 @@ "signature": [ "number | undefined" ], - "path": "src/plugins/files/common/types.ts", + "path": "packages/shared-ux/file/types/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -6054,7 +5140,7 @@ "signature": [ "string | undefined" ], - "path": "src/plugins/files/common/types.ts", + "path": "packages/shared-ux/file/types/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -6070,7 +5156,7 @@ "signature": [ "Meta | undefined" ], - "path": "src/plugins/files/common/types.ts", + "path": "packages/shared-ux/file/types/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -6086,7 +5172,7 @@ "signature": [ "string | undefined" ], - "path": "src/plugins/files/common/types.ts", + "path": "packages/shared-ux/file/types/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -6101,7 +5187,7 @@ "description": [ "\nA unique kind that governs various aspects of the file. A consumer of the\nfiles service must register a file kind and link their files to a specific\nkind.\n" ], - "path": "src/plugins/files/common/types.ts", + "path": "packages/shared-ux/file/types/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -6117,7 +5203,7 @@ "signature": [ "\"AWAITING_UPLOAD\" | \"UPLOADING\" | \"READY\" | \"UPLOAD_ERROR\" | \"DELETED\"" ], - "path": "src/plugins/files/common/types.ts", + "path": "packages/shared-ux/file/types/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -6133,7 +5219,7 @@ "signature": [ "{ name?: string | undefined; id?: string | undefined; } | undefined" ], - "path": "src/plugins/files/common/types.ts", + "path": "packages/shared-ux/file/types/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -6144,14 +5230,10 @@ "parentPluginId": "files", "id": "def-common.FileKind", "type": "Interface", - "tags": [ - "note" - ], + "tags": [], "label": "FileKind", - "description": [ - "\nA descriptor of meta values associated with a set or \"kind\" of files.\n" - ], - "path": "src/plugins/files/common/types.ts", + "description": [], + "path": "packages/shared-ux/file/types/index.d.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -6164,7 +5246,7 @@ "description": [ "\nUnique file kind ID" ], - "path": "src/plugins/files/common/types.ts", + "path": "packages/shared-ux/file/types/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -6182,7 +5264,7 @@ "signature": [ "number | undefined" ], - "path": "src/plugins/files/common/types.ts", + "path": "packages/shared-ux/file/types/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -6200,30 +5282,23 @@ "signature": [ "string[] | undefined" ], - "path": "src/plugins/files/common/types.ts", + "path": "packages/shared-ux/file/types/index.d.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "files", "id": "def-common.FileKind.blobStoreSettings", - "type": "Object", + "type": "Any", "tags": [], "label": "blobStoreSettings", "description": [ "\nBlob store specific settings that enable configuration of storage\ndetails." ], "signature": [ - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.BlobStorageSettings", - "text": "BlobStorageSettings" - }, - " | undefined" + "any" ], - "path": "src/plugins/files/common/types.ts", + "path": "packages/shared-ux/file/types/index.d.ts", "deprecated": false, "trackAdoption": false }, @@ -6239,9 +5314,9 @@ "\nSpecify which HTTP routes to create for the file kind.\n\nYou can always create your own HTTP routes for working with files but\nthis interface allows you to expose basic CRUD operations, upload, download\nand sharing of files over a RESTful-like interface.\n" ], "signature": [ - "{ create?: HttpEndpointDefinition | undefined; update?: HttpEndpointDefinition | undefined; delete?: HttpEndpointDefinition | undefined; getById?: HttpEndpointDefinition | undefined; list?: HttpEndpointDefinition | undefined; download?: HttpEndpointDefinition | undefined; share?: HttpEndpointDefinition | undefined; }" + "{ create?: any; update?: any; delete?: any; getById?: any; list?: any; download?: any; share?: any; }" ], - "path": "src/plugins/files/common/types.ts", + "path": "packages/shared-ux/file/types/index.d.ts", "deprecated": false, "trackAdoption": false } @@ -6537,24 +5612,12 @@ ], "signature": [ "{ name?: string | undefined; mime_type?: string | undefined; created?: string | undefined; size?: number | undefined; hash?: { [hashName: string]: string | undefined; md5?: string | undefined; sha1?: string | undefined; sha256?: string | undefined; sha384?: string | undefined; sha512?: string | undefined; ssdeep?: string | undefined; tlsh?: string | undefined; } | undefined; user?: { name?: string | undefined; id?: string | undefined; } | undefined; extension?: string | undefined; Alt?: string | undefined; Updated?: string | undefined; Status?: ", - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.FileStatus", - "text": "FileStatus" - }, + "FileStatus", " | undefined; ChunkSize?: number | undefined; Compression?: ", - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.FileCompression", - "text": "FileCompression" - }, + "FileCompression", " | undefined; }" ], - "path": "src/plugins/files/common/types.ts", + "path": "packages/shared-ux/file/types/index.d.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -6605,7 +5668,7 @@ "signature": [ "\"none\" | \"br\" | \"gzip\" | \"deflate\"" ], - "path": "src/plugins/files/common/types.ts", + "path": "packages/shared-ux/file/types/index.d.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -6621,24 +5684,12 @@ ], "signature": [ "Required> & ", - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.BaseFileMetadata", - "text": "BaseFileMetadata" - }, + "BaseFileMetadata", " & { FileKind: string; Meta?: Meta | undefined; }" ], - "path": "src/plugins/files/common/types.ts", + "path": "packages/shared-ux/file/types/index.d.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false @@ -6661,13 +5712,7 @@ "text": "SavedObject" }, "<", - { - "pluginId": "files", - "scope": "common", - "docId": "kibFilesPluginApi", - "section": "def-common.FileMetadata", - "text": "FileMetadata" - }, + "FileMetadata", ">" ], "path": "src/plugins/files/common/types.ts", @@ -6724,13 +5769,11 @@ "type": "Type", "tags": [], "label": "FileStatus", - "description": [ - "\nStatus of a file.\n\nAWAITING_UPLOAD - A file object has been created but does not have any contents.\nUPLOADING - File contents are being uploaded.\nREADY - File contents have been uploaded and are ready for to be downloaded.\nUPLOAD_ERROR - An attempt was made to upload file contents but failed.\nDELETED - The file contents have been or are being deleted." - ], + "description": [], "signature": [ "\"AWAITING_UPLOAD\" | \"UPLOADING\" | \"READY\" | \"UPLOAD_ERROR\" | \"DELETED\"" ], - "path": "src/plugins/files/common/types.ts", + "path": "packages/shared-ux/file/types/index.d.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false diff --git a/api_docs/files.mdx b/api_docs/files.mdx index 69a05a4001989..9c521be6e1c82 100644 --- a/api_docs/files.mdx +++ b/api_docs/files.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/files title: "files" image: https://source.unsplash.com/400x175/?github description: API docs for the files plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'files'] --- import filesObj from './files.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-app-services](https://github.com/orgs/elastic/teams/tea | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 287 | 0 | 50 | 3 | +| 252 | 1 | 45 | 5 | ## Client @@ -34,9 +34,6 @@ Contact [@elastic/kibana-app-services](https://github.com/orgs/elastic/teams/tea ### Objects -### Functions - - ### Interfaces diff --git a/api_docs/files_management.mdx b/api_docs/files_management.mdx index 78ddf608f4bf0..fecb4cd1da7e7 100644 --- a/api_docs/files_management.mdx +++ b/api_docs/files_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/filesManagement title: "filesManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the filesManagement plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.devdocs.json b/api_docs/fleet.devdocs.json index 2a3246e0b2b07..e398b65308b9c 100644 --- a/api_docs/fleet.devdocs.json +++ b/api_docs/fleet.devdocs.json @@ -10647,7 +10647,7 @@ "label": "agent", "description": [], "signature": [ - "{ monitoring: { namespace?: string | undefined; use_output?: string | undefined; enabled: boolean; metrics: boolean; logs: boolean; }; download: { source_uri: string; }; } | undefined" + "{ monitoring: { namespace?: string | undefined; use_output?: string | undefined; enabled: boolean; metrics: boolean; logs: boolean; }; download: { sourceURI: string; }; } | undefined" ], "path": "x-pack/plugins/fleet/common/types/models/agent_policy.ts", "deprecated": false, diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index d328e6d2e8ccb..849ca218c21da 100644 --- a/api_docs/fleet.mdx +++ b/api_docs/fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fleet title: "fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the fleet plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] --- import fleetObj from './fleet.devdocs.json'; diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index ea1b184e723d5..6a86ff8c57370 100644 --- a/api_docs/global_search.mdx +++ b/api_docs/global_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/globalSearch title: "globalSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the globalSearch plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'globalSearch'] --- import globalSearchObj from './global_search.devdocs.json'; diff --git a/api_docs/guided_onboarding.mdx b/api_docs/guided_onboarding.mdx index e1149c95144cf..b2f3a604c7f6a 100644 --- a/api_docs/guided_onboarding.mdx +++ b/api_docs/guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/guidedOnboarding title: "guidedOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the guidedOnboarding plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'guidedOnboarding'] --- import guidedOnboardingObj from './guided_onboarding.devdocs.json'; diff --git a/api_docs/home.mdx b/api_docs/home.mdx index 7123879afedf2..8fdeba2c97000 100644 --- a/api_docs/home.mdx +++ b/api_docs/home.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/home title: "home" image: https://source.unsplash.com/400x175/?github description: API docs for the home plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home'] --- import homeObj from './home.devdocs.json'; diff --git a/api_docs/index_lifecycle_management.mdx b/api_docs/index_lifecycle_management.mdx index 3fedb8c3e2001..e0f5f26244049 100644 --- a/api_docs/index_lifecycle_management.mdx +++ b/api_docs/index_lifecycle_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexLifecycleManagement title: "indexLifecycleManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexLifecycleManagement plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexLifecycleManagement'] --- import indexLifecycleManagementObj from './index_lifecycle_management.devdocs.json'; diff --git a/api_docs/index_management.mdx b/api_docs/index_management.mdx index eba1bbf7f8380..2672c4384311a 100644 --- a/api_docs/index_management.mdx +++ b/api_docs/index_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexManagement title: "indexManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexManagement plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] --- import indexManagementObj from './index_management.devdocs.json'; diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index ff6d0d8438dc1..ce78cbcd3e745 100644 --- a/api_docs/infra.mdx +++ b/api_docs/infra.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/infra title: "infra" image: https://source.unsplash.com/400x175/?github description: API docs for the infra plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] --- import infraObj from './infra.devdocs.json'; diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index ec0bea48ab18d..44655166ab6e4 100644 --- a/api_docs/inspector.mdx +++ b/api_docs/inspector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inspector title: "inspector" image: https://source.unsplash.com/400x175/?github description: API docs for the inspector plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] --- import inspectorObj from './inspector.devdocs.json'; diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx index 4bc91c8007b53..f972bdf1747dc 100644 --- a/api_docs/interactive_setup.mdx +++ b/api_docs/interactive_setup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/interactiveSetup title: "interactiveSetup" image: https://source.unsplash.com/400x175/?github description: API docs for the interactiveSetup plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] --- import interactiveSetupObj from './interactive_setup.devdocs.json'; diff --git a/api_docs/kbn_ace.mdx b/api_docs/kbn_ace.mdx index 88294719b36ea..52a5df586e1c0 100644 --- a/api_docs/kbn_ace.mdx +++ b/api_docs/kbn_ace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ace title: "@kbn/ace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ace plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] --- import kbnAceObj from './kbn_ace.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index 75f06ecc8b881..8cf3b1044c3c8 100644 --- a/api_docs/kbn_aiops_components.mdx +++ b/api_docs/kbn_aiops_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-components title: "@kbn/aiops-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-components plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components'] --- import kbnAiopsComponentsObj from './kbn_aiops_components.devdocs.json'; diff --git a/api_docs/kbn_aiops_utils.mdx b/api_docs/kbn_aiops_utils.mdx index d5e5a1ed6db5c..e7f43717d2c8e 100644 --- a/api_docs/kbn_aiops_utils.mdx +++ b/api_docs/kbn_aiops_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-utils title: "@kbn/aiops-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-utils plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-utils'] --- import kbnAiopsUtilsObj from './kbn_aiops_utils.devdocs.json'; diff --git a/api_docs/kbn_alerts.mdx b/api_docs/kbn_alerts.mdx index 62cc425b3e786..a7aa11f526142 100644 --- a/api_docs/kbn_alerts.mdx +++ b/api_docs/kbn_alerts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts title: "@kbn/alerts" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts'] --- import kbnAlertsObj from './kbn_alerts.devdocs.json'; diff --git a/api_docs/kbn_analytics.mdx b/api_docs/kbn_analytics.mdx index f097cb6356bc8..6baa427b1eff9 100644 --- a/api_docs/kbn_analytics.mdx +++ b/api_docs/kbn_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics title: "@kbn/analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_client.mdx b/api_docs/kbn_analytics_client.mdx index 2133f34e129b9..f09c458030ff5 100644 --- a/api_docs/kbn_analytics_client.mdx +++ b/api_docs/kbn_analytics_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-client title: "@kbn/analytics-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-client plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-client'] --- import kbnAnalyticsClientObj from './kbn_analytics_client.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx index 5913f1a162b26..8f66cfbf46e17 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx @@ -8,7 +8,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 description: API docs for the @kbn/analytics-shippers-elastic-v3-browser plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-browser'] --- import kbnAnalyticsShippersElasticV3BrowserObj from './kbn_analytics_shippers_elastic_v3_browser.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx index 90a2caa58eb9f..adb2ebea0866e 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx @@ -8,7 +8,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 description: API docs for the @kbn/analytics-shippers-elastic-v3-common plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-common'] --- import kbnAnalyticsShippersElasticV3CommonObj from './kbn_analytics_shippers_elastic_v3_common.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx index 4884b48e9fe8f..ea8efe8b11ca6 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx @@ -8,7 +8,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 description: API docs for the @kbn/analytics-shippers-elastic-v3-server plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-server'] --- import kbnAnalyticsShippersElasticV3ServerObj from './kbn_analytics_shippers_elastic_v3_server.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_fullstory.mdx b/api_docs/kbn_analytics_shippers_fullstory.mdx index 672f73466298d..2ec36bb9e8eaa 100644 --- a/api_docs/kbn_analytics_shippers_fullstory.mdx +++ b/api_docs/kbn_analytics_shippers_fullstory.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-fullstory title: "@kbn/analytics-shippers-fullstory" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-fullstory plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-fullstory'] --- import kbnAnalyticsShippersFullstoryObj from './kbn_analytics_shippers_fullstory.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_gainsight.mdx b/api_docs/kbn_analytics_shippers_gainsight.mdx index 5dd8f19d2f64d..907e373069167 100644 --- a/api_docs/kbn_analytics_shippers_gainsight.mdx +++ b/api_docs/kbn_analytics_shippers_gainsight.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-gainsight title: "@kbn/analytics-shippers-gainsight" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-gainsight plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-gainsight'] --- import kbnAnalyticsShippersGainsightObj from './kbn_analytics_shippers_gainsight.devdocs.json'; diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index 9faffcf5ce698..4c289194191c9 100644 --- a/api_docs/kbn_apm_config_loader.mdx +++ b/api_docs/kbn_apm_config_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-config-loader title: "@kbn/apm-config-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-config-loader plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-config-loader'] --- import kbnApmConfigLoaderObj from './kbn_apm_config_loader.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace.mdx b/api_docs/kbn_apm_synthtrace.mdx index 835fd0af87b9e..10d16bb0a4f0a 100644 --- a/api_docs/kbn_apm_synthtrace.mdx +++ b/api_docs/kbn_apm_synthtrace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace title: "@kbn/apm-synthtrace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace'] --- import kbnApmSynthtraceObj from './kbn_apm_synthtrace.devdocs.json'; diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index f4dc547194f12..9b5b6cc1cdb41 100644 --- a/api_docs/kbn_apm_utils.mdx +++ b/api_docs/kbn_apm_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-utils title: "@kbn/apm-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-utils plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils'] --- import kbnApmUtilsObj from './kbn_apm_utils.devdocs.json'; diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx index 374b3817d8b13..d9604048fe5da 100644 --- a/api_docs/kbn_axe_config.mdx +++ b/api_docs/kbn_axe_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-axe-config title: "@kbn/axe-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/axe-config plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config'] --- import kbnAxeConfigObj from './kbn_axe_config.devdocs.json'; diff --git a/api_docs/kbn_cases_components.mdx b/api_docs/kbn_cases_components.mdx index fb24b12a064d0..f2bcee1010568 100644 --- a/api_docs/kbn_cases_components.mdx +++ b/api_docs/kbn_cases_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cases-components title: "@kbn/cases-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cases-components plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cases-components'] --- import kbnCasesComponentsObj from './kbn_cases_components.devdocs.json'; diff --git a/api_docs/kbn_chart_icons.mdx b/api_docs/kbn_chart_icons.mdx index d6aaced0201c6..e38ff9e3c55a2 100644 --- a/api_docs/kbn_chart_icons.mdx +++ b/api_docs/kbn_chart_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-icons title: "@kbn/chart-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-icons plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-icons'] --- import kbnChartIconsObj from './kbn_chart_icons.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_core.mdx b/api_docs/kbn_ci_stats_core.mdx index b4887ec2e338b..cc07539d20d08 100644 --- a/api_docs/kbn_ci_stats_core.mdx +++ b/api_docs/kbn_ci_stats_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-core title: "@kbn/ci-stats-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-core plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-core'] --- import kbnCiStatsCoreObj from './kbn_ci_stats_core.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_performance_metrics.mdx b/api_docs/kbn_ci_stats_performance_metrics.mdx index fa4c05e089846..2f436110dbcfe 100644 --- a/api_docs/kbn_ci_stats_performance_metrics.mdx +++ b/api_docs/kbn_ci_stats_performance_metrics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-performance-metrics title: "@kbn/ci-stats-performance-metrics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-performance-metrics plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-performance-metrics'] --- import kbnCiStatsPerformanceMetricsObj from './kbn_ci_stats_performance_metrics.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_reporter.mdx b/api_docs/kbn_ci_stats_reporter.mdx index c7a3b618967c1..581a6cbb18c36 100644 --- a/api_docs/kbn_ci_stats_reporter.mdx +++ b/api_docs/kbn_ci_stats_reporter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-reporter title: "@kbn/ci-stats-reporter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-reporter plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-reporter'] --- import kbnCiStatsReporterObj from './kbn_ci_stats_reporter.devdocs.json'; diff --git a/api_docs/kbn_cli_dev_mode.mdx b/api_docs/kbn_cli_dev_mode.mdx index 3fe11a89ef811..8f7c619b69be8 100644 --- a/api_docs/kbn_cli_dev_mode.mdx +++ b/api_docs/kbn_cli_dev_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cli-dev-mode title: "@kbn/cli-dev-mode" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cli-dev-mode plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] --- import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json'; diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index 4bf877d6fcdb7..3ae2b6536f3f4 100644 --- a/api_docs/kbn_coloring.mdx +++ b/api_docs/kbn_coloring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-coloring title: "@kbn/coloring" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/coloring plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/coloring'] --- import kbnColoringObj from './kbn_coloring.devdocs.json'; diff --git a/api_docs/kbn_config.mdx b/api_docs/kbn_config.mdx index c2bb42b1e1de7..bbc7a11c3b07e 100644 --- a/api_docs/kbn_config.mdx +++ b/api_docs/kbn_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config title: "@kbn/config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config'] --- import kbnConfigObj from './kbn_config.devdocs.json'; diff --git a/api_docs/kbn_config_mocks.mdx b/api_docs/kbn_config_mocks.mdx index 506c5f8055aa3..56bc107039585 100644 --- a/api_docs/kbn_config_mocks.mdx +++ b/api_docs/kbn_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-mocks title: "@kbn/config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-mocks'] --- import kbnConfigMocksObj from './kbn_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_config_schema.devdocs.json b/api_docs/kbn_config_schema.devdocs.json index 6f14501525b6d..fba38fe0d44cc 100644 --- a/api_docs/kbn_config_schema.devdocs.json +++ b/api_docs/kbn_config_schema.devdocs.json @@ -463,6 +463,9 @@ "label": "rightOperand", "description": [], "signature": [ + "A | ", + "Reference", + " | ", { "pluginId": "@kbn/config-schema", "scope": "server", @@ -470,9 +473,7 @@ "section": "def-server.Type", "text": "Type" }, - " | A | ", - "Reference", - "" + "" ], "path": "packages/kbn-config-schema/src/types/conditional_type.ts", "deprecated": false, @@ -1465,7 +1466,9 @@ "ConditionalTypeValue", ", B, C>(leftOperand: ", "Reference", - ", rightOperand: ", + ", rightOperand: A | ", + "Reference", + " | ", { "pluginId": "@kbn/config-schema", "scope": "server", @@ -1473,9 +1476,7 @@ "section": "def-server.Type", "text": "Type" }, - " | A | ", - "Reference", - ", equalType: ", + ", equalType: ", { "pluginId": "@kbn/config-schema", "scope": "server", @@ -2520,7 +2521,9 @@ "ConditionalTypeValue", ", B, C>(leftOperand: ", "Reference", - ", rightOperand: ", + ", rightOperand: A | ", + "Reference", + " | ", { "pluginId": "@kbn/config-schema", "scope": "server", @@ -2528,9 +2531,7 @@ "section": "def-server.Type", "text": "Type" }, - " | A | ", - "Reference", - ", equalType: ", + ", equalType: ", { "pluginId": "@kbn/config-schema", "scope": "server", @@ -2586,6 +2587,9 @@ "label": "rightOperand", "description": [], "signature": [ + "A | ", + "Reference", + " | ", { "pluginId": "@kbn/config-schema", "scope": "server", @@ -2593,9 +2597,7 @@ "section": "def-server.Type", "text": "Type" }, - " | A | ", - "Reference", - "" + "" ], "path": "packages/kbn-config-schema/index.ts", "deprecated": false, diff --git a/api_docs/kbn_config_schema.mdx b/api_docs/kbn_config_schema.mdx index fbc878540bd18..f7e8525b197c2 100644 --- a/api_docs/kbn_config_schema.mdx +++ b/api_docs/kbn_config_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-schema title: "@kbn/config-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-schema plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-schema'] --- import kbnConfigSchemaObj from './kbn_config_schema.devdocs.json'; diff --git a/api_docs/kbn_content_management_inspector.mdx b/api_docs/kbn_content_management_inspector.mdx index 2470d81f2a77e..81127944d0d00 100644 --- a/api_docs/kbn_content_management_inspector.mdx +++ b/api_docs/kbn_content_management_inspector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-inspector title: "@kbn/content-management-inspector" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-inspector plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-inspector'] --- import kbnContentManagementInspectorObj from './kbn_content_management_inspector.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list.mdx b/api_docs/kbn_content_management_table_list.mdx index 59133e5c32711..06f5486e78e95 100644 --- a/api_docs/kbn_content_management_table_list.mdx +++ b/api_docs/kbn_content_management_table_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list title: "@kbn/content-management-table-list" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list'] --- import kbnContentManagementTableListObj from './kbn_content_management_table_list.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index fe17a5ee2a252..d389fbaec09ce 100644 --- a/api_docs/kbn_core_analytics_browser.mdx +++ b/api_docs/kbn_core_analytics_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser title: "@kbn/core-analytics-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser'] --- import kbnCoreAnalyticsBrowserObj from './kbn_core_analytics_browser.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_internal.mdx b/api_docs/kbn_core_analytics_browser_internal.mdx index 393229992a841..422aab069ac43 100644 --- a/api_docs/kbn_core_analytics_browser_internal.mdx +++ b/api_docs/kbn_core_analytics_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-internal title: "@kbn/core-analytics-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-internal'] --- import kbnCoreAnalyticsBrowserInternalObj from './kbn_core_analytics_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_mocks.mdx b/api_docs/kbn_core_analytics_browser_mocks.mdx index 3c082aa7c7e22..816357d0731c1 100644 --- a/api_docs/kbn_core_analytics_browser_mocks.mdx +++ b/api_docs/kbn_core_analytics_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-mocks title: "@kbn/core-analytics-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-mocks'] --- import kbnCoreAnalyticsBrowserMocksObj from './kbn_core_analytics_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server.mdx b/api_docs/kbn_core_analytics_server.mdx index 24fba51e25474..eff115ce8e3de 100644 --- a/api_docs/kbn_core_analytics_server.mdx +++ b/api_docs/kbn_core_analytics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server title: "@kbn/core-analytics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server'] --- import kbnCoreAnalyticsServerObj from './kbn_core_analytics_server.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_internal.mdx b/api_docs/kbn_core_analytics_server_internal.mdx index a472aa73c4bc0..bae025c91ce2b 100644 --- a/api_docs/kbn_core_analytics_server_internal.mdx +++ b/api_docs/kbn_core_analytics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-internal title: "@kbn/core-analytics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-internal'] --- import kbnCoreAnalyticsServerInternalObj from './kbn_core_analytics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_mocks.mdx b/api_docs/kbn_core_analytics_server_mocks.mdx index 061f371fda13c..902cc7d5e17ba 100644 --- a/api_docs/kbn_core_analytics_server_mocks.mdx +++ b/api_docs/kbn_core_analytics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-mocks title: "@kbn/core-analytics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-mocks'] --- import kbnCoreAnalyticsServerMocksObj from './kbn_core_analytics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser.mdx b/api_docs/kbn_core_application_browser.mdx index 68c51511f90bd..d5667a340eda7 100644 --- a/api_docs/kbn_core_application_browser.mdx +++ b/api_docs/kbn_core_application_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser title: "@kbn/core-application-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser'] --- import kbnCoreApplicationBrowserObj from './kbn_core_application_browser.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_internal.mdx b/api_docs/kbn_core_application_browser_internal.mdx index f11375333b37b..b257c6584d453 100644 --- a/api_docs/kbn_core_application_browser_internal.mdx +++ b/api_docs/kbn_core_application_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-internal title: "@kbn/core-application-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-internal'] --- import kbnCoreApplicationBrowserInternalObj from './kbn_core_application_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_mocks.mdx b/api_docs/kbn_core_application_browser_mocks.mdx index fdb6ba6b1943d..b15c687bc54a8 100644 --- a/api_docs/kbn_core_application_browser_mocks.mdx +++ b/api_docs/kbn_core_application_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-mocks title: "@kbn/core-application-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-mocks'] --- import kbnCoreApplicationBrowserMocksObj from './kbn_core_application_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_common.mdx b/api_docs/kbn_core_application_common.mdx index 0a9f06262b256..95baec8199c8a 100644 --- a/api_docs/kbn_core_application_common.mdx +++ b/api_docs/kbn_core_application_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-common title: "@kbn/core-application-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-common plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-common'] --- import kbnCoreApplicationCommonObj from './kbn_core_application_common.devdocs.json'; diff --git a/api_docs/kbn_core_apps_browser_internal.mdx b/api_docs/kbn_core_apps_browser_internal.mdx index 55460963472dc..8e51b4e1ebb70 100644 --- a/api_docs/kbn_core_apps_browser_internal.mdx +++ b/api_docs/kbn_core_apps_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-internal title: "@kbn/core-apps-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-internal'] --- import kbnCoreAppsBrowserInternalObj from './kbn_core_apps_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_apps_browser_mocks.mdx b/api_docs/kbn_core_apps_browser_mocks.mdx index 3c25309abb4a9..3b3cede23cfc9 100644 --- a/api_docs/kbn_core_apps_browser_mocks.mdx +++ b/api_docs/kbn_core_apps_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-mocks title: "@kbn/core-apps-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-mocks'] --- import kbnCoreAppsBrowserMocksObj from './kbn_core_apps_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_apps_server_internal.mdx b/api_docs/kbn_core_apps_server_internal.mdx index a23be8969ea2d..1310cb9f43407 100644 --- a/api_docs/kbn_core_apps_server_internal.mdx +++ b/api_docs/kbn_core_apps_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-server-internal title: "@kbn/core-apps-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-server-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-server-internal'] --- import kbnCoreAppsServerInternalObj from './kbn_core_apps_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_browser_mocks.mdx b/api_docs/kbn_core_base_browser_mocks.mdx index 01a28813e711e..a859a592ccc8f 100644 --- a/api_docs/kbn_core_base_browser_mocks.mdx +++ b/api_docs/kbn_core_base_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-browser-mocks title: "@kbn/core-base-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-browser-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-browser-mocks'] --- import kbnCoreBaseBrowserMocksObj from './kbn_core_base_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_base_common.mdx b/api_docs/kbn_core_base_common.mdx index 64828f5f792b7..9d993448d2306 100644 --- a/api_docs/kbn_core_base_common.mdx +++ b/api_docs/kbn_core_base_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-common title: "@kbn/core-base-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-common plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-common'] --- import kbnCoreBaseCommonObj from './kbn_core_base_common.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_internal.mdx b/api_docs/kbn_core_base_server_internal.mdx index 9f2a06fa3c779..3cbcf0abe2319 100644 --- a/api_docs/kbn_core_base_server_internal.mdx +++ b/api_docs/kbn_core_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-internal title: "@kbn/core-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-internal'] --- import kbnCoreBaseServerInternalObj from './kbn_core_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_mocks.mdx b/api_docs/kbn_core_base_server_mocks.mdx index 351be6eeab306..590c9518b5689 100644 --- a/api_docs/kbn_core_base_server_mocks.mdx +++ b/api_docs/kbn_core_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-mocks title: "@kbn/core-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-mocks'] --- import kbnCoreBaseServerMocksObj from './kbn_core_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_browser_mocks.mdx b/api_docs/kbn_core_capabilities_browser_mocks.mdx index 3f632e9af2981..32d44dac6a443 100644 --- a/api_docs/kbn_core_capabilities_browser_mocks.mdx +++ b/api_docs/kbn_core_capabilities_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-browser-mocks title: "@kbn/core-capabilities-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-browser-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-browser-mocks'] --- import kbnCoreCapabilitiesBrowserMocksObj from './kbn_core_capabilities_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_common.mdx b/api_docs/kbn_core_capabilities_common.mdx index 82a31cd8c3d59..6c6ab08024a3e 100644 --- a/api_docs/kbn_core_capabilities_common.mdx +++ b/api_docs/kbn_core_capabilities_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-common title: "@kbn/core-capabilities-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-common plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-common'] --- import kbnCoreCapabilitiesCommonObj from './kbn_core_capabilities_common.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server.mdx b/api_docs/kbn_core_capabilities_server.mdx index 9681c696f75d7..a8ab1702f37c3 100644 --- a/api_docs/kbn_core_capabilities_server.mdx +++ b/api_docs/kbn_core_capabilities_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server title: "@kbn/core-capabilities-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server'] --- import kbnCoreCapabilitiesServerObj from './kbn_core_capabilities_server.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server_mocks.mdx b/api_docs/kbn_core_capabilities_server_mocks.mdx index 90c628c047a16..f220301915ac2 100644 --- a/api_docs/kbn_core_capabilities_server_mocks.mdx +++ b/api_docs/kbn_core_capabilities_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server-mocks title: "@kbn/core-capabilities-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server-mocks'] --- import kbnCoreCapabilitiesServerMocksObj from './kbn_core_capabilities_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser.mdx b/api_docs/kbn_core_chrome_browser.mdx index 54b20ccb6c093..7e373bcf668c7 100644 --- a/api_docs/kbn_core_chrome_browser.mdx +++ b/api_docs/kbn_core_chrome_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser title: "@kbn/core-chrome-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser'] --- import kbnCoreChromeBrowserObj from './kbn_core_chrome_browser.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser_mocks.mdx b/api_docs/kbn_core_chrome_browser_mocks.mdx index e712893b9e199..e0a6a9f95264f 100644 --- a/api_docs/kbn_core_chrome_browser_mocks.mdx +++ b/api_docs/kbn_core_chrome_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser-mocks title: "@kbn/core-chrome-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser-mocks'] --- import kbnCoreChromeBrowserMocksObj from './kbn_core_chrome_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_config_server_internal.mdx b/api_docs/kbn_core_config_server_internal.mdx index da0a90aa42a0e..70b0e4d528450 100644 --- a/api_docs/kbn_core_config_server_internal.mdx +++ b/api_docs/kbn_core_config_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-config-server-internal title: "@kbn/core-config-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-config-server-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-config-server-internal'] --- import kbnCoreConfigServerInternalObj from './kbn_core_config_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser.mdx b/api_docs/kbn_core_deprecations_browser.mdx index d6f7976d096cb..b7a0a7dcee011 100644 --- a/api_docs/kbn_core_deprecations_browser.mdx +++ b/api_docs/kbn_core_deprecations_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser title: "@kbn/core-deprecations-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser'] --- import kbnCoreDeprecationsBrowserObj from './kbn_core_deprecations_browser.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_internal.mdx b/api_docs/kbn_core_deprecations_browser_internal.mdx index b15047d95b316..6b3e268ce52e3 100644 --- a/api_docs/kbn_core_deprecations_browser_internal.mdx +++ b/api_docs/kbn_core_deprecations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-internal title: "@kbn/core-deprecations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-internal'] --- import kbnCoreDeprecationsBrowserInternalObj from './kbn_core_deprecations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_mocks.mdx b/api_docs/kbn_core_deprecations_browser_mocks.mdx index ce98aede9de8d..765987fff9df6 100644 --- a/api_docs/kbn_core_deprecations_browser_mocks.mdx +++ b/api_docs/kbn_core_deprecations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-mocks title: "@kbn/core-deprecations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-mocks'] --- import kbnCoreDeprecationsBrowserMocksObj from './kbn_core_deprecations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_common.mdx b/api_docs/kbn_core_deprecations_common.mdx index 8fba3dcf30378..1d7e9d7654ea7 100644 --- a/api_docs/kbn_core_deprecations_common.mdx +++ b/api_docs/kbn_core_deprecations_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-common title: "@kbn/core-deprecations-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-common plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-common'] --- import kbnCoreDeprecationsCommonObj from './kbn_core_deprecations_common.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server.mdx b/api_docs/kbn_core_deprecations_server.mdx index 66680ddd13e9b..6cbc2e02d4775 100644 --- a/api_docs/kbn_core_deprecations_server.mdx +++ b/api_docs/kbn_core_deprecations_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server title: "@kbn/core-deprecations-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server'] --- import kbnCoreDeprecationsServerObj from './kbn_core_deprecations_server.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_internal.mdx b/api_docs/kbn_core_deprecations_server_internal.mdx index 40417af58d627..9996bb883bb80 100644 --- a/api_docs/kbn_core_deprecations_server_internal.mdx +++ b/api_docs/kbn_core_deprecations_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-internal title: "@kbn/core-deprecations-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-internal'] --- import kbnCoreDeprecationsServerInternalObj from './kbn_core_deprecations_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_mocks.mdx b/api_docs/kbn_core_deprecations_server_mocks.mdx index 2daae56b94215..5ed0c07414e03 100644 --- a/api_docs/kbn_core_deprecations_server_mocks.mdx +++ b/api_docs/kbn_core_deprecations_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-mocks title: "@kbn/core-deprecations-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-mocks'] --- import kbnCoreDeprecationsServerMocksObj from './kbn_core_deprecations_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser.mdx b/api_docs/kbn_core_doc_links_browser.mdx index a672eb2548961..43278c7b7ca89 100644 --- a/api_docs/kbn_core_doc_links_browser.mdx +++ b/api_docs/kbn_core_doc_links_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser title: "@kbn/core-doc-links-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser'] --- import kbnCoreDocLinksBrowserObj from './kbn_core_doc_links_browser.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser_mocks.mdx b/api_docs/kbn_core_doc_links_browser_mocks.mdx index 6d629cbe44dc9..18239df33fd69 100644 --- a/api_docs/kbn_core_doc_links_browser_mocks.mdx +++ b/api_docs/kbn_core_doc_links_browser_mocks.mdx @@ -8,7 +8,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 description: API docs for the @kbn/core-doc-links-browser-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser-mocks'] --- import kbnCoreDocLinksBrowserMocksObj from './kbn_core_doc_links_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server.mdx b/api_docs/kbn_core_doc_links_server.mdx index fdff8719edc7d..1f18322d93ea3 100644 --- a/api_docs/kbn_core_doc_links_server.mdx +++ b/api_docs/kbn_core_doc_links_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server title: "@kbn/core-doc-links-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server'] --- import kbnCoreDocLinksServerObj from './kbn_core_doc_links_server.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server_mocks.mdx b/api_docs/kbn_core_doc_links_server_mocks.mdx index 70616c059a25b..880687d4fb84c 100644 --- a/api_docs/kbn_core_doc_links_server_mocks.mdx +++ b/api_docs/kbn_core_doc_links_server_mocks.mdx @@ -8,7 +8,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 description: API docs for the @kbn/core-doc-links-server-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server-mocks'] --- import kbnCoreDocLinksServerMocksObj from './kbn_core_doc_links_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx index 9d0ebf7066eca..9e27392844687 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx @@ -8,7 +8,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 description: API docs for the @kbn/core-elasticsearch-client-server-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-internal'] --- import kbnCoreElasticsearchClientServerInternalObj from './kbn_core_elasticsearch_client_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx index 7116e7b9738f6..0349778a9624f 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx @@ -8,7 +8,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 description: API docs for the @kbn/core-elasticsearch-client-server-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-mocks'] --- import kbnCoreElasticsearchClientServerMocksObj from './kbn_core_elasticsearch_client_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server.mdx b/api_docs/kbn_core_elasticsearch_server.mdx index 63ccf3820bf4c..c5ba48e449064 100644 --- a/api_docs/kbn_core_elasticsearch_server.mdx +++ b/api_docs/kbn_core_elasticsearch_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server title: "@kbn/core-elasticsearch-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server'] --- import kbnCoreElasticsearchServerObj from './kbn_core_elasticsearch_server.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_internal.mdx b/api_docs/kbn_core_elasticsearch_server_internal.mdx index 508a1b4c4ab86..854b4ca9df33d 100644 --- a/api_docs/kbn_core_elasticsearch_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-internal title: "@kbn/core-elasticsearch-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-internal'] --- import kbnCoreElasticsearchServerInternalObj from './kbn_core_elasticsearch_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_server_mocks.mdx index 9c8e38de9cf10..aa948229a3772 100644 --- a/api_docs/kbn_core_elasticsearch_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-mocks title: "@kbn/core-elasticsearch-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-mocks'] --- import kbnCoreElasticsearchServerMocksObj from './kbn_core_elasticsearch_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_internal.mdx b/api_docs/kbn_core_environment_server_internal.mdx index ac5a302ee9148..d5a9ad389d443 100644 --- a/api_docs/kbn_core_environment_server_internal.mdx +++ b/api_docs/kbn_core_environment_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-internal title: "@kbn/core-environment-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-internal'] --- import kbnCoreEnvironmentServerInternalObj from './kbn_core_environment_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_mocks.mdx b/api_docs/kbn_core_environment_server_mocks.mdx index 9b564da074b2d..3374380df403e 100644 --- a/api_docs/kbn_core_environment_server_mocks.mdx +++ b/api_docs/kbn_core_environment_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-mocks title: "@kbn/core-environment-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-mocks'] --- import kbnCoreEnvironmentServerMocksObj from './kbn_core_environment_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser.mdx b/api_docs/kbn_core_execution_context_browser.mdx index c6b3136179bee..9c61d865ee026 100644 --- a/api_docs/kbn_core_execution_context_browser.mdx +++ b/api_docs/kbn_core_execution_context_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser title: "@kbn/core-execution-context-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser'] --- import kbnCoreExecutionContextBrowserObj from './kbn_core_execution_context_browser.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_internal.mdx b/api_docs/kbn_core_execution_context_browser_internal.mdx index eb20f1b9f228b..967120174a637 100644 --- a/api_docs/kbn_core_execution_context_browser_internal.mdx +++ b/api_docs/kbn_core_execution_context_browser_internal.mdx @@ -8,7 +8,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 description: API docs for the @kbn/core-execution-context-browser-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-internal'] --- import kbnCoreExecutionContextBrowserInternalObj from './kbn_core_execution_context_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_mocks.mdx b/api_docs/kbn_core_execution_context_browser_mocks.mdx index 1ca7db2408386..81bb892f24b0c 100644 --- a/api_docs/kbn_core_execution_context_browser_mocks.mdx +++ b/api_docs/kbn_core_execution_context_browser_mocks.mdx @@ -8,7 +8,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 description: API docs for the @kbn/core-execution-context-browser-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-mocks'] --- import kbnCoreExecutionContextBrowserMocksObj from './kbn_core_execution_context_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_common.mdx b/api_docs/kbn_core_execution_context_common.mdx index 820813b45f854..9593c1a38d3ab 100644 --- a/api_docs/kbn_core_execution_context_common.mdx +++ b/api_docs/kbn_core_execution_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-common title: "@kbn/core-execution-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-common plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-common'] --- import kbnCoreExecutionContextCommonObj from './kbn_core_execution_context_common.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server.mdx b/api_docs/kbn_core_execution_context_server.mdx index 33bbd483eceed..c2c8aaf2ae941 100644 --- a/api_docs/kbn_core_execution_context_server.mdx +++ b/api_docs/kbn_core_execution_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server title: "@kbn/core-execution-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server'] --- import kbnCoreExecutionContextServerObj from './kbn_core_execution_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_internal.mdx b/api_docs/kbn_core_execution_context_server_internal.mdx index 4724841ac7177..0973a80a1ac3c 100644 --- a/api_docs/kbn_core_execution_context_server_internal.mdx +++ b/api_docs/kbn_core_execution_context_server_internal.mdx @@ -8,7 +8,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 description: API docs for the @kbn/core-execution-context-server-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-internal'] --- import kbnCoreExecutionContextServerInternalObj from './kbn_core_execution_context_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_mocks.mdx b/api_docs/kbn_core_execution_context_server_mocks.mdx index 88d582430efa3..bca1058c89180 100644 --- a/api_docs/kbn_core_execution_context_server_mocks.mdx +++ b/api_docs/kbn_core_execution_context_server_mocks.mdx @@ -8,7 +8,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 description: API docs for the @kbn/core-execution-context-server-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-mocks'] --- import kbnCoreExecutionContextServerMocksObj from './kbn_core_execution_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser.mdx b/api_docs/kbn_core_fatal_errors_browser.mdx index 87ac5ac0c74f1..f57fe29114809 100644 --- a/api_docs/kbn_core_fatal_errors_browser.mdx +++ b/api_docs/kbn_core_fatal_errors_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser title: "@kbn/core-fatal-errors-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser'] --- import kbnCoreFatalErrorsBrowserObj from './kbn_core_fatal_errors_browser.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx index 29a01e65a9278..cb4dd3235816c 100644 --- a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx +++ b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx @@ -8,7 +8,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 description: API docs for the @kbn/core-fatal-errors-browser-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser-mocks'] --- import kbnCoreFatalErrorsBrowserMocksObj from './kbn_core_fatal_errors_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser.mdx b/api_docs/kbn_core_http_browser.mdx index 829b277d86597..bbd0bee3eeb5e 100644 --- a/api_docs/kbn_core_http_browser.mdx +++ b/api_docs/kbn_core_http_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser title: "@kbn/core-http-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser'] --- import kbnCoreHttpBrowserObj from './kbn_core_http_browser.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_internal.mdx b/api_docs/kbn_core_http_browser_internal.mdx index e1da680a9a7bd..4f972b0ea3476 100644 --- a/api_docs/kbn_core_http_browser_internal.mdx +++ b/api_docs/kbn_core_http_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-internal title: "@kbn/core-http-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-internal'] --- import kbnCoreHttpBrowserInternalObj from './kbn_core_http_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_mocks.mdx b/api_docs/kbn_core_http_browser_mocks.mdx index 3be7085694343..1dde9d1d75b98 100644 --- a/api_docs/kbn_core_http_browser_mocks.mdx +++ b/api_docs/kbn_core_http_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-mocks title: "@kbn/core-http-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-mocks'] --- import kbnCoreHttpBrowserMocksObj from './kbn_core_http_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_common.mdx b/api_docs/kbn_core_http_common.mdx index e23f6069c7431..5c4bff524fa1c 100644 --- a/api_docs/kbn_core_http_common.mdx +++ b/api_docs/kbn_core_http_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-common title: "@kbn/core-http-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-common plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-common'] --- import kbnCoreHttpCommonObj from './kbn_core_http_common.devdocs.json'; diff --git a/api_docs/kbn_core_http_context_server_mocks.mdx b/api_docs/kbn_core_http_context_server_mocks.mdx index 8ad1e3f19b501..ac41cfa910a09 100644 --- a/api_docs/kbn_core_http_context_server_mocks.mdx +++ b/api_docs/kbn_core_http_context_server_mocks.mdx @@ -8,7 +8,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 description: API docs for the @kbn/core-http-context-server-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-context-server-mocks'] --- import kbnCoreHttpContextServerMocksObj from './kbn_core_http_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_request_handler_context_server.mdx b/api_docs/kbn_core_http_request_handler_context_server.mdx index 4866ac5bdf71b..d6488070e5687 100644 --- a/api_docs/kbn_core_http_request_handler_context_server.mdx +++ b/api_docs/kbn_core_http_request_handler_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-request-handler-context-server title: "@kbn/core-http-request-handler-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-request-handler-context-server plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-request-handler-context-server'] --- import kbnCoreHttpRequestHandlerContextServerObj from './kbn_core_http_request_handler_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server.mdx b/api_docs/kbn_core_http_resources_server.mdx index 82b754848eba4..8e57e512505b4 100644 --- a/api_docs/kbn_core_http_resources_server.mdx +++ b/api_docs/kbn_core_http_resources_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server title: "@kbn/core-http-resources-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server'] --- import kbnCoreHttpResourcesServerObj from './kbn_core_http_resources_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_internal.mdx b/api_docs/kbn_core_http_resources_server_internal.mdx index bc6fbdf1352e5..eec700f2d050c 100644 --- a/api_docs/kbn_core_http_resources_server_internal.mdx +++ b/api_docs/kbn_core_http_resources_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-internal title: "@kbn/core-http-resources-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-internal'] --- import kbnCoreHttpResourcesServerInternalObj from './kbn_core_http_resources_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_mocks.mdx b/api_docs/kbn_core_http_resources_server_mocks.mdx index 784a7016e1006..9c869932ce3b7 100644 --- a/api_docs/kbn_core_http_resources_server_mocks.mdx +++ b/api_docs/kbn_core_http_resources_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-mocks title: "@kbn/core-http-resources-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-mocks'] --- import kbnCoreHttpResourcesServerMocksObj from './kbn_core_http_resources_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_internal.mdx b/api_docs/kbn_core_http_router_server_internal.mdx index 8c5e760460422..631d43db57e0d 100644 --- a/api_docs/kbn_core_http_router_server_internal.mdx +++ b/api_docs/kbn_core_http_router_server_internal.mdx @@ -8,7 +8,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 description: API docs for the @kbn/core-http-router-server-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-internal'] --- import kbnCoreHttpRouterServerInternalObj from './kbn_core_http_router_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_mocks.mdx b/api_docs/kbn_core_http_router_server_mocks.mdx index 2e82ec4e4349f..30ec8e6f3622f 100644 --- a/api_docs/kbn_core_http_router_server_mocks.mdx +++ b/api_docs/kbn_core_http_router_server_mocks.mdx @@ -8,7 +8,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 description: API docs for the @kbn/core-http-router-server-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-mocks'] --- import kbnCoreHttpRouterServerMocksObj from './kbn_core_http_router_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index 8a5588394688e..a5b0a41aa5fc4 100644 --- a/api_docs/kbn_core_http_server.mdx +++ b/api_docs/kbn_core_http_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server title: "@kbn/core-http-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server'] --- import kbnCoreHttpServerObj from './kbn_core_http_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_internal.mdx b/api_docs/kbn_core_http_server_internal.mdx index bb9343f22f9b0..fa97270c93d0a 100644 --- a/api_docs/kbn_core_http_server_internal.mdx +++ b/api_docs/kbn_core_http_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-internal title: "@kbn/core-http-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-internal'] --- import kbnCoreHttpServerInternalObj from './kbn_core_http_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_mocks.mdx b/api_docs/kbn_core_http_server_mocks.mdx index 0720281186f9f..d380a0e52582a 100644 --- a/api_docs/kbn_core_http_server_mocks.mdx +++ b/api_docs/kbn_core_http_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-mocks title: "@kbn/core-http-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-mocks'] --- import kbnCoreHttpServerMocksObj from './kbn_core_http_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser.mdx b/api_docs/kbn_core_i18n_browser.mdx index e8579476faaaf..10df118877380 100644 --- a/api_docs/kbn_core_i18n_browser.mdx +++ b/api_docs/kbn_core_i18n_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser title: "@kbn/core-i18n-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser'] --- import kbnCoreI18nBrowserObj from './kbn_core_i18n_browser.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser_mocks.mdx b/api_docs/kbn_core_i18n_browser_mocks.mdx index b53db03d7ccf4..b1c77c82bde70 100644 --- a/api_docs/kbn_core_i18n_browser_mocks.mdx +++ b/api_docs/kbn_core_i18n_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser-mocks title: "@kbn/core-i18n-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser-mocks'] --- import kbnCoreI18nBrowserMocksObj from './kbn_core_i18n_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server.mdx b/api_docs/kbn_core_i18n_server.mdx index 4d6c87b0eddf6..ed5e39a85ff2c 100644 --- a/api_docs/kbn_core_i18n_server.mdx +++ b/api_docs/kbn_core_i18n_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server title: "@kbn/core-i18n-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server'] --- import kbnCoreI18nServerObj from './kbn_core_i18n_server.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_internal.mdx b/api_docs/kbn_core_i18n_server_internal.mdx index 55bd0ec411c0a..6c2d701a24c99 100644 --- a/api_docs/kbn_core_i18n_server_internal.mdx +++ b/api_docs/kbn_core_i18n_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-internal title: "@kbn/core-i18n-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-internal'] --- import kbnCoreI18nServerInternalObj from './kbn_core_i18n_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_mocks.mdx b/api_docs/kbn_core_i18n_server_mocks.mdx index 1fe6479068764..bf32e71d8b71d 100644 --- a/api_docs/kbn_core_i18n_server_mocks.mdx +++ b/api_docs/kbn_core_i18n_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-mocks title: "@kbn/core-i18n-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-mocks'] --- import kbnCoreI18nServerMocksObj from './kbn_core_i18n_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_injected_metadata_browser.mdx b/api_docs/kbn_core_injected_metadata_browser.mdx index 2526ec601603c..6f0285dd0ed91 100644 --- a/api_docs/kbn_core_injected_metadata_browser.mdx +++ b/api_docs/kbn_core_injected_metadata_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser title: "@kbn/core-injected-metadata-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-injected-metadata-browser plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-injected-metadata-browser'] --- import kbnCoreInjectedMetadataBrowserObj from './kbn_core_injected_metadata_browser.devdocs.json'; diff --git a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx index 3ec46595d829c..824c4c1a50f36 100644 --- a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx +++ b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx @@ -8,7 +8,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 description: API docs for the @kbn/core-injected-metadata-browser-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-injected-metadata-browser-mocks'] --- import kbnCoreInjectedMetadataBrowserMocksObj from './kbn_core_injected_metadata_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_internal.mdx b/api_docs/kbn_core_integrations_browser_internal.mdx index 65344c0f5c513..2ea717b33f36d 100644 --- a/api_docs/kbn_core_integrations_browser_internal.mdx +++ b/api_docs/kbn_core_integrations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-internal title: "@kbn/core-integrations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-internal'] --- import kbnCoreIntegrationsBrowserInternalObj from './kbn_core_integrations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_mocks.mdx b/api_docs/kbn_core_integrations_browser_mocks.mdx index 594235bd3fb85..05fa3e792a396 100644 --- a/api_docs/kbn_core_integrations_browser_mocks.mdx +++ b/api_docs/kbn_core_integrations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-mocks title: "@kbn/core-integrations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-mocks'] --- import kbnCoreIntegrationsBrowserMocksObj from './kbn_core_integrations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_browser.mdx b/api_docs/kbn_core_lifecycle_browser.mdx index cc69b8a8a8411..dd4b0e512b589 100644 --- a/api_docs/kbn_core_lifecycle_browser.mdx +++ b/api_docs/kbn_core_lifecycle_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser title: "@kbn/core-lifecycle-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser'] --- import kbnCoreLifecycleBrowserObj from './kbn_core_lifecycle_browser.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_browser_mocks.mdx b/api_docs/kbn_core_lifecycle_browser_mocks.mdx index a9b091242da93..54786d1208e6e 100644 --- a/api_docs/kbn_core_lifecycle_browser_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser-mocks title: "@kbn/core-lifecycle-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser-mocks'] --- import kbnCoreLifecycleBrowserMocksObj from './kbn_core_lifecycle_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server.mdx b/api_docs/kbn_core_lifecycle_server.mdx index 17ad7b82b4516..38c0e724a7811 100644 --- a/api_docs/kbn_core_lifecycle_server.mdx +++ b/api_docs/kbn_core_lifecycle_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server title: "@kbn/core-lifecycle-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server'] --- import kbnCoreLifecycleServerObj from './kbn_core_lifecycle_server.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server_mocks.mdx b/api_docs/kbn_core_lifecycle_server_mocks.mdx index a08b7a9305e51..575efec45af99 100644 --- a/api_docs/kbn_core_lifecycle_server_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server-mocks title: "@kbn/core-lifecycle-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server-mocks'] --- import kbnCoreLifecycleServerMocksObj from './kbn_core_lifecycle_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_browser_mocks.mdx b/api_docs/kbn_core_logging_browser_mocks.mdx index 8f8cd5db20806..6b9ea937c933f 100644 --- a/api_docs/kbn_core_logging_browser_mocks.mdx +++ b/api_docs/kbn_core_logging_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-browser-mocks title: "@kbn/core-logging-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-browser-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-browser-mocks'] --- import kbnCoreLoggingBrowserMocksObj from './kbn_core_logging_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_common_internal.mdx b/api_docs/kbn_core_logging_common_internal.mdx index 3f5645cb817aa..d8761cf9c97da 100644 --- a/api_docs/kbn_core_logging_common_internal.mdx +++ b/api_docs/kbn_core_logging_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-common-internal title: "@kbn/core-logging-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-common-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-common-internal'] --- import kbnCoreLoggingCommonInternalObj from './kbn_core_logging_common_internal.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server.mdx b/api_docs/kbn_core_logging_server.mdx index 4be7875c06108..699b3d9a3b7c8 100644 --- a/api_docs/kbn_core_logging_server.mdx +++ b/api_docs/kbn_core_logging_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server title: "@kbn/core-logging-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server'] --- import kbnCoreLoggingServerObj from './kbn_core_logging_server.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_internal.mdx b/api_docs/kbn_core_logging_server_internal.mdx index 10aee9c5394f6..f69fc531c4329 100644 --- a/api_docs/kbn_core_logging_server_internal.mdx +++ b/api_docs/kbn_core_logging_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-internal title: "@kbn/core-logging-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-internal'] --- import kbnCoreLoggingServerInternalObj from './kbn_core_logging_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_mocks.mdx b/api_docs/kbn_core_logging_server_mocks.mdx index 518dc78911f8b..7f25e7f6d793d 100644 --- a/api_docs/kbn_core_logging_server_mocks.mdx +++ b/api_docs/kbn_core_logging_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-mocks title: "@kbn/core-logging-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-mocks'] --- import kbnCoreLoggingServerMocksObj from './kbn_core_logging_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_internal.mdx b/api_docs/kbn_core_metrics_collectors_server_internal.mdx index 0aabd55f4cb1b..f7f6f9bcac763 100644 --- a/api_docs/kbn_core_metrics_collectors_server_internal.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_internal.mdx @@ -8,7 +8,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 description: API docs for the @kbn/core-metrics-collectors-server-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-internal'] --- import kbnCoreMetricsCollectorsServerInternalObj from './kbn_core_metrics_collectors_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx index 72c3dbe7a2346..8b1fbcab43951 100644 --- a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx @@ -8,7 +8,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 description: API docs for the @kbn/core-metrics-collectors-server-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-mocks'] --- import kbnCoreMetricsCollectorsServerMocksObj from './kbn_core_metrics_collectors_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server.mdx b/api_docs/kbn_core_metrics_server.mdx index 644aa2592a231..76d06671c05f5 100644 --- a/api_docs/kbn_core_metrics_server.mdx +++ b/api_docs/kbn_core_metrics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server title: "@kbn/core-metrics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server'] --- import kbnCoreMetricsServerObj from './kbn_core_metrics_server.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_internal.mdx b/api_docs/kbn_core_metrics_server_internal.mdx index 164e01c1c2b1a..5f46a7721f9af 100644 --- a/api_docs/kbn_core_metrics_server_internal.mdx +++ b/api_docs/kbn_core_metrics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-internal title: "@kbn/core-metrics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-internal'] --- import kbnCoreMetricsServerInternalObj from './kbn_core_metrics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_mocks.mdx b/api_docs/kbn_core_metrics_server_mocks.mdx index 03608e1983a91..6378434939a9b 100644 --- a/api_docs/kbn_core_metrics_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-mocks title: "@kbn/core-metrics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-mocks'] --- import kbnCoreMetricsServerMocksObj from './kbn_core_metrics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_mount_utils_browser.mdx b/api_docs/kbn_core_mount_utils_browser.mdx index 13a055fa3820a..06476a13aa4ee 100644 --- a/api_docs/kbn_core_mount_utils_browser.mdx +++ b/api_docs/kbn_core_mount_utils_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-mount-utils-browser title: "@kbn/core-mount-utils-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-mount-utils-browser plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-mount-utils-browser'] --- import kbnCoreMountUtilsBrowserObj from './kbn_core_mount_utils_browser.devdocs.json'; diff --git a/api_docs/kbn_core_node_server.mdx b/api_docs/kbn_core_node_server.mdx index 16094018ee247..dd2ff041cae71 100644 --- a/api_docs/kbn_core_node_server.mdx +++ b/api_docs/kbn_core_node_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server title: "@kbn/core-node-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server'] --- import kbnCoreNodeServerObj from './kbn_core_node_server.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_internal.mdx b/api_docs/kbn_core_node_server_internal.mdx index 03d9976e4dcde..06af146b5b3ba 100644 --- a/api_docs/kbn_core_node_server_internal.mdx +++ b/api_docs/kbn_core_node_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-internal title: "@kbn/core-node-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-internal'] --- import kbnCoreNodeServerInternalObj from './kbn_core_node_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_mocks.mdx b/api_docs/kbn_core_node_server_mocks.mdx index c262b6a0323ac..f80e8c7b2a5fe 100644 --- a/api_docs/kbn_core_node_server_mocks.mdx +++ b/api_docs/kbn_core_node_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-mocks title: "@kbn/core-node-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-mocks'] --- import kbnCoreNodeServerMocksObj from './kbn_core_node_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser.mdx b/api_docs/kbn_core_notifications_browser.mdx index 48e707e33715b..2f8ef75f30151 100644 --- a/api_docs/kbn_core_notifications_browser.mdx +++ b/api_docs/kbn_core_notifications_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser title: "@kbn/core-notifications-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser'] --- import kbnCoreNotificationsBrowserObj from './kbn_core_notifications_browser.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_internal.mdx b/api_docs/kbn_core_notifications_browser_internal.mdx index ea09b59d9328c..db6710eed8e08 100644 --- a/api_docs/kbn_core_notifications_browser_internal.mdx +++ b/api_docs/kbn_core_notifications_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-internal title: "@kbn/core-notifications-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-internal'] --- import kbnCoreNotificationsBrowserInternalObj from './kbn_core_notifications_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_mocks.mdx b/api_docs/kbn_core_notifications_browser_mocks.mdx index 57607e2e5e876..5d3ea88c678d7 100644 --- a/api_docs/kbn_core_notifications_browser_mocks.mdx +++ b/api_docs/kbn_core_notifications_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-mocks title: "@kbn/core-notifications-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-mocks'] --- import kbnCoreNotificationsBrowserMocksObj from './kbn_core_notifications_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser.mdx b/api_docs/kbn_core_overlays_browser.mdx index e00ac362fc463..61afd86f1561c 100644 --- a/api_docs/kbn_core_overlays_browser.mdx +++ b/api_docs/kbn_core_overlays_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser title: "@kbn/core-overlays-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser'] --- import kbnCoreOverlaysBrowserObj from './kbn_core_overlays_browser.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_internal.mdx b/api_docs/kbn_core_overlays_browser_internal.mdx index c3e49594faede..d2dcee6ef231c 100644 --- a/api_docs/kbn_core_overlays_browser_internal.mdx +++ b/api_docs/kbn_core_overlays_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-internal title: "@kbn/core-overlays-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-internal'] --- import kbnCoreOverlaysBrowserInternalObj from './kbn_core_overlays_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_mocks.mdx b/api_docs/kbn_core_overlays_browser_mocks.mdx index 3805e037a2e22..46e17855135da 100644 --- a/api_docs/kbn_core_overlays_browser_mocks.mdx +++ b/api_docs/kbn_core_overlays_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-mocks title: "@kbn/core-overlays-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-mocks'] --- import kbnCoreOverlaysBrowserMocksObj from './kbn_core_overlays_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_browser.mdx b/api_docs/kbn_core_plugins_browser.mdx index a036bfcfc3903..2920b593bf393 100644 --- a/api_docs/kbn_core_plugins_browser.mdx +++ b/api_docs/kbn_core_plugins_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser title: "@kbn/core-plugins-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser'] --- import kbnCorePluginsBrowserObj from './kbn_core_plugins_browser.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_browser_mocks.mdx b/api_docs/kbn_core_plugins_browser_mocks.mdx index 7e127b67d22ac..41a3888df50fb 100644 --- a/api_docs/kbn_core_plugins_browser_mocks.mdx +++ b/api_docs/kbn_core_plugins_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser-mocks title: "@kbn/core-plugins-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser-mocks'] --- import kbnCorePluginsBrowserMocksObj from './kbn_core_plugins_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server.mdx b/api_docs/kbn_core_plugins_server.mdx index 1b9b11c0e29a2..29ecf947396ac 100644 --- a/api_docs/kbn_core_plugins_server.mdx +++ b/api_docs/kbn_core_plugins_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server title: "@kbn/core-plugins-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server'] --- import kbnCorePluginsServerObj from './kbn_core_plugins_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server_mocks.mdx b/api_docs/kbn_core_plugins_server_mocks.mdx index 30e7665c9b577..8049b1c1e7154 100644 --- a/api_docs/kbn_core_plugins_server_mocks.mdx +++ b/api_docs/kbn_core_plugins_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server-mocks title: "@kbn/core-plugins-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server-mocks'] --- import kbnCorePluginsServerMocksObj from './kbn_core_plugins_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server.mdx b/api_docs/kbn_core_preboot_server.mdx index 0fce0f34ebe91..8d79ce7f71f6d 100644 --- a/api_docs/kbn_core_preboot_server.mdx +++ b/api_docs/kbn_core_preboot_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server title: "@kbn/core-preboot-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server'] --- import kbnCorePrebootServerObj from './kbn_core_preboot_server.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server_mocks.mdx b/api_docs/kbn_core_preboot_server_mocks.mdx index 8b51e5394ef54..abd76f553d142 100644 --- a/api_docs/kbn_core_preboot_server_mocks.mdx +++ b/api_docs/kbn_core_preboot_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server-mocks title: "@kbn/core-preboot-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server-mocks'] --- import kbnCorePrebootServerMocksObj from './kbn_core_preboot_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_browser_mocks.mdx b/api_docs/kbn_core_rendering_browser_mocks.mdx index 34eb00126b958..510c64c860545 100644 --- a/api_docs/kbn_core_rendering_browser_mocks.mdx +++ b/api_docs/kbn_core_rendering_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-browser-mocks title: "@kbn/core-rendering-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-browser-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-browser-mocks'] --- import kbnCoreRenderingBrowserMocksObj from './kbn_core_rendering_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_internal.mdx b/api_docs/kbn_core_rendering_server_internal.mdx index 263e166a00db7..8b764148fd519 100644 --- a/api_docs/kbn_core_rendering_server_internal.mdx +++ b/api_docs/kbn_core_rendering_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-internal title: "@kbn/core-rendering-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-internal'] --- import kbnCoreRenderingServerInternalObj from './kbn_core_rendering_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_mocks.mdx b/api_docs/kbn_core_rendering_server_mocks.mdx index 5e1fe20c15893..4fae13fd746e2 100644 --- a/api_docs/kbn_core_rendering_server_mocks.mdx +++ b/api_docs/kbn_core_rendering_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-mocks title: "@kbn/core-rendering-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-mocks'] --- import kbnCoreRenderingServerMocksObj from './kbn_core_rendering_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_root_server_internal.mdx b/api_docs/kbn_core_root_server_internal.mdx index e8c0cbc3e7ade..db52b25c6d024 100644 --- a/api_docs/kbn_core_root_server_internal.mdx +++ b/api_docs/kbn_core_root_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-root-server-internal title: "@kbn/core-root-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-root-server-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-root-server-internal'] --- import kbnCoreRootServerInternalObj from './kbn_core_root_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_browser.mdx b/api_docs/kbn_core_saved_objects_api_browser.mdx index 84c63c84878f0..76b6b2445ebfe 100644 --- a/api_docs/kbn_core_saved_objects_api_browser.mdx +++ b/api_docs/kbn_core_saved_objects_api_browser.mdx @@ -8,7 +8,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 description: API docs for the @kbn/core-saved-objects-api-browser plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-browser'] --- import kbnCoreSavedObjectsApiBrowserObj from './kbn_core_saved_objects_api_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server.mdx b/api_docs/kbn_core_saved_objects_api_server.mdx index 1b93e5427a613..c7c5112f4d489 100644 --- a/api_docs/kbn_core_saved_objects_api_server.mdx +++ b/api_docs/kbn_core_saved_objects_api_server.mdx @@ -8,7 +8,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 description: API docs for the @kbn/core-saved-objects-api-server plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server'] --- import kbnCoreSavedObjectsApiServerObj from './kbn_core_saved_objects_api_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server_internal.mdx b/api_docs/kbn_core_saved_objects_api_server_internal.mdx index bf85aefe2a97b..1cd7fb96f8935 100644 --- a/api_docs/kbn_core_saved_objects_api_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_api_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server-internal title: "@kbn/core-saved-objects-api-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server-internal'] --- import kbnCoreSavedObjectsApiServerInternalObj from './kbn_core_saved_objects_api_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx index 8da1bb14cdefb..f38ab518e7390 100644 --- a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server-mocks title: "@kbn/core-saved-objects-api-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server-mocks'] --- import kbnCoreSavedObjectsApiServerMocksObj from './kbn_core_saved_objects_api_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_internal.mdx b/api_docs/kbn_core_saved_objects_base_server_internal.mdx index fd896c9cb4773..6f3901f029b69 100644 --- a/api_docs/kbn_core_saved_objects_base_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-internal title: "@kbn/core-saved-objects-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-internal'] --- import kbnCoreSavedObjectsBaseServerInternalObj from './kbn_core_saved_objects_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx index 39e9f0b3ba4b3..d704ca5ab292d 100644 --- a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-mocks title: "@kbn/core-saved-objects-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-mocks'] --- import kbnCoreSavedObjectsBaseServerMocksObj from './kbn_core_saved_objects_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser.mdx b/api_docs/kbn_core_saved_objects_browser.mdx index 6bfd1dbd35118..37751917a53dc 100644 --- a/api_docs/kbn_core_saved_objects_browser.mdx +++ b/api_docs/kbn_core_saved_objects_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser title: "@kbn/core-saved-objects-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser'] --- import kbnCoreSavedObjectsBrowserObj from './kbn_core_saved_objects_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_internal.mdx b/api_docs/kbn_core_saved_objects_browser_internal.mdx index 60c33e1340a51..e67a14b2ce163 100644 --- a/api_docs/kbn_core_saved_objects_browser_internal.mdx +++ b/api_docs/kbn_core_saved_objects_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-internal title: "@kbn/core-saved-objects-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-internal'] --- import kbnCoreSavedObjectsBrowserInternalObj from './kbn_core_saved_objects_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_mocks.mdx b/api_docs/kbn_core_saved_objects_browser_mocks.mdx index bb8651a12546b..1a71835e5834d 100644 --- a/api_docs/kbn_core_saved_objects_browser_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-mocks title: "@kbn/core-saved-objects-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-mocks'] --- import kbnCoreSavedObjectsBrowserMocksObj from './kbn_core_saved_objects_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_common.mdx b/api_docs/kbn_core_saved_objects_common.mdx index 8aec13f7f4890..6d95de1859cff 100644 --- a/api_docs/kbn_core_saved_objects_common.mdx +++ b/api_docs/kbn_core_saved_objects_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-common title: "@kbn/core-saved-objects-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-common plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-common'] --- import kbnCoreSavedObjectsCommonObj from './kbn_core_saved_objects_common.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx index 51b428e1b495f..8186326042058 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-internal title: "@kbn/core-saved-objects-import-export-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-internal'] --- import kbnCoreSavedObjectsImportExportServerInternalObj from './kbn_core_saved_objects_import_export_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx index cee9c70e8efcd..e77572381e4b3 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-mocks title: "@kbn/core-saved-objects-import-export-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-mocks'] --- import kbnCoreSavedObjectsImportExportServerMocksObj from './kbn_core_saved_objects_import_export_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx index 6c54ea59468b8..4904efeaa1d45 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-internal title: "@kbn/core-saved-objects-migration-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-internal'] --- import kbnCoreSavedObjectsMigrationServerInternalObj from './kbn_core_saved_objects_migration_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx index c1f44588ff352..61084a3d5b10a 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-mocks title: "@kbn/core-saved-objects-migration-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-mocks'] --- import kbnCoreSavedObjectsMigrationServerMocksObj from './kbn_core_saved_objects_migration_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server.mdx b/api_docs/kbn_core_saved_objects_server.mdx index 5d1b42df92587..88f3d02fc1117 100644 --- a/api_docs/kbn_core_saved_objects_server.mdx +++ b/api_docs/kbn_core_saved_objects_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server title: "@kbn/core-saved-objects-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server'] --- import kbnCoreSavedObjectsServerObj from './kbn_core_saved_objects_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_internal.mdx b/api_docs/kbn_core_saved_objects_server_internal.mdx index 56a384b0e4cf2..3bca024ffc53d 100644 --- a/api_docs/kbn_core_saved_objects_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-internal title: "@kbn/core-saved-objects-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-internal'] --- import kbnCoreSavedObjectsServerInternalObj from './kbn_core_saved_objects_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_mocks.mdx b/api_docs/kbn_core_saved_objects_server_mocks.mdx index 351477412d8d3..c8482cd5d4e55 100644 --- a/api_docs/kbn_core_saved_objects_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-mocks title: "@kbn/core-saved-objects-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-mocks'] --- import kbnCoreSavedObjectsServerMocksObj from './kbn_core_saved_objects_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_utils_server.mdx b/api_docs/kbn_core_saved_objects_utils_server.mdx index d5800ddeb310d..ba2835eb31eed 100644 --- a/api_docs/kbn_core_saved_objects_utils_server.mdx +++ b/api_docs/kbn_core_saved_objects_utils_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-utils-server title: "@kbn/core-saved-objects-utils-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-utils-server plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-utils-server'] --- import kbnCoreSavedObjectsUtilsServerObj from './kbn_core_saved_objects_utils_server.devdocs.json'; diff --git a/api_docs/kbn_core_status_common.mdx b/api_docs/kbn_core_status_common.mdx index 9eb7ca2690e88..4adae9d945e08 100644 --- a/api_docs/kbn_core_status_common.mdx +++ b/api_docs/kbn_core_status_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common title: "@kbn/core-status-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common'] --- import kbnCoreStatusCommonObj from './kbn_core_status_common.devdocs.json'; diff --git a/api_docs/kbn_core_status_common_internal.mdx b/api_docs/kbn_core_status_common_internal.mdx index eff5be5a378d1..ca3f00ce6fd86 100644 --- a/api_docs/kbn_core_status_common_internal.mdx +++ b/api_docs/kbn_core_status_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common-internal title: "@kbn/core-status-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common-internal'] --- import kbnCoreStatusCommonInternalObj from './kbn_core_status_common_internal.devdocs.json'; diff --git a/api_docs/kbn_core_status_server.mdx b/api_docs/kbn_core_status_server.mdx index 5005cf0a76aad..9e26bad80dbdc 100644 --- a/api_docs/kbn_core_status_server.mdx +++ b/api_docs/kbn_core_status_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server title: "@kbn/core-status-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server'] --- import kbnCoreStatusServerObj from './kbn_core_status_server.devdocs.json'; diff --git a/api_docs/kbn_core_status_server_internal.mdx b/api_docs/kbn_core_status_server_internal.mdx index 1bdefb158e36e..ffd1b425bc584 100644 --- a/api_docs/kbn_core_status_server_internal.mdx +++ b/api_docs/kbn_core_status_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-internal title: "@kbn/core-status-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-internal'] --- import kbnCoreStatusServerInternalObj from './kbn_core_status_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_status_server_mocks.mdx b/api_docs/kbn_core_status_server_mocks.mdx index c971bcf92c55f..869a3076525a4 100644 --- a/api_docs/kbn_core_status_server_mocks.mdx +++ b/api_docs/kbn_core_status_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-mocks title: "@kbn/core-status-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-mocks'] --- import kbnCoreStatusServerMocksObj from './kbn_core_status_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx index 70f106f832dac..11b8080c619ca 100644 --- a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx +++ b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-deprecations-getters title: "@kbn/core-test-helpers-deprecations-getters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-deprecations-getters plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-deprecations-getters'] --- import kbnCoreTestHelpersDeprecationsGettersObj from './kbn_core_test_helpers_deprecations_getters.devdocs.json'; 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 1d6c870e4978d..975404f425d12 100644 --- a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx +++ b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx @@ -8,7 +8,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 description: API docs for the @kbn/core-test-helpers-http-setup-browser plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-http-setup-browser'] --- import kbnCoreTestHelpersHttpSetupBrowserObj from './kbn_core_test_helpers_http_setup_browser.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_kbn_server.mdx b/api_docs/kbn_core_test_helpers_kbn_server.mdx index 59b0f94beee9b..9872475b4bacc 100644 --- a/api_docs/kbn_core_test_helpers_kbn_server.mdx +++ b/api_docs/kbn_core_test_helpers_kbn_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-kbn-server title: "@kbn/core-test-helpers-kbn-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-kbn-server plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-kbn-server'] --- import kbnCoreTestHelpersKbnServerObj from './kbn_core_test_helpers_kbn_server.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx index 9be5c7fa89e43..a369fb1c977f3 100644 --- a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx +++ b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-so-type-serializer title: "@kbn/core-test-helpers-so-type-serializer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-so-type-serializer plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-so-type-serializer'] --- import kbnCoreTestHelpersSoTypeSerializerObj from './kbn_core_test_helpers_so_type_serializer.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_test_utils.mdx b/api_docs/kbn_core_test_helpers_test_utils.mdx index 6a4a0d1e00efb..31a9a9f06142b 100644 --- a/api_docs/kbn_core_test_helpers_test_utils.mdx +++ b/api_docs/kbn_core_test_helpers_test_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-test-utils title: "@kbn/core-test-helpers-test-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-test-utils plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-test-utils'] --- import kbnCoreTestHelpersTestUtilsObj from './kbn_core_test_helpers_test_utils.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser.mdx b/api_docs/kbn_core_theme_browser.mdx index c4a213bf7fa7a..309b3922cb29f 100644 --- a/api_docs/kbn_core_theme_browser.mdx +++ b/api_docs/kbn_core_theme_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser title: "@kbn/core-theme-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser'] --- import kbnCoreThemeBrowserObj from './kbn_core_theme_browser.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser_internal.mdx b/api_docs/kbn_core_theme_browser_internal.mdx index 049201e6c6e22..c2de9505246a0 100644 --- a/api_docs/kbn_core_theme_browser_internal.mdx +++ b/api_docs/kbn_core_theme_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-internal title: "@kbn/core-theme-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-internal'] --- import kbnCoreThemeBrowserInternalObj from './kbn_core_theme_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser_mocks.mdx b/api_docs/kbn_core_theme_browser_mocks.mdx index 6275c6086f97e..68d378cce40be 100644 --- a/api_docs/kbn_core_theme_browser_mocks.mdx +++ b/api_docs/kbn_core_theme_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-mocks title: "@kbn/core-theme-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-mocks'] --- import kbnCoreThemeBrowserMocksObj from './kbn_core_theme_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser.mdx b/api_docs/kbn_core_ui_settings_browser.mdx index a68501e279179..558f71a2a7e37 100644 --- a/api_docs/kbn_core_ui_settings_browser.mdx +++ b/api_docs/kbn_core_ui_settings_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser title: "@kbn/core-ui-settings-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser'] --- import kbnCoreUiSettingsBrowserObj from './kbn_core_ui_settings_browser.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_internal.mdx b/api_docs/kbn_core_ui_settings_browser_internal.mdx index 896f0d573d68f..eeb03f90a7de5 100644 --- a/api_docs/kbn_core_ui_settings_browser_internal.mdx +++ b/api_docs/kbn_core_ui_settings_browser_internal.mdx @@ -8,7 +8,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 description: API docs for the @kbn/core-ui-settings-browser-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-internal'] --- import kbnCoreUiSettingsBrowserInternalObj from './kbn_core_ui_settings_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_mocks.mdx b/api_docs/kbn_core_ui_settings_browser_mocks.mdx index 3bf3aeccc3e75..11effd87a30e1 100644 --- a/api_docs/kbn_core_ui_settings_browser_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_browser_mocks.mdx @@ -8,7 +8,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 description: API docs for the @kbn/core-ui-settings-browser-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-mocks'] --- import kbnCoreUiSettingsBrowserMocksObj from './kbn_core_ui_settings_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_common.mdx b/api_docs/kbn_core_ui_settings_common.mdx index 21ec2fc774a65..c255cd2b9d353 100644 --- a/api_docs/kbn_core_ui_settings_common.mdx +++ b/api_docs/kbn_core_ui_settings_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-common title: "@kbn/core-ui-settings-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-common plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-common'] --- import kbnCoreUiSettingsCommonObj from './kbn_core_ui_settings_common.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server.mdx b/api_docs/kbn_core_ui_settings_server.mdx index 11523bf8d9903..0a2a42aa08eb9 100644 --- a/api_docs/kbn_core_ui_settings_server.mdx +++ b/api_docs/kbn_core_ui_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server title: "@kbn/core-ui-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server'] --- import kbnCoreUiSettingsServerObj from './kbn_core_ui_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server_internal.mdx b/api_docs/kbn_core_ui_settings_server_internal.mdx index a6a70fb8c1b4e..490f802e9b361 100644 --- a/api_docs/kbn_core_ui_settings_server_internal.mdx +++ b/api_docs/kbn_core_ui_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-internal title: "@kbn/core-ui-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-internal'] --- import kbnCoreUiSettingsServerInternalObj from './kbn_core_ui_settings_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server_mocks.mdx b/api_docs/kbn_core_ui_settings_server_mocks.mdx index 455dd00bb5da8..31b55050a05a3 100644 --- a/api_docs/kbn_core_ui_settings_server_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-mocks title: "@kbn/core-ui-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-mocks'] --- import kbnCoreUiSettingsServerMocksObj from './kbn_core_ui_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server.mdx b/api_docs/kbn_core_usage_data_server.mdx index ce0192fa325d0..ce6cbb6e40915 100644 --- a/api_docs/kbn_core_usage_data_server.mdx +++ b/api_docs/kbn_core_usage_data_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server title: "@kbn/core-usage-data-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server'] --- import kbnCoreUsageDataServerObj from './kbn_core_usage_data_server.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server_internal.mdx b/api_docs/kbn_core_usage_data_server_internal.mdx index 436b930d53746..f654ddef1c85c 100644 --- a/api_docs/kbn_core_usage_data_server_internal.mdx +++ b/api_docs/kbn_core_usage_data_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-internal title: "@kbn/core-usage-data-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-internal plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-internal'] --- import kbnCoreUsageDataServerInternalObj from './kbn_core_usage_data_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server_mocks.mdx b/api_docs/kbn_core_usage_data_server_mocks.mdx index a4c593dc82755..2ef2d3b5c4142 100644 --- a/api_docs/kbn_core_usage_data_server_mocks.mdx +++ b/api_docs/kbn_core_usage_data_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-mocks title: "@kbn/core-usage-data-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-mocks'] --- import kbnCoreUsageDataServerMocksObj from './kbn_core_usage_data_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_crypto.mdx b/api_docs/kbn_crypto.mdx index 33fd29b3e3158..83b15f674b297 100644 --- a/api_docs/kbn_crypto.mdx +++ b/api_docs/kbn_crypto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto title: "@kbn/crypto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto'] --- import kbnCryptoObj from './kbn_crypto.devdocs.json'; diff --git a/api_docs/kbn_crypto_browser.mdx b/api_docs/kbn_crypto_browser.mdx index ebbf4a4e02cf9..8fd0d818a87d5 100644 --- a/api_docs/kbn_crypto_browser.mdx +++ b/api_docs/kbn_crypto_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto-browser title: "@kbn/crypto-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto-browser plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index 74f38821eebaf..914931f122f8a 100644 --- a/api_docs/kbn_datemath.mdx +++ b/api_docs/kbn_datemath.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-datemath title: "@kbn/datemath" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/datemath plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] --- import kbnDatemathObj from './kbn_datemath.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index 0ebaf7db4a61e..a0a8c9a14b47e 100644 --- a/api_docs/kbn_dev_cli_errors.mdx +++ b/api_docs/kbn_dev_cli_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-errors title: "@kbn/dev-cli-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-errors plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-errors'] --- import kbnDevCliErrorsObj from './kbn_dev_cli_errors.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_runner.mdx b/api_docs/kbn_dev_cli_runner.mdx index e1b3f2140a26a..70ecf5f716a0b 100644 --- a/api_docs/kbn_dev_cli_runner.mdx +++ b/api_docs/kbn_dev_cli_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-runner title: "@kbn/dev-cli-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-runner plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-runner'] --- import kbnDevCliRunnerObj from './kbn_dev_cli_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_proc_runner.mdx b/api_docs/kbn_dev_proc_runner.mdx index 158cc55984acc..7691e11d62df2 100644 --- a/api_docs/kbn_dev_proc_runner.mdx +++ b/api_docs/kbn_dev_proc_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-proc-runner title: "@kbn/dev-proc-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-proc-runner plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-proc-runner'] --- import kbnDevProcRunnerObj from './kbn_dev_proc_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_utils.mdx b/api_docs/kbn_dev_utils.mdx index 785965b6fc064..b957bf4562b38 100644 --- a/api_docs/kbn_dev_utils.mdx +++ b/api_docs/kbn_dev_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-utils title: "@kbn/dev-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-utils plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index 101b4d4173f95..933e1c7683651 100644 --- a/api_docs/kbn_doc_links.mdx +++ b/api_docs/kbn_doc_links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-doc-links title: "@kbn/doc-links" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/doc-links plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/doc-links'] --- import kbnDocLinksObj from './kbn_doc_links.devdocs.json'; diff --git a/api_docs/kbn_docs_utils.mdx b/api_docs/kbn_docs_utils.mdx index f36fe93237768..6b80932d8f745 100644 --- a/api_docs/kbn_docs_utils.mdx +++ b/api_docs/kbn_docs_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-docs-utils title: "@kbn/docs-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/docs-utils plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/docs-utils'] --- import kbnDocsUtilsObj from './kbn_docs_utils.devdocs.json'; diff --git a/api_docs/kbn_ebt_tools.mdx b/api_docs/kbn_ebt_tools.mdx index 017d29d7565fe..62058ae9e61f9 100644 --- a/api_docs/kbn_ebt_tools.mdx +++ b/api_docs/kbn_ebt_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ebt-tools title: "@kbn/ebt-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ebt-tools plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt-tools'] --- import kbnEbtToolsObj from './kbn_ebt_tools.devdocs.json'; diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index e58aef6107aa2..382548cb1580b 100644 --- a/api_docs/kbn_es.mdx +++ b/api_docs/kbn_es.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es title: "@kbn/es" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es'] --- import kbnEsObj from './kbn_es.devdocs.json'; diff --git a/api_docs/kbn_es_archiver.mdx b/api_docs/kbn_es_archiver.mdx index 3fb898af289d0..e2d345f0ff884 100644 --- a/api_docs/kbn_es_archiver.mdx +++ b/api_docs/kbn_es_archiver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-archiver title: "@kbn/es-archiver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-archiver plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-archiver'] --- import kbnEsArchiverObj from './kbn_es_archiver.devdocs.json'; diff --git a/api_docs/kbn_es_errors.mdx b/api_docs/kbn_es_errors.mdx index efb4c03d1a8e2..c6bbd32463c25 100644 --- a/api_docs/kbn_es_errors.mdx +++ b/api_docs/kbn_es_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-errors title: "@kbn/es-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-errors plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-errors'] --- import kbnEsErrorsObj from './kbn_es_errors.devdocs.json'; diff --git a/api_docs/kbn_es_query.mdx b/api_docs/kbn_es_query.mdx index 40048490ce6fd..25052f72e48ab 100644 --- a/api_docs/kbn_es_query.mdx +++ b/api_docs/kbn_es_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-query title: "@kbn/es-query" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-query plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-query'] --- import kbnEsQueryObj from './kbn_es_query.devdocs.json'; diff --git a/api_docs/kbn_es_types.mdx b/api_docs/kbn_es_types.mdx index 213429ff7dc31..0b45cae895879 100644 --- a/api_docs/kbn_es_types.mdx +++ b/api_docs/kbn_es_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-types title: "@kbn/es-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-types plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-types'] --- import kbnEsTypesObj from './kbn_es_types.devdocs.json'; diff --git a/api_docs/kbn_eslint_plugin_imports.mdx b/api_docs/kbn_eslint_plugin_imports.mdx index 55b92cd4be9ca..368fab2443260 100644 --- a/api_docs/kbn_eslint_plugin_imports.mdx +++ b/api_docs/kbn_eslint_plugin_imports.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-eslint-plugin-imports title: "@kbn/eslint-plugin-imports" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/eslint-plugin-imports plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] --- import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json'; diff --git a/api_docs/kbn_field_types.mdx b/api_docs/kbn_field_types.mdx index 35d726d8cfa8e..3e45b7ac457cb 100644 --- a/api_docs/kbn_field_types.mdx +++ b/api_docs/kbn_field_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-types title: "@kbn/field-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-types plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] --- import kbnFieldTypesObj from './kbn_field_types.devdocs.json'; diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx index c13cd321fdc92..b77f7b1312133 100644 --- a/api_docs/kbn_find_used_node_modules.mdx +++ b/api_docs/kbn_find_used_node_modules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-find-used-node-modules title: "@kbn/find-used-node-modules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/find-used-node-modules plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/find-used-node-modules'] --- import kbnFindUsedNodeModulesObj from './kbn_find_used_node_modules.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_services.mdx b/api_docs/kbn_ftr_common_functional_services.mdx index ccb33916ecb86..cd3ef860aee84 100644 --- a/api_docs/kbn_ftr_common_functional_services.mdx +++ b/api_docs/kbn_ftr_common_functional_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-services title: "@kbn/ftr-common-functional-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-services plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-services'] --- import kbnFtrCommonFunctionalServicesObj from './kbn_ftr_common_functional_services.devdocs.json'; diff --git a/api_docs/kbn_generate.mdx b/api_docs/kbn_generate.mdx index 20886184070f2..3f6d3048cf57b 100644 --- a/api_docs/kbn_generate.mdx +++ b/api_docs/kbn_generate.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate title: "@kbn/generate" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate'] --- import kbnGenerateObj from './kbn_generate.devdocs.json'; diff --git a/api_docs/kbn_get_repo_files.mdx b/api_docs/kbn_get_repo_files.mdx index 7d7e97c2b6e27..565e76d011bf7 100644 --- a/api_docs/kbn_get_repo_files.mdx +++ b/api_docs/kbn_get_repo_files.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-get-repo-files title: "@kbn/get-repo-files" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/get-repo-files plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/get-repo-files'] --- import kbnGetRepoFilesObj from './kbn_get_repo_files.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index 2ed5ce6c97aaf..92f2593eba552 100644 --- a/api_docs/kbn_guided_onboarding.mdx +++ b/api_docs/kbn_guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-guided-onboarding title: "@kbn/guided-onboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/guided-onboarding plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/guided-onboarding'] --- import kbnGuidedOnboardingObj from './kbn_guided_onboarding.devdocs.json'; diff --git a/api_docs/kbn_handlebars.mdx b/api_docs/kbn_handlebars.mdx index 8c7f66ab6bf5b..3bba85a7ace08 100644 --- a/api_docs/kbn_handlebars.mdx +++ b/api_docs/kbn_handlebars.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-handlebars title: "@kbn/handlebars" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/handlebars plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/handlebars'] --- import kbnHandlebarsObj from './kbn_handlebars.devdocs.json'; diff --git a/api_docs/kbn_hapi_mocks.mdx b/api_docs/kbn_hapi_mocks.mdx index cfb9eb2dfe3c9..5a2089a2be9bf 100644 --- a/api_docs/kbn_hapi_mocks.mdx +++ b/api_docs/kbn_hapi_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-hapi-mocks title: "@kbn/hapi-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/hapi-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/hapi-mocks'] --- import kbnHapiMocksObj from './kbn_hapi_mocks.devdocs.json'; diff --git a/api_docs/kbn_health_gateway_server.mdx b/api_docs/kbn_health_gateway_server.mdx index e766dc5ad88b4..6426daf1af72f 100644 --- a/api_docs/kbn_health_gateway_server.mdx +++ b/api_docs/kbn_health_gateway_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-health-gateway-server title: "@kbn/health-gateway-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/health-gateway-server plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/health-gateway-server'] --- import kbnHealthGatewayServerObj from './kbn_health_gateway_server.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_card.mdx b/api_docs/kbn_home_sample_data_card.mdx index 835ad2ba8b768..9eacf842b3344 100644 --- a/api_docs/kbn_home_sample_data_card.mdx +++ b/api_docs/kbn_home_sample_data_card.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-card title: "@kbn/home-sample-data-card" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-card plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-card'] --- import kbnHomeSampleDataCardObj from './kbn_home_sample_data_card.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_tab.mdx b/api_docs/kbn_home_sample_data_tab.mdx index 74085300f59ba..792b8bf939bc5 100644 --- a/api_docs/kbn_home_sample_data_tab.mdx +++ b/api_docs/kbn_home_sample_data_tab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-tab title: "@kbn/home-sample-data-tab" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-tab plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-tab'] --- import kbnHomeSampleDataTabObj from './kbn_home_sample_data_tab.devdocs.json'; diff --git a/api_docs/kbn_i18n.mdx b/api_docs/kbn_i18n.mdx index 75bafcd61e726..2a762054bc242 100644 --- a/api_docs/kbn_i18n.mdx +++ b/api_docs/kbn_i18n.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n title: "@kbn/i18n" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n'] --- import kbnI18nObj from './kbn_i18n.devdocs.json'; diff --git a/api_docs/kbn_i18n_react.mdx b/api_docs/kbn_i18n_react.mdx index 784182a13d3c1..4f442ced451c8 100644 --- a/api_docs/kbn_i18n_react.mdx +++ b/api_docs/kbn_i18n_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n-react title: "@kbn/i18n-react" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n-react plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n-react'] --- import kbnI18nReactObj from './kbn_i18n_react.devdocs.json'; diff --git a/api_docs/kbn_import_resolver.mdx b/api_docs/kbn_import_resolver.mdx index d6a3b9d50d94d..05efbdab454f3 100644 --- a/api_docs/kbn_import_resolver.mdx +++ b/api_docs/kbn_import_resolver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-import-resolver title: "@kbn/import-resolver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/import-resolver plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx index 3496caf4b6273..34adf2405fb27 100644 --- a/api_docs/kbn_interpreter.mdx +++ b/api_docs/kbn_interpreter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-interpreter title: "@kbn/interpreter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/interpreter plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter'] --- import kbnInterpreterObj from './kbn_interpreter.devdocs.json'; diff --git a/api_docs/kbn_io_ts_utils.devdocs.json b/api_docs/kbn_io_ts_utils.devdocs.json index 4f27d88f64b54..d6bef46b1ce92 100644 --- a/api_docs/kbn_io_ts_utils.devdocs.json +++ b/api_docs/kbn_io_ts_utils.devdocs.json @@ -325,8 +325,48 @@ } ], "enums": [], - "misc": [], + "misc": [ + { + "parentPluginId": "@kbn/io-ts-utils", + "id": "def-common.IndexPatternType", + "type": "Type", + "tags": [], + "label": "IndexPatternType", + "description": [], + "signature": [ + "string & ", + "Brand", + "<", + "IndexPatternBrand", + ">" + ], + "path": "packages/kbn-io-ts-utils/src/index_pattern_rt/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], "objects": [ + { + "parentPluginId": "@kbn/io-ts-utils", + "id": "def-common.indexPatternRt", + "type": "Object", + "tags": [], + "label": "indexPatternRt", + "description": [], + "signature": [ + "BrandC", + "<", + "StringC", + ", ", + "IndexPatternBrand", + ">" + ], + "path": "packages/kbn-io-ts-utils/src/index_pattern_rt/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "@kbn/io-ts-utils", "id": "def-common.isoToEpochRt", diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx index 361aeceb82119..fa635987c69f1 100644 --- a/api_docs/kbn_io_ts_utils.mdx +++ b/api_docs/kbn_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-io-ts-utils title: "@kbn/io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/io-ts-utils plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils'] --- import kbnIoTsUtilsObj from './kbn_io_ts_utils.devdocs.json'; @@ -21,7 +21,7 @@ Contact [Owner missing] for questions regarding this plugin. | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 20 | 0 | 20 | 2 | +| 22 | 0 | 22 | 3 | ## Common @@ -34,3 +34,6 @@ Contact [Owner missing] for questions regarding this plugin. ### Interfaces +### Consts, variables and types + + diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index 2c41250498678..a6cbb15c759db 100644 --- a/api_docs/kbn_jest_serializers.mdx +++ b/api_docs/kbn_jest_serializers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-jest-serializers title: "@kbn/jest-serializers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/jest-serializers plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/jest-serializers'] --- import kbnJestSerializersObj from './kbn_jest_serializers.devdocs.json'; diff --git a/api_docs/kbn_journeys.mdx b/api_docs/kbn_journeys.mdx index ba33660565a3c..b148c1dd9a7bd 100644 --- a/api_docs/kbn_journeys.mdx +++ b/api_docs/kbn_journeys.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-journeys title: "@kbn/journeys" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/journeys plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/journeys'] --- import kbnJourneysObj from './kbn_journeys.devdocs.json'; diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx index 1f9ae9f58985f..3a9929b618ec9 100644 --- a/api_docs/kbn_kibana_manifest_schema.mdx +++ b/api_docs/kbn_kibana_manifest_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-kibana-manifest-schema title: "@kbn/kibana-manifest-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/kibana-manifest-schema plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/kibana-manifest-schema'] --- import kbnKibanaManifestSchemaObj from './kbn_kibana_manifest_schema.devdocs.json'; diff --git a/api_docs/kbn_language_documentation_popover.mdx b/api_docs/kbn_language_documentation_popover.mdx index ebe66c7ed539d..56fc9516999ad 100644 --- a/api_docs/kbn_language_documentation_popover.mdx +++ b/api_docs/kbn_language_documentation_popover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-language-documentation-popover title: "@kbn/language-documentation-popover" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/language-documentation-popover plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/language-documentation-popover'] --- import kbnLanguageDocumentationPopoverObj from './kbn_language_documentation_popover.devdocs.json'; diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index d6ae9badd0f7c..576d8aea84eb1 100644 --- a/api_docs/kbn_logging.mdx +++ b/api_docs/kbn_logging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging title: "@kbn/logging" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging'] --- import kbnLoggingObj from './kbn_logging.devdocs.json'; diff --git a/api_docs/kbn_logging_mocks.mdx b/api_docs/kbn_logging_mocks.mdx index 81100556c3660..2dc48aa409342 100644 --- a/api_docs/kbn_logging_mocks.mdx +++ b/api_docs/kbn_logging_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging-mocks title: "@kbn/logging-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks'] --- import kbnLoggingMocksObj from './kbn_logging_mocks.devdocs.json'; diff --git a/api_docs/kbn_managed_vscode_config.mdx b/api_docs/kbn_managed_vscode_config.mdx index 7e23ae991da8c..3e64c2a92504d 100644 --- a/api_docs/kbn_managed_vscode_config.mdx +++ b/api_docs/kbn_managed_vscode_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-vscode-config title: "@kbn/managed-vscode-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-vscode-config plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-vscode-config'] --- import kbnManagedVscodeConfigObj from './kbn_managed_vscode_config.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index 374a3949d8d9f..cf56eb25fc0f5 100644 --- a/api_docs/kbn_mapbox_gl.mdx +++ b/api_docs/kbn_mapbox_gl.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mapbox-gl title: "@kbn/mapbox-gl" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mapbox-gl plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl'] --- import kbnMapboxGlObj from './kbn_mapbox_gl.devdocs.json'; diff --git a/api_docs/kbn_ml_agg_utils.mdx b/api_docs/kbn_ml_agg_utils.mdx index 676eb972af87a..b376d6d39a56c 100644 --- a/api_docs/kbn_ml_agg_utils.mdx +++ b/api_docs/kbn_ml_agg_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-agg-utils title: "@kbn/ml-agg-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-agg-utils plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-agg-utils'] --- import kbnMlAggUtilsObj from './kbn_ml_agg_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_is_populated_object.mdx b/api_docs/kbn_ml_is_populated_object.mdx index 167dc8bf285a7..5eca403e4d814 100644 --- a/api_docs/kbn_ml_is_populated_object.mdx +++ b/api_docs/kbn_ml_is_populated_object.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-populated-object title: "@kbn/ml-is-populated-object" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-populated-object plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-populated-object'] --- import kbnMlIsPopulatedObjectObj from './kbn_ml_is_populated_object.devdocs.json'; diff --git a/api_docs/kbn_ml_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx index d7e3c9f4d05ef..73184c46eda67 100644 --- a/api_docs/kbn_ml_string_hash.mdx +++ b/api_docs/kbn_ml_string_hash.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-string-hash title: "@kbn/ml-string-hash" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-string-hash plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-string-hash'] --- import kbnMlStringHashObj from './kbn_ml_string_hash.devdocs.json'; diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index 66b6e5ed6b519..1cd77b4d42616 100644 --- a/api_docs/kbn_monaco.mdx +++ b/api_docs/kbn_monaco.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-monaco title: "@kbn/monaco" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/monaco plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/monaco'] --- import kbnMonacoObj from './kbn_monaco.devdocs.json'; diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index 05e7398788f58..74500d6aefaff 100644 --- a/api_docs/kbn_optimizer.mdx +++ b/api_docs/kbn_optimizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer title: "@kbn/optimizer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer'] --- import kbnOptimizerObj from './kbn_optimizer.devdocs.json'; diff --git a/api_docs/kbn_optimizer_webpack_helpers.mdx b/api_docs/kbn_optimizer_webpack_helpers.mdx index 669a437bb127e..b655c44c731f3 100644 --- a/api_docs/kbn_optimizer_webpack_helpers.mdx +++ b/api_docs/kbn_optimizer_webpack_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer-webpack-helpers title: "@kbn/optimizer-webpack-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer-webpack-helpers plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer-webpack-helpers'] --- import kbnOptimizerWebpackHelpersObj from './kbn_optimizer_webpack_helpers.devdocs.json'; diff --git a/api_docs/kbn_osquery_io_ts_types.mdx b/api_docs/kbn_osquery_io_ts_types.mdx index 5bcf43db9c14c..15ac9bd201d45 100644 --- a/api_docs/kbn_osquery_io_ts_types.mdx +++ b/api_docs/kbn_osquery_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-osquery-io-ts-types title: "@kbn/osquery-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/osquery-io-ts-types plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/osquery-io-ts-types'] --- import kbnOsqueryIoTsTypesObj from './kbn_osquery_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_peggy.mdx b/api_docs/kbn_peggy.mdx index 284b1b9b234ec..d818d8921f0a6 100644 --- a/api_docs/kbn_peggy.mdx +++ b/api_docs/kbn_peggy.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-peggy title: "@kbn/peggy" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/peggy plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/peggy'] --- import kbnPeggyObj from './kbn_peggy.devdocs.json'; diff --git a/api_docs/kbn_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index 834210c8a409c..92a651f4ea5cd 100644 --- a/api_docs/kbn_performance_testing_dataset_extractor.mdx +++ b/api_docs/kbn_performance_testing_dataset_extractor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-performance-testing-dataset-extractor title: "@kbn/performance-testing-dataset-extractor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/performance-testing-dataset-extractor plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/performance-testing-dataset-extractor'] --- import kbnPerformanceTestingDatasetExtractorObj from './kbn_performance_testing_dataset_extractor.devdocs.json'; diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx index 1186d61193732..70978cb1df249 100644 --- a/api_docs/kbn_plugin_generator.mdx +++ b/api_docs/kbn_plugin_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-generator title: "@kbn/plugin-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-generator plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-generator'] --- import kbnPluginGeneratorObj from './kbn_plugin_generator.devdocs.json'; diff --git a/api_docs/kbn_plugin_helpers.mdx b/api_docs/kbn_plugin_helpers.mdx index 6f234b4ea16f2..5bcc89bd4ab67 100644 --- a/api_docs/kbn_plugin_helpers.mdx +++ b/api_docs/kbn_plugin_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-helpers title: "@kbn/plugin-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-helpers plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_react_field.mdx b/api_docs/kbn_react_field.mdx index 55fe113496e34..fa76fd1e59332 100644 --- a/api_docs/kbn_react_field.mdx +++ b/api_docs/kbn_react_field.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-field title: "@kbn/react-field" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-field plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_repo_source_classifier.mdx b/api_docs/kbn_repo_source_classifier.mdx index 3a42245532f6d..bb3de36c78223 100644 --- a/api_docs/kbn_repo_source_classifier.mdx +++ b/api_docs/kbn_repo_source_classifier.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-source-classifier title: "@kbn/repo-source-classifier" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-source-classifier plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-source-classifier'] --- import kbnRepoSourceClassifierObj from './kbn_repo_source_classifier.devdocs.json'; diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index 4d40793268f20..4e53ab6c27aa0 100644 --- a/api_docs/kbn_rule_data_utils.mdx +++ b/api_docs/kbn_rule_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rule-data-utils title: "@kbn/rule-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rule-data-utils plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils'] --- import kbnRuleDataUtilsObj from './kbn_rule_data_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index 3a8a3d09f6e10..ab977a61b9e52 100644 --- a/api_docs/kbn_securitysolution_autocomplete.mdx +++ b/api_docs/kbn_securitysolution_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-autocomplete title: "@kbn/securitysolution-autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-autocomplete plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-autocomplete'] --- import kbnSecuritysolutionAutocompleteObj from './kbn_securitysolution_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_es_utils.mdx b/api_docs/kbn_securitysolution_es_utils.mdx index 82b4a27654598..3e90aab16699a 100644 --- a/api_docs/kbn_securitysolution_es_utils.mdx +++ b/api_docs/kbn_securitysolution_es_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-es-utils title: "@kbn/securitysolution-es-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-es-utils plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-es-utils'] --- import kbnSecuritysolutionEsUtilsObj from './kbn_securitysolution_es_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_exception_list_components.mdx b/api_docs/kbn_securitysolution_exception_list_components.mdx index fab8bcecfc275..9ed4f50a10270 100644 --- a/api_docs/kbn_securitysolution_exception_list_components.mdx +++ b/api_docs/kbn_securitysolution_exception_list_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-exception-list-components title: "@kbn/securitysolution-exception-list-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-exception-list-components plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-exception-list-components'] --- import kbnSecuritysolutionExceptionListComponentsObj from './kbn_securitysolution_exception_list_components.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index a557ea1a78217..21176118d2573 100644 --- a/api_docs/kbn_securitysolution_hook_utils.mdx +++ b/api_docs/kbn_securitysolution_hook_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-hook-utils title: "@kbn/securitysolution-hook-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-hook-utils plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-hook-utils'] --- import kbnSecuritysolutionHookUtilsObj from './kbn_securitysolution_hook_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx index 29abfc5b4e6a2..205cf919fb4a0 100644 --- a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx @@ -8,7 +8,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 description: API docs for the @kbn/securitysolution-io-ts-alerting-types plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-alerting-types'] --- import kbnSecuritysolutionIoTsAlertingTypesObj from './kbn_securitysolution_io_ts_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_list_types.mdx b/api_docs/kbn_securitysolution_io_ts_list_types.mdx index b34154d40882d..060a1f56d3522 100644 --- a/api_docs/kbn_securitysolution_io_ts_list_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_list_types.mdx @@ -8,7 +8,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 description: API docs for the @kbn/securitysolution-io-ts-list-types plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-list-types'] --- import kbnSecuritysolutionIoTsListTypesObj from './kbn_securitysolution_io_ts_list_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_types.mdx b/api_docs/kbn_securitysolution_io_ts_types.mdx index 36ea96a72f11d..d7ccfc8d1701a 100644 --- a/api_docs/kbn_securitysolution_io_ts_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-types title: "@kbn/securitysolution-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-types plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-types'] --- import kbnSecuritysolutionIoTsTypesObj from './kbn_securitysolution_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_utils.mdx b/api_docs/kbn_securitysolution_io_ts_utils.mdx index 4082f06610d2b..f62e87afca456 100644 --- a/api_docs/kbn_securitysolution_io_ts_utils.mdx +++ b/api_docs/kbn_securitysolution_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-utils title: "@kbn/securitysolution-io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-utils plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-utils'] --- import kbnSecuritysolutionIoTsUtilsObj from './kbn_securitysolution_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_api.mdx b/api_docs/kbn_securitysolution_list_api.mdx index 5745702411442..6c8815ba5d61b 100644 --- a/api_docs/kbn_securitysolution_list_api.mdx +++ b/api_docs/kbn_securitysolution_list_api.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-api title: "@kbn/securitysolution-list-api" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-api plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-api'] --- import kbnSecuritysolutionListApiObj from './kbn_securitysolution_list_api.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_constants.mdx b/api_docs/kbn_securitysolution_list_constants.mdx index 49a7263eaada8..76f9816719400 100644 --- a/api_docs/kbn_securitysolution_list_constants.mdx +++ b/api_docs/kbn_securitysolution_list_constants.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-constants title: "@kbn/securitysolution-list-constants" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-constants plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-constants'] --- import kbnSecuritysolutionListConstantsObj from './kbn_securitysolution_list_constants.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_hooks.mdx b/api_docs/kbn_securitysolution_list_hooks.mdx index 62a7ac4e0ff9c..0a3d452836a6c 100644 --- a/api_docs/kbn_securitysolution_list_hooks.mdx +++ b/api_docs/kbn_securitysolution_list_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-hooks title: "@kbn/securitysolution-list-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-hooks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-hooks'] --- import kbnSecuritysolutionListHooksObj from './kbn_securitysolution_list_hooks.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_utils.mdx b/api_docs/kbn_securitysolution_list_utils.mdx index 2c761d5e49a54..051cda27c8221 100644 --- a/api_docs/kbn_securitysolution_list_utils.mdx +++ b/api_docs/kbn_securitysolution_list_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-utils title: "@kbn/securitysolution-list-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-utils plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-utils'] --- import kbnSecuritysolutionListUtilsObj from './kbn_securitysolution_list_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_rules.mdx b/api_docs/kbn_securitysolution_rules.mdx index 61199116cfd33..c9df894569e17 100644 --- a/api_docs/kbn_securitysolution_rules.mdx +++ b/api_docs/kbn_securitysolution_rules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-rules title: "@kbn/securitysolution-rules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-rules plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-rules'] --- import kbnSecuritysolutionRulesObj from './kbn_securitysolution_rules.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_t_grid.mdx b/api_docs/kbn_securitysolution_t_grid.mdx index c6c28924e2cc1..0f3b40e3a956f 100644 --- a/api_docs/kbn_securitysolution_t_grid.mdx +++ b/api_docs/kbn_securitysolution_t_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-t-grid title: "@kbn/securitysolution-t-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-t-grid plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-t-grid'] --- import kbnSecuritysolutionTGridObj from './kbn_securitysolution_t_grid.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_utils.mdx b/api_docs/kbn_securitysolution_utils.mdx index 74072f100732b..90ec7394758e6 100644 --- a/api_docs/kbn_securitysolution_utils.mdx +++ b/api_docs/kbn_securitysolution_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-utils title: "@kbn/securitysolution-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-utils plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-utils'] --- import kbnSecuritysolutionUtilsObj from './kbn_securitysolution_utils.devdocs.json'; diff --git a/api_docs/kbn_server_http_tools.mdx b/api_docs/kbn_server_http_tools.mdx index 1194ce9c2c7f4..653814e8793cc 100644 --- a/api_docs/kbn_server_http_tools.mdx +++ b/api_docs/kbn_server_http_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-http-tools title: "@kbn/server-http-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-http-tools plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-http-tools'] --- import kbnServerHttpToolsObj from './kbn_server_http_tools.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository.mdx b/api_docs/kbn_server_route_repository.mdx index 3e85cf1dac16a..49dfd8f44dd84 100644 --- a/api_docs/kbn_server_route_repository.mdx +++ b/api_docs/kbn_server_route_repository.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository title: "@kbn/server-route-repository" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_shared_svg.mdx b/api_docs/kbn_shared_svg.mdx index b16d100f973f5..738245379e715 100644 --- a/api_docs/kbn_shared_svg.mdx +++ b/api_docs/kbn_shared_svg.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-svg title: "@kbn/shared-svg" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-svg plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-svg'] --- import kbnSharedSvgObj from './kbn_shared_svg.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_avatar_solution.mdx b/api_docs/kbn_shared_ux_avatar_solution.mdx index d746fdc62c8d6..19f1643a437b2 100644 --- a/api_docs/kbn_shared_ux_avatar_solution.mdx +++ b/api_docs/kbn_shared_ux_avatar_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-solution title: "@kbn/shared-ux-avatar-solution" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-avatar-solution plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-solution'] --- import kbnSharedUxAvatarSolutionObj from './kbn_shared_ux_avatar_solution.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx b/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx index bc91d7219c87b..36dd03748f07a 100644 --- a/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx +++ b/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-user-profile-components title: "@kbn/shared-ux-avatar-user-profile-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-avatar-user-profile-components plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-user-profile-components'] --- import kbnSharedUxAvatarUserProfileComponentsObj from './kbn_shared_ux_avatar_user_profile_components.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx index 99bdf0dc58615..c8d3ac337cb10 100644 --- a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx +++ b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen title: "@kbn/shared-ux-button-exit-full-screen" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-exit-full-screen plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen'] --- import kbnSharedUxButtonExitFullScreenObj from './kbn_shared_ux_button_exit_full_screen.devdocs.json'; 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 063ee661ccadc..ba1de12f2b95f 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 @@ -8,7 +8,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 description: API docs for the @kbn/shared-ux-button-exit-full-screen-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen-mocks'] --- import kbnSharedUxButtonExitFullScreenMocksObj from './kbn_shared_ux_button_exit_full_screen_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index 0ccc197da1de3..eaf5394117f2b 100644 --- a/api_docs/kbn_shared_ux_button_toolbar.mdx +++ b/api_docs/kbn_shared_ux_button_toolbar.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-toolbar title: "@kbn/shared-ux-button-toolbar" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-toolbar plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-toolbar'] --- import kbnSharedUxButtonToolbarObj from './kbn_shared_ux_button_toolbar.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_card_no_data.mdx b/api_docs/kbn_shared_ux_card_no_data.mdx index a3ebf65905949..a2f1498bc6dbb 100644 --- a/api_docs/kbn_shared_ux_card_no_data.mdx +++ b/api_docs/kbn_shared_ux_card_no_data.mdx @@ -8,7 +8,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 description: API docs for the @kbn/shared-ux-card-no-data plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data'] --- import kbnSharedUxCardNoDataObj from './kbn_shared_ux_card_no_data.devdocs.json'; 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 4de73720db58e..67610d1e2d192 100644 --- a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx @@ -8,7 +8,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 description: API docs for the @kbn/shared-ux-card-no-data-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data-mocks'] --- import kbnSharedUxCardNoDataMocksObj from './kbn_shared_ux_card_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_context.devdocs.json b/api_docs/kbn_shared_ux_file_context.devdocs.json new file mode 100644 index 0000000000000..02025b778807c --- /dev/null +++ b/api_docs/kbn_shared_ux_file_context.devdocs.json @@ -0,0 +1,117 @@ +{ + "id": "@kbn/shared-ux-file-context", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [ + { + "parentPluginId": "@kbn/shared-ux-file-context", + "id": "def-common.FilesContext", + "type": "Function", + "tags": [], + "label": "FilesContext", + "description": [], + "signature": [ + "({ client, children }: React.PropsWithChildren) => JSX.Element" + ], + "path": "packages/shared-ux/file/context/src/index.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/shared-ux-file-context", + "id": "def-common.FilesContext.$1", + "type": "CompoundType", + "tags": [], + "label": "{ client, children }", + "description": [], + "signature": [ + "React.PropsWithChildren" + ], + "path": "packages/shared-ux/file/context/src/index.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/shared-ux-file-context", + "id": "def-common.useFilesContext", + "type": "Function", + "tags": [], + "label": "useFilesContext", + "description": [], + "signature": [ + "() => ", + { + "pluginId": "@kbn/shared-ux-file-context", + "scope": "common", + "docId": "kibKbnSharedUxFileContextPluginApi", + "section": "def-common.FilesContextValue", + "text": "FilesContextValue" + } + ], + "path": "packages/shared-ux/file/context/src/index.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [ + { + "parentPluginId": "@kbn/shared-ux-file-context", + "id": "def-common.FilesContextValue", + "type": "Interface", + "tags": [], + "label": "FilesContextValue", + "description": [], + "path": "packages/shared-ux/file/context/src/index.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/shared-ux-file-context", + "id": "def-common.FilesContextValue.client", + "type": "Object", + "tags": [], + "label": "client", + "description": [ + "\nA files client that will be used process uploads." + ], + "signature": [ + "BaseFilesClient", + "" + ], + "path": "packages/shared-ux/file/context/src/index.tsx", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_shared_ux_file_context.mdx b/api_docs/kbn_shared_ux_file_context.mdx new file mode 100644 index 0000000000000..21bf2876c617e --- /dev/null +++ b/api_docs/kbn_shared_ux_file_context.mdx @@ -0,0 +1,33 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibKbnSharedUxFileContextPluginApi +slug: /kibana-dev-docs/api/kbn-shared-ux-file-context +title: "@kbn/shared-ux-file-context" +image: https://source.unsplash.com/400x175/?github +description: API docs for the @kbn/shared-ux-file-context plugin +date: 2022-12-01 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-context'] +--- +import kbnSharedUxFileContextObj from './kbn_shared_ux_file_context.devdocs.json'; + + + +Contact [Owner missing] for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 5 | 0 | 4 | 0 | + +## Common + +### Functions + + +### Interfaces + + diff --git a/api_docs/kbn_shared_ux_file_image.devdocs.json b/api_docs/kbn_shared_ux_file_image.devdocs.json index b1d29de390143..5d3350f6cf444 100644 --- a/api_docs/kbn_shared_ux_file_image.devdocs.json +++ b/api_docs/kbn_shared_ux_file_image.devdocs.json @@ -82,7 +82,9 @@ "label": "Props", "description": [], "signature": [ - "{ meta?: any; } & ", + "{ meta?: ", + "FileImageMetadata", + " | undefined; } & ", "EuiImageProps" ], "path": "packages/shared-ux/file/image/impl/src/image.tsx", diff --git a/api_docs/kbn_shared_ux_file_image.mdx b/api_docs/kbn_shared_ux_file_image.mdx index 74e18d3c3edec..93e0e33b25719 100644 --- a/api_docs/kbn_shared_ux_file_image.mdx +++ b/api_docs/kbn_shared_ux_file_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image title: "@kbn/shared-ux-file-image" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image'] --- import kbnSharedUxFileImageObj from './kbn_shared_ux_file_image.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image_mocks.mdx b/api_docs/kbn_shared_ux_file_image_mocks.mdx index 975f46888cc8f..133cf6b7bbc34 100644 --- a/api_docs/kbn_shared_ux_file_image_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_image_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image-mocks title: "@kbn/shared-ux-file-image-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image-mocks'] --- import kbnSharedUxFileImageMocksObj from './kbn_shared_ux_file_image_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_mocks.devdocs.json b/api_docs/kbn_shared_ux_file_mocks.devdocs.json new file mode 100644 index 0000000000000..67aaba2cc7ed1 --- /dev/null +++ b/api_docs/kbn_shared_ux_file_mocks.devdocs.json @@ -0,0 +1,55 @@ +{ + "id": "@kbn/shared-ux-file-mocks", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [ + { + "parentPluginId": "@kbn/shared-ux-file-mocks", + "id": "def-common.createMockFilesClient", + "type": "Function", + "tags": [], + "label": "createMockFilesClient", + "description": [], + "signature": [ + "() => ", + { + "pluginId": "@kbn/utility-types-jest", + "scope": "server", + "docId": "kibKbnUtilityTypesJestPluginApi", + "section": "def-server.DeeplyMockedKeys", + "text": "DeeplyMockedKeys" + }, + "<", + "BaseFilesClient", + ">" + ], + "path": "packages/shared-ux/file/mocks/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_shared_ux_file_mocks.mdx b/api_docs/kbn_shared_ux_file_mocks.mdx new file mode 100644 index 0000000000000..6eae5d67efdbf --- /dev/null +++ b/api_docs/kbn_shared_ux_file_mocks.mdx @@ -0,0 +1,30 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibKbnSharedUxFileMocksPluginApi +slug: /kibana-dev-docs/api/kbn-shared-ux-file-mocks +title: "@kbn/shared-ux-file-mocks" +image: https://source.unsplash.com/400x175/?github +description: API docs for the @kbn/shared-ux-file-mocks plugin +date: 2022-12-01 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-mocks'] +--- +import kbnSharedUxFileMocksObj from './kbn_shared_ux_file_mocks.devdocs.json'; + + + +Contact [Owner missing] for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 1 | 0 | 1 | 0 | + +## Common + +### Functions + + diff --git a/api_docs/kbn_shared_ux_file_util.devdocs.json b/api_docs/kbn_shared_ux_file_util.devdocs.json index c14e553be0947..c471a74aeec8e 100644 --- a/api_docs/kbn_shared_ux_file_util.devdocs.json +++ b/api_docs/kbn_shared_ux_file_util.devdocs.json @@ -143,7 +143,9 @@ "\nExtract image metadata, assumes that file or blob as an image!" ], "signature": [ - "(file: Blob | File) => Promise" + "(file: Blob | File) => Promise<", + "FileImageMetadata", + " | undefined>" ], "path": "packages/shared-ux/file/util/src/image_metadata.ts", "deprecated": false, @@ -212,6 +214,42 @@ ], "returnComment": [], "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/shared-ux-file-util", + "id": "def-common.useBehaviorSubject", + "type": "Function", + "tags": [], + "label": "useBehaviorSubject", + "description": [], + "signature": [ + "(o$: ", + "BehaviorSubject", + ") => T" + ], + "path": "packages/shared-ux/file/util/src/use_behavior_subject.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/shared-ux-file-util", + "id": "def-common.useBehaviorSubject.$1", + "type": "Object", + "tags": [], + "label": "o$", + "description": [], + "signature": [ + "BehaviorSubject", + "" + ], + "path": "packages/shared-ux/file/util/src/use_behavior_subject.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false } ], "interfaces": [], @@ -225,7 +263,9 @@ "label": "ImageMetadataFactory", "description": [], "signature": [ - "(file: Blob | File) => Promise" + "(file: Blob | File) => Promise<", + "FileImageMetadata", + " | undefined>" ], "path": "packages/shared-ux/file/util/src/image_metadata.ts", "deprecated": false, diff --git a/api_docs/kbn_shared_ux_file_util.mdx b/api_docs/kbn_shared_ux_file_util.mdx index c95cc9b4dded6..6940d47ca0301 100644 --- a/api_docs/kbn_shared_ux_file_util.mdx +++ b/api_docs/kbn_shared_ux_file_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-util title: "@kbn/shared-ux-file-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-util plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-util'] --- import kbnSharedUxFileUtilObj from './kbn_shared_ux_file_util.devdocs.json'; @@ -21,7 +21,7 @@ Contact [Owner missing] for questions regarding this plugin. | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 15 | 0 | 13 | 0 | +| 17 | 0 | 15 | 0 | ## Common diff --git a/api_docs/kbn_shared_ux_link_redirect_app.mdx b/api_docs/kbn_shared_ux_link_redirect_app.mdx index 92d443c8dfe0d..3abb886c51ce8 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app title: "@kbn/shared-ux-link-redirect-app" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app'] --- import kbnSharedUxLinkRedirectAppObj from './kbn_shared_ux_link_redirect_app.devdocs.json'; 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 13919bdd9c954..2caf88917d54d 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx @@ -8,7 +8,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 description: API docs for the @kbn/shared-ux-link-redirect-app-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app-mocks'] --- import kbnSharedUxLinkRedirectAppMocksObj from './kbn_shared_ux_link_redirect_app_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown.mdx b/api_docs/kbn_shared_ux_markdown.mdx index 3168673711040..eb8d357f618ff 100644 --- a/api_docs/kbn_shared_ux_markdown.mdx +++ b/api_docs/kbn_shared_ux_markdown.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown title: "@kbn/shared-ux-markdown" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown'] --- import kbnSharedUxMarkdownObj from './kbn_shared_ux_markdown.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown_mocks.mdx b/api_docs/kbn_shared_ux_markdown_mocks.mdx index 1425270011f6a..c91955246ef9d 100644 --- a/api_docs/kbn_shared_ux_markdown_mocks.mdx +++ b/api_docs/kbn_shared_ux_markdown_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown-mocks title: "@kbn/shared-ux-markdown-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown-mocks'] --- import kbnSharedUxMarkdownMocksObj from './kbn_shared_ux_markdown_mocks.devdocs.json'; 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 dd2f7858a4a31..ce968b79a232a 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx @@ -8,7 +8,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 description: API docs for the @kbn/shared-ux-page-analytics-no-data plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data'] --- import kbnSharedUxPageAnalyticsNoDataObj from './kbn_shared_ux_page_analytics_no_data.devdocs.json'; 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 794dac8166565..d3230b3b05778 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 @@ -8,7 +8,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 description: API docs for the @kbn/shared-ux-page-analytics-no-data-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data-mocks'] --- import kbnSharedUxPageAnalyticsNoDataMocksObj from './kbn_shared_ux_page_analytics_no_data_mocks.devdocs.json'; 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 d4b03592d2965..3cd21e05db1d9 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx @@ -8,7 +8,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 description: API docs for the @kbn/shared-ux-page-kibana-no-data plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data'] --- import kbnSharedUxPageKibanaNoDataObj from './kbn_shared_ux_page_kibana_no_data.devdocs.json'; 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 5077603fb1ec4..9846fa868d3a6 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 @@ -8,7 +8,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 description: API docs for the @kbn/shared-ux-page-kibana-no-data-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data-mocks'] --- import kbnSharedUxPageKibanaNoDataMocksObj from './kbn_shared_ux_page_kibana_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template.mdx b/api_docs/kbn_shared_ux_page_kibana_template.mdx index c0fefbca48880..e028388359ac5 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template title: "@kbn/shared-ux-page-kibana-template" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template'] --- import kbnSharedUxPageKibanaTemplateObj from './kbn_shared_ux_page_kibana_template.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx index 4678a350d64ac..0f4eb57f0409d 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template-mocks title: "@kbn/shared-ux-page-kibana-template-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template-mocks'] --- import kbnSharedUxPageKibanaTemplateMocksObj from './kbn_shared_ux_page_kibana_template_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data.mdx b/api_docs/kbn_shared_ux_page_no_data.mdx index 2d7ea6ba9ac95..5e702f51990af 100644 --- a/api_docs/kbn_shared_ux_page_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data title: "@kbn/shared-ux-page-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data'] --- import kbnSharedUxPageNoDataObj from './kbn_shared_ux_page_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config.mdx b/api_docs/kbn_shared_ux_page_no_data_config.mdx index 822e523d7b0f3..6f9284b8c7825 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config title: "@kbn/shared-ux-page-no-data-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config'] --- import kbnSharedUxPageNoDataConfigObj from './kbn_shared_ux_page_no_data_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx index 5dfa992a99914..4ca8c71ec7986 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config-mocks title: "@kbn/shared-ux-page-no-data-config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config-mocks'] --- import kbnSharedUxPageNoDataConfigMocksObj from './kbn_shared_ux_page_no_data_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx index e4d11e95b46f8..f2403ba86dbbd 100644 --- a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-mocks title: "@kbn/shared-ux-page-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-mocks'] --- import kbnSharedUxPageNoDataMocksObj from './kbn_shared_ux_page_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_solution_nav.mdx b/api_docs/kbn_shared_ux_page_solution_nav.mdx index 590ef342fd8aa..8b8ceeac43dd4 100644 --- a/api_docs/kbn_shared_ux_page_solution_nav.mdx +++ b/api_docs/kbn_shared_ux_page_solution_nav.mdx @@ -8,7 +8,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 description: API docs for the @kbn/shared-ux-page-solution-nav plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-solution-nav'] --- import kbnSharedUxPageSolutionNavObj from './kbn_shared_ux_page_solution_nav.devdocs.json'; 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 2ef602d05cec3..04589856b41e5 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx @@ -8,7 +8,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 description: API docs for the @kbn/shared-ux-prompt-no-data-views plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views'] --- import kbnSharedUxPromptNoDataViewsObj from './kbn_shared_ux_prompt_no_data_views.devdocs.json'; 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 b19ae2bdbcd84..c18a9014d91cd 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 @@ -8,7 +8,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 description: API docs for the @kbn/shared-ux-prompt-no-data-views-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views-mocks'] --- import kbnSharedUxPromptNoDataViewsMocksObj from './kbn_shared_ux_prompt_no_data_views_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router.mdx b/api_docs/kbn_shared_ux_router.mdx index dc58fe24cafb5..818d08069672f 100644 --- a/api_docs/kbn_shared_ux_router.mdx +++ b/api_docs/kbn_shared_ux_router.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router title: "@kbn/shared-ux-router" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router'] --- import kbnSharedUxRouterObj from './kbn_shared_ux_router.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router_mocks.mdx b/api_docs/kbn_shared_ux_router_mocks.mdx index 4f1c592a6c2f6..e22db85f6cf0f 100644 --- a/api_docs/kbn_shared_ux_router_mocks.mdx +++ b/api_docs/kbn_shared_ux_router_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router-mocks title: "@kbn/shared-ux-router-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router-mocks plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router-mocks'] --- import kbnSharedUxRouterMocksObj from './kbn_shared_ux_router_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_config.mdx b/api_docs/kbn_shared_ux_storybook_config.mdx index fa722929a0ff5..81148a8f0935a 100644 --- a/api_docs/kbn_shared_ux_storybook_config.mdx +++ b/api_docs/kbn_shared_ux_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-config title: "@kbn/shared-ux-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-config plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-config'] --- import kbnSharedUxStorybookConfigObj from './kbn_shared_ux_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_mock.mdx b/api_docs/kbn_shared_ux_storybook_mock.mdx index 10e93dc48a604..abedc29e2e8bb 100644 --- a/api_docs/kbn_shared_ux_storybook_mock.mdx +++ b/api_docs/kbn_shared_ux_storybook_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-mock title: "@kbn/shared-ux-storybook-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-mock plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-mock'] --- import kbnSharedUxStorybookMockObj from './kbn_shared_ux_storybook_mock.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index 22fe75a110f06..372032b05378d 100644 --- a/api_docs/kbn_shared_ux_utility.mdx +++ b/api_docs/kbn_shared_ux_utility.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-utility title: "@kbn/shared-ux-utility" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-utility plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-utility'] --- import kbnSharedUxUtilityObj from './kbn_shared_ux_utility.devdocs.json'; diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index 2f785f6e4120c..01c18132e96cd 100644 --- a/api_docs/kbn_some_dev_log.mdx +++ b/api_docs/kbn_some_dev_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-some-dev-log title: "@kbn/some-dev-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/some-dev-log plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log'] --- import kbnSomeDevLogObj from './kbn_some_dev_log.devdocs.json'; diff --git a/api_docs/kbn_sort_package_json.mdx b/api_docs/kbn_sort_package_json.mdx index f181ea0955933..8f17f93a519af 100644 --- a/api_docs/kbn_sort_package_json.mdx +++ b/api_docs/kbn_sort_package_json.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sort-package-json title: "@kbn/sort-package-json" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sort-package-json plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sort-package-json'] --- import kbnSortPackageJsonObj from './kbn_sort_package_json.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index e1a11d35567af..fb01c20af3d2b 100644 --- a/api_docs/kbn_std.mdx +++ b/api_docs/kbn_std.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-std title: "@kbn/std" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/std plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/std'] --- import kbnStdObj from './kbn_std.devdocs.json'; diff --git a/api_docs/kbn_stdio_dev_helpers.mdx b/api_docs/kbn_stdio_dev_helpers.mdx index 1ead98a7bd9b0..c1e0a99a6410d 100644 --- a/api_docs/kbn_stdio_dev_helpers.mdx +++ b/api_docs/kbn_stdio_dev_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-stdio-dev-helpers title: "@kbn/stdio-dev-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/stdio-dev-helpers plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/stdio-dev-helpers'] --- import kbnStdioDevHelpersObj from './kbn_stdio_dev_helpers.devdocs.json'; diff --git a/api_docs/kbn_storybook.mdx b/api_docs/kbn_storybook.mdx index f05ee9e722132..becfb0404781e 100644 --- a/api_docs/kbn_storybook.mdx +++ b/api_docs/kbn_storybook.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-storybook title: "@kbn/storybook" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/storybook plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] --- import kbnStorybookObj from './kbn_storybook.devdocs.json'; diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index 3bfb4c56292d1..d9cbf1bcbb95c 100644 --- a/api_docs/kbn_telemetry_tools.mdx +++ b/api_docs/kbn_telemetry_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-telemetry-tools title: "@kbn/telemetry-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/telemetry-tools plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/telemetry-tools'] --- import kbnTelemetryToolsObj from './kbn_telemetry_tools.devdocs.json'; diff --git a/api_docs/kbn_test.mdx b/api_docs/kbn_test.mdx index 30e124fe853fc..ebe60898e0204 100644 --- a/api_docs/kbn_test.mdx +++ b/api_docs/kbn_test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test title: "@kbn/test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] --- import kbnTestObj from './kbn_test.devdocs.json'; diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index ba02155f2d0b7..7c4059da2a02f 100644 --- a/api_docs/kbn_test_jest_helpers.mdx +++ b/api_docs/kbn_test_jest_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-jest-helpers title: "@kbn/test-jest-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-jest-helpers plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-jest-helpers'] --- import kbnTestJestHelpersObj from './kbn_test_jest_helpers.devdocs.json'; diff --git a/api_docs/kbn_test_subj_selector.mdx b/api_docs/kbn_test_subj_selector.mdx index 5bb27cb029dd6..345a1ded6f8db 100644 --- a/api_docs/kbn_test_subj_selector.mdx +++ b/api_docs/kbn_test_subj_selector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-subj-selector title: "@kbn/test-subj-selector" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-subj-selector plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index 5b20a143323a2..0c70cfc167354 100644 --- a/api_docs/kbn_tooling_log.mdx +++ b/api_docs/kbn_tooling_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-tooling-log title: "@kbn/tooling-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/tooling-log plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_type_summarizer.mdx b/api_docs/kbn_type_summarizer.mdx index fff5773985129..21d7187f9ea31 100644 --- a/api_docs/kbn_type_summarizer.mdx +++ b/api_docs/kbn_type_summarizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-type-summarizer title: "@kbn/type-summarizer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/type-summarizer plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/type-summarizer'] --- import kbnTypeSummarizerObj from './kbn_type_summarizer.devdocs.json'; diff --git a/api_docs/kbn_type_summarizer_core.mdx b/api_docs/kbn_type_summarizer_core.mdx index 871708564dac7..b4992ac19adc3 100644 --- a/api_docs/kbn_type_summarizer_core.mdx +++ b/api_docs/kbn_type_summarizer_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-type-summarizer-core title: "@kbn/type-summarizer-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/type-summarizer-core plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/type-summarizer-core'] --- import kbnTypeSummarizerCoreObj from './kbn_type_summarizer_core.devdocs.json'; diff --git a/api_docs/kbn_typed_react_router_config.mdx b/api_docs/kbn_typed_react_router_config.mdx index 09af3e077de20..3db66eb6bef09 100644 --- a/api_docs/kbn_typed_react_router_config.mdx +++ b/api_docs/kbn_typed_react_router_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-typed-react-router-config title: "@kbn/typed-react-router-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/typed-react-router-config plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/typed-react-router-config'] --- import kbnTypedReactRouterConfigObj from './kbn_typed_react_router_config.devdocs.json'; diff --git a/api_docs/kbn_ui_shared_deps_src.mdx b/api_docs/kbn_ui_shared_deps_src.mdx index fe1806ff41f53..39a9aac8596cf 100644 --- a/api_docs/kbn_ui_shared_deps_src.mdx +++ b/api_docs/kbn_ui_shared_deps_src.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-shared-deps-src title: "@kbn/ui-shared-deps-src" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-shared-deps-src plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-shared-deps-src'] --- import kbnUiSharedDepsSrcObj from './kbn_ui_shared_deps_src.devdocs.json'; diff --git a/api_docs/kbn_ui_theme.mdx b/api_docs/kbn_ui_theme.mdx index 3daa216f02aee..331cefecf5508 100644 --- a/api_docs/kbn_ui_theme.mdx +++ b/api_docs/kbn_ui_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-theme title: "@kbn/ui-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-theme plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] --- import kbnUiThemeObj from './kbn_ui_theme.devdocs.json'; diff --git a/api_docs/kbn_user_profile_components.mdx b/api_docs/kbn_user_profile_components.mdx index 3ebe1ab25ca42..6f8b41358c266 100644 --- a/api_docs/kbn_user_profile_components.mdx +++ b/api_docs/kbn_user_profile_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-user-profile-components title: "@kbn/user-profile-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/user-profile-components plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/user-profile-components'] --- import kbnUserProfileComponentsObj from './kbn_user_profile_components.devdocs.json'; diff --git a/api_docs/kbn_utility_types.mdx b/api_docs/kbn_utility_types.mdx index bdbf90c72f5a7..18c2f7354fe10 100644 --- a/api_docs/kbn_utility_types.mdx +++ b/api_docs/kbn_utility_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types title: "@kbn/utility-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types'] --- import kbnUtilityTypesObj from './kbn_utility_types.devdocs.json'; diff --git a/api_docs/kbn_utility_types_jest.mdx b/api_docs/kbn_utility_types_jest.mdx index fb9e18bc10013..88236f984322f 100644 --- a/api_docs/kbn_utility_types_jest.mdx +++ b/api_docs/kbn_utility_types_jest.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types-jest title: "@kbn/utility-types-jest" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types-jest plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types-jest'] --- import kbnUtilityTypesJestObj from './kbn_utility_types_jest.devdocs.json'; diff --git a/api_docs/kbn_utils.mdx b/api_docs/kbn_utils.mdx index 7b1e0b558a0f7..fd646c78edb72 100644 --- a/api_docs/kbn_utils.mdx +++ b/api_docs/kbn_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utils title: "@kbn/utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utils plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] --- import kbnUtilsObj from './kbn_utils.devdocs.json'; diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx index 768b4d89b56f8..6f9494e7af860 100644 --- a/api_docs/kbn_yarn_lock_validator.mdx +++ b/api_docs/kbn_yarn_lock_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-yarn-lock-validator title: "@kbn/yarn-lock-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/yarn-lock-validator plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator'] --- import kbnYarnLockValidatorObj from './kbn_yarn_lock_validator.devdocs.json'; diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx index f5c860c829e08..96e318a0aea05 100644 --- a/api_docs/kibana_overview.mdx +++ b/api_docs/kibana_overview.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaOverview title: "kibanaOverview" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaOverview plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview'] --- import kibanaOverviewObj from './kibana_overview.devdocs.json'; diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index 665dc86ca8b81..841f8832bb322 100644 --- a/api_docs/kibana_react.mdx +++ b/api_docs/kibana_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaReact title: "kibanaReact" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaReact plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaReact'] --- import kibanaReactObj from './kibana_react.devdocs.json'; diff --git a/api_docs/kibana_utils.mdx b/api_docs/kibana_utils.mdx index 2355f311b876e..8337df216b398 100644 --- a/api_docs/kibana_utils.mdx +++ b/api_docs/kibana_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaUtils title: "kibanaUtils" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaUtils plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaUtils'] --- import kibanaUtilsObj from './kibana_utils.devdocs.json'; diff --git a/api_docs/kubernetes_security.mdx b/api_docs/kubernetes_security.mdx index 2964e5cc3d5c7..36206a9af427a 100644 --- a/api_docs/kubernetes_security.mdx +++ b/api_docs/kubernetes_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kubernetesSecurity title: "kubernetesSecurity" image: https://source.unsplash.com/400x175/?github description: API docs for the kubernetesSecurity plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity'] --- import kubernetesSecurityObj from './kubernetes_security.devdocs.json'; diff --git a/api_docs/lens.devdocs.json b/api_docs/lens.devdocs.json index 95bd3b3bc9e6c..4c2e274e40798 100644 --- a/api_docs/lens.devdocs.json +++ b/api_docs/lens.devdocs.json @@ -3826,6 +3826,20 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "lens", + "id": "def-public.SharedPieLayerState.colorsByDimension", + "type": "Object", + "tags": [], + "label": "colorsByDimension", + "description": [], + "signature": [ + "Record | undefined" + ], + "path": "x-pack/plugins/lens/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "lens", "id": "def-public.SharedPieLayerState.collapseFns", @@ -6036,6 +6050,43 @@ ], "returnComment": [] }, + { + "parentPluginId": "lens", + "id": "def-public.Visualization.hasLayerSettings", + "type": "Function", + "tags": [], + "label": "hasLayerSettings", + "description": [ + "\nAllows the visualization to announce whether or not it has any settings to show" + ], + "signature": [ + "((props: ", + "VisualizationConfigProps", + ") => boolean) | undefined" + ], + "path": "x-pack/plugins/lens/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "lens", + "id": "def-public.Visualization.hasLayerSettings.$1", + "type": "Object", + "tags": [], + "label": "props", + "description": [], + "signature": [ + "VisualizationConfigProps", + "" + ], + "path": "x-pack/plugins/lens/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, { "parentPluginId": "lens", "id": "def-public.Visualization.renderLayerSettings", @@ -12073,6 +12124,20 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "lens", + "id": "def-common.SharedPieLayerState.colorsByDimension", + "type": "Object", + "tags": [], + "label": "colorsByDimension", + "description": [], + "signature": [ + "Record | undefined" + ], + "path": "x-pack/plugins/lens/common/types.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "lens", "id": "def-common.SharedPieLayerState.collapseFns", diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index 072a74b03ed83..7154b26211432 100644 --- a/api_docs/lens.mdx +++ b/api_docs/lens.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lens title: "lens" image: https://source.unsplash.com/400x175/?github description: API docs for the lens plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lens'] --- import lensObj from './lens.devdocs.json'; @@ -21,7 +21,7 @@ Contact [Vis Editors](https://github.com/orgs/elastic/teams/kibana-visualization | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 685 | 0 | 590 | 48 | +| 689 | 0 | 593 | 48 | ## Client diff --git a/api_docs/license_api_guard.mdx b/api_docs/license_api_guard.mdx index ab1f43b8f4c53..955ebc1459ed6 100644 --- a/api_docs/license_api_guard.mdx +++ b/api_docs/license_api_guard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseApiGuard title: "licenseApiGuard" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseApiGuard plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseApiGuard'] --- import licenseApiGuardObj from './license_api_guard.devdocs.json'; diff --git a/api_docs/license_management.mdx b/api_docs/license_management.mdx index e17d666d41fa7..52bc4e009ecee 100644 --- a/api_docs/license_management.mdx +++ b/api_docs/license_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseManagement title: "licenseManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseManagement plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseManagement'] --- import licenseManagementObj from './license_management.devdocs.json'; diff --git a/api_docs/licensing.mdx b/api_docs/licensing.mdx index addaf047bc9ed..0fd0b8c0e7046 100644 --- a/api_docs/licensing.mdx +++ b/api_docs/licensing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licensing title: "licensing" image: https://source.unsplash.com/400x175/?github description: API docs for the licensing plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] --- import licensingObj from './licensing.devdocs.json'; diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index 5682d52d715da..811fbd14767d3 100644 --- a/api_docs/lists.mdx +++ b/api_docs/lists.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lists title: "lists" image: https://source.unsplash.com/400x175/?github description: API docs for the lists plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/management.mdx b/api_docs/management.mdx index 9d86ea41e0838..d7b56771b5a6f 100644 --- a/api_docs/management.mdx +++ b/api_docs/management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/management title: "management" image: https://source.unsplash.com/400x175/?github description: API docs for the management plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'management'] --- import managementObj from './management.devdocs.json'; diff --git a/api_docs/maps.devdocs.json b/api_docs/maps.devdocs.json index 11393b4a0aebd..8c3435ae4277a 100644 --- a/api_docs/maps.devdocs.json +++ b/api_docs/maps.devdocs.json @@ -4383,6 +4383,18 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "maps", + "id": "def-common.LABEL_POSITIONS", + "type": "Enum", + "tags": [], + "label": "LABEL_POSITIONS", + "description": [], + "path": "x-pack/plugins/maps/common/constants.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "maps", "id": "def-common.LAYER_TYPE", diff --git a/api_docs/maps.mdx b/api_docs/maps.mdx index 0b664142f6227..80993edede368 100644 --- a/api_docs/maps.mdx +++ b/api_docs/maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/maps title: "maps" image: https://source.unsplash.com/400x175/?github description: API docs for the maps plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'maps'] --- import mapsObj from './maps.devdocs.json'; @@ -21,7 +21,7 @@ Contact [GIS](https://github.com/orgs/elastic/teams/kibana-gis) for questions re | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 266 | 0 | 265 | 26 | +| 267 | 0 | 266 | 26 | ## Client diff --git a/api_docs/maps_ems.mdx b/api_docs/maps_ems.mdx index 012c739baaa13..5be68c6879be7 100644 --- a/api_docs/maps_ems.mdx +++ b/api_docs/maps_ems.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mapsEms title: "mapsEms" image: https://source.unsplash.com/400x175/?github description: API docs for the mapsEms plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] --- import mapsEmsObj from './maps_ems.devdocs.json'; diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index ad29d012503d9..ef1f1b0dbce34 100644 --- a/api_docs/ml.mdx +++ b/api_docs/ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ml title: "ml" image: https://source.unsplash.com/400x175/?github description: API docs for the ml plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] --- import mlObj from './ml.devdocs.json'; diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx index bacd76dff7a92..9c42e650aab56 100644 --- a/api_docs/monitoring.mdx +++ b/api_docs/monitoring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoring title: "monitoring" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoring plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoring'] --- import monitoringObj from './monitoring.devdocs.json'; diff --git a/api_docs/monitoring_collection.mdx b/api_docs/monitoring_collection.mdx index 41dc108bee254..e9abee4fed66b 100644 --- a/api_docs/monitoring_collection.mdx +++ b/api_docs/monitoring_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoringCollection title: "monitoringCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoringCollection plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoringCollection'] --- import monitoringCollectionObj from './monitoring_collection.devdocs.json'; diff --git a/api_docs/navigation.mdx b/api_docs/navigation.mdx index f9ad1fa550094..a5e6200d895ed 100644 --- a/api_docs/navigation.mdx +++ b/api_docs/navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/navigation title: "navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the navigation plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'navigation'] --- import navigationObj from './navigation.devdocs.json'; diff --git a/api_docs/newsfeed.mdx b/api_docs/newsfeed.mdx index 709aba413a92d..91ee64bf182ec 100644 --- a/api_docs/newsfeed.mdx +++ b/api_docs/newsfeed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/newsfeed title: "newsfeed" image: https://source.unsplash.com/400x175/?github description: API docs for the newsfeed plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] --- import newsfeedObj from './newsfeed.devdocs.json'; diff --git a/api_docs/notifications.mdx b/api_docs/notifications.mdx index bf2f0f11faa8f..091c842d07764 100644 --- a/api_docs/notifications.mdx +++ b/api_docs/notifications.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/notifications title: "notifications" image: https://source.unsplash.com/400x175/?github description: API docs for the notifications plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'notifications'] --- import notificationsObj from './notifications.devdocs.json'; diff --git a/api_docs/observability.devdocs.json b/api_docs/observability.devdocs.json index f2c2af16ead20..19c96036d7b15 100644 --- a/api_docs/observability.devdocs.json +++ b/api_docs/observability.devdocs.json @@ -7935,7 +7935,7 @@ "section": "def-server.ObservabilityRouteHandlerResources", "text": "ObservabilityRouteHandlerResources" }, - ", { page: number; per_page: number; total: number; results: { id: string; name: string; description: string; indicator: { type: \"sli.apm.transaction_duration\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; 'threshold.us': number; }; } | { type: \"sli.apm.transaction_error_rate\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; } & { good_status_codes?: (\"2xx\" | \"3xx\" | \"4xx\" | \"5xx\")[] | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; query_filter: string; numerator: string; denominator: string; }; }; time_window: { duration: string; is_rolling: boolean; } | { duration: string; calendar: { start_time: string; }; }; budgeting_method: string; objective: { target: number; } & { timeslice_target?: number | undefined; timeslice_window?: string | undefined; }; summary: { sli_value: number; error_budget: { initial: number; consumed: number; remaining: number; is_estimated: boolean; }; }; revision: number; created_at: string; updated_at: string; }[]; }, ", + ", { page: number; per_page: number; total: number; results: { id: string; name: string; description: string; indicator: { type: \"sli.apm.transaction_duration\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; 'threshold.us': number; }; } | { type: \"sli.apm.transaction_error_rate\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; } & { good_status_codes?: (\"2xx\" | \"3xx\" | \"4xx\" | \"5xx\")[] | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; filter: string; good: string; total: string; }; }; time_window: { duration: string; is_rolling: boolean; } | { duration: string; calendar: { start_time: string; }; }; budgeting_method: string; objective: { target: number; } & { timeslice_target?: number | undefined; timeslice_window?: string | undefined; }; summary: { sli_value: number; error_budget: { initial: number; consumed: number; remaining: number; is_estimated: boolean; }; }; settings: { timestamp_field: string; sync_delay: string; frequency: string; }; revision: number; created_at: string; updated_at: string; }[]; }, ", { "pluginId": "observability", "scope": "server", @@ -7995,7 +7995,7 @@ "section": "def-server.ObservabilityRouteHandlerResources", "text": "ObservabilityRouteHandlerResources" }, - ", { id: string; name: string; description: string; indicator: { type: \"sli.apm.transaction_duration\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; 'threshold.us': number; }; } | { type: \"sli.apm.transaction_error_rate\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; } & { good_status_codes?: (\"2xx\" | \"3xx\" | \"4xx\" | \"5xx\")[] | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; query_filter: string; numerator: string; denominator: string; }; }; time_window: { duration: string; is_rolling: boolean; } | { duration: string; calendar: { start_time: string; }; }; budgeting_method: string; objective: { target: number; } & { timeslice_target?: number | undefined; timeslice_window?: string | undefined; }; summary: { sli_value: number; error_budget: { initial: number; consumed: number; remaining: number; is_estimated: boolean; }; }; revision: number; created_at: string; updated_at: string; }, ", + ", { id: string; name: string; description: string; indicator: { type: \"sli.apm.transaction_duration\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; 'threshold.us': number; }; } | { type: \"sli.apm.transaction_error_rate\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; } & { good_status_codes?: (\"2xx\" | \"3xx\" | \"4xx\" | \"5xx\")[] | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; filter: string; good: string; total: string; }; }; time_window: { duration: string; is_rolling: boolean; } | { duration: string; calendar: { start_time: string; }; }; budgeting_method: string; objective: { target: number; } & { timeslice_target?: number | undefined; timeslice_window?: string | undefined; }; settings: { timestamp_field: string; sync_delay: string; frequency: string; }; summary: { sli_value: number; error_budget: { initial: number; consumed: number; remaining: number; is_estimated: boolean; }; }; revision: number; created_at: string; updated_at: string; }, ", { "pluginId": "observability", "scope": "server", @@ -8111,11 +8111,11 @@ "TypeC", "<{ index: ", "StringC", - "; query_filter: ", + "; filter: ", "StringC", - "; numerator: ", + "; good: ", "StringC", - "; denominator: ", + "; total: ", "StringC", "; }>; }>]>; time_window: ", "UnionC", @@ -8157,7 +8157,19 @@ "Type", "<", "Duration", - ", string, unknown>; }>]>; }>; }>, ", + ", string, unknown>; }>]>; settings: ", + "TypeC", + "<{ timestamp_field: ", + "StringC", + "; sync_delay: ", + "Type", + "<", + "Duration", + ", string, unknown>; frequency: ", + "Type", + "<", + "Duration", + ", string, unknown>; }>; }>; }>, ", { "pluginId": "observability", "scope": "server", @@ -8165,7 +8177,7 @@ "section": "def-server.ObservabilityRouteHandlerResources", "text": "ObservabilityRouteHandlerResources" }, - ", { id: string; name: string; description: string; indicator: { type: \"sli.apm.transaction_duration\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; 'threshold.us': number; }; } | { type: \"sli.apm.transaction_error_rate\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; } & { good_status_codes?: (\"2xx\" | \"3xx\" | \"4xx\" | \"5xx\")[] | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; query_filter: string; numerator: string; denominator: string; }; }; time_window: { duration: string; is_rolling: boolean; } | { duration: string; calendar: { start_time: string; }; }; budgeting_method: string; objective: { target: number; } & { timeslice_target?: number | undefined; timeslice_window?: string | undefined; }; created_at: string; updated_at: string; }, ", + ", { id: string; name: string; description: string; indicator: { type: \"sli.apm.transaction_duration\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; 'threshold.us': number; }; } | { type: \"sli.apm.transaction_error_rate\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; } & { good_status_codes?: (\"2xx\" | \"3xx\" | \"4xx\" | \"5xx\")[] | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; filter: string; good: string; total: string; }; }; time_window: { duration: string; is_rolling: boolean; } | { duration: string; calendar: { start_time: string; }; }; budgeting_method: string; objective: { target: number; } & { timeslice_target?: number | undefined; timeslice_window?: string | undefined; }; settings: { timestamp_field: string; sync_delay: string; frequency: string; }; created_at: string; updated_at: string; }, ", { "pluginId": "observability", "scope": "server", @@ -8184,6 +8196,8 @@ "<\"POST /api/observability/slos\", ", "TypeC", "<{ body: ", + "IntersectionC", + "<[", "TypeC", "<{ name: ", "StringC", @@ -8277,11 +8291,11 @@ "TypeC", "<{ index: ", "StringC", - "; query_filter: ", + "; filter: ", "StringC", - "; numerator: ", + "; good: ", "StringC", - "; denominator: ", + "; total: ", "StringC", "; }>; }>]>; time_window: ", "UnionC", @@ -8323,7 +8337,21 @@ "Type", "<", "Duration", - ", string, unknown>; }>]>; }>; }>, ", + ", string, unknown>; }>]>; }>, ", + "PartialC", + "<{ settings: ", + "PartialC", + "<{ timestamp_field: ", + "StringC", + "; sync_delay: ", + "Type", + "<", + "Duration", + ", string, unknown>; frequency: ", + "Type", + "<", + "Duration", + ", string, unknown>; }>; }>]>; }>, ", { "pluginId": "observability", "scope": "server", @@ -8439,7 +8467,7 @@ "section": "def-server.ObservabilityRouteHandlerResources", "text": "ObservabilityRouteHandlerResources" }, - ", { page: number; per_page: number; total: number; results: { id: string; name: string; description: string; indicator: { type: \"sli.apm.transaction_duration\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; 'threshold.us': number; }; } | { type: \"sli.apm.transaction_error_rate\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; } & { good_status_codes?: (\"2xx\" | \"3xx\" | \"4xx\" | \"5xx\")[] | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; query_filter: string; numerator: string; denominator: string; }; }; time_window: { duration: string; is_rolling: boolean; } | { duration: string; calendar: { start_time: string; }; }; budgeting_method: string; objective: { target: number; } & { timeslice_target?: number | undefined; timeslice_window?: string | undefined; }; summary: { sli_value: number; error_budget: { initial: number; consumed: number; remaining: number; is_estimated: boolean; }; }; revision: number; created_at: string; updated_at: string; }[]; }, ", + ", { page: number; per_page: number; total: number; results: { id: string; name: string; description: string; indicator: { type: \"sli.apm.transaction_duration\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; 'threshold.us': number; }; } | { type: \"sli.apm.transaction_error_rate\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; } & { good_status_codes?: (\"2xx\" | \"3xx\" | \"4xx\" | \"5xx\")[] | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; filter: string; good: string; total: string; }; }; time_window: { duration: string; is_rolling: boolean; } | { duration: string; calendar: { start_time: string; }; }; budgeting_method: string; objective: { target: number; } & { timeslice_target?: number | undefined; timeslice_window?: string | undefined; }; summary: { sli_value: number; error_budget: { initial: number; consumed: number; remaining: number; is_estimated: boolean; }; }; settings: { timestamp_field: string; sync_delay: string; frequency: string; }; revision: number; created_at: string; updated_at: string; }[]; }, ", { "pluginId": "observability", "scope": "server", @@ -8499,7 +8527,7 @@ "section": "def-server.ObservabilityRouteHandlerResources", "text": "ObservabilityRouteHandlerResources" }, - ", { id: string; name: string; description: string; indicator: { type: \"sli.apm.transaction_duration\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; 'threshold.us': number; }; } | { type: \"sli.apm.transaction_error_rate\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; } & { good_status_codes?: (\"2xx\" | \"3xx\" | \"4xx\" | \"5xx\")[] | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; query_filter: string; numerator: string; denominator: string; }; }; time_window: { duration: string; is_rolling: boolean; } | { duration: string; calendar: { start_time: string; }; }; budgeting_method: string; objective: { target: number; } & { timeslice_target?: number | undefined; timeslice_window?: string | undefined; }; summary: { sli_value: number; error_budget: { initial: number; consumed: number; remaining: number; is_estimated: boolean; }; }; revision: number; created_at: string; updated_at: string; }, ", + ", { id: string; name: string; description: string; indicator: { type: \"sli.apm.transaction_duration\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; 'threshold.us': number; }; } | { type: \"sli.apm.transaction_error_rate\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; } & { good_status_codes?: (\"2xx\" | \"3xx\" | \"4xx\" | \"5xx\")[] | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; filter: string; good: string; total: string; }; }; time_window: { duration: string; is_rolling: boolean; } | { duration: string; calendar: { start_time: string; }; }; budgeting_method: string; objective: { target: number; } & { timeslice_target?: number | undefined; timeslice_window?: string | undefined; }; settings: { timestamp_field: string; sync_delay: string; frequency: string; }; summary: { sli_value: number; error_budget: { initial: number; consumed: number; remaining: number; is_estimated: boolean; }; }; revision: number; created_at: string; updated_at: string; }, ", { "pluginId": "observability", "scope": "server", @@ -8615,11 +8643,11 @@ "TypeC", "<{ index: ", "StringC", - "; query_filter: ", + "; filter: ", "StringC", - "; numerator: ", + "; good: ", "StringC", - "; denominator: ", + "; total: ", "StringC", "; }>; }>]>; time_window: ", "UnionC", @@ -8661,7 +8689,19 @@ "Type", "<", "Duration", - ", string, unknown>; }>]>; }>; }>, ", + ", string, unknown>; }>]>; settings: ", + "TypeC", + "<{ timestamp_field: ", + "StringC", + "; sync_delay: ", + "Type", + "<", + "Duration", + ", string, unknown>; frequency: ", + "Type", + "<", + "Duration", + ", string, unknown>; }>; }>; }>, ", { "pluginId": "observability", "scope": "server", @@ -8669,7 +8709,7 @@ "section": "def-server.ObservabilityRouteHandlerResources", "text": "ObservabilityRouteHandlerResources" }, - ", { id: string; name: string; description: string; indicator: { type: \"sli.apm.transaction_duration\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; 'threshold.us': number; }; } | { type: \"sli.apm.transaction_error_rate\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; } & { good_status_codes?: (\"2xx\" | \"3xx\" | \"4xx\" | \"5xx\")[] | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; query_filter: string; numerator: string; denominator: string; }; }; time_window: { duration: string; is_rolling: boolean; } | { duration: string; calendar: { start_time: string; }; }; budgeting_method: string; objective: { target: number; } & { timeslice_target?: number | undefined; timeslice_window?: string | undefined; }; created_at: string; updated_at: string; }, ", + ", { id: string; name: string; description: string; indicator: { type: \"sli.apm.transaction_duration\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; 'threshold.us': number; }; } | { type: \"sli.apm.transaction_error_rate\"; params: { environment: string; service: string; transaction_type: string; transaction_name: string; } & { good_status_codes?: (\"2xx\" | \"3xx\" | \"4xx\" | \"5xx\")[] | undefined; }; } | { type: \"sli.kql.custom\"; params: { index: string; filter: string; good: string; total: string; }; }; time_window: { duration: string; is_rolling: boolean; } | { duration: string; calendar: { start_time: string; }; }; budgeting_method: string; objective: { target: number; } & { timeslice_target?: number | undefined; timeslice_window?: string | undefined; }; settings: { timestamp_field: string; sync_delay: string; frequency: string; }; created_at: string; updated_at: string; }, ", { "pluginId": "observability", "scope": "server", @@ -8688,6 +8728,8 @@ "<\"POST /api/observability/slos\", ", "TypeC", "<{ body: ", + "IntersectionC", + "<[", "TypeC", "<{ name: ", "StringC", @@ -8781,11 +8823,11 @@ "TypeC", "<{ index: ", "StringC", - "; query_filter: ", + "; filter: ", "StringC", - "; numerator: ", + "; good: ", "StringC", - "; denominator: ", + "; total: ", "StringC", "; }>; }>]>; time_window: ", "UnionC", @@ -8827,7 +8869,21 @@ "Type", "<", "Duration", - ", string, unknown>; }>]>; }>; }>, ", + ", string, unknown>; }>]>; }>, ", + "PartialC", + "<{ settings: ", + "PartialC", + "<{ timestamp_field: ", + "StringC", + "; sync_delay: ", + "Type", + "<", + "Duration", + ", string, unknown>; frequency: ", + "Type", + "<", + "Duration", + ", string, unknown>; }>; }>]>; }>, ", { "pluginId": "observability", "scope": "server", @@ -9642,124 +9698,6 @@ } ] }, - { - "parentPluginId": "observability", - "id": "def-server.uiSettings.enableServiceMetrics", - "type": "Object", - "tags": [], - "label": "[enableServiceMetrics]", - "description": [], - "path": "x-pack/plugins/observability/server/ui_settings.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "observability", - "id": "def-server.uiSettings.enableServiceMetrics.category", - "type": "Array", - "tags": [], - "label": "category", - "description": [], - "signature": [ - "string[]" - ], - "path": "x-pack/plugins/observability/server/ui_settings.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "observability", - "id": "def-server.uiSettings.enableServiceMetrics.name", - "type": "Any", - "tags": [], - "label": "name", - "description": [], - "signature": [ - "any" - ], - "path": "x-pack/plugins/observability/server/ui_settings.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "observability", - "id": "def-server.uiSettings.enableServiceMetrics.value", - "type": "boolean", - "tags": [], - "label": "value", - "description": [], - "signature": [ - "false" - ], - "path": "x-pack/plugins/observability/server/ui_settings.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "observability", - "id": "def-server.uiSettings.enableServiceMetrics.description", - "type": "Any", - "tags": [], - "label": "description", - "description": [], - "signature": [ - "any" - ], - "path": "x-pack/plugins/observability/server/ui_settings.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "observability", - "id": "def-server.uiSettings.enableServiceMetrics.schema", - "type": "Object", - "tags": [], - "label": "schema", - "description": [], - "signature": [ - { - "pluginId": "@kbn/config-schema", - "scope": "server", - "docId": "kibKbnConfigSchemaPluginApi", - "section": "def-server.Type", - "text": "Type" - }, - "" - ], - "path": "x-pack/plugins/observability/server/ui_settings.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "observability", - "id": "def-server.uiSettings.enableServiceMetrics.requiresPageReload", - "type": "boolean", - "tags": [], - "label": "requiresPageReload", - "description": [], - "signature": [ - "true" - ], - "path": "x-pack/plugins/observability/server/ui_settings.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "observability", - "id": "def-server.uiSettings.enableServiceMetrics.showInLabs", - "type": "boolean", - "tags": [], - "label": "showInLabs", - "description": [], - "signature": [ - "true" - ], - "path": "x-pack/plugins/observability/server/ui_settings.ts", - "deprecated": false, - "trackAdoption": false - } - ] - }, { "parentPluginId": "observability", "id": "def-server.uiSettings.apmServiceInventoryOptimizedSorting", @@ -10193,7 +10131,7 @@ "label": "value", "description": [], "signature": [ - "false" + "true" ], "path": "x-pack/plugins/observability/server/ui_settings.ts", "deprecated": false, @@ -10235,7 +10173,7 @@ "label": "showInLabs", "description": [], "signature": [ - "true" + "false" ], "path": "x-pack/plugins/observability/server/ui_settings.ts", "deprecated": false, @@ -11609,21 +11547,6 @@ "trackAdoption": false, "initialIsOpen": false }, - { - "parentPluginId": "observability", - "id": "def-common.enableServiceMetrics", - "type": "string", - "tags": [], - "label": "enableServiceMetrics", - "description": [], - "signature": [ - "\"observability:apmEnableServiceMetrics\"" - ], - "path": "x-pack/plugins/observability/common/ui_settings_keys.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, { "parentPluginId": "observability", "id": "def-common.maxSuggestions", diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index 097c446cdfa53..97e84fcee124c 100644 --- a/api_docs/observability.mdx +++ b/api_docs/observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observability title: "observability" image: https://source.unsplash.com/400x175/?github description: API docs for the observability plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; @@ -21,7 +21,7 @@ Contact [Observability UI](https://github.com/orgs/elastic/teams/observability-u | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 569 | 42 | 566 | 31 | +| 560 | 40 | 557 | 31 | ## Client diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index 465f09cdb2249..2e8395d53bf67 100644 --- a/api_docs/osquery.mdx +++ b/api_docs/osquery.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/osquery title: "osquery" image: https://source.unsplash.com/400x175/?github description: API docs for the osquery plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] --- import osqueryObj from './osquery.devdocs.json'; diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index 0e3f87851d36d..754f4b00ebb73 100644 --- a/api_docs/plugin_directory.mdx +++ b/api_docs/plugin_directory.mdx @@ -7,7 +7,7 @@ id: kibDevDocsPluginDirectory slug: /kibana-dev-docs/api-meta/plugin-api-directory title: Directory description: Directory of public APIs available through plugins or packages. -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -15,13 +15,13 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Count | Plugins or Packages with a
public API | Number of teams | |--------------|----------|------------------------| -| 520 | 435 | 40 | +| 525 | 437 | 40 | ### Public API health stats | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 33770 | 518 | 23484 | 1136 | +| 33742 | 517 | 23484 | 1149 | ## Plugin Directory @@ -75,7 +75,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-visualizations) | Adds a `metric` renderer and function to the expression plugin. The renderer will display the `legacy metric` chart. | 51 | 0 | 51 | 2 | | | [Kibana Presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds 'metric' function and renderer to expressions | 32 | 0 | 27 | 0 | | | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-visualizations) | Adds a `metric` renderer and function to the expression plugin. The renderer will display the `metric` chart. | 63 | 0 | 63 | 2 | -| | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-visualizations) | Expression Partition Visualization plugin adds a `partitionVis` renderer and `pieVis`, `mosaicVis`, `treemapVis`, `waffleVis` functions to the expression plugin. The renderer will display the `pie`, `waffle`, `treemap` and `mosaic` charts. | 71 | 0 | 71 | 2 | +| | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-visualizations) | Expression Partition Visualization plugin adds a `partitionVis` renderer and `pieVis`, `mosaicVis`, `treemapVis`, `waffleVis` functions to the expression plugin. The renderer will display the `pie`, `waffle`, `treemap` and `mosaic` charts. | 72 | 0 | 72 | 2 | | | [Kibana Presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds 'repeatImage' function and renderer to expressions | 32 | 0 | 32 | 0 | | | [Kibana Presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds 'revealImage' function and renderer to expressions | 14 | 0 | 14 | 3 | | | [Kibana Presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds 'shape' function and renderer to expressions | 148 | 0 | 146 | 0 | @@ -85,7 +85,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 227 | 0 | 96 | 2 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | Index pattern fields and ambiguous values formatters | 288 | 26 | 249 | 3 | | | [Machine Learning UI](https://github.com/orgs/elastic/teams/ml-ui) | The file upload plugin contains components and services for uploading a file, analyzing its data, and then importing the data into an Elasticsearch index. Supported file types include CSV, TSV, newline-delimited JSON and GeoJSON. | 62 | 0 | 62 | 2 | -| | [@elastic/kibana-app-services](https://github.com/orgs/elastic/teams/team:AppServicesUx) | File upload, download, sharing, and serving over HTTP implementation in Kibana. | 287 | 0 | 50 | 3 | +| | [@elastic/kibana-app-services](https://github.com/orgs/elastic/teams/team:AppServicesUx) | File upload, download, sharing, and serving over HTTP implementation in Kibana. | 252 | 1 | 45 | 5 | | | [@elastic/kibana-global-experience](https://github.com/orgs/elastic/teams/@elastic/kibana-global-experience) | Simple UI for managing files in Kibana | 2 | 1 | 2 | 0 | | | [Fleet](https://github.com/orgs/elastic/teams/fleet) | - | 1025 | 3 | 920 | 19 | | | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 68 | 0 | 14 | 5 | @@ -107,14 +107,14 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | kibanaUsageCollection | [Kibana Telemetry](https://github.com/orgs/elastic/teams/kibana-telemetry) | - | 0 | 0 | 0 | 0 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | - | 624 | 3 | 424 | 8 | | | [Security Team](https://github.com/orgs/elastic/teams/security-team) | - | 3 | 0 | 3 | 1 | -| | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-visualizations) | Visualization editor allowing to quickly and easily configure compelling visualizations to use on dashboards and canvas workpads. Exposes components to embed visualizations and link into the Lens editor from within other apps in Kibana. | 685 | 0 | 590 | 48 | +| | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-visualizations) | Visualization editor allowing to quickly and easily configure compelling visualizations to use on dashboards and canvas workpads. Exposes components to embed visualizations and link into the Lens editor from within other apps in Kibana. | 689 | 0 | 593 | 48 | | | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 8 | 0 | 8 | 0 | | | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 3 | 0 | 3 | 0 | | | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 117 | 0 | 42 | 10 | | | [Security detections response](https://github.com/orgs/elastic/teams/security-detections-response) | - | 206 | 0 | 93 | 51 | | logstash | [Logstash](https://github.com/orgs/elastic/teams/logstash) | - | 0 | 0 | 0 | 0 | | | [Vis Editors](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 41 | 0 | 41 | 6 | -| | [GIS](https://github.com/orgs/elastic/teams/kibana-gis) | - | 266 | 0 | 265 | 26 | +| | [GIS](https://github.com/orgs/elastic/teams/kibana-gis) | - | 267 | 0 | 266 | 26 | | | [GIS](https://github.com/orgs/elastic/teams/kibana-gis) | - | 67 | 0 | 67 | 0 | | | [Machine Learning UI](https://github.com/orgs/elastic/teams/ml-ui) | This plugin provides access to the machine learning features provided by Elastic. | 254 | 9 | 78 | 40 | | | [Stack Monitoring](https://github.com/orgs/elastic/teams/stack-monitoring-ui) | - | 15 | 3 | 13 | 1 | @@ -122,7 +122,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | - | 34 | 0 | 34 | 2 | | | [Kibana Core](https://github.com/orgs/elastic/teams/kibana-core) | - | 17 | 0 | 17 | 0 | | | [App Services](https://github.com/orgs/elastic/teams/kibana-app-services) | - | 2 | 0 | 2 | 1 | -| | [Observability UI](https://github.com/orgs/elastic/teams/observability-ui) | - | 569 | 42 | 566 | 31 | +| | [Observability UI](https://github.com/orgs/elastic/teams/observability-ui) | - | 560 | 40 | 557 | 31 | | | [Security asset management](https://github.com/orgs/elastic/teams/security-asset-management) | - | 21 | 0 | 21 | 5 | | painlessLab | [Stack Management](https://github.com/orgs/elastic/teams/kibana-stack-management) | - | 0 | 0 | 0 | 0 | | | [Kibana Presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | The Presentation Utility Plugin is a set of common, shared components and toolkits for solutions within the Presentation space, (e.g. Dashboards, Canvas). | 227 | 7 | 171 | 12 | @@ -397,7 +397,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | Kibana Core | - | 61 | 0 | 1 | 0 | | | [Owner missing] | - | 43 | 0 | 36 | 0 | | | Visualizations | - | 52 | 12 | 41 | 0 | -| | [Owner missing] | - | 20 | 0 | 20 | 2 | +| | [Owner missing] | - | 22 | 0 | 22 | 3 | | | [Owner missing] | - | 13 | 0 | 13 | 0 | | | [Owner missing] | - | 64 | 0 | 59 | 5 | | | [Owner missing] | - | 96 | 0 | 95 | 0 | @@ -445,9 +445,11 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [Owner missing] | - | 25 | 0 | 8 | 0 | | | [Owner missing] | - | 10 | 0 | 4 | 0 | | | [Owner missing] | - | 32 | 0 | 28 | 0 | +| | [Owner missing] | - | 5 | 0 | 4 | 0 | | | [Owner missing] | - | 3 | 0 | 2 | 0 | | | [Owner missing] | - | 2 | 0 | 2 | 0 | -| | [Owner missing] | - | 15 | 0 | 13 | 0 | +| | [Owner missing] | - | 1 | 0 | 1 | 0 | +| | [Owner missing] | - | 17 | 0 | 15 | 0 | | | [Owner missing] | - | 17 | 0 | 9 | 0 | | | [Owner missing] | - | 10 | 0 | 9 | 0 | | | [Owner missing] | - | 2 | 0 | 2 | 1 | diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index 992c2f38ef4d5..5b1ff313164dd 100644 --- a/api_docs/presentation_util.mdx +++ b/api_docs/presentation_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationUtil title: "presentationUtil" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationUtil plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationUtil'] --- import presentationUtilObj from './presentation_util.devdocs.json'; diff --git a/api_docs/profiling.mdx b/api_docs/profiling.mdx index 1e782ffe89123..7fbe277caedcd 100644 --- a/api_docs/profiling.mdx +++ b/api_docs/profiling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profiling title: "profiling" image: https://source.unsplash.com/400x175/?github description: API docs for the profiling plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profiling'] --- import profilingObj from './profiling.devdocs.json'; diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx index ceb8af40ebf2b..2d1c53383f563 100644 --- a/api_docs/remote_clusters.mdx +++ b/api_docs/remote_clusters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/remoteClusters title: "remoteClusters" image: https://source.unsplash.com/400x175/?github description: API docs for the remoteClusters plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'remoteClusters'] --- import remoteClustersObj from './remote_clusters.devdocs.json'; diff --git a/api_docs/reporting.mdx b/api_docs/reporting.mdx index 41073417142c6..55188386ab829 100644 --- a/api_docs/reporting.mdx +++ b/api_docs/reporting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/reporting title: "reporting" image: https://source.unsplash.com/400x175/?github description: API docs for the reporting plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'reporting'] --- import reportingObj from './reporting.devdocs.json'; diff --git a/api_docs/rollup.mdx b/api_docs/rollup.mdx index 910acecc27fe3..b17a438437418 100644 --- a/api_docs/rollup.mdx +++ b/api_docs/rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/rollup title: "rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the rollup plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'rollup'] --- import rollupObj from './rollup.devdocs.json'; diff --git a/api_docs/rule_registry.mdx b/api_docs/rule_registry.mdx index d977c76b72971..2a9c42ee79249 100644 --- a/api_docs/rule_registry.mdx +++ b/api_docs/rule_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ruleRegistry title: "ruleRegistry" image: https://source.unsplash.com/400x175/?github description: API docs for the ruleRegistry plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ruleRegistry'] --- import ruleRegistryObj from './rule_registry.devdocs.json'; diff --git a/api_docs/runtime_fields.mdx b/api_docs/runtime_fields.mdx index 983cba71020b0..b15f458b587d5 100644 --- a/api_docs/runtime_fields.mdx +++ b/api_docs/runtime_fields.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/runtimeFields title: "runtimeFields" image: https://source.unsplash.com/400x175/?github description: API docs for the runtimeFields plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'runtimeFields'] --- import runtimeFieldsObj from './runtime_fields.devdocs.json'; diff --git a/api_docs/saved_objects.mdx b/api_docs/saved_objects.mdx index 4339f937b58f1..7ce654f7e7f1d 100644 --- a/api_docs/saved_objects.mdx +++ b/api_docs/saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjects title: "savedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjects plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjects'] --- import savedObjectsObj from './saved_objects.devdocs.json'; diff --git a/api_docs/saved_objects_finder.mdx b/api_docs/saved_objects_finder.mdx index 3e4117eb6d957..36b0e9eba8369 100644 --- a/api_docs/saved_objects_finder.mdx +++ b/api_docs/saved_objects_finder.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsFinder title: "savedObjectsFinder" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsFinder plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsFinder'] --- import savedObjectsFinderObj from './saved_objects_finder.devdocs.json'; diff --git a/api_docs/saved_objects_management.mdx b/api_docs/saved_objects_management.mdx index 35685af811fda..b43977af42ad4 100644 --- a/api_docs/saved_objects_management.mdx +++ b/api_docs/saved_objects_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsManagement title: "savedObjectsManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsManagement plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsManagement'] --- import savedObjectsManagementObj from './saved_objects_management.devdocs.json'; diff --git a/api_docs/saved_objects_tagging.mdx b/api_docs/saved_objects_tagging.mdx index cd73a126d89e4..c8ac0b5901f4f 100644 --- a/api_docs/saved_objects_tagging.mdx +++ b/api_docs/saved_objects_tagging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTagging title: "savedObjectsTagging" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTagging plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTagging'] --- import savedObjectsTaggingObj from './saved_objects_tagging.devdocs.json'; diff --git a/api_docs/saved_objects_tagging_oss.mdx b/api_docs/saved_objects_tagging_oss.mdx index 0c1f90beaae99..a3f9f2518993a 100644 --- a/api_docs/saved_objects_tagging_oss.mdx +++ b/api_docs/saved_objects_tagging_oss.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTaggingOss title: "savedObjectsTaggingOss" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTaggingOss plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTaggingOss'] --- import savedObjectsTaggingOssObj from './saved_objects_tagging_oss.devdocs.json'; diff --git a/api_docs/saved_search.mdx b/api_docs/saved_search.mdx index 631442e3db809..2d06ff0cc0159 100644 --- a/api_docs/saved_search.mdx +++ b/api_docs/saved_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedSearch title: "savedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the savedSearch plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedSearch'] --- import savedSearchObj from './saved_search.devdocs.json'; diff --git a/api_docs/screenshot_mode.mdx b/api_docs/screenshot_mode.mdx index 81960e7cf92cf..a4f8b2b3c6d46 100644 --- a/api_docs/screenshot_mode.mdx +++ b/api_docs/screenshot_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotMode title: "screenshotMode" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotMode plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotMode'] --- import screenshotModeObj from './screenshot_mode.devdocs.json'; diff --git a/api_docs/screenshotting.mdx b/api_docs/screenshotting.mdx index eee0d688596a1..374e195cb693d 100644 --- a/api_docs/screenshotting.mdx +++ b/api_docs/screenshotting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotting title: "screenshotting" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotting plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] --- import screenshottingObj from './screenshotting.devdocs.json'; diff --git a/api_docs/security.mdx b/api_docs/security.mdx index 73a7bf61b2509..d92c0c0942f59 100644 --- a/api_docs/security.mdx +++ b/api_docs/security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/security title: "security" image: https://source.unsplash.com/400x175/?github description: API docs for the security plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index fb525ed645566..ccf67b2b4ccc6 100644 --- a/api_docs/security_solution.mdx +++ b/api_docs/security_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolution title: "securitySolution" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolution plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.devdocs.json'; diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index 8315b96b4c61c..ebf727880333e 100644 --- a/api_docs/session_view.mdx +++ b/api_docs/session_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/sessionView title: "sessionView" image: https://source.unsplash.com/400x175/?github description: API docs for the sessionView plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'sessionView'] --- import sessionViewObj from './session_view.devdocs.json'; diff --git a/api_docs/share.mdx b/api_docs/share.mdx index f94528841588d..4450f09748a39 100644 --- a/api_docs/share.mdx +++ b/api_docs/share.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/share title: "share" image: https://source.unsplash.com/400x175/?github description: API docs for the share plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] --- import shareObj from './share.devdocs.json'; diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index e1777690bd5a0..e41b7c85d85a3 100644 --- a/api_docs/snapshot_restore.mdx +++ b/api_docs/snapshot_restore.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/snapshotRestore title: "snapshotRestore" image: https://source.unsplash.com/400x175/?github description: API docs for the snapshotRestore plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'snapshotRestore'] --- import snapshotRestoreObj from './snapshot_restore.devdocs.json'; diff --git a/api_docs/spaces.mdx b/api_docs/spaces.mdx index 77e12276279cb..9a61b88c4f17a 100644 --- a/api_docs/spaces.mdx +++ b/api_docs/spaces.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/spaces title: "spaces" image: https://source.unsplash.com/400x175/?github description: API docs for the spaces plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'spaces'] --- import spacesObj from './spaces.devdocs.json'; diff --git a/api_docs/stack_alerts.mdx b/api_docs/stack_alerts.mdx index 65a000b6be96e..b9982034319f4 100644 --- a/api_docs/stack_alerts.mdx +++ b/api_docs/stack_alerts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackAlerts title: "stackAlerts" image: https://source.unsplash.com/400x175/?github description: API docs for the stackAlerts plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackAlerts'] --- import stackAlertsObj from './stack_alerts.devdocs.json'; diff --git a/api_docs/stack_connectors.mdx b/api_docs/stack_connectors.mdx index d05297fc1ff3b..357e21d51918d 100644 --- a/api_docs/stack_connectors.mdx +++ b/api_docs/stack_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackConnectors title: "stackConnectors" image: https://source.unsplash.com/400x175/?github description: API docs for the stackConnectors plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackConnectors'] --- import stackConnectorsObj from './stack_connectors.devdocs.json'; diff --git a/api_docs/task_manager.mdx b/api_docs/task_manager.mdx index bf22216975436..f8bc4f6b38367 100644 --- a/api_docs/task_manager.mdx +++ b/api_docs/task_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/taskManager title: "taskManager" image: https://source.unsplash.com/400x175/?github description: API docs for the taskManager plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'taskManager'] --- import taskManagerObj from './task_manager.devdocs.json'; diff --git a/api_docs/telemetry.mdx b/api_docs/telemetry.mdx index ec21bd6362af1..db4f252748916 100644 --- a/api_docs/telemetry.mdx +++ b/api_docs/telemetry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetry title: "telemetry" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetry plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetry'] --- import telemetryObj from './telemetry.devdocs.json'; diff --git a/api_docs/telemetry_collection_manager.mdx b/api_docs/telemetry_collection_manager.mdx index b08f8dc9555ad..aad4b446add83 100644 --- a/api_docs/telemetry_collection_manager.mdx +++ b/api_docs/telemetry_collection_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionManager title: "telemetryCollectionManager" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionManager plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionManager'] --- import telemetryCollectionManagerObj from './telemetry_collection_manager.devdocs.json'; diff --git a/api_docs/telemetry_collection_xpack.mdx b/api_docs/telemetry_collection_xpack.mdx index 990e579ed2487..df37d2ca8f88d 100644 --- a/api_docs/telemetry_collection_xpack.mdx +++ b/api_docs/telemetry_collection_xpack.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionXpack title: "telemetryCollectionXpack" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionXpack plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionXpack'] --- import telemetryCollectionXpackObj from './telemetry_collection_xpack.devdocs.json'; diff --git a/api_docs/telemetry_management_section.mdx b/api_docs/telemetry_management_section.mdx index b62e059d549ae..c1f25181c1796 100644 --- a/api_docs/telemetry_management_section.mdx +++ b/api_docs/telemetry_management_section.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryManagementSection title: "telemetryManagementSection" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryManagementSection plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index 366d0a62cb80d..776e5c0e72b38 100644 --- a/api_docs/threat_intelligence.mdx +++ b/api_docs/threat_intelligence.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/threatIntelligence title: "threatIntelligence" image: https://source.unsplash.com/400x175/?github description: API docs for the threatIntelligence plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'threatIntelligence'] --- import threatIntelligenceObj from './threat_intelligence.devdocs.json'; diff --git a/api_docs/timelines.devdocs.json b/api_docs/timelines.devdocs.json index 8b99cb421526f..b6d49bf07cf6d 100644 --- a/api_docs/timelines.devdocs.json +++ b/api_docs/timelines.devdocs.json @@ -7325,7 +7325,7 @@ "section": "def-common.RowRenderer", "text": "RowRenderer" }, - "[] | undefined; setFlyoutAlert?: ((data: any) => void) | undefined; scopeId: string; truncate?: boolean | undefined; key?: string | undefined; closeCellPopover?: (() => void) | undefined; }" + "[] | undefined; setFlyoutAlert?: ((data: any) => void) | undefined; scopeId: string; truncate?: boolean | undefined; key?: string | undefined; closeCellPopover?: (() => void) | undefined; enableActions?: boolean | undefined; }" ], "path": "x-pack/plugins/timelines/common/types/timeline/cells/index.ts", "deprecated": false, diff --git a/api_docs/timelines.mdx b/api_docs/timelines.mdx index 4305ffc074574..76adee32fb41d 100644 --- a/api_docs/timelines.mdx +++ b/api_docs/timelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/timelines title: "timelines" image: https://source.unsplash.com/400x175/?github description: API docs for the timelines plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'timelines'] --- import timelinesObj from './timelines.devdocs.json'; diff --git a/api_docs/transform.mdx b/api_docs/transform.mdx index 2e03deaf490d5..c121726b66f19 100644 --- a/api_docs/transform.mdx +++ b/api_docs/transform.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/transform title: "transform" image: https://source.unsplash.com/400x175/?github description: API docs for the transform plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'transform'] --- import transformObj from './transform.devdocs.json'; diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx index 79125f066c25e..a92f5e3d3fef6 100644 --- a/api_docs/triggers_actions_ui.mdx +++ b/api_docs/triggers_actions_ui.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/triggersActionsUi title: "triggersActionsUi" image: https://source.unsplash.com/400x175/?github description: API docs for the triggersActionsUi plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'triggersActionsUi'] --- import triggersActionsUiObj from './triggers_actions_ui.devdocs.json'; diff --git a/api_docs/ui_actions.mdx b/api_docs/ui_actions.mdx index 07501695fdeaa..24df8b2bcf13f 100644 --- a/api_docs/ui_actions.mdx +++ b/api_docs/ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActions title: "uiActions" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActions plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActions'] --- import uiActionsObj from './ui_actions.devdocs.json'; diff --git a/api_docs/ui_actions_enhanced.mdx b/api_docs/ui_actions_enhanced.mdx index a1cf77e7a98cf..73b07ebb80b97 100644 --- a/api_docs/ui_actions_enhanced.mdx +++ b/api_docs/ui_actions_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActionsEnhanced title: "uiActionsEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActionsEnhanced plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] --- import uiActionsEnhancedObj from './ui_actions_enhanced.devdocs.json'; diff --git a/api_docs/unified_field_list.mdx b/api_docs/unified_field_list.mdx index 338709f15d5b3..f298a7412e924 100644 --- a/api_docs/unified_field_list.mdx +++ b/api_docs/unified_field_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedFieldList title: "unifiedFieldList" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedFieldList plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedFieldList'] --- import unifiedFieldListObj from './unified_field_list.devdocs.json'; diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx index 3f55a049b08df..b2b7d2bf81ca9 100644 --- a/api_docs/unified_histogram.mdx +++ b/api_docs/unified_histogram.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedHistogram title: "unifiedHistogram" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedHistogram plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedHistogram'] --- import unifiedHistogramObj from './unified_histogram.devdocs.json'; diff --git a/api_docs/unified_search.mdx b/api_docs/unified_search.mdx index 098818c4a2822..7227cea1640d2 100644 --- a/api_docs/unified_search.mdx +++ b/api_docs/unified_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch title: "unifiedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch'] --- import unifiedSearchObj from './unified_search.devdocs.json'; diff --git a/api_docs/unified_search_autocomplete.mdx b/api_docs/unified_search_autocomplete.mdx index 10fd7363546f8..a47c05596dfc8 100644 --- a/api_docs/unified_search_autocomplete.mdx +++ b/api_docs/unified_search_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch-autocomplete title: "unifiedSearch.autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch.autocomplete plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch.autocomplete'] --- import unifiedSearchAutocompleteObj from './unified_search_autocomplete.devdocs.json'; diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx index a047cdd6b0a78..80fa1cb2f2e16 100644 --- a/api_docs/url_forwarding.mdx +++ b/api_docs/url_forwarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/urlForwarding title: "urlForwarding" image: https://source.unsplash.com/400x175/?github description: API docs for the urlForwarding plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'urlForwarding'] --- import urlForwardingObj from './url_forwarding.devdocs.json'; diff --git a/api_docs/usage_collection.mdx b/api_docs/usage_collection.mdx index 00c3e8ba6631e..c9b69028434ca 100644 --- a/api_docs/usage_collection.mdx +++ b/api_docs/usage_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/usageCollection title: "usageCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the usageCollection plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'usageCollection'] --- import usageCollectionObj from './usage_collection.devdocs.json'; diff --git a/api_docs/ux.mdx b/api_docs/ux.mdx index 312c64e2c7895..207ae4f103499 100644 --- a/api_docs/ux.mdx +++ b/api_docs/ux.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ux title: "ux" image: https://source.unsplash.com/400x175/?github description: API docs for the ux plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ux'] --- import uxObj from './ux.devdocs.json'; diff --git a/api_docs/vis_default_editor.mdx b/api_docs/vis_default_editor.mdx index aea78ef415f37..1a12ee06a12ce 100644 --- a/api_docs/vis_default_editor.mdx +++ b/api_docs/vis_default_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visDefaultEditor title: "visDefaultEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the visDefaultEditor plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visDefaultEditor'] --- import visDefaultEditorObj from './vis_default_editor.devdocs.json'; diff --git a/api_docs/vis_type_gauge.mdx b/api_docs/vis_type_gauge.mdx index 05b7a0685e2da..1b3f1f24583d6 100644 --- a/api_docs/vis_type_gauge.mdx +++ b/api_docs/vis_type_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeGauge title: "visTypeGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeGauge plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeGauge'] --- import visTypeGaugeObj from './vis_type_gauge.devdocs.json'; diff --git a/api_docs/vis_type_heatmap.mdx b/api_docs/vis_type_heatmap.mdx index cce08ff6cdec1..3e35601fe91b3 100644 --- a/api_docs/vis_type_heatmap.mdx +++ b/api_docs/vis_type_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeHeatmap title: "visTypeHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeHeatmap plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeHeatmap'] --- import visTypeHeatmapObj from './vis_type_heatmap.devdocs.json'; diff --git a/api_docs/vis_type_pie.mdx b/api_docs/vis_type_pie.mdx index ed472c72b0e5c..b4b813cbe7cb0 100644 --- a/api_docs/vis_type_pie.mdx +++ b/api_docs/vis_type_pie.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypePie title: "visTypePie" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypePie plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypePie'] --- import visTypePieObj from './vis_type_pie.devdocs.json'; diff --git a/api_docs/vis_type_table.mdx b/api_docs/vis_type_table.mdx index d0a4905175d00..b1ff5d14a870b 100644 --- a/api_docs/vis_type_table.mdx +++ b/api_docs/vis_type_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTable title: "visTypeTable" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTable plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTable'] --- import visTypeTableObj from './vis_type_table.devdocs.json'; diff --git a/api_docs/vis_type_timelion.mdx b/api_docs/vis_type_timelion.mdx index 222f56432d03c..c946c90e6c6e3 100644 --- a/api_docs/vis_type_timelion.mdx +++ b/api_docs/vis_type_timelion.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimelion title: "visTypeTimelion" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimelion plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimelion'] --- import visTypeTimelionObj from './vis_type_timelion.devdocs.json'; diff --git a/api_docs/vis_type_timeseries.mdx b/api_docs/vis_type_timeseries.mdx index 96c355d356d9e..46987f77e617d 100644 --- a/api_docs/vis_type_timeseries.mdx +++ b/api_docs/vis_type_timeseries.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimeseries title: "visTypeTimeseries" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimeseries plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimeseries'] --- import visTypeTimeseriesObj from './vis_type_timeseries.devdocs.json'; diff --git a/api_docs/vis_type_vega.mdx b/api_docs/vis_type_vega.mdx index 68e8f4a3841c1..8b2ad9d36fab7 100644 --- a/api_docs/vis_type_vega.mdx +++ b/api_docs/vis_type_vega.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVega title: "visTypeVega" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVega plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVega'] --- import visTypeVegaObj from './vis_type_vega.devdocs.json'; diff --git a/api_docs/vis_type_vislib.mdx b/api_docs/vis_type_vislib.mdx index 59bff3f2f0c54..85446c3c112aa 100644 --- a/api_docs/vis_type_vislib.mdx +++ b/api_docs/vis_type_vislib.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVislib title: "visTypeVislib" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVislib plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVislib'] --- import visTypeVislibObj from './vis_type_vislib.devdocs.json'; diff --git a/api_docs/vis_type_xy.mdx b/api_docs/vis_type_xy.mdx index f3c2e3decda66..b5c1c789371ca 100644 --- a/api_docs/vis_type_xy.mdx +++ b/api_docs/vis_type_xy.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeXy title: "visTypeXy" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeXy plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] --- import visTypeXyObj from './vis_type_xy.devdocs.json'; diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index 83623b42885e7..0d114ff9aaa4c 100644 --- a/api_docs/visualizations.mdx +++ b/api_docs/visualizations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visualizations title: "visualizations" image: https://source.unsplash.com/400x175/?github description: API docs for the visualizations plugin -date: 2022-11-29 +date: 2022-12-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; diff --git a/docs/index-custom-title-page.html b/docs/index-custom-title-page.html index f605cfce3dee9..4c9fe7af5ba59 100644 --- a/docs/index-custom-title-page.html +++ b/docs/index-custom-title-page.html @@ -63,7 +63,7 @@

Bring your data to life

- What's new + What's new Release notes How-to videos

@@ -113,6 +113,29 @@

Get to know Kibana

+
+
+

+ + Get started +

+
+ +
+

diff --git a/examples/guided_onboarding_example/.i18nrc.json b/examples/guided_onboarding_example/.i18nrc.json index f6b9143021db1..bc262e538ba9e 100755 --- a/examples/guided_onboarding_example/.i18nrc.json +++ b/examples/guided_onboarding_example/.i18nrc.json @@ -3,5 +3,5 @@ "paths": { "guidedOnboardingExample": "." }, - "translations": ["translations/ja-JP.json"] + "translations": [] } diff --git a/examples/guided_onboarding_example/public/components/main.tsx b/examples/guided_onboarding_example/public/components/main.tsx index 0b8099595d5cd..b2c7723d320e1 100644 --- a/examples/guided_onboarding_example/public/components/main.tsx +++ b/examples/guided_onboarding_example/public/components/main.tsx @@ -27,7 +27,6 @@ import { } from '@elastic/eui'; import type { GuideState, GuideStepIds, GuideId, GuideStep } from '@kbn/guided-onboarding'; import type { GuidedOnboardingPluginStart } from '@kbn/guided-onboarding-plugin/public'; -import { guidesConfig } from '@kbn/guided-onboarding-plugin/public'; interface MainProps { guidedOnboarding: GuidedOnboardingPluginStart; @@ -75,7 +74,15 @@ export const Main = (props: MainProps) => { }; const updateGuideState = async () => { - const selectedGuideConfig = guidesConfig[selectedGuide!]; + if (!selectedGuide) { + return; + } + + const selectedGuideConfig = await guidedOnboardingApi?.getGuideConfig(selectedGuide); + + if (!selectedGuideConfig) { + return; + } const selectedStepIndex = selectedGuideConfig.steps.findIndex( (step) => step.id === selectedStep! ); @@ -199,7 +206,7 @@ export const Main = (props: MainProps) => { - {(Object.keys(guidesConfig) as GuideId[]).map((guideId) => { + {(['search', 'security', 'observability', 'testGuide'] as GuideId[]).map((guideId) => { const guideState = guidesState?.find((guide) => guide.guideId === guideId); return ( diff --git a/examples/screenshot_mode_example/.i18nrc.json b/examples/screenshot_mode_example/.i18nrc.json index cce0f6b34fea2..520a0f81bd832 100644 --- a/examples/screenshot_mode_example/.i18nrc.json +++ b/examples/screenshot_mode_example/.i18nrc.json @@ -3,5 +3,5 @@ "paths": { "screenshotModeExample": "." }, - "translations": ["translations/ja-JP.json"] + "translations": [] } diff --git a/package.json b/package.json index d36ebb51e2d9a..c69f2cc687cdc 100644 --- a/package.json +++ b/package.json @@ -356,6 +356,7 @@ "@kbn/osquery-io-ts-types": "link:bazel-bin/packages/kbn-osquery-io-ts-types", "@kbn/plugin-discovery": "link:bazel-bin/packages/kbn-plugin-discovery", "@kbn/react-field": "link:bazel-bin/packages/kbn-react-field", + "@kbn/rison": "link:bazel-bin/packages/kbn-rison", "@kbn/rule-data-utils": "link:bazel-bin/packages/kbn-rule-data-utils", "@kbn/safer-lodash-set": "link:bazel-bin/packages/kbn-safer-lodash-set", "@kbn/securitysolution-autocomplete": "link:bazel-bin/packages/kbn-securitysolution-autocomplete", @@ -418,6 +419,7 @@ "@kbn/shared-ux-prompt-no-data-views": "link:bazel-bin/packages/shared-ux/prompt/no_data_views/impl", "@kbn/shared-ux-prompt-no-data-views-mocks": "link:bazel-bin/packages/shared-ux/prompt/no_data_views/mocks", "@kbn/shared-ux-prompt-no-data-views-types": "link:bazel-bin/packages/shared-ux/prompt/no_data_views/types", + "@kbn/shared-ux-prompt-not-found": "link:bazel-bin/packages/shared-ux/prompt/not_found", "@kbn/shared-ux-router-mocks": "link:bazel-bin/packages/shared-ux/router/mocks", "@kbn/shared-ux-services": "link:bazel-bin/packages/kbn-shared-ux-services", "@kbn/shared-ux-storybook": "link:bazel-bin/packages/kbn-shared-ux-storybook", @@ -451,8 +453,8 @@ "@opentelemetry/semantic-conventions": "^1.4.0", "@reduxjs/toolkit": "1.7.2", "@slack/webhook": "^5.0.4", - "@tanstack/react-query": "^4.13.4", - "@tanstack/react-query-devtools": "^4.13.4", + "@tanstack/react-query": "^4.16.1", + "@tanstack/react-query-devtools": "^4.16.1", "@turf/along": "6.0.1", "@turf/area": "6.0.1", "@turf/bbox": "6.0.1", @@ -902,7 +904,7 @@ "@types/nock": "^10.0.3", "@types/node": "16.11.41", "@types/node-fetch": "^2.6.0", - "@types/node-forge": "^1.3.0", + "@types/node-forge": "^1.3.1", "@types/nodemailer": "^6.4.0", "@types/normalize-path": "^3.0.0", "@types/object-hash": "^1.3.0", diff --git a/packages/BUILD.bazel b/packages/BUILD.bazel index 5d08cafdfd028..78e7a74fa0b32 100644 --- a/packages/BUILD.bazel +++ b/packages/BUILD.bazel @@ -276,6 +276,7 @@ filegroup( "//packages/kbn-react-field:build", "//packages/kbn-repo-source-classifier:build", "//packages/kbn-repo-source-classifier-cli:build", + "//packages/kbn-rison:build", "//packages/kbn-rule-data-utils:build", "//packages/kbn-safer-lodash-set:build", "//packages/kbn-securitysolution-autocomplete:build", @@ -366,6 +367,7 @@ filegroup( "//packages/shared-ux/prompt/no_data_views/impl:build", "//packages/shared-ux/prompt/no_data_views/mocks:build", "//packages/shared-ux/prompt/no_data_views/types:build", + "//packages/shared-ux/prompt/not_found:build", "//packages/shared-ux/router/impl:build", "//packages/shared-ux/router/mocks:build", "//packages/shared-ux/router/types:build", @@ -639,6 +641,7 @@ filegroup( "//packages/kbn-react-field:build_types", "//packages/kbn-repo-source-classifier:build_types", "//packages/kbn-repo-source-classifier-cli:build_types", + "//packages/kbn-rison:build_types", "//packages/kbn-rule-data-utils:build_types", "//packages/kbn-safer-lodash-set:build_types", "//packages/kbn-securitysolution-autocomplete:build_types", @@ -714,6 +717,7 @@ filegroup( "//packages/shared-ux/page/solution_nav:build_types", "//packages/shared-ux/prompt/no_data_views/impl:build_types", "//packages/shared-ux/prompt/no_data_views/mocks:build_types", + "//packages/shared-ux/prompt/not_found:build_types", "//packages/shared-ux/router/impl:build_types", "//packages/shared-ux/router/mocks:build_types", "//packages/shared-ux/storybook/config:build_types", diff --git a/packages/kbn-apm-synthtrace/src/scenarios/cloud_services_icons.ts b/packages/kbn-apm-synthtrace/src/scenarios/cloud_services_icons.ts new file mode 100644 index 0000000000000..8f246eb8a44b2 --- /dev/null +++ b/packages/kbn-apm-synthtrace/src/scenarios/cloud_services_icons.ts @@ -0,0 +1,194 @@ +/* + * Copyright 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 { apm, timerange } from '../..'; +import { ApmFields } from '../lib/apm/apm_fields'; +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 = getSynthtraceEnvironment(__filename); + +const scenario: Scenario = async (runOptions: RunOptions) => { + const logger = getLogger(runOptions); + + const { numServices = 3 } = runOptions.scenarioOpts || {}; + + return { + generate: ({ from, to }) => { + const range = timerange(from, to); + + const transactionName = 'Azure-AWS-Transaction'; + + const successfulTimestamps = range.ratePerMinute(60); + + const instances = [...Array(numServices).keys()].map((index) => + apm + .service({ name: `synth-java-${index}`, environment: ENVIRONMENT, agentName: 'java' }) + .instance('instance') + ); + const instanceSpans = (instance: Instance) => { + const successfulTraceEvents = successfulTimestamps.generator((timestamp) => + instance + .transaction({ transactionName }) + .timestamp(timestamp) + .duration(1000) + .success() + .children( + instance + .span({ + spanName: 'AWS DynamoDB', + spanType: 'db', + spanSubtype: 'dynamodb', + 'service.target.type': 'dynamodb', + 'span.destination.service.resource': 'dynamodb', + }) + .duration(50) + .success() + .timestamp(timestamp), + instance + .span({ + spanName: 'AWS SQS', + spanType: 'messaging', + spanSubtype: 'sqs', + 'service.target.type': 'sqs', + 'service.target.name': 'queueA', + 'span.destination.service.resource': 'sqs/queueA', + }) + .duration(50) + .success() + .timestamp(timestamp + 50), + instance + .span({ + spanName: 'AWS SQS', + spanType: 'messaging', + spanSubtype: 'sqs', + 'service.target.type': 'sqs', + 'service.target.name': 'queueB', + 'span.destination.service.resource': 'sqs/queueB', + }) + .duration(50) + .success() + .timestamp(timestamp + 100), + instance + .span({ + spanName: 'AWS SNS', + spanType: 'messaging', + spanSubtype: 'sns', + 'service.target.type': 'sns', + 'span.destination.service.resource': 'sns', + }) + .duration(50) + .success() + .timestamp(timestamp + 150), + instance + .span({ + spanName: 'AWS S3', + spanType: 'storage', + spanSubtype: 's3', + 'service.target.type': 's3', + 'service.target.name': 'bucketA', + 'span.destination.service.resource': 's3/bucketA', + }) + .duration(50) + .success() + .timestamp(timestamp + 200), + instance + .span({ + spanName: 'AWS S3', + spanType: 'storage', + spanSubtype: 's3', + 'service.target.type': 's3', + 'service.target.name': 'bucketB', + 'span.destination.service.resource': 's3/bucketB', + }) + .duration(50) + .success() + .timestamp(timestamp + 250), + instance + .span({ + spanName: 'Azure CosmosDB', + spanType: 'db', + spanSubtype: 'cosmosdb', + 'service.target.type': 'cosmosdb', + 'span.destination.service.resource': 'cosmosdb', + }) + .duration(50) + .success() + .timestamp(timestamp + 300), + instance + .span({ + spanName: 'Azure Queue', + spanType: 'messaging', + spanSubtype: 'azurequeue', + 'service.target.type': 'azurequeue', + 'span.destination.service.resource': 'azurequeue', + }) + .duration(50) + .success() + .timestamp(timestamp + 350), + instance + .span({ + spanName: 'Azure Service Bus', + spanType: 'messaging', + spanSubtype: 'azureservicebus', + 'service.target.type': 'azureservicebus', + 'span.destination.service.resource': 'azureservicebus', + }) + .duration(50) + .success() + .timestamp(timestamp + 400), + instance + .span({ + spanName: 'Azure Blob', + spanType: 'storage', + spanSubtype: 'azureblob', + 'service.target.type': 'azureblob', + 'span.destination.service.resource': 'azureblob', + }) + .duration(50) + .success() + .timestamp(timestamp + 450), + instance + .span({ + spanName: 'Azure File', + spanType: 'storage', + spanSubtype: 'azurefile', + 'service.target.type': 'azurefile', + 'span.destination.service.resource': 'azurefile', + }) + .duration(50) + .success() + .timestamp(timestamp + 500), + instance + .span({ + spanName: 'Azure Table', + spanType: 'storage', + spanSubtype: 'azuretable', + 'service.target.type': 'azuretable', + 'span.destination.service.resource': 'azuretable', + }) + .duration(50) + .success() + .timestamp(timestamp + 550) + ) + ); + + return successfulTraceEvents; + }; + + return instances + .map((instance) => logger.perf('generating_apm_events', () => instanceSpans(instance))) + .reduce((p, c) => p.merge(c)); + }, + }; +}; + +export default scenario; diff --git a/packages/kbn-doc-links/src/get_doc_links.ts b/packages/kbn-doc-links/src/get_doc_links.ts index 92ca6ce96196d..971e69729269e 100644 --- a/packages/kbn-doc-links/src/get_doc_links.ts +++ b/packages/kbn-doc-links/src/get_doc_links.ts @@ -381,7 +381,7 @@ export const getDocLinks = ({ kibanaBranch }: GetDocLinkOptions): DocLinks => { responseActions: `${SECURITY_SOLUTION_DOCS}response-actions.html`, configureEndpointIntegrationPolicy: `${SECURITY_SOLUTION_DOCS}configure-endpoint-integration-policy.html`, exceptions: { - value_lists: `${SECURITY_SOLUTION_DOCS}detections-ui-exceptions.html#manage-value-lists`, + value_lists: `${SECURITY_SOLUTION_DOCS}detections-ui-exceptions.html`, }, privileges: `${SECURITY_SOLUTION_DOCS}endpoint-management-req.html`, }, diff --git a/packages/kbn-eslint-config/.eslintrc.js b/packages/kbn-eslint-config/.eslintrc.js index f2b6e93649cdd..f10e5f233efa5 100644 --- a/packages/kbn-eslint-config/.eslintrc.js +++ b/packages/kbn-eslint-config/.eslintrc.js @@ -131,6 +131,10 @@ module.exports = { from: '@elastic/apm-synthtrace', to: '@kbn/apm-synthtrace', }, + { + from: 'rison-node', + to: '@kbn/rison', + }, ], ], diff --git a/packages/kbn-io-ts-utils/index.ts b/packages/kbn-io-ts-utils/index.ts index f15e8c429c8b3..c964dcaa5b749 100644 --- a/packages/kbn-io-ts-utils/index.ts +++ b/packages/kbn-io-ts-utils/index.ts @@ -6,9 +6,11 @@ * Side Public License, v 1. */ +export type { IndexPatternType } from './src/index_pattern_rt'; export type { NonEmptyStringBrand } from './src/non_empty_string_rt'; export { deepExactRt } from './src/deep_exact_rt'; +export { indexPatternRt } from './src/index_pattern_rt'; export { jsonRt } from './src/json_rt'; export { mergeRt } from './src/merge_rt'; export { strictKeysRt } from './src/strict_keys_rt'; diff --git a/packages/kbn-io-ts-utils/src/index_pattern_rt/index.test.ts b/packages/kbn-io-ts-utils/src/index_pattern_rt/index.test.ts new file mode 100644 index 0000000000000..0caf40812fb04 --- /dev/null +++ b/packages/kbn-io-ts-utils/src/index_pattern_rt/index.test.ts @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { indexPatternRt } from '.'; +import { isRight } from 'fp-ts/lib/Either'; + +describe('indexPatternRt', () => { + test('passes on valid index pattern strings', () => { + expect(isRight(indexPatternRt.decode('logs-*'))).toBe(true); + expect(isRight(indexPatternRt.decode('logs-*,filebeat-*'))).toBe(true); + }); + + test('fails if the pattern is an empty string', () => { + expect(isRight(indexPatternRt.decode(''))).toBe(false); + }); + + test('fails if the pattern contains empty spaces', () => { + expect(isRight(indexPatternRt.decode(' '))).toBe(false); + expect(isRight(indexPatternRt.decode(' logs-*'))).toBe(false); + expect(isRight(indexPatternRt.decode('logs-* '))).toBe(false); + expect(isRight(indexPatternRt.decode('logs-*, filebeat-*'))).toBe(false); + }); + + test('fails if the pattern contains empty comma-separated entries', () => { + expect(isRight(indexPatternRt.decode(',logs-*'))).toBe(false); + expect(isRight(indexPatternRt.decode('logs-*,'))).toBe(false); + expect(isRight(indexPatternRt.decode('logs-*,,filebeat-*'))).toBe(false); + expect(isRight(indexPatternRt.decode('logs-*,,,filebeat-*'))).toBe(false); + }); +}); diff --git a/packages/kbn-io-ts-utils/src/index_pattern_rt/index.ts b/packages/kbn-io-ts-utils/src/index_pattern_rt/index.ts new file mode 100644 index 0000000000000..02696d28ec73a --- /dev/null +++ b/packages/kbn-io-ts-utils/src/index_pattern_rt/index.ts @@ -0,0 +1,36 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 * as rt from 'io-ts'; + +export const isEmptyString = (value: string) => value === ''; + +export const containsSpaces = (value: string) => value.includes(' '); + +export const containsEmptyEntries = (value: string) => value.split(',').some(isEmptyString); + +export const validateIndexPattern = (indexPattern: string) => { + return ( + !isEmptyString(indexPattern) && + !containsSpaces(indexPattern) && + !containsEmptyEntries(indexPattern) + ); +}; + +export interface IndexPatternBrand { + readonly IndexPattern: unique symbol; +} + +type IndexPattern = rt.Branded; + +export const indexPatternRt = rt.brand( + rt.string, + (pattern): pattern is IndexPattern => validateIndexPattern(pattern), + 'IndexPattern' +); + +export type IndexPatternType = rt.TypeOf; diff --git a/packages/kbn-rison/BUILD.bazel b/packages/kbn-rison/BUILD.bazel new file mode 100644 index 0000000000000..948affb52f443 --- /dev/null +++ b/packages/kbn-rison/BUILD.bazel @@ -0,0 +1,123 @@ +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 = "kbn-rison" +PKG_REQUIRE_NAME = "@kbn/rison" + +SOURCE_FILES = glob( + [ + "**/*.ts", + ], + exclude = [ + "**/*.config.js", + "**/*.mock.*", + "**/*.test.*", + "**/*.stories.*", + "**/__snapshots__/**", + "**/integration_tests/**", + "**/mocks/**", + "**/scripts/**", + "**/storybook/**", + "**/test_fixtures/**", + "**/test_helpers/**", + ], +) + +SRCS = SOURCE_FILES + +filegroup( + name = "srcs", + srcs = SRCS, +) + +NPM_MODULE_EXTRA_FILES = [ + "package.json", +] + +# In this array place runtime dependencies, including other packages and NPM packages +# which must be available for this code to run. +# +# To reference other packages use: +# "//repo/relative/path/to/package" +# eg. "//packages/kbn-utils" +# +# To reference a NPM package use: +# "@npm//name-of-package" +# eg. "@npm//lodash" +RUNTIME_DEPS = [ + "@npm//rison-node", +] + +# In this array place dependencies necessary to build the types, which will include the +# :npm_module_types target of other packages and packages from NPM, including @types/* +# packages. +# +# To reference the types for another package use: +# "//repo/relative/path/to/package:npm_module_types" +# eg. "//packages/kbn-utils:npm_module_types" +# +# References to NPM packages work the same as RUNTIME_DEPS +TYPES_DEPS = [ + "@npm//@types/node", + "@npm//@types/jest", +] + +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, + emit_declaration_only = True, + out_dir = "target_types", + 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"], +) + +js_library( + name = "npm_module_types", + srcs = NPM_MODULE_EXTRA_FILES, + deps = RUNTIME_DEPS + [":target_node", ":tsc_types"], + 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"], +) + +filegroup( + name = "build_types", + srcs = [":npm_module_types"], + visibility = ["//visibility:public"], +) diff --git a/packages/kbn-rison/README.md b/packages/kbn-rison/README.md new file mode 100644 index 0000000000000..eb1c6d288239d --- /dev/null +++ b/packages/kbn-rison/README.md @@ -0,0 +1,3 @@ +# @kbn/rison + +A simple wrapper around [rison-node](https://github.com/w33ble/rison-node) which gives us types and ensures that values are always encoded to a string. diff --git a/packages/kbn-rison/index.ts b/packages/kbn-rison/index.ts new file mode 100644 index 0000000000000..09ca54aba64cd --- /dev/null +++ b/packages/kbn-rison/index.ts @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 * from './kbn_rison'; + +import { encode, encodeUnknown, decode, encodeArray, decodeArray } from './kbn_rison'; +// maintain compatibility with 'rison-node' and include a default export +// eslint-disable-next-line import/no-default-export +export default { + encode, + encodeUnknown, + decode, + encodeArray, + decodeArray, +}; diff --git a/packages/kbn-rison/jest.config.js b/packages/kbn-rison/jest.config.js new file mode 100644 index 0000000000000..f43b1327c98f2 --- /dev/null +++ b/packages/kbn-rison/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/kbn-rison'], +}; diff --git a/packages/kbn-rison/kbn_rison.test.ts b/packages/kbn-rison/kbn_rison.test.ts new file mode 100644 index 0000000000000..0a3e49cacf485 --- /dev/null +++ b/packages/kbn-rison/kbn_rison.test.ts @@ -0,0 +1,99 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 * as Rison from './kbn_rison'; + +describe('encoding', () => { + it('encodes basic values', () => { + expect(Rison.encode(false)).toMatchInlineSnapshot(`"!f"`); + expect(Rison.encode(true)).toMatchInlineSnapshot(`"!t"`); + expect(Rison.encode(1)).toMatchInlineSnapshot(`"1"`); + expect(Rison.encode([1])).toMatchInlineSnapshot(`"!(1)"`); + expect(Rison.encode(['1'])).toMatchInlineSnapshot(`"!('1')"`); + expect(Rison.encode([null])).toMatchInlineSnapshot(`"!(!n)"`); + expect(Rison.encode([undefined])).toMatchInlineSnapshot(`"!()"`); + expect(Rison.encode(null)).toMatchInlineSnapshot(`"!n"`); + }); + it('throws if it received undefined', () => { + expect(() => Rison.encode(undefined)).toThrowErrorMatchingInlineSnapshot( + `"unable to encode value into rison, expected a primative value array or object"` + ); + }); + it('encodes a complex object', () => { + expect( + Rison.encode({ + foo: 1, + bar: { + bax: 1, + bar: [ + 'x', + { + a: /foo/, + b: new Date(0), + }, + ], + }, + }) + ).toMatchInlineSnapshot(`"(bar:(bar:!(x,(a:(),b:'1970-01-01T00:00:00.000Z')),bax:1),foo:1)"`); + }); + it('encodes arrays directly as well', () => { + expect(Rison.encodeArray([1, 2, 3])).toMatchInlineSnapshot(`"1,2,3"`); + }); +}); + +describe('decoding', () => { + it('decodes a simple rison string', () => { + expect(Rison.decode('!f')).toMatchInlineSnapshot(`false`); + expect(Rison.decode('!t')).toMatchInlineSnapshot(`true`); + expect(Rison.decode('1')).toMatchInlineSnapshot(`1`); + expect(Rison.decode('!(1)')).toMatchInlineSnapshot(` + Array [ + 1, + ] + `); + expect(Rison.decode("!('1')")).toMatchInlineSnapshot(` + Array [ + "1", + ] + `); + expect(Rison.decode('!(!n)')).toMatchInlineSnapshot(` + Array [ + null, + ] + `); + expect(Rison.decode('!()')).toMatchInlineSnapshot(`Array []`); + expect(Rison.decode('!n')).toMatchInlineSnapshot(`null`); + }); + it('decodes a complex rison string', () => { + expect(Rison.decode(`(bar:(bar:!(x,(a:(),b:'1970-01-01T00:00:00.000Z')),bax:1),foo:1)`)) + .toMatchInlineSnapshot(` + Object { + "bar": Object { + "bar": Array [ + "x", + Object { + "a": Object {}, + "b": "1970-01-01T00:00:00.000Z", + }, + ], + "bax": 1, + }, + "foo": 1, + } + `); + }); + it('decodes an encoded array', () => { + expect(Rison.decodeArray('1,2,3')).toMatchInlineSnapshot(` + Array [ + 1, + 2, + 3, + ] + `); + }); +}); diff --git a/packages/kbn-rison/kbn_rison.ts b/packages/kbn-rison/kbn_rison.ts new file mode 100644 index 0000000000000..4b2fe7958704c --- /dev/null +++ b/packages/kbn-rison/kbn_rison.ts @@ -0,0 +1,59 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 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. + */ + +// @ts-expect-error untyped module from npm +// eslint-disable-next-line @kbn/eslint/module_migration +import Rison from 'rison-node'; + +export type RisonValue = + | boolean + | string + | number + | RisonValue[] + | { [key: string]: RisonValue } + | null; + +export function encodeUnknown(obj: any): string | undefined { + return Rison.encode(obj); +} + +/** + * rison-encode a javascript structure + */ +export function encode(obj: any) { + const rison = encodeUnknown(obj); + if (rison === undefined) { + throw new Error( + 'unable to encode value into rison, expected a primative value array or object' + ); + } + return rison; +} + +/** + * parse a rison string into a javascript structure. + */ +export function decode(rison: string): RisonValue { + return Rison.decode(rison); +} + +/** + * rison-encode a javascript array without surrounding parens + */ +export function encodeArray(array: any[]) { + return Rison.encode_array(array); +} + +/** + * parse an a-rison string into a javascript structure. + * + * this simply adds array markup around the string before parsing. + */ +export function decodeArray(rison: string): RisonValue[] { + return Rison.decode_array(rison); +} diff --git a/packages/kbn-rison/kibana.jsonc b/packages/kbn-rison/kibana.jsonc new file mode 100644 index 0000000000000..e2543dbebbc1b --- /dev/null +++ b/packages/kbn-rison/kibana.jsonc @@ -0,0 +1,7 @@ +{ + "type": "shared-common", + "id": "@kbn/rison", + "owner": "@elastic/kibana-operations", + "runtimeDeps": [], + "typeDeps": [], +} diff --git a/packages/kbn-rison/package.json b/packages/kbn-rison/package.json new file mode 100644 index 0000000000000..692d31de22435 --- /dev/null +++ b/packages/kbn-rison/package.json @@ -0,0 +1,8 @@ +{ + "name": "@kbn/rison", + "private": true, + "version": "1.0.0", + "main": "./target_node/index.js", + "types": "./target_types/index.d.ts", + "license": "SSPL-1.0 OR Elastic License 2.0" +} diff --git a/packages/kbn-rison/tsconfig.json b/packages/kbn-rison/tsconfig.json new file mode 100644 index 0000000000000..292157c18591a --- /dev/null +++ b/packages/kbn-rison/tsconfig.json @@ -0,0 +1,15 @@ +{ + "extends": "../../tsconfig.bazel.json", + "compilerOptions": { + "declaration": true, + "emitDeclarationOnly": true, + "outDir": "target_types", + "types": [ + "jest", + "node" + ] + }, + "include": [ + "**/*.ts", + ] +} diff --git a/packages/kbn-ui-shared-deps-npm/BUILD.bazel b/packages/kbn-ui-shared-deps-npm/BUILD.bazel index fe0e97913fa49..3bb1873156be4 100644 --- a/packages/kbn-ui-shared-deps-npm/BUILD.bazel +++ b/packages/kbn-ui-shared-deps-npm/BUILD.bazel @@ -62,7 +62,6 @@ RUNTIME_DEPS = [ "@npm//react-router-dom", "@npm//react-router", "@npm//react", - "@npm//rison-node", "@npm//rxjs", "@npm//styled-components", "@npm//symbol-observable", @@ -98,7 +97,6 @@ TYPES_DEPS = [ "@npm//react-is", "@npm//react-router", "@npm//react-router-dom", - "@npm//rison-node", "@npm//rxjs", "@npm//styled-components", "@npm//symbol-observable", diff --git a/packages/kbn-ui-shared-deps-npm/webpack.config.js b/packages/kbn-ui-shared-deps-npm/webpack.config.js index 68396a15e371d..791af0ebe1885 100644 --- a/packages/kbn-ui-shared-deps-npm/webpack.config.js +++ b/packages/kbn-ui-shared-deps-npm/webpack.config.js @@ -100,7 +100,6 @@ module.exports = (_, argv) => { 'react-router-dom', 'react-router', 'react', - 'rison-node', 'rxjs', 'rxjs/operators', 'styled-components', diff --git a/packages/kbn-ui-shared-deps-src/BUILD.bazel b/packages/kbn-ui-shared-deps-src/BUILD.bazel index 91d64b9159be9..4dc31e5a51a6d 100644 --- a/packages/kbn-ui-shared-deps-src/BUILD.bazel +++ b/packages/kbn-ui-shared-deps-src/BUILD.bazel @@ -51,6 +51,7 @@ RUNTIME_DEPS = [ "//packages/kbn-ui-shared-deps-npm", "//packages/kbn-ui-theme", "//packages/kbn-peggy-loader", + "//packages/kbn-rison", ] TYPES_DEPS = [ @@ -107,7 +108,7 @@ webpack( "$(location webpack.config.js)", "--output-path", "$(@D)", - "--no-stats" + "--stats=errors-only" ], ) diff --git a/packages/kbn-ui-shared-deps-src/src/definitions.js b/packages/kbn-ui-shared-deps-src/src/definitions.js index 96826b0616761..d975a39e76a3b 100644 --- a/packages/kbn-ui-shared-deps-src/src/definitions.js +++ b/packages/kbn-ui-shared-deps-src/src/definitions.js @@ -77,7 +77,7 @@ const externals = { '@kbn/es-query': '__kbnSharedDeps__.KbnEsQuery', '@kbn/std': '__kbnSharedDeps__.KbnStd', '@kbn/safer-lodash-set': '__kbnSharedDeps__.SaferLodashSet', - 'rison-node': '__kbnSharedDeps__.RisonNode', + '@kbn/rison': '__kbnSharedDeps__.KbnRison', history: '__kbnSharedDeps__.History', classnames: '__kbnSharedDeps__.Classnames', '@tanstack/react-query': '__kbnSharedDeps__.ReactQuery', diff --git a/packages/kbn-ui-shared-deps-src/src/entry.js b/packages/kbn-ui-shared-deps-src/src/entry.js index c7c8f5e95342e..146efce495eaf 100644 --- a/packages/kbn-ui-shared-deps-src/src/entry.js +++ b/packages/kbn-ui-shared-deps-src/src/entry.js @@ -57,7 +57,7 @@ export const KbnAnalytics = require('@kbn/analytics'); export const KbnEsQuery = require('@kbn/es-query'); export const KbnStd = require('@kbn/std'); export const SaferLodashSet = require('@kbn/safer-lodash-set'); -export const RisonNode = require('rison-node'); +export const KbnRison = require('@kbn/rison'); export const History = require('history'); export const Classnames = require('classnames'); export const ReactQuery = require('@tanstack/react-query'); diff --git a/packages/shared-ux/prompt/not_found/BUILD.bazel b/packages/shared-ux/prompt/not_found/BUILD.bazel new file mode 100644 index 0000000000000..019224c4d0377 --- /dev/null +++ b/packages/shared-ux/prompt/not_found/BUILD.bazel @@ -0,0 +1,142 @@ +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 = "errors" +PKG_REQUIRE_NAME = "@kbn/shared-ux-prompt-error" + +SOURCE_FILES = glob( + [ + "**/*.ts", + "**/*.tsx", + "**/*.png", + ], + exclude = [ + "**/*.config.js", + "**/*.mock.*", + "**/*.test.*", + "**/*.stories.*", + "**/__snapshots__/**", + "**/integration_tests/**", + "**/mocks/**", + "**/scripts/**", + "**/storybook/**", + "**/test_fixtures/**", + "**/test_helpers/**", + ], +) + +SRCS = SOURCE_FILES + +filegroup( + name = "srcs", + srcs = SRCS, +) + +NPM_MODULE_EXTRA_FILES = [ + "package.json", +] + +# In this array place runtime dependencies, including other packages and NPM packages +# which must be available for this code to run. +# +# To reference other packages use: +# "//repo/relative/path/to/package" +# eg. "//packages/kbn-utils" +# +# To reference a NPM package use: +# "@npm//name-of-package" +# eg. "@npm//lodash" +RUNTIME_DEPS = [ + "@npm//react", + "@npm//@elastic/eui", + "//packages/kbn-i18n" +] + +# In this array place dependencies necessary to build the types, which will include the +# :npm_module_types target of other packages and packages from NPM, including @types/* +# packages. +# +# To reference the types for another package use: +# "//repo/relative/path/to/package:npm_module_types" +# eg. "//packages/kbn-utils:npm_module_types" +# +# References to NPM packages work the same as RUNTIME_DEPS +TYPES_DEPS = [ + "@npm//@types/node", + "@npm//@types/jest", + "@npm//@types/react", + "@npm//@elastic/eui", + "//packages/kbn-ambient-ui-types", + "//packages/kbn-i18n: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, + additional_args = [ + "--copy-files", + "--quiet" + ] +) + +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, + emit_declaration_only = True, + out_dir = "target_types", + 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"], +) + +js_library( + name = "npm_module_types", + srcs = NPM_MODULE_EXTRA_FILES, + deps = RUNTIME_DEPS + [":target_node", ":target_web", ":tsc_types"], + 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"], +) + +filegroup( + name = "build_types", + srcs = [":npm_module_types"], + visibility = ["//visibility:public"], +) diff --git a/packages/shared-ux/prompt/not_found/README.mdx b/packages/shared-ux/prompt/not_found/README.mdx new file mode 100644 index 0000000000000..dc784f86b3854 --- /dev/null +++ b/packages/shared-ux/prompt/not_found/README.mdx @@ -0,0 +1,12 @@ +--- +id: sharedUX/Prompt/NotFound +slug: /shared-ux/prompt/not-found +title: Not Found Prompt +description: A prompt to be displayed when a page or a resource does not exist. +tags: ['shared-ux', 'component', 'prompt', 'not-found'] +date: 2022-02-09 +--- + +Sometimes the user tries to go to a page that doesn't exist, because the URL is broken or because they try to load a resource that does not exist. For those cases we want to show a standard 404 error. + +The default call to action is a "Go back" button that simulates the browser's "Back" behaviour. Consumers can specify their own CTA's with the `actions` prop. diff --git a/packages/shared-ux/prompt/not_found/index.ts b/packages/shared-ux/prompt/not_found/index.ts new file mode 100644 index 0000000000000..d58da40849716 --- /dev/null +++ b/packages/shared-ux/prompt/not_found/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 { NotFoundPrompt } from './src/not_found_prompt'; diff --git a/packages/shared-ux/prompt/not_found/jest.config.js b/packages/shared-ux/prompt/not_found/jest.config.js new file mode 100644 index 0000000000000..8120e3d0c1854 --- /dev/null +++ b/packages/shared-ux/prompt/not_found/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/shared-ux/prompt/not_found'], +}; diff --git a/packages/shared-ux/prompt/not_found/kibana.jsonc b/packages/shared-ux/prompt/not_found/kibana.jsonc new file mode 100644 index 0000000000000..dfcbc505ab652 --- /dev/null +++ b/packages/shared-ux/prompt/not_found/kibana.jsonc @@ -0,0 +1,7 @@ +{ + "type": "shared-common", + "id": "@kbn/shared-ux-prompt-not-found", + "owner": "@elastic/kibana-global-experience", + "runtimeDeps": [], + "typeDeps": [] +} diff --git a/packages/shared-ux/prompt/not_found/package.json b/packages/shared-ux/prompt/not_found/package.json new file mode 100644 index 0000000000000..e28ff82ce6c29 --- /dev/null +++ b/packages/shared-ux/prompt/not_found/package.json @@ -0,0 +1,9 @@ +{ + "name": "@kbn/shared-ux-prompt-not-found", + "private": true, + "version": "1.0.0", + "main": "./target_node/index.js", + "browser": "./target_web/index.js", + "types": "./target_types/index.d.ts", + "license": "SSPL-1.0 OR Elastic License 2.0" +} diff --git a/packages/shared-ux/prompt/not_found/src/assets/404_astronaut_dark.png b/packages/shared-ux/prompt/not_found/src/assets/404_astronaut_dark.png new file mode 100644 index 0000000000000..ec22a4b538870 Binary files /dev/null and b/packages/shared-ux/prompt/not_found/src/assets/404_astronaut_dark.png differ diff --git a/packages/shared-ux/prompt/not_found/src/assets/404_astronaut_light.png b/packages/shared-ux/prompt/not_found/src/assets/404_astronaut_light.png new file mode 100644 index 0000000000000..ea786e3aa40de Binary files /dev/null and b/packages/shared-ux/prompt/not_found/src/assets/404_astronaut_light.png differ diff --git a/packages/shared-ux/prompt/not_found/src/not_found_prompt.stories.tsx b/packages/shared-ux/prompt/not_found/src/not_found_prompt.stories.tsx new file mode 100644 index 0000000000000..4cc103140929e --- /dev/null +++ b/packages/shared-ux/prompt/not_found/src/not_found_prompt.stories.tsx @@ -0,0 +1,66 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { EuiButton, EuiButtonEmpty, EuiPageTemplate } from '@elastic/eui'; +import React from 'react'; +import { Meta, Story } from '@storybook/react'; +import mdx from '../README.mdx'; + +import { NotFoundPrompt } from './not_found_prompt'; + +export default { + title: 'Not found/Prompt', + description: + 'A component to display when the user reaches a page or tries to load a resource that does not exist', + parameters: { + docs: { + page: mdx, + }, + }, + argTypes: { + onClick: { action: 'clicked' }, + }, +} as Meta; + +export const EmptyPage: Story = () => { + return ( + + + + + + ); +}; + +export const PageWithSidebar: Story = () => { + return ( + + sidebar + + + ); +}; + +export const CustomActions: Story = (args) => { + return ( + + + + Go home + , + + Go to discover + , + ]} + /> + + + ); +}; diff --git a/packages/shared-ux/prompt/not_found/src/not_found_prompt.test.tsx b/packages/shared-ux/prompt/not_found/src/not_found_prompt.test.tsx new file mode 100644 index 0000000000000..48f0d82520f30 --- /dev/null +++ b/packages/shared-ux/prompt/not_found/src/not_found_prompt.test.tsx @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 React from 'react'; +import { render, mount } from 'enzyme'; +import { act } from 'react-dom/test-utils'; + +import { NotFoundPrompt } from './not_found_prompt'; + +describe('', () => { + it('renders', () => { + const component = render(); + expect(component.text()).toContain('Page not found'); + }); + + it('has a default action with a "Go back" button', () => { + const component = mount(); + const goBackButton = component.find('EuiButtonEmpty'); + expect(goBackButton.text()).toBe('Go back'); + + const backSpy = jest.spyOn(history, 'back'); + act(() => { + goBackButton.simulate('click'); + }); + expect(backSpy).toHaveBeenCalled(); + backSpy.mockRestore(); + }); + + it('Renders custom actions', () => { + const actions = []; + const component = render(); + expect(component.text()).toContain('I am a button'); + }); +}); diff --git a/packages/shared-ux/prompt/not_found/src/not_found_prompt.tsx b/packages/shared-ux/prompt/not_found/src/not_found_prompt.tsx new file mode 100644 index 0000000000000..c6129cd0916d8 --- /dev/null +++ b/packages/shared-ux/prompt/not_found/src/not_found_prompt.tsx @@ -0,0 +1,76 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 React, { useEffect, useState, useCallback, useMemo } from 'react'; +import { + EuiButtonEmpty, + EuiEmptyPrompt, + EuiEmptyPromptProps, + EuiImage, + useEuiTheme, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; + +const NOT_FOUND_TITLE = i18n.translate('sharedUXPackages.prompt.errors.notFound.title', { + defaultMessage: 'Page not found', +}); + +const NOT_FOUND_BODY = i18n.translate('sharedUXPackages.prompt.errors.notFound.body', { + defaultMessage: + "Sorry, the page you're looking for can't be found. It might have been removed or renamed, or maybe it never existed at all.", +}); + +const NOT_FOUND_GO_BACK = i18n.translate('sharedUXPackages.prompt.errors.notFound.goBacklabel', { + defaultMessage: 'Go back', +}); + +interface NotFoundProps { + /** Array of buttons, links and other actions to show at the bottom of the `EuiEmptyPrompt`. Defaults to a "Back" button. */ + actions?: EuiEmptyPromptProps['actions']; +} + +/** + * Predefined `EuiEmptyPrompt` for 404 pages. + */ +export const NotFoundPrompt = ({ actions }: NotFoundProps) => { + const { colorMode } = useEuiTheme(); + const [imageSrc, setImageSrc] = useState(); + const goBack = useCallback(() => history.back(), []); + + const DEFAULT_ACTIONS = useMemo( + () => [ + + {NOT_FOUND_GO_BACK} + , + ], + [goBack] + ); + + useEffect(() => { + const loadImage = async () => { + const { default: imgSrc } = await import( + `./assets/404_astronaut_${colorMode.toLowerCase()}.png` + ); + setImageSrc(imgSrc); + }; + loadImage(); + }, [colorMode]); + + const icon = imageSrc ? : null; + + return ( + {NOT_FOUND_TITLE}

} + body={NOT_FOUND_BODY} + actions={actions ?? DEFAULT_ACTIONS} + /> + ); +}; diff --git a/packages/shared-ux/prompt/not_found/tsconfig.json b/packages/shared-ux/prompt/not_found/tsconfig.json new file mode 100644 index 0000000000000..044531bb66de4 --- /dev/null +++ b/packages/shared-ux/prompt/not_found/tsconfig.json @@ -0,0 +1,10 @@ +{ + "extends": "../../../../tsconfig.bazel.json", + "compilerOptions": { + "declaration": true, + "emitDeclarationOnly": true, + "outDir": "target_types", + "types": ["jest", "node", "react", "@kbn/ambient-ui-types"] + }, + "include": ["**/*.ts", "**/*.tsx"] +} diff --git a/src/core/server/integration_tests/saved_objects/migrations/check_registered_types.test.ts b/src/core/server/integration_tests/saved_objects/migrations/check_registered_types.test.ts index 6bfbeafb03972..983adcac14c91 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/check_registered_types.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/check_registered_types.test.ts @@ -136,7 +136,7 @@ describe('checking migration metadata changes on all registered SO types', () => "siem-ui-timeline-pinned-event": "e2697b38751506c7fce6e8b7207a830483dc4283", "space": "c4a0acce1bd4b9cce85154f2a350624a53111c59", "spaces-usage-stats": "922d3235bbf519e3fb3b260e27248b1df8249b79", - "synthetics-monitor": "d784b64a3def47d3f3d1f367df71ae41ef33cb3c", + "synthetics-monitor": "7c1e5a78fb3b88cc03b441d3bf3714d9967ab214", "synthetics-privates-locations": "dd00385f4a27ef062c3e57312eeb3799872fa4af", "tag": "39413f4578cc2128c9a0fda97d0acd1c8862c47a", "task": "ef53d0f070bd54957b8fe22fae3b1ff208913f76", diff --git a/src/dev/bazel/ts_project.bzl b/src/dev/bazel/ts_project.bzl index afd28fa513164..5c4009d46fd19 100644 --- a/src/dev/bazel/ts_project.bzl +++ b/src/dev/bazel/ts_project.bzl @@ -2,7 +2,13 @@ load("@npm//@bazel/typescript:index.bzl", _ts_project = "ts_project") -def ts_project(validate = False, **kwargs): +def contains(list, item): + for i in list: + if i == item: + return True + return False + +def ts_project(validate = False, deps = [], **kwargs): """A macro around the upstream ts_project rule. Args: @@ -10,7 +16,11 @@ def ts_project(validate = False, **kwargs): **kwargs: the rest """ + if contains(deps, "@npm//tslib") == False: + deps = deps + ["@npm//tslib"] + _ts_project( validate = validate, + deps = deps, **kwargs ) diff --git a/src/dev/performance/run_performance_cli.ts b/src/dev/performance/run_performance_cli.ts index fea2b27cc2616..ac0e708dcee0a 100644 --- a/src/dev/performance/run_performance_cli.ts +++ b/src/dev/performance/run_performance_cli.ts @@ -90,10 +90,11 @@ run( await startEs(); await runWarmup(journey); await runTest(journey); - await procRunner.stop('es'); } catch (e) { log.error(e); failedJourneys.push(journey); + } finally { + await procRunner.stop('es'); } } diff --git a/src/plugins/chart_expressions/expression_partition_vis/common/expression_functions/__snapshots__/mosaic_vis_function.test.ts.snap b/src/plugins/chart_expressions/expression_partition_vis/common/expression_functions/__snapshots__/mosaic_vis_function.test.ts.snap index c00de511b8afb..f8b999c2bb764 100644 --- a/src/plugins/chart_expressions/expression_partition_vis/common/expression_functions/__snapshots__/mosaic_vis_function.test.ts.snap +++ b/src/plugins/chart_expressions/expression_partition_vis/common/expression_functions/__snapshots__/mosaic_vis_function.test.ts.snap @@ -103,6 +103,7 @@ Object { "splitRow": undefined, }, "labels": Object { + "colorOverrides": Object {}, "last_level": false, "percentDecimals": 2, "position": "default", diff --git a/src/plugins/chart_expressions/expression_partition_vis/common/expression_functions/__snapshots__/pie_vis_function.test.ts.snap b/src/plugins/chart_expressions/expression_partition_vis/common/expression_functions/__snapshots__/pie_vis_function.test.ts.snap index 65cd755d51a07..9e71fcec0c8fa 100644 --- a/src/plugins/chart_expressions/expression_partition_vis/common/expression_functions/__snapshots__/pie_vis_function.test.ts.snap +++ b/src/plugins/chart_expressions/expression_partition_vis/common/expression_functions/__snapshots__/pie_vis_function.test.ts.snap @@ -104,6 +104,7 @@ Object { "emptySizeRatio": 0.3, "isDonut": true, "labels": Object { + "colorOverrides": Object {}, "last_level": false, "percentDecimals": 2, "position": "default", @@ -244,6 +245,7 @@ Object { "emptySizeRatio": 0.3, "isDonut": false, "labels": Object { + "colorOverrides": Object {}, "last_level": false, "percentDecimals": 2, "position": "default", diff --git a/src/plugins/chart_expressions/expression_partition_vis/common/expression_functions/__snapshots__/treemap_vis_function.test.ts.snap b/src/plugins/chart_expressions/expression_partition_vis/common/expression_functions/__snapshots__/treemap_vis_function.test.ts.snap index 5388a47242fb4..891b217df37f0 100644 --- a/src/plugins/chart_expressions/expression_partition_vis/common/expression_functions/__snapshots__/treemap_vis_function.test.ts.snap +++ b/src/plugins/chart_expressions/expression_partition_vis/common/expression_functions/__snapshots__/treemap_vis_function.test.ts.snap @@ -103,6 +103,7 @@ Object { "splitRow": undefined, }, "labels": Object { + "colorOverrides": Object {}, "last_level": false, "percentDecimals": 2, "position": "default", diff --git a/src/plugins/chart_expressions/expression_partition_vis/common/expression_functions/__snapshots__/waffle_vis_function.test.ts.snap b/src/plugins/chart_expressions/expression_partition_vis/common/expression_functions/__snapshots__/waffle_vis_function.test.ts.snap index 180c3221240ce..50400b3839b57 100644 --- a/src/plugins/chart_expressions/expression_partition_vis/common/expression_functions/__snapshots__/waffle_vis_function.test.ts.snap +++ b/src/plugins/chart_expressions/expression_partition_vis/common/expression_functions/__snapshots__/waffle_vis_function.test.ts.snap @@ -77,6 +77,7 @@ Object { "splitRow": undefined, }, "labels": Object { + "colorOverrides": Object {}, "last_level": false, "percentDecimals": 2, "position": "default", diff --git a/src/plugins/chart_expressions/expression_partition_vis/common/expression_functions/mosaic_vis_function.test.ts b/src/plugins/chart_expressions/expression_partition_vis/common/expression_functions/mosaic_vis_function.test.ts index 46816ee1f34b8..fd2951a2f1fb6 100644 --- a/src/plugins/chart_expressions/expression_partition_vis/common/expression_functions/mosaic_vis_function.test.ts +++ b/src/plugins/chart_expressions/expression_partition_vis/common/expression_functions/mosaic_vis_function.test.ts @@ -52,6 +52,7 @@ describe('interpreter/functions#mosaicVis', () => { percentDecimals: 2, truncate: 100, last_level: false, + colorOverrides: {}, }, metric: { type: 'vis_dimension', diff --git a/src/plugins/chart_expressions/expression_partition_vis/common/expression_functions/partition_labels_function.ts b/src/plugins/chart_expressions/expression_partition_vis/common/expression_functions/partition_labels_function.ts index 48ecab49dc23b..fbd8fa84d3a20 100644 --- a/src/plugins/chart_expressions/expression_partition_vis/common/expression_functions/partition_labels_function.ts +++ b/src/plugins/chart_expressions/expression_partition_vis/common/expression_functions/partition_labels_function.ts @@ -89,6 +89,15 @@ export const partitionLabelsFunction = (): ExpressionFunctionDefinition< ), options: [ValueFormats.PERCENT, ValueFormats.VALUE], }, + colorOverrides: { + types: ['string'], + help: i18n.translate( + 'expressionPartitionVis.partitionLabels.function.args.colorOverrides.help', + { + defaultMessage: 'Defines specific colors for specific labels.', + } + ), + }, }, fn: (context, args) => { return { @@ -97,8 +106,9 @@ export const partitionLabelsFunction = (): ExpressionFunctionDefinition< position: args.position, percentDecimals: args.percentDecimals, values: args.values, - truncate: args.truncate, valuesFormat: args.valuesFormat, + colorOverrides: args.colorOverrides ? JSON.parse(args.colorOverrides) : {}, + truncate: args.truncate, last_level: args.last_level, }; }, diff --git a/src/plugins/chart_expressions/expression_partition_vis/common/expression_functions/pie_vis_function.test.ts b/src/plugins/chart_expressions/expression_partition_vis/common/expression_functions/pie_vis_function.test.ts index 0c222758d912a..dc975e9a92758 100644 --- a/src/plugins/chart_expressions/expression_partition_vis/common/expression_functions/pie_vis_function.test.ts +++ b/src/plugins/chart_expressions/expression_partition_vis/common/expression_functions/pie_vis_function.test.ts @@ -53,6 +53,7 @@ describe('interpreter/functions#pieVis', () => { percentDecimals: 2, truncate: 100, last_level: false, + colorOverrides: {}, }, metrics: [ { diff --git a/src/plugins/chart_expressions/expression_partition_vis/common/expression_functions/treemap_vis_function.test.ts b/src/plugins/chart_expressions/expression_partition_vis/common/expression_functions/treemap_vis_function.test.ts index e5bc4115c1461..edc8ec8b99100 100644 --- a/src/plugins/chart_expressions/expression_partition_vis/common/expression_functions/treemap_vis_function.test.ts +++ b/src/plugins/chart_expressions/expression_partition_vis/common/expression_functions/treemap_vis_function.test.ts @@ -53,6 +53,7 @@ describe('interpreter/functions#treemapVis', () => { percentDecimals: 2, truncate: 100, last_level: false, + colorOverrides: {}, }, metrics: [ { diff --git a/src/plugins/chart_expressions/expression_partition_vis/common/expression_functions/waffle_vis_function.test.ts b/src/plugins/chart_expressions/expression_partition_vis/common/expression_functions/waffle_vis_function.test.ts index 4c81f64428a74..606ff2c9b84c2 100644 --- a/src/plugins/chart_expressions/expression_partition_vis/common/expression_functions/waffle_vis_function.test.ts +++ b/src/plugins/chart_expressions/expression_partition_vis/common/expression_functions/waffle_vis_function.test.ts @@ -53,6 +53,7 @@ describe('interpreter/functions#waffleVis', () => { percentDecimals: 2, truncate: 100, last_level: false, + colorOverrides: {}, }, metrics: [ { diff --git a/src/plugins/chart_expressions/expression_partition_vis/common/types/expression_functions.ts b/src/plugins/chart_expressions/expression_partition_vis/common/types/expression_functions.ts index 30c5aba33ebf1..f5f2f0ef7f3cd 100644 --- a/src/plugins/chart_expressions/expression_partition_vis/common/types/expression_functions.ts +++ b/src/plugins/chart_expressions/expression_partition_vis/common/types/expression_functions.ts @@ -36,6 +36,7 @@ export interface PartitionLabelsArguments { values: boolean; valuesFormat: ValueFormats; percentDecimals: number; + colorOverrides?: string; /** @deprecated This field is deprecated and going to be removed in the futher release versions. */ truncate?: number | null; /** @deprecated This field is deprecated and going to be removed in the futher release versions. */ @@ -50,6 +51,7 @@ export type ExpressionValuePartitionLabels = ExpressionValueBoxed< values: boolean; valuesFormat: ValueFormats; percentDecimals: number; + colorOverrides: Record; /** @deprecated This field is deprecated and going to be removed in the futher release versions. */ truncate?: number | null; /** @deprecated This field is deprecated and going to be removed in the futher release versions. */ diff --git a/src/plugins/chart_expressions/expression_partition_vis/common/types/expression_renderers.ts b/src/plugins/chart_expressions/expression_partition_vis/common/types/expression_renderers.ts index 9584a810d7ca4..b5c9ad985dd49 100644 --- a/src/plugins/chart_expressions/expression_partition_vis/common/types/expression_renderers.ts +++ b/src/plugins/chart_expressions/expression_partition_vis/common/types/expression_renderers.ts @@ -41,6 +41,7 @@ export interface LabelsParams { values: boolean; valuesFormat: ValueFormats; percentDecimals: number; + colorOverrides: Record; /** @deprecated This field is deprecated and going to be removed in the futher release versions. */ truncate?: number | null; /** @deprecated This field is deprecated and going to be removed in the futher release versions. */ @@ -95,7 +96,8 @@ export interface TreemapVisConfig extends VisCommonConfig { nestedLegend: boolean; } -export interface MosaicVisConfig extends Omit { +export interface MosaicVisConfig + extends Omit { metric: ExpressionValueVisDimension | string; nestedLegend: boolean; } diff --git a/src/plugins/chart_expressions/expression_partition_vis/public/__stories__/shared/config.ts b/src/plugins/chart_expressions/expression_partition_vis/public/__stories__/shared/config.ts index aa4023006d486..544e5ea0ce593 100644 --- a/src/plugins/chart_expressions/expression_partition_vis/public/__stories__/shared/config.ts +++ b/src/plugins/chart_expressions/expression_partition_vis/public/__stories__/shared/config.ts @@ -34,6 +34,7 @@ export const config: RenderValue['visConfig'] = { truncate: 0, valuesFormat: ValueFormats.PERCENT, last_level: false, + colorOverrides: {}, }, dimensions: { metrics: [ diff --git a/src/plugins/chart_expressions/expression_partition_vis/public/components/partition_vis_component.tsx b/src/plugins/chart_expressions/expression_partition_vis/public/components/partition_vis_component.tsx index ed1789f2ae4a9..352f03f59e619 100644 --- a/src/plugins/chart_expressions/expression_partition_vis/public/components/partition_vis_component.tsx +++ b/src/plugins/chart_expressions/expression_partition_vis/public/components/partition_vis_component.tsx @@ -290,7 +290,7 @@ const PartitionVisComponent = (props: PartitionVisComponentProps) => { bucketColumns, visParams, visData, - props.uiState?.get('vis.colors', {}), + { ...props.uiState?.get('vis.colors', {}), ...props.visParams.labels.colorOverrides }, visData.rows, props.palettesRegistry, formatters, @@ -304,6 +304,7 @@ const PartitionVisComponent = (props: PartitionVisComponentProps) => { visParams, visData, props.uiState, + props.visParams.labels.colorOverrides, props.palettesRegistry, formatters, services.fieldFormats, diff --git a/src/plugins/chart_expressions/expression_partition_vis/public/mocks.ts b/src/plugins/chart_expressions/expression_partition_vis/public/mocks.ts index c125243f3a09a..89c61b6e7818c 100644 --- a/src/plugins/chart_expressions/expression_partition_vis/public/mocks.ts +++ b/src/plugins/chart_expressions/expression_partition_vis/public/mocks.ts @@ -282,6 +282,7 @@ export const createMockPartitionVisParams = (): PartitionVisParams => { values: true, valuesFormat: ValueFormats.PERCENT, percentDecimals: 2, + colorOverrides: {}, }, legendPosition: 'right', nestedLegend: false, diff --git a/src/plugins/chart_expressions/expression_partition_vis/public/utils/layers/get_color.ts b/src/plugins/chart_expressions/expression_partition_vis/public/utils/layers/get_color.ts index 9e55bec92fbaf..e50a25532b7bb 100644 --- a/src/plugins/chart_expressions/expression_partition_vis/public/utils/layers/get_color.ts +++ b/src/plugins/chart_expressions/expression_partition_vis/public/utils/layers/get_color.ts @@ -130,15 +130,13 @@ const createSeriesLayers = ( return seriesLayers; }; -const overrideColorForOldVisualization = ( +const overrideColors = ( seriesLayers: SeriesLayer[], overwriteColors: { [key: string]: string }, name: string ) => { let overwriteColor; - // this is for supporting old visualizations (created by vislib plugin) - // it seems that there for some aggs, the uiState saved from vislib is - // different than the es-charts handle it + if (overwriteColors.hasOwnProperty(name)) { overwriteColor = overwriteColors[name]; } @@ -198,9 +196,10 @@ export const getColor = ( const seriesLayers = createSeriesLayers(d, parentSeries, isSplitChart); - const overwriteColor = overrideColorForOldVisualization(seriesLayers, overwriteColors, name); - if (overwriteColor) { - return lightenColor(overwriteColor, seriesLayers.length, columns.length); + const overriddenColor = overrideColors(seriesLayers, overwriteColors, name); + if (overriddenColor) { + // this is necessary for supporting some old visualizations that defined their own colors (created by vislib plugin) + return lightenColor(overriddenColor, seriesLayers.length, columns.length); } if (chartType === ChartTypes.MOSAIC && byDataPalette && seriesLayers[1]) { diff --git a/src/plugins/data/server/ui_settings.ts b/src/plugins/data/server/ui_settings.ts index 8d666590b3d30..cfd664e2e53c8 100644 --- a/src/plugins/data/server/ui_settings.ts +++ b/src/plugins/data/server/ui_settings.ts @@ -324,8 +324,8 @@ export function getUiSettings( defaultMessage: 'Time filter refresh interval', }), value: `{ - "pause": false, - "value": 0 + "pause": true, + "value": 60000 }`, type: 'json', description: i18n.translate('data.advancedSettings.timepicker.refreshIntervalDefaultsText', { diff --git a/src/plugins/discover/public/__mocks__/data_views.ts b/src/plugins/discover/public/__mocks__/data_views.ts index 7832a4c0f4e39..1bc8d791d53fb 100644 --- a/src/plugins/discover/public/__mocks__/data_views.ts +++ b/src/plugins/discover/public/__mocks__/data_views.ts @@ -11,22 +11,27 @@ import { dataViewMock } from './data_view'; import { dataViewComplexMock } from './data_view_complex'; import { dataViewWithTimefieldMock } from './data_view_with_timefield'; -export const dataViewsMock = { - getCache: async () => { - return [dataViewMock]; - }, - get: async (id: string) => { - if (id === 'the-data-view-id') { - return Promise.resolve(dataViewMock); - } else if (id === 'invalid-data-view-id') { - return Promise.reject('Invald'); - } - }, - updateSavedObject: jest.fn(), - getIdsWithTitle: jest.fn(() => { - return Promise.resolve([dataViewMock, dataViewComplexMock, dataViewWithTimefieldMock]); - }), - createFilter: jest.fn(), - create: jest.fn(), - clearInstanceCache: jest.fn(), -} as unknown as jest.Mocked; +export function createDiscoverDataViewsMock() { + return { + getCache: async () => { + return [dataViewMock]; + }, + get: async (id: string) => { + if (id === 'the-data-view-id') { + return Promise.resolve(dataViewMock); + } else if (id === 'invalid-data-view-id') { + return Promise.reject('Invald'); + } + }, + updateSavedObject: jest.fn(), + getIdsWithTitle: jest.fn(() => { + return Promise.resolve([dataViewMock, dataViewComplexMock, dataViewWithTimefieldMock]); + }), + createFilter: jest.fn(), + create: jest.fn(), + clearInstanceCache: jest.fn(), + getFieldsForIndexPattern: jest.fn((dataView) => dataView.fields), + } as unknown as jest.Mocked; +} + +export const dataViewsMock = createDiscoverDataViewsMock(); diff --git a/src/plugins/discover/public/__mocks__/services.ts b/src/plugins/discover/public/__mocks__/services.ts index eaae356c03c1a..a100f9888def4 100644 --- a/src/plugins/discover/public/__mocks__/services.ts +++ b/src/plugins/discover/public/__mocks__/services.ts @@ -5,6 +5,7 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ +import { Observable, of } from 'rxjs'; import { EUI_CHARTS_THEME_LIGHT } from '@elastic/eui/dist/eui_charts_theme'; import { DiscoverServices } from '../build_services'; import { dataPluginMock } from '@kbn/data-plugin/public/mocks'; @@ -20,117 +21,137 @@ import { SORT_DEFAULT_ORDER_SETTING, HIDE_ANNOUNCEMENTS, } from '../../common'; -import { UI_SETTINGS } from '@kbn/data-plugin/public'; +import { UI_SETTINGS, calculateBounds } from '@kbn/data-plugin/public'; import { TopNavMenu } from '@kbn/navigation-plugin/public'; import { FORMATS_UI_SETTINGS } from '@kbn/field-formats-plugin/common'; -import { LocalStorageMock } from './local_storage_mock'; +import { chartPluginMock } from '@kbn/charts-plugin/public/mocks'; import { fieldFormatsMock } from '@kbn/field-formats-plugin/common/mocks'; -import { dataViewsMock } from './data_views'; -import { Observable, of } from 'rxjs'; -const dataPlugin = dataPluginMock.createStartContract(); -const expressionsPlugin = expressionsPluginMock.createStartContract(); +import { LocalStorageMock } from './local_storage_mock'; +import { createDiscoverDataViewsMock } from './data_views'; + +export function createDiscoverServicesMock(): DiscoverServices { + const dataPlugin = dataPluginMock.createStartContract(); + const expressionsPlugin = expressionsPluginMock.createStartContract(); -dataPlugin.query.filterManager.getFilters = jest.fn(() => []); -dataPlugin.query.filterManager.getUpdates$ = jest.fn(() => of({}) as unknown as Observable); + dataPlugin.query.filterManager.getFilters = jest.fn(() => []); + dataPlugin.query.filterManager.getUpdates$ = jest.fn(() => of({}) as unknown as Observable); + dataPlugin.query.timefilter.timefilter.createFilter = jest.fn(); + dataPlugin.query.timefilter.timefilter.getAbsoluteTime = jest.fn(() => ({ + from: '2021-08-31T22:00:00.000Z', + to: '2022-09-01T09:16:29.553Z', + })); + dataPlugin.query.timefilter.timefilter.getTime = jest.fn(() => { + return { from: 'now-15m', to: 'now' }; + }); + dataPlugin.query.timefilter.timefilter.calculateBounds = jest.fn(calculateBounds); + dataPlugin.query.getState = jest.fn(() => ({ + query: { query: '', language: 'lucene' }, + filters: [], + })); + dataPlugin.dataViews = createDiscoverDataViewsMock(); -export const discoverServiceMock = { - core: coreMock.createStart(), - chrome: chromeServiceMock.createStartContract(), - history: () => ({ - location: { - search: '', + return { + core: coreMock.createStart(), + charts: chartPluginMock.createSetupContract(), + chrome: chromeServiceMock.createStartContract(), + history: () => ({ + location: { + search: '', + }, + listen: jest.fn(), + }), + data: dataPlugin, + docLinks: docLinksServiceMock.createStartContract(), + capabilities: { + visualize: { + show: true, + }, + discover: { + save: false, + }, + advancedSettings: { + save: true, + }, }, - listen: jest.fn(), - }), - data: dataPlugin, - docLinks: docLinksServiceMock.createStartContract(), - capabilities: { - visualize: { - show: true, + fieldFormats: fieldFormatsMock, + filterManager: dataPlugin.query.filterManager, + inspector: { + open: jest.fn(), }, - discover: { - save: false, + uiSettings: { + get: jest.fn((key: string) => { + if (key === 'fields:popularLimit') { + return 5; + } else if (key === DEFAULT_COLUMNS_SETTING) { + return ['default_column']; + } else if (key === UI_SETTINGS.META_FIELDS) { + return []; + } else if (key === DOC_HIDE_TIME_COLUMN_SETTING) { + return false; + } else if (key === CONTEXT_STEP_SETTING) { + return 5; + } else if (key === SORT_DEFAULT_ORDER_SETTING) { + return 'desc'; + } else if (key === FORMATS_UI_SETTINGS.SHORT_DOTS_ENABLE) { + return false; + } else if (key === SAMPLE_SIZE_SETTING) { + return 250; + } else if (key === SAMPLE_ROWS_PER_PAGE_SETTING) { + return 150; + } else if (key === MAX_DOC_FIELDS_DISPLAYED) { + return 50; + } else if (key === HIDE_ANNOUNCEMENTS) { + return false; + } + }), + isDefault: (key: string) => { + return true; + }, }, - advancedSettings: { - save: true, + http: { + basePath: '/', }, - }, - fieldFormats: fieldFormatsMock, - filterManager: dataPlugin.query.filterManager, - inspector: { - open: jest.fn(), - }, - uiSettings: { - get: jest.fn((key: string) => { - if (key === 'fields:popularLimit') { - return 5; - } else if (key === DEFAULT_COLUMNS_SETTING) { - return ['default_column']; - } else if (key === UI_SETTINGS.META_FIELDS) { - return []; - } else if (key === DOC_HIDE_TIME_COLUMN_SETTING) { - return false; - } else if (key === CONTEXT_STEP_SETTING) { - return 5; - } else if (key === SORT_DEFAULT_ORDER_SETTING) { - return 'desc'; - } else if (key === FORMATS_UI_SETTINGS.SHORT_DOTS_ENABLE) { - return false; - } else if (key === SAMPLE_SIZE_SETTING) { - return 250; - } else if (key === SAMPLE_ROWS_PER_PAGE_SETTING) { - return 150; - } else if (key === MAX_DOC_FIELDS_DISPLAYED) { - return 50; - } else if (key === HIDE_ANNOUNCEMENTS) { - return false; - } - }), - isDefault: (key: string) => { - return true; + dataViewEditor: { + userPermissions: { + editDataView: () => true, + }, + }, + dataViewFieldEditor: { + openEditor: jest.fn(), + userPermissions: { + editIndexPattern: jest.fn(), + }, + }, + navigation: { + ui: { TopNavMenu, AggregateQueryTopNavMenu: TopNavMenu }, }, - }, - http: { - basePath: '/', - }, - dataViewEditor: { - userPermissions: { - editDataView: () => true, + metadata: { + branch: 'test', }, - }, - dataViewFieldEditor: { - openEditor: jest.fn(), - userPermissions: { - editIndexPattern: jest.fn(), + theme: { + useChartsTheme: jest.fn(() => EUI_CHARTS_THEME_LIGHT.theme), + useChartsBaseTheme: jest.fn(() => EUI_CHARTS_THEME_LIGHT.theme), }, - }, - navigation: { - ui: { TopNavMenu, AggregateQueryTopNavMenu: TopNavMenu }, - }, - metadata: { - branch: 'test', - }, - theme: { - useChartsTheme: jest.fn(() => EUI_CHARTS_THEME_LIGHT.theme), - useChartsBaseTheme: jest.fn(() => EUI_CHARTS_THEME_LIGHT.theme), - }, - storage: new LocalStorageMock({}) as unknown as Storage, - addBasePath: jest.fn(), - toastNotifications: { - addInfo: jest.fn(), - addWarning: jest.fn(), - addDanger: jest.fn(), - addSuccess: jest.fn(), - }, - expressions: expressionsPlugin, - savedObjectsTagging: {}, - dataViews: dataViewsMock, - timefilter: { createFilter: jest.fn() }, - locator: { - useUrl: jest.fn(() => ''), - navigate: jest.fn(), - getUrl: jest.fn(() => Promise.resolve('')), - }, - contextLocator: { getRedirectUrl: jest.fn(() => '') }, - singleDocLocator: { getRedirectUrl: jest.fn(() => '') }, -} as unknown as DiscoverServices; + storage: new LocalStorageMock({}) as unknown as Storage, + addBasePath: jest.fn(), + toastNotifications: { + addInfo: jest.fn(), + addWarning: jest.fn(), + addDanger: jest.fn(), + addSuccess: jest.fn(), + }, + expressions: expressionsPlugin, + savedObjectsTagging: {}, + dataViews: dataPlugin.dataViews, + timefilter: dataPlugin.query.timefilter.timefilter, + locator: { + useUrl: jest.fn(() => ''), + navigate: jest.fn(), + getUrl: jest.fn(() => Promise.resolve('')), + }, + contextLocator: { getRedirectUrl: jest.fn(() => '') }, + singleDocLocator: { getRedirectUrl: jest.fn(() => '') }, + } as unknown as DiscoverServices; +} + +export const discoverServiceMock = createDiscoverServicesMock(); diff --git a/src/plugins/discover/public/application/main/components/layout/discover_layout.scss b/src/plugins/discover/public/application/main/components/layout/discover_layout.scss index 70963f50b96a7..1d314cc72efb4 100644 --- a/src/plugins/discover/public/application/main/components/layout/discover_layout.scss +++ b/src/plugins/discover/public/application/main/components/layout/discover_layout.scss @@ -31,6 +31,10 @@ discover-app { overflow: hidden; } +.dscPageBody__sidebar { + position: relative; +} + .dscPageContent__wrapper { padding: $euiSizeS $euiSizeS $euiSizeS 0; overflow: hidden; // Ensures horizontal scroll of table diff --git a/src/plugins/discover/public/application/main/components/layout/discover_layout.test.tsx b/src/plugins/discover/public/application/main/components/layout/discover_layout.test.tsx index 94b2cec7e00f5..fe631f16985b8 100644 --- a/src/plugins/discover/public/application/main/components/layout/discover_layout.test.tsx +++ b/src/plugins/discover/public/application/main/components/layout/discover_layout.test.tsx @@ -28,7 +28,7 @@ import { DataTotalHits$, RecordRawType, } from '../../hooks/use_saved_search'; -import { discoverServiceMock } from '../../../../__mocks__/services'; +import { createDiscoverServicesMock } from '../../../../__mocks__/services'; import { FetchStatus } from '../../../types'; import { RequestAdapter } from '@kbn/inspector-plugin/common'; import { DiscoverSidebar } from '../sidebar/discover_sidebar'; @@ -118,14 +118,11 @@ async function mountComponent( ) { const searchSourceMock = createSearchSourceMock({}); const services = { - ...discoverServiceMock, + ...createDiscoverServicesMock(), storage: new LocalStorageMock({ [SIDEBAR_CLOSED_KEY]: prevSidebarClosed, }) as unknown as Storage, } as unknown as DiscoverServices; - services.data.query.timefilter.timefilter.getAbsoluteTime = () => { - return { from: '2020-05-14T11:05:13.590', to: '2020-05-14T11:20:13.590' }; - }; const dataViewList = [dataView]; @@ -204,6 +201,7 @@ async function mountComponent( // DiscoverMainContent uses UnifiedHistogramLayout which // is lazy loaded, so we need to wait for it to be loaded await act(() => setTimeout(0)); + await component.update(); return component; } @@ -223,7 +221,7 @@ describe('Discover component', () => { expect( container.querySelector('[data-test-subj="unifiedHistogramChartOptionsToggle"]') ).not.toBeNull(); - }); + }, 10000); test('sql query displays no chart toggle', async () => { const container = document.createElement('div'); @@ -248,7 +246,7 @@ describe('Discover component', () => { expect( component.find('[data-test-subj="discoverSavedSearchTitle"]').getDOMNode() ).toHaveFocus(); - }); + }, 10000); describe('sidebar', () => { test('should be opened if discover:sidebarClosed was not set', async () => { diff --git a/src/plugins/discover/public/application/main/components/layout/discover_layout.tsx b/src/plugins/discover/public/application/main/components/layout/discover_layout.tsx index 57a0a3c733e71..7659407d35369 100644 --- a/src/plugins/discover/public/application/main/components/layout/discover_layout.tsx +++ b/src/plugins/discover/public/application/main/components/layout/discover_layout.tsx @@ -245,7 +245,7 @@ export function DiscoverLayout({ history={history} /> - + void; } = {}) => { - let services = discoverServiceMock; - services.data.query.timefilter.timefilter.getAbsoluteTime = () => { - return { from: '2020-05-14T11:05:13.590', to: '2020-05-14T11:20:13.590' }; - }; + let services = createDiscoverServicesMock(); if (storage) { services = { ...services, storage }; diff --git a/src/plugins/discover/public/application/main/components/sidebar/__stories__/discover_field_details.stories.tsx b/src/plugins/discover/public/application/main/components/sidebar/__stories__/discover_field_details.stories.tsx deleted file mode 100644 index 9b02ffd15a282..0000000000000 --- a/src/plugins/discover/public/application/main/components/sidebar/__stories__/discover_field_details.stories.tsx +++ /dev/null @@ -1,94 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 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 { storiesOf } from '@storybook/react'; -import React from 'react'; -import { KBN_FIELD_TYPES } from '@kbn/field-types'; -import { DataViewField } from '@kbn/data-views-plugin/public'; -import { DataView } from '@kbn/data-views-plugin/public'; -import { DiscoverFieldDetails } from '../discover_field_details'; -import { fieldSpecMap } from './fields'; -import { numericField as field } from './fields'; -import { Bucket } from '../types'; - -const buckets = [ - { count: 1, display: 'Stewart', percent: 50.0, value: 'Stewart' }, - { count: 1, display: 'Perry', percent: 50.0, value: 'Perry' }, -] as Bucket[]; -const details = { buckets, error: '', exists: 1, total: 2, columns: [] }; - -const fieldFormatInstanceType = {}; -const defaultMap = { - [KBN_FIELD_TYPES.NUMBER]: { id: KBN_FIELD_TYPES.NUMBER, params: {} }, -}; - -const fieldFormat = { - getByFieldType: (fieldType: KBN_FIELD_TYPES) => { - return [fieldFormatInstanceType]; - }, - getDefaultConfig: () => { - return defaultMap.number; - }, - defaultMap, -}; - -const scriptedField = new DataViewField({ - name: 'machine.os', - type: 'string', - esTypes: ['long'], - count: 10, - scripted: true, - searchable: true, - aggregatable: true, - readFromDocValues: true, -}); - -const dataView = new DataView({ - spec: { - id: 'logstash-*', - fields: fieldSpecMap, - title: 'logstash-*', - timeFieldName: '@timestamp', - }, - metaFields: ['_id', '_type', '_source'], - shortDotsEnable: false, - // @ts-expect-error - fieldFormats: fieldFormat, -}); - -storiesOf('components/sidebar/DiscoverFieldDetails', module) - .add('default', () => ( -
- { - alert('On add filter clicked'); - }} - /> -
- )) - .add('scripted', () => ( -
- {}} - /> -
- )) - .add('error', () => ( - {}} - /> - )); diff --git a/src/plugins/discover/public/application/main/components/sidebar/__stories__/fields.ts b/src/plugins/discover/public/application/main/components/sidebar/__stories__/fields.ts deleted file mode 100644 index 04f1cb9eb618b..0000000000000 --- a/src/plugins/discover/public/application/main/components/sidebar/__stories__/fields.ts +++ /dev/null @@ -1,51 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 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 { DataViewField, FieldSpec } from '@kbn/data-views-plugin/public'; - -export const fieldSpecMap: Record = { - 'machine.os': { - name: 'machine.os', - esTypes: ['text'], - type: 'string', - aggregatable: false, - searchable: false, - }, - 'machine.os.raw': { - name: 'machine.os.raw', - type: 'string', - esTypes: ['keyword'], - aggregatable: true, - searchable: true, - }, - 'not.filterable': { - name: 'not.filterable', - type: 'string', - esTypes: ['text'], - aggregatable: true, - searchable: false, - }, - bytes: { - name: 'bytes', - type: 'number', - esTypes: ['long'], - aggregatable: true, - searchable: true, - }, -}; - -export const numericField = new DataViewField({ - name: 'bytes', - type: 'number', - esTypes: ['long'], - count: 10, - scripted: false, - searchable: true, - aggregatable: true, - readFromDocValues: true, -}); diff --git a/src/plugins/discover/public/application/main/components/sidebar/discover_field_bucket.scss b/src/plugins/discover/public/application/main/components/sidebar/deprecated_stats/discover_field_bucket.scss similarity index 100% rename from src/plugins/discover/public/application/main/components/sidebar/discover_field_bucket.scss rename to src/plugins/discover/public/application/main/components/sidebar/deprecated_stats/discover_field_bucket.scss diff --git a/src/plugins/discover/public/application/main/components/sidebar/discover_field_bucket.tsx b/src/plugins/discover/public/application/main/components/sidebar/deprecated_stats/discover_field_bucket.tsx similarity index 100% rename from src/plugins/discover/public/application/main/components/sidebar/discover_field_bucket.tsx rename to src/plugins/discover/public/application/main/components/sidebar/deprecated_stats/discover_field_bucket.tsx diff --git a/src/plugins/discover/public/application/main/components/sidebar/discover_field_details.test.tsx b/src/plugins/discover/public/application/main/components/sidebar/deprecated_stats/discover_field_details.test.tsx similarity index 73% rename from src/plugins/discover/public/application/main/components/sidebar/discover_field_details.test.tsx rename to src/plugins/discover/public/application/main/components/sidebar/deprecated_stats/discover_field_details.test.tsx index 9338bd36ceab2..535459c880988 100644 --- a/src/plugins/discover/public/application/main/components/sidebar/discover_field_details.test.tsx +++ b/src/plugins/discover/public/application/main/components/sidebar/deprecated_stats/discover_field_details.test.tsx @@ -12,7 +12,11 @@ import { mountWithIntl } from '@kbn/test-jest-helpers'; import { DiscoverFieldDetails } from './discover_field_details'; import { DataViewField } from '@kbn/data-views-plugin/public'; -import { stubDataView } from '@kbn/data-views-plugin/common/data_view.stub'; +import { stubDataView, stubLogstashDataView } from '@kbn/data-views-plugin/common/data_view.stub'; +import { BehaviorSubject } from 'rxjs'; +import { FetchStatus } from '../../../../types'; +import { DataDocuments$ } from '../../../hooks/use_saved_search'; +import { getDataTableRecords } from '../../../../../__fixtures__/real_hits'; describe('discover sidebar field details', function () { const onAddFilter = jest.fn(); @@ -21,9 +25,14 @@ describe('discover sidebar field details', function () { details: { buckets: [], error: '', exists: 1, total: 2, columns: [] }, onAddFilter, }; + const hits = getDataTableRecords(stubLogstashDataView); + const documents$ = new BehaviorSubject({ + fetchStatus: FetchStatus.COMPLETE, + result: hits, + }) as DataDocuments$; function mountComponent(field: DataViewField) { - const compProps = { ...defaultProps, field }; + const compProps = { ...defaultProps, field, documents$ }; return mountWithIntl(); } diff --git a/src/plugins/discover/public/application/main/components/sidebar/discover_field_details.tsx b/src/plugins/discover/public/application/main/components/sidebar/deprecated_stats/discover_field_details.tsx similarity index 69% rename from src/plugins/discover/public/application/main/components/sidebar/discover_field_details.tsx rename to src/plugins/discover/public/application/main/components/sidebar/deprecated_stats/discover_field_details.tsx index 69e5c01df07e5..58db010c025c9 100644 --- a/src/plugins/discover/public/application/main/components/sidebar/discover_field_details.tsx +++ b/src/plugins/discover/public/application/main/components/sidebar/deprecated_stats/discover_field_details.tsx @@ -6,28 +6,52 @@ * Side Public License, v 1. */ -import React from 'react'; -import { EuiText, EuiSpacer, EuiLink } from '@elastic/eui'; +import React, { useMemo } from 'react'; +import { i18n } from '@kbn/i18n'; +import { EuiText, EuiSpacer, EuiLink, EuiTitle } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { DataViewField, DataView } from '@kbn/data-views-plugin/public'; import { DiscoverFieldBucket } from './discover_field_bucket'; import { Bucket, FieldDetails } from './types'; +import { getDetails } from './get_details'; +import { DataDocuments$ } from '../../../hooks/use_saved_search'; +import { FetchStatus } from '../../../../types'; interface DiscoverFieldDetailsProps { + /** + * hits fetched from ES, displayed in the doc table + */ + documents$: DataDocuments$; field: DataViewField; dataView: DataView; - details: FieldDetails; onAddFilter?: (field: DataViewField | string, value: string, type: '+' | '-') => void; } export function DiscoverFieldDetails({ + documents$, field, dataView, - details, onAddFilter, }: DiscoverFieldDetailsProps) { + const details: FieldDetails = useMemo(() => { + const data = documents$.getValue(); + const documents = data.fetchStatus === FetchStatus.COMPLETE ? data.result : undefined; + return getDetails(field, documents, dataView); + }, [field, documents$, dataView]); + + if (!details?.error && !details?.buckets) { + return null; + } + return ( - <> +
+ +
+ {i18n.translate('discover.fieldChooser.discoverField.fieldTopValuesLabel', { + defaultMessage: 'Top 5 values', + })} +
+
{details.error && {details.error}} {!details.error && ( <> @@ -70,6 +94,6 @@ export function DiscoverFieldDetails({ )} - +
); } diff --git a/src/plugins/discover/public/application/main/components/sidebar/lib/field_calculator.js b/src/plugins/discover/public/application/main/components/sidebar/deprecated_stats/field_calculator.js similarity index 100% rename from src/plugins/discover/public/application/main/components/sidebar/lib/field_calculator.js rename to src/plugins/discover/public/application/main/components/sidebar/deprecated_stats/field_calculator.js diff --git a/src/plugins/discover/public/application/main/components/sidebar/lib/field_calculator.test.ts b/src/plugins/discover/public/application/main/components/sidebar/deprecated_stats/field_calculator.test.ts similarity index 100% rename from src/plugins/discover/public/application/main/components/sidebar/lib/field_calculator.test.ts rename to src/plugins/discover/public/application/main/components/sidebar/deprecated_stats/field_calculator.test.ts diff --git a/src/plugins/discover/public/application/main/components/sidebar/lib/get_details.ts b/src/plugins/discover/public/application/main/components/sidebar/deprecated_stats/get_details.ts similarity index 100% rename from src/plugins/discover/public/application/main/components/sidebar/lib/get_details.ts rename to src/plugins/discover/public/application/main/components/sidebar/deprecated_stats/get_details.ts diff --git a/src/plugins/discover/public/application/main/components/sidebar/string_progress_bar.tsx b/src/plugins/discover/public/application/main/components/sidebar/deprecated_stats/string_progress_bar.tsx similarity index 100% rename from src/plugins/discover/public/application/main/components/sidebar/string_progress_bar.tsx rename to src/plugins/discover/public/application/main/components/sidebar/deprecated_stats/string_progress_bar.tsx diff --git a/src/plugins/discover/public/application/main/components/sidebar/types.ts b/src/plugins/discover/public/application/main/components/sidebar/deprecated_stats/types.ts similarity index 86% rename from src/plugins/discover/public/application/main/components/sidebar/types.ts rename to src/plugins/discover/public/application/main/components/sidebar/deprecated_stats/types.ts index 45921f676f144..1f7d40418fe7b 100644 --- a/src/plugins/discover/public/application/main/components/sidebar/types.ts +++ b/src/plugins/discover/public/application/main/components/sidebar/deprecated_stats/types.ts @@ -6,12 +6,6 @@ * Side Public License, v 1. */ -export interface IndexPatternRef { - id: string; - title: string; - name?: string; -} - export interface FieldDetails { error: string; exists: number; diff --git a/src/plugins/discover/public/application/main/components/sidebar/discover_field.test.tsx b/src/plugins/discover/public/application/main/components/sidebar/discover_field.test.tsx index c147289af983c..82e3e462dbd3a 100644 --- a/src/plugins/discover/public/application/main/components/sidebar/discover_field.test.tsx +++ b/src/plugins/discover/public/application/main/components/sidebar/discover_field.test.tsx @@ -9,18 +9,22 @@ import { act } from 'react-dom/test-utils'; import { EuiPopover, EuiProgress, EuiButtonIcon } from '@elastic/eui'; import React from 'react'; +import { BehaviorSubject } from 'rxjs'; import { findTestSubject } from '@elastic/eui/lib/test'; import { mountWithIntl } from '@kbn/test-jest-helpers'; -import { chartPluginMock } from '@kbn/charts-plugin/public/mocks'; -import { dataViewPluginMocks } from '@kbn/data-views-plugin/public/mocks'; -import { fieldFormatsServiceMock } from '@kbn/field-formats-plugin/public/mocks'; -import { dataPluginMock } from '@kbn/data-plugin/public/mocks'; import { DiscoverField, DiscoverFieldProps } from './discover_field'; import { DataViewField } from '@kbn/data-views-plugin/public'; import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; import { stubDataView } from '@kbn/data-views-plugin/common/data_view.stub'; import { DiscoverAppStateProvider } from '../../services/discover_app_state_container'; import { getDiscoverStateMock } from '../../../../__mocks__/discover_state.mock'; +import { FetchStatus } from '../../../types'; +import { DataDocuments$ } from '../../hooks/use_saved_search'; +import { getDataTableRecords } from '../../../../__fixtures__/real_hits'; +import * as DetailsUtil from './deprecated_stats/get_details'; +import { createDiscoverServicesMock } from '../../../../__mocks__/services'; + +jest.spyOn(DetailsUtil, 'getDetails'); jest.mock('@kbn/unified-field-list-plugin/public/services/field_stats', () => ({ loadFieldStats: jest.fn().mockResolvedValue({ @@ -42,8 +46,6 @@ jest.mock('@kbn/unified-field-list-plugin/public/services/field_stats', () => ({ }), })); -const dataServiceMock = dataPluginMock.createStartContract(); - jest.mock('../../../../kibana_services', () => ({ getUiActions: jest.fn(() => { return { @@ -80,10 +82,16 @@ async function getComponent({ const dataView = stubDataView; dataView.toSpec = () => ({}); + const hits = getDataTableRecords(dataView); + const documents$ = new BehaviorSubject({ + fetchStatus: FetchStatus.COMPLETE, + result: hits, + }) as DataDocuments$; + const props: DiscoverFieldProps = { + documents$, dataView: stubDataView, field: finalField, - getDetails: jest.fn(() => ({ buckets: [], error: '', exists: 1, total: 2 })), ...(onAddFilterExists && { onAddFilter: jest.fn() }), onAddField: jest.fn(), onEditField: jest.fn(), @@ -93,11 +101,7 @@ async function getComponent({ contextualFields: [], }; const services = { - history: () => ({ - location: { - search: '', - }, - }), + ...createDiscoverServicesMock(), capabilities: { visualize: { show: true, @@ -113,29 +117,6 @@ async function getComponent({ } }, }, - data: { - ...dataServiceMock, - query: { - ...dataServiceMock.query, - timefilter: { - ...dataServiceMock.query.timefilter, - timefilter: { - ...dataServiceMock.query.timefilter.timefilter, - getAbsoluteTime: () => ({ - from: '2021-08-31T22:00:00.000Z', - to: '2022-09-01T09:16:29.553Z', - }), - }, - }, - getState: () => ({ - query: { query: '', language: 'lucene' }, - filters: [], - }), - }, - }, - dataViews: dataViewPluginMocks.createStartContract(), - fieldFormats: fieldFormatsServiceMock.createStartContract(), - charts: chartPluginMock.createSetupContract(), }; const appStateContainer = getDiscoverStateMock({ isTimeBased: true }).appStateContainer; appStateContainer.set({ @@ -156,6 +137,10 @@ async function getComponent({ } describe('discover sidebar field', function () { + beforeEach(() => { + (DetailsUtil.getDetails as jest.Mock).mockClear(); + }); + it('should allow selecting fields', async function () { const { comp, props } = await getComponent({}); findTestSubject(comp, 'fieldToggle-bytes').simulate('click'); @@ -166,14 +151,15 @@ describe('discover sidebar field', function () { findTestSubject(comp, 'fieldToggle-bytes').simulate('click'); expect(props.onRemoveField).toHaveBeenCalledWith('bytes'); }); - it('should trigger getDetails', async function () { + it('should trigger getDetails for showing the deprecated field stats', async function () { const { comp, props } = await getComponent({ selected: true, showFieldStats: true, showLegacyFieldTopValues: true, }); findTestSubject(comp, 'field-bytes-showDetails').simulate('click'); - expect(props.getDetails).toHaveBeenCalledWith(props.field); + expect(DetailsUtil.getDetails).toHaveBeenCalledTimes(1); + expect(findTestSubject(comp, `discoverFieldDetails-${props.field.name}`).exists()).toBeTruthy(); }); it('should not allow clicking on _source', async function () { const field = new DataViewField({ @@ -184,13 +170,13 @@ describe('discover sidebar field', function () { aggregatable: true, readFromDocValues: true, }); - const { comp, props } = await getComponent({ + const { comp } = await getComponent({ selected: true, field, showLegacyFieldTopValues: true, }); findTestSubject(comp, 'field-_source-showDetails').simulate('click'); - expect(props.getDetails).not.toHaveBeenCalled(); + expect(DetailsUtil.getDetails).not.toHaveBeenCalledWith(); }); it('displays warning for conflicting fields', async function () { const field = new DataViewField({ @@ -209,16 +195,16 @@ describe('discover sidebar field', function () { expect(dscField.find('.kbnFieldButton__infoIcon').length).toEqual(1); }); it('should not execute getDetails when rendered, since it can be expensive', async function () { - const { props } = await getComponent({}); - expect(props.getDetails).toHaveBeenCalledTimes(0); + await getComponent({}); + expect(DetailsUtil.getDetails).toHaveBeenCalledTimes(0); }); it('should execute getDetails when show details is requested', async function () { - const { props, comp } = await getComponent({ + const { comp } = await getComponent({ showFieldStats: true, showLegacyFieldTopValues: true, }); findTestSubject(comp, 'field-bytes-showDetails').simulate('click'); - expect(props.getDetails).toHaveBeenCalledTimes(1); + expect(DetailsUtil.getDetails).toHaveBeenCalledTimes(1); }); it('should not return the popover if onAddFilter is not provided', async function () { const field = new DataViewField({ diff --git a/src/plugins/discover/public/application/main/components/sidebar/discover_field.tsx b/src/plugins/discover/public/application/main/components/sidebar/discover_field.tsx index 5513483b2b03c..18cbabf97e058 100644 --- a/src/plugins/discover/public/application/main/components/sidebar/discover_field.tsx +++ b/src/plugins/discover/public/application/main/components/sidebar/discover_field.tsx @@ -9,7 +9,14 @@ import './discover_field.scss'; import React, { useState, useCallback, memo, useMemo } from 'react'; -import { EuiButtonIcon, EuiToolTip, EuiTitle, EuiIcon, EuiSpacer } from '@elastic/eui'; +import { + EuiButtonIcon, + EuiToolTip, + EuiTitle, + EuiIcon, + EuiSpacer, + EuiHighlight, +} from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { UiCounterMetricType } from '@kbn/analytics'; import classNames from 'classnames'; @@ -23,12 +30,12 @@ import { } from '@kbn/unified-field-list-plugin/public'; import { DiscoverFieldStats } from './discover_field_stats'; import { getTypeForFieldIcon } from '../../../../utils/get_type_for_field_icon'; -import { DiscoverFieldDetails } from './discover_field_details'; -import { FieldDetails } from './types'; +import { DiscoverFieldDetails } from './deprecated_stats/discover_field_details'; import { getFieldTypeName } from '../../../../utils/get_field_type_name'; import { useDiscoverServices } from '../../../../hooks/use_discover_services'; import { SHOW_LEGACY_FIELD_TOP_VALUES, PLUGIN_ID } from '../../../../../common'; import { getUiActions } from '../../../../kibana_services'; +import { type DataDocuments$ } from '../../hooks/use_saved_search'; function wrapOnDot(str?: string) { // u200B is a non-width white-space character, which allows @@ -64,24 +71,31 @@ const DiscoverFieldTypeIcon: React.FC<{ field: DataViewField }> = memo(({ field ); }); -const FieldName: React.FC<{ field: DataViewField }> = memo(({ field }) => { - const title = - field.displayName !== field.name - ? i18n.translate('discover.field.title', { - defaultMessage: '{fieldName} ({fieldDisplayName})', - values: { - fieldName: field.name, - fieldDisplayName: field.displayName, - }, - }) - : field.displayName; +const FieldName: React.FC<{ field: DataViewField; highlight?: string }> = memo( + ({ field, highlight }) => { + const title = + field.displayName !== field.name + ? i18n.translate('discover.field.title', { + defaultMessage: '{fieldName} ({fieldDisplayName})', + values: { + fieldName: field.name, + fieldDisplayName: field.displayName, + }, + }) + : field.displayName; - return ( - - {wrapOnDot(field.displayName)} - - ); -}); + return ( + + {wrapOnDot(field.displayName)} + + ); + } +); interface ActionButtonProps { field: DataViewField; @@ -128,6 +142,7 @@ const ActionButton: React.FC = memo( } else { return ( ; toggleDisplay: (field: DataViewField) => void; alwaysShowActionButton: boolean; - isDocumentRecord: boolean; } const MultiFields: React.FC = memo( - ({ multiFields, toggleDisplay, alwaysShowActionButton, isDocumentRecord }) => ( + ({ multiFields, toggleDisplay, alwaysShowActionButton }) => (
@@ -184,7 +198,7 @@ const MultiFields: React.FC = memo( className="dscSidebarItem dscSidebarItem--multi" isActive={false} dataTestSubj={`field-${entry.field.name}-showDetails`} - fieldIcon={isDocumentRecord && } + fieldIcon={} fieldAction={ = memo( ); export interface DiscoverFieldProps { + /** + * hits fetched from ES, displayed in the doc table + */ + documents$: DataDocuments$; /** * Determines whether add/remove button is displayed not only when focused */ @@ -227,10 +245,6 @@ export interface DiscoverFieldProps { * @param fieldName */ onRemoveField: (fieldName: string) => void; - /** - * Retrieve details data for the field - */ - getDetails: (field: DataViewField) => FieldDetails; /** * Determines whether the field is selected */ @@ -264,16 +278,22 @@ export interface DiscoverFieldProps { * Columns */ contextualFields: string[]; + + /** + * Search by field name + */ + highlight?: string; } function DiscoverFieldComponent({ + documents$, alwaysShowActionButton = false, field, + highlight, dataView, onAddField, onRemoveField, onAddFilter, - getDetails, selected, trackUiMetric, multiFields, @@ -345,7 +365,7 @@ function DiscoverFieldComponent({ size="s" className="dscSidebarItem" dataTestSubj={`field-${field.name}-showDetails`} - fieldIcon={isDocumentRecord && } + fieldIcon={} fieldAction={ } + fieldIcon={} fieldAction={ } - fieldName={} + fieldName={} fieldInfoIcon={field.type === 'conflict' && } /> ); @@ -389,24 +409,15 @@ function DiscoverFieldComponent({ return ( <> - {showLegacyFieldStats ? ( + {showLegacyFieldStats ? ( // TODO: Deprecate and remove after ~v8.7 <> {showFieldStats && ( - <> - -
- {i18n.translate('discover.fieldChooser.discoverField.fieldTopValuesLabel', { - defaultMessage: 'Top 5 values', - })} -
-
- - + )} ) : ( @@ -425,7 +436,6 @@ function DiscoverFieldComponent({ multiFields={multiFields} alwaysShowActionButton={alwaysShowActionButton} toggleDisplay={toggleDisplay} - isDocumentRecord={isDocumentRecord} /> )} diff --git a/src/plugins/discover/public/application/main/components/sidebar/discover_field_search.test.tsx b/src/plugins/discover/public/application/main/components/sidebar/discover_field_search.test.tsx index 55ad5eadaf81d..eafe3fec1eeaf 100644 --- a/src/plugins/discover/public/application/main/components/sidebar/discover_field_search.test.tsx +++ b/src/plugins/discover/public/application/main/components/sidebar/discover_field_search.test.tsx @@ -44,6 +44,7 @@ describe('DiscoverFieldSearch', () => { const input = findTestSubject(component, 'fieldFilterSearchInput'); input.simulate('change', { target: { value: 'new filter' } }); expect(defaultProps.onChange).toBeCalledTimes(1); + expect(defaultProps.onChange).toHaveBeenCalledWith('name', 'new filter'); }); test('change in active filters should change facet selection and call onChange', () => { @@ -97,30 +98,17 @@ describe('DiscoverFieldSearch', () => { expect(badge.text()).toEqual('1'); }); - test('change in missing fields switch should not change filter count', () => { - const component = mountComponent(); - const btn = findTestSubject(component, 'toggleFieldFilterButton'); - btn.simulate('click'); - const badge = btn.find('.euiNotificationBadge').last(); - expect(badge.text()).toEqual('0'); - const missingSwitch = findTestSubject(component, 'missingSwitch'); - missingSwitch.simulate('change', { target: { value: false } }); - expect(badge.text()).toEqual('0'); - }); - test('change in filters triggers onChange', () => { const onChange = jest.fn(); const component = mountComponent({ ...defaultProps, ...{ onChange } }); const btn = findTestSubject(component, 'toggleFieldFilterButton'); btn.simulate('click'); const aggregtableButtonGroup = findButtonGroup(component, 'aggregatable'); - const missingSwitch = findTestSubject(component, 'missingSwitch'); act(() => { // @ts-expect-error (aggregtableButtonGroup.props() as EuiButtonGroupProps).onChange('aggregatable-true', null); }); - missingSwitch.simulate('click'); - expect(onChange).toBeCalledTimes(2); + expect(onChange).toBeCalledTimes(1); }); test('change in type filters triggers onChange with appropriate value', () => { diff --git a/src/plugins/discover/public/application/main/components/sidebar/discover_field_search.tsx b/src/plugins/discover/public/application/main/components/sidebar/discover_field_search.tsx index 59ba2833d94f5..8d7103f70efe9 100644 --- a/src/plugins/discover/public/application/main/components/sidebar/discover_field_search.tsx +++ b/src/plugins/discover/public/application/main/components/sidebar/discover_field_search.tsx @@ -17,11 +17,8 @@ import { EuiFlexGroup, EuiFlexItem, EuiPopover, - EuiPopoverFooter, EuiPopoverTitle, EuiSelect, - EuiSwitch, - EuiSwitchEvent, EuiForm, EuiFormRow, EuiButtonGroup, @@ -43,7 +40,6 @@ export interface State { searchable: string; aggregatable: string; type: string; - missing: boolean; [index: string]: string | boolean; } @@ -68,6 +64,11 @@ export interface Props { * is text base lang mode */ isPlainRecord: boolean; + + /** + * For a11y + */ + fieldSearchDescriptionId?: string; } interface FieldTypeTableItem { @@ -86,6 +87,7 @@ export function DiscoverFieldSearch({ types, presentFieldTypes, isPlainRecord, + fieldSearchDescriptionId, }: Props) { const searchPlaceholder = i18n.translate('discover.fieldChooser.searchPlaceHolder', { defaultMessage: 'Search field names', @@ -112,7 +114,6 @@ export function DiscoverFieldSearch({ searchable: 'any', aggregatable: 'any', type: 'any', - missing: true, }); const { docLinks } = useDiscoverServices(); @@ -191,7 +192,7 @@ export function DiscoverFieldSearch({ }; const isFilterActive = (name: string, filterValue: string | boolean) => { - return name !== 'missing' && filterValue !== 'any'; + return filterValue !== 'any'; }; const handleValueChange = (name: string, filterValue: string | boolean) => { @@ -214,11 +215,6 @@ export function DiscoverFieldSearch({ setActiveFiltersCount(activeFiltersCount + diff); }; - const handleMissingChange = (e: EuiSwitchEvent) => { - const missingValue = e.target.checked; - handleValueChange('missing', missingValue); - }; - const buttonContent = ( { - return ( - - - - ); - }; - const selectionPanel = (
@@ -353,10 +334,11 @@ export function DiscoverFieldSearch({ onChange('name', event.currentTarget.value)} + onChange={(event) => onChange('name', event.target.value)} placeholder={searchPlaceholder} value={value} /> @@ -384,7 +366,6 @@ export function DiscoverFieldSearch({ })} {selectionPanel} - {footer()} = React.memo( ({ field, dataView, multiFields, onAddFilter }) => { const services = useDiscoverServices(); - const dateRange = services.data?.query?.timefilter.timefilter.getAbsoluteTime(); const querySubscriberResult = useQuerySubscriber({ data: services.data, }); @@ -38,7 +38,7 @@ export const DiscoverFieldStats: React.FC = React.memo( [field, multiFields] ); - if (!dateRange || !querySubscriberResult.query || !querySubscriberResult.filters) { + if (!hasQuerySubscriberData(querySubscriberResult)) { return null; } @@ -47,8 +47,8 @@ export const DiscoverFieldStats: React.FC = React.memo( services={services} query={querySubscriberResult.query} filters={querySubscriberResult.filters} - fromDate={dateRange.from} - toDate={dateRange.to} + fromDate={querySubscriberResult.fromDate} + toDate={querySubscriberResult.toDate} dataViewOrDataViewId={dataView} field={fieldForStats} data-test-subj="dscFieldStats" diff --git a/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar.scss b/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar.scss index 4a0f048947706..d7190b61e33f3 100644 --- a/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar.scss +++ b/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar.scss @@ -31,20 +31,6 @@ align-items: center; } -.dscFieldList { - padding: 0 $euiSizeXS $euiSizeXS; -} - -.dscFieldListHeader { - padding: $euiSizeS $euiSizeS 0 $euiSizeS; - background-color: lightOrDarkTheme(tint($euiColorPrimary, 90%), $euiColorLightShade); -} - -.dscFieldList--popular { - padding-bottom: $euiSizeS; - background-color: lightOrDarkTheme(tint($euiColorPrimary, 90%), $euiColorLightShade); -} - .dscSidebarItem { &:hover, &:focus-within, diff --git a/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar.test.tsx b/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar.test.tsx index 0e7e3b22ac3b3..ad59bad82aeb8 100644 --- a/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar.test.tsx +++ b/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar.test.tsx @@ -6,30 +6,38 @@ * Side Public License, v 1. */ import { ReactWrapper } from 'enzyme'; +import { act } from 'react-dom/test-utils'; import { findTestSubject } from '@elastic/eui/lib/test'; import { Action } from '@kbn/ui-actions-plugin/public'; import { getDataTableRecords } from '../../../../__fixtures__/real_hits'; import { mountWithIntl } from '@kbn/test-jest-helpers'; import React from 'react'; -import { DiscoverSidebarProps } from './discover_sidebar'; +import { + DiscoverSidebarComponent as DiscoverSidebar, + DiscoverSidebarProps, +} from './discover_sidebar'; import { DataViewListItem } from '@kbn/data-views-plugin/public'; - +import type { AggregateQuery, Query } from '@kbn/es-query'; import { getDefaultFieldFilter } from './lib/field_filter'; -import { DiscoverSidebarComponent as DiscoverSidebar } from './discover_sidebar'; -import { discoverServiceMock as mockDiscoverServices } from '../../../../__mocks__/services'; +import { createDiscoverServicesMock } from '../../../../__mocks__/services'; import { stubLogstashDataView } from '@kbn/data-plugin/common/stubs'; import { VIEW_MODE } from '../../../../components/view_mode_toggle'; import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; import { BehaviorSubject } from 'rxjs'; import { FetchStatus } from '../../../types'; -import { AvailableFields$ } from '../../hooks/use_saved_search'; +import { AvailableFields$, DataDocuments$ } from '../../hooks/use_saved_search'; import { getDiscoverStateMock } from '../../../../__mocks__/discover_state.mock'; import { DiscoverAppStateProvider } from '../../services/discover_app_state_container'; +import * as ExistingFieldsHookApi from '@kbn/unified-field-list-plugin/public/hooks/use_existing_fields'; +import { ExistenceFetchStatus } from '@kbn/unified-field-list-plugin/public'; +import { getDataViewFieldList } from './lib/get_data_view_field_list'; const mockGetActions = jest.fn>>, [string, { fieldName: string }]>( () => Promise.resolve([]) ); +jest.spyOn(ExistingFieldsHookApi, 'useExistingFieldsReader'); + jest.mock('../../../../kibana_services', () => ({ getUiActions: () => ({ getTriggerCompatibleActions: mockGetActions, @@ -41,12 +49,6 @@ function getCompProps(): DiscoverSidebarProps { dataView.toSpec = jest.fn(() => ({})); const hits = getDataTableRecords(dataView); - const dataViewList = [ - { id: '0', title: 'b' } as DataViewListItem, - { id: '1', title: 'a' } as DataViewListItem, - { id: '2', title: 'c' } as DataViewListItem, - ]; - const fieldCounts: Record = {}; for (const hit of hits) { @@ -54,16 +56,36 @@ function getCompProps(): DiscoverSidebarProps { fieldCounts[key] = (fieldCounts[key] || 0) + 1; } } + + const allFields = getDataViewFieldList(dataView, fieldCounts, false); + + (ExistingFieldsHookApi.useExistingFieldsReader as jest.Mock).mockClear(); + (ExistingFieldsHookApi.useExistingFieldsReader as jest.Mock).mockImplementation(() => ({ + hasFieldData: (dataViewId: string, fieldName: string) => { + return dataViewId === dataView.id && Object.keys(fieldCounts).includes(fieldName); + }, + getFieldsExistenceStatus: (dataViewId: string) => { + return dataViewId === dataView.id + ? ExistenceFetchStatus.succeeded + : ExistenceFetchStatus.unknown; + }, + isFieldsExistenceInfoUnavailable: (dataViewId: string) => dataViewId !== dataView.id, + })); + const availableFields$ = new BehaviorSubject({ fetchStatus: FetchStatus.COMPLETE, fields: [] as string[], }) as AvailableFields$; + const documents$ = new BehaviorSubject({ + fetchStatus: FetchStatus.COMPLETE, + result: hits, + }) as DataDocuments$; + return { columns: ['extension'], - fieldCounts, - documents: hits, - dataViewList, + allFields, + dataViewList: [dataView as DataViewListItem], onChangeDataView: jest.fn(), onAddFilter: jest.fn(), onAddField: jest.fn(), @@ -77,37 +99,38 @@ function getCompProps(): DiscoverSidebarProps { viewMode: VIEW_MODE.DOCUMENT_LEVEL, createNewDataView: jest.fn(), onDataViewCreated: jest.fn(), + documents$, availableFields$, useNewFieldsApi: true, + showFieldList: true, + isAffectedByGlobalFilter: false, }; } -function getAppStateContainer() { +function getAppStateContainer({ query }: { query?: Query | AggregateQuery }) { const appStateContainer = getDiscoverStateMock({ isTimeBased: true }).appStateContainer; appStateContainer.set({ - query: { query: '', language: 'lucene' }, + query: query ?? { query: '', language: 'lucene' }, filters: [], }); return appStateContainer; } -describe('discover sidebar', function () { - let props: DiscoverSidebarProps; +async function mountComponent( + props: DiscoverSidebarProps, + appStateParams: { query?: Query | AggregateQuery } = {} +): Promise> { let comp: ReactWrapper; + const mockedServices = createDiscoverServicesMock(); + mockedServices.data.dataViews.getIdsWithTitle = jest.fn(async () => props.dataViewList); + mockedServices.data.dataViews.get = jest.fn().mockImplementation(async (id) => { + return [props.selectedDataView].find((d) => d!.id === id); + }); - beforeAll(async () => { - props = getCompProps(); - mockDiscoverServices.data.dataViews.getIdsWithTitle = jest - .fn() - .mockReturnValue(props.dataViewList); - mockDiscoverServices.data.dataViews.get = jest.fn().mockImplementation((id) => { - const dataView = props.dataViewList.find((d) => d.id === id); - return { ...dataView, isPersisted: () => true }; - }); - + await act(async () => { comp = await mountWithIntl( - - + + @@ -117,24 +140,50 @@ describe('discover sidebar', function () { await comp.update(); }); - it('should have Selected Fields and Available Fields with Popular Fields sections', function () { - const popular = findTestSubject(comp, 'fieldList-popular'); - const selected = findTestSubject(comp, 'fieldList-selected'); - const unpopular = findTestSubject(comp, 'fieldList-unpopular'); - expect(popular.children().length).toBe(1); - expect(unpopular.children().length).toBe(6); - expect(selected.children().length).toBe(1); + await comp!.update(); + + return comp!; +} + +describe('discover sidebar', function () { + let props: DiscoverSidebarProps; + + beforeEach(async () => { + props = getCompProps(); + }); + + it('should hide field list', async function () { + const comp = await mountComponent({ + ...props, + showFieldList: false, + }); + expect(findTestSubject(comp, 'fieldListGroupedFieldGroups').exists()).toBe(false); + }); + it('should have Selected Fields and Available Fields with Popular Fields sections', async function () { + const comp = await mountComponent(props); + const popularFieldsCount = findTestSubject(comp, 'fieldListGroupedPopularFields-count'); + const selectedFieldsCount = findTestSubject(comp, 'fieldListGroupedSelectedFields-count'); + const availableFieldsCount = findTestSubject(comp, 'fieldListGroupedAvailableFields-count'); + expect(popularFieldsCount.text()).toBe('4'); + expect(availableFieldsCount.text()).toBe('3'); + expect(selectedFieldsCount.text()).toBe('1'); + expect(findTestSubject(comp, 'fieldListGroupedFieldGroups').exists()).toBe(true); }); - it('should allow selecting fields', function () { - findTestSubject(comp, 'fieldToggle-bytes').simulate('click'); + it('should allow selecting fields', async function () { + const comp = await mountComponent(props); + const availableFields = findTestSubject(comp, 'fieldListGroupedAvailableFields'); + findTestSubject(availableFields, 'fieldToggle-bytes').simulate('click'); expect(props.onAddField).toHaveBeenCalledWith('bytes'); }); - it('should allow deselecting fields', function () { - findTestSubject(comp, 'fieldToggle-extension').simulate('click'); + it('should allow deselecting fields', async function () { + const comp = await mountComponent(props); + const availableFields = findTestSubject(comp, 'fieldListGroupedAvailableFields'); + findTestSubject(availableFields, 'fieldToggle-extension').simulate('click'); expect(props.onRemoveField).toHaveBeenCalledWith('extension'); }); - it('should render "Add a field" button', () => { + it('should render "Add a field" button', async () => { + const comp = await mountComponent(props); const addFieldButton = findTestSubject(comp, 'dataView-add-field_btn'); expect(addFieldButton.length).toBe(1); addFieldButton.simulate('click'); @@ -142,8 +191,11 @@ describe('discover sidebar', function () { }); it('should render "Edit field" button', async () => { - findTestSubject(comp, 'field-bytes').simulate('click'); - await new Promise((resolve) => setTimeout(resolve, 0)); + const comp = await mountComponent(props); + const availableFields = findTestSubject(comp, 'fieldListGroupedAvailableFields'); + await act(async () => { + findTestSubject(availableFields, 'field-bytes').simulate('click'); + }); await comp.update(); const editFieldButton = findTestSubject(comp, 'discoverFieldListPanelEdit-bytes'); expect(editFieldButton.length).toBe(1); @@ -151,29 +203,27 @@ describe('discover sidebar', function () { expect(props.editField).toHaveBeenCalledWith('bytes'); }); - it('should not render Add/Edit field buttons in viewer mode', () => { - const compInViewerMode = mountWithIntl( - - - - - - ); + it('should not render Add/Edit field buttons in viewer mode', async () => { + const compInViewerMode = await mountComponent({ + ...getCompProps(), + editField: undefined, + }); const addFieldButton = findTestSubject(compInViewerMode, 'dataView-add-field_btn'); expect(addFieldButton.length).toBe(0); - findTestSubject(comp, 'field-bytes').simulate('click'); + const availableFields = findTestSubject(compInViewerMode, 'fieldListGroupedAvailableFields'); + await act(async () => { + findTestSubject(availableFields, 'field-bytes').simulate('click'); + }); const editFieldButton = findTestSubject(compInViewerMode, 'discoverFieldListPanelEdit-bytes'); expect(editFieldButton.length).toBe(0); }); it('should render buttons in data view picker correctly', async () => { - const compWithPicker = mountWithIntl( - - - - - - ); + const propsWithPicker = { + ...getCompProps(), + showDataViewPicker: true, + }; + const compWithPicker = await mountComponent(propsWithPicker); // open data view picker findTestSubject(compWithPicker, 'dataView-switch-link').simulate('click'); expect(findTestSubject(compWithPicker, 'changeDataViewPopover').length).toBe(1); @@ -184,27 +234,21 @@ describe('discover sidebar', function () { ); expect(addFieldButtonInDataViewPicker.length).toBe(1); addFieldButtonInDataViewPicker.simulate('click'); - expect(props.editField).toHaveBeenCalledWith(); + expect(propsWithPicker.editField).toHaveBeenCalledWith(); // click "Create a data view" const createDataViewButton = findTestSubject(compWithPicker, 'dataview-create-new'); expect(createDataViewButton.length).toBe(1); createDataViewButton.simulate('click'); - expect(props.createNewDataView).toHaveBeenCalled(); + expect(propsWithPicker.createNewDataView).toHaveBeenCalled(); }); it('should not render buttons in data view picker when in viewer mode', async () => { - const compWithPickerInViewerMode = mountWithIntl( - - - - - - ); + const compWithPickerInViewerMode = await mountComponent({ + ...getCompProps(), + showDataViewPicker: true, + editField: undefined, + createNewDataView: undefined, + }); // open data view picker findTestSubject(compWithPickerInViewerMode, 'dataView-switch-link').simulate('click'); expect(findTestSubject(compWithPickerInViewerMode, 'changeDataViewPopover').length).toBe(1); @@ -218,14 +262,10 @@ describe('discover sidebar', function () { expect(createDataViewButton.length).toBe(0); }); - it('should render the Visualize in Lens button in text based languages mode', () => { - const compInViewerMode = mountWithIntl( - - - - - - ); + it('should render the Visualize in Lens button in text based languages mode', async () => { + const compInViewerMode = await mountComponent(getCompProps(), { + query: { sql: 'SELECT * FROM test' }, + }); const visualizeField = findTestSubject(compInViewerMode, 'textBased-visualize'); expect(visualizeField.length).toBe(1); }); diff --git a/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar.tsx b/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar.tsx index 4735b75b66e14..109f11615335f 100644 --- a/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar.tsx +++ b/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar.tsx @@ -7,49 +7,48 @@ */ import './discover_sidebar.scss'; -import { throttle } from 'lodash'; -import React, { useCallback, useEffect, useState, useMemo, useRef, memo } from 'react'; +import React, { memo, useCallback, useEffect, useMemo, useState } from 'react'; import { i18n } from '@kbn/i18n'; import { - EuiAccordion, - EuiFlexItem, + EuiButton, EuiFlexGroup, - EuiText, - EuiTitle, - EuiSpacer, - EuiNotificationBadge, + EuiFlexItem, EuiPageSideBar_Deprecated as EuiPageSideBar, - useResizeObserver, - EuiButton, + htmlIdGenerator, } from '@elastic/eui'; import { isOfAggregateQueryType } from '@kbn/es-query'; -import useShallowCompareEffect from 'react-use/lib/useShallowCompareEffect'; -import { isEqual } from 'lodash'; -import { FormattedMessage } from '@kbn/i18n-react'; import { DataViewPicker } from '@kbn/unified-search-plugin/public'; -import { DataViewField, getFieldSubtypeMulti } from '@kbn/data-views-plugin/public'; -import { triggerVisualizeActionsTextBasedLanguages } from '@kbn/unified-field-list-plugin/public'; +import { type DataViewField, getFieldSubtypeMulti } from '@kbn/data-views-plugin/public'; +import { + FieldListGrouped, + FieldListGroupedProps, + FieldsGroupNames, + GroupedFieldsParams, + triggerVisualizeActionsTextBasedLanguages, + useExistingFieldsReader, + useGroupedFields, +} from '@kbn/unified-field-list-plugin/public'; import { useAppStateSelector } from '../../services/discover_app_state_container'; import { useDiscoverServices } from '../../../../hooks/use_discover_services'; import { DiscoverField } from './discover_field'; import { DiscoverFieldSearch } from './discover_field_search'; import { FIELDS_LIMIT_SETTING, PLUGIN_ID } from '../../../../../common'; -import { groupFields } from './lib/group_fields'; -import { getDetails } from './lib/get_details'; -import { FieldFilterState, getDefaultFieldFilter, setFieldFilterProp } from './lib/field_filter'; -import { getDataViewFieldList } from './lib/get_data_view_field_list'; +import { + getSelectedFields, + shouldShowField, + type SelectedFieldsResult, + INITIAL_SELECTED_FIELDS_RESULT, +} from './lib/group_fields'; +import { doesFieldMatchFilters, FieldFilterState, setFieldFilterProp } from './lib/field_filter'; import { DiscoverSidebarResponsiveProps } from './discover_sidebar_responsive'; import { VIEW_MODE } from '../../../../components/view_mode_toggle'; -import { DISCOVER_TOUR_STEP_ANCHOR_IDS } from '../../../../components/discover_tour'; -import type { DataTableRecord } from '../../../../types'; import { getUiActions } from '../../../../kibana_services'; +import { getRawRecordType } from '../../utils/get_raw_record_type'; +import { RecordRawType } from '../../hooks/use_saved_search'; -/** - * Default number of available fields displayed and added on scroll - */ -const FIELDS_PER_PAGE = 50; +const fieldSearchDescriptionId = htmlIdGenerator()(); -export interface DiscoverSidebarProps extends Omit { +export interface DiscoverSidebarProps extends DiscoverSidebarResponsiveProps { /** * Current state of the field filter, filtering fields by name, type, ... */ @@ -84,27 +83,37 @@ export interface DiscoverSidebarProps extends Omit void; /** - * a statistics of the distribution of fields in the given hits + * All fields: fields from data view and unmapped fields */ - fieldCounts?: Record; - /** - * hits fetched from ES, displayed in the doc table - */ - documents?: DataTableRecord[]; + allFields: DataViewField[] | null; + /** * Discover view mode */ viewMode: VIEW_MODE; + /** + * Show data view picker (for mobile view) + */ showDataViewPicker?: boolean; + + /** + * Whether to render the field list or not (we don't show it unless documents are loaded) + */ + showFieldList?: boolean; + + /** + * Whether filters are applied + */ + isAffectedByGlobalFilter: boolean; } export function DiscoverSidebarComponent({ alwaysShowActionButtons = false, columns, - fieldCounts, fieldFilter, - documents, + documents$, + allFields, onAddField, onAddFilter, onRemoveField, @@ -120,108 +129,28 @@ export function DiscoverSidebarComponent({ viewMode, createNewDataView, showDataViewPicker, + showFieldList, + isAffectedByGlobalFilter, }: DiscoverSidebarProps) { - const { uiSettings, dataViewFieldEditor } = useDiscoverServices(); - const [fields, setFields] = useState(null); - const [scrollContainer, setScrollContainer] = useState(null); - const [fieldsToRender, setFieldsToRender] = useState(FIELDS_PER_PAGE); - const [fieldsPerPage, setFieldsPerPage] = useState(FIELDS_PER_PAGE); - const availableFieldsContainer = useRef(null); - const isPlainRecord = !onAddFilter; + const { uiSettings, dataViewFieldEditor, dataViews } = useDiscoverServices(); + const isPlainRecord = useAppStateSelector( + (state) => getRawRecordType(state.query) === RecordRawType.PLAIN + ); const query = useAppStateSelector((state) => state.query); - useEffect(() => { - if (documents) { - const newFields = getDataViewFieldList(selectedDataView, fieldCounts); - setFields(newFields); - } - }, [selectedDataView, fieldCounts, documents]); - - const scrollDimensions = useResizeObserver(scrollContainer); - const onChangeFieldSearch = useCallback( - (field: string, value: string | boolean | undefined) => { - const newState = setFieldFilterProp(fieldFilter, field, value); + (filterName: string, value: string | boolean | undefined) => { + const newState = setFieldFilterProp(fieldFilter, filterName, value); setFieldFilter(newState); - setFieldsToRender(fieldsPerPage); }, - [fieldFilter, setFieldFilter, setFieldsToRender, fieldsPerPage] - ); - - const getDetailsByField = useCallback( - (ipField: DataViewField) => getDetails(ipField, documents, selectedDataView), - [documents, selectedDataView] + [fieldFilter, setFieldFilter] ); - const popularLimit = useMemo(() => uiSettings.get(FIELDS_LIMIT_SETTING), [uiSettings]); - - const { - selected: selectedFields, - popular: popularFields, - unpopular: unpopularFields, - } = useMemo( - () => groupFields(fields, columns, popularLimit, fieldCounts, fieldFilter, useNewFieldsApi), - [fields, columns, popularLimit, fieldCounts, fieldFilter, useNewFieldsApi] - ); - - /** - * Popular fields are not displayed in text based lang mode - */ - const restFields = useMemo( - () => (isPlainRecord ? [...popularFields, ...unpopularFields] : unpopularFields), - [isPlainRecord, popularFields, unpopularFields] - ); - - const paginate = useCallback(() => { - const newFieldsToRender = fieldsToRender + Math.round(fieldsPerPage * 0.5); - setFieldsToRender(Math.max(fieldsPerPage, Math.min(newFieldsToRender, restFields.length))); - }, [setFieldsToRender, fieldsToRender, restFields, fieldsPerPage]); - - useEffect(() => { - if (scrollContainer && restFields.length && availableFieldsContainer.current) { - const { clientHeight, scrollHeight } = scrollContainer; - const isScrollable = scrollHeight > clientHeight; // there is no scrolling currently - const allFieldsRendered = fieldsToRender >= restFields.length; - - if (!isScrollable && !allFieldsRendered) { - // Not all available fields were rendered with the given fieldsPerPage number - // and no scrolling is available due to the a high zoom out factor of the browser - // In this case the fieldsPerPage needs to be adapted - const fieldsRenderedHeight = availableFieldsContainer.current.clientHeight; - const avgHeightPerItem = Math.round(fieldsRenderedHeight / fieldsToRender); - const newFieldsPerPage = - (avgHeightPerItem > 0 ? Math.round(clientHeight / avgHeightPerItem) : 0) + 10; - if (newFieldsPerPage >= FIELDS_PER_PAGE && newFieldsPerPage !== fieldsPerPage) { - setFieldsPerPage(newFieldsPerPage); - setFieldsToRender(newFieldsPerPage); - } - } - } - }, [ - fieldsPerPage, - scrollContainer, - restFields, - fieldsToRender, - setFieldsPerPage, - setFieldsToRender, - scrollDimensions, - ]); - - const lazyScroll = useCallback(() => { - if (scrollContainer) { - const { scrollTop, clientHeight, scrollHeight } = scrollContainer; - const nearBottom = scrollTop + clientHeight > scrollHeight * 0.9; - if (nearBottom && restFields) { - paginate(); - } - } - }, [paginate, scrollContainer, restFields]); - const { fieldTypes, presentFieldTypes } = useMemo(() => { const result = ['any']; const dataViewFieldTypes = new Set(); - if (Array.isArray(fields)) { - for (const field of fields) { + if (Array.isArray(allFields)) { + for (const field of allFields) { if (field.type !== '_source') { // If it's a string type, we want to distinguish between keyword and text // For this purpose we need the ES type @@ -242,37 +171,36 @@ export function DiscoverSidebarComponent({ } } return { fieldTypes: result, presentFieldTypes: Array.from(dataViewFieldTypes) }; - }, [fields]); + }, [allFields]); const showFieldStats = useMemo(() => viewMode === VIEW_MODE.DOCUMENT_LEVEL, [viewMode]); + const [selectedFieldsState, setSelectedFieldsState] = useState( + INITIAL_SELECTED_FIELDS_RESULT + ); + const [multiFieldsMap, setMultiFieldsMap] = useState< + Map> | undefined + >(undefined); - const calculateMultiFields = () => { - if (!useNewFieldsApi || !fields) { - return undefined; - } - const map = new Map>(); - fields.forEach((field) => { - const subTypeMulti = getFieldSubtypeMulti(field); - const parent = subTypeMulti?.multi.parent; - if (!parent) { - return; - } - const multiField = { - field, - isSelected: selectedFields.includes(field), - }; - const value = map.get(parent) ?? []; - value.push(multiField); - map.set(parent, value); - }); - return map; - }; - - const [multiFields, setMultiFields] = useState(() => calculateMultiFields()); + useEffect(() => { + const result = getSelectedFields(selectedDataView, columns); + setSelectedFieldsState(result); + }, [selectedDataView, columns, setSelectedFieldsState]); - useShallowCompareEffect(() => { - setMultiFields(calculateMultiFields()); - }, [fields, selectedFields, useNewFieldsApi]); + useEffect(() => { + if (isPlainRecord || !useNewFieldsApi) { + setMultiFieldsMap(undefined); // we don't have to calculate multifields in this case + } else { + setMultiFieldsMap( + calculateMultiFields(allFields, selectedFieldsState.selectedFieldsMap, useNewFieldsApi) + ); + } + }, [ + selectedFieldsState.selectedFieldsMap, + allFields, + useNewFieldsApi, + setMultiFieldsMap, + isPlainRecord, + ]); const deleteField = useMemo( () => @@ -305,15 +233,6 @@ export function DiscoverSidebarComponent({ ] ); - const getPaginated = useCallback( - (list) => { - return list.slice(0, fieldsToRender); - }, - [fieldsToRender] - ); - - const filterChanged = useMemo(() => isEqual(fieldFilter, getDefaultFieldFilter()), [fieldFilter]); - const visualizeAggregateQuery = useCallback(() => { const aggregateQuery = query && isOfAggregateQueryType(query) ? query : undefined; triggerVisualizeActionsTextBasedLanguages( @@ -325,6 +244,89 @@ export function DiscoverSidebarComponent({ ); }, [columns, selectedDataView, query]); + const popularFieldsLimit = useMemo(() => uiSettings.get(FIELDS_LIMIT_SETTING), [uiSettings]); + const onFilterField: GroupedFieldsParams['onFilterField'] = useCallback( + (field) => { + return doesFieldMatchFilters(field, fieldFilter); + }, + [fieldFilter] + ); + const onSupportedFieldFilter: GroupedFieldsParams['onSupportedFieldFilter'] = + useCallback( + (field) => { + return shouldShowField(field, isPlainRecord); + }, + [isPlainRecord] + ); + const onOverrideFieldGroupDetails: GroupedFieldsParams['onOverrideFieldGroupDetails'] = + useCallback((groupName) => { + if (groupName === FieldsGroupNames.AvailableFields) { + return { + helpText: i18n.translate('discover.fieldChooser.availableFieldsTooltip', { + defaultMessage: 'Fields available for display in the table.', + }), + }; + } + }, []); + const fieldsExistenceReader = useExistingFieldsReader(); + const fieldListGroupedProps = useGroupedFields({ + dataViewId: (!isPlainRecord && selectedDataView?.id) || null, // passing `null` for text-based queries + fieldsExistenceReader: !isPlainRecord ? fieldsExistenceReader : undefined, + allFields, + popularFieldsLimit: !isPlainRecord ? popularFieldsLimit : 0, + sortedSelectedFields: selectedFieldsState.selectedFields, + isAffectedByGlobalFilter, + services: { + dataViews, + }, + onFilterField, + onSupportedFieldFilter, + onOverrideFieldGroupDetails, + }); + + const renderFieldItem: FieldListGroupedProps['renderFieldItem'] = useCallback( + ({ field, groupName }) => ( +
  • + +
  • + ), + [ + alwaysShowActionButtons, + selectedDataView, + onAddField, + onRemoveField, + onAddFilter, + documents$, + trackUiMetric, + multiFieldsMap, + editField, + deleteField, + showFieldStats, + columns, + selectedFieldsState.selectedFieldsMap, + fieldFilter.name, + ] + ); + if (!selectedDataView) { return null; } @@ -367,169 +369,18 @@ export function DiscoverSidebarComponent({ types={fieldTypes} presentFieldTypes={presentFieldTypes} isPlainRecord={isPlainRecord} + fieldSearchDescriptionId={fieldSearchDescriptionId} />
    - -
    { - if (documents && el && !el.dataset.dynamicScroll) { - el.dataset.dynamicScroll = 'true'; - setScrollContainer(el); - } - }} - onScroll={throttle(lazyScroll, 100)} - className="eui-yScroll" - > - {Array.isArray(fields) && fields.length > 0 && ( -
    - {selectedFields && - selectedFields.length > 0 && - selectedFields[0].displayName !== '_source' ? ( - <> - - - - - - } - extraAction={ - - {selectedFields.length} - - } - > - -
      - {selectedFields.map((field: DataViewField) => { - return ( -
    • - -
    • - ); - })} -
    -
    - {' '} - - ) : null} - - - - - - } - extraAction={ - - {restFields.length} - - } - > - - {!isPlainRecord && popularFields.length > 0 && ( - <> - - - -
      - {popularFields.map((field: DataViewField) => { - return ( -
    • - -
    • - ); - })} -
    - - )} -
      - {getPaginated(restFields).map((field: DataViewField) => { - return ( -
    • - -
    • - ); - })} -
    -
    -
    - )} -
    + + {showFieldList && ( + + )} {!!editField && ( @@ -565,3 +416,29 @@ export function DiscoverSidebarComponent({ } export const DiscoverSidebar = memo(DiscoverSidebarComponent); + +function calculateMultiFields( + allFields: DataViewField[] | null, + selectedFieldsMap: SelectedFieldsResult['selectedFieldsMap'] | undefined, + useNewFieldsApi: boolean +) { + if (!useNewFieldsApi || !allFields) { + return undefined; + } + const map = new Map>(); + allFields.forEach((field) => { + const subTypeMulti = getFieldSubtypeMulti(field); + const parent = subTypeMulti?.multi.parent; + if (!parent) { + return; + } + const multiField = { + field, + isSelected: Boolean(selectedFieldsMap?.[field.name]), + }; + const value = map.get(parent) ?? []; + value.push(multiField); + map.set(parent, value); + }); + return map; +} diff --git a/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar_responsive.test.tsx b/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar_responsive.test.tsx index 7f2134a758018..720f3da27ad18 100644 --- a/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar_responsive.test.tsx +++ b/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar_responsive.test.tsx @@ -9,7 +9,8 @@ import { BehaviorSubject } from 'rxjs'; import { ReactWrapper } from 'enzyme'; import { findTestSubject } from '@elastic/eui/lib/test'; -import { getDataTableRecords } from '../../../../__fixtures__/real_hits'; +import { EuiProgress } from '@elastic/eui'; +import { getDataTableRecords, realHits } from '../../../../__fixtures__/real_hits'; import { act } from 'react-dom/test-utils'; import { mountWithIntl } from '@kbn/test-jest-helpers'; import React from 'react'; @@ -24,12 +25,14 @@ import { AvailableFields$, DataDocuments$, RecordRawType } from '../../hooks/use import { stubLogstashDataView } from '@kbn/data-plugin/common/stubs'; import { VIEW_MODE } from '../../../../components/view_mode_toggle'; import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; -import { chartPluginMock } from '@kbn/charts-plugin/public/mocks'; -import { dataViewPluginMocks } from '@kbn/data-views-plugin/public/mocks'; -import { fieldFormatsServiceMock } from '@kbn/field-formats-plugin/public/mocks'; -import { dataPluginMock } from '@kbn/data-plugin/public/mocks'; import { getDiscoverStateMock } from '../../../../__mocks__/discover_state.mock'; import { DiscoverAppStateProvider } from '../../services/discover_app_state_container'; +import * as ExistingFieldsServiceApi from '@kbn/unified-field-list-plugin/public/services/field_existing/load_field_existing'; +import { resetExistingFieldsCache } from '@kbn/unified-field-list-plugin/public/hooks/use_existing_fields'; +import { createDiscoverServicesMock } from '../../../../__mocks__/services'; +import type { AggregateQuery, Query } from '@kbn/es-query'; +import { buildDataTableRecord } from '../../../../utils/build_data_record'; +import { type DataTableRecord } from '../../../../types'; jest.mock('@kbn/unified-field-list-plugin/public/services/field_stats', () => ({ loadFieldStats: jest.fn().mockResolvedValue({ @@ -67,59 +70,30 @@ jest.mock('@kbn/unified-field-list-plugin/public/services/field_stats', () => ({ }), })); -const dataServiceMock = dataPluginMock.createStartContract(); - -const mockServices = { - history: () => ({ - location: { - search: '', - }, - }), - capabilities: { - visualize: { - show: true, - }, - discover: { - save: false, - }, - }, - uiSettings: { - get: (key: string) => { - if (key === 'fields:popularLimit') { - return 5; - } - }, - }, - docLinks: { links: { discover: { fieldTypeHelp: '' } } }, - dataViewEditor: { - userPermissions: { - editDataView: jest.fn(() => true), - }, - }, - data: { - ...dataServiceMock, - query: { - ...dataServiceMock.query, - timefilter: { - ...dataServiceMock.query.timefilter, - timefilter: { - ...dataServiceMock.query.timefilter.timefilter, - getAbsoluteTime: () => ({ - from: '2021-08-31T22:00:00.000Z', - to: '2022-09-01T09:16:29.553Z', - }), - }, +function createMockServices() { + const mockServices = { + ...createDiscoverServicesMock(), + capabilities: { + visualize: { + show: true, + }, + discover: { + save: false, }, getState: () => ({ query: { query: '', language: 'lucene' }, filters: [], }), }, - }, - dataViews: dataViewPluginMocks.createStartContract(), - fieldFormats: fieldFormatsServiceMock.createStartContract(), - charts: chartPluginMock.createSetupContract(), -} as unknown as DiscoverServices; + docLinks: { links: { discover: { fieldTypeHelp: '' } } }, + dataViewEditor: { + userPermissions: { + editDataView: jest.fn(() => true), + }, + }, + } as unknown as DiscoverServices; + return mockServices; +} const mockfieldCounts: Record = {}; const mockCalcFieldCounts = jest.fn(() => { @@ -138,17 +112,13 @@ jest.mock('../../utils/calc_field_counts', () => ({ calcFieldCounts: () => mockCalcFieldCounts(), })); -function getCompProps(): DiscoverSidebarResponsiveProps { +jest.spyOn(ExistingFieldsServiceApi, 'loadFieldExisting'); + +function getCompProps(options?: { hits?: DataTableRecord[] }): DiscoverSidebarResponsiveProps { const dataView = stubLogstashDataView; dataView.toSpec = jest.fn(() => ({})); - const hits = getDataTableRecords(dataView); - - const dataViewList = [ - { id: '0', title: 'b' } as DataViewListItem, - { id: '1', title: 'a' } as DataViewListItem, - { id: '2', title: 'c' } as DataViewListItem, - ]; + const hits = options?.hits ?? getDataTableRecords(dataView); for (const hit of hits) { for (const key of Object.keys(hit.flattened)) { @@ -166,7 +136,7 @@ function getCompProps(): DiscoverSidebarResponsiveProps { fetchStatus: FetchStatus.COMPLETE, fields: [] as string[], }) as AvailableFields$, - dataViewList, + dataViewList: [dataView as DataViewListItem], onChangeDataView: jest.fn(), onAddFilter: jest.fn(), onAddField: jest.fn(), @@ -180,52 +150,220 @@ function getCompProps(): DiscoverSidebarResponsiveProps { }; } +function getAppStateContainer({ query }: { query?: Query | AggregateQuery }) { + const appStateContainer = getDiscoverStateMock({ isTimeBased: true }).appStateContainer; + appStateContainer.set({ + query: query ?? { query: '', language: 'lucene' }, + filters: [], + }); + return appStateContainer; +} + +async function mountComponent( + props: DiscoverSidebarResponsiveProps, + appStateParams: { query?: Query | AggregateQuery } = {}, + services?: DiscoverServices +): Promise> { + let comp: ReactWrapper; + const mockedServices = services ?? createMockServices(); + mockedServices.data.dataViews.getIdsWithTitle = jest.fn(async () => props.dataViewList); + mockedServices.data.dataViews.get = jest.fn().mockImplementation(async (id) => { + return [props.selectedDataView].find((d) => d!.id === id); + }); + + await act(async () => { + comp = await mountWithIntl( + + + + + + ); + // wait for lazy modules + await new Promise((resolve) => setTimeout(resolve, 0)); + await comp.update(); + }); + + await comp!.update(); + + return comp!; +} + describe('discover responsive sidebar', function () { let props: DiscoverSidebarResponsiveProps; - let comp: ReactWrapper; - beforeAll(async () => { + beforeEach(async () => { + (ExistingFieldsServiceApi.loadFieldExisting as jest.Mock).mockImplementation(async () => ({ + indexPatternTitle: 'test', + existingFieldNames: Object.keys(mockfieldCounts), + })); props = getCompProps(); + }); + + afterEach(() => { + mockCalcFieldCounts.mockClear(); + (ExistingFieldsServiceApi.loadFieldExisting as jest.Mock).mockClear(); + resetExistingFieldsCache(); + }); + + it('should have loading indicators during fields existence loading', async function () { + let resolveFunction: (arg: unknown) => void; + (ExistingFieldsServiceApi.loadFieldExisting as jest.Mock).mockReset(); + (ExistingFieldsServiceApi.loadFieldExisting as jest.Mock).mockImplementation(() => { + return new Promise((resolve) => { + resolveFunction = resolve; + }); + }); + + const compLoadingExistence = await mountComponent(props); + + expect( + findTestSubject(compLoadingExistence, 'fieldListGroupedAvailableFields-countLoading').exists() + ).toBe(true); + expect( + findTestSubject(compLoadingExistence, 'fieldListGroupedAvailableFields-count').exists() + ).toBe(false); + + expect(compLoadingExistence.find(EuiProgress).exists()).toBe(true); + await act(async () => { - const appStateContainer = getDiscoverStateMock({ isTimeBased: true }).appStateContainer; - appStateContainer.set({ - query: { query: '', language: 'lucene' }, - filters: [], + resolveFunction!({ + indexPatternTitle: 'test-loaded', + existingFieldNames: Object.keys(mockfieldCounts), }); + await compLoadingExistence.update(); + }); - comp = await mountWithIntl( - - - - - - ); - // wait for lazy modules - await new Promise((resolve) => setTimeout(resolve, 0)); - await comp.update(); + await act(async () => { + await compLoadingExistence.update(); }); + + expect( + findTestSubject(compLoadingExistence, 'fieldListGroupedAvailableFields-countLoading').exists() + ).toBe(false); + expect( + findTestSubject(compLoadingExistence, 'fieldListGroupedAvailableFields-count').exists() + ).toBe(true); + + expect(compLoadingExistence.find(EuiProgress).exists()).toBe(false); + + expect(ExistingFieldsServiceApi.loadFieldExisting).toHaveBeenCalledTimes(1); }); - it('should have Selected Fields and Available Fields with Popular Fields sections', function () { - const popular = findTestSubject(comp, 'fieldList-popular'); - const selected = findTestSubject(comp, 'fieldList-selected'); - const unpopular = findTestSubject(comp, 'fieldList-unpopular'); - expect(popular.children().length).toBe(1); - expect(unpopular.children().length).toBe(6); - expect(selected.children().length).toBe(1); + it('should have Selected Fields, Available Fields, Popular and Meta Fields sections', async function () { + const comp = await mountComponent(props); + const popularFieldsCount = findTestSubject(comp, 'fieldListGroupedPopularFields-count'); + const selectedFieldsCount = findTestSubject(comp, 'fieldListGroupedSelectedFields-count'); + const availableFieldsCount = findTestSubject(comp, 'fieldListGroupedAvailableFields-count'); + const emptyFieldsCount = findTestSubject(comp, 'fieldListGroupedEmptyFields-count'); + const metaFieldsCount = findTestSubject(comp, 'fieldListGroupedMetaFields-count'); + const unmappedFieldsCount = findTestSubject(comp, 'fieldListGroupedUnmappedFields-count'); + + expect(selectedFieldsCount.text()).toBe('1'); + expect(popularFieldsCount.text()).toBe('4'); + expect(availableFieldsCount.text()).toBe('3'); + expect(emptyFieldsCount.text()).toBe('20'); + expect(metaFieldsCount.text()).toBe('2'); + expect(unmappedFieldsCount.exists()).toBe(false); expect(mockCalcFieldCounts.mock.calls.length).toBe(1); + + expect(props.availableFields$.getValue()).toEqual({ + fetchStatus: 'complete', + fields: ['extension'], + }); + + expect(findTestSubject(comp, 'fieldListGrouped__ariaDescription').text()).toBe( + '1 selected field. 4 popular fields. 3 available fields. 20 empty fields. 2 meta fields.' + ); + + expect(ExistingFieldsServiceApi.loadFieldExisting).toHaveBeenCalledTimes(1); + }); + + it('should not have selected fields if no columns selected', async function () { + const propsWithoutColumns = { + ...props, + columns: [], + }; + const compWithoutSelected = await mountComponent(propsWithoutColumns); + const popularFieldsCount = findTestSubject( + compWithoutSelected, + 'fieldListGroupedPopularFields-count' + ); + const selectedFieldsCount = findTestSubject( + compWithoutSelected, + 'fieldListGroupedSelectedFields-count' + ); + const availableFieldsCount = findTestSubject( + compWithoutSelected, + 'fieldListGroupedAvailableFields-count' + ); + const emptyFieldsCount = findTestSubject( + compWithoutSelected, + 'fieldListGroupedEmptyFields-count' + ); + const metaFieldsCount = findTestSubject( + compWithoutSelected, + 'fieldListGroupedMetaFields-count' + ); + const unmappedFieldsCount = findTestSubject( + compWithoutSelected, + 'fieldListGroupedUnmappedFields-count' + ); + + expect(selectedFieldsCount.exists()).toBe(false); + expect(popularFieldsCount.text()).toBe('4'); + expect(availableFieldsCount.text()).toBe('3'); + expect(emptyFieldsCount.text()).toBe('20'); + expect(metaFieldsCount.text()).toBe('2'); + expect(unmappedFieldsCount.exists()).toBe(false); + + expect(propsWithoutColumns.availableFields$.getValue()).toEqual({ + fetchStatus: 'complete', + fields: ['bytes', 'extension', '_id', 'phpmemory'], + }); + + expect(findTestSubject(compWithoutSelected, 'fieldListGrouped__ariaDescription').text()).toBe( + '4 popular fields. 3 available fields. 20 empty fields. 2 meta fields.' + ); + }); + + it('should not calculate counts if documents are not fetched yet', async function () { + const propsWithoutDocuments: DiscoverSidebarResponsiveProps = { + ...props, + documents$: new BehaviorSubject({ + fetchStatus: FetchStatus.UNINITIALIZED, + result: undefined, + }) as DataDocuments$, + }; + const compWithoutDocuments = await mountComponent(propsWithoutDocuments); + const availableFieldsCount = findTestSubject( + compWithoutDocuments, + 'fieldListGroupedAvailableFields-count' + ); + + expect(availableFieldsCount.exists()).toBe(false); + + expect(mockCalcFieldCounts.mock.calls.length).toBe(0); + expect(ExistingFieldsServiceApi.loadFieldExisting).not.toHaveBeenCalled(); }); - it('should allow selecting fields', function () { - findTestSubject(comp, 'fieldToggle-bytes').simulate('click'); + + it('should allow selecting fields', async function () { + const comp = await mountComponent(props); + const availableFields = findTestSubject(comp, 'fieldListGroupedAvailableFields'); + findTestSubject(availableFields, 'fieldToggle-bytes').simulate('click'); expect(props.onAddField).toHaveBeenCalledWith('bytes'); }); - it('should allow deselecting fields', function () { - findTestSubject(comp, 'fieldToggle-extension').simulate('click'); + it('should allow deselecting fields', async function () { + const comp = await mountComponent(props); + const selectedFields = findTestSubject(comp, 'fieldListGroupedSelectedFields'); + findTestSubject(selectedFields, 'fieldToggle-extension').simulate('click'); expect(props.onRemoveField).toHaveBeenCalledWith('extension'); }); it('should allow adding filters', async function () { + const comp = await mountComponent(props); + const availableFields = findTestSubject(comp, 'fieldListGroupedAvailableFields'); await act(async () => { - const button = findTestSubject(comp, 'field-extension-showDetails'); + const button = findTestSubject(availableFields, 'field-extension-showDetails'); await button.simulate('click'); await comp.update(); }); @@ -235,8 +373,10 @@ describe('discover responsive sidebar', function () { expect(props.onAddFilter).toHaveBeenCalled(); }); it('should allow adding "exist" filter', async function () { + const comp = await mountComponent(props); + const availableFields = findTestSubject(comp, 'fieldListGroupedAvailableFields'); await act(async () => { - const button = findTestSubject(comp, 'field-extension-showDetails'); + const button = findTestSubject(availableFields, 'field-extension-showDetails'); await button.simulate('click'); await comp.update(); }); @@ -245,27 +385,38 @@ describe('discover responsive sidebar', function () { findTestSubject(comp, 'discoverFieldListPanelAddExistFilter-extension').simulate('click'); expect(props.onAddFilter).toHaveBeenCalledWith('_exists_', 'extension', '+'); }); - it('should allow filtering by string, and calcFieldCount should just be executed once', function () { - expect(findTestSubject(comp, 'fieldList-unpopular').children().length).toBe(6); - act(() => { - findTestSubject(comp, 'fieldFilterSearchInput').simulate('change', { - target: { value: 'abc' }, + it('should allow filtering by string, and calcFieldCount should just be executed once', async function () { + const comp = await mountComponent(props); + + expect(findTestSubject(comp, 'fieldListGroupedAvailableFields-count').text()).toBe('3'); + expect(findTestSubject(comp, 'fieldListGrouped__ariaDescription').text()).toBe( + '1 selected field. 4 popular fields. 3 available fields. 20 empty fields. 2 meta fields.' + ); + + await act(async () => { + await findTestSubject(comp, 'fieldFilterSearchInput').simulate('change', { + target: { value: 'bytes' }, }); }); - comp.update(); - expect(findTestSubject(comp, 'fieldList-unpopular').children().length).toBe(4); + + expect(findTestSubject(comp, 'fieldListGroupedAvailableFields-count').text()).toBe('1'); + expect(findTestSubject(comp, 'fieldListGrouped__ariaDescription').text()).toBe( + '1 popular field. 1 available field. 0 empty fields. 0 meta fields.' + ); expect(mockCalcFieldCounts.mock.calls.length).toBe(1); }); - it('should show "Add a field" button to create a runtime field', () => { - expect(mockServices.dataViewEditor.userPermissions.editDataView).toHaveBeenCalled(); + it('should show "Add a field" button to create a runtime field', async () => { + const services = createMockServices(); + const comp = await mountComponent(props, {}, services); + expect(services.dataViewEditor.userPermissions.editDataView).toHaveBeenCalled(); expect(findTestSubject(comp, 'dataView-add-field_btn').length).toBe(1); }); - it('should not show "Add a field" button on the sql mode', () => { - const initialProps = getCompProps(); + it('should render correctly in the sql mode', async () => { const propsWithTextBasedMode = { - ...initialProps, + ...props, + columns: ['extension', 'bytes'], onAddFilter: undefined, documents$: new BehaviorSubject({ fetchStatus: FetchStatus.COMPLETE, @@ -273,46 +424,75 @@ describe('discover responsive sidebar', function () { result: getDataTableRecords(stubLogstashDataView), }) as DataDocuments$, }; - const appStateContainer = getDiscoverStateMock({ isTimeBased: true }).appStateContainer; - appStateContainer.set({ + const compInViewerMode = await mountComponent(propsWithTextBasedMode, { query: { sql: 'SELECT * FROM `index`' }, }); - const compInViewerMode = mountWithIntl( - - - - - - ); expect(findTestSubject(compInViewerMode, 'indexPattern-add-field_btn').length).toBe(0); + + const popularFieldsCount = findTestSubject( + compInViewerMode, + 'fieldListGroupedPopularFields-count' + ); + const selectedFieldsCount = findTestSubject( + compInViewerMode, + 'fieldListGroupedSelectedFields-count' + ); + const availableFieldsCount = findTestSubject( + compInViewerMode, + 'fieldListGroupedAvailableFields-count' + ); + const emptyFieldsCount = findTestSubject(compInViewerMode, 'fieldListGroupedEmptyFields-count'); + const metaFieldsCount = findTestSubject(compInViewerMode, 'fieldListGroupedMetaFields-count'); + const unmappedFieldsCount = findTestSubject( + compInViewerMode, + 'fieldListGroupedUnmappedFields-count' + ); + + expect(selectedFieldsCount.text()).toBe('2'); + expect(popularFieldsCount.exists()).toBe(false); + expect(availableFieldsCount.text()).toBe('4'); + expect(emptyFieldsCount.exists()).toBe(false); + expect(metaFieldsCount.exists()).toBe(false); + expect(unmappedFieldsCount.exists()).toBe(false); + + expect(mockCalcFieldCounts.mock.calls.length).toBe(1); + + expect(findTestSubject(compInViewerMode, 'fieldListGrouped__ariaDescription').text()).toBe( + '2 selected fields. 4 available fields.' + ); }); - it('should not show "Add a field" button in viewer mode', () => { - const mockedServicesInViewerMode = { - ...mockServices, - dataViewEditor: { - ...mockServices.dataViewEditor, - userPermissions: { - ...mockServices.dataViewEditor.userPermissions, - editDataView: jest.fn(() => false), - }, - }, - }; - const appStateContainer = getDiscoverStateMock({ isTimeBased: true }).appStateContainer; - appStateContainer.set({ - query: { query: '', language: 'lucene' }, - filters: [], + it('should render correctly unmapped fields', async () => { + const propsWithUnmappedField = getCompProps({ + hits: [ + buildDataTableRecord(realHits[0], stubLogstashDataView), + buildDataTableRecord( + { + _index: 'logstash-2014.09.09', + _id: '1945', + _score: 1, + _source: { + extension: 'gif', + bytes: 10617.2, + test_unmapped: 'show me too', + }, + }, + stubLogstashDataView + ), + ], }); - const compInViewerMode = mountWithIntl( - - - - - + const compWithUnmapped = await mountComponent(propsWithUnmappedField); + + expect(findTestSubject(compWithUnmapped, 'fieldListGrouped__ariaDescription').text()).toBe( + '1 selected field. 4 popular fields. 3 available fields. 1 unmapped field. 20 empty fields. 2 meta fields.' ); - expect( - mockedServicesInViewerMode.dataViewEditor.userPermissions.editDataView - ).toHaveBeenCalled(); + }); + + it('should not show "Add a field" button in viewer mode', async () => { + const services = createMockServices(); + services.dataViewEditor.userPermissions.editDataView = jest.fn(() => false); + const compInViewerMode = await mountComponent(props, {}, services); + expect(services.dataViewEditor.userPermissions.editDataView).toHaveBeenCalled(); expect(findTestSubject(compInViewerMode, 'dataView-add-field_btn').length).toBe(0); }); }); diff --git a/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar_responsive.tsx b/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar_responsive.tsx index 73271a0260709..13e1287022f3d 100644 --- a/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar_responsive.tsx +++ b/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar_responsive.tsx @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import React, { useCallback, useEffect, useMemo, useReducer, useRef, useState } from 'react'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import { UiCounterMetricType } from '@kbn/analytics'; @@ -19,20 +19,31 @@ import { EuiIcon, EuiLink, EuiPortal, + EuiProgress, EuiShowFor, EuiTitle, } from '@elastic/eui'; import type { DataView, DataViewField, DataViewListItem } from '@kbn/data-views-plugin/public'; +import { + useExistingFieldsFetcher, + useQuerySubscriber, +} from '@kbn/unified-field-list-plugin/public'; import { useDiscoverServices } from '../../../../hooks/use_discover_services'; import { getDefaultFieldFilter } from './lib/field_filter'; import { DiscoverSidebar } from './discover_sidebar'; import { AvailableFields$, DataDocuments$, RecordRawType } from '../../hooks/use_saved_search'; -import { calcFieldCounts } from '../../utils/calc_field_counts'; import { VIEW_MODE } from '../../../../components/view_mode_toggle'; import { FetchStatus } from '../../../types'; import { DISCOVER_TOUR_STEP_ANCHOR_IDS } from '../../../../components/discover_tour'; import { getRawRecordType } from '../../utils/get_raw_record_type'; import { useAppStateSelector } from '../../services/discover_app_state_container'; +import { + discoverSidebarReducer, + getInitialState, + DiscoverSidebarReducerActionType, + DiscoverSidebarReducerStatus, +} from './lib/sidebar_reducer'; +import { calcFieldCounts } from '../../utils/calc_field_counts'; export interface DiscoverSidebarResponsiveProps { /** @@ -111,38 +122,94 @@ export interface DiscoverSidebarResponsiveProps { */ export function DiscoverSidebarResponsive(props: DiscoverSidebarResponsiveProps) { const services = useDiscoverServices(); + const { data, dataViews, core } = services; const isPlainRecord = useAppStateSelector( (state) => getRawRecordType(state.query) === RecordRawType.PLAIN ); const { selectedDataView, onFieldEdited, onDataViewCreated } = props; const [fieldFilter, setFieldFilter] = useState(getDefaultFieldFilter()); const [isFlyoutVisible, setIsFlyoutVisible] = useState(false); - /** - * fieldCounts are used to determine which fields are actually used in the given set of documents - */ - const fieldCounts = useRef | null>(null); - if (fieldCounts.current === null) { - fieldCounts.current = calcFieldCounts(props.documents$.getValue().result!, selectedDataView); - } + const [sidebarState, dispatchSidebarStateAction] = useReducer( + discoverSidebarReducer, + selectedDataView, + getInitialState + ); + const selectedDataViewRef = useRef(selectedDataView); + const showFieldList = sidebarState.status !== DiscoverSidebarReducerStatus.INITIAL; - const [documentState, setDocumentState] = useState(props.documents$.getValue()); useEffect(() => { - const subscription = props.documents$.subscribe((next) => { - if (next.fetchStatus !== documentState.fetchStatus) { - if (next.result) { - fieldCounts.current = calcFieldCounts(next.result, selectedDataView!); - } - setDocumentState({ ...documentState, ...next }); + const subscription = props.documents$.subscribe((documentState) => { + const isPlainRecordType = documentState.recordRawType === RecordRawType.PLAIN; + + switch (documentState?.fetchStatus) { + case FetchStatus.UNINITIALIZED: + dispatchSidebarStateAction({ + type: DiscoverSidebarReducerActionType.RESET, + payload: { + dataView: selectedDataViewRef.current, + }, + }); + break; + case FetchStatus.LOADING: + dispatchSidebarStateAction({ + type: DiscoverSidebarReducerActionType.DOCUMENTS_LOADING, + payload: { + isPlainRecord: isPlainRecordType, + }, + }); + break; + case FetchStatus.COMPLETE: + dispatchSidebarStateAction({ + type: DiscoverSidebarReducerActionType.DOCUMENTS_LOADED, + payload: { + dataView: selectedDataViewRef.current, + fieldCounts: calcFieldCounts(documentState.result), + isPlainRecord: isPlainRecordType, + }, + }); + break; + default: + break; } }); return () => subscription.unsubscribe(); - }, [props.documents$, selectedDataView, documentState, setDocumentState]); + }, [props.documents$, dispatchSidebarStateAction, selectedDataViewRef]); useEffect(() => { - // when data view changes fieldCounts needs to be cleaned up to prevent displaying - // fields of the previous data view - fieldCounts.current = {}; - }, [selectedDataView]); + if (selectedDataView !== selectedDataViewRef.current) { + dispatchSidebarStateAction({ + type: DiscoverSidebarReducerActionType.DATA_VIEW_SWITCHED, + payload: { + dataView: selectedDataView, + }, + }); + selectedDataViewRef.current = selectedDataView; + } + }, [selectedDataView, dispatchSidebarStateAction, selectedDataViewRef]); + + const querySubscriberResult = useQuerySubscriber({ data }); + const isAffectedByGlobalFilter = Boolean(querySubscriberResult.filters?.length); + const { isProcessing, refetchFieldsExistenceInfo } = useExistingFieldsFetcher({ + disableAutoFetching: true, + dataViews: !isPlainRecord && sidebarState.dataView ? [sidebarState.dataView] : [], + query: querySubscriberResult.query, + filters: querySubscriberResult.filters, + fromDate: querySubscriberResult.fromDate, + toDate: querySubscriberResult.toDate, + services: { + data, + dataViews, + core, + }, + }); + + useEffect(() => { + if (sidebarState.status === DiscoverSidebarReducerStatus.COMPLETED) { + refetchFieldsExistenceInfo(); + } + // refetching only if status changes + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [sidebarState.status]); const closeFieldEditor = useRef<() => void | undefined>(); const closeDataViewEditor = useRef<() => void | undefined>(); @@ -180,30 +247,18 @@ export function DiscoverSidebarResponsive(props: DiscoverSidebarResponsiveProps) const canEditDataView = Boolean(dataViewEditor?.userPermissions.editDataView()) || !selectedDataView?.isPersisted(); - useEffect( - () => { - // For an external embeddable like the Field stats - // it is useful to know what fields are populated in the docs fetched - // or what fields are selected by the user - - const fieldCnts = fieldCounts.current ?? {}; + useEffect(() => { + // For an external embeddable like the Field stats + // it is useful to know what fields are populated in the docs fetched + // or what fields are selected by the user - const availableFields = props.columns.length > 0 ? props.columns : Object.keys(fieldCnts); - availableFields$.next({ - fetchStatus: FetchStatus.COMPLETE, - fields: availableFields, - }); - }, - // Using columns.length here instead of columns to avoid array reference changing - // eslint-disable-next-line react-hooks/exhaustive-deps - [ - selectedDataView, - availableFields$, - fieldCounts.current, - documentState.result, - props.columns.length, - ] - ); + const availableFields = + props.columns.length > 0 ? props.columns : Object.keys(sidebarState.fieldCounts || {}); + availableFields$.next({ + fetchStatus: FetchStatus.COMPLETE, + fields: availableFields, + }); + }, [selectedDataView, sidebarState.fieldCounts, props.columns, availableFields$]); const editField = useMemo( () => @@ -259,14 +314,17 @@ export function DiscoverSidebarResponsive(props: DiscoverSidebarResponsiveProps) <> {!props.isClosed && ( + {isProcessing && } )} @@ -322,8 +380,8 @@ export function DiscoverSidebarResponsive(props: DiscoverSidebarResponsiveProps) diff --git a/src/plugins/discover/public/application/main/components/sidebar/lib/field_filter.test.ts b/src/plugins/discover/public/application/main/components/sidebar/lib/field_filter.test.ts index 7020dfcc418eb..1d46ea17d5a06 100644 --- a/src/plugins/discover/public/application/main/components/sidebar/lib/field_filter.test.ts +++ b/src/plugins/discover/public/application/main/components/sidebar/lib/field_filter.test.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { getDefaultFieldFilter, setFieldFilterProp, isFieldFiltered } from './field_filter'; +import { getDefaultFieldFilter, setFieldFilterProp, doesFieldMatchFilters } from './field_filter'; import { DataViewField } from '@kbn/data-views-plugin/public'; describe('field_filter', function () { @@ -14,7 +14,6 @@ describe('field_filter', function () { expect(getDefaultFieldFilter()).toMatchInlineSnapshot(` Object { "aggregatable": null, - "missing": true, "name": "", "searchable": null, "type": "any", @@ -25,7 +24,6 @@ describe('field_filter', function () { const state = getDefaultFieldFilter(); const targetState = { aggregatable: true, - missing: true, name: 'test', searchable: true, type: 'string', @@ -36,7 +34,6 @@ describe('field_filter', function () { expect(actualState).toMatchInlineSnapshot(` Object { "aggregatable": true, - "missing": true, "name": "test", "searchable": true, "type": "string", @@ -78,9 +75,7 @@ describe('field_filter', function () { { filter: { type: 'string' }, result: ['extension'] }, ].forEach((test) => { const filtered = fieldList - .filter((field) => - isFieldFiltered(field, { ...defaultState, ...test.filter }, { bytes: 1, extension: 1 }) - ) + .filter((field) => doesFieldMatchFilters(field, { ...defaultState, ...test.filter })) .map((field) => field.name); expect(filtered).toEqual(test.result); diff --git a/src/plugins/discover/public/application/main/components/sidebar/lib/field_filter.ts b/src/plugins/discover/public/application/main/components/sidebar/lib/field_filter.ts index 0ca0cea75ad5c..1f2ab0b9b64cd 100644 --- a/src/plugins/discover/public/application/main/components/sidebar/lib/field_filter.ts +++ b/src/plugins/discover/public/application/main/components/sidebar/lib/field_filter.ts @@ -9,7 +9,6 @@ import { DataViewField } from '@kbn/data-views-plugin/public'; export interface FieldFilterState { - missing: boolean; type: string; name: string; aggregatable: null | boolean; @@ -18,7 +17,6 @@ export interface FieldFilterState { export function getDefaultFieldFilter(): FieldFilterState { return { - missing: true, type: 'any', name: '', aggregatable: null, @@ -32,9 +30,7 @@ export function setFieldFilterProp( value: string | boolean | null | undefined ): FieldFilterState { const newState = { ...state }; - if (name === 'missing') { - newState.missing = Boolean(value); - } else if (name === 'aggregatable') { + if (name === 'aggregatable') { newState.aggregatable = typeof value !== 'boolean' ? null : value; } else if (name === 'searchable') { newState.searchable = typeof value !== 'boolean' ? null : value; @@ -46,25 +42,18 @@ export function setFieldFilterProp( return newState; } -export function isFieldFiltered( +export function doesFieldMatchFilters( field: DataViewField, - filterState: FieldFilterState, - fieldCounts: Record + filterState: FieldFilterState ): boolean { const matchFilter = filterState.type === 'any' || field.type === filterState.type; const isAggregatable = filterState.aggregatable === null || field.aggregatable === filterState.aggregatable; const isSearchable = filterState.searchable === null || field.searchable === filterState.searchable; - const scriptedOrMissing = - !filterState.missing || - field.type === '_source' || - field.type === 'unknown_selected' || - field.scripted || - fieldCounts[field.name] > 0; const needle = filterState.name ? filterState.name.toLowerCase() : ''; const haystack = `${field.name}${field.displayName || ''}`.toLowerCase(); const matchName = !filterState.name || haystack.indexOf(needle) !== -1; - return matchFilter && isAggregatable && isSearchable && scriptedOrMissing && matchName; + return matchFilter && isAggregatable && isSearchable && matchName; } diff --git a/src/plugins/discover/public/application/main/components/sidebar/lib/get_data_view_field_list.ts b/src/plugins/discover/public/application/main/components/sidebar/lib/get_data_view_field_list.ts index 224015a10537e..5d055d94184ed 100644 --- a/src/plugins/discover/public/application/main/components/sidebar/lib/get_data_view_field_list.ts +++ b/src/plugins/discover/public/application/main/components/sidebar/lib/get_data_view_field_list.ts @@ -7,18 +7,37 @@ */ import { difference } from 'lodash'; -import { DataView, DataViewField } from '@kbn/data-views-plugin/public'; +import type { DataView, DataViewField } from '@kbn/data-views-plugin/public'; +import { fieldWildcardFilter } from '@kbn/kibana-utils-plugin/public'; import { isNestedFieldParent } from '../../../utils/nested_fields'; -export function getDataViewFieldList(dataView?: DataView, fieldCounts?: Record) { - if (!dataView || !fieldCounts) return []; +export function getDataViewFieldList( + dataView: DataView | undefined | null, + fieldCounts: Record | undefined | null, + isPlainRecord: boolean +): DataViewField[] | null { + if (isPlainRecord && !fieldCounts) { + // still loading data + return null; + } - const fieldNamesInDocs = Object.keys(fieldCounts); - const fieldNamesInDataView = dataView.fields.getAll().map((fld) => fld.name); + const currentFieldCounts = fieldCounts || {}; + const sourceFiltersValues = dataView?.getSourceFiltering?.()?.excludes; + let dataViewFields: DataViewField[] = dataView?.fields.getAll() || []; + + if (sourceFiltersValues) { + const filter = fieldWildcardFilter(sourceFiltersValues, dataView.metaFields); + dataViewFields = dataViewFields.filter((field) => { + return filter(field.name) || currentFieldCounts[field.name]; // don't filter out a field which was present in hits (ex. for text-based queries, selected fields) + }); + } + + const fieldNamesInDocs = Object.keys(currentFieldCounts); + const fieldNamesInDataView = dataViewFields.map((fld) => fld.name); const unknownFields: DataViewField[] = []; difference(fieldNamesInDocs, fieldNamesInDataView).forEach((unknownFieldName) => { - if (isNestedFieldParent(unknownFieldName, dataView)) { + if (dataView && isNestedFieldParent(unknownFieldName, dataView)) { unknownFields.push({ displayName: String(unknownFieldName), name: String(unknownFieldName), @@ -33,5 +52,10 @@ export function getDataViewFieldList(dataView?: DataView, fieldCounts?: Record currentFieldCounts[field.name]) + : dataViewFields), + ...unknownFields, + ]; } diff --git a/src/plugins/discover/public/application/main/components/sidebar/lib/group_fields.test.ts b/src/plugins/discover/public/application/main/components/sidebar/lib/group_fields.test.ts index 10d9d4face166..7dee06ec512bc 100644 --- a/src/plugins/discover/public/application/main/components/sidebar/lib/group_fields.test.ts +++ b/src/plugins/discover/public/application/main/components/sidebar/lib/group_fields.test.ts @@ -6,271 +6,106 @@ * Side Public License, v 1. */ -import { groupFields } from './group_fields'; -import { getDefaultFieldFilter } from './field_filter'; -import { DataViewField } from '@kbn/data-views-plugin/public'; - -const fields = [ - { - name: 'category', - type: 'string', - esTypes: ['text'], - count: 1, - scripted: false, - searchable: true, - aggregatable: true, - readFromDocValues: true, - }, - { - name: 'currency', - type: 'string', - esTypes: ['keyword'], - count: 0, - scripted: false, - searchable: true, - aggregatable: true, - readFromDocValues: true, - }, - { - name: 'customer_birth_date', - type: 'date', - esTypes: ['date'], - count: 0, - scripted: false, - searchable: true, - aggregatable: true, - readFromDocValues: true, - }, -]; - -const fieldCounts = { - category: 1, - currency: 1, - customer_birth_date: 1, - unknown_field: 1, -}; +import { type DataViewField } from '@kbn/data-plugin/common'; +import { stubLogstashDataView as dataView } from '@kbn/data-views-plugin/common/data_view.stub'; +import { getSelectedFields, shouldShowField, INITIAL_SELECTED_FIELDS_RESULT } from './group_fields'; describe('group_fields', function () { - it('should group fields in selected, popular, unpopular group', function () { - const fieldFilterState = getDefaultFieldFilter(); - - const actual = groupFields( - fields as DataViewField[], - ['currency'], - 5, - fieldCounts, - fieldFilterState, - false - ); + it('should pick fields as unknown_selected if they are unknown', function () { + const actual = getSelectedFields(dataView, ['currency']); expect(actual).toMatchInlineSnapshot(` Object { - "popular": Array [ + "selectedFields": Array [ Object { - "aggregatable": true, - "count": 1, - "esTypes": Array [ - "text", - ], - "name": "category", - "readFromDocValues": true, - "scripted": false, - "searchable": true, - "type": "string", - }, - ], - "selected": Array [ - Object { - "aggregatable": true, - "count": 0, - "esTypes": Array [ - "keyword", - ], + "displayName": "currency", "name": "currency", - "readFromDocValues": true, - "scripted": false, - "searchable": true, - "type": "string", - }, - ], - "unpopular": Array [ - Object { - "aggregatable": true, - "count": 0, - "esTypes": Array [ - "date", - ], - "name": "customer_birth_date", - "readFromDocValues": true, - "scripted": false, - "searchable": true, - "type": "date", + "type": "unknown_selected", }, ], + "selectedFieldsMap": Object { + "currency": true, + }, } `); }); - it('should group fields in selected, popular, unpopular group if they contain multifields', function () { - const category = { - name: 'category', - type: 'string', - esTypes: ['text'], - count: 1, - scripted: false, - searchable: true, - aggregatable: true, - readFromDocValues: true, - }; - const currency = { - name: 'currency', - displayName: 'currency', - kbnFieldType: { - esTypes: ['string', 'text', 'keyword', '_type', '_id'], - filterable: true, - name: 'string', - sortable: true, - }, - spec: { - esTypes: ['text'], - name: 'category', - }, - scripted: false, - searchable: true, - aggregatable: true, - readFromDocValues: true, - }; - const currencyKeyword = { - name: 'currency.keyword', - displayName: 'currency.keyword', - type: 'string', - esTypes: ['keyword'], - kbnFieldType: { - esTypes: ['string', 'text', 'keyword', '_type', '_id'], - filterable: true, - name: 'string', - sortable: true, - }, - spec: { - aggregatable: true, - esTypes: ['keyword'], - name: 'category.keyword', - readFromDocValues: true, - searchable: true, - shortDotsEnable: false, - subType: { - multi: { - parent: 'currency', - }, - }, - }, - scripted: false, - searchable: true, - aggregatable: true, - readFromDocValues: false, - }; - const fieldsToGroup = [category, currency, currencyKeyword] as DataViewField[]; - const fieldFilterState = getDefaultFieldFilter(); - - const actual = groupFields(fieldsToGroup, ['currency'], 5, fieldCounts, fieldFilterState, true); + it('should work correctly if no columns selected', function () { + expect(getSelectedFields(dataView, [])).toBe(INITIAL_SELECTED_FIELDS_RESULT); + expect(getSelectedFields(dataView, ['_source'])).toBe(INITIAL_SELECTED_FIELDS_RESULT); + }); - expect(actual.popular).toEqual([category]); - expect(actual.selected).toEqual([currency]); - expect(actual.unpopular).toEqual([]); + it('should pick fields into selected group', function () { + const actual = getSelectedFields(dataView, ['bytes', '@timestamp']); + expect(actual.selectedFields.map((field) => field.name)).toEqual(['bytes', '@timestamp']); + expect(actual.selectedFieldsMap).toStrictEqual({ + bytes: true, + '@timestamp': true, + }); }); - it('should sort selected fields by columns order ', function () { - const fieldFilterState = getDefaultFieldFilter(); + it('should pick fields into selected group if they contain multifields', function () { + const actual = getSelectedFields(dataView, ['machine.os', 'machine.os.raw']); + expect(actual.selectedFields.map((field) => field.name)).toEqual([ + 'machine.os', + 'machine.os.raw', + ]); + expect(actual.selectedFieldsMap).toStrictEqual({ + 'machine.os': true, + 'machine.os.raw': true, + }); + }); - const actual1 = groupFields( - fields as DataViewField[], - ['customer_birth_date', 'currency', 'unknown'], - 5, - fieldCounts, - fieldFilterState, - false - ); - expect(actual1.selected.map((field) => field.name)).toEqual([ - 'customer_birth_date', - 'currency', + it('should sort selected fields by columns order', function () { + const actual1 = getSelectedFields(dataView, ['bytes', 'extension.keyword', 'unknown']); + expect(actual1.selectedFields.map((field) => field.name)).toEqual([ + 'bytes', + 'extension.keyword', 'unknown', ]); + expect(actual1.selectedFieldsMap).toStrictEqual({ + bytes: true, + 'extension.keyword': true, + unknown: true, + }); - const actual2 = groupFields( - fields as DataViewField[], - ['currency', 'customer_birth_date', 'unknown'], - 5, - fieldCounts, - fieldFilterState, - false - ); - expect(actual2.selected.map((field) => field.name)).toEqual([ - 'currency', - 'customer_birth_date', + const actual2 = getSelectedFields(dataView, ['extension', 'bytes', 'unknown']); + expect(actual2.selectedFields.map((field) => field.name)).toEqual([ + 'extension', + 'bytes', 'unknown', ]); + expect(actual2.selectedFieldsMap).toStrictEqual({ + extension: true, + bytes: true, + unknown: true, + }); }); - it('should filter fields by a given name', function () { - const fieldFilterState = { ...getDefaultFieldFilter(), ...{ name: 'curr' } }; + it('should show any fields if for text-based searches', function () { + expect(shouldShowField(dataView.getFieldByName('bytes'), true)).toBe(true); + expect(shouldShowField({ type: 'unknown', name: 'unknown' } as DataViewField, true)).toBe(true); + expect(shouldShowField({ type: '_source', name: 'source' } as DataViewField, true)).toBe(false); + }); - const actual1 = groupFields( - fields as DataViewField[], - ['customer_birth_date', 'currency', 'unknown'], - 5, - fieldCounts, - fieldFilterState, + it('should show fields excluding subfields when searched from source', function () { + expect(shouldShowField(dataView.getFieldByName('extension'), false)).toBe(true); + expect(shouldShowField(dataView.getFieldByName('extension.keyword'), false)).toBe(false); + expect(shouldShowField({ type: 'unknown', name: 'unknown' } as DataViewField, false)).toBe( + true + ); + expect(shouldShowField({ type: '_source', name: 'source' } as DataViewField, false)).toBe( false ); - expect(actual1.selected.map((field) => field.name)).toEqual(['currency']); }); - it('excludes unmapped fields if showUnmappedFields set to false', function () { - const fieldFilterState = getDefaultFieldFilter(); - const fieldsWithUnmappedField = [...fields]; - fieldsWithUnmappedField.push({ - name: 'unknown_field', - type: 'unknown', - esTypes: ['unknown'], - count: 1, - scripted: false, - searchable: true, - aggregatable: true, - readFromDocValues: true, - }); - - const actual = groupFields( - fieldsWithUnmappedField as DataViewField[], - ['customer_birth_date', 'currency'], - 5, - fieldCounts, - fieldFilterState, + it('should show fields excluding subfields when fields api is used', function () { + expect(shouldShowField(dataView.getFieldByName('extension'), false)).toBe(true); + expect(shouldShowField(dataView.getFieldByName('extension.keyword'), false)).toBe(false); + expect(shouldShowField({ type: 'unknown', name: 'unknown' } as DataViewField, false)).toBe( true ); - expect(actual.unpopular).toEqual([]); - }); - - it('includes unmapped fields when reading from source', function () { - const fieldFilterState = getDefaultFieldFilter(); - const fieldsWithUnmappedField = [...fields]; - fieldsWithUnmappedField.push({ - name: 'unknown_field', - type: 'unknown', - esTypes: ['unknown'], - count: 0, - scripted: false, - searchable: false, - aggregatable: false, - readFromDocValues: false, - }); - - const actual = groupFields( - fieldsWithUnmappedField as DataViewField[], - ['customer_birth_date', 'currency'], - 5, - fieldCounts, - fieldFilterState, + expect(shouldShowField({ type: '_source', name: 'source' } as DataViewField, false)).toBe( false ); - expect(actual.unpopular.map((field) => field.name)).toEqual(['unknown_field']); }); }); diff --git a/src/plugins/discover/public/application/main/components/sidebar/lib/group_fields.tsx b/src/plugins/discover/public/application/main/components/sidebar/lib/group_fields.tsx index 0d7d535538c44..eaae1c90d3833 100644 --- a/src/plugins/discover/public/application/main/components/sidebar/lib/group_fields.tsx +++ b/src/plugins/discover/public/application/main/components/sidebar/lib/group_fields.tsx @@ -6,90 +6,66 @@ * Side Public License, v 1. */ -import { DataViewField, getFieldSubtypeMulti } from '@kbn/data-views-plugin/public'; -import { FieldFilterState, isFieldFiltered } from './field_filter'; +import { uniqBy } from 'lodash'; +import { + type DataViewField, + type DataView, + getFieldSubtypeMulti, +} from '@kbn/data-views-plugin/public'; -interface GroupedFields { - selected: DataViewField[]; - popular: DataViewField[]; - unpopular: DataViewField[]; +export function shouldShowField(field: DataViewField | undefined, isPlainRecord: boolean): boolean { + if (!field?.type || field.type === '_source') { + return false; + } + if (isPlainRecord) { + // exclude only `_source` for plain records + return true; + } + // exclude subfields + return !getFieldSubtypeMulti(field?.spec); } -/** - * group the fields into selected, popular and unpopular, filter by fieldFilterState - */ -export function groupFields( - fields: DataViewField[] | null, - columns: string[], - popularLimit: number, - fieldCounts: Record | undefined, - fieldFilterState: FieldFilterState, - useNewFieldsApi: boolean -): GroupedFields { - const showUnmappedFields = useNewFieldsApi; - const result: GroupedFields = { - selected: [], - popular: [], - unpopular: [], - }; - if (!Array.isArray(fields) || !Array.isArray(columns) || typeof fieldCounts !== 'object') { - return result; - } +// to avoid rerenderings for empty state +export const INITIAL_SELECTED_FIELDS_RESULT = { + selectedFields: [], + selectedFieldsMap: {}, +}; - const popular = fields - .filter((field) => !columns.includes(field.name) && field.count) - .sort((a: DataViewField, b: DataViewField) => (b.count || 0) - (a.count || 0)) - .map((field) => field.name) - .slice(0, popularLimit); +export interface SelectedFieldsResult { + selectedFields: DataViewField[]; + selectedFieldsMap: Record; +} - const compareFn = (a: DataViewField, b: DataViewField) => { - if (!a.displayName) { - return 0; - } - return a.displayName.localeCompare(b.displayName || ''); +export function getSelectedFields( + dataView: DataView | undefined, + columns: string[] +): SelectedFieldsResult { + const result: SelectedFieldsResult = { + selectedFields: [], + selectedFieldsMap: {}, }; - const fieldsSorted = fields.sort(compareFn); - - for (const field of fieldsSorted) { - if (!isFieldFiltered(field, fieldFilterState, fieldCounts)) { - continue; - } - - const subTypeMulti = getFieldSubtypeMulti(field?.spec); - const isSubfield = useNewFieldsApi && subTypeMulti; - if (columns.includes(field.name)) { - result.selected.push(field); - } else if (popular.includes(field.name) && field.type !== '_source') { - if (!isSubfield) { - result.popular.push(field); - } - } else if (field.type !== '_source') { - // do not show unmapped fields unless explicitly specified - // do not add subfields to this list - if (useNewFieldsApi && (field.type !== 'unknown' || showUnmappedFields) && !isSubfield) { - result.unpopular.push(field); - } else if (!useNewFieldsApi) { - result.unpopular.push(field); - } - } + if (!Array.isArray(columns) || !columns.length) { + return INITIAL_SELECTED_FIELDS_RESULT; } + // add selected columns, that are not part of the data view, to be removable for (const column of columns) { - const tmpField = { - name: column, - displayName: column, - type: 'unknown_selected', - } as DataViewField; - if ( - !result.selected.find((field) => field.name === column) && - isFieldFiltered(tmpField, fieldFilterState, fieldCounts) - ) { - result.selected.push(tmpField); - } + const selectedField = + dataView?.getFieldByName?.(column) || + ({ + name: column, + displayName: column, + type: 'unknown_selected', + } as DataViewField); + result.selectedFields.push(selectedField); + result.selectedFieldsMap[selectedField.name] = true; + } + + result.selectedFields = uniqBy(result.selectedFields, 'name'); + + if (result.selectedFields.length === 1 && result.selectedFields[0].name === '_source') { + return INITIAL_SELECTED_FIELDS_RESULT; } - result.selected.sort((a, b) => { - return columns.indexOf(a.name) - columns.indexOf(b.name); - }); return result; } diff --git a/src/plugins/discover/public/application/main/components/sidebar/lib/sidebar_reducer.test.ts b/src/plugins/discover/public/application/main/components/sidebar/lib/sidebar_reducer.test.ts new file mode 100644 index 0000000000000..131f9c358317f --- /dev/null +++ b/src/plugins/discover/public/application/main/components/sidebar/lib/sidebar_reducer.test.ts @@ -0,0 +1,220 @@ +/* + * Copyright 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 { + stubDataViewWithoutTimeField, + stubLogstashDataView as dataView, +} from '@kbn/data-views-plugin/common/data_view.stub'; +import { + discoverSidebarReducer, + DiscoverSidebarReducerActionType, + DiscoverSidebarReducerState, + DiscoverSidebarReducerStatus, + getInitialState, +} from './sidebar_reducer'; +import { DataViewField } from '@kbn/data-views-plugin/common'; + +describe('sidebar reducer', function () { + it('should set an initial state', function () { + expect(getInitialState(dataView)).toEqual( + expect.objectContaining({ + dataView, + allFields: null, + fieldCounts: null, + status: DiscoverSidebarReducerStatus.INITIAL, + }) + ); + }); + + it('should handle "documents loading" action', function () { + const state: DiscoverSidebarReducerState = { + ...getInitialState(dataView), + allFields: [dataView.fields[0]], + }; + const resultForDocuments = discoverSidebarReducer(state, { + type: DiscoverSidebarReducerActionType.DOCUMENTS_LOADING, + payload: { + isPlainRecord: false, + }, + }); + expect(resultForDocuments).toEqual( + expect.objectContaining({ + dataView, + allFields: state.allFields, + fieldCounts: null, + status: DiscoverSidebarReducerStatus.PROCESSING, + }) + ); + const resultForTextBasedQuery = discoverSidebarReducer(state, { + type: DiscoverSidebarReducerActionType.DOCUMENTS_LOADING, + payload: { + isPlainRecord: true, + }, + }); + expect(resultForTextBasedQuery).toEqual( + expect.objectContaining({ + dataView, + allFields: null, + fieldCounts: null, + status: DiscoverSidebarReducerStatus.PROCESSING, + }) + ); + }); + + it('should handle "documents loaded" action', function () { + const dataViewFieldName = stubDataViewWithoutTimeField.fields[0].name; + const unmappedFieldName = 'field1'; + const fieldCounts = { [unmappedFieldName]: 1, [dataViewFieldName]: 1 }; + const state: DiscoverSidebarReducerState = getInitialState(dataView); + const resultForDocuments = discoverSidebarReducer(state, { + type: DiscoverSidebarReducerActionType.DOCUMENTS_LOADED, + payload: { + isPlainRecord: false, + dataView: stubDataViewWithoutTimeField, + fieldCounts, + }, + }); + expect(resultForDocuments).toStrictEqual({ + dataView: stubDataViewWithoutTimeField, + allFields: [ + ...stubDataViewWithoutTimeField.fields, + // merging in unmapped fields + { + displayName: unmappedFieldName, + name: unmappedFieldName, + type: 'unknown', + } as DataViewField, + ], + fieldCounts, + status: DiscoverSidebarReducerStatus.COMPLETED, + }); + + const resultForTextBasedQuery = discoverSidebarReducer(state, { + type: DiscoverSidebarReducerActionType.DOCUMENTS_LOADED, + payload: { + isPlainRecord: true, + dataView: stubDataViewWithoutTimeField, + fieldCounts, + }, + }); + expect(resultForTextBasedQuery).toStrictEqual({ + dataView: stubDataViewWithoutTimeField, + allFields: [ + stubDataViewWithoutTimeField.fields.find((field) => field.name === dataViewFieldName), + // merging in unmapped fields + { + displayName: 'field1', + name: 'field1', + type: 'unknown', + } as DataViewField, + ], + fieldCounts, + status: DiscoverSidebarReducerStatus.COMPLETED, + }); + + const resultForTextBasedQueryWhileLoading = discoverSidebarReducer(state, { + type: DiscoverSidebarReducerActionType.DOCUMENTS_LOADED, + payload: { + isPlainRecord: true, + dataView: stubDataViewWithoutTimeField, + fieldCounts: null, + }, + }); + expect(resultForTextBasedQueryWhileLoading).toStrictEqual({ + dataView: stubDataViewWithoutTimeField, + allFields: null, + fieldCounts: null, + status: DiscoverSidebarReducerStatus.PROCESSING, + }); + }); + + it('should handle "data view switched" action', function () { + const state: DiscoverSidebarReducerState = getInitialState(dataView); + const resultForTheSameDataView = discoverSidebarReducer(state, { + type: DiscoverSidebarReducerActionType.DATA_VIEW_SWITCHED, + payload: { + dataView: state.dataView, + }, + }); + expect(resultForTheSameDataView).toBe(state); + + const resultForAnotherDataView = discoverSidebarReducer(state, { + type: DiscoverSidebarReducerActionType.DATA_VIEW_SWITCHED, + payload: { + dataView: stubDataViewWithoutTimeField, + }, + }); + expect(resultForAnotherDataView).toStrictEqual({ + dataView: stubDataViewWithoutTimeField, + allFields: null, + fieldCounts: null, + status: DiscoverSidebarReducerStatus.INITIAL, + }); + + const resultForAnotherDataViewAfterProcessing = discoverSidebarReducer( + { + ...state, + status: DiscoverSidebarReducerStatus.PROCESSING, + }, + { + type: DiscoverSidebarReducerActionType.DATA_VIEW_SWITCHED, + payload: { + dataView: stubDataViewWithoutTimeField, + }, + } + ); + expect(resultForAnotherDataViewAfterProcessing).toStrictEqual({ + dataView: stubDataViewWithoutTimeField, + allFields: null, + fieldCounts: null, + status: DiscoverSidebarReducerStatus.PROCESSING, + }); + + const resultForAnotherDataViewAfterCompleted = discoverSidebarReducer( + { + ...state, + status: DiscoverSidebarReducerStatus.COMPLETED, + }, + { + type: DiscoverSidebarReducerActionType.DATA_VIEW_SWITCHED, + payload: { + dataView: stubDataViewWithoutTimeField, + }, + } + ); + expect(resultForAnotherDataViewAfterCompleted).toStrictEqual({ + dataView: stubDataViewWithoutTimeField, + allFields: null, + fieldCounts: null, + status: DiscoverSidebarReducerStatus.INITIAL, + }); + }); + + it('should handle "reset" action', function () { + const state: DiscoverSidebarReducerState = { + ...getInitialState(dataView), + allFields: [dataView.fields[0]], + fieldCounts: {}, + status: DiscoverSidebarReducerStatus.COMPLETED, + }; + const resultForDocuments = discoverSidebarReducer(state, { + type: DiscoverSidebarReducerActionType.RESET, + payload: { + dataView: stubDataViewWithoutTimeField, + }, + }); + expect(resultForDocuments).toEqual( + expect.objectContaining({ + dataView: stubDataViewWithoutTimeField, + allFields: null, + fieldCounts: null, + status: DiscoverSidebarReducerStatus.INITIAL, + }) + ); + }); +}); diff --git a/src/plugins/discover/public/application/main/components/sidebar/lib/sidebar_reducer.ts b/src/plugins/discover/public/application/main/components/sidebar/lib/sidebar_reducer.ts new file mode 100644 index 0000000000000..0c579275029b1 --- /dev/null +++ b/src/plugins/discover/public/application/main/components/sidebar/lib/sidebar_reducer.ts @@ -0,0 +1,115 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 DataView, type DataViewField } from '@kbn/data-views-plugin/common'; +import { getDataViewFieldList } from './get_data_view_field_list'; + +export enum DiscoverSidebarReducerActionType { + RESET = 'RESET', + DATA_VIEW_SWITCHED = 'DATA_VIEW_SWITCHED', + DOCUMENTS_LOADED = 'DOCUMENTS_LOADED', + DOCUMENTS_LOADING = 'DOCUMENTS_LOADING', +} + +type DiscoverSidebarReducerAction = + | { + type: DiscoverSidebarReducerActionType.RESET; + payload: { + dataView: DataView | null | undefined; + }; + } + | { + type: DiscoverSidebarReducerActionType.DATA_VIEW_SWITCHED; + payload: { + dataView: DataView | null | undefined; + }; + } + | { + type: DiscoverSidebarReducerActionType.DOCUMENTS_LOADING; + payload: { + isPlainRecord: boolean; + }; + } + | { + type: DiscoverSidebarReducerActionType.DOCUMENTS_LOADED; + payload: { + fieldCounts: DiscoverSidebarReducerState['fieldCounts']; + isPlainRecord: boolean; + dataView: DataView | null | undefined; + }; + }; + +export enum DiscoverSidebarReducerStatus { + INITIAL = 'INITIAL', + PROCESSING = 'PROCESSING', + COMPLETED = 'COMPLETED', +} + +export interface DiscoverSidebarReducerState { + dataView: DataView | null | undefined; + allFields: DataViewField[] | null; + fieldCounts: Record | null; + status: DiscoverSidebarReducerStatus; +} + +export function getInitialState(dataView?: DataView | null): DiscoverSidebarReducerState { + return { + dataView, + allFields: null, + fieldCounts: null, + status: DiscoverSidebarReducerStatus.INITIAL, + }; +} + +export function discoverSidebarReducer( + state: DiscoverSidebarReducerState, + action: DiscoverSidebarReducerAction +): DiscoverSidebarReducerState { + switch (action.type) { + case DiscoverSidebarReducerActionType.RESET: + return getInitialState(action.payload.dataView); + case DiscoverSidebarReducerActionType.DATA_VIEW_SWITCHED: + return state.dataView === action.payload.dataView + ? state // already updated in `DOCUMENTS_LOADED` + : { + ...state, + dataView: action.payload.dataView, + fieldCounts: null, + allFields: null, + status: + state.status === DiscoverSidebarReducerStatus.COMPLETED + ? DiscoverSidebarReducerStatus.INITIAL + : state.status, + }; + case DiscoverSidebarReducerActionType.DOCUMENTS_LOADING: + return { + ...state, + fieldCounts: null, + allFields: action.payload.isPlainRecord ? null : state.allFields, + status: DiscoverSidebarReducerStatus.PROCESSING, + }; + case DiscoverSidebarReducerActionType.DOCUMENTS_LOADED: + const mappedAndUnmappedFields = getDataViewFieldList( + action.payload.dataView, + action.payload.fieldCounts, + action.payload.isPlainRecord + ); + return { + ...state, + dataView: action.payload.dataView, + fieldCounts: action.payload.fieldCounts, + allFields: mappedAndUnmappedFields, + status: + mappedAndUnmappedFields === null + ? DiscoverSidebarReducerStatus.PROCESSING + : DiscoverSidebarReducerStatus.COMPLETED, + }; + } + + return state; +} diff --git a/src/plugins/discover/public/application/main/components/top_nav/open_search_panel.tsx b/src/plugins/discover/public/application/main/components/top_nav/open_search_panel.tsx index 81572cf1ebb53..665ed87323188 100644 --- a/src/plugins/discover/public/application/main/components/top_nav/open_search_panel.tsx +++ b/src/plugins/discover/public/application/main/components/top_nav/open_search_panel.tsx @@ -7,7 +7,7 @@ */ import React from 'react'; -import rison from 'rison-node'; +import rison from '@kbn/rison'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import { diff --git a/src/plugins/discover/public/application/main/discover_main_app.test.tsx b/src/plugins/discover/public/application/main/discover_main_app.test.tsx index 599eaa57aea3d..c487d78836564 100644 --- a/src/plugins/discover/public/application/main/discover_main_app.test.tsx +++ b/src/plugins/discover/public/application/main/discover_main_app.test.tsx @@ -6,6 +6,7 @@ * Side Public License, v 1. */ import React from 'react'; +import { act } from 'react-dom/test-utils'; import { mountWithIntl } from '@kbn/test-jest-helpers'; import { DataViewListItem } from '@kbn/data-views-plugin/public'; import { dataViewMock } from '../../__mocks__/data_view'; @@ -23,7 +24,7 @@ setHeaderActionMenuMounter(jest.fn()); setUrlTracker(urlTrackerMock); describe('DiscoverMainApp', () => { - test('renders', () => { + test('renders', async () => { const dataViewList = [dataViewMock].map((ip) => { return { ...ip, ...{ attributes: { title: ip.title } } }; }) as unknown as DataViewListItem[]; @@ -35,15 +36,21 @@ describe('DiscoverMainApp', () => { initialEntries: ['/'], }); - const component = mountWithIntl( - - - - - - ); + await act(async () => { + const component = await mountWithIntl( + + + + + + ); - expect(component.find(DiscoverTopNav).exists()).toBe(true); - expect(component.find(DiscoverTopNav).prop('dataView')).toEqual(dataViewMock); + // wait for lazy modules + await new Promise((resolve) => setTimeout(resolve, 0)); + await component.update(); + + expect(component.find(DiscoverTopNav).exists()).toBe(true); + expect(component.find(DiscoverTopNav).prop('dataView')).toEqual(dataViewMock); + }); }); }); diff --git a/src/plugins/discover/public/application/main/utils/calc_field_counts.test.ts b/src/plugins/discover/public/application/main/utils/calc_field_counts.test.ts index 5116bb78789ca..0aace63eb7754 100644 --- a/src/plugins/discover/public/application/main/utils/calc_field_counts.test.ts +++ b/src/plugins/discover/public/application/main/utils/calc_field_counts.test.ts @@ -7,7 +7,6 @@ */ import { calcFieldCounts } from './calc_field_counts'; -import { dataViewMock } from '../../../__mocks__/data_view'; import { buildDataTableRecord } from '../../../utils/build_data_record'; describe('calcFieldCounts', () => { @@ -16,7 +15,7 @@ describe('calcFieldCounts', () => { { _id: '1', _index: 'test', _source: { message: 'test1', bytes: 20 } }, { _id: '2', _index: 'test', _source: { name: 'test2', extension: 'jpg' } }, ].map((row) => buildDataTableRecord(row)); - const result = calcFieldCounts(rows, dataViewMock); + const result = calcFieldCounts(rows); expect(result).toMatchInlineSnapshot(` Object { "bytes": 1, @@ -31,7 +30,7 @@ describe('calcFieldCounts', () => { { _id: '1', _index: 'test', _source: { message: 'test1', bytes: 20 } }, { _id: '2', _index: 'test', _source: { name: 'test2', extension: 'jpg' } }, ].map((row) => buildDataTableRecord(row)); - const result = calcFieldCounts(rows, dataViewMock); + const result = calcFieldCounts(rows); expect(result).toMatchInlineSnapshot(` Object { "bytes": 1, diff --git a/src/plugins/discover/public/application/main/utils/calc_field_counts.ts b/src/plugins/discover/public/application/main/utils/calc_field_counts.ts index 10cdd92d9a250..2fd089816f9fb 100644 --- a/src/plugins/discover/public/application/main/utils/calc_field_counts.ts +++ b/src/plugins/discover/public/application/main/utils/calc_field_counts.ts @@ -5,24 +5,24 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ -import { DataView } from '@kbn/data-views-plugin/public'; import { DataTableRecord } from '../../../types'; /** * This function is calculating stats of the available fields, for usage in sidebar and sharing * Note that this values aren't displayed, but used for internal calculations */ -export function calcFieldCounts(rows?: DataTableRecord[], dataView?: DataView) { +export function calcFieldCounts(rows?: DataTableRecord[]) { const counts: Record = {}; - if (!rows || !dataView) { + if (!rows) { return {}; } - for (const hit of rows) { + + rows.forEach((hit) => { const fields = Object.keys(hit.flattened); - for (const fieldName of fields) { + fields.forEach((fieldName) => { counts[fieldName] = (counts[fieldName] || 0) + 1; - } - } + }); + }); return counts; } diff --git a/src/plugins/discover/public/application/main/utils/fetch_chart.test.ts b/src/plugins/discover/public/application/main/utils/fetch_chart.test.ts index e1020404d3996..af2090347124d 100644 --- a/src/plugins/discover/public/application/main/utils/fetch_chart.test.ts +++ b/src/plugins/discover/public/application/main/utils/fetch_chart.test.ts @@ -92,6 +92,10 @@ describe('test fetchCharts', () => { "interval": "auto", "min_doc_count": 1, "scaleMetricValues": false, + "timeRange": Object { + "from": "now-15m", + "to": "now", + }, "useNormalizedEsInterval": true, "used_interval": "0ms", }, diff --git a/src/plugins/discover/public/components/discover_tour/discover_tour_anchors.tsx b/src/plugins/discover/public/components/discover_tour/discover_tour_anchors.tsx index 030876291aeea..2344acf3e60d9 100644 --- a/src/plugins/discover/public/components/discover_tour/discover_tour_anchors.tsx +++ b/src/plugins/discover/public/components/discover_tour/discover_tour_anchors.tsx @@ -14,7 +14,7 @@ export const DISCOVER_TOUR_STEP_ANCHOR_IDS = { }; export const DISCOVER_TOUR_STEP_ANCHORS = { - addFields: `#${DISCOVER_TOUR_STEP_ANCHOR_IDS.addFields}`, + addFields: `[data-test-subj="fieldListGroupedAvailableFields-count"], #${DISCOVER_TOUR_STEP_ANCHOR_IDS.addFields}`, reorderColumns: '[data-test-subj="dataGridColumnSelectorButton"]', sort: '[data-test-subj="dataGridColumnSortingButton"]', changeRowHeight: '[data-test-subj="dataGridDisplaySelectorButton"]', diff --git a/src/plugins/discover/public/utils/get_type_for_field_icon.test.ts b/src/plugins/discover/public/utils/get_type_for_field_icon.test.ts index bce15f5d5eb22..33decc463d013 100644 --- a/src/plugins/discover/public/utils/get_type_for_field_icon.test.ts +++ b/src/plugins/discover/public/utils/get_type_for_field_icon.test.ts @@ -36,4 +36,13 @@ describe('getTypeForFieldIcon', () => { } as DataViewField) ).toBe('version'); }); + + it('extracts type for meta fields', () => { + expect( + getTypeForFieldIcon({ + type: 'string', + esTypes: ['_id'], + } as DataViewField) + ).toBe('string'); + }); }); diff --git a/src/plugins/discover/public/utils/get_type_for_field_icon.ts b/src/plugins/discover/public/utils/get_type_for_field_icon.ts index 429fdf87991eb..3d05e8365e59c 100644 --- a/src/plugins/discover/public/utils/get_type_for_field_icon.ts +++ b/src/plugins/discover/public/utils/get_type_for_field_icon.ts @@ -13,5 +13,10 @@ import { DataViewField } from '@kbn/data-views-plugin/common'; * * We define custom logic for Discover in order to distinguish between various "string" types. */ -export const getTypeForFieldIcon = (field: DataViewField) => - field.type === 'string' && field.esTypes ? field.esTypes[0] : field.type; +export const getTypeForFieldIcon = (field: DataViewField) => { + const esType = field.esTypes?.[0] || null; + if (esType && ['_id', '_index'].includes(esType)) { + return field.type; + } + return field.type === 'string' && esType ? esType : field.type; +}; diff --git a/src/plugins/guided_onboarding/.i18nrc.json b/src/plugins/guided_onboarding/.i18nrc.json index 4be5bba087b2a..f168a83139f97 100755 --- a/src/plugins/guided_onboarding/.i18nrc.json +++ b/src/plugins/guided_onboarding/.i18nrc.json @@ -3,5 +3,5 @@ "paths": { "guidedOnboarding": "." }, - "translations": ["translations/ja-JP.json"] + "translations": [] } diff --git a/src/plugins/guided_onboarding/common/index.ts b/src/plugins/guided_onboarding/common/index.ts new file mode 100644 index 0000000000000..fb3a9c6c23333 --- /dev/null +++ b/src/plugins/guided_onboarding/common/index.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { PLUGIN_ID, PLUGIN_NAME, API_BASE_PATH } from './constants'; +export { testGuideConfig } from './test_guide_config'; +export type { PluginStatus, PluginState, StepConfig, GuideConfig, GuidesConfig } from './types'; diff --git a/src/plugins/guided_onboarding/public/constants/guides_config/test_guide.ts b/src/plugins/guided_onboarding/common/test_guide_config.ts similarity index 98% rename from src/plugins/guided_onboarding/public/constants/guides_config/test_guide.ts rename to src/plugins/guided_onboarding/common/test_guide_config.ts index 8a0e13cb367ac..9dc252d83e8b0 100644 --- a/src/plugins/guided_onboarding/public/constants/guides_config/test_guide.ts +++ b/src/plugins/guided_onboarding/common/test_guide_config.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import type { GuideConfig } from '../../types'; +import type { GuideConfig } from './types'; export const testGuideConfig: GuideConfig = { title: 'Test guide for development', diff --git a/src/plugins/guided_onboarding/common/types.ts b/src/plugins/guided_onboarding/common/types.ts index f7f077c0d2b82..667390aa342fb 100644 --- a/src/plugins/guided_onboarding/common/types.ts +++ b/src/plugins/guided_onboarding/common/types.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { GuideState } from '@kbn/guided-onboarding'; +import type { GuideId, GuideState, GuideStepIds, StepStatus } from '@kbn/guided-onboarding'; /** * Guided onboarding overall status: @@ -31,3 +31,42 @@ export interface PluginState { isActivePeriod: boolean; activeGuide?: GuideState; } + +export interface StepConfig { + id: GuideStepIds; + title: string; + // description is displayed as a single paragraph, can be combined with description list + description?: string; + // description list is displayed as an unordered list, can be combined with description + descriptionList?: Array; + location?: { + appID: string; + path: string; + }; + status?: StepStatus; + integration?: string; + manualCompletion?: { + title: string; + description: string; + readyToCompleteOnNavigation?: boolean; + }; +} + +export interface GuideConfig { + title: string; + description: string; + guideName: string; + docs?: { + text: string; + url: string; + }; + completedGuideRedirectLocation?: { + appID: string; + path: string; + }; + steps: StepConfig[]; +} + +export type GuidesConfig = { + [key in GuideId]: GuideConfig; +}; diff --git a/src/plugins/guided_onboarding/public/components/guide_button.tsx b/src/plugins/guided_onboarding/public/components/guide_button.tsx index c8e17e749b125..7bff376c5af4b 100644 --- a/src/plugins/guided_onboarding/public/components/guide_button.tsx +++ b/src/plugins/guided_onboarding/public/components/guide_button.tsx @@ -11,12 +11,12 @@ import { EuiButton } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import type { GuideState } from '@kbn/guided-onboarding'; -import type { PluginState } from '../../common/types'; -import { getStepConfig } from '../services/helpers'; +import type { GuideConfig, PluginState } from '../../common'; import { GuideButtonPopover } from './guide_button_popover'; interface GuideButtonProps { pluginState: PluginState | undefined; + guideConfig: GuideConfig | undefined; toggleGuidePanel: () => void; isGuidePanelOpen: boolean; navigateToLandingPage: () => void; @@ -42,6 +42,7 @@ const getStepNumber = (state: GuideState): number | undefined => { export const GuideButton = ({ pluginState, + guideConfig, toggleGuidePanel, isGuidePanelOpen, navigateToLandingPage, @@ -101,7 +102,7 @@ export const GuideButton = ({ ); if (stepReadyToComplete) { - const stepConfig = getStepConfig(pluginState.activeGuide.guideId, stepReadyToComplete.id); + const stepConfig = guideConfig?.steps.find((step) => step.id === stepReadyToComplete.id); // check if the stepConfig has manualCompletion info if (stepConfig && stepConfig.manualCompletion) { return ( diff --git a/src/plugins/guided_onboarding/public/components/guide_panel.test.tsx b/src/plugins/guided_onboarding/public/components/guide_panel.test.tsx index a552444f8b0f1..cff22fd433bdc 100644 --- a/src/plugins/guided_onboarding/public/components/guide_panel.test.tsx +++ b/src/plugins/guided_onboarding/public/components/guide_panel.test.tsx @@ -15,11 +15,12 @@ import { httpServiceMock } from '@kbn/core/public/mocks'; import type { HttpSetup } from '@kbn/core/public'; import { registerTestBed, TestBed } from '@kbn/test-jest-helpers'; -import type { PluginState } from '../../common/types'; -import { guidesConfig } from '../constants/guides_config'; +import type { PluginState } from '../../common'; +import { API_BASE_PATH, testGuideConfig } from '../../common'; import { apiService } from '../services/api'; import type { GuidedOnboardingApi } from '../types'; import { + testGuide, testGuideStep1ActiveState, testGuideStep1InProgressState, testGuideStep2InProgressState, @@ -33,13 +34,21 @@ import { GuidePanel } from './guide_panel'; const applicationMock = applicationServiceMock.createStartContract(); const notificationsMock = notificationServiceMock.createStartContract(); +const mockGetResponse = (path: string, pluginState: PluginState) => { + if (path === `${API_BASE_PATH}/configs/${testGuide}`) { + return Promise.resolve({ + config: testGuideConfig, + }); + } + return Promise.resolve({ pluginState }); +}; const setupComponentWithPluginStateMock = async ( httpClient: jest.Mocked, pluginState: PluginState ) => { - httpClient.get.mockResolvedValue({ - pluginState, - }); + httpClient.get.mockImplementation((path) => + mockGetResponse(path as unknown as string, pluginState) + ); apiService.setup(httpClient, true); return await setupGuidePanelComponent(apiService); }; @@ -232,7 +241,7 @@ describe('Guided setup', () => { expect(exists('guidePanel')).toBe(true); expect(exists('guideProgress')).toBe(false); - expect(find('guidePanelStep').length).toEqual(guidesConfig.testGuide.steps.length); + expect(find('guidePanelStep').length).toEqual(testGuideConfig.steps.length); }); describe('Guide completion', () => { @@ -423,7 +432,7 @@ describe('Guided setup', () => { expect( find('guidePanelStepDescription') .last() - .containsMatchingElement(

    {guidesConfig.testGuide.steps[2].description}

    ) + .containsMatchingElement(

    {testGuideConfig.steps[2].description}

    ) ).toBe(true); }); @@ -441,7 +450,7 @@ describe('Guided setup', () => { .first() .containsMatchingElement(
      - {guidesConfig.testGuide.steps[0].descriptionList?.map((description, i) => ( + {testGuideConfig.steps[0].descriptionList?.map((description, i) => (
    • {description}
    • ))}
    diff --git a/src/plugins/guided_onboarding/public/components/guide_panel.tsx b/src/plugins/guided_onboarding/public/components/guide_panel.tsx index 69cf5c06f2115..b3afe28e2becc 100644 --- a/src/plugins/guided_onboarding/public/components/guide_panel.tsx +++ b/src/plugins/guided_onboarding/public/components/guide_panel.tsx @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import React, { useState, useEffect } from 'react'; +import React, { useState, useEffect, useCallback } from 'react'; import { EuiFlyout, EuiFlyoutBody, @@ -32,10 +32,9 @@ import { ApplicationStart, NotificationsStart } from '@kbn/core/public'; import type { GuideState, GuideStep as GuideStepStatus } from '@kbn/guided-onboarding'; import { GuideId } from '@kbn/guided-onboarding'; -import type { GuideConfig, GuidedOnboardingApi, StepConfig } from '../types'; +import type { GuidedOnboardingApi } from '../types'; -import type { PluginState } from '../../common/types'; -import { getGuideConfig } from '../services/helpers'; +import type { GuideConfig, PluginState, StepConfig } from '../../common'; import { GuideStep } from './guide_panel_step'; import { QuitGuideModal } from './quit_guide_modal'; @@ -79,6 +78,7 @@ export const GuidePanel = ({ api, application, notifications }: GuidePanelProps) const [isGuideOpen, setIsGuideOpen] = useState(false); const [isQuitGuideModalOpen, setIsQuitGuideModalOpen] = useState(false); const [pluginState, setPluginState] = useState(undefined); + const [guideConfig, setGuideConfig] = useState(undefined); const styles = getGuidePanelStyles(euiTheme); @@ -170,7 +170,16 @@ export const GuidePanel = ({ api, application, notifications }: GuidePanelProps) return () => subscription.unsubscribe(); }, [api]); - const guideConfig = getGuideConfig(pluginState?.activeGuide?.guideId)!; + const fetchGuideConfig = useCallback(async () => { + if (pluginState?.activeGuide?.guideId) { + const config = await api.getGuideConfig(pluginState.activeGuide.guideId); + if (config) setGuideConfig(config); + } + }, [api, pluginState]); + + useEffect(() => { + fetchGuideConfig(); + }, [fetchGuideConfig]); // TODO handle loading state // https://github.com/elastic/kibana/issues/139799 @@ -184,6 +193,7 @@ export const GuidePanel = ({ api, application, notifications }: GuidePanelProps)
    = { completeGuidedOnboardingForIntegration: jest.fn(), skipGuidedOnboarding: jest.fn(), isGuidePanelOpen$: new BehaviorSubject(false), + getGuideConfig: jest.fn(), }, }; diff --git a/src/plugins/guided_onboarding/public/services/api.mocks.ts b/src/plugins/guided_onboarding/public/services/api.mocks.ts index 19cb489a3fbdb..ed87a28c51c33 100644 --- a/src/plugins/guided_onboarding/public/services/api.mocks.ts +++ b/src/plugins/guided_onboarding/public/services/api.mocks.ts @@ -8,7 +8,7 @@ import type { GuideState, GuideId, GuideStepIds } from '@kbn/guided-onboarding'; -import { PluginState } from '../../common/types'; +import { PluginState } from '../../common'; export const testGuide: GuideId = 'testGuide'; export const testGuideFirstStep: GuideStepIds = 'step1'; @@ -87,7 +87,7 @@ export const testGuideStep2ReadyToCompleteState: GuideState = { status: 'complete', }, { - id: testGuideStep1ActiveState.steps[1].id, + ...testGuideStep1ActiveState.steps[1], status: 'ready_to_complete', }, testGuideStep1ActiveState.steps[2], diff --git a/src/plugins/guided_onboarding/public/services/api.test.ts b/src/plugins/guided_onboarding/public/services/api.test.ts index db995002ddfcb..0f308fc66a250 100644 --- a/src/plugins/guided_onboarding/public/services/api.test.ts +++ b/src/plugins/guided_onboarding/public/services/api.test.ts @@ -11,7 +11,7 @@ import { httpServiceMock } from '@kbn/core/public/mocks'; import type { GuideState } from '@kbn/guided-onboarding'; import { firstValueFrom, Subscription } from 'rxjs'; -import { API_BASE_PATH } from '../../common/constants'; +import { API_BASE_PATH, testGuideConfig } from '../../common'; import { ApiService } from './api'; import { testGuide, @@ -129,9 +129,9 @@ describe('GuidedOnboarding ApiService', () => { describe('activateGuide', () => { it('activates a new guide', async () => { - // update the mock to no active guides - httpClient.get.mockResolvedValue({ - pluginState: mockPluginStateNotStarted, + // mock the get config request + httpClient.get.mockResolvedValueOnce({ + config: testGuideConfig, }); apiService.setup(httpClient, true); @@ -305,9 +305,12 @@ describe('GuidedOnboarding ApiService', () => { }); it(`marks the step as 'ready_to_complete' if it's configured for manual completion`, async () => { - httpClient.get.mockResolvedValue({ + httpClient.get.mockResolvedValueOnce({ pluginState: { ...mockPluginStateInProgress, activeGuide: testGuideStep2InProgressState }, }); + httpClient.get.mockResolvedValueOnce({ + config: testGuideConfig, + }); apiService.setup(httpClient, true); await apiService.completeGuideStep(testGuide, testGuideManualCompletionStep); @@ -329,7 +332,7 @@ describe('GuidedOnboarding ApiService', () => { }); it('marks the guide as "ready_to_complete" if the current step is the last step in the guide and configured for manual completion', async () => { - httpClient.get.mockResolvedValue({ + httpClient.get.mockResolvedValueOnce({ pluginState: { ...mockPluginStateInProgress, activeGuide: { @@ -341,6 +344,9 @@ describe('GuidedOnboarding ApiService', () => { }, }, }); + httpClient.get.mockResolvedValueOnce({ + config: testGuideConfig, + }); apiService.setup(httpClient, true); await apiService.completeGuideStep(testGuide, testGuideLastStep); @@ -402,9 +408,12 @@ describe('GuidedOnboarding ApiService', () => { describe('isGuidedOnboardingActiveForIntegration$', () => { it('returns true if the integration is part of the active step', (done) => { - httpClient.get.mockResolvedValue({ + httpClient.get.mockResolvedValueOnce({ pluginState: { ...mockPluginStateInProgress, activeGuide: testGuideStep1InProgressState }, }); + httpClient.get.mockResolvedValueOnce({ + config: testGuideConfig, + }); apiService.setup(httpClient, true); subscription = apiService .isGuidedOnboardingActiveForIntegration$(testIntegration) @@ -449,9 +458,12 @@ describe('GuidedOnboarding ApiService', () => { describe('completeGuidedOnboardingForIntegration', () => { it(`completes the step if it's active for the integration`, async () => { - httpClient.get.mockResolvedValue({ + httpClient.get.mockResolvedValueOnce({ pluginState: { ...mockPluginStateInProgress, activeGuide: testGuideStep1InProgressState }, }); + httpClient.get.mockResolvedValueOnce({ + config: testGuideConfig, + }); apiService.setup(httpClient, true); await apiService.completeGuidedOnboardingForIntegration(testIntegration); @@ -482,6 +494,26 @@ describe('GuidedOnboarding ApiService', () => { }); }); + describe('skipGuidedOnboarding', () => { + it(`sends a request to the put state API`, async () => { + await apiService.skipGuidedOnboarding(); + expect(httpClient.put).toHaveBeenCalledTimes(1); + // this assertion depends on the guides config + expect(httpClient.put).toHaveBeenCalledWith(`${API_BASE_PATH}/state`, { + body: JSON.stringify({ status: 'skipped' }), + }); + }); + }); + + describe('getGuideConfig', () => { + it('sends a request to the get config API', async () => { + apiService.setup(httpClient, true); + await apiService.getGuideConfig(testGuide); + expect(httpClient.get).toHaveBeenCalledTimes(1); + expect(httpClient.get).toHaveBeenCalledWith(`${API_BASE_PATH}/configs/${testGuide}`); + }); + }); + describe('no API requests are sent on self-managed deployments', () => { beforeEach(() => { apiService.setup(httpClient, false); @@ -501,5 +533,10 @@ describe('GuidedOnboarding ApiService', () => { await apiService.updatePluginState({}, false); expect(httpClient.put).not.toHaveBeenCalled(); }); + + it('getGuideConfig', async () => { + await apiService.getGuideConfig(testGuide); + expect(httpClient.get).not.toHaveBeenCalled(); + }); }); }); diff --git a/src/plugins/guided_onboarding/public/services/api.ts b/src/plugins/guided_onboarding/public/services/api.ts index 3452e282b1680..4bf9cd5b55cc6 100644 --- a/src/plugins/guided_onboarding/public/services/api.ts +++ b/src/plugins/guided_onboarding/public/services/api.ts @@ -7,23 +7,31 @@ */ import { HttpSetup } from '@kbn/core/public'; -import { BehaviorSubject, map, Observable, firstValueFrom, concat, of } from 'rxjs'; +import { + BehaviorSubject, + map, + Observable, + firstValueFrom, + concatMap, + of, + concat, + from, +} from 'rxjs'; import type { GuideState, GuideId, GuideStep, GuideStepIds } from '@kbn/guided-onboarding'; -import { API_BASE_PATH } from '../../common/constants'; -import { PluginState, PluginStatus } from '../../common/types'; +import { API_BASE_PATH } from '../../common'; +import type { PluginState, PluginStatus, GuideConfig } from '../../common'; import { GuidedOnboardingApi } from '../types'; import { - getGuideConfig, getInProgressStepId, - getStepConfig, - getUpdatedSteps, - getGuideStatusOnStepCompletion, - isIntegrationInGuideStep, + getCompletedSteps, isStepInProgress, isStepReadyToComplete, isGuideActive, + getStepConfig, + isLastStep, } from './helpers'; +import { ConfigService } from './config_service'; export class ApiService implements GuidedOnboardingApi { private isCloudEnabled: boolean | undefined; @@ -31,12 +39,14 @@ export class ApiService implements GuidedOnboardingApi { private pluginState$!: BehaviorSubject; private isPluginStateLoading: boolean | undefined; public isGuidePanelOpen$: BehaviorSubject = new BehaviorSubject(false); + private configService = new ConfigService(); public setup(httpClient: HttpSetup, isCloudEnabled: boolean) { this.isCloudEnabled = isCloudEnabled; this.client = httpClient; this.pluginState$ = new BehaviorSubject(undefined); this.isGuidePanelOpen$ = new BehaviorSubject(false); + this.configService.setup(httpClient); } private createGetPluginStateObservable(): Observable { @@ -175,7 +185,7 @@ export class ApiService implements GuidedOnboardingApi { } // If this is the 1st-time attempt, we need to create the default state - const guideConfig = getGuideConfig(guideId); + const guideConfig = await this.configService.getGuideConfig(guideId); if (guideConfig) { const updatedSteps: GuideStep[] = guideConfig.steps.map((step, stepIndex) => { @@ -242,8 +252,7 @@ export class ApiService implements GuidedOnboardingApi { // All steps should be complete at this point // However, we do a final check here as a safeguard - const allStepsComplete = - Boolean(activeGuide!.steps.find((step) => step.status !== 'complete')) === false; + const allStepsComplete = Boolean(activeGuide!.steps.find((step) => step.status === 'complete')); if (allStepsComplete) { const updatedGuide: GuideState = { @@ -335,11 +344,13 @@ export class ApiService implements GuidedOnboardingApi { const isCurrentStepInProgress = isStepInProgress(activeGuide, guideId, stepId); const isCurrentStepReadyToComplete = isStepReadyToComplete(activeGuide, guideId, stepId); - const stepConfig = getStepConfig(activeGuide!.guideId, stepId); + const guideConfig = await this.configService.getGuideConfig(guideId); + const stepConfig = getStepConfig(guideConfig, activeGuide!.guideId, stepId); const isManualCompletion = stepConfig ? !!stepConfig.manualCompletion : false; + const isLastStepInGuide = isLastStep(guideConfig, guideId, stepId); if (isCurrentStepInProgress || isCurrentStepReadyToComplete) { - const updatedSteps = getUpdatedSteps( + const updatedSteps = getCompletedSteps( activeGuide!, stepId, // if current step is in progress and configured for manual completion, @@ -347,10 +358,15 @@ export class ApiService implements GuidedOnboardingApi { isManualCompletion && isCurrentStepInProgress ); + const status = await this.configService.getGuideStatusOnStepCompletion({ + isLastStepInGuide, + isManualCompletion, + isStepReadyToComplete: isCurrentStepReadyToComplete, + }); const currentGuide: GuideState = { guideId, isActive: true, - status: getGuideStatusOnStepCompletion(activeGuide, guideId, stepId), + status, steps: updatedSteps, }; @@ -377,7 +393,9 @@ export class ApiService implements GuidedOnboardingApi { */ public isGuidedOnboardingActiveForIntegration$(integration?: string): Observable { return this.fetchPluginState$().pipe( - map((state) => isIntegrationInGuideStep(state?.activeGuide, integration)) + concatMap((state) => + from(this.configService.isIntegrationInGuideStep(state?.activeGuide, integration)) + ) ); } @@ -396,7 +414,10 @@ export class ApiService implements GuidedOnboardingApi { const { activeGuide } = pluginState!; const inProgressStepId = getInProgressStepId(activeGuide!); if (!inProgressStepId) return undefined; - const isIntegrationStepActive = isIntegrationInGuideStep(activeGuide!, integration); + const isIntegrationStepActive = await this.configService.isIntegrationInGuideStep( + activeGuide!, + integration + ); if (isIntegrationStepActive) { return await this.completeGuideStep(activeGuide!.guideId, inProgressStepId); } @@ -410,6 +431,20 @@ export class ApiService implements GuidedOnboardingApi { public async skipGuidedOnboarding(): Promise<{ pluginState: PluginState } | undefined> { return await this.updatePluginState({ status: 'skipped' }, false); } + + /** + * Gets the config for the guide. + * @return {Promise} a promise with the guide config or undefined if the config is not found + */ + public async getGuideConfig(guideId: GuideId): Promise { + if (!this.isCloudEnabled) { + return undefined; + } + if (!this.client) { + throw new Error('ApiService has not be initialized.'); + } + return await this.configService.getGuideConfig(guideId); + } } export const apiService = new ApiService(); diff --git a/src/plugins/guided_onboarding/public/services/config_service.test.ts b/src/plugins/guided_onboarding/public/services/config_service.test.ts new file mode 100644 index 0000000000000..11132059af7fa --- /dev/null +++ b/src/plugins/guided_onboarding/public/services/config_service.test.ts @@ -0,0 +1,119 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { HttpSetup } from '@kbn/core-http-browser'; +import { httpServiceMock } from '@kbn/core-http-browser-mocks'; +import { API_BASE_PATH, testGuideConfig } from '../../common'; +import { + testGuide, + testGuideNotActiveState, + testGuideStep1InProgressState, + testGuideStep2InProgressState, + testIntegration, + wrongIntegration, +} from './api.mocks'; + +import { ConfigService } from './config_service'; + +describe('GuidedOnboarding ConfigService', () => { + let configService: ConfigService; + let httpClient: jest.Mocked; + + beforeEach(() => { + httpClient = httpServiceMock.createStartContract({ basePath: '/base/path' }); + httpClient.get.mockResolvedValue({ + config: testGuideConfig, + }); + configService = new ConfigService(); + configService.setup(httpClient); + }); + describe('getGuideConfig', () => { + it('sends only one request to the get configs API', async () => { + await configService.getGuideConfig(testGuide); + await configService.getGuideConfig(testGuide); + expect(httpClient.get).toHaveBeenCalledTimes(1); + expect(httpClient.get).toHaveBeenCalledWith(`${API_BASE_PATH}/configs/${testGuide}`); + }); + + it('returns undefined if the config is not found', async () => { + httpClient.get.mockRejectedValueOnce(new Error('Not found')); + configService.setup(httpClient); + const config = await configService.getGuideConfig(testGuide); + expect(config).toBeUndefined(); + }); + + it('returns the config for the guide', async () => { + const config = await configService.getGuideConfig(testGuide); + expect(config).toHaveProperty('title'); + }); + }); + + describe('getGuideStatusOnStepCompletion', () => { + it('returns in_progress when completing not the last step', async () => { + const status = await configService.getGuideStatusOnStepCompletion({ + isLastStepInGuide: false, + isManualCompletion: true, + isStepReadyToComplete: true, + }); + expect(status).toBe('in_progress'); + }); + + it('when completing the last step that is configured for manual completion, returns in_progress if the step is in progress', async () => { + const status = await configService.getGuideStatusOnStepCompletion({ + isLastStepInGuide: true, + isManualCompletion: true, + isStepReadyToComplete: false, + }); + expect(status).toBe('in_progress'); + }); + + it('when completing the last step that is configured for manual completion, returns ready_to_complete if the step is ready_to_complete', async () => { + const status = await configService.getGuideStatusOnStepCompletion({ + isLastStepInGuide: true, + isManualCompletion: true, + isStepReadyToComplete: true, + }); + expect(status).toBe('ready_to_complete'); + }); + }); + + describe('isIntegrationInGuideStep', () => { + it('return true if the integration is defined in the guide step config', async () => { + const result = await configService.isIntegrationInGuideStep( + testGuideStep1InProgressState, + testIntegration + ); + expect(result).toBe(true); + }); + it('returns false if a different integration is defined in the guide step', async () => { + const result = await configService.isIntegrationInGuideStep( + testGuideStep1InProgressState, + wrongIntegration + ); + expect(result).toBe(false); + }); + it('returns false if no integration is defined in the guide step', async () => { + const result = await configService.isIntegrationInGuideStep( + testGuideStep2InProgressState, + testIntegration + ); + expect(result).toBe(false); + }); + it('returns false if no guide is active', async () => { + const result = await configService.isIntegrationInGuideStep( + testGuideNotActiveState, + testIntegration + ); + expect(result).toBe(false); + }); + it('returns false if no integration passed', async () => { + const result = await configService.isIntegrationInGuideStep(testGuideStep1InProgressState); + expect(result).toBe(false); + }); + }); +}); diff --git a/src/plugins/guided_onboarding/public/services/config_service.ts b/src/plugins/guided_onboarding/public/services/config_service.ts new file mode 100644 index 0000000000000..b0bea7deb47bc --- /dev/null +++ b/src/plugins/guided_onboarding/public/services/config_service.ts @@ -0,0 +1,86 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { HttpSetup } from '@kbn/core-http-browser'; +import { GuideId, GuideState, GuideStatus } from '@kbn/guided-onboarding'; +import type { GuideConfig, GuidesConfig } from '../../common'; +import { API_BASE_PATH } from '../../common'; +import { findGuideConfigByGuideId, getInProgressStepConfig } from './helpers'; + +type ConfigInitialization = { + [key in GuideId]: boolean | undefined; +}; +export class ConfigService { + private client: HttpSetup | undefined; + private configs: GuidesConfig | undefined; + private isConfigInitialized: ConfigInitialization | undefined; + + setup(httpClient: HttpSetup) { + this.client = httpClient; + this.configs = {} as GuidesConfig; + this.isConfigInitialized = {} as ConfigInitialization; + } + + public async getGuideConfig(guideId: GuideId): Promise { + if (!this.client) { + throw new Error('ConfigService has not be initialized.'); + } + // if not initialized yet, get the config from the backend + if (!this.isConfigInitialized || !this.isConfigInitialized[guideId]) { + try { + const { config } = await this.client.get<{ config: GuideConfig }>( + `${API_BASE_PATH}/configs/${guideId}` + ); + if (!this.isConfigInitialized) this.isConfigInitialized = {} as ConfigInitialization; + this.isConfigInitialized[guideId] = true; + if (!this.configs) this.configs = {} as GuidesConfig; + this.configs[guideId] = config; + } catch (e) { + // if there is an error, set the isInitialized property to avoid multiple requests + if (!this.isConfigInitialized) this.isConfigInitialized = {} as ConfigInitialization; + this.isConfigInitialized[guideId] = true; + } + } + // get the config from the configs property + return findGuideConfigByGuideId(this.configs, guideId); + } + + public async getGuideStatusOnStepCompletion({ + isLastStepInGuide, + isManualCompletion, + isStepReadyToComplete, + }: { + isLastStepInGuide: boolean; + isManualCompletion: boolean; + isStepReadyToComplete: boolean; + }): Promise { + // We want to set the guide status to 'ready_to_complete' if the current step is the last step in the guide + // and the step is not configured for manual completion + // or if the current step is configured for manual completion and the last step is ready to complete + if ( + (isLastStepInGuide && !isManualCompletion) || + (isLastStepInGuide && isManualCompletion && isStepReadyToComplete) + ) { + return 'ready_to_complete'; + } + + // Otherwise the guide is still in progress + return 'in_progress'; + } + + public async isIntegrationInGuideStep( + guideState?: GuideState, + integration?: string + ): Promise { + if (!guideState || !guideState.isActive) return false; + + const guideConfig = await this.getGuideConfig(guideState.guideId); + const stepConfig = getInProgressStepConfig(guideConfig, guideState); + return stepConfig ? stepConfig.integration === integration : false; + } +} diff --git a/src/plugins/guided_onboarding/public/services/helpers.test.ts b/src/plugins/guided_onboarding/public/services/helpers.test.ts index 82720c4f9d223..f1cf0c7c0c561 100644 --- a/src/plugins/guided_onboarding/public/services/helpers.test.ts +++ b/src/plugins/guided_onboarding/public/services/helpers.test.ts @@ -6,51 +6,219 @@ * Side Public License, v 1. */ -import { isIntegrationInGuideStep, isLastStep } from './helpers'; +import { testGuideConfig } from '../../common'; +import type { GuidesConfig } from '../../common'; import { + findGuideConfigByGuideId, + getCompletedSteps, + getInProgressStepConfig, + getInProgressStepId, + getStepConfig, + isGuideActive, + isLastStep, + isStepInProgress, + isStepReadyToComplete, +} from './helpers'; +import { + mockPluginStateInProgress, + mockPluginStateNotStarted, testGuide, testGuideFirstStep, testGuideLastStep, - testGuideNotActiveState, + testGuideManualCompletionStep, + testGuideStep1ActiveState, testGuideStep1InProgressState, testGuideStep2InProgressState, - testIntegration, - wrongIntegration, + testGuideStep2ReadyToCompleteState, } from './api.mocks'; describe('GuidedOnboarding ApiService helpers', () => { - describe('isLastStepActive', () => { + describe('findGuideConfigByGuideId', () => { + it('returns undefined if the config is not found', () => { + const config = findGuideConfigByGuideId( + { testGuide: testGuideConfig } as GuidesConfig, + 'security' + ); + expect(config).toBeUndefined(); + }); + + it('returns the correct config guide', () => { + const config = findGuideConfigByGuideId( + { testGuide: testGuideConfig } as GuidesConfig, + testGuide + ); + expect(config).not.toBeUndefined(); + }); + }); + + describe('getStepConfig', () => { + it('returns undefined if the config is not found', async () => { + const config = getStepConfig(undefined, testGuide, testGuideFirstStep); + expect(config).toBeUndefined(); + }); + + it('returns the config for the step', async () => { + const config = getStepConfig(testGuideConfig, testGuide, testGuideFirstStep); + expect(config).toHaveProperty('title'); + }); + }); + + describe('isLastStep', () => { it('returns true if the passed params are for the last step', () => { - const result = isLastStep(testGuide, testGuideLastStep); + const result = isLastStep(testGuideConfig, testGuide, testGuideLastStep); expect(result).toBe(true); }); it('returns false if the passed params are not for the last step', () => { - const result = isLastStep(testGuide, testGuideFirstStep); + const result = isLastStep(testGuideConfig, testGuide, testGuideFirstStep); expect(result).toBe(false); }); }); - describe('isIntegrationInGuideStep', () => { - it('return true if the integration is defined in the guide step config', () => { - const result = isIntegrationInGuideStep(testGuideStep1InProgressState, testIntegration); - expect(result).toBe(true); + describe('getInProgressStepId', () => { + it('returns undefined if no step is in progress', () => { + const stepId = getInProgressStepId(testGuideStep1ActiveState); + expect(stepId).toBeUndefined(); }); - it('returns false if a different integration is defined in the guide step', () => { - const result = isIntegrationInGuideStep(testGuideStep1InProgressState, wrongIntegration); - expect(result).toBe(false); + it('returns the correct step if that is in progress', () => { + const stepId = getInProgressStepId(testGuideStep1InProgressState); + expect(stepId).toBe('step1'); }); - it('returns false if no integration is defined in the guide step', () => { - const result = isIntegrationInGuideStep(testGuideStep2InProgressState, testIntegration); - expect(result).toBe(false); + }); + + describe('getInProgressStepConfig', () => { + it('returns undefined if no guide config', () => { + const stepConfig = getInProgressStepConfig(undefined, testGuideStep1ActiveState); + expect(stepConfig).toBeUndefined(); }); - it('returns false if no guide is active', () => { - const result = isIntegrationInGuideStep(testGuideNotActiveState, testIntegration); - expect(result).toBe(false); + + it('returns undefined if no step is in progress', () => { + const stepConfig = getInProgressStepConfig(testGuideConfig, testGuideStep1ActiveState); + expect(stepConfig).toBeUndefined(); }); - it('returns false if no integration passed', () => { - const result = isIntegrationInGuideStep(testGuideStep1InProgressState); - expect(result).toBe(false); + + it('returns the correct step config for the step in progress', () => { + const stepConfig = getInProgressStepConfig(testGuideConfig, testGuideStep1InProgressState); + expect(stepConfig).toEqual(testGuideConfig.steps[0]); + }); + }); + + describe('isGuideActive', () => { + it('returns false if plugin state is undefined', () => { + const isActive = isGuideActive(undefined, testGuide); + expect(isActive).toBe(false); + }); + + it('returns true if guideId is undefined and the guide is active', () => { + const isActive = isGuideActive(mockPluginStateInProgress, undefined); + expect(isActive).toBe(true); + }); + + it('returns false if guideId is undefined and the guide is not active', () => { + const isActive = isGuideActive(mockPluginStateNotStarted, undefined); + expect(isActive).toBe(false); + }); + + it('returns false if guide is not in progress', () => { + const isActive = isGuideActive(mockPluginStateInProgress, 'security'); + expect(isActive).toBe(false); + }); + + it('returns true if guide is in progress', () => { + const isActive = isGuideActive(mockPluginStateInProgress, testGuide); + expect(isActive).toBe(true); + }); + }); + + describe('isStepInProgress', () => { + it('returns false if guide state is undefined', () => { + const isInProgress = isStepInProgress(undefined, testGuide, testGuideFirstStep); + expect(isInProgress).toBe(false); + }); + + it('returns false if guide is not active', () => { + const isInProgress = isStepInProgress( + testGuideStep1InProgressState, + 'security', + testGuideFirstStep + ); + expect(isInProgress).toBe(false); + }); + + it('returns false if step is not in progress', () => { + const isInProgress = isStepInProgress( + testGuideStep1InProgressState, + testGuide, + testGuideLastStep + ); + expect(isInProgress).toBe(false); + }); + + it('returns true if step is in progress', () => { + const isInProgress = isStepInProgress( + testGuideStep1InProgressState, + testGuide, + testGuideFirstStep + ); + expect(isInProgress).toBe(true); + }); + }); + + describe('isStepReadyToComplete', () => { + it('returns false if guide state is undefined', () => { + const isReadyToComplete = isStepReadyToComplete(undefined, testGuide, testGuideFirstStep); + expect(isReadyToComplete).toBe(false); + }); + + it('returns false if guide is not active', () => { + const isReadyToComplete = isStepReadyToComplete( + testGuideStep1InProgressState, + 'security', + testGuideFirstStep + ); + expect(isReadyToComplete).toBe(false); + }); + + it('returns false if step is not ready not complete', () => { + const isReadyToComplete = isStepReadyToComplete( + testGuideStep2ReadyToCompleteState, + testGuide, + testGuideLastStep + ); + expect(isReadyToComplete).toBe(false); + }); + + it('returns true if step is ready to complete', () => { + const isInProgress = isStepReadyToComplete( + testGuideStep2ReadyToCompleteState, + testGuide, + testGuideManualCompletionStep + ); + expect(isInProgress).toBe(true); + }); + }); + + describe('getCompletedSteps', () => { + it('completes the step if setToReadyToComplete is false', () => { + const completedSteps = getCompletedSteps( + testGuideStep1InProgressState, + testGuideFirstStep, + false + ); + expect(completedSteps[0].status).toBe('complete'); + // the next step is active + expect(completedSteps[1].status).toBe('active'); + }); + + it('sets the step to ready_to_complete if setToReadyToComplete is true', () => { + const completedSteps = getCompletedSteps( + testGuideStep2InProgressState, + testGuideManualCompletionStep, + true + ); + expect(completedSteps[1].status).toBe('ready_to_complete'); + // the next step is inactive + expect(completedSteps[2].status).toBe('inactive'); }); }); }); diff --git a/src/plugins/guided_onboarding/public/services/helpers.ts b/src/plugins/guided_onboarding/public/services/helpers.ts index 5dfba15f3e2d0..05e8861589da3 100644 --- a/src/plugins/guided_onboarding/public/services/helpers.ts +++ b/src/plugins/guided_onboarding/public/services/helpers.ts @@ -11,35 +11,45 @@ import type { GuideStepIds, GuideState, GuideStep, - GuideStatus, + StepStatus, } from '@kbn/guided-onboarding'; -import { guidesConfig } from '../constants/guides_config'; -import { GuideConfig, StepConfig } from '../types'; -import type { PluginState } from '../../common/types'; +import type { GuidesConfig, PluginState, GuideConfig, StepConfig } from '../../common'; -export const getGuideConfig = (guideId?: GuideId): GuideConfig | undefined => { - if (guideId && Object.keys(guidesConfig).includes(guideId)) { +export const findGuideConfigByGuideId = ( + guidesConfig?: GuidesConfig, + guideId?: GuideId +): GuideConfig | undefined => { + if (guidesConfig && guideId && Object.keys(guidesConfig).includes(guideId)) { return guidesConfig[guideId]; } }; -export const getStepConfig = (guideId: GuideId, stepId: GuideStepIds): StepConfig | undefined => { - const guideConfig = getGuideConfig(guideId); +export const getStepConfig = ( + guideConfig: GuideConfig | undefined, + guideId: GuideId, + stepId: GuideStepIds +): StepConfig | undefined => { return guideConfig?.steps.find((step) => step.id === stepId); }; -const getStepIndex = (guideId: GuideId, stepId: GuideStepIds): number => { - const guide = getGuideConfig(guideId); - if (guide) { - return guide.steps.findIndex((step: StepConfig) => step.id === stepId); +const getStepIndex = ( + guideConfig: GuideConfig | undefined, + guideId: GuideId, + stepId: GuideStepIds +): number => { + if (guideConfig) { + return guideConfig.steps.findIndex((step: StepConfig) => step.id === stepId); } return -1; }; -export const isLastStep = (guideId: GuideId, stepId: GuideStepIds): boolean => { - const guide = getGuideConfig(guideId); - const activeStepIndex = getStepIndex(guideId, stepId); - const stepsNumber = guide?.steps.length || 0; +export const isLastStep = ( + guideConfig: GuideConfig | undefined, + guideId: GuideId, + stepId: GuideStepIds +): boolean => { + const activeStepIndex = getStepIndex(guideConfig, guideId, stepId); + const stepsNumber = guideConfig?.steps.length || 0; if (stepsNumber > 0) { return activeStepIndex === stepsNumber - 1; } @@ -51,26 +61,18 @@ export const getInProgressStepId = (state: GuideState): GuideStepIds | undefined return inProgressStep ? inProgressStep.id : undefined; }; -const getInProgressStepConfig = (state: GuideState): StepConfig | undefined => { +export const getInProgressStepConfig = ( + guideConfig: GuideConfig | undefined, + state: GuideState +): StepConfig | undefined => { const inProgressStepId = getInProgressStepId(state); if (inProgressStepId) { - const config = getGuideConfig(state.guideId); - if (config) { - return config.steps.find((step) => step.id === inProgressStepId); + if (guideConfig) { + return guideConfig.steps.find((step) => step.id === inProgressStepId); } } }; -export const isIntegrationInGuideStep = ( - guideState?: GuideState, - integration?: string -): boolean => { - if (!guideState || !guideState.isActive) return false; - - const stepConfig = getInProgressStepConfig(guideState); - return stepConfig ? stepConfig.integration === integration : false; -}; - export const isGuideActive = (pluginState?: PluginState, guideId?: GuideId): boolean => { // false if pluginState is undefined or plugin state is not in progress // or active guide is undefined @@ -85,16 +87,24 @@ export const isGuideActive = (pluginState?: PluginState, guideId?: GuideId): boo return true; }; -export const isStepInProgress = ( +const isStepStatus = ( guideState: GuideState | undefined, + status: StepStatus, guideId: GuideId, stepId: GuideStepIds ): boolean => { - if (!guideState || !guideState.isActive) return false; + if (!guideState || !guideState.isActive || guideState.guideId !== guideId) return false; // false if the step is not 'in_progress' const selectedStep = guideState.steps.find((step) => step.id === stepId); - return selectedStep ? selectedStep.status === 'in_progress' : false; + return selectedStep ? selectedStep.status === status : false; +}; +export const isStepInProgress = ( + guideState: GuideState | undefined, + guideId: GuideId, + stepId: GuideStepIds +): boolean => { + return isStepStatus(guideState, 'in_progress', guideId, stepId); }; export const isStepReadyToComplete = ( @@ -102,13 +112,10 @@ export const isStepReadyToComplete = ( guideId: GuideId, stepId: GuideStepIds ): boolean => { - if (!guideState || !guideState.isActive) return false; - // false if the step is not 'ready_to_complete' - const selectedStep = guideState!.steps.find((step) => step.id === stepId); - return selectedStep ? selectedStep.status === 'ready_to_complete' : false; + return isStepStatus(guideState, 'ready_to_complete', guideId, stepId); }; -export const getUpdatedSteps = ( +export const getCompletedSteps = ( guideState: GuideState, stepId: GuideStepIds, setToReadyToComplete?: boolean @@ -141,27 +148,3 @@ export const getUpdatedSteps = ( return step; }); }; - -export const getGuideStatusOnStepCompletion = ( - guideState: GuideState | undefined, - guideId: GuideId, - stepId: GuideStepIds -): GuideStatus => { - const stepConfig = getStepConfig(guideId, stepId); - const isManualCompletion = stepConfig?.manualCompletion || false; - const isLastStepInGuide = isLastStep(guideId, stepId); - const isCurrentStepReadyToComplete = isStepReadyToComplete(guideState, guideId, stepId); - - // We want to set the guide status to 'ready_to_complete' if the current step is the last step in the guide - // and the step is not configured for manual completion - // or if the current step is configured for manual completion and the last step is ready to complete - if ( - (isLastStepInGuide && !isManualCompletion) || - (isLastStepInGuide && isManualCompletion && isCurrentStepReadyToComplete) - ) { - return 'ready_to_complete'; - } - - // Otherwise the guide is still in progress - return 'in_progress'; -}; diff --git a/src/plugins/guided_onboarding/public/types.ts b/src/plugins/guided_onboarding/public/types.ts index aeacb79d79a27..034c0337f3cb3 100755 --- a/src/plugins/guided_onboarding/public/types.ts +++ b/src/plugins/guided_onboarding/public/types.ts @@ -6,12 +6,11 @@ * Side Public License, v 1. */ -import React from 'react'; import { Observable } from 'rxjs'; import { HttpSetup } from '@kbn/core/public'; -import type { GuideState, GuideId, GuideStepIds, StepStatus } from '@kbn/guided-onboarding'; +import type { GuideState, GuideId, GuideStepIds } from '@kbn/guided-onboarding'; import type { CloudStart } from '@kbn/cloud-plugin/public'; -import type { PluginStatus, PluginState } from '../common/types'; +import type { PluginStatus, PluginState, GuideConfig } from '../common'; // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface GuidedOnboardingPluginSetup {} @@ -53,42 +52,5 @@ export interface GuidedOnboardingApi { ) => Promise<{ pluginState: PluginState } | undefined>; skipGuidedOnboarding: () => Promise<{ pluginState: PluginState } | undefined>; isGuidePanelOpen$: Observable; + getGuideConfig: (guideId: GuideId) => Promise; } - -export interface StepConfig { - id: GuideStepIds; - title: string; - // description is displayed as a single paragraph, can be combined with description list - description?: string; - // description list is displayed as an unordered list, can be combined with description - descriptionList?: Array; - location?: { - appID: string; - path: string; - }; - status?: StepStatus; - integration?: string; - manualCompletion?: { - title: string; - description: string; - readyToCompleteOnNavigation?: boolean; - }; -} -export interface GuideConfig { - title: string; - description: string; - guideName: string; - docs?: { - text: string; - url: string; - }; - completedGuideRedirectLocation?: { - appID: string; - path: string; - }; - steps: StepConfig[]; -} - -export type GuidesConfig = { - [key in GuideId]: GuideConfig; -}; diff --git a/src/plugins/guided_onboarding/public/constants/guides_config/index.ts b/src/plugins/guided_onboarding/server/helpers/guides_config/index.ts similarity index 86% rename from src/plugins/guided_onboarding/public/constants/guides_config/index.ts rename to src/plugins/guided_onboarding/server/helpers/guides_config/index.ts index e2ab4f7e7747f..a21478ff4ae75 100644 --- a/src/plugins/guided_onboarding/public/constants/guides_config/index.ts +++ b/src/plugins/guided_onboarding/server/helpers/guides_config/index.ts @@ -6,11 +6,11 @@ * Side Public License, v 1. */ -import type { GuidesConfig } from '../../types'; +import type { GuidesConfig } from '../../../common'; +import { testGuideConfig } from '../../../common'; import { securityConfig } from './security'; import { observabilityConfig } from './observability'; import { searchConfig } from './search'; -import { testGuideConfig } from './test_guide'; export const guidesConfig: GuidesConfig = { security: securityConfig, diff --git a/src/plugins/guided_onboarding/public/constants/guides_config/observability.tsx b/src/plugins/guided_onboarding/server/helpers/guides_config/observability.tsx similarity index 83% rename from src/plugins/guided_onboarding/public/constants/guides_config/observability.tsx rename to src/plugins/guided_onboarding/server/helpers/guides_config/observability.tsx index 4dacb14d57c2d..b57d328345119 100644 --- a/src/plugins/guided_onboarding/public/constants/guides_config/observability.tsx +++ b/src/plugins/guided_onboarding/server/helpers/guides_config/observability.tsx @@ -6,13 +6,8 @@ * Side Public License, v 1. */ -import React from 'react'; - import { i18n } from '@kbn/i18n'; -import { FormattedMessage } from '@kbn/i18n-react'; - -import { EuiLink } from '@elastic/eui'; -import type { GuideConfig } from '../../types'; +import type { GuideConfig } from '../../../common'; export const observabilityConfig: GuideConfig = { title: i18n.translate('guidedOnboarding.observabilityGuide.title', { @@ -36,21 +31,10 @@ export const observabilityConfig: GuideConfig = { }), integration: 'kubernetes', descriptionList: [ - - kube-state-metrics - - ), - }} - />, + i18n.translate('guidedOnboarding.observabilityGuide.addDataStep.descriptionList.item1', { + // TODO add the link to the docs, when markdown support is implemented https://github.com/elastic/kibana/issues/146404 + defaultMessage: 'Deploy kube-state-metrics service to your Kubernetes.', + }), i18n.translate('guidedOnboarding.observabilityGuide.addDataStep.descriptionList.item2', { defaultMessage: 'Add the Elastic Kubernetes integration.', }), diff --git a/src/plugins/guided_onboarding/public/constants/guides_config/search.ts b/src/plugins/guided_onboarding/server/helpers/guides_config/search.ts similarity index 98% rename from src/plugins/guided_onboarding/public/constants/guides_config/search.ts rename to src/plugins/guided_onboarding/server/helpers/guides_config/search.ts index 7a28ad6e86925..fdfe9de877944 100644 --- a/src/plugins/guided_onboarding/public/constants/guides_config/search.ts +++ b/src/plugins/guided_onboarding/server/helpers/guides_config/search.ts @@ -7,7 +7,7 @@ */ import { i18n } from '@kbn/i18n'; -import type { GuideConfig } from '../../types'; +import type { GuideConfig } from '../../../common'; export const searchConfig: GuideConfig = { title: i18n.translate('guidedOnboarding.searchGuide.title', { diff --git a/src/plugins/guided_onboarding/public/constants/guides_config/security.ts b/src/plugins/guided_onboarding/server/helpers/guides_config/security.ts similarity index 98% rename from src/plugins/guided_onboarding/public/constants/guides_config/security.ts rename to src/plugins/guided_onboarding/server/helpers/guides_config/security.ts index b7ebd3d6078a0..37b10347eda38 100644 --- a/src/plugins/guided_onboarding/public/constants/guides_config/security.ts +++ b/src/plugins/guided_onboarding/server/helpers/guides_config/security.ts @@ -7,7 +7,7 @@ */ import { i18n } from '@kbn/i18n'; -import type { GuideConfig } from '../../types'; +import type { GuideConfig } from '../../../common'; export const securityConfig: GuideConfig = { title: i18n.translate('guidedOnboarding.securityGuide.title', { diff --git a/src/plugins/guided_onboarding/server/helpers/plugin_state_utils.ts b/src/plugins/guided_onboarding/server/helpers/plugin_state_utils.ts index f24fdf814f83b..ca3d891b147be 100644 --- a/src/plugins/guided_onboarding/server/helpers/plugin_state_utils.ts +++ b/src/plugins/guided_onboarding/server/helpers/plugin_state_utils.ts @@ -8,7 +8,7 @@ import { SavedObjectsClient } from '@kbn/core/server'; import { findActiveGuide } from './guide_state_utils'; -import { PluginState, PluginStatus } from '../../common/types'; +import type { PluginState, PluginStatus } from '../../common'; import { pluginStateSavedObjectsId, pluginStateSavedObjectsType, diff --git a/src/plugins/guided_onboarding/server/routes/config_routes.ts b/src/plugins/guided_onboarding/server/routes/config_routes.ts new file mode 100644 index 0000000000000..d9a82b2635e76 --- /dev/null +++ b/src/plugins/guided_onboarding/server/routes/config_routes.ts @@ -0,0 +1,36 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { IRouter } from '@kbn/core/server'; +import { schema } from '@kbn/config-schema'; +import type { GuideId } from '@kbn/guided-onboarding'; +import { API_BASE_PATH } from '../../common'; +import { guidesConfig } from '../helpers/guides_config'; + +export const registerGetConfigRoute = (router: IRouter) => { + // Fetch the config of the guide + router.get( + { + path: `${API_BASE_PATH}/configs/{guideId}`, + validate: { + params: schema.object({ + guideId: schema.string(), + }), + }, + }, + async (context, request, response) => { + const { guideId } = request.params; + if (guidesConfig && guideId && Object.keys(guidesConfig).includes(guideId)) { + return response.ok({ + body: { config: guidesConfig[guideId as GuideId] }, + }); + } + return response.notFound(); + } + ); +}; diff --git a/src/plugins/guided_onboarding/server/routes/guide_state_routes.ts b/src/plugins/guided_onboarding/server/routes/guide_state_routes.ts index daf4461773032..2d6a58d1e1684 100644 --- a/src/plugins/guided_onboarding/server/routes/guide_state_routes.ts +++ b/src/plugins/guided_onboarding/server/routes/guide_state_routes.ts @@ -7,7 +7,7 @@ */ import { IRouter, SavedObjectsClient } from '@kbn/core/server'; -import { API_BASE_PATH } from '../../common/constants'; +import { API_BASE_PATH } from '../../common'; import { findAllGuides } from '../helpers'; export const registerGetGuideStateRoute = (router: IRouter) => { diff --git a/src/plugins/guided_onboarding/server/routes/index.ts b/src/plugins/guided_onboarding/server/routes/index.ts index 361fd6ec797a0..a526d02ef94f6 100755 --- a/src/plugins/guided_onboarding/server/routes/index.ts +++ b/src/plugins/guided_onboarding/server/routes/index.ts @@ -9,10 +9,13 @@ import type { IRouter } from '@kbn/core/server'; import { registerGetGuideStateRoute } from './guide_state_routes'; import { registerGetPluginStateRoute, registerPutPluginStateRoute } from './plugin_state_routes'; +import { registerGetConfigRoute } from './config_routes'; export function defineRoutes(router: IRouter) { registerGetGuideStateRoute(router); registerGetPluginStateRoute(router); registerPutPluginStateRoute(router); + + registerGetConfigRoute(router); } diff --git a/src/plugins/guided_onboarding/server/routes/plugin_state_routes.ts b/src/plugins/guided_onboarding/server/routes/plugin_state_routes.ts index 169333f790912..33d52ea7ce255 100644 --- a/src/plugins/guided_onboarding/server/routes/plugin_state_routes.ts +++ b/src/plugins/guided_onboarding/server/routes/plugin_state_routes.ts @@ -10,7 +10,7 @@ import { IRouter, SavedObjectsClient } from '@kbn/core/server'; import { schema } from '@kbn/config-schema'; import { GuideState } from '@kbn/guided-onboarding'; import { getPluginState, updatePluginStatus } from '../helpers/plugin_state_utils'; -import { API_BASE_PATH } from '../../common/constants'; +import { API_BASE_PATH } from '../../common'; import { updateGuideState } from '../helpers'; export const registerGetPluginStateRoute = (router: IRouter) => { diff --git a/src/plugins/kibana_utils/public/state_management/state_encoder/encode_decode_state.ts b/src/plugins/kibana_utils/public/state_management/state_encoder/encode_decode_state.ts index 3fa11164fad28..952463b2b7b37 100644 --- a/src/plugins/kibana_utils/public/state_management/state_encoder/encode_decode_state.ts +++ b/src/plugins/kibana_utils/public/state_management/state_encoder/encode_decode_state.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import rison, { RisonValue } from 'rison-node'; +import rison from '@kbn/rison'; import { isStateHash, retrieveState, persistState } from '../state_hash'; // should be: @@ -22,14 +22,14 @@ export function decodeState(expandedOrHashedState: string): State { } // should be: -// export function encodeState(expandedOrHashedState: string) -// but this leads to the chain of types mismatches up to BaseStateContainer interfaces, -// as in state containers we don't have any restrictions on state shape +// export function encodeState but this leads to the chain of +// types mismatches up to BaseStateContainer interfaces, as in state containers we don't +// have any restrictions on state shape export function encodeState(state: State, useHash: boolean): string { if (useHash) { return persistState(state); } else { - return rison.encode(state as unknown as RisonValue); + return rison.encodeUnknown(state) ?? ''; } } diff --git a/src/plugins/kibana_utils/public/state_management/state_hash/state_hash.test.ts b/src/plugins/kibana_utils/public/state_management/state_hash/state_hash.test.ts index b1b6bc3c8107d..cd850c25b71c3 100644 --- a/src/plugins/kibana_utils/public/state_management/state_hash/state_hash.test.ts +++ b/src/plugins/kibana_utils/public/state_management/state_hash/state_hash.test.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { encode as encodeRison } from 'rison-node'; +import { encode as encodeRison } from '@kbn/rison'; import { mockStorage } from '../../storage/hashed_item_store/mock'; import { createStateHash, isStateHash } from './state_hash'; diff --git a/src/plugins/telemetry_collection_manager/server/plugin.test.ts b/src/plugins/telemetry_collection_manager/server/plugin.test.ts index 5ffe8235b3930..adfe2c64a4916 100644 --- a/src/plugins/telemetry_collection_manager/server/plugin.test.ts +++ b/src/plugins/telemetry_collection_manager/server/plugin.test.ts @@ -136,6 +136,15 @@ describe('Telemetry Collection Manager', () => { ).toBeInstanceOf(TelemetrySavedObjectsClient); }); + test('caches the promise calling `getStats` for concurrent requests', async () => { + collectionStrategy.clusterDetailsGetter.mockResolvedValue([ + { clusterUuid: 'clusterUuid' }, + ]); + collectionStrategy.statsGetter.mockResolvedValue([basicStats]); + await Promise.all([setupApi.getStats(config), setupApi.getStats(config)]); + expect(collectionStrategy.statsGetter).toHaveBeenCalledTimes(1); + }); + it('calls getStats with passed refreshCache config', async () => { const getStatsCollectionConfig: jest.SpyInstance< TelemetryCollectionManagerPlugin['getStatsCollectionConfig'] @@ -270,6 +279,15 @@ describe('Telemetry Collection Manager', () => { getStatsCollectionConfig.mockRestore(); }); + + test('does not cache the promise calling `getStats` for concurrent requests', async () => { + collectionStrategy.clusterDetailsGetter.mockResolvedValue([ + { clusterUuid: 'clusterUuid' }, + ]); + collectionStrategy.statsGetter.mockResolvedValue([basicStats]); + await Promise.all([setupApi.getStats(config), setupApi.getStats(config)]); + expect(collectionStrategy.statsGetter).toHaveBeenCalledTimes(2); + }); }); describe('getOptInStats', () => { diff --git a/src/plugins/telemetry_collection_manager/server/plugin.ts b/src/plugins/telemetry_collection_manager/server/plugin.ts index 4e7a96646b1ff..d3db80ed728de 100644 --- a/src/plugins/telemetry_collection_manager/server/plugin.ts +++ b/src/plugins/telemetry_collection_manager/server/plugin.ts @@ -340,20 +340,47 @@ export class TelemetryCollectionManagerPlugin } const cacheKey = this.createCacheKey(collectionSource, clustersDetails); - const cachedUsageStatsPayload = this.cacheManager.getFromCache(cacheKey); - if (cachedUsageStatsPayload) { - return this.updateFetchedAt(cachedUsageStatsPayload); + const cachedUsageStatsPromise = + this.cacheManager.getFromCache>(cacheKey); + if (cachedUsageStatsPromise) { + return this.updateFetchedAt(await cachedUsageStatsPromise); } + const statsFromCollectionPromise = this.getStatsFromCollection( + clustersDetails, + collection, + statsCollectionConfig + ); + this.cacheManager.setCache(cacheKey, statsFromCollectionPromise); + + try { + const stats = await statsFromCollectionPromise; + return this.updateFetchedAt(stats); + } catch (err) { + this.logger.debug( + `Failed to generate the telemetry report (${err.message}). Resetting the cache...` + ); + this.cacheManager.resetCache(); + throw err; + } + } + + private async getStatsFromCollection( + clustersDetails: ClusterDetails[], + collection: CollectionStrategy, + statsCollectionConfig: StatsCollectionConfig + ) { + const context: StatsCollectionContext = { + logger: this.logger.get(collection.title), + version: this.version, + }; + const { title: collectionSource } = collection; const now = new Date().toISOString(); const stats = await collection.statsGetter(clustersDetails, statsCollectionConfig, context); - const usageStatsPayload = stats.map((stat) => ({ + return stats.map((stat) => ({ collectionSource, cacheDetails: { updatedAt: now, fetchedAt: now }, ...stat, })); - this.cacheManager.setCache(cacheKey, usageStatsPayload); - - return this.updateFetchedAt(usageStatsPayload); } } diff --git a/src/plugins/ui_actions_enhanced/public/drilldowns/url_drilldown/handlebars.ts b/src/plugins/ui_actions_enhanced/public/drilldowns/url_drilldown/handlebars.ts index 9dbeb270a9d72..14e1832c48afb 100644 --- a/src/plugins/ui_actions_enhanced/public/drilldowns/url_drilldown/handlebars.ts +++ b/src/plugins/ui_actions_enhanced/public/drilldowns/url_drilldown/handlebars.ts @@ -7,7 +7,7 @@ */ import Handlebars from '@kbn/handlebars'; -import { encode, RisonValue } from 'rison-node'; +import { encode } from '@kbn/rison'; import dateMath from '@kbn/datemath'; import moment, { Moment } from 'moment'; import numeral from '@elastic/numeral'; @@ -44,7 +44,7 @@ function createSerializationHelper( handlebars.registerHelper('json', createSerializationHelper('json', JSON.stringify)); handlebars.registerHelper( 'rison', - createSerializationHelper('rison', (v) => encode(v as RisonValue)) + createSerializationHelper('rison', (v) => encode(v)) ); handlebars.registerHelper('date', (...args) => { diff --git a/src/plugins/unified_field_list/README.md b/src/plugins/unified_field_list/README.md index 23edffd5101dc..78a6e5084691e 100755 --- a/src/plugins/unified_field_list/README.md +++ b/src/plugins/unified_field_list/README.md @@ -81,18 +81,16 @@ const { refetchFieldsExistenceInfo, isProcessing } = useExistingFieldsFetcher({ ... }); const fieldsExistenceReader = useExistingFieldsReader() -const { fieldGroups } = useGroupedFields({ - dataViewId: currentDataViewId, - allFields, - fieldsExistenceReader, +const fieldListGroupedProps = useGroupedFields({ + dataViewId: currentDataViewId, // pass `null` here for text-based queries to skip fields existence check + allFields, // pass `null` to show loading indicators + fieldsExistenceReader, // pass `undefined` for text-based queries ... }); // and now we can render a field list diff --git a/src/plugins/unified_field_list/common/utils/field_existing_utils.ts b/src/plugins/unified_field_list/common/utils/field_existing_utils.ts index fcc08a141dae1..006568bf37f2e 100644 --- a/src/plugins/unified_field_list/common/utils/field_existing_utils.ts +++ b/src/plugins/unified_field_list/common/utils/field_existing_utils.ts @@ -132,7 +132,7 @@ export function buildFieldList(indexPattern: DataView, metaFields: string[]): Fi script: field.script, // id is a special case - it doesn't show up in the meta field list, // but as it's not part of source, it has to be handled separately. - isMeta: metaFields.includes(field.name) || field.name === '_id', + isMeta: metaFields?.includes(field.name) || field.name === '_id', runtimeField: !field.isMapped ? field.runtimeField : undefined, }; }); diff --git a/src/plugins/unified_field_list/public/components/field_list/field_list_grouped.test.tsx b/src/plugins/unified_field_list/public/components/field_list/field_list_grouped.test.tsx index 59cd7e56ff390..4d1cb45fe1936 100644 --- a/src/plugins/unified_field_list/public/components/field_list/field_list_grouped.test.tsx +++ b/src/plugins/unified_field_list/public/components/field_list/field_list_grouped.test.tsx @@ -24,7 +24,7 @@ describe('UnifiedFieldList + useGroupedFields()', () => { let defaultProps: FieldListGroupedProps; let mockedServices: GroupedFieldsParams['services']; const allFields = dataView.fields; - // 5 times more fields. Added fields will be treated as empty as they are not a part of the data view. + // 5 times more fields. Added fields will be treated as Unmapped as they are not a part of the data view. const manyFields = [...new Array(5)].flatMap((_, index) => allFields.map((field) => { return new DataViewField({ ...field.toSpec(), name: `${field.name}${index || ''}` }); @@ -44,6 +44,7 @@ describe('UnifiedFieldList + useGroupedFields()', () => { defaultProps = { fieldGroups: {}, fieldsExistenceStatus: ExistenceFetchStatus.succeeded, + scrollToTopResetCounter: 0, fieldsExistInIndex: true, screenReaderDescriptionForSearchInputId: 'testId', renderFieldItem: jest.fn(({ field, itemIndex, groupIndex }) => ( @@ -268,14 +269,14 @@ describe('UnifiedFieldList + useGroupedFields()', () => { expect( wrapper.find(`#${defaultProps.screenReaderDescriptionForSearchInputId}`).first().text() - ).toBe('25 available fields. 112 empty fields. 3 meta fields.'); + ).toBe('25 available fields. 112 unmapped fields. 0 empty fields. 3 meta fields.'); expect( wrapper.find(FieldsAccordion).map((accordion) => accordion.prop('paginatedFields').length) - ).toStrictEqual([25, 0, 0]); + ).toStrictEqual([25, 0, 0, 0]); await act(async () => { await wrapper - .find('[data-test-subj="fieldListGroupedEmptyFields"]') + .find('[data-test-subj="fieldListGroupedUnmappedFields"]') .find('button') .first() .simulate('click'); @@ -284,11 +285,11 @@ describe('UnifiedFieldList + useGroupedFields()', () => { expect( wrapper.find(FieldsAccordion).map((accordion) => accordion.prop('paginatedFields').length) - ).toStrictEqual([25, 50, 0]); + ).toStrictEqual([25, 50, 0, 0]); await act(async () => { await wrapper - .find('[data-test-subj="fieldListGroupedMetaFields"]') + .find('[data-test-subj="fieldListGroupedEmptyFields"]') .find('button') .first() .simulate('click'); @@ -297,7 +298,7 @@ describe('UnifiedFieldList + useGroupedFields()', () => { expect( wrapper.find(FieldsAccordion).map((accordion) => accordion.prop('paginatedFields').length) - ).toStrictEqual([25, 88, 0]); + ).toStrictEqual([25, 88, 0, 0]); }); it('renders correctly when filtered', async () => { @@ -315,7 +316,7 @@ describe('UnifiedFieldList + useGroupedFields()', () => { expect( wrapper.find(`#${defaultProps.screenReaderDescriptionForSearchInputId}`).first().text() - ).toBe('25 available fields. 112 empty fields. 3 meta fields.'); + ).toBe('25 available fields. 112 unmapped fields. 0 empty fields. 3 meta fields.'); await act(async () => { await wrapper.setProps({ @@ -329,7 +330,7 @@ describe('UnifiedFieldList + useGroupedFields()', () => { expect( wrapper.find(`#${defaultProps.screenReaderDescriptionForSearchInputId}`).first().text() - ).toBe('2 available fields. 8 empty fields. 0 meta fields.'); + ).toBe('2 available fields. 8 unmapped fields. 0 empty fields. 0 meta fields.'); await act(async () => { await wrapper.setProps({ @@ -343,7 +344,7 @@ describe('UnifiedFieldList + useGroupedFields()', () => { expect( wrapper.find(`#${defaultProps.screenReaderDescriptionForSearchInputId}`).first().text() - ).toBe('0 available fields. 12 empty fields. 3 meta fields.'); + ).toBe('0 available fields. 12 unmapped fields. 0 empty fields. 3 meta fields.'); }); it('renders correctly when non-supported fields are filtered out', async () => { @@ -361,7 +362,7 @@ describe('UnifiedFieldList + useGroupedFields()', () => { expect( wrapper.find(`#${defaultProps.screenReaderDescriptionForSearchInputId}`).first().text() - ).toBe('25 available fields. 112 empty fields. 3 meta fields.'); + ).toBe('25 available fields. 112 unmapped fields. 0 empty fields. 3 meta fields.'); await act(async () => { await wrapper.setProps({ @@ -375,7 +376,7 @@ describe('UnifiedFieldList + useGroupedFields()', () => { expect( wrapper.find(`#${defaultProps.screenReaderDescriptionForSearchInputId}`).first().text() - ).toBe('23 available fields. 104 empty fields. 3 meta fields.'); + ).toBe('23 available fields. 104 unmapped fields. 0 empty fields. 3 meta fields.'); }); it('renders correctly when selected fields are present', async () => { @@ -393,7 +394,7 @@ describe('UnifiedFieldList + useGroupedFields()', () => { expect( wrapper.find(`#${defaultProps.screenReaderDescriptionForSearchInputId}`).first().text() - ).toBe('25 available fields. 112 empty fields. 3 meta fields.'); + ).toBe('25 available fields. 112 unmapped fields. 0 empty fields. 3 meta fields.'); await act(async () => { await wrapper.setProps({ @@ -408,6 +409,30 @@ describe('UnifiedFieldList + useGroupedFields()', () => { expect( wrapper.find(`#${defaultProps.screenReaderDescriptionForSearchInputId}`).first().text() - ).toBe('2 selected fields. 25 available fields. 112 empty fields. 3 meta fields.'); + ).toBe( + '2 selected fields. 25 available fields. 112 unmapped fields. 0 empty fields. 3 meta fields.' + ); + }); + + it('renders correctly when popular fields limit and custom selected fields are present', async () => { + const hookParams = { + dataViewId: dataView.id!, + allFields: manyFields, + popularFieldsLimit: 10, + sortedSelectedFields: [manyFields[0], manyFields[1]], + }; + const wrapper = await mountGroupedList({ + listProps: { + ...defaultProps, + fieldsExistenceStatus: ExistenceFetchStatus.succeeded, + }, + hookParams, + }); + + expect( + wrapper.find(`#${defaultProps.screenReaderDescriptionForSearchInputId}`).first().text() + ).toBe( + '2 selected fields. 10 popular fields. 25 available fields. 112 unmapped fields. 0 empty fields. 3 meta fields.' + ); }); }); diff --git a/src/plugins/unified_field_list/public/components/field_list/field_list_grouped.tsx b/src/plugins/unified_field_list/public/components/field_list/field_list_grouped.tsx index 5510ddb2b1d43..94a76d9b6a6dc 100644 --- a/src/plugins/unified_field_list/public/components/field_list/field_list_grouped.tsx +++ b/src/plugins/unified_field_list/public/components/field_list/field_list_grouped.tsx @@ -7,14 +7,14 @@ */ import { partition, throttle } from 'lodash'; -import React, { useState, Fragment, useCallback, useMemo } from 'react'; +import React, { Fragment, useCallback, useEffect, useMemo, useState } from 'react'; import { i18n } from '@kbn/i18n'; import { EuiScreenReaderOnly, EuiSpacer } from '@elastic/eui'; import { type DataViewField } from '@kbn/data-views-plugin/common'; import { NoFieldsCallout } from './no_fields_callout'; -import { FieldsAccordion, type FieldsAccordionProps } from './fields_accordion'; +import { FieldsAccordion, type FieldsAccordionProps, getFieldKey } from './fields_accordion'; import type { FieldListGroups, FieldListItem } from '../../types'; -import { ExistenceFetchStatus } from '../../types'; +import { ExistenceFetchStatus, FieldsGroup, FieldsGroupNames } from '../../types'; import './field_list_grouped.scss'; const PAGINATION_SIZE = 50; @@ -33,6 +33,7 @@ export interface FieldListGroupedProps { fieldsExistenceStatus: ExistenceFetchStatus; fieldsExistInIndex: boolean; renderFieldItem: FieldsAccordionProps['renderFieldItem']; + scrollToTopResetCounter: number; screenReaderDescriptionForSearchInputId?: string; 'data-test-subj'?: string; } @@ -42,6 +43,7 @@ function InnerFieldListGrouped({ fieldsExistenceStatus, fieldsExistInIndex, renderFieldItem, + scrollToTopResetCounter, screenReaderDescriptionForSearchInputId, 'data-test-subj': dataTestSubject = 'fieldListGrouped', }: FieldListGroupedProps) { @@ -60,6 +62,14 @@ function InnerFieldListGrouped({ ) ); + useEffect(() => { + // Reset the scroll if we have made material changes to the field list + if (scrollContainer && scrollToTopResetCounter) { + scrollContainer.scrollTop = 0; + setPageSize(PAGINATION_SIZE); + } + }, [scrollToTopResetCounter, scrollContainer]); + const lazyScroll = useCallback(() => { if (scrollContainer) { const nearBottom = @@ -93,9 +103,12 @@ function InnerFieldListGrouped({ ); }, [pageSize, fieldGroupsToShow, accordionState]); + const hasSpecialFields = Boolean(fieldGroupsToCollapse[0]?.[1]?.fields?.length); + return (
    { if (el && !el.dataset.dynamicScroll) { el.dataset.dynamicScroll = 'true'; @@ -114,9 +127,7 @@ function InnerFieldListGrouped({ > {hasSyncedExistingFields ? [ - fieldGroups.SelectedFields && - (!fieldGroups.SelectedFields?.hideIfEmpty || - fieldGroups.SelectedFields?.fields?.length > 0) && + shouldIncludeGroupDescriptionInAria(fieldGroups.SelectedFields) && i18n.translate( 'unifiedFieldList.fieldListGrouped.fieldSearchForSelectedFieldsLiveRegion', { @@ -127,6 +138,17 @@ function InnerFieldListGrouped({ }, } ), + shouldIncludeGroupDescriptionInAria(fieldGroups.PopularFields) && + i18n.translate( + 'unifiedFieldList.fieldListGrouped.fieldSearchForPopularFieldsLiveRegion', + { + defaultMessage: + '{popularFields} popular {popularFields, plural, one {field} other {fields}}.', + values: { + popularFields: fieldGroups.PopularFields?.fields?.length || 0, + }, + } + ), fieldGroups.AvailableFields?.fields && i18n.translate( 'unifiedFieldList.fieldListGrouped.fieldSearchForAvailableFieldsLiveRegion', @@ -138,9 +160,18 @@ function InnerFieldListGrouped({ }, } ), - fieldGroups.EmptyFields && - (!fieldGroups.EmptyFields?.hideIfEmpty || - fieldGroups.EmptyFields?.fields?.length > 0) && + shouldIncludeGroupDescriptionInAria(fieldGroups.UnmappedFields) && + i18n.translate( + 'unifiedFieldList.fieldListGrouped.fieldSearchForUnmappedFieldsLiveRegion', + { + defaultMessage: + '{unmappedFields} unmapped {unmappedFields, plural, one {field} other {fields}}.', + values: { + unmappedFields: fieldGroups.UnmappedFields?.fields?.length || 0, + }, + } + ), + shouldIncludeGroupDescriptionInAria(fieldGroups.EmptyFields) && i18n.translate( 'unifiedFieldList.fieldListGrouped.fieldSearchForEmptyFieldsLiveRegion', { @@ -151,9 +182,7 @@ function InnerFieldListGrouped({ }, } ), - fieldGroups.MetaFields && - (!fieldGroups.MetaFields?.hideIfEmpty || - fieldGroups.MetaFields?.fields?.length > 0) && + shouldIncludeGroupDescriptionInAria(fieldGroups.MetaFields) && i18n.translate( 'unifiedFieldList.fieldListGrouped.fieldSearchForMetaFieldsLiveRegion', { @@ -171,16 +200,26 @@ function InnerFieldListGrouped({
    )} -
      - {fieldGroupsToCollapse.flatMap(([, { fields }]) => - fields.map((field, index) => ( - - {renderFieldItem({ field, itemIndex: index, groupIndex: 0, hideDetails: true })} - - )) - )} -
    - + {hasSpecialFields && ( + <> +
      + {fieldGroupsToCollapse.flatMap(([key, { fields }]) => + fields.map((field, index) => ( + + {renderFieldItem({ + field, + itemIndex: index, + groupIndex: 0, + groupName: key as FieldsGroupNames, + hideDetails: true, + })} + + )) + )} +
    + + + )} {fieldGroupsToShow.map(([key, fieldGroup], index) => { const hidden = Boolean(fieldGroup.hideIfEmpty) && !fieldGroup.fields.length; if (hidden) { @@ -199,6 +238,7 @@ function InnerFieldListGrouped({ isFiltered={fieldGroup.fieldCount !== fieldGroup.fields.length} paginatedFields={paginatedFields[key]} groupIndex={index + 1} + groupName={key as FieldsGroupNames} onToggle={(open) => { setAccordionState((s) => ({ ...s, @@ -224,6 +264,7 @@ function InnerFieldListGrouped({ isAffectedByFieldFilter={fieldGroup.fieldCount !== fieldGroup.fields.length} fieldsExistInIndex={!!fieldsExistInIndex} defaultNoFieldsMessage={fieldGroup.defaultNoFieldsMessage} + data-test-subj={`${dataTestSubject}${key}NoFieldsCallout`} /> )} renderFieldItem={renderFieldItem} @@ -243,3 +284,13 @@ const FieldListGrouped = React.memo(InnerFieldListGrouped) as GenericFieldListGr // Necessary for React.lazy // eslint-disable-next-line import/no-default-export export default FieldListGrouped; + +function shouldIncludeGroupDescriptionInAria( + group: FieldsGroup | undefined +): boolean { + if (!group) { + return false; + } + // has some fields or an empty list should be still shown + return group.fields?.length > 0 || !group.hideIfEmpty; +} diff --git a/src/plugins/unified_field_list/public/components/field_list/fields_accordion.test.tsx b/src/plugins/unified_field_list/public/components/field_list/fields_accordion.test.tsx index 2804c1bbe5ee1..6c94f8a8e8335 100644 --- a/src/plugins/unified_field_list/public/components/field_list/fields_accordion.test.tsx +++ b/src/plugins/unified_field_list/public/components/field_list/fields_accordion.test.tsx @@ -11,7 +11,7 @@ import { stubLogstashDataView as dataView } from '@kbn/data-views-plugin/common/ import { EuiLoadingSpinner, EuiNotificationBadge, EuiText } from '@elastic/eui'; import { mountWithIntl } from '@kbn/test-jest-helpers'; import { FieldsAccordion, FieldsAccordionProps } from './fields_accordion'; -import { FieldListItem } from '../../types'; +import { FieldListItem, FieldsGroupNames } from '../../types'; describe('UnifiedFieldList ', () => { let defaultProps: FieldsAccordionProps; @@ -21,7 +21,8 @@ describe('UnifiedFieldList ', () => { defaultProps = { initialIsOpen: true, onToggle: jest.fn(), - groupIndex: 0, + groupIndex: 1, + groupName: FieldsGroupNames.AvailableFields, id: 'id', label: 'label-test', hasLoaded: true, diff --git a/src/plugins/unified_field_list/public/components/field_list/fields_accordion.tsx b/src/plugins/unified_field_list/public/components/field_list/fields_accordion.tsx index 5222cf1b0e678..8b7ca22bff676 100644 --- a/src/plugins/unified_field_list/public/components/field_list/fields_accordion.tsx +++ b/src/plugins/unified_field_list/public/components/field_list/fields_accordion.tsx @@ -18,7 +18,7 @@ import { } from '@elastic/eui'; import classNames from 'classnames'; import { type DataViewField } from '@kbn/data-views-plugin/common'; -import type { FieldListItem } from '../../types'; +import { type FieldListItem, FieldsGroupNames } from '../../types'; import './fields_accordion.scss'; export interface FieldsAccordionProps { @@ -32,12 +32,14 @@ export interface FieldsAccordionProps { hideDetails?: boolean; isFiltered: boolean; groupIndex: number; + groupName: FieldsGroupNames; paginatedFields: T[]; renderFieldItem: (params: { field: T; hideDetails?: boolean; itemIndex: number; groupIndex: number; + groupName: FieldsGroupNames; }) => JSX.Element; renderCallout: () => JSX.Element; showExistenceFetchError?: boolean; @@ -55,6 +57,7 @@ function InnerFieldsAccordion({ hideDetails, isFiltered, groupIndex, + groupName, paginatedFields, renderFieldItem, renderCallout, @@ -99,6 +102,9 @@ function InnerFieldsAccordion({ content={i18n.translate('unifiedFieldList.fieldsAccordion.existenceErrorLabel', { defaultMessage: "Field information can't be loaded", })} + iconProps={{ + 'data-test-subj': `${id}-fetchWarning`, + }} /> ); } @@ -128,7 +134,7 @@ function InnerFieldsAccordion({ ); } - return ; + return ; }, [showExistenceFetchError, showExistenceFetchTimeout, hasLoaded, isFiltered, id, fieldsCount]); return ( @@ -146,8 +152,8 @@ function InnerFieldsAccordion({
      {paginatedFields && paginatedFields.map((field, index) => ( - - {renderFieldItem({ field, itemIndex: index, groupIndex, hideDetails })} + + {renderFieldItem({ field, itemIndex: index, groupIndex, groupName, hideDetails })} ))}
    @@ -159,3 +165,6 @@ function InnerFieldsAccordion({ } export const FieldsAccordion = React.memo(InnerFieldsAccordion) as typeof InnerFieldsAccordion; + +export const getFieldKey = (field: FieldListItem): string => + `${field.name}-${field.displayName}-${field.type}`; diff --git a/src/plugins/unified_field_list/public/components/field_list/no_fields_callout.test.tsx b/src/plugins/unified_field_list/public/components/field_list/no_fields_callout.test.tsx index 03936a89877ba..5a18a261d136d 100644 --- a/src/plugins/unified_field_list/public/components/field_list/no_fields_callout.test.tsx +++ b/src/plugins/unified_field_list/public/components/field_list/no_fields_callout.test.tsx @@ -16,6 +16,7 @@ describe('UnifiedFieldList ', () => { expect(component).toMatchInlineSnapshot(` @@ -26,6 +27,7 @@ describe('UnifiedFieldList ', () => { expect(component).toMatchInlineSnapshot(` @@ -38,6 +40,7 @@ describe('UnifiedFieldList ', () => { expect(component).toMatchInlineSnapshot(` @@ -51,6 +54,7 @@ describe('UnifiedFieldList ', () => { expect(component).toMatchInlineSnapshot(` @@ -78,6 +82,7 @@ describe('UnifiedFieldList ', () => { expect(component).toMatchInlineSnapshot(` @@ -108,6 +113,7 @@ describe('UnifiedFieldList ', () => { expect(component).toMatchInlineSnapshot(` @@ -139,6 +145,7 @@ describe('UnifiedFieldList ', () => { expect(component).toMatchInlineSnapshot(` diff --git a/src/plugins/unified_field_list/public/components/field_list/no_fields_callout.tsx b/src/plugins/unified_field_list/public/components/field_list/no_fields_callout.tsx index 3d24b400da3cb..3eca7573d9110 100644 --- a/src/plugins/unified_field_list/public/components/field_list/no_fields_callout.tsx +++ b/src/plugins/unified_field_list/public/components/field_list/no_fields_callout.tsx @@ -23,12 +23,14 @@ export const NoFieldsCallout = ({ isAffectedByFieldFilter = false, isAffectedByTimerange = false, isAffectedByGlobalFilter = false, + 'data-test-subj': dataTestSubject = 'noFieldsCallout', }: { fieldsExistInIndex: boolean; isAffectedByFieldFilter?: boolean; defaultNoFieldsMessage?: string; isAffectedByTimerange?: boolean; isAffectedByGlobalFilter?: boolean; + 'data-test-subj'?: string; }) => { if (!fieldsExistInIndex) { return ( @@ -38,6 +40,7 @@ export const NoFieldsCallout = ({ title={i18n.translate('unifiedFieldList.fieldList.noFieldsCallout.noFieldsLabel', { defaultMessage: 'No fields exist in this data view.', })} + data-test-subj={`${dataTestSubject}-noFieldsExist`} /> ); } @@ -53,6 +56,7 @@ export const NoFieldsCallout = ({ }) : defaultNoFieldsMessage } + data-test-subj={`${dataTestSubject}-noFieldsMatch`} > {(isAffectedByTimerange || isAffectedByFieldFilter || isAffectedByGlobalFilter) && ( <> diff --git a/src/plugins/unified_field_list/public/components/field_stats/field_stats.test.tsx b/src/plugins/unified_field_list/public/components/field_stats/field_stats.test.tsx index 312abc2bb323f..317fe9082d28e 100644 --- a/src/plugins/unified_field_list/public/components/field_stats/field_stats.test.tsx +++ b/src/plugins/unified_field_list/public/components/field_stats/field_stats.test.tsx @@ -8,6 +8,7 @@ import React from 'react'; import { act } from 'react-dom/test-utils'; +import { ReactWrapper } from 'enzyme'; import { EuiLoadingSpinner, EuiProgress } from '@elastic/eui'; import { coreMock } from '@kbn/core/public/mocks'; import { mountWithIntl } from '@kbn/test-jest-helpers'; @@ -120,6 +121,18 @@ describe('UnifiedFieldList ', () => { }); }); + async function mountComponent(component: React.ReactElement): Promise { + let wrapper: ReactWrapper; + await act(async () => { + wrapper = await mountWithIntl(component); + // wait for lazy modules if any + await new Promise((resolve) => setTimeout(resolve, 0)); + await wrapper.update(); + }); + + return wrapper!; + } + beforeEach(() => { (loadFieldStats as jest.Mock).mockReset(); (loadFieldStats as jest.Mock).mockImplementation(() => Promise.resolve({})); @@ -134,7 +147,7 @@ describe('UnifiedFieldList ', () => { }); }); - const wrapper = mountWithIntl( + const wrapper = await mountComponent( ', () => { /> ); - await wrapper.update(); - expect(loadFieldStats).toHaveBeenCalledWith({ abortController: new AbortController(), services: { data: mockedServices.data }, @@ -260,33 +271,27 @@ describe('UnifiedFieldList ', () => { }); it('should not request field stats for range fields', async () => { - const wrapper = await mountWithIntl( + const wrapper = await mountComponent( f.name === 'ip_range')!} /> ); - await wrapper.update(); - expect(loadFieldStats).toHaveBeenCalled(); expect(wrapper.text()).toBe('Analysis is not available for this field.'); }); it('should not request field stats for geo fields', async () => { - const wrapper = await mountWithIntl( + const wrapper = await mountComponent( f.name === 'geo_shape')!} /> ); - await wrapper.update(); - expect(loadFieldStats).toHaveBeenCalled(); expect(wrapper.text()).toBe('Analysis is not available for this field.'); }); it('should render a message if no data is found', async () => { - const wrapper = await mountWithIntl(); - - await wrapper.update(); + const wrapper = await mountComponent(); expect(loadFieldStats).toHaveBeenCalled(); @@ -302,9 +307,7 @@ describe('UnifiedFieldList ', () => { }); }); - const wrapper = mountWithIntl(); - - await wrapper.update(); + const wrapper = await mountComponent(); await act(async () => { resolveFunction!({ @@ -330,7 +333,7 @@ describe('UnifiedFieldList ', () => { }); }); - const wrapper = mountWithIntl( + const wrapper = await mountComponent( ', () => { /> ); - await wrapper.update(); - expect(loadFieldStats).toHaveBeenCalledWith({ abortController: new AbortController(), services: { data: mockedServices.data }, @@ -433,7 +434,7 @@ describe('UnifiedFieldList ', () => { }); }); - const wrapper = mountWithIntl( + const wrapper = await mountComponent( ', () => { /> ); - await wrapper.update(); - expect(wrapper.find(EuiLoadingSpinner)).toHaveLength(1); await act(async () => { @@ -507,7 +506,7 @@ describe('UnifiedFieldList ', () => { }); }); - const wrapper = mountWithIntl( + const wrapper = await mountComponent( ', () => { /> ); - await wrapper.update(); - expect(loadFieldStats).toHaveBeenCalledWith({ abortController: new AbortController(), services: { data: mockedServices.data }, @@ -615,7 +612,7 @@ describe('UnifiedFieldList ', () => { const field = dataView.fields.find((f) => f.name === 'machine.ram')!; - const wrapper = mountWithIntl( + const wrapper = await mountComponent( ', () => { /> ); - await wrapper.update(); - expect(loadFieldStats).toHaveBeenCalledWith({ abortController: new AbortController(), services: { data: mockedServices.data }, diff --git a/src/plugins/unified_field_list/public/components/field_stats/field_stats.tsx b/src/plugins/unified_field_list/public/components/field_stats/field_stats.tsx index eafdcc0dab69a..99c31fc9f64e1 100755 --- a/src/plugins/unified_field_list/public/components/field_stats/field_stats.tsx +++ b/src/plugins/unified_field_list/public/components/field_stats/field_stats.tsx @@ -378,33 +378,36 @@ const FieldStatsComponent: React.FC = ({ if (histogram && histogram.buckets.length && topValues && topValues.buckets.length) { title = ( - { - setShowingHistogram(optionId === 'histogram'); - }} - idSelected={showingHistogram ? 'histogram' : 'topValues'} - /> + <> + { + setShowingHistogram(optionId === 'histogram'); + }} + idSelected={showingHistogram ? 'histogram' : 'topValues'} + /> + + ); } else if (field.type === 'date') { title = ( diff --git a/src/plugins/unified_field_list/public/hooks/__snapshots__/use_grouped_fields.test.tsx.snap b/src/plugins/unified_field_list/public/hooks/__snapshots__/use_grouped_fields.test.tsx.snap new file mode 100644 index 0000000000000..d3c95c363695d --- /dev/null +++ b/src/plugins/unified_field_list/public/hooks/__snapshots__/use_grouped_fields.test.tsx.snap @@ -0,0 +1,259 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`UnifiedFieldList useGroupedFields() should work correctly for no data 1`] = ` +Object { + "AvailableFields": Object { + "defaultNoFieldsMessage": "There are no available fields that contain data.", + "fieldCount": 0, + "fields": Array [], + "hideDetails": false, + "isAffectedByGlobalFilter": false, + "isAffectedByTimeFilter": true, + "isInitiallyOpen": true, + "showInAccordion": true, + "title": "Available fields", + }, + "EmptyFields": Object { + "defaultNoFieldsMessage": "There are no empty fields.", + "fieldCount": 0, + "fields": Array [], + "helpText": "Fields that don't have any values based on your filters.", + "hideDetails": false, + "hideIfEmpty": false, + "isAffectedByGlobalFilter": false, + "isAffectedByTimeFilter": false, + "isInitiallyOpen": false, + "showInAccordion": true, + "title": "Empty fields", + }, + "MetaFields": Object { + "defaultNoFieldsMessage": "There are no meta fields.", + "fieldCount": 0, + "fields": Array [], + "hideDetails": false, + "hideIfEmpty": false, + "isAffectedByGlobalFilter": false, + "isAffectedByTimeFilter": false, + "isInitiallyOpen": false, + "showInAccordion": true, + "title": "Meta fields", + }, + "PopularFields": Object { + "fieldCount": 0, + "fields": Array [], + "helpText": "Fields that your organization frequently uses, from most to least popular.", + "hideDetails": false, + "hideIfEmpty": true, + "isAffectedByGlobalFilter": false, + "isAffectedByTimeFilter": true, + "isInitiallyOpen": true, + "showInAccordion": true, + "title": "Popular fields", + }, + "SelectedFields": Object { + "fieldCount": 0, + "fields": Array [], + "hideDetails": false, + "hideIfEmpty": true, + "isAffectedByGlobalFilter": false, + "isAffectedByTimeFilter": true, + "isInitiallyOpen": true, + "showInAccordion": true, + "title": "Selected fields", + }, + "SpecialFields": Object { + "fieldCount": 0, + "fields": Array [], + "hideDetails": true, + "isAffectedByGlobalFilter": false, + "isAffectedByTimeFilter": false, + "isInitiallyOpen": false, + "showInAccordion": false, + "title": "", + }, + "UnmappedFields": Object { + "fieldCount": 0, + "fields": Array [], + "helpText": "Fields that aren't explicitly mapped to a field data type.", + "hideDetails": false, + "hideIfEmpty": true, + "isAffectedByGlobalFilter": false, + "isAffectedByTimeFilter": true, + "isInitiallyOpen": false, + "showInAccordion": true, + "title": "Unmapped fields", + }, +} +`; + +exports[`UnifiedFieldList useGroupedFields() should work correctly in loading state 1`] = ` +Object { + "AvailableFields": Object { + "defaultNoFieldsMessage": "There are no available fields that contain data.", + "fieldCount": 0, + "fields": Array [], + "hideDetails": false, + "isAffectedByGlobalFilter": false, + "isAffectedByTimeFilter": true, + "isInitiallyOpen": true, + "showInAccordion": true, + "title": "Available fields", + }, + "EmptyFields": Object { + "defaultNoFieldsMessage": "There are no empty fields.", + "fieldCount": 0, + "fields": Array [], + "helpText": "Fields that don't have any values based on your filters.", + "hideDetails": false, + "hideIfEmpty": false, + "isAffectedByGlobalFilter": false, + "isAffectedByTimeFilter": false, + "isInitiallyOpen": false, + "showInAccordion": true, + "title": "Empty fields", + }, + "MetaFields": Object { + "defaultNoFieldsMessage": "There are no meta fields.", + "fieldCount": 0, + "fields": Array [], + "hideDetails": false, + "hideIfEmpty": false, + "isAffectedByGlobalFilter": false, + "isAffectedByTimeFilter": false, + "isInitiallyOpen": false, + "showInAccordion": true, + "title": "Meta fields", + }, + "PopularFields": Object { + "fieldCount": 0, + "fields": Array [], + "helpText": "Fields that your organization frequently uses, from most to least popular.", + "hideDetails": false, + "hideIfEmpty": true, + "isAffectedByGlobalFilter": false, + "isAffectedByTimeFilter": true, + "isInitiallyOpen": true, + "showInAccordion": true, + "title": "Popular fields", + }, + "SelectedFields": Object { + "fieldCount": 0, + "fields": Array [], + "hideDetails": false, + "hideIfEmpty": true, + "isAffectedByGlobalFilter": false, + "isAffectedByTimeFilter": true, + "isInitiallyOpen": true, + "showInAccordion": true, + "title": "Selected fields", + }, + "SpecialFields": Object { + "fieldCount": 0, + "fields": Array [], + "hideDetails": true, + "isAffectedByGlobalFilter": false, + "isAffectedByTimeFilter": false, + "isInitiallyOpen": false, + "showInAccordion": false, + "title": "", + }, + "UnmappedFields": Object { + "fieldCount": 0, + "fields": Array [], + "helpText": "Fields that aren't explicitly mapped to a field data type.", + "hideDetails": false, + "hideIfEmpty": true, + "isAffectedByGlobalFilter": false, + "isAffectedByTimeFilter": true, + "isInitiallyOpen": false, + "showInAccordion": true, + "title": "Unmapped fields", + }, +} +`; + +exports[`UnifiedFieldList useGroupedFields() should work correctly when global filters are set 1`] = ` +Object { + "AvailableFields": Object { + "defaultNoFieldsMessage": "There are no available fields that contain data.", + "fieldCount": 0, + "fields": Array [], + "hideDetails": false, + "isAffectedByGlobalFilter": true, + "isAffectedByTimeFilter": true, + "isInitiallyOpen": true, + "showInAccordion": true, + "title": "Available fields", + }, + "EmptyFields": Object { + "defaultNoFieldsMessage": "There are no empty fields.", + "fieldCount": 0, + "fields": Array [], + "helpText": "Fields that don't have any values based on your filters.", + "hideDetails": false, + "hideIfEmpty": false, + "isAffectedByGlobalFilter": false, + "isAffectedByTimeFilter": false, + "isInitiallyOpen": false, + "showInAccordion": true, + "title": "Empty fields", + }, + "MetaFields": Object { + "defaultNoFieldsMessage": "There are no meta fields.", + "fieldCount": 0, + "fields": Array [], + "hideDetails": false, + "hideIfEmpty": false, + "isAffectedByGlobalFilter": false, + "isAffectedByTimeFilter": false, + "isInitiallyOpen": false, + "showInAccordion": true, + "title": "Meta fields", + }, + "PopularFields": Object { + "fieldCount": 0, + "fields": Array [], + "helpText": "Fields that your organization frequently uses, from most to least popular.", + "hideDetails": false, + "hideIfEmpty": true, + "isAffectedByGlobalFilter": true, + "isAffectedByTimeFilter": true, + "isInitiallyOpen": true, + "showInAccordion": true, + "title": "Popular fields", + }, + "SelectedFields": Object { + "fieldCount": 0, + "fields": Array [], + "hideDetails": false, + "hideIfEmpty": true, + "isAffectedByGlobalFilter": true, + "isAffectedByTimeFilter": true, + "isInitiallyOpen": true, + "showInAccordion": true, + "title": "Selected fields", + }, + "SpecialFields": Object { + "fieldCount": 0, + "fields": Array [], + "hideDetails": true, + "isAffectedByGlobalFilter": false, + "isAffectedByTimeFilter": false, + "isInitiallyOpen": false, + "showInAccordion": false, + "title": "", + }, + "UnmappedFields": Object { + "fieldCount": 0, + "fields": Array [], + "helpText": "Fields that aren't explicitly mapped to a field data type.", + "hideDetails": false, + "hideIfEmpty": true, + "isAffectedByGlobalFilter": true, + "isAffectedByTimeFilter": true, + "isInitiallyOpen": false, + "showInAccordion": true, + "title": "Unmapped fields", + }, +} +`; diff --git a/src/plugins/unified_field_list/public/hooks/use_existing_fields.ts b/src/plugins/unified_field_list/public/hooks/use_existing_fields.ts index ebf12d4609500..583ca32ce7508 100644 --- a/src/plugins/unified_field_list/public/hooks/use_existing_fields.ts +++ b/src/plugins/unified_field_list/public/hooks/use_existing_fields.ts @@ -15,7 +15,6 @@ import { DataPublicPluginStart, DataViewsContract, getEsQueryConfig, - UI_SETTINGS, } from '@kbn/data-plugin/public'; import { type DataView } from '@kbn/data-plugin/common'; import { loadFieldExisting } from '../services/field_existing'; @@ -32,11 +31,12 @@ export interface ExistingFieldsInfo { } export interface ExistingFieldsFetcherParams { + disableAutoFetching?: boolean; dataViews: DataView[]; - fromDate: string; - toDate: string; - query: Query | AggregateQuery; - filters: Filter[]; + fromDate: string | undefined; // fetching will be skipped if `undefined` + toDate: string | undefined; + query: Query | AggregateQuery | undefined; + filters: Filter[] | undefined; services: { core: Pick; data: DataPublicPluginStart; @@ -89,7 +89,7 @@ export const useExistingFieldsFetcher = ( dataViewId: string | undefined; fetchId: string; }): Promise => { - if (!dataViewId) { + if (!dataViewId || !query || !fromDate || !toDate) { return; } @@ -123,7 +123,7 @@ export const useExistingFieldsFetcher = ( dslQuery: await buildSafeEsQuery( dataView, query, - filters, + filters || [], getEsQueryConfig(core.uiSettings) ), fromDate, @@ -137,11 +137,11 @@ export const useExistingFieldsFetcher = ( const existingFieldNames = result?.existingFieldNames || []; - const metaFields = core.uiSettings.get(UI_SETTINGS.META_FIELDS) || []; if ( - !existingFieldNames.filter((fieldName) => !metaFields.includes?.(fieldName)).length && + onNoData && numberOfFetches === 1 && - onNoData + !existingFieldNames.filter((fieldName) => !dataView?.metaFields?.includes(fieldName)) + .length ) { onNoData(dataViewId); } @@ -173,12 +173,17 @@ export const useExistingFieldsFetcher = ( async (dataViewId?: string) => { const fetchId = generateId(); lastFetchId = fetchId; + + const options = { + fetchId, + dataViewId, + ...params, + }; // refetch only for the specified data view if (dataViewId) { await fetchFieldsExistenceInfo({ - fetchId, + ...options, dataViewId, - ...params, }); return; } @@ -186,9 +191,8 @@ export const useExistingFieldsFetcher = ( await Promise.all( params.dataViews.map((dataView) => fetchFieldsExistenceInfo({ - fetchId, + ...options, dataViewId: dataView.id, - ...params, }) ) ); @@ -205,8 +209,10 @@ export const useExistingFieldsFetcher = ( ); useEffect(() => { - refetchFieldsExistenceInfo(); - }, [refetchFieldsExistenceInfo]); + if (!params.disableAutoFetching) { + refetchFieldsExistenceInfo(); + } + }, [refetchFieldsExistenceInfo, params.disableAutoFetching]); useEffect(() => { return () => { diff --git a/src/plugins/unified_field_list/public/hooks/use_grouped_fields.test.tsx b/src/plugins/unified_field_list/public/hooks/use_grouped_fields.test.tsx index d4d6d3cdc906f..df4b3f684647f 100644 --- a/src/plugins/unified_field_list/public/hooks/use_grouped_fields.test.tsx +++ b/src/plugins/unified_field_list/public/hooks/use_grouped_fields.test.tsx @@ -20,6 +20,12 @@ import { ExistenceFetchStatus, FieldListGroups, FieldsGroupNames } from '../type describe('UnifiedFieldList useGroupedFields()', () => { let mockedServices: GroupedFieldsParams['services']; const allFields = dataView.fields; + // Added fields will be treated as Unmapped as they are not a part of the data view. + const allFieldsIncludingUnmapped = [...new Array(2)].flatMap((_, index) => + allFields.map((field) => { + return new DataViewField({ ...field.toSpec(), name: `${field.name}${index || ''}` }); + }) + ); const anotherDataView = createStubDataView({ spec: { id: 'another-data-view', @@ -39,14 +45,43 @@ describe('UnifiedFieldList useGroupedFields()', () => { }); }); + it('should work correctly in loading state', async () => { + const props: GroupedFieldsParams = { + dataViewId: dataView.id!, + allFields: null, + services: mockedServices, + }; + const { result, waitForNextUpdate, rerender } = renderHook(useGroupedFields, { + initialProps: props, + }); + + await waitForNextUpdate(); + + expect(result.current.fieldGroups).toMatchSnapshot(); + expect(result.current.fieldsExistenceStatus).toBe(ExistenceFetchStatus.unknown); + expect(result.current.fieldsExistInIndex).toBe(false); + expect(result.current.scrollToTopResetCounter).toBeTruthy(); + + rerender({ + ...props, + dataViewId: null, // for text-based queries + allFields: null, + }); + + expect(result.current.fieldsExistenceStatus).toBe(ExistenceFetchStatus.unknown); + expect(result.current.fieldsExistInIndex).toBe(true); + expect(result.current.scrollToTopResetCounter).toBeTruthy(); + }); + it('should work correctly for no data', async () => { - const { result, waitForNextUpdate } = renderHook(() => - useGroupedFields({ - dataViewId: dataView.id!, - allFields: [], - services: mockedServices, - }) - ); + const props: GroupedFieldsParams = { + dataViewId: dataView.id!, + allFields: [], + services: mockedServices, + }; + const { result, waitForNextUpdate, rerender } = renderHook(useGroupedFields, { + initialProps: props, + }); await waitForNextUpdate(); @@ -59,20 +94,36 @@ describe('UnifiedFieldList useGroupedFields()', () => { ).toStrictEqual([ 'SpecialFields-0', 'SelectedFields-0', + 'PopularFields-0', 'AvailableFields-0', + 'UnmappedFields-0', 'EmptyFields-0', 'MetaFields-0', ]); + + expect(fieldGroups).toMatchSnapshot(); + expect(result.current.fieldsExistenceStatus).toBe(ExistenceFetchStatus.succeeded); + expect(result.current.fieldsExistInIndex).toBe(false); + + rerender({ + ...props, + dataViewId: null, // for text-based queries + allFields: [], + }); + + expect(result.current.fieldsExistenceStatus).toBe(ExistenceFetchStatus.succeeded); + expect(result.current.fieldsExistInIndex).toBe(true); }); it('should work correctly with fields', async () => { - const { result, waitForNextUpdate } = renderHook(() => - useGroupedFields({ - dataViewId: dataView.id!, - allFields, - services: mockedServices, - }) - ); + const props: GroupedFieldsParams = { + dataViewId: dataView.id!, + allFields, + services: mockedServices, + }; + const { result, waitForNextUpdate, rerender } = renderHook(useGroupedFields, { + initialProps: props, + }); await waitForNextUpdate(); @@ -85,48 +136,116 @@ describe('UnifiedFieldList useGroupedFields()', () => { ).toStrictEqual([ 'SpecialFields-0', 'SelectedFields-0', + 'PopularFields-0', 'AvailableFields-25', + 'UnmappedFields-0', 'EmptyFields-0', 'MetaFields-3', ]); + + expect(result.current.fieldsExistenceStatus).toBe(ExistenceFetchStatus.succeeded); + expect(result.current.fieldsExistInIndex).toBe(true); + + rerender({ + ...props, + dataViewId: null, // for text-based queries + allFields, + }); + + expect(result.current.fieldsExistenceStatus).toBe(ExistenceFetchStatus.succeeded); + expect(result.current.fieldsExistInIndex).toBe(true); }); it('should work correctly when filtered', async () => { - const { result, waitForNextUpdate } = renderHook(() => - useGroupedFields({ - dataViewId: dataView.id!, - allFields, - services: mockedServices, - onFilterField: (field: DataViewField) => field.name.startsWith('@'), - }) - ); + const props: GroupedFieldsParams = { + dataViewId: dataView.id!, + allFields: allFieldsIncludingUnmapped, + services: mockedServices, + }; + const { result, waitForNextUpdate, rerender } = renderHook(useGroupedFields, { + initialProps: props, + }); await waitForNextUpdate(); - const fieldGroups = result.current.fieldGroups; + let fieldGroups = result.current.fieldGroups; + const scrollToTopResetCounter1 = result.current.scrollToTopResetCounter; expect( Object.keys(fieldGroups!).map( - (key) => `${key}-${fieldGroups![key as FieldsGroupNames]?.fields.length}` + (key) => + `${key}-${fieldGroups![key as FieldsGroupNames]?.fields.length}-${ + fieldGroups![key as FieldsGroupNames]?.fieldCount + }` ) ).toStrictEqual([ - 'SpecialFields-0', - 'SelectedFields-0', - 'AvailableFields-2', - 'EmptyFields-0', - 'MetaFields-0', + 'SpecialFields-0-0', + 'SelectedFields-0-0', + 'PopularFields-0-0', + 'AvailableFields-25-25', + 'UnmappedFields-28-28', + 'EmptyFields-0-0', + 'MetaFields-3-3', + ]); + + rerender({ + ...props, + onFilterField: (field: DataViewField) => field.name.startsWith('@'), + }); + + fieldGroups = result.current.fieldGroups; + + expect( + Object.keys(fieldGroups!).map( + (key) => + `${key}-${fieldGroups![key as FieldsGroupNames]?.fields.length}-${ + fieldGroups![key as FieldsGroupNames]?.fieldCount + }` + ) + ).toStrictEqual([ + 'SpecialFields-0-0', + 'SelectedFields-0-0', + 'PopularFields-0-0', + 'AvailableFields-2-25', + 'UnmappedFields-2-28', + 'EmptyFields-0-0', + 'MetaFields-0-3', ]); + + expect(result.current.scrollToTopResetCounter).not.toBe(scrollToTopResetCounter1); + }); + + it('should not change the scroll position if fields list is extended', async () => { + const props: GroupedFieldsParams = { + dataViewId: dataView.id!, + allFields, + services: mockedServices, + }; + const { result, waitForNextUpdate, rerender } = renderHook(useGroupedFields, { + initialProps: props, + }); + + await waitForNextUpdate(); + + const scrollToTopResetCounter1 = result.current.scrollToTopResetCounter; + + rerender({ + ...props, + allFields: allFieldsIncludingUnmapped, + }); + + expect(result.current.scrollToTopResetCounter).toBe(scrollToTopResetCounter1); }); it('should work correctly when custom unsupported fields are skipped', async () => { - const { result, waitForNextUpdate } = renderHook(() => - useGroupedFields({ + const { result, waitForNextUpdate } = renderHook(useGroupedFields, { + initialProps: { dataViewId: dataView.id!, allFields, services: mockedServices, onSupportedFieldFilter: (field: DataViewField) => field.aggregatable, - }) - ); + }, + }); await waitForNextUpdate(); @@ -139,22 +258,24 @@ describe('UnifiedFieldList useGroupedFields()', () => { ).toStrictEqual([ 'SpecialFields-0', 'SelectedFields-0', + 'PopularFields-0', 'AvailableFields-23', + 'UnmappedFields-0', 'EmptyFields-0', 'MetaFields-3', ]); }); it('should work correctly when selected fields are present', async () => { - const { result, waitForNextUpdate } = renderHook(() => - useGroupedFields({ + const { result, waitForNextUpdate } = renderHook(useGroupedFields, { + initialProps: { dataViewId: dataView.id!, allFields, services: mockedServices, onSelectedFieldFilter: (field: DataViewField) => ['bytes', 'extension', '_id', '@timestamp'].includes(field.name), - }) - ); + }, + }); await waitForNextUpdate(); @@ -167,20 +288,22 @@ describe('UnifiedFieldList useGroupedFields()', () => { ).toStrictEqual([ 'SpecialFields-0', 'SelectedFields-4', + 'PopularFields-0', 'AvailableFields-25', + 'UnmappedFields-0', 'EmptyFields-0', 'MetaFields-3', ]); }); it('should work correctly for text-based queries (no data view)', async () => { - const { result } = renderHook(() => - useGroupedFields({ + const { result } = renderHook(useGroupedFields, { + initialProps: { dataViewId: null, - allFields, + allFields: allFieldsIncludingUnmapped, services: mockedServices, - }) - ); + }, + }); const fieldGroups = result.current.fieldGroups; @@ -188,24 +311,36 @@ describe('UnifiedFieldList useGroupedFields()', () => { Object.keys(fieldGroups!).map( (key) => `${key}-${fieldGroups![key as FieldsGroupNames]?.fields.length}` ) - ).toStrictEqual(['SpecialFields-0', 'SelectedFields-0', 'AvailableFields-28', 'MetaFields-0']); + ).toStrictEqual([ + 'SpecialFields-0', + 'SelectedFields-0', + 'PopularFields-0', + 'AvailableFields-56', // even unmapped fields fall into Available + 'UnmappedFields-0', + 'MetaFields-0', + ]); + + expect(result.current.fieldsExistenceStatus).toBe(ExistenceFetchStatus.succeeded); + expect(result.current.fieldsExistInIndex).toBe(true); }); it('should work correctly when details are overwritten', async () => { - const { result, waitForNextUpdate } = renderHook(() => - useGroupedFields({ + const onOverrideFieldGroupDetails: GroupedFieldsParams['onOverrideFieldGroupDetails'] = + jest.fn((groupName) => { + if (groupName === FieldsGroupNames.SelectedFields) { + return { + helpText: 'test', + }; + } + }); + const { result, waitForNextUpdate } = renderHook(useGroupedFields, { + initialProps: { dataViewId: dataView.id!, allFields, services: mockedServices, - onOverrideFieldGroupDetails: (groupName) => { - if (groupName === FieldsGroupNames.SelectedFields) { - return { - helpText: 'test', - }; - } - }, - }) - ); + onOverrideFieldGroupDetails, + }, + }); await waitForNextUpdate(); @@ -213,6 +348,7 @@ describe('UnifiedFieldList useGroupedFields()', () => { expect(fieldGroups[FieldsGroupNames.SelectedFields]?.helpText).toBe('test'); expect(fieldGroups[FieldsGroupNames.AvailableFields]?.helpText).not.toBe('test'); + expect(onOverrideFieldGroupDetails).toHaveBeenCalled(); }); it('should work correctly when changing a data view and existence info is available only for one of them', async () => { @@ -248,11 +384,16 @@ describe('UnifiedFieldList useGroupedFields()', () => { ).toStrictEqual([ 'SpecialFields-0', 'SelectedFields-0', + 'PopularFields-0', 'AvailableFields-2', + 'UnmappedFields-0', 'EmptyFields-23', 'MetaFields-3', ]); + expect(result.current.fieldsExistenceStatus).toBe(ExistenceFetchStatus.succeeded); + expect(result.current.fieldsExistInIndex).toBe(true); + rerender({ ...props, dataViewId: anotherDataView.id!, @@ -267,6 +408,133 @@ describe('UnifiedFieldList useGroupedFields()', () => { Object.keys(fieldGroups!).map( (key) => `${key}-${fieldGroups![key as FieldsGroupNames]?.fields.length}` ) - ).toStrictEqual(['SpecialFields-0', 'SelectedFields-0', 'AvailableFields-8', 'MetaFields-0']); + ).toStrictEqual([ + 'SpecialFields-0', + 'SelectedFields-0', + 'PopularFields-0', + 'AvailableFields-8', + 'UnmappedFields-0', + 'MetaFields-0', + ]); + + expect(result.current.fieldsExistenceStatus).toBe(ExistenceFetchStatus.unknown); + expect(result.current.fieldsExistInIndex).toBe(true); + }); + + it('should work correctly when popular fields limit is present', async () => { + // `bytes` is popular, but we are skipping it here to test that it would not be shown under Popular and Available + const onSupportedFieldFilter = jest.fn((field) => field.name !== 'bytes'); + + const { result, waitForNextUpdate } = renderHook(useGroupedFields, { + initialProps: { + dataViewId: dataView.id!, + allFields, + popularFieldsLimit: 10, + services: mockedServices, + onSupportedFieldFilter, + }, + }); + + await waitForNextUpdate(); + + const fieldGroups = result.current.fieldGroups; + + expect( + Object.keys(fieldGroups!).map( + (key) => `${key}-${fieldGroups![key as FieldsGroupNames]?.fields.length}` + ) + ).toStrictEqual([ + 'SpecialFields-0', + 'SelectedFields-0', + 'PopularFields-3', + 'AvailableFields-24', + 'UnmappedFields-0', + 'EmptyFields-0', + 'MetaFields-3', + ]); + + expect(fieldGroups.PopularFields?.fields.map((field) => field.name).join(',')).toBe( + '@timestamp,time,ssl' + ); + }); + + it('should work correctly when global filters are set', async () => { + const { result, waitForNextUpdate } = renderHook(useGroupedFields, { + initialProps: { + dataViewId: dataView.id!, + allFields: [], + isAffectedByGlobalFilter: true, + services: mockedServices, + }, + }); + + await waitForNextUpdate(); + + const fieldGroups = result.current.fieldGroups; + expect(fieldGroups).toMatchSnapshot(); + }); + + it('should work correctly and show unmapped fields separately', async () => { + const { result, waitForNextUpdate } = renderHook(useGroupedFields, { + initialProps: { + dataViewId: dataView.id!, + allFields: allFieldsIncludingUnmapped, + services: mockedServices, + }, + }); + + await waitForNextUpdate(); + + const fieldGroups = result.current.fieldGroups; + + expect( + Object.keys(fieldGroups!).map( + (key) => `${key}-${fieldGroups![key as FieldsGroupNames]?.fields.length}` + ) + ).toStrictEqual([ + 'SpecialFields-0', + 'SelectedFields-0', + 'PopularFields-0', + 'AvailableFields-25', + 'UnmappedFields-28', + 'EmptyFields-0', + 'MetaFields-3', + ]); + }); + + it('should work correctly when custom selected fields are provided', async () => { + const customSortedFields = [ + allFieldsIncludingUnmapped[allFieldsIncludingUnmapped.length - 1], + allFields[2], + allFields[0], + ]; + const { result, waitForNextUpdate } = renderHook(useGroupedFields, { + initialProps: { + dataViewId: dataView.id!, + allFields, + sortedSelectedFields: customSortedFields, + services: mockedServices, + }, + }); + + await waitForNextUpdate(); + + const fieldGroups = result.current.fieldGroups; + + expect( + Object.keys(fieldGroups!).map( + (key) => `${key}-${fieldGroups![key as FieldsGroupNames]?.fields.length}` + ) + ).toStrictEqual([ + 'SpecialFields-0', + 'SelectedFields-3', + 'PopularFields-0', + 'AvailableFields-25', + 'UnmappedFields-0', + 'EmptyFields-0', + 'MetaFields-3', + ]); + + expect(fieldGroups.SelectedFields?.fields).toBe(customSortedFields); }); }); diff --git a/src/plugins/unified_field_list/public/hooks/use_grouped_fields.ts b/src/plugins/unified_field_list/public/hooks/use_grouped_fields.ts index cfa5407a238cc..39d1258ee62d8 100644 --- a/src/plugins/unified_field_list/public/hooks/use_grouped_fields.ts +++ b/src/plugins/unified_field_list/public/hooks/use_grouped_fields.ts @@ -17,16 +17,20 @@ import { type FieldsGroup, type FieldListItem, FieldsGroupNames, + ExistenceFetchStatus, } from '../types'; import { type ExistingFieldsReader } from './use_existing_fields'; export interface GroupedFieldsParams { dataViewId: string | null; // `null` is for text-based queries - allFields: T[]; + allFields: T[] | null; // `null` is for loading indicator services: { dataViews: DataViewsContract; }; - fieldsExistenceReader?: ExistingFieldsReader; + fieldsExistenceReader?: ExistingFieldsReader; // use `undefined` for text-based queries + isAffectedByGlobalFilter?: boolean; + popularFieldsLimit?: number; + sortedSelectedFields?: T[]; onOverrideFieldGroupDetails?: ( groupName: FieldsGroupNames ) => Partial | undefined | null; @@ -37,6 +41,9 @@ export interface GroupedFieldsParams { export interface GroupedFieldsResult { fieldGroups: FieldListGroups; + scrollToTopResetCounter: number; + fieldsExistenceStatus: ExistenceFetchStatus; + fieldsExistInIndex: boolean; } export function useGroupedFields({ @@ -44,12 +51,16 @@ export function useGroupedFields({ allFields, services, fieldsExistenceReader, + isAffectedByGlobalFilter = false, + popularFieldsLimit, + sortedSelectedFields, onOverrideFieldGroupDetails, onSupportedFieldFilter, onSelectedFieldFilter, onFilterField, }: GroupedFieldsParams): GroupedFieldsResult { const [dataView, setDataView] = useState(null); + const isAffectedByTimeFilter = Boolean(dataView?.timeFieldName); const fieldsExistenceInfoUnavailable: boolean = dataViewId ? fieldsExistenceReader?.isFieldsExistenceInfoUnavailable(dataViewId) ?? false : true; @@ -68,33 +79,59 @@ export function useGroupedFields({ // if field existence information changed, reload the data view too }, [dataViewId, services.dataViews, setDataView, hasFieldDataHandler]); + // important when switching from a known dataViewId to no data view (like in text-based queries) + useEffect(() => { + if (dataView && !dataViewId) { + setDataView(null); + } + }, [dataView, setDataView, dataViewId]); + + // eslint-disable-next-line react-hooks/exhaustive-deps + const scrollToTopResetCounter: number = useMemo(() => Date.now(), [dataViewId, onFilterField]); + const unfilteredFieldGroups: FieldListGroups = useMemo(() => { const containsData = (field: T) => { - if (!dataViewId || !dataView) { - return true; - } - const overallField = dataView.getFieldByName?.(field.name); - return Boolean(overallField && hasFieldDataHandler(dataViewId, overallField.name)); + return dataViewId ? hasFieldDataHandler(dataViewId, field.name) : true; }; - const fields = allFields || []; - const allSupportedTypesFields = onSupportedFieldFilter - ? fields.filter(onSupportedFieldFilter) - : fields; - const sortedFields = [...allSupportedTypesFields].sort(sortFields); + const selectedFields = sortedSelectedFields || []; + const sortedFields = [...(allFields || [])].sort(sortFields); const groupedFields = { ...getDefaultFieldGroups(), ...groupBy(sortedFields, (field) => { + if (!sortedSelectedFields && onSelectedFieldFilter && onSelectedFieldFilter(field)) { + selectedFields.push(field); + } + if (onSupportedFieldFilter && !onSupportedFieldFilter(field)) { + return 'skippedFields'; + } if (field.type === 'document') { return 'specialFields'; - } else if (dataView?.metaFields?.includes(field.name)) { + } + if (dataView?.metaFields?.includes(field.name)) { return 'metaFields'; - } else if (containsData(field)) { + } + if (dataView?.getFieldByName && !dataView.getFieldByName(field.name)) { + return 'unmappedFields'; + } + if (containsData(field) || fieldsExistenceInfoUnavailable) { return 'availableFields'; - } else return 'emptyFields'; + } + return 'emptyFields'; }), }; - const selectedFields = onSelectedFieldFilter ? sortedFields.filter(onSelectedFieldFilter) : []; + + const popularFields = popularFieldsLimit + ? sortedFields + .filter( + (field) => + field.count && + field.type !== '_source' && + (!onSupportedFieldFilter || onSupportedFieldFilter(field)) + ) + .sort((a: T, b: T) => (b.count || 0) - (a.count || 0)) // sort by popularity score + .slice(0, popularFieldsLimit) + : []; let fieldGroupDefinitions: FieldListGroups = { SpecialFields: { @@ -115,8 +152,25 @@ export function useGroupedFields({ title: i18n.translate('unifiedFieldList.useGroupedFields.selectedFieldsLabel', { defaultMessage: 'Selected fields', }), - isAffectedByGlobalFilter: false, - isAffectedByTimeFilter: true, + isAffectedByGlobalFilter, + isAffectedByTimeFilter, + hideDetails: false, + hideIfEmpty: true, + }, + PopularFields: { + fields: popularFields, + fieldCount: popularFields.length, + isInitiallyOpen: true, + showInAccordion: true, + title: i18n.translate('unifiedFieldList.useGroupedFields.popularFieldsLabel', { + defaultMessage: 'Popular fields', + }), + helpText: i18n.translate('unifiedFieldList.useGroupedFields.popularFieldsLabelHelp', { + defaultMessage: + 'Fields that your organization frequently uses, from most to least popular.', + }), + isAffectedByGlobalFilter, + isAffectedByTimeFilter, hideDetails: false, hideIfEmpty: true, }, @@ -133,8 +187,8 @@ export function useGroupedFields({ : i18n.translate('unifiedFieldList.useGroupedFields.availableFieldsLabel', { defaultMessage: 'Available fields', }), - isAffectedByGlobalFilter: false, - isAffectedByTimeFilter: true, + isAffectedByGlobalFilter, + isAffectedByTimeFilter, // Show details on timeout but not failure // hideDetails: fieldsExistenceInfoUnavailable && !existenceFetchTimeout, // TODO: is this check still necessary? hideDetails: fieldsExistenceInfoUnavailable, @@ -145,6 +199,22 @@ export function useGroupedFields({ } ), }, + UnmappedFields: { + fields: groupedFields.unmappedFields, + fieldCount: groupedFields.unmappedFields.length, + isAffectedByGlobalFilter, + isAffectedByTimeFilter, + isInitiallyOpen: false, + showInAccordion: true, + hideDetails: false, + hideIfEmpty: true, + title: i18n.translate('unifiedFieldList.useGroupedFields.unmappedFieldsLabel', { + defaultMessage: 'Unmapped fields', + }), + helpText: i18n.translate('unifiedFieldList.useGroupedFields.unmappedFieldsLabelHelp', { + defaultMessage: "Fields that aren't explicitly mapped to a field data type.", + }), + }, EmptyFields: { fields: groupedFields.emptyFields, fieldCount: groupedFields.emptyFields.length, @@ -157,15 +227,15 @@ export function useGroupedFields({ title: i18n.translate('unifiedFieldList.useGroupedFields.emptyFieldsLabel', { defaultMessage: 'Empty fields', }), + helpText: i18n.translate('unifiedFieldList.useGroupedFields.emptyFieldsLabelHelp', { + defaultMessage: "Fields that don't have any values based on your filters.", + }), defaultNoFieldsMessage: i18n.translate( 'unifiedFieldList.useGroupedFields.noEmptyDataLabel', { defaultMessage: `There are no empty fields.`, } ), - helpText: i18n.translate('unifiedFieldList.useGroupedFields.emptyFieldsLabelHelp', { - defaultMessage: 'Empty fields did not contain any values based on your filters.', - }), }, MetaFields: { fields: groupedFields.metaFields, @@ -220,6 +290,10 @@ export function useGroupedFields({ dataViewId, hasFieldDataHandler, fieldsExistenceInfoUnavailable, + isAffectedByGlobalFilter, + isAffectedByTimeFilter, + popularFieldsLimit, + sortedSelectedFields, ]); const fieldGroups: FieldListGroups = useMemo(() => { @@ -235,22 +309,39 @@ export function useGroupedFields({ ) as FieldListGroups; }, [unfilteredFieldGroups, onFilterField]); - return useMemo( - () => ({ + const hasDataLoaded = Boolean(allFields); + const allFieldsLength = allFields?.length; + + const fieldsExistInIndex = useMemo(() => { + return dataViewId ? Boolean(allFieldsLength) : true; + }, [dataViewId, allFieldsLength]); + + const fieldsExistenceStatus = useMemo(() => { + if (!hasDataLoaded) { + return ExistenceFetchStatus.unknown; // to show loading indicator in the list + } + if (!dataViewId || !fieldsExistenceReader) { + // ex. for text-based queries + return ExistenceFetchStatus.succeeded; + } + return fieldsExistenceReader.getFieldsExistenceStatus(dataViewId); + }, [dataViewId, hasDataLoaded, fieldsExistenceReader]); + + return useMemo(() => { + return { fieldGroups, - }), - [fieldGroups] - ); + scrollToTopResetCounter, + fieldsExistInIndex, + fieldsExistenceStatus, + }; + }, [fieldGroups, scrollToTopResetCounter, fieldsExistInIndex, fieldsExistenceStatus]); } +const collator = new Intl.Collator(undefined, { + sensitivity: 'base', +}); function sortFields(fieldA: T, fieldB: T) { - return (fieldA.displayName || fieldA.name).localeCompare( - fieldB.displayName || fieldB.name, - undefined, - { - sensitivity: 'base', - } - ); + return collator.compare(fieldA.displayName || fieldA.name, fieldB.displayName || fieldB.name); } function hasFieldDataByDefault(): boolean { @@ -263,5 +354,7 @@ function getDefaultFieldGroups() { availableFields: [], emptyFields: [], metaFields: [], + unmappedFields: [], + skippedFields: [], }; } diff --git a/src/plugins/unified_field_list/public/hooks/use_query_subscriber.ts b/src/plugins/unified_field_list/public/hooks/use_query_subscriber.ts index 9b42db6301f8f..44101d206a2de 100644 --- a/src/plugins/unified_field_list/public/hooks/use_query_subscriber.ts +++ b/src/plugins/unified_field_list/public/hooks/use_query_subscriber.ts @@ -9,6 +9,7 @@ import { useEffect, useState } from 'react'; import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; import type { AggregateQuery, Query, Filter } from '@kbn/es-query'; +import { getResolvedDateRange } from '../utils/get_resolved_date_range'; /** * Hook params @@ -23,32 +24,68 @@ export interface QuerySubscriberParams { export interface QuerySubscriberResult { query: Query | AggregateQuery | undefined; filters: Filter[] | undefined; + fromDate: string | undefined; + toDate: string | undefined; } /** - * Memorizes current query and filters + * Memorizes current query, filters and absolute date range * @param data + * @public */ export const useQuerySubscriber = ({ data }: QuerySubscriberParams) => { + const timefilter = data.query.timefilter.timefilter; const [result, setResult] = useState(() => { const state = data.query.getState(); + const dateRange = getResolvedDateRange(timefilter); return { query: state?.query, filters: state?.filters, + fromDate: dateRange.fromDate, + toDate: dateRange.toDate, }; }); useEffect(() => { - const subscription = data.query.state$.subscribe(({ state }) => { + const subscription = data.search.session.state$.subscribe((sessionState) => { + const dateRange = getResolvedDateRange(timefilter); setResult((prevState) => ({ ...prevState, - query: state.query, - filters: state.filters, + fromDate: dateRange.fromDate, + toDate: dateRange.toDate, })); }); + return () => subscription.unsubscribe(); + }, [setResult, timefilter, data.search.session.state$]); + + useEffect(() => { + const subscription = data.query.state$.subscribe(({ state, changes }) => { + if (changes.query || changes.filters) { + setResult((prevState) => ({ + ...prevState, + query: state.query, + filters: state.filters, + })); + } + }); + return () => subscription.unsubscribe(); }, [setResult, data.query.state$]); return result; }; + +/** + * Checks if query result is ready to be used + * @param result + * @public + */ +export const hasQuerySubscriberData = ( + result: QuerySubscriberResult +): result is { + query: Query | AggregateQuery; + filters: Filter[]; + fromDate: string; + toDate: string; +} => Boolean(result.query && result.filters && result.fromDate && result.toDate); diff --git a/src/plugins/unified_field_list/public/index.ts b/src/plugins/unified_field_list/public/index.ts index e1a315401e0bc..68fddef0ffc16 100755 --- a/src/plugins/unified_field_list/public/index.ts +++ b/src/plugins/unified_field_list/public/index.ts @@ -76,6 +76,7 @@ export { export { useQuerySubscriber, + hasQuerySubscriberData, type QuerySubscriberResult, type QuerySubscriberParams, } from './hooks/use_query_subscriber'; diff --git a/src/plugins/unified_field_list/public/types.ts b/src/plugins/unified_field_list/public/types.ts index d2c80286f8dea..c28452ebc6f25 100755 --- a/src/plugins/unified_field_list/public/types.ts +++ b/src/plugins/unified_field_list/public/types.ts @@ -29,14 +29,17 @@ export interface FieldListItem { name: DataViewField['name']; type?: DataViewField['type']; displayName?: DataViewField['displayName']; + count?: DataViewField['count']; } export enum FieldsGroupNames { SpecialFields = 'SpecialFields', SelectedFields = 'SelectedFields', + PopularFields = 'PopularFields', AvailableFields = 'AvailableFields', EmptyFields = 'EmptyFields', MetaFields = 'MetaFields', + UnmappedFields = 'UnmappedFields', } export interface FieldsGroupDetails { diff --git a/src/plugins/unified_field_list/public/utils/get_resolved_date_range.ts b/src/plugins/unified_field_list/public/utils/get_resolved_date_range.ts new file mode 100644 index 0000000000000..3939c49d7f514 --- /dev/null +++ b/src/plugins/unified_field_list/public/utils/get_resolved_date_range.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 TimefilterContract } from '@kbn/data-plugin/public'; + +/** + * Get resolved time range by using now provider + * @param timefilter + */ +export const getResolvedDateRange = (timefilter: TimefilterContract) => { + const { from, to } = timefilter.getTime(); + const { min, max } = timefilter.calculateBounds({ + from, + to, + }); + return { fromDate: min?.toISOString() || from, toDate: max?.toISOString() || to }; +}; diff --git a/src/plugins/vis_types/timeseries/public/application/components/lib/replace_vars.ts b/src/plugins/vis_types/timeseries/public/application/components/lib/replace_vars.ts index d3a63f9f2421d..77ac817d53d28 100644 --- a/src/plugins/vis_types/timeseries/public/application/components/lib/replace_vars.ts +++ b/src/plugins/vis_types/timeseries/public/application/components/lib/replace_vars.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import { encode, RisonValue } from 'rison-node'; +import { encode } from '@kbn/rison'; import Handlebars, { ExtendedCompileOptions, compileFnName } from '@kbn/handlebars'; import { i18n } from '@kbn/i18n'; import { emptyLabel } from '../../../../common/empty_label'; @@ -41,7 +41,7 @@ function createSerializationHelper( handlebars.registerHelper( 'rison', - createSerializationHelper('rison', (v) => encode(v as RisonValue)) + createSerializationHelper('rison', (v) => encode(v)) ); handlebars.registerHelper('encodeURIComponent', (component: unknown) => { diff --git a/src/plugins/visualizations/common/locator_location.ts b/src/plugins/visualizations/common/locator_location.ts index c4c86007fd124..e43fc9fcbd5e5 100644 --- a/src/plugins/visualizations/common/locator_location.ts +++ b/src/plugins/visualizations/common/locator_location.ts @@ -10,7 +10,7 @@ import type { Serializable } from '@kbn/utility-types'; import { omitBy } from 'lodash'; import type { ParsedQuery } from 'query-string'; import { stringify } from 'query-string'; -import rison from 'rison-node'; +import rison from '@kbn/rison'; import { isFilterPinned } from '@kbn/es-query'; import { url } from '@kbn/kibana-utils-plugin/common'; import { GLOBAL_STATE_STORAGE_KEY, STATE_STORAGE_KEY, VisualizeConstants } from './constants'; diff --git a/test/api_integration/apis/guided_onboarding/get_config.ts b/test/api_integration/apis/guided_onboarding/get_config.ts new file mode 100644 index 0000000000000..fc96cb81c3816 --- /dev/null +++ b/test/api_integration/apis/guided_onboarding/get_config.ts @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 expect from '@kbn/expect'; +import type { FtrProviderContext } from '../../ftr_provider_context'; + +const getConfigsPath = '/api/guided_onboarding/configs'; +export default function testGetGuidesState({ getService }: FtrProviderContext) { + const supertest = getService('supertest'); + + describe('GET /api/guided_onboarding/configs', () => { + // check that all guides are present + ['testGuide', 'security', 'search', 'observability'].map((guideId) => { + it(`returns config for ${guideId}`, async () => { + const response = await supertest.get(`${getConfigsPath}/${guideId}`).expect(200); + expect(response.body).not.to.be.empty(); + const { config } = response.body; + expect(config).to.not.be.empty(); + }); + }); + }); +} diff --git a/test/api_integration/apis/guided_onboarding/index.ts b/test/api_integration/apis/guided_onboarding/index.ts index c924eafe6bdb1..b2b3c23705763 100644 --- a/test/api_integration/apis/guided_onboarding/index.ts +++ b/test/api_integration/apis/guided_onboarding/index.ts @@ -13,5 +13,6 @@ export default function apiIntegrationTests({ loadTestFile }: FtrProviderContext loadTestFile(require.resolve('./get_state')); loadTestFile(require.resolve('./put_state')); loadTestFile(require.resolve('./get_guides')); + loadTestFile(require.resolve('./get_config')); }); } diff --git a/test/functional/apps/discover/group1/_shared_links.ts b/test/functional/apps/discover/group1/_shared_links.ts index 9235cd1160db7..edad2010db7ed 100644 --- a/test/functional/apps/discover/group1/_shared_links.ts +++ b/test/functional/apps/discover/group1/_shared_links.ts @@ -76,7 +76,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const expectedUrl = baseUrl + '/app/discover?_t=1453775307251#' + - '/?_g=(filters:!(),refreshInterval:(pause:!t,value:0),time' + + '/?_g=(filters:!(),refreshInterval:(pause:!t,value:60000),time' + ":(from:'2015-09-19T06:31:44.000Z',to:'2015-09" + "-23T18:31:44.000Z'))&_a=(columns:!(),filters:!(),index:'logstash-" + "*',interval:auto,query:(language:kuery,query:'')" + @@ -102,7 +102,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { baseUrl + '/app/discover#' + '/view/ab12e3c0-f231-11e6-9486-733b1ac9221a' + - '?_g=(filters%3A!()%2CrefreshInterval%3A(pause%3A!t%2Cvalue%3A0)' + + '?_g=(filters%3A!()%2CrefreshInterval%3A(pause%3A!t%2Cvalue%3A60000)' + "%2Ctime%3A(from%3A'2015-09-19T06%3A31%3A44.000Z'%2C" + "to%3A'2015-09-23T18%3A31%3A44.000Z'))"; await PageObjects.discover.loadSavedSearch('A Saved Search'); diff --git a/test/functional/apps/discover/group1/_sidebar.ts b/test/functional/apps/discover/group1/_sidebar.ts index 585aae36196e6..109e8aa37cd38 100644 --- a/test/functional/apps/discover/group1/_sidebar.ts +++ b/test/functional/apps/discover/group1/_sidebar.ts @@ -20,22 +20,31 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { 'unifiedSearch', ]); const testSubjects = getService('testSubjects'); + const find = getService('find'); const browser = getService('browser'); + const monacoEditor = getService('monacoEditor'); const filterBar = getService('filterBar'); + const fieldEditor = getService('fieldEditor'); describe('discover sidebar', function describeIndexTests() { before(async function () { await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/logstash_functional'); + }); + + beforeEach(async () => { await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/discover'); await kibanaServer.uiSettings.replace({ defaultIndex: 'logstash-*', }); await PageObjects.timePicker.setDefaultAbsoluteRangeViaUiSettings(); await PageObjects.common.navigateToApp('discover'); + await PageObjects.discover.waitUntilSearchingHasFinished(); }); - after(async () => { + afterEach(async () => { await kibanaServer.importExport.unload('test/functional/fixtures/kbn_archiver/discover'); + await kibanaServer.savedObjects.cleanStandardList(); + await kibanaServer.uiSettings.replace({}); }); describe('field filtering', function () { @@ -107,5 +116,449 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await testSubjects.existOrFail('discover-sidebar'); }); }); + + describe('renders field groups', function () { + it('should show field list groups excluding subfields', async function () { + await PageObjects.discover.waitUntilSidebarHasLoaded(); + expect(await PageObjects.discover.doesSidebarShowFields()).to.be(true); + + // Initial Available fields + const expectedInitialAvailableFields = + '@message, @tags, @timestamp, agent, bytes, clientip, extension, geo.coordinates, geo.dest, geo.src, geo.srcdest, headings, host, id, index, ip, links, machine.os, machine.ram, machine.ram_range, memory, meta.char, meta.related, meta.user.firstname, meta.user.lastname, nestedField.child, phpmemory, referer, relatedContent.article:modified_time, relatedContent.article:published_time, relatedContent.article:section, relatedContent.article:tag, relatedContent.og:description, relatedContent.og:image, relatedContent.og:image:height, relatedContent.og:image:width, relatedContent.og:site_name, relatedContent.og:title, relatedContent.og:type, relatedContent.og:url, relatedContent.twitter:card, relatedContent.twitter:description, relatedContent.twitter:image, relatedContent.twitter:site, relatedContent.twitter:title, relatedContent.url, request, response, spaces, type'; + let availableFields = await PageObjects.discover.getSidebarSectionFieldNames('available'); + expect(availableFields.length).to.be(50); + expect(availableFields.join(', ')).to.be(expectedInitialAvailableFields); + + // Available fields after scrolling down + const emptySectionButton = await find.byCssSelector( + PageObjects.discover.getSidebarSectionSelector('empty', true) + ); + await emptySectionButton.scrollIntoViewIfNecessary(); + availableFields = await PageObjects.discover.getSidebarSectionFieldNames('available'); + expect(availableFields.length).to.be(53); + expect(availableFields.join(', ')).to.be( + `${expectedInitialAvailableFields}, url, utc_time, xss` + ); + + // Expand Empty section + await PageObjects.discover.toggleSidebarSection('empty'); + expect((await PageObjects.discover.getSidebarSectionFieldNames('empty')).join(', ')).to.be( + '' + ); + + // Expand Meta section + await PageObjects.discover.toggleSidebarSection('meta'); + expect((await PageObjects.discover.getSidebarSectionFieldNames('meta')).join(', ')).to.be( + '_id, _index, _score' + ); + + expect(await PageObjects.discover.getSidebarAriaDescription()).to.be( + '53 available fields. 0 empty fields. 3 meta fields.' + ); + }); + + it('should show field list groups excluding subfields when searched from source', async function () { + await kibanaServer.uiSettings.update({ 'discover:searchFieldsFromSource': true }); + await browser.refresh(); + + await PageObjects.discover.waitUntilSidebarHasLoaded(); + expect(await PageObjects.discover.doesSidebarShowFields()).to.be(true); + + // Initial Available fields + let availableFields = await PageObjects.discover.getSidebarSectionFieldNames('available'); + expect(availableFields.length).to.be(50); + expect( + availableFields + .join(', ') + .startsWith( + '@message, @tags, @timestamp, agent, bytes, clientip, extension, geo.coordinates' + ) + ).to.be(true); + + // Available fields after scrolling down + const emptySectionButton = await find.byCssSelector( + PageObjects.discover.getSidebarSectionSelector('empty', true) + ); + await emptySectionButton.scrollIntoViewIfNecessary(); + availableFields = await PageObjects.discover.getSidebarSectionFieldNames('available'); + expect(availableFields.length).to.be(53); + + // Expand Empty section + await PageObjects.discover.toggleSidebarSection('empty'); + expect((await PageObjects.discover.getSidebarSectionFieldNames('empty')).join(', ')).to.be( + '' + ); + + // Expand Meta section + await PageObjects.discover.toggleSidebarSection('meta'); + expect((await PageObjects.discover.getSidebarSectionFieldNames('meta')).join(', ')).to.be( + '_id, _index, _score' + ); + + // Expand Unmapped section + await PageObjects.discover.toggleSidebarSection('unmapped'); + expect( + (await PageObjects.discover.getSidebarSectionFieldNames('unmapped')).join(', ') + ).to.be('relatedContent'); + + expect(await PageObjects.discover.getSidebarAriaDescription()).to.be( + '53 available fields. 1 unmapped field. 0 empty fields. 3 meta fields.' + ); + }); + + it('should show selected and popular fields', async function () { + await PageObjects.discover.clickFieldListItemAdd('extension'); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.discover.clickFieldListItemAdd('@message'); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + expect( + (await PageObjects.discover.getSidebarSectionFieldNames('selected')).join(', ') + ).to.be('extension, @message'); + + const availableFields = await PageObjects.discover.getSidebarSectionFieldNames('available'); + expect(availableFields.includes('extension')).to.be(true); + expect(availableFields.includes('@message')).to.be(true); + + expect(await PageObjects.discover.getSidebarAriaDescription()).to.be( + '2 selected fields. 2 popular fields. 53 available fields. 0 empty fields. 3 meta fields.' + ); + + await PageObjects.discover.clickFieldListItemRemove('@message'); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + await PageObjects.discover.clickFieldListItemAdd('_id'); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.discover.clickFieldListItemAdd('@message'); + await PageObjects.discover.waitUntilSearchingHasFinished(); + + expect( + (await PageObjects.discover.getSidebarSectionFieldNames('selected')).join(', ') + ).to.be('extension, _id, @message'); + + expect( + (await PageObjects.discover.getSidebarSectionFieldNames('popular')).join(', ') + ).to.be('@message, _id, extension'); + + expect(await PageObjects.discover.getSidebarAriaDescription()).to.be( + '3 selected fields. 3 popular fields. 53 available fields. 0 empty fields. 3 meta fields.' + ); + }); + + it('should show selected and available fields in text-based mode', async function () { + await kibanaServer.uiSettings.update({ 'discover:enableSql': true }); + await browser.refresh(); + + await PageObjects.discover.waitUntilSidebarHasLoaded(); + + expect(await PageObjects.discover.getSidebarAriaDescription()).to.be( + '53 available fields. 0 empty fields. 3 meta fields.' + ); + + await PageObjects.discover.selectTextBaseLang('SQL'); + + expect(await PageObjects.discover.getSidebarAriaDescription()).to.be( + '50 selected fields. 51 available fields.' + ); + + await PageObjects.discover.clickFieldListItemRemove('extension'); + await PageObjects.discover.waitUntilSidebarHasLoaded(); + + expect(await PageObjects.discover.getSidebarAriaDescription()).to.be( + '49 selected fields. 51 available fields.' + ); + + const testQuery = `SELECT "@tags", geo.dest, count(*) occurred FROM "logstash-*" + GROUP BY "@tags", geo.dest + HAVING occurred > 20 + ORDER BY occurred DESC`; + + await monacoEditor.setCodeEditorValue(testQuery); + await testSubjects.click('querySubmitButton'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSidebarHasLoaded(); + + expect(await PageObjects.discover.getSidebarAriaDescription()).to.be( + '3 selected fields. 3 available fields.' + ); + expect( + (await PageObjects.discover.getSidebarSectionFieldNames('selected')).join(', ') + ).to.be('@tags, geo.dest, occurred'); + + await PageObjects.unifiedSearch.switchDataView( + 'discover-dataView-switch-link', + 'logstash-*', + true + ); + + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSidebarHasLoaded(); + + expect(await PageObjects.discover.getSidebarAriaDescription()).to.be( + '1 popular field. 53 available fields. 0 empty fields. 3 meta fields.' + ); + }); + + it('should work correctly for a data view for a missing index', async function () { + // but we are skipping importing the index itself + await kibanaServer.importExport.load( + 'test/functional/fixtures/kbn_archiver/index_pattern_without_timefield' + ); + await browser.refresh(); + await PageObjects.discover.waitUntilSidebarHasLoaded(); + + expect(await PageObjects.discover.getSidebarAriaDescription()).to.be( + '53 available fields. 0 empty fields. 3 meta fields.' + ); + + await PageObjects.discover.selectIndexPattern('with-timefield'); + + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSidebarHasLoaded(); + + expect(await PageObjects.discover.getSidebarAriaDescription()).to.be( + '0 available fields. 0 meta fields.' + ); + await testSubjects.existOrFail( + `${PageObjects.discover.getSidebarSectionSelector('available')}-fetchWarning` + ); + await testSubjects.existOrFail( + `${PageObjects.discover.getSidebarSectionSelector( + 'available' + )}NoFieldsCallout-noFieldsExist` + ); + + await PageObjects.discover.selectIndexPattern('logstash-*'); + + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSidebarHasLoaded(); + + expect(await PageObjects.discover.getSidebarAriaDescription()).to.be( + '53 available fields. 0 empty fields. 3 meta fields.' + ); + await kibanaServer.importExport.unload( + 'test/functional/fixtures/kbn_archiver/index_pattern_without_timefield' + ); + }); + + it('should work correctly when switching data views', async function () { + await esArchiver.loadIfNeeded( + 'test/functional/fixtures/es_archiver/index_pattern_without_timefield' + ); + await kibanaServer.importExport.load( + 'test/functional/fixtures/kbn_archiver/index_pattern_without_timefield' + ); + + await browser.refresh(); + await PageObjects.discover.waitUntilSidebarHasLoaded(); + + expect(await PageObjects.discover.getSidebarAriaDescription()).to.be( + '53 available fields. 0 empty fields. 3 meta fields.' + ); + + await PageObjects.discover.selectIndexPattern('without-timefield'); + + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSidebarHasLoaded(); + + expect(await PageObjects.discover.getSidebarAriaDescription()).to.be( + '6 available fields. 0 empty fields. 3 meta fields.' + ); + + await PageObjects.discover.selectIndexPattern('with-timefield'); + + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSidebarHasLoaded(); + + expect(await PageObjects.discover.getSidebarAriaDescription()).to.be( + '0 available fields. 7 empty fields. 3 meta fields.' + ); + await testSubjects.existOrFail( + `${PageObjects.discover.getSidebarSectionSelector( + 'available' + )}NoFieldsCallout-noFieldsMatch` + ); + + await PageObjects.discover.selectIndexPattern('logstash-*'); + + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSidebarHasLoaded(); + + expect(await PageObjects.discover.getSidebarAriaDescription()).to.be( + '53 available fields. 0 empty fields. 3 meta fields.' + ); + + await kibanaServer.importExport.unload( + 'test/functional/fixtures/kbn_archiver/index_pattern_without_timefield' + ); + + await esArchiver.unload( + 'test/functional/fixtures/es_archiver/index_pattern_without_timefield' + ); + }); + + it('should work when filters change', async () => { + await PageObjects.header.waitUntilLoadingHasFinished(); + + expect(await PageObjects.discover.getSidebarAriaDescription()).to.be( + '53 available fields. 0 empty fields. 3 meta fields.' + ); + + await PageObjects.discover.clickFieldListItem('extension'); + expect(await testSubjects.getVisibleText('dscFieldStats-topValues')).to.be( + 'jpg\n65.0%\ncss\n15.4%\npng\n9.8%\ngif\n6.6%\nphp\n3.2%' + ); + + await filterBar.addFilter('extension', 'is', 'jpg'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSidebarHasLoaded(); + + expect(await PageObjects.discover.getSidebarAriaDescription()).to.be( + '53 available fields. 0 empty fields. 3 meta fields.' + ); + + // check that the filter was passed down to the sidebar + await PageObjects.discover.clickFieldListItem('extension'); + expect(await testSubjects.getVisibleText('dscFieldStats-topValues')).to.be('jpg\n100%'); + }); + + it('should work for many fields', async () => { + await esArchiver.loadIfNeeded('test/functional/fixtures/es_archiver/many_fields'); + await kibanaServer.importExport.load( + 'test/functional/fixtures/kbn_archiver/many_fields_data_view' + ); + + await browser.refresh(); + await PageObjects.discover.waitUntilSidebarHasLoaded(); + + expect(await PageObjects.discover.getSidebarAriaDescription()).to.be( + '53 available fields. 0 empty fields. 3 meta fields.' + ); + + await PageObjects.discover.selectIndexPattern('indices-stats*'); + + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSidebarHasLoaded(); + + expect(await PageObjects.discover.getSidebarAriaDescription()).to.be( + '6873 available fields. 0 empty fields. 3 meta fields.' + ); + + await PageObjects.discover.selectIndexPattern('logstash-*'); + + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSidebarHasLoaded(); + + expect(await PageObjects.discover.getSidebarAriaDescription()).to.be( + '53 available fields. 0 empty fields. 3 meta fields.' + ); + + await kibanaServer.importExport.unload( + 'test/functional/fixtures/kbn_archiver/many_fields_data_view' + ); + await esArchiver.unload('test/functional/fixtures/es_archiver/many_fields'); + }); + + it('should work with ad-hoc data views and runtime fields', async () => { + await PageObjects.discover.createAdHocDataView('logstash', true); + await PageObjects.header.waitUntilLoadingHasFinished(); + + expect(await PageObjects.discover.getSidebarAriaDescription()).to.be( + '53 available fields. 0 empty fields. 3 meta fields.' + ); + + await PageObjects.discover.addRuntimeField( + '_bytes-runtimefield', + `emit((doc["bytes"].value * 2).toString())` + ); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSidebarHasLoaded(); + + expect(await PageObjects.discover.getSidebarAriaDescription()).to.be( + '54 available fields. 0 empty fields. 3 meta fields.' + ); + + let allFields = await PageObjects.discover.getAllFieldNames(); + expect(allFields.includes('_bytes-runtimefield')).to.be(true); + + await PageObjects.discover.editField('_bytes-runtimefield'); + await fieldEditor.enableCustomLabel(); + await fieldEditor.setCustomLabel('_bytes-runtimefield2'); + await fieldEditor.save(); + + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSidebarHasLoaded(); + + expect(await PageObjects.discover.getSidebarAriaDescription()).to.be( + '54 available fields. 0 empty fields. 3 meta fields.' + ); + + allFields = await PageObjects.discover.getAllFieldNames(); + expect(allFields.includes('_bytes-runtimefield2')).to.be(true); + expect(allFields.includes('_bytes-runtimefield')).to.be(false); + + await PageObjects.discover.removeField('_bytes-runtimefield'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSidebarHasLoaded(); + + expect(await PageObjects.discover.getSidebarAriaDescription()).to.be( + '53 available fields. 0 empty fields. 3 meta fields.' + ); + + allFields = await PageObjects.discover.getAllFieldNames(); + expect(allFields.includes('_bytes-runtimefield2')).to.be(false); + expect(allFields.includes('_bytes-runtimefield')).to.be(false); + }); + + it('should work correctly when time range is updated', async function () { + await esArchiver.loadIfNeeded( + 'test/functional/fixtures/es_archiver/index_pattern_without_timefield' + ); + await kibanaServer.importExport.load( + 'test/functional/fixtures/kbn_archiver/index_pattern_without_timefield' + ); + + await browser.refresh(); + await PageObjects.discover.waitUntilSidebarHasLoaded(); + + expect(await PageObjects.discover.getSidebarAriaDescription()).to.be( + '53 available fields. 0 empty fields. 3 meta fields.' + ); + + await PageObjects.discover.selectIndexPattern('with-timefield'); + + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSidebarHasLoaded(); + + expect(await PageObjects.discover.getSidebarAriaDescription()).to.be( + '0 available fields. 7 empty fields. 3 meta fields.' + ); + await testSubjects.existOrFail( + `${PageObjects.discover.getSidebarSectionSelector( + 'available' + )}NoFieldsCallout-noFieldsMatch` + ); + + await PageObjects.timePicker.setAbsoluteRange( + 'Sep 21, 2019 @ 00:00:00.000', + 'Sep 23, 2019 @ 00:00:00.000' + ); + + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.waitUntilSidebarHasLoaded(); + + expect(await PageObjects.discover.getSidebarAriaDescription()).to.be( + '7 available fields. 0 empty fields. 3 meta fields.' + ); + + await kibanaServer.importExport.unload( + 'test/functional/fixtures/kbn_archiver/index_pattern_without_timefield' + ); + + await esArchiver.unload( + 'test/functional/fixtures/es_archiver/index_pattern_without_timefield' + ); + }); + }); }); } diff --git a/test/functional/apps/discover/group2/_adhoc_data_views.ts b/test/functional/apps/discover/group2/_adhoc_data_views.ts index 773471994237f..50eb3be5f07d1 100644 --- a/test/functional/apps/discover/group2/_adhoc_data_views.ts +++ b/test/functional/apps/discover/group2/_adhoc_data_views.ts @@ -51,6 +51,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); after(async () => { + await kibanaServer.savedObjects.cleanStandardList(); await esArchiver.unload('x-pack/test/functional/es_archives/logstash_functional'); }); diff --git a/test/functional/apps/discover/group2/_indexpattern_with_unmapped_fields.ts b/test/functional/apps/discover/group2/_indexpattern_with_unmapped_fields.ts index d5d45d227d685..a17e6c0798a78 100644 --- a/test/functional/apps/discover/group2/_indexpattern_with_unmapped_fields.ts +++ b/test/functional/apps/discover/group2/_indexpattern_with_unmapped_fields.ts @@ -22,8 +22,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await kibanaServer.savedObjects.clean({ types: ['search', 'index-pattern'] }); await kibanaServer.importExport.load('test/functional/fixtures/kbn_archiver/unmapped_fields'); await security.testUser.setRoles(['kibana_admin', 'test-index-unmapped-fields']); - const fromTime = 'Jan 20, 2021 @ 00:00:00.000'; - const toTime = 'Jan 25, 2021 @ 00:00:00.000'; + const fromTime = '2021-01-20T00:00:00.000Z'; + const toTime = '2021-01-25T00:00:00.000Z'; await kibanaServer.uiSettings.replace({ defaultIndex: 'test-index-unmapped-fields', @@ -48,11 +48,18 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async function () { expect(await PageObjects.discover.getHitCount()).to.be(expectedHitCount); }); - const allFields = await PageObjects.discover.getAllFieldNames(); + let allFields = await PageObjects.discover.getAllFieldNames(); // message is a mapped field expect(allFields.includes('message')).to.be(true); // sender is not a mapped field - expect(allFields.includes('sender')).to.be(true); + expect(allFields.includes('sender')).to.be(false); + + await PageObjects.discover.toggleSidebarSection('unmapped'); + + allFields = await PageObjects.discover.getAllFieldNames(); + expect(allFields.includes('sender')).to.be(true); // now visible under Unmapped section + + await PageObjects.discover.toggleSidebarSection('unmapped'); }); it('unmapped fields exist on an existing saved search', async () => { @@ -61,10 +68,20 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await retry.try(async function () { expect(await PageObjects.discover.getHitCount()).to.be(expectedHitCount); }); - const allFields = await PageObjects.discover.getAllFieldNames(); + let allFields = await PageObjects.discover.getAllFieldNames(); expect(allFields.includes('message')).to.be(true); + expect(allFields.includes('sender')).to.be(false); + expect(allFields.includes('receiver')).to.be(false); + + await PageObjects.discover.toggleSidebarSection('unmapped'); + + allFields = await PageObjects.discover.getAllFieldNames(); + + // now visible under Unmapped section expect(allFields.includes('sender')).to.be(true); expect(allFields.includes('receiver')).to.be(true); + + await PageObjects.discover.toggleSidebarSection('unmapped'); }); }); } diff --git a/test/functional/apps/discover/group2/_search_on_page_load.ts b/test/functional/apps/discover/group2/_search_on_page_load.ts index be738c3708854..2adeb9606d5f6 100644 --- a/test/functional/apps/discover/group2/_search_on_page_load.ts +++ b/test/functional/apps/discover/group2/_search_on_page_load.ts @@ -25,6 +25,8 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { defaultIndex: 'logstash-*', }; + const savedSearchName = 'saved-search-with-on-page-load'; + const initSearchOnPageLoad = async (searchOnPageLoad: boolean) => { await kibanaServer.uiSettings.replace({ 'discover:searchOnPageLoad': searchOnPageLoad }); await PageObjects.common.navigateToApp('discover'); @@ -60,6 +62,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { await esArchiver.unload('test/functional/fixtures/es_archiver/date_nested'); await esArchiver.unload('test/functional/fixtures/es_archiver/logstash_functional'); await kibanaServer.uiSettings.replace(defaultSettings); + await kibanaServer.savedObjects.cleanStandardList(); }); describe(`when it's false`, () => { @@ -68,6 +71,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { it('should not fetch data from ES initially', async function () { expect(await testSubjects.exists(refreshButtonSelector)).to.be(true); await retry.waitFor('number of fetches to be 0', waitForFetches(0)); + expect(await PageObjects.discover.doesSidebarShowFields()).to.be(false); }); it('should not fetch on indexPattern change', async function () { @@ -78,43 +82,77 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(await testSubjects.exists(refreshButtonSelector)).to.be(true); await retry.waitFor('number of fetches to be 0', waitForFetches(0)); + expect(await PageObjects.discover.doesSidebarShowFields()).to.be(false); }); it('should fetch data from ES after refreshDataButton click', async function () { expect(await testSubjects.exists(refreshButtonSelector)).to.be(true); await retry.waitFor('number of fetches to be 0', waitForFetches(0)); + expect(await PageObjects.discover.doesSidebarShowFields()).to.be(false); await testSubjects.click(refreshButtonSelector); await testSubjects.missingOrFail(refreshButtonSelector); await retry.waitFor('number of fetches to be 1', waitForFetches(1)); + expect(await PageObjects.discover.doesSidebarShowFields()).to.be(true); }); it('should fetch data from ES after submit query', async function () { expect(await testSubjects.exists(refreshButtonSelector)).to.be(true); await retry.waitFor('number of fetches to be 0', waitForFetches(0)); + expect(await PageObjects.discover.doesSidebarShowFields()).to.be(false); await queryBar.submitQuery(); await testSubjects.missingOrFail(refreshButtonSelector); await retry.waitFor('number of fetches to be 1', waitForFetches(1)); + expect(await PageObjects.discover.doesSidebarShowFields()).to.be(true); }); it('should fetch data from ES after choosing commonly used time range', async function () { await PageObjects.discover.selectIndexPattern('logstash-*'); expect(await testSubjects.exists(refreshButtonSelector)).to.be(true); await retry.waitFor('number of fetches to be 0', waitForFetches(0)); + expect(await PageObjects.discover.doesSidebarShowFields()).to.be(false); await PageObjects.timePicker.setCommonlyUsedTime('This_week'); await testSubjects.missingOrFail(refreshButtonSelector); await retry.waitFor('number of fetches to be 1', waitForFetches(1)); + expect(await PageObjects.discover.doesSidebarShowFields()).to.be(true); + }); + + it('should fetch data when a search is saved', async function () { + await PageObjects.discover.selectIndexPattern('logstash-*'); + + await retry.waitFor('number of fetches to be 0', waitForFetches(0)); + expect(await PageObjects.discover.doesSidebarShowFields()).to.be(false); + + await PageObjects.discover.saveSearch(savedSearchName); + + await retry.waitFor('number of fetches to be 1', waitForFetches(1)); + expect(await PageObjects.discover.doesSidebarShowFields()).to.be(true); + }); + + it('should reset state after opening a saved search and pressing New', async function () { + await PageObjects.discover.loadSavedSearch(savedSearchName); + await PageObjects.header.waitUntilLoadingHasFinished(); + + await retry.waitFor('number of fetches to be 1', waitForFetches(1)); + expect(await PageObjects.discover.doesSidebarShowFields()).to.be(true); + + await testSubjects.click('discoverNewButton'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + await retry.waitFor('number of fetches to be 0', waitForFetches(1)); + expect(await PageObjects.discover.doesSidebarShowFields()).to.be(false); }); }); it(`when it's true should fetch data from ES initially`, async function () { await initSearchOnPageLoad(true); await retry.waitFor('number of fetches to be 1', waitForFetches(1)); + expect(await PageObjects.discover.doesSidebarShowFields()).to.be(true); }); }); } diff --git a/test/functional/page_objects/context_page.ts b/test/functional/page_objects/context_page.ts index 05ea89cb65b3d..2bb3d7fb84a2a 100644 --- a/test/functional/page_objects/context_page.ts +++ b/test/functional/page_objects/context_page.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -import rison from 'rison-node'; +import rison from '@kbn/rison'; import { getUrl } from '@kbn/test'; import { FtrService } from '../ftr_provider_context'; diff --git a/test/functional/page_objects/discover_page.ts b/test/functional/page_objects/discover_page.ts index 79a30dba288d3..0b22917be5e49 100644 --- a/test/functional/page_objects/discover_page.ts +++ b/test/functional/page_objects/discover_page.ts @@ -9,6 +9,8 @@ import expect from '@kbn/expect'; import { FtrService } from '../ftr_provider_context'; +type SidebarSectionName = 'meta' | 'empty' | 'available' | 'unmapped' | 'popular' | 'selected'; + export class DiscoverPageObject extends FtrService { private readonly retry = this.ctx.getService('retry'); private readonly testSubjects = this.ctx.getService('testSubjects'); @@ -437,8 +439,61 @@ export class DiscoverPageObject extends FtrService { return await this.testSubjects.exists('discoverNoResultsTimefilter'); } + public async getSidebarAriaDescription(): Promise { + return await ( + await this.testSubjects.find('fieldListGrouped__ariaDescription') + ).getAttribute('innerText'); + } + + public async waitUntilSidebarHasLoaded() { + await this.retry.waitFor('sidebar is loaded', async () => { + return (await this.getSidebarAriaDescription()).length > 0; + }); + } + + public async doesSidebarShowFields() { + return await this.testSubjects.exists('fieldListGroupedFieldGroups'); + } + + public getSidebarSectionSelector( + sectionName: SidebarSectionName, + asCSSSelector: boolean = false + ) { + const testSubj = `fieldListGrouped${sectionName[0].toUpperCase()}${sectionName.substring( + 1 + )}Fields`; + if (!asCSSSelector) { + return testSubj; + } + return `[data-test-subj="${testSubj}"]`; + } + + public async getSidebarSectionFieldNames(sectionName: SidebarSectionName): Promise { + const elements = await this.find.allByCssSelector( + `${this.getSidebarSectionSelector(sectionName, true)} li` + ); + + if (!elements?.length) { + return []; + } + + return Promise.all( + elements.map(async (element) => await element.getAttribute('data-attr-field')) + ); + } + + public async toggleSidebarSection(sectionName: SidebarSectionName) { + return await this.find.clickByCssSelector( + `${this.getSidebarSectionSelector(sectionName, true)} .euiAccordion__iconButton` + ); + } + public async clickFieldListItem(field: string) { - return await this.testSubjects.click(`field-${field}`); + await this.testSubjects.click(`field-${field}`); + + await this.retry.waitFor('popover is open', async () => { + return Boolean(await this.find.byCssSelector('[data-popover-open="true"]')); + }); } public async clickFieldSort(field: string, text = 'Sort New-Old') { @@ -455,11 +510,16 @@ export class DiscoverPageObject extends FtrService { } public async clickFieldListItemAdd(field: string) { + await this.waitUntilSidebarHasLoaded(); + // a filter check may make sense here, but it should be properly handled to make // it work with the _score and _source fields as well if (await this.isFieldSelected(field)) { return; } + if (['_score', '_id', '_index'].includes(field)) { + await this.toggleSidebarSection('meta'); // expand Meta section + } await this.clickFieldListItemToggle(field); const isLegacyDefault = await this.useLegacyTable(); if (isLegacyDefault) { @@ -474,16 +534,18 @@ export class DiscoverPageObject extends FtrService { } public async isFieldSelected(field: string) { - if (!(await this.testSubjects.exists('fieldList-selected'))) { + if (!(await this.testSubjects.exists('fieldListGroupedSelectedFields'))) { return false; } - const selectedList = await this.testSubjects.find('fieldList-selected'); + const selectedList = await this.testSubjects.find('fieldListGroupedSelectedFields'); return await this.testSubjects.descendantExists(`field-${field}`, selectedList); } public async clickFieldListItemRemove(field: string) { + await this.waitUntilSidebarHasLoaded(); + if ( - !(await this.testSubjects.exists('fieldList-selected')) || + !(await this.testSubjects.exists('fieldListGroupedSelectedFields')) || !(await this.isFieldSelected(field)) ) { return; @@ -493,6 +555,8 @@ export class DiscoverPageObject extends FtrService { } public async clickFieldListItemVisualize(fieldName: string) { + await this.waitUntilSidebarHasLoaded(); + const field = await this.testSubjects.find(`field-${fieldName}-showDetails`); const isActive = await field.elementHasClass('kbnFieldButton-isActive'); diff --git a/tsconfig.base.json b/tsconfig.base.json index 6a236d215a6d9..787992f6e2133 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -540,6 +540,8 @@ "@kbn/repo-source-classifier/*": ["packages/kbn-repo-source-classifier/*"], "@kbn/repo-source-classifier-cli": ["packages/kbn-repo-source-classifier-cli"], "@kbn/repo-source-classifier-cli/*": ["packages/kbn-repo-source-classifier-cli/*"], + "@kbn/rison": ["packages/kbn-rison"], + "@kbn/rison/*": ["packages/kbn-rison/*"], "@kbn/rule-data-utils": ["packages/kbn-rule-data-utils"], "@kbn/rule-data-utils/*": ["packages/kbn-rule-data-utils/*"], "@kbn/safer-lodash-set": ["packages/kbn-safer-lodash-set"], @@ -720,6 +722,8 @@ "@kbn/shared-ux-prompt-no-data-views-mocks/*": ["packages/shared-ux/prompt/no_data_views/mocks/*"], "@kbn/shared-ux-prompt-no-data-views-types": ["packages/shared-ux/prompt/no_data_views/types"], "@kbn/shared-ux-prompt-no-data-views-types/*": ["packages/shared-ux/prompt/no_data_views/types/*"], + "@kbn/shared-ux-prompt-not-found": ["packages/shared-ux/prompt/not_found"], + "@kbn/shared-ux-prompt-not-found/*": ["packages/shared-ux/prompt/not_found/*"], "@kbn/shared-ux-router": ["packages/shared-ux/router/impl"], "@kbn/shared-ux-router/*": ["packages/shared-ux/router/impl/*"], "@kbn/shared-ux-router-mocks": ["packages/shared-ux/router/mocks"], diff --git a/typings/rison_node.d.ts b/typings/rison_node.d.ts deleted file mode 100644 index dacb2524907be..0000000000000 --- a/typings/rison_node.d.ts +++ /dev/null @@ -1,28 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 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. - */ - -declare module 'rison-node' { - export type RisonValue = undefined | null | boolean | number | string | RisonObject | RisonArray; - - // eslint-disable-next-line @typescript-eslint/no-empty-interface - export interface RisonArray extends Array {} - - export interface RisonObject { - [key: string]: RisonValue; - } - - export const decode: (input: string) => RisonValue; - - // eslint-disable-next-line @typescript-eslint/naming-convention - export const decode_object: (input: string) => RisonObject; - - export const encode: (input: Input) => string; - - // eslint-disable-next-line @typescript-eslint/naming-convention - export const encode_object: (input: Input) => string; -} diff --git a/x-pack/plugins/aiops/public/components/log_categorization/use_discover_links.ts b/x-pack/plugins/aiops/public/components/log_categorization/use_discover_links.ts index 8a1c438199878..a56d5c0cdfc6e 100644 --- a/x-pack/plugins/aiops/public/components/log_categorization/use_discover_links.ts +++ b/x-pack/plugins/aiops/public/components/log_categorization/use_discover_links.ts @@ -5,7 +5,7 @@ * 2.0. */ -import rison from 'rison-node'; +import rison from '@kbn/rison'; import moment from 'moment'; import type { TimeRangeBounds } from '@kbn/data-plugin/common'; diff --git a/x-pack/plugins/aiops/public/hooks/use_url_state.tsx b/x-pack/plugins/aiops/public/hooks/use_url_state.tsx index c4d84163f887e..94273a204f5cc 100644 --- a/x-pack/plugins/aiops/public/hooks/use_url_state.tsx +++ b/x-pack/plugins/aiops/public/hooks/use_url_state.tsx @@ -8,7 +8,7 @@ import React, { FC } from 'react'; import { parse, stringify } from 'query-string'; import { createContext, useCallback, useContext, useMemo } from 'react'; -import { decode, encode } from 'rison-node'; +import { decode, encode } from '@kbn/rison'; import { useHistory, useLocation } from 'react-router-dom'; import { isEqual } from 'lodash'; diff --git a/x-pack/plugins/apm/public/components/alerting/rule_types/register_apm_rule_types.ts b/x-pack/plugins/apm/public/components/alerting/rule_types/register_apm_rule_types.ts index 4b4cc42e08089..ed9971307bf64 100644 --- a/x-pack/plugins/apm/public/components/alerting/rule_types/register_apm_rule_types.ts +++ b/x-pack/plugins/apm/public/components/alerting/rule_types/register_apm_rule_types.ts @@ -33,7 +33,8 @@ export function registerApmRuleTypes( return { reason: fields[ALERT_REASON]!, link: getAlertUrlErrorCount( - String(fields[SERVICE_NAME][0]!), + // TODO:fix SERVICE_NAME when we move it to initializeIndex + String(fields[SERVICE_NAME]![0]), fields[SERVICE_ENVIRONMENT] && String(fields[SERVICE_ENVIRONMENT][0]) ), }; @@ -46,6 +47,12 @@ export function registerApmRuleTypes( validate: () => ({ errors: [], }), + alertDetailsAppSection: lazy( + () => + import( + '../ui_components/alert_details_app_section/alert_details_app_section' + ) + ), requiresAppContext: false, defaultActionMessage: i18n.translate( 'xpack.apm.alertTypes.errorCount.defaultActionMessage', @@ -73,9 +80,10 @@ export function registerApmRuleTypes( return { reason: fields[ALERT_REASON]!, link: getAlertUrlTransaction( - String(fields[SERVICE_NAME][0]!), + // TODO:fix SERVICE_NAME when we move it to initializeIndex + String(fields[SERVICE_NAME]![0]), fields[SERVICE_ENVIRONMENT] && String(fields[SERVICE_ENVIRONMENT][0]), - String(fields[TRANSACTION_TYPE][0]!) + String(fields[TRANSACTION_TYPE]![0]) ), }; }, @@ -89,6 +97,12 @@ export function registerApmRuleTypes( validate: () => ({ errors: [], }), + alertDetailsAppSection: lazy( + () => + import( + '../ui_components/alert_details_app_section/alert_details_app_section' + ) + ), requiresAppContext: false, defaultActionMessage: i18n.translate( 'xpack.apm.alertTypes.transactionDuration.defaultActionMessage', @@ -116,9 +130,10 @@ export function registerApmRuleTypes( format: ({ fields, formatters: { asPercent } }) => ({ reason: fields[ALERT_REASON]!, link: getAlertUrlTransaction( - String(fields[SERVICE_NAME][0]!), + // TODO:fix SERVICE_NAME when we move it to initializeIndex + String(fields[SERVICE_NAME]![0]), fields[SERVICE_ENVIRONMENT] && String(fields[SERVICE_ENVIRONMENT][0]), - String(fields[TRANSACTION_TYPE][0]!) + String(fields[TRANSACTION_TYPE]![0]) ), }), iconClass: 'bell', @@ -131,6 +146,12 @@ export function registerApmRuleTypes( validate: () => ({ errors: [], }), + alertDetailsAppSection: lazy( + () => + import( + '../ui_components/alert_details_app_section/alert_details_app_section' + ) + ), requiresAppContext: false, defaultActionMessage: i18n.translate( 'xpack.apm.alertTypes.transactionErrorRate.defaultActionMessage', @@ -155,9 +176,10 @@ export function registerApmRuleTypes( format: ({ fields }) => ({ reason: fields[ALERT_REASON]!, link: getAlertUrlTransaction( - String(fields[SERVICE_NAME][0]!), + // TODO:fix SERVICE_NAME when we move it to initializeIndex + String(fields[SERVICE_NAME]![0]), fields[SERVICE_ENVIRONMENT] && String(fields[SERVICE_ENVIRONMENT][0]), - String(fields[TRANSACTION_TYPE][0]!) + String(fields[TRANSACTION_TYPE]![0]) ), }), iconClass: 'bell', @@ -170,6 +192,12 @@ export function registerApmRuleTypes( validate: () => ({ errors: [], }), + alertDetailsAppSection: lazy( + () => + import( + '../ui_components/alert_details_app_section/alert_details_app_section' + ) + ), requiresAppContext: false, defaultActionMessage: i18n.translate( 'xpack.apm.alertTypes.transactionDurationAnomaly.defaultActionMessage', diff --git a/x-pack/plugins/apm/public/components/alerting/ui_components/alert_details_app_section/alert_details_app_section.tsx b/x-pack/plugins/apm/public/components/alerting/ui_components/alert_details_app_section/alert_details_app_section.tsx new file mode 100644 index 0000000000000..92cd229333062 --- /dev/null +++ b/x-pack/plugins/apm/public/components/alerting/ui_components/alert_details_app_section/alert_details_app_section.tsx @@ -0,0 +1,419 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useMemo } from 'react'; +import { EuiFlexGroup } from '@elastic/eui'; +import { EuiFlexItem } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { EuiPanel } from '@elastic/eui'; +import { EuiTitle } from '@elastic/eui'; +import { EuiIconTip } from '@elastic/eui'; +import { ALERT_DURATION, ALERT_END } from '@kbn/rule-data-utils'; +import moment from 'moment'; +import { ENVIRONMENT_ALL } from '../../../../../common/environment_filter_values'; +import { getTransactionType } from '../../../../context/apm_service/apm_service_context'; +import { useServiceAgentFetcher } from '../../../../context/apm_service/use_service_agent_fetcher'; +import { useServiceTransactionTypesFetcher } from '../../../../context/apm_service/use_service_transaction_types_fetcher'; +import { asPercent } from '../../../../../common/utils/formatters'; +import { APIReturnType } from '../../../../services/rest/create_call_apm_api'; +import { getDurationFormatter } from '../../../../../common/utils/formatters/duration'; +import { useFetcher } from '../../../../hooks/use_fetcher'; +import { useTimeRange } from '../../../../hooks/use_time_range'; +import { isTimeComparison } from '../../../shared/time_comparison/get_comparison_options'; +import { getComparisonChartTheme } from '../../../shared/time_comparison/get_comparison_chart_theme'; +import { getLatencyChartSelector } from '../../../../selectors/latency_chart_selectors'; +import { TimeseriesChart } from '../../../shared/charts/timeseries_chart'; +import { + getMaxY, + getResponseTimeTickFormatter, +} from '../../../shared/charts/transaction_charts/helper'; +import { ChartPointerEventContextProvider } from '../../../../context/chart_pointer_event/chart_pointer_event_context'; +import { + ChartType, + getTimeSeriesColor, +} from '../../../shared/charts/helper/get_timeseries_color'; +import { + AlertDetailsAppSectionProps, + SERVICE_NAME, + TRANSACTION_TYPE, +} from './types'; +import { getAggsTypeFromRule } from './helpers'; +import { filterNil } from '../../../shared/charts/latency_chart'; +import { errorRateI18n } from '../../../shared/charts/failed_transaction_rate_chart'; + +export function AlertDetailsAppSection({ + rule, + alert, + timeZone, +}: AlertDetailsAppSectionProps) { + const params = rule.params; + const environment = String(params.environment) || ENVIRONMENT_ALL.value; + const latencyAggregationType = getAggsTypeFromRule( + params.aggregationType as string + ); + + // duration is us, convert it to MS + const alertDurationMS = alert.fields[ALERT_DURATION]! / 1000; + + const serviceName = String(alert.fields[SERVICE_NAME]); + + // Currently, we don't use comparisonEnabled nor offset. + // But providing them as they are required for the chart. + const comparisonEnabled = false; + const offset = '1d'; + const ruleWindowSizeMS = moment + .duration(rule.params.windowSize, rule.params.windowUnit) + .asMilliseconds(); + + const TWENTY_TIMES_RULE_WINDOW_MS = 20 * ruleWindowSizeMS; + /** + * This is part or the requirements (RFC). + * If the alert is less than 20 units of `FOR THE LAST ` then we should draw a time range of 20 units. + * IE. The user set "FOR THE LAST 5 minutes" at a minimum we should show 100 minutes. + */ + const rangeFrom = + alertDurationMS < TWENTY_TIMES_RULE_WINDOW_MS + ? moment(alert.start) + .subtract(TWENTY_TIMES_RULE_WINDOW_MS, 'millisecond') + .toISOString() + : moment(alert.start) + .subtract(ruleWindowSizeMS, 'millisecond') + .toISOString(); + + const rangeTo = alert.active + ? 'now' + : moment(alert.fields[ALERT_END]) + .add(ruleWindowSizeMS, 'millisecond') + .toISOString(); + + const { start, end } = useTimeRange({ rangeFrom, rangeTo }); + const { agentName } = useServiceAgentFetcher({ + serviceName, + start, + end, + }); + const transactionTypes = useServiceTransactionTypesFetcher({ + serviceName, + start, + end, + }); + + const transactionType = getTransactionType({ + transactionType: String(alert.fields[TRANSACTION_TYPE]), + transactionTypes, + agentName, + }); + + const comparisonChartTheme = getComparisonChartTheme(); + const INITIAL_STATE = { + currentPeriod: [], + previousPeriod: [], + }; + + /* Latency Chart */ + const { data, status } = useFetcher( + (callApmApi) => { + if ( + serviceName && + start && + end && + transactionType && + latencyAggregationType + ) { + return callApmApi( + `GET /internal/apm/services/{serviceName}/transactions/charts/latency`, + { + params: { + path: { serviceName }, + query: { + environment, + kuery: '', + start, + end, + transactionType, + transactionName: undefined, + latencyAggregationType, + }, + }, + } + ); + } + }, + [ + end, + environment, + latencyAggregationType, + serviceName, + start, + transactionType, + ] + ); + + const memoizedData = useMemo( + () => + getLatencyChartSelector({ + latencyChart: data, + latencyAggregationType, + previousPeriodLabel: '', + }), + // It should only update when the data has changed + // eslint-disable-next-line react-hooks/exhaustive-deps + [data] + ); + const { currentPeriod, previousPeriod } = memoizedData; + + const timeseriesLatency = [ + currentPeriod, + comparisonEnabled && isTimeComparison(offset) ? previousPeriod : undefined, + ].filter(filterNil); + + const latencyMaxY = getMaxY(timeseriesLatency); + const latencyFormatter = getDurationFormatter(latencyMaxY); + + /* Latency Chart */ + + /* Throughput Chart */ + const { data: dataThroughput = INITIAL_STATE, status: statusThroughput } = + useFetcher( + (callApmApi) => { + if (serviceName && transactionType && start && end) { + return callApmApi( + 'GET /internal/apm/services/{serviceName}/throughput', + { + params: { + path: { + serviceName, + }, + query: { + environment, + kuery: '', + start, + end, + transactionType, + transactionName: undefined, + }, + }, + } + ); + } + }, + [environment, serviceName, start, end, transactionType] + ); + const { currentPeriodColor, previousPeriodColor } = getTimeSeriesColor( + ChartType.THROUGHPUT + ); + const timeseriesThroughput = [ + { + data: dataThroughput.currentPeriod, + type: 'linemark', + color: currentPeriodColor, + title: i18n.translate('xpack.apm.serviceOverview.throughtputChartTitle', { + defaultMessage: 'Throughput', + }), + }, + ...(comparisonEnabled + ? [ + { + data: dataThroughput.previousPeriod, + type: 'area', + color: previousPeriodColor, + title: '', + }, + ] + : []), + ]; + + /* Throughput Chart */ + + /* Error Rate */ + type ErrorRate = + APIReturnType<'GET /internal/apm/services/{serviceName}/transactions/charts/error_rate'>; + + const INITIAL_STATE_ERROR_RATE: ErrorRate = { + currentPeriod: { + timeseries: [], + average: null, + }, + previousPeriod: { + timeseries: [], + average: null, + }, + }; + function yLabelFormat(y?: number | null) { + return asPercent(y || 0, 1); + } + + const { + data: dataErrorRate = INITIAL_STATE_ERROR_RATE, + status: statusErrorRate, + } = useFetcher( + (callApmApi) => { + if (transactionType && serviceName && start && end) { + return callApmApi( + 'GET /internal/apm/services/{serviceName}/transactions/charts/error_rate', + { + params: { + path: { + serviceName, + }, + query: { + environment, + kuery: '', + start, + end, + transactionType, + transactionName: undefined, + }, + }, + } + ); + } + }, + [environment, serviceName, start, end, transactionType] + ); + + const { currentPeriodColor: currentPeriodColorErrorRate } = + getTimeSeriesColor(ChartType.FAILED_TRANSACTION_RATE); + + const timeseriesErrorRate = [ + { + data: dataErrorRate.currentPeriod.timeseries, + type: 'linemark', + color: currentPeriodColorErrorRate, + title: i18n.translate('xpack.apm.errorRate.chart.errorRate', { + defaultMessage: 'Failed transaction rate (avg.)', + }), + }, + ]; + + /* Error Rate */ + + return ( + + + + + + + +

    + {i18n.translate( + 'xpack.apm.dependencyLatencyChart.chartTitle', + { + defaultMessage: 'Latency', + } + )} +

    +
    +
    +
    + +
    +
    + + + + + + + + +

    + {i18n.translate( + 'xpack.apm.serviceOverview.throughtputChartTitle', + { defaultMessage: 'Throughput' } + )} +

    +
    +
    + + + + +
    + + +
    +
    + + + + + +

    + {i18n.translate('xpack.apm.errorRate', { + defaultMessage: 'Failed transaction rate', + })} +

    +
    +
    + + + + +
    + + +
    +
    +
    +
    +
    +
    + ); +} + +// eslint-disable-next-line import/no-default-export +export default AlertDetailsAppSection; diff --git a/x-pack/plugins/apm/public/components/alerting/ui_components/alert_details_app_section/helpers.ts b/x-pack/plugins/apm/public/components/alerting/ui_components/alert_details_app_section/helpers.ts new file mode 100644 index 0000000000000..a095f8caa4574 --- /dev/null +++ b/x-pack/plugins/apm/public/components/alerting/ui_components/alert_details_app_section/helpers.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 { LatencyAggregationType } from '../../../../../common/latency_aggregation_types'; + +export const getAggsTypeFromRule = ( + ruleAggType: string +): LatencyAggregationType => { + if (ruleAggType === '95th') return LatencyAggregationType.p95; + if (ruleAggType === '99th') return LatencyAggregationType.p99; + return LatencyAggregationType.avg; +}; diff --git a/x-pack/plugins/apm/public/components/alerting/ui_components/alert_details_app_section/types.ts b/x-pack/plugins/apm/public/components/alerting/ui_components/alert_details_app_section/types.ts new file mode 100644 index 0000000000000..0094d9332009a --- /dev/null +++ b/x-pack/plugins/apm/public/components/alerting/ui_components/alert_details_app_section/types.ts @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { Rule } from '@kbn/alerting-plugin/common'; +import { TopAlert } from '@kbn/observability-plugin/public/pages/alerts'; +import { TIME_UNITS } from '@kbn/triggers-actions-ui-plugin/public'; +import { LatencyAggregationType } from '../../../../../common/latency_aggregation_types'; + +export const SERVICE_NAME = 'service.name' as const; +export const TRANSACTION_TYPE = 'transaction.type' as const; +export interface AlertDetailsAppSectionProps { + rule: Rule<{ + environment: string; + aggregationType: LatencyAggregationType; + windowSize: number; + windowUnit: TIME_UNITS; + }>; + alert: TopAlert<{ [SERVICE_NAME]: string; [TRANSACTION_TYPE]: string }>; + timeZone: string; +} diff --git a/x-pack/plugins/apm/public/components/app/metrics/serverless_metrics/serverless_active_instances.tsx b/x-pack/plugins/apm/public/components/app/metrics/serverless_metrics/serverless_active_instances.tsx index 9c44d472c5b70..a0a72526e3632 100644 --- a/x-pack/plugins/apm/public/components/app/metrics/serverless_metrics/serverless_active_instances.tsx +++ b/x-pack/plugins/apm/public/components/app/metrics/serverless_metrics/serverless_active_instances.tsx @@ -27,7 +27,7 @@ import { useApmParams } from '../../../../hooks/use_apm_params'; import { FETCH_STATUS, useFetcher } from '../../../../hooks/use_fetcher'; import { useTimeRange } from '../../../../hooks/use_time_range'; import { APIReturnType } from '../../../../services/rest/create_call_apm_api'; -import { TimeseriesChart } from '../../../shared/charts/timeseries_chart'; +import { TimeseriesChartWithContext } from '../../../shared/charts/timeseries_chart_with_context'; import { ListMetric } from '../../../shared/list_metric'; import { ServerlessFunctionNameLink } from './serverless_function_name_link'; @@ -201,7 +201,7 @@ export function ServerlessActiveInstances({ serverlessId }: Props) { - - + + + + + + + + + + + + + + + + + + + + diff --git a/x-pack/plugins/apm/public/components/shared/charts/failed_transaction_rate_chart/index.tsx b/x-pack/plugins/apm/public/components/shared/charts/failed_transaction_rate_chart/index.tsx index dacb295a011dd..508d3d0f0ed68 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/failed_transaction_rate_chart/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/failed_transaction_rate_chart/index.tsx @@ -15,7 +15,7 @@ import { APIReturnType } from '../../../../services/rest/create_call_apm_api'; import { asPercent } from '../../../../../common/utils/formatters'; import { useFetcher } from '../../../../hooks/use_fetcher'; import { useLegacyUrlParams } from '../../../../context/url_params_context/use_url_params'; -import { TimeseriesChart } from '../timeseries_chart'; +import { TimeseriesChartWithContext } from '../timeseries_chart_with_context'; import { useApmServiceContext } from '../../../../context/apm_service/use_apm_service_context'; import { getComparisonChartTheme } from '../../time_comparison/get_comparison_chart_theme'; import { useApmParams } from '../../../../hooks/use_apm_params'; @@ -49,6 +49,10 @@ const INITIAL_STATE: ErrorRate = { }, }; +export const errorRateI18n = i18n.translate('xpack.apm.errorRate.tip', { + defaultMessage: + "The percentage of failed transactions for the selected service. HTTP server transactions with a 4xx status code (client error) aren't considered failures because the caller, not the server, caused the failure.", +}); export function FailedTransactionRateChart({ height, showAnnotations = true, @@ -154,17 +158,11 @@ export function FailedTransactionRateChart({ - + - = [ { value: LatencyAggregationType.p99, text: '99th percentile' }, ]; -function filterNil(value: T | null | undefined): value is T { +export function filterNil(value: T | null | undefined): value is T { return value != null; } @@ -126,7 +126,7 @@ export function LatencyChart({ height, kuery }: Props) { - )} - >; - /** - * Formatter for y-axis tick values - */ - yLabelFormat: (y: number) => string; - /** - * Formatter for legend and tooltip values - */ - yTickFormat?: (y: number) => string; - showAnnotations?: boolean; - yDomain?: YDomainRange; - anomalyTimeseries?: AnomalyTimeseries; - customTheme?: Record; - anomalyTimeseriesColor?: string; -} +import { TimeseriesChartWithContextProps } from './timeseries_chart_with_context'; const END_ZONE_LABEL = i18n.translate('xpack.apm.timeseries.endzone', { defaultMessage: 'The selected time range does not include this entire bucket. It might contain partial data.', }); - +interface TimeseriesChartProps extends TimeseriesChartWithContextProps { + comparisonEnabled: boolean; + offset?: string; + timeZone: string; +} export function TimeseriesChart({ id, height = unit * 16, @@ -91,30 +64,22 @@ export function TimeseriesChart({ yDomain, anomalyTimeseries, customTheme = {}, -}: Props) { + comparisonEnabled, + offset, + timeZone, +}: TimeseriesChartProps) { const history = useHistory(); - const { core } = useApmPluginContext(); const { annotations } = useAnnotationsContext(); const { chartRef, updatePointerEvent } = useChartPointerEventContext(); const theme = useTheme(); const chartTheme = useChartTheme(); - const { - query: { comparisonEnabled, offset }, - } = useAnyOfApmParams( - '/services', - '/dependencies/*', - '/services/{serviceName}' - ); - const anomalyChartTimeseries = getChartAnomalyTimeseries({ anomalyTimeseries, theme, anomalyTimeseriesColor: anomalyTimeseries?.color, }); - const isEmpty = isTimeseriesEmpty(timeseries); const annotationColor = theme.eui.euiColorSuccess; - const isComparingExpectedBounds = comparisonEnabled && isExpectedBoundsComparison(offset); const allSeries = [ @@ -134,20 +99,14 @@ export function TimeseriesChart({ ); const xValues = timeseries.flatMap(({ data }) => data.map(({ x }) => x)); - const xValuesExpectedBounds = anomalyChartTimeseries?.boundaries?.flatMap(({ data }) => data.map(({ x }) => x) ) ?? []; - - const timeZone = getTimeZone(core.uiSettings); - const min = Math.min(...xValues); const max = Math.max(...xValues, ...xValuesExpectedBounds); const xFormatter = niceTimeFormatter([min, max]); - const xDomain = isEmpty ? { min: 0, max: 1 } : { min, max }; - // Using custom legendSort here when comparing expected bounds // because by default elastic-charts will show legends for expected bounds first // but for consistency, we are making `Expected bounds` last diff --git a/x-pack/plugins/apm/public/components/shared/charts/timeseries_chart_with_context.tsx b/x-pack/plugins/apm/public/components/shared/charts/timeseries_chart_with_context.tsx new file mode 100644 index 0000000000000..5c9aac5d28bdf --- /dev/null +++ b/x-pack/plugins/apm/public/components/shared/charts/timeseries_chart_with_context.tsx @@ -0,0 +1,84 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { LegendItemListener, YDomainRange } from '@elastic/charts'; +import React from 'react'; +import { useAnyOfApmParams } from '../../../hooks/use_apm_params'; +import { ServiceAnomalyTimeseries } from '../../../../common/anomaly_detection/service_anomaly_timeseries'; +import { Coordinate, TimeSeries } from '../../../../typings/timeseries'; +import { useApmPluginContext } from '../../../context/apm_plugin/use_apm_plugin_context'; +import { FETCH_STATUS } from '../../../hooks/use_fetcher'; +import { unit } from '../../../utils/style'; +import { getTimeZone } from './helper/timezone'; +import { TimeseriesChart } from './timeseries_chart'; + +interface AnomalyTimeseries extends ServiceAnomalyTimeseries { + color?: string; +} +export interface TimeseriesChartWithContextProps { + id: string; + fetchStatus: FETCH_STATUS; + height?: number; + onToggleLegend?: LegendItemListener; + timeseries: Array>; + /** + * Formatter for y-axis tick values + */ + yLabelFormat: (y: number) => string; + /** + * Formatter for legend and tooltip values + */ + yTickFormat?: (y: number) => string; + showAnnotations?: boolean; + yDomain?: YDomainRange; + anomalyTimeseries?: AnomalyTimeseries; + customTheme?: Record; + anomalyTimeseriesColor?: string; +} + +export function TimeseriesChartWithContext({ + id, + height = unit * 16, + fetchStatus, + onToggleLegend, + timeseries, + yLabelFormat, + yTickFormat, + showAnnotations = true, + yDomain, + anomalyTimeseries, + customTheme = {}, +}: TimeseriesChartWithContextProps) { + const { + query: { comparisonEnabled, offset }, + } = useAnyOfApmParams( + '/services', + '/dependencies/*', + '/services/{serviceName}' + ); + const { core } = useApmPluginContext(); + const timeZone = getTimeZone(core.uiSettings); + + return ( + + ); +} diff --git a/x-pack/plugins/apm/public/components/shared/charts/transaction_coldstart_rate_chart/index.tsx b/x-pack/plugins/apm/public/components/shared/charts/transaction_coldstart_rate_chart/index.tsx index a3143bb7b6849..3dfc22a1c2809 100644 --- a/x-pack/plugins/apm/public/components/shared/charts/transaction_coldstart_rate_chart/index.tsx +++ b/x-pack/plugins/apm/public/components/shared/charts/transaction_coldstart_rate_chart/index.tsx @@ -20,7 +20,7 @@ import { APIReturnType } from '../../../../services/rest/create_call_apm_api'; import { asPercent } from '../../../../../common/utils/formatters'; import { useFetcher } from '../../../../hooks/use_fetcher'; import { useTheme } from '../../../../hooks/use_theme'; -import { TimeseriesChart } from '../timeseries_chart'; +import { TimeseriesChartWithContext } from '../timeseries_chart_with_context'; import { useApmServiceContext } from '../../../../context/apm_service/use_apm_service_context'; import { getComparisonChartTheme } from '../../time_comparison/get_comparison_chart_theme'; import { useApmParams } from '../../../../hooks/use_apm_params'; @@ -161,7 +161,7 @@ export function TransactionColdstartRateChart({ /> - + + + + + + + + + + + + + + + diff --git a/x-pack/plugins/apm/public/components/shared/span_icon/icons/cosmos_db.svg b/x-pack/plugins/apm/public/components/shared/span_icon/icons/cosmos_db.svg new file mode 100644 index 0000000000000..26205c2292a1f --- /dev/null +++ b/x-pack/plugins/apm/public/components/shared/span_icon/icons/cosmos_db.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/x-pack/plugins/apm/public/components/shared/span_icon/icons/dynamo_db.svg b/x-pack/plugins/apm/public/components/shared/span_icon/icons/dynamo_db.svg new file mode 100644 index 0000000000000..a8f80e39c6ca3 --- /dev/null +++ b/x-pack/plugins/apm/public/components/shared/span_icon/icons/dynamo_db.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/x-pack/plugins/apm/public/components/shared/span_icon/icons/file_share_storage.svg b/x-pack/plugins/apm/public/components/shared/span_icon/icons/file_share_storage.svg new file mode 100644 index 0000000000000..9c8b135e945f3 --- /dev/null +++ b/x-pack/plugins/apm/public/components/shared/span_icon/icons/file_share_storage.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/x-pack/plugins/apm/public/components/shared/span_icon/icons/s3.svg b/x-pack/plugins/apm/public/components/shared/span_icon/icons/s3.svg new file mode 100644 index 0000000000000..1dfa8fccf7765 --- /dev/null +++ b/x-pack/plugins/apm/public/components/shared/span_icon/icons/s3.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/x-pack/plugins/apm/public/components/shared/span_icon/icons/service_bus.svg b/x-pack/plugins/apm/public/components/shared/span_icon/icons/service_bus.svg new file mode 100644 index 0000000000000..76fc82312752f --- /dev/null +++ b/x-pack/plugins/apm/public/components/shared/span_icon/icons/service_bus.svg @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/x-pack/plugins/apm/public/components/shared/span_icon/icons/sns.svg b/x-pack/plugins/apm/public/components/shared/span_icon/icons/sns.svg new file mode 100644 index 0000000000000..f668c7019baa0 --- /dev/null +++ b/x-pack/plugins/apm/public/components/shared/span_icon/icons/sns.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/x-pack/plugins/apm/public/components/shared/span_icon/icons/sqs.svg b/x-pack/plugins/apm/public/components/shared/span_icon/icons/sqs.svg new file mode 100644 index 0000000000000..21fe40a46c9c2 --- /dev/null +++ b/x-pack/plugins/apm/public/components/shared/span_icon/icons/sqs.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/x-pack/plugins/apm/public/components/shared/span_icon/icons/storage_queue.svg b/x-pack/plugins/apm/public/components/shared/span_icon/icons/storage_queue.svg new file mode 100644 index 0000000000000..3b540975b17d1 --- /dev/null +++ b/x-pack/plugins/apm/public/components/shared/span_icon/icons/storage_queue.svg @@ -0,0 +1,15 @@ + + + + + + + + + + + + + + + diff --git a/x-pack/plugins/apm/public/components/shared/span_icon/icons/table_storage.svg b/x-pack/plugins/apm/public/components/shared/span_icon/icons/table_storage.svg new file mode 100644 index 0000000000000..9c3ba79e0371e --- /dev/null +++ b/x-pack/plugins/apm/public/components/shared/span_icon/icons/table_storage.svg @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/x-pack/plugins/apm/public/context/apm_service/apm_service_context.tsx b/x-pack/plugins/apm/public/context/apm_service/apm_service_context.tsx index afbad8543059a..ce74feab48102 100644 --- a/x-pack/plugins/apm/public/context/apm_service/apm_service_context.tsx +++ b/x-pack/plugins/apm/public/context/apm_service/apm_service_context.tsx @@ -69,7 +69,7 @@ export function ApmServiceContextProvider({ end, }); - const transactionType = getOrRedirectToTransactionType({ + const currentTransactionType = getOrRedirectToTransactionType({ transactionType: query.transactionType, transactionTypes, agentName, @@ -85,7 +85,7 @@ export function ApmServiceContextProvider({ value={{ serviceName, agentName, - transactionType, + transactionType: currentTransactionType, transactionTypes, runtimeName, fallbackToTransactions, @@ -96,24 +96,44 @@ export function ApmServiceContextProvider({ ); } -export function getOrRedirectToTransactionType({ +const isTypeExistsInTransactionTypesList = ({ + transactionType, + transactionTypes, +}: { + transactionType?: string; + transactionTypes: string[]; +}): boolean => !!transactionType && transactionTypes.includes(transactionType); + +const isNoAgentAndNoTransactionTypes = ({ + transactionTypes, + agentName, +}: { + transactionTypes: string[]; + agentName?: string; +}): boolean => !agentName || transactionTypes.length === 0; + +export function getTransactionType({ transactionType, transactionTypes, agentName, - history, }: { transactionType?: string; transactionTypes: string[]; agentName?: string; - history: History; -}) { - if (transactionType && transactionTypes.includes(transactionType)) { - return transactionType; - } +}): string | undefined { + const isTransactionTypeExists = isTypeExistsInTransactionTypesList({ + transactionType, + transactionTypes, + }); - if (!agentName || transactionTypes.length === 0) { - return; - } + if (isTransactionTypeExists) return transactionType; + + const isNoAgentAndNoTransactionTypesExists = isNoAgentAndNoTransactionTypes({ + transactionTypes, + agentName, + }); + + if (isNoAgentAndNoTransactionTypesExists) return undefined; // The default transaction type is "page-load" for RUM agents and "request" for all others const defaultTransactionType = isRumAgentName(agentName) @@ -127,7 +147,42 @@ export function getOrRedirectToTransactionType({ ? defaultTransactionType : transactionTypes[0]; + return currentTransactionType; +} + +export function getOrRedirectToTransactionType({ + transactionType, + transactionTypes, + agentName, + history, +}: { + transactionType?: string; + transactionTypes: string[]; + agentName?: string; + history: History; +}) { + const isTransactionTypeExists = isTypeExistsInTransactionTypesList({ + transactionType, + transactionTypes, + }); + + if (isTransactionTypeExists) return transactionType; + + const isNoAgentAndNoTransactionTypesExists = isNoAgentAndNoTransactionTypes({ + transactionTypes, + agentName, + }); + + if (isNoAgentAndNoTransactionTypesExists) return undefined; + + const currentTransactionType = getTransactionType({ + transactionTypes, + transactionType, + agentName, + }); + // Replace transactionType in the URL in case it is not one of the types returned by the API - replace(history, { query: { transactionType: currentTransactionType } }); + replace(history, { query: { transactionType: currentTransactionType! } }); + return currentTransactionType; } diff --git a/x-pack/plugins/canvas/canvas_plugin_src/uis/arguments/editor.tsx b/x-pack/plugins/canvas/canvas_plugin_src/uis/arguments/editor.tsx index c96024658048c..1a09116ba1196 100644 --- a/x-pack/plugins/canvas/canvas_plugin_src/uis/arguments/editor.tsx +++ b/x-pack/plugins/canvas/canvas_plugin_src/uis/arguments/editor.tsx @@ -52,7 +52,7 @@ const EditorArg: FC = ({ argValue, typeInstance, onValueChange, const { language } = typeInstance?.options ?? {}; return ( - + { return ( -
    +
    { logger = new AuthorizationAuditLogger(mockLogger); }); - it('does not throw an error when the underlying audit logger is undefined', () => { - const authLogger = new AuthorizationAuditLogger(); - jest.spyOn(authLogger, 'log'); - - expect(() => { - authLogger.log({ - operation: Operations.createCase, - entity: { - owner: 'a', - id: '1', - }, - }); - }).not.toThrow(); - - expect(authLogger.log).toHaveBeenCalledTimes(1); - }); - it('logs a message with a saved object ID in the message field', () => { logger.log({ operation: Operations.createCase, diff --git a/x-pack/plugins/cases/server/authorization/audit_logger.ts b/x-pack/plugins/cases/server/authorization/audit_logger.ts index 8a415e1b69559..88293689446f8 100644 --- a/x-pack/plugins/cases/server/authorization/audit_logger.ts +++ b/x-pack/plugins/cases/server/authorization/audit_logger.ts @@ -21,9 +21,9 @@ interface CreateAuditMsgParams { * Audit logger for authorization operations */ export class AuthorizationAuditLogger { - private readonly auditLogger?: AuditLogger; + private readonly auditLogger: AuditLogger; - constructor(logger?: AuditLogger) { + constructor(logger: AuditLogger) { this.auditLogger = logger; } @@ -97,6 +97,6 @@ export class AuthorizationAuditLogger { * Logs an audit event based on the status of an operation. */ public log(auditMsgParams: CreateAuditMsgParams) { - this.auditLogger?.log(AuthorizationAuditLogger.createAuditMsg(auditMsgParams)); + this.auditLogger.log(AuthorizationAuditLogger.createAuditMsg(auditMsgParams)); } } diff --git a/x-pack/plugins/cases/server/authorization/authorization.test.ts b/x-pack/plugins/cases/server/authorization/authorization.test.ts index 0483489d6c8a2..e7bbcb0abbb9b 100644 --- a/x-pack/plugins/cases/server/authorization/authorization.test.ts +++ b/x-pack/plugins/cases/server/authorization/authorization.test.ts @@ -61,7 +61,7 @@ describe('authorization', () => { securityAuth: securityStart.authz, spaces: spacesStart, features: featuresStart, - auditLogger: new AuthorizationAuditLogger(), + auditLogger: new AuthorizationAuditLogger(mockLogger), logger: loggingSystemMock.createLogger(), }); @@ -81,7 +81,7 @@ describe('authorization', () => { securityAuth: securityStart.authz, spaces: spacesStart, features: featuresStart, - auditLogger: new AuthorizationAuditLogger(), + auditLogger: new AuthorizationAuditLogger(mockLogger), logger: loggingSystemMock.createLogger(), }); @@ -140,7 +140,7 @@ describe('authorization', () => { request, spaces: spacesStart, features: featuresStart, - auditLogger: new AuthorizationAuditLogger(), + auditLogger: new AuthorizationAuditLogger(mockLogger), logger: loggingSystemMock.createLogger(), }); @@ -266,7 +266,7 @@ describe('authorization', () => { securityAuth: securityStart.authz, spaces: spacesStart, features: featuresStart, - auditLogger: new AuthorizationAuditLogger(), + auditLogger: new AuthorizationAuditLogger(mockLogger), logger: loggingSystemMock.createLogger(), }); @@ -295,7 +295,7 @@ describe('authorization', () => { securityAuth: securityStart.authz, spaces: spacesStart, features: featuresStart, - auditLogger: new AuthorizationAuditLogger(), + auditLogger: new AuthorizationAuditLogger(mockLogger), logger: loggingSystemMock.createLogger(), }); @@ -322,7 +322,7 @@ describe('authorization', () => { securityAuth: securityStart.authz, spaces: spacesStart, features: featuresStart, - auditLogger: new AuthorizationAuditLogger(), + auditLogger: new AuthorizationAuditLogger(mockLogger), logger: loggingSystemMock.createLogger(), }); diff --git a/x-pack/plugins/cloud_integrations/cloud_full_story/.i18nrc.json b/x-pack/plugins/cloud_integrations/cloud_full_story/.i18nrc.json index aa690dec41fc1..e86db74eed77a 100755 --- a/x-pack/plugins/cloud_integrations/cloud_full_story/.i18nrc.json +++ b/x-pack/plugins/cloud_integrations/cloud_full_story/.i18nrc.json @@ -3,5 +3,5 @@ "paths": { "cloudFullStory": "." }, - "translations": ["translations/ja-JP.json"] + "translations": [] } diff --git a/x-pack/plugins/cloud_security_posture/public/common/hooks/use_url_query.ts b/x-pack/plugins/cloud_security_posture/public/common/hooks/use_url_query.ts index 0573d77e6f9c8..8bc6ff96b4c4f 100644 --- a/x-pack/plugins/cloud_security_posture/public/common/hooks/use_url_query.ts +++ b/x-pack/plugins/cloud_security_posture/public/common/hooks/use_url_query.ts @@ -6,7 +6,6 @@ */ import { useEffect, useCallback, useMemo } from 'react'; import { useHistory, useLocation } from 'react-router-dom'; -import type { RisonObject } from 'rison-node'; import { decodeQuery, encodeQuery } from '../navigation/query_utils'; /** @@ -35,7 +34,7 @@ export const useUrlQuery = (getDefaultQuery: () => T) => { useEffect(() => { if (search) return; - replace({ search: encodeQuery(getDefaultQuery() as RisonObject) }); + replace({ search: encodeQuery(getDefaultQuery()) }); }, [getDefaultQuery, search, replace]); return { diff --git a/x-pack/plugins/cloud_security_posture/public/common/navigation/query_utils.ts b/x-pack/plugins/cloud_security_posture/public/common/navigation/query_utils.ts index 601ad3097b7a8..3a051456733a6 100644 --- a/x-pack/plugins/cloud_security_posture/public/common/navigation/query_utils.ts +++ b/x-pack/plugins/cloud_security_posture/public/common/navigation/query_utils.ts @@ -4,10 +4,10 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { encode, decode, type RisonObject } from 'rison-node'; +import { encode, decode } from '@kbn/rison'; import type { LocationDescriptorObject } from 'history'; -const encodeRison = (v: RisonObject): string | undefined => { +const encodeRison = (v: any): string | undefined => { try { return encode(v); } catch (e) { @@ -27,7 +27,7 @@ const decodeRison = (query: string): T | undefined => { const QUERY_PARAM_KEY = 'cspq'; -export const encodeQuery = (query: RisonObject): LocationDescriptorObject['search'] => { +export const encodeQuery = (query: any): LocationDescriptorObject['search'] => { const risonQuery = encodeRison(query); if (!risonQuery) return; return `${QUERY_PARAM_KEY}=${risonQuery}`; diff --git a/x-pack/plugins/cloud_security_posture/public/components/csp_evaluation_badge.tsx b/x-pack/plugins/cloud_security_posture/public/components/csp_evaluation_badge.tsx index 0d838daa1e660..24ca4cd4fe4eb 100644 --- a/x-pack/plugins/cloud_security_posture/public/components/csp_evaluation_badge.tsx +++ b/x-pack/plugins/cloud_security_posture/public/components/csp_evaluation_badge.tsx @@ -24,7 +24,11 @@ const getColor = (type: Props['type']): EuiBadgeProps['color'] => { }; export const CspEvaluationBadge = ({ type }: Props) => ( - + {type === 'failed' ? ( ) : ( diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/__mocks__/findings.ts b/x-pack/plugins/cloud_security_posture/public/pages/findings/__mocks__/findings.ts new file mode 100644 index 0000000000000..48956856bf31c --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/findings/__mocks__/findings.ts @@ -0,0 +1,117 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { CspFinding } from '../../../../common/schemas/csp_finding'; + +export const mockFindingsHit: CspFinding = { + result: { + evaluation: 'passed', + evidence: { + serviceAccounts: [], + serviceAccount: [], + }, + // TODO: wrong type + // expected: null, + }, + orchestrator: { + cluster: { + name: 'kind-multi', + }, + }, + agent: { + name: 'kind-multi-worker', + id: '41b2ba39-fd4e-474d-8c61-d79c9204e793', + // TODO: missing + // ephemeral_id: '20964f94-a4fe-48c1-8bf3-4b7140baf03c', + type: 'cloudbeat', + version: '8.6.0', + }, + cluster_id: '087606d6-c71a-4892-9b27-67ab937770ce', + '@timestamp': '2022-11-24T22:27:19.515Z', + ecs: { + version: '8.0.0', + }, + resource: { + sub_type: 'ServiceAccount', + name: 'certificate-controller', + raw: { + metadata: { + uid: '597cd43e-90a5-4aea-95aa-35f177429794', + resourceVersion: '277', + creationTimestamp: '2022-11-15T16:08:49Z', + name: 'certificate-controller', + namespace: 'kube-system', + }, + apiVersion: 'v1', + kind: 'ServiceAccount', + secrets: [ + { + name: 'certificate-controller-token-ql8wn', + }, + ], + }, + id: '597cd43e-90a5-4aea-95aa-35f177429794', + type: 'k8s_object', + }, + host: { + id: '', // TODO: missing + hostname: 'kind-multi-worker', + os: { + kernel: '5.10.76-linuxkit', + codename: 'bullseye', + name: 'Debian GNU/Linux', + type: 'linux', + family: 'debian', + version: '11 (bullseye)', + platform: 'debian', + }, + containerized: false, + ip: ['172.19.0.3', 'fc00:f853:ccd:e793::3', 'fe80::42:acff:fe13:3'], + name: 'kind-multi-worker', + mac: ['02-42-AC-13-00-03'], + architecture: 'x86_64', + }, + rule: { + references: + '1. [https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/](https://kubernetes.io/docs/tasks/configure-pod-container/configure-service-account/)\n', + impact: + 'All workloads which require access to the Kubernetes API will require an explicit service account to be created.\n', + description: + 'The `default` service account should not be used to ensure that rights granted to applications can be more easily audited and reviewed.\n', + default_value: + 'By default the `default` service account allows for its service account token\nto be mounted\nin pods in its namespace.\n', + section: 'RBAC and Service Accounts', + rationale: + 'Kubernetes provides a `default` service account which is used by cluster workloads where no specific service account is assigned to the pod. Where access to the Kubernetes API from a pod is required, a specific service account should be created for that pod, and rights granted to that service account. The default service account should be configured such that it does not provide a service account token and does not have any explicit rights assignments.\n', + version: '1.0', + benchmark: { + name: 'CIS Kubernetes V1.23', + id: 'cis_k8s', + version: 'v1.0.0', + }, + tags: ['CIS', 'Kubernetes', 'CIS 5.1.5', 'RBAC and Service Accounts'], + remediation: + 'Create explicit service accounts wherever a Kubernetes workload requires\nspecific access\nto the Kubernetes API server.\nModify the configuration of each default service account to include this value\n```\nautomountServiceAccountToken: false\n```\n', + audit: + 'For each namespace in the cluster, review the rights assigned to the default service account and ensure that it has no roles or cluster roles bound to it apart from the defaults. Additionally ensure that the `automountServiceAccountToken: false` setting is in place for each default service account.\n', + name: 'Ensure that default service accounts are not actively used. (Manual)', + id: '2b399496-f79d-5533-8a86-4ea00b95e3bd', + profile_applicability: '* Level 1 - Master Node\n', + rego_rule_id: '', + }, + event: { + agent_id_status: 'auth_metadata_missing', + sequence: 1669328831, + ingested: '2022-11-24T22:28:25Z', + created: '2022-11-24T22:27:19.514650003Z', + kind: 'state', + id: 'ce5c1501-90a3-4543-bf28-cd6c9e4d73e8', + type: ['info'], + category: ['configuration'], + outcome: 'success', + }, +}; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_flyout/findings_flyout.test.tsx b/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_flyout/findings_flyout.test.tsx new file mode 100644 index 0000000000000..40b87da1245ef --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_flyout/findings_flyout.test.tsx @@ -0,0 +1,69 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import React from 'react'; +import userEvent from '@testing-library/user-event'; +import { FindingsRuleFlyout } from './findings_flyout'; +import { render, screen } from '@testing-library/react'; +import { TestProvider } from '../../../test/test_provider'; +import { mockFindingsHit } from '../__mocks__/findings'; +import { LATEST_FINDINGS_INDEX_DEFAULT_NS } from '../../../../common/constants'; + +const TestComponent = () => ( + + + +); + +describe('', () => { + describe('Overview Tab', () => { + it('details and remediation accordions are open', () => { + const { getAllByRole } = render(); + + getAllByRole('button', { expanded: true, name: 'Details' }); + getAllByRole('button', { expanded: true, name: 'Remediation' }); + }); + + it('displays text details summary info', () => { + const { getAllByText, getByText } = render(); + + getAllByText(mockFindingsHit.rule.name); + getByText(mockFindingsHit.resource.id); + getByText(mockFindingsHit.resource.name); + getAllByText(mockFindingsHit.rule.section); + getByText(LATEST_FINDINGS_INDEX_DEFAULT_NS); + mockFindingsHit.rule.tags.forEach((tag) => { + getAllByText(tag); + }); + }); + }); + + describe('Rule Tab', () => { + it('displays rule text details', () => { + const { getByText, getAllByText } = render(); + + userEvent.click(screen.getByTestId('findings_flyout_tab_rule')); + + getAllByText(mockFindingsHit.rule.name); + getByText(mockFindingsHit.rule.benchmark.name); + getAllByText(mockFindingsHit.rule.section); + mockFindingsHit.rule.tags.forEach((tag) => { + getAllByText(tag); + }); + }); + }); + + describe('Resource Tab', () => { + it('displays resource name and id', () => { + const { getAllByText } = render(); + + userEvent.click(screen.getByTestId('findings_flyout_tab_resource')); + + getAllByText(mockFindingsHit.resource.name); + getAllByText(mockFindingsHit.resource.id); + }); + }); +}); diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_flyout/findings_flyout.tsx b/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_flyout/findings_flyout.tsx index 0b00136b165c5..8229084c10dd9 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_flyout/findings_flyout.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_flyout/findings_flyout.tsx @@ -129,7 +129,12 @@ export const FindingsRuleFlyout = ({ onClose, findings }: FindingFlyoutProps) => {tabs.map((v) => ( - setTab(v)}> + setTab(v)} + data-test-subj={`findings_flyout_tab_${v.id}`} + > {v.title} ))} diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_flyout/overview_tab.tsx b/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_flyout/overview_tab.tsx index 5dba83b9019b8..a0c5d330d22a3 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_flyout/overview_tab.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_flyout/overview_tab.tsx @@ -46,7 +46,7 @@ const getDetailsList = (data: CspFinding, discoverIndexLink: string | undefined) description: ( <> {data.rule.tags.map((tag) => ( - {tag} + {tag} ))} ), diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_flyout/rule_tab.tsx b/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_flyout/rule_tab.tsx index 74904041888a4..e51abb0bd3e9d 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_flyout/rule_tab.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/findings/findings_flyout/rule_tab.tsx @@ -31,7 +31,7 @@ export const getRuleList = (rule: CspFinding['rule']) => [ description: ( <> {rule.tags.map((tag) => ( - {tag} + {tag} ))} ), diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/latest_findings/latest_findings_container.test.tsx b/x-pack/plugins/cloud_security_posture/public/pages/findings/latest_findings/latest_findings_container.test.tsx index 2d709433e7fc5..3c6b51f881989 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/findings/latest_findings/latest_findings_container.test.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/findings/latest_findings/latest_findings_container.test.tsx @@ -16,7 +16,6 @@ import { TestProvider } from '../../../test/test_provider'; import { getFindingsQuery } from './use_latest_findings'; import { encodeQuery } from '../../../common/navigation/query_utils'; import { useLocation } from 'react-router-dom'; -import { RisonObject } from 'rison-node'; import { buildEsQuery } from '@kbn/es-query'; import { getPaginationQuery } from '../utils/utils'; import { chartPluginMock } from '@kbn/charts-plugin/public/mocks'; @@ -52,7 +51,7 @@ describe('', () => { }); (useLocation as jest.Mock).mockReturnValue({ - search: encodeQuery(query as unknown as RisonObject), + search: encodeQuery(query), }); render( diff --git a/x-pack/plugins/cloud_security_posture/public/pages/findings/layout/findings_distribution_bar.tsx b/x-pack/plugins/cloud_security_posture/public/pages/findings/layout/findings_distribution_bar.tsx index f293b82341a61..9db41a7786174 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/findings/layout/findings_distribution_bar.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/findings/layout/findings_distribution_bar.tsx @@ -126,6 +126,7 @@ const DistributionBar: React.FC> = ({ distributionOnClick={() => { distributionOnClick(RULE_PASSED); }} + data-test-subj="distribution_bar_passed" /> > = ({ distributionOnClick={() => { distributionOnClick(RULE_FAILED); }} + data-test-subj="distribution_bar_failed" /> ); @@ -142,12 +144,15 @@ const DistributionBarPart = ({ value, color, distributionOnClick, + ...rest }: { value: number; color: string; distributionOnClick: () => void; + ['data-test-subj']: string; }) => (