diff --git a/.buildkite/scripts/steps/artifacts/docker_image.sh b/.buildkite/scripts/steps/artifacts/docker_image.sh index 77598858c70d4..1968f095853ed 100755 --- a/.buildkite/scripts/steps/artifacts/docker_image.sh +++ b/.buildkite/scripts/steps/artifacts/docker_image.sh @@ -92,17 +92,6 @@ steps: SERVICE_COMMIT_HASH: $GIT_ABBREV_COMMIT REMOTE_SERVICE_CONFIG: https://raw.githubusercontent.com/elastic/serverless-gitops/main/gen/gpctl/kibana/config.yaml - - trigger: serverless-gitops-update-stack-image-tag - async: true - label: ":argo: Update image tag for Kibana using the legacy script (used in QA/Staging)" - branches: main - build: - env: - IMAGE_TAG: "git-$GIT_ABBREV_COMMIT" - SERVICE: kibana-controller - NAMESPACE: kibana-ci - IMAGE_NAME: kibana-serverless - COMMIT_MESSAGE: "gitops: update kibana tag to elastic/kibana@$GIT_ABBREV_COMMIT" EOF else diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index e789ea450b6f1..b1b84b324b492 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: 2023-07-08 +date: 2023-07-10 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 d8c8319220bb9..25653157469c1 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: 2023-07-08 +date: 2023-07-10 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 f817376baf668..ec2f26a4a7619 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops'] --- import aiopsObj from './aiops.devdocs.json'; diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index 9d168375e4750..39904266abdc5 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: 2023-07-08 +date: 2023-07-10 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 35eccc02c0354..f6dc954dae677 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] --- import apmObj from './apm.devdocs.json'; diff --git a/api_docs/asset_manager.mdx b/api_docs/asset_manager.mdx index 91972d3279997..be6fb8556554f 100644 --- a/api_docs/asset_manager.mdx +++ b/api_docs/asset_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/assetManager title: "assetManager" image: https://source.unsplash.com/400x175/?github description: API docs for the assetManager plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'assetManager'] --- import assetManagerObj from './asset_manager.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index d5ffea1c2a95b..ffb75febd1b85 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: 2023-07-08 +date: 2023-07-10 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 ac1f3b34a038c..b0c5db21c3ce2 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: 2023-07-08 +date: 2023-07-10 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 5ca7e410f4737..9130a9bcbb71d 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: 2023-07-08 +date: 2023-07-10 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 4818d30c20e7a..e66e5fc11b568 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: 2023-07-08 +date: 2023-07-10 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 9ec22cda2c49b..f685f0fc259ad 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: 2023-07-08 +date: 2023-07-10 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 186c236647336..59542f3da0cff 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: 2023-07-08 +date: 2023-07-10 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 4409f87831d01..ea8bdf80e7371 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudChat'] --- import cloudChatObj from './cloud_chat.devdocs.json'; diff --git a/api_docs/cloud_chat_provider.mdx b/api_docs/cloud_chat_provider.mdx index dee64e4490ab8..13412f37cc321 100644 --- a/api_docs/cloud_chat_provider.mdx +++ b/api_docs/cloud_chat_provider.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudChatProvider title: "cloudChatProvider" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudChatProvider plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudChatProvider'] --- import cloudChatProviderObj from './cloud_chat_provider.devdocs.json'; diff --git a/api_docs/cloud_data_migration.mdx b/api_docs/cloud_data_migration.mdx index 94563c38c7da7..80d8ce7d16829 100644 --- a/api_docs/cloud_data_migration.mdx +++ b/api_docs/cloud_data_migration.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDataMigration title: "cloudDataMigration" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDataMigration plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDataMigration'] --- import cloudDataMigrationObj from './cloud_data_migration.devdocs.json'; diff --git a/api_docs/cloud_defend.mdx b/api_docs/cloud_defend.mdx index 53e26060c24e3..334b5027b5b2c 100644 --- a/api_docs/cloud_defend.mdx +++ b/api_docs/cloud_defend.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDefend title: "cloudDefend" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDefend plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDefend'] --- import cloudDefendObj from './cloud_defend.devdocs.json'; diff --git a/api_docs/cloud_experiments.mdx b/api_docs/cloud_experiments.mdx index f4021b7a45548..c4b969e2b28a8 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: 2023-07-08 +date: 2023-07-10 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 49a9427b28bd6..56f8b395c7427 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: 2023-07-08 +date: 2023-07-10 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 53133fa6cd5a8..ae4241a23910f 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'console'] --- import consoleObj from './console.devdocs.json'; diff --git a/api_docs/content_management.mdx b/api_docs/content_management.mdx index 47d2a9131927d..1d8c7c1ffabea 100644 --- a/api_docs/content_management.mdx +++ b/api_docs/content_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/contentManagement title: "contentManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the contentManagement plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'contentManagement'] --- import contentManagementObj from './content_management.devdocs.json'; diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index 50718639f1f02..6a83ec123768f 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] --- import controlsObj from './controls.devdocs.json'; diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index 23d585ce52909..2c71cfc0ef918 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: 2023-07-08 +date: 2023-07-10 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 67c473c53c14f..4eecc19ed443a 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: 2023-07-08 +date: 2023-07-10 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 5d08e78cf9c20..77f12f15f5f72 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: 2023-07-08 +date: 2023-07-10 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 c09003be3d581..b64f1c4aa725f 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: 2023-07-08 +date: 2023-07-10 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 84fb1c19be566..83340ed1ff1fb 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: 2023-07-08 +date: 2023-07-10 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 48130b3b1d0a4..4fd2081a89259 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: 2023-07-08 +date: 2023-07-10 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 f955c4ede4b6b..df037c88aadb2 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: 2023-07-08 +date: 2023-07-10 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 7aa949d37dab5..bd092d4005155 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: 2023-07-08 +date: 2023-07-10 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 468a8019dd79d..0b83f9b814461 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: 2023-07-08 +date: 2023-07-10 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 edd8f29f89a3d..64237516203f5 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: 2023-07-08 +date: 2023-07-10 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 3be875ce06632..8f0b3f9ca3e7b 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: 2023-07-08 +date: 2023-07-10 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 ecf15c87b06d2..d4341d9912d9d 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 3f9f35cc1a066..36a078f8b93c2 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 522264ddede1d..fcba9cd3226f1 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index d9466ce2574dc..d04c12b6310b6 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: 2023-07-08 +date: 2023-07-10 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 0f707cfb88860..f75059de46185 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: 2023-07-08 +date: 2023-07-10 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 86b062afbfe64..216d04ec91312 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/ecs_data_quality_dashboard.mdx b/api_docs/ecs_data_quality_dashboard.mdx index ca8ba09c3717a..8eda7f8481c2d 100644 --- a/api_docs/ecs_data_quality_dashboard.mdx +++ b/api_docs/ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ecsDataQualityDashboard title: "ecsDataQualityDashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the ecsDataQualityDashboard plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ecsDataQualityDashboard'] --- import ecsDataQualityDashboardObj from './ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index d53a8f4ce44e4..3debd33c0b0d0 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: 2023-07-08 +date: 2023-07-10 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 691ad20b54c6b..06ebdd099bda6 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: 2023-07-08 +date: 2023-07-10 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 abc15ba8b2a55..c61b6e1974d7f 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: 2023-07-08 +date: 2023-07-10 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 e0ae0d900b541..754126e687472 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: 2023-07-08 +date: 2023-07-10 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 957e10ce86792..f233144f72a71 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: 2023-07-08 +date: 2023-07-10 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 a6139ffe89fa9..67b818562af36 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: 2023-07-08 +date: 2023-07-10 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 7d9fa234f1bf1..90222b559b1ff 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventLog'] --- import eventLogObj from './event_log.devdocs.json'; diff --git a/api_docs/exploratory_view.mdx b/api_docs/exploratory_view.mdx index e677490f2ea5f..a4f98312c6964 100644 --- a/api_docs/exploratory_view.mdx +++ b/api_docs/exploratory_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/exploratoryView title: "exploratoryView" image: https://source.unsplash.com/400x175/?github description: API docs for the exploratoryView plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'exploratoryView'] --- import exploratoryViewObj from './exploratory_view.devdocs.json'; diff --git a/api_docs/expression_error.mdx b/api_docs/expression_error.mdx index d6f8a036b26d3..5004be7a8ebac 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: 2023-07-08 +date: 2023-07-10 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 bb62fc8b37ffa..b4fd93309ac36 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: 2023-07-08 +date: 2023-07-10 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 909dea5c72596..ddbb8c52eb516 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: 2023-07-08 +date: 2023-07-10 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 b8260fdf3f769..e438311615466 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: 2023-07-08 +date: 2023-07-10 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 6d463366d434d..4bb3597a1c20b 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: 2023-07-08 +date: 2023-07-10 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 a8524b276564c..046178834a0d4 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: 2023-07-08 +date: 2023-07-10 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 849c029477be5..3509097bb0672 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetricVis'] --- import expressionMetricVisObj from './expression_metric_vis.devdocs.json'; diff --git a/api_docs/expression_partition_vis.mdx b/api_docs/expression_partition_vis.mdx index 98d15cb50514e..020877d6466e9 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionPartitionVis'] --- import expressionPartitionVisObj from './expression_partition_vis.devdocs.json'; diff --git a/api_docs/expression_repeat_image.mdx b/api_docs/expression_repeat_image.mdx index dc7edc9d535b3..716e5d48989d4 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: 2023-07-08 +date: 2023-07-10 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 c09482c6b1043..7fcaad6de1b1b 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: 2023-07-08 +date: 2023-07-10 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 36264e5d33ddb..11cedacbbed4f 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: 2023-07-08 +date: 2023-07-10 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 4ad1e5a60ea6b..e7335013c2dcd 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: 2023-07-08 +date: 2023-07-10 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 25a8ffe78d4f4..32201d4e4831f 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: 2023-07-08 +date: 2023-07-10 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 b018f04e22651..84f96df64b4fd 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: 2023-07-08 +date: 2023-07-10 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 7f588dc7c3ca2..bb5db1707ec4c 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: 2023-07-08 +date: 2023-07-10 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 4ccce826307e0..2a698afa16ba9 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: 2023-07-08 +date: 2023-07-10 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 2c46bd8441092..a18d47d22a6f6 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fileUpload'] --- import fileUploadObj from './file_upload.devdocs.json'; diff --git a/api_docs/files.mdx b/api_docs/files.mdx index fad9ddf7e00c6..0a06122aa05b0 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'files'] --- import filesObj from './files.devdocs.json'; diff --git a/api_docs/files_management.mdx b/api_docs/files_management.mdx index aa1590edd1515..5ded19af50f24 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index 6f29a1bb45986..b30903c1775b2 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: 2023-07-08 +date: 2023-07-10 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 0b8a94efde689..f245470b3af3b 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: 2023-07-08 +date: 2023-07-10 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 e8360c1e4457a..9346d620f23a0 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: 2023-07-08 +date: 2023-07-10 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 d8344a7a3fb8a..12bde294c4724 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'home'] --- import homeObj from './home.devdocs.json'; diff --git a/api_docs/image_embeddable.mdx b/api_docs/image_embeddable.mdx index e35b354af90e5..dddcfc7f43bea 100644 --- a/api_docs/image_embeddable.mdx +++ b/api_docs/image_embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/imageEmbeddable title: "imageEmbeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the imageEmbeddable plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'imageEmbeddable'] --- import imageEmbeddableObj from './image_embeddable.devdocs.json'; diff --git a/api_docs/index_lifecycle_management.mdx b/api_docs/index_lifecycle_management.mdx index 34a6a771ef6cd..3d853982f4f65 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: 2023-07-08 +date: 2023-07-10 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 031538bece339..9b32b7891e2f8 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: 2023-07-08 +date: 2023-07-10 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 3d605978c49e2..a0020d0eb778a 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: 2023-07-08 +date: 2023-07-10 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 b791fb75c3263..eaffa274a4398 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: 2023-07-08 +date: 2023-07-10 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 e86c3f9eaf3c2..2b6053a72c31d 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: 2023-07-08 +date: 2023-07-10 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 a8eea93e0bf11..e3e51590e5e5b 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: 2023-07-08 +date: 2023-07-10 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 60193733a82db..6a215234d060c 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: 2023-07-08 +date: 2023-07-10 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 158930690df92..27f80f746db6c 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-utils'] --- import kbnAiopsUtilsObj from './kbn_aiops_utils.devdocs.json'; diff --git a/api_docs/kbn_alerting_state_types.mdx b/api_docs/kbn_alerting_state_types.mdx index 075c21ef21a27..3ac4a36846b78 100644 --- a/api_docs/kbn_alerting_state_types.mdx +++ b/api_docs/kbn_alerting_state_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-state-types title: "@kbn/alerting-state-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-state-types plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-state-types'] --- import kbnAlertingStateTypesObj from './kbn_alerting_state_types.devdocs.json'; diff --git a/api_docs/kbn_alerts_as_data_utils.mdx b/api_docs/kbn_alerts_as_data_utils.mdx index 011d13e38d488..11106da24e72c 100644 --- a/api_docs/kbn_alerts_as_data_utils.mdx +++ b/api_docs/kbn_alerts_as_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-as-data-utils title: "@kbn/alerts-as-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-as-data-utils plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-as-data-utils'] --- import kbnAlertsAsDataUtilsObj from './kbn_alerts_as_data_utils.devdocs.json'; diff --git a/api_docs/kbn_alerts_ui_shared.mdx b/api_docs/kbn_alerts_ui_shared.mdx index 5a5d09b13b0f3..82739a8942689 100644 --- a/api_docs/kbn_alerts_ui_shared.mdx +++ b/api_docs/kbn_alerts_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-ui-shared title: "@kbn/alerts-ui-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-ui-shared plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-ui-shared'] --- import kbnAlertsUiSharedObj from './kbn_alerts_ui_shared.devdocs.json'; diff --git a/api_docs/kbn_analytics.mdx b/api_docs/kbn_analytics.mdx index 5abedc1ff1e92..47319f55fda88 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: 2023-07-08 +date: 2023-07-10 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 9bc917ef2eb41..22b2d8766aba2 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: 2023-07-08 +date: 2023-07-10 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 28a89c4729c29..5db83499c395e 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: 2023-07-08 +date: 2023-07-10 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 68a300cfb33ae..0504334f5a107 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: 2023-07-08 +date: 2023-07-10 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 746b3a3fe66be..f9aa63e03f002 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: 2023-07-08 +date: 2023-07-10 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 99721b15737c2..1f58dcd964420 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: 2023-07-08 +date: 2023-07-10 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 74e2be1a80911..9ba9a327e1846 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: 2023-07-08 +date: 2023-07-10 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 581f651affe98..a2d7020c3578c 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: 2023-07-08 +date: 2023-07-10 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 6a23185315f69..6d7136b40d7d5 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace'] --- import kbnApmSynthtraceObj from './kbn_apm_synthtrace.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace_client.mdx b/api_docs/kbn_apm_synthtrace_client.mdx index 94c96a0807cac..d9284933cd1ef 100644 --- a/api_docs/kbn_apm_synthtrace_client.mdx +++ b/api_docs/kbn_apm_synthtrace_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace-client title: "@kbn/apm-synthtrace-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace-client plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace-client'] --- import kbnApmSynthtraceClientObj from './kbn_apm_synthtrace_client.devdocs.json'; diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index a8f5821f4079b..854736df958da 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: 2023-07-08 +date: 2023-07-10 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 583ccf20ebfbc..6ad115884c8b1 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: 2023-07-08 +date: 2023-07-10 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 84ddd0f622ba2..66c0e8157f35c 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cases-components'] --- import kbnCasesComponentsObj from './kbn_cases_components.devdocs.json'; diff --git a/api_docs/kbn_cell_actions.mdx b/api_docs/kbn_cell_actions.mdx index 9d032cc9ee8eb..4063da031c372 100644 --- a/api_docs/kbn_cell_actions.mdx +++ b/api_docs/kbn_cell_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cell-actions title: "@kbn/cell-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cell-actions plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cell-actions'] --- import kbnCellActionsObj from './kbn_cell_actions.devdocs.json'; diff --git a/api_docs/kbn_chart_expressions_common.mdx b/api_docs/kbn_chart_expressions_common.mdx index db58c3d581e36..24566ca9d7b1a 100644 --- a/api_docs/kbn_chart_expressions_common.mdx +++ b/api_docs/kbn_chart_expressions_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-expressions-common title: "@kbn/chart-expressions-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-expressions-common plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-expressions-common'] --- import kbnChartExpressionsCommonObj from './kbn_chart_expressions_common.devdocs.json'; diff --git a/api_docs/kbn_chart_icons.mdx b/api_docs/kbn_chart_icons.mdx index 9c145d9697771..ebc6a9aa1ee40 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: 2023-07-08 +date: 2023-07-10 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 0107201ce66f4..adeffcd413c0b 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: 2023-07-08 +date: 2023-07-10 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 9b1bb1ced7697..3bdd5455ca306 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: 2023-07-08 +date: 2023-07-10 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 de9767677225e..e751ac4521ddf 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: 2023-07-08 +date: 2023-07-10 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 80b6512b0601d..e8d986eefbf5a 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] --- import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json'; diff --git a/api_docs/kbn_code_editor.mdx b/api_docs/kbn_code_editor.mdx index 476b2e6318582..f2eb4d84bf5e9 100644 --- a/api_docs/kbn_code_editor.mdx +++ b/api_docs/kbn_code_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor title: "@kbn/code-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor'] --- import kbnCodeEditorObj from './kbn_code_editor.devdocs.json'; diff --git a/api_docs/kbn_code_editor_mocks.mdx b/api_docs/kbn_code_editor_mocks.mdx index b3640053ebfca..fe0ad241d7add 100644 --- a/api_docs/kbn_code_editor_mocks.mdx +++ b/api_docs/kbn_code_editor_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor-mocks title: "@kbn/code-editor-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor-mocks plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor-mocks'] --- import kbnCodeEditorMocksObj from './kbn_code_editor_mocks.devdocs.json'; diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index 8cea08d677488..fcb33f753f068 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: 2023-07-08 +date: 2023-07-10 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 77dbfabe03044..3b625b92c6866 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: 2023-07-08 +date: 2023-07-10 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 70221b847aec6..225db9bbecd96 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-mocks'] --- import kbnConfigMocksObj from './kbn_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_config_schema.mdx b/api_docs/kbn_config_schema.mdx index 14e8c1623af9d..80bbf68299633 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-schema'] --- import kbnConfigSchemaObj from './kbn_config_schema.devdocs.json'; diff --git a/api_docs/kbn_content_management_content_editor.mdx b/api_docs/kbn_content_management_content_editor.mdx index 7c57f33303241..a374687f9ff9c 100644 --- a/api_docs/kbn_content_management_content_editor.mdx +++ b/api_docs/kbn_content_management_content_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-editor title: "@kbn/content-management-content-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-editor plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-editor'] --- import kbnContentManagementContentEditorObj from './kbn_content_management_content_editor.devdocs.json'; diff --git a/api_docs/kbn_content_management_tabbed_table_list_view.mdx b/api_docs/kbn_content_management_tabbed_table_list_view.mdx index 1749d9e3d3278..1d5ead619116e 100644 --- a/api_docs/kbn_content_management_tabbed_table_list_view.mdx +++ b/api_docs/kbn_content_management_tabbed_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-tabbed-table-list-view title: "@kbn/content-management-tabbed-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-tabbed-table-list-view plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-tabbed-table-list-view'] --- import kbnContentManagementTabbedTableListViewObj from './kbn_content_management_tabbed_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view.mdx b/api_docs/kbn_content_management_table_list_view.mdx index 82af3ccf8559a..5023960f990f2 100644 --- a/api_docs/kbn_content_management_table_list_view.mdx +++ b/api_docs/kbn_content_management_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view title: "@kbn/content-management-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view'] --- import kbnContentManagementTableListViewObj from './kbn_content_management_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_table.mdx b/api_docs/kbn_content_management_table_list_view_table.mdx index 10f171c422ced..a809a72690461 100644 --- a/api_docs/kbn_content_management_table_list_view_table.mdx +++ b/api_docs/kbn_content_management_table_list_view_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-table title: "@kbn/content-management-table-list-view-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-table plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-table'] --- import kbnContentManagementTableListViewTableObj from './kbn_content_management_table_list_view_table.devdocs.json'; diff --git a/api_docs/kbn_content_management_utils.mdx b/api_docs/kbn_content_management_utils.mdx index a843aca0f3638..ae47e5923d7a7 100644 --- a/api_docs/kbn_content_management_utils.mdx +++ b/api_docs/kbn_content_management_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-utils title: "@kbn/content-management-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-utils plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-utils'] --- import kbnContentManagementUtilsObj from './kbn_content_management_utils.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index 6eb041a32afc3..c4487f8f656d1 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: 2023-07-08 +date: 2023-07-10 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 137763168f009..7b955519d19e0 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: 2023-07-08 +date: 2023-07-10 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 ae7777ea1f72a..5e2a118fc1a55 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: 2023-07-08 +date: 2023-07-10 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 858af7c94bcdb..b35d91a40bc30 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: 2023-07-08 +date: 2023-07-10 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 11b85c7685ead..b96c5da356b0f 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: 2023-07-08 +date: 2023-07-10 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 eb01f9419f8d7..89bbfacf3fab6 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: 2023-07-08 +date: 2023-07-10 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 3a466dff2aed0..cf1d35dbeeda9 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: 2023-07-08 +date: 2023-07-10 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 8d365243ff4a7..e5d7bbd752b70 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: 2023-07-08 +date: 2023-07-10 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 84b39ed2da914..d027ded444a09 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: 2023-07-08 +date: 2023-07-10 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 21f058f0f9174..39d87e4188880 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: 2023-07-08 +date: 2023-07-10 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 f76bd04011ad7..b17cb5fe53fc6 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: 2023-07-08 +date: 2023-07-10 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 4370a6fe5b8d9..ac91867d4c2dd 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: 2023-07-08 +date: 2023-07-10 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 bf27c7ef799f4..4d93fbcbf018b 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: 2023-07-08 +date: 2023-07-10 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 47a83c328b869..08bd58cf6e9fe 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: 2023-07-08 +date: 2023-07-10 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 6cee820d79f09..e7e3318abacb2 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: 2023-07-08 +date: 2023-07-10 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 ac04242b8b3c7..b4d94c61863d1 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: 2023-07-08 +date: 2023-07-10 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 bfdb3c963de55..346ce30f6770f 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: 2023-07-08 +date: 2023-07-10 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 fc6d58973230c..4c08ea80c1abb 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: 2023-07-08 +date: 2023-07-10 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 f32efb15eb68e..5bab6e27f5a8c 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: 2023-07-08 +date: 2023-07-10 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 1ad8197902486..6caf4aee34666 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: 2023-07-08 +date: 2023-07-10 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 b764df6219f84..2885cd25b0338 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: 2023-07-08 +date: 2023-07-10 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 17c49f4ce946c..3781e1aca64a3 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: 2023-07-08 +date: 2023-07-10 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 197e0a8e38269..e892cc48158b0 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: 2023-07-08 +date: 2023-07-10 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 3b6cd529e1b9d..b948757509a01 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: 2023-07-08 +date: 2023-07-10 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_custom_branding_browser.mdx b/api_docs/kbn_core_custom_branding_browser.mdx index 5235627d9c110..78d7328c39ba2 100644 --- a/api_docs/kbn_core_custom_branding_browser.mdx +++ b/api_docs/kbn_core_custom_branding_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser title: "@kbn/core-custom-branding-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser'] --- import kbnCoreCustomBrandingBrowserObj from './kbn_core_custom_branding_browser.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_internal.mdx b/api_docs/kbn_core_custom_branding_browser_internal.mdx index dbc1390b15974..a13424c516404 100644 --- a/api_docs/kbn_core_custom_branding_browser_internal.mdx +++ b/api_docs/kbn_core_custom_branding_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-internal title: "@kbn/core-custom-branding-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-internal plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-internal'] --- import kbnCoreCustomBrandingBrowserInternalObj from './kbn_core_custom_branding_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser_mocks.mdx b/api_docs/kbn_core_custom_branding_browser_mocks.mdx index 75fa1ad2394e2..cd0ceef1feeeb 100644 --- a/api_docs/kbn_core_custom_branding_browser_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-mocks title: "@kbn/core-custom-branding-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-mocks plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-browser-mocks'] --- import kbnCoreCustomBrandingBrowserMocksObj from './kbn_core_custom_branding_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_common.mdx b/api_docs/kbn_core_custom_branding_common.mdx index 698f8787a7daa..648c9fd4b62d0 100644 --- a/api_docs/kbn_core_custom_branding_common.mdx +++ b/api_docs/kbn_core_custom_branding_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-common title: "@kbn/core-custom-branding-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-common plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-common'] --- import kbnCoreCustomBrandingCommonObj from './kbn_core_custom_branding_common.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server.mdx b/api_docs/kbn_core_custom_branding_server.mdx index c6105d89afe78..086695b7342dc 100644 --- a/api_docs/kbn_core_custom_branding_server.mdx +++ b/api_docs/kbn_core_custom_branding_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server title: "@kbn/core-custom-branding-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server'] --- import kbnCoreCustomBrandingServerObj from './kbn_core_custom_branding_server.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_internal.mdx b/api_docs/kbn_core_custom_branding_server_internal.mdx index 9fc3847555978..526edcd250875 100644 --- a/api_docs/kbn_core_custom_branding_server_internal.mdx +++ b/api_docs/kbn_core_custom_branding_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-internal title: "@kbn/core-custom-branding-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-internal plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-internal'] --- import kbnCoreCustomBrandingServerInternalObj from './kbn_core_custom_branding_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_server_mocks.mdx b/api_docs/kbn_core_custom_branding_server_mocks.mdx index bbd5323db2609..12ef05c472789 100644 --- a/api_docs/kbn_core_custom_branding_server_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-mocks title: "@kbn/core-custom-branding-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-mocks plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-custom-branding-server-mocks'] --- import kbnCoreCustomBrandingServerMocksObj from './kbn_core_custom_branding_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser.mdx b/api_docs/kbn_core_deprecations_browser.mdx index 3b0e7067fcf82..5928a0aae589a 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: 2023-07-08 +date: 2023-07-10 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 d90aae930b14a..7b34eb8b9ca84 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: 2023-07-08 +date: 2023-07-10 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 bd89f4e453c62..97946751b3aec 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: 2023-07-08 +date: 2023-07-10 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 1623ddc8c758e..1aa4df880dd01 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: 2023-07-08 +date: 2023-07-10 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 85b75736e8284..66a57e451060e 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: 2023-07-08 +date: 2023-07-10 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 d3c7a5dd890f2..dfe557fc778d0 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: 2023-07-08 +date: 2023-07-10 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 a305a979efdf4..4b3315c016d7d 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: 2023-07-08 +date: 2023-07-10 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 883354a770455..e65bd1e0df557 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: 2023-07-08 +date: 2023-07-10 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 a488d40b5bf0b..82a6f7d77bc56 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: 2023-07-08 +date: 2023-07-10 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 b1b711466e5e7..9d56291f4dfbd 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: 2023-07-08 +date: 2023-07-10 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 92eff24e041b7..719752d1ee257 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: 2023-07-08 +date: 2023-07-10 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 cca50e21a8b65..e67aaec982eeb 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: 2023-07-08 +date: 2023-07-10 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 de58ed0019ecd..dfce52c99e620 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: 2023-07-08 +date: 2023-07-10 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 67aef0c04be7a..538f23ad15bbe 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: 2023-07-08 +date: 2023-07-10 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 3529884a8d505..bf47d310253bb 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: 2023-07-08 +date: 2023-07-10 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 9687e6ab93097..01a8383b33dcf 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: 2023-07-08 +date: 2023-07-10 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 127a3cf4dd560..a526157cb0820 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: 2023-07-08 +date: 2023-07-10 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 f558bb0ab4feb..2f43e4ae24d77 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: 2023-07-08 +date: 2023-07-10 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 0c492080f507a..57f6b99c972bc 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: 2023-07-08 +date: 2023-07-10 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 97ae1fabdd36c..bfdae85685a99 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: 2023-07-08 +date: 2023-07-10 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 217915865b718..02437a0cfdfbc 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: 2023-07-08 +date: 2023-07-10 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 a47ca4ac718a0..dcbae50d4561f 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: 2023-07-08 +date: 2023-07-10 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 05ffeec54ee86..384573cd75cf8 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: 2023-07-08 +date: 2023-07-10 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 a7eeb3d294c00..4bbadd43a3ad2 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: 2023-07-08 +date: 2023-07-10 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 9a66210aca333..754495fbe86af 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: 2023-07-08 +date: 2023-07-10 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 90b6a129ebcec..b75183ef1d54c 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: 2023-07-08 +date: 2023-07-10 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 df52b9da51065..0f495793aa4f3 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: 2023-07-08 +date: 2023-07-10 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 22f9bb093494a..1e8ef00a400e1 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: 2023-07-08 +date: 2023-07-10 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 b8b8d2cc67798..5550a5e88f05f 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: 2023-07-08 +date: 2023-07-10 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 9da5cdb8abbca..81ecb435bec80 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: 2023-07-08 +date: 2023-07-10 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 22bb25198f7ba..6db37d0673aaa 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: 2023-07-08 +date: 2023-07-10 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 9e3968caf57c7..b2f81be5a0f41 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: 2023-07-08 +date: 2023-07-10 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 fe849a38d46b5..1e161f2ada56f 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: 2023-07-08 +date: 2023-07-10 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 3c8898f698b8c..b2d85ee72c0e4 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: 2023-07-08 +date: 2023-07-10 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 a3e3271f0f570..15f0067cd631a 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: 2023-07-08 +date: 2023-07-10 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 7247d0877a779..686b1fa5ca777 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: 2023-07-08 +date: 2023-07-10 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 7ea28e403d5e0..6bb263c9cc648 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: 2023-07-08 +date: 2023-07-10 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 f2622cd25a64a..bf2af7f5a8fac 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: 2023-07-08 +date: 2023-07-10 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 51a008a244298..f0acbb33fc1fd 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: 2023-07-08 +date: 2023-07-10 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 70801e9981eb9..7b1445ea8498f 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: 2023-07-08 +date: 2023-07-10 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 e68f555d23e5d..06aeb352a8a2a 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: 2023-07-08 +date: 2023-07-10 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 c6e2b8b75a645..340dc4a27f33b 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: 2023-07-08 +date: 2023-07-10 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 bb1602eddf725..08c5ccfa4293e 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: 2023-07-08 +date: 2023-07-10 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 dd9f0d31a1f65..2657b2cb8166a 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: 2023-07-08 +date: 2023-07-10 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 cab2990f6505b..8d1fd5afc6bd4 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: 2023-07-08 +date: 2023-07-10 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 2143433de8b6a..1fc9a7da7dbff 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: 2023-07-08 +date: 2023-07-10 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_mocks.mdx b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx index 1b7d6b5a1e1c2..7b1750609d378 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: 2023-07-08 +date: 2023-07-10 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 a49156c43b8f7..5e58ba4bd72c1 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: 2023-07-08 +date: 2023-07-10 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 9ba7bd6f2beb3..77a0a26772431 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: 2023-07-08 +date: 2023-07-10 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 2e73c732c3c77..e37bcc2ad0d30 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: 2023-07-08 +date: 2023-07-10 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 243bb18b5d048..d3a943a7dbccf 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: 2023-07-08 +date: 2023-07-10 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 ee8ffbc454b71..6ed4e8853463c 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: 2023-07-08 +date: 2023-07-10 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 f0ddd1512a6d3..e63a8c3a91c2f 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: 2023-07-08 +date: 2023-07-10 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 cfd5e249c907f..9920dee1c096e 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: 2023-07-08 +date: 2023-07-10 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 fdcad873efc9e..8a6fc7b3c47de 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: 2023-07-08 +date: 2023-07-10 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 c37f749b23edb..fb3e2467eadc3 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: 2023-07-08 +date: 2023-07-10 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 7035ace207240..3ed486215183e 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: 2023-07-08 +date: 2023-07-10 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 45fbac3eafecb..688be934144bf 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: 2023-07-08 +date: 2023-07-10 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 1fc4d4b85c8f0..a63a7ceec9bc0 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: 2023-07-08 +date: 2023-07-10 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 7dafecb6b85e1..24a35d51ea33e 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: 2023-07-08 +date: 2023-07-10 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 f463132cda325..bb20d42162b8d 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: 2023-07-08 +date: 2023-07-10 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 9b5d82f645745..1243fd2d5b9e9 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: 2023-07-08 +date: 2023-07-10 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 64e8b768a5719..d893ddbc1952d 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: 2023-07-08 +date: 2023-07-10 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 22ead83f5fff2..b0674713ef179 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: 2023-07-08 +date: 2023-07-10 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 a1fe90c983fe2..f8a30adfe5a26 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: 2023-07-08 +date: 2023-07-10 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 fdc544b8d22af..fbd839a4e659a 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: 2023-07-08 +date: 2023-07-10 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 04bd9ada639c4..16b3e7f7f1a35 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: 2023-07-08 +date: 2023-07-10 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 7cf052a807e34..b80fea68271c7 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: 2023-07-08 +date: 2023-07-10 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 0e7871f19b580..36d395c16aee7 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: 2023-07-08 +date: 2023-07-10 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 9ebb8cff75821..9d4aff860c048 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: 2023-07-08 +date: 2023-07-10 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 0d280334d6ce3..6cb1def34d074 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: 2023-07-08 +date: 2023-07-10 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 439bb5c80cafe..db04985a2c9ff 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: 2023-07-08 +date: 2023-07-10 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 5c8d0f60f9428..cb65fc856aa9c 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: 2023-07-08 +date: 2023-07-10 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 8842260bbe9cb..d322125f01772 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: 2023-07-08 +date: 2023-07-10 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 4f6a66942c7f8..3a9bad93237d1 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: 2023-07-08 +date: 2023-07-10 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 c13714bc797a6..8b8be84aa6a90 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: 2023-07-08 +date: 2023-07-10 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 2437a625a8385..e5d21280a4155 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: 2023-07-08 +date: 2023-07-10 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 b0ee4725980cd..46436d959e4a4 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: 2023-07-08 +date: 2023-07-10 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 c975ce0d7514d..cf9b67888ed08 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: 2023-07-08 +date: 2023-07-10 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 33a4e6cec1f45..7ed5e990038a9 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: 2023-07-08 +date: 2023-07-10 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 6ba7cbb7b6b48..a704d28c8c920 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: 2023-07-08 +date: 2023-07-10 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 3fef5a92c6a49..e406a738e74f6 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: 2023-07-08 +date: 2023-07-10 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 fb5f5a7a96d22..344c09ae684dc 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: 2023-07-08 +date: 2023-07-10 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 6389999ead911..42847b266a775 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: 2023-07-08 +date: 2023-07-10 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 e9b0a85a312ff..6bcf5783c98d0 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: 2023-07-08 +date: 2023-07-10 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_mocks.mdx b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx index 847658032d32e..82b3d5c8e6718 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: 2023-07-08 +date: 2023-07-10 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 3f4dcafc0992d..accb79ee278a6 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: 2023-07-08 +date: 2023-07-10 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 23276c5ecf32a..498efed8007c3 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: 2023-07-08 +date: 2023-07-10 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 9439a0037a8c3..e946c9064ef8b 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: 2023-07-08 +date: 2023-07-10 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 f93552b8d9c85..484ea01c06c0e 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: 2023-07-08 +date: 2023-07-10 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 bdf3afc610bf3..b8eac83b0a995 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: 2023-07-08 +date: 2023-07-10 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 1abdfc3d8880d..2f4ac16bb24b4 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: 2023-07-08 +date: 2023-07-10 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 f6ab3cf86c5ac..8b9e958df02f1 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: 2023-07-08 +date: 2023-07-10 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 e2f47954c448c..de9a9d8138b39 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: 2023-07-08 +date: 2023-07-10 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 516eb21a3e353..26dc7d04881a9 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: 2023-07-08 +date: 2023-07-10 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 36fa19f19d19b..75aaf3266ab71 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: 2023-07-08 +date: 2023-07-10 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 a060676f538b1..99b2e374213b2 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: 2023-07-08 +date: 2023-07-10 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 f0ee699407f5d..9f343ed685846 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: 2023-07-08 +date: 2023-07-10 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 a56da0f5a7a81..476f86bc7ec5f 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: 2023-07-08 +date: 2023-07-10 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 d22704f65c558..a55cd5ff47077 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: 2023-07-08 +date: 2023-07-10 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 13e28e481ac75..32affc40e4aa9 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: 2023-07-08 +date: 2023-07-10 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 ef45e2b10f71e..2ccdf424e341f 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: 2023-07-08 +date: 2023-07-10 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 e60c56d428d9e..c7ff4ceb46ed0 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: 2023-07-08 +date: 2023-07-10 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 327f7f78f873d..07ea497c3373a 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: 2023-07-08 +date: 2023-07-10 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 c5df71da164b7..548c8b0ce9497 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: 2023-07-08 +date: 2023-07-10 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 7ba1f6547fec4..4fbbe8289b0a2 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: 2023-07-08 +date: 2023-07-10 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 931e01939dd63..6d8b0b3e22e7b 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: 2023-07-08 +date: 2023-07-10 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 8e294fe677b7f..d7bac4c3ded85 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: 2023-07-08 +date: 2023-07-10 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 7bc56b4515b01..1816283141381 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: 2023-07-08 +date: 2023-07-10 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 a6937b632c109..57adb65da58de 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: 2023-07-08 +date: 2023-07-10 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 bc74b741970ca..5576663717573 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: 2023-07-08 +date: 2023-07-10 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 ccde50034eba5..9daac2209d130 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: 2023-07-08 +date: 2023-07-10 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 48a067e013c0a..6d8b40fe37f1d 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: 2023-07-08 +date: 2023-07-10 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 0910ff68e4ac8..e75c9bfb0be0b 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: 2023-07-08 +date: 2023-07-10 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 3c61ed1e70849..f0f67aa4be46b 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: 2023-07-08 +date: 2023-07-10 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 986234eaf4594..25d519cca81f9 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: 2023-07-08 +date: 2023-07-10 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 3f8451669e1cd..28343cd8dd578 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: 2023-07-08 +date: 2023-07-10 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 60d40784a3374..8497f5c6e3b08 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: 2023-07-08 +date: 2023-07-10 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 52bf06a04a79c..26f1f6eb95bc2 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: 2023-07-08 +date: 2023-07-10 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 d93217624cbc0..3dedd4cabd59b 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: 2023-07-08 +date: 2023-07-10 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 29ff77a966154..c2b367cc968a1 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: 2023-07-08 +date: 2023-07-10 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 19692e54a4d38..0814787656a42 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: 2023-07-08 +date: 2023-07-10 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 b1ea152a06a67..3fda2b7d70260 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: 2023-07-08 +date: 2023-07-10 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_core_user_settings_server.mdx b/api_docs/kbn_core_user_settings_server.mdx index cf395c42b4795..306694c1a9b65 100644 --- a/api_docs/kbn_core_user_settings_server.mdx +++ b/api_docs/kbn_core_user_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server title: "@kbn/core-user-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server'] --- import kbnCoreUserSettingsServerObj from './kbn_core_user_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server_internal.mdx b/api_docs/kbn_core_user_settings_server_internal.mdx index e43e649af4002..f1d2faaccac7a 100644 --- a/api_docs/kbn_core_user_settings_server_internal.mdx +++ b/api_docs/kbn_core_user_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-internal title: "@kbn/core-user-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-internal plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-internal'] --- import kbnCoreUserSettingsServerInternalObj from './kbn_core_user_settings_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server_mocks.mdx b/api_docs/kbn_core_user_settings_server_mocks.mdx index ac99ab229348b..a942083d7a99a 100644 --- a/api_docs/kbn_core_user_settings_server_mocks.mdx +++ b/api_docs/kbn_core_user_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-mocks title: "@kbn/core-user-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-mocks plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-mocks'] --- import kbnCoreUserSettingsServerMocksObj from './kbn_core_user_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_crypto.mdx b/api_docs/kbn_crypto.mdx index 052b62ad3c04d..06b4687b6c342 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: 2023-07-08 +date: 2023-07-10 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 59c792d5b70a4..1dadbb2b0cf31 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_cypress_config.mdx b/api_docs/kbn_cypress_config.mdx index b1f9cb575d957..c422c14ffba44 100644 --- a/api_docs/kbn_cypress_config.mdx +++ b/api_docs/kbn_cypress_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cypress-config title: "@kbn/cypress-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cypress-config plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cypress-config'] --- import kbnCypressConfigObj from './kbn_cypress_config.devdocs.json'; diff --git a/api_docs/kbn_data_service.mdx b/api_docs/kbn_data_service.mdx index f3c98b179caeb..363c73168c819 100644 --- a/api_docs/kbn_data_service.mdx +++ b/api_docs/kbn_data_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-service title: "@kbn/data-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-service plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-service'] --- import kbnDataServiceObj from './kbn_data_service.devdocs.json'; diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index f0927158feeb7..6466254d98ca9 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] --- import kbnDatemathObj from './kbn_datemath.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_analytics.mdx b/api_docs/kbn_deeplinks_analytics.mdx index ee688971eac2e..580937fa561ac 100644 --- a/api_docs/kbn_deeplinks_analytics.mdx +++ b/api_docs/kbn_deeplinks_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-analytics title: "@kbn/deeplinks-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-analytics plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-analytics'] --- import kbnDeeplinksAnalyticsObj from './kbn_deeplinks_analytics.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_devtools.mdx b/api_docs/kbn_deeplinks_devtools.mdx index 6e0f2c13abac0..6de91d674c2f0 100644 --- a/api_docs/kbn_deeplinks_devtools.mdx +++ b/api_docs/kbn_deeplinks_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-devtools title: "@kbn/deeplinks-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-devtools plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-devtools'] --- import kbnDeeplinksDevtoolsObj from './kbn_deeplinks_devtools.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_management.mdx b/api_docs/kbn_deeplinks_management.mdx index 2438348516f73..99e68b9c84644 100644 --- a/api_docs/kbn_deeplinks_management.mdx +++ b/api_docs/kbn_deeplinks_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-management title: "@kbn/deeplinks-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-management plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-management'] --- import kbnDeeplinksManagementObj from './kbn_deeplinks_management.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_ml.mdx b/api_docs/kbn_deeplinks_ml.mdx index 92c15ef4703cd..e6e99cfc33947 100644 --- a/api_docs/kbn_deeplinks_ml.mdx +++ b/api_docs/kbn_deeplinks_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-ml title: "@kbn/deeplinks-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-ml plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-ml'] --- import kbnDeeplinksMlObj from './kbn_deeplinks_ml.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_observability.mdx b/api_docs/kbn_deeplinks_observability.mdx index 975416c54afef..4d340db1c420a 100644 --- a/api_docs/kbn_deeplinks_observability.mdx +++ b/api_docs/kbn_deeplinks_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-observability title: "@kbn/deeplinks-observability" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-observability plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-observability'] --- import kbnDeeplinksObservabilityObj from './kbn_deeplinks_observability.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_search.mdx b/api_docs/kbn_deeplinks_search.mdx index 64d4eec665ba8..c366cb796dd6c 100644 --- a/api_docs/kbn_deeplinks_search.mdx +++ b/api_docs/kbn_deeplinks_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-search title: "@kbn/deeplinks-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-search plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-search'] --- import kbnDeeplinksSearchObj from './kbn_deeplinks_search.devdocs.json'; diff --git a/api_docs/kbn_default_nav_analytics.mdx b/api_docs/kbn_default_nav_analytics.mdx index 7971ba622fe61..17df02e9b1b1a 100644 --- a/api_docs/kbn_default_nav_analytics.mdx +++ b/api_docs/kbn_default_nav_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-analytics title: "@kbn/default-nav-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-analytics plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-analytics'] --- import kbnDefaultNavAnalyticsObj from './kbn_default_nav_analytics.devdocs.json'; diff --git a/api_docs/kbn_default_nav_devtools.mdx b/api_docs/kbn_default_nav_devtools.mdx index 5b6c19fe0867d..5ac3ed353fb9b 100644 --- a/api_docs/kbn_default_nav_devtools.mdx +++ b/api_docs/kbn_default_nav_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-devtools title: "@kbn/default-nav-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-devtools plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-devtools'] --- import kbnDefaultNavDevtoolsObj from './kbn_default_nav_devtools.devdocs.json'; diff --git a/api_docs/kbn_default_nav_management.mdx b/api_docs/kbn_default_nav_management.mdx index a18ad26e92df2..4b140f2e1f376 100644 --- a/api_docs/kbn_default_nav_management.mdx +++ b/api_docs/kbn_default_nav_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-management title: "@kbn/default-nav-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-management plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-management'] --- import kbnDefaultNavManagementObj from './kbn_default_nav_management.devdocs.json'; diff --git a/api_docs/kbn_default_nav_ml.mdx b/api_docs/kbn_default_nav_ml.mdx index 244565de29e43..4a366db358823 100644 --- a/api_docs/kbn_default_nav_ml.mdx +++ b/api_docs/kbn_default_nav_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-ml title: "@kbn/default-nav-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-ml plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-ml'] --- import kbnDefaultNavMlObj from './kbn_default_nav_ml.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index 079efa2bc9920..5fd056c20a7b3 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: 2023-07-08 +date: 2023-07-10 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 bfec90e088002..8608ca44f4623 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: 2023-07-08 +date: 2023-07-10 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 05bdcecae2f00..6dd94dbddbda6 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: 2023-07-08 +date: 2023-07-10 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 d71d7a516370f..69a7bbd49c3c1 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: 2023-07-08 +date: 2023-07-10 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 8a894631a5eab..29b5820a2f2b2 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: 2023-07-08 +date: 2023-07-10 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 f5a08386bbbde..abfb916fe4de2 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/docs-utils'] --- import kbnDocsUtilsObj from './kbn_docs_utils.devdocs.json'; diff --git a/api_docs/kbn_dom_drag_drop.mdx b/api_docs/kbn_dom_drag_drop.mdx index 156c7be52a59a..f947ad7bb7f6d 100644 --- a/api_docs/kbn_dom_drag_drop.mdx +++ b/api_docs/kbn_dom_drag_drop.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dom-drag-drop title: "@kbn/dom-drag-drop" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dom-drag-drop plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dom-drag-drop'] --- import kbnDomDragDropObj from './kbn_dom_drag_drop.devdocs.json'; diff --git a/api_docs/kbn_ebt_tools.mdx b/api_docs/kbn_ebt_tools.mdx index ae1ee3ca13606..46e593b6c4278 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt-tools'] --- import kbnEbtToolsObj from './kbn_ebt_tools.devdocs.json'; diff --git a/api_docs/kbn_ecs.mdx b/api_docs/kbn_ecs.mdx index f27fc0dd4cb4e..9e5d31163eb8a 100644 --- a/api_docs/kbn_ecs.mdx +++ b/api_docs/kbn_ecs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs title: "@kbn/ecs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ecs plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs'] --- import kbnEcsObj from './kbn_ecs.devdocs.json'; diff --git a/api_docs/kbn_ecs_data_quality_dashboard.mdx b/api_docs/kbn_ecs_data_quality_dashboard.mdx index c1cd878814ee5..dc5f7121332c4 100644 --- a/api_docs/kbn_ecs_data_quality_dashboard.mdx +++ b/api_docs/kbn_ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs-data-quality-dashboard title: "@kbn/ecs-data-quality-dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ecs-data-quality-dashboard plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs-data-quality-dashboard'] --- import kbnEcsDataQualityDashboardObj from './kbn_ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant.mdx b/api_docs/kbn_elastic_assistant.mdx index 74792a8207b21..a5187230a664f 100644 --- a/api_docs/kbn_elastic_assistant.mdx +++ b/api_docs/kbn_elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant title: "@kbn/elastic-assistant" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant'] --- import kbnElasticAssistantObj from './kbn_elastic_assistant.devdocs.json'; diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index d14981ab5e76e..cc6c010b56278 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: 2023-07-08 +date: 2023-07-10 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 60962cb860707..36d4804d9b976 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: 2023-07-08 +date: 2023-07-10 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 5d60ccadb038d..f3100c25cd010 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: 2023-07-08 +date: 2023-07-10 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 82662747781ca..15fc4c6d9e7b7 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: 2023-07-08 +date: 2023-07-10 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 b4b0857e6d587..01e19ff364973 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: 2023-07-08 +date: 2023-07-10 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 5244169009889..6038be38abf8f 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] --- import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json'; diff --git a/api_docs/kbn_expandable_flyout.mdx b/api_docs/kbn_expandable_flyout.mdx index 9fe815dfefa64..e6985f24a2697 100644 --- a/api_docs/kbn_expandable_flyout.mdx +++ b/api_docs/kbn_expandable_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-expandable-flyout title: "@kbn/expandable-flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/expandable-flyout plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/expandable-flyout'] --- import kbnExpandableFlyoutObj from './kbn_expandable_flyout.devdocs.json'; diff --git a/api_docs/kbn_field_types.mdx b/api_docs/kbn_field_types.mdx index 018c12d052a7f..ca5ab84c2ee5c 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: 2023-07-08 +date: 2023-07-10 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 acf8d9a78944b..34192c570b84c 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: 2023-07-08 +date: 2023-07-10 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 845de5c4f5478..90e5245d3ad47 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: 2023-07-08 +date: 2023-07-10 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 88ad365e46e20..bf25283ef43e1 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate'] --- import kbnGenerateObj from './kbn_generate.devdocs.json'; diff --git a/api_docs/kbn_generate_console_definitions.mdx b/api_docs/kbn_generate_console_definitions.mdx index 6f8672d45d57b..0c37abe6fa16b 100644 --- a/api_docs/kbn_generate_console_definitions.mdx +++ b/api_docs/kbn_generate_console_definitions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-console-definitions title: "@kbn/generate-console-definitions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-console-definitions plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-console-definitions'] --- import kbnGenerateConsoleDefinitionsObj from './kbn_generate_console_definitions.devdocs.json'; diff --git a/api_docs/kbn_generate_csv.mdx b/api_docs/kbn_generate_csv.mdx index 6328d62b53a1b..91532679937af 100644 --- a/api_docs/kbn_generate_csv.mdx +++ b/api_docs/kbn_generate_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-csv title: "@kbn/generate-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-csv plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; diff --git a/api_docs/kbn_generate_csv_types.mdx b/api_docs/kbn_generate_csv_types.mdx index b6fbea9e96b39..8dc290f145b9f 100644 --- a/api_docs/kbn_generate_csv_types.mdx +++ b/api_docs/kbn_generate_csv_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-csv-types title: "@kbn/generate-csv-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-csv-types plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv-types'] --- import kbnGenerateCsvTypesObj from './kbn_generate_csv_types.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index 0bbab030cb662..5a447da20348a 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: 2023-07-08 +date: 2023-07-10 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 fd5bed87b9cde..d346f30efa55a 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: 2023-07-08 +date: 2023-07-10 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 da43d4ef2404b..7d38cae5d58cc 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: 2023-07-08 +date: 2023-07-10 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 900963a0cdaa8..7fbefe8fe6e0e 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: 2023-07-08 +date: 2023-07-10 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 37b7ff03768be..b7995f84faa26 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: 2023-07-08 +date: 2023-07-10 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 c17385b3f4bc8..7535db29e29c9 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: 2023-07-08 +date: 2023-07-10 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 a91a83dc17a96..11dfa26b069d3 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: 2023-07-08 +date: 2023-07-10 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 4d4b1dd82e8e4..94fe9a31a4964 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: 2023-07-08 +date: 2023-07-10 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 073e2368b2f09..da0d9f51fabc0 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_infra_forge.mdx b/api_docs/kbn_infra_forge.mdx index b6cee0db82a81..9693dd4e16c14 100644 --- a/api_docs/kbn_infra_forge.mdx +++ b/api_docs/kbn_infra_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-infra-forge title: "@kbn/infra-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/infra-forge plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/infra-forge'] --- import kbnInfraForgeObj from './kbn_infra_forge.devdocs.json'; diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx index 71c8eb9f571e0..af1a8597ade46 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter'] --- import kbnInterpreterObj from './kbn_interpreter.devdocs.json'; diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx index 932f13b46c067..b3d3846284196 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils'] --- import kbnIoTsUtilsObj from './kbn_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index f47155b0838fb..cdea12a1e2fad 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: 2023-07-08 +date: 2023-07-10 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 d13bd06279645..a9f6d25d211d3 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/journeys'] --- import kbnJourneysObj from './kbn_journeys.devdocs.json'; diff --git a/api_docs/kbn_json_ast.mdx b/api_docs/kbn_json_ast.mdx index 565bb5c5c354a..a807f23f1426a 100644 --- a/api_docs/kbn_json_ast.mdx +++ b/api_docs/kbn_json_ast.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-ast title: "@kbn/json-ast" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/json-ast plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-ast'] --- import kbnJsonAstObj from './kbn_json_ast.devdocs.json'; diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx index 218c8162616b3..ee0e0c311219a 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: 2023-07-08 +date: 2023-07-10 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 912a40a673d6b..2c932ac2a327d 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: 2023-07-08 +date: 2023-07-10 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 a839ddfbac345..0dd63f9175d12 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: 2023-07-08 +date: 2023-07-10 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 c324c716fd39c..5b5251fa749ce 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: 2023-07-08 +date: 2023-07-10 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 21ee871b8b6bf..ee961335161c3 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-vscode-config'] --- import kbnManagedVscodeConfigObj from './kbn_managed_vscode_config.devdocs.json'; diff --git a/api_docs/kbn_management_cards_navigation.mdx b/api_docs/kbn_management_cards_navigation.mdx index 48ef1dadbffad..1d6b9e580c928 100644 --- a/api_docs/kbn_management_cards_navigation.mdx +++ b/api_docs/kbn_management_cards_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-cards-navigation title: "@kbn/management-cards-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-cards-navigation plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-cards-navigation'] --- import kbnManagementCardsNavigationObj from './kbn_management_cards_navigation.devdocs.json'; diff --git a/api_docs/kbn_management_storybook_config.mdx b/api_docs/kbn_management_storybook_config.mdx index 88110c0baddc5..033f0813bbad3 100644 --- a/api_docs/kbn_management_storybook_config.mdx +++ b/api_docs/kbn_management_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-storybook-config title: "@kbn/management-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-storybook-config plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-storybook-config'] --- import kbnManagementStorybookConfigObj from './kbn_management_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index c391ba50605b3..6db3cb6b9118b 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl'] --- import kbnMapboxGlObj from './kbn_mapbox_gl.devdocs.json'; diff --git a/api_docs/kbn_maps_vector_tile_utils.mdx b/api_docs/kbn_maps_vector_tile_utils.mdx index 483580c5210b5..40772a88cfbc4 100644 --- a/api_docs/kbn_maps_vector_tile_utils.mdx +++ b/api_docs/kbn_maps_vector_tile_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-maps-vector-tile-utils title: "@kbn/maps-vector-tile-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/maps-vector-tile-utils plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/maps-vector-tile-utils'] --- import kbnMapsVectorTileUtilsObj from './kbn_maps_vector_tile_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_agg_utils.mdx b/api_docs/kbn_ml_agg_utils.mdx index 34be2ae0337ca..19464327555fb 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: 2023-07-08 +date: 2023-07-10 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_anomaly_utils.mdx b/api_docs/kbn_ml_anomaly_utils.mdx index 3d694def342a0..2bfbc21c1300b 100644 --- a/api_docs/kbn_ml_anomaly_utils.mdx +++ b/api_docs/kbn_ml_anomaly_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-anomaly-utils title: "@kbn/ml-anomaly-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-anomaly-utils plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-anomaly-utils'] --- import kbnMlAnomalyUtilsObj from './kbn_ml_anomaly_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_data_frame_analytics_utils.mdx b/api_docs/kbn_ml_data_frame_analytics_utils.mdx index 37586c8a0d6a3..49d288f62ac40 100644 --- a/api_docs/kbn_ml_data_frame_analytics_utils.mdx +++ b/api_docs/kbn_ml_data_frame_analytics_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-frame-analytics-utils title: "@kbn/ml-data-frame-analytics-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-frame-analytics-utils plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-frame-analytics-utils'] --- import kbnMlDataFrameAnalyticsUtilsObj from './kbn_ml_data_frame_analytics_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_data_grid.mdx b/api_docs/kbn_ml_data_grid.mdx index 300e28cd72a01..3126f5027fe1d 100644 --- a/api_docs/kbn_ml_data_grid.mdx +++ b/api_docs/kbn_ml_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-grid title: "@kbn/ml-data-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-grid plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-grid'] --- import kbnMlDataGridObj from './kbn_ml_data_grid.devdocs.json'; diff --git a/api_docs/kbn_ml_date_picker.mdx b/api_docs/kbn_ml_date_picker.mdx index f9548bea10eba..5e33c956b8e08 100644 --- a/api_docs/kbn_ml_date_picker.mdx +++ b/api_docs/kbn_ml_date_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-picker title: "@kbn/ml-date-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-picker plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-picker'] --- import kbnMlDatePickerObj from './kbn_ml_date_picker.devdocs.json'; diff --git a/api_docs/kbn_ml_date_utils.mdx b/api_docs/kbn_ml_date_utils.mdx index 3716d6ab819a6..190b337815750 100644 --- a/api_docs/kbn_ml_date_utils.mdx +++ b/api_docs/kbn_ml_date_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-utils title: "@kbn/ml-date-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-utils plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-utils'] --- import kbnMlDateUtilsObj from './kbn_ml_date_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_error_utils.mdx b/api_docs/kbn_ml_error_utils.mdx index 05d4b047df542..53a1f469a1579 100644 --- a/api_docs/kbn_ml_error_utils.mdx +++ b/api_docs/kbn_ml_error_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-error-utils title: "@kbn/ml-error-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-error-utils plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-error-utils'] --- import kbnMlErrorUtilsObj from './kbn_ml_error_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_is_defined.mdx b/api_docs/kbn_ml_is_defined.mdx index d942fd749fb35..72b04d39228e9 100644 --- a/api_docs/kbn_ml_is_defined.mdx +++ b/api_docs/kbn_ml_is_defined.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-defined title: "@kbn/ml-is-defined" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-defined plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-defined'] --- import kbnMlIsDefinedObj from './kbn_ml_is_defined.devdocs.json'; diff --git a/api_docs/kbn_ml_is_populated_object.mdx b/api_docs/kbn_ml_is_populated_object.mdx index 274639897f8fe..77a902b070687 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: 2023-07-08 +date: 2023-07-10 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_kibana_theme.mdx b/api_docs/kbn_ml_kibana_theme.mdx index 065e92c9f4fe7..1baddcc5868a3 100644 --- a/api_docs/kbn_ml_kibana_theme.mdx +++ b/api_docs/kbn_ml_kibana_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-kibana-theme title: "@kbn/ml-kibana-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-kibana-theme plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-kibana-theme'] --- import kbnMlKibanaThemeObj from './kbn_ml_kibana_theme.devdocs.json'; diff --git a/api_docs/kbn_ml_local_storage.mdx b/api_docs/kbn_ml_local_storage.mdx index c92306ee7c9d0..eb6cd7c8c5f5d 100644 --- a/api_docs/kbn_ml_local_storage.mdx +++ b/api_docs/kbn_ml_local_storage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-local-storage title: "@kbn/ml-local-storage" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-local-storage plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-local-storage'] --- import kbnMlLocalStorageObj from './kbn_ml_local_storage.devdocs.json'; diff --git a/api_docs/kbn_ml_nested_property.mdx b/api_docs/kbn_ml_nested_property.mdx index 7ed09846dd85c..e393d5ab8ee38 100644 --- a/api_docs/kbn_ml_nested_property.mdx +++ b/api_docs/kbn_ml_nested_property.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-nested-property title: "@kbn/ml-nested-property" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-nested-property plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-nested-property'] --- import kbnMlNestedPropertyObj from './kbn_ml_nested_property.devdocs.json'; diff --git a/api_docs/kbn_ml_number_utils.mdx b/api_docs/kbn_ml_number_utils.mdx index 0ec4e8800a357..696b55416c5bb 100644 --- a/api_docs/kbn_ml_number_utils.mdx +++ b/api_docs/kbn_ml_number_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-number-utils title: "@kbn/ml-number-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-number-utils plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-number-utils'] --- import kbnMlNumberUtilsObj from './kbn_ml_number_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_query_utils.mdx b/api_docs/kbn_ml_query_utils.mdx index 33272c5e53fc5..9f5a67d355f81 100644 --- a/api_docs/kbn_ml_query_utils.mdx +++ b/api_docs/kbn_ml_query_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-query-utils title: "@kbn/ml-query-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-query-utils plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-query-utils'] --- import kbnMlQueryUtilsObj from './kbn_ml_query_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_random_sampler_utils.mdx b/api_docs/kbn_ml_random_sampler_utils.mdx index 72b0c436716f8..070ec4531331d 100644 --- a/api_docs/kbn_ml_random_sampler_utils.mdx +++ b/api_docs/kbn_ml_random_sampler_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-random-sampler-utils title: "@kbn/ml-random-sampler-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-random-sampler-utils plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-random-sampler-utils'] --- import kbnMlRandomSamplerUtilsObj from './kbn_ml_random_sampler_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_route_utils.mdx b/api_docs/kbn_ml_route_utils.mdx index 91f3a48d4cf48..fe4e2ec010e7f 100644 --- a/api_docs/kbn_ml_route_utils.mdx +++ b/api_docs/kbn_ml_route_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-route-utils title: "@kbn/ml-route-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-route-utils plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-route-utils'] --- import kbnMlRouteUtilsObj from './kbn_ml_route_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_runtime_field_utils.mdx b/api_docs/kbn_ml_runtime_field_utils.mdx index 309bc8eae370a..dd784793c3198 100644 --- a/api_docs/kbn_ml_runtime_field_utils.mdx +++ b/api_docs/kbn_ml_runtime_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-runtime-field-utils title: "@kbn/ml-runtime-field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-runtime-field-utils plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-runtime-field-utils'] --- import kbnMlRuntimeFieldUtilsObj from './kbn_ml_runtime_field_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx index 0aef7d92257c2..f73aa1bda0b55 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-string-hash'] --- import kbnMlStringHashObj from './kbn_ml_string_hash.devdocs.json'; diff --git a/api_docs/kbn_ml_trained_models_utils.mdx b/api_docs/kbn_ml_trained_models_utils.mdx index e65e194fd2fa7..11e4be55d421f 100644 --- a/api_docs/kbn_ml_trained_models_utils.mdx +++ b/api_docs/kbn_ml_trained_models_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-trained-models-utils title: "@kbn/ml-trained-models-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-trained-models-utils plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-trained-models-utils'] --- import kbnMlTrainedModelsUtilsObj from './kbn_ml_trained_models_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_url_state.mdx b/api_docs/kbn_ml_url_state.mdx index fe5a3792d90c2..3be606c655815 100644 --- a/api_docs/kbn_ml_url_state.mdx +++ b/api_docs/kbn_ml_url_state.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-url-state title: "@kbn/ml-url-state" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-url-state plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-url-state'] --- import kbnMlUrlStateObj from './kbn_ml_url_state.devdocs.json'; diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index 9270ba8469566..628f0813c11f3 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/monaco'] --- import kbnMonacoObj from './kbn_monaco.devdocs.json'; diff --git a/api_docs/kbn_object_versioning.mdx b/api_docs/kbn_object_versioning.mdx index 2b4203ab0dad9..3978093dbd3aa 100644 --- a/api_docs/kbn_object_versioning.mdx +++ b/api_docs/kbn_object_versioning.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-object-versioning title: "@kbn/object-versioning" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/object-versioning plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning'] --- import kbnObjectVersioningObj from './kbn_object_versioning.devdocs.json'; diff --git a/api_docs/kbn_observability_alert_details.mdx b/api_docs/kbn_observability_alert_details.mdx index 8da5ab5617ed3..b4a1ba126baae 100644 --- a/api_docs/kbn_observability_alert_details.mdx +++ b/api_docs/kbn_observability_alert_details.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alert-details title: "@kbn/observability-alert-details" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alert-details plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alert-details'] --- import kbnObservabilityAlertDetailsObj from './kbn_observability_alert_details.devdocs.json'; diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index 2bf0d81d7d097..e2010b183ce52 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: 2023-07-08 +date: 2023-07-10 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 1ed8e10724139..9e086b894edc4 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: 2023-07-08 +date: 2023-07-10 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 5f5869ae64493..428264e18fbcf 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: 2023-07-08 +date: 2023-07-10 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_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index 14aaf2e8c810c..73ff79723773e 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: 2023-07-08 +date: 2023-07-10 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 0c02eff79835f..ab4f2b5af48fb 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: 2023-07-08 +date: 2023-07-10 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 28342edbf48ca..d691d33b54abd 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_random_sampling.mdx b/api_docs/kbn_random_sampling.mdx index 9c617a1c76c05..c4d6c4df05bd8 100644 --- a/api_docs/kbn_random_sampling.mdx +++ b/api_docs/kbn_random_sampling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-random-sampling title: "@kbn/random-sampling" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/random-sampling plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/random-sampling'] --- import kbnRandomSamplingObj from './kbn_random_sampling.devdocs.json'; diff --git a/api_docs/kbn_react_field.mdx b/api_docs/kbn_react_field.mdx index a341882797f67..89b74bfa6df47 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_repo_file_maps.mdx b/api_docs/kbn_repo_file_maps.mdx index e7c5fe69c4526..6b309e6c640b0 100644 --- a/api_docs/kbn_repo_file_maps.mdx +++ b/api_docs/kbn_repo_file_maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-file-maps title: "@kbn/repo-file-maps" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-file-maps plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-file-maps'] --- import kbnRepoFileMapsObj from './kbn_repo_file_maps.devdocs.json'; diff --git a/api_docs/kbn_repo_linter.mdx b/api_docs/kbn_repo_linter.mdx index 7addf238a5e64..35e5a914fc137 100644 --- a/api_docs/kbn_repo_linter.mdx +++ b/api_docs/kbn_repo_linter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-linter title: "@kbn/repo-linter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-linter plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-linter'] --- import kbnRepoLinterObj from './kbn_repo_linter.devdocs.json'; diff --git a/api_docs/kbn_repo_path.mdx b/api_docs/kbn_repo_path.mdx index 290387f4daa74..91f3d20a865a1 100644 --- a/api_docs/kbn_repo_path.mdx +++ b/api_docs/kbn_repo_path.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-path title: "@kbn/repo-path" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-path plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-path'] --- import kbnRepoPathObj from './kbn_repo_path.devdocs.json'; diff --git a/api_docs/kbn_repo_source_classifier.mdx b/api_docs/kbn_repo_source_classifier.mdx index a03d75f56412a..7afc4abc1bcd4 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-source-classifier'] --- import kbnRepoSourceClassifierObj from './kbn_repo_source_classifier.devdocs.json'; diff --git a/api_docs/kbn_reporting_common.mdx b/api_docs/kbn_reporting_common.mdx index c19db7809d3b7..a7e928c3cb5b2 100644 --- a/api_docs/kbn_reporting_common.mdx +++ b/api_docs/kbn_reporting_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-common title: "@kbn/reporting-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-common plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-common'] --- import kbnReportingCommonObj from './kbn_reporting_common.devdocs.json'; diff --git a/api_docs/kbn_rison.mdx b/api_docs/kbn_rison.mdx index b3e4cca132d1b..a88a712b7035a 100644 --- a/api_docs/kbn_rison.mdx +++ b/api_docs/kbn_rison.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rison title: "@kbn/rison" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rison plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_rrule.mdx b/api_docs/kbn_rrule.mdx index 14b9da54b7fa5..c883e544976b9 100644 --- a/api_docs/kbn_rrule.mdx +++ b/api_docs/kbn_rrule.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rrule title: "@kbn/rrule" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rrule plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rrule'] --- import kbnRruleObj from './kbn_rrule.devdocs.json'; diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index 771a0fd94e41f..8560e655734af 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils'] --- import kbnRuleDataUtilsObj from './kbn_rule_data_utils.devdocs.json'; diff --git a/api_docs/kbn_saved_objects_settings.mdx b/api_docs/kbn_saved_objects_settings.mdx index 1043c58ac899c..7d4a45d7a0f24 100644 --- a/api_docs/kbn_saved_objects_settings.mdx +++ b/api_docs/kbn_saved_objects_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-saved-objects-settings title: "@kbn/saved-objects-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/saved-objects-settings plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/saved-objects-settings'] --- import kbnSavedObjectsSettingsObj from './kbn_saved_objects_settings.devdocs.json'; diff --git a/api_docs/kbn_security_solution_side_nav.mdx b/api_docs/kbn_security_solution_side_nav.mdx index 82eb58c837908..e7c6182156514 100644 --- a/api_docs/kbn_security_solution_side_nav.mdx +++ b/api_docs/kbn_security_solution_side_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-side-nav title: "@kbn/security-solution-side-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-side-nav plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-side-nav'] --- import kbnSecuritySolutionSideNavObj from './kbn_security_solution_side_nav.devdocs.json'; diff --git a/api_docs/kbn_security_solution_storybook_config.mdx b/api_docs/kbn_security_solution_storybook_config.mdx index 1893a0d42367f..256fe41d6f6f6 100644 --- a/api_docs/kbn_security_solution_storybook_config.mdx +++ b/api_docs/kbn_security_solution_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-storybook-config title: "@kbn/security-solution-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-storybook-config plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-storybook-config'] --- import kbnSecuritySolutionStorybookConfigObj from './kbn_security_solution_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index 6204b81b1b2a2..b233848467b3b 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-autocomplete'] --- import kbnSecuritysolutionAutocompleteObj from './kbn_securitysolution_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_data_table.mdx b/api_docs/kbn_securitysolution_data_table.mdx index 925099977dda9..a39495bd6dbdd 100644 --- a/api_docs/kbn_securitysolution_data_table.mdx +++ b/api_docs/kbn_securitysolution_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-data-table title: "@kbn/securitysolution-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-data-table plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-data-table'] --- import kbnSecuritysolutionDataTableObj from './kbn_securitysolution_data_table.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_ecs.mdx b/api_docs/kbn_securitysolution_ecs.mdx index 7a217de5eeb0d..9e020f073ec70 100644 --- a/api_docs/kbn_securitysolution_ecs.mdx +++ b/api_docs/kbn_securitysolution_ecs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-ecs title: "@kbn/securitysolution-ecs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-ecs plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-ecs'] --- import kbnSecuritysolutionEcsObj from './kbn_securitysolution_ecs.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_es_utils.mdx b/api_docs/kbn_securitysolution_es_utils.mdx index f2fc474f6e654..d589b2465fe0c 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: 2023-07-08 +date: 2023-07-10 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 d242c8d71ec14..a16990e3449d9 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: 2023-07-08 +date: 2023-07-10 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_grouping.mdx b/api_docs/kbn_securitysolution_grouping.mdx index c126483358ee9..ed9050222c8ef 100644 --- a/api_docs/kbn_securitysolution_grouping.mdx +++ b/api_docs/kbn_securitysolution_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-grouping title: "@kbn/securitysolution-grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-grouping plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-grouping'] --- import kbnSecuritysolutionGroupingObj from './kbn_securitysolution_grouping.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index a8cb5658d47a9..6942a1bfaf245 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: 2023-07-08 +date: 2023-07-10 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 4cfa7ce256b64..5d51d9a06873d 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: 2023-07-08 +date: 2023-07-10 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 030229020973e..5032c7e3c12b4 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: 2023-07-08 +date: 2023-07-10 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 c00d3cfb82173..08c99d0a37c3c 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: 2023-07-08 +date: 2023-07-10 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 7ad219e45765d..71b5d9e219d53 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: 2023-07-08 +date: 2023-07-10 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 5c517bba59813..c7198d5b6a1fe 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: 2023-07-08 +date: 2023-07-10 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 73536e7067a62..23a29b5426786 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: 2023-07-08 +date: 2023-07-10 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 33704a92dfde3..ce4f1a30e283e 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: 2023-07-08 +date: 2023-07-10 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 43e072a666938..b480cb2ceaafe 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: 2023-07-08 +date: 2023-07-10 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 8016044fa59fa..9807141ff73b6 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: 2023-07-08 +date: 2023-07-10 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 50bbf2707081a..3c011fa126259 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: 2023-07-08 +date: 2023-07-10 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 2c08bd198521b..0b26baccca686 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: 2023-07-08 +date: 2023-07-10 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 774aeb2dd0726..42342cd7b473a 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: 2023-07-08 +date: 2023-07-10 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 f0994bf964d69..6214fb4d38e99 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_serverless_project_switcher.mdx b/api_docs/kbn_serverless_project_switcher.mdx index 51ec54f4c12d4..479f3ba4e1403 100644 --- a/api_docs/kbn_serverless_project_switcher.mdx +++ b/api_docs/kbn_serverless_project_switcher.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-project-switcher title: "@kbn/serverless-project-switcher" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-project-switcher plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-project-switcher'] --- import kbnServerlessProjectSwitcherObj from './kbn_serverless_project_switcher.devdocs.json'; diff --git a/api_docs/kbn_serverless_storybook_config.mdx b/api_docs/kbn_serverless_storybook_config.mdx index 3794e56bd3ae0..d42b36111f288 100644 --- a/api_docs/kbn_serverless_storybook_config.mdx +++ b/api_docs/kbn_serverless_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-storybook-config title: "@kbn/serverless-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-storybook-config plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-storybook-config'] --- import kbnServerlessStorybookConfigObj from './kbn_serverless_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_svg.mdx b/api_docs/kbn_shared_svg.mdx index 61e0183bc4acb..52fa3345ec894 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: 2023-07-08 +date: 2023-07-10 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 708bd468639f7..63b17b41469d6 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: 2023-07-08 +date: 2023-07-10 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 00f42d1e1b386..333d8709c8ea3 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: 2023-07-08 +date: 2023-07-10 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 f6c7665c3c4c7..f351dbe7ee6ea 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: 2023-07-08 +date: 2023-07-10 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 767e8a1238f46..e43d44e812a1a 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: 2023-07-08 +date: 2023-07-10 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 42ef0321a6577..3152afc80154c 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: 2023-07-08 +date: 2023-07-10 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 74b75aa606227..b07378a3bf27b 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: 2023-07-08 +date: 2023-07-10 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 87fd8a4118286..13db6499d4570 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: 2023-07-08 +date: 2023-07-10 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_chrome_navigation.mdx b/api_docs/kbn_shared_ux_chrome_navigation.mdx index 1c26efb10bbc2..7af8cc9b1bf15 100644 --- a/api_docs/kbn_shared_ux_chrome_navigation.mdx +++ b/api_docs/kbn_shared_ux_chrome_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-chrome-navigation title: "@kbn/shared-ux-chrome-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-chrome-navigation plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-chrome-navigation'] --- import kbnSharedUxChromeNavigationObj from './kbn_shared_ux_chrome_navigation.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_context.mdx b/api_docs/kbn_shared_ux_file_context.mdx index 4b2f134b41f6e..4bdfcd2d6660d 100644 --- a/api_docs/kbn_shared_ux_file_context.mdx +++ b/api_docs/kbn_shared_ux_file_context.mdx @@ -8,7 +8,7 @@ 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-context'] --- import kbnSharedUxFileContextObj from './kbn_shared_ux_file_context.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image.mdx b/api_docs/kbn_shared_ux_file_image.mdx index 532453dffe9f0..dbab5c982e0a4 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: 2023-07-08 +date: 2023-07-10 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 383714596336b..fc82cb703a21d 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: 2023-07-08 +date: 2023-07-10 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.mdx b/api_docs/kbn_shared_ux_file_mocks.mdx index 7ff762b818d23..9c943e965f381 100644 --- a/api_docs/kbn_shared_ux_file_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_mocks.mdx @@ -8,7 +8,7 @@ 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-mocks'] --- import kbnSharedUxFileMocksObj from './kbn_shared_ux_file_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_picker.mdx b/api_docs/kbn_shared_ux_file_picker.mdx index da3d477892aa2..b317eabb2604e 100644 --- a/api_docs/kbn_shared_ux_file_picker.mdx +++ b/api_docs/kbn_shared_ux_file_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-picker title: "@kbn/shared-ux-file-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-picker plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-picker'] --- import kbnSharedUxFilePickerObj from './kbn_shared_ux_file_picker.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_types.mdx b/api_docs/kbn_shared_ux_file_types.mdx index 255c7df608ab7..6d8b6c7496934 100644 --- a/api_docs/kbn_shared_ux_file_types.mdx +++ b/api_docs/kbn_shared_ux_file_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-types title: "@kbn/shared-ux-file-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-types plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-types'] --- import kbnSharedUxFileTypesObj from './kbn_shared_ux_file_types.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_upload.mdx b/api_docs/kbn_shared_ux_file_upload.mdx index 72e4392d5c086..8bea015710619 100644 --- a/api_docs/kbn_shared_ux_file_upload.mdx +++ b/api_docs/kbn_shared_ux_file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-upload title: "@kbn/shared-ux-file-upload" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-upload plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-upload'] --- import kbnSharedUxFileUploadObj from './kbn_shared_ux_file_upload.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_util.mdx b/api_docs/kbn_shared_ux_file_util.mdx index 5d81db54b03ab..75d691d45f5b1 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-util'] --- import kbnSharedUxFileUtilObj from './kbn_shared_ux_file_util.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app.mdx b/api_docs/kbn_shared_ux_link_redirect_app.mdx index b77f04b06e014..d049361023c9c 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: 2023-07-08 +date: 2023-07-10 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 8350581e03d16..686acf85baf9a 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: 2023-07-08 +date: 2023-07-10 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 44643989178c2..64879298bb9b4 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: 2023-07-08 +date: 2023-07-10 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 8c4e76cdb8782..4c4be123e6c0b 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: 2023-07-08 +date: 2023-07-10 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 911007a80a4e5..bc2778e059928 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: 2023-07-08 +date: 2023-07-10 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 2af624ee62230..2cf7764830fee 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: 2023-07-08 +date: 2023-07-10 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 eab2f83e3641f..fa7efeea9cc6d 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: 2023-07-08 +date: 2023-07-10 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 7356e1dce3d70..25f50c1eed25a 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: 2023-07-08 +date: 2023-07-10 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 15ff05007f791..9c4b8c692b199 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: 2023-07-08 +date: 2023-07-10 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 3ef9b6faba8e2..9fcf9438ace29 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: 2023-07-08 +date: 2023-07-10 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 479a005ca114f..6c0254123c421 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: 2023-07-08 +date: 2023-07-10 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 a268d0c98da9c..45a0f11253180 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: 2023-07-08 +date: 2023-07-10 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 a929faed0abde..b4a2c5b33e9c6 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: 2023-07-08 +date: 2023-07-10 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 def5348425220..71d64c3b43c79 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: 2023-07-08 +date: 2023-07-10 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 e7fa67e07329a..ca0ed39bcbc55 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: 2023-07-08 +date: 2023-07-10 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 37becfe01b0fa..f1dac7b638abb 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: 2023-07-08 +date: 2023-07-10 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 41273c69d72f3..49b7fdc97d2c8 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: 2023-07-08 +date: 2023-07-10 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_prompt_not_found.mdx b/api_docs/kbn_shared_ux_prompt_not_found.mdx index a77d7e3f12f35..b7d248104c82c 100644 --- a/api_docs/kbn_shared_ux_prompt_not_found.mdx +++ b/api_docs/kbn_shared_ux_prompt_not_found.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-not-found title: "@kbn/shared-ux-prompt-not-found" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-not-found plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-not-found'] --- import kbnSharedUxPromptNotFoundObj from './kbn_shared_ux_prompt_not_found.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router.mdx b/api_docs/kbn_shared_ux_router.mdx index bb8e014b5a68a..52635fba9d836 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: 2023-07-08 +date: 2023-07-10 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 1533a77bd1735..6473f0250390b 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: 2023-07-08 +date: 2023-07-10 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 ad234683bb2c2..78e36276ebfb1 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: 2023-07-08 +date: 2023-07-10 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 a60cf50a60948..0fc4d6e719166 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: 2023-07-08 +date: 2023-07-10 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 3d2223fb65950..a5b9c74ae5507 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-utility'] --- import kbnSharedUxUtilityObj from './kbn_shared_ux_utility.devdocs.json'; diff --git a/api_docs/kbn_slo_schema.mdx b/api_docs/kbn_slo_schema.mdx index d89cc2e99bf10..e0d3bdd7719e8 100644 --- a/api_docs/kbn_slo_schema.mdx +++ b/api_docs/kbn_slo_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-slo-schema title: "@kbn/slo-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/slo-schema plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/slo-schema'] --- import kbnSloSchemaObj from './kbn_slo_schema.devdocs.json'; diff --git a/api_docs/kbn_some_dev_log.mdx b/api_docs/kbn_some_dev_log.mdx index 725b5facfa550..9d308c6ab5806 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log'] --- import kbnSomeDevLogObj from './kbn_some_dev_log.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index ca780fc674d53..397e82c531150 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: 2023-07-08 +date: 2023-07-10 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 a7180051ad2a0..93a47d7b3cc5f 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: 2023-07-08 +date: 2023-07-10 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 cbd090cc39b6e..339c4f854875e 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: 2023-07-08 +date: 2023-07-10 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 437d257e365d3..942e5e1cd63be 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: 2023-07-08 +date: 2023-07-10 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 9e67b5d12df4b..1161d7e485739 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: 2023-07-08 +date: 2023-07-10 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 376822c01a9f0..fd6ea6b50bf8a 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: 2023-07-08 +date: 2023-07-10 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 2e3106a5fd65a..091b8ee357c79 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_text_based_editor.mdx b/api_docs/kbn_text_based_editor.mdx index 869f0eaef8943..32d156c103669 100644 --- a/api_docs/kbn_text_based_editor.mdx +++ b/api_docs/kbn_text_based_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-text-based-editor title: "@kbn/text-based-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/text-based-editor plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/text-based-editor'] --- import kbnTextBasedEditorObj from './kbn_text_based_editor.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index a9ff762c2beb3..7d902ba8a19c5 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_ts_projects.mdx b/api_docs/kbn_ts_projects.mdx index 753e7aba8031c..2cbf067c267f9 100644 --- a/api_docs/kbn_ts_projects.mdx +++ b/api_docs/kbn_ts_projects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ts-projects title: "@kbn/ts-projects" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ts-projects plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ts-projects'] --- import kbnTsProjectsObj from './kbn_ts_projects.devdocs.json'; diff --git a/api_docs/kbn_typed_react_router_config.mdx b/api_docs/kbn_typed_react_router_config.mdx index 06fee10504ff0..f8a8aec5142cd 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: 2023-07-08 +date: 2023-07-10 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_actions_browser.mdx b/api_docs/kbn_ui_actions_browser.mdx index 8f6d5a370d47d..bae5b891979e8 100644 --- a/api_docs/kbn_ui_actions_browser.mdx +++ b/api_docs/kbn_ui_actions_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-actions-browser title: "@kbn/ui-actions-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-actions-browser plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-actions-browser'] --- import kbnUiActionsBrowserObj from './kbn_ui_actions_browser.devdocs.json'; diff --git a/api_docs/kbn_ui_shared_deps_src.mdx b/api_docs/kbn_ui_shared_deps_src.mdx index 4e850df92c23d..a211ce5c6ae0f 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: 2023-07-08 +date: 2023-07-10 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 ca548daf6be6d..f04360f74b699 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] --- import kbnUiThemeObj from './kbn_ui_theme.devdocs.json'; diff --git a/api_docs/kbn_unified_field_list.mdx b/api_docs/kbn_unified_field_list.mdx index 40d574439cc54..c1bb11232959f 100644 --- a/api_docs/kbn_unified_field_list.mdx +++ b/api_docs/kbn_unified_field_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-field-list title: "@kbn/unified-field-list" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-field-list plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-field-list'] --- import kbnUnifiedFieldListObj from './kbn_unified_field_list.devdocs.json'; diff --git a/api_docs/kbn_url_state.mdx b/api_docs/kbn_url_state.mdx index 41066929eb868..95e961a127037 100644 --- a/api_docs/kbn_url_state.mdx +++ b/api_docs/kbn_url_state.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-url-state title: "@kbn/url-state" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/url-state plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/url-state'] --- import kbnUrlStateObj from './kbn_url_state.devdocs.json'; diff --git a/api_docs/kbn_user_profile_components.mdx b/api_docs/kbn_user_profile_components.mdx index 7678aecd438ae..308f26075acdf 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: 2023-07-08 +date: 2023-07-10 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 6c430f335691f..19bb120f2a830 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: 2023-07-08 +date: 2023-07-10 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 e4092d693546e..c0661dd11e928 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: 2023-07-08 +date: 2023-07-10 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 e0e26aa287a8e..2ecacc3068b46 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: 2023-07-08 +date: 2023-07-10 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 0296a40602c62..dea0be11f7527 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: 2023-07-08 +date: 2023-07-10 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 9b324ca724873..3c8fd6fb646dd 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: 2023-07-08 +date: 2023-07-10 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 82fc525de4d19..29b895e76f1cc 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: 2023-07-08 +date: 2023-07-10 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 c81a85e99e2ca..6635651547dec 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: 2023-07-08 +date: 2023-07-10 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 4e69842a8067c..13955a7273350 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity'] --- import kubernetesSecurityObj from './kubernetes_security.devdocs.json'; diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index ed0914edbff0b..b3c847e6bdc8f 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lens'] --- import lensObj from './lens.devdocs.json'; diff --git a/api_docs/license_api_guard.mdx b/api_docs/license_api_guard.mdx index 7a609d07012d0..e63ffe6ecf3f0 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: 2023-07-08 +date: 2023-07-10 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 7a7c3d0327daf..fffbec7dc704a 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: 2023-07-08 +date: 2023-07-10 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 fa173c81d4af6..93a27baa883a5 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: 2023-07-08 +date: 2023-07-10 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 1f0b3f11174fe..d6ad136210732 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/logs_shared.mdx b/api_docs/logs_shared.mdx index c3cfe8176450a..73c5d7b4473f7 100644 --- a/api_docs/logs_shared.mdx +++ b/api_docs/logs_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsShared title: "logsShared" image: https://source.unsplash.com/400x175/?github description: API docs for the logsShared plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsShared'] --- import logsSharedObj from './logs_shared.devdocs.json'; diff --git a/api_docs/management.mdx b/api_docs/management.mdx index 7b8c87f7f8c75..6e79e3fe46429 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'management'] --- import managementObj from './management.devdocs.json'; diff --git a/api_docs/maps.mdx b/api_docs/maps.mdx index 0b845deb46dbe..d4bd710d62b5f 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'maps'] --- import mapsObj from './maps.devdocs.json'; diff --git a/api_docs/maps_ems.mdx b/api_docs/maps_ems.mdx index fdcdb2501ff62..ed94d08e2a311 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: 2023-07-08 +date: 2023-07-10 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 842a973fd5130..8e844f1457bd4 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: 2023-07-08 +date: 2023-07-10 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 1d1f5e77a97ec..e62a4565f5f47 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: 2023-07-08 +date: 2023-07-10 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 5823f18c90763..9434a2ab4854e 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: 2023-07-08 +date: 2023-07-10 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 c0858ffddb7aa..cc989ea2da75e 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: 2023-07-08 +date: 2023-07-10 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 ddbee2dd2c812..462b12b795920 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: 2023-07-08 +date: 2023-07-10 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 4f819eebe6475..4e5940eb8c9a4 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'notifications'] --- import notificationsObj from './notifications.devdocs.json'; diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index 3ed6f82085c4a..bf3a0bac7bb8b 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx index b5ee693f8b88f..b4da00221ea88 100644 --- a/api_docs/observability_onboarding.mdx +++ b/api_docs/observability_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityOnboarding title: "observabilityOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityOnboarding plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityOnboarding'] --- import observabilityOnboardingObj from './observability_onboarding.devdocs.json'; diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx index 9949e526b9c21..bcd253ff3fdca 100644 --- a/api_docs/observability_shared.mdx +++ b/api_docs/observability_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityShared title: "observabilityShared" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityShared plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityShared'] --- import observabilitySharedObj from './observability_shared.devdocs.json'; diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index 5ae6a76493325..1b360d5a3e84b 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: 2023-07-08 +date: 2023-07-10 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 269888cfcfe36..599870303f902 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index dd47a813379f8..db5e15a4d69b4 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: 2023-07-08 +date: 2023-07-10 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 6f94f54a075ff..ff3cd5f2d1e53 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: 2023-07-08 +date: 2023-07-10 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 bd654cef7c2c5..d9ec795101bff 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: 2023-07-08 +date: 2023-07-10 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 bbfc6a779f045..e2a9948f75789 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'reporting'] --- import reportingObj from './reporting.devdocs.json'; diff --git a/api_docs/reporting_export_types.mdx b/api_docs/reporting_export_types.mdx index 178009b3f4a5d..e76d28c66d403 100644 --- a/api_docs/reporting_export_types.mdx +++ b/api_docs/reporting_export_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/reportingExportTypes title: "reportingExportTypes" image: https://source.unsplash.com/400x175/?github description: API docs for the reportingExportTypes plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'reportingExportTypes'] --- import reportingExportTypesObj from './reporting_export_types.devdocs.json'; diff --git a/api_docs/rollup.mdx b/api_docs/rollup.mdx index df54c1492b5f0..9bb2358377903 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: 2023-07-08 +date: 2023-07-10 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 826b55c6b1bfa..ae85b93b023ad 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: 2023-07-08 +date: 2023-07-10 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 0c01c26af46f1..ec579576bcb23 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: 2023-07-08 +date: 2023-07-10 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 bb823fc81007b..4a51f7ee02bbb 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: 2023-07-08 +date: 2023-07-10 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 7828d296e9b86..b6d50c87e1d92 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: 2023-07-08 +date: 2023-07-10 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 629d23f44ed6e..392444898d40b 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: 2023-07-08 +date: 2023-07-10 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 ef7c3bd9d48dd..0bc0abd572b95 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: 2023-07-08 +date: 2023-07-10 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 a8aa471174cf7..045b2f1b018c6 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: 2023-07-08 +date: 2023-07-10 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 1edf0744de07d..4d57eb16fe987 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: 2023-07-08 +date: 2023-07-10 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 290b04ba63399..ec8017662b0bf 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: 2023-07-08 +date: 2023-07-10 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 4d27c470ff724..888c31c57a549 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: 2023-07-08 +date: 2023-07-10 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 7f1ea7ac7f296..2f5a286410297 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: 2023-07-08 +date: 2023-07-10 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 0e8968375868c..f380c4e9967e7 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.devdocs.json'; diff --git a/api_docs/security_solution_ess.mdx b/api_docs/security_solution_ess.mdx index 7f02f0921fcbc..af5530fee4c26 100644 --- a/api_docs/security_solution_ess.mdx +++ b/api_docs/security_solution_ess.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionEss title: "securitySolutionEss" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionEss plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionEss'] --- import securitySolutionEssObj from './security_solution_ess.devdocs.json'; diff --git a/api_docs/security_solution_serverless.mdx b/api_docs/security_solution_serverless.mdx index 3bee40e126211..ea83f1c5f28fc 100644 --- a/api_docs/security_solution_serverless.mdx +++ b/api_docs/security_solution_serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionServerless title: "securitySolutionServerless" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionServerless plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionServerless'] --- import securitySolutionServerlessObj from './security_solution_serverless.devdocs.json'; diff --git a/api_docs/serverless.mdx b/api_docs/serverless.mdx index 111f9c9206f78..caa8d5d3e7ebf 100644 --- a/api_docs/serverless.mdx +++ b/api_docs/serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverless title: "serverless" image: https://source.unsplash.com/400x175/?github description: API docs for the serverless plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverless'] --- import serverlessObj from './serverless.devdocs.json'; diff --git a/api_docs/serverless_observability.mdx b/api_docs/serverless_observability.mdx index cae5d00166683..3c57c0d8863ec 100644 --- a/api_docs/serverless_observability.mdx +++ b/api_docs/serverless_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessObservability title: "serverlessObservability" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessObservability plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessObservability'] --- import serverlessObservabilityObj from './serverless_observability.devdocs.json'; diff --git a/api_docs/serverless_search.mdx b/api_docs/serverless_search.mdx index ca21b49d89fb9..dbe782bf362fd 100644 --- a/api_docs/serverless_search.mdx +++ b/api_docs/serverless_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessSearch title: "serverlessSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessSearch plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessSearch'] --- import serverlessSearchObj from './serverless_search.devdocs.json'; diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index 2db5b5b03bf46..b21eb60422bac 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: 2023-07-08 +date: 2023-07-10 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 117abf921d805..c207e86bbc4a4 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: 2023-07-08 +date: 2023-07-10 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 e7e7adb7e7724..05b00244acaf6 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: 2023-07-08 +date: 2023-07-10 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 4ad57775d2517..77da9bfe25916 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: 2023-07-08 +date: 2023-07-10 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 df7d12fdd1e51..e9c66c2409d36 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: 2023-07-08 +date: 2023-07-10 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 c8720d3fb8083..c85a4150dc7c7 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: 2023-07-08 +date: 2023-07-10 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 b401c8339112b..bba91c096f8dd 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: 2023-07-08 +date: 2023-07-10 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 25852b7d8a16a..a1f82192a22b5 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: 2023-07-08 +date: 2023-07-10 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 7b97530b0c84f..b16460c3e66ac 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: 2023-07-08 +date: 2023-07-10 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 c9c850b9a8076..5a60b2f4839df 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: 2023-07-08 +date: 2023-07-10 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 ab34318d6a65a..b93d15138b623 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/text_based_languages.mdx b/api_docs/text_based_languages.mdx index eda03701707cc..1d09394e9536e 100644 --- a/api_docs/text_based_languages.mdx +++ b/api_docs/text_based_languages.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/textBasedLanguages title: "textBasedLanguages" image: https://source.unsplash.com/400x175/?github description: API docs for the textBasedLanguages plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'textBasedLanguages'] --- import textBasedLanguagesObj from './text_based_languages.devdocs.json'; diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index 20ffab3fec5cb..956829eb5f683 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'threatIntelligence'] --- import threatIntelligenceObj from './threat_intelligence.devdocs.json'; diff --git a/api_docs/timelines.mdx b/api_docs/timelines.mdx index f797dce5f739d..cf6f744c8c0f9 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: 2023-07-08 +date: 2023-07-10 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 7da5f44155f23..898715fd78148 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: 2023-07-08 +date: 2023-07-10 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 ae7f7bd93a343..e2f15f53e3de4 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: 2023-07-08 +date: 2023-07-10 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 32024a7760ed3..c1d480359a725 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: 2023-07-08 +date: 2023-07-10 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 583f1cc0fde83..abdc4efa825dc 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] --- import uiActionsEnhancedObj from './ui_actions_enhanced.devdocs.json'; diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx index 58b3c4eaa021d..a55c0f330035c 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: 2023-07-08 +date: 2023-07-10 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 7e16fbb1cf99a..77a30e77d1526 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: 2023-07-08 +date: 2023-07-10 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 838ed73533afe..48f517895650e 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: 2023-07-08 +date: 2023-07-10 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 9959b79ed413a..66c3024c84927 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: 2023-07-08 +date: 2023-07-10 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 e371620cf3c57..9e0a077e603cd 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: 2023-07-08 +date: 2023-07-10 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 3407865d07e9d..4c227027aefac 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: 2023-07-08 +date: 2023-07-10 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 793daac1e4e79..d38a6234df1d4 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: 2023-07-08 +date: 2023-07-10 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 85df238e8d955..a89b1f8f0f7a4 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: 2023-07-08 +date: 2023-07-10 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 4c6e65ce1f36e..68bc3e18e1b17 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: 2023-07-08 +date: 2023-07-10 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 fc3bb820e3724..715bdd9dae84e 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: 2023-07-08 +date: 2023-07-10 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 29fb8476454a8..803ad7629c58f 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: 2023-07-08 +date: 2023-07-10 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 d72d7238c9e68..58f36f9747a18 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: 2023-07-08 +date: 2023-07-10 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 d482d02ec9d12..4fd846616d9c6 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: 2023-07-08 +date: 2023-07-10 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 226d01513aca7..af7fa82f993ee 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: 2023-07-08 +date: 2023-07-10 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 95de8f9cb1615..59028d9371f0f 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: 2023-07-08 +date: 2023-07-10 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 6890571b16748..88ba7a285d137 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] --- import visTypeXyObj from './vis_type_xy.devdocs.json'; diff --git a/api_docs/visualization_ui_components.mdx b/api_docs/visualization_ui_components.mdx index 34165e8addc1c..c445b81d09fc7 100644 --- a/api_docs/visualization_ui_components.mdx +++ b/api_docs/visualization_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visualizationUiComponents title: "visualizationUiComponents" image: https://source.unsplash.com/400x175/?github description: API docs for the visualizationUiComponents plugin -date: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizationUiComponents'] --- import visualizationUiComponentsObj from './visualization_ui_components.devdocs.json'; diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index b95e3ac4a4c5b..7a8637b83fcb9 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: 2023-07-08 +date: 2023-07-10 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; diff --git a/examples/guided_onboarding_example/public/components/main.tsx b/examples/guided_onboarding_example/public/components/main.tsx index d5f1febccfbce..ba434c0c4c86b 100644 --- a/examples/guided_onboarding_example/public/components/main.tsx +++ b/examples/guided_onboarding_example/public/components/main.tsx @@ -18,8 +18,8 @@ import { EuiFlexItem, EuiFormRow, EuiHorizontalRule, - EuiPageContentBody_Deprecated as EuiPageContentBody, - EuiPageContentHeader_Deprecated as EuiPageContentHeader, + EuiPageSection, + EuiPageHeader, EuiSelect, EuiSpacer, EuiText, @@ -149,7 +149,7 @@ export const Main = (props: MainProps) => { return ( <> - +

{ />

-
- + +

{ - + ); }; diff --git a/examples/guided_onboarding_example/public/components/step_four.tsx b/examples/guided_onboarding_example/public/components/step_four.tsx index b100af719e017..44c238b417fa2 100644 --- a/examples/guided_onboarding_example/public/components/step_four.tsx +++ b/examples/guided_onboarding_example/public/components/step_four.tsx @@ -12,11 +12,7 @@ import { EuiButton, EuiSpacer, EuiText, EuiTitle } from '@elastic/eui'; import { GuidedOnboardingPluginStart } from '@kbn/guided-onboarding-plugin/public/types'; import { FormattedMessage } from '@kbn/i18n-react'; -import { - EuiPageContentHeader_Deprecated as EuiPageContentHeader, - EuiPageContentBody_Deprecated as EuiPageContentBody, - EuiCode, -} from '@elastic/eui'; +import { EuiPageHeader, EuiPageSection, EuiCode } from '@elastic/eui'; import { useParams } from 'react-router-dom'; interface StepFourProps { @@ -41,7 +37,7 @@ export const StepFour: React.FC = ({ return ( <> - +

= ({ />

-
- + +

= ({ > Complete step 4 - + ); }; diff --git a/examples/guided_onboarding_example/public/components/step_one.tsx b/examples/guided_onboarding_example/public/components/step_one.tsx index 632b902e14a3e..924f4a3952dda 100644 --- a/examples/guided_onboarding_example/public/components/step_one.tsx +++ b/examples/guided_onboarding_example/public/components/step_one.tsx @@ -13,8 +13,8 @@ import { EuiText, EuiTourStep, EuiTitle, - EuiPageContentHeader_Deprecated as EuiPageContentHeader, - EuiPageContentBody_Deprecated as EuiPageContentBody, + EuiPageHeader, + EuiPageSection, EuiSpacer, EuiCode, EuiFieldText, @@ -46,7 +46,7 @@ export const StepOne = ({ guidedOnboarding }: GuidedOnboardingExampleAppDeps) => }, [isTourActive]); return ( <> - +

/>

- - + +

- + ); }; diff --git a/examples/guided_onboarding_example/public/components/step_three.tsx b/examples/guided_onboarding_example/public/components/step_three.tsx index eefb38165beed..1d552d4ee28ca 100644 --- a/examples/guided_onboarding_example/public/components/step_three.tsx +++ b/examples/guided_onboarding_example/public/components/step_three.tsx @@ -12,10 +12,7 @@ import { EuiButton, EuiSpacer, EuiText, EuiTitle, EuiTourStep } from '@elastic/e import { GuidedOnboardingPluginStart } from '@kbn/guided-onboarding-plugin/public/types'; import { FormattedMessage } from '@kbn/i18n-react'; -import { - EuiPageContentHeader_Deprecated as EuiPageContentHeader, - EuiPageContentBody_Deprecated as EuiPageContentBody, -} from '@elastic/eui'; +import { EuiPageHeader, EuiPageSection } from '@elastic/eui'; interface StepThreeProps { guidedOnboarding: GuidedOnboardingPluginStart; @@ -39,7 +36,7 @@ export const StepThree = (props: StepThreeProps) => { return ( <> - +

{ />

- - + +

{ Complete step 3 - + ); }; diff --git a/examples/guided_onboarding_example/public/components/step_two.tsx b/examples/guided_onboarding_example/public/components/step_two.tsx index 89c0c37e46e4a..274e2a82a7a2b 100644 --- a/examples/guided_onboarding_example/public/components/step_two.tsx +++ b/examples/guided_onboarding_example/public/components/step_two.tsx @@ -11,15 +11,12 @@ import React from 'react'; import { EuiText, EuiTitle } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; -import { - EuiPageContentHeader_Deprecated as EuiPageContentHeader, - EuiPageContentBody_Deprecated as EuiPageContentBody, -} from '@elastic/eui'; +import { EuiPageHeader, EuiPageSection } from '@elastic/eui'; export const StepTwo = () => { return ( <> - +

{ />

- - + +

{ />

-
+
); }; diff --git a/examples/unified_field_list_examples/kibana.jsonc b/examples/unified_field_list_examples/kibana.jsonc index 1ac93f31894fc..4348fa1280144 100644 --- a/examples/unified_field_list_examples/kibana.jsonc +++ b/examples/unified_field_list_examples/kibana.jsonc @@ -17,7 +17,8 @@ "dataViews", "dataViewFieldEditor", "charts", - "fieldFormats" + "fieldFormats", + "uiActions" ] } } diff --git a/examples/unified_field_list_examples/public/application.tsx b/examples/unified_field_list_examples/public/application.tsx index cb5428c2085f7..9a332d3b89bf7 100644 --- a/examples/unified_field_list_examples/public/application.tsx +++ b/examples/unified_field_list_examples/public/application.tsx @@ -9,6 +9,7 @@ import React from 'react'; import ReactDOM from 'react-dom'; import { I18nProvider } from '@kbn/i18n-react'; +import { CoreThemeProvider } from '@kbn/core-theme-browser-internal'; import type { AppMountParameters, CoreStart } from '@kbn/core/public'; import { AppPluginStartDependencies } from './types'; import { UnifiedFieldListExampleApp } from './example_app'; @@ -16,17 +17,18 @@ import { UnifiedFieldListExampleApp } from './example_app'; export const renderApp = ( core: CoreStart, deps: AppPluginStartDependencies, - { element }: AppMountParameters + { element, theme$ }: AppMountParameters ) => { ReactDOM.render( - + + + , element ); diff --git a/examples/unified_field_list_examples/public/example_app.tsx b/examples/unified_field_list_examples/public/example_app.tsx index 9c73c204a02c9..0f32a20ed4b41 100644 --- a/examples/unified_field_list_examples/public/example_app.tsx +++ b/examples/unified_field_list_examples/public/example_app.tsx @@ -7,13 +7,11 @@ */ import React, { useCallback, useEffect, useState } from 'react'; -import { css } from '@emotion/react'; import { EuiFlexGroup, EuiFlexItem, EuiPage, EuiPageBody, - EuiPageSidebar, EuiTitle, EuiEmptyPrompt, EuiLoadingLogo, @@ -38,7 +36,7 @@ export const UnifiedFieldListExampleApp: React.FC(); const [selectedFieldNames, setSelectedFieldNames] = useState([]); - const onAddFieldToWorkplace = useCallback( + const onAddFieldToWorkspace = useCallback( (field: DataViewField) => { setSelectedFieldNames((names) => [...names, field.name]); }, @@ -124,20 +122,13 @@ export const UnifiedFieldListExampleApp: React.FC - - - + diff --git a/examples/unified_field_list_examples/public/field_list_item.tsx b/examples/unified_field_list_examples/public/field_list_item.tsx deleted file mode 100644 index 453bc1a0adef1..0000000000000 --- a/examples/unified_field_list_examples/public/field_list_item.tsx +++ /dev/null @@ -1,225 +0,0 @@ -/* - * Copyright 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. - */ - -/* - * Copyright 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, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; -import type { DataViewField, DataView } from '@kbn/data-views-plugin/common'; -import { DragDrop } from '@kbn/dom-drag-drop'; -import { - AddFieldFilterHandler, - FieldItemButton, - FieldItemButtonProps, - FieldPopover, - FieldPopoverHeader, - FieldsGroupNames, - FieldStats, - hasQuerySubscriberData, - RenderFieldItemParams, - useQuerySubscriber, -} from '@kbn/unified-field-list'; -import { generateFilters } from '@kbn/data-plugin/public'; -import type { CoreStart } from '@kbn/core-lifecycle-browser'; -import type { AppPluginStartDependencies } from './types'; - -export interface FieldListItemProps extends RenderFieldItemParams { - dataView: DataView; - services: AppPluginStartDependencies & { - core: CoreStart; - uiSettings: CoreStart['uiSettings']; - }; - isSelected: boolean; - onAddFieldToWorkspace: FieldItemButtonProps['onAddFieldToWorkspace']; - onRemoveFieldFromWorkspace: FieldItemButtonProps['onRemoveFieldFromWorkspace']; - onRefreshFields: () => void; -} - -export function FieldListItem({ - dataView, - services, - isSelected, - field, - fieldSearchHighlight, - groupIndex, - groupName, - itemIndex, - hideDetails, - onRefreshFields, - onAddFieldToWorkspace, - onRemoveFieldFromWorkspace, -}: FieldListItemProps) { - const { dataViewFieldEditor, data } = services; - const querySubscriberResult = useQuerySubscriber({ data, listenToSearchSessionUpdates: false }); // this example app does not use search sessions - const filterManager = data?.query?.filterManager; - const [infoIsOpen, setOpen] = useState(false); - - const togglePopover = useCallback(() => { - setOpen((value) => !value); - }, [setOpen]); - - const closePopover = useCallback(() => { - setOpen(false); - }, [setOpen]); - - const closeFieldEditor = useRef<() => void | undefined>(); - const setFieldEditorRef = useCallback((ref: () => void | undefined) => { - closeFieldEditor.current = ref; - }, []); - - const value = useMemo( - () => ({ - id: field.name, - humanData: { label: field.displayName || field.name }, - }), - [field] - ); - - const order = useMemo(() => [0, groupIndex, itemIndex], [groupIndex, itemIndex]); - - const addFilterAndClose: AddFieldFilterHandler | undefined = useMemo( - () => - filterManager && dataView - ? (clickedField, values, operation) => { - closePopover(); - const newFilters = generateFilters( - filterManager, - clickedField, - values, - operation, - dataView - ); - filterManager.addFilters(newFilters); - } - : undefined, - [dataView, filterManager, closePopover] - ); - - const editFieldAndClose = useMemo( - () => - dataView - ? (fieldName?: string) => { - const ref = dataViewFieldEditor.openEditor({ - ctx: { - dataView, - }, - fieldName, - onSave: async () => { - onRefreshFields(); - }, - }); - if (setFieldEditorRef) { - setFieldEditorRef(ref); - } - closePopover(); - } - : undefined, - [dataViewFieldEditor, dataView, setFieldEditorRef, closePopover, onRefreshFields] - ); - - const removeFieldAndClose = useMemo( - () => - dataView - ? async (fieldName: string) => { - const ref = dataViewFieldEditor.openDeleteModal({ - ctx: { - dataView, - }, - fieldName, - onDelete: async () => { - onRefreshFields(); - }, - }); - if (setFieldEditorRef) { - setFieldEditorRef(ref); - } - closePopover(); - } - : undefined, - [dataView, setFieldEditorRef, closePopover, dataViewFieldEditor, onRefreshFields] - ); - - useEffect(() => { - const cleanup = () => { - if (closeFieldEditor?.current) { - closeFieldEditor?.current(); - } - }; - return () => { - // Make sure to close the editor when unmounting - cleanup(); - }; - }, []); - - return ( -
  • - - - - } - renderHeader={() => { - return ( - - ); - }} - renderContent={ - !hideDetails - ? () => ( - <> - {hasQuerySubscriberData(querySubscriberResult) && ( - - )} - - ) - : undefined - } - /> -
  • - ); -} diff --git a/examples/unified_field_list_examples/public/field_list_sidebar.tsx b/examples/unified_field_list_examples/public/field_list_sidebar.tsx index eb619edf939cd..6d2364a3a5613 100644 --- a/examples/unified_field_list_examples/public/field_list_sidebar.tsx +++ b/examples/unified_field_list_examples/public/field_list_sidebar.tsx @@ -14,114 +14,86 @@ * Side Public License, v 1. */ -import React, { useCallback, useContext, useMemo } from 'react'; -import type { DataView, DataViewField } from '@kbn/data-views-plugin/public'; +import React, { useCallback, useContext, useMemo, useRef } from 'react'; +import type { DataView } from '@kbn/data-views-plugin/public'; +import { generateFilters } from '@kbn/data-plugin/public'; import { ChildDragDropProvider, DragContext } from '@kbn/dom-drag-drop'; import { - FieldList, - FieldListFilters, - FieldListGrouped, - FieldListGroupedProps, - FieldsGroupNames, - useExistingFieldsFetcher, - useGroupedFields, - useQuerySubscriber, + UnifiedFieldListSidebarContainer, + type UnifiedFieldListSidebarContainerProps, + type UnifiedFieldListSidebarContainerApi, + type AddFieldFilterHandler, } from '@kbn/unified-field-list'; -import { FieldListItem, FieldListItemProps } from './field_list_item'; +import { type CoreStart } from '@kbn/core-lifecycle-browser'; +import { PLUGIN_ID } from '../common'; +import { type AppPluginStartDependencies } from './types'; + +const getCreationOptions: UnifiedFieldListSidebarContainerProps['getCreationOptions'] = () => { + return { + originatingApp: PLUGIN_ID, + localStorageKeyPrefix: 'examples', + timeRangeUpdatesType: 'timefilter', + disablePopularFields: true, + }; +}; export interface FieldListSidebarProps { dataView: DataView; selectedFieldNames: string[]; - services: FieldListItemProps['services']; - onAddFieldToWorkplace: FieldListItemProps['onAddFieldToWorkspace']; - onRemoveFieldFromWorkspace: FieldListItemProps['onRemoveFieldFromWorkspace']; + services: AppPluginStartDependencies & { + core: CoreStart; + }; + onAddFieldToWorkspace: UnifiedFieldListSidebarContainerProps['onAddFieldToWorkspace']; + onRemoveFieldFromWorkspace: UnifiedFieldListSidebarContainerProps['onRemoveFieldFromWorkspace']; } export const FieldListSidebar: React.FC = ({ dataView, selectedFieldNames, services, - onAddFieldToWorkplace, + onAddFieldToWorkspace, onRemoveFieldFromWorkspace, }) => { const dragDropContext = useContext(DragContext); - const allFields = dataView.fields; - const activeDataViews = useMemo(() => [dataView], [dataView]); - const querySubscriberResult = useQuerySubscriber({ - data: services.data, - listenToSearchSessionUpdates: false, // this example app does not use search sessions - }); + const unifiedFieldListContainerRef = useRef(null); + const filterManager = services.data?.query?.filterManager; - const onSelectedFieldFilter = useCallback( - (field: DataViewField) => { - return selectedFieldNames.includes(field.name); - }, - [selectedFieldNames] + const onAddFilter: AddFieldFilterHandler | undefined = useMemo( + () => + filterManager && dataView + ? (clickedField, values, operation) => { + const newFilters = generateFilters( + filterManager, + clickedField, + values, + operation, + dataView + ); + filterManager.addFilters(newFilters); + } + : undefined, + [dataView, filterManager] ); - const { refetchFieldsExistenceInfo, isProcessing } = useExistingFieldsFetcher({ - dataViews: activeDataViews, // if you need field existence info for more than one data view, you can specify it here - query: querySubscriberResult.query, - filters: querySubscriberResult.filters, - fromDate: querySubscriberResult.fromDate, - toDate: querySubscriberResult.toDate, - services, - }); - - const { fieldListFiltersProps, fieldListGroupedProps } = useGroupedFields({ - dataViewId: dataView.id ?? null, - allFields, - services, - isAffectedByGlobalFilter: Boolean(querySubscriberResult.filters?.length), - onSupportedFieldFilter, - onSelectedFieldFilter, - }); - - const onRefreshFields = useCallback(() => { - refetchFieldsExistenceInfo(); - }, [refetchFieldsExistenceInfo]); + const onFieldEdited = useCallback(async () => { + unifiedFieldListContainerRef.current?.refetchFieldsExistenceInfo(); + }, [unifiedFieldListContainerRef]); - const renderFieldItem: FieldListGroupedProps['renderFieldItem'] = useCallback( - (params) => ( - + - ), - [ - dataView, - services, - onRefreshFields, - selectedFieldNames, - onAddFieldToWorkplace, - onRemoveFieldFromWorkspace, - ] - ); - - return ( - - } - > - - ); }; - -function onSupportedFieldFilter(field: DataViewField): boolean { - return field.name !== '_source'; -} diff --git a/examples/unified_field_list_examples/public/types.ts b/examples/unified_field_list_examples/public/types.ts index cb276d668d74f..74de42c2234cb 100644 --- a/examples/unified_field_list_examples/public/types.ts +++ b/examples/unified_field_list_examples/public/types.ts @@ -14,6 +14,7 @@ import type { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; import type { ChartsPluginStart } from '@kbn/charts-plugin/public'; import type { FieldFormatsStart } from '@kbn/field-formats-plugin/public'; import type { DataViewFieldEditorStart } from '@kbn/data-view-field-editor-plugin/public'; +import type { UiActionsStart } from '@kbn/ui-actions-plugin/public'; // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface UnifiedFieldListExamplesPluginSetup {} @@ -32,4 +33,5 @@ export interface AppPluginStartDependencies { unifiedSearch: UnifiedSearchPublicPluginStart; charts: ChartsPluginStart; fieldFormats: FieldFormatsStart; + uiActions: UiActionsStart; } diff --git a/examples/unified_field_list_examples/tsconfig.json b/examples/unified_field_list_examples/tsconfig.json index 0b172795a8e92..ae6e203d67707 100644 --- a/examples/unified_field_list_examples/tsconfig.json +++ b/examples/unified_field_list_examples/tsconfig.json @@ -28,5 +28,7 @@ "@kbn/field-formats-plugin", "@kbn/data-view-field-editor-plugin", "@kbn/unified-field-list", + "@kbn/core-theme-browser-internal", + "@kbn/ui-actions-plugin", ] } diff --git a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/model/stages/init.test.ts b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/model/stages/init.test.ts index 45c4d3181fce5..a68d6c266a652 100644 --- a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/model/stages/init.test.ts +++ b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/model/stages/init.test.ts @@ -191,7 +191,7 @@ describe('Stage: init', () => { buildIndexMappingsMock.mockReturnValue({}); }); - it('adds a log entry about the algo check', () => { + it('calls buildIndexMappings with the correct parameters', () => { const state = createState(); const res: StateActionResponse<'INIT'> = Either.right(createResponse()); @@ -203,7 +203,7 @@ describe('Stage: init', () => { }); }); - it('calls buildIndexMappings with the correct parameters', () => { + it('adds a log entry about the algo check', () => { const state = createState(); const res: StateActionResponse<'INIT'> = Either.right(createResponse()); @@ -230,12 +230,52 @@ describe('Stage: init', () => { currentIndex, previousMappings: fetchIndexResponse[currentIndex].mappings, additiveMappingChanges: mockMappings.properties, + previousAlgorithm: 'v2', skipDocumentMigration: false, }) ); }); }); + describe('when checkIndexCurrentAlgorithm returns `v2-partially-migrated`', () => { + beforeEach(() => { + checkIndexCurrentAlgorithmMock.mockReset().mockReturnValue('v2-partially-migrated'); + buildIndexMappingsMock.mockReturnValue({}); + checkVersionCompatibilityMock.mockReturnValue({ status: 'greater' }); + }); + + it('adds a log entry about the algo check', () => { + const state = createState(); + const res: StateActionResponse<'INIT'> = Either.right(createResponse()); + + const newState = init(state, res, context); + + expect(newState.logs.map((entry) => entry.message)).toContain( + `INIT: current algo check result: v2-partially-migrated` + ); + }); + + it('INIT -> UPDATE_INDEX_MAPPINGS', () => { + const state = createState(); + const fetchIndexResponse = createResponse(); + const res: StateActionResponse<'INIT'> = Either.right(fetchIndexResponse); + + const mockMappings = { properties: { someMappings: 'string' } }; + buildIndexMappingsMock.mockReturnValue(mockMappings); + + const newState = init(state, res, context); + + expect(newState).toEqual( + expect.objectContaining({ + controlState: 'UPDATE_INDEX_MAPPINGS', + currentIndex, + previousMappings: fetchIndexResponse[currentIndex].mappings, + previousAlgorithm: 'v2', + }) + ); + }); + }); + describe('when checkIndexCurrentAlgorithm returns `zdt`', () => { beforeEach(() => { checkIndexCurrentAlgorithmMock.mockReset().mockReturnValue('zdt'); @@ -329,6 +369,7 @@ describe('Stage: init', () => { previousMappings: fetchIndexResponse[currentIndex].mappings, additiveMappingChanges: { someToken: {} }, skipDocumentMigration: false, + previousAlgorithm: 'zdt', }) ); }); @@ -368,6 +409,7 @@ describe('Stage: init', () => { currentIndex, previousMappings: fetchIndexResponse[currentIndex].mappings, skipDocumentMigration: false, + previousAlgorithm: 'zdt', }) ); }); @@ -390,6 +432,7 @@ describe('Stage: init', () => { currentIndex, previousMappings: fetchIndexResponse[currentIndex].mappings, skipDocumentMigration: false, + previousAlgorithm: 'zdt', }) ); }); diff --git a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/model/stages/init.ts b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/model/stages/init.ts index 96fdf7dac4a95..7aaf44a1329a5 100644 --- a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/model/stages/init.ts +++ b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/model/stages/init.ts @@ -127,7 +127,10 @@ export const init: ModelStage< aliases: existingAliases, aliasActions, previousMappings: currentMappings, - previousAlgorithm: currentAlgo === 'v2-compatible' ? ('v2' as const) : ('zdt' as const), + previousAlgorithm: + currentAlgo === 'v2-compatible' || currentAlgo === 'v2-partially-migrated' + ? ('v2' as const) + : ('zdt' as const), }; // compatible (8.8+) v2 algo => we jump to update index mapping diff --git a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/utils/check_index_algorithm.test.ts b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/utils/check_index_algorithm.test.ts index b453cefe309a1..ba776110ca2d7 100644 --- a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/utils/check_index_algorithm.test.ts +++ b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/utils/check_index_algorithm.test.ts @@ -18,6 +18,16 @@ describe('checkIndexCurrentAlgorithm', () => { expect(checkIndexCurrentAlgorithm(mapping)).toEqual('unknown'); }); + it('returns `unknown` if _meta is present but empty', () => { + const mapping: IndexMapping = { + properties: { + _meta: {}, + }, + }; + + expect(checkIndexCurrentAlgorithm(mapping)).toEqual('unknown'); + }); + it('returns `unknown` if both v2 and zdt metas are present', () => { const mapping: IndexMapping = { properties: {}, @@ -25,7 +35,7 @@ describe('checkIndexCurrentAlgorithm', () => { migrationMappingPropertyHashes: { foo: 'someHash', }, - docVersions: { + mappingVersions: { foo: '8.8.0', }, }, @@ -34,7 +44,7 @@ describe('checkIndexCurrentAlgorithm', () => { expect(checkIndexCurrentAlgorithm(mapping)).toEqual('unknown'); }); - it('returns `zdt` if only zdt metas are present', () => { + it('returns `zdt` if all zdt metas are present', () => { const mapping: IndexMapping = { properties: {}, _meta: { @@ -50,6 +60,19 @@ describe('checkIndexCurrentAlgorithm', () => { expect(checkIndexCurrentAlgorithm(mapping)).toEqual('zdt'); }); + it('returns `v2-partially-migrated` if only mappingVersions is present', () => { + const mapping: IndexMapping = { + properties: {}, + _meta: { + mappingVersions: { + foo: '8.8.0', + }, + }, + }; + + expect(checkIndexCurrentAlgorithm(mapping)).toEqual('v2-partially-migrated'); + }); + it('returns `v2-incompatible` if v2 hashes are present but not indexTypesMap', () => { const mapping: IndexMapping = { properties: {}, diff --git a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/utils/check_index_algorithm.ts b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/utils/check_index_algorithm.ts index 7e06a2a6c06a9..74e269c828291 100644 --- a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/utils/check_index_algorithm.ts +++ b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/zdt/utils/check_index_algorithm.ts @@ -11,12 +11,22 @@ import type { IndexMapping } from '@kbn/core-saved-objects-base-server-internal' /** * The list of values returned by `checkIndexCurrentAlgorithm`. * - * - `zdt` - * - `v2-compatible` - * - `v2-incompatible` - * - `unknown` + * - `zdt`: last algo that ran was zdt + * + * - `v2-compatible`: last running algo was a v2 version that zdt can take over + * + * - `v2-incompatible`: last running algo was a v2 version that zdt can not take over + * + * - `v2-partially-migrated`: last running algo was zdt taking over v2, but the migration failed at some point + * + * - `unknown`: last running algo cannot be determined */ -export type CheckCurrentAlgorithmResult = 'zdt' | 'v2-compatible' | 'v2-incompatible' | 'unknown'; +export type CheckCurrentAlgorithmResult = + | 'zdt' + | 'v2-partially-migrated' + | 'v2-compatible' + | 'v2-incompatible' + | 'unknown'; export const checkIndexCurrentAlgorithm = ( indexMapping: IndexMapping @@ -27,7 +37,7 @@ export const checkIndexCurrentAlgorithm = ( } const hasV2Meta = !!meta.migrationMappingPropertyHashes; - const hasZDTMeta = !!meta.docVersions || !!meta.mappingVersions; + const hasZDTMeta = !!meta.mappingVersions; if (hasV2Meta && hasZDTMeta) { return 'unknown'; @@ -37,7 +47,8 @@ export const checkIndexCurrentAlgorithm = ( return isCompatible ? 'v2-compatible' : 'v2-incompatible'; } if (hasZDTMeta) { - return 'zdt'; + const isFullZdt = !!meta.docVersions; + return isFullZdt ? 'zdt' : 'v2-partially-migrated'; } return 'unknown'; }; diff --git a/packages/kbn-dom-drag-drop/kibana.jsonc b/packages/kbn-dom-drag-drop/kibana.jsonc index cfa2e9ae2df00..6e54fddc2b751 100644 --- a/packages/kbn-dom-drag-drop/kibana.jsonc +++ b/packages/kbn-dom-drag-drop/kibana.jsonc @@ -1,5 +1,5 @@ { - "type": "shared-browser", + "type": "shared-common", "id": "@kbn/dom-drag-drop", "owner": [ "@elastic/kibana-visualizations", diff --git a/packages/kbn-ftr-common-functional-services/services/es.ts b/packages/kbn-ftr-common-functional-services/services/es.ts index fe9aafbf10736..5fe5a4b095fc1 100644 --- a/packages/kbn-ftr-common-functional-services/services/es.ts +++ b/packages/kbn-ftr-common-functional-services/services/es.ts @@ -13,9 +13,15 @@ import { FtrProviderContext } from './ftr_provider_context'; export function EsProvider({ getService }: FtrProviderContext): Client { const config = getService('config'); + const isServerless = !!config.get('serverless'); - return createEsClientForFtrConfig(config, { - // Use system indices user so tests can write to system indices - authOverride: systemIndicesSuperuser, - }); + return createEsClientForFtrConfig( + config, + isServerless + ? {} + : { + // Use system indices user so tests can write to system indices + authOverride: systemIndicesSuperuser, + } + ); } diff --git a/packages/kbn-test/src/functional_test_runner/functional_test_runner.ts b/packages/kbn-test/src/functional_test_runner/functional_test_runner.ts index 5b06393cf7d50..5e96bfef3954a 100644 --- a/packages/kbn-test/src/functional_test_runner/functional_test_runner.ts +++ b/packages/kbn-test/src/functional_test_runner/functional_test_runner.ts @@ -60,7 +60,8 @@ export class FunctionalTestRunner { : this.getStubProviderCollection(coreProviders); if (realServices) { - if (providers.hasService('es')) { + // Skip ES version validation for serverless project + if (!this.config.get('serverless') && providers.hasService('es')) { await this.validateEsVersion(); } await providers.loadAll(); diff --git a/packages/kbn-test/src/functional_test_runner/lib/config/schema.ts b/packages/kbn-test/src/functional_test_runner/lib/config/schema.ts index fbad913dc75fa..03c0cbc07e644 100644 --- a/packages/kbn-test/src/functional_test_runner/lib/config/schema.ts +++ b/packages/kbn-test/src/functional_test_runner/lib/config/schema.ts @@ -89,6 +89,7 @@ export const schema = Joi.object() rootTags: Joi.array().items(Joi.string()), testFiles: Joi.array().items(Joi.string()), testRunner: Joi.func(), + serverless: Joi.boolean().default(false), suiteFiles: Joi.object() .keys({ @@ -200,7 +201,7 @@ export const schema = Joi.object() .keys({ license: Joi.valid('basic', 'trial', 'gold').default('basic'), from: Joi.string().default('snapshot'), - serverArgs: Joi.array().items(Joi.string()), + serverArgs: Joi.array().items(Joi.string()).default([]), esJavaOpts: Joi.string(), dataArchive: Joi.string(), ssl: Joi.boolean().default(false), diff --git a/packages/kbn-test/src/functional_tests/lib/run_elasticsearch.ts b/packages/kbn-test/src/functional_tests/lib/run_elasticsearch.ts index b8f6fc4714273..40d4da7d76d76 100644 --- a/packages/kbn-test/src/functional_tests/lib/run_elasticsearch.ts +++ b/packages/kbn-test/src/functional_tests/lib/run_elasticsearch.ts @@ -34,7 +34,7 @@ function getEsConfig({ }: RunElasticsearchOptions) { const ssl = !!config.get('esTestCluster.ssl'); const license: 'basic' | 'trial' | 'gold' = config.get('esTestCluster.license'); - const esArgs: string[] = config.get('esTestCluster.serverArgs') ?? []; + const esArgs: string[] = config.get('esTestCluster.serverArgs'); const esJavaOpts: string | undefined = config.get('esTestCluster.esJavaOpts'); const isSecurityEnabled = esArgs.includes('xpack.security.enabled=true'); diff --git a/packages/kbn-unified-field-list/README.md b/packages/kbn-unified-field-list/README.md index 7f8174c6a0ee2..eb61715c214d5 100755 --- a/packages/kbn-unified-field-list/README.md +++ b/packages/kbn-unified-field-list/README.md @@ -2,9 +2,60 @@ This Kibana package contains components and services for field list UI (as in fields sidebar on Discover and Lens pages). +## UnifiedFieldListSidebarContainer - building block + +An example of its usage can be found in Kibana example plugin [examples/unified_field_list_examples](/examples/unified_field_list_examples). + +Configure the field list: +``` +const getCreationOptions: UnifiedFieldListSidebarContainerProps['getCreationOptions'] = () => { + return { + originatingApp: PLUGIN_ID, + localStorageKeyPrefix: 'examples', + timeRangeUpdatesType: 'timefilter', + disablePopularFields: true, + ... // more customization option are available + }; +}; +``` + +Define a ref for accessing API if necessary: +``` +const unifiedFieldListContainerRef = useRef(null); +``` + +where `unifiedFieldListContainerRef.current` provides the following API: + +``` +refetchFieldsExistenceInfo: ExistingFieldsFetcher['refetchFieldsExistenceInfo']; +closeFieldListFlyout: () => void; +// no user permission or missing dataViewFieldEditor service will result in `undefined` API methods +createField: undefined | (() => void); +editField: undefined | ((fieldName: string) => void); +deleteField: undefined | ((fieldName: string) => void); +``` + +Include the building block into your application: +``` + +``` + --- -## Field Stats and Field Popover Components +## Field Stats and Field Popover Components - can be also used as a building block * `` - loads and renders stats (Top values, Distribution) for a data view field. @@ -53,7 +104,7 @@ These components can be combined and customized as the following: /> ``` -## Field List components +## Field List subcomponents (for low level customization, otherwise consider using UnifiedFieldListSidebarContainer) * `` - a top-level component to render field filters and field list sections. @@ -139,12 +190,6 @@ const { hasFieldData } = useExistingFieldsReader(); const hasData = hasFieldData(currentDataViewId, fieldName) // returns a boolean ``` -## Server APIs - -* `/internal/unified_field_list/field_stats` - returns the loaded field stats (except for Ad-hoc data views) - -* `/internal/unified_field_list/existing_fields/{dataViewId}` - returns the loaded existing fields (except for Ad-hoc data views) - ## Development See the [kibana contributing guide](https://github.com/elastic/kibana/blob/main/CONTRIBUTING.md) for instructions setting up your development environment. diff --git a/packages/kbn-unified-field-list/__mocks__/services.mock.ts b/packages/kbn-unified-field-list/__mocks__/services.mock.ts new file mode 100644 index 0000000000000..38a2f0e2847c8 --- /dev/null +++ b/packages/kbn-unified-field-list/__mocks__/services.mock.ts @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { UnifiedFieldListSidebarContainerProps } from '../src/containers/unified_field_list_sidebar'; +import { dataPluginMock } from '@kbn/data-plugin/public/mocks'; +import { calculateBounds } from '@kbn/data-plugin/common'; +import { dataViewPluginMocks } from '@kbn/data-views-plugin/public/mocks'; +import { fieldFormatsServiceMock } from '@kbn/field-formats-plugin/public/mocks'; +import { chartPluginMock } from '@kbn/charts-plugin/public/mocks'; +import { coreMock } from '@kbn/core/public/mocks'; +import { uiActionsPluginMock } from '@kbn/ui-actions-plugin/public/mocks'; +import { indexPatternFieldEditorPluginMock as dataViewFieldEditorPluginMock } from '@kbn/data-view-field-editor-plugin/public/mocks'; + +export const getServicesMock = (): UnifiedFieldListSidebarContainerProps['services'] => { + const mockedServices: UnifiedFieldListSidebarContainerProps['services'] = { + data: dataPluginMock.createStartContract(), + dataViews: dataViewPluginMocks.createStartContract(), + fieldFormats: fieldFormatsServiceMock.createStartContract(), + charts: chartPluginMock.createSetupContract(), + core: coreMock.createStart(), + uiActions: uiActionsPluginMock.createStartContract(), + dataViewFieldEditor: dataViewFieldEditorPluginMock.createStartContract(), + }; + + mockedServices.data.query.timefilter.timefilter.getTime = jest.fn(() => { + return { from: 'now-15m', to: 'now' }; + }); + + mockedServices.data.query.timefilter.timefilter.calculateBounds = jest.fn(calculateBounds); + + mockedServices.data.query.getState = jest.fn(() => ({ + query: { query: '', language: 'lucene' }, + filters: [], + })); + + return mockedServices; +}; diff --git a/packages/kbn-unified-field-list/index.ts b/packages/kbn-unified-field-list/index.ts index 28a441cde0662..fed0bc2e736e2 100755 --- a/packages/kbn-unified-field-list/index.ts +++ b/packages/kbn-unified-field-list/index.ts @@ -52,6 +52,7 @@ export type { FieldListItem, GetCustomFieldType, RenderFieldItemParams, + SearchMode, } from './src/types'; export { ExistenceFetchStatus, FieldsGroupNames } from './src/types'; @@ -80,6 +81,7 @@ export { export { useQuerySubscriber, hasQuerySubscriberData, + getSearchMode, type QuerySubscriberResult, type QuerySubscriberParams, } from './src/hooks/use_query_subscriber'; @@ -91,3 +93,9 @@ export { getFieldType, getFieldIconType, } from './src/utils/field_types'; + +export { + UnifiedFieldListSidebarContainer, + type UnifiedFieldListSidebarContainerApi, + type UnifiedFieldListSidebarContainerProps, +} from './src/containers/unified_field_list_sidebar'; diff --git a/packages/kbn-unified-field-list/src/containers/services/state_service.ts b/packages/kbn-unified-field-list/src/containers/services/state_service.ts new file mode 100644 index 0000000000000..d9a422cb67289 --- /dev/null +++ b/packages/kbn-unified-field-list/src/containers/services/state_service.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { + UnifiedFieldListSidebarContainerCreationOptions, + UnifiedFieldListSidebarContainerStateService, +} from '../../types'; + +export const createStateService = ({ + options, +}: { + options: UnifiedFieldListSidebarContainerCreationOptions; +}): UnifiedFieldListSidebarContainerStateService => { + // bootstrapping a simple service for extending it later if necessary + return { + creationOptions: options, + }; +}; diff --git a/src/plugins/discover/public/application/main/components/sidebar/discover_field.test.tsx b/packages/kbn-unified-field-list/src/containers/unified_field_list_item/field_list_item.test.tsx similarity index 67% rename from src/plugins/discover/public/application/main/components/sidebar/discover_field.test.tsx rename to packages/kbn-unified-field-list/src/containers/unified_field_list_item/field_list_item.test.tsx index b67069c6b3685..6ccbf54516995 100644 --- a/src/plugins/discover/public/application/main/components/sidebar/discover_field.test.tsx +++ b/packages/kbn-unified-field-list/src/containers/unified_field_list_item/field_list_item.test.tsx @@ -11,16 +11,14 @@ import { EuiButtonIcon, EuiPopover, EuiProgress } from '@elastic/eui'; import React from 'react'; import { findTestSubject } from '@elastic/eui/lib/test'; import { mountWithIntl } from '@kbn/test-jest-helpers'; -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 { createDiscoverServicesMock } from '../../../../__mocks__/services'; -import { FieldItemButton } from '@kbn/unified-field-list'; +import { getServicesMock } from '../../../__mocks__/services.mock'; +import { UnifiedFieldListItem, UnifiedFieldListItemProps } from './field_list_item'; +import { FieldItemButton } from '../../components/field_item_button'; +import { createStateService } from '../services/state_service'; -jest.mock('@kbn/unified-field-list/src/services/field_stats', () => ({ +jest.mock('../../services/field_stats', () => ({ loadFieldStats: jest.fn().mockResolvedValue({ totalDocuments: 1624, sampledDocuments: 1624, @@ -40,22 +38,14 @@ jest.mock('@kbn/unified-field-list/src/services/field_stats', () => ({ }), })); -jest.mock('../../../../kibana_services', () => ({ - getUiActions: jest.fn(() => { - return { - getTriggerCompatibleActions: jest.fn(() => []), - }; - }), -})); - async function getComponent({ selected = false, field, - onAddFilterExists = true, + canFilter = true, }: { selected?: boolean; field?: DataViewField; - onAddFilterExists?: boolean; + canFilter?: boolean; }) { const finalField = field ?? @@ -72,62 +62,45 @@ async function getComponent({ const dataView = stubDataView; dataView.toSpec = () => ({}); - const props: DiscoverFieldProps = { + const stateService = createStateService({ + options: { + originatingApp: 'test', + }, + }); + + const props: UnifiedFieldListItemProps = { + services: getServicesMock(), + stateService, + searchMode: 'documents', dataView: stubDataView, field: finalField, - ...(onAddFilterExists && { onAddFilter: jest.fn() }), - onAddField: jest.fn(), + ...(canFilter && { onAddFilter: jest.fn() }), + onAddFieldToWorkspace: jest.fn(), + onRemoveFieldFromWorkspace: jest.fn(), onEditField: jest.fn(), - onRemoveField: jest.fn(), isSelected: selected, isEmpty: false, groupIndex: 1, itemIndex: 0, - contextualFields: [], + workspaceSelectedFieldNames: [], }; - const services = { - ...createDiscoverServicesMock(), - capabilities: { - visualize: { - show: true, - }, - }, - uiSettings: { - get: (key: string) => { - if (key === 'fields:popularLimit') { - return 5; - } - }, - }, - }; - const appStateContainer = getDiscoverStateMock({ isTimeBased: true }).appState; - appStateContainer.set({ - query: { query: '', language: 'lucene' }, - filters: [], - }); - const comp = await mountWithIntl( - - - - - - ); + const comp = await mountWithIntl(); // wait for lazy modules await new Promise((resolve) => setTimeout(resolve, 0)); await comp.update(); return { comp, props }; } -describe('discover sidebar field', function () { +describe('UnifiedFieldListItem', function () { it('should allow selecting fields', async function () { const { comp, props } = await getComponent({}); findTestSubject(comp, 'fieldToggle-bytes').simulate('click'); - expect(props.onAddField).toHaveBeenCalledWith('bytes'); + expect(props.onAddFieldToWorkspace).toHaveBeenCalledWith(props.field); }); it('should allow deselecting fields', async function () { const { comp, props } = await getComponent({ selected: true }); findTestSubject(comp, 'fieldToggle-bytes').simulate('click'); - expect(props.onRemoveField).toHaveBeenCalledWith('bytes'); + expect(props.onRemoveFieldFromWorkspace).toHaveBeenCalledWith(props.field); }); it('displays warning for conflicting fields', async function () { const field = new DataViewField({ @@ -157,7 +130,7 @@ describe('discover sidebar field', function () { const { comp } = await getComponent({ selected: true, field, - onAddFilterExists: false, + canFilter: false, }); expect(comp.find(FieldItemButton).prop('onClick')).toBeUndefined(); @@ -171,7 +144,7 @@ describe('discover sidebar field', function () { searchable: true, }); - const { comp } = await getComponent({ field, onAddFilterExists: true }); + const { comp } = await getComponent({ field, canFilter: true }); await act(async () => { const fieldItem = findTestSubject(comp, 'field-machine.os.raw-showDetails'); @@ -186,13 +159,13 @@ describe('discover sidebar field', function () { await new Promise((resolve) => setTimeout(resolve, 0)); await comp.update(); - expect(findTestSubject(comp, 'dscFieldStats-title').text()).toBe('Top values'); - expect(findTestSubject(comp, 'dscFieldStats-topValues-bucket')).toHaveLength(2); - expect( - findTestSubject(comp, 'dscFieldStats-topValues-formattedFieldValue').first().text() - ).toBe('osx'); + expect(findTestSubject(comp, 'fieldStats-title').text()).toBe('Top values'); + expect(findTestSubject(comp, 'fieldStats-topValues-bucket')).toHaveLength(2); + expect(findTestSubject(comp, 'fieldStats-topValues-formattedFieldValue').first().text()).toBe( + 'osx' + ); expect(comp.find(EuiProgress)).toHaveLength(2); - expect(findTestSubject(comp, 'dscFieldStats-topValues').find(EuiButtonIcon)).toHaveLength(4); + expect(findTestSubject(comp, 'fieldStats-topValues').find(EuiButtonIcon)).toHaveLength(4); }); it('should include popover actions', async function () { const field = new DataViewField({ @@ -203,7 +176,7 @@ describe('discover sidebar field', function () { searchable: true, }); - const { comp, props } = await getComponent({ field, onAddFilterExists: true }); + const { comp, props } = await getComponent({ field, canFilter: true }); await act(async () => { const fieldItem = findTestSubject(comp, 'field-extension.keyword-showDetails'); @@ -218,15 +191,13 @@ describe('discover sidebar field', function () { comp.find('[data-test-subj="fieldPopoverHeader_addField-extension.keyword"]').exists() ).toBeTruthy(); expect( - comp - .find('[data-test-subj="discoverFieldListPanelAddExistFilter-extension.keyword"]') - .exists() + comp.find('[data-test-subj="fieldPopoverHeader_addExistsFilter-extension.keyword"]').exists() ).toBeTruthy(); expect( - comp.find('[data-test-subj="discoverFieldListPanelEdit-extension.keyword"]').exists() + comp.find('[data-test-subj="fieldPopoverHeader_editField-extension.keyword"]').exists() ).toBeTruthy(); expect( - comp.find('[data-test-subj="discoverFieldListPanelDelete-extension.keyword"]').exists() + comp.find('[data-test-subj="fieldPopoverHeader_deleteField-extension.keyword"]').exists() ).toBeFalsy(); await act(async () => { @@ -235,7 +206,7 @@ describe('discover sidebar field', function () { await comp.update(); }); - expect(props.onAddField).toHaveBeenCalledWith('extension.keyword'); + expect(props.onAddFieldToWorkspace).toHaveBeenCalledWith(field); await comp.update(); @@ -253,7 +224,7 @@ describe('discover sidebar field', function () { const { comp } = await getComponent({ field, - onAddFilterExists: true, + canFilter: true, selected: true, }); diff --git a/src/plugins/discover/public/application/main/components/sidebar/discover_field.tsx b/packages/kbn-unified-field-list/src/containers/unified_field_list_item/field_list_item.tsx similarity index 60% rename from src/plugins/discover/public/application/main/components/sidebar/discover_field.tsx rename to packages/kbn-unified-field-list/src/containers/unified_field_list_item/field_list_item.tsx index 7ba7d23a43806..837818399eccf 100644 --- a/src/plugins/discover/public/application/main/components/sidebar/discover_field.tsx +++ b/packages/kbn-unified-field-list/src/containers/unified_field_list_item/field_list_item.tsx @@ -6,41 +6,47 @@ * Side Public License, v 1. */ -import './discover_field.scss'; - import React, { memo, useCallback, useMemo, useState } from 'react'; import { EuiSpacer, EuiTitle } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { UiCounterMetricType } from '@kbn/analytics'; +import { DragDrop } from '@kbn/dom-drag-drop'; import type { DataView, DataViewField } from '@kbn/data-views-plugin/public'; +import type { SearchMode } from '../../types'; +import { FieldItemButton, type FieldItemButtonProps } from '../../components/field_item_button'; import { - FieldItemButton, - type FieldItemButtonProps, FieldPopover, FieldPopoverHeader, - FieldPopoverHeaderProps, + type FieldPopoverHeaderProps, FieldPopoverFooter, -} from '@kbn/unified-field-list'; -import { DragDrop } from '@kbn/dom-drag-drop'; -import { DiscoverFieldStats } from './discover_field_stats'; -import { PLUGIN_ID } from '../../../../../common'; -import { getUiActions } from '../../../../kibana_services'; + type FieldPopoverFooterProps, +} from '../../components/field_popover'; +import { + UnifiedFieldListItemStats, + type UnifiedFieldListItemStatsProps, +} from './field_list_item_stats'; +import type { + UnifiedFieldListSidebarContainerStateService, + AddFieldFilterHandler, +} from '../../types'; interface GetCommonFieldItemButtonPropsParams { + stateService: UnifiedFieldListSidebarContainerStateService; field: DataViewField; isSelected: boolean; toggleDisplay: (field: DataViewField, isSelected?: boolean) => void; } function getCommonFieldItemButtonProps({ + stateService, field, isSelected, toggleDisplay, }: GetCommonFieldItemButtonPropsParams): { field: FieldItemButtonProps['field']; isSelected: FieldItemButtonProps['isSelected']; - buttonAddFieldToWorkspaceProps: FieldItemButtonProps['buttonAddFieldToWorkspaceProps']; - buttonRemoveFieldFromWorkspaceProps: FieldItemButtonProps['buttonRemoveFieldFromWorkspaceProps']; + buttonAddFieldToWorkspaceProps?: FieldItemButtonProps['buttonAddFieldToWorkspaceProps']; + buttonRemoveFieldFromWorkspaceProps?: FieldItemButtonProps['buttonRemoveFieldFromWorkspaceProps']; onAddFieldToWorkspace: FieldItemButtonProps['onAddFieldToWorkspace']; onRemoveFieldFromWorkspace: FieldItemButtonProps['onRemoveFieldFromWorkspace']; } { @@ -49,33 +55,27 @@ function getCommonFieldItemButtonProps({ return { field, isSelected, - buttonAddFieldToWorkspaceProps: { - 'aria-label': i18n.translate('discover.fieldChooser.discoverField.addFieldTooltip', { - defaultMessage: 'Add field as column', - }), - }, - buttonRemoveFieldFromWorkspaceProps: { - 'aria-label': i18n.translate('discover.fieldChooser.discoverField.removeFieldTooltip', { - defaultMessage: 'Remove field from table', - }), - }, + buttonAddFieldToWorkspaceProps: stateService.creationOptions.buttonAddFieldToWorkspaceProps, + buttonRemoveFieldFromWorkspaceProps: + stateService.creationOptions.buttonRemoveFieldFromWorkspaceProps, onAddFieldToWorkspace: handler, onRemoveFieldFromWorkspace: handler, }; } interface MultiFieldsProps { - multiFields: NonNullable; + stateService: UnifiedFieldListSidebarContainerStateService; + multiFields: NonNullable; toggleDisplay: (field: DataViewField) => void; alwaysShowActionButton: boolean; } const MultiFields: React.FC = memo( - ({ multiFields, toggleDisplay, alwaysShowActionButton }) => ( + ({ stateService, multiFields, toggleDisplay, alwaysShowActionButton }) => (
    - {i18n.translate('discover.fieldChooser.discoverField.multiFields', { + {i18n.translate('unifiedFieldList.fieldListItem.multiFields', { defaultMessage: 'Multi fields', })}
    @@ -85,13 +85,13 @@ const MultiFields: React.FC = memo( = memo( ) ); -export interface DiscoverFieldProps { +export interface UnifiedFieldListItemProps { + /** + * Service for managing the state + */ + stateService: UnifiedFieldListSidebarContainerStateService; + + /** + * Required services + */ + services: UnifiedFieldListItemStatsProps['services'] & { + uiActions?: FieldPopoverFooterProps['uiActions']; + }; + /** + * Current search mode + */ + searchMode: SearchMode | undefined; /** * Determines whether add/remove button is displayed not only when focused */ @@ -118,16 +133,16 @@ export interface DiscoverFieldProps { /** * Callback to add/select the field */ - onAddField: (fieldName: string) => void; - /** - * Callback to add a filter to filter bar - */ - onAddFilter?: (field: DataViewField | string, value: unknown, type: '+' | '-') => void; + onAddFieldToWorkspace: (field: DataViewField) => void; /** * Callback to remove a field column from the table * @param fieldName */ - onRemoveField: (fieldName: string) => void; + onRemoveFieldFromWorkspace: (field: DataViewField) => void; + /** + * Callback to add a filter to filter bar + */ + onAddFilter?: AddFieldFilterHandler; /** * Determines whether the field is empty */ @@ -142,49 +157,48 @@ export interface DiscoverFieldProps { * @param eventName */ trackUiMetric?: (metricType: UiCounterMetricType, eventName: string | string[]) => void; - + /** + * Multi fields for the current field + */ multiFields?: Array<{ field: DataViewField; isSelected: boolean }>; - /** * Callback to edit a field from data view * @param fieldName name of the field to edit */ - onEditField?: (fieldName: string) => void; - + onEditField?: (fieldName?: string) => void; /** * Callback to delete a runtime field from data view * @param fieldName name of the field to delete */ onDeleteField?: (fieldName: string) => void; - /** - * Columns + * Currently selected fields like table columns */ - contextualFields: string[]; - + workspaceSelectedFieldNames?: string[]; /** * Search by field name */ highlight?: string; - /** * Group index in the field list */ groupIndex: number; - /** * Item index in the field list */ itemIndex: number; } -function DiscoverFieldComponent({ +function UnifiedFieldListItemComponent({ + stateService, + services, + searchMode, alwaysShowActionButton = false, field, highlight, dataView, - onAddField, - onRemoveField, + onAddFieldToWorkspace, + onRemoveFieldFromWorkspace, onAddFilter, isEmpty, isSelected, @@ -192,12 +206,11 @@ function DiscoverFieldComponent({ multiFields, onEditField, onDeleteField, - contextualFields, + workspaceSelectedFieldNames, groupIndex, itemIndex, -}: DiscoverFieldProps) { +}: UnifiedFieldListItemProps) { const [infoIsOpen, setOpen] = useState(false); - const isDocumentRecord = !!onAddFilter; const addFilterAndClosePopover: typeof onAddFilter | undefined = useMemo( () => @@ -222,40 +235,41 @@ function DiscoverFieldComponent({ (f, isCurrentlySelected) => { closePopover(); if (isCurrentlySelected) { - onRemoveField(f.name); + onRemoveFieldFromWorkspace(f); } else { - onAddField(f.name); + onAddFieldToWorkspace(f); } }, - [onAddField, onRemoveField, closePopover] + [onAddFieldToWorkspace, onRemoveFieldFromWorkspace, closePopover] ); const rawMultiFields = useMemo(() => multiFields?.map((f) => f.field), [multiFields]); - const customPopoverHeaderProps: Partial = useMemo( - () => ({ - buttonAddFieldToWorkspaceProps: { - 'aria-label': i18n.translate('discover.fieldChooser.discoverField.addFieldTooltip', { - defaultMessage: 'Add field as column', - }), - }, - buttonAddFilterProps: { - 'data-test-subj': `discoverFieldListPanelAddExistFilter-${field.name}`, - }, - buttonEditFieldProps: { - 'data-test-subj': `discoverFieldListPanelEdit-${field.name}`, - }, - buttonDeleteFieldProps: { - 'data-test-subj': `discoverFieldListPanelDelete-${field.name}`, - }, - }), - [field.name] - ); + const customPopoverHeaderProps: Partial = useMemo(() => { + const dataTestSubjPrefix = + stateService.creationOptions.dataTestSubj?.fieldListItemPopoverHeaderDataTestSubjPrefix; + return { + buttonAddFieldToWorkspaceProps: stateService.creationOptions.buttonAddFieldToWorkspaceProps, + ...(dataTestSubjPrefix && { + buttonAddFilterProps: { + 'data-test-subj': `${dataTestSubjPrefix}AddExistFilter-${field.name}`, + }, + buttonEditFieldProps: { + 'data-test-subj': `${dataTestSubjPrefix}Edit-${field.name}`, + }, + buttonDeleteFieldProps: { + 'data-test-subj': `${dataTestSubjPrefix}Delete-${field.name}`, + }, + }), + }; + }, [field.name, stateService.creationOptions]); const renderPopover = () => { return ( <> - )} - closePopover()} - /> + {!!services.uiActions && ( + closePopover()} + /> + )} ); }; @@ -308,24 +325,28 @@ function DiscoverFieldComponent({ order={order} value={value} onDragStart={closePopover} - isDisabled={alwaysShowActionButton} - dataTestSubj={`dscFieldListPanelField-${field.name}`} + isDisabled={ + alwaysShowActionButton || stateService.creationOptions.disableFieldListItemDragAndDrop + } + dataTestSubj={`${ + stateService.creationOptions.dataTestSubj?.fieldListItemDndDataTestSubjPrefix ?? + 'unifiedFieldListItemDnD' + }-${field.name}`} > } closePopover={closePopover} - data-test-subj="discoverFieldListPanelPopover" + data-test-subj={stateService.creationOptions.dataTestSubj?.fieldListItemPopoverDataTestSubj} renderHeader={() => ( )} - renderContent={isDocumentRecord ? renderPopover : undefined} + renderContent={searchMode === 'documents' ? renderPopover : undefined} /> ); } -export const DiscoverField = memo(DiscoverFieldComponent); +export const UnifiedFieldListItem = memo(UnifiedFieldListItemComponent); diff --git a/src/plugins/discover/public/application/main/components/sidebar/discover_field_stats.tsx b/packages/kbn-unified-field-list/src/containers/unified_field_list_item/field_list_item_stats.tsx similarity index 52% rename from src/plugins/discover/public/application/main/components/sidebar/discover_field_stats.tsx rename to packages/kbn-unified-field-list/src/containers/unified_field_list_item/field_list_item_stats.tsx index 4818d1ae68329..35cb135326642 100644 --- a/src/plugins/discover/public/application/main/components/sidebar/discover_field_stats.tsx +++ b/packages/kbn-unified-field-list/src/containers/unified_field_list_item/field_list_item_stats.tsx @@ -7,26 +7,32 @@ */ import React, { useMemo } from 'react'; -import { FieldStats, FieldStatsProps } from '@kbn/unified-field-list/src/components/field_stats'; +import type { DataView, DataViewField } from '@kbn/data-views-plugin/public'; +import type { CoreStart } from '@kbn/core-lifecycle-browser'; import { - useQuerySubscriber, - hasQuerySubscriberData, -} from '@kbn/unified-field-list/src/hooks/use_query_subscriber'; -import type { DataViewField, DataView } from '@kbn/data-views-plugin/public'; -import { useDiscoverServices } from '../../../../hooks/use_discover_services'; + FieldStats, + type FieldStatsProps, + type FieldStatsServices, +} from '../../components/field_stats'; +import { useQuerySubscriber, hasQuerySubscriberData } from '../../hooks/use_query_subscriber'; +import type { UnifiedFieldListSidebarContainerStateService } from '../../types'; -export interface DiscoverFieldStatsProps { +export interface UnifiedFieldListItemStatsProps { + stateService: UnifiedFieldListSidebarContainerStateService; field: DataViewField; + services: Omit & { + core: CoreStart; + }; dataView: DataView; multiFields?: Array<{ field: DataViewField; isSelected: boolean }>; onAddFilter: FieldStatsProps['onAddFilter']; } -export const DiscoverFieldStats: React.FC = React.memo( - ({ field, dataView, multiFields, onAddFilter }) => { - const services = useDiscoverServices(); +export const UnifiedFieldListItemStats: React.FC = React.memo( + ({ stateService, services, field, dataView, multiFields, onAddFilter }) => { const querySubscriberResult = useQuerySubscriber({ data: services.data, + timeRangeUpdatesType: stateService.creationOptions.timeRangeUpdatesType, }); // prioritize an aggregatable multi field if available or take the parent field const fieldForStats = useMemo( @@ -37,20 +43,31 @@ export const DiscoverFieldStats: React.FC = React.memo( [field, multiFields] ); + const statsServices: FieldStatsServices = useMemo( + () => ({ + data: services.data, + dataViews: services.dataViews, + fieldFormats: services.fieldFormats, + charts: services.charts, + uiSettings: services.core.uiSettings, + }), + [services] + ); + if (!hasQuerySubscriberData(querySubscriberResult)) { return null; } return ( ); diff --git a/packages/kbn-unified-field-list/src/containers/unified_field_list_item/index.tsx b/packages/kbn-unified-field-list/src/containers/unified_field_list_item/index.tsx new file mode 100644 index 0000000000000..af4ef19097311 --- /dev/null +++ b/packages/kbn-unified-field-list/src/containers/unified_field_list_item/index.tsx @@ -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 { UnifiedFieldListItem, type UnifiedFieldListItemProps } from './field_list_item'; diff --git a/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar.scss b/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/field_list_sidebar.scss similarity index 71% rename from src/plugins/discover/public/application/main/components/sidebar/discover_sidebar.scss rename to packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/field_list_sidebar.scss index d8e320822f5f7..d01d93c345ef9 100644 --- a/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar.scss +++ b/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/field_list_sidebar.scss @@ -1,4 +1,4 @@ -.dscSidebar { +.unifiedFieldListSidebar { overflow: hidden; margin: 0 !important; flex-grow: 1; @@ -13,7 +13,7 @@ } } -.dscSidebar__list { +.unifiedFieldListSidebar__list { padding: $euiSizeS 0 $euiSizeS $euiSizeS; @include euiBreakpoint('xs', 's') { @@ -21,20 +21,20 @@ } } -.dscSidebar__group { +.unifiedFieldListSidebar__group { height: 100%; } -.dscSidebar__mobile { +.unifiedFieldListSidebar__mobile { width: 100%; padding: $euiSizeS $euiSizeS 0; - .dscSidebar__mobileBadge { + .unifiedFieldListSidebar__mobileBadge { margin-left: $euiSizeS; vertical-align: text-bottom; } } -.dscSidebar__flyoutHeader { +.unifiedFieldListSidebar__flyoutHeader { align-items: center; } diff --git a/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/field_list_sidebar.tsx b/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/field_list_sidebar.tsx new file mode 100644 index 0000000000000..8796df69f9d82 --- /dev/null +++ b/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/field_list_sidebar.tsx @@ -0,0 +1,351 @@ +/* + * Copyright 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 './field_list_sidebar.scss'; +import React, { memo, useCallback, useEffect, useMemo, useState } from 'react'; +import { i18n } from '@kbn/i18n'; +import { EuiButton, EuiFlexGroup, EuiFlexItem, EuiPageSidebar } from '@elastic/eui'; +import { type DataViewField } from '@kbn/data-views-plugin/public'; +import { getDataViewFieldSubtypeMulti } from '@kbn/es-query/src/utils'; +import { FieldList } from '../../components/field_list'; +import { FieldListFilters } from '../../components/field_list_filters'; +import { FieldListGrouped, type FieldListGroupedProps } from '../../components/field_list_grouped'; +import { FieldsGroupNames } from '../../types'; +import { GroupedFieldsParams, useGroupedFields } from '../../hooks/use_grouped_fields'; +import { UnifiedFieldListItem, type UnifiedFieldListItemProps } from '../unified_field_list_item'; +import { + getSelectedFields, + shouldShowField, + type SelectedFieldsResult, + INITIAL_SELECTED_FIELDS_RESULT, +} from './group_fields'; + +const FIELDS_LIMIT_SETTING = 'fields:popularLimit'; +const SEARCH_FIELDS_FROM_SOURCE = 'discover:searchFieldsFromSource'; + +export type UnifiedFieldListSidebarCustomizableProps = Pick< + UnifiedFieldListItemProps, + | 'services' + | 'workspaceSelectedFieldNames' + | 'dataView' + | 'trackUiMetric' + | 'onAddFilter' + | 'onAddFieldToWorkspace' + | 'onRemoveFieldFromWorkspace' +> & { + /** + * All fields: fields from data view and unmapped fields or columns from text-based search + */ + allFields: DataViewField[] | null; + + /** + * Whether to render the field list or not (we don't show it unless documents are loaded) + */ + showFieldList?: boolean; + + /** + * Custom logic for determining which field is selected + */ + onSelectedFieldFilter?: GroupedFieldsParams['onSelectedFieldFilter']; +}; + +interface UnifiedFieldListSidebarInternalProps { + /** + * Current search mode based on current query + */ + searchMode: UnifiedFieldListItemProps['searchMode']; + + /** + * Service for managing the state + */ + stateService: UnifiedFieldListItemProps['stateService']; + + /** + * Show loading instead of the field list if processing + */ + isProcessing: boolean; + + /** + * Whether filters are applied + */ + isAffectedByGlobalFilter: boolean; + + /** + * Custom element to render at the top + */ + prepend?: React.ReactNode; + + /** + * Whether to make action buttons visible + */ + alwaysShowActionButton?: UnifiedFieldListItemProps['alwaysShowActionButton']; + + /** + * Trigger a field editing + */ + onEditField: UnifiedFieldListItemProps['onEditField'] | undefined; + + /** + * Trigger a field deletion + */ + onDeleteField: UnifiedFieldListItemProps['onDeleteField'] | undefined; +} + +export type UnifiedFieldListSidebarProps = UnifiedFieldListSidebarCustomizableProps & + UnifiedFieldListSidebarInternalProps; + +export const UnifiedFieldListSidebarComponent: React.FC = ({ + stateService, + searchMode, + services, + workspaceSelectedFieldNames, + isProcessing, + alwaysShowActionButton, + allFields, + dataView, + trackUiMetric, + showFieldList = true, + isAffectedByGlobalFilter, + prepend, + onAddFieldToWorkspace, + onRemoveFieldFromWorkspace, + onAddFilter, + onSelectedFieldFilter, + onEditField, + onDeleteField, +}) => { + const { dataViews, core } = services; + const useNewFieldsApi = useMemo( + () => !core.uiSettings.get(SEARCH_FIELDS_FROM_SOURCE), + [core.uiSettings] + ); + + const [selectedFieldsState, setSelectedFieldsState] = useState( + INITIAL_SELECTED_FIELDS_RESULT + ); + const [multiFieldsMap, setMultiFieldsMap] = useState< + Map> | undefined + >(undefined); + + useEffect(() => { + const result = getSelectedFields({ + dataView, + workspaceSelectedFieldNames: onSelectedFieldFilter ? [] : workspaceSelectedFieldNames, + allFields, + searchMode, + }); + setSelectedFieldsState(result); + }, [ + dataView, + workspaceSelectedFieldNames, + setSelectedFieldsState, + allFields, + searchMode, + onSelectedFieldFilter, + ]); + + useEffect(() => { + if ( + searchMode !== 'documents' || + !useNewFieldsApi || + stateService.creationOptions.disableMultiFieldsGroupingByParent + ) { + setMultiFieldsMap(undefined); // we don't have to calculate multifields in this case + } else { + setMultiFieldsMap(calculateMultiFields(allFields, selectedFieldsState.selectedFieldsMap)); + } + }, [ + stateService.creationOptions.disableMultiFieldsGroupingByParent, + selectedFieldsState.selectedFieldsMap, + allFields, + useNewFieldsApi, + setMultiFieldsMap, + searchMode, + ]); + + const popularFieldsLimit = useMemo( + () => core.uiSettings.get(FIELDS_LIMIT_SETTING), + [core.uiSettings] + ); + const onSupportedFieldFilter: GroupedFieldsParams['onSupportedFieldFilter'] = + useCallback( + (field) => { + return shouldShowField( + field, + searchMode, + stateService.creationOptions.disableMultiFieldsGroupingByParent + ); + }, + [searchMode, stateService.creationOptions.disableMultiFieldsGroupingByParent] + ); + + const { fieldListFiltersProps, fieldListGroupedProps } = useGroupedFields({ + dataViewId: (searchMode === 'documents' && dataView?.id) || null, // passing `null` for text-based queries + allFields, + popularFieldsLimit: + searchMode !== 'documents' || stateService.creationOptions.disablePopularFields + ? 0 + : popularFieldsLimit, + isAffectedByGlobalFilter, + services: { + dataViews, + core, + }, + sortedSelectedFields: onSelectedFieldFilter ? undefined : selectedFieldsState.selectedFields, + onSelectedFieldFilter, + onSupportedFieldFilter: + stateService.creationOptions.onSupportedFieldFilter ?? onSupportedFieldFilter, + onOverrideFieldGroupDetails: stateService.creationOptions.onOverrideFieldGroupDetails, + }); + + const renderFieldItem: FieldListGroupedProps['renderFieldItem'] = useCallback( + ({ field, groupName, groupIndex, itemIndex, fieldSearchHighlight }) => ( +
  • + +
  • + ), + [ + stateService, + searchMode, + services, + alwaysShowActionButton, + dataView, + onAddFieldToWorkspace, + onRemoveFieldFromWorkspace, + onAddFilter, + trackUiMetric, + multiFieldsMap, + onEditField, + onDeleteField, + workspaceSelectedFieldNames, + selectedFieldsState.selectedFieldsMap, + ] + ); + + if (!dataView) { + return null; + } + + return ( + + + {Boolean(prepend) && {prepend}} + + } + className="unifiedFieldListSidebar__list" + > + {showFieldList ? ( + + ) : ( + + )} + {!!onEditField && ( + + onEditField()} + size="s" + > + {i18n.translate('unifiedFieldList.fieldListSidebar.addFieldButtonLabel', { + defaultMessage: 'Add a field', + })} + + + )} + + + + + ); +}; + +export const UnifiedFieldListSidebar = memo(UnifiedFieldListSidebarComponent); + +// Necessary for React.lazy +// eslint-disable-next-line import/no-default-export +export default UnifiedFieldListSidebar; + +function calculateMultiFields( + allFields: DataViewField[] | null, + selectedFieldsMap: SelectedFieldsResult['selectedFieldsMap'] | undefined +) { + if (!allFields) { + return undefined; + } + const map = new Map>(); + allFields.forEach((field) => { + const subTypeMulti = getDataViewFieldSubtypeMulti(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/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/field_list_sidebar_container.tsx b/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/field_list_sidebar_container.tsx new file mode 100644 index 0000000000000..4765280b4ef68 --- /dev/null +++ b/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/field_list_sidebar_container.tsx @@ -0,0 +1,349 @@ +/* + * Copyright 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, { + useCallback, + useState, + forwardRef, + useImperativeHandle, + useRef, + useMemo, + useEffect, +} from 'react'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n-react'; +import type { IndexPatternFieldEditorStart } from '@kbn/data-view-field-editor-plugin/public'; +import { + EuiBadge, + EuiButton, + EuiFlyout, + EuiFlyoutHeader, + EuiHideFor, + EuiIcon, + EuiLink, + EuiPortal, + EuiShowFor, + EuiTitle, +} from '@elastic/eui'; +import { + useExistingFieldsFetcher, + type ExistingFieldsFetcher, +} from '../../hooks/use_existing_fields'; +import { useQuerySubscriber } from '../../hooks/use_query_subscriber'; +import { + UnifiedFieldListSidebar, + type UnifiedFieldListSidebarCustomizableProps, + type UnifiedFieldListSidebarProps, +} from './field_list_sidebar'; +import { createStateService } from '../services/state_service'; +import type { + UnifiedFieldListSidebarContainerCreationOptions, + UnifiedFieldListSidebarContainerStateService, + SearchMode, +} from '../../types'; + +export interface UnifiedFieldListSidebarContainerApi { + refetchFieldsExistenceInfo: ExistingFieldsFetcher['refetchFieldsExistenceInfo']; + closeFieldListFlyout: () => void; + // no user permission or missing dataViewFieldEditor service will result in `undefined` API methods + createField: undefined | (() => void); + editField: undefined | ((fieldName: string) => void); + deleteField: undefined | ((fieldName: string) => void); +} + +export type UnifiedFieldListSidebarContainerProps = Omit< + UnifiedFieldListSidebarCustomizableProps, + 'services' +> & { + /** + * Required services. + */ + services: UnifiedFieldListSidebarCustomizableProps['services'] & { + dataViewFieldEditor?: IndexPatternFieldEditorStart; + }; + + /** + * Return static configuration options which don't need to change + */ + getCreationOptions: () => UnifiedFieldListSidebarContainerCreationOptions; + + /** + * In case if you have a sidebar toggle button + */ + isSidebarCollapsed?: boolean; + + /** + * Custom content to render at the top of field list in the flyout (for example a data view picker) + */ + prependInFlyout?: () => UnifiedFieldListSidebarProps['prepend']; + + /** + * Customization for responsive behaviour. Default: `responsive`. + */ + variant?: 'responsive' | 'button-and-flyout-always' | 'list-always'; + + /** + * Custom logic for determining which field is selected. Otherwise, use `workspaceSelectedFieldNames` prop. + */ + onSelectedFieldFilter?: UnifiedFieldListSidebarProps['onSelectedFieldFilter']; + + /** + * Callback to execute after editing/deleting a runtime field + */ + onFieldEdited?: (options?: { + removedFieldName?: string; + editedFieldName?: string; + }) => Promise; +}; + +/** + * Component providing 2 different renderings for the sidebar depending on available screen space + * Desktop: Sidebar view, all elements are visible + * Mobile: A button to trigger a flyout with all elements + */ +const UnifiedFieldListSidebarContainer = forwardRef< + UnifiedFieldListSidebarContainerApi, + UnifiedFieldListSidebarContainerProps +>(function UnifiedFieldListSidebarContainer(props, componentRef) { + const { + getCreationOptions, + services, + dataView, + workspaceSelectedFieldNames, + isSidebarCollapsed, // TODO later: pull the logic of collapsing the sidebar to this component + prependInFlyout, + variant = 'responsive', + onFieldEdited, + } = props; + const [stateService] = useState( + createStateService({ options: getCreationOptions() }) + ); + const { data, dataViewFieldEditor } = services; + const [isFieldListFlyoutVisible, setIsFieldListFlyoutVisible] = useState(false); + + const canEditDataView = + Boolean(dataViewFieldEditor?.userPermissions.editIndexPattern()) || + Boolean(dataView && !dataView.isPersisted()); + const closeFieldEditor = useRef<() => void | undefined>(); + const setFieldEditorRef = useCallback((ref: () => void | undefined) => { + closeFieldEditor.current = ref; + }, []); + + const closeFieldListFlyout = useCallback(() => { + setIsFieldListFlyoutVisible(false); + }, []); + + const querySubscriberResult = useQuerySubscriber({ + data, + timeRangeUpdatesType: stateService.creationOptions.timeRangeUpdatesType, + }); + const searchMode: SearchMode | undefined = querySubscriberResult.searchMode; + const isAffectedByGlobalFilter = Boolean(querySubscriberResult.filters?.length); + + const { isProcessing, refetchFieldsExistenceInfo } = useExistingFieldsFetcher({ + disableAutoFetching: stateService.creationOptions.disableFieldsExistenceAutoFetching, + dataViews: searchMode === 'documents' && dataView ? [dataView] : [], + query: querySubscriberResult.query, + filters: querySubscriberResult.filters, + fromDate: querySubscriberResult.fromDate, + toDate: querySubscriberResult.toDate, + services, + }); + + const editField = useMemo( + () => + dataView && dataViewFieldEditor && searchMode === 'documents' && canEditDataView + ? (fieldName?: string) => { + const ref = dataViewFieldEditor.openEditor({ + ctx: { + dataView, + }, + fieldName, + onSave: async () => { + if (onFieldEdited) { + await onFieldEdited({ editedFieldName: fieldName }); + } + }, + }); + setFieldEditorRef(ref); + closeFieldListFlyout(); + } + : undefined, + [ + searchMode, + canEditDataView, + dataViewFieldEditor, + dataView, + setFieldEditorRef, + closeFieldListFlyout, + onFieldEdited, + ] + ); + + const deleteField = useMemo( + () => + dataView && dataViewFieldEditor && editField + ? (fieldName: string) => { + const ref = dataViewFieldEditor.openDeleteModal({ + ctx: { + dataView, + }, + fieldName, + onDelete: async () => { + if (onFieldEdited) { + await onFieldEdited({ removedFieldName: fieldName }); + } + }, + }); + setFieldEditorRef(ref); + closeFieldListFlyout(); + } + : undefined, + [ + dataView, + setFieldEditorRef, + editField, + closeFieldListFlyout, + dataViewFieldEditor, + onFieldEdited, + ] + ); + + useEffect(() => { + const cleanup = () => { + if (closeFieldEditor?.current) { + closeFieldEditor?.current(); + } + }; + return () => { + // Make sure to close the editor when unmounting + cleanup(); + }; + }, []); + + useImperativeHandle( + componentRef, + () => ({ + refetchFieldsExistenceInfo, + closeFieldListFlyout, + createField: editField, + editField, + deleteField, + }), + [refetchFieldsExistenceInfo, closeFieldListFlyout, editField, deleteField] + ); + + if (!dataView) { + return null; + } + + const commonSidebarProps: UnifiedFieldListSidebarProps = { + ...props, + searchMode, + stateService, + isProcessing, + isAffectedByGlobalFilter, + onEditField: editField, + onDeleteField: deleteField, + }; + + const buttonPropsToTriggerFlyout = stateService.creationOptions.buttonPropsToTriggerFlyout; + + const renderListVariant = () => { + return ; + }; + + const renderButtonVariant = () => { + return ( + <> +
    + setIsFieldListFlyoutVisible(true)} + > + + + {!workspaceSelectedFieldNames?.length || workspaceSelectedFieldNames[0] === '_source' + ? 0 + : workspaceSelectedFieldNames.length} + + +
    + {isFieldListFlyoutVisible && ( + + setIsFieldListFlyoutVisible(false)} + aria-labelledby="flyoutTitle" + ownFocus + > + + +

    + setIsFieldListFlyoutVisible(false)}> + {' '} + + {i18n.translate('unifiedFieldList.fieldListSidebar.flyoutHeading', { + defaultMessage: 'Field list', + })} + + +

    +
    +
    + +
    +
    + )} + + ); + }; + + if (variant === 'button-and-flyout-always') { + return renderButtonVariant(); + } + + if (variant === 'list-always') { + return (!isSidebarCollapsed && renderListVariant()) || null; + } + + return ( + <> + {!isSidebarCollapsed && {renderListVariant()}} + {renderButtonVariant()} + + ); +}); + +// Necessary for React.lazy +// eslint-disable-next-line import/no-default-export +export default UnifiedFieldListSidebarContainer; diff --git a/src/plugins/discover/public/application/main/components/sidebar/lib/group_fields.test.ts b/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/group_fields.test.ts similarity index 68% rename from src/plugins/discover/public/application/main/components/sidebar/lib/group_fields.test.ts rename to packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/group_fields.test.ts index 53d0bc96d3ca8..ac9142aedd5ed 100644 --- a/src/plugins/discover/public/application/main/components/sidebar/lib/group_fields.test.ts +++ b/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/group_fields.test.ts @@ -14,9 +14,9 @@ describe('group_fields', function () { it('should pick fields as unknown_selected if they are unknown', function () { const actual = getSelectedFields({ dataView, - columns: ['currency'], + workspaceSelectedFieldNames: ['currency'], allFields: dataView.fields, - isPlainRecord: false, + searchMode: 'documents', }); expect(actual).toMatchInlineSnapshot(` Object { @@ -37,14 +37,14 @@ describe('group_fields', function () { it('should pick fields as nested for a nested field root', function () { const actual = getSelectedFields({ dataView, - columns: ['nested1', 'bytes'], + workspaceSelectedFieldNames: ['nested1', 'bytes'], allFields: [ { name: 'nested1', type: 'nested', }, ] as DataViewField[], - isPlainRecord: false, + searchMode: 'documents', }); expect(actual.selectedFieldsMap).toMatchInlineSnapshot(` Object { @@ -56,14 +56,19 @@ describe('group_fields', function () { it('should work correctly if no columns selected', function () { expect( - getSelectedFields({ dataView, columns: [], allFields: dataView.fields, isPlainRecord: false }) + getSelectedFields({ + dataView, + workspaceSelectedFieldNames: [], + allFields: dataView.fields, + searchMode: 'documents', + }) ).toBe(INITIAL_SELECTED_FIELDS_RESULT); expect( getSelectedFields({ dataView, - columns: ['_source'], + workspaceSelectedFieldNames: ['_source'], allFields: dataView.fields, - isPlainRecord: false, + searchMode: 'documents', }) ).toBe(INITIAL_SELECTED_FIELDS_RESULT); }); @@ -71,9 +76,9 @@ describe('group_fields', function () { it('should pick fields into selected group', function () { const actual = getSelectedFields({ dataView, - columns: ['bytes', '@timestamp'], + workspaceSelectedFieldNames: ['bytes', '@timestamp'], allFields: dataView.fields, - isPlainRecord: false, + searchMode: 'documents', }); expect(actual.selectedFields.map((field) => field.name)).toEqual(['bytes', '@timestamp']); expect(actual.selectedFieldsMap).toStrictEqual({ @@ -85,9 +90,9 @@ describe('group_fields', function () { it('should pick fields into selected group if they contain multifields', function () { const actual = getSelectedFields({ dataView, - columns: ['machine.os', 'machine.os.raw'], + workspaceSelectedFieldNames: ['machine.os', 'machine.os.raw'], allFields: dataView.fields, - isPlainRecord: false, + searchMode: 'documents', }); expect(actual.selectedFields.map((field) => field.name)).toEqual([ 'machine.os', @@ -102,9 +107,9 @@ describe('group_fields', function () { it('should sort selected fields by columns order', function () { const actual1 = getSelectedFields({ dataView, - columns: ['bytes', 'extension.keyword', 'unknown'], + workspaceSelectedFieldNames: ['bytes', 'extension.keyword', 'unknown'], allFields: dataView.fields, - isPlainRecord: false, + searchMode: 'documents', }); expect(actual1.selectedFields.map((field) => field.name)).toEqual([ 'bytes', @@ -119,9 +124,9 @@ describe('group_fields', function () { const actual2 = getSelectedFields({ dataView, - columns: ['extension', 'bytes', 'unknown'], + workspaceSelectedFieldNames: ['extension', 'bytes', 'unknown'], allFields: dataView.fields, - isPlainRecord: false, + searchMode: 'documents', }); expect(actual2.selectedFields.map((field) => field.name)).toEqual([ 'extension', @@ -138,14 +143,14 @@ describe('group_fields', function () { it('should pick fields only from allFields instead of data view fields for a text based query', function () { const actual = getSelectedFields({ dataView, - columns: ['bytes'], + workspaceSelectedFieldNames: ['bytes'], allFields: [ { name: 'bytes', type: 'text', }, ] as DataViewField[], - isPlainRecord: true, + searchMode: 'text-based', }); expect(actual).toMatchInlineSnapshot(` Object { @@ -163,30 +168,38 @@ describe('group_fields', function () { }); 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); + expect(shouldShowField(dataView.getFieldByName('bytes'), 'text-based', false)).toBe(true); + expect( + shouldShowField({ type: 'unknown', name: 'unknown' } as DataViewField, 'text-based', false) + ).toBe(true); + expect( + shouldShowField({ type: '_source', name: 'source' } as DataViewField, 'text-based', false) + ).toBe(false); }); - 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( + it('should show fields excluding subfields', function () { + expect(shouldShowField(dataView.getFieldByName('extension'), 'documents', false)).toBe(true); + expect(shouldShowField(dataView.getFieldByName('extension.keyword'), 'documents', false)).toBe( false ); + expect( + shouldShowField({ type: 'unknown', name: 'unknown' } as DataViewField, 'documents', false) + ).toBe(true); + expect( + shouldShowField({ type: '_source', name: 'source' } as DataViewField, 'documents', false) + ).toBe(false); }); - 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( + it('should show fields including subfields', function () { + expect(shouldShowField(dataView.getFieldByName('extension'), 'documents', true)).toBe(true); + expect(shouldShowField(dataView.getFieldByName('extension.keyword'), 'documents', true)).toBe( true ); - expect(shouldShowField({ type: '_source', name: 'source' } as DataViewField, false)).toBe( - false - ); + expect( + shouldShowField({ type: 'unknown', name: 'unknown' } as DataViewField, 'documents', true) + ).toBe(true); + expect( + shouldShowField({ type: '_source', name: 'source' } as DataViewField, 'documents', true) + ).toBe(false); }); }); diff --git a/src/plugins/discover/public/application/main/components/sidebar/lib/group_fields.tsx b/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/group_fields.tsx similarity index 60% rename from src/plugins/discover/public/application/main/components/sidebar/lib/group_fields.tsx rename to packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/group_fields.tsx index 11bbd285f4b7e..30876651bb03b 100644 --- a/src/plugins/discover/public/application/main/components/sidebar/lib/group_fields.tsx +++ b/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/group_fields.tsx @@ -12,15 +12,24 @@ import { type DataView, getFieldSubtypeMulti, } from '@kbn/data-views-plugin/public'; +import type { SearchMode } from '../../types'; -export function shouldShowField(field: DataViewField | undefined, isPlainRecord: boolean): boolean { +export function shouldShowField( + field: DataViewField | undefined, + searchMode: SearchMode | undefined, + disableMultiFieldsGroupingByParent: boolean | undefined +): boolean { if (!field?.type || field.type === '_source') { return false; } - if (isPlainRecord) { + if (searchMode === 'text-based') { // exclude only `_source` for plain records return true; } + if (disableMultiFieldsGroupingByParent) { + // include subfields + return true; + } // exclude subfields return !getFieldSubtypeMulti(field?.spec); } @@ -38,31 +47,36 @@ export interface SelectedFieldsResult { export function getSelectedFields({ dataView, - columns, + workspaceSelectedFieldNames, allFields, - isPlainRecord, + searchMode, }: { dataView: DataView | undefined; - columns: string[]; + workspaceSelectedFieldNames?: string[]; allFields: DataViewField[] | null; - isPlainRecord: boolean; + searchMode: SearchMode | undefined; }): SelectedFieldsResult { const result: SelectedFieldsResult = { selectedFields: [], selectedFieldsMap: {}, }; - if (!Array.isArray(columns) || !columns.length || !allFields) { + if ( + !workspaceSelectedFieldNames || + !Array.isArray(workspaceSelectedFieldNames) || + !workspaceSelectedFieldNames.length || + !allFields + ) { return INITIAL_SELECTED_FIELDS_RESULT; } - // add selected columns, that are not part of the data view, to be removable - for (const column of columns) { + // add selected field names, that are not part of the data view, to be removable + for (const selectedFieldName of workspaceSelectedFieldNames) { const selectedField = - (!isPlainRecord && dataView?.getFieldByName?.(column)) || - allFields.find((field) => field.name === column) || // for example to pick a `nested` root field or find a selected field in text-based response + (searchMode === 'documents' && dataView?.getFieldByName?.(selectedFieldName)) || + allFields.find((field) => field.name === selectedFieldName) || // for example to pick a `nested` root field or find a selected field in text-based response ({ - name: column, - displayName: column, + name: selectedFieldName, + displayName: selectedFieldName, type: 'unknown_selected', } as DataViewField); result.selectedFields.push(selectedField); diff --git a/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/index.tsx b/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/index.tsx new file mode 100644 index 0000000000000..f93ff01714f60 --- /dev/null +++ b/packages/kbn-unified-field-list/src/containers/unified_field_list_sidebar/index.tsx @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { withSuspense } from '@kbn/shared-ux-utility'; +import { EuiDelayRender, EuiLoadingSpinner, EuiPanel } from '@elastic/eui'; +import type { + UnifiedFieldListSidebarContainerProps, + UnifiedFieldListSidebarContainerApi, +} from './field_list_sidebar_container'; + +const LazyUnifiedFieldListSidebarContainer = React.lazy( + () => import('./field_list_sidebar_container') +); + +export const UnifiedFieldListSidebarContainer = withSuspense< + UnifiedFieldListSidebarContainerProps, + UnifiedFieldListSidebarContainerApi +>( + LazyUnifiedFieldListSidebarContainer, + + + + + +); + +export type { UnifiedFieldListSidebarContainerProps, UnifiedFieldListSidebarContainerApi }; diff --git a/packages/kbn-unified-field-list/src/hooks/use_grouped_fields.ts b/packages/kbn-unified-field-list/src/hooks/use_grouped_fields.ts index 45432fb9bba81..f51f9b0fffb2d 100644 --- a/packages/kbn-unified-field-list/src/hooks/use_grouped_fields.ts +++ b/packages/kbn-unified-field-list/src/hooks/use_grouped_fields.ts @@ -14,9 +14,9 @@ import { type DataView, type DataViewField } from '@kbn/data-views-plugin/common import { type DataViewsContract } from '@kbn/data-views-plugin/public'; import { type FieldListGroups, - type FieldsGroupDetails, type FieldsGroup, type FieldListItem, + type OverrideFieldGroupDetails, FieldsGroupNames, ExistenceFetchStatus, } from '../types'; @@ -38,9 +38,7 @@ export interface GroupedFieldsParams { popularFieldsLimit?: number; sortedSelectedFields?: T[]; getCustomFieldType?: FieldFiltersParams['getCustomFieldType']; - onOverrideFieldGroupDetails?: ( - groupName: FieldsGroupNames - ) => Partial | undefined | null; + onOverrideFieldGroupDetails?: OverrideFieldGroupDetails; onSupportedFieldFilter?: (field: T) => boolean; onSelectedFieldFilter?: (field: T) => boolean; } diff --git a/packages/kbn-unified-field-list/src/hooks/use_query_subscriber.ts b/packages/kbn-unified-field-list/src/hooks/use_query_subscriber.ts index 7a3c9788ab162..1747746edc722 100644 --- a/packages/kbn-unified-field-list/src/hooks/use_query_subscriber.ts +++ b/packages/kbn-unified-field-list/src/hooks/use_query_subscriber.ts @@ -9,14 +9,19 @@ import { useEffect, useState } from 'react'; import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; import type { AggregateQuery, Query, Filter } from '@kbn/es-query'; +import { getAggregateQueryMode, isOfAggregateQueryType } from '@kbn/es-query'; import { getResolvedDateRange } from '../utils/get_resolved_date_range'; +import type { TimeRangeUpdatesType, SearchMode } from '../types'; /** * Hook params */ export interface QuerySubscriberParams { data: DataPublicPluginStart; - listenToSearchSessionUpdates?: boolean; + /** + * Pass `timefilter` only if you are not using search sessions for the global search + */ + timeRangeUpdatesType?: TimeRangeUpdatesType; } /** @@ -27,17 +32,18 @@ export interface QuerySubscriberResult { filters: Filter[] | undefined; fromDate: string | undefined; toDate: string | undefined; + searchMode: SearchMode | undefined; } /** * Memorizes current query, filters and absolute date range * @param data - * @param listenToSearchSessionUpdates + * @param timeRangeUpdatesType * @public */ export const useQuerySubscriber = ({ data, - listenToSearchSessionUpdates = true, + timeRangeUpdatesType = 'search-session', }: QuerySubscriberParams) => { const timefilter = data.query.timefilter.timefilter; const [result, setResult] = useState(() => { @@ -48,11 +54,12 @@ export const useQuerySubscriber = ({ filters: state?.filters, fromDate: dateRange.fromDate, toDate: dateRange.toDate, + searchMode: getSearchMode(state?.query), }; }); useEffect(() => { - if (!listenToSearchSessionUpdates) { + if (timeRangeUpdatesType !== 'search-session') { return; } @@ -66,10 +73,10 @@ export const useQuerySubscriber = ({ }); return () => subscription.unsubscribe(); - }, [setResult, timefilter, data.search.session.state$, listenToSearchSessionUpdates]); + }, [setResult, timefilter, data.search.session.state$, timeRangeUpdatesType]); useEffect(() => { - if (listenToSearchSessionUpdates) { + if (timeRangeUpdatesType !== 'timefilter') { return; } @@ -83,7 +90,7 @@ export const useQuerySubscriber = ({ }); return () => subscription.unsubscribe(); - }, [setResult, timefilter, listenToSearchSessionUpdates]); + }, [setResult, timefilter, timeRangeUpdatesType]); useEffect(() => { const subscription = data.query.state$.subscribe(({ state, changes }) => { @@ -92,6 +99,7 @@ export const useQuerySubscriber = ({ ...prevState, query: state.query, filters: state.filters, + searchMode: getSearchMode(state.query), })); } }); @@ -114,4 +122,25 @@ export const hasQuerySubscriberData = ( filters: Filter[]; fromDate: string; toDate: string; -} => Boolean(result.query && result.filters && result.fromDate && result.toDate); + searchMode: SearchMode; +} => + Boolean(result.query && result.filters && result.fromDate && result.toDate && result.searchMode); + +/** + * Determines current search mode + * @param query + */ +export function getSearchMode(query?: Query | AggregateQuery): SearchMode | undefined { + if (!query) { + return undefined; + } + + if ( + isOfAggregateQueryType(query) && + (getAggregateQueryMode(query) === 'sql' || getAggregateQueryMode(query) === 'esql') + ) { + return 'text-based'; + } + + return 'documents'; +} diff --git a/packages/kbn-unified-field-list/src/types.ts b/packages/kbn-unified-field-list/src/types.ts index d17a3a294446b..ab9c2af61171a 100755 --- a/packages/kbn-unified-field-list/src/types.ts +++ b/packages/kbn-unified-field-list/src/types.ts @@ -7,6 +7,7 @@ */ import type { DataViewField } from '@kbn/data-views-plugin/common'; +import type { EuiButtonIconProps, EuiButtonProps } from '@elastic/eui'; export interface BucketedAggregation { buckets: Array<{ @@ -103,3 +104,93 @@ export interface RenderFieldItemParams { groupName: FieldsGroupNames; fieldSearchHighlight?: string; } + +export type OverrideFieldGroupDetails = ( + groupName: FieldsGroupNames +) => Partial | undefined | null; + +export type TimeRangeUpdatesType = 'search-session' | 'timefilter'; + +export type SearchMode = 'documents' | 'text-based'; + +export interface UnifiedFieldListSidebarContainerCreationOptions { + /** + * Plugin ID + */ + originatingApp: string; + + /** + * Your app name: "discover", "lens", etc. If not provided, sections state would not be persisted. + */ + localStorageKeyPrefix?: string; + + /** + * Pass `timefilter` only if you are not using search sessions for the global search + */ + timeRangeUpdatesType?: TimeRangeUpdatesType; + + /** + * Pass `true` to skip auto fetching of fields existence info + */ + disableFieldsExistenceAutoFetching?: boolean; + + /** + * Pass `true` to see all multi fields flattened in the list. Otherwise, they will show in a field popover. + */ + disableMultiFieldsGroupingByParent?: boolean; + + /** + * Pass `true` to not have "Popular Fields" section in the field list + */ + disablePopularFields?: boolean; + + /** + * Pass `true` to have non-draggable field list items (like in the mobile flyout) + */ + disableFieldListItemDragAndDrop?: boolean; + + /** + * This button will be shown in mobile view + */ + buttonPropsToTriggerFlyout?: Partial; + + /** + * Custom props like `aria-label` + */ + buttonAddFieldToWorkspaceProps?: Partial; + + /** + * Custom props like `aria-label` + */ + buttonRemoveFieldFromWorkspaceProps?: Partial; + + /** + * Return custom configuration for field list sections + */ + onOverrideFieldGroupDetails?: OverrideFieldGroupDetails; + + /** + * Use this predicate to hide certain fields + * @param field + */ + onSupportedFieldFilter?: (field: DataViewField) => boolean; + + /** + * Custom `data-test-subj`. Mostly for preserving legacy values. + */ + dataTestSubj?: { + fieldListAddFieldButtonTestSubj?: string; + fieldListSidebarDataTestSubj?: string; + fieldListItemStatsDataTestSubj?: string; + fieldListItemDndDataTestSubjPrefix?: string; + fieldListItemPopoverDataTestSubj?: string; + fieldListItemPopoverHeaderDataTestSubjPrefix?: string; + }; +} + +/** + * The service used to manage the state of the container + */ +export interface UnifiedFieldListSidebarContainerStateService { + creationOptions: UnifiedFieldListSidebarContainerCreationOptions; +} diff --git a/packages/kbn-unified-field-list/tsconfig.json b/packages/kbn-unified-field-list/tsconfig.json index 8ace312498ae0..77edc97585a81 100644 --- a/packages/kbn-unified-field-list/tsconfig.json +++ b/packages/kbn-unified-field-list/tsconfig.json @@ -3,7 +3,7 @@ "compilerOptions": { "outDir": "target/types" }, - "include": ["*.ts", "src/**/*"], + "include": ["*.ts", "src/**/*", "__mocks__/**/*.ts"], "kbn_references": [ "@kbn/i18n", "@kbn/data-views-plugin", @@ -24,6 +24,9 @@ "@kbn/field-types", "@kbn/ui-actions-browser", "@kbn/data-service", + "@kbn/data-view-field-editor-plugin", + "@kbn/dom-drag-drop", + "@kbn/shared-ux-utility", ], "exclude": ["target/**/*"] } diff --git a/src/core/server/integration_tests/saved_objects/migrations/zdt_2/v2_to_zdt_partial_failure.test.ts b/src/core/server/integration_tests/saved_objects/migrations/zdt_2/v2_to_zdt_partial_failure.test.ts new file mode 100644 index 0000000000000..0cfebd3d8514b --- /dev/null +++ b/src/core/server/integration_tests/saved_objects/migrations/zdt_2/v2_to_zdt_partial_failure.test.ts @@ -0,0 +1,173 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import Path from 'path'; +import fs from 'fs/promises'; +import { range } from 'lodash'; +import { type TestElasticsearchUtils } from '@kbn/core-test-helpers-kbn-server'; +import { SavedObjectsBulkCreateObject } from '@kbn/core-saved-objects-api-server'; +import '../jest_matchers'; +import { getKibanaMigratorTestKit, startElasticsearch } from '../kibana_migrator_test_kit'; +import { delay, parseLogFile, createType } from '../test_utils'; +import { getBaseMigratorParams, noopMigration } from '../fixtures/zdt_base.fixtures'; + +const logFilePath = Path.join(__dirname, 'v2_to_zdt_partial_failure.test.log'); + +describe('ZDT with v2 compat - recovering from partially migrated state', () => { + let esServer: TestElasticsearchUtils['es']; + + beforeAll(async () => { + await fs.unlink(logFilePath).catch(() => {}); + esServer = await startElasticsearch(); + }); + + afterAll(async () => { + await esServer?.stop(); + await delay(10); + }); + + const typeBefore = createType({ + name: 'switching_type', + mappings: { + properties: { + text: { type: 'text' }, + keyword: { type: 'keyword' }, + }, + }, + migrations: { + '7.0.0': noopMigration, + '7.5.0': noopMigration, + }, + }); + + const typeFailingBetween = createType({ + ...typeBefore, + switchToModelVersionAt: '8.0.0', + modelVersions: { + 1: { + changes: [ + { + type: 'data_backfill', + backfillFn: (doc) => { + // this was the easiest way to simulate a migrate failure during doc mig. + throw new Error('need something to interrupt the migration'); + }, + }, + ], + }, + }, + mappings: { + properties: { + text: { type: 'text' }, + keyword: { type: 'keyword' }, + newField: { type: 'text' }, + }, + }, + }); + + const typeAfter = createType({ + ...typeBefore, + switchToModelVersionAt: '8.0.0', + modelVersions: { + 1: { + changes: [ + { + type: 'data_backfill', + backfillFn: (doc) => { + return { attributes: { newField: 'some value' } }; + }, + }, + ], + }, + }, + mappings: { + properties: { + text: { type: 'text' }, + keyword: { type: 'keyword' }, + newField: { type: 'text' }, + }, + }, + }); + + const createBaseline = async () => { + const { runMigrations, savedObjectsRepository } = await getKibanaMigratorTestKit({ + ...getBaseMigratorParams({ migrationAlgorithm: 'v2', kibanaVersion: '8.9.0' }), + types: [typeBefore], + }); + await runMigrations(); + + const sampleObjs = range(5).map((number) => ({ + id: `doc-${number}`, + type: 'switching_type', + attributes: { + text: `text ${number}`, + keyword: `kw ${number}`, + }, + })); + + await savedObjectsRepository.bulkCreate(sampleObjs); + }; + + const runFailingMigration = async () => { + const { runMigrations } = await getKibanaMigratorTestKit({ + ...getBaseMigratorParams(), + types: [typeFailingBetween], + }); + + await expect(runMigrations()).rejects.toBeDefined(); + }; + + it('migrates the documents', async () => { + await createBaseline(); + await runFailingMigration(); + + const { runMigrations, client, savedObjectsRepository } = await getKibanaMigratorTestKit({ + ...getBaseMigratorParams(), + logFilePath, + types: [typeAfter], + }); + + await runMigrations(); + + const indices = await client.indices.get({ index: '.kibana*' }); + expect(Object.keys(indices)).toEqual(['.kibana_8.9.0_001']); + + const index = indices['.kibana_8.9.0_001']; + const mappings = index.mappings ?? {}; + const mappingMeta = mappings._meta ?? {}; + + expect(mappings.properties).toEqual( + expect.objectContaining({ + switching_type: typeAfter.mappings, + }) + ); + + expect(mappingMeta.docVersions).toEqual({ + switching_type: '10.1.0', + }); + + const { saved_objects: sampleDocs } = await savedObjectsRepository.find({ + type: 'switching_type', + }); + + expect(sampleDocs).toHaveLength(5); + + const records = await parseLogFile(logFilePath); + expect(records).toContainLogEntries( + [ + 'current algo check result: v2-partially-migrated', + 'INIT -> INDEX_STATE_UPDATE_DONE', + 'INDEX_STATE_UPDATE_DONE -> DOCUMENTS_UPDATE_INIT', + 'Starting to process 5 documents.', + '-> DONE', + 'Migration completed', + ], + { ordered: true } + ); + }); +}); diff --git a/src/plugins/discover/public/__mocks__/data_view.ts b/src/plugins/discover/public/__mocks__/data_view.ts index d660eef2b9b38..b6f86109b580b 100644 --- a/src/plugins/discover/public/__mocks__/data_view.ts +++ b/src/plugins/discover/public/__mocks__/data_view.ts @@ -6,9 +6,9 @@ * Side Public License, v 1. */ -import { DataView } from '@kbn/data-views-plugin/public'; +import { DataView, DataViewField } from '@kbn/data-views-plugin/public'; -export const fields = [ +export const shallowMockedFields = [ { name: '_source', type: '_source', @@ -73,6 +73,10 @@ export const fields = [ }, ] as DataView['fields']; +export const deepMockedFields = shallowMockedFields.map( + (field) => new DataViewField(field) +) as DataView['fields']; + export const buildDataViewMock = ({ name, fields: definedFields, @@ -120,4 +124,7 @@ export const buildDataViewMock = ({ return dataView; }; -export const dataViewMock = buildDataViewMock({ name: 'the-data-view', fields }); +export const dataViewMock = buildDataViewMock({ + name: 'the-data-view', + fields: shallowMockedFields, +}); diff --git a/src/plugins/discover/public/__mocks__/services.ts b/src/plugins/discover/public/__mocks__/services.ts index 745059cc1be23..8a624a0326936 100644 --- a/src/plugins/discover/public/__mocks__/services.ts +++ b/src/plugins/discover/public/__mocks__/services.ts @@ -92,15 +92,55 @@ export function createDiscoverServicesMock(): DiscoverServices { return searchSource; }); + const corePluginMock = coreMock.createStart(); + + const uiSettingsMock: Partial = { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + get: jest.fn((key: string): any => { + 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; + } else if (key === SEARCH_ON_PAGE_LOAD_SETTING) { + return true; + } + }), + isDefault: jest.fn((key: string) => { + return true; + }), + }; + + corePluginMock.uiSettings = { + ...corePluginMock.uiSettings, + ...uiSettingsMock, + }; + const theme = { theme$: of({ darkMode: false }), }; + corePluginMock.theme = theme; + return { - core: { - ...coreMock.createStart(), - theme, - }, + core: corePluginMock, charts: chartPluginMock.createSetupContract(), chrome: chromeServiceMock.createStartContract(), history: () => ({ @@ -128,50 +168,20 @@ export function createDiscoverServicesMock(): DiscoverServices { open: jest.fn(), }, uiActions: uiActionsPluginMock.createStartContract(), - 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; - } else if (key === SEARCH_ON_PAGE_LOAD_SETTING) { - return true; - } - }), - isDefault: (key: string) => { - return true; - }, - }, + uiSettings: uiSettingsMock, http: { basePath: '/', }, dataViewEditor: { + openEditor: jest.fn(), userPermissions: { - editDataView: () => true, + editDataView: jest.fn(() => true), }, }, dataViewFieldEditor: { openEditor: jest.fn(), userPermissions: { - editIndexPattern: jest.fn(), + editIndexPattern: jest.fn(() => true), }, }, navigation: { 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 e7a0bd9f642d1..68c8b7ba0b318 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 @@ -8,6 +8,7 @@ import React from 'react'; import { BehaviorSubject, of } from 'rxjs'; +import { EuiPageSidebar } from '@elastic/eui'; import { mountWithIntl } from '@kbn/test-jest-helpers'; import type { Query, AggregateQuery } from '@kbn/es-query'; import { setHeaderActionMenuMounter } from '../../../../kibana_services'; @@ -31,7 +32,6 @@ import { import { createDiscoverServicesMock } from '../../../../__mocks__/services'; import { FetchStatus } from '../../../types'; import { RequestAdapter } from '@kbn/inspector-plugin/common'; -import { DiscoverSidebar } from '../sidebar/discover_sidebar'; import { LocalStorageMock } from '../../../../__mocks__/local_storage_mock'; import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; import { DiscoverServices } from '../../../../build_services'; @@ -164,17 +164,17 @@ describe('Discover component', () => { describe('sidebar', () => { test('should be opened if discover:sidebarClosed was not set', async () => { const component = await mountComponent(dataViewWithTimefieldMock, undefined); - expect(component.find(DiscoverSidebar).length).toBe(1); + expect(component.find(EuiPageSidebar).length).toBe(1); }, 10000); test('should be opened if discover:sidebarClosed is false', async () => { const component = await mountComponent(dataViewWithTimefieldMock, false); - expect(component.find(DiscoverSidebar).length).toBe(1); + expect(component.find(EuiPageSidebar).length).toBe(1); }, 10000); test('should be closed if discover:sidebarClosed is true', async () => { const component = await mountComponent(dataViewWithTimefieldMock, true); - expect(component.find(DiscoverSidebar).length).toBe(0); + expect(component.find(EuiPageSidebar).length).toBe(0); }, 10000); }); 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 39bc6a76bbe16..b31feed5813fe 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 @@ -289,9 +289,7 @@ export function DiscoverLayout({ stateContainer }: DiscoverLayoutProps) { selectedDataView={dataView} isClosed={isSidebarClosed} trackUiMetric={trackUiMetric} - useNewFieldsApi={useNewFieldsApi} onFieldEdited={onFieldEdited} - viewMode={viewMode} onDataViewCreated={stateContainer.actions.onDataViewCreated} availableFields$={stateContainer.dataState.data$.availableFields$} /> diff --git a/src/plugins/discover/public/application/main/components/sidebar/discover_field.scss b/src/plugins/discover/public/application/main/components/sidebar/discover_field.scss deleted file mode 100644 index 3e7a7a4d4ac1e..0000000000000 --- a/src/plugins/discover/public/application/main/components/sidebar/discover_field.scss +++ /dev/null @@ -1,5 +0,0 @@ -.dscSidebarItem--multi { - .kbnFieldButton__button { - padding-left: 0; - } -} 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 deleted file mode 100644 index cee5685d75254..0000000000000 --- a/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar.test.tsx +++ /dev/null @@ -1,299 +0,0 @@ -/* - * Copyright 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 { 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 { - DiscoverSidebarComponent as DiscoverSidebar, - DiscoverSidebarProps, -} from './discover_sidebar'; -import type { AggregateQuery, Query } from '@kbn/es-query'; -import { createDiscoverServicesMock } from '../../../../__mocks__/services'; -import { stubLogstashDataView } from '@kbn/data-plugin/common/stubs'; -import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; -import { BehaviorSubject } from 'rxjs'; -import { FetchStatus } from '../../../types'; -import { AvailableFields$, DataDocuments$ } from '../../services/discover_data_state_container'; -import { getDiscoverStateMock } from '../../../../__mocks__/discover_state.mock'; -import { VIEW_MODE } from '../../../../../common/constants'; -import { DiscoverMainProvider } from '../../services/discover_state_provider'; -import * as ExistingFieldsHookApi from '@kbn/unified-field-list/src/hooks/use_existing_fields'; -import { ExistenceFetchStatus } from '@kbn/unified-field-list/src/types'; -import { getDataViewFieldList } from './lib/get_field_list'; -import type { DiscoverCustomizationId } from '../../../../customizations/customization_service'; -import type { SearchBarCustomization } from '../../../../customizations'; - -const mockGetActions = jest.fn>>, [string, { fieldName: string }]>( - () => Promise.resolve([]) -); - -jest.spyOn(ExistingFieldsHookApi, 'useExistingFieldsReader'); - -jest.mock('../../../../kibana_services', () => ({ - getUiActions: () => ({ - getTriggerCompatibleActions: mockGetActions, - }), -})); - -const mockSearchBarCustomization: SearchBarCustomization = { - id: 'search_bar', - CustomDataViewPicker: jest.fn(() =>
    ), -}; - -let mockUseCustomizations = false; - -jest.mock('../../../../customizations', () => ({ - ...jest.requireActual('../../../../customizations'), - useDiscoverCustomization: jest.fn((id: DiscoverCustomizationId) => { - if (!mockUseCustomizations) { - return undefined; - } - - switch (id) { - case 'search_bar': - return mockSearchBarCustomization; - default: - throw new Error(`Unknown customization id: ${id}`); - } - }), -})); - -function getStateContainer({ query }: { query?: Query | AggregateQuery }) { - const state = getDiscoverStateMock({ isTimeBased: true }); - state.appState.set({ - query: query ?? { query: '', language: 'lucene' }, - filters: [], - }); - state.internalState.transitions.setDataView(stubLogstashDataView); - return state; -} - -function getCompProps(): DiscoverSidebarProps { - const dataView = stubLogstashDataView; - dataView.toSpec = jest.fn(() => ({})); - const hits = getDataTableRecords(dataView); - - const fieldCounts: Record = {}; - - for (const hit of hits) { - for (const key of Object.keys(hit.flattened)) { - fieldCounts[key] = (fieldCounts[key] || 0) + 1; - } - } - - const allFields = getDataViewFieldList(dataView, fieldCounts); - - (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'], - allFields, - onChangeDataView: jest.fn(), - onAddFilter: jest.fn(), - onAddField: jest.fn(), - onRemoveField: jest.fn(), - selectedDataView: dataView, - trackUiMetric: jest.fn(), - onFieldEdited: jest.fn(), - editField: jest.fn(), - viewMode: VIEW_MODE.DOCUMENT_LEVEL, - createNewDataView: jest.fn(), - onDataViewCreated: jest.fn(), - documents$, - availableFields$, - useNewFieldsApi: true, - showFieldList: true, - isAffectedByGlobalFilter: false, - isProcessing: false, - }; -} - -async function mountComponent( - props: DiscoverSidebarProps, - appStateParams: { query?: Query | AggregateQuery } = {} -): Promise> { - let comp: ReactWrapper; - const mockedServices = createDiscoverServicesMock(); - mockedServices.data.dataViews.getIdsWithTitle = jest.fn(async () => - props.selectedDataView - ? [{ id: props.selectedDataView.id!, title: props.selectedDataView.title! }] - : [] - ); - 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 sidebar', function () { - let props: DiscoverSidebarProps; - - beforeEach(async () => { - props = getCompProps(); - mockUseCustomizations = false; - }); - - 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', 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', 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', async () => { - const comp = await mountComponent(props); - const addFieldButton = findTestSubject(comp, 'dataView-add-field_btn'); - expect(addFieldButton.length).toBe(1); - addFieldButton.simulate('click'); - expect(props.editField).toHaveBeenCalledWith(); - }); - - it('should render "Edit field" button', async () => { - 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); - editFieldButton.simulate('click'); - expect(props.editField).toHaveBeenCalledWith('bytes'); - }); - - 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); - 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 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); - // click "Add a field" - const addFieldButtonInDataViewPicker = findTestSubject( - compWithPicker, - 'indexPattern-add-field' - ); - expect(addFieldButtonInDataViewPicker.length).toBe(1); - addFieldButtonInDataViewPicker.simulate('click'); - 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(propsWithPicker.createNewDataView).toHaveBeenCalled(); - }); - - it('should not render buttons in data view picker when in viewer mode', async () => { - 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); - // check that buttons are not present - const addFieldButtonInDataViewPicker = findTestSubject( - compWithPickerInViewerMode, - 'dataView-add-field' - ); - expect(addFieldButtonInDataViewPicker.length).toBe(0); - const createDataViewButton = findTestSubject(compWithPickerInViewerMode, 'dataview-create-new'); - expect(createDataViewButton.length).toBe(0); - }); - - describe('search bar customization', () => { - it('should render CustomDataViewPicker', async () => { - mockUseCustomizations = true; - const comp = await mountComponent({ ...props, showDataViewPicker: true }); - expect(comp.find('[data-test-subj="custom-data-view-picker"]').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 deleted file mode 100644 index 37cccb45a174b..0000000000000 --- a/src/plugins/discover/public/application/main/components/sidebar/discover_sidebar.tsx +++ /dev/null @@ -1,361 +0,0 @@ -/* - * Copyright 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 './discover_sidebar.scss'; -import React, { memo, useCallback, useEffect, useMemo, useState } from 'react'; -import { i18n } from '@kbn/i18n'; -import { EuiButton, EuiFlexGroup, EuiFlexItem, EuiPageSidebar } from '@elastic/eui'; -import { DataViewPicker } from '@kbn/unified-search-plugin/public'; -import { type DataViewField, getFieldSubtypeMulti } from '@kbn/data-views-plugin/public'; -import { - FieldList, - FieldListFilters, - FieldListGrouped, - FieldListGroupedProps, - FieldsGroupNames, - GroupedFieldsParams, - useGroupedFields, -} from '@kbn/unified-field-list'; -import { VIEW_MODE } from '../../../../../common/constants'; -import { useAppStateSelector } from '../../services/discover_app_state_container'; -import { useDiscoverServices } from '../../../../hooks/use_discover_services'; -import { DiscoverField } from './discover_field'; -import { FIELDS_LIMIT_SETTING } from '../../../../../common'; -import { - getSelectedFields, - shouldShowField, - type SelectedFieldsResult, - INITIAL_SELECTED_FIELDS_RESULT, -} from './lib/group_fields'; -import { DiscoverSidebarResponsiveProps } from './discover_sidebar_responsive'; -import { getRawRecordType } from '../../utils/get_raw_record_type'; -import { RecordRawType } from '../../services/discover_data_state_container'; -import { useDiscoverCustomization } from '../../../../customizations'; - -export interface DiscoverSidebarProps extends DiscoverSidebarResponsiveProps { - /** - * Show loading instead of the field list if processing - */ - isProcessing: boolean; - - /** - * Callback to close the flyout if sidebar is rendered in a flyout - */ - closeFlyout?: () => void; - - /** - * Pass the reference to field editor component to the parent, so it can be properly unmounted - * @param ref reference to the field editor component - */ - setFieldEditorRef?: (ref: () => void | undefined) => void; - - /** - * Handles "Edit field" action - * Buttons will be hidden if not provided - * @param fieldName - */ - editField?: (fieldName?: string) => void; - - /** - * Handles "Create a data view action" action - * Buttons will be hidden if not provided - */ - createNewDataView?: () => void; - - /** - * All fields: fields from data view and unmapped fields or columns from text-based search - */ - 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({ - isProcessing, - alwaysShowActionButtons = false, - columns, - allFields, - onAddField, - onAddFilter, - onRemoveField, - selectedDataView, - trackUiMetric, - useNewFieldsApi = false, - onFieldEdited, - onChangeDataView, - setFieldEditorRef, - closeFlyout, - editField, - viewMode, - createNewDataView, - showDataViewPicker, - showFieldList, - isAffectedByGlobalFilter, -}: DiscoverSidebarProps) { - const { uiSettings, dataViewFieldEditor, dataViews, core } = useDiscoverServices(); - const isPlainRecord = useAppStateSelector( - (state) => getRawRecordType(state.query) === RecordRawType.PLAIN - ); - - const [selectedFieldsState, setSelectedFieldsState] = useState( - INITIAL_SELECTED_FIELDS_RESULT - ); - const [multiFieldsMap, setMultiFieldsMap] = useState< - Map> | undefined - >(undefined); - - useEffect(() => { - const result = getSelectedFields({ - dataView: selectedDataView, - columns, - allFields, - isPlainRecord, - }); - setSelectedFieldsState(result); - }, [selectedDataView, columns, setSelectedFieldsState, allFields, isPlainRecord]); - - 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( - () => - editField && selectedDataView - ? async (fieldName: string) => { - const ref = dataViewFieldEditor.openDeleteModal({ - ctx: { - dataView: selectedDataView, - }, - fieldName, - onDelete: async () => { - await onFieldEdited({ removedFieldName: fieldName }); - }, - }); - if (setFieldEditorRef) { - setFieldEditorRef(ref); - } - if (closeFlyout) { - closeFlyout(); - } - } - : undefined, - [ - selectedDataView, - editField, - setFieldEditorRef, - closeFlyout, - onFieldEdited, - dataViewFieldEditor, - ] - ); - - const popularFieldsLimit = useMemo(() => uiSettings.get(FIELDS_LIMIT_SETTING), [uiSettings]); - 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 { fieldListFiltersProps, fieldListGroupedProps } = useGroupedFields({ - dataViewId: (!isPlainRecord && selectedDataView?.id) || null, // passing `null` for text-based queries - allFields, - popularFieldsLimit: !isPlainRecord ? popularFieldsLimit : 0, - sortedSelectedFields: selectedFieldsState.selectedFields, - isAffectedByGlobalFilter, - services: { - dataViews, - core, - }, - onSupportedFieldFilter, - onOverrideFieldGroupDetails, - }); - - const renderFieldItem: FieldListGroupedProps['renderFieldItem'] = useCallback( - ({ field, groupName, groupIndex, itemIndex, fieldSearchHighlight }) => ( -
  • - -
  • - ), - [ - alwaysShowActionButtons, - selectedDataView, - onAddField, - onRemoveField, - onAddFilter, - trackUiMetric, - multiFieldsMap, - editField, - deleteField, - columns, - selectedFieldsState.selectedFieldsMap, - ] - ); - - const searchBarCustomization = useDiscoverCustomization('search_bar'); - - if (!selectedDataView) { - return null; - } - - return ( - - - {Boolean(showDataViewPicker) && - (searchBarCustomization?.CustomDataViewPicker ? ( - - ) : ( - - ))} - - } - className="dscSidebar__list" - > - {showFieldList ? ( - - ) : ( - - )} - {!!editField && ( - - editField()} - size="s" - > - {i18n.translate('discover.fieldChooser.addField.label', { - defaultMessage: 'Add a field', - })} - - - )} - - - - - ); -} - -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 cd3e6429ee4ce..a7c4006281291 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 @@ -29,13 +29,39 @@ import { stubLogstashDataView } from '@kbn/data-plugin/common/stubs'; import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; import { getDiscoverStateMock } from '../../../../__mocks__/discover_state.mock'; import { DiscoverAppStateProvider } from '../../services/discover_app_state_container'; -import { VIEW_MODE } from '../../../../../common/constants'; import * as ExistingFieldsServiceApi from '@kbn/unified-field-list/src/services/field_existing/load_field_existing'; import { resetExistingFieldsCache } from '@kbn/unified-field-list/src/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'; +import type { DiscoverCustomizationId } from '../../../../customizations/customization_service'; +import type { SearchBarCustomization } from '../../../../customizations'; + +const mockSearchBarCustomization: SearchBarCustomization = { + id: 'search_bar', + CustomDataViewPicker: jest + .fn(() =>
    ) + .mockName('CustomDataViewPickerMock'), +}; + +let mockUseCustomizations = false; + +jest.mock('../../../../customizations', () => ({ + ...jest.requireActual('../../../../customizations'), + useDiscoverCustomization: jest.fn((id: DiscoverCustomizationId) => { + if (!mockUseCustomizations) { + return undefined; + } + + switch (id) { + case 'search_bar': + return mockSearchBarCustomization; + default: + throw new Error(`Unknown customization id: ${id}`); + } + }), +})); jest.mock('@kbn/unified-field-list/src/services/field_stats', () => ({ loadFieldStats: jest.fn().mockResolvedValue({ @@ -89,11 +115,6 @@ function createMockServices() { }), }, docLinks: { links: { discover: { fieldTypeHelp: '' } } }, - dataViewEditor: { - userPermissions: { - editDataView: jest.fn(() => true), - }, - }, } as unknown as DiscoverServices; return mockServices; } @@ -146,9 +167,7 @@ function getCompProps(options?: { hits?: DataTableRecord[] }): DiscoverSidebarRe selectedDataView: dataView, trackUiMetric: jest.fn(), onFieldEdited: jest.fn(), - viewMode: VIEW_MODE.DOCUMENT_LEVEL, onDataViewCreated: jest.fn(), - useNewFieldsApi: true, }; } @@ -167,6 +186,7 @@ async function mountComponent( services?: DiscoverServices ): Promise> { let comp: ReactWrapper; + const appState = getAppStateContainer(appStateParams); const mockedServices = services ?? createMockServices(); mockedServices.data.dataViews.getIdsWithTitle = jest.fn(async () => props.selectedDataView @@ -176,11 +196,12 @@ async function mountComponent( mockedServices.data.dataViews.get = jest.fn().mockImplementation(async (id) => { return [props.selectedDataView].find((d) => d!.id === id); }); + mockedServices.data.query.getState = jest.fn().mockImplementation(() => appState.getState()); await act(async () => { comp = await mountWithIntl( - + @@ -204,6 +225,7 @@ describe('discover responsive sidebar', function () { existingFieldNames: Object.keys(mockfieldCounts), })); props = getCompProps(); + mockUseCustomizations = false; }); afterEach(() => { @@ -221,7 +243,16 @@ describe('discover responsive sidebar', function () { }); }); - const compLoadingExistence = await mountComponent(props); + const compLoadingExistence = await mountComponent({ + ...props, + fieldListVariant: 'list-always', + }); + + await act(async () => { + // wait for lazy modules + await new Promise((resolve) => setTimeout(resolve, 0)); + await compLoadingExistence.update(); + }); expect( findTestSubject(compLoadingExistence, 'fieldListGroupedAvailableFields-countLoading').exists() @@ -477,32 +508,44 @@ describe('discover responsive sidebar', function () { result: getDataTableRecords(stubLogstashDataView), textBasedQueryColumns: [ { id: '1', name: 'extension', meta: { type: 'text' } }, - { id: '1', name: 'bytes', meta: { type: 'number' } }, - { id: '1', name: '@timestamp', meta: { type: 'date' } }, + { id: '2', name: 'bytes', meta: { type: 'number' } }, + { id: '3', name: '@timestamp', meta: { type: 'date' } }, ], }) as DataDocuments$, }; - const compInViewerMode = await mountComponent(propsWithTextBasedMode, { + const compInTextBasedMode = await mountComponent(propsWithTextBasedMode, { query: { sql: 'SELECT * FROM `index`' }, }); - expect(findTestSubject(compInViewerMode, 'indexPattern-add-field_btn').length).toBe(0); + + await act(async () => { + await new Promise((resolve) => setTimeout(resolve, 0)); + await compInTextBasedMode.update(); + }); + + expect(findTestSubject(compInTextBasedMode, 'indexPattern-add-field_btn').length).toBe(0); const popularFieldsCount = findTestSubject( - compInViewerMode, + compInTextBasedMode, 'fieldListGroupedPopularFields-count' ); const selectedFieldsCount = findTestSubject( - compInViewerMode, + compInTextBasedMode, 'fieldListGroupedSelectedFields-count' ); const availableFieldsCount = findTestSubject( - compInViewerMode, + compInTextBasedMode, 'fieldListGroupedAvailableFields-count' ); - const emptyFieldsCount = findTestSubject(compInViewerMode, 'fieldListGroupedEmptyFields-count'); - const metaFieldsCount = findTestSubject(compInViewerMode, 'fieldListGroupedMetaFields-count'); + const emptyFieldsCount = findTestSubject( + compInTextBasedMode, + 'fieldListGroupedEmptyFields-count' + ); + const metaFieldsCount = findTestSubject( + compInTextBasedMode, + 'fieldListGroupedMetaFields-count' + ); const unmappedFieldsCount = findTestSubject( - compInViewerMode, + compInTextBasedMode, 'fieldListGroupedUnmappedFields-count' ); @@ -515,7 +558,7 @@ describe('discover responsive sidebar', function () { expect(mockCalcFieldCounts.mock.calls.length).toBe(0); - expect(findTestSubject(compInViewerMode, 'fieldListGrouped__ariaDescription').text()).toBe( + expect(findTestSubject(compInTextBasedMode, 'fieldListGrouped__ariaDescription').text()).toBe( '2 selected fields. 3 available fields.' ); }); @@ -548,9 +591,162 @@ describe('discover responsive sidebar', function () { it('should not show "Add a field" button in viewer mode', async () => { const services = createMockServices(); - services.dataViewEditor.userPermissions.editDataView = jest.fn(() => false); + services.dataViewFieldEditor.userPermissions.editIndexPattern = 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); }); + + it('should hide field list if documents status is not initialized', async function () { + const comp = await mountComponent({ + ...props, + documents$: new BehaviorSubject({ + fetchStatus: FetchStatus.UNINITIALIZED, + }) as DataDocuments$, + }); + expect(findTestSubject(comp, 'fieldListGroupedFieldGroups').exists()).toBe(false); + }); + + it('should render "Add a field" button', async () => { + const services = createMockServices(); + const comp = await mountComponent( + { + ...props, + fieldListVariant: 'list-always', + }, + {}, + services + ); + const addFieldButton = findTestSubject(comp, 'dataView-add-field_btn'); + expect(addFieldButton.length).toBe(1); + await addFieldButton.simulate('click'); + expect(services.dataViewFieldEditor.openEditor).toHaveBeenCalledTimes(1); + }); + + it('should render "Edit field" button', async () => { + const services = createMockServices(); + const comp = await mountComponent(props, {}, services); + 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); + await editFieldButton.simulate('click'); + expect(services.dataViewFieldEditor.openEditor).toHaveBeenCalledTimes(1); + }); + + it('should not render Add/Edit field buttons in viewer mode', async () => { + const services = createMockServices(); + services.dataViewFieldEditor.userPermissions.editIndexPattern = jest.fn(() => false); + const compInViewerMode = await mountComponent(props, {}, services); + const addFieldButton = findTestSubject(compInViewerMode, 'dataView-add-field_btn'); + expect(addFieldButton.length).toBe(0); + 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); + expect(services.dataViewEditor.userPermissions.editDataView).toHaveBeenCalled(); + }); + + it('should render buttons in data view picker correctly', async () => { + const services = createMockServices(); + const propsWithPicker: DiscoverSidebarResponsiveProps = { + ...props, + fieldListVariant: 'button-and-flyout-always', + }; + const compWithPicker = await mountComponent(propsWithPicker, {}, services); + // open flyout + await act(async () => { + compWithPicker.find('.unifiedFieldListSidebar__mobileButton').last().simulate('click'); + await compWithPicker.update(); + }); + + await compWithPicker.update(); + // open data view picker + await findTestSubject(compWithPicker, 'dataView-switch-link').simulate('click'); + expect(findTestSubject(compWithPicker, 'changeDataViewPopover').length).toBe(1); + // check "Add a field" + const addFieldButtonInDataViewPicker = findTestSubject( + compWithPicker, + 'indexPattern-add-field' + ); + expect(addFieldButtonInDataViewPicker.length).toBe(1); + // click "Create a data view" + const createDataViewButton = findTestSubject(compWithPicker, 'dataview-create-new'); + expect(createDataViewButton.length).toBe(1); + await createDataViewButton.simulate('click'); + expect(services.dataViewEditor.openEditor).toHaveBeenCalled(); + }); + + it('should not render buttons in data view picker when in viewer mode', async () => { + const services = createMockServices(); + services.dataViewEditor.userPermissions.editDataView = jest.fn(() => false); + services.dataViewFieldEditor.userPermissions.editIndexPattern = jest.fn(() => false); + const propsWithPicker: DiscoverSidebarResponsiveProps = { + ...props, + fieldListVariant: 'button-and-flyout-always', + }; + const compWithPickerInViewerMode = await mountComponent(propsWithPicker, {}, services); + // open flyout + await act(async () => { + compWithPickerInViewerMode + .find('.unifiedFieldListSidebar__mobileButton') + .last() + .simulate('click'); + await compWithPickerInViewerMode.update(); + }); + + await compWithPickerInViewerMode.update(); + // open data view picker + findTestSubject(compWithPickerInViewerMode, 'dataView-switch-link').simulate('click'); + expect(findTestSubject(compWithPickerInViewerMode, 'changeDataViewPopover').length).toBe(1); + // check that buttons are not present + const addFieldButtonInDataViewPicker = findTestSubject( + compWithPickerInViewerMode, + 'dataView-add-field' + ); + expect(addFieldButtonInDataViewPicker.length).toBe(0); + const createDataViewButton = findTestSubject(compWithPickerInViewerMode, 'dataview-create-new'); + expect(createDataViewButton.length).toBe(0); + }); + + describe('search bar customization', () => { + it('should not render CustomDataViewPicker', async () => { + mockUseCustomizations = false; + const comp = await mountComponent({ + ...props, + fieldListVariant: 'button-and-flyout-always', + }); + + await act(async () => { + comp.find('.unifiedFieldListSidebar__mobileButton').last().simulate('click'); + await comp.update(); + }); + + await comp.update(); + + expect(comp.find('[data-test-subj="custom-data-view-picker"]').exists()).toBe(false); + }); + + it('should render CustomDataViewPicker', async () => { + mockUseCustomizations = true; + const comp = await mountComponent({ + ...props, + fieldListVariant: 'button-and-flyout-always', + }); + + await act(async () => { + comp.find('.unifiedFieldListSidebar__mobileButton').last().simulate('click'); + await comp.update(); + }); + + await comp.update(); + + expect(comp.find('[data-test-subj="custom-data-view-picker"]').exists()).toBe(true); + }); + }); }); 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 ca841fe29f09d..f9a8b493a3f77 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 @@ -7,26 +7,18 @@ */ 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'; -import { - EuiBadge, - EuiButton, - EuiFlyout, - EuiFlyoutHeader, - EuiHideFor, - EuiIcon, - EuiLink, - EuiPortal, - EuiShowFor, - EuiTitle, -} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; import type { DataView, DataViewField } from '@kbn/data-views-plugin/public'; -import { useExistingFieldsFetcher, useQuerySubscriber } from '@kbn/unified-field-list'; -import { VIEW_MODE } from '../../../../../common/constants'; +import { DataViewPicker } from '@kbn/unified-search-plugin/public'; +import { + UnifiedFieldListSidebarContainer, + type UnifiedFieldListSidebarContainerProps, + type UnifiedFieldListSidebarContainerApi, + FieldsGroupNames, +} from '@kbn/unified-field-list'; +import { PLUGIN_ID } from '../../../../../common'; import { useDiscoverServices } from '../../../../hooks/use_discover_services'; -import { DiscoverSidebar } from './discover_sidebar'; import { AvailableFields$, DataDocuments$, @@ -35,22 +27,58 @@ import { import { calcFieldCounts } from '../../utils/calc_field_counts'; 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 { getUiActions } from '../../../../kibana_services'; import { discoverSidebarReducer, getInitialState, DiscoverSidebarReducerActionType, DiscoverSidebarReducerStatus, } from './lib/sidebar_reducer'; +import { useDiscoverCustomization } from '../../../../customizations'; const EMPTY_FIELD_COUNTS = {}; +const getCreationOptions: UnifiedFieldListSidebarContainerProps['getCreationOptions'] = () => { + return { + originatingApp: PLUGIN_ID, + localStorageKeyPrefix: 'discover', + disableFieldsExistenceAutoFetching: true, + buttonPropsToTriggerFlyout: { + contentProps: { + id: DISCOVER_TOUR_STEP_ANCHOR_IDS.addFields, + }, + }, + buttonAddFieldToWorkspaceProps: { + 'aria-label': i18n.translate('discover.fieldChooser.discoverField.addFieldTooltip', { + defaultMessage: 'Add field as column', + }), + }, + buttonRemoveFieldFromWorkspaceProps: { + 'aria-label': i18n.translate('discover.fieldChooser.discoverField.removeFieldTooltip', { + defaultMessage: 'Remove field from table', + }), + }, + onOverrideFieldGroupDetails: (groupName) => { + if (groupName === FieldsGroupNames.AvailableFields) { + return { + helpText: i18n.translate('discover.fieldChooser.availableFieldsTooltip', { + defaultMessage: 'Fields available for display in the table.', + }), + }; + } + }, + dataTestSubj: { + fieldListAddFieldButtonTestSubj: 'dataView-add-field_btn', + fieldListSidebarDataTestSubj: 'discover-sidebar', + fieldListItemStatsDataTestSubj: 'dscFieldStats', + fieldListItemDndDataTestSubjPrefix: 'dscFieldListPanelField', + fieldListItemPopoverDataTestSubj: 'discoverFieldListPanelPopover', + fieldListItemPopoverHeaderDataTestSubjPrefix: 'discoverFieldListPanel', + }, + }; +}; + export interface DiscoverSidebarResponsiveProps { - /** - * Determines whether add/remove buttons are displayed non only when focused - */ - alwaysShowActionButtons?: boolean; /** * the selected columns displayed in the doc table in discover */ @@ -90,10 +118,6 @@ export interface DiscoverSidebarResponsiveProps { * @param eventName */ trackUiMetric?: (metricType: UiCounterMetricType, eventName: string | string[]) => void; - /** - * Read from the Fields API - */ - useNewFieldsApi: boolean; /** * callback to execute on edit runtime field */ @@ -102,14 +126,14 @@ export interface DiscoverSidebarResponsiveProps { * callback to execute on create dataview */ onDataViewCreated: (dataView: DataView) => void; - /** - * Discover view mode - */ - viewMode: VIEW_MODE; /** * list of available fields fetched from ES */ availableFields$: AvailableFields$; + /** + * For customization and testing purposes + */ + fieldListVariant?: UnifiedFieldListSidebarContainerProps['variant']; } /** @@ -119,12 +143,18 @@ 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 [isFlyoutVisible, setIsFlyoutVisible] = useState(false); + const { + fieldListVariant, + selectedDataView, + columns, + trackUiMetric, + onAddFilter, + onFieldEdited, + onDataViewCreated, + onChangeDataView, + onAddField, + onRemoveField, + } = props; const [sidebarState, dispatchSidebarStateAction] = useReducer( discoverSidebarReducer, selectedDataView, @@ -132,6 +162,8 @@ export function DiscoverSidebarResponsive(props: DiscoverSidebarResponsiveProps) ); const selectedDataViewRef = useRef(selectedDataView); const showFieldList = sidebarState.status !== DiscoverSidebarReducerStatus.INITIAL; + const [unifiedFieldListSidebarContainerApi, setUnifiedFieldListSidebarContainerApi] = + useState(null); useEffect(() => { const subscription = props.documents$.subscribe((documentState) => { @@ -196,38 +228,50 @@ export function DiscoverSidebarResponsive(props: DiscoverSidebarResponsiveProps) } }, [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, - }, - }); + const refetchFieldsExistenceInfo = + unifiedFieldListSidebarContainerApi?.refetchFieldsExistenceInfo; + const scheduleFieldsExistenceInfoFetchRef = useRef(false); + // Refetch fields existence info only after the fetch completes useEffect(() => { - if (sidebarState.status === DiscoverSidebarReducerStatus.COMPLETED) { + scheduleFieldsExistenceInfoFetchRef.current = false; + + if (sidebarState.status !== DiscoverSidebarReducerStatus.COMPLETED) { + return; + } + + // refetching info only if status changed to completed + + if (refetchFieldsExistenceInfo) { refetchFieldsExistenceInfo(); + } else { + scheduleFieldsExistenceInfoFetchRef.current = true; } - // refetching only if status changes // eslint-disable-next-line react-hooks/exhaustive-deps - }, [sidebarState.status]); + }, [sidebarState.status, scheduleFieldsExistenceInfoFetchRef]); + + // As unifiedFieldListSidebarContainerRef ref can be empty in the beginning, + // we need to fetch the data once API becomes available and after documents are fetched + const initializeUnifiedFieldListSidebarContainerApi = useCallback( + (api) => { + if (!api) { + return; + } + + if (scheduleFieldsExistenceInfoFetchRef.current) { + scheduleFieldsExistenceInfoFetchRef.current = false; + api.refetchFieldsExistenceInfo(); + } + + setUnifiedFieldListSidebarContainerApi(api); + }, + [setUnifiedFieldListSidebarContainerApi, scheduleFieldsExistenceInfoFetchRef] + ); - const closeFieldEditor = useRef<() => void | undefined>(); const closeDataViewEditor = useRef<() => void | undefined>(); useEffect(() => { const cleanup = () => { - if (closeFieldEditor?.current) { - closeFieldEditor?.current(); - } if (closeDataViewEditor?.current) { closeDataViewEditor?.current(); } @@ -238,24 +282,13 @@ export function DiscoverSidebarResponsive(props: DiscoverSidebarResponsiveProps) }; }, []); - const setFieldEditorRef = useCallback((ref: () => void | undefined) => { - closeFieldEditor.current = ref; - }, []); - const setDataViewEditorRef = useCallback((ref: () => void | undefined) => { closeDataViewEditor.current = ref; }, []); - const closeFlyout = useCallback(() => { - setIsFlyoutVisible(false); - }, []); - - const { dataViewFieldEditor, dataViewEditor } = services; + const { dataViewEditor } = services; const { availableFields$ } = props; - 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 @@ -269,140 +302,96 @@ export function DiscoverSidebarResponsive(props: DiscoverSidebarResponsiveProps) }); }, [selectedDataView, sidebarState.fieldCounts, props.columns, availableFields$]); - const editField = useMemo( + const canEditDataView = + Boolean(dataViewEditor?.userPermissions.editDataView()) || + Boolean(selectedDataView && !selectedDataView.isPersisted()); + const closeFieldListFlyout = unifiedFieldListSidebarContainerApi?.closeFieldListFlyout; + const createNewDataView = useMemo( () => - !isPlainRecord && canEditDataView && selectedDataView - ? (fieldName?: string) => { - const ref = dataViewFieldEditor.openEditor({ - ctx: { - dataView: selectedDataView, - }, - fieldName, - onSave: async () => { - await onFieldEdited(); + canEditDataView + ? () => { + const ref = dataViewEditor.openEditor({ + onSave: async (dataView) => { + onDataViewCreated(dataView); }, }); - if (setFieldEditorRef) { - setFieldEditorRef(ref); - } - if (closeFlyout) { - closeFlyout(); + if (setDataViewEditorRef) { + setDataViewEditorRef(ref); } + closeFieldListFlyout?.(); } : undefined, - [ - isPlainRecord, - canEditDataView, - dataViewFieldEditor, - selectedDataView, - setFieldEditorRef, - closeFlyout, - onFieldEdited, - ] + [canEditDataView, dataViewEditor, setDataViewEditorRef, onDataViewCreated, closeFieldListFlyout] ); - const createNewDataView = useCallback(() => { - const ref = dataViewEditor.openEditor({ - onSave: async (dataView) => { - onDataViewCreated(dataView); - }, - }); - if (setDataViewEditorRef) { - setDataViewEditorRef(ref); - } - if (closeFlyout) { - closeFlyout(); - } - }, [dataViewEditor, setDataViewEditorRef, closeFlyout, onDataViewCreated]); + const fieldListSidebarServices: UnifiedFieldListSidebarContainerProps['services'] = useMemo( + () => ({ + ...services, + uiActions: getUiActions(), + }), + [services] + ); + + const searchBarCustomization = useDiscoverCustomization('search_bar'); + const CustomDataViewPicker = searchBarCustomization?.CustomDataViewPicker; + + const createField = unifiedFieldListSidebarContainerApi?.createField; + const prependDataViewPickerForMobile = useCallback(() => { + return selectedDataView ? ( + CustomDataViewPicker ? ( + + ) : ( + + ) + ) : null; + }, [selectedDataView, createNewDataView, onChangeDataView, createField, CustomDataViewPicker]); + + const onAddFieldToWorkspace = useCallback( + (field: DataViewField) => { + onAddField(field.name); + }, + [onAddField] + ); + + const onRemoveFieldFromWorkspace = useCallback( + (field: DataViewField) => { + onRemoveField(field.name); + }, + [onRemoveField] + ); if (!selectedDataView) { return null; } return ( - <> - {!props.isClosed && ( - - - - )} - -
    - setIsFlyoutVisible(true)} - > - - - {props.columns[0] === '_source' ? 0 : props.columns.length} - - -
    - {isFlyoutVisible && ( - - setIsFlyoutVisible(false)} - aria-labelledby="flyoutTitle" - ownFocus - > - - -

    - setIsFlyoutVisible(false)}> - {' '} - - {i18n.translate('discover.fieldList.flyoutHeading', { - defaultMessage: 'Field list', - })} - - -

    -
    -
    - -
    -
    - )} -
    - + ); } diff --git a/src/plugins/discover/public/application/main/components/sidebar/index.ts b/src/plugins/discover/public/application/main/components/sidebar/index.ts index 9da7d31f96e86..02dc07596c704 100644 --- a/src/plugins/discover/public/application/main/components/sidebar/index.ts +++ b/src/plugins/discover/public/application/main/components/sidebar/index.ts @@ -6,5 +6,4 @@ * Side Public License, v 1. */ -export { DiscoverSidebar } from './discover_sidebar'; export { DiscoverSidebarResponsive } from './discover_sidebar_responsive'; diff --git a/src/plugins/discover/public/components/discover_grid/discover_grid.test.tsx b/src/plugins/discover/public/components/discover_grid/discover_grid.test.tsx index bd6529dd44314..76694ad53ec17 100644 --- a/src/plugins/discover/public/components/discover_grid/discover_grid.test.tsx +++ b/src/plugins/discover/public/components/discover_grid/discover_grid.test.tsx @@ -11,7 +11,7 @@ import { EuiCopy } from '@elastic/eui'; import { act } from 'react-dom/test-utils'; import { findTestSubject } from '@elastic/eui/lib/test'; import { esHits } from '../../__mocks__/es_hits'; -import { buildDataViewMock, fields } from '../../__mocks__/data_view'; +import { buildDataViewMock, deepMockedFields } from '../../__mocks__/data_view'; import { mountWithIntl } from '@kbn/test-jest-helpers'; import { DiscoverGrid, DiscoverGridProps } from './discover_grid'; import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; @@ -28,7 +28,7 @@ jest.mock('@kbn/cell-actions', () => ({ export const dataViewMock = buildDataViewMock({ name: 'the-data-view', - fields, + fields: deepMockedFields, timeFieldName: '@timestamp', }); @@ -259,18 +259,8 @@ describe('DiscoverGrid', () => { triggerId: 'test', getCellValue: expect.any(Function), fields: [ - { - name: '@timestamp', - type: 'date', - aggregatable: true, - searchable: undefined, - }, - { - name: 'message', - type: 'string', - aggregatable: false, - searchable: undefined, - }, + dataViewMock.getFieldByName('@timestamp')?.toSpec(), + dataViewMock.getFieldByName('message')?.toSpec(), ], }) ); diff --git a/src/plugins/discover/public/components/discover_grid/discover_grid.tsx b/src/plugins/discover/public/components/discover_grid/discover_grid.tsx index 3d4acfc34d925..e05f4c9d704fa 100644 --- a/src/plugins/discover/public/components/discover_grid/discover_grid.tsx +++ b/src/plugins/discover/public/components/discover_grid/discover_grid.tsx @@ -456,23 +456,15 @@ export const DiscoverGrid = ({ const cellActionsFields = useMemo( () => cellActionsTriggerId && !isPlainRecord - ? visibleColumns.map((columnName) => { - const field = dataView.getFieldByName(columnName); - if (!field) { - return { + ? visibleColumns.map( + (columnName) => + dataView.getFieldByName(columnName)?.toSpec() ?? { name: '', type: '', aggregatable: false, searchable: false, - }; - } - return { - name: columnName, - type: field.type, - aggregatable: field.aggregatable, - searchable: field.searchable, - }; - }) + } + ) : undefined, [cellActionsTriggerId, isPlainRecord, visibleColumns, dataView] ); diff --git a/src/plugins/discover/public/embeddable/saved_search_embeddable.test.ts b/src/plugins/discover/public/embeddable/saved_search_embeddable.test.ts index 96edd34596706..dd66cf80eb8b5 100644 --- a/src/plugins/discover/public/embeddable/saved_search_embeddable.test.ts +++ b/src/plugins/discover/public/embeddable/saved_search_embeddable.test.ts @@ -12,7 +12,6 @@ import { createFilterManagerMock } from '@kbn/data-plugin/public/query/filter_ma import { SearchInput } from '..'; import { getSavedSearchUrl } from '@kbn/saved-search-plugin/public'; import { DiscoverServices } from '../build_services'; -import { dataViewMock } from '../__mocks__/data_view'; import { discoverServiceMock } from '../__mocks__/services'; import { SavedSearchEmbeddable, SearchEmbeddableConfig } from './saved_search_embeddable'; import { render } from 'react-dom'; @@ -23,6 +22,7 @@ import { SHOW_FIELD_STATISTICS } from '../../common'; import { IUiSettingsClient } from '@kbn/core-ui-settings-browser'; import { SavedSearchEmbeddableComponent } from './saved_search_embeddable_component'; import { VIEW_MODE } from '../../common/constants'; +import { buildDataViewMock, deepMockedFields } from '../__mocks__/data_view'; let discoverComponent: ReactWrapper; @@ -48,6 +48,8 @@ function getSearchResponse(nrOfHits: number) { }); } +const dataViewMock = buildDataViewMock({ name: 'the-data-view', fields: deepMockedFields }); + describe('saved search embeddable', () => { let mountpoint: HTMLDivElement; let filterManagerMock: jest.Mocked; diff --git a/test/common/services/security/system_indices_user.ts b/test/common/services/security/system_indices_user.ts index 9bfaddd9f0306..52e166c645093 100644 --- a/test/common/services/security/system_indices_user.ts +++ b/test/common/services/security/system_indices_user.ts @@ -68,8 +68,9 @@ export async function createSystemIndicesUser(ctx: FtrProviderContext) { const enabled = !config .get('esTestCluster.serverArgs') .some((arg: string) => arg === 'xpack.security.enabled=false'); + const isServerless = !!config.get('serverless'); - if (!enabled) { + if (!enabled || isServerless) { return; } diff --git a/test/examples/unified_field_list_examples/field_stats.ts b/test/examples/unified_field_list_examples/field_stats.ts index dc7aadf56d375..de662e737cb2d 100644 --- a/test/examples/unified_field_list_examples/field_stats.ts +++ b/test/examples/unified_field_list_examples/field_stats.ts @@ -111,8 +111,8 @@ export default ({ getService, getPageObjects }: FtrProviderContext) => { ); }); - it('should return examples for non-aggregatable fields', async () => { - await PageObjects.unifiedFieldList.clickFieldListItem('extension'); + it('should return examples for non-aggregatable or geo fields', async () => { + await PageObjects.unifiedFieldList.clickFieldListItem('geo.coordinates'); expect(await PageObjects.unifiedFieldList.getFieldStatsViewType()).to.be('exampleValues'); expect(await PageObjects.unifiedFieldList.getFieldStatsDocsCount()).to.be(100); // actual hits might vary diff --git a/x-pack/packages/security-solution/data_table/components/data_table/data_table.stories.tsx b/x-pack/packages/security-solution/data_table/components/data_table/data_table.stories.tsx index dde25228c7e82..d99dc31a8b655 100644 --- a/x-pack/packages/security-solution/data_table/components/data_table/data_table.stories.tsx +++ b/x-pack/packages/security-solution/data_table/components/data_table/data_table.stories.tsx @@ -84,6 +84,7 @@ export const DataTable = () => { undefined} data={mockTimelineData} id={TableId.test} renderCellValue={StoryCellRenderer} diff --git a/x-pack/packages/security-solution/data_table/components/data_table/index.test.tsx b/x-pack/packages/security-solution/data_table/components/data_table/index.test.tsx index 42523385b5ace..d543cca634c4a 100644 --- a/x-pack/packages/security-solution/data_table/components/data_table/index.test.tsx +++ b/x-pack/packages/security-solution/data_table/components/data_table/index.test.tsx @@ -71,6 +71,7 @@ describe('DataTable', () => { const mount = useMountAppended(); const props: DataTableProps = { browserFields: mockBrowserFields, + getFieldSpec: () => undefined, data: mockTimelineData, id: TableId.test, loadPage: jest.fn(), @@ -158,11 +159,21 @@ describe('DataTable', () => { describe('cellActions', () => { test('calls useDataGridColumnsCellActions properly', () => { const data = mockTimelineData.slice(0, 1); + const timestampFieldSpec = { + name: '@timestamp', + type: 'date', + aggregatable: true, + esTypes: ['date'], + searchable: true, + }; const wrapper = mount( + timestampFieldSpec.name === name ? timestampFieldSpec : undefined + } data={data} /> @@ -171,16 +182,7 @@ describe('DataTable', () => { expect(mockUseDataGridColumnsCellActions).toHaveBeenCalledWith({ triggerId: 'mockCellActionsTrigger', - fields: [ - { - name: '@timestamp', - type: 'date', - aggregatable: true, - esTypes: ['date'], - searchable: true, - subType: undefined, - }, - ], + fields: [timestampFieldSpec], getCellValue: expect.any(Function), metadata: { scopeId: 'table-test', diff --git a/x-pack/packages/security-solution/data_table/components/data_table/index.tsx b/x-pack/packages/security-solution/data_table/components/data_table/index.tsx index 6c71d796dc9ea..0018702ce5e0e 100644 --- a/x-pack/packages/security-solution/data_table/components/data_table/index.tsx +++ b/x-pack/packages/security-solution/data_table/components/data_table/index.tsx @@ -42,6 +42,7 @@ import { useDataGridColumnsCellActions, UseDataGridColumnsCellActionsProps, } from '@kbn/cell-actions'; +import { FieldSpec } from '@kbn/data-views-plugin/common'; import { DataTableModel, DataTableState } from '../../store/data_table/types'; import { getColumnHeader, getColumnHeaders } from './column_headers/helpers'; @@ -96,6 +97,7 @@ interface BaseDataTableProps { rowHeightsOptions?: EuiDataGridRowHeightsOptions; isEventRenderedView?: boolean; getFieldBrowser: GetFieldBrowser; + getFieldSpec: (fieldName: string) => FieldSpec | undefined; cellActionsTriggerId?: string; } @@ -154,6 +156,7 @@ export const DataTableComponent = React.memo( rowHeightsOptions, isEventRenderedView = false, getFieldBrowser, + getFieldSpec, cellActionsTriggerId, ...otherProps }) => { @@ -331,21 +334,20 @@ export const DataTableComponent = React.memo( ); const cellActionsMetadata = useMemo(() => ({ scopeId: id }), [id]); - const cellActionsFields = useMemo( () => cellActionsTriggerId - ? // TODO use FieldSpec object instead of column - columnHeaders.map((column) => ({ - name: column.id, - type: column.type ?? '', // When type is an empty string all cell actions are incompatible - aggregatable: column.aggregatable ?? false, - searchable: column.searchable ?? false, - esTypes: column.esTypes ?? [], - subType: column.subType, - })) + ? columnHeaders.map( + (column) => + getFieldSpec(column.id) ?? { + name: column.id, + type: '', // When type is an empty string all cell actions are incompatible + aggregatable: false, + searchable: false, + } + ) : undefined, - [cellActionsTriggerId, columnHeaders] + [cellActionsTriggerId, columnHeaders, getFieldSpec] ); const getCellValue = useCallback( diff --git a/x-pack/packages/security-solution/data_table/tsconfig.json b/x-pack/packages/security-solution/data_table/tsconfig.json index da4167b70ade2..473470dab1083 100644 --- a/x-pack/packages/security-solution/data_table/tsconfig.json +++ b/x-pack/packages/security-solution/data_table/tsconfig.json @@ -19,6 +19,7 @@ "@kbn/kibana-react-plugin", "@kbn/kibana-utils-plugin", "@kbn/i18n-react", - "@kbn/ui-actions-plugin" + "@kbn/ui-actions-plugin", + "@kbn/data-views-plugin" ] } diff --git a/x-pack/plugins/apm/public/components/routing/app_root/apm_header_action_menu/index.tsx b/x-pack/plugins/apm/public/components/routing/app_root/apm_header_action_menu/index.tsx index 320ee883462ae..a86a8ac459978 100644 --- a/x-pack/plugins/apm/public/components/routing/app_root/apm_header_action_menu/index.tsx +++ b/x-pack/plugins/apm/public/components/routing/app_root/apm_header_action_menu/index.tsx @@ -23,11 +23,12 @@ import { InspectorHeaderLink } from './inspector_header_link'; import { Labs } from './labs'; export function ApmHeaderActionMenu() { - const { core, plugins } = useApmPluginContext(); + const { core, plugins, config } = useApmPluginContext(); const { search } = window.location; const { application, http } = core; const { basePath } = http; const { capabilities } = application; + const { featureFlags } = config; const canReadMlJobs = !!capabilities.ml?.canGetJobs; const canCreateMlJobs = !!capabilities.ml?.canCreateJob; const { isAlertingAvailable, canReadAlerts, canSaveAlerts } = @@ -50,19 +51,22 @@ export function ApmHeaderActionMenu() { return ( {isLabsButtonEnabled && } - - - - {i18n.translate('xpack.apm.storageExplorerLinkLabel', { - defaultMessage: 'Storage Explorer', - })} - - - + {featureFlags.storageExplorerAvailable && ( + + + + {i18n.translate('xpack.apm.storageExplorerLinkLabel', { + defaultMessage: 'Storage Explorer', + })} + + + + )} + {canCreateMlJobs && } {isAlertingAvailable && ( { const config = this.initializerContext.config.get(); const pluginSetupDeps = plugins; + const { featureFlags } = config; + if (pluginSetupDeps.home) { pluginSetupDeps.home.environment.update({ apmUi: true }); pluginSetupDeps.home.featureCatalogue.register(featureCatalogueEntry); @@ -365,6 +367,7 @@ export class ApmPlugin implements Plugin { id: 'storage-explorer', title: apmStorageExplorerTitle, path: '/storage-explorer', + searchable: featureFlags.storageExplorerAvailable, }, ], diff --git a/x-pack/plugins/apm/server/routes/settings/agent_configuration/create_or_update_configuration.ts b/x-pack/plugins/apm/server/routes/settings/agent_configuration/create_or_update_configuration.ts index 666195217ccdc..5520b51137235 100644 --- a/x-pack/plugins/apm/server/routes/settings/agent_configuration/create_or_update_configuration.ts +++ b/x-pack/plugins/apm/server/routes/settings/agent_configuration/create_or_update_configuration.ts @@ -26,7 +26,7 @@ export function createOrUpdateConfiguration({ internalESClient: APMInternalESClient; }) { const params: APMIndexDocumentParams = { - refresh: true, + refresh: 'wait_for' as const, index: APM_AGENT_CONFIGURATION_INDEX, body: { agent_name: configurationIntake.agent_name, diff --git a/x-pack/plugins/apm/server/routes/settings/custom_link/create_or_update_custom_link.test.ts b/x-pack/plugins/apm/server/routes/settings/custom_link/create_or_update_custom_link.test.ts index 4d768cdff09d4..7a21db4ee5bf1 100644 --- a/x-pack/plugins/apm/server/routes/settings/custom_link/create_or_update_custom_link.test.ts +++ b/x-pack/plugins/apm/server/routes/settings/custom_link/create_or_update_custom_link.test.ts @@ -41,7 +41,7 @@ describe('Create or Update Custom link', () => { expect(internalClientIndexMock).toHaveBeenCalledWith( 'create_or_update_custom_link', { - refresh: true, + refresh: 'wait_for', index: '.apm-custom-link', body: { '@timestamp': 1570737000000, @@ -62,7 +62,7 @@ describe('Create or Update Custom link', () => { expect(internalClientIndexMock).toHaveBeenCalledWith( 'create_or_update_custom_link', { - refresh: true, + refresh: 'wait_for', index: '.apm-custom-link', id: 'bar', body: { diff --git a/x-pack/plugins/apm/server/routes/settings/custom_link/create_or_update_custom_link.ts b/x-pack/plugins/apm/server/routes/settings/custom_link/create_or_update_custom_link.ts index 1bda27f7eb78b..979c16ad53473 100644 --- a/x-pack/plugins/apm/server/routes/settings/custom_link/create_or_update_custom_link.ts +++ b/x-pack/plugins/apm/server/routes/settings/custom_link/create_or_update_custom_link.ts @@ -26,7 +26,7 @@ export function createOrUpdateCustomLink({ internalESClient: APMInternalESClient; }) { const params: APMIndexDocumentParams = { - refresh: true, + refresh: 'wait_for' as const, index: APM_CUSTOM_LINK_INDEX, body: { '@timestamp': Date.now(), diff --git a/x-pack/plugins/cases/public/common/translations.ts b/x-pack/plugins/cases/public/common/translations.ts index a8fb655b06d54..9dea7a3413f95 100644 --- a/x-pack/plugins/cases/public/common/translations.ts +++ b/x-pack/plugins/cases/public/common/translations.ts @@ -292,7 +292,8 @@ export const SELECT_CASE_TITLE = i18n.translate('xpack.cases.common.allCases.cas export const MAX_LENGTH_ERROR = (field: string, length: number) => i18n.translate('xpack.cases.createCase.maxLengthError', { values: { field, length }, - defaultMessage: 'The length of the {field} is too long. The maximum length is {length}.', + defaultMessage: + 'The length of the {field} is too long. The maximum length is {length} characters.', }); export const MAX_TAGS_ERROR = (length: number) => diff --git a/x-pack/plugins/cases/public/components/add_comment/index.test.tsx b/x-pack/plugins/cases/public/components/add_comment/index.test.tsx index 54b2219745b1f..ac255f266620e 100644 --- a/x-pack/plugins/cases/public/components/add_comment/index.test.tsx +++ b/x-pack/plugins/cases/public/components/add_comment/index.test.tsx @@ -6,14 +6,14 @@ */ import React from 'react'; -import { mount } from 'enzyme'; -import { waitFor, act, fireEvent } from '@testing-library/react'; +import { waitFor, act, fireEvent, screen } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; import { noop } from 'lodash/fp'; import { noCreateCasesPermissions, TestProviders, createAppMockRenderer } from '../../common/mock'; import { CommentType } from '../../../common/api'; -import { SECURITY_SOLUTION_OWNER } from '../../../common/constants'; +import { SECURITY_SOLUTION_OWNER, MAX_COMMENT_LENGTH } from '../../../common/constants'; import { useCreateAttachments } from '../../containers/use_create_attachments'; import type { AddCommentProps, AddCommentRefObject } from '.'; import { AddComment } from '.'; @@ -52,8 +52,11 @@ const appId = 'testAppId'; const draftKey = `cases.${appId}.${addCommentProps.caseId}.${addCommentProps.id}.markdownEditor`; describe('AddComment ', () => { + let appMockRender: AppMockRenderer; + beforeEach(() => { jest.clearAllMocks(); + appMockRender = createAppMockRenderer(); useCreateAttachmentsMock.mockImplementation(() => defaultResponse); }); @@ -61,22 +64,47 @@ describe('AddComment ', () => { sessionStorage.removeItem(draftKey); }); - it('should post comment on submit click', async () => { - const wrapper = mount( - - + it('renders correctly', () => { + appMockRender.render(); + + expect(screen.getByTestId('add-comment')).toBeInTheDocument(); + }); + + it('should render spinner and disable submit when loading', () => { + useCreateAttachmentsMock.mockImplementation(() => ({ + ...defaultResponse, + isLoading: true, + })); + appMockRender.render(); + + expect(screen.getByTestId('loading-spinner')).toBeInTheDocument(); + expect(screen.getByTestId('submit-comment')).toHaveAttribute('disabled'); + }); + + it('should hide the component when the user does not have create permissions', () => { + useCreateAttachmentsMock.mockImplementation(() => ({ + ...defaultResponse, + isLoading: true, + })); + + appMockRender.render( + + ); - wrapper - .find(`[data-test-subj="add-comment"] textarea`) - .first() - .simulate('change', { target: { value: sampleData.comment } }); + expect(screen.queryByTestId('loading-spinner')).not.toBeInTheDocument(); + }); + + it('should post comment on submit click', async () => { + appMockRender.render(); + + const markdown = screen.getByTestId('euiMarkdownEditorTextArea'); - expect(wrapper.find(`[data-test-subj="add-comment"]`).exists()).toBeTruthy(); - expect(wrapper.find(`[data-test-subj="loading-spinner"]`).exists()).toBeFalsy(); + userEvent.type(markdown, sampleData.comment); + + userEvent.click(screen.getByTestId('submit-comment')); - wrapper.find(`button[data-test-subj="submit-comment"]`).first().simulate('click'); await waitFor(() => { expect(onCommentSaving).toBeCalled(); expect(createAttachments).toBeCalledWith( @@ -94,105 +122,49 @@ describe('AddComment ', () => { }); await waitFor(() => { - expect(wrapper.find(`[data-test-subj="add-comment"] textarea`).text()).toBe(''); + expect(screen.getByTestId('euiMarkdownEditorTextArea')).toHaveTextContent(''); }); }); - it('should render spinner and disable submit when loading', () => { - useCreateAttachmentsMock.mockImplementation(() => ({ - ...defaultResponse, - isLoading: true, - })); - const wrapper = mount( - - - - ); - - expect(wrapper.find(`[data-test-subj="loading-spinner"]`).exists()).toBeTruthy(); - expect( - wrapper.find(`[data-test-subj="submit-comment"]`).first().prop('isDisabled') - ).toBeTruthy(); - }); - - it('should disable submit button when isLoading is true', () => { - useCreateAttachmentsMock.mockImplementation(() => ({ - ...defaultResponse, - isLoading: true, - })); - const wrapper = mount( - - - - ); - - expect( - wrapper.find(`[data-test-subj="submit-comment"]`).first().prop('isDisabled') - ).toBeTruthy(); - }); - - it('should hide the component when the user does not have create permissions', () => { - useCreateAttachmentsMock.mockImplementation(() => ({ - ...defaultResponse, - isLoading: true, - })); - const wrapper = mount( - - - - ); - - expect(wrapper.find(`[data-test-subj="add-comment"]`).exists()).toBeFalsy(); - }); - it('should insert a quote', async () => { const sampleQuote = 'what a cool quote \n with new lines'; const ref = React.createRef(); - const wrapper = mount( - - - - ); - wrapper - .find(`[data-test-subj="add-comment"] textarea`) - .first() - .simulate('change', { target: { value: sampleData.comment } }); + appMockRender.render(); + + userEvent.type(screen.getByTestId('euiMarkdownEditorTextArea'), sampleData.comment); await act(async () => { ref.current!.addQuote(sampleQuote); }); - expect(wrapper.find(`[data-test-subj="add-comment"] textarea`).text()).toBe( - `${sampleData.comment}\n\n> what a cool quote \n> with new lines \n\n` - ); + await waitFor(() => { + expect(screen.getByTestId('euiMarkdownEditorTextArea').textContent).toContain( + `${sampleData.comment}\n\n> what a cool quote \n> with new lines \n\n` + ); + }); }); it('should call onFocus when adding a quote', async () => { const ref = React.createRef(); - mount( - - - - ); + appMockRender.render(); ref.current!.editor!.textarea!.focus = jest.fn(); + await act(async () => { ref.current!.addQuote('a comment'); }); - expect(ref.current!.editor!.textarea!.focus).toHaveBeenCalled(); + await waitFor(() => { + expect(ref.current!.editor!.textarea!.focus).toHaveBeenCalled(); + }); }); it('should NOT call onFocus on mount', async () => { const ref = React.createRef(); - mount( - - - - ); + appMockRender.render(); ref.current!.editor!.textarea!.focus = jest.fn(); expect(ref.current!.editor!.textarea!.focus).not.toHaveBeenCalled(); @@ -208,12 +180,10 @@ describe('AddComment ', () => { const mockTimelineIntegration = { ...timelineIntegrationMock }; mockTimelineIntegration.hooks.useInsertTimeline = useInsertTimelineMock; - const wrapper = mount( - - - - - + appMockRender.render( + + + ); act(() => { @@ -221,7 +191,56 @@ describe('AddComment ', () => { }); await waitFor(() => { - expect(wrapper.find(`[data-test-subj="add-comment"] textarea`).text()).toBe('[title](url)'); + expect(screen.getByTestId('euiMarkdownEditorTextArea')).toHaveTextContent('[title](url)'); + }); + }); + + describe('errors', () => { + it('shows an error when comment is empty', async () => { + appMockRender.render(); + + const markdown = screen.getByTestId('euiMarkdownEditorTextArea'); + + userEvent.type(markdown, 'test'); + userEvent.clear(markdown); + + await waitFor(() => { + expect(screen.getByText('Empty comments are not allowed.')).toBeInTheDocument(); + expect(screen.getByTestId('submit-comment')).toHaveAttribute('disabled'); + }); + }); + + it('shows an error when comment is of empty characters', async () => { + appMockRender.render(); + + const markdown = screen.getByTestId('euiMarkdownEditorTextArea'); + + userEvent.clear(markdown); + userEvent.type(markdown, ' '); + + await waitFor(() => { + expect(screen.getByText('Empty comments are not allowed.')).toBeInTheDocument(); + expect(screen.getByTestId('submit-comment')).toHaveAttribute('disabled'); + }); + }); + + it('shows an error when comment is too long', async () => { + const longComment = 'a'.repeat(MAX_COMMENT_LENGTH + 1); + + appMockRender.render(); + + const markdown = screen.getByTestId('euiMarkdownEditorTextArea'); + + userEvent.paste(markdown, longComment); + + await waitFor(() => { + expect( + screen.getByText( + 'The length of the comment is too long. The maximum length is 30000 characters.' + ) + ).toBeInTheDocument(); + expect(screen.getByTestId('submit-comment')).toHaveAttribute('disabled'); + }); }); }); }); @@ -247,9 +266,9 @@ describe('draft comment ', () => { }); it('should clear session storage on submit', async () => { - const result = appMockRenderer.render(); + appMockRenderer.render(); - fireEvent.change(result.getByLabelText('caseComment'), { + fireEvent.change(screen.getByLabelText('caseComment'), { target: { value: sampleData.comment }, }); @@ -258,10 +277,10 @@ describe('draft comment ', () => { }); await waitFor(() => { - expect(result.getByLabelText('caseComment')).toHaveValue(sessionStorage.getItem(draftKey)); + expect(screen.getByLabelText('caseComment')).toHaveValue(sessionStorage.getItem(draftKey)); }); - fireEvent.click(result.getByTestId('submit-comment')); + fireEvent.click(screen.getByTestId('submit-comment')); await waitFor(() => { expect(onCommentSaving).toBeCalled(); @@ -280,7 +299,7 @@ describe('draft comment ', () => { }); await waitFor(() => { - expect(result.getByLabelText('caseComment').textContent).toBe(''); + expect(screen.getByLabelText('caseComment').textContent).toBe(''); expect(sessionStorage.getItem(draftKey)).toBe(''); }); }); @@ -295,9 +314,9 @@ describe('draft comment ', () => { }); it('should have draft comment same as existing session storage', async () => { - const result = appMockRenderer.render(); + appMockRenderer.render(); - expect(result.getByLabelText('caseComment')).toHaveValue('value set in storage'); + expect(screen.getByLabelText('caseComment')).toHaveValue('value set in storage'); }); }); }); diff --git a/x-pack/plugins/cases/public/components/add_comment/index.tsx b/x-pack/plugins/cases/public/components/add_comment/index.tsx index 94f45f129c0f3..59fc1fcde0fac 100644 --- a/x-pack/plugins/cases/public/components/add_comment/index.tsx +++ b/x-pack/plugins/cases/public/components/add_comment/index.tsx @@ -36,6 +36,7 @@ import type { AddCommentFormSchema } from './schema'; import { schema } from './schema'; import { InsertTimeline } from '../insert_timeline'; import { useCasesContext } from '../cases_context/use_cases_context'; +import { MAX_COMMENT_LENGTH } from '../../../common/constants'; const MySpinner = styled(EuiLoadingSpinner)` position: absolute; @@ -174,6 +175,9 @@ export const AddComment = React.memo( // eslint-disable-next-line react-hooks/exhaustive-deps }, [focusOnContext]); + const isDisabled = + isLoading || !comment?.trim().length || comment.trim().length > MAX_COMMENT_LENGTH; + return ( {isLoading && showLoading && } @@ -200,7 +204,7 @@ export const AddComment = React.memo( data-test-subj="submit-comment" fill iconType="plusInCircle" - isDisabled={!comment || isLoading} + isDisabled={isDisabled} isLoading={isLoading} onClick={onSubmit} > diff --git a/x-pack/plugins/cases/public/components/add_comment/schema.tsx b/x-pack/plugins/cases/public/components/add_comment/schema.tsx index 980a03e76b772..91fc499baa74d 100644 --- a/x-pack/plugins/cases/public/components/add_comment/schema.tsx +++ b/x-pack/plugins/cases/public/components/add_comment/schema.tsx @@ -9,10 +9,11 @@ import type { FormSchema } from '@kbn/es-ui-shared-plugin/static/forms/hook_form import { FIELD_TYPES } from '@kbn/es-ui-shared-plugin/static/forms/hook_form_lib'; import { fieldValidators } from '@kbn/es-ui-shared-plugin/static/forms/helpers'; import type { CommentRequestUserType } from '../../../common/api'; +import { MAX_COMMENT_LENGTH } from '../../../common/constants'; import * as i18n from './translations'; -const { emptyField } = fieldValidators; +const { emptyField, maxLengthField } = fieldValidators; export interface AddCommentFormSchema { comment: CommentRequestUserType['comment']; @@ -25,6 +26,12 @@ export const schema: FormSchema = { { validator: emptyField(i18n.EMPTY_COMMENTS_NOT_ALLOWED), }, + { + validator: maxLengthField({ + length: MAX_COMMENT_LENGTH, + message: i18n.MAX_LENGTH_ERROR('comment', MAX_COMMENT_LENGTH), + }), + }, ], }, }; diff --git a/x-pack/plugins/cases/public/components/case_view/components/edit_category.test.tsx b/x-pack/plugins/cases/public/components/case_view/components/edit_category.test.tsx index 9e5db12f98ff1..e41067dddc1ca 100644 --- a/x-pack/plugins/cases/public/components/case_view/components/edit_category.test.tsx +++ b/x-pack/plugins/cases/public/components/case_view/components/edit_category.test.tsx @@ -194,7 +194,9 @@ describe('EditCategory ', () => { await waitFor(() => { expect( - screen.getByText('The length of the category is too long. The maximum length is 50.') + screen.getByText( + 'The length of the category is too long. The maximum length is 50 characters.' + ) ).toBeInTheDocument(); }); diff --git a/x-pack/plugins/cases/public/components/case_view/components/edit_tags.test.tsx b/x-pack/plugins/cases/public/components/case_view/components/edit_tags.test.tsx index 68749e30a5983..28198f7f9c28c 100644 --- a/x-pack/plugins/cases/public/components/case_view/components/edit_tags.test.tsx +++ b/x-pack/plugins/cases/public/components/case_view/components/edit_tags.test.tsx @@ -132,7 +132,9 @@ describe('EditTags ', () => { userEvent.keyboard('{enter}'); await waitFor(() => { - expect(screen.getByText('The length of the tag is too long. The maximum length is 256.')); + expect( + screen.getByText('The length of the tag is too long. The maximum length is 256 characters.') + ); }); }); diff --git a/x-pack/plugins/cases/public/components/category/category_form_field.test.tsx b/x-pack/plugins/cases/public/components/category/category_form_field.test.tsx index 3e6eb6472bf9a..cdaae6f49c5cc 100644 --- a/x-pack/plugins/cases/public/components/category/category_form_field.test.tsx +++ b/x-pack/plugins/cases/public/components/category/category_form_field.test.tsx @@ -120,7 +120,11 @@ describe('Category', () => { expect(onSubmit).toBeCalledWith({}, false); }); - expect(screen.getByText('The length of the category is too long. The maximum length is 50.')); + expect( + screen.getByText( + 'The length of the category is too long. The maximum length is 50 characters.' + ) + ); }); it('can set a category from existing ones', async () => { diff --git a/x-pack/plugins/cases/public/components/create/description.test.tsx b/x-pack/plugins/cases/public/components/create/description.test.tsx index dfd8d7b4f8ae3..5d678a6592638 100644 --- a/x-pack/plugins/cases/public/components/create/description.test.tsx +++ b/x-pack/plugins/cases/public/components/create/description.test.tsx @@ -106,7 +106,9 @@ describe('Description', () => { await waitFor(() => { expect( - screen.getByText('The length of the description is too long. The maximum length is 30000.') + screen.getByText( + 'The length of the description is too long. The maximum length is 30000 characters.' + ) ).toBeInTheDocument(); }); }); diff --git a/x-pack/plugins/cases/public/components/create/form_context.test.tsx b/x-pack/plugins/cases/public/components/create/form_context.test.tsx index 13bf3c04ebfc7..17bacdf683c4e 100644 --- a/x-pack/plugins/cases/public/components/create/form_context.test.tsx +++ b/x-pack/plugins/cases/public/components/create/form_context.test.tsx @@ -325,7 +325,9 @@ describe('Create case', () => { await waitFor(() => { expect( - screen.getByText('The length of the name is too long. The maximum length is 160.') + screen.getByText( + 'The length of the name is too long. The maximum length is 160 characters.' + ) ).toBeInTheDocument(); }); diff --git a/x-pack/plugins/cases/public/components/create/tags.test.tsx b/x-pack/plugins/cases/public/components/create/tags.test.tsx index 2f0f35e7024ab..65e94e8cc204e 100644 --- a/x-pack/plugins/cases/public/components/create/tags.test.tsx +++ b/x-pack/plugins/cases/public/components/create/tags.test.tsx @@ -103,7 +103,9 @@ describe('Tags', () => { userEvent.keyboard('{enter}'); await waitFor(() => { - expect(screen.getByText('The length of the tag is too long. The maximum length is 256.')); + expect( + screen.getByText('The length of the tag is too long. The maximum length is 256 characters.') + ); }); }); }); diff --git a/x-pack/plugins/cases/public/components/description/index.test.tsx b/x-pack/plugins/cases/public/components/description/index.test.tsx index e943e266ea9bd..5515753736274 100644 --- a/x-pack/plugins/cases/public/components/description/index.test.tsx +++ b/x-pack/plugins/cases/public/components/description/index.test.tsx @@ -122,6 +122,23 @@ describe('Description', () => { await waitFor(() => { expect(screen.getByText('A description is required.')).toBeInTheDocument(); + expect(screen.getByTestId('editable-save-markdown')).toHaveAttribute('disabled'); + }); + }); + + it('shows an error when description is a sting of empty characters', async () => { + const res = appMockRender.render( + + ); + + userEvent.click(res.getByTestId('description-edit-icon')); + + userEvent.clear(screen.getByTestId('euiMarkdownEditorTextArea')); + userEvent.type(screen.getByTestId('euiMarkdownEditorTextArea'), ' '); + + await waitFor(() => { + expect(screen.getByText('A description is required.')).toBeInTheDocument(); + expect(screen.getByTestId('editable-save-markdown')).toHaveAttribute('disabled'); }); }); @@ -141,8 +158,11 @@ describe('Description', () => { await waitFor(() => { expect( - screen.getByText('The length of the description is too long. The maximum length is 30000.') + screen.getByText( + 'The length of the description is too long. The maximum length is 30000 characters.' + ) ).toBeInTheDocument(); + expect(screen.getByTestId('editable-save-markdown')).toHaveAttribute('disabled'); }); }); diff --git a/x-pack/plugins/cases/public/components/header_page/editable_title.test.tsx b/x-pack/plugins/cases/public/components/header_page/editable_title.test.tsx index 97f5b302b9cc9..b8486e67dff75 100644 --- a/x-pack/plugins/cases/public/components/header_page/editable_title.test.tsx +++ b/x-pack/plugins/cases/public/components/header_page/editable_title.test.tsx @@ -209,7 +209,7 @@ describe('EditableTitle', () => { wrapper.find('button[data-test-subj="editable-title-submit-btn"]').simulate('click'); wrapper.update(); expect(wrapper.find('.euiFormErrorText').text()).toBe( - 'The length of the title is too long. The maximum length is 160.' + 'The length of the title is too long. The maximum length is 160 characters.' ); expect(submitTitle).not.toHaveBeenCalled(); @@ -263,7 +263,7 @@ describe('EditableTitle', () => { wrapper.find('button[data-test-subj="editable-title-submit-btn"]').simulate('click'); wrapper.update(); expect(wrapper.find('.euiFormErrorText').text()).toBe( - 'The length of the title is too long. The maximum length is 160.' + 'The length of the title is too long. The maximum length is 160 characters.' ); // write a shorter one diff --git a/x-pack/plugins/cases/public/components/markdown_editor/editable_markdown_footer.tsx b/x-pack/plugins/cases/public/components/markdown_editor/editable_markdown_footer.tsx index 86772136c18d0..5ce43423597de 100644 --- a/x-pack/plugins/cases/public/components/markdown_editor/editable_markdown_footer.tsx +++ b/x-pack/plugins/cases/public/components/markdown_editor/editable_markdown_footer.tsx @@ -8,21 +8,19 @@ import { EuiFlexGroup, EuiFlexItem, EuiButtonEmpty, EuiButton } from '@elastic/eui'; import React from 'react'; -import { useFormData } from '@kbn/es-ui-shared-plugin/static/forms/hook_form_lib'; - import * as i18n from '../case_view/translations'; interface EditableMarkdownFooterProps { handleSaveAction: () => Promise; handleCancelAction: () => void; + isSaveDisabled: boolean; } const EditableMarkdownFooterComponent: React.FC = ({ handleSaveAction, handleCancelAction, + isSaveDisabled, }) => { - const [{ content }] = useFormData<{ content: string }>({ watch: ['content'] }); - return ( @@ -42,7 +40,7 @@ const EditableMarkdownFooterComponent: React.FC = ( fill iconType="save" onClick={handleSaveAction} - disabled={!content} + disabled={isSaveDisabled} size="s" > {i18n.SAVE} diff --git a/x-pack/plugins/cases/public/components/markdown_editor/editable_markdown_renderer.test.tsx b/x-pack/plugins/cases/public/components/markdown_editor/editable_markdown_renderer.test.tsx index 59d424fdd82c8..af114e8ec473e 100644 --- a/x-pack/plugins/cases/public/components/markdown_editor/editable_markdown_renderer.test.tsx +++ b/x-pack/plugins/cases/public/components/markdown_editor/editable_markdown_renderer.test.tsx @@ -6,14 +6,17 @@ */ import React from 'react'; -import { useForm, Form } from '@kbn/es-ui-shared-plugin/static/forms/hook_form_lib'; +import type { FormSchema } from '@kbn/es-ui-shared-plugin/static/forms/hook_form_lib'; +import { useForm, Form, FIELD_TYPES } from '@kbn/es-ui-shared-plugin/static/forms/hook_form_lib'; import { waitFor, fireEvent, screen, render, act } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; +import { fieldValidators } from '@kbn/es-ui-shared-plugin/static/forms/helpers'; +import * as i18n from '../../common/translations'; + +const { emptyField, maxLengthField } = fieldValidators; import { EditableMarkdown } from '.'; import { TestProviders } from '../../common/mock'; -import type { Content } from '../user_actions/schema'; -import { schema } from '../user_actions/schema'; jest.mock('../../common/lib/kibana'); @@ -21,10 +24,27 @@ const onChangeEditable = jest.fn(); const onSaveContent = jest.fn(); const newValue = 'Hello from Tehas'; -const emptyValue = ''; const hyperlink = `[hyperlink](http://elastic.co)`; const draftStorageKey = `cases.testAppId.caseId.markdown-id.markdownEditor`; const content = `A link to a timeline ${hyperlink}`; +const maxLength = 5000; + +const mockSchema: FormSchema<{ content: string }> = { + content: { + type: FIELD_TYPES.TEXTAREA, + validations: [ + { + validator: emptyField(i18n.REQUIRED_FIELD), + }, + { + validator: maxLengthField({ + length: maxLength, + message: i18n.MAX_LENGTH_ERROR('textarea', maxLength), + }), + }, + ], + }, +}; const editorRef: React.MutableRefObject = { current: null }; const defaultProps = { @@ -36,7 +56,7 @@ const defaultProps = { onChangeEditable, onSaveContent, fieldName: 'content', - formSchema: schema, + formSchema: mockSchema, editorRef, }; @@ -45,10 +65,10 @@ describe('EditableMarkdown', () => { children, testProviderProps = {}, }) => { - const { form } = useForm({ + const { form } = useForm<{ content: string }>({ defaultValue: { content }, options: { stripEmptyFields: false }, - schema, + schema: mockSchema, }); return ( @@ -100,32 +120,77 @@ describe('EditableMarkdown', () => { expect(onSaveContent).not.toHaveBeenCalled(); }); - it('Save button disabled if current text is empty', async () => { + it('Cancel button click calls only onChangeEditable', async () => { render( ); - fireEvent.change(screen.getByTestId('euiMarkdownEditorTextArea'), { value: emptyValue }); + userEvent.click(screen.getByTestId('editable-cancel-markdown')); await waitFor(() => { - expect(screen.getByTestId('editable-save-markdown')).toHaveProperty('disabled'); + expect(onSaveContent).not.toHaveBeenCalled(); + expect(onChangeEditable).toHaveBeenCalledWith(defaultProps.id); }); }); - it('Cancel button click calls only onChangeEditable', async () => { - render( - - - - ); + describe('errors', () => { + it('Shows error message and save button disabled if current text is empty', async () => { + render( + + + + ); - userEvent.click(screen.getByTestId('editable-cancel-markdown')); + userEvent.clear(screen.getByTestId('euiMarkdownEditorTextArea')); - await waitFor(() => { - expect(onSaveContent).not.toHaveBeenCalled(); - expect(onChangeEditable).toHaveBeenCalledWith(defaultProps.id); + userEvent.type(screen.getByTestId('euiMarkdownEditorTextArea'), ''); + + await waitFor(() => { + expect(screen.getByText('Required field')).toBeInTheDocument(); + expect(screen.getByTestId('editable-save-markdown')).toHaveProperty('disabled'); + }); + }); + + it('Shows error message and save button disabled if current text is of empty characters', async () => { + render( + + + + ); + + userEvent.clear(screen.getByTestId('euiMarkdownEditorTextArea')); + + userEvent.type(screen.getByTestId('euiMarkdownEditorTextArea'), ' '); + + await waitFor(() => { + expect(screen.getByText('Required field')).toBeInTheDocument(); + expect(screen.getByTestId('editable-save-markdown')).toHaveProperty('disabled'); + }); + }); + + it('Shows error message and save button disabled if current text is too long', async () => { + const longComment = 'b'.repeat(maxLength + 1); + + render( + + + + ); + + const markdown = screen.getByTestId('euiMarkdownEditorTextArea'); + + userEvent.paste(markdown, longComment); + + await waitFor(() => { + expect( + screen.getByText( + `The length of the textarea is too long. The maximum length is ${maxLength} characters.` + ) + ).toBeInTheDocument(); + expect(screen.getByTestId('editable-save-markdown')).toHaveProperty('disabled'); + }); }); }); diff --git a/x-pack/plugins/cases/public/components/markdown_editor/editable_markdown_renderer.tsx b/x-pack/plugins/cases/public/components/markdown_editor/editable_markdown_renderer.tsx index 1706e30fcc8f4..6cbaca3378242 100644 --- a/x-pack/plugins/cases/public/components/markdown_editor/editable_markdown_renderer.tsx +++ b/x-pack/plugins/cases/public/components/markdown_editor/editable_markdown_renderer.tsx @@ -46,7 +46,7 @@ const EditableMarkDownRenderer = forwardRef< options: { stripEmptyFields: false }, schema: formSchema, }); - const { submit, setFieldValue } = form; + const { submit, setFieldValue, isValid: isFormValid } = form; const setComment = useCallback( (newComment) => { @@ -90,6 +90,7 @@ const EditableMarkDownRenderer = forwardRef< ), initialValue: content, diff --git a/x-pack/plugins/cases/public/components/user_actions/markdown_form.test.tsx b/x-pack/plugins/cases/public/components/user_actions/markdown_form.test.tsx index a52d1bf221119..15a8094561332 100644 --- a/x-pack/plugins/cases/public/components/user_actions/markdown_form.test.tsx +++ b/x-pack/plugins/cases/public/components/user_actions/markdown_form.test.tsx @@ -12,6 +12,7 @@ import userEvent from '@testing-library/user-event'; import type { AppMockRenderer } from '../../common/mock'; import { createAppMockRenderer } from '../../common/mock'; import { UserActionMarkdown } from './markdown_form'; +import { MAX_COMMENT_LENGTH } from '../../../common/constants'; jest.mock('../../common/lib/kibana'); jest.mock('../../common/navigation/hooks'); @@ -58,6 +59,53 @@ describe('UserActionMarkdown ', () => { expect(screen.getByTestId('editable-cancel-markdown')).toBeInTheDocument(); }); + describe('errors', () => { + it('Shows error message and save button disabled if current text is empty', async () => { + appMockRenderer.render(); + + userEvent.clear(screen.getByTestId('euiMarkdownEditorTextArea')); + + userEvent.type(screen.getByTestId('euiMarkdownEditorTextArea'), ''); + + await waitFor(() => { + expect(screen.getByText('Empty comments are not allowed.')).toBeInTheDocument(); + expect(screen.getByTestId('editable-save-markdown')).toHaveProperty('disabled'); + }); + }); + + it('Shows error message and save button disabled if current text is of empty characters', async () => { + appMockRenderer.render(); + + userEvent.clear(screen.getByTestId('euiMarkdownEditorTextArea')); + + userEvent.type(screen.getByTestId('euiMarkdownEditorTextArea'), ' '); + + await waitFor(() => { + expect(screen.getByText('Empty comments are not allowed.')).toBeInTheDocument(); + expect(screen.getByTestId('editable-save-markdown')).toHaveProperty('disabled'); + }); + }); + + it('Shows error message and save button disabled if current text is too long', async () => { + const longComment = 'b'.repeat(MAX_COMMENT_LENGTH + 1); + + appMockRenderer.render(); + + const markdown = screen.getByTestId('euiMarkdownEditorTextArea'); + + userEvent.paste(markdown, longComment); + + await waitFor(() => { + expect( + screen.getByText( + 'The length of the comment is too long. The maximum length is 30000 characters.' + ) + ).toBeInTheDocument(); + expect(screen.getByTestId('editable-save-markdown')).toHaveProperty('disabled'); + }); + }); + }); + describe('useForm stale state bug', () => { const oldContent = defaultProps.content; const appendContent = ' appended content'; diff --git a/x-pack/plugins/cases/public/components/user_actions/schema.ts b/x-pack/plugins/cases/public/components/user_actions/schema.ts index 8c47b700adeb5..2beedd80260e6 100644 --- a/x-pack/plugins/cases/public/components/user_actions/schema.ts +++ b/x-pack/plugins/cases/public/components/user_actions/schema.ts @@ -9,8 +9,9 @@ import type { FormSchema } from '@kbn/es-ui-shared-plugin/static/forms/hook_form import { FIELD_TYPES } from '@kbn/es-ui-shared-plugin/static/forms/hook_form_lib'; import { fieldValidators } from '@kbn/es-ui-shared-plugin/static/forms/helpers'; import * as i18n from '../../common/translations'; +import { MAX_COMMENT_LENGTH } from '../../../common/constants'; -const { emptyField } = fieldValidators; +const { emptyField, maxLengthField } = fieldValidators; export interface Content { content: string; } @@ -19,7 +20,13 @@ export const schema: FormSchema = { type: FIELD_TYPES.TEXTAREA, validations: [ { - validator: emptyField(i18n.REQUIRED_FIELD), + validator: emptyField(i18n.EMPTY_COMMENTS_NOT_ALLOWED), + }, + { + validator: maxLengthField({ + length: MAX_COMMENT_LENGTH, + message: i18n.MAX_LENGTH_ERROR('comment', MAX_COMMENT_LENGTH), + }), }, ], }, diff --git a/x-pack/plugins/enterprise_search/common/constants.ts b/x-pack/plugins/enterprise_search/common/constants.ts index 88290c2ed4831..0e1e7be69f492 100644 --- a/x-pack/plugins/enterprise_search/common/constants.ts +++ b/x-pack/plugins/enterprise_search/common/constants.ts @@ -10,11 +10,16 @@ import { i18n } from '@kbn/i18n'; import { ProductFeatures } from './types'; import { IngestPipelineParams } from './types/connectors'; +export const SEARCH_PRODUCT_NAME = i18n.translate('xpack.enterpriseSearch.search.productName', { + defaultMessage: 'Search', +}); +export const ENTERPRISE_SEARCH_PRODUCT_NAME = i18n.translate('xpack.enterpriseSearch.productName', { + defaultMessage: 'Enterprise Search', +}); + export const ENTERPRISE_SEARCH_OVERVIEW_PLUGIN = { ID: 'enterpriseSearch', - NAME: i18n.translate('xpack.enterpriseSearch.overview.productName', { - defaultMessage: 'Enterprise Search', - }), + NAME: SEARCH_PRODUCT_NAME, NAV_TITLE: i18n.translate('xpack.enterpriseSearch.overview.navTitle', { defaultMessage: 'Overview', }), @@ -27,9 +32,7 @@ export const ENTERPRISE_SEARCH_OVERVIEW_PLUGIN = { export const ENTERPRISE_SEARCH_CONTENT_PLUGIN = { ID: 'enterpriseSearchContent', - NAME: i18n.translate('xpack.enterpriseSearch.content.productName', { - defaultMessage: 'Enterprise Search', - }), + NAME: SEARCH_PRODUCT_NAME, NAV_TITLE: i18n.translate('xpack.enterpriseSearch.content.navTitle', { defaultMessage: 'Content', }), diff --git a/x-pack/plugins/enterprise_search/public/applications/analytics/components/layout/page_template.test.tsx b/x-pack/plugins/enterprise_search/public/applications/analytics/components/layout/page_template.test.tsx index f9b6194ee5cb2..65c3bd5cd7b6f 100644 --- a/x-pack/plugins/enterprise_search/public/applications/analytics/components/layout/page_template.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/analytics/components/layout/page_template.test.tsx @@ -29,7 +29,7 @@ describe('EnterpriseSearchAnalyticsPageTemplate', () => { ); expect(wrapper.type()).toEqual(EnterpriseSearchPageTemplateWrapper); - expect(wrapper.prop('solutionNav')).toEqual({ name: 'Enterprise Search', items: [] }); + expect(wrapper.prop('solutionNav')).toEqual({ name: 'Search', items: [] }); expect(wrapper.find('.hello').text()).toEqual('world'); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/error_connecting/error_connecting.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/error_connecting/error_connecting.tsx index 42a250b630b99..69f479026014e 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/error_connecting/error_connecting.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/error_connecting/error_connecting.tsx @@ -10,7 +10,7 @@ import React from 'react'; import { KibanaPageTemplate } from '@kbn/shared-ux-page-kibana-template'; import { ErrorStatePrompt } from '../../../shared/error_state'; -import { SetEnterpriseSearchChrome as SetPageChrome } from '../../../shared/kibana_chrome'; +import { SetSearchChrome as SetPageChrome } from '../../../shared/kibana_chrome'; import { SendEnterpriseSearchTelemetry as SendTelemetry } from '../../../shared/telemetry'; export const ErrorConnecting: React.FC = () => { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/layout/page_template.test.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/layout/page_template.test.tsx index d7e0f4c2b20e3..3f072abb3c0bf 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/layout/page_template.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/layout/page_template.test.tsx @@ -28,7 +28,7 @@ describe('EnterpriseSearchContentPageTemplate', () => { ); expect(wrapper.type()).toEqual(EnterpriseSearchPageTemplateWrapper); - expect(wrapper.prop('solutionNav')).toEqual({ name: 'Enterprise Search', items: [] }); + expect(wrapper.prop('solutionNav')).toEqual({ name: 'Search', items: [] }); expect(wrapper.find('.hello').text()).toEqual('world'); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/layout/page_template.test.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/layout/page_template.test.tsx index 791a9bbab3a11..ea0e3f4b7749b 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/layout/page_template.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/layout/page_template.test.tsx @@ -13,7 +13,7 @@ import React from 'react'; import { shallow } from 'enzyme'; -import { SetEnterpriseSearchChrome } from '../../../shared/kibana_chrome'; +import { SetSearchChrome } from '../../../shared/kibana_chrome'; import { EnterpriseSearchPageTemplateWrapper } from '../../../shared/layout'; import { SendEnterpriseSearchTelemetry } from '../../../shared/telemetry'; @@ -28,7 +28,7 @@ describe('EnterpriseSearchOverviewPageTemplate', () => { ); expect(wrapper.type()).toEqual(EnterpriseSearchPageTemplateWrapper); - expect(wrapper.prop('solutionNav')).toEqual({ name: 'Enterprise Search', items: [] }); + expect(wrapper.prop('solutionNav')).toEqual({ name: 'Search', items: [] }); expect(wrapper.find('.hello').text()).toEqual('world'); }); @@ -39,7 +39,7 @@ describe('EnterpriseSearchOverviewPageTemplate', () => { .find(EnterpriseSearchPageTemplateWrapper) .prop('setPageChrome') as any; - expect(setPageChrome.type).toEqual(SetEnterpriseSearchChrome); + expect(setPageChrome.type).toEqual(SetSearchChrome); expect(setPageChrome.props.trail).toEqual(['Some page']); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/layout/page_template.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/layout/page_template.tsx index 8902788edb329..0929e81d02cbe 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/layout/page_template.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/layout/page_template.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { ENTERPRISE_SEARCH_CONTENT_PLUGIN } from '../../../../../common/constants'; -import { SetEnterpriseSearchChrome } from '../../../shared/kibana_chrome'; +import { SetSearchChrome } from '../../../shared/kibana_chrome'; import { EnterpriseSearchPageTemplateWrapper, PageTemplateProps } from '../../../shared/layout'; import { useEnterpriseSearchNav } from '../../../shared/layout'; import { SendEnterpriseSearchTelemetry } from '../../../shared/telemetry'; @@ -26,7 +26,7 @@ export const EnterpriseSearchOverviewPageTemplate: React.FC = name: ENTERPRISE_SEARCH_CONTENT_PLUGIN.NAME, items: useEnterpriseSearchNav(), }} - setPageChrome={pageChrome && } + setPageChrome={pageChrome && } > {pageViewTelemetry && ( diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/product_selector.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/product_selector.tsx index e9eaa84359826..d1a205a4ddf72 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/product_selector.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/product_selector/product_selector.tsx @@ -30,7 +30,7 @@ import { import { AddContentEmptyPrompt } from '../../../shared/add_content_empty_prompt'; import { docLinks } from '../../../shared/doc_links'; import { KibanaLogic } from '../../../shared/kibana'; -import { SetEnterpriseSearchChrome as SetPageChrome } from '../../../shared/kibana_chrome'; +import { SetSearchChrome as SetPageChrome } from '../../../shared/kibana_chrome'; import { SendEnterpriseSearchTelemetry as SendTelemetry } from '../../../shared/telemetry'; import { EnterpriseSearchOverviewPageTemplate } from '../layout'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/setup_guide/setup_guide.test.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/setup_guide/setup_guide.test.tsx index be42627debc73..5341bcfcc59d8 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/setup_guide/setup_guide.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/setup_guide/setup_guide.test.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { shallow } from 'enzyme'; -import { SetEnterpriseSearchChrome as SetPageChrome } from '../../../shared/kibana_chrome'; +import { SetSearchChrome as SetPageChrome } from '../../../shared/kibana_chrome'; import { SetupGuideLayout } from '../../../shared/setup_guide'; import { SetupGuide } from '.'; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/setup_guide/setup_guide.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/setup_guide/setup_guide.tsx index c8889320bb346..8d787e5254b93 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/setup_guide/setup_guide.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_overview/components/setup_guide/setup_guide.tsx @@ -12,7 +12,7 @@ import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import { ENTERPRISE_SEARCH_OVERVIEW_PLUGIN } from '../../../../../common/constants'; -import { SetEnterpriseSearchChrome as SetPageChrome } from '../../../shared/kibana_chrome'; +import { SetSearchChrome as SetPageChrome } from '../../../shared/kibana_chrome'; import { SetupGuideLayout, SETUP_GUIDE_TITLE } from '../../../shared/setup_guide'; import { SendEnterpriseSearchTelemetry as SendTelemetry } from '../../../shared/telemetry'; diff --git a/x-pack/plugins/enterprise_search/public/applications/search_experiences/components/layout/page_template.test.tsx b/x-pack/plugins/enterprise_search/public/applications/search_experiences/components/layout/page_template.test.tsx index f1c889c020d7a..ef1e5ffa70593 100644 --- a/x-pack/plugins/enterprise_search/public/applications/search_experiences/components/layout/page_template.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/search_experiences/components/layout/page_template.test.tsx @@ -28,7 +28,7 @@ describe('EnterpriseSearchSearchExperiencesPageTemplate', () => { ); expect(wrapper.type()).toEqual(EnterpriseSearchPageTemplateWrapper); - expect(wrapper.prop('solutionNav')).toEqual({ name: 'Enterprise Search', items: [] }); + expect(wrapper.prop('solutionNav')).toEqual({ name: 'Search', items: [] }); expect(wrapper.find('.hello').text()).toEqual('world'); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_breadcrumbs.ts b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_breadcrumbs.ts index 1666920a0a8e1..a0e912fbae149 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_breadcrumbs.ts +++ b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_breadcrumbs.ts @@ -14,6 +14,7 @@ import { APP_SEARCH_PLUGIN, ENTERPRISE_SEARCH_CONTENT_PLUGIN, ENTERPRISE_SEARCH_OVERVIEW_PLUGIN, + ENTERPRISE_SEARCH_PRODUCT_NAME, ESRE_PLUGIN, SEARCH_EXPERIENCES_PLUGIN, VECTOR_SEARCH_PLUGIN, @@ -102,7 +103,7 @@ export const useEuiBreadcrumbs = (breadcrumbs: Breadcrumbs): EuiBreadcrumb[] => export const useEnterpriseSearchBreadcrumbs = (breadcrumbs: Breadcrumbs = []) => useEuiBreadcrumbs([ { - text: ENTERPRISE_SEARCH_OVERVIEW_PLUGIN.NAME, + text: ENTERPRISE_SEARCH_PRODUCT_NAME, path: ENTERPRISE_SEARCH_OVERVIEW_PLUGIN.URL, shouldNotCreateHref: true, }, diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_title.test.ts b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_title.test.ts index f35ef14942a83..511445240095f 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_title.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_title.test.ts @@ -5,12 +5,7 @@ * 2.0. */ -import { - generateTitle, - enterpriseSearchTitle, - appSearchTitle, - workplaceSearchTitle, -} from './generate_title'; +import { generateTitle, searchTitle, appSearchTitle, workplaceSearchTitle } from './generate_title'; describe('generateTitle', () => { it('creates a hyphen separated string from an array of page titles', () => { @@ -19,20 +14,20 @@ describe('generateTitle', () => { }); }); -describe('enterpriseSearchTitle', () => { +describe('searchTitle', () => { it('automatically appends the Enterprise Search product onto the pages array', () => { - const title = enterpriseSearchTitle(['Setup Guide']); - expect(title).toEqual('Setup Guide - Enterprise Search'); + const title = searchTitle(['Setup Guide']); + expect(title).toEqual('Setup Guide - Search'); }); it('can be mixed and matched', () => { - const title = enterpriseSearchTitle([appSearchTitle(['Some Page'])]); - expect(title).toEqual('Some Page - App Search - Enterprise Search'); + const title = searchTitle([appSearchTitle(['Some Page'])]); + expect(title).toEqual('Some Page - App Search - Search'); }); it('falls back to product name', () => { - const title = enterpriseSearchTitle(); - expect(title).toEqual('Enterprise Search'); + const title = searchTitle(); + expect(title).toEqual('Search'); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_title.ts b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_title.ts index 5b9040280b1c7..a9c5927954b9c 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_title.ts +++ b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/generate_title.ts @@ -6,11 +6,11 @@ */ import { - ENTERPRISE_SEARCH_OVERVIEW_PLUGIN, ANALYTICS_PLUGIN, APP_SEARCH_PLUGIN, WORKPLACE_SEARCH_PLUGIN, SEARCH_EXPERIENCES_PLUGIN, + SEARCH_PRODUCT_NAME, ESRE_PLUGIN, VECTOR_SEARCH_PLUGIN, } from '../../../../common/constants'; @@ -33,8 +33,7 @@ export const generateTitle = (pages: Title) => pages.join(' - '); * Product-specific helpers */ -export const enterpriseSearchTitle = (page: Title = []) => - generateTitle([...page, ENTERPRISE_SEARCH_OVERVIEW_PLUGIN.NAME]); +export const searchTitle = (page: Title = []) => generateTitle([...page, SEARCH_PRODUCT_NAME]); export const analyticsTitle = (page: Title = []) => generateTitle([...page, ANALYTICS_PLUGIN.NAME]); diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/index.ts b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/index.ts index 870bf13312e66..7ffc58bfa0337 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/index.ts +++ b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/index.ts @@ -6,7 +6,7 @@ */ export { - SetEnterpriseSearchChrome, + SetSearchChrome, SetAnalyticsChrome, SetEnterpriseSearchContentChrome, SetElasticsearchChrome, diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/set_chrome.test.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/set_chrome.test.tsx index f4867468d5477..aaf8e119e7c00 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/set_chrome.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/set_chrome.test.tsx @@ -26,13 +26,13 @@ import { } from './generate_breadcrumbs'; jest.mock('./generate_title', () => ({ - enterpriseSearchTitle: jest.fn((title: any) => title), + searchTitle: jest.fn((title: any) => title), appSearchTitle: jest.fn((title: any) => title), workplaceSearchTitle: jest.fn((title: any) => title), })); -import { enterpriseSearchTitle, appSearchTitle, workplaceSearchTitle } from './generate_title'; +import { searchTitle, appSearchTitle, workplaceSearchTitle } from './generate_title'; -import { SetEnterpriseSearchChrome, SetAppSearchChrome, SetWorkplaceSearchChrome } from '.'; +import { SetSearchChrome, SetAppSearchChrome, SetWorkplaceSearchChrome } from '.'; describe('Set Kibana Chrome helpers', () => { const mockCurrentPath = (pathname: string) => @@ -48,11 +48,11 @@ describe('Set Kibana Chrome helpers', () => { expect(mockKibanaValues.setDocTitle).toHaveBeenCalled(); }); - describe('SetEnterpriseSearchChrome', () => { + describe('SetSearchChrome', () => { it('sets breadcrumbs and document title', () => { - shallow(); + shallow(); - expect(enterpriseSearchTitle).toHaveBeenCalledWith(['Hello World']); + expect(searchTitle).toHaveBeenCalledWith(['Hello World']); expect(useEnterpriseSearchBreadcrumbs).toHaveBeenCalledWith([ { text: 'Hello World', @@ -62,9 +62,9 @@ describe('Set Kibana Chrome helpers', () => { }); it('handles empty trails as a root-level page', () => { - shallow(); + shallow(); - expect(enterpriseSearchTitle).toHaveBeenCalledWith([]); + expect(searchTitle).toHaveBeenCalledWith([]); expect(useEnterpriseSearchBreadcrumbs).toHaveBeenCalledWith([]); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/set_chrome.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/set_chrome.tsx index ce689c871e085..3e7384bd2e593 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/set_chrome.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/kibana_chrome/set_chrome.tsx @@ -28,7 +28,7 @@ import { useVectorSearchBreadcrumbs, } from './generate_breadcrumbs'; import { - enterpriseSearchTitle, + searchTitle, analyticsTitle, elasticsearchTitle, appSearchTitle, @@ -57,11 +57,11 @@ interface SetChromeProps { trail?: BreadcrumbTrail; } -export const SetEnterpriseSearchChrome: React.FC = ({ trail = [] }) => { +export const SetSearchChrome: React.FC = ({ trail = [] }) => { const { setBreadcrumbs, setDocTitle } = useValues(KibanaLogic); const title = reverseArray(trail); - const docTitle = enterpriseSearchTitle(title); + const docTitle = searchTitle(title); const crumbs = useGenerateBreadcrumbs(trail); const breadcrumbs = useEnterpriseSearchBreadcrumbs(crumbs); @@ -69,7 +69,7 @@ export const SetEnterpriseSearchChrome: React.FC = ({ trail = [] useEffect(() => { setBreadcrumbs(breadcrumbs); setDocTitle(docTitle); - }, [trail]); + }, [trail.join('|')]); return null; }; diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/layout/nav.test.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/layout/nav.test.tsx index ad68e8835a132..dd461a48c9310 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/layout/nav.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/layout/nav.test.tsx @@ -103,7 +103,7 @@ describe('useEnterpriseSearchContentNav', () => { name: 'Applications', }, { - id: 'standaloneExperiences', + id: 'enterpriseSearch', items: [ { href: '/app/enterprise_search/app_search', @@ -116,7 +116,7 @@ describe('useEnterpriseSearchContentNav', () => { name: 'Workplace Search', }, ], - name: 'Standalone Experiences', + name: 'Enterprise Search', }, ]); }); @@ -136,8 +136,8 @@ describe('useEnterpriseSearchContentNav', () => { mockKibanaValues.uiSettings.get.mockReturnValue(false); const esNav = useEnterpriseSearchNav(); - const standAloneNav = esNav?.find((item) => item.id === 'standaloneExperiences'); - expect(standAloneNav).toBeUndefined(); + const legacyESNav = esNav?.find((item) => item.id === 'enterpriseSearch'); + expect(legacyESNav).toBeUndefined(); }); it('excludes App Search when the user has no access to it', () => { @@ -154,10 +154,10 @@ describe('useEnterpriseSearchContentNav', () => { }); const esNav = useEnterpriseSearchNav(); - const standAloneNav = esNav?.find((item) => item.id === 'standaloneExperiences'); - expect(standAloneNav).not.toBeUndefined(); - expect(standAloneNav).toEqual({ - id: 'standaloneExperiences', + const legacyESNav = esNav?.find((item) => item.id === 'enterpriseSearch'); + expect(legacyESNav).not.toBeUndefined(); + expect(legacyESNav).toEqual({ + id: 'enterpriseSearch', items: [ { href: '/app/enterprise_search/workplace_search', @@ -165,7 +165,7 @@ describe('useEnterpriseSearchContentNav', () => { name: 'Workplace Search', }, ], - name: 'Standalone Experiences', + name: 'Enterprise Search', }); }); @@ -182,10 +182,10 @@ describe('useEnterpriseSearchContentNav', () => { }); const esNav = useEnterpriseSearchNav(); - const standAloneNav = esNav?.find((item) => item.id === 'standaloneExperiences'); - expect(standAloneNav).not.toBeUndefined(); - expect(standAloneNav).toEqual({ - id: 'standaloneExperiences', + const legacyESNav = esNav?.find((item) => item.id === 'enterpriseSearch'); + expect(legacyESNav).not.toBeUndefined(); + expect(legacyESNav).toEqual({ + id: 'enterpriseSearch', items: [ { href: '/app/enterprise_search/app_search', @@ -193,7 +193,7 @@ describe('useEnterpriseSearchContentNav', () => { name: 'App Search', }, ], - name: 'Standalone Experiences', + name: 'Enterprise Search', }); }); }); @@ -271,7 +271,7 @@ describe('useEnterpriseSearchApplicationNav', () => { name: 'Applications', }, { - id: 'standaloneExperiences', + id: 'enterpriseSearch', items: [ { href: '/app/enterprise_search/app_search', @@ -284,7 +284,7 @@ describe('useEnterpriseSearchApplicationNav', () => { name: 'Workplace Search', }, ], - name: 'Standalone Experiences', + name: 'Enterprise Search', }, ]); }); @@ -296,7 +296,7 @@ describe('useEnterpriseSearchApplicationNav', () => { 'Overview', 'Content', 'Applications', - 'Standalone Experiences', + 'Enterprise Search', ]); const searchItem = navItems?.find((ni) => ni.id === 'applications'); expect(searchItem).not.toBeUndefined(); @@ -352,7 +352,7 @@ describe('useEnterpriseSearchApplicationNav', () => { 'Overview', 'Content', 'Applications', - 'Standalone Experiences', + 'Enterprise Search', ]); const searchItem = navItems?.find((ni) => ni.id === 'applications'); expect(searchItem).not.toBeUndefined(); @@ -463,7 +463,7 @@ describe('useEnterpriseSearchAnalyticsNav', () => { name: 'Applications', }, { - id: 'standaloneExperiences', + id: 'enterpriseSearch', items: [ { href: '/app/enterprise_search/app_search', @@ -476,7 +476,7 @@ describe('useEnterpriseSearchAnalyticsNav', () => { name: 'Workplace Search', }, ], - name: 'Standalone Experiences', + name: 'Enterprise Search', }, ]; diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/layout/nav.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/layout/nav.tsx index 8a58404855ed6..5579d17d018db 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/layout/nav.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/layout/nav.tsx @@ -150,7 +150,7 @@ export const useEnterpriseSearchNav = () => { ...(productAccess.hasAppSearchAccess || productAccess.hasWorkplaceSearchAccess ? [ { - id: 'standaloneExperiences', + id: 'enterpriseSearch', items: [ ...(productAccess.hasAppSearchAccess ? [ @@ -181,8 +181,8 @@ export const useEnterpriseSearchNav = () => { ] : []), ], - name: i18n.translate('xpack.enterpriseSearch.nav.standaloneExperiencesTitle', { - defaultMessage: 'Standalone Experiences', + name: i18n.translate('xpack.enterpriseSearch.nav.title', { + defaultMessage: 'Enterprise Search', }), }, ] diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/layout/page_template.test.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/layout/page_template.test.tsx index 536507aebf899..dc73570f0c209 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/layout/page_template.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/layout/page_template.test.tsx @@ -201,16 +201,29 @@ describe('EnterpriseSearchPageTemplateWrapper', () => { ); }); - it('automatically sets the Enterprise Search logo onto passed solution navs', () => { + it('automatically sets the Search logo onto passed solution navs', () => { + const wrapper = shallow( + + ); + + expect(wrapper.find(KibanaPageTemplate).prop('solutionNav')).toEqual({ + icon: 'logoEnterpriseSearch', + name: 'Search', + items: [], + }); + }); + + it('sets the solutionNavIcon passed', () => { const wrapper = shallow( ); expect(wrapper.find(KibanaPageTemplate).prop('solutionNav')).toEqual({ - icon: 'logoEnterpriseSearch', - name: 'Enterprise Search', + icon: 'logoElasticsearch', + name: 'Search', items: [], }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/layout/page_template.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/layout/page_template.tsx index 333d4d5f33b9a..ac7f411edff9d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/layout/page_template.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/layout/page_template.tsx @@ -42,6 +42,7 @@ export type PageTemplateProps = KibanaPageTemplateProps & { pageChrome?: BreadcrumbTrail; pageViewTelemetry?: string; setPageChrome?: React.ReactNode; + solutionNavIcon?: string; }; export const EnterpriseSearchPageTemplateWrapper: React.FC = ({ @@ -54,12 +55,14 @@ export const EnterpriseSearchPageTemplateWrapper: React.FC = emptyState, setPageChrome, solutionNav, + solutionNavIcon, ...pageTemplateProps }) => { const { readOnlyMode } = useValues(HttpLogic); const hasCustomEmptyState = !!emptyState; const showCustomEmptyState = hasCustomEmptyState && isEmptyState; + const navIcon = solutionNavIcon ?? 'logoEnterpriseSearch'; return ( = ), }} isEmptyState={isEmptyState && !isLoading} - solutionNav={ - solutionNav && solutionNav.items - ? { icon: 'logoEnterpriseSearch', ...solutionNav } - : undefined - } + solutionNav={solutionNav && solutionNav.items ? { icon: navIcon, ...solutionNav } : undefined} > {setPageChrome} {readOnlyMode && ( diff --git a/x-pack/plugins/enterprise_search/public/plugin.ts b/x-pack/plugins/enterprise_search/public/plugin.ts index 0eae0003ae96e..b991e30bf851b 100644 --- a/x-pack/plugins/enterprise_search/public/plugin.ts +++ b/x-pack/plugins/enterprise_search/public/plugin.ts @@ -34,6 +34,7 @@ import { ENTERPRISE_SEARCH_CONTENT_PLUGIN, ENTERPRISE_SEARCH_OVERVIEW_PLUGIN, SEARCH_EXPERIENCES_PLUGIN, + SEARCH_PRODUCT_NAME, VECTOR_SEARCH_PLUGIN, WORKPLACE_SEARCH_PLUGIN, } from '../common/constants'; @@ -350,7 +351,7 @@ export class EnterpriseSearchPlugin implements Plugin { id: ENTERPRISE_SEARCH_OVERVIEW_PLUGIN.ID, order: 100, path: ENTERPRISE_SEARCH_OVERVIEW_PLUGIN.URL, - title: ENTERPRISE_SEARCH_OVERVIEW_PLUGIN.NAME, + title: SEARCH_PRODUCT_NAME, }); plugins.home.featureCatalogue.register({ diff --git a/x-pack/plugins/infra/public/common/visualizations/constants.ts b/x-pack/plugins/infra/public/common/visualizations/constants.ts index 66f0cb1e1c422..a91a29e2c44e3 100644 --- a/x-pack/plugins/infra/public/common/visualizations/constants.ts +++ b/x-pack/plugins/infra/public/common/visualizations/constants.ts @@ -20,7 +20,6 @@ import { tx, hostCount, } from './lens/formulas/host'; -import { LineChart, MetricChart } from './lens/visualization_types'; export const hostLensFormulas = { cpuUsage, @@ -38,9 +37,4 @@ export const hostLensFormulas = { tx, }; -export const visualizationTypes = { - lineChart: LineChart, - metricChart: MetricChart, -}; - export const HOST_METRICS_DOC_HREF = 'https://ela.st/docs-infra-host-metrics'; diff --git a/x-pack/plugins/infra/public/common/visualizations/index.ts b/x-pack/plugins/infra/public/common/visualizations/index.ts index 9be4015a80a73..888bf3d8f8ad6 100644 --- a/x-pack/plugins/infra/public/common/visualizations/index.ts +++ b/x-pack/plugins/infra/public/common/visualizations/index.ts @@ -7,16 +7,16 @@ export type { HostsLensFormulas, - LineChartOptions, - LensChartConfig, - LensLineChartConfig, - MetricChartOptions, HostsLensMetricChartFormulas, HostsLensLineChartFormulas, - LensOptions, LensAttributes, + FormulaConfig, + Chart, + LensVisualizationState, } from './types'; -export { hostLensFormulas, visualizationTypes } from './constants'; +export { hostLensFormulas } from './constants'; + +export * from './lens/visualization_types'; export { LensAttributesBuilder } from './lens/lens_attributes_builder'; diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/README.md b/x-pack/plugins/infra/public/common/visualizations/lens/README.md new file mode 100644 index 0000000000000..c0fa8340f180e --- /dev/null +++ b/x-pack/plugins/infra/public/common/visualizations/lens/README.md @@ -0,0 +1,166 @@ + +# Lens Attributes Builder + +The Lens Attributes Builder is a utility for creating JSON objects used to render charts with Lens. It simplifies the process of configuring and building the necessary attributes for different chart types. + +## Usage + +### Creating a Metric Chart + +To create a metric chart, use the `MetricChart` class and provide the required configuration. Here's an example: + +```ts +const metricChart = new MetricChart({ + layers: new MetricLayer({ + data: { + label: 'Disk Read Throughput', + value: "counter_rate(max(system.diskio.read.count), kql='system.diskio.read.count: *')", + format: { + id: 'bytes', + params: { + decimals: 1, + }, + }, + }, + formulaAPI, + }), + dataView, +}); +``` + +### Creating an XY Chart + +To create an XY chart, use the `XYChart` class and provide the required configuration. Here's an example: + +```ts +const xyChart = new XYChart({ + layers: [new XYDataLayer({ + data: [{ + label: 'Normalized Load', + value: "average(system.load.1) / max(system.load.cores)", + format: { + id: 'percent', + params: { + decimals: 1, + }, + }, + }], + formulaAPI, + })], + dataView, +}); +``` + +### Adding Multiple Layers to an XY Chart + +An XY chart can have multiple layers. Here's an example of containing a Reference Line Layer: + +```ts +const xyChart = new XYChart({ + layers: [ + new XYDataLayer({ + data: [{ + label: 'Disk Read Throughput', + value: "average(system.load.1) / max(system.load.cores)", + format: { + id: 'percent', + params: { + decimals: 1, + }, + }, + }], + formulaAPI, + }), + new XYReferenceLineLayer({ + data: [{ + value: "1", + format: { + id: 'percent', + params: { + decimals: 1, + }, + }, + }], + }), + ], + dataView, +}); +``` + +### Adding Multiple Data Sources in the Same Layer + +In an XY chart, it's possible to define multiple data sources within the same layer. + +To configure multiple data sources in an XY data layer, simply provide an array of data to the same YXDataLayer class: + +```ts +const xyChart = new XYChart({ + layers: new YXDataLayer({ + data: [{ + label: 'RX', + value: "average(host.network.ingress.bytes) * 8 / (max(metricset.period, kql='host.network.ingress.bytes: *') / 1000)", + format: { + id: 'bits', + params: { + decimals: 1, + }, + }, + },{ + label: 'TX', + value: "(average(host.network.egresss.bytes) * 8 / (max(metricset.period, kql='host.network.egresss.bytes: *') / 1000)", + format: { + id: 'bits', + params: { + decimals: 1, + }, + }, + }], + formulaAPI, + }), + dataView, +}); +``` + +### Building Lens Chart Attributes + +The `LensAttributesBuilder` is responsible for creating the full JSON object that combines the attributes returned by the chart classes. Here's an example: + +```ts +const builder = new LensAttributesBuilder({ visualization: xyChart }); +const attributes = builder.build(); +``` + +The `attributes` object contains the final JSON representation of the chart configuration and can be used to render the chart with Lens. + +### Usage with Lens EmbeddableComponent + +To display the charts rendered with the Lens Attributes Builder, it's recommended to use the Lens `EmbeddableComponent`. The `EmbeddableComponent` abstracts some of the chart styling and other details that would be challenging to handle directly with the Lens Attributes Builder. + +```tsx +const builder = new LensAttributesBuilder({ + visualization: new MetricChart({ + layers: new MetricLayer({ + data: { + label: 'Disk Read Throughput', + value: "counter_rate(max(system.diskio.read.count), kql='system.diskio.read.count: *')", + format: { + id: 'bytes', + params: { + decimals: 1, + }, + }, + }, + formulaAPI, + }), + dataView, + }) +}); + +const lensAttributes = builder.build(); + + +``` diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/dashboards/host/kpi_grid_config.ts b/x-pack/plugins/infra/public/common/visualizations/lens/dashboards/host/kpi_grid_config.ts new file mode 100644 index 0000000000000..cc4f51c8f2d18 --- /dev/null +++ b/x-pack/plugins/infra/public/common/visualizations/lens/dashboards/host/kpi_grid_config.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { TypedLensByValueInput } from '@kbn/lens-plugin/public'; +import { i18n } from '@kbn/i18n'; +import { Layer } from '../../../../../hooks/use_lens_attributes'; +import { hostLensFormulas } from '../../../constants'; +import { FormulaConfig } from '../../../types'; +import { TOOLTIP } from './translations'; +import { MetricLayerOptions } from '../../visualization_types/layers'; + +export interface KPIChartProps + extends Pick { + layers: Layer; + toolTip: string; +} + +export const KPI_CHARTS: KPIChartProps[] = [ + { + id: 'cpuUsage', + title: i18n.translate('xpack.infra.hostsViewPage.metricTrend.cpuUsage.title', { + defaultMessage: 'CPU Usage', + }), + layers: { + data: { + ...hostLensFormulas.cpuUsage, + format: { + ...hostLensFormulas.cpuUsage.format, + params: { + decimals: 1, + }, + }, + }, + layerType: 'data', + options: { + backgroundColor: '#F1D86F', + showTrendLine: true, + }, + }, + toolTip: TOOLTIP.cpuUsage, + }, + { + id: 'normalizedLoad1m', + title: i18n.translate('xpack.infra.hostsViewPage.metricTrend.normalizedLoad1m.title', { + defaultMessage: 'CPU Usage', + }), + layers: { + data: { + ...hostLensFormulas.normalizedLoad1m, + format: { + ...hostLensFormulas.normalizedLoad1m.format, + params: { + decimals: 1, + }, + }, + }, + layerType: 'data', + options: { + backgroundColor: '#79AAD9', + showTrendLine: true, + }, + }, + toolTip: TOOLTIP.normalizedLoad1m, + }, + { + id: 'memoryUsage', + title: i18n.translate('xpack.infra.hostsViewPage.metricTrend.memoryUsage.title', { + defaultMessage: 'CPU Usage', + }), + layers: { + data: { + ...hostLensFormulas.memoryUsage, + format: { + ...hostLensFormulas.memoryUsage.format, + params: { + decimals: 1, + }, + }, + }, + layerType: 'data', + options: { + backgroundColor: '#A987D1', + showTrendLine: true, + }, + }, + toolTip: TOOLTIP.memoryUsage, + }, + { + id: 'diskSpaceUsage', + title: i18n.translate('xpack.infra.hostsViewPage.metricTrend.diskSpaceUsage.title', { + defaultMessage: 'CPU Usage', + }), + layers: { + data: { + ...hostLensFormulas.diskSpaceUsage, + format: { + ...hostLensFormulas.diskSpaceUsage.format, + params: { + decimals: 1, + }, + }, + }, + layerType: 'data', + options: { + backgroundColor: '#F5A35C', + showTrendLine: true, + }, + }, + toolTip: TOOLTIP.diskSpaceUsage, + }, +]; diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/translations.ts b/x-pack/plugins/infra/public/common/visualizations/lens/dashboards/host/translations.ts similarity index 100% rename from x-pack/plugins/infra/public/common/visualizations/lens/translations.ts rename to x-pack/plugins/infra/public/common/visualizations/lens/dashboards/host/translations.ts diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/cpu_usage.ts b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/cpu_usage.ts index f0e8813d2aef4..b3b40f585d7e0 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/cpu_usage.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/cpu_usage.ts @@ -5,32 +5,15 @@ * 2.0. */ -import type { LensChartConfig, LensLineChartConfig } from '../../../types'; -import { getFilters } from './utils'; +import type { FormulaConfig } from '../../../types'; -export const cpuLineChart: LensLineChartConfig = { - extraVisualizationState: { - yLeftExtent: { - mode: 'custom', - lowerBound: 0, - upperBound: 1, +export const cpuUsage: FormulaConfig = { + label: 'CPU Usage', + value: '(average(system.cpu.user.pct) + average(system.cpu.system.pct)) / max(system.cpu.cores)', + format: { + id: 'percent', + params: { + decimals: 0, }, }, }; - -export const cpuUsage: LensChartConfig = { - title: 'CPU Usage', - formula: { - formula: - '(average(system.cpu.user.pct) + average(system.cpu.system.pct)) / max(system.cpu.cores)', - format: { - id: 'percent', - params: { - decimals: 0, - }, - }, - }, - getFilters, - - lineChartConfig: cpuLineChart, -}; diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_read_iops.ts b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_read_iops.ts index 59879681b641c..27b288f3a119e 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_read_iops.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_read_iops.ts @@ -5,19 +5,15 @@ * 2.0. */ -import type { LensChartConfig } from '../../../types'; -import { getFilters } from './utils'; +import type { FormulaConfig } from '../../../types'; -export const diskIORead: LensChartConfig = { - title: 'Disk Read IOPS', - formula: { - formula: "counter_rate(max(system.diskio.read.count), kql='system.diskio.read.count: *')", - format: { - id: 'number', - params: { - decimals: 0, - }, +export const diskIORead: FormulaConfig = { + label: 'Disk Read IOPS', + value: "counter_rate(max(system.diskio.read.count), kql='system.diskio.read.count: *')", + format: { + id: 'number', + params: { + decimals: 0, }, }, - getFilters, }; diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_read_throughput.ts b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_read_throughput.ts index 557a6ec0249e7..946e26cec62a1 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_read_throughput.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_read_throughput.ts @@ -5,19 +5,15 @@ * 2.0. */ -import type { LensChartConfig } from '../../../types'; -import { getFilters } from './utils'; +import type { FormulaConfig } from '../../../types'; -export const diskReadThroughput: LensChartConfig = { - title: 'Disk Read Throughput', - formula: { - formula: "counter_rate(max(system.diskio.read.count), kql='system.diskio.read.count: *')", - format: { - id: 'bytes', - params: { - decimals: 1, - }, +export const diskReadThroughput: FormulaConfig = { + label: 'Disk Read Throughput', + value: "counter_rate(max(system.diskio.read.count), kql='system.diskio.read.count: *')", + format: { + id: 'bytes', + params: { + decimals: 1, }, }, - getFilters, }; diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_space_available.ts b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_space_available.ts index 77fcabf3c710f..088e28799ce03 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_space_available.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_space_available.ts @@ -5,19 +5,15 @@ * 2.0. */ -import type { LensChartConfig } from '../../../types'; -import { getFilters } from './utils'; +import type { FormulaConfig } from '../../../types'; -export const diskSpaceAvailable: LensChartConfig = { - title: 'Disk Space Available', - formula: { - formula: 'average(system.filesystem.free)', - format: { - id: 'bytes', - params: { - decimals: 0, - }, +export const diskSpaceAvailable: FormulaConfig = { + label: 'Disk Space Available', + value: 'average(system.filesystem.free)', + format: { + id: 'bytes', + params: { + decimals: 0, }, }, - getFilters, }; diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_space_usage.ts b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_space_usage.ts index 9599e65d4de9b..e4cb5851d5241 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_space_usage.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_space_usage.ts @@ -5,30 +5,15 @@ * 2.0. */ -import type { LensChartConfig, LensLineChartConfig } from '../../../types'; -import { getFilters } from './utils'; +import type { FormulaConfig } from '../../../types'; -export const diskSpaceUsageLineChart: LensLineChartConfig = { - extraVisualizationState: { - yLeftExtent: { - mode: 'custom', - lowerBound: 0, - upperBound: 1, +export const diskSpaceUsage: FormulaConfig = { + label: 'Disk Space Usage', + value: 'average(system.filesystem.used.pct)', + format: { + id: 'percent', + params: { + decimals: 0, }, }, }; - -export const diskSpaceUsage: LensChartConfig = { - title: 'Disk Space Usage', - formula: { - formula: 'average(system.filesystem.used.pct)', - format: { - id: 'percent', - params: { - decimals: 0, - }, - }, - }, - getFilters, - lineChartConfig: diskSpaceUsageLineChart, -}; diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_write_iops.ts b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_write_iops.ts index 67d697551c44a..04370c61903ce 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_write_iops.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_write_iops.ts @@ -5,19 +5,15 @@ * 2.0. */ -import type { LensChartConfig } from '../../../types'; -import { getFilters } from './utils'; +import type { FormulaConfig } from '../../../types'; -export const diskIOWrite: LensChartConfig = { - title: 'Disk Write IOPS', - formula: { - formula: "counter_rate(max(system.diskio.write.count), kql='system.diskio.write.count: *')", - format: { - id: 'number', - params: { - decimals: 0, - }, +export const diskIOWrite: FormulaConfig = { + label: 'Disk Write IOPS', + value: "counter_rate(max(system.diskio.write.count), kql='system.diskio.write.count: *')", + format: { + id: 'number', + params: { + decimals: 0, }, }, - getFilters, }; diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_write_throughput.ts b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_write_throughput.ts index 97e223036af7f..e391bce4a1151 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_write_throughput.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/disk_write_throughput.ts @@ -5,19 +5,15 @@ * 2.0. */ -import type { LensChartConfig } from '../../../types'; -import { getFilters } from './utils'; +import type { FormulaConfig } from '../../../types'; -export const diskWriteThroughput: LensChartConfig = { - title: 'Disk Write Throughput', - formula: { - formula: "counter_rate(max(system.diskio.write.count), kql='system.diskio.write.count: *')", - format: { - id: 'bytes', - params: { - decimals: 1, - }, +export const diskWriteThroughput: FormulaConfig = { + label: 'Disk Write Throughput', + value: "counter_rate(max(system.diskio.write.count), kql='system.diskio.write.count: *')", + format: { + id: 'bytes', + params: { + decimals: 1, }, }, - getFilters, }; diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/host_count.ts b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/host_count.ts index 4f0d230176368..e642a8cb629f1 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/host_count.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/host_count.ts @@ -5,19 +5,15 @@ * 2.0. */ -import type { LensChartConfig } from '../../../types'; -import { getFilters } from './utils'; +import type { FormulaConfig } from '../../../types'; -export const hostCount: LensChartConfig = { - title: 'Hosts', - formula: { - formula: 'unique_count(host.name)', - format: { - id: 'number', - params: { - decimals: 0, - }, +export const hostCount: FormulaConfig = { + label: 'Hosts', + value: 'unique_count(host.name)', + format: { + id: 'number', + params: { + decimals: 0, }, }, - getFilters, }; diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/memory_free.ts b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/memory_free.ts index 7821ef7a12ff1..4406ebd1e820c 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/memory_free.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/memory_free.ts @@ -5,19 +5,15 @@ * 2.0. */ -import type { LensChartConfig } from '../../../types'; -import { getFilters } from './utils'; +import type { FormulaConfig } from '../../../types'; -export const memoryFree: LensChartConfig = { - title: 'Memory Free', - formula: { - formula: 'max(system.memory.total) - average(system.memory.actual.used.bytes)', - format: { - id: 'bytes', - params: { - decimals: 1, - }, +export const memoryFree: FormulaConfig = { + label: 'Memory Free', + value: 'max(system.memory.total) - average(system.memory.actual.used.bytes)', + format: { + id: 'bytes', + params: { + decimals: 1, }, }, - getFilters, }; diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/memory_usage.ts b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/memory_usage.ts index bc76d88053dd9..f95198756d61e 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/memory_usage.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/memory_usage.ts @@ -5,30 +5,15 @@ * 2.0. */ -import type { LensChartConfig, LensLineChartConfig } from '../../../types'; -import { getFilters } from './utils'; +import type { FormulaConfig } from '../../../types'; -const memoryLineChart: LensLineChartConfig = { - extraVisualizationState: { - yLeftExtent: { - mode: 'custom', - lowerBound: 0, - upperBound: 1, +export const memoryUsage: FormulaConfig = { + label: 'Memory Usage', + value: 'average(system.memory.actual.used.pct)', + format: { + id: 'percent', + params: { + decimals: 0, }, }, }; - -export const memoryUsage: LensChartConfig = { - title: 'Memory Usage', - formula: { - formula: 'average(system.memory.actual.used.pct)', - format: { - id: 'percent', - params: { - decimals: 0, - }, - }, - }, - lineChartConfig: memoryLineChart, - getFilters, -}; diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/normalized_load_1m.ts b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/normalized_load_1m.ts index 5e04919740689..32031d07fb858 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/normalized_load_1m.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/normalized_load_1m.ts @@ -5,72 +5,15 @@ * 2.0. */ -import type { ReferenceBasedIndexPatternColumn } from '@kbn/lens-plugin/public/datasources/form_based/operations/definitions/column_types'; -import type { LensChartConfig, LensLineChartConfig } from '../../../types'; -import { getFilters } from './utils'; +import type { FormulaConfig } from '../../../types'; -const REFERENCE_LAYER = 'referenceLayer'; - -export const loadLineChart: LensLineChartConfig = { - extraLayers: { - [REFERENCE_LAYER]: { - linkToLayers: [], - columnOrder: ['referenceColumn'], - columns: { - referenceColumn: { - label: 'Reference', - dataType: 'number', - operationType: 'static_value', - isStaticValue: true, - isBucketed: false, - scale: 'ratio', - params: { - value: 1, - format: { - id: 'percent', - params: { - decimals: 0, - }, - }, - }, - references: [], - customLabel: true, - } as ReferenceBasedIndexPatternColumn, - }, - sampling: 1, - incompleteColumns: {}, - }, - }, - extraVisualizationState: { - layers: [ - { - layerId: REFERENCE_LAYER, - layerType: 'referenceLine', - accessors: ['referenceColumn'], - yConfig: [ - { - forAccessor: 'referenceColumn', - axisMode: 'left', - color: '#6092c0', - }, - ], - }, - ], - }, - extraReference: REFERENCE_LAYER, -}; - -export const normalizedLoad1m: LensChartConfig = { - title: 'Normalized Load', - formula: { - formula: 'average(system.load.1) / max(system.load.cores)', - format: { - id: 'percent', - params: { - decimals: 0, - }, +export const normalizedLoad1m: FormulaConfig = { + label: 'Normalized Load', + value: 'average(system.load.1) / max(system.load.cores)', + format: { + id: 'percent', + params: { + decimals: 0, }, }, - getFilters, - lineChartConfig: loadLineChart, }; diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/rx.ts b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/rx.ts index b396dffb979e6..2c5da5cb83988 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/rx.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/rx.ts @@ -5,20 +5,16 @@ * 2.0. */ -import type { LensChartConfig } from '../../../types'; -import { getFilters } from './utils'; +import type { FormulaConfig } from '../../../types'; -export const rx: LensChartConfig = { - title: 'Network Inbound (RX)', - formula: { - formula: - "average(host.network.ingress.bytes) * 8 / (max(metricset.period, kql='host.network.ingress.bytes: *') / 1000)", - format: { - id: 'bits', - params: { - decimals: 1, - }, +export const rx: FormulaConfig = { + label: 'Network Inbound (RX)', + value: + "average(host.network.ingress.bytes) * 8 / (max(metricset.period, kql='host.network.ingress.bytes: *') / 1000)", + format: { + id: 'bits', + params: { + decimals: 1, }, }, - getFilters, }; diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/tx.ts b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/tx.ts index f9f97a8ed9112..70aa43a4efaf0 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/tx.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/tx.ts @@ -5,20 +5,16 @@ * 2.0. */ -import type { LensChartConfig } from '../../../types'; -import { getFilters } from './utils'; +import type { FormulaConfig } from '../../../types'; -export const tx: LensChartConfig = { - title: 'Network Outbound (TX)', - formula: { - formula: - "average(host.network.egress.bytes) * 8 / (max(metricset.period, kql='host.network.egress.bytes: *') / 1000)", - format: { - id: 'bits', - params: { - decimals: 1, - }, +export const tx: FormulaConfig = { + label: 'Network Outbound (TX)', + value: + "average(host.network.egress.bytes) * 8 / (max(metricset.period, kql='host.network.egress.bytes: *') / 1000)", + format: { + id: 'bits', + params: { + decimals: 1, }, }, - getFilters, }; diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/utils.ts b/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/utils.ts deleted file mode 100644 index c0b16ca705b13..0000000000000 --- a/x-pack/plugins/infra/public/common/visualizations/lens/formulas/host/utils.ts +++ /dev/null @@ -1,21 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { DataViewBase } from '@kbn/es-query'; - -export const getFilters = ({ id }: Pick) => [ - { - meta: { - index: id, - }, - query: { - exists: { - field: 'host.name', - }, - }, - }, -]; diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/kpi_grid_config.ts b/x-pack/plugins/infra/public/common/visualizations/lens/kpi_grid_config.ts deleted file mode 100644 index 6849bceaa7148..0000000000000 --- a/x-pack/plugins/infra/public/common/visualizations/lens/kpi_grid_config.ts +++ /dev/null @@ -1,61 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { i18n } from '@kbn/i18n'; -import { HostsLensMetricChartFormulas } from '../types'; -import { TOOLTIP } from './translations'; - -export interface KPIChartProps { - title: string; - subtitle?: string; - trendLine?: boolean; - backgroundColor: string; - type: HostsLensMetricChartFormulas; - decimals?: number; - toolTip: string; -} - -export const KPI_CHARTS: Array> = [ - { - type: 'cpuUsage', - trendLine: true, - backgroundColor: '#F1D86F', - title: i18n.translate('xpack.infra.hostsViewPage.metricTrend.cpuUsage.title', { - defaultMessage: 'CPU Usage', - }), - toolTip: TOOLTIP.cpuUsage, - }, - { - type: 'normalizedLoad1m', - trendLine: true, - backgroundColor: '#79AAD9', - title: i18n.translate('xpack.infra.hostsViewPage.metricTrend.normalizedLoad1m.title', { - defaultMessage: 'Normalized Load', - }), - toolTip: TOOLTIP.rx, - }, - { - type: 'memoryUsage', - trendLine: true, - backgroundColor: '#A987D1', - title: i18n.translate('xpack.infra.hostsViewPage.metricTrend.memoryUsage.title', { - defaultMessage: 'Memory Usage', - }), - toolTip: i18n.translate('xpack.infra.hostsViewPage.metricTrend.memoryUsage.tooltip', { - defaultMessage: 'Main memory usage excluding page cache.', - }), - }, - { - type: 'diskSpaceUsage', - trendLine: true, - backgroundColor: '#F5A35C', - title: i18n.translate('xpack.infra.hostsViewPage.metricTrend.diskSpaceUsage.title', { - defaultMessage: 'Disk Space Usage', - }), - toolTip: TOOLTIP.tx, - }, -]; diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/lens_attributes_builder.test.ts b/x-pack/plugins/infra/public/common/visualizations/lens/lens_attributes_builder.test.ts new file mode 100644 index 0000000000000..14d79c41c3829 --- /dev/null +++ b/x-pack/plugins/infra/public/common/visualizations/lens/lens_attributes_builder.test.ts @@ -0,0 +1,359 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import 'jest-canvas-mock'; + +import type { DataView } from '@kbn/data-views-plugin/public'; +import { lensPluginMock } from '@kbn/lens-plugin/public/mocks'; +import { LensAttributesBuilder } from './lens_attributes_builder'; +import { + MetricChart, + MetricLayer, + XYChart, + XYDataLayer, + XYReferenceLinesLayer, +} from './visualization_types'; +import type { FormulaPublicApi, GenericIndexPatternColumn } from '@kbn/lens-plugin/public'; +import { ReferenceBasedIndexPatternColumn } from '@kbn/lens-plugin/public/datasources/form_based/operations/definitions/column_types'; +import type { FormulaConfig } from '../types'; + +const mockDataView = { + id: 'mock-id', + title: 'mock-title', + timeFieldName: '@timestamp', + isPersisted: () => false, + getName: () => 'mock-data-view', + toSpec: () => ({}), + fields: [], + metaFields: [], +} as unknown as jest.Mocked; + +const lensPluginMockStart = lensPluginMock.createStartContract(); + +const getDataLayer = (formula: string): GenericIndexPatternColumn => ({ + customLabel: false, + dataType: 'number', + filter: undefined, + isBucketed: false, + label: formula, + operationType: 'formula', + params: { + format: { + id: 'percent', + }, + formula, + isFormulaBroken: true, + } as any, + reducedTimeRange: undefined, + references: [], + timeScale: undefined, +}); + +const getHistogramLayer = (interval: string, includeEmptyRows?: boolean) => ({ + dataType: 'date', + isBucketed: true, + label: '@timestamp', + operationType: 'date_histogram', + params: includeEmptyRows + ? { + includeEmptyRows, + interval, + } + : { interval }, + scale: 'interval', + sourceField: '@timestamp', +}); + +const REFERENCE_LINE_LAYER: ReferenceBasedIndexPatternColumn = { + customLabel: true, + dataType: 'number', + isBucketed: false, + isStaticValue: true, + label: 'Reference', + operationType: 'static_value', + params: { + format: { + id: 'percent', + }, + value: '1', + } as any, + references: [], + scale: 'ratio', +}; + +const getFormula = (value: string): FormulaConfig => ({ + value, + format: { + id: 'percent', + }, +}); + +const AVERAGE_CPU_USER_FORMULA = 'average(system.cpu.user.pct)'; +const AVERAGE_CPU_SYSTEM_FORMULA = 'average(system.cpu.system.pct)'; + +describe('lens_attributes_builder', () => { + let formulaAPI: FormulaPublicApi; + beforeAll(async () => { + formulaAPI = (await lensPluginMockStart.stateHelperApi()).formula; + }); + + describe('MetricChart', () => { + it('should build MetricChart', async () => { + const metriChart = new MetricChart({ + layers: new MetricLayer({ + data: getFormula(AVERAGE_CPU_USER_FORMULA), + formulaAPI, + }), + + dataView: mockDataView, + }); + const builder = new LensAttributesBuilder({ visualization: metriChart }); + const { + state: { + datasourceStates: { + formBased: { layers }, + }, + visualization, + }, + } = builder.build(); + + expect(layers).toEqual({ + layer: { + columnOrder: ['metric_formula_accessor'], + columns: { + metric_formula_accessor: getDataLayer(AVERAGE_CPU_USER_FORMULA), + }, + indexPatternId: 'mock-id', + }, + }); + + expect(visualization).toEqual({ + color: undefined, + layerId: 'layer', + layerType: 'data', + metricAccessor: 'metric_formula_accessor', + showBar: false, + subtitle: undefined, + }); + }); + + it('should build MetricChart with trendline', async () => { + const metriChart = new MetricChart({ + layers: new MetricLayer({ + data: getFormula(AVERAGE_CPU_USER_FORMULA), + options: { + showTrendLine: true, + }, + formulaAPI, + }), + + dataView: mockDataView, + }); + const builder = new LensAttributesBuilder({ visualization: metriChart }); + const { + state: { + datasourceStates: { + formBased: { layers }, + }, + visualization, + }, + } = builder.build(); + + expect(layers).toEqual({ + layer: { + columnOrder: ['metric_formula_accessor'], + columns: { + metric_formula_accessor: getDataLayer(AVERAGE_CPU_USER_FORMULA), + }, + indexPatternId: 'mock-id', + }, + layer_trendline: { + columnOrder: ['x_date_histogram', 'metric_formula_accessor_trendline'], + columns: { + metric_formula_accessor_trendline: getDataLayer(AVERAGE_CPU_USER_FORMULA), + x_date_histogram: getHistogramLayer('auto', true), + }, + indexPatternId: 'mock-id', + linkToLayers: ['layer'], + sampling: 1, + }, + }); + + expect(visualization).toEqual({ + color: undefined, + layerId: 'layer', + layerType: 'data', + metricAccessor: 'metric_formula_accessor', + showBar: false, + subtitle: undefined, + trendlineLayerId: 'layer_trendline', + trendlineLayerType: 'metricTrendline', + trendlineMetricAccessor: 'metric_formula_accessor_trendline', + trendlineTimeAccessor: 'x_date_histogram', + }); + }); + }); + + describe('XYChart', () => { + it('should build XYChart', async () => { + const xyChart = new XYChart({ + layers: [ + new XYDataLayer({ + data: [getFormula(AVERAGE_CPU_USER_FORMULA)], + formulaAPI, + }), + ], + dataView: mockDataView, + }); + const builder = new LensAttributesBuilder({ visualization: xyChart }); + const { + state: { + datasourceStates: { + formBased: { layers }, + }, + visualization, + }, + } = builder.build(); + + expect(layers).toEqual({ + layer_0: { + columnOrder: ['x_date_histogram', 'formula_accessor_0_0'], + columns: { + x_date_histogram: getHistogramLayer('auto'), + formula_accessor_0_0: getDataLayer(AVERAGE_CPU_USER_FORMULA), + }, + indexPatternId: 'mock-id', + }, + }); + + expect((visualization as any).layers).toEqual([ + { + accessors: ['formula_accessor_0_0'], + layerId: 'layer_0', + layerType: 'data', + seriesType: 'line', + splitAccessor: 'aggs_breakdown', + xAccessor: 'x_date_histogram', + yConfig: [], + }, + ]); + }); + + it('should build XYChart with Reference Line layer', async () => { + const xyChart = new XYChart({ + layers: [ + new XYDataLayer({ + data: [getFormula(AVERAGE_CPU_USER_FORMULA)], + formulaAPI, + }), + new XYReferenceLinesLayer({ + data: [getFormula('1')], + }), + ], + dataView: mockDataView, + }); + const builder = new LensAttributesBuilder({ visualization: xyChart }); + const { + state: { + datasourceStates: { + formBased: { layers }, + }, + visualization, + }, + } = builder.build(); + + expect(layers).toEqual({ + layer_0: { + columnOrder: ['x_date_histogram', 'formula_accessor_0_0'], + columns: { + x_date_histogram: getHistogramLayer('auto'), + formula_accessor_0_0: getDataLayer(AVERAGE_CPU_USER_FORMULA), + }, + indexPatternId: 'mock-id', + }, + layer_1_reference: { + columnOrder: ['formula_accessor_1_0_reference_column'], + columns: { + formula_accessor_1_0_reference_column: REFERENCE_LINE_LAYER, + }, + incompleteColumns: {}, + linkToLayers: [], + sampling: 1, + }, + }); + + expect((visualization as any).layers).toEqual([ + { + accessors: ['formula_accessor_0_0'], + layerId: 'layer_0', + layerType: 'data', + seriesType: 'line', + splitAccessor: 'aggs_breakdown', + xAccessor: 'x_date_histogram', + yConfig: [], + }, + { + accessors: ['formula_accessor_1_0_reference_column'], + layerId: 'layer_1_reference', + layerType: 'referenceLine', + yConfig: [ + { + axisMode: 'left', + color: undefined, + forAccessor: 'formula_accessor_1_0_reference_column', + }, + ], + }, + ]); + }); + + it('should build XYChart with multiple data columns', async () => { + const xyChart = new XYChart({ + layers: [ + new XYDataLayer({ + data: [getFormula(AVERAGE_CPU_USER_FORMULA), getFormula(AVERAGE_CPU_SYSTEM_FORMULA)], + formulaAPI, + }), + ], + dataView: mockDataView, + }); + const builder = new LensAttributesBuilder({ visualization: xyChart }); + const { + state: { + datasourceStates: { + formBased: { layers }, + }, + visualization, + }, + } = builder.build(); + + expect(layers).toEqual({ + layer_0: { + columnOrder: ['x_date_histogram', 'formula_accessor_0_0', 'formula_accessor_0_1'], + columns: { + x_date_histogram: getHistogramLayer('auto'), + formula_accessor_0_0: getDataLayer(AVERAGE_CPU_USER_FORMULA), + formula_accessor_0_1: getDataLayer(AVERAGE_CPU_SYSTEM_FORMULA), + }, + indexPatternId: 'mock-id', + }, + }); + + expect((visualization as any).layers).toEqual([ + { + accessors: ['formula_accessor_0_0', 'formula_accessor_0_1'], + layerId: 'layer_0', + layerType: 'data', + seriesType: 'line', + splitAccessor: 'aggs_breakdown', + xAccessor: 'x_date_histogram', + yConfig: [], + }, + ]); + }); + }); +}); diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/lens_attributes_builder.ts b/x-pack/plugins/infra/public/common/visualizations/lens/lens_attributes_builder.ts index 90ff3c5cfa268..d873f074ee346 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/lens_attributes_builder.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/lens_attributes_builder.ts @@ -6,39 +6,38 @@ */ import type { LensAttributes, - TVisualization, - VisualizationAttributes, + LensVisualizationState, + Chart, VisualizationAttributesBuilder, } from '../types'; import { DataViewCache } from './data_view_cache'; import { getAdhocDataView } from './utils'; -export class LensAttributesBuilder> +export class LensAttributesBuilder> implements VisualizationAttributesBuilder { private dataViewCache: DataViewCache; - constructor(private visualization: T) { + constructor(private state: { visualization: T }) { this.dataViewCache = DataViewCache.getInstance(); } build(): LensAttributes { + const { visualization } = this.state; return { - title: this.visualization.getTitle(), - visualizationType: this.visualization.getVisualizationType(), - references: this.visualization.getReferences(), + title: visualization.getTitle(), + visualizationType: visualization.getVisualizationType(), + references: visualization.getReferences(), state: { datasourceStates: { formBased: { - layers: this.visualization.getLayers(), + layers: visualization.getLayers(), }, }, - internalReferences: this.visualization.getReferences(), - filters: this.visualization.getFilters(), + internalReferences: visualization.getReferences(), + filters: [], query: { language: 'kuery', query: '' }, - visualization: this.visualization.getVisualizationState(), - adHocDataViews: getAdhocDataView( - this.dataViewCache.getSpec(this.visualization.getDataView()) - ), + visualization: visualization.getVisualizationState(), + adHocDataViews: getAdhocDataView(this.dataViewCache.getSpec(visualization.getDataView())), }, }; } diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/lens_wrapper.tsx b/x-pack/plugins/infra/public/common/visualizations/lens/lens_wrapper.tsx index 08948d788fbe3..7925966b75429 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/lens_wrapper.tsx +++ b/x-pack/plugins/infra/public/common/visualizations/lens/lens_wrapper.tsx @@ -4,30 +4,28 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import React, { useEffect, useState, useRef, useCallback, CSSProperties } from 'react'; +import React, { useEffect, useState, useRef, useCallback } from 'react'; import { Action } from '@kbn/ui-actions-plugin/public'; import { ViewMode } from '@kbn/embeddable-plugin/public'; -import { BrushTriggerEvent } from '@kbn/charts-plugin/public'; -import { Filter, Query, TimeRange } from '@kbn/es-query'; -import { useIntersectedOnce } from '../../../hooks/use_intersection_once'; +import { TimeRange } from '@kbn/es-query'; +import { TypedLensByValueInput } from '@kbn/lens-plugin/public'; import { useKibanaContextForPlugin } from '../../../hooks/use_kibana'; +import { useIntersectedOnce } from '../../../hooks/use_intersection_once'; import { ChartLoader } from './chart_loader'; import type { LensAttributes } from '../types'; -export interface LensWrapperProps { - id: string; +export interface LensWrapperProps + extends Pick< + TypedLensByValueInput, + 'id' | 'overrides' | 'query' | 'filters' | 'style' | 'onBrushEnd' | 'onLoad' | 'disableTriggers' + > { attributes: LensAttributes | null; dateRange: TimeRange; - query?: Query; - filters: Filter[]; extraActions: Action[]; lastReloadRequestTime?: number; - style?: CSSProperties; loading?: boolean; hasTitle?: boolean; - onBrushEnd?: (data: BrushTriggerEvent['data']) => void; - onLoad?: () => void; } export const LensWrapper = React.memo( @@ -41,8 +39,10 @@ export const LensWrapper = React.memo( style, onBrushEnd, lastReloadRequestTime, + overrides, loading = false, hasTitle = false, + disableTriggers = false, }: LensWrapperProps) => { const intersectionRef = useRef(null); const [loadedOnce, setLoadedOnce] = useState(false); @@ -103,12 +103,14 @@ export const LensWrapper = React.memo( )} diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/utils.ts b/x-pack/plugins/infra/public/common/visualizations/lens/utils.ts index 8bbfd6da833fc..e97e87380cd0a 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/utils.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/utils.ts @@ -12,8 +12,9 @@ import { import type { DataView, DataViewSpec } from '@kbn/data-views-plugin/public'; import type { SavedObjectReference } from '@kbn/core-saved-objects-common'; -export const DEFAULT_LAYER_ID = 'layer1'; +export const DEFAULT_LAYER_ID = 'layer'; export const DEFAULT_AD_HOC_DATA_VIEW_ID = 'infra_lens_ad_hoc_default'; + const DEFAULT_BREAKDOWN_SIZE = 10; export const getHistogramColumn = ({ @@ -37,7 +38,7 @@ export const getHistogramColumn = ({ }; }; -export const getBreakdownColumn = ({ +export const getTopValuesColumn = ({ columnName, overrides, }: { diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/visualization_types/index.ts b/x-pack/plugins/infra/public/common/visualizations/lens/visualization_types/index.ts index 4abfeb3a60c45..b7112840436de 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/visualization_types/index.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/visualization_types/index.ts @@ -5,5 +5,7 @@ * 2.0. */ -export { LineChart } from './line_chart'; +export { XYChart } from './xy_chart'; export { MetricChart } from './metric_chart'; + +export * from './layers'; diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/visualization_types/layers/column/formula.ts b/x-pack/plugins/infra/public/common/visualizations/lens/visualization_types/layers/column/formula.ts new file mode 100644 index 0000000000000..b1e30ce0bd225 --- /dev/null +++ b/x-pack/plugins/infra/public/common/visualizations/lens/visualization_types/layers/column/formula.ts @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { FormulaPublicApi, PersistedIndexPatternLayer } from '@kbn/lens-plugin/public'; +import type { DataView } from '@kbn/data-views-plugin/public'; +import type { FormulaConfig, ChartColumn } from '../../../../types'; + +export class FormulaColumn implements ChartColumn { + constructor(private formulaConfig: FormulaConfig, private formulaAPI: FormulaPublicApi) {} + + getFormulaConfig(): FormulaConfig { + return this.formulaConfig; + } + + getData( + id: string, + baseLayer: PersistedIndexPatternLayer, + dataView: DataView + ): PersistedIndexPatternLayer { + const { value, ...rest } = this.getFormulaConfig(); + const formulaLayer = this.formulaAPI.insertOrReplaceFormulaColumn( + id, + { formula: value, ...rest }, + baseLayer, + dataView + ); + + if (!formulaLayer) { + throw new Error('Error generating the data layer for the chart'); + } + + return formulaLayer; + } +} diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/visualization_types/layers/column/reference_line.ts b/x-pack/plugins/infra/public/common/visualizations/lens/visualization_types/layers/column/reference_line.ts new file mode 100644 index 0000000000000..d9f9c5f270997 --- /dev/null +++ b/x-pack/plugins/infra/public/common/visualizations/lens/visualization_types/layers/column/reference_line.ts @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { PersistedIndexPatternLayer } from '@kbn/lens-plugin/public'; +import type { ReferenceBasedIndexPatternColumn } from '@kbn/lens-plugin/public/datasources/form_based/operations/definitions/column_types'; +import type { FormulaConfig, ChartColumn } from '../../../../types'; + +export class ReferenceLineColumn implements ChartColumn { + constructor(private formulaConfig: FormulaConfig) {} + + getFormulaConfig(): FormulaConfig { + return this.formulaConfig; + } + + getData(id: string, baseLayer: PersistedIndexPatternLayer): PersistedIndexPatternLayer { + const { label, ...params } = this.getFormulaConfig(); + return { + linkToLayers: [], + columnOrder: [...baseLayer.columnOrder, id], + columns: { + [id]: { + label: label ?? 'Reference', + dataType: 'number', + operationType: 'static_value', + isStaticValue: true, + isBucketed: false, + scale: 'ratio', + params, + references: [], + customLabel: true, + } as ReferenceBasedIndexPatternColumn, + }, + sampling: 1, + incompleteColumns: {}, + }; + } +} diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/visualization_types/layers/index.ts b/x-pack/plugins/infra/public/common/visualizations/lens/visualization_types/layers/index.ts new file mode 100644 index 0000000000000..fb8300573b79a --- /dev/null +++ b/x-pack/plugins/infra/public/common/visualizations/lens/visualization_types/layers/index.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { MetricLayer, type MetricLayerOptions } from './metric_layer'; +export { XYDataLayer, type XYLayerOptions } from './xy_data_layer'; +export { XYReferenceLinesLayer } from './xy_reference_lines_layer'; + +export { FormulaColumn as FormulaDataColumn } from './column/formula'; +export { ReferenceLineColumn } from './column/reference_line'; diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/visualization_types/layers/metric_layer.ts b/x-pack/plugins/infra/public/common/visualizations/lens/visualization_types/layers/metric_layer.ts new file mode 100644 index 0000000000000..25d05abd0f9c5 --- /dev/null +++ b/x-pack/plugins/infra/public/common/visualizations/lens/visualization_types/layers/metric_layer.ts @@ -0,0 +1,112 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { SavedObjectReference } from '@kbn/core-saved-objects-common'; +import type { DataView } from '@kbn/data-views-plugin/common'; +import type { + FormulaPublicApi, + FormBasedPersistedState, + MetricVisualizationState, + PersistedIndexPatternLayer, +} from '@kbn/lens-plugin/public'; +import type { ChartColumn, ChartLayer, FormulaConfig } from '../../../types'; +import { getDefaultReferences, getHistogramColumn } from '../../utils'; +import { FormulaColumn } from './column/formula'; + +const HISTOGRAM_COLUMN_NAME = 'x_date_histogram'; + +export interface MetricLayerOptions { + backgroundColor?: string; + showTitle?: boolean; + showTrendLine?: boolean; + subtitle?: string; +} + +interface MetricLayerConfig { + data: FormulaConfig; + options?: MetricLayerOptions; + formulaAPI: FormulaPublicApi; +} + +export class MetricLayer implements ChartLayer { + private column: ChartColumn; + constructor(private layerConfig: MetricLayerConfig) { + this.column = new FormulaColumn(layerConfig.data, layerConfig.formulaAPI); + } + + getLayer( + layerId: string, + accessorId: string, + dataView: DataView + ): FormBasedPersistedState['layers'] { + const baseLayer: PersistedIndexPatternLayer = { + columnOrder: [HISTOGRAM_COLUMN_NAME], + columns: getHistogramColumn({ + columnName: HISTOGRAM_COLUMN_NAME, + overrides: { + sourceField: dataView.timeFieldName, + params: { + interval: 'auto', + includeEmptyRows: true, + }, + }, + }), + sampling: 1, + }; + + return { + [layerId]: { + ...this.column.getData( + accessorId, + { + columnOrder: [], + columns: {}, + }, + dataView + ), + }, + ...(this.layerConfig.options?.showTrendLine + ? { + [`${layerId}_trendline`]: { + linkToLayers: [layerId], + ...this.column.getData(`${accessorId}_trendline`, baseLayer, dataView), + }, + } + : {}), + }; + } + getReference(layerId: string, dataView: DataView): SavedObjectReference[] { + return [ + ...getDefaultReferences(dataView, layerId), + ...getDefaultReferences(dataView, `${layerId}_trendline`), + ]; + } + + getLayerConfig(layerId: string, accessorId: string): MetricVisualizationState { + const { subtitle, backgroundColor, showTrendLine } = this.layerConfig.options ?? {}; + + return { + layerId, + layerType: 'data', + metricAccessor: accessorId, + color: backgroundColor, + subtitle, + showBar: false, + ...(showTrendLine + ? { + trendlineLayerId: `${layerId}_trendline`, + trendlineLayerType: 'metricTrendline', + trendlineMetricAccessor: `${accessorId}_trendline`, + trendlineTimeAccessor: HISTOGRAM_COLUMN_NAME, + } + : {}), + }; + } + getName(): string | undefined { + return this.column.getFormulaConfig().label; + } +} diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/visualization_types/layers/xy_data_layer.ts b/x-pack/plugins/infra/public/common/visualizations/lens/visualization_types/layers/xy_data_layer.ts new file mode 100644 index 0000000000000..b6a8428ee0754 --- /dev/null +++ b/x-pack/plugins/infra/public/common/visualizations/lens/visualization_types/layers/xy_data_layer.ts @@ -0,0 +1,106 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { SavedObjectReference } from '@kbn/core-saved-objects-common'; +import type { DataView } from '@kbn/data-views-plugin/common'; +import type { + FormulaPublicApi, + FormBasedPersistedState, + PersistedIndexPatternLayer, + XYDataLayerConfig, +} from '@kbn/lens-plugin/public'; +import type { ChartColumn, ChartLayer, FormulaConfig } from '../../../types'; +import { getDefaultReferences, getHistogramColumn, getTopValuesColumn } from '../../utils'; +import { FormulaColumn } from './column/formula'; + +const BREAKDOWN_COLUMN_NAME = 'aggs_breakdown'; +const HISTOGRAM_COLUMN_NAME = 'x_date_histogram'; + +export interface XYLayerOptions { + breakdown?: { + size: number; + sourceField: string; + }; +} + +interface XYLayerConfig { + data: FormulaConfig[]; + options?: XYLayerOptions; + formulaAPI: FormulaPublicApi; +} + +export class XYDataLayer implements ChartLayer { + private column: ChartColumn[]; + constructor(private layerConfig: XYLayerConfig) { + this.column = layerConfig.data.map((p) => new FormulaColumn(p, layerConfig.formulaAPI)); + } + + getName(): string | undefined { + return this.column[0].getFormulaConfig().label; + } + + getBaseColumnColumn(dataView: DataView, options?: XYLayerOptions) { + return { + ...getHistogramColumn({ + columnName: HISTOGRAM_COLUMN_NAME, + overrides: { + sourceField: dataView.timeFieldName, + }, + }), + ...(options?.breakdown + ? { + ...getTopValuesColumn({ + columnName: BREAKDOWN_COLUMN_NAME, + overrides: { + sourceField: options?.breakdown.sourceField, + breakdownSize: options?.breakdown.size, + }, + }), + } + : {}), + }; + } + + getLayer( + layerId: string, + accessorId: string, + dataView: DataView + ): FormBasedPersistedState['layers'] { + const baseLayer: PersistedIndexPatternLayer = { + columnOrder: [BREAKDOWN_COLUMN_NAME, HISTOGRAM_COLUMN_NAME], + columns: { + ...this.getBaseColumnColumn(dataView, this.layerConfig.options), + }, + }; + + return { + [layerId]: this.column.reduce( + (acc, curr, index) => ({ + ...acc, + ...curr.getData(`${accessorId}_${index}`, acc, dataView), + }), + baseLayer + ), + }; + } + + getReference(layerId: string, dataView: DataView): SavedObjectReference[] { + return getDefaultReferences(dataView, layerId); + } + + getLayerConfig(layerId: string, accessorId: string): XYDataLayerConfig { + return { + layerId, + seriesType: 'line', + accessors: this.column.map((_, index) => `${accessorId}_${index}`), + yConfig: [], + layerType: 'data', + xAccessor: HISTOGRAM_COLUMN_NAME, + splitAccessor: BREAKDOWN_COLUMN_NAME, + }; + } +} diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/visualization_types/layers/xy_reference_lines_layer.ts b/x-pack/plugins/infra/public/common/visualizations/lens/visualization_types/layers/xy_reference_lines_layer.ts new file mode 100644 index 0000000000000..6508dcbc2cf49 --- /dev/null +++ b/x-pack/plugins/infra/public/common/visualizations/lens/visualization_types/layers/xy_reference_lines_layer.ts @@ -0,0 +1,65 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { SavedObjectReference } from '@kbn/core-saved-objects-common'; +import type { DataView } from '@kbn/data-views-plugin/common'; +import type { + FormBasedPersistedState, + PersistedIndexPatternLayer, + XYReferenceLineLayerConfig, +} from '@kbn/lens-plugin/public'; +import type { ChartColumn, ChartLayer, FormulaConfig } from '../../../types'; +import { getDefaultReferences } from '../../utils'; +import { ReferenceLineColumn } from './column/reference_line'; + +interface XYReferenceLinesLayerConfig { + data: FormulaConfig[]; +} + +export class XYReferenceLinesLayer implements ChartLayer { + private column: ChartColumn[]; + constructor(layerConfig: XYReferenceLinesLayerConfig) { + this.column = layerConfig.data.map((p) => new ReferenceLineColumn(p)); + } + + getName(): string | undefined { + return this.column[0].getFormulaConfig().label; + } + + getLayer( + layerId: string, + accessorId: string, + dataView: DataView + ): FormBasedPersistedState['layers'] { + const baseLayer = { columnOrder: [], columns: {} } as PersistedIndexPatternLayer; + return { + [`${layerId}_reference`]: this.column.reduce((acc, curr, index) => { + return { + ...acc, + ...curr.getData(`${accessorId}_${index}_reference_column`, acc, dataView), + }; + }, baseLayer), + }; + } + + getReference(layerId: string, dataView: DataView): SavedObjectReference[] { + return getDefaultReferences(dataView, `${layerId}_reference`); + } + + getLayerConfig(layerId: string, accessorId: string): XYReferenceLineLayerConfig { + return { + layerId: `${layerId}_reference`, + layerType: 'referenceLine', + accessors: this.column.map((_, index) => `${accessorId}_${index}_reference_column`), + yConfig: this.column.map((layer, index) => ({ + color: layer.getFormulaConfig().color, + forAccessor: `${accessorId}_${index}_reference_column`, + axisMode: 'left', + })), + }; + } +} diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/visualization_types/line_chart.ts b/x-pack/plugins/infra/public/common/visualizations/lens/visualization_types/line_chart.ts deleted file mode 100644 index bf1f245dd0447..0000000000000 --- a/x-pack/plugins/infra/public/common/visualizations/lens/visualization_types/line_chart.ts +++ /dev/null @@ -1,153 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import type { - FormBasedPersistedState, - FormulaPublicApi, - PersistedIndexPatternLayer, - XYState, -} from '@kbn/lens-plugin/public'; -import type { SavedObjectReference } from '@kbn/core-saved-objects-common'; -import type { DataView } from '@kbn/data-views-plugin/public'; -import { Filter } from '@kbn/es-query'; -import { - DEFAULT_LAYER_ID, - getBreakdownColumn, - getDefaultReferences, - getHistogramColumn, -} from '../utils'; -import type { LensChartConfig, VisualizationAttributes, LineChartOptions } from '../../types'; - -const BREAKDOWN_COLUMN_NAME = 'hosts_aggs_breakdown'; -const HISTOGRAM_COLUMN_NAME = 'x_date_histogram'; -const ACCESSOR = 'formula_accessor'; - -export class LineChart implements VisualizationAttributes { - constructor( - private chartConfig: LensChartConfig, - private dataView: DataView, - private formulaAPI: FormulaPublicApi, - private options?: LineChartOptions - ) {} - - getVisualizationType(): string { - return 'lnsXY'; - } - - getLayers(): FormBasedPersistedState['layers'] { - const baseLayer: PersistedIndexPatternLayer = { - columnOrder: [BREAKDOWN_COLUMN_NAME, HISTOGRAM_COLUMN_NAME], - columns: { - ...getBreakdownColumn({ - columnName: BREAKDOWN_COLUMN_NAME, - overrides: { - sourceField: 'host.name', - breakdownSize: this.options?.breakdownSize, - }, - }), - ...getHistogramColumn({ - columnName: HISTOGRAM_COLUMN_NAME, - overrides: { - sourceField: this.dataView.timeFieldName, - }, - }), - }, - }; - - const dataLayer = this.formulaAPI.insertOrReplaceFormulaColumn( - ACCESSOR, - this.chartConfig.formula, - baseLayer, - this.dataView - ); - - if (!dataLayer) { - throw new Error('Error generating the data layer for the chart'); - } - - return { [DEFAULT_LAYER_ID]: dataLayer, ...this.chartConfig.lineChartConfig?.extraLayers }; - } - - getVisualizationState(): XYState { - const extraVisualizationState = this.chartConfig.lineChartConfig?.extraVisualizationState; - - return getXYVisualizationState({ - ...extraVisualizationState, - layers: [ - { - layerId: DEFAULT_LAYER_ID, - seriesType: 'line', - accessors: [ACCESSOR], - yConfig: [], - layerType: 'data', - xAccessor: HISTOGRAM_COLUMN_NAME, - splitAccessor: BREAKDOWN_COLUMN_NAME, - }, - ...(extraVisualizationState?.layers ? extraVisualizationState?.layers : []), - ], - }); - } - - getReferences(): SavedObjectReference[] { - const extraReference = this.chartConfig.lineChartConfig?.extraReference; - return [ - ...getDefaultReferences(this.dataView, DEFAULT_LAYER_ID), - ...(extraReference ? getDefaultReferences(this.dataView, extraReference) : []), - ]; - } - - getDataView(): DataView { - return this.dataView; - } - - getTitle(): string { - return this.options?.title ?? this.chartConfig.title ?? ''; - } - - getFilters(): Filter[] { - return this.chartConfig.getFilters({ id: this.dataView.id ?? DEFAULT_LAYER_ID }); - } -} - -export const getXYVisualizationState = ( - custom: Omit, 'layers'> & { layers: XYState['layers'] } -): XYState => ({ - legend: { - isVisible: false, - position: 'right', - showSingleSeries: false, - }, - valueLabels: 'show', - fittingFunction: 'Zero', - curveType: 'LINEAR', - yLeftScale: 'linear', - axisTitlesVisibilitySettings: { - x: false, - yLeft: false, - yRight: true, - }, - tickLabelsVisibilitySettings: { - x: true, - yLeft: true, - yRight: true, - }, - labelsOrientation: { - x: 0, - yLeft: 0, - yRight: 0, - }, - gridlinesVisibilitySettings: { - x: true, - yLeft: true, - yRight: true, - }, - preferredSeriesType: 'line', - valuesInLegend: false, - emphasizeFitting: true, - hideEndzones: true, - ...custom, -}); diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/visualization_types/metric_chart.ts b/x-pack/plugins/infra/public/common/visualizations/lens/visualization_types/metric_chart.ts index 67b944992e566..ecdb8fbb50480 100644 --- a/x-pack/plugins/infra/public/common/visualizations/lens/visualization_types/metric_chart.ts +++ b/x-pack/plugins/infra/public/common/visualizations/lens/visualization_types/metric_chart.ts @@ -5,152 +5,39 @@ * 2.0. */ -import { - FormBasedPersistedState, - FormulaPublicApi, - MetricVisualizationState, - PersistedIndexPatternLayer, -} from '@kbn/lens-plugin/public'; +import type { FormBasedPersistedState, MetricVisualizationState } from '@kbn/lens-plugin/public'; import type { SavedObjectReference } from '@kbn/core-saved-objects-common'; import type { DataView } from '@kbn/data-views-plugin/public'; -import type { Filter } from '@kbn/es-query'; -import { DEFAULT_LAYER_ID, getDefaultReferences, getHistogramColumn } from '../utils'; +import { DEFAULT_LAYER_ID } from '../utils'; -import type { - VisualizationAttributes, - LensChartConfig, - MetricChartOptions, - Formula, -} from '../../types'; +import type { Chart, ChartConfig, ChartLayer } from '../../types'; -const HISTOGRAM_COLUMN_NAME = 'x_date_histogram'; -const TRENDLINE_LAYER_ID = 'trendline_layer'; -const TRENDLINE_ACCESSOR = 'metric_trendline_formula_accessor'; const ACCESSOR = 'metric_formula_accessor'; -export class MetricChart implements VisualizationAttributes { - constructor( - private chartConfig: LensChartConfig, - private dataView: DataView, - private formulaAPI: FormulaPublicApi, - private options?: MetricChartOptions - ) {} +export class MetricChart implements Chart { + constructor(private chartConfig: ChartConfig>) {} getVisualizationType(): string { return 'lnsMetric'; } - getTrendLineLayer(baseLayer: PersistedIndexPatternLayer): FormBasedPersistedState['layers'] { - const trendLineLayer = this.formulaAPI.insertOrReplaceFormulaColumn( - TRENDLINE_ACCESSOR, - this.getFormulaWithOverride(), - baseLayer, - this.dataView - ); - - if (!trendLineLayer) { - throw new Error('Error generating the data layer for the chart'); - } - - return { - [TRENDLINE_LAYER_ID]: { - linkToLayers: [DEFAULT_LAYER_ID], - ...trendLineLayer, - }, - }; - } - - getFormulaWithOverride(): Formula { - const { formula } = this.chartConfig; - const { decimals = formula.format?.params?.decimals, title = this.chartConfig.title } = - this.options ?? {}; - return { - ...this.chartConfig.formula, - ...(formula.format && decimals - ? { - format: { - ...formula.format, - params: { - decimals, - }, - }, - } - : {}), - label: title, - }; - } - getLayers(): FormBasedPersistedState['layers'] { - const { showTrendLine = true } = this.options ?? {}; - const baseLayer: PersistedIndexPatternLayer = { - columnOrder: [HISTOGRAM_COLUMN_NAME], - columns: getHistogramColumn({ - columnName: HISTOGRAM_COLUMN_NAME, - overrides: { - sourceField: this.dataView.timeFieldName, - params: { - interval: 'auto', - includeEmptyRows: true, - }, - }, - }), - sampling: 1, - }; - - const baseLayerDetails = this.formulaAPI.insertOrReplaceFormulaColumn( - ACCESSOR, - this.getFormulaWithOverride(), - { columnOrder: [], columns: {} }, - this.dataView - ); - - if (!baseLayerDetails) { - throw new Error('Error generating the data layer for the chart'); - } - - return { - [DEFAULT_LAYER_ID]: baseLayerDetails, - ...(showTrendLine ? this.getTrendLineLayer(baseLayer) : {}), - }; + return this.chartConfig.layers.getLayer(DEFAULT_LAYER_ID, ACCESSOR, this.chartConfig.dataView); } getVisualizationState(): MetricVisualizationState { - const { subtitle, backgroundColor, showTrendLine = true } = this.options ?? {}; - return { - layerId: DEFAULT_LAYER_ID, - layerType: 'data', - metricAccessor: ACCESSOR, - color: backgroundColor, - subtitle, - showBar: false, - ...(showTrendLine - ? { - trendlineLayerId: TRENDLINE_LAYER_ID, - trendlineLayerType: 'metricTrendline', - trendlineMetricAccessor: TRENDLINE_ACCESSOR, - trendlineTimeAccessor: HISTOGRAM_COLUMN_NAME, - } - : {}), - }; + return this.chartConfig.layers.getLayerConfig(DEFAULT_LAYER_ID, ACCESSOR); } getReferences(): SavedObjectReference[] { - const { showTrendLine = true } = this.options ?? {}; - return [ - ...getDefaultReferences(this.dataView, DEFAULT_LAYER_ID), - ...(showTrendLine ? getDefaultReferences(this.dataView, TRENDLINE_LAYER_ID) : []), - ]; + return this.chartConfig.layers.getReference(DEFAULT_LAYER_ID, this.chartConfig.dataView); } getDataView(): DataView { - return this.dataView; + return this.chartConfig.dataView; } getTitle(): string { - return this.options?.showTitle ? this.options?.title ?? this.chartConfig.title : ''; - } - - getFilters(): Filter[] { - return this.chartConfig.getFilters({ id: this.dataView.id ?? DEFAULT_LAYER_ID }); + return this.chartConfig.title ?? ''; } } diff --git a/x-pack/plugins/infra/public/common/visualizations/lens/visualization_types/xy_chart.ts b/x-pack/plugins/infra/public/common/visualizations/lens/visualization_types/xy_chart.ts new file mode 100644 index 0000000000000..2794a86b3499b --- /dev/null +++ b/x-pack/plugins/infra/public/common/visualizations/lens/visualization_types/xy_chart.ts @@ -0,0 +1,99 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { FormBasedPersistedState, XYLayerConfig, XYState } from '@kbn/lens-plugin/public'; +import type { DataView } from '@kbn/data-views-plugin/public'; +import type { SavedObjectReference } from '@kbn/core-saved-objects-common'; +import { DEFAULT_LAYER_ID } from '../utils'; +import type { Chart, ChartConfig, ChartLayer } from '../../types'; + +const ACCESSOR = 'formula_accessor'; + +export class XYChart implements Chart { + constructor(private chartConfig: ChartConfig>>) {} + + getVisualizationType(): string { + return 'lnsXY'; + } + + getLayers(): FormBasedPersistedState['layers'] { + return this.chartConfig.layers.reduce((acc, curr, index) => { + const layerId = `${DEFAULT_LAYER_ID}_${index}`; + const accessorId = `${ACCESSOR}_${index}`; + return { + ...acc, + ...curr.getLayer(layerId, accessorId, this.chartConfig.dataView), + }; + }, {}); + } + + getVisualizationState(): XYState { + return getXYVisualizationState({ + layers: [ + ...this.chartConfig.layers.map((layerItem, index) => { + const layerId = `${DEFAULT_LAYER_ID}_${index}`; + const accessorId = `${ACCESSOR}_${index}`; + return layerItem.getLayerConfig(layerId, accessorId); + }), + ], + }); + } + + getReferences(): SavedObjectReference[] { + return this.chartConfig.layers.flatMap((p, index) => { + const layerId = `${DEFAULT_LAYER_ID}_${index}`; + return p.getReference(layerId, this.chartConfig.dataView); + }); + } + + getDataView(): DataView { + return this.chartConfig.dataView; + } + + getTitle(): string { + return this.chartConfig.title ?? this.chartConfig.layers[0].getName() ?? ''; + } +} + +export const getXYVisualizationState = ( + custom: Omit, 'layers'> & { layers: XYState['layers'] } +): XYState => ({ + legend: { + isVisible: false, + position: 'right', + showSingleSeries: false, + }, + valueLabels: 'show', + fittingFunction: 'Zero', + curveType: 'LINEAR', + yLeftScale: 'linear', + axisTitlesVisibilitySettings: { + x: false, + yLeft: false, + yRight: true, + }, + tickLabelsVisibilitySettings: { + x: true, + yLeft: true, + yRight: true, + }, + labelsOrientation: { + x: 0, + yLeft: 0, + yRight: 0, + }, + gridlinesVisibilitySettings: { + x: true, + yLeft: true, + yRight: true, + }, + preferredSeriesType: 'line', + valuesInLegend: false, + emphasizeFitting: true, + hideEndzones: true, + ...custom, +}); diff --git a/x-pack/plugins/infra/public/common/visualizations/types.ts b/x-pack/plugins/infra/public/common/visualizations/types.ts index 969016f0b1bcf..b3d2a3815ac6d 100644 --- a/x-pack/plugins/infra/public/common/visualizations/types.ts +++ b/x-pack/plugins/infra/public/common/visualizations/types.ts @@ -7,62 +7,75 @@ import type { SavedObjectReference } from '@kbn/core-saved-objects-common'; import type { DataView } from '@kbn/data-views-plugin/common'; -import { DataViewBase, Filter } from '@kbn/es-query'; -import { +import type { FormBasedPersistedState, - FormulaPublicApi, MetricVisualizationState, + PersistedIndexPatternLayer, TypedLensByValueInput, XYState, + XYDataLayerConfig, + FormulaPublicApi, } from '@kbn/lens-plugin/public'; -import { hostLensFormulas, visualizationTypes } from './constants'; - +import { hostLensFormulas } from './constants'; export type LensAttributes = TypedLensByValueInput['attributes']; -export interface LensOptions { - title: string; -} -export interface LineChartOptions extends LensOptions { - breakdownSize?: number; -} -export interface MetricChartOptions extends LensOptions { - subtitle?: string; - showTitle?: boolean; - showTrendLine?: boolean; - backgroundColor?: string; - decimals?: number; +// Attributes +export type LensVisualizationState = XYState | MetricVisualizationState; + +export interface VisualizationAttributesBuilder { + build(): LensAttributes; } -export interface LensLineChartConfig { - extraVisualizationState?: Partial & { layers: XYState['layers'] }>; - extraLayers?: FormBasedPersistedState['layers']; - extraReference?: string; +// Column +export interface ChartColumn { + getData( + id: string, + baseLayer: PersistedIndexPatternLayer, + dataView: DataView + ): PersistedIndexPatternLayer; + getFormulaConfig(): FormulaConfig; } -export interface LensChartConfig { - title: string; - formula: Formula; - lineChartConfig?: LensLineChartConfig; - getFilters: ({ id }: Pick) => Filter[]; + +// Layer +export type LensLayerConfig = XYDataLayerConfig | MetricVisualizationState; + +export interface ChartLayer { + getName(): string | undefined; + getLayer( + layerId: string, + accessorId: string, + dataView: DataView + ): FormBasedPersistedState['layers']; + getReference(layerId: string, dataView: DataView): SavedObjectReference[]; + getLayerConfig(layerId: string, acessorId: string): TLayerConfig; } -export type TVisualization = XYState | MetricVisualizationState; -export interface VisualizationAttributes { +// Chart +export interface Chart { getTitle(): string; getVisualizationType(): string; getLayers(): FormBasedPersistedState['layers']; - getVisualizationState(): T; + getVisualizationState(): TVisualizationState; getReferences(): SavedObjectReference[]; - getFilters(): Filter[]; getDataView(): DataView; } - -export interface VisualizationAttributesBuilder { - build(): LensAttributes; +export interface ChartConfig< + TLayer extends ChartLayer | Array> +> { + dataView: DataView; + layers: TLayer; + title?: string; } -export type Formula = Parameters[1]; +// Formula +type LensFormula = Parameters[1]; +export interface FormulaConfig { + label?: string; + color?: string; + format: NonNullable; + value: string; +} -export type VisualizationTypes = keyof typeof visualizationTypes; export type HostsLensFormulas = keyof typeof hostLensFormulas; export type HostsLensMetricChartFormulas = Exclude; export type HostsLensLineChartFormulas = Exclude; diff --git a/x-pack/plugins/infra/public/components/asset_details/tabs/overview/kpi_grid.tsx b/x-pack/plugins/infra/public/components/asset_details/tabs/overview/kpi_grid.tsx index 89bb6b636a98e..c368413ba2864 100644 --- a/x-pack/plugins/infra/public/components/asset_details/tabs/overview/kpi_grid.tsx +++ b/x-pack/plugins/infra/public/components/asset_details/tabs/overview/kpi_grid.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { EuiFlexGroup, EuiFlexItem, EuiSpacer } from '@elastic/eui'; import { Tile } from './tile'; -import { KPI_CHARTS } from '../../../../common/visualizations/lens/kpi_grid_config'; +import { KPI_CHARTS } from '../../../../common/visualizations/lens/dashboards/host/kpi_grid_config'; import type { KPIProps } from './overview'; import type { StringDateRange } from '../../types'; @@ -27,8 +27,8 @@ export const KPIGrid = React.memo(({ nodeName, dataView, dateRange }: KPIGridPro style={{ flexGrow: 0 }} data-test-subj="assetDetailsKPIGrid" > - {KPI_CHARTS.map(({ ...chartProp }) => ( - + {KPI_CHARTS.map((chartProp, index) => ( + ))} diff --git a/x-pack/plugins/infra/public/components/asset_details/tabs/overview/tile.tsx b/x-pack/plugins/infra/public/components/asset_details/tabs/overview/tile.tsx index 18ae64ad8ee6a..25dc51b221d4f 100644 --- a/x-pack/plugins/infra/public/components/asset_details/tabs/overview/tile.tsx +++ b/x-pack/plugins/infra/public/components/asset_details/tabs/overview/tile.tsx @@ -18,25 +18,23 @@ import { } from '@elastic/eui'; import styled from 'styled-components'; import type { Action } from '@kbn/ui-actions-plugin/public'; -import type { KPIChartProps } from '../../../../common/visualizations/lens/kpi_grid_config'; +import type { KPIChartProps } from '../../../../common/visualizations/lens/dashboards/host/kpi_grid_config'; import { useLensAttributes } from '../../../../hooks/use_lens_attributes'; import { LensWrapper } from '../../../../common/visualizations/lens/lens_wrapper'; -import { buildCombinedHostsFilter } from '../../../../utils/filters/build'; +import { buildCombinedHostsFilter, buildExistsHostsFilter } from '../../../../utils/filters/build'; import { TooltipContent } from '../../../../common/visualizations/metric_explanation/tooltip_content'; import type { KPIGridProps } from './kpi_grid'; const MIN_HEIGHT = 150; export const Tile = ({ + id, + layers, title, - type, - backgroundColor, toolTip, - decimals = 1, - trendLine = false, + dataView, nodeName, dateRange, - dataView, }: KPIChartProps & KPIGridProps) => { const getSubtitle = () => i18n.translate('xpack.infra.assetDetailsEmbeddable.overview.metricTrend.subtitle.average', { @@ -44,17 +42,10 @@ export const Tile = ({ }); const { formula, attributes, getExtraActions, error } = useLensAttributes({ - type, dataView, - options: { - backgroundColor, - decimals, - subtitle: getSubtitle(), - showTrendLine: trendLine, - showTitle: false, - title, - }, - visualizationType: 'metricChart', + title, + layers: { ...layers, options: { ...layers.options, subtitle: getSubtitle() } }, + visualizationType: 'lnsMetric', }); const filters = useMemo(() => { @@ -64,6 +55,7 @@ export const Tile = ({ values: [nodeName], dataView, }), + buildExistsHostsFilter({ field: 'host.name', dataView }), ]; }, [dataView, nodeName]); @@ -83,7 +75,7 @@ export const Tile = ({ hasShadow={false} paddingSize={error ? 'm' : 'none'} style={{ minHeight: MIN_HEIGHT }} - data-test-subj={`assetDetailsKPI-${type}`} + data-test-subj={`assetDetailsKPI-${id}`} > {error ? ( ; @@ -30,6 +31,8 @@ const mockDataView = { metaFields: [], } as unknown as jest.Mocked; +const normalizedLoad1m = hostLensFormulas.normalizedLoad1m; + const lensPluginMockStart = lensPluginMock.createStartContract(); const mockUseKibana = () => { useKibanaMock.mockReturnValue({ @@ -48,27 +51,50 @@ describe('useHostTable hook', () => { it('should return the basic lens attributes', async () => { const { result, waitForNextUpdate } = renderHook(() => useLensAttributes({ - visualizationType: 'lineChart', - type: 'normalizedLoad1m', - options: { - title: 'Injected Normalized Load', - }, + visualizationType: 'lnsXY', + layers: [ + { + data: [normalizedLoad1m], + layerType: 'data', + options: { + breakdown: { + size: 10, + sourceField: 'host.name', + }, + }, + }, + { + data: [ + { + value: '1', + format: { + id: 'percent', + params: { + decimals: 0, + }, + }, + }, + ], + layerType: 'referenceLine', + }, + ], + title: 'Injected Normalized Load', dataView: mockDataView, }) ); await waitForNextUpdate(); const { state, title } = result.current.attributes ?? {}; - const { datasourceStates, filters } = state ?? {}; + const { datasourceStates } = state ?? {}; expect(title).toBe('Injected Normalized Load'); expect(datasourceStates).toEqual({ formBased: { layers: { - layer1: { - columnOrder: ['hosts_aggs_breakdown', 'x_date_histogram', 'formula_accessor'], + layer_0: { + columnOrder: ['aggs_breakdown', 'x_date_histogram', 'formula_accessor_0_0'], columns: { - hosts_aggs_breakdown: { + aggs_breakdown: { dataType: 'string', isBucketed: true, label: 'Top 10 values of host.name', @@ -104,12 +130,12 @@ describe('useHostTable hook', () => { scale: 'interval', sourceField: '@timestamp', }, - formula_accessor: { - customLabel: false, + formula_accessor_0_0: { + customLabel: true, dataType: 'number', filter: undefined, isBucketed: false, - label: 'average(system.load.1) / max(system.load.cores)', + label: 'Normalized Load', operationType: 'formula', params: { format: { @@ -128,10 +154,10 @@ describe('useHostTable hook', () => { }, indexPatternId: 'mock-id', }, - referenceLayer: { - columnOrder: ['referenceColumn'], + layer_1_reference: { + columnOrder: ['formula_accessor_1_0_reference_column'], columns: { - referenceColumn: { + formula_accessor_1_0_reference_column: { customLabel: true, dataType: 'number', isBucketed: false, @@ -145,7 +171,7 @@ describe('useHostTable hook', () => { decimals: 0, }, }, - value: 1, + value: '1', }, references: [], scale: 'ratio', @@ -158,25 +184,18 @@ describe('useHostTable hook', () => { }, }, }); - expect(filters).toEqual([ - { - meta: { - index: 'mock-id', - }, - query: { - exists: { - field: 'host.name', - }, - }, - }, - ]); }); it('should return extra actions', async () => { const { result, waitForNextUpdate } = renderHook(() => useLensAttributes({ - visualizationType: 'lineChart', - type: 'normalizedLoad1m', + visualizationType: 'lnsXY', + layers: [ + { + data: [normalizedLoad1m], + layerType: 'data', + }, + ], dataView: mockDataView, }) ); diff --git a/x-pack/plugins/infra/public/hooks/use_lens_attributes.ts b/x-pack/plugins/infra/public/hooks/use_lens_attributes.ts index ac7ec3387e8e7..721bf5669d203 100644 --- a/x-pack/plugins/infra/public/hooks/use_lens_attributes.ts +++ b/x-pack/plugins/infra/public/hooks/use_lens_attributes.ts @@ -12,45 +12,68 @@ import { useKibana } from '@kbn/kibana-react-plugin/public'; import type { Action, ActionExecutionContext } from '@kbn/ui-actions-plugin/public'; import { i18n } from '@kbn/i18n'; import useAsync from 'react-use/lib/useAsync'; +import { FormulaPublicApi, LayerType as LensLayerType } from '@kbn/lens-plugin/public'; import { InfraClientSetupDeps } from '../types'; import { - type HostsLensFormulas, - type HostsLensMetricChartFormulas, - type HostsLensLineChartFormulas, - type LineChartOptions, - type MetricChartOptions, + type XYLayerOptions, + type MetricLayerOptions, + type FormulaConfig, + type LensAttributes, LensAttributesBuilder, - LensAttributes, - hostLensFormulas, - visualizationTypes, + XYDataLayer, + MetricLayer, + XYChart, + MetricChart, + XYReferenceLinesLayer, + Chart, + LensVisualizationState, } from '../common/visualizations'; import { useLazyRef } from './use_lazy_ref'; -type Options = LineChartOptions | MetricChartOptions; -interface UseLensAttributesBaseParams { +type Options = XYLayerOptions | MetricLayerOptions; +type ChartType = 'lnsXY' | 'lnsMetric'; +export type LayerType = Exclude; +export interface Layer< + TOptions extends Options, + TFormulaConfig extends FormulaConfig | FormulaConfig[], + TLayerType extends LayerType = LayerType +> { + layerType: TLayerType; + data: TFormulaConfig; + options?: TOptions; +} + +interface UseLensAttributesBaseParams< + TOptions extends Options, + TLayers extends Array> | Layer +> { dataView?: DataView; - type: T; - options?: O; + layers: TLayers; + title?: string; } -interface UseLensAttributesLineChartParams - extends UseLensAttributesBaseParams { - visualizationType: 'lineChart'; +interface UseLensAttributesXYChartParams + extends UseLensAttributesBaseParams< + XYLayerOptions, + Array> + > { + visualizationType: 'lnsXY'; } interface UseLensAttributesMetricChartParams - extends UseLensAttributesBaseParams { - visualizationType: 'metricChart'; + extends UseLensAttributesBaseParams< + MetricLayerOptions, + Layer + > { + visualizationType: 'lnsMetric'; } -type UseLensAttributesParams = - | UseLensAttributesLineChartParams - | UseLensAttributesMetricChartParams; +type UseLensAttributesParams = UseLensAttributesXYChartParams | UseLensAttributesMetricChartParams; export const useLensAttributes = ({ - type, dataView, - options, + layers, + title, visualizationType, }: UseLensAttributesParams) => { const { @@ -60,29 +83,26 @@ export const useLensAttributes = ({ const { value, error } = useAsync(lens.stateHelperApi, [lens]); const { formula: formulaAPI } = value ?? {}; - const lensChartConfig = hostLensFormulas[type]; - const Chart = visualizationTypes[visualizationType]; - const attributes = useLazyRef(() => { if (!dataView || !formulaAPI) { return null; } - const builder = new LensAttributesBuilder( - new Chart(lensChartConfig, dataView, formulaAPI, options) - ); + const builder = new LensAttributesBuilder({ + visualization: chartFactory({ + dataView, + formulaAPI, + layers, + title, + visualizationType, + }), + }); return builder.build(); }); const injectFilters = useCallback( - ({ - filters, - query = { language: 'kuery', query: '' }, - }: { - filters: Filter[]; - query?: Query; - }): LensAttributes | null => { + ({ filters, query }: { filters: Filter[]; query: Query }): LensAttributes | null => { if (!attributes.current) { return null; } @@ -99,7 +119,7 @@ export const useLensAttributes = ({ ); const openInLensAction = useCallback( - ({ timeRange, filters, query }: { timeRange: TimeRange; filters: Filter[]; query?: Query }) => + ({ timeRange, query, filters }: { timeRange: TimeRange; filters: Filter[]; query: Query }) => () => { const injectedAttributes = injectFilters({ filters, query }); if (injectedAttributes) { @@ -119,18 +139,105 @@ export const useLensAttributes = ({ ); const getExtraActions = useCallback( - ({ timeRange, filters, query }: { timeRange: TimeRange; filters: Filter[]; query?: Query }) => { + ({ + timeRange, + filters = [], + query = { language: 'kuery', query: '' }, + }: { + timeRange: TimeRange; + filters?: Filter[]; + query?: Query; + }) => { const openInLens = getOpenInLensAction(openInLensAction({ timeRange, filters, query })); return [openInLens]; }, [openInLensAction] ); - const { - formula: { formula }, - } = lensChartConfig; + const getFormula = () => { + const firstDataLayer = [...(Array.isArray(layers) ? layers : [layers])].find( + (p) => p.layerType === 'data' + ); + + if (!firstDataLayer) { + return ''; + } + + const mainFormulaConfig = Array.isArray(firstDataLayer.data) + ? firstDataLayer.data[0] + : firstDataLayer.data; - return { formula, attributes: attributes.current, getExtraActions, error }; + return mainFormulaConfig.value; + }; + + return { formula: getFormula(), attributes: attributes.current, getExtraActions, error }; +}; + +const chartFactory = < + TOptions, + TLayers extends Array> | Layer +>({ + dataView, + formulaAPI, + layers, + title, + visualizationType, +}: { + dataView: DataView; + formulaAPI: FormulaPublicApi; + visualizationType: ChartType; + layers: TLayers; + title?: string; +}): Chart => { + switch (visualizationType) { + case 'lnsXY': + if (!Array.isArray(layers)) { + throw new Error(`Invalid layers type. Expected an array of layers.`); + } + + const getLayerClass = (layerType: LayerType) => { + switch (layerType) { + case 'data': { + return XYDataLayer; + } + case 'referenceLine': { + return XYReferenceLinesLayer; + } + default: + throw new Error(`Invalid layerType: ${layerType}`); + } + }; + + return new XYChart({ + dataView, + layers: layers.map((layerItem) => { + const Layer = getLayerClass(layerItem.layerType); + return new Layer({ + data: layerItem.data, + formulaAPI, + options: layerItem.options, + }); + }), + title, + }); + + case 'lnsMetric': + if (Array.isArray(layers)) { + throw new Error(`Invalid layers type. Expected a single layer object.`); + } + + return new MetricChart({ + dataView, + layers: new MetricLayer({ + data: layers.data, + formulaAPI, + options: layers.options, + }), + title, + }); + default: + throw new Error(`Unsupported chart type: ${visualizationType}`); + } }; const getOpenInLensAction = (onExecute: () => void): Action => { diff --git a/x-pack/plugins/infra/public/pages/metrics/hosts/components/kpis/hosts_tile.tsx b/x-pack/plugins/infra/public/pages/metrics/hosts/components/kpis/hosts_tile.tsx index 9cfb67a88c3b0..806570ebac349 100644 --- a/x-pack/plugins/infra/public/pages/metrics/hosts/components/kpis/hosts_tile.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/hosts/components/kpis/hosts_tile.tsx @@ -6,14 +6,14 @@ */ import { i18n } from '@kbn/i18n'; import React from 'react'; +import { KPIChartProps } from '../../../../../common/visualizations/lens/dashboards/host/kpi_grid_config'; import { hostLensFormulas } from '../../../../../common/visualizations'; import { useHostCountContext } from '../../hooks/use_host_count'; import { useUnifiedSearchContext } from '../../hooks/use_unified_search'; -import { TOOLTIP } from '../../../../../common/visualizations/lens/translations'; +import { TOOLTIP } from '../../../../../common/visualizations/lens/dashboards/host/translations'; import { type Props, MetricChartWrapper } from '../chart/metric_chart_wrapper'; import { TooltipContent } from '../../../../../common/visualizations/metric_explanation/tooltip_content'; -import { KPIChartProps } from './tile'; const HOSTS_CHART: Omit = { id: `metric-hostCount`, @@ -47,7 +47,7 @@ export const HostsTile = ({ style }: Pick) => { subtitle={getSubtitle()} toolTip={ } diff --git a/x-pack/plugins/infra/public/pages/metrics/hosts/components/kpis/kpi_grid.tsx b/x-pack/plugins/infra/public/pages/metrics/hosts/components/kpis/kpi_grid.tsx index 5914be028ab8b..01fd3ccef909f 100644 --- a/x-pack/plugins/infra/public/pages/metrics/hosts/components/kpis/kpi_grid.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/hosts/components/kpis/kpi_grid.tsx @@ -13,7 +13,7 @@ import { Tile } from './tile'; import { HostCountProvider } from '../../hooks/use_host_count'; import { HostsTile } from './hosts_tile'; import { KPI_CHART_MIN_HEIGHT } from '../../constants'; -import { KPI_CHARTS } from '../../../../../common/visualizations/lens/kpi_grid_config'; +import { KPI_CHARTS } from '../../../../../common/visualizations/lens/dashboards/host/kpi_grid_config'; const lensStyle: CSSProperties = { height: KPI_CHART_MIN_HEIGHT, @@ -33,8 +33,8 @@ export const KPIGrid = () => { - {KPI_CHARTS.map(({ ...chartProp }) => ( - + {KPI_CHARTS.map((chartProp, index) => ( + ))} diff --git a/x-pack/plugins/infra/public/pages/metrics/hosts/components/kpis/tile.tsx b/x-pack/plugins/infra/public/pages/metrics/hosts/components/kpis/tile.tsx index 5890442358113..e9d031401f7d1 100644 --- a/x-pack/plugins/infra/public/pages/metrics/hosts/components/kpis/tile.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/hosts/components/kpis/tile.tsx @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import React, { CSSProperties, useMemo, useCallback } from 'react'; +import React, { useMemo, useCallback } from 'react'; import { i18n } from '@kbn/i18n'; import { BrushTriggerEvent } from '@kbn/charts-plugin/public'; @@ -19,38 +19,22 @@ import { } from '@elastic/eui'; import styled from 'styled-components'; import { Action } from '@kbn/ui-actions-plugin/public'; +import { KPIChartProps } from '../../../../../common/visualizations/lens/dashboards/host/kpi_grid_config'; +import { + buildCombinedHostsFilter, + buildExistsHostsFilter, +} from '../../../../../utils/filters/build'; import { useLensAttributes } from '../../../../../hooks/use_lens_attributes'; import { useMetricsDataViewContext } from '../../hooks/use_data_view'; import { useUnifiedSearchContext } from '../../hooks/use_unified_search'; -import { HostsLensMetricChartFormulas } from '../../../../../common/visualizations'; import { useHostsViewContext } from '../../hooks/use_hosts_view'; import { LensWrapper } from '../../../../../common/visualizations/lens/lens_wrapper'; -import { buildCombinedHostsFilter } from '../../../../../utils/filters/build'; import { useHostCountContext } from '../../hooks/use_host_count'; import { useAfterLoadedState } from '../../hooks/use_after_loaded_state'; import { TooltipContent } from '../../../../../common/visualizations/metric_explanation/tooltip_content'; import { KPI_CHART_MIN_HEIGHT } from '../../constants'; -export interface KPIChartProps { - title: string; - subtitle?: string; - trendLine?: boolean; - backgroundColor: string; - type: HostsLensMetricChartFormulas; - decimals?: number; - toolTip: string; - style?: CSSProperties; -} - -export const Tile = ({ - title, - type, - backgroundColor, - toolTip, - style, - decimals = 1, - trendLine = false, -}: KPIChartProps) => { +export const Tile = ({ id, title, layers, style, toolTip, ...props }: KPIChartProps) => { const { searchCriteria, onSubmit } = useUnifiedSearchContext(); const { dataView } = useMetricsDataViewContext(); const { requestTs, hostNodes, loading: hostsLoading } = useHostsViewContext(); @@ -70,17 +54,10 @@ export const Tile = ({ }; const { formula, attributes, getExtraActions, error } = useLensAttributes({ - type, dataView, - options: { - backgroundColor, - decimals, - subtitle: getSubtitle(), - showTrendLine: trendLine, - showTitle: false, - title, - }, - visualizationType: 'metricChart', + title, + layers: { ...layers, options: { ...layers.options, subtitle: getSubtitle() } }, + visualizationType: 'lnsMetric', }); const filters = useMemo(() => { @@ -91,6 +68,7 @@ export const Tile = ({ values: hostNodes.map((p) => p.name), dataView, }), + buildExistsHostsFilter({ field: 'host.name', dataView }), ]; }, [searchCriteria.filters, hostNodes, dataView]); @@ -133,7 +111,7 @@ export const Tile = ({ {error ? (
    { title: string; - type: HostsLensLineChartFormulas; - breakdownSize: number; - render?: boolean; + layers: Array>; } const lensStyle: CSSProperties = { height: METRIC_CHART_MIN_HEIGHT, }; -export const MetricChart = ({ title, type, breakdownSize }: MetricChartProps) => { +export const MetricChart = ({ id, title, layers, overrides }: MetricChartProps) => { const { euiTheme } = useEuiTheme(); const { searchCriteria, onSubmit } = useUnifiedSearchContext(); const { dataView } = useMetricsDataViewContext(); @@ -54,13 +56,10 @@ export const MetricChart = ({ title, type, breakdownSize }: MetricChartProps) => }); const { attributes, getExtraActions, error } = useLensAttributes({ - type, dataView, - options: { - title, - breakdownSize, - }, - visualizationType: 'lineChart', + layers, + title, + visualizationType: 'lnsXY', }); const filters = useMemo(() => { @@ -71,6 +70,7 @@ export const MetricChart = ({ title, type, breakdownSize }: MetricChartProps) => values: currentPage.map((p) => p.name), dataView, }), + buildExistsHostsFilter({ field: 'host.name', dataView }), ]; }, [currentPage, dataView, searchCriteria.filters]); @@ -108,7 +108,7 @@ export const MetricChart = ({ title, type, breakdownSize }: MetricChartProps) => min-height: calc(${METRIC_CHART_MIN_HEIGHT}px + ${euiTheme.size.l}); position: relative; `} - data-test-subj={`hostsView-metricChart-${type}`} + data-test-subj={`hostsView-metricChart-${id}`} > {error ? ( ) : ( query={afterLoadedState.query} onBrushEnd={handleBrushEnd} loading={loading} + overrides={overrides} hasTitle /> )} diff --git a/x-pack/plugins/infra/public/pages/metrics/hosts/components/tabs/metrics/metrics_grid.tsx b/x-pack/plugins/infra/public/pages/metrics/hosts/components/tabs/metrics/metrics_grid.tsx index 4b2ec7a6867e4..47103365fc099 100644 --- a/x-pack/plugins/infra/public/pages/metrics/hosts/components/tabs/metrics/metrics_grid.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/hosts/components/tabs/metrics/metrics_grid.tsx @@ -9,82 +9,201 @@ import React from 'react'; import { EuiFlexGrid, EuiFlexItem } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { EuiSpacer } from '@elastic/eui'; +import { hostLensFormulas, type XYLayerOptions } from '../../../../../../common/visualizations'; import { HostMetricsDocsLink } from '../../../../../../common/visualizations/metric_explanation/host_metrics_docs_link'; import { MetricChart, MetricChartProps } from './metric_chart'; const DEFAULT_BREAKDOWN_SIZE = 20; -const CHARTS_IN_ORDER: Array & { fullRow?: boolean }> = [ +const XY_LAYER_OPTIONS: XYLayerOptions = { + breakdown: { + size: DEFAULT_BREAKDOWN_SIZE, + sourceField: 'host.name', + }, +}; + +const PERCENT_LEFT_AXIS: Pick['overrides'] = { + axisLeft: { + domain: { + min: 0, + max: 1, + }, + }, +}; + +const CHARTS_IN_ORDER: MetricChartProps[] = [ { + id: 'cpuUsage', title: i18n.translate('xpack.infra.hostsViewPage.tabs.metricsCharts.cpuUsage', { defaultMessage: 'CPU Usage', }), - type: 'cpuUsage', + layers: [ + { + data: [hostLensFormulas.cpuUsage], + layerType: 'data', + options: XY_LAYER_OPTIONS, + }, + ], + overrides: PERCENT_LEFT_AXIS, }, { + id: 'normalizedLoad1m', title: i18n.translate('xpack.infra.hostsViewPage.tabs.metricsCharts.normalizedLoad1m', { defaultMessage: 'Normalized Load', }), - type: 'normalizedLoad1m', + layers: [ + { + data: [hostLensFormulas.normalizedLoad1m], + layerType: 'data', + options: XY_LAYER_OPTIONS, + }, + { + data: [ + { + value: '1', + format: { + id: 'percent', + params: { + decimals: 0, + }, + }, + color: '#6092c0', + }, + ], + layerType: 'referenceLine', + }, + ], }, { + id: 'memoryUsage', title: i18n.translate('xpack.infra.hostsViewPage.tabs.metricsCharts.memoryUsage', { defaultMessage: 'Memory Usage', }), - type: 'memoryUsage', + layers: [ + { + data: [hostLensFormulas.memoryUsage], + layerType: 'data', + options: XY_LAYER_OPTIONS, + }, + ], + overrides: PERCENT_LEFT_AXIS, }, { + id: 'memoryFree', title: i18n.translate('xpack.infra.hostsViewPage.tabs.metricsCharts.memoryFree', { defaultMessage: 'Memory Free', }), - type: 'memoryFree', + layers: [ + { + data: [hostLensFormulas.memoryFree], + layerType: 'data', + options: XY_LAYER_OPTIONS, + }, + ], }, { + id: 'diskSpaceUsed', title: i18n.translate('xpack.infra.hostsViewPage.tabs.metricsCharts.diskSpaceUsed', { defaultMessage: 'Disk Space Usage', }), - type: 'diskSpaceUsage', + layers: [ + { + data: [hostLensFormulas.diskSpaceUsage], + layerType: 'data', + options: XY_LAYER_OPTIONS, + }, + ], + overrides: PERCENT_LEFT_AXIS, }, { + id: 'diskSpaceAvailable', title: i18n.translate('xpack.infra.hostsViewPage.tabs.metricsCharts.diskSpaceAvailable', { defaultMessage: 'Disk Space Available', }), - type: 'diskSpaceAvailable', + layers: [ + { + data: [hostLensFormulas.diskSpaceAvailable], + layerType: 'data', + options: XY_LAYER_OPTIONS, + }, + ], }, { + id: 'diskIORead', title: i18n.translate('xpack.infra.hostsViewPage.tabs.metricsCharts.diskIORead', { defaultMessage: 'Disk Read IOPS', }), - type: 'diskIORead', + layers: [ + { + data: [hostLensFormulas.diskIORead], + layerType: 'data', + options: XY_LAYER_OPTIONS, + }, + ], }, { + id: 'diskIOWrite', title: i18n.translate('xpack.infra.hostsViewPage.tabs.metricsCharts.diskIOWrite', { defaultMessage: 'Disk Write IOPS', }), - type: 'diskIOWrite', + layers: [ + { + data: [hostLensFormulas.diskIOWrite], + layerType: 'data', + options: XY_LAYER_OPTIONS, + }, + ], }, { + id: 'diskReadThroughput', title: i18n.translate('xpack.infra.hostsViewPage.tabs.metricsCharts.diskReadThroughput', { defaultMessage: 'Disk Read Throughput', }), - type: 'diskReadThroughput', + layers: [ + { + data: [hostLensFormulas.diskReadThroughput], + layerType: 'data', + options: XY_LAYER_OPTIONS, + }, + ], }, { + id: 'diskWriteThroughput', title: i18n.translate('xpack.infra.hostsViewPage.tabs.metricsCharts.diskWriteThroughput', { defaultMessage: 'Disk Write Throughput', }), - type: 'diskWriteThroughput', + layers: [ + { + data: [hostLensFormulas.diskWriteThroughput], + layerType: 'data', + options: XY_LAYER_OPTIONS, + }, + ], }, { + id: 'rx', title: i18n.translate('xpack.infra.hostsViewPage.tabs.metricsCharts.rx', { defaultMessage: 'Network Inbound (RX)', }), - type: 'rx', + layers: [ + { + data: [hostLensFormulas.rx], + layerType: 'data', + options: XY_LAYER_OPTIONS, + }, + ], }, { + id: 'tx', title: i18n.translate('xpack.infra.hostsViewPage.tabs.metricsCharts.tx', { defaultMessage: 'Network Outbound (TX)', }), - type: 'tx', + layers: [ + { + data: [hostLensFormulas.tx], + layerType: 'data', + options: XY_LAYER_OPTIONS, + }, + ], }, ]; @@ -94,9 +213,9 @@ export const MetricsGrid = React.memo(() => { - {CHARTS_IN_ORDER.map(({ fullRow, ...chartProp }) => ( - - + {CHARTS_IN_ORDER.map((chartProp, index) => ( + + ))} diff --git a/x-pack/plugins/infra/public/pages/metrics/hosts/hooks/use_hosts_table.tsx b/x-pack/plugins/infra/public/pages/metrics/hosts/hooks/use_hosts_table.tsx index 18310ad2317c0..19c0bcdaa1f47 100644 --- a/x-pack/plugins/infra/public/pages/metrics/hosts/hooks/use_hosts_table.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/hosts/hooks/use_hosts_table.tsx @@ -31,7 +31,7 @@ import { useUnifiedSearchContext } from './use_unified_search'; import { useMetricsDataViewContext } from './use_data_view'; import { ColumnHeader } from '../components/table/column_header'; import { TABLE_COLUMN_LABEL } from '../translations'; -import { TOOLTIP } from '../../../../common/visualizations/lens/translations'; +import { TOOLTIP } from '../../../../common/visualizations/lens/dashboards/host/translations'; import { buildCombinedHostsFilter } from '../../../../utils/filters/build'; /** @@ -255,7 +255,7 @@ export const useHostsTable = () => { ), @@ -270,7 +270,7 @@ export const useHostsTable = () => { ), @@ -285,7 +285,7 @@ export const useHostsTable = () => { ), @@ -300,7 +300,7 @@ export const useHostsTable = () => { ), @@ -315,7 +315,7 @@ export const useHostsTable = () => { ), @@ -330,7 +330,7 @@ export const useHostsTable = () => { ), @@ -346,7 +346,7 @@ export const useHostsTable = () => { ), diff --git a/x-pack/plugins/infra/public/utils/filters/build.ts b/x-pack/plugins/infra/public/utils/filters/build.ts index eba7b4d8ba032..4a71070ed2c5b 100644 --- a/x-pack/plugins/infra/public/utils/filters/build.ts +++ b/x-pack/plugins/infra/public/utils/filters/build.ts @@ -9,11 +9,33 @@ import { BooleanRelation, buildCombinedFilter, buildPhraseFilter, + buildExistsFilter, Filter, isCombinedFilter, } from '@kbn/es-query'; import type { DataView } from '@kbn/data-views-plugin/common'; +export const buildExistsHostsFilter = ({ + field, + dataView, +}: { + field: string; + dataView?: DataView; +}) => { + if (!dataView) { + return { + meta: {}, + query: { + exists: { + field, + }, + }, + }; + } + const indexField = dataView.getFieldByName(field)!; + return buildExistsFilter(indexField, dataView); +}; + export const buildCombinedHostsFilter = ({ field, values, @@ -27,7 +49,7 @@ export const buildCombinedHostsFilter = ({ return { query: { terms: { - 'host.name': values, + [field]: values, }, }, meta: {}, diff --git a/x-pack/plugins/lens/common/constants.ts b/x-pack/plugins/lens/common/constants.ts index 5909dbcb48f4b..4ee31881b0eb0 100644 --- a/x-pack/plugins/lens/common/constants.ts +++ b/x-pack/plugins/lens/common/constants.ts @@ -18,8 +18,6 @@ export const NOT_INTERNATIONALIZED_PRODUCT_NAME = 'Lens Visualizations'; export const BASE_API_URL = '/api/lens'; export const LENS_EDIT_BY_VALUE = 'edit_by_value'; -export const ENABLE_SQL = 'discover:enableSql'; - export const PieChartTypes = { PIE: 'pie', DONUT: 'donut', diff --git a/x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx b/x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx index 73fd78ac88588..35346b4cdabd0 100644 --- a/x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx +++ b/x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx @@ -17,7 +17,7 @@ import { useKibana } from '@kbn/kibana-react-plugin/public'; import { DataViewPickerProps } from '@kbn/unified-search-plugin/public'; import moment from 'moment'; import { LENS_APP_LOCATOR } from '../../common/locator/locator'; -import { ENABLE_SQL, LENS_APP_NAME } from '../../common/constants'; +import { LENS_APP_NAME } from '../../common/constants'; import { LensAppServices, LensTopNavActions, LensTopNavMenuProps } from './types'; import { toggleSettingsMenuOpen } from './settings_menu'; import { @@ -986,13 +986,6 @@ export const LensTopNavMenu = ({ ] ); - // setting that enables/disables SQL - const isSQLModeEnabled = uiSettings.get(ENABLE_SQL); - const supportedTextBasedLanguages = []; - if (isSQLModeEnabled) { - supportedTextBasedLanguages.push('SQL'); - } - const dataViewPickerProps: DataViewPickerProps = { trigger: { label: currentIndexPattern?.getName?.() || '', @@ -1052,7 +1045,6 @@ export const LensTopNavMenu = ({ indexPatternService.replaceDataViewId(updatedDataViewStub); } }, - textBasedLanguages: supportedTextBasedLanguages as DataViewPickerProps['textBasedLanguages'], }; const textBasedLanguageModeErrors = getUserMessages('textBasedLanguagesQueryInput', { diff --git a/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx b/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx index b145fa81345a3..7c1c88360a2e7 100644 --- a/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx +++ b/x-pack/plugins/security_solution/public/common/components/events_viewer/index.tsx @@ -79,6 +79,7 @@ import { useAlertBulkActions } from './use_alert_bulk_actions'; import type { BulkActionsProp } from '../toolbar/bulk_actions/types'; import { StatefulEventContext } from './stateful_event_context'; import { defaultUnit } from '../toolbar/unit'; +import { useGetFieldSpec } from '../../hooks/use_get_field_spec'; const storage = new Storage(localStorage); @@ -184,6 +185,8 @@ const StatefulEventsViewerComponent: React.FC(null); @@ -602,6 +605,7 @@ const StatefulEventsViewerComponent: React.FC diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/add_prebuilt_rules_table/add_prebuilt_rules_header_buttons.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/add_prebuilt_rules_table/add_prebuilt_rules_header_buttons.tsx index 8e38be7b45db8..542c4cfc8f593 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/add_prebuilt_rules_table/add_prebuilt_rules_header_buttons.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/add_prebuilt_rules_table/add_prebuilt_rules_header_buttons.tsx @@ -7,6 +7,7 @@ import { EuiButton, EuiFlexGroup, EuiFlexItem, EuiLoadingSpinner } from '@elastic/eui'; import React from 'react'; +import { useUserData } from '../../../../../detections/components/user_info'; import { useAddPrebuiltRulesTableContext } from './add_prebuilt_rules_table_context'; import * as i18n from './translations'; @@ -15,6 +16,8 @@ export const AddPrebuiltRulesHeaderButtons = () => { state: { rules, selectedRules, loadingRules, isRefetching, isUpgradingSecurityPackages }, actions: { installAllRules, installSelectedRules }, } = useAddPrebuiltRulesTableContext(); + const [{ loading: isUserDataLoading, canUserCRUD }] = useUserData(); + const canUserEditRules = canUserCRUD && !isUserDataLoading; const isRulesAvailableForInstall = rules.length > 0; const numberOfSelectedRules = selectedRules.length ?? 0; @@ -29,7 +32,7 @@ export const AddPrebuiltRulesHeaderButtons = () => { {i18n.INSTALL_SELECTED_RULES(numberOfSelectedRules)} @@ -43,7 +46,7 @@ export const AddPrebuiltRulesHeaderButtons = () => { iconType="plusInCircle" data-test-subj="installAllRulesButton" onClick={installAllRules} - disabled={!isRulesAvailableForInstall || isRequestInProgress} + disabled={!canUserEditRules || !isRulesAvailableForInstall || isRequestInProgress} > {i18n.INSTALL_ALL} {isRuleInstalling ? : undefined} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/rules_table_toolbar.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/rules_table_toolbar.tsx index ea4a43b46db7a..c1aec33b2a2f7 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/rules_table_toolbar.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/rules_table_toolbar.tsx @@ -6,6 +6,7 @@ */ import React, { useMemo } from 'react'; +import { useUserData } from '../../../../detections/components/user_info'; import { TabNavigation } from '../../../../common/components/navigation/tab_navigation'; import { usePrebuiltRulesStatus } from '../../../rule_management/logic/prebuilt_rules/use_prebuilt_rules_status'; import { useRuleManagementFilters } from '../../../rule_management/logic/use_rule_management_filters'; @@ -21,26 +22,14 @@ export const RulesTableToolbar = React.memo(() => { const { data: ruleManagementFilters } = useRuleManagementFilters(); const { data: prebuiltRulesStatus } = usePrebuiltRulesStatus(); + const [{ loading, canUserCRUD }] = useUserData(); + const installedTotal = (ruleManagementFilters?.rules_summary.custom_count ?? 0) + (ruleManagementFilters?.rules_summary.prebuilt_installed_count ?? 0); const updateTotal = prebuiltRulesStatus?.num_prebuilt_rules_to_upgrade ?? 0; - const ruleUpdateTab = useMemo( - () => ({ - [AllRulesTabs.updates]: { - id: AllRulesTabs.updates, - name: i18n.RULE_UPDATES_TAB, - disabled: false, - href: `/rules/${AllRulesTabs.updates}`, - isBeta: updateTotal > 0, - betaOptions: { - text: `${updateTotal}`, - }, - }, - }), - [updateTotal] - ); + const shouldDisplayRuleUpdatesTab = !loading && canUserCRUD && updateTotal > 0; const ruleTabs = useMemo( () => ({ @@ -64,9 +53,22 @@ export const RulesTableToolbar = React.memo(() => { text: `${installedTotal}`, }, }, - ...(updateTotal > 0 ? ruleUpdateTab : {}), + ...(shouldDisplayRuleUpdatesTab + ? { + [AllRulesTabs.updates]: { + id: AllRulesTabs.updates, + name: i18n.RULE_UPDATES_TAB, + disabled: false, + href: `/rules/${AllRulesTabs.updates}`, + isBeta: updateTotal > 0, + betaOptions: { + text: `${updateTotal}`, + }, + }, + } + : {}), }), - [installedTotal, ruleUpdateTab, updateTotal] + [installedTotal, updateTotal, shouldDisplayRuleUpdatesTab] ); return ; diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/upgrade_prebuilt_rules_table_buttons.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/upgrade_prebuilt_rules_table_buttons.tsx index b0d305dd0cf69..6d4e0641b8bbc 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/upgrade_prebuilt_rules_table_buttons.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/components/rules_table/upgrade_prebuilt_rules_table/upgrade_prebuilt_rules_table_buttons.tsx @@ -7,6 +7,7 @@ import { EuiButton, EuiFlexGroup, EuiFlexItem, EuiLoadingSpinner } from '@elastic/eui'; import React from 'react'; +import { useUserData } from '../../../../../detections/components/user_info'; import * as i18n from './translations'; import { useUpgradePrebuiltRulesTableContext } from './upgrade_prebuilt_rules_table_context'; @@ -15,6 +16,8 @@ export const UpgradePrebuiltRulesTableButtons = () => { state: { rules, selectedRules, loadingRules, isRefetching, isUpgradingSecurityPackages }, actions: { upgradeAllRules, upgradeSelectedRules }, } = useUpgradePrebuiltRulesTableContext(); + const [{ loading: isUserDataLoading, canUserCRUD }] = useUserData(); + const canUserEditRules = canUserCRUD && !isUserDataLoading; const isRulesAvailableForUpgrade = rules.length > 0; const numberOfSelectedRules = selectedRules.length ?? 0; @@ -29,7 +32,7 @@ export const UpgradePrebuiltRulesTableButtons = () => { <> @@ -44,7 +47,7 @@ export const UpgradePrebuiltRulesTableButtons = () => { fill iconType="plusInCircle" onClick={upgradeAllRules} - disabled={!isRulesAvailableForUpgrade || isRequestInProgress} + disabled={!canUserEditRules || !isRulesAvailableForUpgrade || isRequestInProgress} data-test-subj="upgradeAllRulesButton" > {i18n.UPDATE_ALL} diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/pages/rule_management/index.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/pages/rule_management/index.tsx index d7a4362585e98..37e52e7303a21 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/pages/rule_management/index.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management_ui/pages/rule_management/index.tsx @@ -107,7 +107,7 @@ const RulesPageComponent: React.FC = () => { - + diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/add_elastic_rules_button.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/add_elastic_rules_button.tsx index 014ba9d2c53e8..d62c080ace66f 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/add_elastic_rules_button.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/add_elastic_rules_button.tsx @@ -17,12 +17,14 @@ import { usePrebuiltRulesStatus } from '../../../../detection_engine/rule_manage interface AddElasticRulesButtonProps { 'data-test-subj'?: string; fill?: boolean; + isDisabled: boolean; showBadge?: boolean; } export const AddElasticRulesButton = ({ 'data-test-subj': dataTestSubj = 'addElasticRulesButton', fill, + isDisabled, showBadge = true, }: AddElasticRulesButtonProps) => { const getSecuritySolutionLinkProps = useGetSecuritySolutionLinkProps(); @@ -43,6 +45,7 @@ export const AddElasticRulesButton = ({ color={'primary'} onClick={onClickLink} data-test-subj={dataTestSubj} + isDisabled={isDisabled} > {i18n.ADD_ELASTIC_RULES} {newRulesCount > 0 && showBadge && ( diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/load_empty_prompt.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/load_empty_prompt.tsx index 803aa86b8d88d..d788f1899f55f 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/load_empty_prompt.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/pre_packaged_rules/load_empty_prompt.tsx @@ -8,6 +8,7 @@ import { EuiEmptyPrompt, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import React, { memo } from 'react'; import styled from 'styled-components'; +import { useUserData } from '../../user_info'; import { AddElasticRulesButton } from './add_elastic_rules_button'; import * as i18n from './translations'; @@ -18,6 +19,7 @@ const EmptyPrompt = styled(EuiEmptyPrompt)` EmptyPrompt.displayName = 'EmptyPrompt'; const PrePackagedRulesPromptComponent = () => { + const [{ loading, canUserCRUD }] = useUserData(); return ( { { const useCellActions: AlertsTableConfigurationRegistry['useCellActions'] = ({ @@ -24,7 +23,7 @@ export const getUseCellActionsHook = (tableId: TableId) => { data, dataGridRef, }) => { - const { browserFields } = useSourcererDataView(SourcererScopeName.detections); + const getFieldSpec = useGetFieldSpec(SourcererScopeName.detections); /** * There is difference between how `triggers actions` fetched data v/s * how security solution fetches data via timelineSearchStrategy @@ -35,7 +34,6 @@ export const getUseCellActionsHook = (tableId: TableId) => { * */ - const browserFieldsByName = useMemo(() => getAllFieldsByName(browserFields), [browserFields]); const finalData = useMemo( () => (data as TimelineNonEcsData[][]).map((row) => @@ -66,19 +64,16 @@ export const getUseCellActionsHook = (tableId: TableId) => { if (viewMode === VIEW_SELECTION.eventRenderedView) { return undefined; } - return columns.map((column) => { - // TODO use FieldSpec object instead of browserField - const browserField: Partial | undefined = browserFieldsByName[column.id]; - return { - name: column.id, - type: browserField?.type ?? '', // When type is an empty string all cell actions are incompatible - esTypes: browserField?.esTypes ?? [], - aggregatable: browserField?.aggregatable ?? false, - searchable: browserField?.searchable ?? false, - subType: browserField?.subType, - }; - }); - }, [browserFieldsByName, columns, viewMode]); + return columns.map( + (column) => + getFieldSpec(column.id) ?? { + name: '', + type: '', // When type is an empty string all cell actions are incompatible + aggregatable: false, + searchable: false, + } + ); + }, [getFieldSpec, columns, viewMode]); const getCellValue = useCallback( (fieldName, rowIndex) => { diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts index a8182ae2f4919..73461d1665542 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/action.ts @@ -8,7 +8,6 @@ import type { Action } from 'redux'; import type { DataViewBase } from '@kbn/es-query'; import type { - HostInfo, GetHostPolicyResponse, HostIsolationRequestBody, ISOLATION_ACTIONS, @@ -28,15 +27,6 @@ export interface ServerFailedToReturnEndpointList { payload: ServerApiError; } -export interface ServerReturnedEndpointDetails { - type: 'serverReturnedEndpointDetails'; - payload: HostInfo; -} - -export interface ServerFailedToReturnEndpointDetails { - type: 'serverFailedToReturnEndpointDetails'; - payload: ServerApiError; -} export interface ServerReturnedEndpointPolicyResponse { type: 'serverReturnedEndpointPolicyResponse'; payload: GetHostPolicyResponse; @@ -150,13 +140,6 @@ export type EndpointPendingActionsStateChanged = Action<'endpointPendingActionsS payload: EndpointState['endpointPendingActions']; }; -export interface EndpointDetailsLoad { - type: 'endpointDetailsLoad'; - payload: { - endpointId: string; - }; -} - export type LoadMetadataTransformStats = Action<'loadMetadataTransformStats'>; export type MetadataTransformStatsChanged = Action<'metadataTransformStatsChanged'> & { @@ -166,11 +149,6 @@ export type MetadataTransformStatsChanged = Action<'metadataTransformStatsChange export type EndpointAction = | ServerReturnedEndpointList | ServerFailedToReturnEndpointList - | ServerReturnedEndpointDetails - | ServerFailedToReturnEndpointDetails - | EndpointDetailsLoad - | ServerReturnedEndpointPolicyResponse - | ServerFailedToReturnEndpointPolicyResponse | ServerReturnedPoliciesForOnboarding | ServerFailedToReturnPoliciesForOnboarding | UserSelectedEndpointPolicy diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/builders.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/builders.ts index fb4270ee6dad5..69baec5732693 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/builders.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/builders.ts @@ -18,14 +18,6 @@ export const initialEndpointPageState = (): Immutable => { total: 0, loading: false, error: undefined, - endpointDetails: { - hostInfo: undefined, - hostInfoError: undefined, - isHostInfoLoading: false, - }, - policyResponse: undefined, - policyResponseLoading: false, - policyResponseError: undefined, location: undefined, policyItems: [], selectedPolicyId: undefined, @@ -42,8 +34,6 @@ export const initialEndpointPageState = (): Immutable => { agentsWithEndpointsTotalError: undefined, endpointsTotal: 0, endpointsTotalError: undefined, - policyVersionInfo: undefined, - hostStatus: undefined, isolationRequestState: createUninitialisedResourceState(), endpointPendingActions: createLoadedResourceState(new Map()), metadataTransformStats: createUninitialisedResourceState(), diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/index.test.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/index.test.ts index 1524b721cb07c..44165211f7b41 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/index.test.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/index.test.ts @@ -43,14 +43,6 @@ describe('EndpointList store concerns', () => { total: 0, loading: false, error: undefined, - endpointDetails: { - hostInfo: undefined, - hostInfoError: undefined, - isHostInfoLoading: false, - }, - policyResponse: undefined, - policyResponseLoading: false, - policyResponseError: undefined, location: undefined, policyItems: [], selectedPolicyId: undefined, @@ -70,7 +62,6 @@ describe('EndpointList store concerns', () => { agentsWithEndpointsTotalError: undefined, endpointsTotalError: undefined, queryStrategyVersion: undefined, - policyVersionInfo: undefined, isolationRequestState: { type: 'UninitialisedResourceState', }, diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.test.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.test.ts index cc0d79de50ca0..6f6a4934dab0e 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.test.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.test.ts @@ -17,8 +17,8 @@ import { depsStartMock } from '../../../../common/mock/endpoint'; import type { MiddlewareActionSpyHelper } from '../../../../common/store/test_utils'; import { createSpyMiddleware } from '../../../../common/store/test_utils'; import type { - Immutable, HostIsolationResponse, + Immutable, ISOLATION_ACTIONS, MetadataListResponse, } from '../../../../../common/endpoint/types'; @@ -28,8 +28,7 @@ import { listData } from './selectors'; import type { EndpointState, TransformStats } from '../types'; import { endpointListReducer } from './reducer'; import { endpointMiddlewareFactory } from './middleware'; -import { getEndpointListPath, getEndpointDetailsPath } from '../../../common/routing'; -import { resolvePathVariables } from '../../../../common/utils/resolve_path_variables'; +import { getEndpointListPath } from '../../../common/routing'; import type { FailedResourceState, LoadedResourceState } from '../../../state'; import { isFailedResourceState, @@ -43,10 +42,7 @@ import { hostIsolationResponseMock, } from '../../../../common/lib/endpoint_isolation/mocks'; import { endpointPageHttpMock, failedTransformStateMock } from '../mocks'; -import { - HOST_METADATA_GET_ROUTE, - HOST_METADATA_LIST_ROUTE, -} from '../../../../../common/endpoint/constants'; +import { HOST_METADATA_LIST_ROUTE } from '../../../../../common/endpoint/constants'; jest.mock('../../../services/policies/ingest', () => ({ sendGetAgentConfigList: () => Promise.resolve({ items: [] }), @@ -343,66 +339,4 @@ describe('endpoint list middleware', () => { expect(failedAction.error).toBe(apiError); }); }); - - describe('loads selected endpoint details', () => { - beforeEach(() => { - endpointPageHttpMock(fakeHttpServices); - }); - - const endpointList = getEndpointListApiResponse(); - const agentId = endpointList.data[0].metadata.agent.id; - const search = getEndpointDetailsPath({ - name: 'endpointDetails', - selected_endpoint: agentId, - }); - const dispatchUserChangedUrl = () => { - dispatchUserChangedUrlToEndpointList({ search: `?${search.split('?').pop()}` }); - }; - - it('triggers the endpoint details related actions when the url is changed', async () => { - dispatchUserChangedUrl(); - - // Note: these are left intentionally in sequence - // to test specific race conditions that currently exist in the middleware - await waitForAction('serverCancelledPolicyItemsLoading'); - - // loads the endpoints list - await waitForAction('serverReturnedEndpointList'); - - // loads the specific endpoint details - await waitForAction('serverReturnedEndpointDetails'); - - // loads the specific endpoint pending actions - await waitForAction('endpointPendingActionsStateChanged'); - - expect(fakeHttpServices.get).toHaveBeenCalledWith( - resolvePathVariables(HOST_METADATA_GET_ROUTE, { id: agentId }), - { version: '2023-10-31' } - ); - }); - - it('handles the endpointDetailsLoad action', async () => { - const endpointId = agentId; - dispatch({ - type: 'endpointDetailsLoad', - payload: { - endpointId, - }, - }); - - // note: this action does not load the endpoints list - - // loads the specific endpoint details - await waitForAction('serverReturnedEndpointDetails'); - await waitForAction('serverReturnedEndpointNonExistingPolicies'); - - // loads the specific endpoint pending actions - await waitForAction('endpointPendingActionsStateChanged'); - - expect(fakeHttpServices.get).toHaveBeenCalledWith( - resolvePathVariables(HOST_METADATA_GET_ROUTE, { id: endpointId }), - { version: '2023-10-31' } - ); - }); - }); }); diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts index d407a6cc27cce..6caf5b221b996 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts @@ -15,17 +15,13 @@ import type { IndexFieldsStrategyResponse, } from '@kbn/timelines-plugin/common'; import { - BASE_POLICY_RESPONSE_ROUTE, ENDPOINT_FIELDS_SEARCH_STRATEGY, - HOST_METADATA_GET_ROUTE, HOST_METADATA_LIST_ROUTE, METADATA_TRANSFORMS_STATUS_ROUTE, METADATA_UNITED_INDEX, metadataCurrentIndexPattern, } from '../../../../../common/endpoint/constants'; import type { - GetHostPolicyResponse, - HostInfo, HostIsolationRequestBody, HostResultList, Immutable, @@ -37,7 +33,6 @@ import { isolateHost, unIsolateHost } from '../../../../common/lib/endpoint_isol import { fetchPendingActionsByAgentId } from '../../../../common/lib/endpoint_pending_actions'; import type { ImmutableMiddlewareAPI, ImmutableMiddlewareFactory } from '../../../../common/store'; import type { AppAction } from '../../../../common/store/actions'; -import { resolvePathVariables } from '../../../../common/utils/resolve_path_variables'; import { sendGetEndpointSpecificPackagePolicies } from '../../../services/policies/policies'; import { asStaleResourceState, @@ -61,12 +56,10 @@ import type { EndpointPackageInfoStateChanged } from './action'; import { endpointPackageInfo, endpointPackageVersion, - fullDetailsHostInfo, getCurrentIsolationRequestState, getIsEndpointPackageInfoUninitialized, getIsIsolationRequestPending, getMetadataTransformStats, - hasSelectedEndpoint, isMetadataTransformStatsLoading, isOnEndpointPage, listData, @@ -126,20 +119,9 @@ export const endpointMiddlewareFactory: ImmutableMiddlewareFactory => { const state = getState(); - const detailsEndpoint = fullDetailsHostInfo(state); const listEndpoints = listData(state); const agentsIds = new Set(); - // get all agent ids for the endpoints in the list - if (detailsEndpoint) { - agentsIds.add(detailsEndpoint.metadata.elastic.agent.id); - } - for (const endpointInfo of listEndpoints) { agentsIds.add(endpointInfo.metadata.elastic.agent.id); } @@ -366,7 +342,7 @@ const loadEndpointsPendingActions = async ({ } }; -async function endpointDetailsListMiddleware({ +async function endpointListMiddleware({ store, coreStart, fetchIndexPatterns, @@ -407,7 +383,7 @@ async function endpointDetailsListMiddleware({ }); } - // get index pattern and fields for search bar + // get an index pattern and fields for search bar if (patterns(getState()).length === 0) { try { const indexPatterns = await fetchIndexPatterns(getState()); @@ -445,7 +421,7 @@ async function endpointDetailsListMiddleware({ const policyDataResponse: GetPolicyListResponse = await sendGetEndpointSpecificPackagePolicies(http, { query: { - perPage: 50, // Since this is an oboarding flow, we'll cap at 50 policies. + perPage: 50, // Since this is an onboarding flow, we'll cap at 50 policies. page: 1, }, }); @@ -474,130 +450,6 @@ async function endpointDetailsListMiddleware({ } } -async function loadEndpointDetails({ - selectedEndpoint, - store, - coreStart, -}: { - store: ImmutableMiddlewareAPI; - coreStart: CoreStart; - selectedEndpoint: string; -}) { - const { getState, dispatch } = store; - // call the endpoint details api - try { - const response = await coreStart.http.get( - resolvePathVariables(HOST_METADATA_GET_ROUTE, { id: selectedEndpoint as string }), - { version: '2023-10-31' } - ); - dispatch({ - type: 'serverReturnedEndpointDetails', - payload: response, - }); - - try { - const ingestPolicies = await getAgentAndPoliciesForEndpointsList( - coreStart.http, - [response], - nonExistingPolicies(getState()) - ); - if (ingestPolicies !== undefined) { - dispatch({ - type: 'serverReturnedEndpointNonExistingPolicies', - payload: ingestPolicies.packagePolicy, - }); - } - if (ingestPolicies?.agentPolicy !== undefined) { - dispatch({ - type: 'serverReturnedEndpointAgentPolicies', - payload: ingestPolicies.agentPolicy, - }); - } - } catch (error) { - // TODO should handle the error instead of logging it to the browser - // Also this is an anti-pattern we shouldn't use - // Ignore Errors, since this should not hinder the user's ability to use the UI - logError(error); - } - } catch (error) { - dispatch({ - type: 'serverFailedToReturnEndpointDetails', - payload: error, - }); - } - - loadEndpointsPendingActions(store); - - // call the policy response api - try { - const policyResponse = await coreStart.http.get( - BASE_POLICY_RESPONSE_ROUTE, - { - version: '2023-10-31', - query: { agentId: selectedEndpoint }, - } - ); - dispatch({ - type: 'serverReturnedEndpointPolicyResponse', - payload: policyResponse, - }); - } catch (error) { - dispatch({ - type: 'serverFailedToReturnEndpointPolicyResponse', - payload: error, - }); - } -} - -async function endpointDetailsMiddleware({ - coreStart, - selectedEndpoint, - store, -}: { - coreStart: CoreStart; - selectedEndpoint?: string; - store: ImmutableMiddlewareAPI; -}) { - const { getState, dispatch } = store; - dispatch({ - type: 'serverCancelledPolicyItemsLoading', - }); - - // If user navigated directly to a endpoint details page, load the endpoint list - if (listData(getState()).length === 0) { - const { page_index: pageIndex, page_size: pageSize } = uiQueryParams(getState()); - try { - const response = await coreStart.http.get(HOST_METADATA_LIST_ROUTE, { - version: '2023-10-31', - query: { - page: pageIndex, - pageSize, - }, - }); - - dispatch({ - type: 'serverReturnedEndpointList', - payload: response, - }); - - dispatchIngestPolicies({ http: coreStart.http, hosts: response.data, store }); - } catch (error) { - dispatch({ - type: 'serverFailedToReturnEndpointList', - payload: error, - }); - } - } else { - dispatch({ - type: 'serverCancelledEndpointListLoading', - }); - } - if (typeof selectedEndpoint === 'undefined') { - return; - } - await loadEndpointDetails({ store, coreStart, selectedEndpoint }); -} - export async function handleLoadMetadataTransformStats(http: HttpStart, store: EndpointPageStore) { const { getState, dispatch } = store; diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/reducer.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/reducer.ts index db15ebcfa7343..227ffebea8dec 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/reducer.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/reducer.ts @@ -12,7 +12,6 @@ import type { } from './action'; import { getCurrentIsolationRequestState, - getIsOnEndpointDetailsActivityLog, hasSelectedEndpoint, isOnEndpointPage, uiQueryParams, @@ -108,27 +107,6 @@ export const endpointListReducer: StateReducer = (state = initialEndpointPageSta ...state, patternsError: action.payload, }; - } else if (action.type === 'serverReturnedEndpointDetails') { - return { - ...state, - endpointDetails: { - ...state.endpointDetails, - hostInfo: action.payload, - hostInfoError: undefined, - isHostInfoLoading: false, - }, - policyVersionInfo: action.payload.policy_info, - hostStatus: action.payload.host_status, - }; - } else if (action.type === 'serverFailedToReturnEndpointDetails') { - return { - ...state, - endpointDetails: { - ...state.endpointDetails, - hostInfoError: action.payload, - isHostInfoLoading: false, - }, - }; } else if (action.type === 'endpointPendingActionsStateChanged') { return handleEndpointPendingActionsStateChanged(state, action); } else if (action.type === 'serverReturnedPoliciesForOnboarding') { @@ -143,24 +121,10 @@ export const endpointListReducer: StateReducer = (state = initialEndpointPageSta error: action.payload, policyItemsLoading: false, }; - } else if (action.type === 'serverReturnedEndpointPolicyResponse') { - return { - ...state, - policyResponse: action.payload.policy_response, - policyResponseLoading: false, - policyResponseError: undefined, - }; - } else if (action.type === 'serverFailedToReturnEndpointPolicyResponse') { - return { - ...state, - policyResponseError: action.payload, - policyResponseLoading: false, - }; } else if (action.type === 'userSelectedEndpointPolicy') { return { ...state, selectedPolicyId: action.payload.selectedPolicyId, - policyResponseLoading: false, }; } else if (action.type === 'serverCancelledEndpointListLoading') { return { @@ -218,25 +182,10 @@ export const endpointListReducer: StateReducer = (state = initialEndpointPageSta const wasPreviouslyOnListPage = isOnEndpointPage(state) && !hasSelectedEndpoint(state); const isCurrentlyOnDetailsPage = isOnEndpointPage(newState) && hasSelectedEndpoint(newState); const wasPreviouslyOnDetailsPage = isOnEndpointPage(state) && hasSelectedEndpoint(state); - const wasPreviouslyOnActivityLogPage = - isOnEndpointPage(state) && - hasSelectedEndpoint(state) && - getIsOnEndpointDetailsActivityLog(state); - - const isCurrentlyOnActivityLogPage = - isOnEndpointPage(newState) && - hasSelectedEndpoint(newState) && - getIsOnEndpointDetailsActivityLog(newState); - - const isNotLoadingDetails = - isCurrentlyOnActivityLogPage || - (wasPreviouslyOnActivityLogPage && - uiQueryParams(state).selected_endpoint === uiQueryParams(newState).selected_endpoint); const stateUpdates: Partial = { location: action.payload, error: undefined, - policyResponseError: undefined, }; // Reset `isolationRequestState` if needed @@ -253,10 +202,6 @@ export const endpointListReducer: StateReducer = (state = initialEndpointPageSta return { ...state, ...stateUpdates, - endpointDetails: { - ...state.endpointDetails, - hostInfoError: undefined, - }, loading: true, policyItemsLoading: true, }; @@ -267,26 +212,15 @@ export const endpointListReducer: StateReducer = (state = initialEndpointPageSta return { ...state, ...stateUpdates, - endpointDetails: { - ...state.endpointDetails, - hostInfoError: undefined, - isHostInfoLoading: !isNotLoadingDetails, - }, detailsLoading: true, - policyResponseLoading: true, }; } else { // if the previous page was not endpoint list or endpoint details, load both list and details return { ...state, ...stateUpdates, - endpointDetails: { - ...state.endpointDetails, - hostInfoError: undefined, - isHostInfoLoading: true, - }, loading: true, - policyResponseLoading: true, + policyItemsLoading: true, }; } @@ -295,10 +229,6 @@ export const endpointListReducer: StateReducer = (state = initialEndpointPageSta return { ...state, ...stateUpdates, - endpointDetails: { - ...state.endpointDetails, - hostInfoError: undefined, - }, endpointsExist: true, }; } else if (action.type === 'metadataTransformStatsChanged') { diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/selectors.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/selectors.ts index c01a7ea65a8d6..7f6e464536412 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/selectors.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/selectors.ts @@ -12,7 +12,6 @@ import { matchPath } from 'react-router-dom'; import { decode } from '@kbn/rison'; import type { Query } from '@kbn/es-query'; import type { EndpointPendingActions, Immutable } from '../../../../../common/endpoint/types'; -import { HostStatus } from '../../../../../common/endpoint/types'; import type { EndpointIndexUIQueryParams, EndpointState } from '../types'; import { extractListPaginationParams } from '../../../common/routing'; import { @@ -28,7 +27,6 @@ import { } from '../../../state'; import type { ServerApiError } from '../../../../common/types'; -import { isEndpointHostIsolated } from '../../../../common/utils/validators'; import { EndpointDetailsTabsTypes } from '../view/details/components/endpoint_details_tabs'; export const listData = (state: Immutable) => state.hosts; @@ -43,18 +41,6 @@ export const listLoading = (state: Immutable): boolean => state.l export const listError = (state: Immutable) => state.error; -export const fullDetailsHostInfo = ( - state: Immutable -): EndpointState['endpointDetails']['hostInfo'] => state.endpointDetails.hostInfo; - -export const isHostInfoLoading = ( - state: Immutable -): EndpointState['endpointDetails']['isHostInfoLoading'] => state.endpointDetails.isHostInfoLoading; - -export const hostInfoError = ( - state: Immutable -): EndpointState['endpointDetails']['hostInfoError'] => state.endpointDetails.hostInfoError; - export const policyItems = (state: Immutable) => state.policyItems; export const policyItemsLoading = (state: Immutable) => state.policyItemsLoading; @@ -68,14 +54,12 @@ export const isAutoRefreshEnabled = (state: Immutable) => state.i export const autoRefreshInterval = (state: Immutable) => state.autoRefreshInterval; -export const policyVersionInfo = (state: Immutable) => state.policyVersionInfo; - export const endpointPackageVersion = createSelector(endpointPackageInfo, (info) => isLoadedResourceState(info) ? info.data.version : undefined ); /** - * Returns the index patterns for the SearchBar to use for autosuggest + * Returns the index patterns for the SearchBar to use for auto-suggest */ export const patterns = (state: Immutable) => state.patterns; @@ -160,26 +144,6 @@ export const showView: (state: EndpointState) => EndpointIndexUIQueryParams['sho return searchParams.show ?? 'details'; }); -/** - * Returns the Host Status which is connected the fleet agent - */ -export const hostStatusInfo: (state: Immutable) => HostStatus = createSelector( - (state: Immutable) => state.hostStatus, - (hostStatus) => { - return hostStatus ? hostStatus : HostStatus.UNHEALTHY; - } -); - -/** - * Returns the Policy Response overall status - */ -export const policyResponseStatus: (state: Immutable) => string = createSelector( - (state: Immutable) => state.policyResponse, - (policyResponse) => { - return (policyResponse && policyResponse?.Endpoint?.policy?.applied?.status) || ''; - } -); - /** * returns the list of known non-existing polices that may have been in the Endpoint API response. * @param state @@ -255,10 +219,6 @@ export const getIsOnEndpointDetailsActivityLog: (state: Immutable return searchParams.show === EndpointDetailsTabsTypes.activityLog; }); -export const getIsEndpointHostIsolated = createSelector(fullDetailsHostInfo, (details) => { - return (details && isEndpointHostIsolated(details.metadata)) || false; -}); - export const getEndpointPendingActionsState = ( state: Immutable ): Immutable => { diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts index c7de43f6bc374..f0408b4537333 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/types.ts @@ -11,8 +11,6 @@ import type { AppLocation, EndpointPendingActions, HostInfo, - HostPolicyResponse, - HostStatus, Immutable, PolicyData, ResponseActionApiResponse, @@ -34,19 +32,6 @@ export interface EndpointState { loading: boolean; /** api error from retrieving host list */ error?: ServerApiError; - endpointDetails: { - // Adding `hostInfo` to store full API response in order to support the - // refactoring effort with AgentStatus component - hostInfo?: HostInfo; - hostInfoError?: ServerApiError; - isHostInfoLoading: boolean; - }; - /** Holds the Policy Response for the Host currently being displayed in the details */ - policyResponse?: HostPolicyResponse; - /** policyResponse is being retrieved */ - policyResponseLoading: boolean; - /** api error from retrieving the policy response */ - policyResponseError?: ServerApiError; /** current location info */ location?: Immutable; /** policies */ @@ -57,7 +42,7 @@ export interface EndpointState { selectedPolicyId?: string; /** Endpoint package info */ endpointPackageInfo: AsyncResourceState; - /** Tracks the list of policies IDs used in Host metadata that may no longer exist */ + /** Tracks the list of policy IDs used in Host metadata that may no longer exist */ nonExistingPolicies: PolicyIds['packagePolicy']; /** List of Package Policy Ids mapped to an associated Fleet Parent Agent Policy Id*/ agentPolicies: PolicyIds['agentPolicy']; @@ -67,7 +52,7 @@ export interface EndpointState { patterns: DataViewBase[]; /** api error from retrieving index patters for query bar */ patternsError?: ServerApiError; - /** Is auto-refresh enabled */ + /** Is auto-refresh enabled? */ isAutoRefreshEnabled: boolean; /** The current auto refresh interval for data in ms */ autoRefreshInterval: number; @@ -79,10 +64,6 @@ export interface EndpointState { endpointsTotal: number; /** api error for total, actual Endpoints */ endpointsTotalError?: ServerApiError; - /** The policy IDs and revision number of the corresponding agent, and endpoint. May be more recent than what's running */ - policyVersionInfo?: HostInfo['policy_info']; - /** The status of the host, which is mapped to the Elastic Agent status in Fleet */ - hostStatus?: HostStatus; /** Host isolation request state for a single endpoint */ isolationRequestState: AsyncResourceState; /** diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/components/back_to_policy_list_button.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/components/back_to_policy_list_button.tsx new file mode 100644 index 0000000000000..3c59a22f31983 --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/components/back_to_policy_list_button.tsx @@ -0,0 +1,55 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo, useMemo } from 'react'; +import { i18n } from '@kbn/i18n'; +import { useAppUrl } from '../../../../../common/lib/kibana'; +import type { BackToExternalAppButtonProps } from '../../../../components/back_to_external_app_button/back_to_external_app_button'; +import { BackToExternalAppButton } from '../../../../components/back_to_external_app_button/back_to_external_app_button'; +import { getPoliciesPath } from '../../../../common/routing'; +import { APP_UI_ID } from '../../../../../../common'; +import type { PolicyDetailsRouteState } from '../../../../../../common/endpoint/types'; + +export const BackToPolicyListButton = memo<{ backLink?: PolicyDetailsRouteState['backLink'] }>( + ({ backLink }) => { + const { getAppUrl } = useAppUrl(); + + const backLinkOptions = useMemo(() => { + if (backLink) { + const { navigateTo, label, href } = backLink; + return { + onBackButtonNavigateTo: navigateTo, + backButtonLabel: label, + backButtonUrl: href, + }; + } + + // the default back button is to the policy list + const policyListPath = getPoliciesPath(); + + return { + backButtonLabel: i18n.translate('xpack.securitySolution.endpoint.list.backToPolicyButton', { + defaultMessage: 'Back to policy list', + }), + backButtonUrl: getAppUrl({ path: policyListPath }), + onBackButtonNavigateTo: [ + APP_UI_ID, + { + path: policyListPath, + }, + ], + }; + }, [getAppUrl, backLink]); + + if (!backLink) { + return null; + } + return ; + } +); + +BackToPolicyListButton.displayName = 'BackToPolicyListButton'; diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/components/endpoint_list_nav_link.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/components/endpoint_list_nav_link.tsx new file mode 100644 index 0000000000000..c1756d892f69b --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/components/endpoint_list_nav_link.tsx @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo } from 'react'; +import { EuiLink } from '@elastic/eui'; +import { useNavigateByRouterEventHandler } from '../../../../../common/hooks/endpoint/use_navigate_by_router_event_handler'; + +export const EndpointListNavLink = memo<{ + name: string; + href: string; + route: string; + dataTestSubj: string; +}>(({ name, href, route, dataTestSubj }) => { + const clickHandler = useNavigateByRouterEventHandler(route); + + return ( + // eslint-disable-next-line @elastic/eui/href-or-on-click + + {name} + + ); +}); +EndpointListNavLink.displayName = 'EndpointListNavLink'; diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/components/transform_failed_callout.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/components/transform_failed_callout.tsx new file mode 100644 index 0000000000000..cc2fa0f1218c0 --- /dev/null +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/components/transform_failed_callout.tsx @@ -0,0 +1,140 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { memo, useCallback, useEffect, useMemo, useState } from 'react'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { EuiLink, EuiSpacer } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { useDispatch } from 'react-redux'; +import { useKibana } from '../../../../../common/lib/kibana'; +import type { ImmutableArray } from '../../../../../../common/endpoint/types'; +import type { TransformStats } from '../../types'; +import { WARNING_TRANSFORM_STATES } from '../../../../../../common/constants'; +import { metadataTransformPrefix } from '../../../../../../common/endpoint/constants'; +import { LinkToApp } from '../../../../../common/components/endpoint/link_to_app'; +import { CallOut } from '../../../../../common/components/callouts'; +import type { EndpointAction } from '../../store/action'; + +const TRANSFORM_URL = '/data/transform'; + +interface TransformFailedCalloutProps { + hasNoPolicyData: boolean; + metadataTransformStats: ImmutableArray; +} + +export const TransformFailedCallout = memo( + ({ hasNoPolicyData, metadataTransformStats }) => { + const [showTransformFailedCallout, setShowTransformFailedCallout] = useState(false); + const [shouldCheckTransforms, setShouldCheckTransforms] = useState(true); + const { services } = useKibana(); + const dispatch = useDispatch<(a: EndpointAction) => void>(); + + useEffect(() => { + // if no endpoint policy, skip transform check + if (!shouldCheckTransforms || hasNoPolicyData) { + return; + } + + dispatch({ type: 'loadMetadataTransformStats' }); + setShouldCheckTransforms(false); + }, [dispatch, hasNoPolicyData, shouldCheckTransforms]); + + useEffect(() => { + const hasFailure = metadataTransformStats.some((transform) => + WARNING_TRANSFORM_STATES.has(transform?.state) + ); + setShowTransformFailedCallout(hasFailure); + }, [metadataTransformStats]); + + const closeTransformFailedCallout = useCallback(() => { + setShowTransformFailedCallout(false); + }, []); + + const failingTransformIds: string = useMemo( + () => + metadataTransformStats + .reduce((acc, currentValue) => { + if (WARNING_TRANSFORM_STATES.has(currentValue.state)) { + acc.push(currentValue.id); + } + return acc; + }, []) + .join(', '), + [metadataTransformStats] + ); + + const calloutDescription = useMemo( + () => ( + <> + + + + ), + docsPage: ( + + + + ), + }} + /> + + + ), + [failingTransformIds, services.docLinks.links.endpoints.troubleshooting] + ); + + if (!showTransformFailedCallout) { + return <>; + } + + return ( + <> + + + + ); + } +); + +TransformFailedCallout.displayName = 'TransformFailedCallout'; diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/components/actions_menu.test.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/components/actions_menu.test.tsx index 35fe96d94d91f..aaca25925c91d 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/components/actions_menu.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/components/actions_menu.test.tsx @@ -12,11 +12,12 @@ import { ActionsMenu } from './actions_menu'; import React from 'react'; import { act } from '@testing-library/react'; import { endpointPageHttpMock } from '../../../mocks'; -import { fireEvent } from '@testing-library/dom'; import { licenseService } from '../../../../../../common/hooks/use_license'; import { useUserPrivileges } from '../../../../../../common/components/user_privileges'; import { initialUserPrivilegesState } from '../../../../../../common/components/user_privileges/user_privileges_context'; import { getUserPrivilegesMockDefaultValue } from '../../../../../../common/components/user_privileges/__mocks__'; +import type { HostInfo } from '../../../../../../../common/endpoint/types'; +import userEvent from '@testing-library/user-event'; jest.mock('../../../../../../common/lib/kibana/kibana_react', () => { const originalModule = jest.requireActual('../../../../../../common/lib/kibana/kibana_react'); @@ -39,12 +40,13 @@ jest.mock('../../../../../../common/components/user_privileges'); describe('When using the Endpoint Details Actions Menu', () => { let render: () => Promise>; let coreStart: AppContextTestRender['coreStart']; - let waitForAction: AppContextTestRender['middlewareSpy']['waitForAction']; let renderResult: ReturnType; let httpMocks: ReturnType; + let middlewareSpy: AppContextTestRender['middlewareSpy']; + let endpointHost: HostInfo; const setEndpointMetadataResponse = (isolation: boolean = false) => { - const endpointHost = httpMocks.responseProvider.metadataDetails(); + endpointHost = httpMocks.responseProvider.metadataDetails(); // Safe to mutate this mocked data // @ts-expect-error TS2540 endpointHost.metadata.Endpoint.state.isolation = isolation; @@ -60,7 +62,8 @@ describe('When using the Endpoint Details Actions Menu', () => { (useKibana as jest.Mock).mockReturnValue({ services: mockedContext.startServices }); coreStart = mockedContext.coreStart; - waitForAction = mockedContext.middlewareSpy.waitForAction; + middlewareSpy = mockedContext.middlewareSpy; + httpMocks = endpointPageHttpMock(mockedContext.coreStart.http); (useUserPrivileges as jest.Mock).mockReturnValue(getUserPrivilegesMockDefaultValue()); @@ -72,15 +75,10 @@ describe('When using the Endpoint Details Actions Menu', () => { }); render = async () => { - renderResult = mockedContext.render(); - - await act(async () => { - await waitForAction('serverReturnedEndpointDetails'); - }); - - act(() => { - fireEvent.click(renderResult.getByTestId('endpointDetailsActionsButton')); - }); + renderResult = mockedContext.render(); + const endpointDetailsActionsButton = renderResult.getByTestId('endpointDetailsActionsButton'); + endpointDetailsActionsButton.style.pointerEvents = 'all'; + userEvent.click(endpointDetailsActionsButton); return renderResult; }; @@ -119,10 +117,14 @@ describe('When using the Endpoint Details Actions Menu', () => { 'should navigate via kibana `navigateToApp()` when %s is clicked', async (_, dataTestSubj) => { await render(); - act(() => { - fireEvent.click(renderResult.getByTestId(dataTestSubj)); + await act(async () => { + await middlewareSpy.waitForAction('serverReturnedEndpointAgentPolicies'); }); + const takeActionMenuItem = renderResult.getByTestId(dataTestSubj); + takeActionMenuItem.style.pointerEvents = 'all'; + userEvent.click(takeActionMenuItem); + expect(coreStart.application.navigateToApp).toHaveBeenCalled(); } ); @@ -132,16 +134,16 @@ describe('When using the Endpoint Details Actions Menu', () => { beforeEach(() => setEndpointMetadataResponse(true)); describe('and user has unisolate privilege', () => { - it('should display Unisolate action', async () => { + it('should display `Release` action', async () => { await render(); expect(renderResult.getByTestId('unIsolateLink')).not.toBeNull(); }); - it('should navigate via router when unisolate is clicked', async () => { + it('should navigate via router when `Release` is clicked', async () => { await render(); - act(() => { - fireEvent.click(renderResult.getByTestId('unIsolateLink')); - }); + const isolateButton = renderResult.getByTestId('unIsolateLink'); + isolateButton.style.pointerEvents = 'all'; + userEvent.click(isolateButton); expect(coreStart.application.navigateToApp).toHaveBeenCalled(); }); @@ -159,7 +161,7 @@ describe('When using the Endpoint Details Actions Menu', () => { }); }); - it('should not display unisolate action', async () => { + it('should not display `Release` action', async () => { await render(); expect(renderResult.queryByTestId('unIsolateLink')).toBeNull(); }); @@ -173,7 +175,7 @@ describe('When using the Endpoint Details Actions Menu', () => { afterEach(() => licenseServiceMock.isPlatinumPlus.mockReturnValue(true)); - it('should still show `unisolate` action for endpoints that are currently isolated', async () => { + it('should still show `Release` action for endpoints that are currently isolated', async () => { setEndpointMetadataResponse(true); await render(); expect(renderResult.queryByTestId('isolateLink')).toBeNull(); diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/components/actions_menu.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/components/actions_menu.tsx index 7942b10059bcb..dd0c16a5f5651 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/components/actions_menu.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/components/actions_menu.tsx @@ -5,16 +5,15 @@ * 2.0. */ -import React, { useState, useCallback, useMemo } from 'react'; -import { EuiContextMenuPanel, EuiButton, EuiPopover } from '@elastic/eui'; +import React, { memo, useCallback, useMemo, useState } from 'react'; +import { EuiButton, EuiContextMenuPanel, EuiPopover } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; -import { useEndpointActionItems, useEndpointSelector } from '../../hooks'; -import { fullDetailsHostInfo } from '../../../store/selectors'; +import type { HostMetadata } from '../../../../../../../common/endpoint/types'; +import { useEndpointActionItems } from '../../hooks'; import { ContextMenuItemNavByRouter } from '../../../../../components/context_menu_with_router_support/context_menu_item_nav_by_router'; -export const ActionsMenu = React.memo<{}>(() => { - const endpointDetails = useEndpointSelector(fullDetailsHostInfo); - const menuOptions = useEndpointActionItems(endpointDetails?.metadata); +export const ActionsMenu = memo<{ hostMetadata: HostMetadata }>(({ hostMetadata }) => { + const menuOptions = useEndpointActionItems(hostMetadata); const [isPopoverOpen, setIsPopoverOpen] = useState(false); const closePopoverHandler = useCallback(() => { diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/components/endpoint_details_tabs.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/components/endpoint_details_tabs.tsx index a8c219444e1ca..6cd27aa0942ac 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/components/endpoint_details_tabs.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/components/endpoint_details_tabs.tsx @@ -6,7 +6,7 @@ */ import React, { memo, useMemo } from 'react'; -import { EuiTab, EuiTabs, EuiFlyoutBody } from '@elastic/eui'; +import { EuiFlyoutBody, EuiTab, EuiTabs } from '@elastic/eui'; import type { EndpointIndexUIQueryParams } from '../../../types'; import { EndpointDetailsFlyoutHeader } from './flyout_header'; @@ -45,16 +45,15 @@ const EndpointDetailsTab = memo( EndpointDetailsTab.displayName = 'EndpointDetailsTab'; -export const EndpointDetailsFlyoutTabs = memo( - ({ - hostname, - show, - tabs, - }: { - hostname: string; - show: EndpointIndexUIQueryParams['show']; - tabs: EndpointDetailsTabs[]; - }) => { +interface EndpointDetailsTabsProps { + hostname: string; + isHostInfoLoading: boolean; + show: EndpointIndexUIQueryParams['show']; + tabs: EndpointDetailsTabs[]; +} + +export const EndpointDetailsFlyoutTabs = memo( + ({ hostname, isHostInfoLoading, show, tabs }) => { const selectedTab = useMemo(() => tabs.find((tab) => tab.id === show), [tabs, show]); const renderTabs = tabs.map((tab) => ( @@ -63,7 +62,11 @@ export const EndpointDetailsFlyoutTabs = memo( return ( <> - + {renderTabs} diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/components/endpoint_isolate_flyout_panel.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/components/endpoint_isolate_flyout_panel.tsx index 6f98f04ee6f26..9a1e60c426b56 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/components/endpoint_isolate_flyout_panel.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/components/endpoint_isolate_flyout_panel.tsx @@ -9,24 +9,24 @@ import React, { memo, useCallback, useState } from 'react'; import { useHistory } from 'react-router-dom'; import { useDispatch } from 'react-redux'; import type { Dispatch } from 'redux'; -import { EuiForm, EuiFlyoutBody } from '@elastic/eui'; +import { EuiFlyoutBody, EuiForm } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; +import { isEndpointHostIsolated } from '../../../../../../common/utils/validators'; import type { HostMetadata } from '../../../../../../../common/endpoint/types'; import type { EndpointIsolatedFormProps } from '../../../../../../common/components/endpoint/host_isolation'; import { + ActionCompletionReturnButton, EndpointIsolateForm, EndpointIsolateSuccess, EndpointUnisolateForm, - ActionCompletionReturnButton, } from '../../../../../../common/components/endpoint/host_isolation'; import { getEndpointDetailsPath } from '../../../../../common/routing'; import { useEndpointSelector } from '../../hooks'; import { - getIsolationRequestError, getIsIsolationRequestPending, + getIsolationRequestError, getWasIsolationRequestSuccessful, uiQueryParams, - getIsEndpointHostIsolated, } from '../../../store/selectors'; import type { AppAction } from '../../../../../../common/store/actions'; @@ -40,7 +40,7 @@ export const EndpointIsolationFlyoutPanel = memo<{ const dispatch = useDispatch>(); const { show, ...queryParams } = useEndpointSelector(uiQueryParams); - const isCurrentlyIsolated = useEndpointSelector(getIsEndpointHostIsolated); + const isCurrentlyIsolated = isEndpointHostIsolated(hostMeta); const isPending = useEndpointSelector(getIsIsolationRequestPending); const wasSuccessful = useEndpointSelector(getWasIsolationRequestSuccessful); const isolateError = useEndpointSelector(getIsolationRequestError); diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/components/flyout_header.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/components/flyout_header.tsx index 256b606ad5110..1191984179437 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/components/flyout_header.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/components/flyout_header.tsx @@ -7,29 +7,23 @@ import React, { memo } from 'react'; import { EuiFlyoutHeader, EuiSkeletonText, EuiTitle, EuiToolTip } from '@elastic/eui'; -import { useEndpointSelector } from '../../hooks'; -import { isHostInfoLoading } from '../../../store/selectors'; import { BackToEndpointDetailsFlyoutSubHeader } from './back_to_endpoint_details_flyout_subheader'; -export const EndpointDetailsFlyoutHeader = memo( - ({ - endpointId, - hasBorder = false, - hostname, - children, - }: { - endpointId?: string; - hasBorder?: boolean; - hostname?: string; - children?: React.ReactNode | React.ReactNode[]; - }) => { - const hostDetailsLoading = useEndpointSelector(isHostInfoLoading); +interface EndpointDetailsFlyoutHeaderProps { + children?: React.ReactNode | React.ReactNode[]; + endpointId?: string; + hasBorder?: boolean; + hostname?: string; + isHostInfoLoading: boolean; +} +export const EndpointDetailsFlyoutHeader = memo( + ({ children, endpointId, hasBorder = false, hostname, isHostInfoLoading }) => { return ( {endpointId && } - {hostDetailsLoading ? ( + {isHostInfoLoading ? ( ) : ( diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/endpoint_details.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/endpoint_details.tsx index a7f02fbb5da03..d6ed904b0f24a 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/endpoint_details.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/endpoint_details.tsx @@ -7,19 +7,14 @@ import { EuiFlyoutBody, EuiFlyoutFooter, EuiSkeletonText, EuiSpacer } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React, { memo, useCallback, useEffect, useMemo } from 'react'; +import { useGetEndpointDetails } from '../../../../hooks'; import { useUserPrivileges } from '../../../../../common/components/user_privileges'; import { ResponseActionsLog } from '../../../../components/endpoint_response_actions_list/response_actions_log'; import { PolicyResponseWrapper } from '../../../../components/policy_response'; import type { HostMetadata } from '../../../../../../common/endpoint/types'; import { useToasts } from '../../../../../common/lib/kibana'; import { getEndpointDetailsPath } from '../../../../common/routing'; -import { - fullDetailsHostInfo, - hostInfoError, - policyVersionInfo, - showView, - uiQueryParams, -} from '../../store/selectors'; +import { showView, uiQueryParams } from '../../store/selectors'; import { useEndpointSelector } from '../hooks'; import * as i18 from '../translations'; import { ActionsMenu } from './components/actions_menu'; @@ -36,14 +31,16 @@ export const EndpointDetails = memo(() => { const toasts = useToasts(); const queryParams = useEndpointSelector(uiQueryParams); - const hostInfo = useEndpointSelector(fullDetailsHostInfo); - const hostDetailsError = useEndpointSelector(hostInfoError); + const { + data: hostInfo, + error: hostInfoError, + isFetching: isHostInfoLoading, + } = useGetEndpointDetails(queryParams.selected_endpoint ?? ''); - const policyInfo = useEndpointSelector(policyVersionInfo); const show = useEndpointSelector(showView); const { canAccessEndpointActionsLogManagement } = useUserPrivileges().endpointPrivileges; - const ContentLoadingMarkup = useMemo( + const contentLoadingMarkup = useMemo( () => ( <> @@ -67,9 +64,9 @@ export const EndpointDetails = memo(() => { }), content: hostInfo === undefined ? ( - ContentLoadingMarkup + contentLoadingMarkup ) : ( - + ), }, ]; @@ -90,14 +87,14 @@ export const EndpointDetails = memo(() => { } return tabs; }, - [canAccessEndpointActionsLogManagement, ContentLoadingMarkup, hostInfo, policyInfo, queryParams] + [canAccessEndpointActionsLogManagement, contentLoadingMarkup, hostInfo, queryParams] ); const showFlyoutFooter = show === 'details' || show === 'policy_response' || show === 'activity_log'; useEffect(() => { - if (hostDetailsError !== undefined) { + if (hostInfoError !== null) { toasts.addDanger({ title: i18n.translate('xpack.securitySolution.endpoint.details.errorTitle', { defaultMessage: 'Could not find host', @@ -107,15 +104,16 @@ export const EndpointDetails = memo(() => { }), }); } - }, [hostDetailsError, show, toasts]); + }, [hostInfoError, show, toasts]); return ( <> {(show === 'policy_response' || show === 'isolate' || show === 'unisolate') && ( )} {hostInfo === undefined ? ( @@ -127,6 +125,7 @@ export const EndpointDetails = memo(() => { {(show === 'details' || show === 'activity_log') && ( { {showFlyoutFooter && ( - + )} diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/endpoint_details_content.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/endpoint_details_content.tsx index 13878c9377eb4..ba0131ffb15f1 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/endpoint_details_content.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/details/endpoint_details_content.tsx @@ -24,7 +24,6 @@ import { useEndpointSelector } from '../hooks'; import { getEndpointPendingActionsCallback, nonExistingPolicies, - policyResponseStatus, uiQueryParams, } from '../../store/selectors'; import { POLICY_STATUS_TO_BADGE_COLOR } from '../host_constants'; @@ -64,9 +63,10 @@ interface EndpointDetailsContentProps { export const EndpointDetailsContent = memo( ({ hostInfo, policyInfo }) => { const queryParams = useEndpointSelector(uiQueryParams); - const policyStatus = useEndpointSelector( - policyResponseStatus - ) as keyof typeof POLICY_STATUS_TO_BADGE_COLOR; + const policyStatus = useMemo( + () => hostInfo.metadata.Endpoint.policy.applied.status, + [hostInfo] + ); const getHostPendingActions = useEndpointSelector(getEndpointPendingActionsCallback); const missingPolicies = useEndpointSelector(nonExistingPolicies); diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/hooks/use_endpoint_action_items.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/hooks/use_endpoint_action_items.tsx index eba863b3b8ddb..f5b218190026e 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/hooks/use_endpoint_action_items.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/hooks/use_endpoint_action_items.tsx @@ -27,6 +27,7 @@ interface Options { /** * Returns a list (array) of actions for an individual endpoint * @param endpointMetadata + * @param options */ export const useEndpointActionItems = ( endpointMetadata: MaybeImmutable | undefined, @@ -45,218 +46,214 @@ export const useEndpointActionItems = ( } = useUserPrivileges().endpointPrivileges; return useMemo(() => { - if (endpointMetadata) { - const isIsolated = isEndpointHostIsolated(endpointMetadata); - const endpointId = endpointMetadata.agent.id; - const endpointPolicyId = endpointMetadata.Endpoint.policy.applied.id; - const endpointHostName = endpointMetadata.host.hostname; - const fleetAgentId = endpointMetadata.elastic.agent.id; - const isolationSupported = isIsolationSupported({ - osName: endpointMetadata.host.os.name, - version: endpointMetadata.agent.version, - capabilities: endpointMetadata.Endpoint.capabilities, - }); - const { - show, - selected_endpoint: _selectedEndpoint, - ...currentUrlParams - } = allCurrentUrlParams; - const endpointActionsPath = getEndpointDetailsPath({ - name: 'endpointActivityLog', - ...currentUrlParams, - selected_endpoint: endpointId, - }); - const endpointIsolatePath = getEndpointDetailsPath({ - name: 'endpointIsolate', - ...currentUrlParams, - selected_endpoint: endpointId, - }); - const endpointUnIsolatePath = getEndpointDetailsPath({ - name: 'endpointUnIsolate', - ...currentUrlParams, - selected_endpoint: endpointId, - }); + if (!endpointMetadata) { + return []; + } - const isolationActions = []; + const isIsolated = isEndpointHostIsolated(endpointMetadata); + const endpointId = endpointMetadata.agent.id; + const endpointPolicyId = endpointMetadata.Endpoint.policy.applied.id; + const endpointHostName = endpointMetadata.host.hostname; + const fleetAgentId = endpointMetadata.elastic.agent.id; + const isolationSupported = isIsolationSupported({ + osName: endpointMetadata.host.os.name, + version: endpointMetadata.agent.version, + capabilities: endpointMetadata.Endpoint.capabilities, + }); + const { show, selected_endpoint: _selectedEndpoint, ...currentUrlParams } = allCurrentUrlParams; + const endpointActionsPath = getEndpointDetailsPath({ + name: 'endpointActivityLog', + ...currentUrlParams, + selected_endpoint: endpointId, + }); + const endpointIsolatePath = getEndpointDetailsPath({ + name: 'endpointIsolate', + ...currentUrlParams, + selected_endpoint: endpointId, + }); + const endpointUnIsolatePath = getEndpointDetailsPath({ + name: 'endpointUnIsolate', + ...currentUrlParams, + selected_endpoint: endpointId, + }); - if (isIsolated && canUnIsolateHost) { - // Un-isolate is available to users regardless of license level if they have unisolate permissions - isolationActions.push({ - 'data-test-subj': 'unIsolateLink', - icon: 'lockOpen', - key: 'unIsolateHost', - navigateAppId: APP_UI_ID, - navigateOptions: { - path: endpointUnIsolatePath, - }, - href: getAppUrl({ path: endpointUnIsolatePath }), - children: ( - - ), - }); - } else if (isolationSupported && canIsolateHost) { - // For Platinum++ licenses, users also have ability to isolate - isolationActions.push({ - 'data-test-subj': 'isolateLink', - icon: 'lock', - key: 'isolateHost', - navigateAppId: APP_UI_ID, - navigateOptions: { - path: endpointIsolatePath, - }, - href: getAppUrl({ path: endpointIsolatePath }), - children: ( - - ), - }); - } + const isolationActions = []; - return [ - ...isolationActions, - ...(canAccessResponseConsole - ? [ - { - 'data-test-subj': 'console', - icon: 'console', - key: 'consoleLink', - onClick: (ev: React.MouseEvent) => { - ev.preventDefault(); - showEndpointResponseActionsConsole(endpointMetadata); - }, - children: ( - - ), - }, - ] - : []), - ...(options?.isEndpointList && canAccessEndpointActionsLogManagement - ? [ - { - 'data-test-subj': 'actionsLink', - icon: 'logoSecurity', - key: 'actionsLogLink', - navigateAppId: APP_UI_ID, - navigateOptions: { path: endpointActionsPath }, - href: getAppUrl({ path: endpointActionsPath }), - children: ( - - ), - }, - ] - : []), - { - 'data-test-subj': 'hostLink', - icon: 'logoSecurity', - key: 'hostDetailsLink', - navigateAppId: APP_UI_ID, - navigateOptions: { path: `/hosts/${endpointHostName}` }, - href: getAppUrl({ path: `/hosts/${endpointHostName}` }), - children: ( - - ), + if (isIsolated && canUnIsolateHost) { + // Un-isolate is available to users regardless of license level if they have unisolate permissions + isolationActions.push({ + 'data-test-subj': 'unIsolateLink', + icon: 'lockOpen', + key: 'unIsolateHost', + navigateAppId: APP_UI_ID, + navigateOptions: { + path: endpointUnIsolatePath, }, - ...(canAccessFleet - ? [ - { - icon: 'gear', - key: 'agentConfigLink', - 'data-test-subj': 'agentPolicyLink', - navigateAppId: 'fleet', - navigateOptions: { - path: `${ - pagePathGetters.policy_details({ - policyId: fleetAgentPolicies[endpointPolicyId], - })[1] - }`, - }, - href: `${getAppUrl({ appId: 'fleet' })}${ + href: getAppUrl({ path: endpointUnIsolatePath }), + children: ( + + ), + }); + } else if (isolationSupported && canIsolateHost) { + // For Platinum++ licenses, users also have ability to isolate + isolationActions.push({ + 'data-test-subj': 'isolateLink', + icon: 'lock', + key: 'isolateHost', + navigateAppId: APP_UI_ID, + navigateOptions: { + path: endpointIsolatePath, + }, + href: getAppUrl({ path: endpointIsolatePath }), + children: ( + + ), + }); + } + + return [ + ...isolationActions, + ...(canAccessResponseConsole + ? [ + { + 'data-test-subj': 'console', + icon: 'console', + key: 'consoleLink', + onClick: (ev: React.MouseEvent) => { + ev.preventDefault(); + showEndpointResponseActionsConsole(endpointMetadata); + }, + children: ( + + ), + }, + ] + : []), + ...(options?.isEndpointList && canAccessEndpointActionsLogManagement + ? [ + { + 'data-test-subj': 'actionsLink', + icon: 'logoSecurity', + key: 'actionsLogLink', + navigateAppId: APP_UI_ID, + navigateOptions: { path: endpointActionsPath }, + href: getAppUrl({ path: endpointActionsPath }), + children: ( + + ), + }, + ] + : []), + { + 'data-test-subj': 'hostLink', + icon: 'logoSecurity', + key: 'hostDetailsLink', + navigateAppId: APP_UI_ID, + navigateOptions: { path: `/hosts/${endpointHostName}` }, + href: getAppUrl({ path: `/hosts/${endpointHostName}` }), + children: ( + + ), + }, + ...(canAccessFleet + ? [ + { + icon: 'gear', + key: 'agentConfigLink', + 'data-test-subj': 'agentPolicyLink', + navigateAppId: 'fleet', + navigateOptions: { + path: `${ pagePathGetters.policy_details({ policyId: fleetAgentPolicies[endpointPolicyId], })[1] }`, - disabled: fleetAgentPolicies[endpointPolicyId] === undefined, - children: ( - - ), }, - { - icon: 'gear', - key: 'agentDetailsLink', - 'data-test-subj': 'agentDetailsLink', - navigateAppId: 'fleet', - navigateOptions: { - path: `${ - pagePathGetters.agent_details({ - agentId: fleetAgentId, - })[1] - }`, - }, - href: `${getAppUrl({ appId: 'fleet' })}${ + href: `${getAppUrl({ appId: 'fleet' })}${ + pagePathGetters.policy_details({ + policyId: fleetAgentPolicies[endpointPolicyId], + })[1] + }`, + disabled: fleetAgentPolicies[endpointPolicyId] === undefined, + children: ( + + ), + }, + { + icon: 'gear', + key: 'agentDetailsLink', + 'data-test-subj': 'agentDetailsLink', + navigateAppId: 'fleet', + navigateOptions: { + path: `${ pagePathGetters.agent_details({ agentId: fleetAgentId, })[1] }`, - children: ( - - ), }, - { - icon: 'gear', - key: 'agentPolicyReassignLink', - 'data-test-subj': 'agentPolicyReassignLink', - navigateAppId: 'fleet', - navigateOptions: { - path: `${ - pagePathGetters.agent_details({ - agentId: fleetAgentId, - })[1] - }?openReassignFlyout=true`, - state: { - onDoneNavigateTo: [ - APP_UI_ID, - { path: getEndpointListPath({ name: 'endpointList' }) }, - ], - }, - }, - href: `${getAppUrl({ appId: 'fleet' })}${ + href: `${getAppUrl({ appId: 'fleet' })}${ + pagePathGetters.agent_details({ + agentId: fleetAgentId, + })[1] + }`, + children: ( + + ), + }, + { + icon: 'gear', + key: 'agentPolicyReassignLink', + 'data-test-subj': 'agentPolicyReassignLink', + navigateAppId: 'fleet', + navigateOptions: { + path: `${ pagePathGetters.agent_details({ agentId: fleetAgentId, })[1] }?openReassignFlyout=true`, - children: ( - - ), + state: { + onDoneNavigateTo: [ + APP_UI_ID, + { path: getEndpointListPath({ name: 'endpointList' }) }, + ], + }, }, - ] - : []), - ]; - } - - return []; + href: `${getAppUrl({ appId: 'fleet' })}${ + pagePathGetters.agent_details({ + agentId: fleetAgentId, + })[1] + }?openReassignFlyout=true`, + children: ( + + ), + }, + ] + : []), + ]; }, [ allCurrentUrlParams, canAccessResponseConsole, diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.test.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.test.tsx index 027f2cc20780d..7988e29a6cfc2 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.test.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.test.tsx @@ -19,11 +19,7 @@ import { } from '../store/mock_endpoint_result_list'; import type { AppContextTestRender } from '../../../../common/mock/endpoint'; import { createAppRootMockRenderer } from '../../../../common/mock/endpoint'; -import type { - HostInfo, - HostPolicyResponse, - HostPolicyResponseAppliedAction, -} from '../../../../../common/endpoint/types'; +import type { HostInfo, HostPolicyResponse } from '../../../../../common/endpoint/types'; import { HostPolicyResponseActionStatus, HostStatus } from '../../../../../common/endpoint/types'; import { EndpointDocGenerator } from '../../../../../common/endpoint/generate_data'; import { POLICY_STATUS_TO_HEALTH_COLOR, POLICY_STATUS_TO_TEXT } from './host_constants'; @@ -59,6 +55,7 @@ import { import { getUserPrivilegesMockDefaultValue } from '../../../../common/components/user_privileges/__mocks__'; import { ENDPOINT_CAPABILITIES } from '../../../../../common/endpoint/service/response_actions/constants'; import { getEndpointPrivilegesInitialStateMock } from '../../../../common/components/user_privileges/endpoint/mocks'; +import { useGetEndpointDetails } from '../../../hooks/endpoint/use_get_endpoint_details'; const mockUserPrivileges = useUserPrivileges as jest.Mock; // not sure why this can't be imported from '../../../../common/mock/formatted_relative'; @@ -138,6 +135,8 @@ const timepickerRanges = [ jest.mock('../../../../common/lib/kibana'); jest.mock('../../../../common/hooks/use_license'); +jest.mock('../../../hooks/endpoint/use_get_endpoint_details'); +const mockUseGetEndpointDetails = useGetEndpointDetails as jest.Mock; describe('when on the endpoint list page', () => { const docGenerator = new EndpointDocGenerator(); @@ -407,8 +406,29 @@ describe('when on the endpoint list page', () => { }); describe('when the user clicks the first hostname in the table', () => { + const endpointDetails: HostInfo = mockEndpointDetailsApiResult(); let renderResult: reactTestingLibrary.RenderResult; beforeEach(async () => { + mockUseGetEndpointDetails.mockReturnValue({ + data: { + ...endpointDetails, + host_status: endpointDetails.host_status, + metadata: { + ...endpointDetails.metadata, + Endpoint: { + ...endpointDetails.metadata.Endpoint, + state: { + ...endpointDetails.metadata.Endpoint.state, + isolation: false, + }, + }, + agent: { + ...endpointDetails.metadata.agent, + id: '1', + }, + }, + }, + }); renderResult = render(); await reactTestingLibrary.act(async () => { await middlewareSpy.waitForAction('serverReturnedEndpointList'); @@ -487,13 +507,13 @@ describe('when on the endpoint list page', () => { describe('when there is a selected host in the url', () => { let hostInfo: HostInfo; - let renderAndWaitForData: () => Promise>; + const endpointDetails: HostInfo = mockEndpointDetailsApiResult(); const mockEndpointListApi = (mockedPolicyResponse?: HostPolicyResponse) => { const { host_status: hostStatus, last_checkin: lastCheckin, metadata: { agent, Endpoint, ...details }, - } = mockEndpointDetailsApiResult(); + } = endpointDetails; hostInfo = { host_status: hostStatus, @@ -524,83 +544,35 @@ describe('when on the endpoint list page', () => { }); }; - const createPolicyResponse = ( - overallStatus: HostPolicyResponseActionStatus = HostPolicyResponseActionStatus.success - ): HostPolicyResponse => { - const policyResponse = docGenerator.generatePolicyResponse(); - const malwareResponseConfigurations = - policyResponse.Endpoint.policy.applied.response.configurations.malware; - policyResponse.Endpoint.policy.applied.status = overallStatus; - malwareResponseConfigurations.status = overallStatus; - let downloadModelAction = policyResponse.Endpoint.policy.applied.actions.find( - (action) => action.name === 'download_model' - ); - - if (!downloadModelAction) { - downloadModelAction = { - name: 'download_model', - message: 'Failed to apply a portion of the configuration (kernel)', - status: overallStatus, - }; - policyResponse.Endpoint.policy.applied.actions.push(downloadModelAction); - } else { - // Else, make sure the status of the generated action matches what was passed in - downloadModelAction.status = overallStatus; - } - - if ( - overallStatus === HostPolicyResponseActionStatus.failure || - overallStatus === HostPolicyResponseActionStatus.warning - ) { - downloadModelAction.message = 'no action taken'; - } - - // Make sure that at least one configuration has the above action, else - // we get into an out-of-sync condition - if ( - malwareResponseConfigurations.concerned_actions.indexOf(downloadModelAction.name) === -1 - ) { - malwareResponseConfigurations.concerned_actions.push(downloadModelAction.name); - } - - // Add an unknown Action Name - to ensure we handle the format of it on the UI - const unknownAction: HostPolicyResponseAppliedAction = { - status: HostPolicyResponseActionStatus.success, - message: 'test message', - name: 'a_new_unknown_action', - }; - policyResponse.Endpoint.policy.applied.actions.push(unknownAction); - malwareResponseConfigurations.concerned_actions.push(unknownAction.name); - - return policyResponse; - }; - - const dispatchServerReturnedEndpointPolicyResponse = ( - overallStatus: HostPolicyResponseActionStatus = HostPolicyResponseActionStatus.success - ) => { - reactTestingLibrary.act(() => { - store.dispatch({ - type: 'serverReturnedEndpointPolicyResponse', - payload: { - policy_response: createPolicyResponse(overallStatus), + const getMockUseEndpointDetails = (policyStatus?: HostPolicyResponseActionStatus) => { + return mockUseGetEndpointDetails.mockReturnValue({ + data: { + ...hostInfo, + metadata: { + ...hostInfo.metadata, + Endpoint: { + ...hostInfo.metadata.Endpoint, + policy: { + ...hostInfo.metadata.Endpoint.policy, + applied: { + ...hostInfo.metadata.Endpoint.policy.applied, + status: policyStatus, + }, + }, + }, }, - }); + }, }); }; beforeEach(async () => { mockEndpointListApi(); + getMockUseEndpointDetails(); mockUserPrivileges.mockReturnValue(getUserPrivilegesMockDefaultValue()); reactTestingLibrary.act(() => { history.push(`${MANAGEMENT_PATH}/endpoints?selected_endpoint=1`); }); - - renderAndWaitForData = async () => { - const renderResult = render(); - await middlewareSpy.waitForAction('serverReturnedEndpointDetails'); - return renderResult; - }; }); afterEach(() => { @@ -609,13 +581,13 @@ describe('when on the endpoint list page', () => { }); it('should show the flyout and footer', async () => { - const renderResult = await renderAndWaitForData(); + const renderResult = render(); expect(renderResult.getByTestId('endpointDetailsFlyout')).not.toBeNull(); expect(renderResult.getByTestId('endpointDetailsFlyoutFooter')).not.toBeNull(); }); it('should display policy name value as a link', async () => { - const renderResult = await renderAndWaitForData(); + const renderResult = render(); const policyDetailsLink = await renderResult.findByTestId('policyDetailsValue'); expect(policyDetailsLink).not.toBeNull(); expect(policyDetailsLink.getAttribute('href')).toEqual( @@ -624,7 +596,7 @@ describe('when on the endpoint list page', () => { }); it('should display policy revision number', async () => { - const renderResult = await renderAndWaitForData(); + const renderResult = render(); const policyDetailsRevElement = await renderResult.findByTestId('policyDetailsRevNo'); expect(policyDetailsRevElement).not.toBeNull(); expect(policyDetailsRevElement.textContent).toEqual( @@ -633,7 +605,7 @@ describe('when on the endpoint list page', () => { }); it('should update the URL when policy name link is clicked', async () => { - const renderResult = await renderAndWaitForData(); + const renderResult = render(); const policyDetailsLink = await renderResult.findByTestId('policyDetailsValue'); const userChangedUrlChecker = middlewareSpy.waitForAction('userChangedUrl'); reactTestingLibrary.act(() => { @@ -646,7 +618,7 @@ describe('when on the endpoint list page', () => { }); it('should update the URL when policy status link is clicked', async () => { - const renderResult = await renderAndWaitForData(); + const renderResult = render(); const policyStatusLink = await renderResult.findByTestId('policyStatusValue'); const userChangedUrlChecker = middlewareSpy.waitForAction('userChangedUrl'); reactTestingLibrary.act(() => { @@ -659,38 +631,39 @@ describe('when on the endpoint list page', () => { }); it('should display Success overall policy status', async () => { - const renderResult = await renderAndWaitForData(); + getMockUseEndpointDetails(HostPolicyResponseActionStatus.success); + const renderResult = render(); const policyStatusBadge = await renderResult.findByTestId('policyStatusValue'); expect(renderResult.getByTestId('policyStatusValue-success')).toBeTruthy(); expect(policyStatusBadge.textContent).toEqual('Success'); }); it('should display Warning overall policy status', async () => { - mockEndpointListApi(createPolicyResponse(HostPolicyResponseActionStatus.warning)); - const renderResult = await renderAndWaitForData(); + getMockUseEndpointDetails(HostPolicyResponseActionStatus.warning); + const renderResult = render(); const policyStatusBadge = await renderResult.findByTestId('policyStatusValue'); expect(policyStatusBadge.textContent).toEqual('Warning'); expect(renderResult.getByTestId('policyStatusValue-warning')).toBeTruthy(); }); it('should display Failed overall policy status', async () => { - mockEndpointListApi(createPolicyResponse(HostPolicyResponseActionStatus.failure)); - const renderResult = await renderAndWaitForData(); + getMockUseEndpointDetails(HostPolicyResponseActionStatus.failure); + const renderResult = render(); const policyStatusBadge = await renderResult.findByTestId('policyStatusValue'); expect(policyStatusBadge.textContent).toEqual('Failed'); expect(renderResult.getByTestId('policyStatusValue-failure')).toBeTruthy(); }); it('should display Unknown overall policy status', async () => { - mockEndpointListApi(createPolicyResponse('' as HostPolicyResponseActionStatus)); - const renderResult = await renderAndWaitForData(); + getMockUseEndpointDetails('' as HostPolicyResponseActionStatus); + const renderResult = render(); const policyStatusBadge = await renderResult.findByTestId('policyStatusValue'); expect(policyStatusBadge.textContent).toEqual('Unknown'); expect(renderResult.getByTestId('policyStatusValue-')).toBeTruthy(); }); it('should show the Take Action button', async () => { - const renderResult = await renderAndWaitForData(); + const renderResult = render(); expect(renderResult.getByTestId('endpointDetailsActionsButton')).not.toBeNull(); }); @@ -711,7 +684,7 @@ describe('when on the endpoint list page', () => { describe('when `canReadActionsLogManagement` is TRUE', () => { it('should start with the activity log tab as unselected', async () => { - const renderResult = await renderAndWaitForData(); + const renderResult = await render(); const detailsTab = renderResult.getByTestId('endpoint-details-flyout-tab-details'); const activityLogTab = renderResult.getByTestId( 'endpoint-details-flyout-tab-activity_log' @@ -724,7 +697,7 @@ describe('when on the endpoint list page', () => { }); it('should show the activity log content when selected', async () => { - const renderResult = await renderAndWaitForData(); + const renderResult = await render(); const detailsTab = renderResult.getByTestId('endpoint-details-flyout-tab-details'); const activityLogTab = renderResult.getByTestId( 'endpoint-details-flyout-tab-activity_log' @@ -749,7 +722,7 @@ describe('when on the endpoint list page', () => { canAccessFleet: true, }, }); - const renderResult = await renderAndWaitForData(); + const renderResult = await render(); const detailsTab = renderResult.getByTestId('endpoint-details-flyout-tab-details'); const activityLogTab = renderResult.queryByTestId( 'endpoint-details-flyout-tab-activity_log' @@ -774,7 +747,7 @@ describe('when on the endpoint list page', () => { history.push(`${MANAGEMENT_PATH}/endpoints?selected_endpoint=1&show=activity_log`); }); - const renderResult = await renderAndWaitForData(); + const renderResult = await render(); const detailsTab = renderResult.getByTestId('endpoint-details-flyout-tab-details'); const activityLogTab = renderResult.queryByTestId( 'endpoint-details-flyout-tab-activity_log' @@ -796,17 +769,13 @@ describe('when on the endpoint list page', () => { } throw new Error(`POST to '${requestOptions.path}' does not have a mock response!`); }); - renderResult = await renderAndWaitForData(); + renderResult = await render(); const policyStatusLink = await renderResult.findByTestId('policyStatusValue'); const userChangedUrlChecker = middlewareSpy.waitForAction('userChangedUrl'); reactTestingLibrary.act(() => { reactTestingLibrary.fireEvent.click(policyStatusLink); }); await userChangedUrlChecker; - await middlewareSpy.waitForAction('serverReturnedEndpointPolicyResponse'); - reactTestingLibrary.act(() => { - dispatchServerReturnedEndpointPolicyResponse(); - }); }); afterEach(reactTestingLibrary.cleanup); @@ -876,7 +845,7 @@ describe('when on the endpoint list page', () => { reactTestingLibrary.act(() => { history.push(`${MANAGEMENT_PATH}/endpoints?selected_endpoint=1&show=isolate`); }); - renderResult = await renderAndWaitForData(); + renderResult = render(); // Need to reset `http.post` and adjust it so that the mock for http host // isolation api does not output error noise to the console coreStart.http.post.mockReset(); @@ -1254,6 +1223,7 @@ describe('when on the endpoint list page', () => { expect(banner).toHaveTextContent(transforms[1].id); }); }); + describe('endpoint list onboarding screens with RBAC', () => { beforeEach(() => { setEndpointListApiMockImplementation(coreStart.http, { @@ -1314,6 +1284,7 @@ describe('when on the endpoint list page', () => { expect(startButton).toBeNull(); }); }); + describe('endpoint list take action with RBAC controls', () => { let renderResult: ReturnType; diff --git a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx index b0d02c5949ca3..0bd26b0dddd34 100644 --- a/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx +++ b/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/view/index.tsx @@ -5,20 +5,20 @@ * 2.0. */ -import React, { useMemo, useCallback, memo, useEffect, useState } from 'react'; +import React, { type CSSProperties, useCallback, useMemo } from 'react'; import styled from 'styled-components'; -import type { EuiBasicTableColumn, EuiSelectableProps } from '@elastic/eui'; import { - EuiHorizontalRule, EuiBasicTable, - EuiText, - EuiLink, - EuiHealth, - EuiToolTip, - EuiSuperDatePicker, - EuiSpacer, + type EuiBasicTableColumn, EuiFlexGroup, EuiFlexItem, + EuiHealth, + EuiHorizontalRule, + type EuiSelectableProps, + EuiSpacer, + EuiSuperDatePicker, + EuiText, + EuiToolTip, } from '@elastic/eui'; import { useHistory, useLocation } from 'react-router-dom'; import { i18n } from '@kbn/i18n'; @@ -26,85 +26,285 @@ import { FormattedMessage } from '@kbn/i18n-react'; import { createStructuredSelector } from 'reselect'; import { useDispatch } from 'react-redux'; import type { - CreatePackagePolicyRouteState, AgentPolicyDetailsDeployAgentAction, + CreatePackagePolicyRouteState, } from '@kbn/fleet-plugin/public'; +import { TransformFailedCallout } from './components/transform_failed_callout'; +import type { EndpointIndexUIQueryParams } from '../types'; +import { EndpointListNavLink } from './components/endpoint_list_nav_link'; import { EndpointAgentStatus } from '../../../../common/components/endpoint/endpoint_agent_status'; import { EndpointDetailsFlyout } from './details'; import * as selectors from '../store/selectors'; +import { getEndpointPendingActionsCallback } from '../store/selectors'; import { useEndpointSelector } from './hooks'; import { isPolicyOutOfDate } from '../utils'; import { POLICY_STATUS_TO_HEALTH_COLOR, POLICY_STATUS_TO_TEXT } from './host_constants'; -import { useNavigateByRouterEventHandler } from '../../../../common/hooks/endpoint/use_navigate_by_router_event_handler'; import type { CreateStructuredSelector } from '../../../../common/store'; import type { - Immutable, HostInfo, + Immutable, PolicyDetailsRouteState, } from '../../../../../common/endpoint/types'; import { DEFAULT_POLL_INTERVAL, MANAGEMENT_PAGE_SIZE_OPTIONS } from '../../../common/constants'; -import { PolicyEmptyState, HostsEmptyState } from '../../../components/management_empty_state'; +import { HostsEmptyState, PolicyEmptyState } from '../../../components/management_empty_state'; import { FormattedDate } from '../../../../common/components/formatted_date'; import { useNavigateToAppEventHandler } from '../../../../common/hooks/endpoint/use_navigate_to_app_event_handler'; import { EndpointPolicyLink } from '../../../components/endpoint_policy_link'; import { SecurityPageName } from '../../../../app/types'; -import { - getEndpointListPath, - getEndpointDetailsPath, - getPoliciesPath, -} from '../../../common/routing'; +import { getEndpointDetailsPath, getEndpointListPath } from '../../../common/routing'; import { useFormatUrl } from '../../../../common/components/link_to'; import { useAppUrl } from '../../../../common/lib/kibana/hooks'; import type { EndpointAction } from '../store/action'; import { OutOfDate } from './components/out_of_date'; import { AdminSearchBar } from './components/search_bar'; import { AdministrationListPage } from '../../../components/administration_list_page'; -import { LinkToApp } from '../../../../common/components/endpoint/link_to_app'; import { TableRowActions } from './components/table_row_actions'; -import { CallOut } from '../../../../common/components/callouts'; -import { metadataTransformPrefix } from '../../../../../common/endpoint/constants'; -import { WARNING_TRANSFORM_STATES, APP_UI_ID } from '../../../../../common/constants'; -import type { BackToExternalAppButtonProps } from '../../../components/back_to_external_app_button/back_to_external_app_button'; -import { BackToExternalAppButton } from '../../../components/back_to_external_app_button/back_to_external_app_button'; +import { APP_UI_ID } from '../../../../../common/constants'; import { ManagementEmptyStateWrapper } from '../../../components/management_empty_state_wrapper'; import { useUserPrivileges } from '../../../../common/components/user_privileges'; -import { useKibana } from '../../../../common/lib/kibana'; -import { getEndpointPendingActionsCallback } from '../store/selectors'; +import { BackToPolicyListButton } from './components/back_to_policy_list_button'; + const MAX_PAGINATED_ITEM = 9999; -const TRANSFORM_URL = '/data/transform'; const StyledDatePicker = styled.div` .euiFormControlLayout--group { background-color: rgba(0, 119, 204, 0.2); } `; -const EndpointListNavLink = memo<{ - name: string; - href: string; - route: string; - dataTestSubj: string; -}>(({ name, href, route, dataTestSubj }) => { - const clickHandler = useNavigateByRouterEventHandler(route); - return ( - // eslint-disable-next-line @elastic/eui/href-or-on-click - - {name} - - ); -}); -EndpointListNavLink.displayName = 'EndpointListNavLink'; +interface GetEndpointListColumnsProps { + canReadPolicyManagement: boolean; + backToEndpointList: PolicyDetailsRouteState['backLink']; + getHostPendingActions: ReturnType; + queryParams: Immutable; + search: string; + getAppUrl: ReturnType['getAppUrl']; +} + +const getEndpointListColumns = ({ + canReadPolicyManagement, + backToEndpointList, + getHostPendingActions, + queryParams, + search, + getAppUrl, +}: GetEndpointListColumnsProps): Array>> => { + const lastActiveColumnName = i18n.translate('xpack.securitySolution.endpoint.list.lastActive', { + defaultMessage: 'Last active', + }); + const padLeft: CSSProperties = { paddingLeft: '6px' }; + + return [ + { + field: 'metadata', + width: '15%', + name: i18n.translate('xpack.securitySolution.endpoint.list.hostname', { + defaultMessage: 'Endpoint', + }), + render: ({ host: { hostname }, agent: { id } }: HostInfo['metadata']) => { + const toRoutePath = getEndpointDetailsPath( + { + ...queryParams, + name: 'endpointDetails', + selected_endpoint: id, + }, + search + ); + const toRouteUrl = getAppUrl({ path: toRoutePath }); + return ( + + + + ); + }, + }, + { + field: 'host_status', + width: '14%', + name: i18n.translate('xpack.securitySolution.endpoint.list.hostStatus', { + defaultMessage: 'Agent status', + }), + render: (hostStatus: HostInfo['host_status'], endpointInfo) => { + return ( + + ); + }, + }, + { + field: 'metadata.Endpoint.policy.applied', + width: '15%', + name: i18n.translate('xpack.securitySolution.endpoint.list.policy', { + defaultMessage: 'Policy', + }), + truncateText: true, + render: (policy: HostInfo['metadata']['Endpoint']['policy']['applied'], item: HostInfo) => { + return ( + <> + + {canReadPolicyManagement ? ( + + {policy.name} + + ) : ( + <>{policy.name} + )} + + {policy.endpoint_policy_version && ( + + + + )} + {isPolicyOutOfDate(policy, item.policy_info) && ( + + )} + + ); + }, + }, + { + field: 'metadata.Endpoint.policy.applied', + width: '9%', + name: i18n.translate('xpack.securitySolution.endpoint.list.policyStatus', { + defaultMessage: 'Policy status', + }), + render: (policy: HostInfo['metadata']['Endpoint']['policy']['applied'], item: HostInfo) => { + const toRoutePath = getEndpointDetailsPath({ + name: 'endpointPolicyResponse', + ...queryParams, + selected_endpoint: item.metadata.agent.id, + }); + const toRouteUrl = getAppUrl({ path: toRoutePath }); + return ( + + + + + + ); + }, + }, + { + field: 'metadata.host.os.name', + width: '9%', + name: i18n.translate('xpack.securitySolution.endpoint.list.os', { + defaultMessage: 'OS', + }), + render: (os: string) => { + return ( + + +

    {os}

    +
    +
    + ); + }, + }, + { + field: 'metadata.host.ip', + width: '12%', + name: i18n.translate('xpack.securitySolution.endpoint.list.ip', { + defaultMessage: 'IP address', + }), + render: (ip: string[]) => { + return ( + + +

    + {ip.toString().replace(',', ', ')} +

    +
    +
    + ); + }, + }, + { + field: 'metadata.agent.version', + width: '9%', + name: i18n.translate('xpack.securitySolution.endpoint.list.endpointVersion', { + defaultMessage: 'Version', + }), + render: (version: string) => { + return ( + + +

    {version}

    +
    +
    + ); + }, + }, + { + field: 'metadata.@timestamp', + name: lastActiveColumnName, + width: '9%', + render(dateValue: HostInfo['metadata']['@timestamp']) { + return ( + + ); + }, + }, + { + field: '', + width: '8%', + name: i18n.translate('xpack.securitySolution.endpoint.list.actions', { + defaultMessage: 'Actions', + }), + actions: [ + { + render: (item: HostInfo) => { + return ; + }, + }, + ], + }, + ]; +}; // FIXME: this needs refactoring - we are pulling in all selectors from endpoint, which includes many more than what the list uses const selector = (createStructuredSelector as CreateStructuredSelector)(selectors); + export const EndpointList = () => { const history = useHistory(); - const { services } = useKibana(); const { listData, pageIndex, @@ -133,65 +333,30 @@ export const EndpointList = () => { } = useUserPrivileges().endpointPrivileges; const { search } = useFormatUrl(SecurityPageName.administration); const { search: searchParams } = useLocation(); + const { state: routeState = {} } = useLocation(); const { getAppUrl } = useAppUrl(); const dispatch = useDispatch<(a: EndpointAction) => void>(); // cap ability to page at 10k records. (max_result_window) const maxPageCount = totalItemCount > MAX_PAGINATED_ITEM ? MAX_PAGINATED_ITEM : totalItemCount; - const [showTransformFailedCallout, setShowTransformFailedCallout] = useState(false); - const [shouldCheckTransforms, setShouldCheckTransforms] = useState(true); - - const { state: routeState = {} } = useLocation(); - - const backLinkOptions = useMemo(() => { - if (routeState?.backLink) { - return { - onBackButtonNavigateTo: routeState.backLink.navigateTo, - backButtonLabel: routeState.backLink.label, - backButtonUrl: routeState.backLink.href, - }; - } - // default back button is to the policy list - const policyListPath = getPoliciesPath(); + const hasPolicyData = useMemo(() => policyItems && policyItems.length > 0, [policyItems]); + const hasListData = useMemo(() => listData && listData.length > 0, [listData]); - return { - backButtonLabel: i18n.translate('xpack.securitySolution.endpoint.list.backToPolicyButton', { - defaultMessage: 'Back to policy list', - }), - backButtonUrl: getAppUrl({ path: policyListPath }), - onBackButtonNavigateTo: [ - APP_UI_ID, - { - path: policyListPath, - }, - ], - }; - }, [getAppUrl, routeState?.backLink]); - - const backToPolicyList = ( - - ); - - useEffect(() => { - // if no endpoint policy, skip transform check - if (!shouldCheckTransforms || !policyItems || !policyItems.length) { - return; - } + const refreshStyle = useMemo(() => { + return { display: endpointsExist ? 'flex' : 'none', maxWidth: 200 }; + }, [endpointsExist]); - dispatch({ type: 'loadMetadataTransformStats' }); - setShouldCheckTransforms(false); - }, [policyItems, shouldCheckTransforms, dispatch]); + const refreshIsPaused = useMemo(() => { + return !endpointsExist ? false : hasSelectedEndpoint ? true : !isAutoRefreshEnabled; + }, [endpointsExist, hasSelectedEndpoint, isAutoRefreshEnabled]); - useEffect(() => { - const hasFailure = metadataTransformStats.some((transform) => - WARNING_TRANSFORM_STATES.has(transform?.state) - ); - setShowTransformFailedCallout(hasFailure); - }, [metadataTransformStats]); + const refreshInterval = useMemo(() => { + return !endpointsExist ? DEFAULT_POLL_INTERVAL : autoRefreshInterval; + }, [endpointsExist, autoRefreshInterval]); - const closeTransformFailedCallout = useCallback(() => { - setShowTransformFailedCallout(false); - }, []); + const shouldShowKQLBar = useMemo(() => { + return endpointsExist && !patternsError; + }, [endpointsExist, patternsError]); const paginationSetup = useMemo(() => { return { @@ -279,9 +444,8 @@ export const EndpointList = () => { [dispatch] ); - const NOOP = useCallback(() => {}, []); - - const PAD_LEFT: React.CSSProperties = useMemo(() => ({ paddingLeft: '6px' }), []); + // Used for an auto-refresh super date picker version without any date/time selection + const onTimeChange = useCallback(() => {}, []); const handleDeployEndpointsClick = useNavigateToAppEventHandler('fleet', { @@ -291,16 +455,6 @@ export const EndpointList = () => { }, }); - const selectionOptions = useMemo(() => { - return policyItems.map((item) => { - return { - key: item.policy_id, - label: item.name, - checked: selectedPolicyId === item.policy_id ? 'on' : undefined, - }; - }); - }, [policyItems, selectedPolicyId]); - const handleSelectableOnChange = useCallback<(o: EuiSelectableProps['options']) => void>( (changedOptions) => { return changedOptions.some((option) => { @@ -326,227 +480,25 @@ export const EndpointList = () => { }; }, []); - const columns: Array>> = useMemo(() => { - const lastActiveColumnName = i18n.translate('xpack.securitySolution.endpoint.list.lastActive', { - defaultMessage: 'Last active', - }); - - return [ - { - field: 'metadata', - width: '15%', - name: i18n.translate('xpack.securitySolution.endpoint.list.hostname', { - defaultMessage: 'Endpoint', - }), - render: ({ host: { hostname }, agent: { id } }: HostInfo['metadata']) => { - const toRoutePath = getEndpointDetailsPath( - { - ...queryParams, - name: 'endpointDetails', - selected_endpoint: id, - }, - search - ); - const toRouteUrl = getAppUrl({ path: toRoutePath }); - return ( - - - - ); - }, - }, - { - field: 'host_status', - width: '14%', - name: i18n.translate('xpack.securitySolution.endpoint.list.hostStatus', { - defaultMessage: 'Agent status', - }), - render: (hostStatus: HostInfo['host_status'], endpointInfo) => { - return ( - - ); - }, - }, - { - field: 'metadata.Endpoint.policy.applied', - width: '15%', - name: i18n.translate('xpack.securitySolution.endpoint.list.policy', { - defaultMessage: 'Policy', - }), - truncateText: true, - render: (policy: HostInfo['metadata']['Endpoint']['policy']['applied'], item: HostInfo) => { - return ( - <> - - {canReadPolicyManagement ? ( - - {policy.name} - - ) : ( - <>{policy.name} - )} - - {policy.endpoint_policy_version && ( - - - - )} - {isPolicyOutOfDate(policy, item.policy_info) && ( - - )} - - ); - }, - }, - { - field: 'metadata.Endpoint.policy.applied', - width: '9%', - name: i18n.translate('xpack.securitySolution.endpoint.list.policyStatus', { - defaultMessage: 'Policy status', - }), - render: (policy: HostInfo['metadata']['Endpoint']['policy']['applied'], item: HostInfo) => { - const toRoutePath = getEndpointDetailsPath({ - name: 'endpointPolicyResponse', - ...queryParams, - selected_endpoint: item.metadata.agent.id, - }); - const toRouteUrl = getAppUrl({ path: toRoutePath }); - return ( - - - - - - ); - }, - }, - { - field: 'metadata.host.os.name', - width: '9%', - name: i18n.translate('xpack.securitySolution.endpoint.list.os', { - defaultMessage: 'OS', - }), - render: (os: string) => { - return ( - - -

    {os}

    -
    -
    - ); - }, - }, - { - field: 'metadata.host.ip', - width: '12%', - name: i18n.translate('xpack.securitySolution.endpoint.list.ip', { - defaultMessage: 'IP address', - }), - render: (ip: string[]) => { - return ( - - -

    - {ip.toString().replace(',', ', ')} -

    -
    -
    - ); - }, - }, - { - field: 'metadata.agent.version', - width: '9%', - name: i18n.translate('xpack.securitySolution.endpoint.list.endpointVersion', { - defaultMessage: 'Version', - }), - render: (version: string) => { - return ( - - -

    {version}

    -
    -
    - ); - }, - }, - { - field: 'metadata.@timestamp', - name: lastActiveColumnName, - width: '9%', - render(dateValue: HostInfo['metadata']['@timestamp']) { - return ( - - ); - }, - }, - { - field: '', - width: '8%', - name: i18n.translate('xpack.securitySolution.endpoint.list.actions', { - defaultMessage: 'Actions', - }), - actions: [ - { - render: (item: HostInfo) => { - return ; - }, - }, - ], - }, - ]; - }, [ - queryParams, - search, - getAppUrl, - getHostPendingActions, - canReadPolicyManagement, - backToEndpointList, - PAD_LEFT, - ]); + const columns = useMemo( + () => + getEndpointListColumns({ + canReadPolicyManagement, + backToEndpointList, + getAppUrl, + getHostPendingActions, + queryParams, + search, + }), + [ + backToEndpointList, + canReadPolicyManagement, + getAppUrl, + getHostPendingActions, + queryParams, + search, + ] + ); const renderTableOrEmptyState = useMemo(() => { if (endpointsExist) { @@ -568,12 +520,19 @@ export const EndpointList = () => { ); - } else if (!policyItemsLoading && policyItems && policyItems.length > 0) { + } else if (!policyItemsLoading && hasPolicyData) { + const selectionOptions: EuiSelectableProps['options'] = policyItems.map((item) => { + return { + key: item.policy_id, + label: item.name, + checked: selectedPolicyId === item.policy_id ? 'on' : undefined, + }; + }); return ( @@ -586,118 +545,26 @@ export const EndpointList = () => { ); } }, [ + canAccessFleet, + canReadEndpointList, + columns, endpointsExist, - policyItemsLoading, - policyItems, + endpointPrivilegesLoading, + handleCreatePolicyClick, + handleDeployEndpointsClick, + handleSelectableOnChange, + hasPolicyData, listData, - columns, listError?.message, - paginationSetup, - onTableChange, loading, - setTableRowProps, - handleDeployEndpointsClick, + onTableChange, + paginationSetup, + policyItemsLoading, + policyItems, selectedPolicyId, - handleSelectableOnChange, - selectionOptions, - handleCreatePolicyClick, - canAccessFleet, - canReadEndpointList, - endpointPrivilegesLoading, + setTableRowProps, ]); - const hasListData = listData && listData.length > 0; - - const refreshStyle = useMemo(() => { - return { display: endpointsExist ? 'flex' : 'none', maxWidth: 200 }; - }, [endpointsExist]); - - const refreshIsPaused = useMemo(() => { - return !endpointsExist ? false : hasSelectedEndpoint ? true : !isAutoRefreshEnabled; - }, [endpointsExist, hasSelectedEndpoint, isAutoRefreshEnabled]); - - const refreshInterval = useMemo(() => { - return !endpointsExist ? DEFAULT_POLL_INTERVAL : autoRefreshInterval; - }, [endpointsExist, autoRefreshInterval]); - - const shouldShowKQLBar = useMemo(() => { - return endpointsExist && !patternsError; - }, [endpointsExist, patternsError]); - - const transformFailedCalloutDescription = useMemo(() => { - const failingTransformIds = metadataTransformStats - .filter((transformStat) => WARNING_TRANSFORM_STATES.has(transformStat.state)) - .map((transformStat) => transformStat.id) - .join(', '); - - return ( - <> - - - - ), - docsPage: ( - - - - ), - }} - /> - - - ); - }, [metadataTransformStats, services.docLinks.links.endpoints.troubleshooting]); - - const transformFailedCallout = useMemo(() => { - if (!showTransformFailedCallout) { - return; - } - - return ( - <> - - - - ); - }, [showTransformFailedCallout, closeTransformFailedCallout, transformFailedCalloutDescription]); - return ( { defaultMessage="Hosts running Elastic Defend" /> } - headerBackComponent={routeState.backLink && backToPolicyList} + headerBackComponent={} > {hasSelectedEndpoint && } <> - {transformFailedCallout} + {shouldShowKQLBar && ( @@ -729,7 +599,7 @@ export const EndpointList = () => { { diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/perform_rule_upgrade/perform_rule_upgrade_route.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/perform_rule_upgrade/perform_rule_upgrade_route.ts index 47f90cf5fb427..6197127e9d923 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/perform_rule_upgrade/perform_rule_upgrade_route.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules/api/perform_rule_upgrade/perform_rule_upgrade_route.ts @@ -39,7 +39,7 @@ export const performRuleUpgradeRoute = (router: SecuritySolutionPluginRouter) => body: buildRouteValidation(PerformRuleUpgradeRequestBody), }, options: { - tags: ['access:securitySolution'], + tags: ['access:securitySolution-all'], }, }, async (context, request, response) => { diff --git a/x-pack/plugins/serverless_search/jest.sh b/x-pack/plugins/serverless_search/jest.sh new file mode 100755 index 0000000000000..b51ce6bc18fe9 --- /dev/null +++ b/x-pack/plugins/serverless_search/jest.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +TZ="Etc/UTC" yarn test:jest -c "$(dirname "${BASH_SOURCE[0]}")/jest.config.js" diff --git a/x-pack/plugins/serverless_search/public/application/components/overview.test.tsx b/x-pack/plugins/serverless_search/public/application/components/overview.test.tsx new file mode 100644 index 0000000000000..971025125ab94 --- /dev/null +++ b/x-pack/plugins/serverless_search/public/application/components/overview.test.tsx @@ -0,0 +1,58 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import React from 'react'; +import { render, core } from '../../test/test_utils'; +import { ElasticsearchOverview as Overview } from './overview'; + +describe('', () => { + beforeEach(() => { + core.http.fetch.mockResolvedValueOnce({ apiKeys: [] }); + }); + + test('renders without throwing an error', () => { + const wrapper = render(); + expect(wrapper).toBeDefined(); + }); + + test('getting started', () => { + const { getByRole } = render(); + expect(getByRole('heading', { name: 'Get started with Elasticsearch' })).toBeDefined(); + }); + + test('select client', () => { + const { getByRole } = render(); + expect(getByRole('heading', { name: 'Select your client' })).toBeDefined(); + }); + test('install client', () => { + const { getByRole } = render(); + expect(getByRole('heading', { name: 'Install a client' })).toBeDefined(); + }); + test('api key', () => { + const { getByRole } = render(); + expect(getByRole('heading', { name: 'Store your API key and Cloud ID' })).toBeDefined(); + }); + test('configure client', () => { + const { getByRole } = render(); + expect(getByRole('heading', { name: 'Configure your client' })).toBeDefined(); + }); + test('test connection', () => { + const { getByRole } = render(); + expect(getByRole('heading', { name: 'Test your connection' })).toBeDefined(); + }); + test('ingest data', () => { + const { getByRole } = render(); + expect(getByRole('heading', { name: 'Ingest data' })).toBeDefined(); + }); + test('build query', () => { + const { getByRole } = render(); + expect(getByRole('heading', { name: 'Build your first search query' })).toBeDefined(); + }); + test("what's next?", () => { + const { getByRole } = render(); + expect(getByRole('heading', { name: "What's next?" })).toBeDefined(); + }); +}); diff --git a/x-pack/plugins/serverless_search/public/test/test_utils.tsx b/x-pack/plugins/serverless_search/public/test/test_utils.tsx new file mode 100644 index 0000000000000..9139180015e2d --- /dev/null +++ b/x-pack/plugins/serverless_search/public/test/test_utils.tsx @@ -0,0 +1,48 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { ReactElement } from 'react'; +import { render, RenderOptions } from '@testing-library/react'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { KibanaContextProvider, KibanaThemeProvider } from '@kbn/kibana-react-plugin/public'; +import { I18nProvider } from '@kbn/i18n-react'; + +import { coreMock } from '@kbn/core/public/mocks'; +import { cloudMock } from '@kbn/cloud-plugin/public/mocks'; +import { sharePluginMock } from '@kbn/share-plugin/public/mocks'; +import { userProfileMock } from '@kbn/security-plugin/common/model/user_profile.mock'; + +export const core = coreMock.createStart(); +export const services = { + cloud: cloudMock.createStart(), + share: sharePluginMock.createStartContract(), + userProfile: userProfileMock.createWithSecurity(), +}; + +const queryClient = new QueryClient({ + defaultOptions: { + queries: { cacheTime: Infinity, retry: false }, + }, +}); + +const AllTheProviders: React.FC = ({ children }) => { + return ( + + + + {children} + + + + ); +}; + +const customRender = (ui: ReactElement, options: Omit = {}) => + render(ui, { wrapper: AllTheProviders, ...options }); + +export * from '@testing-library/react'; +export { customRender as render }; diff --git a/x-pack/plugins/transform/public/app/hooks/use_index_data.ts b/x-pack/plugins/transform/public/app/hooks/use_index_data.ts index e3de879dfc40e..7b6911636c600 100644 --- a/x-pack/plugins/transform/public/app/hooks/use_index_data.ts +++ b/x-pack/plugins/transform/public/app/hooks/use_index_data.ts @@ -86,6 +86,9 @@ export const useIndexData = ( }; useEffect(() => { + if (dataView.timeFieldName !== undefined && timeRangeMs === undefined) { + return; + } const abortController = new AbortController(); // Fetch 500 random documents to determine populated fields. @@ -197,6 +200,9 @@ export const useIndexData = ( }, [JSON.stringify([query, timeRangeMs])]); useEffect(() => { + if (typeof dataViewFields === 'undefined') { + return; + } const abortController = new AbortController(); const fetchDataGridData = async function () { diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index d900cf26974f3..6f4874420f88d 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -2345,20 +2345,14 @@ "discover.embeddable.inspectorRequestDescription": "Cette requête interroge Elasticsearch afin de récupérer les données pour la recherche.", "discover.embeddable.search.displayName": "rechercher", "discover.errorCalloutShowErrorMessage": "Afficher les détails", - "discover.fieldChooser.addField.label": "Ajouter un champ", "discover.fieldChooser.availableFieldsTooltip": "Champs disponibles pour l'affichage dans le tableau.", "discover.fieldChooser.discoverField.actions": "Actions", "discover.fieldChooser.discoverField.addFieldTooltip": "Ajouter le champ en tant que colonne", "discover.fieldChooser.discoverField.multiField": "champ multiple", - "discover.fieldChooser.discoverField.multiFields": "Champs multiples", "discover.fieldChooser.discoverField.multiFieldTooltipContent": "Les champs multiples peuvent avoir plusieurs valeurs.", "discover.fieldChooser.discoverField.name": "Champ", "discover.fieldChooser.discoverField.removeFieldTooltip": "Supprimer le champ du tableau", "discover.fieldChooser.discoverField.value": "Valeur", - "discover.fieldChooser.fieldsMobileButtonLabel": "Champs", - "discover.fieldChooser.filter.indexAndFieldsSectionAriaLabel": "Index et champs", - "discover.fieldList.flyoutBackIcon": "Retour", - "discover.fieldList.flyoutHeading": "Liste des champs", "discover.goToDiscoverButtonText": "Aller à Discover", "discover.grid.closePopover": "Fermer la fenêtre contextuelle", "discover.grid.copyCellValueButton": "Copier la valeur", @@ -13365,7 +13359,6 @@ "xpack.enterpriseSearch.content.overview.generateApiKeyModal.learnMore": "En savoir plus sur les clés d’API", "xpack.enterpriseSearch.content.overview.generateApiKeyModal.title": "Générer une clé d’API", "xpack.enterpriseSearch.content.overview.optimizedRequest.label": "Afficher la requête optimisée d'Enterprise Search", - "xpack.enterpriseSearch.content.productName": "Enterprise Search", "xpack.enterpriseSearch.searchApplications.searchApplication.connect.pageTitle": "Connecter", "xpack.enterpriseSearch.searchApplications.searchApplication.content.indicesTabTitle": "Index", "xpack.enterpriseSearch.searchApplications.searchApplication.content.pageTitle": "Contenu", @@ -13854,7 +13847,6 @@ "xpack.enterpriseSearch.nav.searchApplicationsTitle": "Applications de recherche", "xpack.enterpriseSearch.nav.searchExperiencesTitle": "Expériences de recherche", "xpack.enterpriseSearch.nav.searchIndicesTitle": "Index", - "xpack.enterpriseSearch.nav.standaloneExperiencesTitle": "Expériences autonomes", "xpack.enterpriseSearch.nav.workplaceSearchTitle": "Workplace Search", "xpack.enterpriseSearch.notFound.action1": "Retour à votre tableau de bord", "xpack.enterpriseSearch.notFound.action2": "Contacter le support technique", @@ -13926,7 +13918,6 @@ "xpack.enterpriseSearch.overview.insufficientPermissionsTitle": "Permissions insuffisantes", "xpack.enterpriseSearch.overview.navTitle": "Aperçu", "xpack.enterpriseSearch.overview.pageTitle": "Bienvenue dans Enterprise Search", - "xpack.enterpriseSearch.overview.productName": "Enterprise Search", "xpack.enterpriseSearch.overview.productSelector.title": "Des expériences de recherche pour chaque cas d'utilisation", "xpack.enterpriseSearch.overview.searchIndices.image.altText": "Illustration d'index de recherche", "xpack.enterpriseSearch.overview.setupCta.description": "Ajoutez des fonctions de recherche à votre application ou à votre organisation interne avec Elastic App Search et Workplace Search. Regardez la vidéo pour savoir ce qu'il est possible de faire lorsque la recherche est facilitée.", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 8b497d23d42ba..3b675fdea8903 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -2345,20 +2345,14 @@ "discover.embeddable.inspectorRequestDescription": "このリクエストはElasticsearchにクエリをかけ、検索データを取得します。", "discover.embeddable.search.displayName": "検索", "discover.errorCalloutShowErrorMessage": "詳細を表示", - "discover.fieldChooser.addField.label": "フィールドを追加", "discover.fieldChooser.availableFieldsTooltip": "フィールドをテーブルに表示できます。", "discover.fieldChooser.discoverField.actions": "アクション", "discover.fieldChooser.discoverField.addFieldTooltip": "フィールドを列として追加", "discover.fieldChooser.discoverField.multiField": "複数フィールド", - "discover.fieldChooser.discoverField.multiFields": "マルチフィールド", "discover.fieldChooser.discoverField.multiFieldTooltipContent": "複数フィールドにはフィールドごとに複数の値を入力できます", "discover.fieldChooser.discoverField.name": "フィールド", "discover.fieldChooser.discoverField.removeFieldTooltip": "フィールドを表から削除", "discover.fieldChooser.discoverField.value": "値", - "discover.fieldChooser.fieldsMobileButtonLabel": "フィールド", - "discover.fieldChooser.filter.indexAndFieldsSectionAriaLabel": "インデックスとフィールド", - "discover.fieldList.flyoutBackIcon": "戻る", - "discover.fieldList.flyoutHeading": "フィールドリスト", "discover.goToDiscoverButtonText": "Discoverに移動", "discover.grid.closePopover": "ポップオーバーを閉じる", "discover.grid.copyCellValueButton": "値をコピー", @@ -13364,7 +13358,6 @@ "xpack.enterpriseSearch.content.overview.generateApiKeyModal.learnMore": "APIキーの詳細", "xpack.enterpriseSearch.content.overview.generateApiKeyModal.title": "APIキーを生成", "xpack.enterpriseSearch.content.overview.optimizedRequest.label": "エンタープライズ サーチで最適化されたリクエストを表示", - "xpack.enterpriseSearch.content.productName": "エンタープライズ サーチ", "xpack.enterpriseSearch.searchApplications.searchApplication.connect.pageTitle": "接続", "xpack.enterpriseSearch.searchApplications.searchApplication.content.indicesTabTitle": "インデックス", "xpack.enterpriseSearch.searchApplications.searchApplication.content.pageTitle": "コンテンツ", @@ -13853,7 +13846,6 @@ "xpack.enterpriseSearch.nav.searchApplicationsTitle": "検索アプリケーション", "xpack.enterpriseSearch.nav.searchExperiencesTitle": "検索エクスペリエンス", "xpack.enterpriseSearch.nav.searchIndicesTitle": "インデックス", - "xpack.enterpriseSearch.nav.standaloneExperiencesTitle": "スタンドアロン経験", "xpack.enterpriseSearch.nav.workplaceSearchTitle": "Workplace Search", "xpack.enterpriseSearch.notFound.action1": "ダッシュボードに戻す", "xpack.enterpriseSearch.notFound.action2": "サポートに問い合わせる", @@ -13925,7 +13917,6 @@ "xpack.enterpriseSearch.overview.insufficientPermissionsTitle": "パーミッションがありません", "xpack.enterpriseSearch.overview.navTitle": "概要", "xpack.enterpriseSearch.overview.pageTitle": "エンタープライズ サーチへようこそ", - "xpack.enterpriseSearch.overview.productName": "エンタープライズ サーチ", "xpack.enterpriseSearch.overview.productSelector.title": "すべてのユースケースの検索エクスペリエンス", "xpack.enterpriseSearch.overview.searchIndices.image.altText": "検索インデックスの例", "xpack.enterpriseSearch.overview.setupCta.description": "Elastic App Search および Workplace Search を使用して、アプリまたは社内組織に検索を追加できます。検索が簡単になるとどのような利点があるのかについては、動画をご覧ください。", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 228be68cd8498..941170838ef4c 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -2345,20 +2345,14 @@ "discover.embeddable.inspectorRequestDescription": "此请求将查询 Elasticsearch 以获取搜索的数据。", "discover.embeddable.search.displayName": "搜索", "discover.errorCalloutShowErrorMessage": "显示详情", - "discover.fieldChooser.addField.label": "添加字段", "discover.fieldChooser.availableFieldsTooltip": "适用于在表中显示的字段。", "discover.fieldChooser.discoverField.actions": "操作", "discover.fieldChooser.discoverField.addFieldTooltip": "将字段添加为列", "discover.fieldChooser.discoverField.multiField": "多字段", - "discover.fieldChooser.discoverField.multiFields": "多字段", "discover.fieldChooser.discoverField.multiFieldTooltipContent": "多字段的每个字段可以有多个值", "discover.fieldChooser.discoverField.name": "字段", "discover.fieldChooser.discoverField.removeFieldTooltip": "从表中移除字段", "discover.fieldChooser.discoverField.value": "值", - "discover.fieldChooser.fieldsMobileButtonLabel": "字段", - "discover.fieldChooser.filter.indexAndFieldsSectionAriaLabel": "索引和字段", - "discover.fieldList.flyoutBackIcon": "返回", - "discover.fieldList.flyoutHeading": "字段列表", "discover.goToDiscoverButtonText": "前往 Discover", "discover.grid.closePopover": "关闭弹出框", "discover.grid.copyCellValueButton": "复制值", @@ -13364,7 +13358,6 @@ "xpack.enterpriseSearch.content.overview.generateApiKeyModal.learnMore": "进一步了解 API 密钥", "xpack.enterpriseSearch.content.overview.generateApiKeyModal.title": "生成 API 密钥", "xpack.enterpriseSearch.content.overview.optimizedRequest.label": "查看 Enterprise Search 优化的请求", - "xpack.enterpriseSearch.content.productName": "Enterprise Search", "xpack.enterpriseSearch.searchApplications.searchApplication.connect.pageTitle": "连接", "xpack.enterpriseSearch.searchApplications.searchApplication.content.indicesTabTitle": "索引", "xpack.enterpriseSearch.searchApplications.searchApplication.content.pageTitle": "内容", @@ -13853,7 +13846,6 @@ "xpack.enterpriseSearch.nav.searchApplicationsTitle": "搜索应用程序", "xpack.enterpriseSearch.nav.searchExperiencesTitle": "搜索体验", "xpack.enterpriseSearch.nav.searchIndicesTitle": "索引", - "xpack.enterpriseSearch.nav.standaloneExperiencesTitle": "独立体验", "xpack.enterpriseSearch.nav.workplaceSearchTitle": "Workplace Search", "xpack.enterpriseSearch.notFound.action1": "返回到您的仪表板", "xpack.enterpriseSearch.notFound.action2": "联系支持人员", @@ -13925,7 +13917,6 @@ "xpack.enterpriseSearch.overview.insufficientPermissionsTitle": "权限不足", "xpack.enterpriseSearch.overview.navTitle": "概览", "xpack.enterpriseSearch.overview.pageTitle": "欢迎使用 Enterprise Search", - "xpack.enterpriseSearch.overview.productName": "Enterprise Search", "xpack.enterpriseSearch.overview.productSelector.title": "每个用例的搜索体验", "xpack.enterpriseSearch.overview.searchIndices.image.altText": "搜索索引图示", "xpack.enterpriseSearch.overview.setupCta.description": "通过 Elastic App Search 和 Workplace Search,将搜索添加到您的应用或内部组织中。观看视频,了解方便易用的搜索功能可以帮您做些什么。", diff --git a/x-pack/test/functional/apps/discover/visualize_field.ts b/x-pack/test/functional/apps/discover/visualize_field.ts index 22049dc351caa..236ceaffa1b5d 100644 --- a/x-pack/test/functional/apps/discover/visualize_field.ts +++ b/x-pack/test/functional/apps/discover/visualize_field.ts @@ -6,6 +6,7 @@ */ import expect from '@kbn/expect'; +import { DebugState } from '@elastic/charts'; import { WebElementWrapper } from '../../../../../test/functional/services/lib/web_element_wrapper'; import { FtrProviderContext } from '../../ftr_provider_context'; @@ -28,6 +29,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { 'header', 'unifiedFieldList', ]); + const elasticChart = getService('elasticChart'); const monacoEditor = getService('monacoEditor'); const defaultSettings = { @@ -38,6 +40,16 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { await PageObjects.timePicker.setDefaultAbsoluteRange(); } + function assertMatchesExpectedData(state: DebugState) { + expect(state.legend?.items.map(({ name }) => name).sort()).to.eql([ + 'css', + 'gif', + 'jpg', + 'php', + 'png', + ]); + } + describe('discover field visualize button', () => { before(async () => { await kibanaServer.uiSettings.replace(defaultSettings); @@ -147,7 +159,33 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { expect(await testSubjects.exists('partitionVisChart')).to.be(true); }); - it('should visualize correctly text based language queries in Lens', async () => { + it('should allow changing dimensions', async () => { + await elasticChart.setNewChartUiDebugFlag(true); + await PageObjects.discover.selectTextBaseLang('SQL'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await monacoEditor.setCodeEditorValue( + 'SELECT extension, AVG("bytes") as average FROM "logstash-*" GROUP BY extension' + ); + await testSubjects.click('querySubmitButton'); + await PageObjects.header.waitUntilLoadingHasFinished(); + + await PageObjects.discover.chooseLensChart('Bar vertical stacked'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await testSubjects.click('unifiedHistogramEditFlyoutVisualization'); + expect(await testSubjects.exists('xyVisChart')).to.be(true); + expect(await PageObjects.lens.canRemoveDimension('lnsXY_xDimensionPanel')).to.equal(true); + await PageObjects.lens.removeDimension('lnsXY_xDimensionPanel'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.lens.configureTextBasedLanguagesDimension({ + dimension: 'lnsXY_splitDimensionPanel > lns-empty-dimension', + field: 'extension', + }); + await PageObjects.header.waitUntilLoadingHasFinished(); + const data = await PageObjects.lens.getCurrentChartDebugStateForVizType('xyVisChart'); + assertMatchesExpectedData(data!); + }); + + it('should visualize correctly text based language queries in Lenss', async () => { await PageObjects.discover.selectTextBaseLang('SQL'); await PageObjects.header.waitUntilLoadingHasFinished(); await monacoEditor.setCodeEditorValue( @@ -185,7 +223,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { }); }); - it('should save correctly chart to dashboard', async () => { + it('should save and edit chart in the dashboard on the fly', async () => { await PageObjects.discover.selectTextBaseLang('SQL'); await PageObjects.header.waitUntilLoadingHasFinished(); await monacoEditor.setCodeEditorValue( @@ -193,12 +231,28 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { ); await testSubjects.click('querySubmitButton'); await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.discover.chooseLensChart('Bar vertical stacked'); await testSubjects.click('TextBasedLangEditor-expand'); await testSubjects.click('unifiedHistogramSaveVisualization'); await PageObjects.header.waitUntilLoadingHasFinished(); await PageObjects.lens.saveModal('TextBasedChart', false, false, false, 'new'); await testSubjects.existOrFail('embeddablePanelHeading-TextBasedChart'); + await elasticChart.setNewChartUiDebugFlag(true); + await PageObjects.header.waitUntilLoadingHasFinished(); + await testSubjects.click('embeddablePanelToggleMenuIcon'); + await testSubjects.click('embeddablePanelAction-ACTION_CONFIGURE_IN_LENS'); + await PageObjects.header.waitUntilLoadingHasFinished(); + expect(await PageObjects.lens.canRemoveDimension('lnsXY_xDimensionPanel')).to.equal(true); + await PageObjects.lens.removeDimension('lnsXY_xDimensionPanel'); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.lens.configureTextBasedLanguagesDimension({ + dimension: 'lnsXY_splitDimensionPanel > lns-empty-dimension', + field: 'extension', + }); + await PageObjects.header.waitUntilLoadingHasFinished(); + const data = await PageObjects.lens.getCurrentChartDebugStateForVizType('xyVisChart'); + assertMatchesExpectedData(data!); }); }); } diff --git a/x-pack/test/functional/apps/lens/group2/index.ts b/x-pack/test/functional/apps/lens/group2/index.ts index 18302745362ab..33266513323c9 100644 --- a/x-pack/test/functional/apps/lens/group2/index.ts +++ b/x-pack/test/functional/apps/lens/group2/index.ts @@ -59,7 +59,6 @@ export default ({ getService, loadTestFile, getPageObjects }: FtrProviderContext loadTestFile(require.resolve('./persistent_context')); // 1m loadTestFile(require.resolve('./table_dashboard')); // 3m 10s loadTestFile(require.resolve('./table')); // 1m 40s - loadTestFile(require.resolve('./text_based_languages')); // 3m 40s loadTestFile(require.resolve('./fields_list')); // 2m 7s loadTestFile(require.resolve('./layer_actions')); // 1m 45s loadTestFile(require.resolve('./field_formatters')); // 1m 30s diff --git a/x-pack/test/functional/apps/lens/group2/text_based_languages.ts b/x-pack/test/functional/apps/lens/group2/text_based_languages.ts deleted file mode 100644 index 506f9137834d4..0000000000000 --- a/x-pack/test/functional/apps/lens/group2/text_based_languages.ts +++ /dev/null @@ -1,235 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { DebugState } from '@elastic/charts'; -import expect from '@kbn/expect'; -import { FtrProviderContext } from '../../../ftr_provider_context'; - -export default function ({ getService, getPageObjects }: FtrProviderContext) { - const PageObjects = getPageObjects([ - 'visualize', - 'lens', - 'header', - 'unifiedSearch', - 'dashboard', - 'common', - ]); - const browser = getService('browser'); - const elasticChart = getService('elasticChart'); - const queryBar = getService('queryBar'); - const testSubjects = getService('testSubjects'); - const kibanaServer = getService('kibanaServer'); - const monacoEditor = getService('monacoEditor'); - - function assertMatchesExpectedData(state: DebugState) { - expect(state.axes?.x![0].labels.sort()).to.eql(['css', 'gif', 'jpg', 'php', 'png']); - } - - const defaultSettings = { - 'discover:enableSql': true, - defaultIndex: 'log*', - }; - - async function switchToTextBasedLanguage(language: string) { - await PageObjects.visualize.navigateToNewVisualization(); - await PageObjects.visualize.clickVisType('lens'); - await PageObjects.lens.goToTimeRange(); - await elasticChart.setNewChartUiDebugFlag(true); - await PageObjects.lens.switchToTextBasedLanguage(language); - await PageObjects.header.waitUntilLoadingHasFinished(); - } - - describe('lens text based language tests', () => { - before(async () => { - await kibanaServer.uiSettings.update(defaultSettings); - }); - - it('should navigate to text based languages mode correctly', async () => { - await switchToTextBasedLanguage('SQL'); - expect(await testSubjects.exists('showQueryBarMenu')).to.be(false); - expect(await testSubjects.exists('addFilter')).to.be(false); - await testSubjects.click('TextBasedLangEditor-expand'); - const textBasedQuery = await monacoEditor.getCodeEditorValue(); - expect(textBasedQuery).to.be('SELECT * FROM "log*"'); - await testSubjects.click('TextBasedLangEditor-minimize'); - }); - - it('should allow adding and using a field', async () => { - await monacoEditor.setCodeEditorValue( - 'SELECT extension, AVG("bytes") as average FROM "logstash-*" GROUP BY extension' - ); - await testSubjects.click('querySubmitButton'); - await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.lens.switchToVisualization('lnsMetric'); - await PageObjects.lens.configureTextBasedLanguagesDimension({ - dimension: 'lnsMetric_primaryMetricDimensionPanel > lns-empty-dimension', - field: 'average', - }); - - await PageObjects.lens.waitForVisualization('mtrVis'); - const metricData = await PageObjects.lens.getMetricVisualizationData(); - expect(metricData[0].title).to.eql('average'); - }); - - it('should allow switching to another chart', async () => { - await testSubjects.click('querySubmitButton'); - await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.lens.switchToVisualization('bar'); - await PageObjects.lens.configureTextBasedLanguagesDimension({ - dimension: 'lnsXY_xDimensionPanel > lns-empty-dimension', - field: 'extension', - }); - - await PageObjects.lens.configureTextBasedLanguagesDimension({ - dimension: 'lnsXY_yDimensionPanel > lns-empty-dimension', - field: 'average', - }); - - await PageObjects.lens.waitForVisualization('xyVisChart'); - const data = await PageObjects.lens.getCurrentChartDebugState('xyVisChart'); - assertMatchesExpectedData(data!); - }); - - it('should be possible to share a URL of a visualization with text-based language', async () => { - const url = await PageObjects.lens.getUrl('snapshot'); - await browser.openNewTab(); - - const [lensWindowHandler] = await browser.getAllWindowHandles(); - - await browser.navigateTo(url); - // check that it's the same configuration in the new URL when ready - await PageObjects.header.waitUntilLoadingHasFinished(); - expect( - await PageObjects.lens.getDimensionTriggerText('lnsXY_xDimensionPanel', 0, true) - ).to.eql('extension'); - expect( - await PageObjects.lens.getDimensionTriggerText('lnsXY_yDimensionPanel', 0, true) - ).to.eql('average'); - await browser.closeCurrentWindow(); - await browser.switchToWindow(lensWindowHandler); - }); - - it('should be possible to download a visualization with text-based language', async () => { - await PageObjects.lens.setCSVDownloadDebugFlag(true); - await PageObjects.lens.openCSVDownloadShare(); - - const csv = await PageObjects.lens.getCSVContent(); - expect(csv).to.be.ok(); - expect(Object.keys(csv!)).to.have.length(1); - await PageObjects.lens.setCSVDownloadDebugFlag(false); - }); - - it('should allow adding an text based languages chart to a dashboard', async () => { - await PageObjects.lens.switchToVisualization('lnsMetric'); - - await PageObjects.lens.waitForVisualization('mtrVis'); - await PageObjects.lens.removeDimension('lnsMetric_breakdownByDimensionPanel'); - await PageObjects.lens.waitForVisualization('mtrVis'); - const metricData = await PageObjects.lens.getMetricVisualizationData(); - expect(metricData[0].value).to.eql('5,699.406'); - expect(metricData[0].title).to.eql('average'); - await PageObjects.lens.save('New text based languages viz', false, false, false, 'new'); - - await PageObjects.dashboard.waitForRenderComplete(); - expect(metricData[0].value).to.eql('5,699.406'); - - const panelCount = await PageObjects.dashboard.getPanelCount(); - expect(panelCount).to.eql(1); - }); - - it('should allow saving the text based languages chart into a saved object', async () => { - await switchToTextBasedLanguage('SQL'); - await monacoEditor.setCodeEditorValue( - 'SELECT extension, AVG("bytes") as average FROM "logstash-*" GROUP BY extension' - ); - await testSubjects.click('querySubmitButton'); - await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.lens.configureTextBasedLanguagesDimension({ - dimension: 'lnsXY_xDimensionPanel > lns-empty-dimension', - field: 'extension', - }); - - await PageObjects.lens.configureTextBasedLanguagesDimension({ - dimension: 'lnsXY_yDimensionPanel > lns-empty-dimension', - field: 'average', - }); - await PageObjects.lens.waitForVisualization('xyVisChart'); - await PageObjects.lens.save('Lens with text based language'); - await PageObjects.lens.waitForVisualization('xyVisChart'); - const data = await PageObjects.lens.getCurrentChartDebugState('xyVisChart'); - assertMatchesExpectedData(data!); - }); - - it('should allow to return to the dataview mode', async () => { - await PageObjects.lens.switchDataPanelIndexPattern('logstash-*', true); - expect(await testSubjects.exists('addFilter')).to.be(true); - expect(await queryBar.getQueryString()).to.be(''); - }); - - it('should allow using an index pattern that is not translated to a dataview', async () => { - await switchToTextBasedLanguage('SQL'); - await testSubjects.click('TextBasedLangEditor-expand'); - await monacoEditor.setCodeEditorValue( - 'SELECT extension, AVG("bytes") as average FROM "logstash*" GROUP BY extension' - ); - await testSubjects.click('querySubmitButton'); - await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.lens.switchToVisualization('lnsMetric'); - await PageObjects.lens.configureTextBasedLanguagesDimension({ - dimension: 'lnsMetric_primaryMetricDimensionPanel > lns-empty-dimension', - field: 'average', - }); - - await PageObjects.lens.waitForVisualization('mtrVis'); - const metricData = await PageObjects.lens.getMetricVisualizationData(); - expect(metricData[0].title).to.eql('average'); - }); - - it('should be possible to share a URL of a visualization with text-based language that points to an index pattern', async () => { - // TODO: there's some state leakage in Lens when passing from a XY chart to new Metric chart - // which generates a wrong state (even tho it looks to work, starting fresh with such state breaks the editor) - await PageObjects.lens.removeLayer(); - await PageObjects.lens.switchToVisualization('bar'); - await PageObjects.header.waitUntilLoadingHasFinished(); - await PageObjects.lens.configureTextBasedLanguagesDimension({ - dimension: 'lnsXY_xDimensionPanel > lns-empty-dimension', - field: 'extension', - }); - - await PageObjects.lens.configureTextBasedLanguagesDimension({ - dimension: 'lnsXY_yDimensionPanel > lns-empty-dimension', - field: 'average', - }); - const url = await PageObjects.lens.getUrl('snapshot'); - await browser.openNewTab(); - - const [lensWindowHandler] = await browser.getAllWindowHandles(); - - await browser.navigateTo(url); - // check that it's the same configuration in the new URL when ready - await PageObjects.header.waitUntilLoadingHasFinished(); - expect( - await PageObjects.lens.getDimensionTriggerText('lnsXY_xDimensionPanel', 0, true) - ).to.eql('extension'); - expect( - await PageObjects.lens.getDimensionTriggerText('lnsXY_yDimensionPanel', 0, true) - ).to.eql('average'); - await browser.closeCurrentWindow(); - await browser.switchToWindow(lensWindowHandler); - }); - - it('should be possible to download a visualization with text-based language that points to an index pattern', async () => { - await PageObjects.lens.setCSVDownloadDebugFlag(true); - await PageObjects.lens.openCSVDownloadShare(); - - const csv = await PageObjects.lens.getCSVContent(); - expect(csv).to.be.ok(); - expect(Object.keys(csv!)).to.have.length(1); - await PageObjects.lens.setCSVDownloadDebugFlag(false); - }); - }); -} diff --git a/x-pack/test/functional/page_objects/lens_page.ts b/x-pack/test/functional/page_objects/lens_page.ts index b95a575537823..7f95964e0e5d4 100644 --- a/x-pack/test/functional/page_objects/lens_page.ts +++ b/x-pack/test/functional/page_objects/lens_page.ts @@ -1078,6 +1078,11 @@ export function LensPageProvider({ getService, getPageObjects }: FtrProviderCont return el.getVisibleText(); }, + async getCurrentChartDebugStateForVizType(visType: string) { + await this.waitForVisualization(visType); + return await elasticChart.getChartDebugData(visType); + }, + /** * Gets text of the specified datatable cell * @@ -1454,7 +1459,7 @@ export function LensPageProvider({ getService, getPageObjects }: FtrProviderCont } if (!opts.keepOpen) { - await this.closeDimensionEditor(); + await testSubjects.click('collapseFlyoutButton'); } }, diff --git a/x-pack/test/functional_with_es_ssl/apps/cases/group1/create_case_form.ts b/x-pack/test/functional_with_es_ssl/apps/cases/group1/create_case_form.ts index a5bf796105eea..55874757be096 100644 --- a/x-pack/test/functional_with_es_ssl/apps/cases/group1/create_case_form.ts +++ b/x-pack/test/functional_with_es_ssl/apps/cases/group1/create_case_form.ts @@ -82,7 +82,7 @@ export default ({ getService, getPageObject }: FtrProviderContext) => { const title = await find.byCssSelector('[data-test-subj="caseTitle"]'); expect(await title.getVisibleText()).contain( - 'The length of the name is too long. The maximum length is 160.' + 'The length of the name is too long. The maximum length is 160 characters.' ); const description = await testSubjects.find('caseDescription'); @@ -90,12 +90,12 @@ export default ({ getService, getPageObject }: FtrProviderContext) => { const tags = await testSubjects.find('caseTags'); expect(await tags.getVisibleText()).contain( - 'The length of the tag is too long. The maximum length is 256.' + 'The length of the tag is too long. The maximum length is 256 characters.' ); const category = await testSubjects.find('case-create-form-category'); expect(await category.getVisibleText()).contain( - 'The length of the category is too long. The maximum length is 50.' + 'The length of the category is too long. The maximum length is 50 characters.' ); }); diff --git a/x-pack/test/functional_with_es_ssl/apps/cases/group1/view_case.ts b/x-pack/test/functional_with_es_ssl/apps/cases/group1/view_case.ts index 94f9fc520ca17..72a7c3ac605c1 100644 --- a/x-pack/test/functional_with_es_ssl/apps/cases/group1/view_case.ts +++ b/x-pack/test/functional_with_es_ssl/apps/cases/group1/view_case.ts @@ -82,7 +82,7 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { const error = await find.byCssSelector('.euiFormErrorText'); expect(await error.getVisibleText()).equal( - 'The length of the title is too long. The maximum length is 160.' + 'The length of the title is too long. The maximum length is 160 characters.' ); await testSubjects.click('editable-title-cancel-btn'); @@ -135,7 +135,7 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { const error = await find.byCssSelector('.euiFormErrorText'); expect(await error.getVisibleText()).equal( - 'The length of the category is too long. The maximum length is 50.' + 'The length of the category is too long. The maximum length is 50 characters.' ); await testSubjects.click('edit-category-cancel'); @@ -167,7 +167,7 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { const error = await find.byCssSelector('.euiFormErrorText'); expect(await error.getVisibleText()).equal( - 'The length of the tag is too long. The maximum length is 256.' + 'The length of the tag is too long. The maximum length is 256 characters.' ); await testSubjects.click('edit-tags-cancel'); diff --git a/x-pack/test/screenshot_creation/apps/response_ops_docs/security_cases/list_view.ts b/x-pack/test/screenshot_creation/apps/response_ops_docs/security_cases/list_view.ts index ccae6535b01d7..d6156ef208ad6 100644 --- a/x-pack/test/screenshot_creation/apps/response_ops_docs/security_cases/list_view.ts +++ b/x-pack/test/screenshot_creation/apps/response_ops_docs/security_cases/list_view.ts @@ -7,12 +7,18 @@ import { CaseSeverity } from '@kbn/cases-plugin/common/api'; import { FtrProviderContext } from '../../../ftr_provider_context'; +import { createAndUploadFile } from '../../../../cases_api_integration/common/lib/api'; +import { SECURITY_SOLUTION_FILE_KIND } from '../../../../cases_api_integration/common/lib/constants'; export default function ({ getPageObject, getService, getPageObjects }: FtrProviderContext) { const cases = getService('cases'); const commonScreenshots = getService('commonScreenshots'); - const screenshotDirectories = ['response_ops_docs', 'security_cases']; const pageObjects = getPageObjects(['common', 'header']); + const screenshotDirectories = ['response_ops_docs', 'security_cases']; + const supertest = getService('supertest'); + const testSubjects = getService('testSubjects'); + let caseIdSuspiciousEmail: string; + let caseOwnerSuspiciousEmail: string; describe('list view', function () { before(async () => { @@ -24,12 +30,14 @@ export default function ({ getPageObject, getService, getPageObjects }: FtrProvi severity: CaseSeverity.HIGH, }); - await cases.api.createCase({ + const caseSuspiciousEmail = await cases.api.createCase({ title: 'Suspicious emails reported', tags: ['email', 'phishing'], - description: 'Test.', + description: 'Several employees have received suspicious emails from an unknown address.', owner: 'securitySolution', }); + caseIdSuspiciousEmail = caseSuspiciousEmail.id; + caseOwnerSuspiciousEmail = caseSuspiciousEmail.owner; await cases.api.createCase({ title: 'Malware investigation', @@ -38,6 +46,20 @@ export default function ({ getPageObject, getService, getPageObjects }: FtrProvi owner: 'securitySolution', severity: CaseSeverity.MEDIUM, }); + + await createAndUploadFile({ + supertest, + createFileParams: { + name: 'testfile', + kind: SECURITY_SOLUTION_FILE_KIND, + mimeType: 'image/png', + meta: { + caseIds: [caseIdSuspiciousEmail], + owner: [caseOwnerSuspiciousEmail], + }, + }, + data: 'abc', + }); }); after(async () => { @@ -49,5 +71,16 @@ export default function ({ getPageObject, getService, getPageObjects }: FtrProvi await pageObjects.header.waitUntilLoadingHasFinished(); await commonScreenshots.takeScreenshot('cases-home-page', screenshotDirectories, 1700, 1024); }); + + it('case details screenshot', async () => { + await pageObjects.common.navigateToApp('security', { + path: `cases/${caseIdSuspiciousEmail}`, + }); + await commonScreenshots.takeScreenshot('cases-ui-open', screenshotDirectories, 1400, 1024); + + const filesTab = await testSubjects.find('case-view-tab-title-files'); + await filesTab.click(); + await commonScreenshots.takeScreenshot('cases-files', screenshotDirectories, 1400, 1024); + }); }); } diff --git a/x-pack/test_serverless/api_integration/test_suites/common/security_users.ts b/x-pack/test_serverless/api_integration/test_suites/common/security_users.ts index fd99de273df9c..af4e97fff06bc 100644 --- a/x-pack/test_serverless/api_integration/test_suites/common/security_users.ts +++ b/x-pack/test_serverless/api_integration/test_suites/common/security_users.ts @@ -11,7 +11,9 @@ export default function ({ getService }: FtrProviderContext) { const svlCommonApi = getService('svlCommonApi'); const supertest = getService('supertest'); - describe('security/users', function () { + // Test should be unskipped when the API is disabled + // https://github.com/elastic/kibana/issues/161337 + describe.skip('security/users', function () { it('rejects request to create user', async () => { const { body, status } = await supertest .post(`/internal/security/users/some_testuser`) diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/index.ts b/x-pack/test_serverless/api_integration/test_suites/observability/index.ts index 1b571e6e0f7a5..1020ebc74d551 100644 --- a/x-pack/test_serverless/api_integration/test_suites/observability/index.ts +++ b/x-pack/test_serverless/api_integration/test_suites/observability/index.ts @@ -9,7 +9,6 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ loadTestFile }: FtrProviderContext) { describe('serverless observability API', function () { - loadTestFile(require.resolve('./security_users')); loadTestFile(require.resolve('./snapshot_telemetry')); }); } diff --git a/x-pack/test_serverless/api_integration/test_suites/observability/security_users.ts b/x-pack/test_serverless/api_integration/test_suites/observability/security_users.ts deleted file mode 100644 index b3ccb00830b26..0000000000000 --- a/x-pack/test_serverless/api_integration/test_suites/observability/security_users.ts +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { FtrProviderContext } from '../../ftr_provider_context'; - -export default function ({ getService }: FtrProviderContext) { - const svlCommonApi = getService('svlCommonApi'); - const supertest = getService('supertest'); - - /* - * This is a placeholder test to demonstrate usage. - * This test case is actually already covered in the `serverless` plugin tests - * and should be replaced with something specific to the observability project - * once it modifies / adds / disables Kibana APIs. - */ - describe('security/users', function () { - it('rejects request to create user', async () => { - const { body, status } = await supertest - .post(`/internal/security/users/some_testuser`) - .set(svlCommonApi.getCommonRequestHeader()) - .send({ username: 'some_testuser', password: 'testpassword', roles: [] }); - - // in a non-serverless environment this would succeed with a 200 - svlCommonApi.assertResponseStatusCode(400, status, body); - }); - }); -} diff --git a/x-pack/test_serverless/api_integration/test_suites/search/index.ts b/x-pack/test_serverless/api_integration/test_suites/search/index.ts index 21fea435a53a2..20c04f741b1ac 100644 --- a/x-pack/test_serverless/api_integration/test_suites/search/index.ts +++ b/x-pack/test_serverless/api_integration/test_suites/search/index.ts @@ -9,7 +9,6 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ loadTestFile }: FtrProviderContext) { describe('serverless search API', function () { - loadTestFile(require.resolve('./security_users')); loadTestFile(require.resolve('./snapshot_telemetry')); }); } diff --git a/x-pack/test_serverless/api_integration/test_suites/search/security_users.ts b/x-pack/test_serverless/api_integration/test_suites/search/security_users.ts deleted file mode 100644 index bb6391f167cc2..0000000000000 --- a/x-pack/test_serverless/api_integration/test_suites/search/security_users.ts +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { FtrProviderContext } from '../../ftr_provider_context'; - -export default function ({ getService }: FtrProviderContext) { - const svlCommonApi = getService('svlCommonApi'); - const supertest = getService('supertest'); - - /* - * This is a placeholder test to demonstrate usage. - * This test case is actually already covered in the `serverless` plugin tests - * and should be replaced with something specific to the search project - * once it modifies / adds / disables Kibana APIs. - */ - describe('security/users', function () { - it('rejects request to create user', async () => { - const { body, status } = await supertest - .post(`/internal/security/users/some_testuser`) - .set(svlCommonApi.getCommonRequestHeader()) - .send({ username: 'some_testuser', password: 'testpassword', roles: [] }); - - // in a non-serverless environment this would succeed with a 200 - svlCommonApi.assertResponseStatusCode(400, status, body); - }); - }); -} diff --git a/x-pack/test_serverless/api_integration/test_suites/security/index.ts b/x-pack/test_serverless/api_integration/test_suites/security/index.ts index 22b9e23010b6a..9dc97ea8a9b57 100644 --- a/x-pack/test_serverless/api_integration/test_suites/security/index.ts +++ b/x-pack/test_serverless/api_integration/test_suites/security/index.ts @@ -9,7 +9,6 @@ import { FtrProviderContext } from '../../ftr_provider_context'; export default function ({ loadTestFile }: FtrProviderContext) { describe('serverless security API', function () { - loadTestFile(require.resolve('./security_users')); loadTestFile(require.resolve('./snapshot_telemetry')); }); } diff --git a/x-pack/test_serverless/api_integration/test_suites/security/security_users.ts b/x-pack/test_serverless/api_integration/test_suites/security/security_users.ts deleted file mode 100644 index 3b389f1aff527..0000000000000 --- a/x-pack/test_serverless/api_integration/test_suites/security/security_users.ts +++ /dev/null @@ -1,31 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { FtrProviderContext } from '../../ftr_provider_context'; - -export default function ({ getService }: FtrProviderContext) { - const svlCommonApi = getService('svlCommonApi'); - const supertest = getService('supertest'); - - /* - * This is a placeholder test to demonstrate usage. - * This test case is actually already covered in the `serverless` plugin tests - * and should be replaced with something specific to the security project - * once it modifies / adds / disables Kibana APIs. - */ - describe('security/users', function () { - it('rejects request to create user', async () => { - const { body, status } = await supertest - .post(`/internal/security/users/some_testuser`) - .set(svlCommonApi.getCommonRequestHeader()) - .send({ username: 'some_testuser', password: 'testpassword', roles: [] }); - - // in a non-serverless environment this would succeed with a 200 - svlCommonApi.assertResponseStatusCode(400, status, body); - }); - }); -} diff --git a/x-pack/test_serverless/shared/config.base.ts b/x-pack/test_serverless/shared/config.base.ts index 49158e78dcda2..4c7f1e89aa2e8 100644 --- a/x-pack/test_serverless/shared/config.base.ts +++ b/x-pack/test_serverless/shared/config.base.ts @@ -23,7 +23,6 @@ export default async () => { esTestCluster: { license: 'trial', from: 'snapshot', - serverArgs: ['xpack.security.enabled=false'], }, kbnTestServer: { @@ -62,6 +61,11 @@ export default async () => { ], }, + security: { disableTestUser: true }, + + // Used by FTR to recognize serverless project and change its behavior accordingly + serverless: true, + // overriding default timeouts from packages/kbn-test/src/functional_test_runner/lib/config/schema.ts // so we can easily adjust them for serverless where needed timeouts: {