From 57af98f38a535432f7f085abaa3c9e7e4f67a53a Mon Sep 17 00:00:00 2001 From: Dima Arnautov Date: Wed, 17 May 2023 11:36:58 +0200 Subject: [PATCH 01/78] [ML] Fix the file upload telemetry (#157888) ## Summary Fixes the usage collector for the file upload plugin. According to the git history it hasn't been working since https://github.com/elastic/kibana/pull/60418. The saved objects repository required for retrieving telemetry data wasn't provided, causing telemetry to fall back to `index_creation_count: 0` after each check. ### How to test Execute the following request in the Dev Console. ``` POST kbn:/api/telemetry/v2/clusters/_stats { "unencrypted": true } ``` [`mlUsage`](https://github.com/elastic/kibana/blob/9047d69d574225212996ea9dbcd15dddc607d11e/x-pack/plugins/file_upload/server/telemetry/usage_collector.ts#L36) shouldn't be `null`. --- .../plugins/file_upload/server/telemetry/usage_collector.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/file_upload/server/telemetry/usage_collector.ts b/x-pack/plugins/file_upload/server/telemetry/usage_collector.ts index 20e34fcaf60e2..d3909a904c26f 100644 --- a/x-pack/plugins/file_upload/server/telemetry/usage_collector.ts +++ b/x-pack/plugins/file_upload/server/telemetry/usage_collector.ts @@ -10,7 +10,7 @@ import { CoreSetup } from '@kbn/core/server'; import { UsageCollectionSetup } from '@kbn/usage-collection-plugin/server'; import { getTelemetry, initTelemetry, Telemetry } from './telemetry'; import { telemetryMappingsType } from './mappings'; -import { setInternalRepository } from './internal_repository'; +import { getInternalRepository, setInternalRepository } from './internal_repository'; export function initFileUploadTelemetry( coreSetup: CoreSetup, @@ -33,7 +33,7 @@ function registerUsageCollector(usageCollectionSetup: UsageCollectionSetup): voi }, }, fetch: async () => { - const mlUsage = await getTelemetry(); + const mlUsage = await getTelemetry(getInternalRepository()!); if (!mlUsage) { return initTelemetry(); } From 0b1dd8e21300bcb76d20fe973f6b6bf2e48b8898 Mon Sep 17 00:00:00 2001 From: Pete Harverson Date: Wed, 17 May 2023 10:46:00 +0100 Subject: [PATCH 02/78] [ML] Transforms: Adds extra checkpoint stats to details tab (#157287) ## Summary Adds extra statistics on [checkpoints](https://www.elastic.co/guide/en/elasticsearch/reference/current/get-transform-stats.html#get-transform-stats-response) to the Details tab in the expanded row for a transform in the management page for the `changes_last_detected_at`, `last_search_time` and `operations_behind` fields. image Also updated the related data in the mocks. ### Checklist Delete any items that are not applicable to this PR. - [x] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [x] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) Closes #142103 Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../transform/common/types/transform_stats.ts | 4 +++- .../common/__mocks__/transform_list_row.json | 4 ++-- .../app/common/__mocks__/transform_stats.json | 6 +++-- .../transform_list/expanded_row.tsx | 23 +++++++++++++++++++ 4 files changed, 32 insertions(+), 5 deletions(-) diff --git a/x-pack/plugins/transform/common/types/transform_stats.ts b/x-pack/plugins/transform/common/types/transform_stats.ts index 4134662552a90..bcd3a7c7c9d95 100644 --- a/x-pack/plugins/transform/common/types/transform_stats.ts +++ b/x-pack/plugins/transform/common/types/transform_stats.ts @@ -33,7 +33,9 @@ export interface TransformStats { percent_complete: number; }; }; - operations_behind: number; + changes_last_detected_at: number; + last_search_time?: number; + operations_behind?: number; }; health: { status: TransformHealth; diff --git a/x-pack/plugins/transform/public/app/common/__mocks__/transform_list_row.json b/x-pack/plugins/transform/public/app/common/__mocks__/transform_list_row.json index 6723e8f749e88..565d8c6eee9e2 100644 --- a/x-pack/plugins/transform/public/app/common/__mocks__/transform_list_row.json +++ b/x-pack/plugins/transform/public/app/common/__mocks__/transform_list_row.json @@ -38,7 +38,7 @@ "checkpoint": 1, "timestamp_millis": 1564388281199 }, - "operations_behind": 0 + "changes_last_detected_at": 1564388281199 }, "mode": "batch", "stats": { @@ -61,7 +61,7 @@ "checkpoint": 1, "timestamp_millis": 1564388281199 }, - "operations_behind": 0 + "changes_last_detected_at": 1564388281199 } } } diff --git a/x-pack/plugins/transform/public/app/common/__mocks__/transform_stats.json b/x-pack/plugins/transform/public/app/common/__mocks__/transform_stats.json index 0e11cf3d75bb9..652a25a54b5fb 100644 --- a/x-pack/plugins/transform/public/app/common/__mocks__/transform_stats.json +++ b/x-pack/plugins/transform/public/app/common/__mocks__/transform_stats.json @@ -97,7 +97,9 @@ }, "timestamp_millis" : 1568021396011 }, - "operations_behind" : 21139495 + "operations_behind" : 21139495, + "changes_last_detected_at": 1568021396000, + "last_search_time": 1568021396000 } }, { @@ -123,7 +125,7 @@ "checkpoint" : 1, "timestamp_millis" : 1568021396011 }, - "operations_behind" : 0 + "changes_last_detected_at": 1568021396011 } } ] diff --git a/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/expanded_row.tsx b/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/expanded_row.tsx index 209af498cb5f6..948d084569e95 100644 --- a/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/expanded_row.tsx +++ b/x-pack/plugins/transform/public/app/sections/transform_management/components/transform_list/expanded_row.tsx @@ -138,6 +138,15 @@ export const ExpandedRow: FC = ({ item, onAlertEdit }) => { }; const checkpointingItems: Item[] = []; + if (item.stats.checkpointing.changes_last_detected_at !== undefined) { + checkpointingItems.push({ + title: 'changes_last_detected_at', + description: formatHumanReadableDateTimeSeconds( + item.stats.checkpointing.changes_last_detected_at + ), + }); + } + if (item.stats.checkpointing.last !== undefined) { checkpointingItems.push({ title: 'last.checkpoint', @@ -157,6 +166,13 @@ export const ExpandedRow: FC = ({ item, onAlertEdit }) => { } } + if (item.stats.checkpointing.last_search_time !== undefined) { + checkpointingItems.push({ + title: 'last_search_time', + description: formatHumanReadableDateTimeSeconds(item.stats.checkpointing.last_search_time), + }); + } + if (item.stats.checkpointing.next !== undefined) { checkpointingItems.push({ title: 'next.checkpoint', @@ -178,6 +194,13 @@ export const ExpandedRow: FC = ({ item, onAlertEdit }) => { } } + if (item.stats.checkpointing.operations_behind !== undefined) { + checkpointingItems.push({ + title: 'operations_behind', + description: item.stats.checkpointing.operations_behind, + }); + } + const alertRuleItems: Item[] | undefined = item.alerting_rules?.map((rule) => { return { title: ( From c9be0faa8f2031af9da8d5a3f4d21a57e6d42a06 Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Wed, 17 May 2023 11:52:43 +0200 Subject: [PATCH 03/78] [HTTP] Keep validation error message the same for versioned validator (#157965) --- .../src/versioned_router/validate.ts | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/packages/core/http/core-http-router-server-internal/src/versioned_router/validate.ts b/packages/core/http/core-http-router-server-internal/src/versioned_router/validate.ts index b1923f4f452c9..37443209e4508 100644 --- a/packages/core/http/core-http-router-server-internal/src/versioned_router/validate.ts +++ b/packages/core/http/core-http-router-server-internal/src/versioned_router/validate.ts @@ -18,8 +18,8 @@ export function validate( ): { body: unknown; params: unknown; query: unknown } { const validator = RouteValidator.from(runtimeSchema); return { - body: validator.getBody(data.body, `get ${version} body`), - params: validator.getParams(data.params, `get ${version} params`), - query: validator.getQuery(data.query, `get ${version} query`), + params: validator.getParams(data.params, 'request params'), + query: validator.getQuery(data.query, 'request query'), + body: validator.getBody(data.body, 'request body'), }; } From 0eb1d0fc392dbcfccf446bf1a53452f1df03f95a Mon Sep 17 00:00:00 2001 From: Elastic Machine Date: Wed, 17 May 2023 20:06:13 +1000 Subject: [PATCH 04/78] [main] Sync bundled packages with Package Storage (#157952) Automated by https://internal-ci.elastic.co/job/package_storage/job/sync-bundled-packages-job/job/main/3861/ Co-authored-by: apmmachine --- fleet_packages.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/fleet_packages.json b/fleet_packages.json index ae5ac6a701e61..df5bf532ba390 100644 --- a/fleet_packages.json +++ b/fleet_packages.json @@ -24,7 +24,7 @@ [ { "name": "apm", - "version": "8.9.0-preview-1684223038", + "version": "8.9.0-preview-1684289323", "forceAlignStackVersion": true, "allowSyncToPrerelease": true }, From 5d96ef99d7769ca3f425f73eafe15f729e36e1b2 Mon Sep 17 00:00:00 2001 From: mohamedhamed-ahmed Date: Wed, 17 May 2023 13:19:26 +0100 Subject: [PATCH 05/78] [Logs UI] Register Logs UI Locators (#155156) ## Summary Closes https://github.com/elastic/kibana/issues/104855 This PR creates 2 registered locators: 1. Logs Locator 2. Node Logs Locator With these 2 locators, we now have a typed navigation to the logs UI which also redirects to Discover in serverless mode. ## Testing ### Normal behaviour When Kibana is used as always then on any navigation to the logs UI, the user will be redirected to the stream UI. All links to `link-to` routes should still behave as before. - Launch the Kibana dev environment with `yarn start` - Navigate to Hosts UI - Click the logs tab - Add a filter text in the search bar - Click on the Open in Logs link - Verify that navigation to the Stream view and the state is maintained https://user-images.githubusercontent.com/11225826/234514430-ddc1ffaa-0cb2-4f2a-84e9-6c6230937d9f.mov ### Serverless behaviour When Kibana is used in serverless mode, we want to redirect any user landing to Logs UI to the Discover page - Launch the Kibana dev environment with `yarn serverless-oblt` - Navigate to Hosts UI - Click the logs tab - Add a filter text in the search bar - Click on the Open in Logs link - Verify to be redirected to Discover and that the state is maintained https://user-images.githubusercontent.com/11225826/234514454-dfb2774e-d6f1-4f4c-ba10-77815dc1ae9d.mov ### Next Steps A separate PR will be created to fulfill the below AC - All usages of link-to routes in other apps are replaced with usage of the appropriate locator. --- x-pack/plugins/infra/common/constants.ts | 3 + .../infra/public/apps/discover_app.tsx | 91 +---- .../public/locators/discover_logs_locator.ts | 25 ++ .../locators/discover_node_logs_locator.ts | 33 ++ .../plugins/infra/public/locators/helpers.ts | 151 ++++++++ x-pack/plugins/infra/public/locators/index.ts | 21 ++ .../infra/public/locators/locators.mock.ts | 14 + .../infra/public/locators/locators.test.ts | 270 ++++++++++++++ .../infra/public/locators/logs_locator.ts | 49 +++ .../public/locators/node_logs_locator.ts | 41 +++ x-pack/plugins/infra/public/mocks.tsx | 2 + .../src/url_state_storage_service.ts | 4 +- .../src/url_state_storage_service.ts | 34 +- .../log_view_state/src/defaults.ts | 2 +- .../src/url_state_storage_service.ts | 79 ++-- .../pages/link_to/link_to_logs.test.tsx | 338 ------------------ .../public/pages/link_to/link_to_logs.tsx | 5 + .../pages/link_to/redirect_to_logs.test.tsx | 62 ---- .../public/pages/link_to/redirect_to_logs.tsx | 42 +-- .../pages/link_to/redirect_to_node_logs.tsx | 67 ++-- .../tabs/logs/logs_link_to_stream.tsx | 39 +- .../components/tabs/logs/logs_tab_content.tsx | 2 +- x-pack/plugins/infra/public/plugin.ts | 44 ++- x-pack/plugins/infra/public/types.ts | 6 +- x-pack/plugins/infra/server/plugin.ts | 16 +- .../translations/translations/fr-FR.json | 1 - .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - x-pack/test/functional/apps/infra/link_to.ts | 96 +++-- 29 files changed, 872 insertions(+), 667 deletions(-) create mode 100644 x-pack/plugins/infra/public/locators/discover_logs_locator.ts create mode 100644 x-pack/plugins/infra/public/locators/discover_node_logs_locator.ts create mode 100644 x-pack/plugins/infra/public/locators/helpers.ts create mode 100644 x-pack/plugins/infra/public/locators/index.ts create mode 100644 x-pack/plugins/infra/public/locators/locators.mock.ts create mode 100644 x-pack/plugins/infra/public/locators/locators.test.ts create mode 100644 x-pack/plugins/infra/public/locators/logs_locator.ts create mode 100644 x-pack/plugins/infra/public/locators/node_logs_locator.ts delete mode 100644 x-pack/plugins/infra/public/pages/link_to/link_to_logs.test.tsx delete mode 100644 x-pack/plugins/infra/public/pages/link_to/redirect_to_logs.test.tsx diff --git a/x-pack/plugins/infra/common/constants.ts b/x-pack/plugins/infra/common/constants.ts index d428ebd3e4909..64315400f21a7 100644 --- a/x-pack/plugins/infra/common/constants.ts +++ b/x-pack/plugins/infra/common/constants.ts @@ -21,3 +21,6 @@ export const TIEBREAKER_FIELD = '_doc'; export const HOST_FIELD = 'host.name'; export const CONTAINER_FIELD = 'container.id'; export const POD_FIELD = 'kubernetes.pod.uid'; + +export const DISCOVER_APP_TARGET = 'discover'; +export const LOGS_APP_TARGET = 'logs-ui'; diff --git a/x-pack/plugins/infra/public/apps/discover_app.tsx b/x-pack/plugins/infra/public/apps/discover_app.tsx index 807b64845cdc7..dd99a5e4dd625 100644 --- a/x-pack/plugins/infra/public/apps/discover_app.tsx +++ b/x-pack/plugins/infra/public/apps/discover_app.tsx @@ -4,95 +4,16 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { interpret } from 'xstate'; -import type { DiscoverStart } from '@kbn/discover-plugin/public'; import { createKbnUrlStateStorage } from '@kbn/kibana-utils-plugin/public'; -import { AppMountParameters, CoreStart } from '@kbn/core/public'; -import type { InfraClientStartDeps, InfraClientStartExports } from '../types'; -import type { LogViewColumnConfiguration, ResolvedLogView } from '../../common/log_views'; -import { - createLogViewStateMachine, - DEFAULT_LOG_VIEW, - initializeFromUrl, -} from '../observability_logs/log_view_state'; -import { MESSAGE_FIELD, TIMESTAMP_FIELD } from '../../common/constants'; +import type { AppMountParameters, CoreStart } from '@kbn/core/public'; +import type { InfraClientStartExports } from '../types'; +import { getLogViewReferenceFromUrl } from '../observability_logs/log_view_state'; export const renderApp = ( core: CoreStart, - plugins: InfraClientStartDeps, pluginStart: InfraClientStartExports, params: AppMountParameters ) => { - const { discover } = plugins; - const { logViews } = pluginStart; - - const machine = createLogViewStateMachine({ - initialContext: { logViewReference: DEFAULT_LOG_VIEW }, - logViews: logViews.client, - initializeFromUrl: createInitializeFromUrl(core, params), - }); - - const service = interpret(machine) - .onTransition((state) => { - if ( - state.matches('checkingStatus') || - state.matches('resolvedPersistedLogView') || - state.matches('resolvedInlineLogView') - ) { - return redirectToDiscover(discover, state.context.resolvedLogView); - } else if ( - state.matches('loadingFailed') || - state.matches('resolutionFailed') || - state.matches('checkingStatusFailed') - ) { - return redirectToDiscover(discover); - } - }) - .start(); - - return () => { - // Stop machine interpreter after navigation - service.stop(); - }; -}; - -const redirectToDiscover = (discover: DiscoverStart, resolvedLogView?: ResolvedLogView) => { - const navigationOptions = { replace: true }; - - if (!resolvedLogView) { - return discover.locator?.navigate({}, navigationOptions); - } - - const columns = parseColumns(resolvedLogView.columns); - const dataViewSpec = resolvedLogView.dataViewReference.toSpec(); - - return discover.locator?.navigate( - { - columns, - dataViewId: dataViewSpec.id, - dataViewSpec, - }, - navigationOptions - ); -}; - -/** - * Helpers - */ - -const parseColumns = (columns: ResolvedLogView['columns']) => { - return columns.map(getColumnValue).filter(Boolean) as string[]; -}; - -const getColumnValue = (column: LogViewColumnConfiguration) => { - if ('messageColumn' in column) return MESSAGE_FIELD; - if ('timestampColumn' in column) return TIMESTAMP_FIELD; - if ('fieldColumn' in column) return column.fieldColumn.field; - - return null; -}; - -const createInitializeFromUrl = (core: CoreStart, params: AppMountParameters) => { const toastsService = core.notifications.toasts; const urlStateStorage = createKbnUrlStateStorage({ @@ -101,5 +22,9 @@ const createInitializeFromUrl = (core: CoreStart, params: AppMountParameters) => useHashQuery: false, }); - return initializeFromUrl({ toastsService, urlStateStorage }); + const logView = getLogViewReferenceFromUrl({ toastsService, urlStateStorage }); + + pluginStart.locators.logsLocator.navigate({ ...(logView ? { logView } : {}) }, { replace: true }); + + return () => true; }; diff --git a/x-pack/plugins/infra/public/locators/discover_logs_locator.ts b/x-pack/plugins/infra/public/locators/discover_logs_locator.ts new file mode 100644 index 0000000000000..8693c5e281078 --- /dev/null +++ b/x-pack/plugins/infra/public/locators/discover_logs_locator.ts @@ -0,0 +1,25 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { LocatorDefinition, LocatorPublic } from '@kbn/share-plugin/public'; +import type { LogsLocatorDependencies, LogsLocatorParams } from './logs_locator'; + +const DISCOVER_LOGS_LOCATOR_ID = 'DISCOVER_LOGS_LOCATOR'; + +export type DiscoverLogsLocator = LocatorPublic; + +export class DiscoverLogsLocatorDefinition implements LocatorDefinition { + public readonly id = DISCOVER_LOGS_LOCATOR_ID; + + constructor(protected readonly deps: LogsLocatorDependencies) {} + + public readonly getLocation = async (params: LogsLocatorParams) => { + const { getLocationToDiscover } = await import('./helpers'); + + return getLocationToDiscover({ core: this.deps.core, ...params }); + }; +} diff --git a/x-pack/plugins/infra/public/locators/discover_node_logs_locator.ts b/x-pack/plugins/infra/public/locators/discover_node_logs_locator.ts new file mode 100644 index 0000000000000..727c7abb401a5 --- /dev/null +++ b/x-pack/plugins/infra/public/locators/discover_node_logs_locator.ts @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { LocatorDefinition, LocatorPublic } from '@kbn/share-plugin/public'; +import type { NodeLogsLocatorDependencies, NodeLogsLocatorParams } from './node_logs_locator'; + +const DISCOVER_NODE_LOGS_LOCATOR_ID = 'DISCOVER_NODE_LOGS_LOCATOR'; + +export type DiscoverNodeLogsLocator = LocatorPublic; + +export class DiscoverNodeLogsLocatorDefinition implements LocatorDefinition { + public readonly id = DISCOVER_NODE_LOGS_LOCATOR_ID; + + constructor(protected readonly deps: NodeLogsLocatorDependencies) {} + + public readonly getLocation = async (params: NodeLogsLocatorParams) => { + const { createNodeLogsQuery, getLocationToDiscover } = await import('./helpers'); + + const { timeRange, logView } = params; + const query = createNodeLogsQuery(params); + + return getLocationToDiscover({ + core: this.deps.core, + timeRange, + filter: query, + logView, + }); + }; +} diff --git a/x-pack/plugins/infra/public/locators/helpers.ts b/x-pack/plugins/infra/public/locators/helpers.ts new file mode 100644 index 0000000000000..4aceb41c8b4b8 --- /dev/null +++ b/x-pack/plugins/infra/public/locators/helpers.ts @@ -0,0 +1,151 @@ +/* + * 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 { interpret } from 'xstate'; +import { waitFor } from 'xstate/lib/waitFor'; +import { flowRight } from 'lodash'; +import type { DiscoverAppLocatorParams } from '@kbn/discover-plugin/common'; +import type { DiscoverStart } from '@kbn/discover-plugin/public'; +import { findInventoryFields } from '../../common/inventory_models'; +import { MESSAGE_FIELD, TIMESTAMP_FIELD } from '../../common/constants'; +import { + createLogViewStateMachine, + DEFAULT_LOG_VIEW, + replaceLogViewInQueryString, +} from '../observability_logs/log_view_state'; +import { replaceLogFilterInQueryString } from '../observability_logs/log_stream_query_state'; +import { replaceLogPositionInQueryString } from '../observability_logs/log_stream_position_state/src/url_state_storage_service'; +import type { TimeRange } from '../../common/time'; +import type { LogsLocatorParams } from './logs_locator'; +import type { InfraClientCoreSetup } from '../types'; +import type { + LogViewColumnConfiguration, + LogViewReference, + ResolvedLogView, +} from '../../common/log_views'; +import type { NodeLogsLocatorParams } from './node_logs_locator'; + +interface LocationToDiscoverParams { + core: InfraClientCoreSetup; + timeRange?: TimeRange; + filter?: string; + logView?: LogViewReference; +} + +export const createNodeLogsQuery = (params: NodeLogsLocatorParams) => { + const { nodeType, nodeId, filter } = params; + + const nodeFilter = `${findInventoryFields(nodeType).id}: ${nodeId}`; + const query = filter ? `(${nodeFilter}) and (${filter})` : nodeFilter; + + return query; +}; + +export const createSearchString = ({ + time, + timeRange, + filter = '', + logView = DEFAULT_LOG_VIEW, +}: LogsLocatorParams) => { + return flowRight( + replaceLogFilterInQueryString({ language: 'kuery', query: filter }, time, timeRange), + replaceLogPositionInQueryString(time), + replaceLogViewInQueryString(logView) + )(''); +}; + +export const getLocationToDiscover = async ({ + core, + timeRange, + filter, + logView, +}: LocationToDiscoverParams) => { + const [, plugins, pluginStart] = await core.getStartServices(); + const { discover } = plugins; + const { logViews } = pluginStart; + + const machine = createLogViewStateMachine({ + initialContext: { logViewReference: logView || DEFAULT_LOG_VIEW }, + logViews: logViews.client, + }); + + const discoverParams: DiscoverAppLocatorParams = { + ...(timeRange ? { from: timeRange.startTime, to: timeRange.endTime } : {}), + ...(filter + ? { + query: { + language: 'kuery', + query: filter, + }, + } + : {}), + }; + + let discoverLocation; + + const service = interpret(machine).start(); + const doneState = await waitFor( + service, + (state) => + state.matches('checkingStatus') || + state.matches('resolvedPersistedLogView') || + state.matches('resolvedInlineLogView') || + state.matches('loadingFailed') || + state.matches('resolutionFailed') || + state.matches('checkingStatusFailed') + ); + + service.stop(); + + if ('resolvedLogView' in doneState.context) { + discoverLocation = await constructDiscoverLocation( + discover, + discoverParams, + doneState.context.resolvedLogView + ); + } else { + discoverLocation = await constructDiscoverLocation(discover, discoverParams); + } + + if (!discoverLocation) { + throw new Error('Discover location not found'); + } + + return discoverLocation; +}; + +const constructDiscoverLocation = async ( + discover: DiscoverStart, + discoverParams: DiscoverAppLocatorParams, + resolvedLogView?: ResolvedLogView +) => { + if (!resolvedLogView) { + return await discover.locator?.getLocation(discoverParams); + } + + const columns = parseColumns(resolvedLogView.columns); + const dataViewSpec = resolvedLogView.dataViewReference.toSpec(); + + return await discover.locator?.getLocation({ + ...discoverParams, + columns, + dataViewId: dataViewSpec.id, + dataViewSpec, + }); +}; + +const parseColumns = (columns: ResolvedLogView['columns']) => { + return columns.map(getColumnValue).filter(Boolean) as string[]; +}; + +const getColumnValue = (column: LogViewColumnConfiguration) => { + if ('messageColumn' in column) return MESSAGE_FIELD; + if ('timestampColumn' in column) return TIMESTAMP_FIELD; + if ('fieldColumn' in column) return column.fieldColumn.field; + + return null; +}; diff --git a/x-pack/plugins/infra/public/locators/index.ts b/x-pack/plugins/infra/public/locators/index.ts new file mode 100644 index 0000000000000..8749d88ae9b53 --- /dev/null +++ b/x-pack/plugins/infra/public/locators/index.ts @@ -0,0 +1,21 @@ +/* + * 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 { DiscoverLogsLocator } from './discover_logs_locator'; +import type { DiscoverNodeLogsLocator } from './discover_node_logs_locator'; +import type { LogsLocator } from './logs_locator'; +import type { NodeLogsLocator } from './node_logs_locator'; + +export * from './discover_logs_locator'; +export * from './discover_node_logs_locator'; +export * from './logs_locator'; +export * from './node_logs_locator'; + +export interface InfraLocators { + logsLocator: LogsLocator | DiscoverLogsLocator; + nodeLogsLocator: NodeLogsLocator | DiscoverNodeLogsLocator; +} diff --git a/x-pack/plugins/infra/public/locators/locators.mock.ts b/x-pack/plugins/infra/public/locators/locators.mock.ts new file mode 100644 index 0000000000000..ca2d5bba99d15 --- /dev/null +++ b/x-pack/plugins/infra/public/locators/locators.mock.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { sharePluginMock } from '@kbn/share-plugin/public/mocks'; +import type { InfraLocators } from '.'; + +export const createLocatorMock = (): jest.Mocked => ({ + logsLocator: sharePluginMock.createLocator(), + nodeLogsLocator: sharePluginMock.createLocator(), +}); diff --git a/x-pack/plugins/infra/public/locators/locators.test.ts b/x-pack/plugins/infra/public/locators/locators.test.ts new file mode 100644 index 0000000000000..5f19bb9f11cb9 --- /dev/null +++ b/x-pack/plugins/infra/public/locators/locators.test.ts @@ -0,0 +1,270 @@ +/* + * 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 { v4 as uuidv4 } from 'uuid'; +import { LogsLocatorDefinition, LogsLocatorDependencies } from './logs_locator'; +import { NodeLogsLocatorDefinition } from './node_logs_locator'; +import type { LogsLocatorParams } from './logs_locator'; +import type { NodeLogsLocatorParams } from './node_logs_locator'; +import { coreMock } from '@kbn/core/public/mocks'; +import { findInventoryFields } from '../../common/inventory_models'; +import moment from 'moment'; +import { DEFAULT_LOG_VIEW } from '../observability_logs/log_view_state'; +import type { LogViewReference } from '../../common/log_views'; + +const setupLogsLocator = async () => { + const deps: LogsLocatorDependencies = { + core: coreMock.createSetup(), + }; + const logsLocator = new LogsLocatorDefinition(deps); + const nodeLogsLocator = new NodeLogsLocatorDefinition(deps); + + return { + logsLocator, + nodeLogsLocator, + }; +}; + +describe('Infra Locators', () => { + const APP_ID = 'logs'; + const nodeType = 'host'; + const FILTER_QUERY = 'trace.id:1234'; + const nodeId = uuidv4(); + const time = 1550671089404; + const from = 1676815089000; + const to = 1682351734323; + + describe('Logs Locator', () => { + it('should create a link to Logs with no state', async () => { + const params: LogsLocatorParams = { + time, + }; + const { logsLocator } = await setupLogsLocator(); + const { app, path, state } = await logsLocator.getLocation(params); + + expect(app).toBe(APP_ID); + expect(path).toBe(constructUrlSearchString(params)); + expect(state).toBeDefined(); + expect(Object.keys(state)).toHaveLength(0); + }); + + it('should allow specifying specific logPosition', async () => { + const params: LogsLocatorParams = { + time, + }; + const { logsLocator } = await setupLogsLocator(); + const { path } = await logsLocator.getLocation(params); + + const expected = constructUrlSearchString(params); + expect(path).toBe(expected); + }); + + it('should allow specifying specific filter', async () => { + const params: LogsLocatorParams = { + time, + filter: FILTER_QUERY, + }; + const { logsLocator } = await setupLogsLocator(); + const { path } = await logsLocator.getLocation(params); + + const expected = constructUrlSearchString(params); + expect(path).toBe(expected); + }); + + it('should allow specifying specific view id', async () => { + const params: LogsLocatorParams = { + time, + logView: DEFAULT_LOG_VIEW, + }; + const { logsLocator } = await setupLogsLocator(); + const { path } = await logsLocator.getLocation(params); + + const expected = constructUrlSearchString(params); + expect(path).toBe(expected); + }); + + it('should allow specifying specific time range', async () => { + const params: LogsLocatorParams = { + time, + from, + to, + }; + const { logsLocator } = await setupLogsLocator(); + const { path } = await logsLocator.getLocation(params); + + const expected = constructUrlSearchString(params); + expect(path).toBe(expected); + }); + + it('should return correct structured url', async () => { + const params: LogsLocatorParams = { + logView: DEFAULT_LOG_VIEW, + filter: FILTER_QUERY, + time, + }; + const { logsLocator } = await setupLogsLocator(); + const { app, path, state } = await logsLocator.getLocation(params); + + const expected = constructUrlSearchString(params); + + expect(app).toBe(APP_ID); + expect(path).toBe(expected); + expect(state).toBeDefined(); + expect(Object.keys(state)).toHaveLength(0); + }); + }); + + describe('Node Logs Locator', () => { + it('should create a link to Node Logs with no state', async () => { + const params: NodeLogsLocatorParams = { + nodeId, + nodeType, + time, + }; + const { nodeLogsLocator } = await setupLogsLocator(); + const { app, path, state } = await nodeLogsLocator.getLocation(params); + + expect(app).toBe(APP_ID); + expect(path).toBe(constructUrlSearchString(params)); + expect(state).toBeDefined(); + expect(Object.keys(state)).toHaveLength(0); + }); + + it('should allow specifying specific logPosition', async () => { + const params: NodeLogsLocatorParams = { + nodeId, + nodeType, + time, + }; + const { nodeLogsLocator } = await setupLogsLocator(); + const { path } = await nodeLogsLocator.getLocation(params); + + const expected = constructUrlSearchString(params); + expect(path).toBe(expected); + }); + + it('should allow specifying specific filter', async () => { + const params: NodeLogsLocatorParams = { + nodeId, + nodeType, + time, + filter: FILTER_QUERY, + }; + const { nodeLogsLocator } = await setupLogsLocator(); + const { path } = await nodeLogsLocator.getLocation(params); + + const expected = constructUrlSearchString(params); + expect(path).toBe(expected); + }); + + it('should allow specifying specific view id', async () => { + const params: NodeLogsLocatorParams = { + nodeId, + nodeType, + time, + logView: { ...DEFAULT_LOG_VIEW, logViewId: 'test' }, + }; + const { nodeLogsLocator } = await setupLogsLocator(); + const { path } = await nodeLogsLocator.getLocation(params); + + const expected = constructUrlSearchString(params); + expect(path).toBe(expected); + }); + + it('should allow specifying specific time range', async () => { + const params: NodeLogsLocatorParams = { + nodeId, + nodeType, + time, + from, + to, + logView: DEFAULT_LOG_VIEW, + }; + const { nodeLogsLocator } = await setupLogsLocator(); + const { path } = await nodeLogsLocator.getLocation(params); + + const expected = constructUrlSearchString(params); + expect(path).toBe(expected); + }); + + it('should return correct structured url', async () => { + const params: NodeLogsLocatorParams = { + nodeId, + nodeType, + time, + logView: DEFAULT_LOG_VIEW, + filter: FILTER_QUERY, + }; + const { nodeLogsLocator } = await setupLogsLocator(); + const { app, path, state } = await nodeLogsLocator.getLocation(params); + + const expected = constructUrlSearchString(params); + expect(app).toBe(APP_ID); + expect(path).toBe(expected); + expect(state).toBeDefined(); + expect(Object.keys(state)).toHaveLength(0); + }); + }); +}); + +/** + * Helpers + */ + +export const constructUrlSearchString = (params: Partial) => { + const { time = 1550671089404, logView } = params; + + return `/stream?logView=${constructLogView(logView)}&logPosition=${constructLogPosition( + time + )}&logFilter=${constructLogFilter(params)}`; +}; + +const constructLogView = (logView?: LogViewReference) => { + const logViewId = + logView && 'logViewId' in logView ? logView.logViewId : DEFAULT_LOG_VIEW.logViewId; + + return `(logViewId:${logViewId},type:log-view-reference)`; +}; + +const constructLogPosition = (time: number = 1550671089404) => { + return `(position:(tiebreaker:0,time:${time}))`; +}; + +const constructLogFilter = ({ + nodeType, + nodeId, + filter, + timeRange, + time, +}: Partial) => { + let finalFilter = filter || ''; + + if (nodeId) { + const nodeFilter = `${findInventoryFields(nodeType!).id}: ${nodeId}`; + finalFilter = filter ? `(${nodeFilter}) and (${filter})` : nodeFilter; + } + + const query = encodeURI( + `(query:(language:kuery,query:'${finalFilter}'),refreshInterval:(pause:!t,value:5000)` + ); + + if (!time) return `${query})`; + + const fromDate = timeRange?.startTime + ? addHoursToTimestamp(timeRange.startTime, 0) + : addHoursToTimestamp(time, -1); + + const toDate = timeRange?.endTime + ? addHoursToTimestamp(timeRange.endTime, 0) + : addHoursToTimestamp(time, 1); + + return `${query},timeRange:(from:'${fromDate}',to:'${toDate}'))`; +}; + +const addHoursToTimestamp = (timestamp: number, hours: number): string => { + return moment(timestamp).add({ hours }).toISOString(); +}; diff --git a/x-pack/plugins/infra/public/locators/logs_locator.ts b/x-pack/plugins/infra/public/locators/logs_locator.ts new file mode 100644 index 0000000000000..fd78b9cce74fe --- /dev/null +++ b/x-pack/plugins/infra/public/locators/logs_locator.ts @@ -0,0 +1,49 @@ +/* + * 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 { LocatorDefinition, LocatorPublic } from '@kbn/share-plugin/public'; +import type { SerializableRecord } from '@kbn/utility-types'; +import type { LogViewReference } from '../../common/log_views'; +import type { TimeRange } from '../../common/time'; +import type { InfraClientCoreSetup } from '../types'; + +const LOGS_LOCATOR_ID = 'LOGS_LOCATOR'; + +export interface LogsLocatorParams extends SerializableRecord { + /** Defines log position */ + time?: number; + /** + * Optionally set the time range in the time picker. + */ + timeRange?: TimeRange; + filter?: string; + logView?: LogViewReference; +} + +export type LogsLocator = LocatorPublic; + +export interface LogsLocatorDependencies { + core: InfraClientCoreSetup; +} + +export class LogsLocatorDefinition implements LocatorDefinition { + public readonly id = LOGS_LOCATOR_ID; + + constructor(protected readonly deps: LogsLocatorDependencies) {} + + public readonly getLocation = async (params: LogsLocatorParams) => { + const { createSearchString } = await import('./helpers'); + + const searchString = createSearchString(params); + + return { + app: 'logs', + path: `/stream?${searchString}`, + state: {}, + }; + }; +} diff --git a/x-pack/plugins/infra/public/locators/node_logs_locator.ts b/x-pack/plugins/infra/public/locators/node_logs_locator.ts new file mode 100644 index 0000000000000..afa49882262c4 --- /dev/null +++ b/x-pack/plugins/infra/public/locators/node_logs_locator.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 { LocatorDefinition, LocatorPublic } from '@kbn/share-plugin/public'; +import type { InventoryItemType } from '../../common/inventory_models/types'; +import type { LogsLocatorDependencies, LogsLocatorParams } from './logs_locator'; + +const NODE_LOGS_LOCATOR_ID = 'NODE_LOGS_LOCATOR'; + +export interface NodeLogsLocatorParams extends LogsLocatorParams { + nodeId: string; + nodeType: InventoryItemType; +} + +export type NodeLogsLocator = LocatorPublic; + +export type NodeLogsLocatorDependencies = LogsLocatorDependencies; + +export class NodeLogsLocatorDefinition implements LocatorDefinition { + public readonly id = NODE_LOGS_LOCATOR_ID; + + constructor(protected readonly deps: NodeLogsLocatorDependencies) {} + + public readonly getLocation = async (params: NodeLogsLocatorParams) => { + const { createNodeLogsQuery, createSearchString } = await import('./helpers'); + + const query = createNodeLogsQuery(params); + + const searchString = createSearchString({ ...params, filter: query }); + + return { + app: 'logs', + path: `/stream?${searchString}`, + state: {}, + }; + }; +} diff --git a/x-pack/plugins/infra/public/mocks.tsx b/x-pack/plugins/infra/public/mocks.tsx index cd94e33b99f5e..8af0b5d1ab094 100644 --- a/x-pack/plugins/infra/public/mocks.tsx +++ b/x-pack/plugins/infra/public/mocks.tsx @@ -6,6 +6,7 @@ */ import React from 'react'; +import { createLocatorMock } from './locators/locators.mock'; import { createInventoryViewsServiceStartMock } from './services/inventory_views/inventory_views_service.mock'; import { createLogViewsServiceStartMock } from './services/log_views/log_views_service.mock'; import { createMetricsExplorerViewsServiceStartMock } from './services/metrics_explorer_views/metrics_explorer_views_service.mock'; @@ -17,6 +18,7 @@ export const createInfraPluginStartMock = () => ({ logViews: createLogViewsServiceStartMock(), metricsExplorerViews: createMetricsExplorerViewsServiceStartMock(), telemetry: createTelemetryServiceMock(), + locators: createLocatorMock(), ContainerMetricsTable: () =>
, HostMetricsTable: () =>
, PodMetricsTable: () =>
, diff --git a/x-pack/plugins/infra/public/observability_logs/log_stream_position_state/src/url_state_storage_service.ts b/x-pack/plugins/infra/public/observability_logs/log_stream_position_state/src/url_state_storage_service.ts index db81474594c48..5b8e3e56c989c 100644 --- a/x-pack/plugins/infra/public/observability_logs/log_stream_position_state/src/url_state_storage_service.ts +++ b/x-pack/plugins/infra/public/observability_logs/log_stream_position_state/src/url_state_storage_service.ts @@ -101,8 +101,8 @@ const decodePositionQueryValueFromUrl = (queryValueFromUrl: unknown) => { }; // Used by linkTo components -export const replaceLogPositionInQueryString = (time: number) => - Number.isNaN(time) +export const replaceLogPositionInQueryString = (time?: number) => + Number.isNaN(time) || time == null ? (value: string) => value : replaceStateKeyInQueryString(defaultPositionStateKey, { position: { diff --git a/x-pack/plugins/infra/public/observability_logs/log_stream_query_state/src/url_state_storage_service.ts b/x-pack/plugins/infra/public/observability_logs/log_stream_query_state/src/url_state_storage_service.ts index 5a6d20f4c9c12..e34725f699410 100644 --- a/x-pack/plugins/infra/public/observability_logs/log_stream_query_state/src/url_state_storage_service.ts +++ b/x-pack/plugins/infra/public/observability_logs/log_stream_query_state/src/url_state_storage_service.ts @@ -15,7 +15,7 @@ import * as rt from 'io-ts'; import { InvokeCreator } from 'xstate'; import { DurationInputObject } from 'moment'; import moment from 'moment'; -import { minimalTimeKeyRT } from '../../../../common/time'; +import { minimalTimeKeyRT, TimeRange } from '../../../../common/time'; import { datemathStringRT } from '../../../utils/datemath'; import { createPlainError, formatErrors } from '../../../../common/runtime_types'; import { replaceStateKeyInQueryString } from '../../../utils/url_state'; @@ -290,21 +290,33 @@ const decodePositionQueryValueFromUrl = (queryValueFromUrl: unknown) => { return legacyPositionStateInUrlRT.decode(queryValueFromUrl); }; -const ONE_HOUR = 3600000; -export const replaceLogFilterInQueryString = (query: Query, time?: number) => +export const replaceLogFilterInQueryString = (query: Query, time?: number, timeRange?: TimeRange) => replaceStateKeyInQueryString(defaultFilterStateKey, { query, - ...(time && !Number.isNaN(time) - ? { - timeRange: { - from: new Date(time - ONE_HOUR).toISOString(), - to: new Date(time + ONE_HOUR).toISOString(), - }, - } - : {}), + ...getTimeRange(time, timeRange), refreshInterval: DEFAULT_REFRESH_INTERVAL, }); +const getTimeRange = (time?: number, timeRange?: TimeRange) => { + if (timeRange) { + return { + timeRange: { + from: new Date(timeRange.startTime).toISOString(), + to: new Date(timeRange.endTime).toISOString(), + }, + }; + } else if (time) { + return { + timeRange: { + from: getTimeRangeStartFromTime(time), + to: getTimeRangeEndFromTime(time), + }, + }; + } else { + return {}; + } +}; + const defaultTimeRangeFromPositionOffset: DurationInputObject = { hours: 1 }; const getTimeRangeStartFromTime = (time: number): string => diff --git a/x-pack/plugins/infra/public/observability_logs/log_view_state/src/defaults.ts b/x-pack/plugins/infra/public/observability_logs/log_view_state/src/defaults.ts index eb31f91ed12fb..a5ce6f1fe5740 100644 --- a/x-pack/plugins/infra/public/observability_logs/log_view_state/src/defaults.ts +++ b/x-pack/plugins/infra/public/observability_logs/log_view_state/src/defaults.ts @@ -5,7 +5,7 @@ * 2.0. */ -const DEFAULT_LOG_VIEW_ID = 'default'; +export const DEFAULT_LOG_VIEW_ID = 'default'; export const DEFAULT_LOG_VIEW = { type: 'log-view-reference' as const, logViewId: DEFAULT_LOG_VIEW_ID, diff --git a/x-pack/plugins/infra/public/observability_logs/log_view_state/src/url_state_storage_service.ts b/x-pack/plugins/infra/public/observability_logs/log_view_state/src/url_state_storage_service.ts index 357c96905ccf3..ffe9743202284 100644 --- a/x-pack/plugins/infra/public/observability_logs/log_view_state/src/url_state_storage_service.ts +++ b/x-pack/plugins/infra/public/observability_logs/log_view_state/src/url_state_storage_service.ts @@ -52,44 +52,53 @@ export const initializeFromUrl = }: LogViewUrlStateDependencies): InvokeCreator => (_context, _event) => (send) => { - const logViewQueryValueFromUrl = urlStateStorage.get(logViewKey); - const logViewQueryE = decodeLogViewQueryValueFromUrl(logViewQueryValueFromUrl); - - const legacySourceIdQueryValueFromUrl = urlStateStorage.get(sourceIdKey); - const sourceIdQueryE = decodeSourceIdQueryValueFromUrl(legacySourceIdQueryValueFromUrl); - - if (Either.isLeft(logViewQueryE) || Either.isLeft(sourceIdQueryE)) { - withNotifyOnErrors(toastsService).onGetError( - createPlainError( - formatErrors([ - ...(Either.isLeft(logViewQueryE) ? logViewQueryE.left : []), - ...(Either.isLeft(sourceIdQueryE) ? sourceIdQueryE.left : []), - ]) - ) - ); + const logViewReference = getLogViewReferenceFromUrl({ + logViewKey, + sourceIdKey, + toastsService, + urlStateStorage, + }); - send({ - type: 'INITIALIZED_FROM_URL', - logViewReference: null, - }); - } else { - send({ - type: 'INITIALIZED_FROM_URL', - logViewReference: pipe( - // Via the legacy sourceId key - pipe( - sourceIdQueryE.right, - Either.fromNullable(null), - Either.map(convertSourceIdToReference) - ), - // Via the logView key - Either.alt(() => pipe(logViewQueryE.right, Either.fromNullable(null))), - Either.fold(identity, identity) - ), - }); - } + send({ + type: 'INITIALIZED_FROM_URL', + logViewReference, + }); }; +export const getLogViewReferenceFromUrl = ({ + logViewKey, + sourceIdKey, + toastsService, + urlStateStorage, +}: LogViewUrlStateDependencies): LogViewReference | null => { + const logViewQueryValueFromUrl = urlStateStorage.get(logViewKey!); + const logViewQueryE = decodeLogViewQueryValueFromUrl(logViewQueryValueFromUrl); + + const legacySourceIdQueryValueFromUrl = urlStateStorage.get(sourceIdKey!); + const sourceIdQueryE = decodeSourceIdQueryValueFromUrl(legacySourceIdQueryValueFromUrl); + + if (Either.isLeft(logViewQueryE) || Either.isLeft(sourceIdQueryE)) { + withNotifyOnErrors(toastsService).onGetError( + createPlainError( + formatErrors([ + ...(Either.isLeft(logViewQueryE) ? logViewQueryE.left : []), + ...(Either.isLeft(sourceIdQueryE) ? sourceIdQueryE.left : []), + ]) + ) + ); + + return null; + } else { + return pipe( + // Via the legacy sourceId key + pipe(sourceIdQueryE.right, Either.fromNullable(null), Either.map(convertSourceIdToReference)), + // Via the logView key + Either.alt(() => pipe(logViewQueryE.right, Either.fromNullable(null))), + Either.fold(identity, identity) + ); + } +}; + // NOTE: Certain navigations within the Logs solution will remove the logView URL key, // we want to ensure the logView key is present in the URL at all times by monitoring for it's removal. export const listenForUrlChanges = diff --git a/x-pack/plugins/infra/public/pages/link_to/link_to_logs.test.tsx b/x-pack/plugins/infra/public/pages/link_to/link_to_logs.test.tsx deleted file mode 100644 index 2ee56c425e680..0000000000000 --- a/x-pack/plugins/infra/public/pages/link_to/link_to_logs.test.tsx +++ /dev/null @@ -1,338 +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 { render, waitFor } from '@testing-library/react'; -import { createMemoryHistory } from 'history'; -import React from 'react'; -import { Router, Switch } from 'react-router-dom'; -import { Route } from '@kbn/shared-ux-router'; -import { httpServiceMock } from '@kbn/core/public/mocks'; -import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; -import { KibanaPageTemplate } from '@kbn/shared-ux-page-kibana-template'; -import { useLogView } from '../../hooks/use_log_view'; -import { - createLoadedUseLogViewMock, - createLoadingUseLogViewMock, -} from '../../hooks/use_log_view.mock'; -import { LinkToLogsPage } from './link_to_logs'; - -jest.mock('../../hooks/use_log_view'); -const useLogViewMock = useLogView as jest.MockedFunction; -const LOG_VIEW_REFERENCE = '(logViewId:default,type:log-view-reference)'; -const OTHER_LOG_VIEW_REFERENCE = '(logViewId:OTHER_SOURCE,type:log-view-reference)'; - -const renderRoutes = (routes: React.ReactElement) => { - const history = createMemoryHistory(); - const services = { - http: httpServiceMock.createStartContract(), - logViews: { - client: {}, - }, - observabilityShared: { - navigation: { - PageTemplate: KibanaPageTemplate, - }, - }, - }; - const renderResult = render( - - {routes} - - ); - - return { - ...renderResult, - history, - services, - }; -}; - -describe('LinkToLogsPage component', () => { - beforeEach(async () => { - useLogViewMock.mockImplementation(await createLoadedUseLogViewMock()); - }); - - afterEach(() => { - useLogViewMock.mockRestore(); - }); - - describe('default route', () => { - it('redirects to the stream at a given time filtered for a user-defined criterion', () => { - const { history } = renderRoutes( - - - - ); - - history.push('/link-to?time=1550671089404&filter=FILTER_FIELD:FILTER_VALUE'); - - expect(history.location.pathname).toEqual('/stream'); - - const searchParams = new URLSearchParams(history.location.search); - expect(searchParams.get('logView')).toEqual(LOG_VIEW_REFERENCE); - expect(searchParams.get('logFilter')).toMatchInlineSnapshot( - `"(query:(language:kuery,query:'FILTER_FIELD:FILTER_VALUE'),refreshInterval:(pause:!t,value:5000),timeRange:(from:'2019-02-20T12:58:09.404Z',to:'2019-02-20T14:58:09.404Z'))"` - ); - expect(searchParams.get('logPosition')).toMatchInlineSnapshot( - `"(position:(tiebreaker:0,time:1550671089404))"` - ); - }); - - it('redirects to the stream using a specific source id', () => { - const { history } = renderRoutes( - - - - ); - - history.push('/link-to/OTHER_SOURCE'); - - expect(history.location.pathname).toEqual('/stream'); - - const searchParams = new URLSearchParams(history.location.search); - expect(searchParams.get('logView')).toEqual(OTHER_LOG_VIEW_REFERENCE); - expect(searchParams.get('logFilter')).toMatchInlineSnapshot( - `"(query:(language:kuery,query:''),refreshInterval:(pause:!t,value:5000))"` - ); - expect(searchParams.get('logPosition')).toEqual(null); - }); - }); - - describe('logs route', () => { - it('redirects to the stream at a given time filtered for a user-defined criterion', () => { - const { history } = renderRoutes( - - - - ); - - history.push('/link-to/logs?time=1550671089404&filter=FILTER_FIELD:FILTER_VALUE'); - - expect(history.location.pathname).toEqual('/stream'); - - const searchParams = new URLSearchParams(history.location.search); - expect(searchParams.get('logView')).toEqual(LOG_VIEW_REFERENCE); - expect(searchParams.get('logFilter')).toMatchInlineSnapshot( - `"(query:(language:kuery,query:'FILTER_FIELD:FILTER_VALUE'),refreshInterval:(pause:!t,value:5000),timeRange:(from:'2019-02-20T12:58:09.404Z',to:'2019-02-20T14:58:09.404Z'))"` - ); - expect(searchParams.get('logPosition')).toMatchInlineSnapshot( - `"(position:(tiebreaker:0,time:1550671089404))"` - ); - }); - - it('redirects to the stream using a specific source id', () => { - const { history } = renderRoutes( - - - - ); - - history.push('/link-to/OTHER_SOURCE/logs'); - - expect(history.location.pathname).toEqual('/stream'); - - const searchParams = new URLSearchParams(history.location.search); - expect(searchParams.get('logView')).toEqual(OTHER_LOG_VIEW_REFERENCE); - expect(searchParams.get('logFilter')).toMatchInlineSnapshot( - `"(query:(language:kuery,query:''),refreshInterval:(pause:!t,value:5000))"` - ); - expect(searchParams.get('logPosition')).toEqual(null); - }); - }); - - describe('host-logs route', () => { - it('redirects to the stream filtered for a host', () => { - const { history } = renderRoutes( - - - - ); - - history.push('/link-to/host-logs/HOST_NAME'); - - expect(history.location.pathname).toEqual('/stream'); - - const searchParams = new URLSearchParams(history.location.search); - expect(searchParams.get('logView')).toEqual(LOG_VIEW_REFERENCE); - expect(searchParams.get('logFilter')).toMatchInlineSnapshot( - `"(query:(language:kuery,query:'host.name: HOST_NAME'),refreshInterval:(pause:!t,value:5000))"` - ); - expect(searchParams.get('logPosition')).toEqual(null); - }); - - it('redirects to the stream at a given time filtered for a host and a user-defined criterion', () => { - const { history } = renderRoutes( - - - - ); - - history.push( - '/link-to/host-logs/HOST_NAME?time=1550671089404&filter=FILTER_FIELD:FILTER_VALUE' - ); - - expect(history.location.pathname).toEqual('/stream'); - - const searchParams = new URLSearchParams(history.location.search); - expect(searchParams.get('logView')).toEqual(LOG_VIEW_REFERENCE); - expect(searchParams.get('logFilter')).toMatchInlineSnapshot( - `"(query:(language:kuery,query:'(host.name: HOST_NAME) and (FILTER_FIELD:FILTER_VALUE)'),refreshInterval:(pause:!t,value:5000),timeRange:(from:'2019-02-20T12:58:09.404Z',to:'2019-02-20T14:58:09.404Z'))"` - ); - expect(searchParams.get('logPosition')).toMatchInlineSnapshot( - `"(position:(tiebreaker:0,time:1550671089404))"` - ); - }); - - it('redirects to the stream filtered for a host using a specific source id', () => { - const { history } = renderRoutes( - - - - ); - - history.push('/link-to/OTHER_SOURCE/host-logs/HOST_NAME'); - - expect(history.location.pathname).toEqual('/stream'); - - const searchParams = new URLSearchParams(history.location.search); - expect(searchParams.get('logView')).toEqual(OTHER_LOG_VIEW_REFERENCE); - expect(searchParams.get('logFilter')).toMatchInlineSnapshot( - `"(query:(language:kuery,query:'host.name: HOST_NAME'),refreshInterval:(pause:!t,value:5000))"` - ); - expect(searchParams.get('logPosition')).toEqual(null); - }); - - it('renders a loading page while loading the source configuration', async () => { - useLogViewMock.mockImplementation(createLoadingUseLogViewMock()); - - const { history, queryByTestId } = renderRoutes( - - - - ); - - history.push('/link-to/host-logs/HOST_NAME'); - await waitFor(() => { - expect(queryByTestId('nodeLoadingPage-host')).not.toBeEmptyDOMElement(); - }); - }); - }); - - describe('container-logs route', () => { - it('redirects to the stream filtered for a container', () => { - const { history } = renderRoutes( - - - - ); - - history.push('/link-to/container-logs/CONTAINER_ID'); - - expect(history.location.pathname).toEqual('/stream'); - - const searchParams = new URLSearchParams(history.location.search); - expect(searchParams.get('logView')).toEqual(LOG_VIEW_REFERENCE); - expect(searchParams.get('logFilter')).toMatchInlineSnapshot( - `"(query:(language:kuery,query:'container.id: CONTAINER_ID'),refreshInterval:(pause:!t,value:5000))"` - ); - expect(searchParams.get('logPosition')).toEqual(null); - }); - - it('redirects to the stream at a given time filtered for a container and a user-defined criterion', () => { - const { history } = renderRoutes( - - - - ); - - history.push( - '/link-to/container-logs/CONTAINER_ID?time=1550671089404&filter=FILTER_FIELD:FILTER_VALUE' - ); - - expect(history.location.pathname).toEqual('/stream'); - - const searchParams = new URLSearchParams(history.location.search); - expect(searchParams.get('logView')).toEqual(LOG_VIEW_REFERENCE); - expect(searchParams.get('logFilter')).toMatchInlineSnapshot( - `"(query:(language:kuery,query:'(container.id: CONTAINER_ID) and (FILTER_FIELD:FILTER_VALUE)'),refreshInterval:(pause:!t,value:5000),timeRange:(from:'2019-02-20T12:58:09.404Z',to:'2019-02-20T14:58:09.404Z'))"` - ); - expect(searchParams.get('logPosition')).toMatchInlineSnapshot( - `"(position:(tiebreaker:0,time:1550671089404))"` - ); - }); - - it('renders a loading page while loading the source configuration', () => { - useLogViewMock.mockImplementation(createLoadingUseLogViewMock()); - - const { history, queryByTestId } = renderRoutes( - - - - ); - - history.push('/link-to/container-logs/CONTAINER_ID'); - - expect(queryByTestId('nodeLoadingPage-container')).not.toBeEmptyDOMElement(); - }); - }); - - describe('pod-logs route', () => { - it('redirects to the stream filtered for a pod', () => { - const { history } = renderRoutes( - - - - ); - - history.push('/link-to/pod-logs/POD_UID'); - - expect(history.location.pathname).toEqual('/stream'); - - const searchParams = new URLSearchParams(history.location.search); - expect(searchParams.get('logView')).toEqual(LOG_VIEW_REFERENCE); - expect(searchParams.get('logFilter')).toMatchInlineSnapshot( - `"(query:(language:kuery,query:'kubernetes.pod.uid: POD_UID'),refreshInterval:(pause:!t,value:5000))"` - ); - expect(searchParams.get('logPosition')).toEqual(null); - }); - - it('redirects to the stream at a given time filtered for a pod and a user-defined criterion', () => { - const { history } = renderRoutes( - - - - ); - - history.push('/link-to/pod-logs/POD_UID?time=1550671089404&filter=FILTER_FIELD:FILTER_VALUE'); - - expect(history.location.pathname).toEqual('/stream'); - - const searchParams = new URLSearchParams(history.location.search); - expect(searchParams.get('logView')).toEqual(LOG_VIEW_REFERENCE); - expect(searchParams.get('logFilter')).toMatchInlineSnapshot( - `"(query:(language:kuery,query:'(kubernetes.pod.uid: POD_UID) and (FILTER_FIELD:FILTER_VALUE)'),refreshInterval:(pause:!t,value:5000),timeRange:(from:'2019-02-20T12:58:09.404Z',to:'2019-02-20T14:58:09.404Z'))"` - ); - expect(searchParams.get('logPosition')).toMatchInlineSnapshot( - `"(position:(tiebreaker:0,time:1550671089404))"` - ); - }); - - it('renders a loading page while loading the source configuration', () => { - useLogViewMock.mockImplementation(createLoadingUseLogViewMock()); - - const { history, queryByTestId } = renderRoutes( - - - - ); - - history.push('/link-to/pod-logs/POD_UID'); - - expect(queryByTestId('nodeLoadingPage-pod')).not.toBeEmptyDOMElement(); - }); - }); -}); diff --git a/x-pack/plugins/infra/public/pages/link_to/link_to_logs.tsx b/x-pack/plugins/infra/public/pages/link_to/link_to_logs.tsx index 60afe9c98bd54..aa93f16fadf61 100644 --- a/x-pack/plugins/infra/public/pages/link_to/link_to_logs.tsx +++ b/x-pack/plugins/infra/public/pages/link_to/link_to_logs.tsx @@ -22,6 +22,11 @@ interface LinkToPageProps { const ITEM_TYPES = inventoryModels.map((m) => m.id).join('|'); +/** + * @deprecated Link-to routes shouldn't be used anymore + * Instead please use locators registered for the infra plugin + * LogsLocator & NodeLogsLocator + */ export const LinkToLogsPage: React.FC = (props) => { return ( diff --git a/x-pack/plugins/infra/public/pages/link_to/redirect_to_logs.test.tsx b/x-pack/plugins/infra/public/pages/link_to/redirect_to_logs.test.tsx deleted file mode 100644 index c5c3e4d507582..0000000000000 --- a/x-pack/plugins/infra/public/pages/link_to/redirect_to_logs.test.tsx +++ /dev/null @@ -1,62 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { createLocation } from 'history'; -import React from 'react'; -import { matchPath } from 'react-router-dom'; -import { shallow } from 'enzyme'; - -import { RedirectToLogs } from './redirect_to_logs'; - -describe('RedirectToLogs component', () => { - it('renders a redirect with the correct position', () => { - const component = shallow( - - ); - - expect(component).toMatchInlineSnapshot(` - - `); - }); - - it('renders a redirect with the correct user-defined filter', () => { - const component = shallow( - - ); - - expect(component).toMatchInlineSnapshot(` - - `); - }); - - it('renders a redirect with the correct custom source id', () => { - const component = shallow( - - ); - - expect(component).toMatchInlineSnapshot(` - - `); - }); -}); - -const createRouteComponentProps = (path: string) => { - const location = createLocation(path); - return { - match: matchPath(location.pathname, { path: '/:sourceId?/logs' }) as any, - history: null as any, - location, - }; -}; diff --git a/x-pack/plugins/infra/public/pages/link_to/redirect_to_logs.tsx b/x-pack/plugins/infra/public/pages/link_to/redirect_to_logs.tsx index 4d4533596fd57..80b9ff09180e0 100644 --- a/x-pack/plugins/infra/public/pages/link_to/redirect_to_logs.tsx +++ b/x-pack/plugins/infra/public/pages/link_to/redirect_to_logs.tsx @@ -5,31 +5,33 @@ * 2.0. */ -import React from 'react'; -import { match as RouteMatch, Redirect, RouteComponentProps } from 'react-router-dom'; -import { flowRight } from 'lodash'; -import { replaceLogPositionInQueryString } from '../../observability_logs/log_stream_position_state/src/url_state_storage_service'; -import { replaceLogFilterInQueryString } from '../../observability_logs/log_stream_query_state'; +import { useEffect } from 'react'; +import { useLocation, useParams } from 'react-router-dom'; import { getFilterFromLocation, getTimeFromLocation } from './query_params'; -import { replaceLogViewInQueryString } from '../../observability_logs/log_view_state'; +import { useKibanaContextForPlugin } from '../../hooks/use_kibana'; +import { DEFAULT_LOG_VIEW } from '../../observability_logs/log_view_state'; -type RedirectToLogsType = RouteComponentProps<{}>; +export const RedirectToLogs = () => { + const { logViewId } = useParams<{ logViewId?: string }>(); + const location = useLocation(); -interface RedirectToLogsProps extends RedirectToLogsType { - match: RouteMatch<{ - logViewId?: string; - }>; -} + const { + services: { locators }, + } = useKibanaContextForPlugin(); -export const RedirectToLogs = ({ location, match }: RedirectToLogsProps) => { - const logViewId = match.params.logViewId || 'default'; const filter = getFilterFromLocation(location); const time = getTimeFromLocation(location); - const searchString = flowRight( - replaceLogFilterInQueryString({ language: 'kuery', query: filter }, time), - replaceLogPositionInQueryString(time), - replaceLogViewInQueryString({ type: 'log-view-reference', logViewId }) - )(''); - return ; + useEffect(() => { + locators.logsLocator.navigate( + { + time, + filter, + logView: { ...DEFAULT_LOG_VIEW, logViewId: logViewId || DEFAULT_LOG_VIEW.logViewId }, + }, + { replace: true } + ); + }, [filter, locators.logsLocator, logViewId, time]); + + return null; }; diff --git a/x-pack/plugins/infra/public/pages/link_to/redirect_to_node_logs.tsx b/x-pack/plugins/infra/public/pages/link_to/redirect_to_node_logs.tsx index 9ac23a635dcd7..483e8ccf01e78 100644 --- a/x-pack/plugins/infra/public/pages/link_to/redirect_to_node_logs.tsx +++ b/x-pack/plugins/infra/public/pages/link_to/redirect_to_node_logs.tsx @@ -5,21 +5,13 @@ * 2.0. */ -import { i18n } from '@kbn/i18n'; -import { LinkDescriptor } from '@kbn/observability-shared-plugin/public'; -import React from 'react'; -import { Redirect, RouteComponentProps } from 'react-router-dom'; -import useMount from 'react-use/lib/useMount'; -import { flowRight } from 'lodash'; -import { findInventoryFields } from '../../../common/inventory_models'; +import { LinkDescriptor } from '@kbn/observability-plugin/public'; +import { useEffect } from 'react'; +import { RouteComponentProps } from 'react-router-dom'; import { InventoryItemType } from '../../../common/inventory_models/types'; -import { LoadingPage } from '../../components/loading_page'; import { useKibanaContextForPlugin } from '../../hooks/use_kibana'; -import { useLogView } from '../../hooks/use_log_view'; -import { replaceLogFilterInQueryString } from '../../observability_logs/log_stream_query_state'; +import { DEFAULT_LOG_VIEW_ID } from '../../observability_logs/log_view_state'; import { getFilterFromLocation, getTimeFromLocation } from './query_params'; -import { replaceLogPositionInQueryString } from '../../observability_logs/log_stream_position_state/src/url_state_storage_service'; -import { replaceLogViewInQueryString } from '../../observability_logs/log_view_state'; type RedirectToNodeLogsType = RouteComponentProps<{ nodeId: string; @@ -29,46 +21,31 @@ type RedirectToNodeLogsType = RouteComponentProps<{ export const RedirectToNodeLogs = ({ match: { - params: { nodeId, nodeType, logViewId = 'default' }, + params: { nodeId, nodeType, logViewId = DEFAULT_LOG_VIEW_ID }, }, location, }: RedirectToNodeLogsType) => { - const { services } = useKibanaContextForPlugin(); - const { isLoading, load } = useLogView({ - initialLogViewReference: { type: 'log-view-reference', logViewId }, - logViews: services.logViews.client, - }); + const { + services: { locators }, + } = useKibanaContextForPlugin(); - useMount(() => { - load(); - }); - - if (isLoading) { - return ( - - ); - } - - const nodeFilter = `${findInventoryFields(nodeType).id}: ${nodeId}`; - const userFilter = getFilterFromLocation(location); - const filter = userFilter ? `(${nodeFilter}) and (${userFilter})` : nodeFilter; + const filter = getFilterFromLocation(location); const time = getTimeFromLocation(location); - const searchString = flowRight( - replaceLogFilterInQueryString({ language: 'kuery', query: filter }, time), - replaceLogPositionInQueryString(time), - replaceLogViewInQueryString({ type: 'log-view-reference', logViewId }) - )(''); + useEffect(() => { + locators.nodeLogsLocator.navigate( + { + nodeId, + nodeType, + time, + filter, + logView: { type: 'log-view-reference', logViewId }, + }, + { replace: true } + ); + }, [filter, locators.nodeLogsLocator, logViewId, nodeId, nodeType, time]); - return ; + return null; }; export const getNodeLogsUrl = ({ diff --git a/x-pack/plugins/infra/public/pages/metrics/hosts/components/tabs/logs/logs_link_to_stream.tsx b/x-pack/plugins/infra/public/pages/metrics/hosts/components/tabs/logs/logs_link_to_stream.tsx index 618d511b93cac..f5c2101317f01 100644 --- a/x-pack/plugins/infra/public/pages/metrics/hosts/components/tabs/logs/logs_link_to_stream.tsx +++ b/x-pack/plugins/infra/public/pages/metrics/hosts/components/tabs/logs/logs_link_to_stream.tsx @@ -5,47 +5,32 @@ * 2.0. */ import React from 'react'; -import { stringify } from 'querystring'; -import { encode } from '@kbn/rison'; import { RedirectAppLinks } from '@kbn/shared-ux-link-redirect-app'; import { EuiButtonEmpty } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { useKibanaContextForPlugin } from '../../../../../../hooks/use_kibana'; interface LogsLinkToStreamProps { - startTimestamp: number; - endTimestamp: number; + startTime: number; + endTime: number; query: string; } -export const LogsLinkToStream = ({ - startTimestamp, - endTimestamp, - query, -}: LogsLinkToStreamProps) => { +export const LogsLinkToStream = ({ startTime, endTime, query }: LogsLinkToStreamProps) => { const { services } = useKibanaContextForPlugin(); - const { http } = services; - - const queryString = new URLSearchParams( - stringify({ - logPosition: encode({ - start: new Date(startTimestamp), - end: new Date(endTimestamp), - streamLive: false, - }), - logFilter: encode({ - kind: 'kuery', - expression: query, - }), - }) - ); - - const viewInLogsUrl = http.basePath.prepend(`/app/logs/stream?${queryString}`); + const { locators } = services; return ( { - + diff --git a/x-pack/plugins/infra/public/plugin.ts b/x-pack/plugins/infra/public/plugin.ts index 1c2c9ec90dd7c..899e632961c85 100644 --- a/x-pack/plugins/infra/public/plugin.ts +++ b/x-pack/plugins/infra/public/plugin.ts @@ -18,6 +18,7 @@ import { enableInfrastructureHostsView } from '@kbn/observability-plugin/public' import { ObservabilityTriggerId } from '@kbn/observability-shared-plugin/common'; import { BehaviorSubject, combineLatest, from } from 'rxjs'; import { map } from 'rxjs/operators'; +import { DISCOVER_APP_TARGET, LOGS_APP_TARGET } from '../common/constants'; import { defaultLogViewsStaticConfig } from '../common/log_views'; import { InfraPublicConfig } from '../common/plugin_config_types'; import { createInventoryMetricRuleType } from './alerting/inventory'; @@ -28,6 +29,13 @@ import { createLazyHostMetricsTable } from './components/infrastructure_node_met import { createLazyPodMetricsTable } from './components/infrastructure_node_metrics_tables/pod/create_lazy_pod_metrics_table'; import { LOG_STREAM_EMBEDDABLE } from './components/log_stream/log_stream_embeddable'; import { LogStreamEmbeddableFactoryDefinition } from './components/log_stream/log_stream_embeddable_factory'; +import { + DiscoverLogsLocatorDefinition, + DiscoverNodeLogsLocatorDefinition, + InfraLocators, + LogsLocatorDefinition, + NodeLogsLocatorDefinition, +} from './locators'; import { createMetricsFetchData, createMetricsHasData } from './metrics_overview_fetchers'; import { registerFeatures } from './register_feature'; import { InventoryViewsService } from './services/inventory_views'; @@ -51,6 +59,8 @@ export class Plugin implements InfraClientPluginClass { private logViews: LogViewsService; private metricsExplorerViews: MetricsExplorerViewsService; private telemetry: TelemetryService; + private locators?: InfraLocators; + private appTarget: string; private readonly appUpdater$ = new BehaviorSubject(() => ({})); constructor(context: PluginInitializerContext) { @@ -62,6 +72,7 @@ export class Plugin implements InfraClientPluginClass { }); this.metricsExplorerViews = new MetricsExplorerViewsService(); this.telemetry = new TelemetryService(); + this.appTarget = this.config.logs.app_target; } setup(core: InfraClientCoreSetup, pluginsSetup: InfraClientSetupDeps) { @@ -148,7 +159,21 @@ export class Plugin implements InfraClientPluginClass { new LogStreamEmbeddableFactoryDefinition(core.getStartServices) ); - if (this.config.logs.app_target === 'discover') { + // Register Locators + let logsLocator = pluginsSetup.share.url.locators.create(new LogsLocatorDefinition({ core })); + let nodeLogsLocator = pluginsSetup.share.url.locators.create( + new NodeLogsLocatorDefinition({ core }) + ); + + if (this.appTarget === DISCOVER_APP_TARGET) { + // Register Locators + logsLocator = pluginsSetup.share.url.locators.create( + new DiscoverLogsLocatorDefinition({ core }) + ); + nodeLogsLocator = pluginsSetup.share.url.locators.create( + new DiscoverNodeLogsLocatorDefinition({ core }) + ); + core.application.register({ id: 'logs-to-discover', title: '', @@ -156,16 +181,15 @@ export class Plugin implements InfraClientPluginClass { appRoute: '/app/logs', mount: async (params: AppMountParameters) => { // mount callback should not use setup dependencies, get start dependencies instead - const [coreStart, plugins, pluginStart] = await core.getStartServices(); - + const [coreStart, , pluginStart] = await core.getStartServices(); const { renderApp } = await import('./apps/discover_app'); - return renderApp(coreStart, plugins, pluginStart, params); + return renderApp(coreStart, pluginStart, params); }, }); } - if (this.config.logs.app_target === 'logs-ui') { + if (this.appTarget === LOGS_APP_TARGET) { core.application.register({ id: 'logs', title: i18n.translate('xpack.infra.logs.pluginTitle', { @@ -291,6 +315,15 @@ export class Plugin implements InfraClientPluginClass { // Setup telemetry events this.telemetry.setup({ analytics: core.analytics }); + + this.locators = { + logsLocator, + nodeLogsLocator, + }; + + return { + locators: this.locators, + }; } start(core: InfraClientCoreStart, plugins: InfraClientStartDeps) { @@ -317,6 +350,7 @@ export class Plugin implements InfraClientPluginClass { logViews, metricsExplorerViews, telemetry, + locators: this.locators!, ContainerMetricsTable: createLazyContainerMetricsTable(getStartServices), HostMetricsTable: createLazyHostMetricsTable(getStartServices), PodMetricsTable: createLazyPodMetricsTable(getStartServices), diff --git a/x-pack/plugins/infra/public/types.ts b/x-pack/plugins/infra/public/types.ts index 843eb1ed85551..d48d58fd10642 100644 --- a/x-pack/plugins/infra/public/types.ts +++ b/x-pack/plugins/infra/public/types.ts @@ -48,15 +48,19 @@ import { InventoryViewsServiceStart } from './services/inventory_views'; import { LogViewsServiceStart } from './services/log_views'; import { MetricsExplorerViewsServiceStart } from './services/metrics_explorer_views'; import { ITelemetryClient } from './services/telemetry'; +import { InfraLocators } from './locators'; // Our own setup and start contract values -export type InfraClientSetupExports = void; +export interface InfraClientSetupExports { + locators: InfraLocators; +} export interface InfraClientStartExports { inventoryViews: InventoryViewsServiceStart; logViews: LogViewsServiceStart; metricsExplorerViews: MetricsExplorerViewsServiceStart; telemetry: ITelemetryClient; + locators: InfraLocators; ContainerMetricsTable: ( props: UseNodeMetricsTableOptions & Partial ) => JSX.Element; diff --git a/x-pack/plugins/infra/server/plugin.ts b/x-pack/plugins/infra/server/plugin.ts index eb8777665895a..d1613147365fc 100644 --- a/x-pack/plugins/infra/server/plugin.ts +++ b/x-pack/plugins/infra/server/plugin.ts @@ -17,7 +17,12 @@ import { handleEsError } from '@kbn/es-ui-shared-plugin/server'; import { i18n } from '@kbn/i18n'; import { Logger } from '@kbn/logging'; import { DEFAULT_SPACE_ID } from '@kbn/spaces-plugin/common'; -import { LOGS_FEATURE_ID, METRICS_FEATURE_ID } from '../common/constants'; +import { + DISCOVER_APP_TARGET, + LOGS_APP_TARGET, + LOGS_FEATURE_ID, + METRICS_FEATURE_ID, +} from '../common/constants'; import { defaultLogViewsStaticConfig } from '../common/log_views'; import { publicConfigKeys } from '../common/plugin_config_types'; import { configDeprecations, getInfraDeprecationsFactory } from './deprecations'; @@ -63,9 +68,12 @@ import { UsageCollector } from './usage/usage_collector'; export const config: PluginConfigDescriptor = { schema: schema.object({ logs: schema.object({ - app_target: schema.oneOf([schema.literal('logs-ui'), schema.literal('discover')], { - defaultValue: 'logs-ui', - }), + app_target: schema.oneOf( + [schema.literal(LOGS_APP_TARGET), schema.literal(DISCOVER_APP_TARGET)], + { + defaultValue: LOGS_APP_TARGET, + } + ), }), alerting: schema.object({ inventory_threshold: schema.object({ diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index f2d39db78cea3..0110ce7066048 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -16977,7 +16977,6 @@ "xpack.infra.nodeContextMenu.viewUptimeLink": "{inventoryName} en disponibilité", "xpack.infra.nodeDetails.tabs.metadata.seeMore": "+{count} en plus", "xpack.infra.parseInterval.errorMessage": "{value} n'est pas une chaîne d'intervalle", - "xpack.infra.redirectToNodeLogs.loadingNodeLogsMessage": "Chargement de logs {nodeType}", "xpack.infra.snapshot.missingSnapshotMetricError": "L'agrégation de {metric} pour {nodeType} n'est pas disponible.", "xpack.infra.sourceConfiguration.logIndicesRecommendedValue": "La valeur recommandée est {defaultValue}", "xpack.infra.sourceConfiguration.metricIndicesRecommendedValue": "La valeur recommandée est {defaultValue}", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index c36cf65aa236c..ec8b4d8eb9ee6 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -16976,7 +16976,6 @@ "xpack.infra.nodeContextMenu.viewUptimeLink": "アップタイムの{inventoryName}", "xpack.infra.nodeDetails.tabs.metadata.seeMore": "+ 追加の{count}", "xpack.infra.parseInterval.errorMessage": "{value}は間隔文字列ではありません", - "xpack.infra.redirectToNodeLogs.loadingNodeLogsMessage": "{nodeType} ログを読み込み中", "xpack.infra.snapshot.missingSnapshotMetricError": "{nodeType}の{metric}のアグリゲーションを利用できません。", "xpack.infra.sourceConfiguration.logIndicesRecommendedValue": "推奨値は {defaultValue} です", "xpack.infra.sourceConfiguration.metricIndicesRecommendedValue": "推奨値は {defaultValue} です", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index bd4cdc9eef4a5..9e23df1f33567 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -16978,7 +16978,6 @@ "xpack.infra.nodeContextMenu.viewUptimeLink": "Uptime 中的 {inventoryName}", "xpack.infra.nodeDetails.tabs.metadata.seeMore": "+ 另外 {count} 个", "xpack.infra.parseInterval.errorMessage": "{value} 不是时间间隔字符串", - "xpack.infra.redirectToNodeLogs.loadingNodeLogsMessage": "正在加载 {nodeType} 日志", "xpack.infra.snapshot.missingSnapshotMetricError": "{nodeType} 的 {metric} 聚合不可用。", "xpack.infra.sourceConfiguration.logIndicesRecommendedValue": "推荐值为 {defaultValue}", "xpack.infra.sourceConfiguration.metricIndicesRecommendedValue": "推荐值为 {defaultValue}", diff --git a/x-pack/test/functional/apps/infra/link_to.ts b/x-pack/test/functional/apps/infra/link_to.ts index 6598e0e03d6bc..7ad37696f5a46 100644 --- a/x-pack/test/functional/apps/infra/link_to.ts +++ b/x-pack/test/functional/apps/infra/link_to.ts @@ -10,7 +10,8 @@ import { URL } from 'url'; import { FtrProviderContext } from '../../ftr_provider_context'; const ONE_HOUR = 60 * 60 * 1000; -const LOG_VIEW_REFERENCE = '(logViewId:default,type:log-view-reference)'; +const LOG_VIEW_ID = 'testView'; +const LOG_VIEW_REFERENCE = `(logViewId:${LOG_VIEW_ID},type:log-view-reference)`; export default ({ getPageObjects, getService }: FtrProviderContext) => { const pageObjects = getPageObjects(['common']); @@ -24,36 +25,73 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const traceId = '433b4651687e18be2c6c8e3b11f53d09'; describe('link-to Logs', function () { - it('redirects to the logs app and parses URL search params correctly', async () => { - const location = { - hash: '', - pathname: '/link-to', - search: `time=${timestamp}&filter=trace.id:${traceId}`, - state: undefined, - }; - - await pageObjects.common.navigateToUrlWithBrowserHistory( - 'infraLogs', - location.pathname, - location.search, - { - ensureCurrentUrl: false, - } - ); - await retry.tryForTime(5000, async () => { - const currentUrl = await browser.getCurrentUrl(); - const parsedUrl = new URL(currentUrl); - const documentTitle = await browser.getTitle(); - - expect(parsedUrl.pathname).to.be('/app/logs/stream'); - expect(parsedUrl.searchParams.get('logFilter')).to.be( - `(query:(language:kuery,query:\'trace.id:${traceId}'),refreshInterval:(pause:!t,value:5000),timeRange:(from:'${startDate}',to:'${endDate}'))` + describe('Redirect to Logs', function () { + it('redirects to the logs app and parses URL search params correctly', async () => { + const location = { + hash: '', + pathname: `/link-to/${LOG_VIEW_ID}`, + search: `time=${timestamp}&filter=trace.id:${traceId}`, + state: undefined, + }; + + await pageObjects.common.navigateToUrlWithBrowserHistory( + 'infraLogs', + location.pathname, + location.search, + { + ensureCurrentUrl: false, + } ); - expect(parsedUrl.searchParams.get('logPosition')).to.be( - `(position:(tiebreaker:0,time:${timestamp}))` + return await retry.tryForTime(5000, async () => { + const currentUrl = await browser.getCurrentUrl(); + const parsedUrl = new URL(currentUrl); + const documentTitle = await browser.getTitle(); + + expect(parsedUrl.pathname).to.be('/app/logs/stream'); + expect(parsedUrl.searchParams.get('logFilter')).to.be( + `(query:(language:kuery,query:\'trace.id:${traceId}'),refreshInterval:(pause:!t,value:5000),timeRange:(from:'${startDate}',to:'${endDate}'))` + ); + expect(parsedUrl.searchParams.get('logPosition')).to.be( + `(position:(tiebreaker:0,time:${timestamp}))` + ); + expect(parsedUrl.searchParams.get('logView')).to.be(LOG_VIEW_REFERENCE); + expect(documentTitle).to.contain('Stream - Logs - Observability - Elastic'); + }); + }); + }); + describe('Redirect to Node Logs', function () { + it('redirects to the logs app and parses URL search params correctly', async () => { + const nodeId = 1234; + const location = { + hash: '', + pathname: `/link-to/${LOG_VIEW_ID}/pod-logs/${nodeId}`, + search: `time=${timestamp}&filter=trace.id:${traceId}`, + state: undefined, + }; + + await pageObjects.common.navigateToUrlWithBrowserHistory( + 'infraLogs', + location.pathname, + location.search, + { + ensureCurrentUrl: false, + } ); - expect(parsedUrl.searchParams.get('logView')).to.be(LOG_VIEW_REFERENCE); - expect(documentTitle).to.contain('Stream - Logs - Observability - Elastic'); + await retry.tryForTime(5000, async () => { + const currentUrl = await browser.getCurrentUrl(); + const parsedUrl = new URL(currentUrl); + const documentTitle = await browser.getTitle(); + + expect(parsedUrl.pathname).to.be('/app/logs/stream'); + expect(parsedUrl.searchParams.get('logFilter')).to.be( + `(query:(language:kuery,query:\'(kubernetes.pod.uid: 1234) and (trace.id:${traceId})\'),refreshInterval:(pause:!t,value:5000),timeRange:(from:'${startDate}',to:'${endDate}'))` + ); + expect(parsedUrl.searchParams.get('logPosition')).to.be( + `(position:(tiebreaker:0,time:${timestamp}))` + ); + expect(parsedUrl.searchParams.get('logView')).to.be(LOG_VIEW_REFERENCE); + expect(documentTitle).to.contain('Stream - Logs - Observability - Elastic'); + }); }); }); }); From 596c7b3e70f41df18d1a4bb7058ba1f6fcd44e89 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Wed, 17 May 2023 06:20:04 -0600 Subject: [PATCH 06/78] [maps] distance spatial join (#156618) Fixes https://github.com/elastic/kibana/issues/154605 PR adds new layer wizard for spatial join. Wizard provides an easy interface to create spatial join as well as advertising the capability in the main layer creation work flow. Screen Shot 2023-05-04 at 12 16 45 PM Screen Shot 2023-05-04 at 12 17 07 PM PR renames `Terms joins` editor panel to `Joins` and updates panel to accommodate spatial joins. Displays UI for creating, editing and deleting spatial joins. Screen Shot 2023-05-04 at 12 17 20 PM Screen Shot 2023-05-04 at 12 41 39 PM Screen Shot 2023-05-04 at 12 17 25 PM Screen Shot 2023-05-04 at 12 17 37 PM PR also updates inspector request registration name and description to provide less technical names that provide better meaning of what request is fetching and how everything fits together. I think this really helps understandability of join requests Screen Shot 2023-05-04 at 12 22 56 PM #### Known issues Issues discovered by this PR that are in main and will be resolved separately. * When using spatial join wizard, if there are no matches to left source then layer gets stuck in loading state https://github.com/elastic/kibana/issues/156630 * Term join left field change not applied as expected https://github.com/elastic/kibana/issues/156631 #### Developer level changes LayerDescriptor * Changes joins from `JoinDescriptor` to `Partial`. This did not change the content, just updated the type to better reflect contents. JoinDescriptor * Changes right from `JoinSourceDescriptor` to `Partial`. This did not change the content, just updated the type to better reflect contents. IVectorLayer interface changes * Remove getJoinsDisabledReason * Remove showJoinEditor IVectorSource interface changes * Replaced showJoinEditor with supportsJoins * Removed getJoinsDisabledReason Replaced GeoIndexPatternSelect prop `value` with `dataView`. 1) provides better symmetry since on change return DataView 2) First time GeoIndexPatternSelect need to use a pre-loaded data view. By passing in DataView, loading state can be more easily handled. --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Nick Peihl --- src/plugins/telemetry/schema/oss_plugins.json | 4 +- test/functional/services/inspector.ts | 10 + x-pack/plugins/maps/common/constants.ts | 6 +- .../layer_descriptor_types.ts | 4 +- .../source_descriptor_types.ts | 18 +- .../common/migrations/add_type_to_termjoin.ts | 2 +- .../maps/common/migrations/join_agg_key.ts | 8 +- .../maps/common/migrations/references.ts | 3 +- .../common/telemetry/layer_stats_collector.ts | 23 +- .../sample_map_saved_objects.json | 2 +- x-pack/plugins/maps/common/telemetry/types.ts | 1 + .../maps/public/actions/layer_actions.ts | 22 +- .../maps/public/classes/joins/inner_join.ts | 29 +- .../public/classes/joins/is_spatial_join.ts | 13 + .../blended_vector_layer.ts | 8 - .../geojson_vector_layer.tsx | 2 +- .../perform_inner_joins.ts | 2 +- .../layers/vector_layer/vector_layer.tsx | 60 ++-- .../layer_template.test.tsx.snap | 2 +- .../choropleth_layer_wizard.tsx | 2 +- .../layer_template.tsx | 12 +- .../wizards/icons/spatial_join_layer_icon.tsx | 49 +++ .../layers/wizards/load_layer_wizards.ts | 13 +- .../wizards/spatial_join_wizard/index.ts | 9 + .../spatial_join_wizard_config.tsx | 29 ++ .../create_spatial_join_layer_descriptor.ts | 93 ++++++ .../wizard_form/distance_form.tsx | 99 ++++++ .../spatial_join_wizard/wizard_form/index.ts | 9 + .../wizard_form/left_source_panel.tsx | 54 ++++ .../wizard_form/relationship_expression.tsx | 63 ++++ .../wizard_form/right_source_panel.tsx | 61 ++++ .../wizard_form/wizard_form.tsx | 98 ++++++ .../clusters_layer_wizard.tsx | 3 +- .../create_source_editor.js | 2 +- .../es_geo_grid_source.test.ts | 1 + .../es_geo_grid_source/es_geo_grid_source.tsx | 38 ++- .../heatmap_layer_wizard.tsx | 2 +- .../create_source_editor.tsx | 4 +- .../es_geo_line_source/es_geo_line_source.tsx | 20 +- .../es_pew_pew_source/es_pew_pew_source.tsx | 15 +- .../es_search_source/create_source_editor.tsx | 4 +- .../es_search_source/es_search_source.test.ts | 10 +- .../es_search_source/es_search_source.tsx | 43 ++- .../top_hits/create_source_editor.tsx | 4 +- .../es_search_source/update_source_editor.tsx | 2 + .../util/scaling_documenation_popover.tsx | 168 +++++----- .../util/scaling_form.test.tsx | 1 + .../es_search_source/util/scaling_form.tsx | 76 +++-- .../es_distance_source/es_distance_source.ts | 179 +++++++++++ .../join_sources/es_distance_source/index.ts | 8 + .../process_distance_response.test.ts | 44 +++ .../process_distance_response.ts | 33 ++ .../es_term_source/es_term_source.ts | 16 +- .../join_sources/es_term_source/index.ts | 1 + .../es_term_source/is_term_source_complete.ts | 12 + .../classes/sources/join_sources/index.ts | 4 +- .../is_spatial_source_complete.ts | 12 + .../classes/sources/join_sources/types.ts | 5 +- .../mvt_single_layer_vector_source.tsx | 6 +- .../maps/public/classes/sources/source.ts | 1 + .../sources/vector_source/vector_source.tsx | 9 +- .../geo_index_pattern_select.test.tsx.snap | 74 +---- .../public/components/geo_field_select.tsx | 12 +- .../geo_index_pattern_select.test.tsx | 21 +- .../components/geo_index_pattern_select.tsx | 113 +++---- .../metrics_editor/metric_editor.tsx | 5 +- .../public/components/single_field_select.tsx | 2 +- .../edit_layer_panel.test.tsx.snap | 4 +- .../edit_layer_panel.test.tsx | 10 +- .../edit_layer_panel/edit_layer_panel.tsx | 9 +- .../edit_layer_panel/index.ts | 2 +- .../add_join_button.test.tsx.snap | 44 --- .../__snapshots__/join_editor.test.tsx.snap | 68 ++-- .../join_editor/add_join_button.test.tsx | 31 -- .../join_editor/add_join_button.tsx | 33 +- .../edit_layer_panel/join_editor/index.ts | 2 +- .../join_editor/join_editor.test.tsx | 24 +- .../join_editor/join_editor.tsx | 188 +++++++---- .../metrics_expression.test.tsx.snap | 10 +- .../join_editor/resources/_join.scss | 1 + .../join_editor/resources/join.tsx | 140 +++++---- .../resources/join_documentation_popover.tsx | 163 +++++----- .../join_editor/resources/join_expression.tsx | 297 ------------------ .../resources/metrics_expression.tsx | 5 +- .../spatial_join_expression/index.ts | 8 + .../spatial_join_expression.tsx | 66 ++++ .../spatial_join_popover_content.tsx | 142 +++++++++ .../resources/term_join_expression/index.ts | 8 + .../term_join_expression.tsx | 92 ++++++ .../term_join_popover_content.tsx | 237 ++++++++++++++ .../resources/where_expression.tsx | 1 + .../connected_components/input_strings.ts | 17 + .../maps_telemetry/collectors/register.ts | 20 ++ .../plugins/ml/public/maps/anomaly_source.tsx | 3 +- .../schema/xpack_plugins.json | 28 ++ .../translations/translations/fr-FR.json | 30 -- .../translations/translations/ja-JP.json | 30 -- .../translations/translations/zh-CN.json | 29 -- .../apis/maps/maps_telemetry.ts | 2 +- .../apps/maps/group2/embeddable/dashboard.js | 6 +- .../test/functional/apps/maps/group4/joins.js | 6 +- .../test/functional/page_objects/gis_page.ts | 20 +- 102 files changed, 2310 insertions(+), 1226 deletions(-) create mode 100644 x-pack/plugins/maps/public/classes/joins/is_spatial_join.ts create mode 100644 x-pack/plugins/maps/public/classes/layers/wizards/icons/spatial_join_layer_icon.tsx create mode 100644 x-pack/plugins/maps/public/classes/layers/wizards/spatial_join_wizard/index.ts create mode 100644 x-pack/plugins/maps/public/classes/layers/wizards/spatial_join_wizard/spatial_join_wizard_config.tsx create mode 100644 x-pack/plugins/maps/public/classes/layers/wizards/spatial_join_wizard/wizard_form/create_spatial_join_layer_descriptor.ts create mode 100644 x-pack/plugins/maps/public/classes/layers/wizards/spatial_join_wizard/wizard_form/distance_form.tsx create mode 100644 x-pack/plugins/maps/public/classes/layers/wizards/spatial_join_wizard/wizard_form/index.ts create mode 100644 x-pack/plugins/maps/public/classes/layers/wizards/spatial_join_wizard/wizard_form/left_source_panel.tsx create mode 100644 x-pack/plugins/maps/public/classes/layers/wizards/spatial_join_wizard/wizard_form/relationship_expression.tsx create mode 100644 x-pack/plugins/maps/public/classes/layers/wizards/spatial_join_wizard/wizard_form/right_source_panel.tsx create mode 100644 x-pack/plugins/maps/public/classes/layers/wizards/spatial_join_wizard/wizard_form/wizard_form.tsx create mode 100644 x-pack/plugins/maps/public/classes/sources/join_sources/es_distance_source/es_distance_source.ts create mode 100644 x-pack/plugins/maps/public/classes/sources/join_sources/es_distance_source/index.ts create mode 100644 x-pack/plugins/maps/public/classes/sources/join_sources/es_distance_source/process_distance_response.test.ts create mode 100644 x-pack/plugins/maps/public/classes/sources/join_sources/es_distance_source/process_distance_response.ts create mode 100644 x-pack/plugins/maps/public/classes/sources/join_sources/es_term_source/is_term_source_complete.ts create mode 100644 x-pack/plugins/maps/public/classes/sources/join_sources/is_spatial_source_complete.ts delete mode 100644 x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/__snapshots__/add_join_button.test.tsx.snap delete mode 100644 x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/add_join_button.test.tsx delete mode 100644 x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/join_expression.tsx create mode 100644 x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/spatial_join_expression/index.ts create mode 100644 x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/spatial_join_expression/spatial_join_expression.tsx create mode 100644 x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/spatial_join_expression/spatial_join_popover_content.tsx create mode 100644 x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/term_join_expression/index.ts create mode 100644 x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/term_join_expression/term_join_expression.tsx create mode 100644 x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/term_join_expression/term_join_popover_content.tsx create mode 100644 x-pack/plugins/maps/public/connected_components/input_strings.ts diff --git a/src/plugins/telemetry/schema/oss_plugins.json b/src/plugins/telemetry/schema/oss_plugins.json index 27e4f1c22c04a..598e51c4da6b3 100644 --- a/src/plugins/telemetry/schema/oss_plugins.json +++ b/src/plugins/telemetry/schema/oss_plugins.json @@ -9136,13 +9136,13 @@ "description": "Non-default value of setting." } }, - "observability:enableInspectEsQueries": { + "observability:syntheticsThrottlingEnabled": { "type": "boolean", "_meta": { "description": "Non-default value of setting." } }, - "observability:syntheticsThrottlingEnabled": { + "observability:enableInspectEsQueries": { "type": "boolean", "_meta": { "description": "Non-default value of setting." diff --git a/test/functional/services/inspector.ts b/test/functional/services/inspector.ts index cee65bf1c4b52..6222405aa6dae 100644 --- a/test/functional/services/inspector.ts +++ b/test/functional/services/inspector.ts @@ -267,6 +267,16 @@ export class InspectorService extends FtrService { return selectedOption[0]; } + /** + * Opens request by name. Use when inspector has multiple requests and you want to view a specific request + */ + public async openRequestByName(requestName: string): Promise { + await this.openInspectorRequestsView(); + this.log.debug(`Open Inspector request ${requestName}`); + await this.testSubjects.click('inspectorRequestChooser'); + await this.testSubjects.click(`inspectorRequestChooser${requestName.replace(/\s+/, '_')}`); + } + /** * Returns request name as the comma-separated string from combobox */ diff --git a/x-pack/plugins/maps/common/constants.ts b/x-pack/plugins/maps/common/constants.ts index 8f5ad4869ebe7..8c843e67cea87 100644 --- a/x-pack/plugins/maps/common/constants.ts +++ b/x-pack/plugins/maps/common/constants.ts @@ -69,13 +69,16 @@ export enum SOURCE_TYPES { ES_GEO_LINE = 'ES_GEO_LINE', ES_SEARCH = 'ES_SEARCH', ES_PEW_PEW = 'ES_PEW_PEW', - ES_TERM_SOURCE = 'ES_TERM_SOURCE', ES_ML_ANOMALIES = 'ML_ANOMALIES', EMS_XYZ = 'EMS_XYZ', // identifies a custom TMS source. EMS-prefix in the name is a little unfortunate :( WMS = 'WMS', KIBANA_TILEMAP = 'KIBANA_TILEMAP', GEOJSON_FILE = 'GEOJSON_FILE', MVT_SINGLE_LAYER = 'MVT_SINGLE_LAYER', + + // join sources + ES_DISTANCE_SOURCE = 'ES_DISTANCE_SOURCE', + ES_TERM_SOURCE = 'ES_TERM_SOURCE', TABLE_SOURCE = 'TABLE_SOURCE', } @@ -335,6 +338,7 @@ export enum WIZARD_ID { MVT_VECTOR = 'mvtVector', WMS_LAYER = 'wmsLayer', TMS_LAYER = 'tmsLayer', + SPATIAL_JOIN = 'spatialJoin', } export enum MASK_OPERATOR { diff --git a/x-pack/plugins/maps/common/descriptor_types/layer_descriptor_types.ts b/x-pack/plugins/maps/common/descriptor_types/layer_descriptor_types.ts index b14efda88cad4..d8bf9bc961679 100644 --- a/x-pack/plugins/maps/common/descriptor_types/layer_descriptor_types.ts +++ b/x-pack/plugins/maps/common/descriptor_types/layer_descriptor_types.ts @@ -26,7 +26,7 @@ export type Attribution = { export type JoinDescriptor = { leftField?: string; - right: JoinSourceDescriptor; + right: Partial; }; export type TileMetaFeature = Feature & { @@ -76,7 +76,7 @@ export type LayerDescriptor = { export type VectorLayerDescriptor = LayerDescriptor & { type: LAYER_TYPE.GEOJSON_VECTOR | LAYER_TYPE.MVT_VECTOR | LAYER_TYPE.BLENDED_VECTOR; - joins?: JoinDescriptor[]; + joins?: Array>; style: VectorStyleDescriptor; disableTooltips?: boolean; }; diff --git a/x-pack/plugins/maps/common/descriptor_types/source_descriptor_types.ts b/x-pack/plugins/maps/common/descriptor_types/source_descriptor_types.ts index 1dabde9bc0a64..3ac86807ff7f6 100644 --- a/x-pack/plugins/maps/common/descriptor_types/source_descriptor_types.ts +++ b/x-pack/plugins/maps/common/descriptor_types/source_descriptor_types.ts @@ -111,9 +111,18 @@ export type ESPewPewSourceDescriptor = AbstractESAggSourceDescriptor & { destGeoField: string; }; -export type ESTermSourceDescriptor = AbstractESAggSourceDescriptor & { - term: string; // term field name +export type AbstractESJoinSourceDescriptor = AbstractESAggSourceDescriptor & { whereQuery?: Query; +}; + +export type ESDistanceSourceDescriptor = AbstractESJoinSourceDescriptor & { + distance: number; // km + geoField: string; + type: SOURCE_TYPES.ES_DISTANCE_SOURCE; +}; + +export type ESTermSourceDescriptor = AbstractESJoinSourceDescriptor & { + term: string; // term field name size?: number; type: SOURCE_TYPES.ES_TERM_SOURCE; }; @@ -183,4 +192,7 @@ export type TableSourceDescriptor = { term: string; }; -export type JoinSourceDescriptor = ESTermSourceDescriptor | TableSourceDescriptor; +export type JoinSourceDescriptor = + | ESDistanceSourceDescriptor + | ESTermSourceDescriptor + | TableSourceDescriptor; diff --git a/x-pack/plugins/maps/common/migrations/add_type_to_termjoin.ts b/x-pack/plugins/maps/common/migrations/add_type_to_termjoin.ts index 868e73fe0ca0b..01fd236234aa7 100644 --- a/x-pack/plugins/maps/common/migrations/add_type_to_termjoin.ts +++ b/x-pack/plugins/maps/common/migrations/add_type_to_termjoin.ts @@ -33,7 +33,7 @@ export function addTypeToTermJoin({ attributes }: { attributes: MapAttributes }) if (!vectorLayer.joins) { return; } - vectorLayer.joins.forEach((join: JoinDescriptor) => { + vectorLayer.joins.forEach((join: Partial) => { if (!join.right) { return; } diff --git a/x-pack/plugins/maps/common/migrations/join_agg_key.ts b/x-pack/plugins/maps/common/migrations/join_agg_key.ts index f74722579ca5a..d969581b856de 100644 --- a/x-pack/plugins/maps/common/migrations/join_agg_key.ts +++ b/x-pack/plugins/maps/common/migrations/join_agg_key.ts @@ -81,8 +81,8 @@ export function migrateJoinAggKey({ attributes }: { attributes: MapAttributes }) return; } - const legacyJoinFields = new Map(); - vectorLayerDescriptor.joins.forEach((joinDescriptor: JoinDescriptor) => { + const legacyJoinFields = new Map>(); + vectorLayerDescriptor.joins.forEach((joinDescriptor: Partial) => { _.get(joinDescriptor, 'right.metrics', []).forEach((aggDescriptor: AggDescriptor) => { const legacyAggKey = getLegacyAggKey({ aggType: aggDescriptor.type, @@ -104,13 +104,13 @@ export function migrateJoinAggKey({ attributes }: { attributes: MapAttributes }) const style: any = vectorLayerDescriptor.style!.properties[key as VECTOR_STYLES]; if (_.get(style, 'options.field.origin') === FIELD_ORIGIN.JOIN) { const joinDescriptor = legacyJoinFields.get(style.options.field.name); - if (joinDescriptor) { + if (joinDescriptor?.right?.id) { const { aggType, aggFieldName } = parseLegacyAggKey(style.options.field.name); // Update legacy join agg key to new join agg key style.options.field.name = getJoinAggKey({ aggType, aggFieldName, - rightSourceId: joinDescriptor.right.id!, + rightSourceId: joinDescriptor.right.id, }); } } diff --git a/x-pack/plugins/maps/common/migrations/references.ts b/x-pack/plugins/maps/common/migrations/references.ts index 07848ed4611ae..aa79a12975115 100644 --- a/x-pack/plugins/maps/common/migrations/references.ts +++ b/x-pack/plugins/maps/common/migrations/references.ts @@ -79,6 +79,7 @@ export function extractReferences({ const joins = vectorLayer.joins ? vectorLayer.joins : []; joins.forEach((join, joinIndex) => { if ( + join.right && 'indexPatternId' in join.right && !adhocDataViewIds.includes( (join.right as IndexPatternReferenceDescriptor).indexPatternId! @@ -147,7 +148,7 @@ export function injectReferences({ const vectorLayer = layer as VectorLayerDescriptor; const joins = vectorLayer.joins ? vectorLayer.joins : []; joins.forEach((join) => { - if ('indexPatternRefName' in join.right) { + if (join.right && 'indexPatternRefName' in join.right) { const sourceDescriptor = join.right as IndexPatternReferenceDescriptor; const reference = findReference(sourceDescriptor.indexPatternRefName!, references); sourceDescriptor.indexPatternId = reference.id; diff --git a/x-pack/plugins/maps/common/telemetry/layer_stats_collector.ts b/x-pack/plugins/maps/common/telemetry/layer_stats_collector.ts index 4097c58377ef8..d782e0bd813d0 100644 --- a/x-pack/plugins/maps/common/telemetry/layer_stats_collector.ts +++ b/x-pack/plugins/maps/common/telemetry/layer_stats_collector.ts @@ -17,6 +17,7 @@ import { ESGeoGridSourceDescriptor, ESSearchSourceDescriptor, LayerDescriptor, + JoinDescriptor, VectorLayerDescriptor, } from '../descriptor_types'; import type { MapAttributes } from '../content_management'; @@ -49,7 +50,12 @@ export class LayerStatsCollector { this._layerCount = layerList.length; layerList.forEach((layerDescriptor) => { this._updateCounts(getBasemapKey(layerDescriptor), this._basemapCounts); - this._updateCounts(getJoinKey(layerDescriptor), this._joinCounts); + const joins = (layerDescriptor as VectorLayerDescriptor)?.joins; + if (joins && joins.length) { + joins.forEach((joinDescriptor) => { + this._updateCounts(getJoinKey(joinDescriptor), this._joinCounts); + }); + } this._updateCounts(getLayerKey(layerDescriptor), this._layerCounts); this._updateCounts(getResolutionKey(layerDescriptor), this._resolutionCounts); this._updateCounts(getScalingKey(layerDescriptor), this._scalingCounts); @@ -147,11 +153,16 @@ function getBasemapKey(layerDescriptor: LayerDescriptor): EMS_BASEMAP_KEYS | nul return null; } -function getJoinKey(layerDescriptor: LayerDescriptor): JOIN_KEYS | null { - return layerDescriptor.type === LAYER_TYPE.GEOJSON_VECTOR && - (layerDescriptor as VectorLayerDescriptor)?.joins?.length - ? JOIN_KEYS.TERM - : null; +function getJoinKey(joinDescriptor: Partial): JOIN_KEYS | null { + if (joinDescriptor?.right?.type === SOURCE_TYPES.ES_TERM_SOURCE) { + return JOIN_KEYS.TERM; + } + + if (joinDescriptor?.right?.type === SOURCE_TYPES.ES_DISTANCE_SOURCE) { + return JOIN_KEYS.DISTANCE; + } + + return null; } function getLayerKey(layerDescriptor: LayerDescriptor): LAYER_KEYS | null { diff --git a/x-pack/plugins/maps/common/telemetry/test_resources/sample_map_saved_objects.json b/x-pack/plugins/maps/common/telemetry/test_resources/sample_map_saved_objects.json index a8efb534de5c4..f9decfc7657ce 100644 --- a/x-pack/plugins/maps/common/telemetry/test_resources/sample_map_saved_objects.json +++ b/x-pack/plugins/maps/common/telemetry/test_resources/sample_map_saved_objects.json @@ -21,7 +21,7 @@ "title": "France Map", "description": "", "mapStateJSON": "{\"zoom\":3.43,\"center\":{\"lon\":-16.30411,\"lat\":42.88411},\"timeFilters\":{\"from\":\"now-15w\",\"to\":\"now\"},\"refreshConfig\":{\"isPaused\":false,\"interval\":0},\"query\":{\"query\":\"\",\"language\":\"lucene\"}}", - "layerListJSON": "[{\"sourceDescriptor\":{\"type\":\"EMS_TMS\",\"id\":\"road_map\"},\"id\":\"csq5v\",\"label\":null,\"minZoom\":0,\"maxZoom\":24,\"alpha\":0.65,\"visible\":true,\"style\":{\"type\":\"TILE\",\"properties\":{}},\"type\":\"TILE\"},{\"sourceDescriptor\":{\"type\":\"EMS_FILE\",\"id\":\"france_departments\"},\"id\":\"65xbw\",\"label\":null,\"minZoom\":0,\"maxZoom\":24,\"alpha\":0.25,\"visible\":true,\"joins\":[{\"leftField\":\"iso_3166_2\",\"right\":{\"id\":\"6a263f96-7a96-4f5a-a00e-c89178c1d017\"}}],\"style\":{\"type\":\"VECTOR\",\"properties\":{\"fillColor\":{\"type\":\"STATIC\",\"options\":{\"color\":\"#19c1e6\"}},\"lineColor\":{\"type\":\"STATIC\",\"options\":{\"color\":\"#FFFFFF\"}},\"lineWidth\":{\"type\":\"STATIC\",\"options\":{\"size\":1}},\"iconSize\":{\"type\":\"STATIC\",\"options\":{\"size\":10}}}},\"type\":\"GEOJSON_VECTOR\"},{\"sourceDescriptor\":{\"id\":\"240125db-e612-4001-b853-50107e55d984\",\"type\":\"ES_SEARCH\",\"scalingType\":\"LIMIT\",\"indexPatternId\":\"ff959d40-b880-11e8-a6d9-e546fe2bba5f\",\"geoField\":\"geoip.location\",\"limit\":2048,\"filterByMapBounds\":true,\"tooltipProperties\":[]},\"id\":\"mdae9\",\"label\":null,\"minZoom\":0,\"maxZoom\":24,\"alpha\":0.75,\"visible\":true,\"style\":{\"type\":\"VECTOR\",\"properties\":{\"fillColor\":{\"type\":\"STATIC\",\"options\":{\"color\":\"#1ce619\"}},\"lineColor\":{\"type\":\"STATIC\",\"options\":{\"color\":\"#FFFFFF\"}},\"lineWidth\":{\"type\":\"STATIC\",\"options\":{\"size\":1}},\"iconSize\":{\"type\":\"STATIC\",\"options\":{\"size\":10}}}},\"type\":\"GEOJSON_VECTOR\"}]", + "layerListJSON": "[{\"sourceDescriptor\":{\"type\":\"EMS_TMS\",\"id\":\"road_map\"},\"id\":\"csq5v\",\"label\":null,\"minZoom\":0,\"maxZoom\":24,\"alpha\":0.65,\"visible\":true,\"style\":{\"type\":\"TILE\",\"properties\":{}},\"type\":\"TILE\"},{\"sourceDescriptor\":{\"type\":\"EMS_FILE\",\"id\":\"france_departments\"},\"id\":\"65xbw\",\"label\":null,\"minZoom\":0,\"maxZoom\":24,\"alpha\":0.25,\"visible\":true,\"joins\":[{\"leftField\":\"iso_3166_2\",\"right\":{\"id\":\"6a263f96-7a96-4f5a-a00e-c89178c1d017\",\"type\":\"ES_TERM_SOURCE\"}}],\"style\":{\"type\":\"VECTOR\",\"properties\":{\"fillColor\":{\"type\":\"STATIC\",\"options\":{\"color\":\"#19c1e6\"}},\"lineColor\":{\"type\":\"STATIC\",\"options\":{\"color\":\"#FFFFFF\"}},\"lineWidth\":{\"type\":\"STATIC\",\"options\":{\"size\":1}},\"iconSize\":{\"type\":\"STATIC\",\"options\":{\"size\":10}}}},\"type\":\"GEOJSON_VECTOR\"},{\"sourceDescriptor\":{\"id\":\"240125db-e612-4001-b853-50107e55d984\",\"type\":\"ES_SEARCH\",\"scalingType\":\"LIMIT\",\"indexPatternId\":\"ff959d40-b880-11e8-a6d9-e546fe2bba5f\",\"geoField\":\"geoip.location\",\"limit\":2048,\"filterByMapBounds\":true,\"tooltipProperties\":[]},\"id\":\"mdae9\",\"label\":null,\"minZoom\":0,\"maxZoom\":24,\"alpha\":0.75,\"visible\":true,\"style\":{\"type\":\"VECTOR\",\"properties\":{\"fillColor\":{\"type\":\"STATIC\",\"options\":{\"color\":\"#1ce619\"}},\"lineColor\":{\"type\":\"STATIC\",\"options\":{\"color\":\"#FFFFFF\"}},\"lineWidth\":{\"type\":\"STATIC\",\"options\":{\"size\":1}},\"iconSize\":{\"type\":\"STATIC\",\"options\":{\"size\":10}}}},\"type\":\"GEOJSON_VECTOR\"}]", "uiStateJSON": "{}" }, "references": [ diff --git a/x-pack/plugins/maps/common/telemetry/types.ts b/x-pack/plugins/maps/common/telemetry/types.ts index b0d740bf4f239..97fedb4d81d50 100644 --- a/x-pack/plugins/maps/common/telemetry/types.ts +++ b/x-pack/plugins/maps/common/telemetry/types.ts @@ -13,6 +13,7 @@ export enum EMS_BASEMAP_KEYS { } export enum JOIN_KEYS { + DISTANCE = 'distance', TERM = 'term', } diff --git a/x-pack/plugins/maps/public/actions/layer_actions.ts b/x-pack/plugins/maps/public/actions/layer_actions.ts index 6ab985e0cc274..18b62284d216d 100644 --- a/x-pack/plugins/maps/public/actions/layer_actions.ts +++ b/x-pack/plugins/maps/public/actions/layer_actions.ts @@ -76,6 +76,7 @@ import { IField } from '../classes/fields/field'; import type { IESSource } from '../classes/sources/es_source'; import { getDrawMode, getOpenTOCDetails } from '../selectors/ui_selectors'; import { isLayerGroup, LayerGroup } from '../classes/layers/layer_group'; +import { isSpatialJoin } from '../classes/joins/is_spatial_join'; export function trackCurrentLayerState(layerId: string) { return { @@ -453,15 +454,16 @@ function updateSourcePropWithoutSync( }); await dispatch(updateStyleProperties(layerId)); } else if (value === SCALING_TYPES.MVT) { - if (joins.length > 1) { - // Maplibre feature-state join uses promoteId and there is a limit to one promoteId - // Therefore, Vector tile scaling supports only one join - dispatch({ - type: SET_JOINS, - layerId, - joins: [joins[0]], - }); - } + const filteredJoins = joins.filter((joinDescriptor) => { + return !isSpatialJoin(joinDescriptor); + }); + // Maplibre feature-state join uses promoteId and there is a limit to one promoteId + // Therefore, Vector tile scaling supports only one join + dispatch({ + type: SET_JOINS, + layerId, + joins: filteredJoins.length ? [filteredJoins[0]] : [], + }); // update style props regardless of updating joins // Allow style to clean-up data driven style properties with join fields that do not support feature-state. await dispatch(updateStyleProperties(layerId)); @@ -764,7 +766,7 @@ export function updateLayerStyleForSelectedLayer(styleDescriptor: StyleDescripto }; } -export function setJoinsForLayer(layer: ILayer, joins: JoinDescriptor[]) { +export function setJoinsForLayer(layer: ILayer, joins: Array>) { return async (dispatch: ThunkDispatch) => { const previousFields = await (layer as IVectorLayer).getFields(); dispatch({ diff --git a/x-pack/plugins/maps/public/classes/joins/inner_join.ts b/x-pack/plugins/maps/public/classes/joins/inner_join.ts index 6ac9a674efc8d..b2c299e977ec9 100644 --- a/x-pack/plugins/maps/public/classes/joins/inner_join.ts +++ b/x-pack/plugins/maps/public/classes/joins/inner_join.ts @@ -15,6 +15,7 @@ import { SOURCE_TYPES, } from '../../../common/constants'; import { + ESDistanceSourceDescriptor, ESTermSourceDescriptor, JoinDescriptor, JoinSourceDescriptor, @@ -24,7 +25,13 @@ import { IVectorSource } from '../sources/vector_source'; import { IField } from '../fields/field'; import { PropertiesMap } from '../../../common/elasticsearch_util'; import { IJoinSource } from '../sources/join_sources'; -import { ESTermSource, TableSource } from '../sources/join_sources'; +import { + ESDistanceSource, + isSpatialSourceComplete, + ESTermSource, + isTermSourceComplete, + TableSource, +} from '../sources/join_sources'; export function createJoinSource( descriptor: Partial | undefined @@ -33,23 +40,25 @@ export function createJoinSource( return; } - if ( - descriptor.type === SOURCE_TYPES.ES_TERM_SOURCE && - descriptor.indexPatternId !== undefined && - descriptor.term !== undefined - ) { + if (descriptor.type === SOURCE_TYPES.ES_DISTANCE_SOURCE && isSpatialSourceComplete(descriptor)) { + return new ESDistanceSource(descriptor as ESDistanceSourceDescriptor); + } + + if (descriptor.type === SOURCE_TYPES.ES_TERM_SOURCE && isTermSourceComplete(descriptor)) { return new ESTermSource(descriptor as ESTermSourceDescriptor); - } else if (descriptor.type === SOURCE_TYPES.TABLE_SOURCE) { + } + + if (descriptor.type === SOURCE_TYPES.TABLE_SOURCE) { return new TableSource(descriptor as TableSourceDescriptor); } } export class InnerJoin { - private readonly _descriptor: JoinDescriptor; + private readonly _descriptor: Partial; private readonly _rightSource?: IJoinSource; private readonly _leftField?: IField; - constructor(joinDescriptor: JoinDescriptor, leftSource: IVectorSource) { + constructor(joinDescriptor: Partial, leftSource: IVectorSource) { this._descriptor = joinDescriptor; this._rightSource = createJoinSource(this._descriptor.right); this._leftField = joinDescriptor.leftField @@ -133,7 +142,7 @@ export class InnerJoin { return this._rightSource; } - toDescriptor(): JoinDescriptor { + toDescriptor(): Partial { return this._descriptor; } diff --git a/x-pack/plugins/maps/public/classes/joins/is_spatial_join.ts b/x-pack/plugins/maps/public/classes/joins/is_spatial_join.ts new file mode 100644 index 0000000000000..7d793192d2d44 --- /dev/null +++ b/x-pack/plugins/maps/public/classes/joins/is_spatial_join.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. + */ + +import type { JoinDescriptor } from '../../../common/descriptor_types'; +import { SOURCE_TYPES } from '../../../common/constants'; + +export function isSpatialJoin(joinDescriptor: Partial) { + return joinDescriptor?.right?.type === SOURCE_TYPES.ES_DISTANCE_SOURCE; +} diff --git a/x-pack/plugins/maps/public/classes/layers/vector_layer/blended_vector_layer/blended_vector_layer.ts b/x-pack/plugins/maps/public/classes/layers/vector_layer/blended_vector_layer/blended_vector_layer.ts index 200c8cad24a4c..4efa00c6c8ad3 100644 --- a/x-pack/plugins/maps/public/classes/layers/vector_layer/blended_vector_layer/blended_vector_layer.ts +++ b/x-pack/plugins/maps/public/classes/layers/vector_layer/blended_vector_layer/blended_vector_layer.ts @@ -232,14 +232,6 @@ export class BlendedVectorLayer extends GeoJsonVectorLayer implements IVectorLay : displayName; } - showJoinEditor() { - return true; - } - - getJoinsDisabledReason() { - return this._documentSource.getJoinsDisabledReason(); - } - getJoins() { return []; } diff --git a/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/geojson_vector_layer.tsx b/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/geojson_vector_layer.tsx index a337cdbfaa7a5..cb36405e7f367 100644 --- a/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/geojson_vector_layer.tsx +++ b/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/geojson_vector_layer.tsx @@ -266,7 +266,7 @@ export class GeoJsonVectorLayer extends AbstractVectorLayer { return; } - const joinStates = await this._syncJoins(syncContext, style); + const joinStates = await this._syncJoins(syncContext, style, sourceResult.featureCollection); await performInnerJoins( sourceResult, joinStates, diff --git a/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/perform_inner_joins.ts b/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/perform_inner_joins.ts index 8a4f3e575d1c9..d695f24d749fd 100644 --- a/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/perform_inner_joins.ts +++ b/x-pack/plugins/maps/public/classes/layers/vector_layer/geojson_vector_layer/perform_inner_joins.ts @@ -115,7 +115,7 @@ export async function performInnerJoins( values: { leftFieldName }, }) : i18n.translate('xpack.maps.vectorLayer.joinError.noMatchesMsg', { - defaultMessage: `Left field does not match right field. Left field: '{leftFieldName}' has values { leftFieldValues }. Right field: '{rightFieldName}' has values: { rightFieldValues }.`, + defaultMessage: `Left field values do not match right field values. Left field: '{leftFieldName}' has values { leftFieldValues }. Right field: '{rightFieldName}' has values: { rightFieldValues }.`, values: { leftFieldName, leftFieldValues: prettyPrintArray(joinStatus.keys), diff --git a/x-pack/plugins/maps/public/classes/layers/vector_layer/vector_layer.tsx b/x-pack/plugins/maps/public/classes/layers/vector_layer/vector_layer.tsx index a18f525e66ae0..d9b7cc4540ec2 100644 --- a/x-pack/plugins/maps/public/classes/layers/vector_layer/vector_layer.tsx +++ b/x-pack/plugins/maps/public/classes/layers/vector_layer/vector_layer.tsx @@ -10,7 +10,7 @@ import { v4 as uuidv4 } from 'uuid'; import type { FilterSpecification, Map as MbMap, LayerSpecification } from '@kbn/mapbox-gl'; import type { KibanaExecutionContext } from '@kbn/core/public'; import type { Query } from '@kbn/data-plugin/common'; -import { Feature, GeoJsonProperties, Geometry, Position } from 'geojson'; +import { Feature, FeatureCollection, GeoJsonProperties, Geometry, Position } from 'geojson'; import _ from 'lodash'; import { EuiIcon } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; @@ -23,7 +23,6 @@ import { LAYER_TYPE, FIELD_ORIGIN, FieldFormatter, - SOURCE_TYPES, STYLE_TYPE, VECTOR_STYLES, } from '../../../../common/constants'; @@ -38,11 +37,11 @@ import { TimesliceMaskConfig, } from '../../util/mb_filter_expressions'; import { + AbstractESJoinSourceDescriptor, AggDescriptor, CustomIcon, DynamicStylePropertyOptions, DataFilters, - ESTermSourceDescriptor, JoinDescriptor, StyleMetaDescriptor, VectorLayerDescriptor, @@ -92,7 +91,6 @@ export interface IVectorLayer extends ILayer { getFields(): Promise; getStyleEditorFields(): Promise; getJoins(): InnerJoin[]; - getJoinsDisabledReason(): string | null; getValidJoins(): InnerJoin[]; getSource(): IVectorSource; getFeatureId(feature: Feature): string | number | undefined; @@ -102,7 +100,6 @@ export interface IVectorLayer extends ILayer { executionContext: KibanaExecutionContext ): Promise; hasJoins(): boolean; - showJoinEditor(): boolean; canShowTooltip(): boolean; areTooltipsDisabled(): boolean; supportsFeatureEditing(): boolean; @@ -179,27 +176,21 @@ export class AbstractVectorLayer extends AbstractLayer implements IVectorLayer { const clonedDescriptor = clones[0] as VectorLayerDescriptor; if (clonedDescriptor.joins) { - clonedDescriptor.joins.forEach((joinDescriptor: JoinDescriptor) => { - if (joinDescriptor.right && joinDescriptor.right.type === SOURCE_TYPES.TABLE_SOURCE) { - throw new Error( - 'Cannot clone table-source. Should only be used in MapEmbeddable, not in UX' - ); + clonedDescriptor.joins.forEach((joinDescriptor: Partial) => { + if (!joinDescriptor.right) { + return; } - const termSourceDescriptor: ESTermSourceDescriptor = - joinDescriptor.right as ESTermSourceDescriptor; - - // todo: must tie this to generic thing - const originalJoinId = joinDescriptor.right.id!; + const joinSourceDescriptor = + joinDescriptor.right as Partial; + const originalJoinId = joinSourceDescriptor.id ?? ''; // right.id is uuid used to track requests in inspector - joinDescriptor.right.id = uuidv4(); + const clonedJoinId = uuidv4(); + joinDescriptor.right.id = clonedJoinId; // Update all data driven styling properties using join fields if (clonedDescriptor.style && 'properties' in clonedDescriptor.style) { - const metrics = - termSourceDescriptor.metrics && termSourceDescriptor.metrics.length - ? termSourceDescriptor.metrics - : [{ type: AGG_TYPE.COUNT }]; + const metrics = joinSourceDescriptor.metrics ?? [{ type: AGG_TYPE.COUNT }]; metrics.forEach((metricsDescriptor: AggDescriptor) => { const originalJoinKey = getJoinAggKey({ aggType: metricsDescriptor.type, @@ -209,7 +200,7 @@ export class AbstractVectorLayer extends AbstractLayer implements IVectorLayer { const newJoinKey = getJoinAggKey({ aggType: metricsDescriptor.type, aggFieldName: 'field' in metricsDescriptor ? metricsDescriptor.field : '', - rightSourceId: joinDescriptor.right.id!, + rightSourceId: clonedJoinId, }); Object.keys(clonedDescriptor.style.properties).forEach((key) => { @@ -252,10 +243,6 @@ export class AbstractVectorLayer extends AbstractLayer implements IVectorLayer { return this._joins.slice(); } - getJoinsDisabledReason() { - return this.getSource().getJoinsDisabledReason(); - } - getValidJoins() { return this.getJoins().filter((join) => { return join.hasCompleteConfig(); @@ -272,10 +259,6 @@ export class AbstractVectorLayer extends AbstractLayer implements IVectorLayer { return this.getValidJoins().length > 0; } - showJoinEditor(): boolean { - return this.getSource().showJoinEditor(); - } - isLayerLoading() { const isSourceLoading = super.isLayerLoading(); if (isSourceLoading) { @@ -553,6 +536,7 @@ export class AbstractVectorLayer extends AbstractLayer implements IVectorLayer { async _syncJoin({ join, + featureCollection, startLoading, stopLoading, onLoadError, @@ -561,7 +545,10 @@ export class AbstractVectorLayer extends AbstractLayer implements IVectorLayer { isForceRefresh, isFeatureEditorOpenForLayer, inspectorAdapters, - }: { join: InnerJoin } & DataRequestContext): Promise { + }: { + join: InnerJoin; + featureCollection?: FeatureCollection; + } & DataRequestContext): Promise { const joinSource = join.getRightJoinSource(); const sourceDataId = join.getSourceDataRequestId(); const requestToken = Symbol(`layer-join-refresh:${this.getId()} - ${sourceDataId}`); @@ -580,7 +567,7 @@ export class AbstractVectorLayer extends AbstractLayer implements IVectorLayer { source: joinSource, prevDataRequest, nextRequestMeta: joinRequestMeta, - extentAware: false, // join-sources are term-aggs that are spatially unaware (e.g. ESTermSource/TableSource). + extentAware: false, // join-sources are spatially unaware. For spatial joins, spatial constraints are from vector source feature geometry and not map extent geometry getUpdateDueToTimeslice: () => { return true; }, @@ -602,7 +589,8 @@ export class AbstractVectorLayer extends AbstractLayer implements IVectorLayer { leftSourceName, join.getLeftField().getName(), registerCancelCallback.bind(null, requestToken), - inspectorAdapters + inspectorAdapters, + featureCollection ); stopLoading(sourceDataId, requestToken, propertiesMap); return { @@ -618,11 +606,15 @@ export class AbstractVectorLayer extends AbstractLayer implements IVectorLayer { } } - async _syncJoins(syncContext: DataRequestContext, style: IVectorStyle) { + async _syncJoins( + syncContext: DataRequestContext, + style: IVectorStyle, + featureCollection?: FeatureCollection + ) { const joinSyncs = this.getValidJoins().map(async (join) => { await this._syncJoinStyleMeta(syncContext, join, style); await this._syncJoinFormatters(syncContext, join, style); - return this._syncJoin({ join, ...syncContext }); + return this._syncJoin({ join, featureCollection, ...syncContext }); }); return await Promise.all(joinSyncs); diff --git a/x-pack/plugins/maps/public/classes/layers/wizards/choropleth_layer_wizard/__snapshots__/layer_template.test.tsx.snap b/x-pack/plugins/maps/public/classes/layers/wizards/choropleth_layer_wizard/__snapshots__/layer_template.test.tsx.snap index 8a9329ff801e2..41e54433d88bf 100644 --- a/x-pack/plugins/maps/public/classes/layers/wizards/choropleth_layer_wizard/__snapshots__/layer_template.test.tsx.snap +++ b/x-pack/plugins/maps/public/classes/layers/wizards/choropleth_layer_wizard/__snapshots__/layer_template.test.tsx.snap @@ -94,8 +94,8 @@ exports[`should render elasticsearch UI when left source is BOUNDARIES_SOURCE.EL /> { diff --git a/x-pack/plugins/maps/public/classes/layers/wizards/choropleth_layer_wizard/layer_template.tsx b/x-pack/plugins/maps/public/classes/layers/wizards/choropleth_layer_wizard/layer_template.tsx index 5fef8dd28ceb1..923fd4d0741b3 100644 --- a/x-pack/plugins/maps/public/classes/layers/wizards/choropleth_layer_wizard/layer_template.tsx +++ b/x-pack/plugins/maps/public/classes/layers/wizards/choropleth_layer_wizard/layer_template.tsx @@ -34,6 +34,7 @@ import { createEmsChoroplethLayerDescriptor, createEsChoroplethLayerDescriptor, } from './create_choropleth_layer_descriptor'; +import { inputStrings } from '../../../../connected_components/input_strings'; export enum BOUNDARIES_SOURCE { ELASTICSEARCH = 'ELASTICSEARCH', @@ -305,9 +306,7 @@ export class LayerTemplate extends Component { })} > { return ( <> {geoFieldSelect} @@ -405,9 +403,7 @@ export class LayerTemplate extends Component { })} > ( + + + + + + + + + + + + + + + + + + + +); diff --git a/x-pack/plugins/maps/public/classes/layers/wizards/load_layer_wizards.ts b/x-pack/plugins/maps/public/classes/layers/wizards/load_layer_wizards.ts index fbaba6325bf26..7a747ea2533cf 100644 --- a/x-pack/plugins/maps/public/classes/layers/wizards/load_layer_wizards.ts +++ b/x-pack/plugins/maps/public/classes/layers/wizards/load_layer_wizards.ts @@ -28,6 +28,7 @@ import { ObservabilityLayerWizardConfig } from './solution_layers/observability' import { SecurityLayerWizardConfig } from './solution_layers/security'; import { choroplethLayerWizardConfig } from './choropleth_layer_wizard'; import { newVectorLayerWizardConfig } from './new_vector_layer_wizard'; +import { spatialJoinWizardConfig } from './spatial_join_wizard'; let registered = false; @@ -38,17 +39,25 @@ export function registerLayerWizards() { registerLayerWizardInternal(uploadLayerWizardConfig); registerLayerWizardInternal(layerGroupWizardConfig); + registerLayerWizardInternal(esDocumentsLayerWizardConfig); registerLayerWizardInternal(choroplethLayerWizardConfig); + + registerLayerWizardInternal(spatialJoinWizardConfig); + registerLayerWizardInternal(point2PointLayerWizardConfig); + registerLayerWizardInternal(clustersLayerWizardConfig); registerLayerWizardInternal(heatmapLayerWizardConfig); + registerLayerWizardInternal(esTopHitsLayerWizardConfig); registerLayerWizardInternal(geoLineLayerWizardConfig); - registerLayerWizardInternal(point2PointLayerWizardConfig); + registerLayerWizardInternal(emsBoundariesLayerWizardConfig); - registerLayerWizardInternal(newVectorLayerWizardConfig); registerLayerWizardInternal(emsBaseMapLayerWizardConfig); + + registerLayerWizardInternal(newVectorLayerWizardConfig); registerLayerWizardInternal(kibanaBasemapLayerWizardConfig); + registerLayerWizardInternal(tmsLayerWizardConfig); registerLayerWizardInternal(wmsLayerWizardConfig); diff --git a/x-pack/plugins/maps/public/classes/layers/wizards/spatial_join_wizard/index.ts b/x-pack/plugins/maps/public/classes/layers/wizards/spatial_join_wizard/index.ts new file mode 100644 index 0000000000000..37740ae352c91 --- /dev/null +++ b/x-pack/plugins/maps/public/classes/layers/wizards/spatial_join_wizard/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { spatialJoinWizardConfig } from './spatial_join_wizard_config'; +export { RelationshipExpression } from './wizard_form'; diff --git a/x-pack/plugins/maps/public/classes/layers/wizards/spatial_join_wizard/spatial_join_wizard_config.tsx b/x-pack/plugins/maps/public/classes/layers/wizards/spatial_join_wizard/spatial_join_wizard_config.tsx new file mode 100644 index 0000000000000..9d91dc5489827 --- /dev/null +++ b/x-pack/plugins/maps/public/classes/layers/wizards/spatial_join_wizard/spatial_join_wizard_config.tsx @@ -0,0 +1,29 @@ +/* + * 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 { i18n } from '@kbn/i18n'; +import { LAYER_WIZARD_CATEGORY, WIZARD_ID } from '../../../../../common/constants'; +import { LayerWizard, RenderWizardArguments } from '../layer_wizard_registry'; +import { WizardForm } from './wizard_form'; +import { SpatialJoinLayerIcon } from '../icons/spatial_join_layer_icon'; + +export const spatialJoinWizardConfig: LayerWizard = { + id: WIZARD_ID.SPATIAL_JOIN, + order: 10, + categories: [LAYER_WIZARD_CATEGORY.ELASTICSEARCH], + description: i18n.translate('xpack.maps.spatialJoinWizard.description', { + defaultMessage: 'Group documents by geospatial relationships', + }), + icon: SpatialJoinLayerIcon, + renderWizard: (renderWizardArguments: RenderWizardArguments) => { + return ; + }, + title: i18n.translate('xpack.maps.spatialJoinWizard.title', { + defaultMessage: 'Spatial join', + }), +}; diff --git a/x-pack/plugins/maps/public/classes/layers/wizards/spatial_join_wizard/wizard_form/create_spatial_join_layer_descriptor.ts b/x-pack/plugins/maps/public/classes/layers/wizards/spatial_join_wizard/wizard_form/create_spatial_join_layer_descriptor.ts new file mode 100644 index 0000000000000..b10e26ffff59a --- /dev/null +++ b/x-pack/plugins/maps/public/classes/layers/wizards/spatial_join_wizard/wizard_form/create_spatial_join_layer_descriptor.ts @@ -0,0 +1,93 @@ +/* + * 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 { v4 as uuidv4 } from 'uuid'; +import { + AGG_TYPE, + FIELD_ORIGIN, + SCALING_TYPES, + SOURCE_TYPES, + STYLE_TYPE, + VECTOR_STYLES, +} from '../../../../../../common/constants'; +import { getJoinAggKey } from '../../../../../../common/get_agg_key'; +import { + CountAggDescriptor, + JoinDescriptor, + VectorStylePropertiesDescriptor, +} from '../../../../../../common/descriptor_types'; +import { VectorStyle } from '../../../../styles/vector/vector_style'; +import { GeoJsonVectorLayer } from '../../../vector_layer'; +// @ts-ignore +import { ESSearchSource } from '../../../../sources/es_search_source'; +import { getDefaultDynamicProperties } from '../../../../styles/vector/vector_style_defaults'; + +const defaultDynamicProperties = getDefaultDynamicProperties(); + +export function createDistanceJoinLayerDescriptor({ + distance, + leftDataViewId, + leftGeoField, + rightDataViewId, + rightGeoField, +}: { + distance: number; + leftDataViewId: string; + leftGeoField: string; + rightDataViewId: string; + rightGeoField: string; +}) { + const metricsDescriptor: CountAggDescriptor = { type: AGG_TYPE.COUNT }; + const joinId = uuidv4(); + const countJoinFieldName = getJoinAggKey({ + aggType: metricsDescriptor.type, + rightSourceId: joinId, + }); + + const styleProperties: Partial = { + [VECTOR_STYLES.LABEL_TEXT]: { + type: STYLE_TYPE.DYNAMIC, + options: { + ...defaultDynamicProperties[VECTOR_STYLES.LABEL_TEXT].options, + field: { + name: countJoinFieldName, + origin: FIELD_ORIGIN.JOIN, + }, + }, + }, + }; + + const joins = [ + { + leftField: '_id', + right: { + type: SOURCE_TYPES.ES_DISTANCE_SOURCE, + id: joinId, + indexPatternId: rightDataViewId, + metrics: [metricsDescriptor], + distance, + geoField: rightGeoField, + applyGlobalQuery: true, + applyGlobalTime: true, + applyForceRefresh: true, + }, + } as JoinDescriptor, + ]; + + return GeoJsonVectorLayer.createDescriptor({ + joins, + sourceDescriptor: ESSearchSource.createDescriptor({ + indexPatternId: leftDataViewId, + geoField: leftGeoField, + scalingType: SCALING_TYPES.LIMIT, + applyGlobalQuery: true, + applyGlobalTime: true, + applyForceRefresh: true, + }), + style: VectorStyle.createDescriptor(styleProperties), + }); +} diff --git a/x-pack/plugins/maps/public/classes/layers/wizards/spatial_join_wizard/wizard_form/distance_form.tsx b/x-pack/plugins/maps/public/classes/layers/wizards/spatial_join_wizard/wizard_form/distance_form.tsx new file mode 100644 index 0000000000000..da56820be5c32 --- /dev/null +++ b/x-pack/plugins/maps/public/classes/layers/wizards/spatial_join_wizard/wizard_form/distance_form.tsx @@ -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 React, { ChangeEvent, useState } from 'react'; +import { i18n } from '@kbn/i18n'; +import { + EuiButtonEmpty, + EuiButton, + EuiFlexGroup, + EuiFlexItem, + EuiFieldNumber, + EuiFormRow, + EuiPopoverFooter, +} from '@elastic/eui'; +import { panelStrings } from '../../../../../connected_components/panel_strings'; + +export const KM_ABBREVIATION = i18n.translate( + 'xpack.maps.spatialJoin.wizardForm.kilometersAbbreviation', + { + defaultMessage: 'km', + } +); + +interface Props { + initialDistance: number; + onClose: () => void; + onDistanceChange: (distance: number) => void; +} + +function getDistanceAsNumber(distance: string | number): number { + return typeof distance === 'string' ? parseFloat(distance as string) : distance; +} + +export function DistanceForm(props: Props) { + const [distance, setDistance] = useState(props.initialDistance); + const distanceAsNumber = getDistanceAsNumber(distance); + const isDistanceInvalid = isNaN(distanceAsNumber) || distanceAsNumber <= 0; + + return ( + <> + + ) => { + setDistance(e.target.value); + }} + value={distance} + /> + + + + + + {panelStrings.close} + + + + { + props.onDistanceChange(getDistanceAsNumber(distance)); + props.onClose(); + }} + size="s" + > + {panelStrings.apply} + + + + + + ); +} diff --git a/x-pack/plugins/maps/public/classes/layers/wizards/spatial_join_wizard/wizard_form/index.ts b/x-pack/plugins/maps/public/classes/layers/wizards/spatial_join_wizard/wizard_form/index.ts new file mode 100644 index 0000000000000..ef6a879258bb2 --- /dev/null +++ b/x-pack/plugins/maps/public/classes/layers/wizards/spatial_join_wizard/wizard_form/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { RelationshipExpression } from './relationship_expression'; +export { WizardForm } from './wizard_form'; diff --git a/x-pack/plugins/maps/public/classes/layers/wizards/spatial_join_wizard/wizard_form/left_source_panel.tsx b/x-pack/plugins/maps/public/classes/layers/wizards/spatial_join_wizard/wizard_form/left_source_panel.tsx new file mode 100644 index 0000000000000..4635955f5b6b3 --- /dev/null +++ b/x-pack/plugins/maps/public/classes/layers/wizards/spatial_join_wizard/wizard_form/left_source_panel.tsx @@ -0,0 +1,54 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { i18n } from '@kbn/i18n'; +import { EuiPanel, EuiSpacer, EuiTitle } from '@elastic/eui'; +import type { DataViewField, DataView } from '@kbn/data-plugin/common'; +import { GeoIndexPatternSelect } from '../../../../../components/geo_index_pattern_select'; +import { GeoFieldSelect } from '../../../../../components/geo_field_select'; + +interface Props { + dataView?: DataView; + geoField: string | undefined; + geoFields: DataViewField[]; + onDataViewSelect: (dataView: DataView) => void; + onGeoFieldSelect: (fieldName?: string) => void; +} + +export function LeftSourcePanel(props: Props) { + const geoFieldSelect = props.geoFields.length ? ( + + ) : null; + + return ( + + +
+ {i18n.translate('xpack.maps.spatialJoin.wizard.leftSourceTitle', { + defaultMessage: 'Layer features source', + })} +
+
+ + + + + + {geoFieldSelect} +
+ ); +} diff --git a/x-pack/plugins/maps/public/classes/layers/wizards/spatial_join_wizard/wizard_form/relationship_expression.tsx b/x-pack/plugins/maps/public/classes/layers/wizards/spatial_join_wizard/wizard_form/relationship_expression.tsx new file mode 100644 index 0000000000000..315ac712301c3 --- /dev/null +++ b/x-pack/plugins/maps/public/classes/layers/wizards/spatial_join_wizard/wizard_form/relationship_expression.tsx @@ -0,0 +1,63 @@ +/* + * 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, { useState } from 'react'; +import { i18n } from '@kbn/i18n'; +import { EuiExpression, EuiPopover } from '@elastic/eui'; +import { KM_ABBREVIATION, DistanceForm } from './distance_form'; + +interface Props { + distance: number; + onDistanceChange: (distance: number) => void; +} + +export function RelationshipExpression(props: Props) { + const [isPopoverOpen, setIsPopoverOpen] = useState(false); + + function closePopover() { + setIsPopoverOpen(false); + } + + return ( + { + setIsPopoverOpen(!isPopoverOpen); + }} + uppercase={false} + /> + } + isOpen={isPopoverOpen} + closePopover={closePopover} + panelPaddingSize="s" + anchorPosition="downCenter" + repositionOnScroll={true} + > + + + ); +} diff --git a/x-pack/plugins/maps/public/classes/layers/wizards/spatial_join_wizard/wizard_form/right_source_panel.tsx b/x-pack/plugins/maps/public/classes/layers/wizards/spatial_join_wizard/wizard_form/right_source_panel.tsx new file mode 100644 index 0000000000000..f7de09953dbcc --- /dev/null +++ b/x-pack/plugins/maps/public/classes/layers/wizards/spatial_join_wizard/wizard_form/right_source_panel.tsx @@ -0,0 +1,61 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import { i18n } from '@kbn/i18n'; +import { EuiFormRow, EuiPanel, EuiSpacer, EuiTitle } from '@elastic/eui'; +import type { DataViewField, DataView } from '@kbn/data-plugin/common'; +import { GeoIndexPatternSelect } from '../../../../../components/geo_index_pattern_select'; +import { GeoFieldSelect } from '../../../../../components/geo_field_select'; +import { inputStrings } from '../../../../../connected_components/input_strings'; +import { RelationshipExpression } from './relationship_expression'; + +interface Props { + dataView?: DataView; + distance: number; + geoField: string | undefined; + geoFields: DataViewField[]; + onDataViewSelect: (dataView: DataView) => void; + onDistanceChange: (distance: number) => void; + onGeoFieldSelect: (fieldName?: string) => void; +} + +export function RightSourcePanel(props: Props) { + const geoFieldSelect = props.dataView ? ( + + ) : null; + + return ( + + +
+ {i18n.translate('xpack.maps.spatialJoin.wizardForm.rightSourceTitle', { + defaultMessage: 'Join source', + })} +
+
+ + + + + + + + + + {geoFieldSelect} +
+ ); +} diff --git a/x-pack/plugins/maps/public/classes/layers/wizards/spatial_join_wizard/wizard_form/wizard_form.tsx b/x-pack/plugins/maps/public/classes/layers/wizards/spatial_join_wizard/wizard_form/wizard_form.tsx new file mode 100644 index 0000000000000..2b23336281500 --- /dev/null +++ b/x-pack/plugins/maps/public/classes/layers/wizards/spatial_join_wizard/wizard_form/wizard_form.tsx @@ -0,0 +1,98 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useEffect, useState } from 'react'; +import { EuiSpacer } from '@elastic/eui'; +import type { DataViewField, DataView } from '@kbn/data-plugin/common'; +import { getGeoFields, getGeoPointFields } from '../../../../../index_pattern_util'; +import { RenderWizardArguments } from '../../layer_wizard_registry'; +import { LeftSourcePanel } from './left_source_panel'; +import { RightSourcePanel } from './right_source_panel'; +import { createDistanceJoinLayerDescriptor } from './create_spatial_join_layer_descriptor'; +import { DEFAULT_WITHIN_DISTANCE } from '../../../../sources/join_sources'; + +function isLeftConfigComplete( + leftDataView: DataView | undefined, + leftGeoField: string | undefined +) { + return leftDataView !== undefined && leftDataView.id && leftGeoField !== undefined; +} + +function isRightConfigComplete( + rightDataView: DataView | undefined, + rightGeoField: string | undefined +) { + return rightDataView !== undefined && rightDataView.id && rightGeoField !== undefined; +} + +export function WizardForm({ previewLayers }: RenderWizardArguments) { + const [distance, setDistance] = useState(DEFAULT_WITHIN_DISTANCE); + const [leftDataView, setLeftDataView] = useState(); + const [leftGeoFields, setLeftGeoFields] = useState([]); + const [leftGeoField, setLeftGeoField] = useState(); + const [rightDataView, setRightDataView] = useState(); + const [rightGeoFields, setRightGeoFields] = useState([]); + const [rightGeoField, setRightGeoField] = useState(); + + useEffect(() => { + if ( + !isLeftConfigComplete(leftDataView, leftGeoField) || + !isRightConfigComplete(rightDataView, rightGeoField) + ) { + previewLayers([]); + return; + } + + const layerDescriptor = createDistanceJoinLayerDescriptor({ + distance, + leftDataViewId: leftDataView!.id!, // leftDataView.id verified in isLeftConfigComplete + leftGeoField: leftGeoField!, // leftGeoField verified in isLeftConfigComplete + rightDataViewId: rightDataView!.id!, // rightDataView.id verified in isRightConfigComplete + rightGeoField: rightGeoField!, // rightGeoField verified in isRightConfigComplete + }); + + previewLayers([layerDescriptor]); + }, [distance, leftDataView, leftGeoField, rightDataView, rightGeoField, previewLayers]); + + const rightSourcePanel = isLeftConfigComplete(leftDataView, leftGeoField) ? ( + { + setRightDataView(dataView); + const geoFields = getGeoFields(dataView.fields); + setRightGeoFields(geoFields); + setRightGeoField(geoFields.length ? geoFields[0].name : undefined); + }} + onDistanceChange={setDistance} + onGeoFieldSelect={setRightGeoField} + /> + ) : null; + + return ( + <> + { + setLeftDataView(dataView); + const geoFields = getGeoPointFields(dataView.fields); + setLeftGeoFields(geoFields); + setLeftGeoField(geoFields.length ? geoFields[0].name : undefined); + }} + onGeoFieldSelect={setLeftGeoField} + /> + + + + {rightSourcePanel} + + ); +} diff --git a/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/clusters_layer_wizard.tsx b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/clusters_layer_wizard.tsx index 5cc1a29e88dfe..37b221dde5bc1 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/clusters_layer_wizard.tsx +++ b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/clusters_layer_wizard.tsx @@ -41,8 +41,7 @@ export const clustersLayerWizardConfig: LayerWizard = { order: 10, categories: [LAYER_WIZARD_CATEGORY.ELASTICSEARCH], description: i18n.translate('xpack.maps.source.esGridClustersDescription', { - defaultMessage: - 'Group Elasticsearch documents into grids and hexagons and display metrics for each group', + defaultMessage: 'Group documents into grids and hexagons', }), icon: ClustersLayerIcon, renderWizard: ({ previewLayers }: RenderWizardArguments) => { diff --git a/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/create_source_editor.js b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/create_source_editor.js index aede56a726713..f0358ac102792 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/create_source_editor.js +++ b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/create_source_editor.js @@ -118,7 +118,7 @@ export class CreateSourceEditor extends Component { return ( {this._renderGeoSelect()} diff --git a/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.test.ts b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.test.ts index 43e80f06cdce7..71614aebe541e 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.test.ts +++ b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.test.ts @@ -42,6 +42,7 @@ describe('ESGeoGridSource', () => { get() { return { getIndexPattern: () => 'foo-*', + getName: () => 'foo-*', fields: { getByName() { return { diff --git a/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.tsx b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.tsx index fc6a6f1acc759..ada40e859d181 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.tsx +++ b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/es_geo_grid_source.tsx @@ -206,7 +206,7 @@ export class ESGeoGridSource extends AbstractESAggSource implements IMvtVectorSo } } - showJoinEditor(): boolean { + supportsJoins(): boolean { return false; } @@ -355,14 +355,26 @@ export class ESGeoGridSource extends AbstractESAggSource implements IMvtVectorSo : this.getId(); const esResponse: estypes.SearchResponse = await this._runEsQuery({ requestId, - requestName: `${layerName} (${requestCount})`, + requestName: i18n.translate('xpack.maps.source.esGrid.compositeInspector.requestName', { + defaultMessage: '{layerName} {bucketsName} composite request ({requestCount})', + values: { + bucketsName: this.getBucketsName(), + layerName, + requestCount, + }, + }), searchSource, registerCancelCallback, requestDescription: i18n.translate( 'xpack.maps.source.esGrid.compositeInspectorDescription', { - defaultMessage: 'Elasticsearch geo grid aggregation request: {requestId}', - values: { requestId }, + defaultMessage: + 'Get {bucketsName} from data view: {dataViewName}, geospatial field: {geoFieldName}', + values: { + bucketsName: this.getBucketsName(), + dataViewName: indexPattern.getName(), + geoFieldName: this._descriptor.geoField, + }, } ), searchSessionId, @@ -438,11 +450,23 @@ export class ESGeoGridSource extends AbstractESAggSource implements IMvtVectorSo const esResponse = await this._runEsQuery({ requestId: this.getId(), - requestName: layerName, + requestName: i18n.translate('xpack.maps.source.esGrid.inspector.requestName', { + defaultMessage: '{layerName} {bucketsName} request', + values: { + bucketsName: this.getBucketsName(), + layerName, + }, + }), searchSource, registerCancelCallback, - requestDescription: i18n.translate('xpack.maps.source.esGrid.inspectorDescription', { - defaultMessage: 'Elasticsearch geo grid aggregation request', + requestDescription: i18n.translate('xpack.maps.source.esGrid.inspector.requestDescription', { + defaultMessage: + 'Get {bucketsName} from data view: {dataViewName}, geospatial field: {geoFieldName}', + values: { + bucketsName: this.getBucketsName(), + dataViewName: indexPattern.getName(), + geoFieldName: this._descriptor.geoField, + }, }), searchSessionId, executionContext: mergeExecutionContext( diff --git a/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/heatmap_layer_wizard.tsx b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/heatmap_layer_wizard.tsx index 53dbcfac95970..a34f0d4a85658 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/heatmap_layer_wizard.tsx +++ b/x-pack/plugins/maps/public/classes/sources/es_geo_grid_source/heatmap_layer_wizard.tsx @@ -26,7 +26,7 @@ export const heatmapLayerWizardConfig: LayerWizard = { order: 10, categories: [LAYER_WIZARD_CATEGORY.ELASTICSEARCH], description: i18n.translate('xpack.maps.source.esGridHeatmapDescription', { - defaultMessage: 'Geospatial data grouped in grids to show density', + defaultMessage: 'Group documents in grids to show density', }), icon: HeatmapLayerIcon, renderWizard: ({ previewLayers }: RenderWizardArguments) => { diff --git a/x-pack/plugins/maps/public/classes/sources/es_geo_line_source/create_source_editor.tsx b/x-pack/plugins/maps/public/classes/sources/es_geo_line_source/create_source_editor.tsx index 8e9b879290c9e..25f946d88db55 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_geo_line_source/create_source_editor.tsx +++ b/x-pack/plugins/maps/public/classes/sources/es_geo_line_source/create_source_editor.tsx @@ -138,9 +138,7 @@ export class CreateSourceEditor extends Component { return ( diff --git a/x-pack/plugins/maps/public/classes/sources/es_geo_line_source/es_geo_line_source.tsx b/x-pack/plugins/maps/public/classes/sources/es_geo_line_source/es_geo_line_source.tsx index 8cb98f68f06f1..87708231031dd 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_geo_line_source/es_geo_line_source.tsx +++ b/x-pack/plugins/maps/public/classes/sources/es_geo_line_source/es_geo_line_source.tsx @@ -164,7 +164,7 @@ export class ESGeoLineSource extends AbstractESAggSource { return false; } - showJoinEditor() { + supportsJoins() { return false; } @@ -214,7 +214,7 @@ export class ESGeoLineSource extends AbstractESAggSource { const entityResp = await this._runEsQuery({ requestId: `${this.getId()}_entities`, requestName: i18n.translate('xpack.maps.source.esGeoLine.entityRequestName', { - defaultMessage: '{layerName} entities', + defaultMessage: '{layerName} entities request', values: { layerName, }, @@ -222,7 +222,12 @@ export class ESGeoLineSource extends AbstractESAggSource { searchSource: entitySearchSource, registerCancelCallback, requestDescription: i18n.translate('xpack.maps.source.esGeoLine.entityRequestDescription', { - defaultMessage: 'Elasticsearch terms request to fetch entities within map buffer.', + defaultMessage: + 'Get entities within map buffer from data view: {dataViewName}, entities: {splitFieldName}', + values: { + dataViewName: indexPattern.getName(), + splitFieldName: this._descriptor.splitField, + }, }), searchSessionId: requestMeta.searchSessionId, executionContext: mergeExecutionContext( @@ -289,7 +294,7 @@ export class ESGeoLineSource extends AbstractESAggSource { const tracksResp = await this._runEsQuery({ requestId: `${this.getId()}_tracks`, requestName: i18n.translate('xpack.maps.source.esGeoLine.trackRequestName', { - defaultMessage: '{layerName} tracks', + defaultMessage: '{layerName} tracks request', values: { layerName, }, @@ -298,7 +303,12 @@ export class ESGeoLineSource extends AbstractESAggSource { registerCancelCallback, requestDescription: i18n.translate('xpack.maps.source.esGeoLine.trackRequestDescription', { defaultMessage: - 'Elasticsearch geo_line request to fetch tracks for entities. Tracks are not filtered by map buffer.', + 'Get tracks for {numEntities} entities from data view: {dataViewName}, geospatial field: {geoFieldName}', + values: { + dataViewName: indexPattern.getName(), + geoFieldName: this._descriptor.geoField, + numEntities: entityBuckets.length, + }, }), searchSessionId: requestMeta.searchSessionId, executionContext: mergeExecutionContext( diff --git a/x-pack/plugins/maps/public/classes/sources/es_pew_pew_source/es_pew_pew_source.tsx b/x-pack/plugins/maps/public/classes/sources/es_pew_pew_source/es_pew_pew_source.tsx index a6c1d7fc2be85..7d33ccf5088c4 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_pew_pew_source/es_pew_pew_source.tsx +++ b/x-pack/plugins/maps/public/classes/sources/es_pew_pew_source/es_pew_pew_source.tsx @@ -88,7 +88,7 @@ export class ESPewPewSource extends AbstractESAggSource { return true; } - showJoinEditor() { + supportsJoins() { return false; } @@ -190,11 +190,20 @@ export class ESPewPewSource extends AbstractESAggSource { const esResponse = await this._runEsQuery({ requestId: this.getId(), - requestName: layerName, + requestName: i18n.translate('xpack.maps.pewPew.requestName', { + defaultMessage: '{layerName} paths request', + values: { layerName }, + }), searchSource, registerCancelCallback, requestDescription: i18n.translate('xpack.maps.source.pewPew.inspectorDescription', { - defaultMessage: 'Source-destination connections request', + defaultMessage: + 'Get paths from data view: {dataViewName}, source: {sourceFieldName}, destination: {destFieldName}', + values: { + dataViewName: indexPattern.getName(), + destFieldName: this._descriptor.destGeoField, + sourceFieldName: this._descriptor.sourceGeoField, + }, }), searchSessionId: requestMeta.searchSessionId, executionContext: mergeExecutionContext( diff --git a/x-pack/plugins/maps/public/classes/sources/es_search_source/create_source_editor.tsx b/x-pack/plugins/maps/public/classes/sources/es_search_source/create_source_editor.tsx index 0b0fe1db96107..ff4c9e94c4ddc 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_search_source/create_source_editor.tsx +++ b/x-pack/plugins/maps/public/classes/sources/es_search_source/create_source_editor.tsx @@ -118,9 +118,7 @@ export class CreateSourceEditor extends Component { return ( diff --git a/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.test.ts b/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.test.ts index 8a4bff7baa0b4..a6adb7673e00a 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.test.ts +++ b/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.test.ts @@ -174,29 +174,27 @@ describe('ESSearchSource', () => { }); }); - describe('getJoinsDisabledReason', () => { + describe('supportsJoins', () => { it('limit', () => { const esSearchSource = new ESSearchSource({ ...mockDescriptor, scalingType: SCALING_TYPES.LIMIT, }); - expect(esSearchSource.getJoinsDisabledReason()).toBe(null); + expect(esSearchSource.supportsJoins()).toBe(true); }); it('blended layer', () => { const esSearchSource = new ESSearchSource({ ...mockDescriptor, scalingType: SCALING_TYPES.CLUSTERS, }); - expect(esSearchSource.getJoinsDisabledReason()).toBe( - 'Joins are not supported when scaling by clusters' - ); + expect(esSearchSource.supportsJoins()).toBe(false); }); it('mvt', () => { const esSearchSource = new ESSearchSource({ ...mockDescriptor, scalingType: SCALING_TYPES.MVT, }); - expect(esSearchSource.getJoinsDisabledReason()).toBe(null); + expect(esSearchSource.supportsJoins()).toBe(true); }); }); }); diff --git a/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx b/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx index b21f776ce0d19..2db15d3f0cd72 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx +++ b/x-pack/plugins/maps/public/classes/sources/es_search_source/es_search_source.tsx @@ -190,6 +190,7 @@ export class ESSearchSource extends AbstractESSource implements IMvtVectorSource scalingType={this._descriptor.scalingType} filterByMapBounds={this.isFilterByMapBounds()} numberOfJoins={sourceEditorArgs.numberOfJoins} + hasSpatialJoins={sourceEditorArgs.hasSpatialJoins} /> ); } @@ -350,10 +351,21 @@ export class ESSearchSource extends AbstractESSource implements IMvtVectorSource const resp = await this._runEsQuery({ requestId: this.getId(), - requestName: layerName, + requestName: i18n.translate('xpack.maps.esSearchSource.topHits.requestName', { + defaultMessage: '{layerName} top hits request', + values: { layerName }, + }), searchSource, registerCancelCallback, - requestDescription: 'Elasticsearch document top hits request', + requestDescription: i18n.translate('xpack.maps.esSearchSource.topHits.requestDescription', { + defaultMessage: + 'Get top hits from data view: {dataViewName}, entities: {entitiesFieldName}, geospatial field: {geoFieldName}', + values: { + dataViewName: indexPattern.getName(), + entitiesFieldName: topHitsSplitFieldName, + geoFieldName: this._descriptor.geoField, + }, + }), searchSessionId: requestMeta.searchSessionId, executionContext: mergeExecutionContext( { description: 'es_search_source:top_hits' }, @@ -437,10 +449,20 @@ export class ESSearchSource extends AbstractESSource implements IMvtVectorSource const resp = await this._runEsQuery({ requestId: this.getId(), - requestName: layerName, + requestName: i18n.translate('xpack.maps.esSearchSource.requestName', { + defaultMessage: '{layerName} documents request', + values: { layerName }, + }), searchSource, registerCancelCallback, - requestDescription: 'Elasticsearch document request', + requestDescription: i18n.translate('xpack.maps.esSearchSource.requestDescription', { + defaultMessage: + 'Get documents from data view: {dataViewName}, geospatial field: {geoFieldName}', + values: { + dataViewName: indexPattern.getName(), + geoFieldName: this._descriptor.geoField, + }, + }), searchSessionId: requestMeta.searchSessionId, executionContext: mergeExecutionContext( { description: 'es_search_source:doc_search' }, @@ -792,16 +814,9 @@ export class ESSearchSource extends AbstractESSource implements IMvtVectorSource }; } - getJoinsDisabledReason(): string | null { - let reason; - if (this._descriptor.scalingType === SCALING_TYPES.CLUSTERS) { - reason = i18n.translate('xpack.maps.source.esSearch.joinsDisabledReason', { - defaultMessage: 'Joins are not supported when scaling by clusters', - }); - } else { - reason = null; - } - return reason; + supportsJoins(): boolean { + // can only join with features, not aggregated clusters + return this._descriptor.scalingType !== SCALING_TYPES.CLUSTERS; } async _getEditableIndex(): Promise { diff --git a/x-pack/plugins/maps/public/classes/sources/es_search_source/top_hits/create_source_editor.tsx b/x-pack/plugins/maps/public/classes/sources/es_search_source/top_hits/create_source_editor.tsx index e1b4b9322e5eb..a3fa9a9745cb7 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_search_source/top_hits/create_source_editor.tsx +++ b/x-pack/plugins/maps/public/classes/sources/es_search_source/top_hits/create_source_editor.tsx @@ -144,9 +144,7 @@ export class CreateSourceEditor extends Component { return ( diff --git a/x-pack/plugins/maps/public/classes/sources/es_search_source/update_source_editor.tsx b/x-pack/plugins/maps/public/classes/sources/es_search_source/update_source_editor.tsx index 51ebe8cc9e042..b30c11c3deca7 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_search_source/update_source_editor.tsx +++ b/x-pack/plugins/maps/public/classes/sources/es_search_source/update_source_editor.tsx @@ -36,6 +36,7 @@ interface Props { sortOrder: SortDirection; scalingType: SCALING_TYPES; source: IESSource; + hasSpatialJoins: boolean; numberOfJoins: number; getGeoField(): Promise; filterByMapBounds: boolean; @@ -217,6 +218,7 @@ export class UpdateSourceEditor extends Component { scalingType={this.props.scalingType} supportsClustering={this.state.supportsClustering} clusteringDisabledReason={this.state.clusteringDisabledReason} + hasSpatialJoins={this.props.hasSpatialJoins} numberOfJoins={this.props.numberOfJoins} /> diff --git a/x-pack/plugins/maps/public/classes/sources/es_search_source/util/scaling_documenation_popover.tsx b/x-pack/plugins/maps/public/classes/sources/es_search_source/util/scaling_documenation_popover.tsx index de6f35c668c64..3d84a82a8ffb1 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_search_source/util/scaling_documenation_popover.tsx +++ b/x-pack/plugins/maps/public/classes/sources/es_search_source/util/scaling_documenation_popover.tsx @@ -5,8 +5,8 @@ * 2.0. */ -import React, { Component } from 'react'; -import { EuiButtonIcon, EuiLink, EuiPopover, EuiText } from '@elastic/eui'; +import React, { useState } from 'react'; +import { EuiButtonIcon, EuiLink, EuiPopover, EuiPopoverTitle, EuiText } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { getDocLinks } from '../../../../kibana_services'; @@ -17,39 +17,43 @@ interface Props { mvtOptionLabel: string; } -interface State { - isPopoverOpen: boolean; -} - -export class ScalingDocumenationPopover extends Component { - state: State = { - isPopoverOpen: false, - }; +export function ScalingDocumenationPopover(props: Props) { + const [isPopoverOpen, setIsPopoverOpen] = useState(false); - _togglePopover = () => { - this.setState((prevState) => ({ - isPopoverOpen: !prevState.isPopoverOpen, - })); - }; + return ( + { + setIsPopoverOpen(!isPopoverOpen); + }} + iconType="documentation" + aria-label="Scaling documentation" + /> + } + isOpen={isPopoverOpen} + closePopover={() => { + setIsPopoverOpen(false); + }} + repositionOnScroll + ownFocus + > + + + - _closePopover = () => { - this.setState({ - isPopoverOpen: false, - }); - }; - - _renderContent() { - return (
- +
-
{this.props.mvtOptionLabel} (Default)
+
{props.mvtOptionLabel} (Default)

@@ -60,64 +64,74 @@ export class ScalingDocumenationPopover extends Component {

-
{this.props.clustersOptionLabel}
+
{props.clustersOptionLabel}

+ + +

-
{this.props.limitOptionLabel}
+
{props.limitOptionLabel}

-

-

- -

    -
  • - -
  • -
  • - -
  • -
  • - -
  • -
  • - -
  • -

+ +
    +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
  • + +
  • +
@@ -126,7 +140,7 @@ export class ScalingDocumenationPopover extends Component { id="xpack.maps.scalingDocs.maxResultWindow" defaultMessage="{maxResultWindow} constraint provided by {link} index setting." values={{ - maxResultWindow: this.props.maxResultWindow, + maxResultWindow: props.maxResultWindow, link: ( {

- ); - } - - render() { - return ( - - } - isOpen={this.state.isPopoverOpen} - closePopover={this._closePopover} - repositionOnScroll - ownFocus - > - {this._renderContent()} - - ); - } +
+ ); } diff --git a/x-pack/plugins/maps/public/classes/sources/es_search_source/util/scaling_form.test.tsx b/x-pack/plugins/maps/public/classes/sources/es_search_source/util/scaling_form.test.tsx index 38137ffcd72df..ad5b5933717bf 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_search_source/util/scaling_form.test.tsx +++ b/x-pack/plugins/maps/public/classes/sources/es_search_source/util/scaling_form.test.tsx @@ -27,6 +27,7 @@ const defaultProps = { supportsClustering: true, termFields: [], numberOfJoins: 0, + hasSpatialJoins: false, }; describe('scaling form', () => { diff --git a/x-pack/plugins/maps/public/classes/sources/es_search_source/util/scaling_form.tsx b/x-pack/plugins/maps/public/classes/sources/es_search_source/util/scaling_form.tsx index 230c24bb820a7..241759e8438db 100644 --- a/x-pack/plugins/maps/public/classes/sources/es_search_source/util/scaling_form.tsx +++ b/x-pack/plugins/maps/public/classes/sources/es_search_source/util/scaling_form.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { Component, Fragment } from 'react'; +import React, { Component, Fragment, ReactNode } from 'react'; import { EuiConfirmModal, EuiFormRow, @@ -35,6 +35,7 @@ interface Props { scalingType: SCALING_TYPES; supportsClustering: boolean; clusteringDisabledReason?: string | null; + hasSpatialJoins: boolean; numberOfJoins: number; } @@ -42,13 +43,13 @@ interface State { nextScalingType?: SCALING_TYPES; maxResultWindow: string; showModal: boolean; - modalMsg: string | null; + modalContent: ReactNode; } export class ScalingForm extends Component { state: State = { maxResultWindow: DEFAULT_MAX_RESULT_WINDOW.toLocaleString(), - modalMsg: null, + modalContent: null, showModal: false, }; _isMounted = false; @@ -76,25 +77,42 @@ export class ScalingForm extends Component { _onScalingTypeSelect = (optionId: SCALING_TYPES): void => { if (this.props.numberOfJoins > 0 && optionId === SCALING_TYPES.CLUSTERS) { - this._openModal( - optionId, + this._openModal(optionId, [ i18n.translate('xpack.maps.source.esSearch.clusterScalingJoinMsg', { - defaultMessage: `Scaling with clusters does not support term joins. Switching to clusters will remove all term joins from your layer configuration.`, - }) - ); - } else if (this.props.numberOfJoins > 1 && optionId === SCALING_TYPES.MVT) { - this._openModal( - optionId, - i18n.translate('xpack.maps.source.esSearch.mvtScalingJoinMsg', { - defaultMessage: `Vector tiles support one term join. Your layer has {numberOfJoins} term joins. Switching to vector tiles will keep the first term join and remove all other term joins from your layer configuration.`, - values: { - numberOfJoins: this.props.numberOfJoins, - }, - }) - ); - } else { - this._onScalingTypeChange(optionId); + defaultMessage: `Scaling with clusters does not support joins. Switching to clusters will remove all joins from your layer configuration.`, + }), + ]); + return; + } + + if (optionId === SCALING_TYPES.MVT) { + const messages: string[] = []; + if (this.props.hasSpatialJoins) { + messages.push( + i18n.translate('xpack.maps.source.esSearch.mvtNoSpatialJoinMsg', { + defaultMessage: `Vector tiles do not support spatial joins. Switching to vector tiles will remove all spatial joins from your layer configuration.`, + }) + ); + } + + if (this.props.numberOfJoins > 1) { + messages.push( + i18n.translate('xpack.maps.source.esSearch.mvtScalingJoinMsg', { + defaultMessage: `Vector tiles support one term join. Your layer has {numberOfJoins} joins. Switching to vector tiles will keep the first term join and remove all other joins from your layer configuration.`, + values: { + numberOfJoins: this.props.numberOfJoins, + }, + }) + ); + } + + if (messages.length) { + this._openModal(optionId, messages); + return; + } } + + this._onScalingTypeChange(optionId); }; _onScalingTypeChange = (optionId: SCALING_TYPES): void => { @@ -114,9 +132,13 @@ export class ScalingForm extends Component { this.props.onChange({ propName: 'filterByMapBounds', value: event.target.checked }); }; - _openModal = (optionId: SCALING_TYPES, modalMsg: string) => { + _openModal = (optionId: SCALING_TYPES, messages: string[]) => { this.setState({ - modalMsg, + modalContent: messages.length + ? messages.map((message, index) => { + return

{message}

; + }) + : null, nextScalingType: optionId, showModal: true, }); @@ -124,7 +146,7 @@ export class ScalingForm extends Component { _closeModal = () => { this.setState({ - modalMsg: null, + modalContent: null, nextScalingType: undefined, showModal: false, }); @@ -158,7 +180,11 @@ export class ScalingForm extends Component { } _renderModal() { - if (!this.state.showModal || !this.state.modalMsg || this.state.nextScalingType === undefined) { + if ( + !this.state.showModal || + !this.state.modalContent || + this.state.nextScalingType === undefined + ) { return null; } @@ -181,7 +207,7 @@ export class ScalingForm extends Component { buttonColor="danger" defaultFocusedButton="cancel" > -

{this.state.modalMsg}

+ {this.state.modalContent} ); } diff --git a/x-pack/plugins/maps/public/classes/sources/join_sources/es_distance_source/es_distance_source.ts b/x-pack/plugins/maps/public/classes/sources/join_sources/es_distance_source/es_distance_source.ts new file mode 100644 index 0000000000000..39b49eb8881c7 --- /dev/null +++ b/x-pack/plugins/maps/public/classes/sources/join_sources/es_distance_source/es_distance_source.ts @@ -0,0 +1,179 @@ +/* + * 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 { FeatureCollection } from 'geojson'; +import { i18n } from '@kbn/i18n'; +import type { Query } from '@kbn/es-query'; +import { ISearchSource } from '@kbn/data-plugin/public'; +import { Adapters } from '@kbn/inspector-plugin/common/adapters'; +import { AGG_TYPE, FIELD_ORIGIN, SOURCE_TYPES } from '../../../../../common/constants'; +import { getJoinAggKey } from '../../../../../common/get_agg_key'; +import { AbstractESAggSource } from '../../es_agg_source'; +import type { BucketProperties } from '../../../../../common/elasticsearch_util'; +import { + ESDistanceSourceDescriptor, + VectorSourceRequestMeta, +} from '../../../../../common/descriptor_types'; +import { PropertiesMap } from '../../../../../common/elasticsearch_util'; +import { isValidStringConfig } from '../../../util/valid_string_config'; +import { IJoinSource } from '../types'; +import type { IESAggSource } from '../../es_agg_source'; +import { IField } from '../../../fields/field'; +import { mergeExecutionContext } from '../../execution_context_utils'; +import { processDistanceResponse } from './process_distance_response'; +import { isSpatialSourceComplete } from '../is_spatial_source_complete'; + +export const DEFAULT_WITHIN_DISTANCE = 5; + +type ESDistanceSourceSyncMeta = Pick; + +export class ESDistanceSource extends AbstractESAggSource implements IJoinSource, IESAggSource { + static type = SOURCE_TYPES.ES_DISTANCE_SOURCE; + + static createDescriptor( + descriptor: Partial + ): ESDistanceSourceDescriptor { + const normalizedDescriptor = AbstractESAggSource.createDescriptor(descriptor); + if (!isValidStringConfig(descriptor.geoField)) { + throw new Error('Cannot create an ESDistanceSource without a geoField property'); + } + return { + ...normalizedDescriptor, + geoField: descriptor.geoField!, + distance: + typeof descriptor.distance === 'number' ? descriptor.distance : DEFAULT_WITHIN_DISTANCE, + type: SOURCE_TYPES.ES_DISTANCE_SOURCE, + }; + } + + readonly _descriptor: ESDistanceSourceDescriptor; + + constructor(descriptor: Partial) { + const sourceDescriptor = ESDistanceSource.createDescriptor(descriptor); + super(sourceDescriptor); + this._descriptor = sourceDescriptor; + } + + hasCompleteConfig(): boolean { + return isSpatialSourceComplete(this._descriptor); + } + + getOriginForField(): FIELD_ORIGIN { + return FIELD_ORIGIN.JOIN; + } + + getWhereQuery(): Query | undefined { + return this._descriptor.whereQuery; + } + + getAggKey(aggType: AGG_TYPE, fieldName?: string): string { + return getJoinAggKey({ + aggType, + aggFieldName: fieldName, + rightSourceId: this._descriptor.id, + }); + } + + async getPropertiesMap( + requestMeta: VectorSourceRequestMeta, + leftSourceName: string, + leftFieldName: string, + registerCancelCallback: (callback: () => void) => void, + inspectorAdapters: Adapters, + featureCollection?: FeatureCollection + ): Promise { + if (featureCollection === undefined) { + throw new Error( + i18n.translate('xpack.maps.esDistanceSource.noFeatureCollectionMsg', { + defaultMessage: `Unable to perform distance join, features not provided. To enable distance join, select 'Limit results' in 'Scaling'`, + }) + ); + } + + if (!this.hasCompleteConfig()) { + return new Map(); + } + + const distance = `${this._descriptor.distance}km`; + let hasFilters = false; + const filters: Record = {}; + for (let i = 0; i < featureCollection.features.length; i++) { + const feature = featureCollection.features[i]; + if (feature.geometry.type === 'Point' && feature?.properties?._id) { + filters[feature.properties._id] = { + geo_distance: { + distance, + [this._descriptor.geoField]: feature.geometry.coordinates, + }, + }; + if (!hasFilters) { + hasFilters = true; + } + } + } + + if (!hasFilters) { + return new Map(); + } + + const indexPattern = await this.getIndexPattern(); + const searchSource: ISearchSource = await this.makeSearchSource(requestMeta, 0); + searchSource.setField('trackTotalHits', false); + searchSource.setField('aggs', { + distance: { + filters: { + filters, + }, + aggs: this.getValueAggsDsl(indexPattern), + }, + }); + const rawEsData = await this._runEsQuery({ + requestId: this.getId(), + requestName: i18n.translate('xpack.maps.distanceSource.requestName', { + defaultMessage: '{leftSourceName} within distance join request', + values: { leftSourceName }, + }), + searchSource, + registerCancelCallback, + requestDescription: i18n.translate('xpack.maps.distanceSource.requestDescription', { + defaultMessage: + 'Get metrics from data view: {dataViewName}, geospatial field: {geoFieldName}', + values: { + dataViewName: indexPattern.getName(), + geoFieldName: this._descriptor.geoField, + }, + }), + searchSessionId: requestMeta.searchSessionId, + executionContext: mergeExecutionContext( + { description: 'es_distance_source:distance_join_request' }, + requestMeta.executionContext + ), + requestsAdapter: inspectorAdapters.requests, + }); + + return processDistanceResponse(rawEsData, this.getAggKey(AGG_TYPE.COUNT)); + } + + isFilterByMapBounds(): boolean { + return false; + } + + getFieldNames(): string[] { + return this.getMetricFields().map((esAggMetricField) => esAggMetricField.getName()); + } + + getSyncMeta(): ESDistanceSourceSyncMeta { + return { + distance: this._descriptor.distance, + geoField: this._descriptor.geoField, + }; + } + + getRightFields(): IField[] { + return this.getMetricFields(); + } +} diff --git a/x-pack/plugins/maps/public/classes/sources/join_sources/es_distance_source/index.ts b/x-pack/plugins/maps/public/classes/sources/join_sources/es_distance_source/index.ts new file mode 100644 index 0000000000000..1e7e585ffeae1 --- /dev/null +++ b/x-pack/plugins/maps/public/classes/sources/join_sources/es_distance_source/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { DEFAULT_WITHIN_DISTANCE, ESDistanceSource } from './es_distance_source'; diff --git a/x-pack/plugins/maps/public/classes/sources/join_sources/es_distance_source/process_distance_response.test.ts b/x-pack/plugins/maps/public/classes/sources/join_sources/es_distance_source/process_distance_response.test.ts new file mode 100644 index 0000000000000..82c36c4b5d312 --- /dev/null +++ b/x-pack/plugins/maps/public/classes/sources/join_sources/es_distance_source/process_distance_response.test.ts @@ -0,0 +1,44 @@ +/* + * 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 { processDistanceResponse } from './process_distance_response'; + +test('should convert elasticsearch response into table', () => { + const response = { + aggregations: { + distance: { + buckets: { + '06-Fv4cB_nxKbZ5eWyyP': { + doc_count: 1, + __kbnjoin__avg_of_bytes__673ff994: { + value: 5794, + }, + }, + '0a-Fv4cB_nxKbZ5eWyyP': { + doc_count: 0, + __kbnjoin__avg_of_bytes__673ff994: { + value: 0, + }, + }, + '1q-Fv4cB_nxKbZ5eWyyP': { + doc_count: 2, + __kbnjoin__avg_of_bytes__673ff994: { + value: 5771, + }, + }, + }, + }, + }, + }; + const table = processDistanceResponse(response, '__kbnjoin__count__673ff994'); + + expect(table.size).toBe(2); + + const bucketProperties = table.get('1q-Fv4cB_nxKbZ5eWyyP'); + expect(bucketProperties?.__kbnjoin__count__673ff994).toBe(2); + expect(bucketProperties?.__kbnjoin__avg_of_bytes__673ff994).toBe(5771); +}); diff --git a/x-pack/plugins/maps/public/classes/sources/join_sources/es_distance_source/process_distance_response.ts b/x-pack/plugins/maps/public/classes/sources/join_sources/es_distance_source/process_distance_response.ts new file mode 100644 index 0000000000000..9f18195cb2f84 --- /dev/null +++ b/x-pack/plugins/maps/public/classes/sources/join_sources/es_distance_source/process_distance_response.ts @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { COUNT_PROP_NAME } from '../../../../../common/constants'; +import type { BucketProperties, PropertiesMap } from '../../../../../common/elasticsearch_util'; +import { extractPropertiesFromBucket } from '../../../../../common/elasticsearch_util'; + +const IGNORE_LIST = [COUNT_PROP_NAME]; + +export function processDistanceResponse(response: any, countPropertyName: string): PropertiesMap { + const propertiesMap: PropertiesMap = new Map(); + const buckets: any = response?.aggregations?.distance?.buckets ?? {}; + for (const docId in buckets) { + if (buckets.hasOwnProperty(docId)) { + const bucket = buckets[docId]; + + // skip empty buckets + if (bucket[COUNT_PROP_NAME] === 0) { + continue; + } + + const properties = extractPropertiesFromBucket(bucket, IGNORE_LIST); + // Manually set 'doc_count' so join name, like '__kbnjoin__count__673ff994', is used + properties[countPropertyName] = bucket[COUNT_PROP_NAME]; + propertiesMap.set(docId, properties); + } + } + return propertiesMap; +} diff --git a/x-pack/plugins/maps/public/classes/sources/join_sources/es_term_source/es_term_source.ts b/x-pack/plugins/maps/public/classes/sources/join_sources/es_term_source/es_term_source.ts index 54ca553035574..fdca0c40aaa0d 100644 --- a/x-pack/plugins/maps/public/classes/sources/join_sources/es_term_source/es_term_source.ts +++ b/x-pack/plugins/maps/public/classes/sources/join_sources/es_term_source/es_term_source.ts @@ -34,6 +34,7 @@ import { ITermJoinSource } from '../types'; import type { IESAggSource } from '../../es_agg_source'; import { IField } from '../../../fields/field'; import { mergeExecutionContext } from '../../execution_context_utils'; +import { isTermSourceComplete } from './is_term_source_complete'; const TERMS_AGG_NAME = 'join'; const TERMS_BUCKET_KEYS_TO_IGNORE = ['key', 'doc_count']; @@ -83,7 +84,7 @@ export class ESTermSource extends AbstractESAggSource implements ITermJoinSource } hasCompleteConfig(): boolean { - return this._descriptor.indexPatternId !== undefined && this._descriptor.term !== undefined; + return isTermSourceComplete(this._descriptor); } getTermField(): ESDocField { @@ -149,14 +150,17 @@ export class ESTermSource extends AbstractESAggSource implements ITermJoinSource const rawEsData = await this._runEsQuery({ requestId: this.getId(), - requestName: `${indexPattern.getName()}.${this._termField.getName()}`, + requestName: i18n.translate('xpack.maps.termSource.requestName', { + defaultMessage: '{leftSourceName} term join request', + values: { leftSourceName }, + }), searchSource, registerCancelCallback, - requestDescription: i18n.translate('xpack.maps.source.esJoin.joinDescription', { - defaultMessage: `Elasticsearch terms aggregation request, left source: {leftSource}, right source: {rightSource}`, + requestDescription: i18n.translate('xpack.maps.termSource.requestDescription', { + defaultMessage: 'Get metrics from data view: {dataViewName}, term field: {termFieldName}', values: { - leftSource: `${leftSourceName}:${leftFieldName}`, - rightSource: `${indexPattern.getName()}:${this._termField.getName()}`, + dataViewName: indexPattern.getName(), + termFieldName: this._termField.getName(), }, }), searchSessionId: requestMeta.searchSessionId, diff --git a/x-pack/plugins/maps/public/classes/sources/join_sources/es_term_source/index.ts b/x-pack/plugins/maps/public/classes/sources/join_sources/es_term_source/index.ts index fd0495237662e..6f3c52bc7d30b 100644 --- a/x-pack/plugins/maps/public/classes/sources/join_sources/es_term_source/index.ts +++ b/x-pack/plugins/maps/public/classes/sources/join_sources/es_term_source/index.ts @@ -6,3 +6,4 @@ */ export * from './es_term_source'; +export { isTermSourceComplete } from './is_term_source_complete'; diff --git a/x-pack/plugins/maps/public/classes/sources/join_sources/es_term_source/is_term_source_complete.ts b/x-pack/plugins/maps/public/classes/sources/join_sources/es_term_source/is_term_source_complete.ts new file mode 100644 index 0000000000000..7f0667580ab09 --- /dev/null +++ b/x-pack/plugins/maps/public/classes/sources/join_sources/es_term_source/is_term_source_complete.ts @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ESTermSourceDescriptor } from '../../../../../common/descriptor_types'; + +export function isTermSourceComplete(descriptor: Partial) { + return descriptor.indexPatternId !== undefined && descriptor.term !== undefined; +} diff --git a/x-pack/plugins/maps/public/classes/sources/join_sources/index.ts b/x-pack/plugins/maps/public/classes/sources/join_sources/index.ts index c916b2befca41..6df76c488cd65 100644 --- a/x-pack/plugins/maps/public/classes/sources/join_sources/index.ts +++ b/x-pack/plugins/maps/public/classes/sources/join_sources/index.ts @@ -8,5 +8,7 @@ export type { IJoinSource, ITermJoinSource } from './types'; export { isTermJoinSource } from './types'; -export { ESTermSource } from './es_term_source'; +export { isSpatialSourceComplete } from './is_spatial_source_complete'; +export { DEFAULT_WITHIN_DISTANCE, ESDistanceSource } from './es_distance_source'; +export { ESTermSource, isTermSourceComplete } from './es_term_source'; export { TableSource } from './table_source'; diff --git a/x-pack/plugins/maps/public/classes/sources/join_sources/is_spatial_source_complete.ts b/x-pack/plugins/maps/public/classes/sources/join_sources/is_spatial_source_complete.ts new file mode 100644 index 0000000000000..e414b5c800993 --- /dev/null +++ b/x-pack/plugins/maps/public/classes/sources/join_sources/is_spatial_source_complete.ts @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ESDistanceSourceDescriptor } from '../../../../common/descriptor_types'; + +export function isSpatialSourceComplete(descriptor: Partial) { + return descriptor.indexPatternId !== undefined && descriptor.geoField !== undefined; +} diff --git a/x-pack/plugins/maps/public/classes/sources/join_sources/types.ts b/x-pack/plugins/maps/public/classes/sources/join_sources/types.ts index 05ec53cc14e6a..6292a42550e81 100644 --- a/x-pack/plugins/maps/public/classes/sources/join_sources/types.ts +++ b/x-pack/plugins/maps/public/classes/sources/join_sources/types.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { GeoJsonProperties } from 'geojson'; +import { FeatureCollection, GeoJsonProperties } from 'geojson'; import type { KibanaExecutionContext } from '@kbn/core/public'; import { Query } from '@kbn/data-plugin/common/query'; import { Adapters } from '@kbn/inspector-plugin/common/adapters'; @@ -23,7 +23,8 @@ export interface IJoinSource extends ISource { leftSourceName: string, leftFieldName: string, registerCancelCallback: (callback: () => void) => void, - inspectorAdapters: Adapters + inspectorAdapters: Adapters, + featureCollection?: FeatureCollection ): Promise; /* diff --git a/x-pack/plugins/maps/public/classes/sources/mvt_single_layer_vector_source/mvt_single_layer_vector_source.tsx b/x-pack/plugins/maps/public/classes/sources/mvt_single_layer_vector_source/mvt_single_layer_vector_source.tsx index a76d0268c8363..daccfe23e542d 100644 --- a/x-pack/plugins/maps/public/classes/sources/mvt_single_layer_vector_source/mvt_single_layer_vector_source.tsx +++ b/x-pack/plugins/maps/public/classes/sources/mvt_single_layer_vector_source/mvt_single_layer_vector_source.tsx @@ -237,14 +237,10 @@ export class MVTSingleLayerVectorSource extends AbstractSource implements IMvtVe return {}; } - showJoinEditor(): boolean { + supportsJoins(): boolean { return false; } - getJoinsDisabledReason(): string | null { - return null; - } - getFeatureActions(args: GetFeatureActionsArgs): TooltipFeatureAction[] { // Its not possible to filter by geometry for vector tile sources since there is no way to get original geometry return []; diff --git a/x-pack/plugins/maps/public/classes/sources/source.ts b/x-pack/plugins/maps/public/classes/sources/source.ts index 7ccf15bfed2f3..b6e261dd3d690 100644 --- a/x-pack/plugins/maps/public/classes/sources/source.ts +++ b/x-pack/plugins/maps/public/classes/sources/source.ts @@ -29,6 +29,7 @@ export type OnSourceChangeArgs = { export type SourceEditorArgs = { currentLayerType: string; + hasSpatialJoins: boolean; numberOfJoins: number; onChange: (...args: OnSourceChangeArgs[]) => Promise; onStyleDescriptorChange: (styleDescriptor: StyleDescriptor) => void; diff --git a/x-pack/plugins/maps/public/classes/sources/vector_source/vector_source.tsx b/x-pack/plugins/maps/public/classes/sources/vector_source/vector_source.tsx index f56785b0f6f53..f17de87cbef33 100644 --- a/x-pack/plugins/maps/public/classes/sources/vector_source/vector_source.tsx +++ b/x-pack/plugins/maps/public/classes/sources/vector_source/vector_source.tsx @@ -106,8 +106,7 @@ export interface IVectorSource extends ISource { getFields(): Promise; getFieldByName(fieldName: string): IField | null; getLeftJoinFields(): Promise; - showJoinEditor(): boolean; - getJoinsDisabledReason(): string | null; + supportsJoins(): boolean; /* * Vector layer avoids unnecessarily re-fetching source data. @@ -189,10 +188,6 @@ export class AbstractVectorSource extends AbstractSource implements IVectorSourc return []; } - getJoinsDisabledReason(): string | null { - return null; - } - async getGeoJsonWithMeta( layerName: string, requestMeta: VectorSourceRequestMeta, @@ -227,7 +222,7 @@ export class AbstractVectorSource extends AbstractSource implements IVectorSourc return false; } - showJoinEditor() { + supportsJoins() { return true; } diff --git a/x-pack/plugins/maps/public/components/__snapshots__/geo_index_pattern_select.test.tsx.snap b/x-pack/plugins/maps/public/components/__snapshots__/geo_index_pattern_select.test.tsx.snap index 93c4f4e546013..2d6abff4f5c74 100644 --- a/x-pack/plugins/maps/public/components/__snapshots__/geo_index_pattern_select.test.tsx.snap +++ b/x-pack/plugins/maps/public/components/__snapshots__/geo_index_pattern_select.test.tsx.snap @@ -5,85 +5,19 @@ exports[`should render 1`] = ` - - -`; - -exports[`should render no index pattern warning when there are no matching index patterns 1`] = ` - - -

- - - - -

-

- - - - -

-
- - - void; -} +}; export function GeoFieldSelect(props: Props) { + const { geoFields, ...rest } = props; return ( ); diff --git a/x-pack/plugins/maps/public/components/geo_index_pattern_select.test.tsx b/x-pack/plugins/maps/public/components/geo_index_pattern_select.test.tsx index 925c4a31d3459..a060705c508f6 100644 --- a/x-pack/plugins/maps/public/components/geo_index_pattern_select.test.tsx +++ b/x-pack/plugins/maps/public/components/geo_index_pattern_select.test.tsx @@ -28,16 +28,23 @@ jest.mock('../kibana_services', () => { import React from 'react'; import { shallow } from 'enzyme'; +import { DataView } from '@kbn/data-plugin/common'; import { GeoIndexPatternSelect } from './geo_index_pattern_select'; -test('should render', async () => { - const component = shallow( {}} value={'indexPatternId'} />); +const defaultProps = { + dataView: { + id: 'weblogs', + fields: [ + { + type: 'geo_point', + }, + ], + } as unknown as DataView, + onChange: () => {}, +}; - expect(component).toMatchSnapshot(); -}); +test('should render', async () => { + const component = shallow(); -test('should render no index pattern warning when there are no matching index patterns', async () => { - const component = shallow( {}} value={'indexPatternId'} />); - component.setState({ noIndexPatternsExist: true }); expect(component).toMatchSnapshot(); }); diff --git a/x-pack/plugins/maps/public/components/geo_index_pattern_select.tsx b/x-pack/plugins/maps/public/components/geo_index_pattern_select.tsx index 61a3ceb2d2f44..34a6f8b74bded 100644 --- a/x-pack/plugins/maps/public/components/geo_index_pattern_select.tsx +++ b/x-pack/plugins/maps/public/components/geo_index_pattern_select.tsx @@ -5,10 +5,12 @@ * 2.0. */ -import React, { Component } from 'react'; +import React, { useMemo, useRef, useState } from 'react'; +import useMountedState from 'react-use/lib/useMountedState'; import { EuiCallOut, EuiFormRow, EuiLink, EuiSpacer } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; +import { indexPatterns } from '@kbn/data-plugin/public'; import { DataView } from '@kbn/data-plugin/common'; import { getIndexPatternSelectComponent, @@ -20,36 +22,32 @@ import { ES_GEO_FIELD_TYPE, ES_GEO_FIELD_TYPES } from '../../common/constants'; interface Props { onChange: (indexPattern: DataView) => void; - value: string | null; + dataView?: DataView | null; isGeoPointsOnly?: boolean; } -interface State { - doesIndexPatternHaveGeoField: boolean; - noIndexPatternsExist: boolean; -} - -export class GeoIndexPatternSelect extends Component { - private _isMounted: boolean = false; - - state = { - doesIndexPatternHaveGeoField: false, - noIndexPatternsExist: false, - }; +export function GeoIndexPatternSelect(props: Props) { + const [noDataViews, setNoDataViews] = useState(false); - componentWillUnmount() { - this._isMounted = false; - } + const hasGeoFields = useMemo(() => { + return props.dataView + ? props.dataView.fields.some((field) => { + return !indexPatterns.isNestedField(field) && props?.isGeoPointsOnly + ? (ES_GEO_FIELD_TYPE.GEO_POINT as string) === field.type + : ES_GEO_FIELD_TYPES.includes(field.type); + }) + : false; + }, [props.dataView, props?.isGeoPointsOnly]); - componentDidMount() { - this._isMounted = true; - } + const isMounted = useMountedState(); + const dataViewIdRef = useRef(); - _onIndexPatternSelect = async (indexPatternId?: string) => { + async function _onIndexPatternSelect(indexPatternId?: string) { if (!indexPatternId || indexPatternId.length === 0) { return; } + dataViewIdRef.current = indexPatternId; let indexPattern; try { indexPattern = await getIndexPatternService().get(indexPatternId); @@ -59,24 +57,13 @@ export class GeoIndexPatternSelect extends Component { // method may be called again before 'get' returns // ignore response when fetched index pattern does not match active index pattern - if (this._isMounted && indexPattern.id === indexPatternId) { - this.setState({ - doesIndexPatternHaveGeoField: indexPattern.fields.some((field) => { - return this.props?.isGeoPointsOnly - ? (ES_GEO_FIELD_TYPE.GEO_POINT as string) === field.type - : ES_GEO_FIELD_TYPES.includes(field.type); - }), - }); - this.props.onChange(indexPattern); + if (isMounted() && indexPattern.id === dataViewIdRef.current) { + props.onChange(indexPattern); } - }; - - _onNoIndexPatterns = () => { - this.setState({ noIndexPatternsExist: true }); - }; + } - _renderNoIndexPatternWarning() { - if (!this.state.noIndexPatternsExist) { + function _renderNoIndexPatternWarning() { + if (!noDataViews) { return null; } @@ -118,31 +105,31 @@ export class GeoIndexPatternSelect extends Component { ); } - render() { - const IndexPatternSelect = getIndexPatternSelectComponent(); - const isIndexPatternInvalid = !!this.props.value && !this.state.doesIndexPatternHaveGeoField; - const error = isIndexPatternInvalid - ? i18n.translate('xpack.maps.noGeoFieldInIndexPattern.message', { - defaultMessage: 'Data view does not contain any geospatial fields', - }) - : ''; - return ( - <> - {this._renderNoIndexPatternWarning()} + const IndexPatternSelect = getIndexPatternSelectComponent(); + const error = !hasGeoFields + ? i18n.translate('xpack.maps.noGeoFieldInIndexPattern.message', { + defaultMessage: 'Data view does not contain any geospatial fields', + }) + : ''; - - - - - ); - } + return ( + <> + {_renderNoIndexPatternWarning()} + + + { + setNoDataViews(true); + }} + isClearable={false} + data-test-subj="mapGeoIndexPatternSelect" + /> + + + ); } diff --git a/x-pack/plugins/maps/public/components/metrics_editor/metric_editor.tsx b/x-pack/plugins/maps/public/components/metrics_editor/metric_editor.tsx index 5042cb4ffa9c7..cfdf4003c4b16 100644 --- a/x-pack/plugins/maps/public/components/metrics_editor/metric_editor.tsx +++ b/x-pack/plugins/maps/public/components/metrics_editor/metric_editor.tsx @@ -20,6 +20,7 @@ import { getTermsFields } from '../../index_pattern_util'; import { ValidatedNumberInput } from '../validated_number_input'; import { getMaskI18nLabel } from '../../classes/layers/vector_layer/mask'; import { MaskExpression } from './mask_expression'; +import { inputStrings } from '../../connected_components/input_strings'; function filterFieldsForAgg(fields: DataViewField[], aggType: AGG_TYPE) { if (!fields) { @@ -141,9 +142,7 @@ export function MetricEditor({ })} > , 'isDisabled' | 'onChange' | 'options' | 'renderOption' | 'selectedOptions' | 'singleSelection' > & { diff --git a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/__snapshots__/edit_layer_panel.test.tsx.snap b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/__snapshots__/edit_layer_panel.test.tsx.snap index a6b623fd3ce89..3cbeac5d9a3e5 100644 --- a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/__snapshots__/edit_layer_panel.test.tsx.snap +++ b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/__snapshots__/edit_layer_panel.test.tsx.snap @@ -94,12 +94,12 @@ exports[`EditLayerPanel is rendered 1`] = ` "getId": [Function], "getImmutableSourceProperties": [Function], "getLayerTypeIconName": [Function], + "getSource": [Function], "getStyleForEditing": [Function], "getType": [Function], "hasErrors": [Function], "hasJoins": [Function], "renderSourceSettingsEditor": [Function], - "showJoinEditor": [Function], "supportsElasticsearchFilters": [Function], "supportsFitToBounds": [Function], } @@ -119,12 +119,12 @@ exports[`EditLayerPanel is rendered 1`] = ` "getId": [Function], "getImmutableSourceProperties": [Function], "getLayerTypeIconName": [Function], + "getSource": [Function], "getStyleForEditing": [Function], "getType": [Function], "hasErrors": [Function], "hasJoins": [Function], "renderSourceSettingsEditor": [Function], - "showJoinEditor": [Function], "supportsElasticsearchFilters": [Function], "supportsFitToBounds": [Function], } diff --git a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/edit_layer_panel.test.tsx b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/edit_layer_panel.test.tsx index 25cac10379875..92dd77d620ac9 100644 --- a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/edit_layer_panel.test.tsx +++ b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/edit_layer_panel.test.tsx @@ -65,9 +65,6 @@ const mockLayer = { getImmutableSourceProperties: () => { return [{ label: 'source prop1', value: 'you get one chance to set me' }]; }, - showJoinEditor: () => { - return true; - }, canShowTooltip: () => { return true; }, @@ -95,6 +92,13 @@ const mockLayer = { getStyleForEditing: () => { return {}; }, + getSource: () => { + return { + supportsJoins: () => { + return true; + }, + }; + }, } as unknown as ILayer; const defaultProps = { diff --git a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/edit_layer_panel.tsx b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/edit_layer_panel.tsx index 8ef8319a82798..ae8e02b4cef3e 100644 --- a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/edit_layer_panel.tsx +++ b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/edit_layer_panel.tsx @@ -36,6 +36,7 @@ import { isVectorLayer, IVectorLayer } from '../../classes/layers/vector_layer'; import { ImmutableSourceProperty, OnSourceChangeArgs } from '../../classes/sources/source'; import { IField } from '../../classes/fields/field'; import { isLayerGroup } from '../../classes/layers/layer_group'; +import { isSpatialJoin } from '../../classes/joins/is_spatial_join'; const localStorage = new Storage(window.localStorage); @@ -112,7 +113,7 @@ export class EditLayerPanel extends Component { } const vectorLayer = this.props.selectedLayer as IVectorLayer; - if (!vectorLayer.showJoinEditor() || vectorLayer.getLeftJoinFields === undefined) { + if (!vectorLayer.getSource().supportsJoins() || vectorLayer.getLeftJoinFields === undefined) { return; } @@ -184,7 +185,7 @@ export class EditLayerPanel extends Component { return; } const vectorLayer = this.props.selectedLayer as IVectorLayer; - if (!vectorLayer.showJoinEditor()) { + if (!vectorLayer.getSource().supportsJoins()) { return null; } @@ -244,12 +245,12 @@ export class EditLayerPanel extends Component { } const descriptor = this.props.selectedLayer.getDescriptor() as VectorLayerDescriptor; - const numberOfJoins = descriptor.joins ? descriptor.joins.length : 0; return isLayerGroup(this.props.selectedLayer) ? null : this.props.selectedLayer.renderSourceSettingsEditor({ currentLayerType: this.props.selectedLayer.getType(), - numberOfJoins, + hasSpatialJoins: (descriptor.joins ?? []).some(isSpatialJoin), + numberOfJoins: descriptor.joins ? descriptor.joins.length : 0, onChange: this._onSourceChange, onStyleDescriptorChange: this.props.updateStyleDescriptor, style: this.props.selectedLayer.getStyleForEditing(), diff --git a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/index.ts b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/index.ts index 0f511dca906fd..4bff783974078 100644 --- a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/index.ts +++ b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/index.ts @@ -21,7 +21,7 @@ function mapStateToProps(state: MapStoreState) { let key = 'none'; if (selectedLayer) { key = isVectorLayer(selectedLayer) - ? `${selectedLayer.getId()}${(selectedLayer as IVectorLayer).showJoinEditor()}` + ? `${selectedLayer.getId()}${(selectedLayer as IVectorLayer).getSource().supportsJoins()}` : selectedLayer.getId(); } return { diff --git a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/__snapshots__/add_join_button.test.tsx.snap b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/__snapshots__/add_join_button.test.tsx.snap deleted file mode 100644 index 6da0a04523c16..0000000000000 --- a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/__snapshots__/add_join_button.test.tsx.snap +++ /dev/null @@ -1,44 +0,0 @@ -// Jest Snapshot v1, https://goo.gl/fbAQLP - -exports[`Should disable add button when layer source is MVT and there is one join 1`] = ` - - - Add join - - -`; - -exports[`Should enable add button when layer source is MVT and there is no join 1`] = ` - - Add join - -`; - -exports[`Should render add join button 1`] = ` - - Add join - -`; diff --git a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/__snapshots__/join_editor.test.tsx.snap b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/__snapshots__/join_editor.test.tsx.snap index 41903e8accafc..98be2825f972a 100644 --- a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/__snapshots__/join_editor.test.tsx.snap +++ b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/__snapshots__/join_editor.test.tsx.snap @@ -1,28 +1,5 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`Should render callout when joins are disabled 1`] = ` -
- -
- - - -
-
- - Simulated disabled reason - -
-`; - exports[`Should render join editor 1`] = `
- - - - - + + + + +
`; diff --git a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/add_join_button.test.tsx b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/add_join_button.test.tsx deleted file mode 100644 index 2a017b8dd183f..0000000000000 --- a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/add_join_button.test.tsx +++ /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 React from 'react'; -import { shallow } from 'enzyme'; -import { AddJoinButton } from './add_join_button'; - -test('Should render add join button', () => { - const component = shallow( - {}} isLayerSourceMvt={false} numJoins={0} /> - ); - expect(component).toMatchSnapshot(); -}); - -test('Should enable add button when layer source is MVT and there is no join', () => { - const component = shallow( - {}} isLayerSourceMvt={true} numJoins={0} /> - ); - expect(component).toMatchSnapshot(); -}); - -test('Should disable add button when layer source is MVT and there is one join', () => { - const component = shallow( - {}} isLayerSourceMvt={true} numJoins={1} /> - ); - expect(component).toMatchSnapshot(); -}); diff --git a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/add_join_button.tsx b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/add_join_button.tsx index 2aee26fbbaeac..24eee98173111 100644 --- a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/add_join_button.tsx +++ b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/add_join_button.tsx @@ -5,42 +5,31 @@ * 2.0. */ -import { i18n } from '@kbn/i18n'; import React from 'react'; import { EuiButtonEmpty, EuiToolTip } from '@elastic/eui'; -const BUTTON_LABEL = i18n.translate('xpack.maps.layerPanel.joinEditor.addJoinButton.label', { - defaultMessage: 'Add join', -}); - export interface Props { - addJoin: () => void; - isLayerSourceMvt: boolean; - numJoins: number; + disabledReason: string; + isDisabled: boolean; + label: string; + onClick: () => void; } -export function AddJoinButton({ addJoin, isLayerSourceMvt, numJoins }: Props) { - const isDisabled = isLayerSourceMvt && numJoins >= 1; +export function AddJoinButton(props: Props) { const button = ( - {BUTTON_LABEL} + {props.label} ); - return isDisabled ? ( - - {button} - + return props.isDisabled ? ( + {button} ) : ( button ); diff --git a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/index.ts b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/index.ts index 570c1ba8fb896..e9c46b34bff0f 100644 --- a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/index.ts +++ b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/index.ts @@ -23,7 +23,7 @@ function mapStateToProps(state: MapStoreState) { function mapDispatchToProps(dispatch: ThunkDispatch) { return { - onChange: (layer: ILayer, joins: JoinDescriptor[]) => { + onChange: (layer: ILayer, joins: Array>) => { dispatch(setJoinsForLayer(layer, joins)); }, }; diff --git a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/join_editor.test.tsx b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/join_editor.test.tsx index 1bfe40b555261..f76f90833cbbc 100644 --- a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/join_editor.test.tsx +++ b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/join_editor.test.tsx @@ -10,18 +10,9 @@ import { IVectorLayer } from '../../../classes/layers/vector_layer'; import { JoinEditor } from './join_editor'; import { shallow } from 'enzyme'; import { JoinDescriptor } from '../../../../common/descriptor_types'; +import { SOURCE_TYPES } from '../../../../common/constants'; class MockLayer { - private readonly _disableReason: string | null; - - constructor(disableReason: string | null) { - this._disableReason = disableReason; - } - - getJoinsDisabledReason() { - return this._disableReason; - } - getSource() { return { isMvt: () => { @@ -45,6 +36,7 @@ const defaultProps = { label: 'web logs count', }, ], + type: SOURCE_TYPES.ES_TERM_SOURCE, }, } as JoinDescriptor, ], @@ -55,17 +47,7 @@ const defaultProps = { test('Should render join editor', () => { const component = shallow( - - ); - expect(component).toMatchSnapshot(); -}); - -test('Should render callout when joins are disabled', () => { - const component = shallow( - + ); expect(component).toMatchSnapshot(); }); diff --git a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/join_editor.tsx b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/join_editor.tsx index 9d39724144dab..8bc8ea05d481e 100644 --- a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/join_editor.tsx +++ b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/join_editor.tsx @@ -5,17 +5,16 @@ * 2.0. */ -import React, { Fragment } from 'react'; +import React, { useEffect, useState } from 'react'; import { v4 as uuidv4 } from 'uuid'; - -import { EuiTitle, EuiSpacer, EuiTextAlign, EuiCallOut } from '@elastic/eui'; - +import { i18n } from '@kbn/i18n'; +import { EuiSkeletonText, EuiTextAlign, EuiTitle } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { Join } from './resources/join'; import { JoinDocumentationPopover } from './resources/join_documentation_popover'; import { IVectorLayer } from '../../../classes/layers/vector_layer'; import { JoinDescriptor } from '../../../../common/descriptor_types'; -import { SOURCE_TYPES } from '../../../../common/constants'; +import { SOURCE_TYPES, VECTOR_SHAPE_TYPE } from '../../../../common/constants'; import { AddJoinButton } from './add_join_button'; export interface JoinField { @@ -24,17 +23,78 @@ export interface JoinField { } export interface Props { - joins: JoinDescriptor[]; + joins: Array>; layer: IVectorLayer; layerDisplayName: string; leftJoinFields: JoinField[]; - onChange: (layer: IVectorLayer, joins: JoinDescriptor[]) => void; + onChange: (layer: IVectorLayer, joins: Array>) => void; } export function JoinEditor({ joins, layer, onChange, leftJoinFields, layerDisplayName }: Props) { + const [supportsSpatialJoin, setSupportsSpatialJoin] = useState(false); + const [spatialJoinDisableReason, setSpatialJoinDisableReason] = useState(''); + const [isLoading, setIsLoading] = useState(false); + + useEffect(() => { + let ignore = false; + const source = layer.getSource(); + if (!source.isESSource()) { + setSpatialJoinDisableReason( + i18n.translate('xpack.maps.layerPanel.joinEditor.spatialJoin.disabled.esSourceOnly', { + defaultMessage: 'Spatial joins are not supported for {sourceType}.', + values: { sourceType: source.getType() }, + }) + ); + setSupportsSpatialJoin(false); + return; + } + + if (source.isMvt()) { + setSpatialJoinDisableReason( + i18n.translate('xpack.maps.layerPanel.joinEditor.spatialJoin.disabled.geoJsonOnly', { + defaultMessage: 'Spatial joins are not supported with vector tiles.', + }) + ); + setSupportsSpatialJoin(false); + return; + } + + // TODO remove isPointsOnly check once non-point spatial joins have been implemented + setIsLoading(true); + source + .getSupportedShapeTypes() + .then((supportedShapes) => { + if (!ignore) { + const isPointsOnly = + supportedShapes.length === 1 && supportedShapes[0] === VECTOR_SHAPE_TYPE.POINT; + if (!isPointsOnly) { + setSpatialJoinDisableReason( + i18n.translate('xpack.maps.layerPanel.joinEditor.spatialJoin.disabled.pointsOnly', { + defaultMessage: 'Spatial joins are not supported with geo_shape geometry.', + }) + ); + setSupportsSpatialJoin(isPointsOnly); + setIsLoading(false); + return; + } + + setSpatialJoinDisableReason(''); + setSupportsSpatialJoin(true); + setIsLoading(false); + } + }) + .catch((error) => { + // keep spatial joins disabled when unable to verify if they are supported + }); + + return () => { + ignore = true; + }; + }, [layer]); + const renderJoins = () => { - return joins.map((joinDescriptor: JoinDescriptor, index: number) => { - const handleOnChange = (updatedDescriptor: JoinDescriptor) => { + return joins.map((joinDescriptor: Partial, index: number) => { + const handleOnChange = (updatedDescriptor: Partial) => { onChange(layer, [...joins.slice(0, index), updatedDescriptor, ...joins.slice(index + 1)]); }; @@ -42,74 +102,86 @@ export function JoinEditor({ joins, layer, onChange, leftJoinFields, layerDispla onChange(layer, [...joins.slice(0, index), ...joins.slice(index + 1)]); }; - if (joinDescriptor.right.type === SOURCE_TYPES.TABLE_SOURCE) { - throw new Error( - 'PEBKAC - Table sources cannot be edited in the UX and should only be used in MapEmbeddable' - ); - } else { - return ( - - - - - ); - } + return ( + + ); }); }; - const addJoin = () => { + const addJoin = (joinDescriptor: Partial) => { onChange(layer, [ ...joins, { + ...joinDescriptor, right: { - id: uuidv4(), - applyGlobalQuery: true, - applyGlobalTime: true, + ...(joinDescriptor?.right ?? {}), }, - } as JoinDescriptor, + }, ]); }; - function renderContent() { - const disabledReason = layer.getJoinsDisabledReason(); - - return disabledReason ? ( - {disabledReason} - ) : ( - - {renderJoins()} - - - - - - ); - } - return (
- {' '} + {' '}
- {renderContent()} + {renderJoins()} + + + + { + addJoin({ + leftField: '_id', + right: { + type: SOURCE_TYPES.ES_DISTANCE_SOURCE, + id: uuidv4(), + applyGlobalQuery: true, + applyGlobalTime: true, + }, + } as Partial); + }} + /> + = 1} + label={i18n.translate('xpack.maps.layerPanel.joinEditor.termJoin.addButtonLabel', { + defaultMessage: 'Add term join', + })} + onClick={() => { + addJoin({ + right: { + type: SOURCE_TYPES.ES_TERM_SOURCE, + id: uuidv4(), + applyGlobalQuery: true, + applyGlobalTime: true, + }, + } as Partial); + }} + /> + +
); } diff --git a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/__snapshots__/metrics_expression.test.tsx.snap b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/__snapshots__/metrics_expression.test.tsx.snap index 912bfa1c2e9d9..629551656b886 100644 --- a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/__snapshots__/metrics_expression.test.tsx.snap +++ b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/__snapshots__/metrics_expression.test.tsx.snap @@ -19,6 +19,7 @@ exports[`Should render default props 1`] = ` isOpen={false} ownFocus={true} panelPaddingSize="m" + repositionOnScroll={true} >
@@ -38,7 +39,7 @@ exports[`Should render default props 1`] = ` className="mapJoinExpressionHelpText" > @@ -79,6 +80,7 @@ exports[`Should render metrics expression for metrics 1`] = ` isOpen={false} ownFocus={true} panelPaddingSize="m" + repositionOnScroll={true} >
@@ -98,7 +100,7 @@ exports[`Should render metrics expression for metrics 1`] = ` className="mapJoinExpressionHelpText" > diff --git a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/_join.scss b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/_join.scss index c20cea711e4f0..bd5110afe06ad 100644 --- a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/_join.scss +++ b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/_join.scss @@ -3,6 +3,7 @@ background: tintOrShade($euiColorLightShade, 85%, 0); border-radius: $euiBorderRadius; padding: $euiSizeS $euiSizeXS; + margin-bottom: $euiSizeM; .mapJoinItem__inner { @include euiScrollBar; diff --git a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/join.tsx b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/join.tsx index 1eb23dc207cd4..1f54801118f30 100644 --- a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/join.tsx +++ b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/join.tsx @@ -7,31 +7,38 @@ import _ from 'lodash'; import React, { Component } from 'react'; -import { EuiFlexItem, EuiFlexGroup, EuiButtonIcon } from '@elastic/eui'; +import { EuiFlexItem, EuiFlexGroup, EuiButtonIcon, EuiText, EuiTextColor } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import type { DataViewField, DataView, Query } from '@kbn/data-plugin/common'; import { indexPatterns } from '@kbn/data-plugin/public'; -import { JoinExpression } from './join_expression'; +import { SpatialJoinExpression } from './spatial_join_expression'; +import { TermJoinExpression } from './term_join_expression'; import { MetricsExpression } from './metrics_expression'; import { WhereExpression } from './where_expression'; import { GlobalFilterCheckbox } from '../../../../components/global_filter_checkbox'; import { GlobalTimeCheckbox } from '../../../../components/global_time_checkbox'; import { + AbstractESJoinSourceDescriptor, AggDescriptor, + ESDistanceSourceDescriptor, ESTermSourceDescriptor, JoinDescriptor, + JoinSourceDescriptor, } from '../../../../../common/descriptor_types'; -import { ILayer } from '../../../../classes/layers/layer'; import { getIndexPatternService } from '../../../../kibana_services'; import { getDataViewNotFoundMessage } from '../../../../../common/i18n_getters'; import { AGG_TYPE, SOURCE_TYPES } from '../../../../../common/constants'; import type { JoinField } from '../join_editor'; +import { isSpatialJoin } from '../../../../classes/joins/is_spatial_join'; +import { + isSpatialSourceComplete, + isTermSourceComplete, +} from '../../../../classes/sources/join_sources'; interface Props { - join: JoinDescriptor; - layer: ILayer; - onChange: (joinDescriptor: JoinDescriptor) => void; + join: Partial; + onChange: (joinDescriptor: Partial) => void; onRemove: () => void; leftFields: JoinField[]; leftSourceName: string; @@ -45,6 +52,7 @@ interface State { export class Join extends Component { private _isMounted = false; + private _nextIndexPatternId: string | undefined; state: State = { rightFields: [], @@ -66,6 +74,7 @@ export class Join extends Component { return; } + this._nextIndexPatternId = indexPatternId; let indexPattern; try { indexPattern = await getIndexPatternService().get(indexPatternId); @@ -78,7 +87,7 @@ export class Join extends Component { return; } - if (!this._isMounted) { + if (!this._isMounted || this._nextIndexPatternId !== indexPatternId) { return; } @@ -95,40 +104,25 @@ export class Join extends Component { }); }; - _onRightSourceChange = (indexPatternId: string) => { - this.setState({ - rightFields: [], - loadError: undefined, - }); - this._loadRightFields(indexPatternId); - const { term, ...restOfRight } = this.props.join.right as ESTermSourceDescriptor; - this.props.onChange({ - leftField: this.props.join.leftField, - right: { - ...restOfRight, - indexPatternId, - type: SOURCE_TYPES.ES_TERM_SOURCE, - } as ESTermSourceDescriptor, - }); - }; - - _onRightFieldChange = (term?: string) => { - this.props.onChange({ - leftField: this.props.join.leftField, - right: { - ...this.props.join.right, - term, - } as ESTermSourceDescriptor, - }); - }; + _onRightSourceDescriptorChange = (sourceDescriptor: Partial) => { + const indexPatternId = (sourceDescriptor as Partial) + .indexPatternId; + if (this.state.indexPattern?.id !== indexPatternId) { + this.setState({ + indexPattern: undefined, + rightFields: [], + loadError: undefined, + }); + if (indexPatternId) { + this._loadRightFields(indexPatternId); + } + } - _onRightSizeChange = (size: number) => { this.props.onChange({ leftField: this.props.join.leftField, right: { - ...this.props.join.right, - size, - } as ESTermSourceDescriptor, + ...sourceDescriptor, + }, }); }; @@ -138,7 +132,7 @@ export class Join extends Component { right: { ...this.props.join.right, metrics, - } as ESTermSourceDescriptor, + } as Partial, }); }; @@ -148,7 +142,7 @@ export class Join extends Component { right: { ...this.props.join.right, whereQuery, - } as ESTermSourceDescriptor, + } as Partial, }); }; @@ -158,7 +152,7 @@ export class Join extends Component { right: { ...this.props.join.right, applyGlobalQuery, - } as ESTermSourceDescriptor, + } as Partial, }); }; @@ -168,20 +162,61 @@ export class Join extends Component { right: { ...this.props.join.right, applyGlobalTime, - } as ESTermSourceDescriptor, + } as Partial, }); }; render() { const { join, onRemove, leftFields, leftSourceName } = this.props; const { rightFields, indexPattern } = this.state; - const right = _.get(join, 'right', {}) as ESTermSourceDescriptor; - const rightSourceName = indexPattern ? indexPattern.getName() : right.indexPatternId; - const isJoinConfigComplete = join.leftField && right.indexPatternId && right.term; + const right = (join?.right ?? {}) as Partial; + + let isJoinConfigComplete = false; + let joinExpression; + if (right.type === SOURCE_TYPES.ES_TERM_SOURCE) { + isJoinConfigComplete = + join.leftField !== undefined && + isTermSourceComplete(right as Partial); + joinExpression = ( + } + onSourceDescriptorChange={this._onRightSourceDescriptorChange} + rightFields={rightFields} + /> + ); + } else if (isSpatialJoin(this.props.join)) { + isJoinConfigComplete = + join.leftField !== undefined && + isSpatialSourceComplete(right as Partial); + joinExpression = ( + } + onSourceDescriptorChange={this._onRightSourceDescriptorChange} + /> + ); + } else { + joinExpression = ( + +

+ + {i18n.translate('xpack.maps.layerPanel.join.joinExpression.noEditorMsg', { + defaultMessage: 'Unable to edit {type} join.', + values: { type: right.type }, + })} + +

+
+ ); + } let metricsExpression; let globalFilterCheckbox; let globalTimeCheckbox; + if (isJoinConfigComplete) { metricsExpression = ( @@ -234,22 +269,7 @@ export class Join extends Component { return (
- - - + {joinExpression} {metricsExpression} diff --git a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/join_documentation_popover.tsx b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/join_documentation_popover.tsx index 1df70f334a4fd..b4f2c34c813c2 100644 --- a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/join_documentation_popover.tsx +++ b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/join_documentation_popover.tsx @@ -5,110 +5,91 @@ * 2.0. */ -import React, { Component } from 'react'; +import React, { useState } from 'react'; import { EuiButtonIcon, EuiLink, EuiPopover, EuiPopoverTitle, EuiText } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { getDocLinks } from '../../../../kibana_services'; -interface State { - isPopoverOpen: boolean; -} - -export class JoinDocumentationPopover extends Component<{}, State> { - state: State = { - isPopoverOpen: false, - }; - - _togglePopover = () => { - this.setState((prevState) => ({ - isPopoverOpen: !prevState.isPopoverOpen, - })); - }; - - _closePopover = () => { - this.setState({ - isPopoverOpen: false, - }); - }; +export function JoinDocumentationPopover() { + const [isPopoverOpen, setIsPopoverOpen] = useState(false); - _renderContent() { - return ( + return ( + { + setIsPopoverOpen(!isPopoverOpen); + }} + iconType="documentation" + aria-label="Join documentation" + /> + } + isOpen={isPopoverOpen} + closePopover={() => { + setIsPopoverOpen(false); + }} + repositionOnScroll + ownFocus + > + + +
- +

-

-
    -
  • - -
  • -
  • - -
  • -
  • + defaultMessage="Joins add metrics to layer features for data driven styling and tooltip content." + />{' '} + -
  • -
  • + +

    +
    +
    + +
    +
    +

    + +

    + + + +
    + +
    -
  • -
-

- -

- - - + +
+

+ +

+
+
- ); - } - - render() { - return ( - - } - isOpen={this.state.isPopoverOpen} - closePopover={this._closePopover} - repositionOnScroll - ownFocus - > - - - - {this._renderContent()} - - ); - } +
+ ); } diff --git a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/join_expression.tsx b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/join_expression.tsx deleted file mode 100644 index c70730c0f3f62..0000000000000 --- a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/join_expression.tsx +++ /dev/null @@ -1,297 +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 _ from 'lodash'; -import React, { Component } from 'react'; -import { - EuiPopover, - EuiPopoverTitle, - EuiExpression, - EuiFormRow, - EuiComboBox, - EuiComboBoxOptionOption, - EuiFormHelpText, -} from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; - -import { DataViewField } from '@kbn/data-views-plugin/public'; -import { FormattedMessage } from '@kbn/i18n-react'; -import { getDataViewSelectPlaceholder } from '../../../../../common/i18n_getters'; -import { DEFAULT_MAX_BUCKETS_LIMIT } from '../../../../../common/constants'; -import { SingleFieldSelect } from '../../../../components/single_field_select'; -import { ValidatedNumberInput } from '../../../../components/validated_number_input'; - -import { getTermsFields } from '../../../../index_pattern_util'; -import { getIndexPatternSelectComponent } from '../../../../kibana_services'; -import type { JoinField } from '../join_editor'; - -interface Props { - // Left source props (static - can not change) - leftSourceName?: string; - - // Left field props - leftValue?: string; - leftFields: JoinField[]; - onLeftFieldChange: (leftField: string) => void; - - // Right source props - rightSourceIndexPatternId: string; - rightSourceName: string; - onRightSourceChange: (indexPatternId: string) => void; - - // Right field props - rightValue: string; - rightSize?: number; - rightFields: DataViewField[]; - onRightFieldChange: (term?: string) => void; - onRightSizeChange: (size: number) => void; -} - -interface State { - isPopoverOpen: boolean; -} - -export class JoinExpression extends Component { - state: State = { - isPopoverOpen: false, - }; - - _togglePopover = () => { - this.setState((prevState) => ({ - isPopoverOpen: !prevState.isPopoverOpen, - })); - }; - - _closePopover = () => { - this.setState({ - isPopoverOpen: false, - }); - }; - - _onRightSourceChange = (indexPatternId?: string) => { - if (!indexPatternId || indexPatternId.length === 0) { - return; - } - - this.props.onRightSourceChange(indexPatternId); - }; - - _onLeftFieldChange = (selectedFields: Array>) => { - this.props.onLeftFieldChange(_.get(selectedFields, '[0].value.name', null)); - }; - - _onRightFieldChange = (term?: string) => { - if (!term || term.length === 0) { - return; - } - - this.props.onRightFieldChange(term); - }; - - _renderLeftFieldSelect() { - const { leftValue, leftFields } = this.props; - - if (!leftFields) { - return null; - } - - const options = leftFields.map((field) => { - return { - value: field, - label: field.label, - }; - }); - - let leftFieldOption; - if (leftValue) { - leftFieldOption = options.find((option) => { - const field = option.value; - return field.name === leftValue; - }); - } - const selectedOptions = leftFieldOption ? [leftFieldOption] : []; - - return ( - - - - ); - } - - _renderRightSourceSelect() { - if (!this.props.leftValue) { - return null; - } - const IndexPatternSelect = getIndexPatternSelectComponent(); - - return ( - - - - ); - } - - _renderRightFieldSelect() { - if (!this.props.rightFields || !this.props.leftValue) { - return null; - } - - return ( - - - - ); - } - - _renderRightFieldSizeInput() { - if (!this.props.rightValue || !this.props.leftValue) { - return null; - } - - return ( - - ); - } - - _getExpressionValue() { - const { leftSourceName, leftValue, rightSourceName, rightValue, rightSize } = this.props; - if (leftSourceName && leftValue && rightSourceName && rightValue) { - return i18n.translate('xpack.maps.layerPanel.joinExpression.value', { - defaultMessage: - '{leftSourceName}:{leftValue} with {sizeFragment} {rightSourceName}:{rightValue}', - values: { - leftSourceName, - leftValue, - sizeFragment: - rightSize !== undefined - ? i18n.translate('xpack.maps.layerPanel.joinExpression.sizeFragment', { - defaultMessage: 'top {rightSize} terms from', - values: { rightSize }, - }) - : '', - rightSourceName, - rightValue, - }, - }); - } - - return i18n.translate('xpack.maps.layerPanel.joinExpression.selectPlaceholder', { - defaultMessage: '-- select --', - }); - } - - render() { - const { leftSourceName } = this.props; - return ( - - } - > -
- - - - - - - - - - {this._renderLeftFieldSelect()} - - {this._renderRightSourceSelect()} - - {this._renderRightFieldSelect()} - - {this._renderRightFieldSizeInput()} -
-
- ); - } -} - -function getSelectFieldPlaceholder() { - return i18n.translate('xpack.maps.layerPanel.joinExpression.selectFieldPlaceholder', { - defaultMessage: 'Select field', - }); -} diff --git a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/metrics_expression.tsx b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/metrics_expression.tsx index f489bb1923b96..7334872bc9243 100644 --- a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/metrics_expression.tsx +++ b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/metrics_expression.tsx @@ -116,18 +116,19 @@ export class MetricsExpression extends Component { value={metricExpressions.length > 0 ? metricExpressions.join(', ') : AGG_TYPE.COUNT} /> } + repositionOnScroll={true} >
{this._renderMetricsEditor()} diff --git a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/spatial_join_expression/index.ts b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/spatial_join_expression/index.ts new file mode 100644 index 0000000000000..afcff17a0f9b9 --- /dev/null +++ b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/spatial_join_expression/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { SpatialJoinExpression } from './spatial_join_expression'; diff --git a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/spatial_join_expression/spatial_join_expression.tsx b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/spatial_join_expression/spatial_join_expression.tsx new file mode 100644 index 0000000000000..1307bf8d3682d --- /dev/null +++ b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/spatial_join_expression/spatial_join_expression.tsx @@ -0,0 +1,66 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { useState } from 'react'; +import { EuiPopover, EuiExpression } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { + ESDistanceSourceDescriptor, + JoinSourceDescriptor, +} from '../../../../../../common/descriptor_types'; +import { SpatialJoinPopoverContent } from './spatial_join_popover_content'; + +interface Props { + sourceDescriptor: Partial; + onSourceDescriptorChange: (sourceDescriptor: Partial) => void; +} + +export function SpatialJoinExpression(props: Props) { + const [isPopoverOpen, setIsPopoverOpen] = useState(false); + + const { geoField } = props.sourceDescriptor; + const expressionValue = + geoField !== undefined + ? i18n.translate('xpack.maps.spatialJoinExpression.value', { + defaultMessage: 'features from {geoField}', + values: { geoField }, + }) + : i18n.translate('xpack.maps.spatialJoinExpression.emptyValue', { + defaultMessage: '-- configure spatial join --', + }); + + return ( + { + setIsPopoverOpen(false); + }} + ownFocus + initialFocus="body" /* avoid initialFocus on Combobox */ + anchorPosition="leftCenter" + button={ + { + setIsPopoverOpen(!isPopoverOpen); + }} + description={i18n.translate('xpack.maps.spatialJoinExpression.description', { + defaultMessage: 'Join with', + })} + uppercase={false} + value={expressionValue} + /> + } + repositionOnScroll={true} + > + + + ); +} diff --git a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/spatial_join_expression/spatial_join_popover_content.tsx b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/spatial_join_expression/spatial_join_popover_content.tsx new file mode 100644 index 0000000000000..02f91cac462b8 --- /dev/null +++ b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/spatial_join_expression/spatial_join_popover_content.tsx @@ -0,0 +1,142 @@ +/* + * 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, { useEffect, useState } from 'react'; +import { EuiCallOut, EuiFormRow, EuiPopoverTitle, EuiSkeletonText, EuiSpacer } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import type { DataView, DataViewField } from '@kbn/data-plugin/common'; +import type { + ESDistanceSourceDescriptor, + JoinSourceDescriptor, +} from '../../../../../../common/descriptor_types'; +import { getIndexPatternService } from '../../../../../kibana_services'; +import { getGeoFields } from '../../../../../index_pattern_util'; +import { GeoIndexPatternSelect } from '../../../../../components/geo_index_pattern_select'; +import { GeoFieldSelect } from '../../../../../components/geo_field_select'; +import { inputStrings } from '../../../../input_strings'; +import { RelationshipExpression } from '../../../../../classes/layers/wizards/spatial_join_wizard'; +import { DEFAULT_WITHIN_DISTANCE } from '../../../../../classes/sources/join_sources'; + +interface Props { + sourceDescriptor: Partial; + onSourceDescriptorChange: (sourceDescriptor: Partial) => void; +} + +export function SpatialJoinPopoverContent(props: Props) { + const [rightDataView, setRightDataView] = useState(undefined); + const [rightGeoFields, setRightGeoFields] = useState([]); + const [isLoading, setIsLoading] = useState(false); + const [unableToLoadDataView, setUnableToLoadDataView] = useState(false); + + useEffect(() => { + if (props.sourceDescriptor.indexPatternId === undefined) { + return; + } + + let ignore = false; + setIsLoading(true); + getIndexPatternService() + .get(props.sourceDescriptor.indexPatternId) + .then((dataView) => { + if (!ignore) { + setIsLoading(false); + setRightDataView(dataView); + setRightGeoFields(getGeoFields(dataView.fields)); + } + }) + .catch((err) => { + if (!ignore) { + setIsLoading(false); + setUnableToLoadDataView(true); + } + }); + + return () => { + ignore = true; + }; + // only run on mount + // eslint-disable-next-line react-hooks/exhaustive-deps + }, []); + + const dataViewCallout = unableToLoadDataView ? ( + <> + +

+ {i18n.translate('xpack.maps.spatialJoinExpression.noDataViewTitle', { + defaultMessage: 'Unable to load data view {dataViewId}.', + values: { dataViewId: props.sourceDescriptor.indexPatternId }, + })} +

+
+ + + ) : null; + + const geoFieldSelect = rightDataView ? ( + { + if (!geoField) { + return; + } + props.onSourceDescriptorChange({ + ...props.sourceDescriptor, + geoField, + }); + }} + geoFields={rightGeoFields} + isClearable={false} + /> + ) : null; + + return ( +
+ + {i18n.translate('xpack.maps.spatialJoinExpression.popoverTitle', { + defaultMessage: 'Configure spatial join', + })} + + + + + { + props.onSourceDescriptorChange({ + ...props.sourceDescriptor, + distance, + }); + }} + /> + + + {dataViewCallout} + + { + setUnableToLoadDataView(false); + setRightDataView(dataView); + const geoFields = getGeoFields(dataView.fields); + setRightGeoFields(geoFields); + props.onSourceDescriptorChange({ + ...props.sourceDescriptor, + indexPatternId: dataView.id, + geoField: geoFields.length ? geoFields[0].name : undefined, + }); + }} + /> + + {geoFieldSelect} + +
+ ); +} diff --git a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/term_join_expression/index.ts b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/term_join_expression/index.ts new file mode 100644 index 0000000000000..91dcb52329742 --- /dev/null +++ b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/term_join_expression/index.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { TermJoinExpression } from './term_join_expression'; diff --git a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/term_join_expression/term_join_expression.tsx b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/term_join_expression/term_join_expression.tsx new file mode 100644 index 0000000000000..723c0d35d57da --- /dev/null +++ b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/term_join_expression/term_join_expression.tsx @@ -0,0 +1,92 @@ +/* + * 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, { useState } from 'react'; +import { EuiPopover, EuiExpression } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import type { DataViewField } from '@kbn/data-views-plugin/public'; +import { + ESTermSourceDescriptor, + JoinSourceDescriptor, +} from '../../../../../../common/descriptor_types'; +import type { JoinField } from '../../join_editor'; +import { TermJoinPopoverContent } from './term_join_popover_content'; + +interface Props { + // Left source props (static - can not change) + leftSourceName?: string; + + // Left field props + leftValue?: string; + leftFields: JoinField[]; + onLeftFieldChange: (leftField: string) => void; + + // Right source props + sourceDescriptor: Partial; + onSourceDescriptorChange: (sourceDescriptor: Partial) => void; + rightFields: DataViewField[]; +} + +export function TermJoinExpression(props: Props) { + const [isPopoverOpen, setIsPopoverOpen] = useState(false); + + const { size, term } = props.sourceDescriptor; + const expressionValue = + term !== undefined + ? i18n.translate('xpack.maps.termJoinExpression.value', { + defaultMessage: '{topTerms} terms from {term}', + values: { + topTerms: + size !== undefined + ? i18n.translate('xpack.maps.termJoinExpression.topTerms', { + defaultMessage: 'top {size}', + values: { size }, + }) + : '', + term, + }, + }) + : i18n.translate('xpack.maps.termJoinExpression.placeholder', { + defaultMessage: '-- configure term join --', + }); + + return ( + { + setIsPopoverOpen(false); + }} + ownFocus + initialFocus="body" /* avoid initialFocus on Combobox */ + anchorPosition="leftCenter" + button={ + { + setIsPopoverOpen(!isPopoverOpen); + }} + description={i18n.translate('xpack.maps.termJoinExpression.description', { + defaultMessage: 'Join with', + })} + uppercase={false} + value={expressionValue} + /> + } + repositionOnScroll={true} + > + + + ); +} diff --git a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/term_join_expression/term_join_popover_content.tsx b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/term_join_expression/term_join_popover_content.tsx new file mode 100644 index 0000000000000..cec91308add51 --- /dev/null +++ b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/term_join_expression/term_join_popover_content.tsx @@ -0,0 +1,237 @@ +/* + * 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 { + EuiPopoverTitle, + EuiFormRow, + EuiComboBox, + EuiComboBoxOptionOption, + EuiFormHelpText, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; + +import { DataViewField } from '@kbn/data-views-plugin/public'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { getDataViewSelectPlaceholder } from '../../../../../../common/i18n_getters'; +import { DEFAULT_MAX_BUCKETS_LIMIT } from '../../../../../../common/constants'; +import { + ESTermSourceDescriptor, + JoinSourceDescriptor, +} from '../../../../../../common/descriptor_types'; +import { SingleFieldSelect } from '../../../../../components/single_field_select'; +import { ValidatedNumberInput } from '../../../../../components/validated_number_input'; + +import { getTermsFields } from '../../../../../index_pattern_util'; +import { getIndexPatternSelectComponent } from '../../../../../kibana_services'; +import type { JoinField } from '../../join_editor'; +import { inputStrings } from '../../../../input_strings'; + +interface Props { + // Left source props (static - can not change) + leftSourceName?: string; + + // Left field props + leftValue?: string; + leftFields: JoinField[]; + onLeftFieldChange: (leftField: string) => void; + + // Right source props + sourceDescriptor: Partial; + onSourceDescriptorChange: (sourceDescriptor: Partial) => void; + + // Right field props + rightFields: DataViewField[]; +} + +export function TermJoinPopoverContent(props: Props) { + function onRightDataViewChange(indexPatternId?: string) { + if (!indexPatternId || indexPatternId.length === 0) { + return; + } + + const { term, ...rest } = props.sourceDescriptor; + props.onSourceDescriptorChange({ + ...rest, + indexPatternId, + }); + } + + function onLeftFieldChange(selectedFields: Array>) { + const leftField = selectedFields?.[0]?.value?.name; + if (leftField) { + props.onLeftFieldChange(leftField); + } + } + + function onRightFieldChange(term?: string) { + if (!term || term.length === 0) { + return; + } + + props.onSourceDescriptorChange({ + ...props.sourceDescriptor, + term, + }); + } + + function renderLeftFieldSelect() { + const { leftValue, leftFields } = props; + + if (!leftFields) { + return null; + } + + const options = leftFields.map((field) => { + return { + value: field, + label: field.label, + }; + }); + + let leftFieldOption; + if (leftValue) { + leftFieldOption = options.find((option) => { + const field = option.value; + return field.name === leftValue; + }); + } + const selectedOptions = leftFieldOption ? [leftFieldOption] : []; + + return ( + + + + ); + } + + function renderRightSourceSelect() { + if (!props.leftValue) { + return null; + } + const IndexPatternSelect = getIndexPatternSelectComponent(); + + return ( + + + + ); + } + + function renderRightFieldSelect() { + if (!props.rightFields || !props.leftValue) { + return null; + } + + return ( + + + + ); + } + + function renderRightFieldSizeInput() { + if (!props.leftValue) { + return null; + } + + return ( + { + props.onSourceDescriptorChange({ + ...props.sourceDescriptor, + size, + }); + }} + label={i18n.translate('xpack.maps.termJoinExpression.rightSizeLabel', { + defaultMessage: 'Right size', + })} + helpText={i18n.translate('xpack.maps.termJoinExpression.rightSizeHelpText', { + defaultMessage: 'Right field term limit.', + })} + /> + ); + } + + const { leftSourceName } = props; + return ( +
+ + + + + + + + + + {renderLeftFieldSelect()} + + {renderRightSourceSelect()} + + {renderRightFieldSelect()} + + {renderRightFieldSizeInput()} +
+ ); +} diff --git a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/where_expression.tsx b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/where_expression.tsx index 8ee0728aa8220..163f3c8000473 100644 --- a/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/where_expression.tsx +++ b/x-pack/plugins/maps/public/connected_components/edit_layer_panel/join_editor/resources/where_expression.tsx @@ -76,6 +76,7 @@ export class WhereExpression extends Component { data-test-subj="mapJoinWhereExpressionButton" /> } + repositionOnScroll={true} >
diff --git a/x-pack/plugins/maps/public/connected_components/input_strings.ts b/x-pack/plugins/maps/public/connected_components/input_strings.ts new file mode 100644 index 0000000000000..54919283c1926 --- /dev/null +++ b/x-pack/plugins/maps/public/connected_components/input_strings.ts @@ -0,0 +1,17 @@ +/* + * 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'; + +export const inputStrings = { + fieldSelectPlaceholder: i18n.translate('xpack.maps.input.fieldSelectPlaceholder', { + defaultMessage: 'Select field', + }), + relationshipLabel: i18n.translate('xpack.maps.input.relationshipLabel', { + defaultMessage: 'Relationship', + }), +}; diff --git a/x-pack/plugins/maps/server/maps_telemetry/collectors/register.ts b/x-pack/plugins/maps/server/maps_telemetry/collectors/register.ts index 77d1112f89817..35cc272725eab 100644 --- a/x-pack/plugins/maps/server/maps_telemetry/collectors/register.ts +++ b/x-pack/plugins/maps/server/maps_telemetry/collectors/register.ts @@ -374,6 +374,26 @@ export function registerMapsUsageCollector(usageCollection?: UsageCollectionSetu }, }, joins: { + distance: { + min: { + type: 'long', + _meta: { description: 'min number of distance joins per map' }, + }, + max: { + type: 'long', + _meta: { description: 'max number of distance joins per map' }, + }, + avg: { + type: 'float', + _meta: { description: 'avg number of distance joins per map' }, + }, + total: { + type: 'long', + _meta: { + description: 'total number of distance joins in cluster', + }, + }, + }, term: { min: { type: 'long', diff --git a/x-pack/plugins/ml/public/maps/anomaly_source.tsx b/x-pack/plugins/ml/public/maps/anomaly_source.tsx index 7601eaae110b4..e6918c0acacaa 100644 --- a/x-pack/plugins/ml/public/maps/anomaly_source.tsx +++ b/x-pack/plugins/ml/public/maps/anomaly_source.tsx @@ -177,8 +177,7 @@ export class AnomalySource implements IVectorSource { return false; } - showJoinEditor(): boolean { - // Ignore, only show if joins are enabled for current configuration + supportsJoins(): boolean { return false; } diff --git a/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json b/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json index 88270d7102caa..a336d97ee896f 100644 --- a/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json +++ b/x-pack/plugins/telemetry_collection_xpack/schema/xpack_plugins.json @@ -6533,6 +6533,34 @@ }, "joins": { "properties": { + "distance": { + "properties": { + "min": { + "type": "long", + "_meta": { + "description": "min number of distance joins per map" + } + }, + "max": { + "type": "long", + "_meta": { + "description": "max number of distance joins per map" + } + }, + "avg": { + "type": "float", + "_meta": { + "description": "avg number of distance joins per map" + } + }, + "total": { + "type": "long", + "_meta": { + "description": "total number of distance joins in cluster" + } + } + } + }, "term": { "properties": { "min": { diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 0110ce7066048..652f393b7dd19 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -20012,8 +20012,6 @@ "xpack.maps.keydownScrollZoom.keydownToZoomInstructions": "Utilisez {key} + défilement pour zoomer sur la carte", "xpack.maps.labelPosition.iconSizeJoinFieldNotSupportMsg": "{labelPositionPropertyLabel} n'est pas pris en charge avec le champ de jointure {iconSizePropertyLabel} {iconSizeFieldName}. Définissez {iconSizePropertyLabel} sur le champ source pour l'activer.", "xpack.maps.layer.zoomFeedbackTooltip": "Le calque est visible entre les niveaux de zoom {minZoom} et {maxZoom}.", - "xpack.maps.layerPanel.joinExpression.sizeFragment": "termes {rightSize} principaux de", - "xpack.maps.layerPanel.joinExpression.value": "{leftSourceName}:{leftValue} avec {sizeFragment} {rightSourceName}:{rightValue}", "xpack.maps.layerPanel.metricsExpression.useMetricsDescription": "{metricsLength, plural, one {et utiliser l'indicateur} other {et utiliser les indicateurs}}", "xpack.maps.layers.newVectorLayerWizard.createIndexError": "Impossible de créer l'index avec le nom {message}", "xpack.maps.layers.newVectorLayerWizard.indexPermissionsError": "Vous devez disposer des privilèges \"create\" et \"create_index\" pour pouvoir créer et écrire des données sur \"{indexName}\".", @@ -20040,11 +20038,9 @@ "xpack.maps.source.esGeoLine.entityRequestName": "Entités {layerName}", "xpack.maps.source.esGeoLine.trackRequestName": "Pistes {layerName}", "xpack.maps.source.esGeoLineDisabledReason": "{title} requiert une licence Gold.", - "xpack.maps.source.esGrid.compositeInspectorDescription": "Demande d'agrégation de grille géographique Elasticsearch : {requestId}", "xpack.maps.source.esGrid.compositePaginationErrorMessage": "{layerName} génère trop de requêtes. Réduisez \"Résolution de la grille\" et/ou réduisez le nombre d'indicateurs de premier terme.", "xpack.maps.source.esGrid.resolutionParamErrorMessage": "Paramètre de résolution de grille non reconnu : {resolution}", "xpack.maps.source.esJoin.countLabel": "Nombre de {indexPatternLabel}", - "xpack.maps.source.esJoin.joinDescription": "Demande d'agrégation des termes Elasticsearch, source gauche : {leftSource}, source droite : {rightSource}", "xpack.maps.source.esSearch.clusterScalingLabel": "Afficher les clusters lorsque les résultats dépassent {maxResultWindow}", "xpack.maps.source.esSearch.convertToGeoJsonErrorMsg": "Impossible de convertir la réponse de la recherche en collection de fonctionnalités geoJson, erreur : {errorMsg}", "xpack.maps.source.esSearch.limitScalingLabel": "Limiter les résultats à {maxResultWindow}", @@ -20093,7 +20089,6 @@ "xpack.maps.choropleth.geofieldLabel": "Champ géospatial", "xpack.maps.choropleth.geofieldPlaceholder": "Sélectionner un champ géographique", "xpack.maps.choropleth.joinFieldLabel": "Champ de liaison", - "xpack.maps.choropleth.joinFieldPlaceholder": "Sélectionner un champ", "xpack.maps.choropleth.statisticsLabel": "Source des statistiques", "xpack.maps.choropleth.title": "Choroplèthe", "xpack.maps.colorStops.otherCategoryColorPickerTooltip": "Lorsque le champ sélectionné comporte plus de termes que de couleurs dans la palette, le reste des termes est regroupé dans la catégorie \"Autres\". Sélectionnez une palette avec plus de couleurs pour augmenter le nombre de termes colorés dans votre carte.", @@ -20196,12 +20191,8 @@ "xpack.maps.inspector.vectorTileViewTitle": "Tuiles vectorielles", "xpack.maps.inspector.zoomLabel": "Effectuer un zoom", "xpack.maps.joinDocs.intro": "Les liaisons de terme ajoutent au calque les propriétés de style basées sur les données. Les liaisons de terme fonctionnent comme indiqué ci-dessous :", - "xpack.maps.joinDocs.join": "La liaison ajoute des indicateurs pour chaque compartiment d'agrégation de termes avec la clé partagée correspondante.", "xpack.maps.joinDocs.linkLabel": "Exemple de liaison de terme", - "xpack.maps.joinDocs.metrics": "Les indicateurs sont calculés pour tous les documents dans un compartiment.", "xpack.maps.joinDocs.noMatches": "Les fonctionnalités n'ayant pas de compartiment d'agrégation de termes correspondants ne sont pas visibles sur la carte.", - "xpack.maps.joinDocs.sharedKey": "Une clé partagée combine les fonctionnalités vectorielles (source de gauche) avec les résultats d'une agrégation Elasticsearch (source de droite).", - "xpack.maps.joinDocs.termsAggregation": "L'agrégation de termes crée un compartiment pour chaque clé partagée unique.", "xpack.maps.keydownScrollZoom.keydownClickAndDragZoomInstructions": "Utilisez Maj+clic et faites glisser pour zoomer sur la carte afin de l'adapter à une zone de délimitation.", "xpack.maps.kilometersAbbr": "km", "xpack.maps.layer.isUsingBoundsFilter": "Résultats affinés par zone de carte visible", @@ -20239,21 +20230,6 @@ "xpack.maps.layerPanel.join.applyGlobalTimeCheckboxLabel": "Appliquer une heure globale à la liaison", "xpack.maps.layerPanel.join.deleteJoinAriaLabel": "Supprimer la liaison", "xpack.maps.layerPanel.join.deleteJoinTitle": "Supprimer la liaison", - "xpack.maps.layerPanel.joinEditor.addJoinButton.label": "Ajouter une liaison", - "xpack.maps.layerPanel.joinEditor.addJoinButton.mvtSingleJoinMsg": "Les tuiles vectorielles prennent en charge une seule liaison de terme. Pour ajouter plusieurs liaisons, sélectionnez \"Limiter les résultats\" dans \"Montée en charge\".", - "xpack.maps.layerPanel.joinEditor.termJoinsTitle": "Liaisons de terme", - "xpack.maps.layerPanel.joinExpression.helpText": "Configurez la clé partagée.", - "xpack.maps.layerPanel.joinExpression.joinPopoverTitle": "Liaison", - "xpack.maps.layerPanel.joinExpression.leftFieldLabel": "Champ gauche", - "xpack.maps.layerPanel.joinExpression.leftSourceLabel": "Source gauche", - "xpack.maps.layerPanel.joinExpression.leftSourceLabelHelpText": "Champ de source gauche contenant la clé partagée.", - "xpack.maps.layerPanel.joinExpression.rightFieldLabel": "Champ droit", - "xpack.maps.layerPanel.joinExpression.rightSizeHelpText": "Limite de terme du champ droit.", - "xpack.maps.layerPanel.joinExpression.rightSizeLabel": "Taille correcte", - "xpack.maps.layerPanel.joinExpression.rightSourceLabel": "Source droite", - "xpack.maps.layerPanel.joinExpression.rightSourceLabelHelpText": "Champ de source droite contenant la clé partagée.", - "xpack.maps.layerPanel.joinExpression.selectFieldPlaceholder": "Sélectionner un champ", - "xpack.maps.layerPanel.joinExpression.selectPlaceholder": "-- sélectionner --", "xpack.maps.layerPanel.layerSettingsTitle": "Paramètres du calque", "xpack.maps.layerPanel.metricsExpression.helpText": "Configurez les indicateurs pour la source droite. Ces valeurs sont ajoutées aux fonctionnalités du calque.", "xpack.maps.layerPanel.metricsExpression.joinMustBeSetErrorMessage": "La LIAISON doit être configurée", @@ -20347,7 +20323,6 @@ "xpack.maps.metricsEditor.deleteMetricButtonLabel": "Supprimer un indicateur", "xpack.maps.metricsEditor.selectFieldError": "Champ requis pour l'agrégation", "xpack.maps.metricsEditor.selectFieldLabel": "Champ", - "xpack.maps.metricsEditor.selectFieldPlaceholder": "Sélectionner un champ", "xpack.maps.metricsEditor.selectPercentileLabel": "Centile", "xpack.maps.metricSelect.selectAggregationPlaceholder": "Sélectionner une agrégation", "xpack.maps.mvtSource.addFieldLabel": "Ajouter", @@ -20457,7 +20432,6 @@ "xpack.maps.source.esGeoGrid.pointsDropdownOption": "Clusters", "xpack.maps.source.esGeoGrid.showAsLabel": "Afficher en tant que", "xpack.maps.source.esGeoGrid.showAsSelector": "Sélectionner la méthode d’affichage", - "xpack.maps.source.esGeoLine.entityRequestDescription": "Requête de termes Elasticsearch pour récupérer des entités dans la mémoire tampon de la carte.", "xpack.maps.source.esGeoLine.geofieldLabel": "Champ géospatial", "xpack.maps.source.esGeoLine.geofieldPlaceholder": "Sélectionner un champ géographique", "xpack.maps.source.esGeoLine.geospatialFieldLabel": "Champ géospatial", @@ -20467,13 +20441,11 @@ "xpack.maps.source.esGeoLine.sortFieldPlaceholder": "Sélectionner le champ de tri", "xpack.maps.source.esGeoLine.splitFieldLabel": "Entité", "xpack.maps.source.esGeoLine.splitFieldPlaceholder": "Sélectionner un champ d'entité", - "xpack.maps.source.esGeoLine.trackRequestDescription": "Requête geo_line Elasticsearch pour récupérer les pistes des entités. Les pistes ne sont pas filtrées par mémoire tampon de carte.", "xpack.maps.source.esGeoLine.trackSettingsLabel": "Pistes", "xpack.maps.source.esGeoLineDescription": "Créer des lignes à partir de points", "xpack.maps.source.esGeoLineTitle": "Pistes", "xpack.maps.source.esGrid.geospatialFieldLabel": "Champ de cluster", "xpack.maps.source.esGrid.highLabel": "élevé", - "xpack.maps.source.esGrid.inspectorDescription": "Demande d'agrégation de grille géographique Elasticsearch", "xpack.maps.source.esGrid.lowLabel": "bas", "xpack.maps.source.esGrid.metricsLabel": "Indicateurs", "xpack.maps.source.esGrid.superFineHelpText": "La haute résolution utilise des tuiles vectorielles.", @@ -20495,7 +20467,6 @@ "xpack.maps.source.esSearch.geoFieldTypeLabel": "Type de champ géospatial", "xpack.maps.source.esSearch.indexOverOneLengthEditError": "Votre vue de données pointe vers plusieurs index. Un seul index est autorisé par vue de données.", "xpack.maps.source.esSearch.indexZeroLengthEditError": "Votre vue de données ne pointe vers aucun index.", - "xpack.maps.source.esSearch.joinsDisabledReason": "Les liaisons ne sont pas prises en charge lors de la montée en charge par rapport aux clusters", "xpack.maps.source.esSearch.scalingModal.cancelBtnLabel": "Annuler", "xpack.maps.source.esSearch.scalingModal.confirmBtnLabel": "Accepter", "xpack.maps.source.esSearch.scalingModal.title": "Retirer les configurations non prises en charge ?", @@ -20532,7 +20503,6 @@ "xpack.maps.source.mvtVectorSourceWizard": "Service de données implémentant la spécification de tuiles vectorielles Mapbox", "xpack.maps.source.pewPew.destGeoFieldLabel": "Destination", "xpack.maps.source.pewPew.destGeoFieldPlaceholder": "Sélectionner le champ géographique de destination", - "xpack.maps.source.pewPew.inspectorDescription": "Demande de connexions source-destination", "xpack.maps.source.pewPew.metricsLabel": "Indicateurs", "xpack.maps.source.pewPew.noSourceAndDestDetails": "La vue de données sélectionnée ne contient pas de champs source et de destination.", "xpack.maps.source.pewPew.sourceGeoFieldLabel": "Source", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index ec8b4d8eb9ee6..002c4c16b2ad1 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -20012,8 +20012,6 @@ "xpack.maps.keydownScrollZoom.keydownToZoomInstructions": "マップをズームするには、{key}を押しながらスクロールします", "xpack.maps.labelPosition.iconSizeJoinFieldNotSupportMsg": "{labelPositionPropertyLabel}は、{iconSizePropertyLabel}結合フィールド{iconSizeFieldName}でサポートされていません。有効化するには、{iconSizePropertyLabel}をソースフィールドに設定します。", "xpack.maps.layer.zoomFeedbackTooltip": "レイヤーはズームレベル {minZoom} から {maxZoom} の間で表示されます。", - "xpack.maps.layerPanel.joinExpression.sizeFragment": "上位の{rightSize}用語", - "xpack.maps.layerPanel.joinExpression.value": "{leftSourceName}:{leftValue}と{sizeFragment} {rightSourceName}:{rightValue}", "xpack.maps.layerPanel.metricsExpression.useMetricsDescription": "{metricsLength, plural, other {およびメトリックを使用}}", "xpack.maps.layers.newVectorLayerWizard.createIndexError": "名前{message}のインデックスを作成できませんでした", "xpack.maps.layers.newVectorLayerWizard.indexPermissionsError": "データを作成し、\"{indexName}\"に書き込むには、「create」および「create_index」インデックス権限が必要です。", @@ -20040,11 +20038,9 @@ "xpack.maps.source.esGeoLine.entityRequestName": "{layerName}エンティティ", "xpack.maps.source.esGeoLine.trackRequestName": "{layerName}追跡", "xpack.maps.source.esGeoLineDisabledReason": "{title}には Gold ライセンスが必要です。", - "xpack.maps.source.esGrid.compositeInspectorDescription": "Elasticsearch ジオグリッドアグリゲーションリクエスト:{requestId}", "xpack.maps.source.esGrid.compositePaginationErrorMessage": "{layerName}はリクエスト過多の原因になります。「グリッド解像度」を下げるか、またはトップ用語「メトリック」の数を減らしてください。", "xpack.maps.source.esGrid.resolutionParamErrorMessage": "グリッド解像度パラメーターが認識されません: {resolution}", "xpack.maps.source.esJoin.countLabel": "{indexPatternLabel}のカウント", - "xpack.maps.source.esJoin.joinDescription": "Elasticsearch 用語アグリゲーションリクエスト、左ソース:{leftSource}、右ソース:{rightSource}", "xpack.maps.source.esSearch.clusterScalingLabel": "結果が{maxResultWindow}を超えたらクラスターを表示", "xpack.maps.source.esSearch.convertToGeoJsonErrorMsg": "検索への応答を geoJson 機能コレクションに変換できません。エラー: {errorMsg}", "xpack.maps.source.esSearch.limitScalingLabel": "結果を{maxResultWindow}に制限", @@ -20093,7 +20089,6 @@ "xpack.maps.choropleth.geofieldLabel": "地理空間フィールド", "xpack.maps.choropleth.geofieldPlaceholder": "ジオフィールドを選択", "xpack.maps.choropleth.joinFieldLabel": "フィールドを結合", - "xpack.maps.choropleth.joinFieldPlaceholder": "フィールドを選択", "xpack.maps.choropleth.statisticsLabel": "統計ソース", "xpack.maps.choropleth.title": "階級区分図", "xpack.maps.colorStops.otherCategoryColorPickerTooltip": "選択したフィールドにパレットの色よりも多くの用語がある場合、残りの用語が[その他]カテゴリにグループ化されます。マップで色が付いた用語の数を増やすには、その他の色のパレットを選択します", @@ -20196,12 +20191,8 @@ "xpack.maps.inspector.vectorTileViewTitle": "ベクトルタイル", "xpack.maps.inspector.zoomLabel": "ズーム", "xpack.maps.joinDocs.intro": "用語結合強化レイヤーと、データに基づくスタイル設定のプロパティ。用語結合は次のように動作します。", - "xpack.maps.joinDocs.join": "各用語アグリゲーションバケットのメトリックと対応する共有キーを追加します。", "xpack.maps.joinDocs.linkLabel": "用語結合の例", - "xpack.maps.joinDocs.metrics": "バケットのすべてのドキュメントのメトリックが計算されます。", "xpack.maps.joinDocs.noMatches": "対応する用語アグリゲーションがない特徴量はマップに表示されません。", - "xpack.maps.joinDocs.sharedKey": "共有キーはベクトル特徴量(左のソース)を、Elasticsearchアグリゲーションの結果(右のソース)と結合します。", - "xpack.maps.joinDocs.termsAggregation": "用語アグリゲーションにより、各一意の共有キーのバケットが作成されます。", "xpack.maps.keydownScrollZoom.keydownClickAndDragZoomInstructions": "Shiftを押しながらドラッグすると、バウンディングボックス内に合うようにマップをズームします", "xpack.maps.kilometersAbbr": "km", "xpack.maps.layer.isUsingBoundsFilter": "表示されるマップ領域で絞り込まれた結果", @@ -20239,21 +20230,6 @@ "xpack.maps.layerPanel.join.applyGlobalTimeCheckboxLabel": "結合するグローバル時刻を適用", "xpack.maps.layerPanel.join.deleteJoinAriaLabel": "ジョブの削除", "xpack.maps.layerPanel.join.deleteJoinTitle": "ジョブの削除", - "xpack.maps.layerPanel.joinEditor.addJoinButton.label": "結合を追加", - "xpack.maps.layerPanel.joinEditor.addJoinButton.mvtSingleJoinMsg": "ベクトルタイルは1つの用語結合をサポートします。複数の結合を追加するには、[スケーリング]で[結果を制限]を選択します。", - "xpack.maps.layerPanel.joinEditor.termJoinsTitle": "用語結合", - "xpack.maps.layerPanel.joinExpression.helpText": "共有キーを構成します。", - "xpack.maps.layerPanel.joinExpression.joinPopoverTitle": "結合", - "xpack.maps.layerPanel.joinExpression.leftFieldLabel": "左のフィールド", - "xpack.maps.layerPanel.joinExpression.leftSourceLabel": "左のソース", - "xpack.maps.layerPanel.joinExpression.leftSourceLabelHelpText": "共有キーを含む左のソースフィールド。", - "xpack.maps.layerPanel.joinExpression.rightFieldLabel": "右のフィールド", - "xpack.maps.layerPanel.joinExpression.rightSizeHelpText": "右フィールドの語句の制限。", - "xpack.maps.layerPanel.joinExpression.rightSizeLabel": "右サイズ", - "xpack.maps.layerPanel.joinExpression.rightSourceLabel": "右のソース", - "xpack.maps.layerPanel.joinExpression.rightSourceLabelHelpText": "共有キーを含む右のソースフィールド。", - "xpack.maps.layerPanel.joinExpression.selectFieldPlaceholder": "フィールドを選択", - "xpack.maps.layerPanel.joinExpression.selectPlaceholder": "-- 選択 --", "xpack.maps.layerPanel.layerSettingsTitle": "レイヤー設定", "xpack.maps.layerPanel.metricsExpression.helpText": "右のソースのメトリックを構成します。これらの値はレイヤー機能に追加されます。", "xpack.maps.layerPanel.metricsExpression.joinMustBeSetErrorMessage": "JOIN の設定が必要です", @@ -20347,7 +20323,6 @@ "xpack.maps.metricsEditor.deleteMetricButtonLabel": "メトリックを削除", "xpack.maps.metricsEditor.selectFieldError": "アグリゲーションにはフィールドが必要です", "xpack.maps.metricsEditor.selectFieldLabel": "フィールド", - "xpack.maps.metricsEditor.selectFieldPlaceholder": "フィールドを選択", "xpack.maps.metricsEditor.selectPercentileLabel": "パーセンタイル", "xpack.maps.metricSelect.selectAggregationPlaceholder": "集約を選択", "xpack.maps.mvtSource.addFieldLabel": "追加", @@ -20457,7 +20432,6 @@ "xpack.maps.source.esGeoGrid.pointsDropdownOption": "クラスター", "xpack.maps.source.esGeoGrid.showAsLabel": "表示形式", "xpack.maps.source.esGeoGrid.showAsSelector": "表示方法を選択", - "xpack.maps.source.esGeoLine.entityRequestDescription": "Elasticsearch 用語はマップバッファー内のエンティティを取得するように要求します。", "xpack.maps.source.esGeoLine.geofieldLabel": "地理空間フィールド", "xpack.maps.source.esGeoLine.geofieldPlaceholder": "ジオフィールドを選択", "xpack.maps.source.esGeoLine.geospatialFieldLabel": "地理空間フィールド", @@ -20467,13 +20441,11 @@ "xpack.maps.source.esGeoLine.sortFieldPlaceholder": "ソートフィールドを選択", "xpack.maps.source.esGeoLine.splitFieldLabel": "エンティティ", "xpack.maps.source.esGeoLine.splitFieldPlaceholder": "エンティティフィールドを選択", - "xpack.maps.source.esGeoLine.trackRequestDescription": "Elasticsearch geo_line はエンティティのトラックを取得するように要求します。トラックはマップバッファーでフィルタリングされていません。", "xpack.maps.source.esGeoLine.trackSettingsLabel": "追跡", "xpack.maps.source.esGeoLineDescription": "ポイントから線を作成", "xpack.maps.source.esGeoLineTitle": "追跡", "xpack.maps.source.esGrid.geospatialFieldLabel": "クラスターフィールド", "xpack.maps.source.esGrid.highLabel": "高", - "xpack.maps.source.esGrid.inspectorDescription": "Elasticsearch ジオグリッド集約リクエスト", "xpack.maps.source.esGrid.lowLabel": "低", "xpack.maps.source.esGrid.metricsLabel": "メトリック", "xpack.maps.source.esGrid.superFineHelpText": "高解像度はベクトルタイルを使用します。", @@ -20495,7 +20467,6 @@ "xpack.maps.source.esSearch.geoFieldTypeLabel": "地理空間フィールドタイプ", "xpack.maps.source.esSearch.indexOverOneLengthEditError": "データビューは複数のインデックスを参照しています。データビューごとに1つのインデックスのみが許可されています。", "xpack.maps.source.esSearch.indexZeroLengthEditError": "データビューはどのインデックスも参照していません。", - "xpack.maps.source.esSearch.joinsDisabledReason": "クラスターでスケーリングするときに、結合はサポートされていません", "xpack.maps.source.esSearch.scalingModal.cancelBtnLabel": "キャンセル", "xpack.maps.source.esSearch.scalingModal.confirmBtnLabel": "承諾", "xpack.maps.source.esSearch.scalingModal.title": "サポートされていない構成を削除しますか?", @@ -20532,7 +20503,6 @@ "xpack.maps.source.mvtVectorSourceWizard": "Mapboxベクトルタイル仕様を実装するデータサービス", "xpack.maps.source.pewPew.destGeoFieldLabel": "送信先", "xpack.maps.source.pewPew.destGeoFieldPlaceholder": "デスティネーション地理情報フィールドを選択", - "xpack.maps.source.pewPew.inspectorDescription": "ソースとデスティネーションの接続リクエスト", "xpack.maps.source.pewPew.metricsLabel": "メトリック", "xpack.maps.source.pewPew.noSourceAndDestDetails": "選択されたデータビューにはソースとデスティネーションのフィールドが含まれていません。", "xpack.maps.source.pewPew.sourceGeoFieldLabel": "送信元", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 9e23df1f33567..0e722d5bb362a 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -20014,8 +20014,6 @@ "xpack.maps.keydownScrollZoom.keydownToZoomInstructions": "使用 {key} + 滚动以缩放地图", "xpack.maps.labelPosition.iconSizeJoinFieldNotSupportMsg": "{iconSizePropertyLabel} 联接字段 {iconSizeFieldName} 不支持 {labelPositionPropertyLabel}。将 {iconSizePropertyLabel} 设置为源字段以便启用。", "xpack.maps.layer.zoomFeedbackTooltip": "图层在缩放级别 {minZoom} 和 {maxZoom} 之间可见。", - "xpack.maps.layerPanel.joinExpression.sizeFragment": "排名前 {rightSize} 的词 - 来自", - "xpack.maps.layerPanel.joinExpression.value": "{leftSourceName}:{leftValue},{sizeFragment} {rightSourceName}:{rightValue}", "xpack.maps.layerPanel.metricsExpression.useMetricsDescription": "{metricsLength, plural, other {并使用指标}}", "xpack.maps.layers.newVectorLayerWizard.createIndexError": "无法使用名称 {message} 创建索引", "xpack.maps.layers.newVectorLayerWizard.indexPermissionsError": "必须具有“create”和“create_index”索引权限才能创建数据并将其写入到“{indexName}”。", @@ -20042,7 +20040,6 @@ "xpack.maps.source.esGeoLine.entityRequestName": "{layerName} 实体", "xpack.maps.source.esGeoLine.trackRequestName": "{layerName} 轨迹", "xpack.maps.source.esGeoLineDisabledReason": "{title} 需要黄金级许可证。", - "xpack.maps.source.esGrid.compositeInspectorDescription": "Elasticsearch 地理网格聚合请求:{requestId}", "xpack.maps.source.esGrid.compositePaginationErrorMessage": "{layerName} 正导致过多的请求。降低“网格分辨率”和/或减少热门词“指标”的数量。", "xpack.maps.source.esGrid.resolutionParamErrorMessage": "无法识别网格分辨率参数:{resolution}", "xpack.maps.source.esJoin.countLabel": "{indexPatternLabel} 的计数", @@ -20094,7 +20091,6 @@ "xpack.maps.choropleth.geofieldLabel": "地理空间字段", "xpack.maps.choropleth.geofieldPlaceholder": "选择地理字段", "xpack.maps.choropleth.joinFieldLabel": "联接字段", - "xpack.maps.choropleth.joinFieldPlaceholder": "选择字段", "xpack.maps.choropleth.statisticsLabel": "统计源", "xpack.maps.choropleth.title": "分级统计图", "xpack.maps.colorStops.otherCategoryColorPickerTooltip": "选定字段具有的字词数量多于调色板中的颜色数量时,其余字词将分组到“其他”类别下。选择具有多种颜色的调色板,以增加地图中彩色字词的数量", @@ -20197,12 +20193,8 @@ "xpack.maps.inspector.vectorTileViewTitle": "矢量磁贴", "xpack.maps.inspector.zoomLabel": "缩放", "xpack.maps.joinDocs.intro": "词联接会利用属性增强图层,以实现数据驱动的样式。词联接的工作方式如下:", - "xpack.maps.joinDocs.join": "该联接会使用对应的共享密钥为每个词聚合存储桶添加指标。", "xpack.maps.joinDocs.linkLabel": "词联接示例", - "xpack.maps.joinDocs.metrics": "将为存储桶中的所有文档计算指标。", "xpack.maps.joinDocs.noMatches": "没有对应词聚合存储桶的特征在地图中不可见。", - "xpack.maps.joinDocs.sharedKey": "共享密钥会将矢量功能(左源)与 Elasticsearch 聚合的结果(右源)进行组合。", - "xpack.maps.joinDocs.termsAggregation": "词聚合将为每个唯一的共享密钥创建存储桶。", "xpack.maps.keydownScrollZoom.keydownClickAndDragZoomInstructions": "使用 shift + 单击并拖动以缩放地图,使其适应边界框", "xpack.maps.kilometersAbbr": "km", "xpack.maps.layer.isUsingBoundsFilter": "可见地图区域缩减的结果", @@ -20240,21 +20232,6 @@ "xpack.maps.layerPanel.join.applyGlobalTimeCheckboxLabel": "应用全局时间到联接", "xpack.maps.layerPanel.join.deleteJoinAriaLabel": "删除联接", "xpack.maps.layerPanel.join.deleteJoinTitle": "删除联接", - "xpack.maps.layerPanel.joinEditor.addJoinButton.label": "添加联接", - "xpack.maps.layerPanel.joinEditor.addJoinButton.mvtSingleJoinMsg": "矢量磁贴支持一个词联接。要添加多个联接,请在“缩放”中选择“限制结果”。", - "xpack.maps.layerPanel.joinEditor.termJoinsTitle": "词联接", - "xpack.maps.layerPanel.joinExpression.helpText": "配置共享密钥。", - "xpack.maps.layerPanel.joinExpression.joinPopoverTitle": "联接", - "xpack.maps.layerPanel.joinExpression.leftFieldLabel": "左字段", - "xpack.maps.layerPanel.joinExpression.leftSourceLabel": "左源", - "xpack.maps.layerPanel.joinExpression.leftSourceLabelHelpText": "包含共享密钥的左源字段。", - "xpack.maps.layerPanel.joinExpression.rightFieldLabel": "右字段", - "xpack.maps.layerPanel.joinExpression.rightSizeHelpText": "右字段词限制。", - "xpack.maps.layerPanel.joinExpression.rightSizeLabel": "右大小", - "xpack.maps.layerPanel.joinExpression.rightSourceLabel": "右源", - "xpack.maps.layerPanel.joinExpression.rightSourceLabelHelpText": "包含共享密钥的右源字段。", - "xpack.maps.layerPanel.joinExpression.selectFieldPlaceholder": "选择字段", - "xpack.maps.layerPanel.joinExpression.selectPlaceholder": "-- 选择 --", "xpack.maps.layerPanel.layerSettingsTitle": "图层设置", "xpack.maps.layerPanel.metricsExpression.helpText": "配置右源的指标。这些值已添加到图层功能。", "xpack.maps.layerPanel.metricsExpression.joinMustBeSetErrorMessage": "必须设置联接", @@ -20348,7 +20325,6 @@ "xpack.maps.metricsEditor.deleteMetricButtonLabel": "删除指标", "xpack.maps.metricsEditor.selectFieldError": "聚合所需字段", "xpack.maps.metricsEditor.selectFieldLabel": "字段", - "xpack.maps.metricsEditor.selectFieldPlaceholder": "选择字段", "xpack.maps.metricsEditor.selectPercentileLabel": "百分位数", "xpack.maps.metricSelect.selectAggregationPlaceholder": "选择聚合", "xpack.maps.mvtSource.addFieldLabel": "添加", @@ -20458,7 +20434,6 @@ "xpack.maps.source.esGeoGrid.pointsDropdownOption": "集群", "xpack.maps.source.esGeoGrid.showAsLabel": "显示为", "xpack.maps.source.esGeoGrid.showAsSelector": "选择显示方法", - "xpack.maps.source.esGeoLine.entityRequestDescription": "用于获取地图缓冲区内的实体的 Elasticsearch 词请求。", "xpack.maps.source.esGeoLine.geofieldLabel": "地理空间字段", "xpack.maps.source.esGeoLine.geofieldPlaceholder": "选择地理字段", "xpack.maps.source.esGeoLine.geospatialFieldLabel": "地理空间字段", @@ -20468,13 +20443,11 @@ "xpack.maps.source.esGeoLine.sortFieldPlaceholder": "选择排序字段", "xpack.maps.source.esGeoLine.splitFieldLabel": "实体", "xpack.maps.source.esGeoLine.splitFieldPlaceholder": "选择实体字段", - "xpack.maps.source.esGeoLine.trackRequestDescription": "用于获取实体轨迹的 Elasticsearch geo_line 请求。轨迹不按地图缓冲区筛选。", "xpack.maps.source.esGeoLine.trackSettingsLabel": "轨迹", "xpack.maps.source.esGeoLineDescription": "从点创建线", "xpack.maps.source.esGeoLineTitle": "轨迹", "xpack.maps.source.esGrid.geospatialFieldLabel": "集群字段", "xpack.maps.source.esGrid.highLabel": "高", - "xpack.maps.source.esGrid.inspectorDescription": "Elasticsearch 地理网格聚合请求", "xpack.maps.source.esGrid.lowLabel": "低", "xpack.maps.source.esGrid.metricsLabel": "指标", "xpack.maps.source.esGrid.superFineHelpText": "高分辨率使用矢量磁贴。", @@ -20496,7 +20469,6 @@ "xpack.maps.source.esSearch.geoFieldTypeLabel": "地理空间字段类型", "xpack.maps.source.esSearch.indexOverOneLengthEditError": "您的数据视图指向多个索引。每个数据视图只允许一个索引。", "xpack.maps.source.esSearch.indexZeroLengthEditError": "您的数据视图未指向任何索引。", - "xpack.maps.source.esSearch.joinsDisabledReason": "按集群缩放时不支持联接", "xpack.maps.source.esSearch.scalingModal.cancelBtnLabel": "取消", "xpack.maps.source.esSearch.scalingModal.confirmBtnLabel": "接受", "xpack.maps.source.esSearch.scalingModal.title": "是否移除不受支持的配置?", @@ -20533,7 +20505,6 @@ "xpack.maps.source.mvtVectorSourceWizard": "实施 Mapbox 矢量文件规范的数据服务", "xpack.maps.source.pewPew.destGeoFieldLabel": "目标", "xpack.maps.source.pewPew.destGeoFieldPlaceholder": "选择目标地理位置字段", - "xpack.maps.source.pewPew.inspectorDescription": "源-目标连接请求", "xpack.maps.source.pewPew.metricsLabel": "指标", "xpack.maps.source.pewPew.noSourceAndDestDetails": "选定的数据视图不包含源和目标字段。", "xpack.maps.source.pewPew.sourceGeoFieldLabel": "源", diff --git a/x-pack/test/api_integration/apis/maps/maps_telemetry.ts b/x-pack/test/api_integration/apis/maps/maps_telemetry.ts index 2a055ce007fee..8dbfca9a40a77 100644 --- a/x-pack/test/api_integration/apis/maps/maps_telemetry.ts +++ b/x-pack/test/api_integration/apis/maps/maps_telemetry.ts @@ -47,7 +47,7 @@ export default function ({ getService }: FtrProviderContext) { expect(mapUsage).eql({ mapsTotalCount: 27, basemaps: {}, - joins: { term: { min: 1, max: 1, total: 3, avg: 0.1111111111111111 } }, + joins: { term: { min: 1, max: 1, total: 4, avg: 0.14814814814814814 } }, layerTypes: { es_docs: { min: 1, max: 2, total: 19, avg: 0.7037037037037037 }, es_agg_grids: { min: 1, max: 1, total: 6, avg: 0.2222222222222222 }, diff --git a/x-pack/test/functional/apps/maps/group2/embeddable/dashboard.js b/x-pack/test/functional/apps/maps/group2/embeddable/dashboard.js index 39b65c2458447..69c12ed786d23 100644 --- a/x-pack/test/functional/apps/maps/group2/embeddable/dashboard.js +++ b/x-pack/test/functional/apps/maps/group2/embeddable/dashboard.js @@ -77,7 +77,7 @@ export default function ({ getPageObjects, getService }) { await retry.try(async () => { const joinExampleRequestNames = await inspector.getRequestNames(); expect(joinExampleRequestNames).to.equal( - 'geo_shapes*,meta_for_geo_shapes*.runtime_shape_name' + 'geo_shapes* documents request,geo_shapes* term join request' ); }); await inspector.close(); @@ -88,7 +88,7 @@ export default function ({ getPageObjects, getService }) { await inspector.close(); expect(singleExampleRequest).to.be(true); - expect(selectedExampleRequest).to.equal('logstash-*'); + expect(selectedExampleRequest).to.equal('logstash-* grid request'); }); it('should apply container state (time, query, filters) to embeddable when loaded', async () => { @@ -120,7 +120,7 @@ export default function ({ getPageObjects, getService }) { const { rawResponse: joinResponse } = await PageObjects.maps.getResponseFromDashboardPanel( 'join example', - 'meta_for_geo_shapes*.runtime_shape_name' + 'geo_shapes* term join request' ); expect(joinResponse.aggregations.join.buckets.length).to.equal(1); }); diff --git a/x-pack/test/functional/apps/maps/group4/joins.js b/x-pack/test/functional/apps/maps/group4/joins.js index 56324c4c00e90..bf1304e3f3470 100644 --- a/x-pack/test/functional/apps/maps/group4/joins.js +++ b/x-pack/test/functional/apps/maps/group4/joins.js @@ -39,7 +39,7 @@ export default function ({ getPageObjects, getService }) { it('should re-fetch join with refresh timer', async () => { async function getRequestTimestamp() { - await PageObjects.maps.openInspectorRequest('meta_for_geo_shapes*.runtime_shape_name'); + await PageObjects.maps.openInspectorRequest('geo_shapes* term join request'); const requestStats = await inspector.getTableData(); const requestTimestamp = PageObjects.maps.getInspectorStatRowHit( requestStats, @@ -122,7 +122,7 @@ export default function ({ getPageObjects, getService }) { it('should not apply query to source and apply query to join', async () => { const { rawResponse: joinResponse } = await PageObjects.maps.getResponse( - 'meta_for_geo_shapes*.runtime_shape_name' + 'geo_shapes* term join request' ); expect(joinResponse.aggregations.join.buckets.length).to.equal(2); }); @@ -139,7 +139,7 @@ export default function ({ getPageObjects, getService }) { it('should apply query to join request', async () => { const { rawResponse: joinResponse } = await PageObjects.maps.getResponse( - 'meta_for_geo_shapes*.runtime_shape_name' + 'geo_shapes* term join request' ); expect(joinResponse.aggregations.join.buckets.length).to.equal(1); }); diff --git a/x-pack/test/functional/page_objects/gis_page.ts b/x-pack/test/functional/page_objects/gis_page.ts index 6cbb50abdd4ac..808bc75c89b35 100644 --- a/x-pack/test/functional/page_objects/gis_page.ts +++ b/x-pack/test/functional/page_objects/gis_page.ts @@ -602,14 +602,9 @@ export class GisPageObject extends FtrService { await this.inspector.openInspectorView('Map details'); } - // Method should only be used when multiple requests are expected - // RequestSelector will only display inspectorRequestChooser when there is more than one request async openInspectorRequest(requestName: string) { await this.inspector.open(); - await this.inspector.openInspectorRequestsView(); - this.log.debug(`Open Inspector request ${requestName}`); - await this.testSubjects.click('inspectorRequestChooser'); - await this.testSubjects.click(`inspectorRequestChooser${requestName}`); + await this.inspector.openRequestByName(requestName); } async doesInspectorHaveRequests() { @@ -642,20 +637,19 @@ export class GisPageObject extends FtrService { return response; } - async _getResponse(requestName: string) { - await this.inspector.openInspectorRequestsView(); - if (requestName) { - await this.testSubjects.click('inspectorRequestChooser'); - await this.testSubjects.click(`inspectorRequestChooser${requestName}`); + async _getResponse(requestName?: string) { + if (!requestName) { + await this.inspector.openInspectorRequestsView(); + } else { + await this.inspector.openRequestByName(requestName); } - await this.inspector.openInspectorRequestsView(); await this.testSubjects.click('inspectorRequestDetailResponse'); await this.find.byCssSelector('.react-monaco-editor-container'); const responseBody = await this.monacoEditor.getCodeEditorValue(); return JSON.parse(responseBody); } - async getResponseFromDashboardPanel(panelTitle: string, requestName: string) { + async getResponseFromDashboardPanel(panelTitle: string, requestName?: string) { await this.dashboardPanelActions.openInspectorByTitle(panelTitle); const response = await this._getResponse(requestName); await this.inspector.close(); From b736f02bc145f829f414417996cd800db80eb049 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Wed, 17 May 2023 06:23:23 -0600 Subject: [PATCH 07/78] [maps][geo containment alert] fix boundaries are not re-fetched when query changes (#157408) Fixes https://github.com/elastic/kibana/issues/157068 and https://github.com/elastic/kibana/issues/157066 Screen Shot 2023-05-11 at 10 16 31 AM Throwing errors provides better user feedback when alerting rules encounter problems. PR updates tracking containment rule to throw when: * No tracking containment boundaries are found. Prior to this PR, entity containment search request would throw because "filters" was undefined. Root cause of https://github.com/elastic/kibana/issues/157068 * Throw when entity containment search request throws. Prior to this PR, entity containment search request failure was just logged as server warning. PR updates boundaries cache to refresh whenever any parameters change that result in boundary filters needing to be updated, resolving https://github.com/elastic/kibana/issues/157066 PR defines common type "RegisterRuleTypesParams" for registerBuiltInRuleTypes parameter to avoid duplicate type definitions for the same thing. PR also cleans up some tech debt in tracking containment rule * "alert" name replaced with "rule" some time ago. PR renames "alert_type" to "rule_type". * Breaks types defined in "alert_type" into separate "types" file * Breaks "geoContainment.ts" and "geoContainment.test.ts" files into separate files, "executor.ts", "lib/get_entities_and_generate_alerts", and "lib/transform_results.ts" * Renames type "GeoContainmentParams" to "GeoContainmentRuleParams" * Renames type "GeoContainmentExtractedParams" to "GeoContainmentExtractedRuleParams" * Renames type "GeoContainmentState" to "GeoContainmentRuleState" * Renames type "GeoContainmentInstanceState" to "GeoContainmentAlertInstanceState" * Renames type "GeoContainmentInstanceContext" to "GeoContainmentAlertInstanceContext" * Renames type "GeoContainmentAlertType" to "GeoContainmentRuleType" --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Nick Peihl --- x-pack/plugins/stack_alerts/server/feature.ts | 2 +- .../server/rule_types/es_query/index.ts | 10 +- .../rule_type.test.ts.snap} | 2 +- .../rule_types/geo_containment/constants.ts | 11 + .../geo_containment/es_query_builder.ts | 221 ------ .../geo_containment/executor.test.ts | 253 +++++++ .../rule_types/geo_containment/executor.ts | 116 +++ .../geo_containment/geo_containment.ts | 227 ------ .../rule_types/geo_containment/index.ts | 29 +- .../alert_context.test.ts} | 4 +- .../{get_context.ts => lib/alert_context.ts} | 23 +- .../geo_containment/lib/es_query_builder.ts | 125 ++++ .../get_entities_and_generate_alerts.test.ts | 348 +++++++++ .../lib/get_entities_and_generate_alerts.ts | 70 ++ .../get_query_dsl.test.ts} | 16 +- .../geo_containment/lib/get_query_dsl.ts | 22 + .../lib/get_shape_filters.test.ts | 151 ++++ .../geo_containment/lib/get_shape_filters.ts | 122 ++++ .../rule_types/geo_containment/lib/index.ts | 12 + .../lib/transform_results.test.ts | 131 ++++ .../geo_containment/lib/transform_results.ts | 69 ++ .../alert_type.test.ts => rule_type.test.ts} | 24 +- .../{alert_type.ts => rule_type.ts} | 96 +-- .../tests/es_sample_response_shapes.json | 373 +--------- .../tests/geo_containment.test.ts | 666 ------------------ .../rule_types/geo_containment/types.ts | 82 +++ .../stack_alerts/server/rule_types/index.ts | 9 +- .../rule_types/index_threshold/index.ts | 9 +- .../stack_alerts/server/rule_types/types.ts | 16 + 29 files changed, 1604 insertions(+), 1635 deletions(-) rename x-pack/plugins/stack_alerts/server/rule_types/geo_containment/{tests/__snapshots__/alert_type.test.ts.snap => __snapshots__/rule_type.test.ts.snap} (92%) create mode 100644 x-pack/plugins/stack_alerts/server/rule_types/geo_containment/constants.ts delete mode 100644 x-pack/plugins/stack_alerts/server/rule_types/geo_containment/es_query_builder.ts create mode 100644 x-pack/plugins/stack_alerts/server/rule_types/geo_containment/executor.test.ts create mode 100644 x-pack/plugins/stack_alerts/server/rule_types/geo_containment/executor.ts delete mode 100644 x-pack/plugins/stack_alerts/server/rule_types/geo_containment/geo_containment.ts rename x-pack/plugins/stack_alerts/server/rule_types/geo_containment/{tests/get_context.test.ts => lib/alert_context.test.ts} (97%) rename x-pack/plugins/stack_alerts/server/rule_types/geo_containment/{get_context.ts => lib/alert_context.ts} (82%) create mode 100644 x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/es_query_builder.ts create mode 100644 x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/get_entities_and_generate_alerts.test.ts create mode 100644 x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/get_entities_and_generate_alerts.ts rename x-pack/plugins/stack_alerts/server/rule_types/geo_containment/{tests/es_query_builder.test.ts => lib/get_query_dsl.test.ts} (79%) create mode 100644 x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/get_query_dsl.ts create mode 100644 x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/get_shape_filters.test.ts create mode 100644 x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/get_shape_filters.ts create mode 100644 x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/index.ts create mode 100644 x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/transform_results.test.ts create mode 100644 x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/transform_results.ts rename x-pack/plugins/stack_alerts/server/rule_types/geo_containment/{tests/alert_type.test.ts => rule_type.test.ts} (86%) rename x-pack/plugins/stack_alerts/server/rule_types/geo_containment/{alert_type.ts => rule_type.ts} (70%) delete mode 100644 x-pack/plugins/stack_alerts/server/rule_types/geo_containment/tests/geo_containment.test.ts create mode 100644 x-pack/plugins/stack_alerts/server/rule_types/geo_containment/types.ts create mode 100644 x-pack/plugins/stack_alerts/server/rule_types/types.ts diff --git a/x-pack/plugins/stack_alerts/server/feature.ts b/x-pack/plugins/stack_alerts/server/feature.ts index 85dac89bcfb81..7392ee2e5eb9e 100644 --- a/x-pack/plugins/stack_alerts/server/feature.ts +++ b/x-pack/plugins/stack_alerts/server/feature.ts @@ -10,7 +10,7 @@ import { KibanaFeatureConfig } from '@kbn/features-plugin/common'; import { DEFAULT_APP_CATEGORIES } from '@kbn/core/server'; import { TRANSFORM_RULE_TYPE } from '@kbn/transform-plugin/common'; import { ID as IndexThreshold } from './rule_types/index_threshold/rule_type'; -import { GEO_CONTAINMENT_ID as GeoContainment } from './rule_types/geo_containment/alert_type'; +import { GEO_CONTAINMENT_ID as GeoContainment } from './rule_types/geo_containment'; import { ES_QUERY_ID as ElasticsearchQuery } from './rule_types/es_query/constants'; import { STACK_ALERTS_FEATURE_ID } from '../common'; diff --git a/x-pack/plugins/stack_alerts/server/rule_types/es_query/index.ts b/x-pack/plugins/stack_alerts/server/rule_types/es_query/index.ts index a92b5be3a9d63..4f1945d6e8b02 100644 --- a/x-pack/plugins/stack_alerts/server/rule_types/es_query/index.ts +++ b/x-pack/plugins/stack_alerts/server/rule_types/es_query/index.ts @@ -5,16 +5,10 @@ * 2.0. */ -import { CoreSetup } from '@kbn/core/server'; -import { AlertingSetup } from '../../types'; +import type { RegisterRuleTypesParams } from '../types'; import { getRuleType } from './rule_type'; -interface RegisterParams { - alerting: AlertingSetup; - core: CoreSetup; -} - -export function register(params: RegisterParams) { +export function register(params: RegisterRuleTypesParams) { const { alerting, core } = params; alerting.registerType(getRuleType(core)); } diff --git a/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/tests/__snapshots__/alert_type.test.ts.snap b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/__snapshots__/rule_type.test.ts.snap similarity index 92% rename from x-pack/plugins/stack_alerts/server/rule_types/geo_containment/tests/__snapshots__/alert_type.test.ts.snap rename to x-pack/plugins/stack_alerts/server/rule_types/geo_containment/__snapshots__/rule_type.test.ts.snap index 99f31970c1dca..47359a5154215 100644 --- a/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/tests/__snapshots__/alert_type.test.ts.snap +++ b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/__snapshots__/rule_type.test.ts.snap @@ -1,6 +1,6 @@ // Jest Snapshot v1, https://goo.gl/fbAQLP -exports[`alertType alert type creation structure is the expected value 1`] = ` +exports[`ruleType alert type creation structure is the expected value 1`] = ` Object { "context": Array [ Object { diff --git a/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/constants.ts b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/constants.ts new file mode 100644 index 0000000000000..3fc5a34d75904 --- /dev/null +++ b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/constants.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export const ActionGroupId = 'Tracked entity contained'; +export const RecoveryActionGroupId = 'notGeoContained'; +export const GEO_CONTAINMENT_ID = '.geo-containment'; +export const OTHER_CATEGORY = 'other'; diff --git a/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/es_query_builder.ts b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/es_query_builder.ts deleted file mode 100644 index c2b3115bac16e..0000000000000 --- a/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/es_query_builder.ts +++ /dev/null @@ -1,221 +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 { ElasticsearchClient } from '@kbn/core/server'; -import { Logger } from '@kbn/core/server'; -import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; -import { - fromKueryExpression, - toElasticsearchQuery, - luceneStringToDsl, - DataViewBase, - Query, -} from '@kbn/es-query'; - -export const OTHER_CATEGORY = 'other'; -// Consider dynamically obtaining from config? -const MAX_SHAPES_QUERY_SIZE = 10000; -const MAX_BUCKETS_LIMIT = 65535; - -interface BoundaryHit { - _index: string; - _id: string; - fields?: Record; -} - -export const getEsFormattedQuery = (query: Query, indexPattern?: DataViewBase) => { - let esFormattedQuery; - - const queryLanguage = query.language; - if (queryLanguage === 'kuery') { - const ast = fromKueryExpression(query.query); - esFormattedQuery = toElasticsearchQuery(ast, indexPattern); - } else { - esFormattedQuery = luceneStringToDsl(query.query); - } - return esFormattedQuery; -}; - -export async function getShapesFilters( - boundaryIndexTitle: string, - boundaryGeoField: string, - geoField: string, - esClient: ElasticsearchClient, - log: Logger, - alertId: string, - boundaryNameField?: string, - boundaryIndexQuery?: Query -) { - const filters: Record = {}; - const shapesIdsNamesMap: Record = {}; - // Get all shapes in index - const boundaryData = await esClient.search>({ - index: boundaryIndexTitle, - body: { - size: MAX_SHAPES_QUERY_SIZE, - _source: false, - fields: boundaryNameField ? [boundaryNameField] : [], - ...(boundaryIndexQuery ? { query: getEsFormattedQuery(boundaryIndexQuery) } : {}), - }, - }); - - for (let i = 0; i < boundaryData.hits.hits.length; i++) { - const boundaryHit: BoundaryHit = boundaryData.hits.hits[i]; - filters[boundaryHit._id] = { - geo_shape: { - [geoField]: { - indexed_shape: { - index: boundaryHit._index, - id: boundaryHit._id, - path: boundaryGeoField, - }, - }, - }, - }; - if ( - boundaryNameField && - boundaryHit.fields && - boundaryHit.fields[boundaryNameField] && - boundaryHit.fields[boundaryNameField].length - ) { - // fields API always returns an array, grab first value - shapesIdsNamesMap[boundaryHit._id] = boundaryHit.fields[boundaryNameField][0]; - } - } - - return { - shapesFilters: filters, - shapesIdsNamesMap, - }; -} - -export async function executeEsQueryFactory( - { - entity, - index, - dateField, - boundaryGeoField, - geoField, - boundaryIndexTitle, - indexQuery, - }: { - entity: string; - index: string; - dateField: string; - boundaryGeoField: string; - geoField: string; - boundaryIndexTitle: string; - boundaryNameField?: string; - indexQuery?: Query; - }, - esClient: ElasticsearchClient, - log: Logger, - shapesFilters: Record -) { - return async ( - gteDateTime: Date | null, - ltDateTime: Date | null - ): Promise | undefined> => { - let esFormattedQuery; - if (indexQuery) { - const gteEpochDateTime = gteDateTime ? new Date(gteDateTime).getTime() : null; - const ltEpochDateTime = ltDateTime ? new Date(ltDateTime).getTime() : null; - const dateRangeUpdatedQuery = - indexQuery.language === 'kuery' - ? `(${dateField} >= "${gteEpochDateTime}" and ${dateField} < "${ltEpochDateTime}") and (${indexQuery.query})` - : `(${dateField}:[${gteDateTime} TO ${ltDateTime}]) AND (${indexQuery.query})`; - esFormattedQuery = getEsFormattedQuery({ - query: dateRangeUpdatedQuery, - language: indexQuery.language, - }); - } - // eslint-disable-next-line @typescript-eslint/no-explicit-any - const esQuery: Record = { - index, - body: { - size: 0, // do not fetch hits - aggs: { - shapes: { - filters: { - other_bucket_key: OTHER_CATEGORY, - filters: shapesFilters, - }, - aggs: { - entitySplit: { - terms: { - size: MAX_BUCKETS_LIMIT / ((Object.keys(shapesFilters).length || 1) * 2), - field: entity, - }, - aggs: { - entityHits: { - top_hits: { - size: 1, - sort: [ - { - [dateField]: { - order: 'desc', - }, - }, - ], - docvalue_fields: [ - entity, - { - field: dateField, - format: 'strict_date_optional_time', - }, - geoField, - ], - _source: false, - }, - }, - }, - }, - }, - }, - }, - query: esFormattedQuery - ? esFormattedQuery - : { - bool: { - must: [], - filter: [ - { - match_all: {}, - }, - { - range: { - [dateField]: { - ...(gteDateTime ? { gte: gteDateTime } : {}), - lt: ltDateTime, // 'less than' to prevent overlap between intervals - format: 'strict_date_optional_time', - }, - }, - }, - ], - should: [], - must_not: [], - }, - }, - stored_fields: ['*'], - docvalue_fields: [ - { - field: dateField, - format: 'date_time', - }, - ], - }, - }; - - let esResult: estypes.SearchResponse | undefined; - try { - esResult = await esClient.search(esQuery); - } catch (err) { - log.warn(`${err.message}`); - } - return esResult; - }; -} diff --git a/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/executor.test.ts b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/executor.test.ts new file mode 100644 index 0000000000000..aebcccca98afc --- /dev/null +++ b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/executor.test.ts @@ -0,0 +1,253 @@ +/* + * 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 _ from 'lodash'; +import { elasticsearchServiceMock } from '@kbn/core/server/mocks'; +import { RuleExecutorServicesMock, alertsMock } from '@kbn/alerting-plugin/server/mocks'; +import sampleAggsJsonResponse from './tests/es_sample_response.json'; +import sampleShapesJsonResponse from './tests/es_sample_response_shapes.json'; +import { executor } from './executor'; +import type { + GeoContainmentRuleParams, + GeoContainmentAlertInstanceState, + GeoContainmentAlertInstanceContext, +} from './types'; + +const alertFactory = (contextKeys: unknown[], testAlertActionArr: unknown[]) => ({ + create: (instanceId: string) => { + const alertInstance = alertsMock.createAlertFactory.create< + GeoContainmentAlertInstanceState, + GeoContainmentAlertInstanceContext + >(); + alertInstance.scheduleActions.mockImplementation( + (actionGroupId: string, context?: GeoContainmentAlertInstanceContext) => { + // Check subset of alert for comparison to expected results + // @ts-ignore + const contextSubset = _.pickBy(context, (v, k) => contextKeys.includes(k)); + testAlertActionArr.push({ + actionGroupId, + instanceId, + context: contextSubset, + }); + } + ); + return alertInstance; + }, + alertLimit: { + getValue: () => 1000, + setLimitReached: () => {}, + }, + done: () => ({ getRecoveredAlerts: () => [] }), +}); + +describe('getGeoContainmentExecutor', () => { + // Params needed for all tests + const expectedAlertResults = [ + { + actionGroupId: 'Tracked entity contained', + context: { + containingBoundaryId: 'kFATGXkBsFLYN2Tj6AAk', + entityDocumentId: 'ZVBoGXkBsFLYN2Tj1wmV', + entityId: '0', + entityLocation: 'POINT (-73.99018926545978 40.751759740523994)', + }, + instanceId: '0-kFATGXkBsFLYN2Tj6AAk', + }, + { + actionGroupId: 'Tracked entity contained', + context: { + containingBoundaryId: 'kFATGXkBsFLYN2Tj6AAk', + entityDocumentId: 'ZlBoGXkBsFLYN2Tj1wmV', + entityId: '1', + entityLocation: 'POINT (-73.99561604484916 40.75449890457094)', + }, + instanceId: '1-kFATGXkBsFLYN2Tj6AAk', + }, + ]; + const testAlertActionArr: unknown[] = []; + const previousStartedAt = new Date('2021-04-27T16:56:11.923Z'); + const startedAt = new Date('2021-04-29T16:56:11.923Z'); + const geoContainmentParams: GeoContainmentRuleParams = { + index: 'testIndex', + indexId: 'testIndexId', + geoField: 'location', + entity: 'testEntity', + dateField: '@timestamp', + boundaryType: 'testBoundaryType', + boundaryIndexTitle: 'testBoundaryIndexTitle', + boundaryIndexId: 'testBoundaryIndexId', + boundaryGeoField: 'testBoundaryGeoField', + }; + const ruleId = 'testAlertId'; + const geoContainmentState = { + boundariesRequestMeta: { + geoField: geoContainmentParams.geoField, + boundaryIndexTitle: geoContainmentParams.boundaryIndexTitle, + boundaryGeoField: geoContainmentParams.boundaryGeoField, + }, + shapesFilters: { + testShape: 'thisIsAShape', + }, + shapesIdsNamesMap: {}, + prevLocationMap: {}, + }; + + // Boundary test mocks + const boundaryCall = jest.fn(); + const esAggCall = jest.fn(); + const contextKeys = Object.keys(expectedAlertResults[0].context); + const esClient = elasticsearchServiceMock.createElasticsearchClient(); + // @ts-ignore incomplete return type + esClient.search.mockResponseImplementation(({ index }) => { + if (index === geoContainmentParams.boundaryIndexTitle) { + boundaryCall(); + return sampleShapesJsonResponse; + } else { + esAggCall(); + return sampleAggsJsonResponse; + } + }); + + const alertServicesWithSearchMock: RuleExecutorServicesMock = { + ...alertsMock.createRuleExecutorServices(), + // @ts-ignore + alertFactory: alertFactory(contextKeys, testAlertActionArr), + // @ts-ignore + scopedClusterClient: { + asCurrentUser: esClient, + }, + }; + + beforeEach(() => { + jest.clearAllMocks(); + testAlertActionArr.length = 0; + }); + + test('should query for shapes if state does not contain shapes', async () => { + const executionResult = await executor({ + previousStartedAt, + startedAt, + // @ts-ignore + services: alertServicesWithSearchMock, + params: geoContainmentParams, + // @ts-ignore + rule: { + id: ruleId, + }, + // @ts-ignore + state: {}, + }); + if (executionResult && executionResult.state.shapesFilters) { + expect(boundaryCall.mock.calls.length).toBe(1); + expect(esAggCall.mock.calls.length).toBe(1); + } + expect(testAlertActionArr).toMatchObject(expectedAlertResults); + }); + + test('should query for shapes if boundaries request meta changes', async () => { + const executionResult = await executor({ + previousStartedAt, + startedAt, + // @ts-ignore + services: alertServicesWithSearchMock, + params: geoContainmentParams, + // @ts-ignore + rule: { + id: ruleId, + }, + // @ts-ignore + state: { + ...geoContainmentState, + boundariesRequestMeta: { + ...geoContainmentState.boundariesRequestMeta, + geoField: 'otherLocation', + }, + }, + }); + if (executionResult && executionResult.state.shapesFilters) { + expect(boundaryCall.mock.calls.length).toBe(1); + expect(esAggCall.mock.calls.length).toBe(1); + } + expect(testAlertActionArr).toMatchObject(expectedAlertResults); + }); + + test('should not query for shapes if state contains shapes', async () => { + const executionResult = await executor({ + previousStartedAt, + startedAt, + // @ts-ignore + services: alertServicesWithSearchMock, + params: geoContainmentParams, + // @ts-ignore + rule: { + id: ruleId, + }, + state: geoContainmentState, + }); + if (executionResult && executionResult.state.shapesFilters) { + expect(boundaryCall.mock.calls.length).toBe(0); + expect(esAggCall.mock.calls.length).toBe(1); + } + expect(testAlertActionArr).toMatchObject(expectedAlertResults); + }); + + test('should carry through shapes filters in state to next call unmodified', async () => { + const executionResult = await executor({ + previousStartedAt, + startedAt, + // @ts-ignore + services: alertServicesWithSearchMock, + params: geoContainmentParams, + // @ts-ignore + rule: { + id: ruleId, + }, + state: geoContainmentState, + }); + if (executionResult && executionResult.state.shapesFilters) { + expect(executionResult.state.shapesFilters).toEqual(geoContainmentState.shapesFilters); + } + expect(testAlertActionArr).toMatchObject(expectedAlertResults); + }); + + test('should return previous locations map', async () => { + const expectedPrevLocationMap = { + '0': [ + { + dateInShape: '2021-04-28T16:56:11.923Z', + docId: 'ZVBoGXkBsFLYN2Tj1wmV', + location: [-73.99018926545978, 40.751759740523994], + shapeLocationId: 'kFATGXkBsFLYN2Tj6AAk', + }, + ], + '1': [ + { + dateInShape: '2021-04-28T16:56:11.923Z', + docId: 'ZlBoGXkBsFLYN2Tj1wmV', + location: [-73.99561604484916, 40.75449890457094], + shapeLocationId: 'kFATGXkBsFLYN2Tj6AAk', + }, + ], + }; + const executionResult = await executor({ + previousStartedAt, + startedAt, + // @ts-ignore + services: alertServicesWithSearchMock, + params: geoContainmentParams, + // @ts-ignore + rule: { + id: ruleId, + }, + state: geoContainmentState, + }); + if (executionResult && executionResult.state.prevLocationMap) { + expect(executionResult.state.prevLocationMap).toEqual(expectedPrevLocationMap); + } + expect(testAlertActionArr).toMatchObject(expectedAlertResults); + }); +}); diff --git a/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/executor.ts b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/executor.ts new file mode 100644 index 0000000000000..e7681eb4dee2d --- /dev/null +++ b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/executor.ts @@ -0,0 +1,116 @@ +/* + * 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 { RuleExecutorOptions } from '../../types'; +import { + canSkipBoundariesFetch, + executeEsQuery, + getEntitiesAndGenerateAlerts, + getRecoveredAlertContext, + getShapeFilters, + transformResults, +} from './lib'; +import type { + GeoContainmentRuleParams, + GeoContainmentAlertInstanceState, + GeoContainmentAlertInstanceContext, + GeoContainmentRuleState, +} from './types'; + +import { ActionGroupId, GEO_CONTAINMENT_ID } from './constants'; + +export async function executor({ + previousStartedAt, + startedAt: windowEnd, + services, + params, + rule, + state, + logger, +}: RuleExecutorOptions< + GeoContainmentRuleParams, + GeoContainmentRuleState, + GeoContainmentAlertInstanceState, + GeoContainmentAlertInstanceContext, + typeof ActionGroupId +>): Promise<{ state: GeoContainmentRuleState }> { + const boundariesRequestMeta = { + geoField: params.geoField, + boundaryIndexTitle: params.boundaryIndexTitle, + boundaryGeoField: params.boundaryGeoField, + boundaryNameField: params.boundaryNameField, + boundaryIndexQuery: params.boundaryIndexQuery, + }; + const { shapesFilters, shapesIdsNamesMap } = + state.shapesFilters && + canSkipBoundariesFetch(boundariesRequestMeta, state.boundariesRequestMeta) + ? state + : await getShapeFilters(boundariesRequestMeta, services.scopedClusterClient.asCurrentUser); + + let windowStart = previousStartedAt; + if (!windowStart) { + logger.debug(`alert ${GEO_CONTAINMENT_ID}:${rule.id} alert initialized. Collecting data`); + // Consider making first time window configurable? + const START_TIME_WINDOW = 1; + windowStart = new Date(windowEnd); + windowStart.setMinutes(windowStart.getMinutes() - START_TIME_WINDOW); + } + + const results = await executeEsQuery( + params, + services.scopedClusterClient.asCurrentUser, + shapesFilters, + windowStart, + windowEnd + ); + + const currLocationMap: Map = transformResults( + results, + params.dateField, + params.geoField + ); + + const prevLocationMap: Map = new Map([ + ...Object.entries( + (state.prevLocationMap as Record) || {} + ), + ]); + const { activeEntities, inactiveEntities } = getEntitiesAndGenerateAlerts( + prevLocationMap, + currLocationMap, + services.alertFactory, + shapesIdsNamesMap, + windowEnd + ); + + const { getRecoveredAlerts } = services.alertFactory.done(); + for (const recoveredAlert of getRecoveredAlerts()) { + const recoveredAlertId = recoveredAlert.getId(); + try { + const context = getRecoveredAlertContext({ + alertId: recoveredAlertId, + activeEntities, + inactiveEntities, + windowEnd, + }); + if (context) { + recoveredAlert.setContext(context); + } + } catch (e) { + logger.warn(`Unable to set alert context for recovered alert, error: ${e.message}`); + } + } + + return { + state: { + boundariesRequestMeta, + shapesFilters, + shapesIdsNamesMap, + prevLocationMap: Object.fromEntries(activeEntities), + }, + }; +} diff --git a/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/geo_containment.ts b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/geo_containment.ts deleted file mode 100644 index 46656feaae407..0000000000000 --- a/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/geo_containment.ts +++ /dev/null @@ -1,227 +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 _ from 'lodash'; -import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; -import { RuleExecutorServices } from '@kbn/alerting-plugin/server'; -import { executeEsQueryFactory, getShapesFilters, OTHER_CATEGORY } from './es_query_builder'; -import { - ActionGroupId, - GeoContainmentInstanceState, - GeoContainmentAlertType, - GeoContainmentInstanceContext, - GeoContainmentState, -} from './alert_type'; - -import { GEO_CONTAINMENT_ID } from './alert_type'; -import { getAlertId, getContainedAlertContext, getRecoveredAlertContext } from './get_context'; - -// Flatten agg results and get latest locations for each entity -export function transformResults( - results: estypes.SearchResponse | undefined, - dateField: string, - geoField: string -): Map { - if (!results) { - return new Map(); - } - const buckets = _.get(results, 'aggregations.shapes.buckets', {}); - const arrResults = _.flatMap(buckets, (bucket: unknown, bucketKey: string) => { - const subBuckets = _.get(bucket, 'entitySplit.buckets', []); - return _.map(subBuckets, (subBucket) => { - const locationFieldResult = _.get( - subBucket, - `entityHits.hits.hits[0].fields["${geoField}"][0]`, - '' - ); - const location = locationFieldResult - ? _.chain(locationFieldResult) - .split(', ') - .map((coordString) => +coordString) - .reverse() - .value() - : []; - const dateInShape = _.get( - subBucket, - `entityHits.hits.hits[0].fields["${dateField}"][0]`, - null - ); - const docId = _.get(subBucket, `entityHits.hits.hits[0]._id`); - - return { - location, - shapeLocationId: bucketKey, - entityName: subBucket.key, - dateInShape, - docId, - }; - }); - }); - const orderedResults = _.orderBy(arrResults, ['entityName', 'dateInShape'], ['asc', 'desc']) - // Get unique - .reduce( - ( - accu: Map, - el: GeoContainmentInstanceState & { entityName: string } - ) => { - const { entityName, ...locationData } = el; - if (entityName) { - if (!accu.has(entityName)) { - accu.set(entityName, []); - } - accu.get(entityName)!.push(locationData); - } - return accu; - }, - new Map() - ); - return orderedResults; -} - -export function getEntitiesAndGenerateAlerts( - prevLocationMap: Map, - currLocationMap: Map, - alertFactory: RuleExecutorServices< - GeoContainmentInstanceState, - GeoContainmentInstanceContext, - typeof ActionGroupId - >['alertFactory'], - shapesIdsNamesMap: Record, - windowEnd: Date -): { - activeEntities: Map; - inactiveEntities: Map; -} { - const activeEntities: Map = new Map([ - ...prevLocationMap, - ...currLocationMap, - ]); - const inactiveEntities: Map = new Map(); - activeEntities.forEach((containments, entityName) => { - // Generate alerts - containments.forEach((containment) => { - if (containment.shapeLocationId !== OTHER_CATEGORY) { - const context = getContainedAlertContext({ - entityName, - containment, - shapesIdsNamesMap, - windowEnd, - }); - alertFactory - .create(getAlertId(entityName, context.containingBoundaryName)) - .scheduleActions(ActionGroupId, context); - } - }); - - // Entity in "other" filter bucket is no longer contained by any boundary and switches from "active" to "inactive" - if (containments[0].shapeLocationId === OTHER_CATEGORY) { - inactiveEntities.set(entityName, containments); - activeEntities.delete(entityName); - return; - } - - const otherCatIndex = containments.findIndex( - ({ shapeLocationId }) => shapeLocationId === OTHER_CATEGORY - ); - if (otherCatIndex >= 0) { - const afterOtherLocationsArr = containments.slice(0, otherCatIndex); - activeEntities.set(entityName, afterOtherLocationsArr); - } else { - activeEntities.set(entityName, containments); - } - }); - return { activeEntities, inactiveEntities }; -} - -export const getGeoContainmentExecutor = (): GeoContainmentAlertType['executor'] => - async function ({ - previousStartedAt: windowStart, - startedAt: windowEnd, - services, - params, - rule: { id: ruleId }, - state, - logger, - }): Promise<{ state: GeoContainmentState }> { - const { shapesFilters, shapesIdsNamesMap } = state.shapesFilters - ? state - : await getShapesFilters( - params.boundaryIndexTitle, - params.boundaryGeoField, - params.geoField, - services.scopedClusterClient.asCurrentUser, - logger, - ruleId, - params.boundaryNameField, - params.boundaryIndexQuery - ); - - const executeEsQuery = await executeEsQueryFactory( - params, - services.scopedClusterClient.asCurrentUser, - logger, - shapesFilters - ); - - // Start collecting data only on the first cycle - let currentIntervalResults: estypes.SearchResponse | undefined; - if (!windowStart) { - logger.debug(`alert ${GEO_CONTAINMENT_ID}:${ruleId} alert initialized. Collecting data`); - // Consider making first time window configurable? - const START_TIME_WINDOW = 1; - const tempPreviousEndTime = new Date(windowEnd); - tempPreviousEndTime.setMinutes(tempPreviousEndTime.getMinutes() - START_TIME_WINDOW); - currentIntervalResults = await executeEsQuery(tempPreviousEndTime, windowEnd); - } else { - currentIntervalResults = await executeEsQuery(windowStart, windowEnd); - } - - const currLocationMap: Map = transformResults( - currentIntervalResults, - params.dateField, - params.geoField - ); - - const prevLocationMap: Map = new Map([ - ...Object.entries( - (state.prevLocationMap as Record) || {} - ), - ]); - const { activeEntities, inactiveEntities } = getEntitiesAndGenerateAlerts( - prevLocationMap, - currLocationMap, - services.alertFactory, - shapesIdsNamesMap, - windowEnd - ); - - const { getRecoveredAlerts } = services.alertFactory.done(); - for (const recoveredAlert of getRecoveredAlerts()) { - const recoveredAlertId = recoveredAlert.getId(); - try { - const context = getRecoveredAlertContext({ - alertId: recoveredAlertId, - activeEntities, - inactiveEntities, - windowEnd, - }); - if (context) { - recoveredAlert.setContext(context); - } - } catch (e) { - logger.warn(`Unable to set alert context for recovered alert, error: ${e.message}`); - } - } - - return { - state: { - shapesFilters, - shapesIdsNamesMap, - prevLocationMap: Object.fromEntries(activeEntities), - }, - }; - }; diff --git a/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/index.ts b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/index.ts index f5b9ebc5e85cd..fd1c559e9e9a7 100644 --- a/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/index.ts +++ b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/index.ts @@ -5,31 +5,12 @@ * 2.0. */ -import { AlertingSetup } from '../../types'; -import { - GeoContainmentState, - GeoContainmentInstanceState, - GeoContainmentInstanceContext, - getAlertType, - ActionGroupId, - RecoveryActionGroupId, -} from './alert_type'; +import type { RegisterRuleTypesParams } from '../types'; +import { getRuleType } from './rule_type'; -import { GeoContainmentExtractedParams, GeoContainmentParams } from './alert_type'; +export { GEO_CONTAINMENT_ID } from './constants'; -interface RegisterParams { - alerting: AlertingSetup; -} - -export function register(params: RegisterParams) { +export function register(params: RegisterRuleTypesParams) { const { alerting } = params; - alerting.registerType< - GeoContainmentParams, - GeoContainmentExtractedParams, - GeoContainmentState, - GeoContainmentInstanceState, - GeoContainmentInstanceContext, - typeof ActionGroupId, - typeof RecoveryActionGroupId - >(getAlertType()); + alerting.registerType(getRuleType()); } diff --git a/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/tests/get_context.test.ts b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/alert_context.test.ts similarity index 97% rename from x-pack/plugins/stack_alerts/server/rule_types/geo_containment/tests/get_context.test.ts rename to x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/alert_context.test.ts index a27577ecd943e..77476e0a0ca9d 100644 --- a/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/tests/get_context.test.ts +++ b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/alert_context.test.ts @@ -5,8 +5,8 @@ * 2.0. */ -import { getContainedAlertContext, getRecoveredAlertContext } from '../get_context'; -import { OTHER_CATEGORY } from '../es_query_builder'; +import { getContainedAlertContext, getRecoveredAlertContext } from './alert_context'; +import { OTHER_CATEGORY } from '../constants'; test('getContainedAlertContext', () => { expect( diff --git a/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/get_context.ts b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/alert_context.ts similarity index 82% rename from x-pack/plugins/stack_alerts/server/rule_types/geo_containment/get_context.ts rename to x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/alert_context.ts index 7335198567916..42e65edaec789 100644 --- a/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/get_context.ts +++ b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/alert_context.ts @@ -6,7 +6,10 @@ */ import _ from 'lodash'; -import { GeoContainmentInstanceContext, GeoContainmentInstanceState } from './alert_type'; +import type { + GeoContainmentAlertInstanceContext, + GeoContainmentAlertInstanceState, +} from '../types'; export function getAlertId(entityName: string, boundaryName: unknown) { return `${entityName}-${boundaryName}`; @@ -38,12 +41,12 @@ function getAlertContext({ isRecovered, }: { entityName: string; - containment: GeoContainmentInstanceState; + containment: GeoContainmentAlertInstanceState; shapesIdsNamesMap?: Record; windowEnd: Date; isRecovered: boolean; -}): GeoContainmentInstanceContext { - const context: GeoContainmentInstanceContext = { +}): GeoContainmentAlertInstanceContext { + const context: GeoContainmentAlertInstanceContext = { entityId: entityName, entityDateTime: containment.dateInShape || null, entityDocumentId: containment.docId, @@ -61,10 +64,10 @@ function getAlertContext({ export function getContainedAlertContext(args: { entityName: string; - containment: GeoContainmentInstanceState; + containment: GeoContainmentAlertInstanceState; shapesIdsNamesMap: Record; windowEnd: Date; -}): GeoContainmentInstanceContext { +}): GeoContainmentAlertInstanceContext { return getAlertContext({ ...args, isRecovered: false }); } @@ -75,16 +78,16 @@ export function getRecoveredAlertContext({ windowEnd, }: { alertId: string; - activeEntities: Map; - inactiveEntities: Map; + activeEntities: Map; + inactiveEntities: Map; windowEnd: Date; -}): GeoContainmentInstanceContext | null { +}): GeoContainmentAlertInstanceContext | null { const { entityName } = splitAlertId(alertId); // recovered alert's latest entity location is either: // 1) activeEntities - entity moved from one boundary to another boundary // 2) inactiveEntities - entity moved from one boundary to outside all boundaries - let containment: GeoContainmentInstanceState | undefined; + let containment: GeoContainmentAlertInstanceState | undefined; if (activeEntities.has(entityName) && activeEntities.get(entityName)?.length) { containment = _.orderBy(activeEntities.get(entityName), ['dateInShape'], ['desc'])[0]; } else if (inactiveEntities.has(entityName) && inactiveEntities.get(entityName)?.length) { diff --git a/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/es_query_builder.ts b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/es_query_builder.ts new file mode 100644 index 0000000000000..44d453401078c --- /dev/null +++ b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/es_query_builder.ts @@ -0,0 +1,125 @@ +/* + * 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 { ElasticsearchClient } from '@kbn/core/server'; +import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import { OTHER_CATEGORY } from '../constants'; +import { getQueryDsl } from './get_query_dsl'; +import type { GeoContainmentRuleParams } from '../types'; + +const MAX_BUCKETS_LIMIT = 65535; + +export async function executeEsQuery( + params: GeoContainmentRuleParams, + esClient: ElasticsearchClient, + shapesFilters: Record, + gteDateTime: Date | null, + ltDateTime: Date | null +): Promise> { + const { entity, index, dateField, geoField, indexQuery } = params; + let esFormattedQuery; + if (indexQuery) { + const gteEpochDateTime = gteDateTime ? new Date(gteDateTime).getTime() : null; + const ltEpochDateTime = ltDateTime ? new Date(ltDateTime).getTime() : null; + const dateRangeUpdatedQuery = + indexQuery.language === 'kuery' + ? `(${dateField} >= "${gteEpochDateTime}" and ${dateField} < "${ltEpochDateTime}") and (${indexQuery.query})` + : `(${dateField}:[${gteDateTime} TO ${ltDateTime}]) AND (${indexQuery.query})`; + esFormattedQuery = getQueryDsl({ + query: dateRangeUpdatedQuery, + language: indexQuery.language, + }); + } + + const esQuery = { + index, + body: { + size: 0, // do not fetch hits + aggs: { + shapes: { + filters: { + other_bucket_key: OTHER_CATEGORY, + filters: shapesFilters, + }, + aggs: { + entitySplit: { + terms: { + size: MAX_BUCKETS_LIMIT / ((Object.keys(shapesFilters).length || 1) * 2), + field: entity, + }, + aggs: { + entityHits: { + top_hits: { + size: 1, + sort: [ + { + [dateField]: { + order: 'desc', + }, + }, + ], + docvalue_fields: [ + entity, + { + field: dateField, + format: 'strict_date_optional_time', + }, + geoField, + ], + _source: false, + }, + }, + }, + }, + }, + }, + }, + query: esFormattedQuery + ? esFormattedQuery + : { + bool: { + must: [], + filter: [ + { + match_all: {}, + }, + { + range: { + [dateField]: { + ...(gteDateTime ? { gte: gteDateTime } : {}), + lt: ltDateTime, // 'less than' to prevent overlap between intervals + format: 'strict_date_optional_time', + }, + }, + }, + ], + should: [], + must_not: [], + }, + }, + stored_fields: ['*'], + docvalue_fields: [ + { + field: dateField, + format: 'date_time', + }, + ], + }, + }; + + try { + return await esClient.search(esQuery); + } catch (err) { + throw new Error( + i18n.translate('xpack.stackAlerts.geoContainment.entityContainmentFetchError', { + defaultMessage: 'Unable to fetch entity containment, error: {error}', + values: { error: err.message }, + }) + ); + } +} diff --git a/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/get_entities_and_generate_alerts.test.ts b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/get_entities_and_generate_alerts.test.ts new file mode 100644 index 0000000000000..3d0762f24db19 --- /dev/null +++ b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/get_entities_and_generate_alerts.test.ts @@ -0,0 +1,348 @@ +/* + * 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 _ from 'lodash'; +import { alertsMock } from '@kbn/alerting-plugin/server/mocks'; +import { getEntitiesAndGenerateAlerts } from './get_entities_and_generate_alerts'; +import { OTHER_CATEGORY } from '../constants'; +import type { + GeoContainmentAlertInstanceState, + GeoContainmentAlertInstanceContext, +} from '../types'; + +const alertFactory = (contextKeys: unknown[], testAlertActionArr: unknown[]) => ({ + create: (instanceId: string) => { + const alertInstance = alertsMock.createAlertFactory.create< + GeoContainmentAlertInstanceState, + GeoContainmentAlertInstanceContext + >(); + alertInstance.scheduleActions.mockImplementation( + (actionGroupId: string, context?: GeoContainmentAlertInstanceContext) => { + // Check subset of alert for comparison to expected results + // @ts-ignore + const contextSubset = _.pickBy(context, (v, k) => contextKeys.includes(k)); + testAlertActionArr.push({ + actionGroupId, + instanceId, + context: contextSubset, + }); + } + ); + return alertInstance; + }, + alertLimit: { + getValue: () => 1000, + setLimitReached: () => {}, + }, + done: () => ({ getRecoveredAlerts: () => [] }), +}); + +describe('getEntitiesAndGenerateAlerts', () => { + const testAlertActionArr: unknown[] = []; + beforeEach(() => { + jest.clearAllMocks(); + testAlertActionArr.length = 0; + }); + + const currLocationMap = new Map([ + [ + 'a', + [ + { + location: [0, 0], + shapeLocationId: '123', + dateInShape: 'Wed Dec 09 2020 14:31:31 GMT-0700 (Mountain Standard Time)', + docId: 'docId1', + }, + ], + ], + [ + 'b', + [ + { + location: [0, 0], + shapeLocationId: '456', + dateInShape: 'Wed Dec 16 2020 15:31:31 GMT-0700 (Mountain Standard Time)', + docId: 'docId2', + }, + ], + ], + [ + 'c', + [ + { + location: [0, 0], + shapeLocationId: '789', + dateInShape: 'Wed Dec 23 2020 16:31:31 GMT-0700 (Mountain Standard Time)', + docId: 'docId3', + }, + ], + ], + ]); + + const expectedAlertResults = [ + { + actionGroupId: 'Tracked entity contained', + context: { + containingBoundaryId: '123', + entityDocumentId: 'docId1', + entityId: 'a', + entityLocation: 'POINT (0 0)', + }, + instanceId: 'a-123', + }, + { + actionGroupId: 'Tracked entity contained', + context: { + containingBoundaryId: '456', + entityDocumentId: 'docId2', + entityId: 'b', + entityLocation: 'POINT (0 0)', + }, + instanceId: 'b-456', + }, + { + actionGroupId: 'Tracked entity contained', + context: { + containingBoundaryId: '789', + entityDocumentId: 'docId3', + entityId: 'c', + entityLocation: 'POINT (0 0)', + }, + instanceId: 'c-789', + }, + ]; + const contextKeys = Object.keys(expectedAlertResults[0].context); + const emptyShapesIdsNamesMap = {}; + + const currentDateTime = new Date(); + + test('should use currently active entities if no older entity entries', () => { + const emptyPrevLocationMap = new Map(); + const { activeEntities } = getEntitiesAndGenerateAlerts( + emptyPrevLocationMap, + currLocationMap, + alertFactory(contextKeys, testAlertActionArr), + emptyShapesIdsNamesMap, + currentDateTime + ); + expect(activeEntities).toEqual(currLocationMap); + expect(testAlertActionArr).toMatchObject(expectedAlertResults); + }); + + test('should overwrite older identical entity entries', () => { + const prevLocationMapWithIdenticalEntityEntry = new Map([ + [ + 'a', + [ + { + location: [0, 0], + shapeLocationId: '999', + dateInShape: 'Wed Dec 09 2020 12:31:31 GMT-0700 (Mountain Standard Time)', + docId: 'docId7', + }, + ], + ], + ]); + const { activeEntities } = getEntitiesAndGenerateAlerts( + prevLocationMapWithIdenticalEntityEntry, + currLocationMap, + alertFactory(contextKeys, testAlertActionArr), + emptyShapesIdsNamesMap, + currentDateTime + ); + expect(activeEntities).toEqual(currLocationMap); + expect(testAlertActionArr).toMatchObject(expectedAlertResults); + }); + + test('should preserve older non-identical entity entries', () => { + const prevLocationMapWithNonIdenticalEntityEntry = new Map([ + [ + 'd', + [ + { + location: [0, 0], + shapeLocationId: '999', + dateInShape: 'Wed Dec 09 2020 12:31:31 GMT-0700 (Mountain Standard Time)', + docId: 'docId7', + }, + ], + ], + ]); + const expectedAlertResultsPlusD = [ + { + actionGroupId: 'Tracked entity contained', + context: { + containingBoundaryId: '999', + entityDocumentId: 'docId7', + entityId: 'd', + entityLocation: 'POINT (0 0)', + }, + instanceId: 'd-999', + }, + ...expectedAlertResults, + ]; + + const { activeEntities } = getEntitiesAndGenerateAlerts( + prevLocationMapWithNonIdenticalEntityEntry, + currLocationMap, + alertFactory(contextKeys, testAlertActionArr), + emptyShapesIdsNamesMap, + currentDateTime + ); + expect(activeEntities).not.toEqual(currLocationMap); + expect(activeEntities.has('d')).toBeTruthy(); + expect(testAlertActionArr).toMatchObject(expectedAlertResultsPlusD); + }); + + test('should remove "other" entries and schedule the expected number of actions', () => { + const emptyPrevLocationMap = new Map(); + const currLocationMapWithOther = new Map([...currLocationMap]).set('d', [ + { + location: [0, 0], + shapeLocationId: OTHER_CATEGORY, + dateInShape: 'Wed Dec 09 2020 14:31:31 GMT-0700 (Mountain Standard Time)', + docId: 'docId1', + }, + ]); + expect(currLocationMapWithOther).not.toEqual(currLocationMap); + const { activeEntities, inactiveEntities } = getEntitiesAndGenerateAlerts( + emptyPrevLocationMap, + currLocationMapWithOther, + alertFactory(contextKeys, testAlertActionArr), + emptyShapesIdsNamesMap, + currentDateTime + ); + expect(activeEntities).toEqual(currLocationMap); + expect(inactiveEntities).toEqual( + new Map([ + [ + 'd', + [ + { + location: [0, 0], + shapeLocationId: 'other', + dateInShape: 'Wed Dec 09 2020 14:31:31 GMT-0700 (Mountain Standard Time)', + docId: 'docId1', + }, + ], + ], + ]) + ); + expect(testAlertActionArr).toMatchObject(expectedAlertResults); + }); + + test('should generate multiple alerts per entity if found in multiple shapes in interval', () => { + const emptyPrevLocationMap = new Map(); + const currLocationMapWithThreeMore = new Map([...currLocationMap]).set('d', [ + { + location: [0, 0], + shapeLocationId: '789', + dateInShape: 'Wed Dec 10 2020 14:31:31 GMT-0700 (Mountain Standard Time)', + docId: 'docId1', + }, + { + location: [0, 0], + shapeLocationId: '123', + dateInShape: 'Wed Dec 08 2020 12:31:31 GMT-0700 (Mountain Standard Time)', + docId: 'docId2', + }, + { + location: [0, 0], + shapeLocationId: '456', + dateInShape: 'Wed Dec 07 2020 10:31:31 GMT-0700 (Mountain Standard Time)', + docId: 'docId3', + }, + ]); + getEntitiesAndGenerateAlerts( + emptyPrevLocationMap, + currLocationMapWithThreeMore, + alertFactory(contextKeys, testAlertActionArr), + emptyShapesIdsNamesMap, + currentDateTime + ); + let numEntitiesInShapes = 0; + currLocationMapWithThreeMore.forEach((v) => { + numEntitiesInShapes += v.length; + }); + expect(testAlertActionArr.length).toEqual(numEntitiesInShapes); + }); + + test('should not return entity as active entry if most recent location is "other"', () => { + const emptyPrevLocationMap = new Map(); + const currLocationMapWithOther = new Map([...currLocationMap]).set('d', [ + { + location: [0, 0], + shapeLocationId: OTHER_CATEGORY, + dateInShape: 'Wed Dec 10 2020 14:31:31 GMT-0700 (Mountain Standard Time)', + docId: 'docId1', + }, + { + location: [0, 0], + shapeLocationId: '123', + dateInShape: 'Wed Dec 08 2020 12:31:31 GMT-0700 (Mountain Standard Time)', + docId: 'docId1', + }, + { + location: [0, 0], + shapeLocationId: '456', + dateInShape: 'Wed Dec 07 2020 10:31:31 GMT-0700 (Mountain Standard Time)', + docId: 'docId1', + }, + ]); + expect(currLocationMapWithOther).not.toEqual(currLocationMap); + const { activeEntities } = getEntitiesAndGenerateAlerts( + emptyPrevLocationMap, + currLocationMapWithOther, + alertFactory(contextKeys, testAlertActionArr), + emptyShapesIdsNamesMap, + currentDateTime + ); + expect(activeEntities).toEqual(currLocationMap); + }); + + test('should return entity as active entry if "other" not the latest location but remove "other" and earlier entries', () => { + const emptyPrevLocationMap = new Map(); + const currLocationMapWithOther = new Map([...currLocationMap]).set('d', [ + { + location: [0, 0], + shapeLocationId: '123', + dateInShape: 'Wed Dec 10 2020 14:31:31 GMT-0700 (Mountain Standard Time)', + docId: 'docId1', + }, + { + location: [0, 0], + shapeLocationId: OTHER_CATEGORY, + dateInShape: 'Wed Dec 08 2020 12:31:31 GMT-0700 (Mountain Standard Time)', + docId: 'docId1', + }, + { + location: [0, 0], + shapeLocationId: '456', + dateInShape: 'Wed Dec 07 2020 10:31:31 GMT-0700 (Mountain Standard Time)', + docId: 'docId1', + }, + ]); + const { activeEntities } = getEntitiesAndGenerateAlerts( + emptyPrevLocationMap, + currLocationMapWithOther, + alertFactory(contextKeys, testAlertActionArr), + emptyShapesIdsNamesMap, + currentDateTime + ); + expect(activeEntities).toEqual( + new Map([...currLocationMap]).set('d', [ + { + location: [0, 0], + shapeLocationId: '123', + dateInShape: 'Wed Dec 10 2020 14:31:31 GMT-0700 (Mountain Standard Time)', + docId: 'docId1', + }, + ]) + ); + }); +}); diff --git a/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/get_entities_and_generate_alerts.ts b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/get_entities_and_generate_alerts.ts new file mode 100644 index 0000000000000..4bf1aad7f536d --- /dev/null +++ b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/get_entities_and_generate_alerts.ts @@ -0,0 +1,70 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { RuleExecutorServices } from '@kbn/alerting-plugin/server'; +import type { + GeoContainmentAlertInstanceState, + GeoContainmentAlertInstanceContext, +} from '../types'; + +import { ActionGroupId, OTHER_CATEGORY } from '../constants'; +import { getAlertId, getContainedAlertContext } from './alert_context'; + +export function getEntitiesAndGenerateAlerts( + prevLocationMap: Map, + currLocationMap: Map, + alertFactory: RuleExecutorServices< + GeoContainmentAlertInstanceState, + GeoContainmentAlertInstanceContext, + typeof ActionGroupId + >['alertFactory'], + shapesIdsNamesMap: Record, + windowEnd: Date +): { + activeEntities: Map; + inactiveEntities: Map; +} { + const activeEntities: Map = new Map([ + ...prevLocationMap, + ...currLocationMap, + ]); + const inactiveEntities: Map = new Map(); + activeEntities.forEach((containments, entityName) => { + // Generate alerts + containments.forEach((containment) => { + if (containment.shapeLocationId !== OTHER_CATEGORY) { + const context = getContainedAlertContext({ + entityName, + containment, + shapesIdsNamesMap, + windowEnd, + }); + alertFactory + .create(getAlertId(entityName, context.containingBoundaryName)) + .scheduleActions(ActionGroupId, context); + } + }); + + // Entity in "other" filter bucket is no longer contained by any boundary and switches from "active" to "inactive" + if (containments[0].shapeLocationId === OTHER_CATEGORY) { + inactiveEntities.set(entityName, containments); + activeEntities.delete(entityName); + return; + } + + const otherCatIndex = containments.findIndex( + ({ shapeLocationId }) => shapeLocationId === OTHER_CATEGORY + ); + if (otherCatIndex >= 0) { + const afterOtherLocationsArr = containments.slice(0, otherCatIndex); + activeEntities.set(entityName, afterOtherLocationsArr); + } else { + activeEntities.set(entityName, containments); + } + }); + return { activeEntities, inactiveEntities }; +} diff --git a/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/tests/es_query_builder.test.ts b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/get_query_dsl.test.ts similarity index 79% rename from x-pack/plugins/stack_alerts/server/rule_types/geo_containment/tests/es_query_builder.test.ts rename to x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/get_query_dsl.test.ts index 61ca484e26ea8..2d1ac6ac363f8 100644 --- a/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/tests/es_query_builder.test.ts +++ b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/get_query_dsl.test.ts @@ -5,21 +5,21 @@ * 2.0. */ -import { getEsFormattedQuery } from '../es_query_builder'; +import { getQueryDsl } from './get_query_dsl'; -describe('esFormattedQuery', () => { - it('lucene queries are converted correctly', async () => { +describe('getQueryDsl', () => { + test('should convert lucene queries to elasticsearch dsl', async () => { const testLuceneQuery1 = { query: `"airport": "Denver"`, language: 'lucene', }; - const esFormattedQuery1 = getEsFormattedQuery(testLuceneQuery1); + const esFormattedQuery1 = getQueryDsl(testLuceneQuery1); expect(esFormattedQuery1).toStrictEqual({ query_string: { query: '"airport": "Denver"' } }); const testLuceneQuery2 = { query: `title:"Fun with turnips" AND text:Cabbage, cabbage and more cabbage!`, language: 'lucene', }; - const esFormattedQuery2 = getEsFormattedQuery(testLuceneQuery2); + const esFormattedQuery2 = getQueryDsl(testLuceneQuery2); expect(esFormattedQuery2).toStrictEqual({ query_string: { query: `title:"Fun with turnips" AND text:Cabbage, cabbage and more cabbage!`, @@ -27,12 +27,12 @@ describe('esFormattedQuery', () => { }); }); - it('kuery queries are converted correctly', async () => { + test('should convert kuery queries to elasticsearch dsl', async () => { const testKueryQuery1 = { query: `"airport": "Denver"`, language: 'kuery', }; - const esFormattedQuery1 = getEsFormattedQuery(testKueryQuery1); + const esFormattedQuery1 = getQueryDsl(testKueryQuery1); expect(esFormattedQuery1).toStrictEqual({ bool: { minimum_should_match: 1, should: [{ match_phrase: { airport: 'Denver' } }] }, }); @@ -40,7 +40,7 @@ describe('esFormattedQuery', () => { query: `"airport": "Denver" and ("animal": "goat" or "animal": "narwhal")`, language: 'kuery', }; - const esFormattedQuery2 = getEsFormattedQuery(testKueryQuery2); + const esFormattedQuery2 = getQueryDsl(testKueryQuery2); expect(esFormattedQuery2).toStrictEqual({ bool: { filter: [ diff --git a/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/get_query_dsl.ts b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/get_query_dsl.ts new file mode 100644 index 0000000000000..7609124d16cfa --- /dev/null +++ b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/get_query_dsl.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + fromKueryExpression, + toElasticsearchQuery, + luceneStringToDsl, + DataViewBase, + Query, +} from '@kbn/es-query'; + +export const getQueryDsl = (query: Query, indexPattern?: DataViewBase) => { + if (query.language === 'kuery') { + return toElasticsearchQuery(fromKueryExpression(query.query), indexPattern); + } + + return luceneStringToDsl(query.query); +}; diff --git a/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/get_shape_filters.test.ts b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/get_shape_filters.test.ts new file mode 100644 index 0000000000000..a133d65d871aa --- /dev/null +++ b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/get_shape_filters.test.ts @@ -0,0 +1,151 @@ +/* + * 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 { ElasticsearchClient } from '@kbn/core/server'; +import { canSkipBoundariesFetch, getShapeFilters } from './get_shape_filters'; + +const boundariesRequestMeta = { + geoField: 'entityGeometry', + boundaryIndexTitle: 'boundaries', + boundaryGeoField: 'boundariesGeometry', + boundaryNameField: 'boundaryName', + boundaryIndexQuery: { + language: 'kuery', + query: 'iso2 : US', + }, +}; + +describe('canSkipBoundariesFetch', () => { + test('should return false when previous request meta is undefined', () => { + expect(canSkipBoundariesFetch(boundariesRequestMeta, undefined)).toBe(false); + }); + + test('should return false when boundaries query changes', () => { + expect( + canSkipBoundariesFetch( + { + ...boundariesRequestMeta, + boundaryIndexQuery: { + language: 'kuery', + query: 'iso2 : CA', + }, + }, + { ...boundariesRequestMeta } + ) + ).toBe(false); + }); + + test('should return true when request meta is not changed', () => { + expect(canSkipBoundariesFetch(boundariesRequestMeta, { ...boundariesRequestMeta })).toBe(true); + }); +}); + +describe('getShapeFilters', () => { + test('should return boundary filters', async () => { + const mockEsClient = { + search: () => { + return { + hits: { + hits: [ + { + _index: 'boundaries', + _id: 'waFXH3kBi9P-_6qn8c8A', + fields: { + boundaryName: ['alpha'], + }, + }, + { + _index: 'boundaries', + _id: 'wqFXH3kBi9P-_6qn8c8A', + fields: { + boundaryName: ['bravo'], + }, + }, + { + _index: 'boundaries', + _id: 'w6FXH3kBi9P-_6qn8c8A', + fields: { + boundaryName: ['charlie'], + }, + }, + ], + }, + }; + }, + } as unknown as ElasticsearchClient; + const { shapesFilters, shapesIdsNamesMap } = await getShapeFilters( + boundariesRequestMeta, + mockEsClient + ); + expect(shapesIdsNamesMap).toEqual({ + 'waFXH3kBi9P-_6qn8c8A': 'alpha', + 'wqFXH3kBi9P-_6qn8c8A': 'bravo', + 'w6FXH3kBi9P-_6qn8c8A': 'charlie', + }); + expect(shapesFilters).toEqual({ + 'waFXH3kBi9P-_6qn8c8A': { + geo_shape: { + entityGeometry: { + indexed_shape: { + id: 'waFXH3kBi9P-_6qn8c8A', + index: 'boundaries', + path: 'boundariesGeometry', + }, + }, + }, + }, + 'wqFXH3kBi9P-_6qn8c8A': { + geo_shape: { + entityGeometry: { + indexed_shape: { + id: 'wqFXH3kBi9P-_6qn8c8A', + index: 'boundaries', + path: 'boundariesGeometry', + }, + }, + }, + }, + 'w6FXH3kBi9P-_6qn8c8A': { + geo_shape: { + entityGeometry: { + indexed_shape: { + id: 'w6FXH3kBi9P-_6qn8c8A', + index: 'boundaries', + path: 'boundariesGeometry', + }, + }, + }, + }, + }); + }); + + test('should throw error when search throws', async () => { + const mockEsClient = { + search: () => { + throw new Error('Simulated elasticsearch search error'); + }, + } as unknown as ElasticsearchClient; + expect(async () => { + await getShapeFilters(boundariesRequestMeta, mockEsClient); + }).rejects.toThrow(); + }); + + test('should throw error if no results found', async () => { + const mockEsClient = { + search: () => { + return { + hits: { + hits: [], + }, + }; + }, + } as unknown as ElasticsearchClient; + expect(async () => { + await getShapeFilters(boundariesRequestMeta, mockEsClient); + }).rejects.toThrow(); + }); +}); diff --git a/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/get_shape_filters.ts b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/get_shape_filters.ts new file mode 100644 index 0000000000000..54931a524d4e6 --- /dev/null +++ b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/get_shape_filters.ts @@ -0,0 +1,122 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import fastIsEqual from 'fast-deep-equal'; +import { i18n } from '@kbn/i18n'; +import { ElasticsearchClient } from '@kbn/core/server'; +import type { BoundariesRequestMeta } from '../types'; +import { getQueryDsl } from './get_query_dsl'; + +interface BoundaryHit { + _index: string; + _id: string; + fields?: Record; +} + +// Consider dynamically obtaining from config? +const MAX_SHAPES_QUERY_SIZE = 10000; + +export function canSkipBoundariesFetch( + requestMeta: BoundariesRequestMeta, + prevRequestMeta?: BoundariesRequestMeta +) { + return prevRequestMeta + ? fastIsEqual( + [ + requestMeta.geoField, + requestMeta.boundaryIndexTitle, + requestMeta.boundaryGeoField, + requestMeta.boundaryNameField, + requestMeta.boundaryIndexQuery, + ], + [ + prevRequestMeta.geoField, + prevRequestMeta.boundaryIndexTitle, + prevRequestMeta.boundaryGeoField, + prevRequestMeta.boundaryNameField, + prevRequestMeta.boundaryIndexQuery, + ] + ) + : false; +} + +export async function getShapeFilters( + requestMeta: BoundariesRequestMeta, + esClient: ElasticsearchClient +) { + const { geoField, boundaryIndexTitle, boundaryGeoField, boundaryNameField, boundaryIndexQuery } = + requestMeta; + + let boundaryData; + try { + boundaryData = await esClient.search>({ + index: boundaryIndexTitle, + body: { + size: MAX_SHAPES_QUERY_SIZE, + _source: false, + fields: boundaryNameField ? [boundaryNameField] : [], + ...(boundaryIndexQuery ? { query: getQueryDsl(boundaryIndexQuery) } : {}), + }, + }); + } catch (e) { + throw new Error( + i18n.translate('xpack.stackAlerts.geoContainment.boundariesFetchError', { + defaultMessage: 'Unable to fetch tracking containment boundaries, error: {error}', + values: { error: e.message }, + }) + ); + } + + const hits = boundaryData?.hits?.hits; + if (!hits || hits.length === 0) { + const noBoundariesMsg = i18n.translate('xpack.stackAlerts.geoContainment.noBoundariesError', { + defaultMessage: + 'No tracking containtment boundaries found. Ensure index, "{index}", has documents.', + values: { index: boundaryIndexTitle }, + }); + + const adjustQueryMsg = boundaryIndexQuery + ? i18n.translate('xpack.stackAlerts.geoContainment.adjustQuery', { + defaultMessage: 'Adjust query, "{query}" to match documents.', + values: { query: boundaryIndexQuery.query as string }, + }) + : null; + + throw new Error(adjustQueryMsg ? `${noBoundariesMsg} ${adjustQueryMsg}` : noBoundariesMsg); + } + + const filters: Record = {}; + const shapesIdsNamesMap: Record = {}; + for (let i = 0; i < hits.length; i++) { + const boundaryHit: BoundaryHit = hits[i]; + filters[boundaryHit._id] = { + geo_shape: { + [geoField]: { + indexed_shape: { + index: boundaryHit._index, + id: boundaryHit._id, + path: boundaryGeoField, + }, + }, + }, + }; + if ( + boundaryNameField && + boundaryHit.fields && + boundaryHit.fields[boundaryNameField] && + boundaryHit.fields[boundaryNameField].length + ) { + // fields API always returns an array, grab first value + shapesIdsNamesMap[boundaryHit._id] = boundaryHit.fields[boundaryNameField][0]; + } + } + + return { + shapesFilters: filters, + shapesIdsNamesMap, + }; +} diff --git a/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/index.ts b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/index.ts new file mode 100644 index 0000000000000..fdee78d2d28a7 --- /dev/null +++ b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/index.ts @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { getRecoveredAlertContext } from './alert_context'; +export { executeEsQuery } from './es_query_builder'; +export { getEntitiesAndGenerateAlerts } from './get_entities_and_generate_alerts'; +export { canSkipBoundariesFetch, getShapeFilters } from './get_shape_filters'; +export { transformResults } from './transform_results'; diff --git a/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/transform_results.test.ts b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/transform_results.test.ts new file mode 100644 index 0000000000000..6c87157ded42f --- /dev/null +++ b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/transform_results.test.ts @@ -0,0 +1,131 @@ +/* + * 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 sampleAggsJsonResponse from '../tests/es_sample_response.json'; +import sampleAggsJsonResponseWithNesting from '../tests/es_sample_response_with_nesting.json'; +import { transformResults } from './transform_results'; + +describe('transformResults', () => { + const dateField = '@timestamp'; + const geoField = 'location'; + test('should correctly transform expected results', async () => { + const transformedResults = transformResults( + // @ts-ignore + sampleAggsJsonResponse.body, + dateField, + geoField + ); + expect(transformedResults).toEqual( + new Map([ + [ + '0', + [ + { + dateInShape: '2021-04-28T16:56:11.923Z', + docId: 'ZVBoGXkBsFLYN2Tj1wmV', + location: [-73.99018926545978, 40.751759740523994], + shapeLocationId: 'kFATGXkBsFLYN2Tj6AAk', + }, + { + dateInShape: '2021-04-28T16:56:01.896Z', + docId: 'YlBoGXkBsFLYN2TjsAlp', + location: [-73.98968475870788, 40.7506317878142], + shapeLocationId: 'other', + }, + ], + ], + [ + '1', + [ + { + dateInShape: '2021-04-28T16:56:11.923Z', + docId: 'ZlBoGXkBsFLYN2Tj1wmV', + location: [-73.99561604484916, 40.75449890457094], + shapeLocationId: 'kFATGXkBsFLYN2Tj6AAk', + }, + { + dateInShape: '2021-04-28T16:56:01.896Z', + docId: 'Y1BoGXkBsFLYN2TjsAlp', + location: [-73.99459345266223, 40.755913141183555], + shapeLocationId: 'other', + }, + ], + ], + [ + '2', + [ + { + dateInShape: '2021-04-28T16:56:11.923Z', + docId: 'Z1BoGXkBsFLYN2Tj1wmV', + location: [-73.98662586696446, 40.7667087810114], + shapeLocationId: 'other', + }, + ], + ], + ]) + ); + }); + + const nestedDateField = 'time_data.@timestamp'; + const nestedGeoField = 'geo.coords.location'; + test('should correctly transform expected results if fields are nested', async () => { + const transformedResults = transformResults( + // @ts-ignore + sampleAggsJsonResponseWithNesting.body, + nestedDateField, + nestedGeoField + ); + expect(transformedResults).toEqual( + new Map([ + [ + '936', + [ + { + dateInShape: '2020-09-28T18:01:41.190Z', + docId: 'N-ng1XQB6yyY-xQxnGSM', + location: [-82.8814151789993, 40.62806099653244], + shapeLocationId: '0DrJu3QB6yyY-xQxv6Ip', + }, + ], + ], + [ + 'AAL2019', + [ + { + dateInShape: '2020-09-28T18:01:41.191Z', + docId: 'iOng1XQB6yyY-xQxnGSM', + location: [-82.22068064846098, 39.006176185794175], + shapeLocationId: '0DrJu3QB6yyY-xQxv6Ip', + }, + ], + ], + [ + 'AAL2323', + [ + { + dateInShape: '2020-09-28T18:01:41.191Z', + docId: 'n-ng1XQB6yyY-xQxnGSM', + location: [-84.71324851736426, 41.6677269525826], + shapeLocationId: '0DrJu3QB6yyY-xQxv6Ip', + }, + ], + ], + [ + 'ABD5250', + [ + { + dateInShape: '2020-09-28T18:01:41.192Z', + docId: 'GOng1XQB6yyY-xQxnGWM', + location: [6.073727197945118, 39.07997465226799], + shapeLocationId: '0DrJu3QB6yyY-xQxv6Ip', + }, + ], + ], + ]) + ); + }); +}); diff --git a/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/transform_results.ts b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/transform_results.ts new file mode 100644 index 0000000000000..d9b1c36fa4812 --- /dev/null +++ b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/lib/transform_results.ts @@ -0,0 +1,69 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import _ from 'lodash'; +import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import type { GeoContainmentAlertInstanceState } from '../types'; + +// Flatten agg results and get latest locations for each entity +export function transformResults( + results: estypes.SearchResponse, + dateField: string, + geoField: string +): Map { + const buckets = _.get(results, 'aggregations.shapes.buckets', {}); + const arrResults = _.flatMap(buckets, (bucket: unknown, bucketKey: string) => { + const subBuckets = _.get(bucket, 'entitySplit.buckets', []); + return _.map(subBuckets, (subBucket) => { + const locationFieldResult = _.get( + subBucket, + `entityHits.hits.hits[0].fields["${geoField}"][0]`, + '' + ); + const location = locationFieldResult + ? _.chain(locationFieldResult) + .split(', ') + .map((coordString) => +coordString) + .reverse() + .value() + : []; + const dateInShape = _.get( + subBucket, + `entityHits.hits.hits[0].fields["${dateField}"][0]`, + null + ); + const docId = _.get(subBucket, `entityHits.hits.hits[0]._id`); + + return { + location, + shapeLocationId: bucketKey, + entityName: subBucket.key, + dateInShape, + docId, + }; + }); + }); + const orderedResults = _.orderBy(arrResults, ['entityName', 'dateInShape'], ['asc', 'desc']) + // Get unique + .reduce( + ( + accu: Map, + el: GeoContainmentAlertInstanceState & { entityName: string } + ) => { + const { entityName, ...locationData } = el; + if (entityName) { + if (!accu.has(entityName)) { + accu.set(entityName, []); + } + accu.get(entityName)!.push(locationData); + } + return accu; + }, + new Map() + ); + return orderedResults; +} diff --git a/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/tests/alert_type.test.ts b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/rule_type.test.ts similarity index 86% rename from x-pack/plugins/stack_alerts/server/rule_types/geo_containment/tests/alert_type.test.ts rename to x-pack/plugins/stack_alerts/server/rule_types/geo_containment/rule_type.test.ts index 9a67a1280f730..2ea9d3cff7df5 100644 --- a/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/tests/alert_type.test.ts +++ b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/rule_type.test.ts @@ -6,31 +6,31 @@ */ import { - getAlertType, + getRuleType, injectEntityAndBoundaryIds, - GeoContainmentParams, extractEntityAndBoundaryReferences, -} from '../alert_type'; +} from './rule_type'; +import type { GeoContainmentRuleParams } from './types'; -describe('alertType', () => { - const alertType = getAlertType(); +describe('ruleType', () => { + const ruleType = getRuleType(); it('alert type creation structure is the expected value', async () => { - expect(alertType.id).toBe('.geo-containment'); - expect(alertType.name).toBe('Tracking containment'); - expect(alertType.actionGroups).toEqual([ + expect(ruleType.id).toBe('.geo-containment'); + expect(ruleType.name).toBe('Tracking containment'); + expect(ruleType.actionGroups).toEqual([ { id: 'Tracked entity contained', name: 'Tracking containment met' }, ]); - expect(alertType.recoveryActionGroup).toEqual({ + expect(ruleType.recoveryActionGroup).toEqual({ id: 'notGeoContained', name: 'No longer contained', }); - expect(alertType.actionVariables).toMatchSnapshot(); + expect(ruleType.actionVariables).toMatchSnapshot(); }); it('validator succeeds with valid params', async () => { - const params: GeoContainmentParams = { + const params: GeoContainmentRuleParams = { index: 'testIndex', indexId: 'testIndexId', geoField: 'testField', @@ -43,7 +43,7 @@ describe('alertType', () => { boundaryNameField: 'testField', }; - expect(alertType.validate?.params?.validate(params)).toBeTruthy(); + expect(ruleType.validate?.params?.validate(params)).toBeTruthy(); }); test('injectEntityAndBoundaryIds', () => { diff --git a/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/alert_type.ts b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/rule_type.ts similarity index 70% rename from x-pack/plugins/stack_alerts/server/rule_types/geo_containment/alert_type.ts rename to x-pack/plugins/stack_alerts/server/rule_types/geo_containment/rule_type.ts index 4a0c89531c880..938edad8cb394 100644 --- a/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/alert_type.ts +++ b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/rule_type.ts @@ -8,43 +8,15 @@ import { i18n } from '@kbn/i18n'; import { schema } from '@kbn/config-schema'; import { SavedObjectReference } from '@kbn/core/server'; -import { - RuleType, - RuleTypeState, - AlertInstanceState, - AlertInstanceContext, - RuleParamsAndRefs, - RuleTypeParams, -} from '@kbn/alerting-plugin/server'; -import { Query } from '@kbn/data-plugin/common/query'; +import { RuleParamsAndRefs } from '@kbn/alerting-plugin/server'; import { STACK_ALERTS_FEATURE_ID } from '../../../common'; -import { getGeoContainmentExecutor } from './geo_containment'; - -export const ActionGroupId = 'Tracked entity contained'; -export const RecoveryActionGroupId = 'notGeoContained'; - -export const GEO_CONTAINMENT_ID = '.geo-containment'; -export interface GeoContainmentParams extends RuleTypeParams { - index: string; - indexId: string; - geoField: string; - entity: string; - dateField: string; - boundaryType: string; - boundaryIndexTitle: string; - boundaryIndexId: string; - boundaryGeoField: string; - boundaryNameField?: string; - indexQuery?: Query; - boundaryIndexQuery?: Query; -} -export type GeoContainmentExtractedParams = Omit< - GeoContainmentParams, - 'indexId' | 'boundaryIndexId' -> & { - indexRefName: string; - boundaryIndexRefName: string; -}; +import type { + GeoContainmentRuleType, + GeoContainmentExtractedRuleParams, + GeoContainmentRuleParams, +} from './types'; +import { executor } from './executor'; +import { ActionGroupId, RecoveryActionGroupId, GEO_CONTAINMENT_ID } from './constants'; const actionVariables = { context: [ @@ -132,40 +104,8 @@ export const ParamsSchema = schema.object({ boundaryIndexQuery: schema.maybe(schema.any({})), }); -export interface GeoContainmentState extends RuleTypeState { - shapesFilters: Record; - shapesIdsNamesMap: Record; - prevLocationMap: Record; -} -export interface GeoContainmentInstanceState extends AlertInstanceState { - location: number[]; - shapeLocationId: string; - dateInShape: string | null; - docId: string; -} -export interface GeoContainmentInstanceContext extends AlertInstanceContext { - entityId: string; - entityDateTime: string | null; - entityDocumentId: string; - detectionDateTime: string; - entityLocation: string; - // recovered alerts are not contained in boundary so context does not include boundary state - containingBoundaryId?: string; - containingBoundaryName?: unknown; -} - -export type GeoContainmentAlertType = RuleType< - GeoContainmentParams, - GeoContainmentExtractedParams, - GeoContainmentState, - GeoContainmentInstanceState, - GeoContainmentInstanceContext, - typeof ActionGroupId, - typeof RecoveryActionGroupId ->; - -export function extractEntityAndBoundaryReferences(params: GeoContainmentParams): { - params: GeoContainmentExtractedParams; +export function extractEntityAndBoundaryReferences(params: GeoContainmentRuleParams): { + params: GeoContainmentExtractedRuleParams; references: SavedObjectReference[]; } { const { indexId, boundaryIndexId, ...otherParams } = params; @@ -194,9 +134,9 @@ export function extractEntityAndBoundaryReferences(params: GeoContainmentParams) } export function injectEntityAndBoundaryIds( - params: GeoContainmentExtractedParams, + params: GeoContainmentExtractedRuleParams, references: SavedObjectReference[] -): GeoContainmentParams { +): GeoContainmentRuleParams { const { indexRefName, boundaryIndexRefName, ...otherParams } = params; const { id: indexId = null } = references.find((ref) => ref.name === indexRefName) || {}; const { id: boundaryIndexId = null } = @@ -211,10 +151,10 @@ export function injectEntityAndBoundaryIds( ...otherParams, indexId, boundaryIndexId, - } as GeoContainmentParams; + } as GeoContainmentRuleParams; } -export function getAlertType(): GeoContainmentAlertType { +export function getRuleType(): GeoContainmentRuleType { const alertTypeName = i18n.translate('xpack.stackAlerts.geoContainment.alertTypeTitle', { defaultMessage: 'Tracking containment', }); @@ -238,7 +178,7 @@ export function getAlertType(): GeoContainmentAlertType { }, doesSetRecoveryContext: true, defaultActionGroupId: ActionGroupId, - executor: getGeoContainmentExecutor(), + executor, producer: STACK_ALERTS_FEATURE_ID, validate: { params: ParamsSchema, @@ -248,12 +188,12 @@ export function getAlertType(): GeoContainmentAlertType { isExportable: true, useSavedObjectReferences: { extractReferences: ( - params: GeoContainmentParams - ): RuleParamsAndRefs => { + params: GeoContainmentRuleParams + ): RuleParamsAndRefs => { return extractEntityAndBoundaryReferences(params); }, injectReferences: ( - params: GeoContainmentExtractedParams, + params: GeoContainmentExtractedRuleParams, references: SavedObjectReference[] ) => { return injectEntityAndBoundaryIds(params, references); diff --git a/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/tests/es_sample_response_shapes.json b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/tests/es_sample_response_shapes.json index dfe5a8b7f6ec1..262d45c790992 100644 --- a/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/tests/es_sample_response_shapes.json +++ b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/tests/es_sample_response_shapes.json @@ -18,408 +18,57 @@ { "_index":"manhattan_boundaries", "_id":"waFXH3kBi9P-_6qn8c8A", - "_score":1, - "_source":{ - "coordinates":{ - "type":"Polygon", - "coordinates":[ - [ - [ - -73.96772861480713, - 40.76060200607076 - ], - [ - -73.96805047988892, - 40.7601631739201 - ], - [ - -73.96732091903687, - 40.7598706175435 - ], - [ - -73.96693468093872, - 40.760471982031845 - ], - [ - -73.96759986877441, - 40.76078078870895 - ], - [ - -73.96772861480713, - 40.76060200607076 - ] - ] - ] - } - } + "_score":1 }, { "_index":"manhattan_boundaries", "_id":"wqFXH3kBi9P-_6qn8c8A", - "_score":1, - "_source":{ - "coordinates":{ - "type":"Polygon", - "coordinates":[ - [ - [ - -73.97641897201538, - 40.75618104606283 - ], - [ - -73.97865056991577, - 40.75371038152863 - ], - [ - -73.97770643234252, - 40.75323899431278 - ], - [ - -73.9788007736206, - 40.75187357799962 - ], - [ - -73.97671937942503, - 40.751060816881505 - ], - [ - -73.97500276565552, - 40.75377540019266 - ], - [ - -73.97639751434325, - 40.75460438258571 - ], - [ - -73.9755392074585, - 40.755985996937774 - ], - [ - -73.97641897201538, - 40.75618104606283 - ] - ] - ] - } - } + "_score":1 }, { "_index":"manhattan_boundaries", "_id":"w6FXH3kBi9P-_6qn8c8A", - "_score":1, - "_source":{ - "coordinates":{ - "type":"Polygon", - "coordinates":[ - [ - [ - -73.98592472076415, - 40.75957805987928 - ], - [ - -73.98695468902588, - 40.75566091379097 - ], - [ - -73.98573160171509, - 40.75553088008716 - ], - [ - -73.98465871810913, - 40.75946428710659 - ], - [ - -73.98592472076415, - 40.75957805987928 - ] - ] - ] - } - } + "_score":1 }, { "_index":"manhattan_boundaries", "_id":"xKFXH3kBi9P-_6qn8c8A", - "_score":1, - "_source":{ - "coordinates":{ - "type":"Polygon", - "coordinates":[ - [ - [ - -73.9894437789917, - 40.75161349552273 - ], - [ - -73.98914337158203, - 40.75206863918968 - ], - [ - -73.99575233459473, - 40.75486445336327 - ], - [ - -73.99819850921631, - 40.75148345390278 - ], - [ - -73.9914608001709, - 40.74881754464601 - ], - [ - -73.9894437789917, - 40.75161349552273 - ] - ] - ] - } - } + "_score":1 }, { "_index":"manhattan_boundaries", "_id":"xaFXH3kBi9P-_6qn8c8A", - "_score":1, - "_source":{ - "coordinates":{ - "type":"Polygon", - "coordinates":[ - [ - [ - -73.96914482116699, - 40.75874913950493 - ], - [ - -73.96946668624878, - 40.758229027325804 - ], - [ - -73.96856546401978, - 40.75793646243674 - ], - [ - -73.96824359893799, - 40.75845657690492 - ], - [ - -73.96914482116699, - 40.75874913950493 - ] - ] - ] - } - } + "_score":1 }, { "_index":"manhattan_boundaries", "_id":"xqFXH3kBi9P-_6qn8c8A", - "_score":1, - "_source":{ - "coordinates":{ - "type":"Polygon", - "coordinates":[ - [ - [ - -73.96953105926514, - 40.7581640130173 - ], - [ - -73.9699387550354, - 40.75749761268889 - ], - [ - -73.96923065185547, - 40.75728631362887 - ], - [ - -73.96862983703613, - 40.757920208794026 - ], - [ - -73.96953105926514, - 40.7581640130173 - ] - ] - ] - } - } + "_score":1 }, { "_index":"manhattan_boundaries", "_id":"x6FXH3kBi9P-_6qn8c8A", - "_score":1, - "_source":{ - "coordinates":{ - "type":"Polygon", - "coordinates":[ - [ - [ - -73.97045373916626, - 40.75679869785023 - ], - [ - -73.97079706192015, - 40.75629482445485 - ], - [ - -73.96998167037964, - 40.756051013376364 - ], - [ - -73.96961688995361, - 40.756554888619675 - ], - [ - -73.97045373916626, - 40.75679869785023 - ] - ] - ] - } - } + "_score":1 }, { "_index":"manhattan_boundaries", "_id":"yKFXH3kBi9P-_6qn8c8A", - "_score":1, - "_source":{ - "coordinates":{ - "type":"Polygon", - "coordinates":[ - [ - [ - -73.98412227630615, - 40.75479943576424 - ], - [ - -73.98498058319092, - 40.75351532515499 - ], - [ - -73.98191213607788, - 40.75219867966512 - ], - [ - -73.9808177947998, - 40.75340154200611 - ], - [ - -73.98412227630615, - 40.75479943576424 - ] - ] - ] - } - } + "_score":1 }, { "_index":"manhattan_boundaries", "_id":"yaFXH3kBi9P-_6qn8c8A", - "_score":1, - "_source":{ - "coordinates":{ - "type":"Polygon", - "coordinates":[ - [ - [ - -73.99725437164307, - 40.74498104863726 - ], - [ - -74.00386333465576, - 40.736136757139285 - ], - [ - -73.99703979492188, - 40.73334015558748 - ], - [ - -73.9897871017456, - 40.74153451605774 - ], - [ - -73.99725437164307, - 40.74498104863726 - ] - ] - ] - } - } + "_score":1 }, { "_index":"manhattan_boundaries", "_id":"yqFXH3kBi9P-_6qn8c8A", - "_score":1, - "_source":{ - "coordinates":{ - "type":"Polygon", - "coordinates":[ - [ - [ - -73.98830652236938, - 40.75075196505171 - ], - [ - -73.9885640144348, - 40.74759834321152 - ], - [ - -73.98761987686157, - 40.747582087041366 - ], - [ - -73.98751258850098, - 40.74816730666263 - ], - [ - -73.98807048797607, - 40.74826484276548 - ], - [ - -73.9875340461731, - 40.75075196505171 - ], - [ - -73.98830652236938, - 40.75075196505171 - ] - ] - ] - } - } + "_score":1 }, { "_index":"manhattan_boundaries", "_id":"y6FXH3kBi9P-_6qn8c8A", - "_score":1, - "_source":{ - "coordinates":{ - "type":"Polygon", - "coordinates":[ - [ - [ - -73.9824914932251, - 40.7467692734681 - ], - [ - -73.98356437683105, - 40.7452411570555 - ], - [ - -73.9813756942749, - 40.74446082874893 - ], - [ - -73.98030281066895, - 40.745696344339564 - ], - [ - -73.9824914932251, - 40.7467692734681 - ] - ] - ] - } - } + "_score":1 } ] } diff --git a/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/tests/geo_containment.test.ts b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/tests/geo_containment.test.ts deleted file mode 100644 index 14ab96684ed63..0000000000000 --- a/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/tests/geo_containment.test.ts +++ /dev/null @@ -1,666 +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 _ from 'lodash'; -import { elasticsearchServiceMock } from '@kbn/core/server/mocks'; -import { RuleExecutorServicesMock, alertsMock } from '@kbn/alerting-plugin/server/mocks'; -import sampleAggsJsonResponse from './es_sample_response.json'; -import sampleShapesJsonResponse from './es_sample_response_shapes.json'; -import sampleAggsJsonResponseWithNesting from './es_sample_response_with_nesting.json'; -import { - getEntitiesAndGenerateAlerts, - transformResults, - getGeoContainmentExecutor, -} from '../geo_containment'; -import { OTHER_CATEGORY } from '../es_query_builder'; -import { GeoContainmentInstanceContext, GeoContainmentInstanceState } from '../alert_type'; -import type { GeoContainmentParams } from '../alert_type'; - -const alertFactory = (contextKeys: unknown[], testAlertActionArr: unknown[]) => ({ - create: (instanceId: string) => { - const alertInstance = alertsMock.createAlertFactory.create< - GeoContainmentInstanceState, - GeoContainmentInstanceContext - >(); - alertInstance.scheduleActions.mockImplementation( - (actionGroupId: string, context?: GeoContainmentInstanceContext) => { - // Check subset of alert for comparison to expected results - // @ts-ignore - const contextSubset = _.pickBy(context, (v, k) => contextKeys.includes(k)); - testAlertActionArr.push({ - actionGroupId, - instanceId, - context: contextSubset, - }); - } - ); - return alertInstance; - }, - alertLimit: { - getValue: () => 1000, - setLimitReached: () => {}, - }, - done: () => ({ getRecoveredAlerts: () => [] }), -}); - -describe('geo_containment', () => { - describe('transformResults', () => { - const dateField = '@timestamp'; - const geoField = 'location'; - it('should correctly transform expected results', async () => { - const transformedResults = transformResults( - // @ts-ignore - sampleAggsJsonResponse.body, - dateField, - geoField - ); - expect(transformedResults).toEqual( - new Map([ - [ - '0', - [ - { - dateInShape: '2021-04-28T16:56:11.923Z', - docId: 'ZVBoGXkBsFLYN2Tj1wmV', - location: [-73.99018926545978, 40.751759740523994], - shapeLocationId: 'kFATGXkBsFLYN2Tj6AAk', - }, - { - dateInShape: '2021-04-28T16:56:01.896Z', - docId: 'YlBoGXkBsFLYN2TjsAlp', - location: [-73.98968475870788, 40.7506317878142], - shapeLocationId: 'other', - }, - ], - ], - [ - '1', - [ - { - dateInShape: '2021-04-28T16:56:11.923Z', - docId: 'ZlBoGXkBsFLYN2Tj1wmV', - location: [-73.99561604484916, 40.75449890457094], - shapeLocationId: 'kFATGXkBsFLYN2Tj6AAk', - }, - { - dateInShape: '2021-04-28T16:56:01.896Z', - docId: 'Y1BoGXkBsFLYN2TjsAlp', - location: [-73.99459345266223, 40.755913141183555], - shapeLocationId: 'other', - }, - ], - ], - [ - '2', - [ - { - dateInShape: '2021-04-28T16:56:11.923Z', - docId: 'Z1BoGXkBsFLYN2Tj1wmV', - location: [-73.98662586696446, 40.7667087810114], - shapeLocationId: 'other', - }, - ], - ], - ]) - ); - }); - - const nestedDateField = 'time_data.@timestamp'; - const nestedGeoField = 'geo.coords.location'; - it('should correctly transform expected results if fields are nested', async () => { - const transformedResults = transformResults( - // @ts-ignore - sampleAggsJsonResponseWithNesting.body, - nestedDateField, - nestedGeoField - ); - expect(transformedResults).toEqual( - new Map([ - [ - '936', - [ - { - dateInShape: '2020-09-28T18:01:41.190Z', - docId: 'N-ng1XQB6yyY-xQxnGSM', - location: [-82.8814151789993, 40.62806099653244], - shapeLocationId: '0DrJu3QB6yyY-xQxv6Ip', - }, - ], - ], - [ - 'AAL2019', - [ - { - dateInShape: '2020-09-28T18:01:41.191Z', - docId: 'iOng1XQB6yyY-xQxnGSM', - location: [-82.22068064846098, 39.006176185794175], - shapeLocationId: '0DrJu3QB6yyY-xQxv6Ip', - }, - ], - ], - [ - 'AAL2323', - [ - { - dateInShape: '2020-09-28T18:01:41.191Z', - docId: 'n-ng1XQB6yyY-xQxnGSM', - location: [-84.71324851736426, 41.6677269525826], - shapeLocationId: '0DrJu3QB6yyY-xQxv6Ip', - }, - ], - ], - [ - 'ABD5250', - [ - { - dateInShape: '2020-09-28T18:01:41.192Z', - docId: 'GOng1XQB6yyY-xQxnGWM', - location: [6.073727197945118, 39.07997465226799], - shapeLocationId: '0DrJu3QB6yyY-xQxv6Ip', - }, - ], - ], - ]) - ); - }); - - it('should return an empty array if no results', async () => { - const transformedResults = transformResults(undefined, dateField, geoField); - expect(transformedResults).toEqual(new Map()); - }); - }); - - describe('getEntitiesAndGenerateAlerts', () => { - const testAlertActionArr: unknown[] = []; - beforeEach(() => { - jest.clearAllMocks(); - testAlertActionArr.length = 0; - }); - - const currLocationMap = new Map([ - [ - 'a', - [ - { - location: [0, 0], - shapeLocationId: '123', - dateInShape: 'Wed Dec 09 2020 14:31:31 GMT-0700 (Mountain Standard Time)', - docId: 'docId1', - }, - ], - ], - [ - 'b', - [ - { - location: [0, 0], - shapeLocationId: '456', - dateInShape: 'Wed Dec 16 2020 15:31:31 GMT-0700 (Mountain Standard Time)', - docId: 'docId2', - }, - ], - ], - [ - 'c', - [ - { - location: [0, 0], - shapeLocationId: '789', - dateInShape: 'Wed Dec 23 2020 16:31:31 GMT-0700 (Mountain Standard Time)', - docId: 'docId3', - }, - ], - ], - ]); - - const expectedAlertResults = [ - { - actionGroupId: 'Tracked entity contained', - context: { - containingBoundaryId: '123', - entityDocumentId: 'docId1', - entityId: 'a', - entityLocation: 'POINT (0 0)', - }, - instanceId: 'a-123', - }, - { - actionGroupId: 'Tracked entity contained', - context: { - containingBoundaryId: '456', - entityDocumentId: 'docId2', - entityId: 'b', - entityLocation: 'POINT (0 0)', - }, - instanceId: 'b-456', - }, - { - actionGroupId: 'Tracked entity contained', - context: { - containingBoundaryId: '789', - entityDocumentId: 'docId3', - entityId: 'c', - entityLocation: 'POINT (0 0)', - }, - instanceId: 'c-789', - }, - ]; - const contextKeys = Object.keys(expectedAlertResults[0].context); - const emptyShapesIdsNamesMap = {}; - - const currentDateTime = new Date(); - - it('should use currently active entities if no older entity entries', () => { - const emptyPrevLocationMap = new Map(); - const { activeEntities } = getEntitiesAndGenerateAlerts( - emptyPrevLocationMap, - currLocationMap, - alertFactory(contextKeys, testAlertActionArr), - emptyShapesIdsNamesMap, - currentDateTime - ); - expect(activeEntities).toEqual(currLocationMap); - expect(testAlertActionArr).toMatchObject(expectedAlertResults); - }); - - it('should overwrite older identical entity entries', () => { - const prevLocationMapWithIdenticalEntityEntry = new Map([ - [ - 'a', - [ - { - location: [0, 0], - shapeLocationId: '999', - dateInShape: 'Wed Dec 09 2020 12:31:31 GMT-0700 (Mountain Standard Time)', - docId: 'docId7', - }, - ], - ], - ]); - const { activeEntities } = getEntitiesAndGenerateAlerts( - prevLocationMapWithIdenticalEntityEntry, - currLocationMap, - alertFactory(contextKeys, testAlertActionArr), - emptyShapesIdsNamesMap, - currentDateTime - ); - expect(activeEntities).toEqual(currLocationMap); - expect(testAlertActionArr).toMatchObject(expectedAlertResults); - }); - - it('should preserve older non-identical entity entries', () => { - const prevLocationMapWithNonIdenticalEntityEntry = new Map([ - [ - 'd', - [ - { - location: [0, 0], - shapeLocationId: '999', - dateInShape: 'Wed Dec 09 2020 12:31:31 GMT-0700 (Mountain Standard Time)', - docId: 'docId7', - }, - ], - ], - ]); - const expectedAlertResultsPlusD = [ - { - actionGroupId: 'Tracked entity contained', - context: { - containingBoundaryId: '999', - entityDocumentId: 'docId7', - entityId: 'd', - entityLocation: 'POINT (0 0)', - }, - instanceId: 'd-999', - }, - ...expectedAlertResults, - ]; - - const { activeEntities } = getEntitiesAndGenerateAlerts( - prevLocationMapWithNonIdenticalEntityEntry, - currLocationMap, - alertFactory(contextKeys, testAlertActionArr), - emptyShapesIdsNamesMap, - currentDateTime - ); - expect(activeEntities).not.toEqual(currLocationMap); - expect(activeEntities.has('d')).toBeTruthy(); - expect(testAlertActionArr).toMatchObject(expectedAlertResultsPlusD); - }); - - it('should remove "other" entries and schedule the expected number of actions', () => { - const emptyPrevLocationMap = new Map(); - const currLocationMapWithOther = new Map([...currLocationMap]).set('d', [ - { - location: [0, 0], - shapeLocationId: OTHER_CATEGORY, - dateInShape: 'Wed Dec 09 2020 14:31:31 GMT-0700 (Mountain Standard Time)', - docId: 'docId1', - }, - ]); - expect(currLocationMapWithOther).not.toEqual(currLocationMap); - const { activeEntities, inactiveEntities } = getEntitiesAndGenerateAlerts( - emptyPrevLocationMap, - currLocationMapWithOther, - alertFactory(contextKeys, testAlertActionArr), - emptyShapesIdsNamesMap, - currentDateTime - ); - expect(activeEntities).toEqual(currLocationMap); - expect(inactiveEntities).toEqual( - new Map([ - [ - 'd', - [ - { - location: [0, 0], - shapeLocationId: 'other', - dateInShape: 'Wed Dec 09 2020 14:31:31 GMT-0700 (Mountain Standard Time)', - docId: 'docId1', - }, - ], - ], - ]) - ); - expect(testAlertActionArr).toMatchObject(expectedAlertResults); - }); - - it('should generate multiple alerts per entity if found in multiple shapes in interval', () => { - const emptyPrevLocationMap = new Map(); - const currLocationMapWithThreeMore = new Map([...currLocationMap]).set('d', [ - { - location: [0, 0], - shapeLocationId: '789', - dateInShape: 'Wed Dec 10 2020 14:31:31 GMT-0700 (Mountain Standard Time)', - docId: 'docId1', - }, - { - location: [0, 0], - shapeLocationId: '123', - dateInShape: 'Wed Dec 08 2020 12:31:31 GMT-0700 (Mountain Standard Time)', - docId: 'docId2', - }, - { - location: [0, 0], - shapeLocationId: '456', - dateInShape: 'Wed Dec 07 2020 10:31:31 GMT-0700 (Mountain Standard Time)', - docId: 'docId3', - }, - ]); - getEntitiesAndGenerateAlerts( - emptyPrevLocationMap, - currLocationMapWithThreeMore, - alertFactory(contextKeys, testAlertActionArr), - emptyShapesIdsNamesMap, - currentDateTime - ); - let numEntitiesInShapes = 0; - currLocationMapWithThreeMore.forEach((v) => { - numEntitiesInShapes += v.length; - }); - expect(testAlertActionArr.length).toEqual(numEntitiesInShapes); - }); - - it('should not return entity as active entry if most recent location is "other"', () => { - const emptyPrevLocationMap = new Map(); - const currLocationMapWithOther = new Map([...currLocationMap]).set('d', [ - { - location: [0, 0], - shapeLocationId: OTHER_CATEGORY, - dateInShape: 'Wed Dec 10 2020 14:31:31 GMT-0700 (Mountain Standard Time)', - docId: 'docId1', - }, - { - location: [0, 0], - shapeLocationId: '123', - dateInShape: 'Wed Dec 08 2020 12:31:31 GMT-0700 (Mountain Standard Time)', - docId: 'docId1', - }, - { - location: [0, 0], - shapeLocationId: '456', - dateInShape: 'Wed Dec 07 2020 10:31:31 GMT-0700 (Mountain Standard Time)', - docId: 'docId1', - }, - ]); - expect(currLocationMapWithOther).not.toEqual(currLocationMap); - const { activeEntities } = getEntitiesAndGenerateAlerts( - emptyPrevLocationMap, - currLocationMapWithOther, - alertFactory(contextKeys, testAlertActionArr), - emptyShapesIdsNamesMap, - currentDateTime - ); - expect(activeEntities).toEqual(currLocationMap); - }); - - it('should return entity as active entry if "other" not the latest location but remove "other" and earlier entries', () => { - const emptyPrevLocationMap = new Map(); - const currLocationMapWithOther = new Map([...currLocationMap]).set('d', [ - { - location: [0, 0], - shapeLocationId: '123', - dateInShape: 'Wed Dec 10 2020 14:31:31 GMT-0700 (Mountain Standard Time)', - docId: 'docId1', - }, - { - location: [0, 0], - shapeLocationId: OTHER_CATEGORY, - dateInShape: 'Wed Dec 08 2020 12:31:31 GMT-0700 (Mountain Standard Time)', - docId: 'docId1', - }, - { - location: [0, 0], - shapeLocationId: '456', - dateInShape: 'Wed Dec 07 2020 10:31:31 GMT-0700 (Mountain Standard Time)', - docId: 'docId1', - }, - ]); - const { activeEntities } = getEntitiesAndGenerateAlerts( - emptyPrevLocationMap, - currLocationMapWithOther, - alertFactory(contextKeys, testAlertActionArr), - emptyShapesIdsNamesMap, - currentDateTime - ); - expect(activeEntities).toEqual( - new Map([...currLocationMap]).set('d', [ - { - location: [0, 0], - shapeLocationId: '123', - dateInShape: 'Wed Dec 10 2020 14:31:31 GMT-0700 (Mountain Standard Time)', - docId: 'docId1', - }, - ]) - ); - }); - }); - - describe('getGeoContainmentExecutor', () => { - // Params needed for all tests - const expectedAlertResults = [ - { - actionGroupId: 'Tracked entity contained', - context: { - containingBoundaryId: 'kFATGXkBsFLYN2Tj6AAk', - entityDocumentId: 'ZVBoGXkBsFLYN2Tj1wmV', - entityId: '0', - entityLocation: 'POINT (-73.99018926545978 40.751759740523994)', - }, - instanceId: '0-kFATGXkBsFLYN2Tj6AAk', - }, - { - actionGroupId: 'Tracked entity contained', - context: { - containingBoundaryId: 'kFATGXkBsFLYN2Tj6AAk', - entityDocumentId: 'ZlBoGXkBsFLYN2Tj1wmV', - entityId: '1', - entityLocation: 'POINT (-73.99561604484916 40.75449890457094)', - }, - instanceId: '1-kFATGXkBsFLYN2Tj6AAk', - }, - ]; - const testAlertActionArr: unknown[] = []; - const previousStartedAt = new Date('2021-04-27T16:56:11.923Z'); - const startedAt = new Date('2021-04-29T16:56:11.923Z'); - const geoContainmentParams: GeoContainmentParams = { - index: 'testIndex', - indexId: 'testIndexId', - geoField: 'location', - entity: 'testEntity', - dateField: '@timestamp', - boundaryType: 'testBoundaryType', - boundaryIndexTitle: 'testBoundaryIndexTitle', - boundaryIndexId: 'testBoundaryIndexId', - boundaryGeoField: 'testBoundaryGeoField', - }; - const ruleId = 'testAlertId'; - const geoContainmentState = { - shapesFilters: { - testShape: 'thisIsAShape', - }, - shapesIdsNamesMap: {}, - prevLocationMap: {}, - }; - - // Boundary test mocks - const boundaryCall = jest.fn(); - const esAggCall = jest.fn(); - const contextKeys = Object.keys(expectedAlertResults[0].context); - const esClient = elasticsearchServiceMock.createElasticsearchClient(); - // @ts-ignore incomplete return type - esClient.search.mockResponseImplementation(({ index }) => { - if (index === geoContainmentParams.boundaryIndexTitle) { - boundaryCall(); - return sampleShapesJsonResponse; - } else { - esAggCall(); - return sampleAggsJsonResponse; - } - }); - - const alertServicesWithSearchMock: RuleExecutorServicesMock = { - ...alertsMock.createRuleExecutorServices(), - // @ts-ignore - alertFactory: alertFactory(contextKeys, testAlertActionArr), - // @ts-ignore - scopedClusterClient: { - asCurrentUser: esClient, - }, - }; - - beforeEach(() => { - jest.clearAllMocks(); - testAlertActionArr.length = 0; - }); - - it('should query for shapes if state does not contain shapes', async () => { - const executor = await getGeoContainmentExecutor(); - // @ts-ignore - const executionResult = await executor({ - previousStartedAt, - startedAt, - // @ts-ignore - services: alertServicesWithSearchMock, - params: geoContainmentParams, - // @ts-ignore - rule: { - id: ruleId, - }, - // @ts-ignore - state: {}, - }); - if (executionResult && executionResult.state.shapesFilters) { - expect(boundaryCall.mock.calls.length).toBe(1); - expect(esAggCall.mock.calls.length).toBe(1); - } - expect(testAlertActionArr).toMatchObject(expectedAlertResults); - }); - - it('should not query for shapes if state contains shapes', async () => { - const executor = await getGeoContainmentExecutor(); - // @ts-ignore - const executionResult = await executor({ - previousStartedAt, - startedAt, - // @ts-ignore - services: alertServicesWithSearchMock, - params: geoContainmentParams, - // @ts-ignore - rule: { - id: ruleId, - }, - state: geoContainmentState, - }); - if (executionResult && executionResult.state.shapesFilters) { - expect(boundaryCall.mock.calls.length).toBe(0); - expect(esAggCall.mock.calls.length).toBe(1); - } - expect(testAlertActionArr).toMatchObject(expectedAlertResults); - }); - - it('should carry through shapes filters in state to next call unmodified', async () => { - const executor = await getGeoContainmentExecutor(); - // @ts-ignore - const executionResult = await executor({ - previousStartedAt, - startedAt, - // @ts-ignore - services: alertServicesWithSearchMock, - params: geoContainmentParams, - // @ts-ignore - rule: { - id: ruleId, - }, - state: geoContainmentState, - }); - if (executionResult && executionResult.state.shapesFilters) { - expect(executionResult.state.shapesFilters).toEqual(geoContainmentState.shapesFilters); - } - expect(testAlertActionArr).toMatchObject(expectedAlertResults); - }); - - it('should return previous locations map', async () => { - const expectedPrevLocationMap = { - '0': [ - { - dateInShape: '2021-04-28T16:56:11.923Z', - docId: 'ZVBoGXkBsFLYN2Tj1wmV', - location: [-73.99018926545978, 40.751759740523994], - shapeLocationId: 'kFATGXkBsFLYN2Tj6AAk', - }, - ], - '1': [ - { - dateInShape: '2021-04-28T16:56:11.923Z', - docId: 'ZlBoGXkBsFLYN2Tj1wmV', - location: [-73.99561604484916, 40.75449890457094], - shapeLocationId: 'kFATGXkBsFLYN2Tj6AAk', - }, - ], - }; - const executor = await getGeoContainmentExecutor(); - // @ts-ignore - const executionResult = await executor({ - previousStartedAt, - startedAt, - // @ts-ignore - services: alertServicesWithSearchMock, - params: geoContainmentParams, - // @ts-ignore - rule: { - id: ruleId, - }, - state: geoContainmentState, - }); - if (executionResult && executionResult.state.prevLocationMap) { - expect(executionResult.state.prevLocationMap).toEqual(expectedPrevLocationMap); - } - expect(testAlertActionArr).toMatchObject(expectedAlertResults); - }); - }); -}); diff --git a/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/types.ts b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/types.ts new file mode 100644 index 0000000000000..236688d504efe --- /dev/null +++ b/x-pack/plugins/stack_alerts/server/rule_types/geo_containment/types.ts @@ -0,0 +1,82 @@ +/* + * 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 { Query } from '@kbn/data-plugin/common/query'; +import { + RuleType, + RuleTypeState, + AlertInstanceState, + AlertInstanceContext, + RuleTypeParams, +} from '@kbn/alerting-plugin/server'; +import { ActionGroupId, RecoveryActionGroupId } from './constants'; + +export interface BoundariesRequestMeta { + geoField: string; + boundaryIndexTitle: string; + boundaryGeoField: string; + boundaryNameField?: string; + boundaryIndexQuery?: Query; +} + +export interface GeoContainmentRuleParams extends RuleTypeParams { + index: string; + indexId: string; + geoField: string; + entity: string; + dateField: string; + boundaryType: string; + boundaryIndexTitle: string; + boundaryIndexId: string; + boundaryGeoField: string; + boundaryNameField?: string; + indexQuery?: Query; + boundaryIndexQuery?: Query; +} + +export type GeoContainmentExtractedRuleParams = Omit< + GeoContainmentRuleParams, + 'indexId' | 'boundaryIndexId' +> & { + indexRefName: string; + boundaryIndexRefName: string; +}; + +export interface GeoContainmentRuleState extends RuleTypeState { + boundariesRequestMeta?: BoundariesRequestMeta; + shapesFilters: Record; + shapesIdsNamesMap: Record; + prevLocationMap: Record; +} + +export interface GeoContainmentAlertInstanceState extends AlertInstanceState { + location: number[]; + shapeLocationId: string; + dateInShape: string | null; + docId: string; +} + +export interface GeoContainmentAlertInstanceContext extends AlertInstanceContext { + entityId: string; + entityDateTime: string | null; + entityDocumentId: string; + detectionDateTime: string; + entityLocation: string; + // recovered alerts are not contained in boundary so context does not include boundary state + containingBoundaryId?: string; + containingBoundaryName?: unknown; +} + +export type GeoContainmentRuleType = RuleType< + GeoContainmentRuleParams, + GeoContainmentExtractedRuleParams, + GeoContainmentRuleState, + GeoContainmentAlertInstanceState, + GeoContainmentAlertInstanceContext, + typeof ActionGroupId, + typeof RecoveryActionGroupId +>; diff --git a/x-pack/plugins/stack_alerts/server/rule_types/index.ts b/x-pack/plugins/stack_alerts/server/rule_types/index.ts index a9a2e15dbcb1c..5bc7f4cc1c7d5 100644 --- a/x-pack/plugins/stack_alerts/server/rule_types/index.ts +++ b/x-pack/plugins/stack_alerts/server/rule_types/index.ts @@ -5,17 +5,10 @@ * 2.0. */ -import { CoreSetup, Logger } from '@kbn/core/server'; -import { AlertingSetup, StackAlertsStartDeps } from '../types'; +import type { RegisterRuleTypesParams } from './types'; import { register as registerIndexThreshold } from './index_threshold'; import { register as registerGeoContainment } from './geo_containment'; import { register as registerEsQuery } from './es_query'; -interface RegisterRuleTypesParams { - logger: Logger; - data: Promise; - alerting: AlertingSetup; - core: CoreSetup; -} export function registerBuiltInRuleTypes(params: RegisterRuleTypesParams) { registerIndexThreshold(params); diff --git a/x-pack/plugins/stack_alerts/server/rule_types/index_threshold/index.ts b/x-pack/plugins/stack_alerts/server/rule_types/index_threshold/index.ts index dbae7907dd9f6..99adda4420e46 100644 --- a/x-pack/plugins/stack_alerts/server/rule_types/index_threshold/index.ts +++ b/x-pack/plugins/stack_alerts/server/rule_types/index_threshold/index.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { AlertingSetup, StackAlertsStartDeps } from '../../types'; +import type { RegisterRuleTypesParams } from '../types'; import { getRuleType } from './rule_type'; // future enhancement: make these configurable? @@ -13,12 +13,7 @@ export const MAX_INTERVALS = 1000; export const MAX_GROUPS = 1000; export const DEFAULT_GROUPS = 100; -interface RegisterParams { - data: Promise; - alerting: AlertingSetup; -} - -export function register(params: RegisterParams) { +export function register(params: RegisterRuleTypesParams) { const { data, alerting } = params; alerting.registerType(getRuleType(data)); } diff --git a/x-pack/plugins/stack_alerts/server/rule_types/types.ts b/x-pack/plugins/stack_alerts/server/rule_types/types.ts new file mode 100644 index 0000000000000..ea9352f281b84 --- /dev/null +++ b/x-pack/plugins/stack_alerts/server/rule_types/types.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { CoreSetup, Logger } from '@kbn/core/server'; +import { AlertingSetup, StackAlertsStartDeps } from '../types'; + +export interface RegisterRuleTypesParams { + logger: Logger; + data: Promise; + alerting: AlertingSetup; + core: CoreSetup; +} From e850ef1ad350969417b2b7b275448af22b0833d6 Mon Sep 17 00:00:00 2001 From: Xavier Mouligneau Date: Wed, 17 May 2023 08:42:45 -0400 Subject: [PATCH 08/78] Fix issue with single value for fields params (#157930) ## Summary The interface for fields allow array of string see below but the validation with `@kbn/config-schema` only allow string. This will allow to pass fields as array. image ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --- .../server/routes/fields_for.test.ts | 10 +- .../data_views/server/routes/fields_for.ts | 20 +-- .../fields_for_wildcard_route/params.js | 121 ++++++++++++------ 3 files changed, 101 insertions(+), 50 deletions(-) diff --git a/src/plugins/data_views/server/routes/fields_for.test.ts b/src/plugins/data_views/server/routes/fields_for.test.ts index 57d1465f8a9ee..91d30ff629969 100644 --- a/src/plugins/data_views/server/routes/fields_for.test.ts +++ b/src/plugins/data_views/server/routes/fields_for.test.ts @@ -6,20 +6,20 @@ * Side Public License, v 1. */ -import { parseMetaFields } from './fields_for'; +import { parseFields } from './fields_for'; describe('_fields_for_wildcard', () => { describe('parseMetaFields', () => { it('should throw if receiving a string of comma-separated values', () => { const value = '_source,_id'; - expect(() => parseMetaFields(value)).toThrowErrorMatchingInlineSnapshot( + expect(() => parseFields(value)).toThrowErrorMatchingInlineSnapshot( `"metaFields should be an array of field names, a JSON-stringified array of field names, or a single field name"` ); }); it('should parse a stringified list of values', () => { const value = JSON.stringify(['_source', '_id']); - const fields = parseMetaFields(value); + const fields = parseFields(value); expect(fields).toMatchInlineSnapshot(` Array [ "_source", @@ -30,7 +30,7 @@ describe('_fields_for_wildcard', () => { it('should wrap a single value in an array', () => { const value = '_source'; - const fields = parseMetaFields(value); + const fields = parseFields(value); expect(fields).toMatchInlineSnapshot(` Array [ "_source", @@ -40,7 +40,7 @@ describe('_fields_for_wildcard', () => { it('should return the array if already an array', () => { const value = ['_source', '_id']; - const fields = parseMetaFields(value); + const fields = parseFields(value); expect(fields).toMatchInlineSnapshot(` Array [ "_source", diff --git a/src/plugins/data_views/server/routes/fields_for.ts b/src/plugins/data_views/server/routes/fields_for.ts index 8719fd5ce7549..2d12eb53930b0 100644 --- a/src/plugins/data_views/server/routes/fields_for.ts +++ b/src/plugins/data_views/server/routes/fields_for.ts @@ -23,14 +23,14 @@ import type { DataViewsServerPluginStart, DataViewsServerPluginStartDependencies * 2. A JSON-stringified array of field names * 3. A single field name (not comma-separated) * @returns an array of field names - * @param metaFields + * @param fields */ -export const parseMetaFields = (metaFields: string | string[]): string[] => { - if (Array.isArray(metaFields)) return metaFields; +export const parseFields = (fields: string | string[]): string[] => { + if (Array.isArray(fields)) return fields; try { - return JSON.parse(metaFields); + return JSON.parse(fields); } catch (e) { - if (!metaFields.includes(',')) return [metaFields]; + if (!fields.includes(',')) return [fields]; throw new Error( 'metaFields should be an array of field names, a JSON-stringified array of field names, or a single field name' ); @@ -60,7 +60,7 @@ const validate: RouteValidatorFullConfig<{}, IQuery, IBody> = { rollup_index: schema.maybe(schema.string()), allow_no_index: schema.maybe(schema.boolean()), include_unmapped: schema.maybe(schema.boolean()), - fields: schema.maybe(schema.arrayOf(schema.string())), + fields: schema.maybe(schema.oneOf([schema.string(), schema.arrayOf(schema.string())])), }), // not available to get request body: schema.maybe(schema.object({ index_filter: schema.any() })), @@ -81,8 +81,10 @@ const handler: RequestHandler<{}, IQuery, IBody> = async (context, request, resp const indexFilter = request.body?.index_filter; let parsedFields: string[] = []; + let parsedMetaFields: string[] = []; try { - parsedFields = parseMetaFields(metaFields); + parsedMetaFields = parseFields(metaFields); + parsedFields = parseFields(request.query.fields ?? []); } catch (error) { return response.badRequest(); } @@ -90,7 +92,7 @@ const handler: RequestHandler<{}, IQuery, IBody> = async (context, request, resp try { const { fields, indices } = await indexPatterns.getFieldsForWildcard({ pattern, - metaFields: parsedFields, + metaFields: parsedMetaFields, type, rollupIndex, fieldCapsOptions: { @@ -98,7 +100,7 @@ const handler: RequestHandler<{}, IQuery, IBody> = async (context, request, resp includeUnmapped, }, indexFilter, - fields: request.query.fields, + ...(parsedFields.length > 0 ? { fields: parsedFields } : {}), }); return response.ok({ diff --git a/test/api_integration/apis/data_views/fields_for_wildcard_route/params.js b/test/api_integration/apis/data_views/fields_for_wildcard_route/params.js index 595d12f38c501..b4ac2228907b7 100644 --- a/test/api_integration/apis/data_views/fields_for_wildcard_route/params.js +++ b/test/api_integration/apis/data_views/fields_for_wildcard_route/params.js @@ -22,15 +22,6 @@ export default function ({ getService }) { it('requires a pattern query param', () => supertest.get('/api/index_patterns/_fields_for_wildcard').query({}).expect(400)); - it('accepts a JSON formatted meta_fields query param', () => - supertest - .get('/api/index_patterns/_fields_for_wildcard') - .query({ - pattern: '*', - meta_fields: JSON.stringify(['meta']), - }) - .expect(200)); - it('accepts include_unmapped param', () => supertest .get('/api/index_patterns/_fields_for_wildcard') @@ -40,33 +31,6 @@ export default function ({ getService }) { }) .expect(200)); - it('accepts meta_fields query param in string array', () => - supertest - .get('/api/index_patterns/_fields_for_wildcard') - .query({ - pattern: '*', - meta_fields: ['_id', 'meta'], - }) - .expect(200)); - - it('accepts single meta_fields query param', () => - supertest - .get('/api/index_patterns/_fields_for_wildcard') - .query({ - pattern: '*', - meta_fields: ['_id'], - }) - .expect(200)); - - it('rejects a comma-separated list of meta_fields', () => - supertest - .get('/api/index_patterns/_fields_for_wildcard') - .query({ - pattern: '*', - meta_fields: 'foo,bar', - }) - .expect(400)); - it('rejects unexpected query params', () => supertest .get('/api/index_patterns/_fields_for_wildcard') @@ -75,5 +39,90 @@ export default function ({ getService }) { [randomness.word()]: randomness.word(), }) .expect(400)); + + describe('fields', () => { + it('accepts a JSON formatted fields query param', () => + supertest + .get('/api/index_patterns/_fields_for_wildcard') + .query({ + pattern: '*', + fields: JSON.stringify(['baz']), + }) + .expect(200)); + + it('accepts meta_fields query param in string array', () => + supertest + .get('/api/index_patterns/_fields_for_wildcard') + .query({ + pattern: '*', + fields: ['baz', 'foo'], + }) + .expect(200)); + + it('accepts single array fields query param', () => + supertest + .get('/api/index_patterns/_fields_for_wildcard') + .query({ + pattern: '*', + fields: ['baz'], + }) + .expect(200)); + + it('accepts single fields query param', () => + supertest + .get('/api/index_patterns/_fields_for_wildcard') + .query({ + pattern: '*', + fields: 'baz', + }) + .expect(200)); + + it('rejects a comma-separated list of fields', () => + supertest + .get('/api/index_patterns/_fields_for_wildcard') + .query({ + pattern: '*', + fields: 'foo,bar', + }) + .expect(400)); + }); + + describe('meta_fields', () => { + it('accepts a JSON formatted meta_fields query param', () => + supertest + .get('/api/index_patterns/_fields_for_wildcard') + .query({ + pattern: '*', + meta_fields: JSON.stringify(['meta']), + }) + .expect(200)); + + it('accepts meta_fields query param in string array', () => + supertest + .get('/api/index_patterns/_fields_for_wildcard') + .query({ + pattern: '*', + meta_fields: ['_id', 'meta'], + }) + .expect(200)); + + it('accepts single meta_fields query param', () => + supertest + .get('/api/index_patterns/_fields_for_wildcard') + .query({ + pattern: '*', + meta_fields: ['_id'], + }) + .expect(200)); + + it('rejects a comma-separated list of meta_fields', () => + supertest + .get('/api/index_patterns/_fields_for_wildcard') + .query({ + pattern: '*', + meta_fields: 'foo,bar', + }) + .expect(400)); + }); }); } From 68f2c77846d329138796ce0efa064aff5bc8ff92 Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Wed, 17 May 2023 06:58:25 -0600 Subject: [PATCH 09/78] Adding Copy JSON to Clipboard for SLO form (#157902) ## Summary This PR introduces a new button at the end of the Service Level Objective (SLO) creation/editing form. This feature empowers Site Reliability Engineers (SREs) to easily copy the JSON output, facilitating its integration into a code-based system. image --------- Co-authored-by: Kevin Delemme --- .../slo_edit/components/slo_edit_form.tsx | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) diff --git a/x-pack/plugins/observability/public/pages/slo_edit/components/slo_edit_form.tsx b/x-pack/plugins/observability/public/pages/slo_edit/components/slo_edit_form.tsx index 5fe44bc19d770..bbca62eb9d2f0 100644 --- a/x-pack/plugins/observability/public/pages/slo_edit/components/slo_edit_form.tsx +++ b/x-pack/plugins/observability/public/pages/slo_edit/components/slo_edit_form.tsx @@ -10,6 +10,7 @@ import { FormProvider, useForm } from 'react-hook-form'; import { useLocation, useHistory } from 'react-router-dom'; import { EuiButton, + EuiButtonEmpty, EuiCheckbox, EuiFlexGroup, EuiIconTip, @@ -49,6 +50,7 @@ const CREATE_RULE_SEARCH_PARAM = 'create-rule'; export function SloEditForm({ slo }: Props) { const { + notifications, application: { navigateToUrl }, http: { basePath }, triggersActionsUi: { getAddRuleFlyout: AddRuleFlyout }, @@ -111,6 +113,35 @@ export function SloEditForm({ slo }: Props) { const { mutateAsync: createSlo, isLoading: isCreateSloLoading } = useCreateSlo(); const { mutateAsync: updateSlo, isLoading: isUpdateSloLoading } = useUpdateSlo(); + const handleCopyToJson = async () => { + const isValid = await trigger(); + if (!isValid) { + return; + } + const values = transformValuesToCreateSLOInput(getValues()); + try { + await copyTextToClipboard(JSON.stringify(values, null, 2)); + notifications.toasts.add({ + title: i18n.translate('xpack.observability.slo.sloEdit.copyJsonNotification', { + defaultMessage: 'JSON copied to clipboard', + }), + }); + } catch (e) { + notifications.toasts.add({ + title: i18n.translate('xpack.observability.slo.sloEdit.copyJsonFailedNotification', { + defaultMessage: 'Could not copy JSON to clipboard', + }), + }); + } + }; + + const copyTextToClipboard = async (text: string) => { + if (!window.navigator?.clipboard) { + throw new Error('Could not copy to clipboard!'); + } + await window.navigator.clipboard.writeText(text); + }; + const handleSubmit = async () => { const isValid = await trigger(); if (!isValid) { @@ -252,6 +283,18 @@ export function SloEditForm({ slo }: Props) { defaultMessage: 'Cancel', })} + + + {i18n.translate('xpack.observability.slo.sloEdit.copyJsonButton', { + defaultMessage: 'Copy JSON', + })} + From 9abdd90b1256937cdf87e06faedf8c1bdfbda4cd Mon Sep 17 00:00:00 2001 From: Tomasz Ciecierski Date: Wed, 17 May 2023 15:02:58 +0200 Subject: [PATCH 10/78] [Defend workflows] Replace differenceWith with xorWith and remove the helper (#157966) --- .../rule_management/utils/utils.ts | 15 --------------- .../rule_management/utils/validate.ts | 11 +++++++---- 2 files changed, 7 insertions(+), 19 deletions(-) diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/utils/utils.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/utils/utils.ts index ef93a79091937..0e8d52e4ce84e 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/utils/utils.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/utils/utils.ts @@ -6,7 +6,6 @@ */ import { partition } from 'lodash/fp'; -import { differenceWith, isEqual } from 'lodash'; import pMap from 'p-map'; import { v4 as uuidv4 } from 'uuid'; @@ -385,17 +384,3 @@ export const convertAlertSuppressionToSnake = ( missing_fields_strategy: input.missingFieldsStrategy, } : undefined; - -export const findDifferenceInArrays = ( - arr1: T1[] = [], - arr2: T2[] = [] -): Array => { - if (arr1.length === 0) { - return arr2; - } - - if (arr2.length === 0) { - return arr1; - } - return differenceWith(arr1, arr2, isEqual); -}; diff --git a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/utils/validate.ts b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/utils/validate.ts index 0cd91fe050da2..4544a735c960f 100644 --- a/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/utils/validate.ts +++ b/x-pack/plugins/security_solution/server/lib/detection_engine/rule_management/utils/validate.ts @@ -9,6 +9,7 @@ import { validateNonExact } from '@kbn/securitysolution-io-ts-utils'; import type { PartialRule } from '@kbn/alerting-plugin/server'; import type { Rule } from '@kbn/alerting-plugin/common'; +import { isEqual, xorWith } from 'lodash'; import { RESPONSE_ACTION_API_COMMANDS_TO_CONSOLE_COMMAND_MAP, RESPONSE_CONSOLE_ACTION_COMMANDS_TO_REQUIRED_AUTHZ, @@ -26,7 +27,7 @@ import type { RuleParams, RuleAlertType, UnifiedQueryRuleParams } from '../../ru import { isAlertType } from '../../rule_schema'; import type { BulkError } from '../../routes/utils'; import { createBulkErrorObject } from '../../routes/utils'; -import { findDifferenceInArrays, transform } from './utils'; +import { transform } from './utils'; import { internalRuleToAPIResponse } from '../normalization/rule_converters'; import type { ResponseAction, @@ -95,12 +96,14 @@ export const validateResponseActionsPermissions = async ( const endpointAuthz = await securitySolution.getEndpointAuthz(); - const differences = findDifferenceInArrays( + // finds elements that are not included in both arrays + const symmetricDifference = xorWith( ruleUpdate.response_actions, - existingRule?.params?.responseActions + existingRule?.params?.responseActions, + isEqual ); - differences.forEach((action) => { + symmetricDifference.forEach((action) => { if (!('command' in action?.params)) { return; } From 4d03615b1cae291b24452a8911e4b2e6814f0392 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20Haro?= Date: Wed, 17 May 2023 15:11:49 +0200 Subject: [PATCH 11/78] Add Shahin as a FS config codeowner (#157903) --- .github/CODEOWNERS | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index d636034aa5e6c..5917e1265f66d 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -954,6 +954,7 @@ x-pack/test/observability_functional @elastic/actionable-observability /x-pack/.telemetryrc.json @elastic/kibana-core /src/plugins/telemetry/schema/ @elastic/kibana-core @elastic/kibana-telemetry /x-pack/plugins/telemetry_collection_xpack/schema/ @elastic/kibana-core @elastic/kibana-telemetry +x-pack/plugins/cloud_integrations/cloud_full_story/server/config.ts @elastic/kibana-core @elastic/kibana-telemetry @shahinakmal # Kibana Localization /src/dev/i18n/ @elastic/kibana-localization @elastic/kibana-core From 58be0c92f52f8f5c6ded9b08ccdcf72c96766a62 Mon Sep 17 00:00:00 2001 From: Steph Milovic Date: Wed, 17 May 2023 07:24:01 -0600 Subject: [PATCH 12/78] [Security solution] Grouping test label cleanup (#157936) --- .../src/components/grouping.tsx | 2 +- .../alerts_table/alerts_grouping.test.tsx | 92 +++++++++---------- 2 files changed, 43 insertions(+), 51 deletions(-) diff --git a/packages/kbn-securitysolution-grouping/src/components/grouping.tsx b/packages/kbn-securitysolution-grouping/src/components/grouping.tsx index 068b0f7a42ef6..aab42a0804e4c 100644 --- a/packages/kbn-securitysolution-grouping/src/components/grouping.tsx +++ b/packages/kbn-securitysolution-grouping/src/components/grouping.tsx @@ -101,7 +101,7 @@ const GroupingComponent = ({ : undefined; return ( - + { const actual = jest.requireActual('./grouping_settings'); @@ -210,15 +210,14 @@ describe('GroupedAlertsTable', () => { .spyOn(window.localStorage, 'getItem') .mockReturnValue(getMockStorageState(['kibana.alert.rule.name'])); - const { getAllByTestId } = render( + const { getByTestId } = render( ); - fireEvent.click(getAllByTestId('group-panel-toggle')[0]); - const level0 = getAllByTestId('grouping-accordion-content')[0]; - expect(within(level0).getByTestId('alerts-table')).toBeInTheDocument(); + fireEvent.click(within(getByTestId('level-0-group-0')).getByTestId('group-panel-toggle')); + expect(within(getByTestId('level-0-group-0')).getByTestId('alerts-table')).toBeInTheDocument(); }); it('Query gets passed correctly', () => { @@ -244,19 +243,17 @@ describe('GroupedAlertsTable', () => { .spyOn(window.localStorage, 'getItem') .mockReturnValue(getMockStorageState(['kibana.alert.rule.name', 'host.name'])); - const { getAllByTestId } = render( + const { getByTestId } = render( ); - fireEvent.click(getAllByTestId('group-panel-toggle')[0]); - - const level0 = getAllByTestId('grouping-accordion-content')[0]; - expect(within(level0).queryByTestId('alerts-table')).not.toBeInTheDocument(); - - fireEvent.click(within(level0).getAllByTestId('group-panel-toggle')[0]); - const level1 = within(getAllByTestId('grouping-accordion-content')[1]); - expect(level1.getByTestId('alerts-table')).toBeInTheDocument(); + fireEvent.click(within(getByTestId('level-0-group-0')).getByTestId('group-panel-toggle')); + expect( + within(getByTestId('level-0-group-0')).queryByTestId('alerts-table') + ).not.toBeInTheDocument(); + fireEvent.click(within(getByTestId('level-1-group-0')).getByTestId('group-panel-toggle')); + expect(within(getByTestId('level-1-group-0')).getByTestId('alerts-table')).toBeInTheDocument(); }); it('resets all levels pagination when selected group changes', () => { @@ -271,14 +268,12 @@ describe('GroupedAlertsTable', () => { ); fireEvent.click(getByTestId('pagination-button-1')); - fireEvent.click(getAllByTestId('group-panel-toggle')[0]); + fireEvent.click(within(getByTestId('level-0-group-0')).getByTestId('group-panel-toggle')); - const level0 = getAllByTestId('grouping-accordion-content')[0]; - fireEvent.click(within(level0).getByTestId('pagination-button-1')); - fireEvent.click(within(level0).getAllByTestId('group-panel-toggle')[0]); + fireEvent.click(within(getByTestId('level-0-group-0')).getByTestId('pagination-button-1')); + fireEvent.click(within(getByTestId('level-1-group-0')).getByTestId('group-panel-toggle')); - const level1 = getAllByTestId('grouping-accordion-content')[1]; - fireEvent.click(within(level1).getByTestId('pagination-button-1')); + fireEvent.click(within(getByTestId('level-1-group-0')).getByTestId('pagination-button-1')); [ getByTestId('grouping-level-0-pagination'), @@ -315,21 +310,17 @@ describe('GroupedAlertsTable', () => { .spyOn(window.localStorage, 'getItem') .mockReturnValue(getMockStorageState(['kibana.alert.rule.name', 'host.name', 'user.name'])); - const { getByTestId, getAllByTestId, rerender } = render( + const { getByTestId, rerender } = render( ); fireEvent.click(getByTestId('pagination-button-1')); - fireEvent.click(getAllByTestId('group-panel-toggle')[0]); - - const level0 = getAllByTestId('grouping-accordion-content')[0]; - fireEvent.click(within(level0).getByTestId('pagination-button-1')); - fireEvent.click(within(level0).getAllByTestId('group-panel-toggle')[0]); - - const level1 = getAllByTestId('grouping-accordion-content')[1]; - fireEvent.click(within(level1).getByTestId('pagination-button-1')); + fireEvent.click(within(getByTestId('level-0-group-0')).getByTestId('group-panel-toggle')); + fireEvent.click(within(getByTestId('level-0-group-0')).getByTestId('pagination-button-1')); + fireEvent.click(within(getByTestId('level-1-group-0')).getByTestId('group-panel-toggle')); + fireEvent.click(within(getByTestId('level-1-group-0')).getByTestId('pagination-button-1')); rerender( @@ -358,23 +349,28 @@ describe('GroupedAlertsTable', () => { .spyOn(window.localStorage, 'getItem') .mockReturnValue(getMockStorageState(['kibana.alert.rule.name', 'host.name', 'user.name'])); - const { getByTestId, getAllByTestId } = render( + const { getByTestId } = render( ); + // set level 0 page to 2 fireEvent.click(getByTestId('pagination-button-1')); - fireEvent.click(getAllByTestId('group-panel-toggle')[0]); + fireEvent.click(within(getByTestId('level-0-group-0')).getByTestId('group-panel-toggle')); - const level0 = getAllByTestId('grouping-accordion-content')[0]; - fireEvent.click(within(level0).getByTestId('pagination-button-1')); - fireEvent.click(within(level0).getAllByTestId('group-panel-toggle')[0]); + // set level 1 page to 2 + fireEvent.click(within(getByTestId('level-0-group-0')).getByTestId('pagination-button-1')); + fireEvent.click(within(getByTestId('level-1-group-0')).getByTestId('group-panel-toggle')); - const level1 = getAllByTestId('grouping-accordion-content')[1]; - fireEvent.click(within(level1).getByTestId('pagination-button-1')); + // set level 2 page to 2 + fireEvent.click(within(getByTestId('level-1-group-0')).getByTestId('pagination-button-1')); + fireEvent.click(within(getByTestId('level-2-group-0')).getByTestId('group-panel-toggle')); - fireEvent.click(within(level0).getAllByTestId('group-panel-toggle')[28]); + // open different level 1 group + + // level 0, 1 pagination is the same + fireEvent.click(within(getByTestId('level-1-group-1')).getByTestId('group-panel-toggle')); [ getByTestId('grouping-level-0-pagination'), getByTestId('grouping-level-1-pagination'), @@ -387,6 +383,7 @@ describe('GroupedAlertsTable', () => { ).toEqual('true'); }); + // level 2 pagination is reset expect( within(getByTestId('grouping-level-2-pagination')) .getByTestId('pagination-button-0') @@ -411,11 +408,10 @@ describe('GroupedAlertsTable', () => { ); fireEvent.click(getByTestId('pagination-button-1')); - fireEvent.click(getAllByTestId('group-panel-toggle')[0]); + fireEvent.click(within(getByTestId('level-0-group-0')).getByTestId('group-panel-toggle')); - const level0 = getAllByTestId('grouping-accordion-content')[0]; - fireEvent.click(within(level0).getByTestId('pagination-button-1')); - fireEvent.click(within(level0).getAllByTestId('group-panel-toggle')[0]); + fireEvent.click(within(getByTestId('level-0-group-0')).getByTestId('pagination-button-1')); + fireEvent.click(within(getByTestId('level-1-group-0')).getByTestId('group-panel-toggle')); const level1 = getAllByTestId('grouping-accordion-content')[1]; fireEvent.click(within(level1).getByTestId('pagination-button-1')); @@ -456,17 +452,13 @@ describe('GroupedAlertsTable', () => { ); fireEvent.click(getByTestId('pagination-button-1')); - fireEvent.click(getAllByTestId('group-panel-toggle')[0]); + fireEvent.click(within(getByTestId('level-0-group-0')).getByTestId('group-panel-toggle')); - const level0 = getAllByTestId('grouping-accordion-content')[0]; - fireEvent.click(within(level0).getByTestId('pagination-button-1')); - fireEvent.click(within(level0).getAllByTestId('group-panel-toggle')[0]); + fireEvent.click(within(getByTestId('level-0-group-0')).getByTestId('pagination-button-1')); + fireEvent.click(within(getByTestId('level-1-group-0')).getByTestId('group-panel-toggle')); - const level1 = getAllByTestId('grouping-accordion-content')[1]; - fireEvent.click(within(level1).getByTestId('pagination-button-1')); - const tablePaginations = within(getByTestId('grouping-level-0')).getAllByTestId( - 'tablePaginationPopoverButton' - ); + fireEvent.click(within(getByTestId('level-1-group-0')).getByTestId('pagination-button-1')); + const tablePaginations = getAllByTestId('tablePaginationPopoverButton'); fireEvent.click(tablePaginations[tablePaginations.length - 1]); fireEvent.click(getByTestId('tablePagination-100-rows')); From 71125b192e86ddc3d6747c5b14b92e669eba360f Mon Sep 17 00:00:00 2001 From: Gerard Soldevila Date: Wed, 17 May 2023 15:34:51 +0200 Subject: [PATCH 13/78] [Migrations] Systematically wait for newly created indices to turn green (#157973) Tackles https://github.com/elastic/kibana/issues/157968 When creating new indices during SO migrations, we used to rely on the `res.acknowledged && res.shardsAcknowledged` of the `esClient.indices.create(...)` to determine that the indices are ready to use. However, we believe that due to certain race conditions, this can cause Kibana migrations to fail (refer to the [related issue](https://github.com/elastic/kibana/issues/157968)). This PR aims at fixing recent CI failures by adding a systematic `waitForIndexStatus` after creating an index. --- .../src/actions/create_index.ts | 34 ++++++++----------- 1 file changed, 15 insertions(+), 19 deletions(-) diff --git a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/actions/create_index.ts b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/actions/create_index.ts index 0e68b0cef14c5..399be22d6b678 100644 --- a/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/actions/create_index.ts +++ b/packages/core/saved-objects/core-saved-objects-migration-server-internal/src/actions/create_index.ts @@ -146,25 +146,21 @@ export const createIndex = ({ AcknowledgeResponse, 'create_index_succeeded' >((res) => { - if (res.acknowledged && res.shardsAcknowledged) { - // If the cluster state was updated and all shards started we're done - return TaskEither.right('create_index_succeeded'); - } else { - // Otherwise, wait until the target index has a 'green' status meaning - // the primary (and on multi node clusters) the replica has been started - return pipe( - waitForIndexStatus({ - client, - index: indexName, - timeout: DEFAULT_TIMEOUT, - status: 'green', - }), - TaskEither.map(() => { - /** When the index status is 'green' we know that all shards were started */ - return 'create_index_succeeded'; - }) - ); - } + // Systematicaly wait until the target index has a 'green' status meaning + // the primary (and on multi node clusters) the replica has been started + // see https://github.com/elastic/kibana/issues/157968 + return pipe( + waitForIndexStatus({ + client, + index: indexName, + timeout: DEFAULT_TIMEOUT, + status: 'green', + }), + TaskEither.map(() => { + /** When the index status is 'green' we know that all shards were started */ + return 'create_index_succeeded'; + }) + ); }) ); }; From 7377a1c79ff407a83c6d41db67a8b666e1962d4a Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Wed, 17 May 2023 14:51:30 +0100 Subject: [PATCH 14/78] [Expressions] Unskip test (#157962) ## Summary Closes https://github.com/elastic/kibana/issues/156780 I think that something changed on the chromedriver and now the ssl parameter is not always added on the google url. I changed it to use contain instead and unskipped the test Flaky test runner https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/2265 --- test/examples/expressions_explorer/expressions.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/test/examples/expressions_explorer/expressions.ts b/test/examples/expressions_explorer/expressions.ts index 047e2dbabe7cb..916a81c781ec1 100644 --- a/test/examples/expressions_explorer/expressions.ts +++ b/test/examples/expressions_explorer/expressions.ts @@ -17,8 +17,7 @@ export default function ({ getService }: PluginFunctionalProviderContext) { const find = getService('find'); const browser = getService('browser'); - // failing test: https://github.com/elastic/kibana/issues/156780 - describe.skip('', () => { + describe('', () => { it('runs expression', async () => { await retry.try(async () => { const text = await testSubjects.getVisibleText('expressionResult'); @@ -54,7 +53,7 @@ export default function ({ getService }: PluginFunctionalProviderContext) { await find.clickByCssSelector(selector); await retry.try(async () => { const text = await browser.getCurrentUrl(); - expect(text).to.be('https://www.google.com/?gws_rd=ssl'); + expect(text).to.contain('https://www.google.com/'); }); }); }); From 9b9808f4dc25882b59b4425177d3ba296e28f00e Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Wed, 17 May 2023 15:28:53 +0100 Subject: [PATCH 15/78] skip flaky suite (#156739) --- .../spaces_only/apis/update_objects_spaces.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/spaces_api_integration/spaces_only/apis/update_objects_spaces.ts b/x-pack/test/spaces_api_integration/spaces_only/apis/update_objects_spaces.ts index a8c2bdce2a3a5..89eb0c7f0219d 100644 --- a/x-pack/test/spaces_api_integration/spaces_only/apis/update_objects_spaces.ts +++ b/x-pack/test/spaces_api_integration/spaces_only/apis/update_objects_spaces.ts @@ -183,7 +183,8 @@ export default function ({ getService }: FtrProviderContext) { return createTestDefinitions(testCases, false); }; - describe('_update_objects_spaces', () => { + // FLAKY: https://github.com/elastic/kibana/issues/156739 + describe.skip('_update_objects_spaces', () => { getTestScenarios().spaces.forEach(({ spaceId }) => { const tests = createSinglePartTests(spaceId); addTests(`targeting the ${spaceId} space`, { spaceId, tests }); From a35126da66e107224e9dd182fcffb9de83df95e2 Mon Sep 17 00:00:00 2001 From: Antonio Date: Wed, 17 May 2023 23:45:20 +0900 Subject: [PATCH 16/78] [Cases] findComments small fix and updated tests (#157977) ## Summary [This PR was merged too soon](https://github.com/elastic/kibana/pull/156863). (my bad, I pressed merged automatically and some comments showed up afterwards). I am addressing them now. Basically: 1. Check for possible 0 as `page` query param in the `findComments` API. 2. Use the test utils in the `findComments` tests. I also deleted a test that was duplicated and used the same utils in every test not just the one connected to the PR comment. --- .../cases/server/client/attachments/get.ts | 17 +- .../client/attachments/validators.test.tsx | 39 +++++ .../server/client/attachments/validators.ts | 18 +- .../tests/common/comments/find_comments.ts | 158 +++++++----------- 4 files changed, 116 insertions(+), 116 deletions(-) create mode 100644 x-pack/plugins/cases/server/client/attachments/validators.test.tsx diff --git a/x-pack/plugins/cases/server/client/attachments/get.ts b/x-pack/plugins/cases/server/client/attachments/get.ts index 6fe9af90b91b2..6bf6ecda88d21 100644 --- a/x-pack/plugins/cases/server/client/attachments/get.ts +++ b/x-pack/plugins/cases/server/client/attachments/get.ts @@ -23,11 +23,7 @@ import type { } from '../../../common/api'; import type { FindCommentsArgs, GetAllAlertsAttachToCase, GetAllArgs, GetArgs } from './types'; -import { - CASE_COMMENT_SAVED_OBJECT, - CASE_SAVED_OBJECT, - MAX_DOCS_PER_PAGE, -} from '../../../common/constants'; +import { CASE_COMMENT_SAVED_OBJECT, CASE_SAVED_OBJECT } from '../../../common/constants'; import { FindCommentsArgsRt, CommentType, @@ -48,6 +44,7 @@ import { createCaseError } from '../../common/error'; import { DEFAULT_PAGE, DEFAULT_PER_PAGE } from '../../routes/api'; import { buildFilter, combineFilters } from '../utils'; import { Operations } from '../../authorization'; +import { validateFindCommentsPagination } from './validators'; const normalizeAlertResponse = (alerts: Array>): AlertResponse => alerts.reduce((acc: AlertResponse, alert) => { @@ -131,15 +128,7 @@ export async function find( fold(throwErrors(Boom.badRequest), identity) ); - if ( - queryParams?.page && - queryParams?.perPage && - queryParams?.page * queryParams?.perPage > MAX_DOCS_PER_PAGE - ) { - throw Boom.badRequest( - 'The number of documents is too high. Paginating through more than 10,000 documents is not possible.' - ); - } + validateFindCommentsPagination(queryParams); try { const { filter: authorizationFilter, ensureSavedObjectsAreAuthorized } = diff --git a/x-pack/plugins/cases/server/client/attachments/validators.test.tsx b/x-pack/plugins/cases/server/client/attachments/validators.test.tsx new file mode 100644 index 0000000000000..4626fd13fba35 --- /dev/null +++ b/x-pack/plugins/cases/server/client/attachments/validators.test.tsx @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { validateFindCommentsPagination } from './validators'; + +const ERROR_MSG = + 'The number of documents is too high. Paginating through more than 10,000 documents is not possible.'; + +describe('validators', () => { + describe('validateFindCommentsPagination', () => { + it('does not throw if only page is undefined', () => { + expect(() => validateFindCommentsPagination({ perPage: 100 })).not.toThrowError(); + }); + + it('does not throw if only perPage is undefined', () => { + expect(() => validateFindCommentsPagination({ page: 100 })).not.toThrowError(); + }); + + it('returns if page and perPage are undefined', () => { + expect(() => validateFindCommentsPagination({})).not.toThrowError(); + }); + + it('throws if page > 10k', () => { + expect(() => validateFindCommentsPagination({ page: 10001 })).toThrow(ERROR_MSG); + }); + + it('throws if perPage > 10k', () => { + expect(() => validateFindCommentsPagination({ perPage: 10001 })).toThrowError(ERROR_MSG); + }); + + it('throws if page * perPage > 10k', () => { + expect(() => validateFindCommentsPagination({ page: 10, perPage: 1001 })).toThrow(ERROR_MSG); + }); + }); +}); diff --git a/x-pack/plugins/cases/server/client/attachments/validators.ts b/x-pack/plugins/cases/server/client/attachments/validators.ts index 4a66d32c31c19..770d9d8e88c0f 100644 --- a/x-pack/plugins/cases/server/client/attachments/validators.ts +++ b/x-pack/plugins/cases/server/client/attachments/validators.ts @@ -6,11 +6,12 @@ */ import Boom from '@hapi/boom'; +import { MAX_DOCS_PER_PAGE } from '../../../common/constants'; import { isCommentRequestTypeExternalReference, isCommentRequestTypePersistableState, } from '../../../common/utils/attachments'; -import type { CommentRequest } from '../../../common/api'; +import type { CommentRequest, FindCommentsQueryParams } from '../../../common/api'; import type { ExternalReferenceAttachmentTypeRegistry } from '../../attachment_framework/external_reference_registry'; import type { PersistableStateAttachmentTypeRegistry } from '../../attachment_framework/persistable_state_registry'; @@ -41,3 +42,18 @@ export const validateRegisteredAttachments = ({ ); } }; + +export const validateFindCommentsPagination = (params?: FindCommentsQueryParams) => { + if (params?.page == null && params?.perPage == null) { + return; + } + + const pageAsNumber = params.page ?? 0; + const perPageAsNumber = params.perPage ?? 0; + + if (Math.max(pageAsNumber, perPageAsNumber, pageAsNumber * perPageAsNumber) > MAX_DOCS_PER_PAGE) { + throw Boom.badRequest( + 'The number of documents is too high. Paginating through more than 10,000 documents is not possible.' + ); + } +}; diff --git a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/comments/find_comments.ts b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/comments/find_comments.ts index 50f42be029b8e..a218350ec95ca 100644 --- a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/comments/find_comments.ts +++ b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/comments/find_comments.ts @@ -7,10 +7,7 @@ import expect from '@kbn/expect'; -import { - CASES_URL, - INTERNAL_BULK_CREATE_ATTACHMENTS_URL, -} from '@kbn/cases-plugin/common/constants'; +import { CASES_URL } from '@kbn/cases-plugin/common/constants'; import { CommentType } from '@kbn/cases-plugin/common/api'; import { FtrProviderContext } from '../../../../common/ftr_provider_context'; import { @@ -32,6 +29,7 @@ import { getSpaceUrlPrefix, createCase, findAttachments, + bulkCreateAttachments, } from '../../../../common/lib/api'; import { @@ -58,122 +56,85 @@ export default ({ getService }: FtrProviderContext): void => { }); it('should find all case comment', async () => { - const { body: postedCase } = await supertest - .post(CASES_URL) - .set('kbn-xsrf', 'true') - .send(postCaseReq) - .expect(200); + const postedCase = await createCase(supertest, postCaseReq, 200); // post 2 comments - await supertest - .post(`${CASES_URL}/${postedCase.id}/comments`) - .set('kbn-xsrf', 'true') - .send(postCommentUserReq) - .expect(200); + await createComment({ + supertest, + caseId: postedCase.id, + params: postCommentUserReq, + expectedHttpCode: 200, + }); - const { body: patchedCase } = await supertest - .post(`${CASES_URL}/${postedCase.id}/comments`) - .set('kbn-xsrf', 'true') - .send(postCommentUserReq) - .expect(200); + const patchedCase = await createComment({ + supertest, + caseId: postedCase.id, + params: postCommentUserReq, + expectedHttpCode: 200, + }); - const { body: caseComments } = await supertest - .get(`${CASES_URL}/${postedCase.id}/comments/_find`) - .set('kbn-xsrf', 'true') - .send() - .expect(200); + const caseComments = await findAttachments({ + supertest, + caseId: postedCase.id, + expectedHttpCode: 200, + }); expect(caseComments.comments).to.eql(patchedCase.comments); }); it('should find only case comments of the correct type', async () => { - const { body: postedCase } = await supertest - .post(CASES_URL) - .set('kbn-xsrf', 'true') - .send(postCaseReq) - .expect(200); + const postedCase = await createCase(supertest, postCaseReq, 200); // post 5 comments of all possible types - await supertest - .post(INTERNAL_BULK_CREATE_ATTACHMENTS_URL.replace('{case_id}', postedCase.id)) - .set('kbn-xsrf', 'true') - .send([ + await bulkCreateAttachments({ + supertest, + caseId: postedCase.id, + params: [ postCommentUserReq, postCommentAlertReq, postCommentActionsReq, postExternalReferenceESReq, persistableStateAttachment, - ]) - .expect(200); + ], + expectedHttpCode: 200, + }); - const { body: caseComments } = await supertest - .get(`${CASES_URL}/${postedCase.id}/comments/_find`) - .set('kbn-xsrf', 'true') - .send() - .expect(200); + const caseComments = await findAttachments({ + supertest, + caseId: postedCase.id, + expectedHttpCode: 200, + }); expect(caseComments.comments.length).to.eql(1); expect(caseComments.comments[0].type).to.eql(CommentType.user); }); - it('unhappy path - 400s when query is wrong type', async () => { - const { body: postedCase } = await supertest - .post(CASES_URL) - .set('kbn-xsrf', 'true') - .send(postCaseReq) - .expect(200); - - await supertest - .post(`${CASES_URL}/${postedCase.id}/comments`) - .set('kbn-xsrf', 'true') - .send(postCommentUserReq) - .expect(200); - - await supertest - .get(`${CASES_URL}/${postedCase.id}/comments/_find?perPage=true`) - .set('kbn-xsrf', 'true') - .send() - .expect(400); - }); - - it('unhappy path - 400s when field is unkown', async () => { - const { body: postedCase } = await supertest - .post(CASES_URL) - .set('kbn-xsrf', 'true') - .send(postCaseReq) - .expect(200); - - await supertest - .post(`${CASES_URL}/${postedCase.id}/comments`) - .set('kbn-xsrf', 'true') - .send(postCommentUserReq) - .expect(200); - - await supertest - .get(`${CASES_URL}/${postedCase.id}/comments/_find?foobar=true`) - .set('kbn-xsrf', 'true') - .send() - .expect(400); - }); - - it('unhappy path - 400s when total items invalid', async () => { - const { body: postedCase } = await supertest - .post(CASES_URL) - .set('kbn-xsrf', 'true') - .send(postCaseReq) - .expect(200); + describe('unhappy paths', () => { + for (const errorScenario of [ + { name: 'field is wrong type', queryParams: { perPage: true } }, + { name: 'field is unknown', queryParams: { foo: 'bar' } }, + { name: 'page > 10k', queryParams: { page: 10001 } }, + { name: 'perPage > 10k', queryParams: { perPage: 10001 } }, + { name: 'page * perPage > 10k', queryParams: { page: 2, perPage: 9001 } }, + ]) { + it(`400s when ${errorScenario.name}`, async () => { + const postedCase = await createCase(supertest, postCaseReq, 200); - await supertest - .post(`${CASES_URL}/${postedCase.id}/comments`) - .set('kbn-xsrf', 'true') - .send(postCommentUserReq) - .expect(200); + await createComment({ + supertest, + caseId: postedCase.id, + params: postCommentUserReq, + expectedHttpCode: 200, + }); - await supertest - .get(`${CASES_URL}/${postedCase.id}/comments/_find?page=2&perPage=9001`) - .set('kbn-xsrf', 'true') - .send() - .expect(400); + await findAttachments({ + supertest, + caseId: postedCase.id, + query: errorScenario.queryParams, + expectedHttpCode: 400, + }); + }); + } }); describe('rbac', () => { @@ -333,11 +294,6 @@ export default ({ getService }: FtrProviderContext): void => { await supertest.get(`${CASES_URL}/${obsCase.id}/comments/_find?namespaces=*`).expect(400); }); - - it('should NOT allow to pass a non supported query parameter', async () => { - await supertest.get(`${CASES_URL}/id/comments/_find?notExists=papa`).expect(400); - await supertest.get(`${CASES_URL}/id/comments/_find?owner=papa`).expect(400); - }); }); }); }; From f6197904a0a8bc84756e654fec8bb4e31aac6e9e Mon Sep 17 00:00:00 2001 From: Carlos Crespo Date: Wed, 17 May 2023 11:48:30 -0300 Subject: [PATCH 17/78] [Metrics UI] Fix metrics explorer flaky test (#157918) fixes https://github.com/elastic/kibana/issues/156513 ## Summary Fixes metrics explorer flaky tests https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/2257 --- .../functional/apps/infra/metrics_explorer.ts | 17 ++++++++++++++--- .../page_objects/infra_saved_views.ts | 3 --- 2 files changed, 14 insertions(+), 6 deletions(-) diff --git a/x-pack/test/functional/apps/infra/metrics_explorer.ts b/x-pack/test/functional/apps/infra/metrics_explorer.ts index 94ff40d13b679..6ccbd6ef6b307 100644 --- a/x-pack/test/functional/apps/infra/metrics_explorer.ts +++ b/x-pack/test/functional/apps/infra/metrics_explorer.ts @@ -100,8 +100,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); }); - // FLAKY: https://github.com/elastic/kibana/issues/157738 - describe.skip('Saved Views', () => { + describe('Saved Views', () => { before(async () => { await esArchiver.load('x-pack/test/functional/es_archives/infra/metrics_and_logs'); await pageObjects.infraHome.goToMetricExplorer(); @@ -109,6 +108,13 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { after(() => esArchiver.unload('x-pack/test/functional/es_archives/infra/metrics_and_logs')); + beforeEach(async () => { + await pageObjects.infraSavedViews.clickSavedViewsButton(); + }); + afterEach(async () => { + await pageObjects.infraSavedViews.closeSavedViewsPopover(); + }); + it('should render a button with the view name', async () => { await pageObjects.infraSavedViews.ensureViewIsLoaded('Default view'); }); @@ -125,7 +131,6 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { }); it('should laod a clicked view from the manage views section', async () => { - await pageObjects.infraSavedViews.ensureViewIsLoaded('view1'); const views = await pageObjects.infraSavedViews.getManageViewsEntries(); await views[0].click(); await pageObjects.infraSavedViews.ensureViewIsLoaded('Default view'); @@ -136,14 +141,20 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { expect(views.length).to.equal(2); await pageObjects.infraSavedViews.pressEsc(); + await pageObjects.infraSavedViews.clickSavedViewsButton(); await pageObjects.infraSavedViews.createView('view2'); await pageObjects.infraSavedViews.ensureViewIsLoaded('view2'); + + await pageObjects.infraSavedViews.clickSavedViewsButton(); views = await pageObjects.infraSavedViews.getManageViewsEntries(); expect(views.length).to.equal(3); await pageObjects.infraSavedViews.pressEsc(); + await pageObjects.infraSavedViews.clickSavedViewsButton(); await pageObjects.infraSavedViews.updateView('view3'); await pageObjects.infraSavedViews.ensureViewIsLoaded('view3'); + + await pageObjects.infraSavedViews.clickSavedViewsButton(); views = await pageObjects.infraSavedViews.getManageViewsEntries(); expect(views.length).to.equal(3); await pageObjects.infraSavedViews.pressEsc(); diff --git a/x-pack/test/functional/page_objects/infra_saved_views.ts b/x-pack/test/functional/page_objects/infra_saved_views.ts index 8d7bf2a71a869..a9cdc8ffdab40 100644 --- a/x-pack/test/functional/page_objects/infra_saved_views.ts +++ b/x-pack/test/functional/page_objects/infra_saved_views.ts @@ -32,7 +32,6 @@ export function InfraSavedViewsProvider({ getService }: FtrProviderContext) { }, async getManageViewsEntries() { - await this.clickSavedViewsButton(); await this.clickManageViewsButton(); return testSubjects.findAll('infraRenderNameButton'); }, @@ -52,13 +51,11 @@ export function InfraSavedViewsProvider({ getService }: FtrProviderContext) { }, async createView(name: string) { - await this.clickSavedViewsButton(); await this.clickSaveNewViewButton(); await this.createNewSavedView(name); }, async updateView(name: string) { - await this.clickSavedViewsButton(); await this.clickUpdateViewButton(); await this.createNewSavedView(name); }, From af91ecc67aec20682c39f3dd5abeb18d104797bb Mon Sep 17 00:00:00 2001 From: Lisa Cawley Date: Wed, 17 May 2023 08:01:24 -0700 Subject: [PATCH 18/78] [RAM][Maintenance Window] Fix UI text (#157821) --- .../alerting/public/pages/maintenance_windows/translations.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/alerting/public/pages/maintenance_windows/translations.ts b/x-pack/plugins/alerting/public/pages/maintenance_windows/translations.ts index 1ead43b2a3ba0..3b2e5529ef1ec 100644 --- a/x-pack/plugins/alerting/public/pages/maintenance_windows/translations.ts +++ b/x-pack/plugins/alerting/public/pages/maintenance_windows/translations.ts @@ -80,7 +80,7 @@ export const CREATE_MAINTENANCE_WINDOW_DESCRIPTION = i18n.translate( 'xpack.alerting.maintenanceWindows.create.description', { defaultMessage: - 'Schedule a single or recurring period in which rule notifications cease and alerts are in maintenance mode.', + 'Schedule a single or recurring period in which new alerts do not send notifications.', } ); From d2fb381350064a5aacdf1fe5fde8a08b642e2e74 Mon Sep 17 00:00:00 2001 From: Jatin Kathuria Date: Wed, 17 May 2023 17:09:08 +0200 Subject: [PATCH 19/78] [Security Solution] [Controls] [Fix] Move fieldFilterPredicate function out of redux (#157004) ## Summary This PR handles: #156996 @elastic/kibana-presentation team: Currently, this PR moves, `fieldFilterPredicate` out of settings. Now it is being used as the prop of the `ControlGroupRenderer`. Below video demonstrates the difference between both: |Before|After| |---|---| |
diff --git a/x-pack/plugins/alerting/docs/openapi/bundled.json b/x-pack/plugins/alerting/docs/openapi/bundled.json index 9bee67e2c612b..c5b99b0c89398 100644 --- a/x-pack/plugins/alerting/docs/openapi/bundled.json +++ b/x-pack/plugins/alerting/docs/openapi/bundled.json @@ -2516,6 +2516,11 @@ "type": "object", "description": "The parameters for the action, which are sent to the connector. The `params` are handled as Mustache templates and passed a default set of context.", "additionalProperties": true + }, + "uuid": { + "type": "string", + "description": "A universally unique identifier (UUID) for the action.", + "example": "1c7a1280-f28c-4e06-96b2-e4e5f05d1d61" } } } @@ -3020,6 +3025,7 @@ { "group": "threshold met", "id": "1007a0c0-7a6e-11ed-89d5-abec321c0def", + "uuid": "1c7a1280-f28c-4e06-96b2-e4e5f05d1d61", "params": { "level": "info", "message": "alert {{alertName}} is active for group {{context.group}}:\n\n- Value: {{context.value}}\n- Conditions Met: {{context.conditions}} over {{params.timeWindowSize}}{{params.timeWindowUnit}}\n- Timestamp: {{context.date}", @@ -3136,6 +3142,7 @@ "message": "alert {{alertName}} is active for group {{context.group}}:\n\n- Value: {{context.value}}\n- Conditions Met: {{context.conditions}} over {{params.timeWindowSize}}{{params.timeWindowUnit}}\n- Timestamp: {{context.date}" }, "id": "96b668d0-a1b6-11ed-afdf-d39a49596974", + "uuid": "07aef2a0-9eed-4ef9-94ec-39ba58eb609d", "connector_type_id": ".server-log", "frequency": { "summary": false, @@ -3211,6 +3218,7 @@ { "group": "threshold met", "id": "dceeb5d0-6b41-11eb-802b-85b0c1bc8ba2", + "uuid": "07aef2a0-9eed-4ef9-94ec-39ba58eb609d", "frequency": { "notify_when": "onActionGroupChange", "summary": false, @@ -3323,6 +3331,7 @@ { "id": "9dca3e00-74f5-11ed-9801-35303b735aef", "group": "threshold met", + "uuid": "1c7a1280-f28c-4e06-96b2-e4e5f05d1d61", "params": { "level": "info", "message": "alert {{alertName}} is active for group {{context.group}}:\n\n- Value: {{context.value}}\n- Conditions Met: {{context.conditions}} over {{params.timeWindowSize}}{{params.timeWindowUnit}}\n- Timestamp: {{context.date}}", diff --git a/x-pack/plugins/alerting/docs/openapi/bundled.yaml b/x-pack/plugins/alerting/docs/openapi/bundled.yaml index 46b8b12e9757c..702fa6b39a328 100644 --- a/x-pack/plugins/alerting/docs/openapi/bundled.yaml +++ b/x-pack/plugins/alerting/docs/openapi/bundled.yaml @@ -1603,6 +1603,10 @@ components: type: object description: The parameters for the action, which are sent to the connector. The `params` are handled as Mustache templates and passed a default set of context. additionalProperties: true + uuid: + type: string + description: A universally unique identifier (UUID) for the action. + example: 1c7a1280-f28c-4e06-96b2-e4e5f05d1d61 schedule: type: object description: The check interval, which specifies how frequently the rule conditions are checked. The interval is specified in seconds, minutes, hours, or days. @@ -1986,6 +1990,7 @@ components: actions: - group: threshold met id: 1007a0c0-7a6e-11ed-89d5-abec321c0def + uuid: 1c7a1280-f28c-4e06-96b2-e4e5f05d1d61 params: level: info message: |- @@ -2092,6 +2097,7 @@ components: - Conditions Met: {{context.conditions}} over {{params.timeWindowSize}}{{params.timeWindowUnit}} - Timestamp: {{context.date} id: 96b668d0-a1b6-11ed-afdf-d39a49596974 + uuid: 07aef2a0-9eed-4ef9-94ec-39ba58eb609d connector_type_id: .server-log frequency: summary: false @@ -2152,6 +2158,7 @@ components: actions: - group: threshold met id: dceeb5d0-6b41-11eb-802b-85b0c1bc8ba2 + uuid: 07aef2a0-9eed-4ef9-94ec-39ba58eb609d frequency: notify_when: onActionGroupChange summary: false @@ -2249,6 +2256,7 @@ components: actions: - id: 9dca3e00-74f5-11ed-9801-35303b735aef group: threshold met + uuid: 1c7a1280-f28c-4e06-96b2-e4e5f05d1d61 params: level: info message: |- diff --git a/x-pack/plugins/alerting/docs/openapi/components/examples/create_rule_response.yaml b/x-pack/plugins/alerting/docs/openapi/components/examples/create_rule_response.yaml index 73ad19287095d..566f57745ed95 100644 --- a/x-pack/plugins/alerting/docs/openapi/components/examples/create_rule_response.yaml +++ b/x-pack/plugins/alerting/docs/openapi/components/examples/create_rule_response.yaml @@ -3,6 +3,7 @@ value: actions: - group: threshold met id: dceeb5d0-6b41-11eb-802b-85b0c1bc8ba2 + uuid: 07aef2a0-9eed-4ef9-94ec-39ba58eb609d frequency: notify_when: onActionGroupChange summary: false diff --git a/x-pack/plugins/alerting/docs/openapi/components/examples/find_rules_response.yaml b/x-pack/plugins/alerting/docs/openapi/components/examples/find_rules_response.yaml index 68deb0bd6e8f8..033435ba178a4 100644 --- a/x-pack/plugins/alerting/docs/openapi/components/examples/find_rules_response.yaml +++ b/x-pack/plugins/alerting/docs/openapi/components/examples/find_rules_response.yaml @@ -44,6 +44,7 @@ value: actions: - id: 9dca3e00-74f5-11ed-9801-35303b735aef group: threshold met + uuid: 1c7a1280-f28c-4e06-96b2-e4e5f05d1d61 params: level: info message: "alert {{alertName}} is active for group {{context.group}}:\n\n- Value: {{context.value}}\n- Conditions Met: {{context.conditions}} over {{params.timeWindowSize}}{{params.timeWindowUnit}}\n- Timestamp: {{context.date}}" diff --git a/x-pack/plugins/alerting/docs/openapi/components/examples/get_rule_response.yaml b/x-pack/plugins/alerting/docs/openapi/components/examples/get_rule_response.yaml index 3c387b1a5a40c..2ee88f2589d85 100644 --- a/x-pack/plugins/alerting/docs/openapi/components/examples/get_rule_response.yaml +++ b/x-pack/plugins/alerting/docs/openapi/components/examples/get_rule_response.yaml @@ -40,6 +40,7 @@ value: actions: - group: threshold met id: 1007a0c0-7a6e-11ed-89d5-abec321c0def + uuid: 1c7a1280-f28c-4e06-96b2-e4e5f05d1d61 params: level: info message: "alert {{alertName}} is active for group {{context.group}}:\n\n- Value: {{context.value}}\n- Conditions Met: {{context.conditions}} over {{params.timeWindowSize}}{{params.timeWindowUnit}}\n- Timestamp: {{context.date}" diff --git a/x-pack/plugins/alerting/docs/openapi/components/examples/update_rule_response.yaml b/x-pack/plugins/alerting/docs/openapi/components/examples/update_rule_response.yaml index 6b64214ff5ec9..8ebd107c5ac65 100644 --- a/x-pack/plugins/alerting/docs/openapi/components/examples/update_rule_response.yaml +++ b/x-pack/plugins/alerting/docs/openapi/components/examples/update_rule_response.yaml @@ -40,6 +40,7 @@ value: level: info message: "alert {{alertName}} is active for group {{context.group}}:\n\n- Value: {{context.value}}\n- Conditions Met: {{context.conditions}} over {{params.timeWindowSize}}{{params.timeWindowUnit}}\n- Timestamp: {{context.date}" id: 96b668d0-a1b6-11ed-afdf-d39a49596974 + uuid: 07aef2a0-9eed-4ef9-94ec-39ba58eb609d connector_type_id: .server-log frequency: summary: false diff --git a/x-pack/plugins/alerting/docs/openapi/components/schemas/actions.yaml b/x-pack/plugins/alerting/docs/openapi/components/schemas/actions.yaml index 5d0d877a4c177..5b67d45ced76f 100644 --- a/x-pack/plugins/alerting/docs/openapi/components/schemas/actions.yaml +++ b/x-pack/plugins/alerting/docs/openapi/components/schemas/actions.yaml @@ -41,3 +41,7 @@ items: type: object description: The parameters for the action, which are sent to the connector. The `params` are handled as Mustache templates and passed a default set of context. additionalProperties: true + uuid: + type: string + description: A universally unique identifier (UUID) for the action. + example: 1c7a1280-f28c-4e06-96b2-e4e5f05d1d61 From dcae6fd34ec09de6edb60cb29113016dfe104804 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Thu, 18 May 2023 00:50:46 -0400 Subject: [PATCH 42/78] [api-docs] 2023-05-18 Daily api_docs build (#158055) Generated by https://buildkite.com/elastic/kibana-api-docs-daily/builds/341 --- api_docs/actions.mdx | 2 +- api_docs/advanced_settings.mdx | 2 +- api_docs/aiops.mdx | 2 +- api_docs/alerting.mdx | 2 +- api_docs/apm.mdx | 2 +- api_docs/asset_manager.mdx | 2 +- api_docs/banners.mdx | 2 +- api_docs/bfetch.mdx | 2 +- api_docs/canvas.mdx | 2 +- api_docs/cases.devdocs.json | 312 +++++++++++++++++- api_docs/cases.mdx | 2 +- api_docs/charts.mdx | 2 +- api_docs/cloud.mdx | 2 +- api_docs/cloud_chat.mdx | 2 +- api_docs/cloud_data_migration.mdx | 2 +- api_docs/cloud_defend.mdx | 2 +- api_docs/cloud_experiments.mdx | 2 +- api_docs/cloud_security_posture.mdx | 2 +- api_docs/console.mdx | 2 +- api_docs/content_management.mdx | 2 +- api_docs/controls.devdocs.json | 49 +++ api_docs/controls.mdx | 4 +- api_docs/custom_integrations.mdx | 2 +- api_docs/dashboard.mdx | 2 +- api_docs/dashboard_enhanced.mdx | 2 +- api_docs/data.mdx | 2 +- api_docs/data_query.mdx | 2 +- api_docs/data_search.mdx | 2 +- api_docs/data_view_editor.mdx | 2 +- api_docs/data_view_field_editor.mdx | 2 +- api_docs/data_view_management.mdx | 2 +- api_docs/data_views.mdx | 2 +- api_docs/data_visualizer.mdx | 2 +- api_docs/deprecations_by_api.mdx | 2 +- api_docs/deprecations_by_plugin.mdx | 2 +- api_docs/deprecations_by_team.mdx | 2 +- api_docs/dev_tools.mdx | 2 +- api_docs/discover.mdx | 2 +- api_docs/discover_enhanced.mdx | 2 +- api_docs/ecs_data_quality_dashboard.mdx | 2 +- api_docs/embeddable.mdx | 2 +- api_docs/embeddable_enhanced.mdx | 2 +- api_docs/encrypted_saved_objects.mdx | 2 +- api_docs/enterprise_search.mdx | 2 +- api_docs/es_ui_shared.mdx | 2 +- api_docs/event_annotation.mdx | 2 +- api_docs/event_log.mdx | 2 +- api_docs/exploratory_view.mdx | 2 +- api_docs/expression_error.mdx | 2 +- api_docs/expression_gauge.mdx | 2 +- api_docs/expression_heatmap.mdx | 2 +- api_docs/expression_image.mdx | 2 +- api_docs/expression_legacy_metric_vis.mdx | 2 +- api_docs/expression_metric.mdx | 2 +- api_docs/expression_metric_vis.mdx | 2 +- api_docs/expression_partition_vis.mdx | 2 +- api_docs/expression_repeat_image.mdx | 2 +- api_docs/expression_reveal_image.mdx | 2 +- api_docs/expression_shape.mdx | 2 +- api_docs/expression_tagcloud.mdx | 2 +- api_docs/expression_x_y.mdx | 2 +- api_docs/expressions.mdx | 2 +- api_docs/features.mdx | 2 +- api_docs/field_formats.mdx | 2 +- api_docs/file_upload.mdx | 2 +- api_docs/files.mdx | 2 +- api_docs/files_management.mdx | 2 +- api_docs/fleet.devdocs.json | 30 ++ api_docs/fleet.mdx | 4 +- api_docs/global_search.mdx | 2 +- api_docs/guided_onboarding.mdx | 2 +- api_docs/home.mdx | 2 +- api_docs/image_embeddable.mdx | 2 +- api_docs/index_lifecycle_management.mdx | 2 +- api_docs/index_management.mdx | 2 +- api_docs/infra.devdocs.json | 14 + api_docs/infra.mdx | 4 +- api_docs/inspector.mdx | 2 +- api_docs/interactive_setup.mdx | 2 +- api_docs/kbn_ace.mdx | 2 +- api_docs/kbn_aiops_components.mdx | 2 +- api_docs/kbn_aiops_utils.mdx | 2 +- api_docs/kbn_alerting_state_types.mdx | 2 +- api_docs/kbn_alerts_as_data_utils.mdx | 2 +- api_docs/kbn_alerts_ui_shared.mdx | 2 +- api_docs/kbn_analytics.mdx | 2 +- api_docs/kbn_analytics_client.mdx | 2 +- ..._analytics_shippers_elastic_v3_browser.mdx | 2 +- ...n_analytics_shippers_elastic_v3_common.mdx | 2 +- ...n_analytics_shippers_elastic_v3_server.mdx | 2 +- api_docs/kbn_analytics_shippers_fullstory.mdx | 2 +- api_docs/kbn_analytics_shippers_gainsight.mdx | 2 +- api_docs/kbn_apm_config_loader.mdx | 2 +- api_docs/kbn_apm_synthtrace.mdx | 2 +- api_docs/kbn_apm_synthtrace_client.mdx | 2 +- api_docs/kbn_apm_utils.mdx | 2 +- api_docs/kbn_axe_config.mdx | 2 +- api_docs/kbn_cases_components.mdx | 2 +- api_docs/kbn_cell_actions.mdx | 2 +- api_docs/kbn_chart_expressions_common.mdx | 2 +- api_docs/kbn_chart_icons.mdx | 2 +- api_docs/kbn_ci_stats_core.mdx | 2 +- api_docs/kbn_ci_stats_performance_metrics.mdx | 2 +- api_docs/kbn_ci_stats_reporter.mdx | 2 +- api_docs/kbn_cli_dev_mode.mdx | 2 +- api_docs/kbn_code_editor.mdx | 2 +- api_docs/kbn_code_editor_mocks.mdx | 2 +- api_docs/kbn_coloring.mdx | 2 +- api_docs/kbn_config.mdx | 2 +- api_docs/kbn_config_mocks.mdx | 2 +- api_docs/kbn_config_schema.mdx | 2 +- .../kbn_content_management_content_editor.mdx | 2 +- .../kbn_content_management_table_list.mdx | 2 +- api_docs/kbn_content_management_utils.mdx | 2 +- api_docs/kbn_core_analytics_browser.mdx | 2 +- .../kbn_core_analytics_browser_internal.mdx | 2 +- api_docs/kbn_core_analytics_browser_mocks.mdx | 2 +- api_docs/kbn_core_analytics_server.mdx | 2 +- .../kbn_core_analytics_server_internal.mdx | 2 +- api_docs/kbn_core_analytics_server_mocks.mdx | 2 +- api_docs/kbn_core_application_browser.mdx | 2 +- .../kbn_core_application_browser_internal.mdx | 2 +- .../kbn_core_application_browser_mocks.mdx | 2 +- api_docs/kbn_core_application_common.mdx | 2 +- api_docs/kbn_core_apps_browser_internal.mdx | 2 +- api_docs/kbn_core_apps_browser_mocks.mdx | 2 +- api_docs/kbn_core_apps_server_internal.mdx | 2 +- api_docs/kbn_core_base_browser_mocks.mdx | 2 +- api_docs/kbn_core_base_common.mdx | 2 +- api_docs/kbn_core_base_server_internal.mdx | 2 +- api_docs/kbn_core_base_server_mocks.mdx | 2 +- .../kbn_core_capabilities_browser_mocks.mdx | 2 +- api_docs/kbn_core_capabilities_common.mdx | 2 +- api_docs/kbn_core_capabilities_server.mdx | 2 +- .../kbn_core_capabilities_server_mocks.mdx | 2 +- api_docs/kbn_core_chrome_browser.mdx | 2 +- api_docs/kbn_core_chrome_browser_mocks.mdx | 2 +- api_docs/kbn_core_config_server_internal.mdx | 2 +- api_docs/kbn_core_custom_branding_browser.mdx | 2 +- ..._core_custom_branding_browser_internal.mdx | 2 +- ...kbn_core_custom_branding_browser_mocks.mdx | 2 +- api_docs/kbn_core_custom_branding_common.mdx | 2 +- api_docs/kbn_core_custom_branding_server.mdx | 2 +- ...n_core_custom_branding_server_internal.mdx | 2 +- .../kbn_core_custom_branding_server_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_browser.mdx | 2 +- ...kbn_core_deprecations_browser_internal.mdx | 2 +- .../kbn_core_deprecations_browser_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_common.mdx | 2 +- api_docs/kbn_core_deprecations_server.mdx | 2 +- .../kbn_core_deprecations_server_internal.mdx | 2 +- .../kbn_core_deprecations_server_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_browser.mdx | 2 +- api_docs/kbn_core_doc_links_browser_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_server.mdx | 2 +- api_docs/kbn_core_doc_links_server_mocks.mdx | 2 +- ...e_elasticsearch_client_server_internal.mdx | 2 +- ...core_elasticsearch_client_server_mocks.mdx | 2 +- api_docs/kbn_core_elasticsearch_server.mdx | 2 +- ...kbn_core_elasticsearch_server_internal.mdx | 2 +- .../kbn_core_elasticsearch_server_mocks.mdx | 2 +- .../kbn_core_environment_server_internal.mdx | 2 +- .../kbn_core_environment_server_mocks.mdx | 2 +- .../kbn_core_execution_context_browser.mdx | 2 +- ...ore_execution_context_browser_internal.mdx | 2 +- ...n_core_execution_context_browser_mocks.mdx | 2 +- .../kbn_core_execution_context_common.mdx | 2 +- .../kbn_core_execution_context_server.mdx | 2 +- ...core_execution_context_server_internal.mdx | 2 +- ...bn_core_execution_context_server_mocks.mdx | 2 +- api_docs/kbn_core_fatal_errors_browser.mdx | 2 +- .../kbn_core_fatal_errors_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_browser.mdx | 2 +- api_docs/kbn_core_http_browser_internal.mdx | 2 +- api_docs/kbn_core_http_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_common.mdx | 2 +- .../kbn_core_http_context_server_mocks.mdx | 2 +- ...re_http_request_handler_context_server.mdx | 2 +- api_docs/kbn_core_http_resources_server.mdx | 2 +- ...bn_core_http_resources_server_internal.mdx | 2 +- .../kbn_core_http_resources_server_mocks.mdx | 2 +- .../kbn_core_http_router_server_internal.mdx | 2 +- .../kbn_core_http_router_server_mocks.mdx | 2 +- api_docs/kbn_core_http_server.mdx | 2 +- api_docs/kbn_core_http_server_internal.mdx | 2 +- api_docs/kbn_core_http_server_mocks.mdx | 2 +- api_docs/kbn_core_i18n_browser.mdx | 2 +- api_docs/kbn_core_i18n_browser_mocks.mdx | 2 +- api_docs/kbn_core_i18n_server.mdx | 2 +- api_docs/kbn_core_i18n_server_internal.mdx | 2 +- api_docs/kbn_core_i18n_server_mocks.mdx | 2 +- ...n_core_injected_metadata_browser_mocks.mdx | 2 +- ...kbn_core_integrations_browser_internal.mdx | 2 +- .../kbn_core_integrations_browser_mocks.mdx | 2 +- api_docs/kbn_core_lifecycle_browser.mdx | 2 +- api_docs/kbn_core_lifecycle_browser_mocks.mdx | 2 +- api_docs/kbn_core_lifecycle_server.mdx | 2 +- api_docs/kbn_core_lifecycle_server_mocks.mdx | 2 +- api_docs/kbn_core_logging_browser_mocks.mdx | 2 +- api_docs/kbn_core_logging_common_internal.mdx | 2 +- api_docs/kbn_core_logging_server.mdx | 2 +- api_docs/kbn_core_logging_server_internal.mdx | 2 +- api_docs/kbn_core_logging_server_mocks.mdx | 2 +- ...ore_metrics_collectors_server_internal.mdx | 2 +- ...n_core_metrics_collectors_server_mocks.mdx | 2 +- api_docs/kbn_core_metrics_server.mdx | 2 +- api_docs/kbn_core_metrics_server_internal.mdx | 2 +- api_docs/kbn_core_metrics_server_mocks.mdx | 2 +- api_docs/kbn_core_mount_utils_browser.mdx | 2 +- api_docs/kbn_core_node_server.mdx | 2 +- api_docs/kbn_core_node_server_internal.mdx | 2 +- api_docs/kbn_core_node_server_mocks.mdx | 2 +- api_docs/kbn_core_notifications_browser.mdx | 2 +- ...bn_core_notifications_browser_internal.mdx | 2 +- .../kbn_core_notifications_browser_mocks.mdx | 2 +- api_docs/kbn_core_overlays_browser.mdx | 2 +- .../kbn_core_overlays_browser_internal.mdx | 2 +- api_docs/kbn_core_overlays_browser_mocks.mdx | 2 +- api_docs/kbn_core_plugins_browser.mdx | 2 +- api_docs/kbn_core_plugins_browser_mocks.mdx | 2 +- api_docs/kbn_core_plugins_server.mdx | 2 +- api_docs/kbn_core_plugins_server_mocks.mdx | 2 +- api_docs/kbn_core_preboot_server.mdx | 2 +- api_docs/kbn_core_preboot_server_mocks.mdx | 2 +- api_docs/kbn_core_rendering_browser_mocks.mdx | 2 +- .../kbn_core_rendering_server_internal.mdx | 2 +- api_docs/kbn_core_rendering_server_mocks.mdx | 2 +- api_docs/kbn_core_root_server_internal.mdx | 2 +- .../kbn_core_saved_objects_api_browser.mdx | 2 +- .../kbn_core_saved_objects_api_server.mdx | 2 +- ...bn_core_saved_objects_api_server_mocks.mdx | 2 +- ...ore_saved_objects_base_server_internal.mdx | 2 +- ...n_core_saved_objects_base_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_browser.mdx | 2 +- ...bn_core_saved_objects_browser_internal.mdx | 2 +- .../kbn_core_saved_objects_browser_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_common.mdx | 2 +- ..._objects_import_export_server_internal.mdx | 2 +- ...ved_objects_import_export_server_mocks.mdx | 2 +- ...aved_objects_migration_server_internal.mdx | 2 +- ...e_saved_objects_migration_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_server.mdx | 2 +- ...kbn_core_saved_objects_server_internal.mdx | 2 +- .../kbn_core_saved_objects_server_mocks.mdx | 2 +- .../kbn_core_saved_objects_utils_server.mdx | 2 +- api_docs/kbn_core_status_common.mdx | 2 +- api_docs/kbn_core_status_common_internal.mdx | 2 +- api_docs/kbn_core_status_server.mdx | 2 +- api_docs/kbn_core_status_server_internal.mdx | 2 +- api_docs/kbn_core_status_server_mocks.mdx | 2 +- ...core_test_helpers_deprecations_getters.mdx | 2 +- ...n_core_test_helpers_http_setup_browser.mdx | 2 +- api_docs/kbn_core_test_helpers_kbn_server.mdx | 2 +- ...n_core_test_helpers_so_type_serializer.mdx | 2 +- api_docs/kbn_core_test_helpers_test_utils.mdx | 2 +- api_docs/kbn_core_theme_browser.mdx | 2 +- api_docs/kbn_core_theme_browser_internal.mdx | 2 +- api_docs/kbn_core_theme_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_browser.mdx | 2 +- .../kbn_core_ui_settings_browser_internal.mdx | 2 +- .../kbn_core_ui_settings_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_common.mdx | 2 +- api_docs/kbn_core_ui_settings_server.mdx | 2 +- .../kbn_core_ui_settings_server_internal.mdx | 2 +- .../kbn_core_ui_settings_server_mocks.mdx | 2 +- api_docs/kbn_core_usage_data_server.mdx | 2 +- .../kbn_core_usage_data_server_internal.mdx | 2 +- api_docs/kbn_core_usage_data_server_mocks.mdx | 2 +- api_docs/kbn_core_user_settings_server.mdx | 2 +- ...kbn_core_user_settings_server_internal.mdx | 2 +- .../kbn_core_user_settings_server_mocks.mdx | 2 +- api_docs/kbn_crypto.mdx | 2 +- api_docs/kbn_crypto_browser.mdx | 2 +- api_docs/kbn_cypress_config.mdx | 2 +- api_docs/kbn_datemath.mdx | 2 +- api_docs/kbn_dev_cli_errors.mdx | 2 +- api_docs/kbn_dev_cli_runner.mdx | 2 +- api_docs/kbn_dev_proc_runner.mdx | 2 +- api_docs/kbn_dev_utils.mdx | 2 +- api_docs/kbn_doc_links.devdocs.json | 2 +- api_docs/kbn_doc_links.mdx | 2 +- api_docs/kbn_docs_utils.mdx | 2 +- api_docs/kbn_dom_drag_drop.mdx | 2 +- api_docs/kbn_ebt_tools.mdx | 2 +- api_docs/kbn_ecs.mdx | 2 +- api_docs/kbn_ecs_data_quality_dashboard.mdx | 2 +- api_docs/kbn_es.mdx | 2 +- api_docs/kbn_es_archiver.mdx | 2 +- api_docs/kbn_es_errors.mdx | 2 +- api_docs/kbn_es_query.mdx | 2 +- api_docs/kbn_es_types.mdx | 2 +- api_docs/kbn_eslint_plugin_imports.mdx | 2 +- api_docs/kbn_expandable_flyout.mdx | 2 +- api_docs/kbn_field_types.mdx | 2 +- api_docs/kbn_find_used_node_modules.mdx | 2 +- .../kbn_ftr_common_functional_services.mdx | 2 +- api_docs/kbn_generate.mdx | 2 +- api_docs/kbn_generate_csv.mdx | 2 +- api_docs/kbn_generate_csv_types.mdx | 2 +- api_docs/kbn_guided_onboarding.mdx | 2 +- api_docs/kbn_handlebars.mdx | 2 +- api_docs/kbn_hapi_mocks.mdx | 2 +- api_docs/kbn_health_gateway_server.mdx | 2 +- api_docs/kbn_home_sample_data_card.mdx | 2 +- api_docs/kbn_home_sample_data_tab.mdx | 2 +- api_docs/kbn_i18n.mdx | 2 +- api_docs/kbn_i18n_react.mdx | 2 +- api_docs/kbn_import_resolver.mdx | 2 +- api_docs/kbn_infra_forge.mdx | 2 +- api_docs/kbn_interpreter.mdx | 2 +- api_docs/kbn_io_ts_utils.mdx | 2 +- api_docs/kbn_jest_serializers.mdx | 2 +- api_docs/kbn_journeys.mdx | 2 +- api_docs/kbn_json_ast.mdx | 2 +- api_docs/kbn_kibana_manifest_schema.mdx | 2 +- .../kbn_language_documentation_popover.mdx | 2 +- api_docs/kbn_logging.mdx | 2 +- api_docs/kbn_logging_mocks.mdx | 2 +- api_docs/kbn_managed_vscode_config.mdx | 2 +- api_docs/kbn_mapbox_gl.mdx | 2 +- api_docs/kbn_maps_vector_tile_utils.mdx | 2 +- api_docs/kbn_ml_agg_utils.mdx | 2 +- api_docs/kbn_ml_anomaly_utils.mdx | 2 +- api_docs/kbn_ml_date_picker.mdx | 2 +- api_docs/kbn_ml_error_utils.mdx | 2 +- api_docs/kbn_ml_is_defined.mdx | 2 +- api_docs/kbn_ml_is_populated_object.mdx | 2 +- api_docs/kbn_ml_local_storage.mdx | 2 +- api_docs/kbn_ml_nested_property.mdx | 2 +- api_docs/kbn_ml_number_utils.mdx | 2 +- api_docs/kbn_ml_query_utils.mdx | 2 +- api_docs/kbn_ml_random_sampler_utils.mdx | 2 +- api_docs/kbn_ml_route_utils.mdx | 2 +- api_docs/kbn_ml_string_hash.mdx | 2 +- api_docs/kbn_ml_trained_models_utils.mdx | 2 +- api_docs/kbn_ml_url_state.mdx | 2 +- api_docs/kbn_monaco.mdx | 2 +- api_docs/kbn_object_versioning.mdx | 2 +- api_docs/kbn_observability_alert_details.mdx | 2 +- api_docs/kbn_optimizer.mdx | 2 +- api_docs/kbn_optimizer_webpack_helpers.mdx | 2 +- api_docs/kbn_osquery_io_ts_types.mdx | 2 +- ..._performance_testing_dataset_extractor.mdx | 2 +- api_docs/kbn_plugin_generator.mdx | 2 +- api_docs/kbn_plugin_helpers.mdx | 2 +- api_docs/kbn_random_sampling.mdx | 2 +- api_docs/kbn_react_field.mdx | 2 +- api_docs/kbn_repo_file_maps.mdx | 2 +- api_docs/kbn_repo_linter.mdx | 2 +- api_docs/kbn_repo_path.mdx | 2 +- api_docs/kbn_repo_source_classifier.mdx | 2 +- api_docs/kbn_reporting_common.mdx | 2 +- api_docs/kbn_rison.mdx | 2 +- api_docs/kbn_rule_data_utils.mdx | 2 +- api_docs/kbn_saved_objects_settings.mdx | 2 +- api_docs/kbn_security_solution_side_nav.mdx | 2 +- ...kbn_security_solution_storybook_config.mdx | 2 +- .../kbn_securitysolution_autocomplete.mdx | 2 +- api_docs/kbn_securitysolution_data_table.mdx | 2 +- api_docs/kbn_securitysolution_ecs.mdx | 2 +- api_docs/kbn_securitysolution_es_utils.mdx | 2 +- ...ritysolution_exception_list_components.mdx | 2 +- api_docs/kbn_securitysolution_grouping.mdx | 2 +- api_docs/kbn_securitysolution_hook_utils.mdx | 2 +- ..._securitysolution_io_ts_alerting_types.mdx | 2 +- .../kbn_securitysolution_io_ts_list_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_utils.mdx | 2 +- api_docs/kbn_securitysolution_list_api.mdx | 2 +- .../kbn_securitysolution_list_constants.mdx | 2 +- api_docs/kbn_securitysolution_list_hooks.mdx | 2 +- api_docs/kbn_securitysolution_list_utils.mdx | 2 +- api_docs/kbn_securitysolution_rules.mdx | 2 +- api_docs/kbn_securitysolution_t_grid.mdx | 2 +- api_docs/kbn_securitysolution_utils.mdx | 2 +- api_docs/kbn_server_http_tools.mdx | 2 +- api_docs/kbn_server_route_repository.mdx | 2 +- api_docs/kbn_serverless_project_switcher.mdx | 2 +- api_docs/kbn_serverless_storybook_config.mdx | 2 +- api_docs/kbn_shared_svg.mdx | 2 +- api_docs/kbn_shared_ux_avatar_solution.mdx | 2 +- ...ared_ux_avatar_user_profile_components.mdx | 2 +- .../kbn_shared_ux_button_exit_full_screen.mdx | 2 +- ...hared_ux_button_exit_full_screen_mocks.mdx | 2 +- api_docs/kbn_shared_ux_button_toolbar.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_chrome_navigation.mdx | 2 +- api_docs/kbn_shared_ux_file_context.mdx | 2 +- api_docs/kbn_shared_ux_file_image.mdx | 2 +- api_docs/kbn_shared_ux_file_image_mocks.mdx | 2 +- api_docs/kbn_shared_ux_file_mocks.mdx | 2 +- api_docs/kbn_shared_ux_file_picker.mdx | 2 +- api_docs/kbn_shared_ux_file_types.mdx | 2 +- api_docs/kbn_shared_ux_file_upload.mdx | 2 +- api_docs/kbn_shared_ux_file_util.mdx | 2 +- api_docs/kbn_shared_ux_link_redirect_app.mdx | 2 +- .../kbn_shared_ux_link_redirect_app_mocks.mdx | 2 +- api_docs/kbn_shared_ux_markdown.mdx | 2 +- api_docs/kbn_shared_ux_markdown_mocks.mdx | 2 +- .../kbn_shared_ux_page_analytics_no_data.mdx | 2 +- ...shared_ux_page_analytics_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_page_kibana_no_data.mdx | 2 +- ...bn_shared_ux_page_kibana_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_page_kibana_template.mdx | 2 +- ...n_shared_ux_page_kibana_template_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data.mdx | 2 +- .../kbn_shared_ux_page_no_data_config.mdx | 2 +- ...bn_shared_ux_page_no_data_config_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_solution_nav.mdx | 2 +- .../kbn_shared_ux_prompt_no_data_views.mdx | 2 +- ...n_shared_ux_prompt_no_data_views_mocks.mdx | 2 +- api_docs/kbn_shared_ux_prompt_not_found.mdx | 2 +- api_docs/kbn_shared_ux_router.mdx | 2 +- api_docs/kbn_shared_ux_router_mocks.mdx | 2 +- api_docs/kbn_shared_ux_storybook_config.mdx | 2 +- api_docs/kbn_shared_ux_storybook_mock.mdx | 2 +- api_docs/kbn_shared_ux_utility.mdx | 2 +- api_docs/kbn_slo_schema.mdx | 2 +- api_docs/kbn_some_dev_log.mdx | 2 +- api_docs/kbn_std.mdx | 2 +- api_docs/kbn_stdio_dev_helpers.mdx | 2 +- api_docs/kbn_storybook.mdx | 2 +- api_docs/kbn_telemetry_tools.mdx | 2 +- api_docs/kbn_test.mdx | 2 +- api_docs/kbn_test_jest_helpers.mdx | 2 +- api_docs/kbn_test_subj_selector.mdx | 2 +- api_docs/kbn_tooling_log.mdx | 2 +- api_docs/kbn_ts_projects.mdx | 2 +- api_docs/kbn_typed_react_router_config.mdx | 2 +- api_docs/kbn_ui_actions_browser.mdx | 2 +- api_docs/kbn_ui_shared_deps_src.mdx | 2 +- api_docs/kbn_ui_theme.mdx | 2 +- api_docs/kbn_url_state.mdx | 2 +- api_docs/kbn_user_profile_components.mdx | 2 +- api_docs/kbn_utility_types.mdx | 2 +- api_docs/kbn_utility_types_jest.mdx | 2 +- api_docs/kbn_utils.mdx | 2 +- api_docs/kbn_yarn_lock_validator.mdx | 2 +- api_docs/kibana_overview.mdx | 2 +- api_docs/kibana_react.mdx | 2 +- api_docs/kibana_utils.mdx | 2 +- api_docs/kubernetes_security.mdx | 2 +- api_docs/lens.devdocs.json | 14 + api_docs/lens.mdx | 4 +- api_docs/license_api_guard.mdx | 2 +- api_docs/license_management.mdx | 2 +- api_docs/licensing.mdx | 2 +- api_docs/lists.mdx | 2 +- api_docs/management.mdx | 2 +- api_docs/maps.devdocs.json | 30 +- api_docs/maps.mdx | 4 +- api_docs/maps_ems.mdx | 2 +- api_docs/ml.mdx | 2 +- api_docs/monitoring.mdx | 2 +- api_docs/monitoring_collection.mdx | 2 +- api_docs/navigation.mdx | 2 +- api_docs/newsfeed.mdx | 2 +- api_docs/notifications.mdx | 2 +- api_docs/observability.devdocs.json | 2 +- api_docs/observability.mdx | 4 +- api_docs/observability_onboarding.mdx | 2 +- api_docs/observability_shared.mdx | 2 +- api_docs/osquery.mdx | 2 +- api_docs/plugin_directory.mdx | 18 +- api_docs/presentation_util.mdx | 2 +- api_docs/profiling.devdocs.json | 2 +- api_docs/profiling.mdx | 2 +- api_docs/remote_clusters.mdx | 2 +- api_docs/reporting.mdx | 2 +- api_docs/rollup.mdx | 2 +- api_docs/rule_registry.mdx | 2 +- api_docs/runtime_fields.mdx | 2 +- api_docs/saved_objects.mdx | 2 +- api_docs/saved_objects_finder.mdx | 2 +- api_docs/saved_objects_management.mdx | 2 +- api_docs/saved_objects_tagging.mdx | 2 +- api_docs/saved_objects_tagging_oss.mdx | 2 +- api_docs/saved_search.mdx | 2 +- api_docs/screenshot_mode.mdx | 2 +- api_docs/screenshotting.mdx | 2 +- api_docs/security.mdx | 2 +- api_docs/security_solution.mdx | 2 +- api_docs/serverless.mdx | 2 +- api_docs/serverless_observability.mdx | 2 +- api_docs/serverless_search.mdx | 2 +- api_docs/serverless_security.mdx | 2 +- api_docs/session_view.mdx | 2 +- api_docs/share.devdocs.json | 22 ++ api_docs/share.mdx | 4 +- api_docs/snapshot_restore.mdx | 2 +- api_docs/spaces.mdx | 2 +- api_docs/stack_alerts.mdx | 2 +- api_docs/stack_connectors.mdx | 2 +- api_docs/task_manager.mdx | 2 +- api_docs/telemetry.mdx | 2 +- api_docs/telemetry_collection_manager.mdx | 2 +- api_docs/telemetry_collection_xpack.mdx | 2 +- api_docs/telemetry_management_section.mdx | 2 +- api_docs/threat_intelligence.mdx | 2 +- api_docs/timelines.mdx | 2 +- api_docs/transform.mdx | 2 +- api_docs/triggers_actions_ui.mdx | 2 +- api_docs/ui_actions.mdx | 2 +- api_docs/ui_actions_enhanced.mdx | 2 +- api_docs/unified_field_list.mdx | 2 +- api_docs/unified_histogram.mdx | 2 +- api_docs/unified_search.mdx | 2 +- api_docs/unified_search_autocomplete.mdx | 2 +- api_docs/url_forwarding.mdx | 2 +- api_docs/usage_collection.mdx | 2 +- api_docs/ux.mdx | 2 +- api_docs/vis_default_editor.mdx | 2 +- api_docs/vis_type_gauge.mdx | 2 +- api_docs/vis_type_heatmap.mdx | 2 +- api_docs/vis_type_pie.mdx | 2 +- api_docs/vis_type_table.mdx | 2 +- api_docs/vis_type_timelion.mdx | 2 +- api_docs/vis_type_timeseries.mdx | 2 +- api_docs/vis_type_vega.mdx | 2 +- api_docs/vis_type_vislib.mdx | 2 +- api_docs/vis_type_xy.mdx | 2 +- api_docs/visualization_ui_components.mdx | 2 +- api_docs/visualizations.mdx | 2 +- 525 files changed, 977 insertions(+), 560 deletions(-) diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index e855e1485295a..3e60af7b58cff 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-05-17 +date: 2023-05-18 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 950030195963a..6cc92b7576f03 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-05-17 +date: 2023-05-18 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 6772ccd066138..32f772b6d121c 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-05-17 +date: 2023-05-18 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 7fc9c1018e085..43c50f649ae26 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-05-17 +date: 2023-05-18 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 eb018893dc17d..f95e36e640515 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-05-17 +date: 2023-05-18 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 9abd2e24be559..fabe37bd4ffe7 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-05-17 +date: 2023-05-18 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 ed867e86ef4aa..6af46b50face7 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-05-17 +date: 2023-05-18 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 cb100ec51f328..a45b617ef768f 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-05-17 +date: 2023-05-18 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 6b190351ad95e..dcd42297a5ce8 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-05-17 +date: 2023-05-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'canvas'] --- import canvasObj from './canvas.devdocs.json'; diff --git a/api_docs/cases.devdocs.json b/api_docs/cases.devdocs.json index 4b3cd8fd8e35d..9e96296b9afb5 100644 --- a/api_docs/cases.devdocs.json +++ b/api_docs/cases.devdocs.json @@ -970,7 +970,7 @@ "section": "def-common.CasesFindResponseUI", "text": "CasesFindResponseUI" }, - ">; getCasesStatus: (query: { from?: string | undefined; to?: string | undefined; owner?: string | string[] | undefined; }, signal?: AbortSignal | undefined) => Promise<{ countOpenCases: number; countInProgressCases: number; countClosedCases: number; }>; getCasesMetrics: (query: { features: string[]; } & { from?: string | undefined; to?: string | undefined; owner?: string | string[] | undefined; }, signal?: AbortSignal | undefined) => Promise<{ mttr?: number | null | undefined; }>; bulkGet: (params: { ids: string[]; }, signal?: AbortSignal | undefined) => Promise<{ cases: { id: string; description: string; title: string; owner: string; version: string; totalComments: number; status: ", + ">; getCasesStatus: (query: { from?: string | undefined; to?: string | undefined; owner?: string | string[] | undefined; }, signal?: AbortSignal | undefined) => Promise<{ countOpenCases: number; countInProgressCases: number; countClosedCases: number; }>; getCasesMetrics: (query: { features: string[]; } & { from?: string | undefined; to?: string | undefined; owner?: string | string[] | undefined; }, signal?: AbortSignal | undefined) => Promise<{ mttr?: number | null | undefined; }>; bulkGet: (params: { ids: string[]; }, signal?: AbortSignal | undefined) => Promise<{ cases: ({ description: string; status: ", { "pluginId": "@kbn/cases-components", "scope": "common", @@ -978,7 +978,159 @@ "section": "def-common.CaseStatuses", "text": "CaseStatuses" }, - "; created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }; }[]; errors: { error: string; message: string; status: number | undefined; caseId: string; }[]; }>; }; }" + "; tags: string[]; title: string; connector: { id: string; } & (({ type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, + ".casesWebhook; fields: null; } & { name: string; }) | ({ type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, + ".jira; fields: { issueType: string | null; priority: string | null; parent: string | null; } | null; } & { name: string; }) | ({ type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, + ".none; fields: null; } & { name: string; }) | ({ type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, + ".resilient; fields: { incidentTypes: string[] | null; severityCode: string | null; } | null; } & { name: string; }) | ({ type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, + ".serviceNowITSM; fields: { impact: string | null; severity: string | null; urgency: string | null; category: string | null; subcategory: string | null; } | null; } & { name: string; }) | ({ type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, + ".serviceNowSIR; fields: { category: string | null; destIp: boolean | null; malwareHash: boolean | null; malwareUrl: boolean | null; priority: string | null; sourceIp: boolean | null; subcategory: string | null; } | null; } & { name: string; }) | ({ type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, + ".swimlane; fields: { caseId: string | null; } | null; } & { name: string; })); settings: { syncAlerts: boolean; }; owner: string; severity: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.CaseSeverity", + "text": "CaseSeverity" + }, + "; assignees: { uid: string; }[]; } & { duration: number | null; closed_at: string | null; closed_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }; external_service: ({ connector_id: string; } & { connector_name: string; external_id: string; external_title: string; external_url: string; pushed_at: string; pushed_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }; }) | null; updated_at: string | null; updated_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; } & { id: string; totalComment: number; totalAlerts: number; version: string; } & { comments?: ((({ comment: string; type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.CommentType", + "text": "CommentType" + }, + ".user; owner: string; } & { created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }; owner: string; pushed_at: string | null; pushed_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; updated_at: string | null; updated_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; }) | ({ type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.CommentType", + "text": "CommentType" + }, + ".alert; alertId: string | string[]; index: string | string[]; rule: { id: string | null; name: string | null; }; owner: string; } & { created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }; owner: string; pushed_at: string | null; pushed_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; updated_at: string | null; updated_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; }) | ({ type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.CommentType", + "text": "CommentType" + }, + ".actions; comment: string; actions: { targets: { hostname: string; endpointId: string; }[]; type: string; }; owner: string; } & { created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }; owner: string; pushed_at: string | null; pushed_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; updated_at: string | null; updated_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; }) | (({ externalReferenceId: string; externalReferenceStorage: { type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ExternalReferenceStorageType", + "text": "ExternalReferenceStorageType" + }, + ".elasticSearchDoc; }; externalReferenceAttachmentTypeId: string; externalReferenceMetadata: { [x: string]: ", + { + "pluginId": "@kbn/utility-types", + "scope": "common", + "docId": "kibKbnUtilityTypesPluginApi", + "section": "def-common.JsonValue", + "text": "JsonValue" + }, + "; } | null; type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.CommentType", + "text": "CommentType" + }, + ".externalReference; owner: string; } | { externalReferenceId: string; externalReferenceStorage: { type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ExternalReferenceStorageType", + "text": "ExternalReferenceStorageType" + }, + ".savedObject; soType: string; }; externalReferenceAttachmentTypeId: string; externalReferenceMetadata: { [x: string]: ", + { + "pluginId": "@kbn/utility-types", + "scope": "common", + "docId": "kibKbnUtilityTypesPluginApi", + "section": "def-common.JsonValue", + "text": "JsonValue" + }, + "; } | null; type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.CommentType", + "text": "CommentType" + }, + ".externalReference; owner: string; }) & { created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }; owner: string; pushed_at: string | null; pushed_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; updated_at: string | null; updated_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; }) | ({ type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.CommentType", + "text": "CommentType" + }, + ".persistableState; owner: string; persistableStateAttachmentTypeId: string; persistableStateAttachmentState: { [x: string]: ", + { + "pluginId": "@kbn/utility-types", + "scope": "common", + "docId": "kibKbnUtilityTypesPluginApi", + "section": "def-common.JsonValue", + "text": "JsonValue" + }, + "; }; } & { created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }; owner: string; pushed_at: string | null; pushed_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; updated_at: string | null; updated_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; })) & { id: string; version: string; })[] | undefined; })[]; errors: { error: string; message: string; status: number | undefined; caseId: string; }[]; }>; }; }" ], "path": "x-pack/plugins/cases/public/types.ts", "deprecated": false, @@ -2208,7 +2360,7 @@ "label": "CasesBulkGetResponse", "description": [], "signature": [ - "{ cases: { id: string; description: string; title: string; owner: string; version: string; totalComments: number; status: ", + "{ cases: ({ description: string; status: ", { "pluginId": "@kbn/cases-components", "scope": "common", @@ -2216,7 +2368,159 @@ "section": "def-common.CaseStatuses", "text": "CaseStatuses" }, - "; created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }; }[]; errors: { error: string; message: string; status: number | undefined; caseId: string; }[]; }" + "; tags: string[]; title: string; connector: { id: string; } & (({ type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, + ".casesWebhook; fields: null; } & { name: string; }) | ({ type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, + ".jira; fields: { issueType: string | null; priority: string | null; parent: string | null; } | null; } & { name: string; }) | ({ type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, + ".none; fields: null; } & { name: string; }) | ({ type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, + ".resilient; fields: { incidentTypes: string[] | null; severityCode: string | null; } | null; } & { name: string; }) | ({ type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, + ".serviceNowITSM; fields: { impact: string | null; severity: string | null; urgency: string | null; category: string | null; subcategory: string | null; } | null; } & { name: string; }) | ({ type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, + ".serviceNowSIR; fields: { category: string | null; destIp: boolean | null; malwareHash: boolean | null; malwareUrl: boolean | null; priority: string | null; sourceIp: boolean | null; subcategory: string | null; } | null; } & { name: string; }) | ({ type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ConnectorTypes", + "text": "ConnectorTypes" + }, + ".swimlane; fields: { caseId: string | null; } | null; } & { name: string; })); settings: { syncAlerts: boolean; }; owner: string; severity: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.CaseSeverity", + "text": "CaseSeverity" + }, + "; assignees: { uid: string; }[]; } & { duration: number | null; closed_at: string | null; closed_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }; external_service: ({ connector_id: string; } & { connector_name: string; external_id: string; external_title: string; external_url: string; pushed_at: string; pushed_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }; }) | null; updated_at: string | null; updated_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; } & { id: string; totalComment: number; totalAlerts: number; version: string; } & { comments?: ((({ comment: string; type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.CommentType", + "text": "CommentType" + }, + ".user; owner: string; } & { created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }; owner: string; pushed_at: string | null; pushed_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; updated_at: string | null; updated_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; }) | ({ type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.CommentType", + "text": "CommentType" + }, + ".alert; alertId: string | string[]; index: string | string[]; rule: { id: string | null; name: string | null; }; owner: string; } & { created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }; owner: string; pushed_at: string | null; pushed_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; updated_at: string | null; updated_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; }) | ({ type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.CommentType", + "text": "CommentType" + }, + ".actions; comment: string; actions: { targets: { hostname: string; endpointId: string; }[]; type: string; }; owner: string; } & { created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }; owner: string; pushed_at: string | null; pushed_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; updated_at: string | null; updated_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; }) | (({ externalReferenceId: string; externalReferenceStorage: { type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ExternalReferenceStorageType", + "text": "ExternalReferenceStorageType" + }, + ".elasticSearchDoc; }; externalReferenceAttachmentTypeId: string; externalReferenceMetadata: { [x: string]: ", + { + "pluginId": "@kbn/utility-types", + "scope": "common", + "docId": "kibKbnUtilityTypesPluginApi", + "section": "def-common.JsonValue", + "text": "JsonValue" + }, + "; } | null; type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.CommentType", + "text": "CommentType" + }, + ".externalReference; owner: string; } | { externalReferenceId: string; externalReferenceStorage: { type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ExternalReferenceStorageType", + "text": "ExternalReferenceStorageType" + }, + ".savedObject; soType: string; }; externalReferenceAttachmentTypeId: string; externalReferenceMetadata: { [x: string]: ", + { + "pluginId": "@kbn/utility-types", + "scope": "common", + "docId": "kibKbnUtilityTypesPluginApi", + "section": "def-common.JsonValue", + "text": "JsonValue" + }, + "; } | null; type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.CommentType", + "text": "CommentType" + }, + ".externalReference; owner: string; }) & { created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }; owner: string; pushed_at: string | null; pushed_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; updated_at: string | null; updated_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; }) | ({ type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.CommentType", + "text": "CommentType" + }, + ".persistableState; owner: string; persistableStateAttachmentTypeId: string; persistableStateAttachmentState: { [x: string]: ", + { + "pluginId": "@kbn/utility-types", + "scope": "common", + "docId": "kibKbnUtilityTypesPluginApi", + "section": "def-common.JsonValue", + "text": "JsonValue" + }, + "; }; } & { created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }; owner: string; pushed_at: string | null; pushed_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; updated_at: string | null; updated_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; })) & { id: string; version: string; })[] | undefined; })[]; errors: { error: string; message: string; status: number | undefined; caseId: string; }[]; }" ], "path": "x-pack/plugins/cases/common/api/cases/case.ts", "deprecated": false, diff --git a/api_docs/cases.mdx b/api_docs/cases.mdx index aacbc9e38eaf7..32669643f1a59 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-05-17 +date: 2023-05-18 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 a335183e54556..754940a029fc8 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-05-17 +date: 2023-05-18 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 00b1234c661b3..48483571b97cf 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-05-17 +date: 2023-05-18 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 b235a0bd7e3a7..53758e2518ce8 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-05-17 +date: 2023-05-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudChat'] --- import cloudChatObj from './cloud_chat.devdocs.json'; diff --git a/api_docs/cloud_data_migration.mdx b/api_docs/cloud_data_migration.mdx index 41cf3df28ca12..4bf0313976667 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-05-17 +date: 2023-05-18 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 229821e9f08e2..20d8bf4e40e9e 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-05-17 +date: 2023-05-18 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 348405524a140..4f166b5268fb8 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-05-17 +date: 2023-05-18 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 3ac935a8d1ecf..ce4f5f76e5bcd 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-05-17 +date: 2023-05-18 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 65aa083db3216..a9270ea8c0474 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-05-17 +date: 2023-05-18 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 4b1c2992dde0b..538d97993c437 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-05-17 +date: 2023-05-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'contentManagement'] --- import contentManagementObj from './content_management.devdocs.json'; diff --git a/api_docs/controls.devdocs.json b/api_docs/controls.devdocs.json index ce95034b22ea9..b83dd602dbb28 100644 --- a/api_docs/controls.devdocs.json +++ b/api_docs/controls.devdocs.json @@ -265,6 +265,21 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "controls", + "id": "def-public.ControlGroupContainer.fieldFilterPredicate", + "type": "Function", + "tags": [], + "label": "fieldFilterPredicate", + "description": [], + "signature": [ + "FieldFilterPredicate", + " | undefined" + ], + "path": "src/plugins/controls/public/control_group/embeddable/control_group_container.tsx", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "controls", "id": "def-public.ControlGroupContainer.Unnamed", @@ -374,6 +389,22 @@ "deprecated": false, "trackAdoption": false, "isRequired": false + }, + { + "parentPluginId": "controls", + "id": "def-public.ControlGroupContainer.Unnamed.$5", + "type": "Function", + "tags": [], + "label": "fieldFilterPredicate", + "description": [], + "signature": [ + "FieldFilterPredicate", + " | undefined" + ], + "path": "src/plugins/controls/public/control_group/embeddable/control_group_container.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": false } ], "returnComment": [] @@ -1546,6 +1577,8 @@ }, "> | undefined, settings?: ", "ControlGroupSettings", + " | undefined, fieldFilterPredicate?: ", + "FieldFilterPredicate", " | undefined) => Promise<", { "pluginId": "controls", @@ -1634,6 +1667,22 @@ "deprecated": false, "trackAdoption": false, "isRequired": false + }, + { + "parentPluginId": "controls", + "id": "def-public.ControlGroupContainerFactory.create.$4", + "type": "Function", + "tags": [], + "label": "fieldFilterPredicate", + "description": [], + "signature": [ + "FieldFilterPredicate", + " | undefined" + ], + "path": "src/plugins/controls/public/control_group/embeddable/control_group_container_factory.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false } ], "returnComment": [] diff --git a/api_docs/controls.mdx b/api_docs/controls.mdx index d4c02a85b77c9..ccdb4450fafd8 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-05-17 +date: 2023-05-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] --- import controlsObj from './controls.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kib | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 301 | 0 | 294 | 13 | +| 304 | 0 | 297 | 14 | ## Client diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index e1d7b533061cf..5427322dec303 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-05-17 +date: 2023-05-18 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 65ac00029a7ec..ee846b24e4b36 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-05-17 +date: 2023-05-18 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 4f7bf2965f78a..5239ec70fae43 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-05-17 +date: 2023-05-18 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 492e400640a30..03ce4de03548f 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-05-17 +date: 2023-05-18 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 cd5f59e304d9e..f47af158f55e4 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-05-17 +date: 2023-05-18 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 dfecce16d3131..a81e632be4fcc 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-05-17 +date: 2023-05-18 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 6a9a36a886cea..70c46a419af51 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-05-17 +date: 2023-05-18 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 56d84f053b990..2e0a3a6570ff0 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-05-17 +date: 2023-05-18 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 81f672e8f6cd9..53c748299bb68 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-05-17 +date: 2023-05-18 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 884e4b3ed41d8..18b1a767672ea 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-05-17 +date: 2023-05-18 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 97fefdee5ac36..0dd8c11e3693b 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-05-17 +date: 2023-05-18 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 8df36e659fa01..1f679cb6206ca 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-05-17 +date: 2023-05-18 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index a52665323145a..359035c5cf8c2 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-05-17 +date: 2023-05-18 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 0ce40b0193481..c5e8d9f879b69 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-05-17 +date: 2023-05-18 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 2ebc025638299..6d91788da7de4 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-05-17 +date: 2023-05-18 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 ad8397b34a1a9..d8945c7cc34ac 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-05-17 +date: 2023-05-18 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 c2064d23eb6b6..b77f99e0dce41 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-05-17 +date: 2023-05-18 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 a88aba3855fbd..54143535b331d 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-05-17 +date: 2023-05-18 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 ccd2e2e2f6af4..85d387ca9e80f 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-05-17 +date: 2023-05-18 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 c951db65a9683..c461f87457412 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-05-17 +date: 2023-05-18 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 286b8b413e658..d05d264f2f26c 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-05-17 +date: 2023-05-18 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 18e6913b11801..7a0233b5982eb 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-05-17 +date: 2023-05-18 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 9cd80701cf198..34d4e94eddef8 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-05-17 +date: 2023-05-18 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 b04ab8eb664d9..b30da0cc90881 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-05-17 +date: 2023-05-18 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 1d76fff75b978..3d1d9a2c7e797 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-05-17 +date: 2023-05-18 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 ec7b251b47c00..05e9c47ddec44 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-05-17 +date: 2023-05-18 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 6f7b0ead23e02..9473f5c8417d1 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-05-17 +date: 2023-05-18 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 dbdb9079ba6af..8aa0dede07b9c 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-05-17 +date: 2023-05-18 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 59ce0c1dec114..14f05615a25e2 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-05-17 +date: 2023-05-18 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 857f59ad2f48b..ee12fde2ac04b 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-05-17 +date: 2023-05-18 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 2a9d8275b592c..28eccdca901da 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-05-17 +date: 2023-05-18 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 97f20a7f07559..3d22297ebe5ba 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-05-17 +date: 2023-05-18 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 c8f79ce6ad601..05fbc751c4f73 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-05-17 +date: 2023-05-18 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 8ab719f3c7762..de67910f953c8 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-05-17 +date: 2023-05-18 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 a4bb52ecb4ae5..89a86c6af703e 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-05-17 +date: 2023-05-18 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 74f5abb3bb768..0527060797610 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-05-17 +date: 2023-05-18 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 772729483e024..aac117fbf83da 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-05-17 +date: 2023-05-18 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 b2bace5396c99..ac0166d379fdc 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-05-17 +date: 2023-05-18 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 4b69ff469e4a4..659838ddc7c2b 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-05-17 +date: 2023-05-18 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 977acb0061a96..5a076ccafdcde 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-05-17 +date: 2023-05-18 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 fcd7c6c4c6549..27959bbbd9993 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-05-17 +date: 2023-05-18 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 24aa727e75ce7..ecd49c8a72a78 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-05-17 +date: 2023-05-18 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 4e7d958bb25e0..83a2b97768fb3 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-05-17 +date: 2023-05-18 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 fea73823735f9..6bee99355c42a 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-05-17 +date: 2023-05-18 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 7223ab4d0fd5c..c912824e184a5 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-05-17 +date: 2023-05-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.devdocs.json b/api_docs/fleet.devdocs.json index b16ccc6e4f08e..0a8fc41e775b7 100644 --- a/api_docs/fleet.devdocs.json +++ b/api_docs/fleet.devdocs.json @@ -22935,6 +22935,36 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "fleet", + "id": "def-common.FLEET_CLOUD_SECURITY_POSTURE_CNVM_POLICY_TEMPLATE", + "type": "string", + "tags": [], + "label": "FLEET_CLOUD_SECURITY_POSTURE_CNVM_POLICY_TEMPLATE", + "description": [], + "signature": [ + "\"vuln_mgmt\"" + ], + "path": "x-pack/plugins/fleet/common/constants/epm.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "fleet", + "id": "def-common.FLEET_CLOUD_SECURITY_POSTURE_CSPM_POLICY_TEMPLATE", + "type": "string", + "tags": [], + "label": "FLEET_CLOUD_SECURITY_POSTURE_CSPM_POLICY_TEMPLATE", + "description": [], + "signature": [ + "\"cspm\"" + ], + "path": "x-pack/plugins/fleet/common/constants/epm.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "fleet", "id": "def-common.FLEET_CLOUD_SECURITY_POSTURE_KSPM_POLICY_TEMPLATE", diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index 25b0a09e60a3b..e4a58dad79fce 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-05-17 +date: 2023-05-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] --- import fleetObj from './fleet.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) for questi | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 1119 | 3 | 1014 | 31 | +| 1121 | 3 | 1016 | 31 | ## Client diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index 1c8b943c85f4d..394ad10bcf599 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-05-17 +date: 2023-05-18 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 bb88616776253..842da8c236c9f 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-05-17 +date: 2023-05-18 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 84fa069e0b654..eeac16f32cfda 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-05-17 +date: 2023-05-18 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 4348f9558e868..25b9f0efca4ad 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-05-17 +date: 2023-05-18 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 ec96c48980c3a..c530e6ac5db6e 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-05-17 +date: 2023-05-18 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 8f04324acbb96..89b01419fd28a 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-05-17 +date: 2023-05-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] --- import indexManagementObj from './index_management.devdocs.json'; diff --git a/api_docs/infra.devdocs.json b/api_docs/infra.devdocs.json index 767658d05117b..28ccc0b48df5d 100644 --- a/api_docs/infra.devdocs.json +++ b/api_docs/infra.devdocs.json @@ -379,6 +379,20 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "infra", + "id": "def-public.InfraClientStartExports.locators", + "type": "Object", + "tags": [], + "label": "locators", + "description": [], + "signature": [ + "InfraLocators" + ], + "path": "x-pack/plugins/infra/public/types.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "infra", "id": "def-public.InfraClientStartExports.ContainerMetricsTable", diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index 8e02ae1585410..a7b30f4f94173 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-05-17 +date: 2023-05-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] --- import infraObj from './infra.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/infra-monitoring-ui](https://github.com/orgs/elastic/teams/inf | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 48 | 0 | 45 | 13 | +| 49 | 0 | 46 | 14 | ## Client diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index 535f1fd64e431..074c523284a8b 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-05-17 +date: 2023-05-18 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 d6195aac5882f..ef1461f6e6042 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-05-17 +date: 2023-05-18 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 7b2766c7c3199..023b876f26f9f 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-05-17 +date: 2023-05-18 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 e6301ac3d8ea3..34d571f5c683e 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-05-17 +date: 2023-05-18 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 60d03738f8f28..f2b63c78bf3c2 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-05-17 +date: 2023-05-18 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 a3009c6158f2a..61776648c317f 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-05-17 +date: 2023-05-18 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 edb34ef2d8d6b..e9a300d012135 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-05-17 +date: 2023-05-18 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 bf238e1b912b2..285b2e1309339 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-05-17 +date: 2023-05-18 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 1006bbc76929a..4a3344a24af8a 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-05-17 +date: 2023-05-18 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 2ad37ff508a59..0395a1284cf05 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-05-17 +date: 2023-05-18 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 a2958bae68f1c..827bceefb95f6 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-05-17 +date: 2023-05-18 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 994ca289f64e4..a626eaa5b2421 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-05-17 +date: 2023-05-18 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 8e44807620675..cb991780a9bbb 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-05-17 +date: 2023-05-18 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 e1c0d653df528..6bd6752fb0e29 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-05-17 +date: 2023-05-18 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 c2f3c2eabcec1..0b140ececcced 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-05-17 +date: 2023-05-18 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 5e637c3c96126..b81267c698357 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-05-17 +date: 2023-05-18 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 dac721622c7f8..595127447bbc2 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-05-17 +date: 2023-05-18 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 ec7b3340369ae..94f0cd1bac0e6 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-05-17 +date: 2023-05-18 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 36462a5d23b22..335e5561adac3 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-05-17 +date: 2023-05-18 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 7d059c0d0cdcf..2206e57e2aed4 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-05-17 +date: 2023-05-18 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 1a05a8235050d..38159f5268dc1 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-05-17 +date: 2023-05-18 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 5933a13f66144..393447e4814e2 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-05-17 +date: 2023-05-18 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 68a7c99dea6a4..045186834ec21 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-05-17 +date: 2023-05-18 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 d5606d652e8a6..1d49604bcec54 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-05-17 +date: 2023-05-18 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 cedc098f537d3..4e9beaee303c2 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-05-17 +date: 2023-05-18 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 315e81fbedc75..74480aced409d 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-05-17 +date: 2023-05-18 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 5598e6262f068..21d269f97d52a 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-05-17 +date: 2023-05-18 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 23c88c1058689..c10cc1c04a08a 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-05-17 +date: 2023-05-18 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 07c8dcc11a080..952776014650a 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-05-17 +date: 2023-05-18 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 52fff81f7e2eb..e979912a9df49 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-05-17 +date: 2023-05-18 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 27a967d8f7a14..fe484d74b3206 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-05-17 +date: 2023-05-18 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 b9e40e0cb5469..944939010e36a 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-05-17 +date: 2023-05-18 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 5d37c4f9e3ebe..3011f4a8352eb 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-05-17 +date: 2023-05-18 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 d32b7e08171f4..502d7311342e2 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-05-17 +date: 2023-05-18 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 798dae00f7b3a..6f405a43f46b1 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-05-17 +date: 2023-05-18 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_table_list.mdx b/api_docs/kbn_content_management_table_list.mdx index cfded8d8a66eb..b44e5388b6463 100644 --- a/api_docs/kbn_content_management_table_list.mdx +++ b/api_docs/kbn_content_management_table_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list title: "@kbn/content-management-table-list" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list plugin -date: 2023-05-17 +date: 2023-05-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list'] --- import kbnContentManagementTableListObj from './kbn_content_management_table_list.devdocs.json'; diff --git a/api_docs/kbn_content_management_utils.mdx b/api_docs/kbn_content_management_utils.mdx index c0cc4b4d3e85e..6c63caf243fb6 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-05-17 +date: 2023-05-18 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 1e5eaf0640525..9a7e292b7394e 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-05-17 +date: 2023-05-18 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 6f9afc461dfc1..88aa810d3388f 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-05-17 +date: 2023-05-18 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 e0e3ad9890f84..6de186622bb1d 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-05-17 +date: 2023-05-18 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 d693be3769c04..b7b234c58c341 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-05-17 +date: 2023-05-18 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 846439e014972..1855a5c30973e 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-05-17 +date: 2023-05-18 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 fdd073226ef88..c90d3f3ced9e7 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-05-17 +date: 2023-05-18 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 2a008dce87ce0..dbc419571227a 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-05-17 +date: 2023-05-18 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 77503ed0129fe..8d1fa44ef3c6a 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-05-17 +date: 2023-05-18 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 cf75cfa78258c..4de611b1af33e 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-05-17 +date: 2023-05-18 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 03b3d412db96e..f03028872918f 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-05-17 +date: 2023-05-18 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 939ccc38b2721..6438f13610031 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-05-17 +date: 2023-05-18 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 892f41c0ccbd0..4b229a57a6643 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-05-17 +date: 2023-05-18 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 02bc0d3c13c5e..35ecae4b739bf 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-05-17 +date: 2023-05-18 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 3e4c4ecce1159..6e422fb91de9f 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-05-17 +date: 2023-05-18 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 97cf86f54a9c6..7d70f333d839d 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-05-17 +date: 2023-05-18 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 a9ea525aef170..86e81c5a719e2 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-05-17 +date: 2023-05-18 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 2aef365eedcb0..61e6f16b6127f 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-05-17 +date: 2023-05-18 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 703bead0c8e48..06283a0bbef67 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-05-17 +date: 2023-05-18 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 25427ff15d1d1..7f0129187a4dd 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-05-17 +date: 2023-05-18 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 b0dd760e206d7..af644b8e52d6f 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-05-17 +date: 2023-05-18 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 f7a4dd237e104..1a91b8d322b1b 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-05-17 +date: 2023-05-18 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 51df3944dfcec..2aac2255ab9a4 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-05-17 +date: 2023-05-18 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 ac5481b638c77..e34b72b400da3 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-05-17 +date: 2023-05-18 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 4bf88afff2286..655004b1ce293 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-05-17 +date: 2023-05-18 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 672bb021750ca..2d9dcc213534d 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-05-17 +date: 2023-05-18 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 d952b1217d497..9c94cc4451269 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-05-17 +date: 2023-05-18 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 ca9118998faea..4ada9975aa2c1 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-05-17 +date: 2023-05-18 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 7c48ede9f2ecf..1e9bf010f38fc 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-05-17 +date: 2023-05-18 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 8dfbda06c53f8..9792904bf157b 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-05-17 +date: 2023-05-18 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 a0b6f82a6d662..ab3db5274b4e6 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-05-17 +date: 2023-05-18 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 495b2400fd294..ce3405889b916 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-05-17 +date: 2023-05-18 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 7aec8b79c1233..d7988fb4cd29d 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-05-17 +date: 2023-05-18 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 03c4a1b601ecd..664d44cedf39e 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-05-17 +date: 2023-05-18 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 7da5660a129fc..71868055e6aaa 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-05-17 +date: 2023-05-18 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 54ecc0a8aee2a..d81a56fb3e4bb 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-05-17 +date: 2023-05-18 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 4ea245d0a2cae..18356638cdb26 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-05-17 +date: 2023-05-18 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 826eeb016b0cd..6f513c2433be1 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-05-17 +date: 2023-05-18 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 811023221ac8d..70a94f2795005 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-05-17 +date: 2023-05-18 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 ac6168bb6ef24..23bd1b28f269f 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-05-17 +date: 2023-05-18 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 459711c5b2b45..cb8fd74dc6f08 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-05-17 +date: 2023-05-18 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 70d0561450eff..cb1607ce006b8 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-05-17 +date: 2023-05-18 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 a51b9b8cd6f4b..7182ec9801f67 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-05-17 +date: 2023-05-18 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 c5db2dcc5fde1..c6ae9f496b705 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-05-17 +date: 2023-05-18 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 745ed270b1c6e..0893543593c4d 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-05-17 +date: 2023-05-18 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 a808df2566d1e..3a54c26a8f4e2 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-05-17 +date: 2023-05-18 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 f8971850a2e20..05976c31abbec 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-05-17 +date: 2023-05-18 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 1fda58a8a8684..1481ec925f611 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-05-17 +date: 2023-05-18 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 0a1262f08b605..1f79f48492d91 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-05-17 +date: 2023-05-18 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 77f2251712978..e780eb7ca482d 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-05-17 +date: 2023-05-18 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 7d8c20df224de..dd61c8fe6bee3 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-05-17 +date: 2023-05-18 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 d2ba251da5bcc..ff0b6f7a9bf82 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-05-17 +date: 2023-05-18 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 d6aff42d57183..ce6fb5e96947b 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-05-17 +date: 2023-05-18 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 b1eaca8e48376..f284c4179f0a9 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-05-17 +date: 2023-05-18 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 ae34c71750240..437d203433a29 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-05-17 +date: 2023-05-18 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 17870d9da17e0..bdc30f3318baf 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-05-17 +date: 2023-05-18 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 ffaa2b8c19107..65b309d23034d 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-05-17 +date: 2023-05-18 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 fe43d166816aa..8a85e855f93f4 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-05-17 +date: 2023-05-18 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 3aae5a951fbe6..058b0f1bf4a4d 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-05-17 +date: 2023-05-18 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 0f7697ce973f7..2dd56e2078d4c 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-05-17 +date: 2023-05-18 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 5ba4135b66531..8416821d78387 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-05-17 +date: 2023-05-18 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 5088f60babcfb..53ce842ae81e8 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-05-17 +date: 2023-05-18 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 54ea9fa44c5e2..bb2134b5d0276 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-05-17 +date: 2023-05-18 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 ef50b9d96725e..9e85e4d781894 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-05-17 +date: 2023-05-18 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 c1255bccd85a5..e8895a4710402 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-05-17 +date: 2023-05-18 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 3837a9a6c88c5..dbb43f9eb36be 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-05-17 +date: 2023-05-18 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 46843cbc98ea3..7b7b963315245 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-05-17 +date: 2023-05-18 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 6ca4ac48e8a80..45741a28acf52 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-05-17 +date: 2023-05-18 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 9ad9c2455dc75..a696a462232f7 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-05-17 +date: 2023-05-18 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 614366f901004..c05f05b3d3fac 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-05-17 +date: 2023-05-18 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 f9650152e3886..73a3dca1cc36a 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-05-17 +date: 2023-05-18 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 14a1afdf904dc..d8bf9a68571b3 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-05-17 +date: 2023-05-18 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 325ba4df5f0ea..8396237623d4d 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-05-17 +date: 2023-05-18 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 b162956b4a31c..531f3aabd5ca0 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-05-17 +date: 2023-05-18 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 0a07c77fc6df4..03e6bb79df59d 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-05-17 +date: 2023-05-18 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 229320dbfc123..bcbdb003a67af 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-05-17 +date: 2023-05-18 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 49a81d073c149..0a6010884a1fc 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-05-17 +date: 2023-05-18 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 d1821cc1e9015..c38617aaa1513 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-05-17 +date: 2023-05-18 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 6cbb7f6e996d7..1dd7bde101ca3 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-05-17 +date: 2023-05-18 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 3911efa68bd70..4f257285463dc 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-05-17 +date: 2023-05-18 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 9f3c0a681432e..58994a67f82a7 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-05-17 +date: 2023-05-18 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 7f228c8f04ccf..8a1530fb238ad 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-05-17 +date: 2023-05-18 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 799992275fdc6..c997227d7fef0 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-05-17 +date: 2023-05-18 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 0683ce4223935..2bdf92938be05 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-05-17 +date: 2023-05-18 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 51feafa63e875..f413f7fa74666 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-05-17 +date: 2023-05-18 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 84ce2f20175ae..c15fc274244b0 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-05-17 +date: 2023-05-18 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 40ad4e0d6aaf8..239dc1a59919b 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-05-17 +date: 2023-05-18 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 7e8ee8e075366..647917da43094 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-05-17 +date: 2023-05-18 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 bbbe38c4b7980..03134f6ab8d97 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-05-17 +date: 2023-05-18 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 a18477c3ff47f..15f74d5e291a5 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-05-17 +date: 2023-05-18 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 37f3099b69bc5..3389efb599c4a 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-05-17 +date: 2023-05-18 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 28fe22624cd56..f609247f55e38 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-05-17 +date: 2023-05-18 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 df01e97e804f5..fdce3130ae39a 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-05-17 +date: 2023-05-18 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 91b399a737c0d..1f7eaf1ed4cfe 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-05-17 +date: 2023-05-18 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 e3f6c9ff90c2f..4bf4d6cd145f6 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-05-17 +date: 2023-05-18 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 364d25dd0fdbc..775848f51cace 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-05-17 +date: 2023-05-18 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 b914659fb359d..741bd1010d270 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-05-17 +date: 2023-05-18 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 7c72bc785cc9b..f77aa4788fc7e 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-05-17 +date: 2023-05-18 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 d59ec771dc00a..1bc934b47fef7 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-05-17 +date: 2023-05-18 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 bd069e1eda1a3..ab7d91ad319f7 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-05-17 +date: 2023-05-18 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 142dea27a70e9..1b40455b4084e 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-05-17 +date: 2023-05-18 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 cfee9cfb80186..035e121ce9ee8 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-05-17 +date: 2023-05-18 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 74715ce27e3ff..75d53cb85680c 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-05-17 +date: 2023-05-18 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 4e0ee21342e75..91e570fcbd071 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-05-17 +date: 2023-05-18 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 c6c0bef3ec7b3..de29148aa99c3 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-05-17 +date: 2023-05-18 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 a32c0e29e3644..62b13d24d1e47 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-05-17 +date: 2023-05-18 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 f055ed2ac7c05..e12eecca53949 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-05-17 +date: 2023-05-18 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 cdb663a38f83f..52a8cdb37eb2c 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-05-17 +date: 2023-05-18 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 b655d22a3fe15..3e51b0d0db176 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-05-17 +date: 2023-05-18 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 bd3a269752d98..122fe57b2d243 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-05-17 +date: 2023-05-18 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 a305a9d7fa5bf..a2e6edb02c2b8 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-05-17 +date: 2023-05-18 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 25e17c5a5e170..97c2a86b70084 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-05-17 +date: 2023-05-18 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 9eb79c62d6f50..5877a04f9ad8e 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-05-17 +date: 2023-05-18 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 f20b943396e54..5a4fe7467b2d7 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-05-17 +date: 2023-05-18 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 f55028d82267c..8b41f2c2249bd 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-05-17 +date: 2023-05-18 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 a6114cd1300f9..36eec3175051c 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-05-17 +date: 2023-05-18 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 cdba585c2b157..38706906221a7 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-05-17 +date: 2023-05-18 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 7c74b7f13fdbd..a587525b3cd47 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-05-17 +date: 2023-05-18 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 8ca776e3b8626..517d872f2d105 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-05-17 +date: 2023-05-18 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 f2ccebce4470a..9dd2f32dba97a 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-05-17 +date: 2023-05-18 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 129e30df6ddec..84c64b2d79351 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-05-17 +date: 2023-05-18 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 334dcbf1ee602..f92ff208218d3 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-05-17 +date: 2023-05-18 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 674688e4cce75..07389f47114d3 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-05-17 +date: 2023-05-18 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 d8dd7adee084a..d5f44d7f060d6 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-05-17 +date: 2023-05-18 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 48b1ba3f8b8a1..e25dad24d4736 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-05-17 +date: 2023-05-18 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 cec1a13901a92..61ee0d8ff7cc9 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-05-17 +date: 2023-05-18 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 6e2080e79ce64..b9545bc3b1a0d 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-05-17 +date: 2023-05-18 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 8c3bf0fb011bd..c1929b3215bf6 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-05-17 +date: 2023-05-18 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 9025527679d6a..4276d520a64ae 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-05-17 +date: 2023-05-18 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 6abf867957904..5665cd55ba551 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-05-17 +date: 2023-05-18 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 b001b90bcc034..18fe34896028c 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-05-17 +date: 2023-05-18 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 0029facd48a1a..6596b156cf40e 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-05-17 +date: 2023-05-18 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 50cac4b0d67de..a29bbed4a7e0f 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-05-17 +date: 2023-05-18 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 5fb3d6cb32a11..e5a93c304c296 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-05-17 +date: 2023-05-18 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 0d3e687f5bad1..036f1bc8b1ebc 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-05-17 +date: 2023-05-18 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 db8137eba7219..b5eda5f2d253f 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-05-17 +date: 2023-05-18 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 b697a4e916215..ab32d4652f38a 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-05-17 +date: 2023-05-18 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 6ab8e62a1d0f5..0156486410408 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-05-17 +date: 2023-05-18 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 deba883b74bb0..c9fd2ff5a4de4 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-05-17 +date: 2023-05-18 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 2cf750634410c..a07dee60230da 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-05-17 +date: 2023-05-18 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 961d999d152f2..a408548b80174 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-05-17 +date: 2023-05-18 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 57508f87391a0..91996f420e7c6 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-05-17 +date: 2023-05-18 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 cfd656bb289dc..d2469825b8925 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-05-17 +date: 2023-05-18 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 db91ea9c93e92..5850042114a29 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-05-17 +date: 2023-05-18 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 d3e915968606b..2bc0b288b28a6 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-05-17 +date: 2023-05-18 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 43c2a8137e0fd..945e6aff42f6f 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-05-17 +date: 2023-05-18 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 9e43688a06ada..276724fdd5f52 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-05-17 +date: 2023-05-18 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 f7850cff540c2..8c5cc0a2d2a65 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-05-17 +date: 2023-05-18 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 203f45825c2df..393975c244413 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-05-17 +date: 2023-05-18 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 e976adafd7192..214f10d1504f5 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-05-17 +date: 2023-05-18 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 80dfacef7f92d..a9de34ccebf19 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-05-17 +date: 2023-05-18 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 00719c4b1a300..9782b991951b3 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-05-17 +date: 2023-05-18 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 67249ab57d751..1f590947fb32d 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-05-17 +date: 2023-05-18 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 211b8e6d9b767..3d60c4b57d1df 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-05-17 +date: 2023-05-18 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 b177183c69aa5..272ca266ca97e 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-05-17 +date: 2023-05-18 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 a7fe74e52a5ef..cc9cf431e5b65 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-05-17 +date: 2023-05-18 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 6caef016073c9..51b5229a82f28 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-05-17 +date: 2023-05-18 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 cdc0711a593f3..239e175efac16 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-05-17 +date: 2023-05-18 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 7c898dee6aa78..539108c0a5afb 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-05-17 +date: 2023-05-18 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 b9a785529b7c3..0707cb43328ea 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-05-17 +date: 2023-05-18 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 39e767fe951cd..da21df7c8bf58 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-05-17 +date: 2023-05-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cypress-config'] --- import kbnCypressConfigObj from './kbn_cypress_config.devdocs.json'; diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index b8e49caa295a8..6ea342a2836b9 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-05-17 +date: 2023-05-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] --- import kbnDatemathObj from './kbn_datemath.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index 08a729b42b6f5..45fd3bf4b3e55 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-05-17 +date: 2023-05-18 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 ebe55c2fbc648..61a2162aadce4 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-05-17 +date: 2023-05-18 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 a41c8f796e7b3..dcd5fec5a298b 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-05-17 +date: 2023-05-18 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 639aaeab8ee99..3a6b526f4a2da 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-05-17 +date: 2023-05-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.devdocs.json b/api_docs/kbn_doc_links.devdocs.json index 1c0b9751b04a6..7c885d7855813 100644 --- a/api_docs/kbn_doc_links.devdocs.json +++ b/api_docs/kbn_doc_links.devdocs.json @@ -672,7 +672,7 @@ "label": "alerting", "description": [], "signature": [ - "{ readonly guide: string; readonly actionTypes: string; readonly apmRules: string; readonly emailAction: string; readonly emailActionConfig: string; readonly emailExchangeClientSecretConfig: string; readonly emailExchangeClientIdConfig: string; readonly generalSettings: string; readonly indexAction: string; readonly esQuery: string; readonly indexThreshold: string; readonly pagerDutyAction: string; readonly preconfiguredConnectors: string; readonly preconfiguredAlertHistoryConnector: string; readonly serviceNowAction: string; readonly serviceNowSIRAction: string; readonly setupPrerequisites: string; readonly slackAction: string; readonly slackApiAction: string; readonly teamsAction: string; readonly connectors: string; }" + "{ readonly guide: string; readonly actionTypes: string; readonly apmRules: string; readonly emailAction: string; readonly emailActionConfig: string; readonly emailExchangeClientSecretConfig: string; readonly emailExchangeClientIdConfig: string; readonly generalSettings: string; readonly indexAction: string; readonly esQuery: string; readonly indexThreshold: string; readonly maintenanceWindows: string; readonly pagerDutyAction: string; readonly preconfiguredConnectors: string; readonly preconfiguredAlertHistoryConnector: string; readonly serviceNowAction: string; readonly serviceNowSIRAction: string; readonly setupPrerequisites: string; readonly slackAction: string; readonly slackApiAction: string; readonly teamsAction: string; readonly connectors: string; }" ], "path": "packages/kbn-doc-links/src/types.ts", "deprecated": false, diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index 7d09ec537df4a..90a7ac02e0ba8 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-05-17 +date: 2023-05-18 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 6b7c30b567817..8ebf37b0f4d4f 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-05-17 +date: 2023-05-18 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 a66e785e4d5b1..2423427622e49 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-05-17 +date: 2023-05-18 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 cbe986df0b3cb..96d524f032e4b 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-05-17 +date: 2023-05-18 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 1d907ed74736e..9b3d3966d1763 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-05-17 +date: 2023-05-18 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 1f623eb212915..ce0ede2e4b5bc 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-05-17 +date: 2023-05-18 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_es.mdx b/api_docs/kbn_es.mdx index 1b4c44ea80481..056ccc6939e6d 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-05-17 +date: 2023-05-18 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 be37b704b6dd4..890d3b49eac80 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-05-17 +date: 2023-05-18 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 52718fcebb54b..235c55f852af6 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-05-17 +date: 2023-05-18 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 0e3c9c002ea52..d8d7d3ca663f4 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-05-17 +date: 2023-05-18 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 1c28ec99f1427..f39295d8e24ed 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-05-17 +date: 2023-05-18 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 6e03009dfcda4..47df8a7241ef9 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-05-17 +date: 2023-05-18 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 c19fb3cbecdd1..3d96623a66638 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-05-17 +date: 2023-05-18 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 e6ff5f56e1a79..c4ab6c4f725a9 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-05-17 +date: 2023-05-18 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 71bf55a2b9aea..29568a3a6a2e0 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-05-17 +date: 2023-05-18 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 2d8e15971900d..608fc4ed22827 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-05-17 +date: 2023-05-18 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 cb722fa02ce50..7a932ae2f0c1a 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-05-17 +date: 2023-05-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate'] --- import kbnGenerateObj from './kbn_generate.devdocs.json'; diff --git a/api_docs/kbn_generate_csv.mdx b/api_docs/kbn_generate_csv.mdx index 9f1225d298243..9d675da1b8c21 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-05-17 +date: 2023-05-18 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 32d5bd5ee623d..44c7d5d406746 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-05-17 +date: 2023-05-18 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 45e39d68f93fc..e1f41730e4de9 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-05-17 +date: 2023-05-18 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 dc32a6bca09de..43cc52f5aa37b 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-05-17 +date: 2023-05-18 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 7caf615653a0e..f4c018e2543c9 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-05-17 +date: 2023-05-18 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 c4854a81ca6c7..7158251c6eb62 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-05-17 +date: 2023-05-18 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 1f22bece95a23..5c556b20770b8 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-05-17 +date: 2023-05-18 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 9cfded3b5ba10..067e97a9aac4c 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-05-17 +date: 2023-05-18 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 feea21ffa779c..a1dce42051ffe 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-05-17 +date: 2023-05-18 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 89bbc33c22b95..52e789c4f6135 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-05-17 +date: 2023-05-18 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 edb29d925dc69..df1f119a52ca6 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-05-17 +date: 2023-05-18 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 3057565d23751..9119ac3121d02 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-05-17 +date: 2023-05-18 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 c894c3d203986..c47bd4660085b 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-05-17 +date: 2023-05-18 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 621e45a246947..a63ee001582ac 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-05-17 +date: 2023-05-18 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 4007d0cf7a54d..9ac061098230b 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-05-17 +date: 2023-05-18 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 ea3734ae73fc5..bfc98e5c74775 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-05-17 +date: 2023-05-18 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 00dbfe1f524bb..0409aaf3829a9 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-05-17 +date: 2023-05-18 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 c317a897ac11e..8e389a1895e01 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-05-17 +date: 2023-05-18 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 3be21b02ca21d..1fb021e8dd466 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-05-17 +date: 2023-05-18 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 9469b25c3b209..2aa0a806a4489 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-05-17 +date: 2023-05-18 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 1612ca1c40991..6cc33b842d1a0 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-05-17 +date: 2023-05-18 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 3f6d9b6fd91bf..571740198b680 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-05-17 +date: 2023-05-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-vscode-config'] --- import kbnManagedVscodeConfigObj from './kbn_managed_vscode_config.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index 7bfce74a996b8..9cd8bd1550f09 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-05-17 +date: 2023-05-18 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 7513b6839411f..26c769127172b 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-05-17 +date: 2023-05-18 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 2ecf576869921..b0af5f478a0e4 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-05-17 +date: 2023-05-18 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 0696e8be41147..92d20e90e10ab 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-05-17 +date: 2023-05-18 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_date_picker.mdx b/api_docs/kbn_ml_date_picker.mdx index 77414cd947532..2383e58320cfd 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-05-17 +date: 2023-05-18 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_error_utils.mdx b/api_docs/kbn_ml_error_utils.mdx index 46b62343b39b2..e9ea9076c4b63 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-05-17 +date: 2023-05-18 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 82def66578470..3660403b66c43 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-05-17 +date: 2023-05-18 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 ba674826bf03b..514f58f434d84 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-05-17 +date: 2023-05-18 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_local_storage.mdx b/api_docs/kbn_ml_local_storage.mdx index e080e576cd7a8..113d5851fa907 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-05-17 +date: 2023-05-18 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 6f091a82f4aca..b4db8b71de8fb 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-05-17 +date: 2023-05-18 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 1be434534fe7a..680c0dae649ec 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-05-17 +date: 2023-05-18 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 da3f97f347af1..e9c403c40eb89 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-05-17 +date: 2023-05-18 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 09e1caae13476..a9f18910bfbc8 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-05-17 +date: 2023-05-18 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 fcd1dd94f03d6..09af60aa648c8 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-05-17 +date: 2023-05-18 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_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx index ac917e3e5d9b0..3f51ca73cc0b8 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-05-17 +date: 2023-05-18 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 15e84e1966178..4020433b6d3d8 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-05-17 +date: 2023-05-18 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 3f50a2623f15c..76648c157fceb 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-05-17 +date: 2023-05-18 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 ab092a46d0463..184989b5bef43 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-05-17 +date: 2023-05-18 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 01159495b5e53..630638c2fdd9e 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-05-17 +date: 2023-05-18 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 52dd3ebf8cb7f..382ca066fc37a 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-05-17 +date: 2023-05-18 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 7c7b3c9631ea0..502e8f3d26fa8 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-05-17 +date: 2023-05-18 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 00798aafc5c00..accfc1417a9b9 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-05-17 +date: 2023-05-18 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 93c23bfcae50c..ee3cf8b4b14dd 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-05-17 +date: 2023-05-18 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 f7ab09d1a9ee0..24609917a7971 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-05-17 +date: 2023-05-18 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 54f17504d6182..5c422d0307dcb 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-05-17 +date: 2023-05-18 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 6faf7ced61419..2a2874cff8d65 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-05-17 +date: 2023-05-18 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 50120905c0679..737ff31ac372c 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-05-17 +date: 2023-05-18 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 ce1a3119353f1..b19fd2751cacc 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-05-17 +date: 2023-05-18 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 4545ee6975848..e5d26c1bb614c 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-05-17 +date: 2023-05-18 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 5ccc53884b218..231a67313db1c 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-05-17 +date: 2023-05-18 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 c601ad13153cf..64896d4773f4e 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-05-17 +date: 2023-05-18 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 ec6095ec09095..bccd3fbf3832d 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-05-17 +date: 2023-05-18 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 7ac294968a924..1419b8f1416af 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-05-17 +date: 2023-05-18 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 be03b63c94422..44a63ab455e84 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-05-17 +date: 2023-05-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index 79f8eef816e25..7c7d24f0a190e 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-05-17 +date: 2023-05-18 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 6f583d2a110b6..dc46e6eb07de6 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-05-17 +date: 2023-05-18 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 e7f65d8c4f800..f409cbcb25c1c 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-05-17 +date: 2023-05-18 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 39980b63893b2..420c553aa9633 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-05-17 +date: 2023-05-18 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 230611ad12989..ec2bc56f328d1 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-05-17 +date: 2023-05-18 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 a1cbbc496becb..4eadf3f1f7e44 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-05-17 +date: 2023-05-18 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 79f11c38c6d24..680839950cf34 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-05-17 +date: 2023-05-18 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 4435975a9af19..c74bf537c1140 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-05-17 +date: 2023-05-18 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 fe885c444108e..af9a7790de758 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-05-17 +date: 2023-05-18 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 6a493c53c1071..7a4130e244f99 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-05-17 +date: 2023-05-18 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 c22fee9ce1dff..81aa6c010ebfc 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-05-17 +date: 2023-05-18 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 66b3565739b0b..575866689ba8a 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-05-17 +date: 2023-05-18 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 80f19d57052c1..a5dceccdd04fb 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-05-17 +date: 2023-05-18 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 3ebd87015baa9..28cc36f0b0aff 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-05-17 +date: 2023-05-18 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 ca9058cdb9c05..93034a895345b 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-05-17 +date: 2023-05-18 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 40a3e7f10f41a..f7f0afbf3b6cd 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-05-17 +date: 2023-05-18 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 ed51548334eaa..5e21d3b4d37fb 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-05-17 +date: 2023-05-18 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 5f42850e4a1d0..e78a635537486 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-05-17 +date: 2023-05-18 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 c32ed162e1e58..9bcb0c8e30076 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-05-17 +date: 2023-05-18 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 4d0a1e7604bb2..1bf77942c5ea9 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-05-17 +date: 2023-05-18 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 29eacdb0a2909..db72266314827 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-05-17 +date: 2023-05-18 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 0835a895ef046..b28ea22bbac39 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-05-17 +date: 2023-05-18 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 f448aca5c5c75..3166993b96d7e 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-05-17 +date: 2023-05-18 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 d5ab79efcf628..473fa3c90c00d 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-05-17 +date: 2023-05-18 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 0cd43dc9a3eab..dfb7536d66da7 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-05-17 +date: 2023-05-18 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 23230f4961a3a..a90f12c62b1ee 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-05-17 +date: 2023-05-18 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 b610c893abc9b..85859c4addda3 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-05-17 +date: 2023-05-18 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 3fb2236f4aab2..896072d41899b 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-05-17 +date: 2023-05-18 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 fe415b12ba13e..095b240d956fa 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-05-17 +date: 2023-05-18 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 d2b8261cfc3e3..28740f35daf75 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-05-17 +date: 2023-05-18 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 f95b11503f833..aaba69d838acb 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-05-17 +date: 2023-05-18 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 63f015d539fc2..27948594cc340 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-05-17 +date: 2023-05-18 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 96d565522e970..d0d138d611894 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-05-17 +date: 2023-05-18 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 7bddfa90885ff..0acb44c2ec779 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-05-17 +date: 2023-05-18 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 8b71c867f4550..f76692a80b8bf 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-05-17 +date: 2023-05-18 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 780d59cbe5f9e..8737c4a24fa30 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-05-17 +date: 2023-05-18 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 21bb1e7149523..2719b9ad96fb6 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-05-17 +date: 2023-05-18 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 914fed4a00be5..ac656267c4f57 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-05-17 +date: 2023-05-18 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 db7c66a57bc94..931dbbfc20548 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-05-17 +date: 2023-05-18 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 d5c318c3e4e19..4004ce5810e39 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-05-17 +date: 2023-05-18 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 21d26ff156d4b..5abacc44a565f 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-05-17 +date: 2023-05-18 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 cbfb2efdad958..8a911cd8902e1 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-05-17 +date: 2023-05-18 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 1eca0b2d65ec9..ac8d90a1886bf 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-05-17 +date: 2023-05-18 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 279324c66a3ba..65b1df395ddf8 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-05-17 +date: 2023-05-18 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 38c498bb9b569..fb19bc18e1173 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-05-17 +date: 2023-05-18 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 7cb981c5b7b6d..532598e676ae5 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-05-17 +date: 2023-05-18 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 3cabd051c426f..4857a40391413 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-05-17 +date: 2023-05-18 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 abba662d0f84b..0d50825d033e2 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-05-17 +date: 2023-05-18 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 585dad8dd7646..752430af738e7 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-05-17 +date: 2023-05-18 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 68160f04d76c5..7c3be0445e76d 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-05-17 +date: 2023-05-18 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 84a6d9efb1d7e..210ad1c2c6c66 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-05-17 +date: 2023-05-18 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 32f05063be471..79cd6b9e34bba 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-05-17 +date: 2023-05-18 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 f11a321c0623e..64812e1b4435e 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-05-17 +date: 2023-05-18 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 d11c0b2d2d94f..bb7d93756adbe 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-05-17 +date: 2023-05-18 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 004055de82be7..ec16a3d1d47ad 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-05-17 +date: 2023-05-18 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 cfb30e537d2a5..a7198e53b0979 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-05-17 +date: 2023-05-18 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 d920923c365a6..b28b624a1a2ef 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-05-17 +date: 2023-05-18 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 e52d089a4031e..2a558c189f21a 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-05-17 +date: 2023-05-18 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 9fcbee2e4fd59..5b5594c7bbd57 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-05-17 +date: 2023-05-18 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 5782a1515a5e3..c2997703c9565 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-05-17 +date: 2023-05-18 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 856910edc89b3..7baec0a356f3c 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-05-17 +date: 2023-05-18 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 a87b71e819523..8ddf3275be076 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-05-17 +date: 2023-05-18 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 6c868122046f2..4a976e636c965 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-05-17 +date: 2023-05-18 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 7818cf8e76e91..2bd7508243dc2 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-05-17 +date: 2023-05-18 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 cf85a1f615b1b..b29f959d62fef 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-05-17 +date: 2023-05-18 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 cc8e10b3a8888..9a07598067c41 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-05-17 +date: 2023-05-18 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 1f2e1c2f17229..497a5920c726b 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-05-17 +date: 2023-05-18 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 cddb25ad44434..a7e789db73a48 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-05-17 +date: 2023-05-18 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 1f81079bd5aca..384734430ca2f 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-05-17 +date: 2023-05-18 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 2591a332771ed..74a168c0d2075 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-05-17 +date: 2023-05-18 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 295de0deab85d..c50315eac0b75 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-05-17 +date: 2023-05-18 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 381f4fc86c0ed..8f3129ffcee47 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-05-17 +date: 2023-05-18 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 81ec6fea93275..bcdcd2c25b704 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-05-17 +date: 2023-05-18 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 4031427261946..4531a0a86e2d7 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-05-17 +date: 2023-05-18 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 b04ae7831764f..9ec124c1246a6 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-05-17 +date: 2023-05-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index 850cfd19eece7..0c97a6c1c7cb0 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-05-17 +date: 2023-05-18 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 60b6ff3cc680b..f63bbfcfb383b 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-05-17 +date: 2023-05-18 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 a2d9c59153aae..844c89ba4c198 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-05-17 +date: 2023-05-18 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 9735b99bbddf6..6eef9f15b65bd 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-05-17 +date: 2023-05-18 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 84c58500587eb..49bcf1c7719f4 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-05-17 +date: 2023-05-18 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 96e6b11f40e3e..0e6252ab56199 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-05-17 +date: 2023-05-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] --- import kbnUiThemeObj from './kbn_ui_theme.devdocs.json'; diff --git a/api_docs/kbn_url_state.mdx b/api_docs/kbn_url_state.mdx index 89b8e82059d0e..35d0d8526a486 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-05-17 +date: 2023-05-18 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 a10469d7f76e8..61f00acb9db47 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-05-17 +date: 2023-05-18 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 250edafa4cb7e..a12fb2719b42c 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-05-17 +date: 2023-05-18 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 915720c6cd996..677240213a3f4 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-05-17 +date: 2023-05-18 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 798e22b5199e6..c9c4c06f44e18 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-05-17 +date: 2023-05-18 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 13309ee89dede..177f46ce3bd3b 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-05-17 +date: 2023-05-18 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 0053df2865d07..c5c357d166081 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-05-17 +date: 2023-05-18 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 bd8047a5c6f82..b0ef1dd112bc3 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-05-17 +date: 2023-05-18 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 c5fd81ee66e45..27c922d033054 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-05-17 +date: 2023-05-18 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 fc0f05a896fe7..6e68f51519b74 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-05-17 +date: 2023-05-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kubernetesSecurity'] --- import kubernetesSecurityObj from './kubernetes_security.devdocs.json'; diff --git a/api_docs/lens.devdocs.json b/api_docs/lens.devdocs.json index 712192b0396e5..e8fa7dcc3b523 100644 --- a/api_docs/lens.devdocs.json +++ b/api_docs/lens.devdocs.json @@ -4788,6 +4788,20 @@ "path": "x-pack/plugins/lens/public/types.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "lens", + "id": "def-public.SuggestionRequest.allowMixed", + "type": "CompoundType", + "tags": [], + "label": "allowMixed", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "x-pack/plugins/lens/public/types.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/lens.mdx b/api_docs/lens.mdx index d6ccf0371b32c..c55de0cbfe7f7 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-05-17 +date: 2023-05-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lens'] --- import lensObj from './lens.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 611 | 0 | 515 | 52 | +| 612 | 0 | 516 | 52 | ## Client diff --git a/api_docs/license_api_guard.mdx b/api_docs/license_api_guard.mdx index dcca48acd38a4..08fdd4eb36261 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-05-17 +date: 2023-05-18 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 2de293719058e..648810747c2c9 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-05-17 +date: 2023-05-18 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 a3bc9bf164464..a6f33f8fea149 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-05-17 +date: 2023-05-18 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 62098277484e6..feac6f48fec87 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-05-17 +date: 2023-05-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/management.mdx b/api_docs/management.mdx index 80d09e9d7ac4f..15500c79d2388 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-05-17 +date: 2023-05-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'management'] --- import managementObj from './management.devdocs.json'; diff --git a/api_docs/maps.devdocs.json b/api_docs/maps.devdocs.json index 5b7625d514738..d8772016b2b6e 100644 --- a/api_docs/maps.devdocs.json +++ b/api_docs/maps.devdocs.json @@ -3035,10 +3035,10 @@ }, { "parentPluginId": "maps", - "id": "def-public.IVectorSource.showJoinEditor", + "id": "def-public.IVectorSource.supportsJoins", "type": "Function", "tags": [], - "label": "showJoinEditor", + "label": "supportsJoins", "description": [], "signature": [ "() => boolean" @@ -3049,22 +3049,6 @@ "children": [], "returnComment": [] }, - { - "parentPluginId": "maps", - "id": "def-public.IVectorSource.getJoinsDisabledReason", - "type": "Function", - "tags": [], - "label": "getJoinsDisabledReason", - "description": [], - "signature": [ - "() => string | null" - ], - "path": "x-pack/plugins/maps/public/classes/sources/vector_source/vector_source.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [], - "returnComment": [] - }, { "parentPluginId": "maps", "id": "def-public.IVectorSource.getSyncMeta", @@ -4137,7 +4121,7 @@ "label": "SourceEditorArgs", "description": [], "signature": [ - "{ currentLayerType: string; numberOfJoins: number; onChange: (...args: ", + "{ currentLayerType: string; hasSpatialJoins: boolean; numberOfJoins: number; onChange: (...args: ", "OnSourceChangeArgs", "[]) => Promise; onStyleDescriptorChange: (styleDescriptor: ", "StyleDescriptor", @@ -4609,7 +4593,7 @@ "AbstractSourceDescriptor", " & { id: string; indexPatternId: string; geoField?: string | undefined; applyGlobalQuery: boolean; applyGlobalTime: boolean; applyForceRefresh: boolean; } & { metrics: ", "AggDescriptor", - "[]; } & { term: string; whereQuery?: ", + "[]; } & { whereQuery?: ", { "pluginId": "@kbn/es-query", "scope": "common", @@ -4617,7 +4601,7 @@ "section": "def-common.Query", "text": "Query" }, - " | undefined; size?: number | undefined; type: ", + " | undefined; } & { term: string; size?: number | undefined; type: ", { "pluginId": "maps", "scope": "common", @@ -4829,9 +4813,9 @@ "section": "def-common.LAYER_TYPE", "text": "LAYER_TYPE" }, - ".MVT_VECTOR; joins?: ", + ".MVT_VECTOR; joins?: Partial<", "JoinDescriptor", - "[] | undefined; style: ", + ">[] | undefined; style: ", { "pluginId": "maps", "scope": "common", diff --git a/api_docs/maps.mdx b/api_docs/maps.mdx index 1787f5bd290fb..e60f4154be08e 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-05-17 +date: 2023-05-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'maps'] --- import mapsObj from './maps.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-gis](https://github.com/orgs/elastic/teams/kibana-gis) | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 269 | 0 | 268 | 29 | +| 268 | 0 | 267 | 29 | ## Client diff --git a/api_docs/maps_ems.mdx b/api_docs/maps_ems.mdx index 91a9b76a121a0..ce8e14f7fb905 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-05-17 +date: 2023-05-18 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 fdecd2c23b6db..d5f90e56e9efb 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-05-17 +date: 2023-05-18 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 a3718d49aca81..68d2ba241744e 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-05-17 +date: 2023-05-18 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 fa038389c3625..cb27b5cae70f9 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-05-17 +date: 2023-05-18 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 67ae16e10bf33..9ea25b3f6754e 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-05-17 +date: 2023-05-18 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 306257fada67f..94bc08748805c 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-05-17 +date: 2023-05-18 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 a50c2493f4764..4e069d8aabd1f 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-05-17 +date: 2023-05-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'notifications'] --- import notificationsObj from './notifications.devdocs.json'; diff --git a/api_docs/observability.devdocs.json b/api_docs/observability.devdocs.json index 80060c89f3634..53d31d332e4aa 100644 --- a/api_docs/observability.devdocs.json +++ b/api_docs/observability.devdocs.json @@ -13403,4 +13403,4 @@ ], "objects": [] } -} +} \ No newline at end of file diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index aa1cda5a4da46..009075e686bf9 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-05-17 +date: 2023-05-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/actionable-observability](https://github.com/orgs/elastic/team | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 555 | 45 | 549 | 25 | +| 546 | 43 | 540 | 25 | ## Client diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx index 6e1f9510fd4f3..f55ad2fb4e88c 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-05-17 +date: 2023-05-18 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 46ce9ff55285c..23bd430223149 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-05-17 +date: 2023-05-18 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 75a499295ec70..136fb4dc0c5a1 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-05-17 +date: 2023-05-18 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 0904f1353e6aa..8134402908c06 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-05-17 +date: 2023-05-18 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -21,7 +21,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 69639 | 522 | 60005 | 1354 | +| 69637 | 520 | 60003 | 1356 | ## Plugin Directory @@ -49,7 +49,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-cloud-security-posture](https://github.com/orgs/elastic/teams/kibana-cloud-security-posture) | The cloud security posture plugin | 17 | 0 | 2 | 2 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 13 | 0 | 13 | 1 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Content management app | 149 | 0 | 126 | 6 | -| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | The Controls Plugin contains embeddable components intended to create a simple query interface for end users, and a powerful editing suite that allows dashboard authors to build controls | 301 | 0 | 294 | 13 | +| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | The Controls Plugin contains embeddable components intended to create a simple query interface for end users, and a powerful editing suite that allows dashboard authors to build controls | 304 | 0 | 297 | 14 | | crossClusterReplication | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 0 | 0 | 0 | 0 | | customBranding | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Enables customization of Kibana | 0 | 0 | 0 | 0 | | | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | Add custom data integrations so they can be displayed in the Fleet integrations app | 274 | 0 | 255 | 1 | @@ -92,7 +92,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-gis](https://github.com/orgs/elastic/teams/kibana-gis) | The file upload plugin contains components and services for uploading a file, analyzing its data, and then importing the data into an Elasticsearch index. Supported file types include CSV, TSV, newline-delimited JSON and GeoJSON. | 62 | 0 | 62 | 2 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | File upload, download, sharing, and serving over HTTP implementation in Kibana. | 239 | 0 | 24 | 9 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Simple UI for managing files in Kibana | 2 | 1 | 2 | 0 | -| | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | - | 1119 | 3 | 1014 | 31 | +| | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | - | 1121 | 3 | 1016 | 31 | | ftrApis | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 0 | 0 | 0 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 68 | 0 | 14 | 5 | | globalSearchBar | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 0 | 0 | 0 | 0 | @@ -104,7 +104,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Image embeddable | 3 | 0 | 3 | 1 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 4 | 0 | 4 | 0 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 177 | 0 | 172 | 3 | -| | [@elastic/infra-monitoring-ui](https://github.com/orgs/elastic/teams/infra-monitoring-ui) | This plugin visualizes data from Filebeat and Metricbeat, and integrates with other Observability solutions | 48 | 0 | 45 | 13 | +| | [@elastic/infra-monitoring-ui](https://github.com/orgs/elastic/teams/infra-monitoring-ui) | This plugin visualizes data from Filebeat and Metricbeat, and integrates with other Observability solutions | 49 | 0 | 46 | 14 | | ingestPipelines | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 0 | 0 | 0 | 0 | | inputControlVis | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds Input Control visualization to Kibana | 0 | 0 | 0 | 0 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 123 | 2 | 96 | 4 | @@ -114,14 +114,14 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | kibanaUsageCollection | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 0 | 0 | 0 | 0 | | | [@elastic/kibana-app-services](https://github.com/orgs/elastic/teams/kibana-app-services) | - | 609 | 3 | 416 | 9 | | | [@elastic/sec-cloudnative-integrations](https://github.com/orgs/elastic/teams/sec-cloudnative-integrations) | - | 5 | 0 | 5 | 1 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Visualization editor allowing to quickly and easily configure compelling visualizations to use on dashboards and canvas workpads. Exposes components to embed visualizations and link into the Lens editor from within other apps in Kibana. | 611 | 0 | 515 | 52 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Visualization editor allowing to quickly and easily configure compelling visualizations to use on dashboards and canvas workpads. Exposes components to embed visualizations and link into the Lens editor from within other apps in Kibana. | 612 | 0 | 516 | 52 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 8 | 0 | 8 | 0 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 4 | 0 | 4 | 1 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 117 | 0 | 42 | 10 | | | [@elastic/security-solution-platform](https://github.com/orgs/elastic/teams/security-solution-platform) | - | 210 | 0 | 94 | 51 | | logstash | [@elastic/logstash](https://github.com/orgs/elastic/teams/logstash) | - | 0 | 0 | 0 | 0 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 43 | 0 | 43 | 6 | -| | [@elastic/kibana-gis](https://github.com/orgs/elastic/teams/kibana-gis) | - | 269 | 0 | 268 | 29 | +| | [@elastic/kibana-gis](https://github.com/orgs/elastic/teams/kibana-gis) | - | 268 | 0 | 267 | 29 | | | [@elastic/kibana-gis](https://github.com/orgs/elastic/teams/kibana-gis) | - | 67 | 0 | 67 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | This plugin provides access to the machine learning features provided by Elastic. | 166 | 3 | 80 | 38 | | | [@elastic/infra-monitoring-ui](https://github.com/orgs/elastic/teams/infra-monitoring-ui) | - | 15 | 3 | 13 | 1 | @@ -129,7 +129,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 34 | 0 | 34 | 2 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 17 | 0 | 17 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 1 | -| | [@elastic/actionable-observability](https://github.com/orgs/elastic/teams/actionable-observability) | - | 555 | 45 | 549 | 25 | +| | [@elastic/actionable-observability](https://github.com/orgs/elastic/teams/actionable-observability) | - | 546 | 43 | 540 | 25 | | | [@elastic/apm-ui](https://github.com/orgs/elastic/teams/apm-ui) | - | 7 | 0 | 7 | 0 | | | [@elastic/actionable-observability](https://github.com/orgs/elastic/teams/actionable-observability) | - | 266 | 1 | 265 | 11 | | | [@elastic/security-defend-workflows](https://github.com/orgs/elastic/teams/security-defend-workflows) | - | 22 | 0 | 22 | 6 | @@ -157,7 +157,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | Serverless customizations for search. | 6 | 0 | 6 | 0 | | | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | Serverless customizations for security. | 6 | 0 | 6 | 0 | | | [@elastic/sec-cloudnative-integrations](https://github.com/orgs/elastic/teams/sec-cloudnative-integrations) | - | 7 | 0 | 7 | 1 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Adds URL Service and sharing capabilities to Kibana | 118 | 0 | 59 | 10 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Adds URL Service and sharing capabilities to Kibana | 119 | 0 | 60 | 10 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 22 | 1 | 22 | 1 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides the Spaces feature, which allows saved objects to be organized into meaningful categories. | 253 | 0 | 65 | 0 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 12 | 0 | 12 | 2 | diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index 8d0bb3b53321e..99a2f88630fc6 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-05-17 +date: 2023-05-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationUtil'] --- import presentationUtilObj from './presentation_util.devdocs.json'; diff --git a/api_docs/profiling.devdocs.json b/api_docs/profiling.devdocs.json index 75713ac26cd9b..8a420787b5dac 100644 --- a/api_docs/profiling.devdocs.json +++ b/api_docs/profiling.devdocs.json @@ -104,7 +104,7 @@ "label": "getRoutePaths", "description": [], "signature": [ - "() => { TopN: string; TopNContainers: string; TopNDeployments: string; TopNFunctions: string; TopNHosts: string; TopNThreads: string; TopNTraces: string; Flamechart: string; CacheExecutables: string; CacheStackFrames: string; HasSetupESResources: string; HasSetupDataCollection: string; SetupDataCollectionInstructions: string; }" + "() => { TopN: string; TopNContainers: string; TopNDeployments: string; TopNFunctions: string; TopNHosts: string; TopNThreads: string; TopNTraces: string; Flamechart: string; HasSetupESResources: string; HasSetupDataCollection: string; SetupDataCollectionInstructions: string; }" ], "path": "x-pack/plugins/profiling/common/index.ts", "deprecated": false, diff --git a/api_docs/profiling.mdx b/api_docs/profiling.mdx index 52e970ae1b6c6..47e09c9f69ab0 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-05-17 +date: 2023-05-18 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 de0badd3250f2..5c6aae21054e9 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-05-17 +date: 2023-05-18 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 dfa3e4f4f54d2..8d9521e5f79a6 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-05-17 +date: 2023-05-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'reporting'] --- import reportingObj from './reporting.devdocs.json'; diff --git a/api_docs/rollup.mdx b/api_docs/rollup.mdx index 3c6114509d51c..001878a5b7212 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-05-17 +date: 2023-05-18 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 faf129e592af3..f531c3a08e99b 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-05-17 +date: 2023-05-18 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 1b2901a9393fb..4fe2958268071 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-05-17 +date: 2023-05-18 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 7a6b10bdd94d7..68ce2a73a59a8 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-05-17 +date: 2023-05-18 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 c2798718c31bf..3b0e770733da3 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-05-17 +date: 2023-05-18 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 5846440bce0b4..c4d8acb5b6751 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-05-17 +date: 2023-05-18 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 5c7c8d2004d44..580196f43c34c 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-05-17 +date: 2023-05-18 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 cb608ff5b9031..5f8d770fe82aa 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-05-17 +date: 2023-05-18 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 8591cb8f3dc1d..2c97e70a79fff 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-05-17 +date: 2023-05-18 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 96096831f8b54..98cb5ed971124 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-05-17 +date: 2023-05-18 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 43787639d2cd6..c7e15b03b9f47 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-05-17 +date: 2023-05-18 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 7fd4486164140..5f71e4f66e675 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-05-17 +date: 2023-05-18 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 88d87a2fc1aa3..ce662b8cb999f 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-05-17 +date: 2023-05-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.devdocs.json'; diff --git a/api_docs/serverless.mdx b/api_docs/serverless.mdx index 8894ec6e9d85d..4c26a5142bece 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-05-17 +date: 2023-05-18 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 c06433dc22602..d295f8d09aed7 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-05-17 +date: 2023-05-18 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 bf777b15c7f85..b1906a9248940 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-05-17 +date: 2023-05-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessSearch'] --- import serverlessSearchObj from './serverless_search.devdocs.json'; diff --git a/api_docs/serverless_security.mdx b/api_docs/serverless_security.mdx index 52f6abe4f968b..c25a93feba466 100644 --- a/api_docs/serverless_security.mdx +++ b/api_docs/serverless_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessSecurity title: "serverlessSecurity" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessSecurity plugin -date: 2023-05-17 +date: 2023-05-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessSecurity'] --- import serverlessSecurityObj from './serverless_security.devdocs.json'; diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index c6cf3691dc11f..c16e9d3204db7 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-05-17 +date: 2023-05-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'sessionView'] --- import sessionViewObj from './session_view.devdocs.json'; diff --git a/api_docs/share.devdocs.json b/api_docs/share.devdocs.json index 6601c08555872..53e4bd286a6ac 100644 --- a/api_docs/share.devdocs.json +++ b/api_docs/share.devdocs.json @@ -878,6 +878,28 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "share", + "id": "def-public.ShareContext.shareableUrlLocatorParams", + "type": "Object", + "tags": [], + "label": "shareableUrlLocatorParams", + "description": [], + "signature": [ + "{ locator: ", + { + "pluginId": "share", + "scope": "common", + "docId": "kibSharePluginApi", + "section": "def-common.LocatorPublic", + "text": "LocatorPublic" + }, + "; params: any; } | undefined" + ], + "path": "src/plugins/share/public/types.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "share", "id": "def-public.ShareContext.sharingData", diff --git a/api_docs/share.mdx b/api_docs/share.mdx index 6a58a1c1654bd..4c5a26d02f563 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-05-17 +date: 2023-05-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] --- import shareObj from './share.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sh | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 118 | 0 | 59 | 10 | +| 119 | 0 | 60 | 10 | ## Client diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index 5561c31f3cf78..130c7ad10da61 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-05-17 +date: 2023-05-18 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 25f8314b885ee..fda9063a4e19a 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-05-17 +date: 2023-05-18 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 c42bd3f8d6bd0..7e9ec57f4cc5f 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-05-17 +date: 2023-05-18 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 e5b659883d8fc..21a5898282e6a 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-05-17 +date: 2023-05-18 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 d61d56a42b616..230c04c91d962 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-05-17 +date: 2023-05-18 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 3fa3594571778..67e3ddb5b99ed 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-05-17 +date: 2023-05-18 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 7fba30152a1d8..e1cc662e4bd1b 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-05-17 +date: 2023-05-18 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 9782ffe6732d5..b97a41efd27b9 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-05-17 +date: 2023-05-18 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 5cda3974eb37d..f25e3376bcdb7 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-05-17 +date: 2023-05-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index fe282816a32f1..3ee91b5f9afdd 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-05-17 +date: 2023-05-18 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 89b47c64158ce..0cc2f86188901 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-05-17 +date: 2023-05-18 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 93a6c873c7d44..feae321089fee 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-05-17 +date: 2023-05-18 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 79ab798c31815..02a0777e1ecca 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-05-17 +date: 2023-05-18 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 57e9e96f230a7..f40bcba70f7b5 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-05-17 +date: 2023-05-18 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 7dc09a10128c1..e0f8c1b2597fc 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-05-17 +date: 2023-05-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] --- import uiActionsEnhancedObj from './ui_actions_enhanced.devdocs.json'; diff --git a/api_docs/unified_field_list.mdx b/api_docs/unified_field_list.mdx index 831bdcae6ee52..929745df3aecf 100644 --- a/api_docs/unified_field_list.mdx +++ b/api_docs/unified_field_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedFieldList title: "unifiedFieldList" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedFieldList plugin -date: 2023-05-17 +date: 2023-05-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedFieldList'] --- import unifiedFieldListObj from './unified_field_list.devdocs.json'; diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx index 2382d47a75533..4f7e769f2c12c 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-05-17 +date: 2023-05-18 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 3626c309f1971..ea3683b4a1034 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-05-17 +date: 2023-05-18 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 05b50e4c2ae82..ff787e89f0093 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-05-17 +date: 2023-05-18 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 05336cf8f7ad9..8259cfd84a742 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-05-17 +date: 2023-05-18 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 21742c9cf0c93..1ef6c6e1c7088 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-05-17 +date: 2023-05-18 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 19d0f01b75892..5e7501ffa7514 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-05-17 +date: 2023-05-18 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 307657acac5a6..2b97554fb8ebd 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-05-17 +date: 2023-05-18 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 e72c3b706cd43..860bbbd032fdd 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-05-17 +date: 2023-05-18 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 454cf0414c0b2..8e2be13f5a172 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-05-17 +date: 2023-05-18 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 d8cde662db3e8..dbec9af7f8513 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-05-17 +date: 2023-05-18 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 f5be52557b874..e869f7630a3e4 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-05-17 +date: 2023-05-18 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 805f9f65132bb..b042ce954abcc 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-05-17 +date: 2023-05-18 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 37ff1d784372b..f8134bd574f76 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-05-17 +date: 2023-05-18 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 0e42ce5257fc9..97a1dc9041209 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-05-17 +date: 2023-05-18 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 ddabcfc62e162..255c6b947fde5 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-05-17 +date: 2023-05-18 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 1046a4367249a..756a51bbdd909 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-05-17 +date: 2023-05-18 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 43b7b2d3f0db4..a6a23117d2c8e 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-05-17 +date: 2023-05-18 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 01190d4f0ba3f..efec5d69d80d6 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-05-17 +date: 2023-05-18 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; From 8cf6d034e3a22370b73cf66ae893f8d7ff6b158d Mon Sep 17 00:00:00 2001 From: Maxim Palenov Date: Thu, 18 May 2023 09:54:40 +0200 Subject: [PATCH 43/78] [Security Solution] Fix incorrectly applied emotion styles (#157935) **Resolves:** https://github.com/elastic/kibana/issues/156820 ## Summary This PR fixes improperly applied styles via emotion on the rule details page. *Before:* image image *After:* image image ## Details Recent investigation has revealed emotion css styles aren't applied correctly on production while the problem isn't noticeable locally. This is caused by simultaneously using **styled-components** and **emotion** in Security Solution plugin. Further research lead to a way to fix it 1. import `css` utility function from `@emotion/css` instead of `@emotion/react` 2. apply styles using `className` instead of `css` Like in the code below ```ts import { css } from '@emotion/css'; ...
TEST
... ``` --- .../rules/step_about_rule_details/index.tsx | 26 +++++++++---------- .../rules/step_about_rule_details/styles.ts | 2 +- 2 files changed, 13 insertions(+), 15 deletions(-) diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/step_about_rule_details/index.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/step_about_rule_details/index.tsx index 4d9c23240a9b2..8a60df7dbb21f 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/step_about_rule_details/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/step_about_rule_details/index.tsx @@ -20,7 +20,7 @@ import { isEmpty } from 'lodash'; import type { PropsWithChildren } from 'react'; import React, { memo, useCallback, useMemo, useState } from 'react'; -import { css } from '@emotion/react'; +import { css } from '@emotion/css'; import { HeaderSection } from '../../../../common/components/header_section'; import { MarkdownRenderer } from '../../../../common/components/markdown_editor'; import type { @@ -81,8 +81,8 @@ const StepAboutRuleToggleDetailsComponent: React.FC = ({ return ( {loading && ( @@ -92,7 +92,7 @@ const StepAboutRuleToggleDetailsComponent: React.FC = ({ )} {stepData != null && stepDataDetails != null && ( - + {toggleOptions.length > 0 && ( @@ -112,7 +112,7 @@ const StepAboutRuleToggleDetailsComponent: React.FC = ({ {selectedToggleOption === 'details' && ( {(resizeRef) => ( -
+
): JSX.Element { return (
@@ -193,15 +193,13 @@ interface VerticalOverflowContentProps { function VerticalOverflowContent({ maxHeight, - children, }: PropsWithChildren): JSX.Element { return (
{children}
diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/step_about_rule_details/styles.ts b/x-pack/plugins/security_solution/public/detections/components/rules/step_about_rule_details/styles.ts index 598e146b9b245..76dcc956f91c2 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/step_about_rule_details/styles.ts +++ b/x-pack/plugins/security_solution/public/detections/components/rules/step_about_rule_details/styles.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { css } from '@emotion/react'; +import { css } from '@emotion/css'; export const fullHeight = css` height: 100%; From 212e4df02d91d95f2ab574216fcedbe2c4a09552 Mon Sep 17 00:00:00 2001 From: Alexi Doak <109488926+doakalexi@users.noreply.github.com> Date: Thu, 18 May 2023 08:10:38 -0400 Subject: [PATCH 44/78] [ResponseOps][Maintenance Windows] Show dates in the selected timezone on the edit form (#158020) Resolves https://github.com/elastic/kibana/issues/158013 ## Summary When a specific timezone has been set for a schedule, we will convert the time to local time when showing it in a list, table or overview. Updated the edit/create form so that when someone chooses to edit that schedule, we will then default to and show the specific timezone that was selected when it was created. ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios ### To verify Scenario 1: 1. Make sure your kibana timezone setting is set to `'Browser'` 2. Create a maintenance window and set the timezone to `America/Los_Angeles` or any timezone that is not your own 3. Verify that the times match the timezone set and save Screen Shot 2023-05-17 at 2 47 12 PM 4. Verify on the table that the times match your current timezone Screen Shot 2023-05-17 at 2 51 31 PM 5. Edit and verify that the times match the timezone you set when the mw was created Screen Shot 2023-05-17 at 2 52 29 PM Scenario 2: 1. Make sure your kibana timezone setting is set to timezone. I used `America/Denver` 2. Create a maintenance window and verify that the times reflect the timezone set in adv settings Screen Shot
2023-05-17 at 2 55 26 PM 3. Verify on the table that the times match adv settings 4. Edit and verify that the times and the timezone match adv settings Screen Shot 2023-05-17 at 2 56 00 PM --- .../create_maintenance_windows_form.test.tsx | 4 +-- .../create_maintenance_windows_form.tsx | 12 +++++-- .../components/fields/date_picker_field.tsx | 3 +- .../fields/date_picker_range_field.tsx | 17 ++++++++-- .../get_selected_for_date_picker.test.ts | 33 +++++++++++++++---- .../helpers/get_selected_for_date_picker.ts | 23 +++++++++++-- 6 files changed, 75 insertions(+), 17 deletions(-) diff --git a/x-pack/plugins/alerting/public/pages/maintenance_windows/components/create_maintenance_windows_form.test.tsx b/x-pack/plugins/alerting/public/pages/maintenance_windows/components/create_maintenance_windows_form.test.tsx index b2e97dac3389e..07f6048258856 100644 --- a/x-pack/plugins/alerting/public/pages/maintenance_windows/components/create_maintenance_windows_form.test.tsx +++ b/x-pack/plugins/alerting/public/pages/maintenance_windows/components/create_maintenance_windows_form.test.tsx @@ -94,8 +94,8 @@ describe('CreateMaintenanceWindowForm', () => { const timezoneInput = within(result.getByTestId('timezone-field')).getByTestId('input'); expect(titleInput).toHaveValue('test'); - expect(dateInputs[0]).toHaveValue('03/24/2023 12:00 AM'); - expect(dateInputs[1]).toHaveValue('03/26/2023 12:00 AM'); + expect(dateInputs[0]).toHaveValue('03/23/2023 09:00 PM'); + expect(dateInputs[1]).toHaveValue('03/25/2023 09:00 PM'); expect(recurringInput).toBeChecked(); expect(timezoneInput).toHaveTextContent('America/Los_Angeles'); }); diff --git a/x-pack/plugins/alerting/public/pages/maintenance_windows/components/create_maintenance_windows_form.tsx b/x-pack/plugins/alerting/public/pages/maintenance_windows/components/create_maintenance_windows_form.tsx index 0dda6a8890529..5f0e81b0b0da3 100644 --- a/x-pack/plugins/alerting/public/pages/maintenance_windows/components/create_maintenance_windows_form.tsx +++ b/x-pack/plugins/alerting/public/pages/maintenance_windows/components/create_maintenance_windows_form.tsx @@ -108,9 +108,9 @@ export const CreateMaintenanceWindowForm = React.memo({ + const [{ recurring, timezone }] = useFormData({ form, - watch: ['recurring'], + watch: ['recurring', 'timezone'], }); const isRecurring = recurring || false; const showTimezone = isBrowser || initialValue?.timezone !== undefined; @@ -181,7 +181,13 @@ export const CreateMaintenanceWindowForm = React.memo - {(fields) => } + {(fields) => ( + + )} {showTimezone ? ( diff --git a/x-pack/plugins/alerting/public/pages/maintenance_windows/components/fields/date_picker_field.tsx b/x-pack/plugins/alerting/public/pages/maintenance_windows/components/fields/date_picker_field.tsx index b67c15690fbd3..c7e4684f3254b 100644 --- a/x-pack/plugins/alerting/public/pages/maintenance_windows/components/fields/date_picker_field.tsx +++ b/x-pack/plugins/alerting/public/pages/maintenance_windows/components/fields/date_picker_field.tsx @@ -28,7 +28,7 @@ export const DatePickerField: React.FC = React.memo( const { setFieldValue } = useFormContext(); const [form] = useFormData({ watch: [field.path] }); - const selected = getSelected(form, field.path); + const { selected, utcOffset } = getSelected(form, field.path); const onChange = useCallback( (currentDate: Moment | null) => { @@ -45,6 +45,7 @@ export const DatePickerField: React.FC = React.memo( selected={selected} onChange={onChange} minDate={today} + utcOffset={utcOffset} fullWidth /> diff --git a/x-pack/plugins/alerting/public/pages/maintenance_windows/components/fields/date_picker_range_field.tsx b/x-pack/plugins/alerting/public/pages/maintenance_windows/components/fields/date_picker_range_field.tsx index 786ff9aba01db..cd312c2df70db 100644 --- a/x-pack/plugins/alerting/public/pages/maintenance_windows/components/fields/date_picker_range_field.tsx +++ b/x-pack/plugins/alerting/public/pages/maintenance_windows/components/fields/date_picker_range_field.tsx @@ -18,19 +18,28 @@ import { getSelectedForDatePicker as getSelected } from '../../helpers/get_selec interface DatePickerRangeFieldProps { fields: { startDate: FieldHook; endDate: FieldHook }; + timezone?: string[]; showTimeSelect?: boolean; 'data-test-subj'?: string; } export const DatePickerRangeField: React.FC = React.memo( - ({ fields, showTimeSelect = true, ...rest }) => { + ({ fields, timezone, showTimeSelect = true, ...rest }) => { const [today] = useState(moment()); const { setFieldValue } = useFormContext(); const [form] = useFormData({ watch: [fields.startDate.path, fields.endDate.path] }); - const startDate = getSelected(form, fields.startDate.path); - const endDate = getSelected(form, fields.endDate.path); + const { selected: startDate, utcOffset: startOffset } = getSelected( + form, + fields.startDate.path, + timezone + ); + const { selected: endDate, utcOffset: endOffset } = getSelected( + form, + fields.endDate.path, + timezone + ); const onStartDateChange = useCallback( (currentDate: Moment | null) => { @@ -69,6 +78,7 @@ export const DatePickerRangeField: React.FC = React.m aria-label="Start date" showTimeSelect={showTimeSelect} minDate={today} + utcOffset={startOffset} /> } endDateControl={ @@ -80,6 +90,7 @@ export const DatePickerRangeField: React.FC = React.m aria-label="End date" showTimeSelect={showTimeSelect} minDate={today} + utcOffset={endOffset} /> } fullWidth diff --git a/x-pack/plugins/alerting/public/pages/maintenance_windows/helpers/get_selected_for_date_picker.test.ts b/x-pack/plugins/alerting/public/pages/maintenance_windows/helpers/get_selected_for_date_picker.test.ts index a005a919b6e25..467f894877557 100644 --- a/x-pack/plugins/alerting/public/pages/maintenance_windows/helpers/get_selected_for_date_picker.test.ts +++ b/x-pack/plugins/alerting/public/pages/maintenance_windows/helpers/get_selected_for_date_picker.test.ts @@ -15,22 +15,43 @@ describe('getSelectedForDatePicker', () => { test('should return the current date if the form is not initialized', () => { jest.useFakeTimers().setSystemTime(new Date('2023-03-30T00:00:00.000Z')); - expect(getSelectedForDatePicker({}, 'date').toISOString()).toEqual('2023-03-30T00:00:00.000Z'); + const { selected } = getSelectedForDatePicker({}, 'date'); + expect(selected.toISOString()).toEqual('2023-03-30T00:00:00.000Z'); }); test('should return the form date if it is valid', () => { jest.useFakeTimers().setSystemTime(new Date('2023-03-30T00:00:00.000Z')); - expect( - getSelectedForDatePicker({ date: '2023-01-30T00:00:00.000Z' }, 'date').toISOString() - ).toEqual('2023-01-30T00:00:00.000Z'); + const { selected } = getSelectedForDatePicker({ date: '2023-01-30T00:00:00.000Z' }, 'date'); + expect(selected.toISOString()).toEqual('2023-01-30T00:00:00.000Z'); }); test('should return the current date if the form date is not valid', () => { jest.useFakeTimers().setSystemTime(new Date('2023-03-30T00:00:00.000Z')); - expect(getSelectedForDatePicker({ date: 'test' }, 'date').toISOString()).toEqual( - '2023-03-30T00:00:00.000Z' + const { selected } = getSelectedForDatePicker({ date: 'test' }, 'date'); + expect(selected.toISOString()).toEqual('2023-03-30T00:00:00.000Z'); + }); + + test('should return the current date if the form is not initialized and an offset that reflects the timezone', () => { + jest.useFakeTimers().setSystemTime(new Date('2023-03-30T00:00:00.000Z')); + + const { selected, utcOffset } = getSelectedForDatePicker({}, 'date', ['America/Denver']); + expect(selected.toISOString()).toEqual('2023-03-30T00:00:00.000Z'); + expect(selected.toString()).toEqual('Wed Mar 29 2023 18:00:00 GMT-0600'); + expect(utcOffset).toEqual(-360); + }); + + test('should return the form date if it is valid and an offset that reflects the timezone', () => { + jest.useFakeTimers().setSystemTime(new Date('2023-03-30T00:00:00.000Z')); + + const { selected, utcOffset } = getSelectedForDatePicker( + { date: '2023-05-01T00:00:00.000Z' }, + 'date', + ['America/Denver'] ); + expect(selected.toISOString()).toEqual('2023-05-01T00:00:00.000Z'); + expect(selected.toString()).toEqual('Sun Apr 30 2023 18:00:00 GMT-0600'); + expect(utcOffset).toEqual(-360); }); }); diff --git a/x-pack/plugins/alerting/public/pages/maintenance_windows/helpers/get_selected_for_date_picker.ts b/x-pack/plugins/alerting/public/pages/maintenance_windows/helpers/get_selected_for_date_picker.ts index 57eb08de64239..31bfdc206be9d 100644 --- a/x-pack/plugins/alerting/public/pages/maintenance_windows/helpers/get_selected_for_date_picker.ts +++ b/x-pack/plugins/alerting/public/pages/maintenance_windows/helpers/get_selected_for_date_picker.ts @@ -7,9 +7,15 @@ import { get } from 'lodash'; import moment, { Moment } from 'moment'; +import 'moment-timezone'; + import { FormData } from '@kbn/es-ui-shared-plugin/static/forms/hook_form_lib'; -export function getSelectedForDatePicker(form: FormData, path: string): Moment { +export function getSelectedForDatePicker( + form: FormData, + path: string, + timezone?: string[] +): { selected: Moment; utcOffset: number } { // parse from a string date to moment() if there is an intitial value // otherwise just get the current date const initialValue = get(form, path); @@ -17,5 +23,18 @@ export function getSelectedForDatePicker(form: FormData, path: string): Moment { if (initialValue && moment(initialValue).isValid()) { selected = moment(initialValue); } - return selected; + const utcOffset = + timezone && timezone.length > 0 + ? moment() + .tz(timezone[0]) + .year(selected.year()) + .month(selected.month()) + .date(selected.date()) + .hour(selected.hour()) + .minute(selected.minute()) + .second(selected.second()) + .millisecond(selected.millisecond()) + .utcOffset() + : selected.utcOffset(); + return { selected: selected.clone().utcOffset(utcOffset), utcOffset }; } From c396cc66a0ca91ff348da4906837513effef59aa Mon Sep 17 00:00:00 2001 From: Giuseppe Santoro Date: Thu, 18 May 2023 13:23:31 +0100 Subject: [PATCH 45/78] Setup ignore_malformed in fleet (#157184) ## Summary Add default setting `ignore_malformed: true` to all datastream of type `logs`. Since the field `@timestamp` needs to have `ignore_malformed: false` in the mappings, I'm setting this setting automatically even if not defined in the integration. I had to fix a bug that prevented index.mappings to be copied from the default settings into the template settings ### Checklist Delete any items that are not applicable to this PR. - [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [ ] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [ ] If a plugin configuration key changed, check if it needs to be allowlisted in the cloud and added to the [docker list](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker) - [ ] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [ ] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Kyle Pollich --- .../template/default_settings.test.ts | 3 +++ .../template/default_settings.ts | 8 +++++++ .../epm/elasticsearch/template/template.ts | 5 ++++ .../transform/transforms.test.ts | 23 ++++++++++++++++--- .../apis/epm/data_stream.ts | 14 +++++------ .../apis/epm/install_overrides.ts | 2 ++ .../apis/epm/update_assets.ts | 4 ++++ .../0.1.0/data_stream/test/manifest.yml | 2 +- .../0.2.0/data_stream/test/manifest.yml | 2 +- .../input_package_create_upgrade.ts | 5 +++- .../resolver/api_feature/mappings.json | 2 +- 11 files changed, 56 insertions(+), 14 deletions(-) diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/default_settings.test.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/default_settings.test.ts index a437d5520ffd7..3f7fa91b6462c 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/default_settings.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/default_settings.test.ts @@ -69,6 +69,9 @@ describe('buildDefaultSettings', () => { "lifecycle": Object { "name": "logs", }, + "mapping": Object { + "ignore_malformed": true, + }, "query": Object { "default_field": Array [ "field1Keyword", diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/default_settings.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/default_settings.ts index fe90954966f24..dc61f4fca9e5c 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/default_settings.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/default_settings.ts @@ -75,6 +75,14 @@ export function buildDefaultSettings({ }), // What should be our default for the compression? codec: 'best_compression', + // setting `ignore_malformed` only for data_stream for logs + ...(type === 'logs' + ? { + mapping: { + ignore_malformed: true, + }, + } + : {}), // All the default fields which should be queried have to be added here. // So far we add all keyword and text fields here if there are any, otherwise // this setting is skipped. diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/template.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/template.ts index ebd45a6ad5d8f..4573b5ef7f21b 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/template.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/template/template.ts @@ -426,6 +426,11 @@ function generateDateMapping(field: Field): IndexTemplateMapping { if (field.date_format) { mapping.format = field.date_format; } + + if (field.name === '@timestamp') { + mapping.ignore_malformed = false; + } + return mapping; } diff --git a/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/transforms.test.ts b/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/transforms.test.ts index 547dfe1a504fb..256cfb7ba6fc0 100644 --- a/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/transforms.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/elasticsearch/transform/transforms.test.ts @@ -298,7 +298,12 @@ _meta: }, }, mappings: { - properties: { '@timestamp': { type: 'date' } }, + properties: { + '@timestamp': { + ignore_malformed: false, + type: 'date', + }, + }, dynamic_templates: [ { strings_as_keyword: { @@ -581,7 +586,12 @@ _meta: }, }, mappings: { - properties: { '@timestamp': { type: 'date' } }, + properties: { + '@timestamp': { + ignore_malformed: false, + type: 'date', + }, + }, dynamic_templates: [ { strings_as_keyword: { @@ -844,7 +854,14 @@ _meta: body: { template: { settings: { index: { mapping: { total_fields: { limit: '10000' } } } }, - mappings: { properties: { '@timestamp': { type: 'date' } } }, + mappings: { + properties: { + '@timestamp': { + ignore_malformed: false, + type: 'date', + }, + }, + }, }, _meta: meta, }, diff --git a/x-pack/test/fleet_api_integration/apis/epm/data_stream.ts b/x-pack/test/fleet_api_integration/apis/epm/data_stream.ts index 44fae45e0c332..f3258e61d632f 100644 --- a/x-pack/test/fleet_api_integration/apis/epm/data_stream.ts +++ b/x-pack/test/fleet_api_integration/apis/epm/data_stream.ts @@ -270,7 +270,7 @@ export default function (providerContext: FtrProviderContext) { ...packagePolicyData.package, experimental_data_stream_features: [ { - data_stream: logsTemplateName, + data_stream: metricsTemplateName, features: { synthetic_source: true, }, @@ -287,7 +287,7 @@ export default function (providerContext: FtrProviderContext) { const pkgName = 'no_tsdb_to_tsdb'; const pkgVersion = '0.1.0'; const pkgUpdateVersion = '0.2.0'; - const logsTemplateName = `logs-${pkgName}.test`; + const metricsTemplateName = `metrics-${pkgName}.test`; const namespace = 'default'; skipIfNoDockerRegistry(providerContext); @@ -300,7 +300,7 @@ export default function (providerContext: FtrProviderContext) { await es.transport.request( { method: 'POST', - path: `/${logsTemplateName}-${namespace}/_doc`, + path: `/${metricsTemplateName}-${namespace}/_doc`, body: { '@timestamp': '2015-01-01', logs_test_name: 'test', @@ -319,7 +319,7 @@ export default function (providerContext: FtrProviderContext) { await es.transport.request( { method: 'DELETE', - path: `/_data_stream/${logsTemplateName}-${namespace}`, + path: `/_data_stream/${metricsTemplateName}-${namespace}`, }, { meta: true } ); @@ -330,15 +330,15 @@ export default function (providerContext: FtrProviderContext) { it('rolls over data stream when index_mode: time_series is set in the updated package version', async () => { await installPackage(pkgName, pkgUpdateVersion); - const resLogsDatastream = await es.transport.request( + const resMetricsDatastream = await es.transport.request( { method: 'GET', - path: `/_data_stream/${logsTemplateName}-${namespace}`, + path: `/_data_stream/${metricsTemplateName}-${namespace}`, }, { meta: true } ); - expect(resLogsDatastream.body.data_streams[0].indices.length).equal(2); + expect(resMetricsDatastream.body.data_streams[0].indices.length).equal(2); }); }); }); diff --git a/x-pack/test/fleet_api_integration/apis/epm/install_overrides.ts b/x-pack/test/fleet_api_integration/apis/epm/install_overrides.ts index 7b691ca10b5a6..c93f30dddff7e 100644 --- a/x-pack/test/fleet_api_integration/apis/epm/install_overrides.ts +++ b/x-pack/test/fleet_api_integration/apis/epm/install_overrides.ts @@ -137,6 +137,7 @@ export default function (providerContext: FtrProviderContext) { name: 'overridden by user', }, mapping: { + ignore_malformed: `true`, total_fields: { limit: '10000', }, @@ -148,6 +149,7 @@ export default function (providerContext: FtrProviderContext) { dynamic: 'false', properties: { '@timestamp': { + ignore_malformed: false, type: 'date', }, data_stream: { diff --git a/x-pack/test/fleet_api_integration/apis/epm/update_assets.ts b/x-pack/test/fleet_api_integration/apis/epm/update_assets.ts index c8bde9dd076f8..9b2527a5b025d 100644 --- a/x-pack/test/fleet_api_integration/apis/epm/update_assets.ts +++ b/x-pack/test/fleet_api_integration/apis/epm/update_assets.ts @@ -136,6 +136,7 @@ export default function (providerContext: FtrProviderContext) { resPackage.body.component_templates[0].component_template.template.mappings.properties ).eql({ '@timestamp': { + ignore_malformed: false, type: 'date', }, test_logs2: { @@ -222,6 +223,7 @@ export default function (providerContext: FtrProviderContext) { name: 'reference2', }, mapping: { + ignore_malformed: `true`, total_fields: { limit: '10000', }, @@ -235,6 +237,7 @@ export default function (providerContext: FtrProviderContext) { dynamic: true, properties: { '@timestamp': { + ignore_malformed: false, type: 'date', }, data_stream: { @@ -301,6 +304,7 @@ export default function (providerContext: FtrProviderContext) { resPackage.body.component_templates[0].component_template.template.mappings.properties ).eql({ '@timestamp': { + ignore_malformed: false, type: 'date', }, metrics_test_name2: { diff --git a/x-pack/test/fleet_api_integration/apis/fixtures/test_packages/no_tsdb_to_tsdb/0.1.0/data_stream/test/manifest.yml b/x-pack/test/fleet_api_integration/apis/fixtures/test_packages/no_tsdb_to_tsdb/0.1.0/data_stream/test/manifest.yml index 9ac3c68a0be9e..078f71ced306b 100644 --- a/x-pack/test/fleet_api_integration/apis/fixtures/test_packages/no_tsdb_to_tsdb/0.1.0/data_stream/test/manifest.yml +++ b/x-pack/test/fleet_api_integration/apis/fixtures/test_packages/no_tsdb_to_tsdb/0.1.0/data_stream/test/manifest.yml @@ -1,6 +1,6 @@ title: Test Dataset -type: logs +type: metrics elasticsearch: index_template.mappings: diff --git a/x-pack/test/fleet_api_integration/apis/fixtures/test_packages/no_tsdb_to_tsdb/0.2.0/data_stream/test/manifest.yml b/x-pack/test/fleet_api_integration/apis/fixtures/test_packages/no_tsdb_to_tsdb/0.2.0/data_stream/test/manifest.yml index 91d5b968eefcb..48a4f500b4777 100644 --- a/x-pack/test/fleet_api_integration/apis/fixtures/test_packages/no_tsdb_to_tsdb/0.2.0/data_stream/test/manifest.yml +++ b/x-pack/test/fleet_api_integration/apis/fixtures/test_packages/no_tsdb_to_tsdb/0.2.0/data_stream/test/manifest.yml @@ -1,6 +1,6 @@ title: Test Dataset -type: logs +type: metrics elasticsearch: index_mode: time_series diff --git a/x-pack/test/fleet_api_integration/apis/package_policy/input_package_create_upgrade.ts b/x-pack/test/fleet_api_integration/apis/package_policy/input_package_create_upgrade.ts index 5765fc3832099..263b9ac88adac 100644 --- a/x-pack/test/fleet_api_integration/apis/package_policy/input_package_create_upgrade.ts +++ b/x-pack/test/fleet_api_integration/apis/package_policy/input_package_create_upgrade.ts @@ -223,7 +223,10 @@ export default function (providerContext: FtrProviderContext) { lifecycle: { name: 'logs' }, codec: 'best_compression', default_pipeline: 'logs-dataset1-1.0.0', - mapping: { total_fields: { limit: '10000' } }, + mapping: { + total_fields: { limit: '10000' }, + ignore_malformed: 'true', + }, }, }, mappings: { diff --git a/x-pack/test/functional/es_archives/endpoint/resolver/api_feature/mappings.json b/x-pack/test/functional/es_archives/endpoint/resolver/api_feature/mappings.json index 0a1ab1f036d2a..284110dab1cd7 100644 --- a/x-pack/test/functional/es_archives/endpoint/resolver/api_feature/mappings.json +++ b/x-pack/test/functional/es_archives/endpoint/resolver/api_feature/mappings.json @@ -2689,7 +2689,7 @@ "rollover_alias": "endgame-4.21.0" }, "mapping": { - "ignore_malformed": "true", + "ignore_malformed": true, "total_fields": { "limit": "10000" } From ba0050249d58cffda195584fae5e8fabb017071f Mon Sep 17 00:00:00 2001 From: Jeramy Soucy Date: Thu, 18 May 2023 08:44:28 -0400 Subject: [PATCH 46/78] Harden security response headers for serverless offering (#158000) Closes #150884 ## Summary Adds both strictTransportSecurity and disableEmbedding to the serverless.yml config file, which sets the defaults for Kibana running in a serverless configuration. Note that the disabling of embedding is for the serverless MVP, with a plan to more strategically and explicitly allow embedding of specific resources in future releases. - `server.securityResponseHeaders.strictTransportSecurity: max-age=31536000; includeSubDomains`: Adds the `strict-transport-security` response header. The browser should remember that a site, including subdomains, is only to be accessed using HTTPS for 1 year. - `server.securityResponseHeaders.disableEmbedding`: true adds the `X-Frame-Options` response header with a avalue of `SAMEORIGIN` and adds `frame-ancestors 'self'` to the `content-security-policy` response header. Note: if you are running without TLS enabled locally, you can disable the `strict-transport-security` response header by overriding the setting in kibana.dev.yml (see Testing step 8 below). ### Testing (locally) 1. Start Elasticearch 3. Start Kibana with `yarn start --serverless` 4. Sign into Kibana and open your browser's dev tools 5. In the network tab, inspect one of the requests for localhost 6. In the Headers tab, verify the above defined headers and values are present 7. Stop Kibana, and restart normally with `yarn start` 8. Repeat the process in steps 4-6 and verify that the above defined headers and values are not present 9. Stop Kibana, edit the Kibana.dev.yml file by adding `server.securityResponseHeaders.strictTransportSecurity: null` 10. Start Kibana with `yarn start --serverless` 11. Repeat the process in steps 4-6 and verify that the headers and values associated with disableEmbedding are present while the `strict-transport-security` response header is not present. --- config/serverless.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/config/serverless.yml b/config/serverless.yml index 6a9c4793dc85d..b9cf2a384873d 100644 --- a/config/serverless.yml +++ b/config/serverless.yml @@ -23,3 +23,10 @@ xpack.reporting.enabled: false # Telemetry enabled by default and not disableable via UI telemetry.optIn: true telemetry.allowChangingOptInStatus: false + +# Harden security response headers, see https://github.com/elastic/kibana/issues/150884 +# The browser should remember that a site, including subdomains, is only to be accessed using HTTPS for 1 year +# Can override this setting in kibana.dev.yml, e.g. server.securityResponseHeaders.strictTransportSecurity: null +server.securityResponseHeaders.strictTransportSecurity: max-age=31536000; includeSubDomains +# Disable embedding for serverless MVP +server.securityResponseHeaders.disableEmbedding: true From a19921ea52c59df65c454d57f6218401e3b3352f Mon Sep 17 00:00:00 2001 From: Cristina Amico Date: Thu, 18 May 2023 15:02:57 +0200 Subject: [PATCH 47/78] [Fleet] Move SOAttributes definition to server/types (#157989) Part of https://github.com/elastic/ingest-dev/issues/1753 ## Summary [Fleet] Move SOAttributes definition to server/types - Decouple all `*SOAttributes` from types in `/common/types` and move `*SOAttributes` to the server-side typings directory at `/server/types` ### Checklist - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../fleet/common/types/models/agent.ts | 6 +- .../fleet/common/types/models/agent_policy.ts | 3 +- .../common/types/models/enrollment_api_key.ts | 3 +- .../fleet/common/types/models/fleet_proxy.ts | 5 +- .../models/fleet_server_policy_config.ts | 3 +- .../fleet/common/types/models/output.ts | 5 - .../common/types/models/package_policy.ts | 3 +- .../fleet/common/types/models/settings.ts | 4 - .../cloud_preconfiguration.test.ts | 7 +- .../fleet/server/services/agent_policy.ts | 5 +- .../server/services/agents/saved_objects.ts | 26 ---- .../server/services/epm/packages/get.test.ts | 3 +- .../fleet/server/services/epm/packages/get.ts | 8 +- .../plugins/fleet/server/services/output.ts | 10 +- .../plugins/fleet/server/services/settings.ts | 3 +- x-pack/plugins/fleet/server/types/index.tsx | 9 +- .../fleet/server/types/so_attributes.ts | 143 ++++++++++++++++++ 17 files changed, 171 insertions(+), 75 deletions(-) delete mode 100644 x-pack/plugins/fleet/server/services/agents/saved_objects.ts create mode 100644 x-pack/plugins/fleet/server/types/so_attributes.ts diff --git a/x-pack/plugins/fleet/common/types/models/agent.ts b/x-pack/plugins/fleet/common/types/models/agent.ts index 34f68fc34c502..256dd76c41ca4 100644 --- a/x-pack/plugins/fleet/common/types/models/agent.ts +++ b/x-pack/plugins/fleet/common/types/models/agent.ts @@ -79,6 +79,8 @@ export interface AgentAction extends NewAgentAction { export interface AgentMetadata { [x: string]: any; } + +// SO definition for this type is declared in server/types/interfaces interface AgentBase { type: AgentType; active: boolean; @@ -124,10 +126,6 @@ export interface Agent extends AgentBase { metrics?: AgentMetrics; } -export interface AgentSOAttributes extends AgentBase { - packages?: string[]; -} - export interface CurrentUpgrade { actionId: string; complete: boolean; diff --git a/x-pack/plugins/fleet/common/types/models/agent_policy.ts b/x-pack/plugins/fleet/common/types/models/agent_policy.ts index 30737d2b2052f..a701d4653f242 100644 --- a/x-pack/plugins/fleet/common/types/models/agent_policy.ts +++ b/x-pack/plugins/fleet/common/types/models/agent_policy.ts @@ -36,6 +36,7 @@ export interface NewAgentPolicy { is_protected?: boolean; } +// SO definition for this type is declared in server/types/interfaces export interface AgentPolicy extends Omit { id: string; status: ValueOf; @@ -48,8 +49,6 @@ export interface AgentPolicy extends Omit { is_protected: boolean; } -export type AgentPolicySOAttributes = Omit; - export interface FullAgentPolicyInputStream { id: string; data_stream: { diff --git a/x-pack/plugins/fleet/common/types/models/enrollment_api_key.ts b/x-pack/plugins/fleet/common/types/models/enrollment_api_key.ts index 5c5568f7dad42..4398675831b45 100644 --- a/x-pack/plugins/fleet/common/types/models/enrollment_api_key.ts +++ b/x-pack/plugins/fleet/common/types/models/enrollment_api_key.ts @@ -5,6 +5,7 @@ * 2.0. */ +// SO definition for this type is declared in server/types/interfaces export interface EnrollmentAPIKey { id: string; api_key_id: string; @@ -15,8 +16,6 @@ export interface EnrollmentAPIKey { created_at: string; } -export type EnrollmentAPIKeySOAttributes = Omit; - // Generated /** diff --git a/x-pack/plugins/fleet/common/types/models/fleet_proxy.ts b/x-pack/plugins/fleet/common/types/models/fleet_proxy.ts index bad53dacdff93..1c69b4db9fbfa 100644 --- a/x-pack/plugins/fleet/common/types/models/fleet_proxy.ts +++ b/x-pack/plugins/fleet/common/types/models/fleet_proxy.ts @@ -14,6 +14,7 @@ interface BaseFleetProxy { is_preconfigured: boolean; } +// SO definition for this type is declared in server/types/interfaces export interface NewFleetProxy extends BaseFleetProxy { proxy_headers?: Record | null; } @@ -21,7 +22,3 @@ export interface NewFleetProxy extends BaseFleetProxy { export interface FleetProxy extends NewFleetProxy { id: string; } - -export interface FleetProxySOAttributes extends BaseFleetProxy { - proxy_headers?: string | null; -} diff --git a/x-pack/plugins/fleet/common/types/models/fleet_server_policy_config.ts b/x-pack/plugins/fleet/common/types/models/fleet_server_policy_config.ts index 8b7c2ffc0913f..5609853a4ad2e 100644 --- a/x-pack/plugins/fleet/common/types/models/fleet_server_policy_config.ts +++ b/x-pack/plugins/fleet/common/types/models/fleet_server_policy_config.ts @@ -5,6 +5,7 @@ * 2.0. */ +// SO definition for this type is declared in server/types/interfaces export interface NewFleetServerHost { name: string; host_urls: string[]; @@ -16,5 +17,3 @@ export interface NewFleetServerHost { export interface FleetServerHost extends NewFleetServerHost { id: string; } - -export type FleetServerHostSOAttributes = NewFleetServerHost; diff --git a/x-pack/plugins/fleet/common/types/models/output.ts b/x-pack/plugins/fleet/common/types/models/output.ts index f8836dae58470..665498cf8f322 100644 --- a/x-pack/plugins/fleet/common/types/models/output.ts +++ b/x-pack/plugins/fleet/common/types/models/output.ts @@ -30,11 +30,6 @@ export interface NewOutput { allow_edit?: string[]; } -export type OutputSOAttributes = NewOutput & { - output_id?: string; - ssl?: string | null; // encrypted ssl field -}; - export type Output = NewOutput & { id: string; }; diff --git a/x-pack/plugins/fleet/common/types/models/package_policy.ts b/x-pack/plugins/fleet/common/types/models/package_policy.ts index fe4013c522be7..63c55952f6257 100644 --- a/x-pack/plugins/fleet/common/types/models/package_policy.ts +++ b/x-pack/plugins/fleet/common/types/models/package_policy.ts @@ -92,6 +92,7 @@ export interface UpdatePackagePolicy extends NewPackagePolicy { version?: string; } +// SO definition for this type is declared in server/types/interfaces export interface PackagePolicy extends Omit { id: string; inputs: PackagePolicyInput[]; @@ -105,8 +106,6 @@ export interface PackagePolicy extends Omit { created_by: string; } -export type PackagePolicySOAttributes = Omit; - export type DryRunPackagePolicy = NewPackagePolicy & { errors?: Array<{ key: string | undefined; message: string }>; missingVars?: string[]; diff --git a/x-pack/plugins/fleet/common/types/models/settings.ts b/x-pack/plugins/fleet/common/types/models/settings.ts index c70fa944e6c24..01f95146e3621 100644 --- a/x-pack/plugins/fleet/common/types/models/settings.ts +++ b/x-pack/plugins/fleet/common/types/models/settings.ts @@ -5,8 +5,6 @@ * 2.0. */ -import type { SavedObjectAttributes } from '@kbn/core/public'; - export interface BaseSettings { has_seen_add_data_notice?: boolean; fleet_server_hosts?: string[]; @@ -17,5 +15,3 @@ export interface Settings extends BaseSettings { id: string; preconfigured_fields?: Array<'fleet_server_hosts'>; } - -export interface SettingsSOAttributes extends BaseSettings, SavedObjectAttributes {} diff --git a/x-pack/plugins/fleet/server/integration_tests/cloud_preconfiguration.test.ts b/x-pack/plugins/fleet/server/integration_tests/cloud_preconfiguration.test.ts index f021becf6f444..20b9e25e7994a 100644 --- a/x-pack/plugins/fleet/server/integration_tests/cloud_preconfiguration.test.ts +++ b/x-pack/plugins/fleet/server/integration_tests/cloud_preconfiguration.test.ts @@ -15,8 +15,11 @@ import { } from '@kbn/core-test-helpers-kbn-server'; import { AGENT_POLICY_INDEX } from '../../common'; -import type { PackagePolicySOAttributes, OutputSOAttributes } from '../../common/types'; -import type { AgentPolicySOAttributes } from '../types'; +import type { + AgentPolicySOAttributes, + PackagePolicySOAttributes, + OutputSOAttributes, +} from '../types'; import { useDockerRegistry, waitForFleetSetup } from './helpers'; import { diff --git a/x-pack/plugins/fleet/server/services/agent_policy.ts b/x-pack/plugins/fleet/server/services/agent_policy.ts index 96b53da7cbb6c..b69b8ba631423 100644 --- a/x-pack/plugins/fleet/server/services/agent_policy.ts +++ b/x-pack/plugins/fleet/server/services/agent_policy.ts @@ -398,7 +398,10 @@ class AgentPolicyService { const filter = kuery ? normalizeKuery(SAVED_OBJECT_TYPE, kuery) : undefined; let agentPoliciesSO; try { - agentPoliciesSO = await soClient.find({ ...baseFindParams, filter }); + agentPoliciesSO = await soClient.find({ + ...baseFindParams, + filter, + }); } catch (e) { const isBadRequest = e.output?.statusCode === 400; const isKQLSyntaxError = e.message?.startsWith('KQLSyntaxError'); diff --git a/x-pack/plugins/fleet/server/services/agents/saved_objects.ts b/x-pack/plugins/fleet/server/services/agents/saved_objects.ts deleted file mode 100644 index 596c7db5d8472..0000000000000 --- a/x-pack/plugins/fleet/server/services/agents/saved_objects.ts +++ /dev/null @@ -1,26 +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 { SavedObject } from '@kbn/core/server'; - -import type { Agent, AgentSOAttributes } from '../../types'; - -export function savedObjectToAgent(so: SavedObject): Agent { - if (so.error) { - throw new Error(so.error.message); - } - - return { - id: so.id, - ...so.attributes, - local_metadata: so.attributes.local_metadata, - user_provided_metadata: so.attributes.user_provided_metadata, - access_api_key: undefined, - status: undefined, - packages: so.attributes.packages ?? [], - }; -} diff --git a/x-pack/plugins/fleet/server/services/epm/packages/get.test.ts b/x-pack/plugins/fleet/server/services/epm/packages/get.test.ts index e4cd54f90973d..14fe84796b9fd 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/get.test.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/get.test.ts @@ -11,7 +11,8 @@ import { SavedObjectsErrorHelpers } from '@kbn/core/server'; import { savedObjectsClientMock } from '@kbn/core/server/mocks'; import { PACKAGES_SAVED_OBJECT_TYPE, PACKAGE_POLICY_SAVED_OBJECT_TYPE } from '../../../../common'; -import type { PackagePolicySOAttributes, RegistryPackage } from '../../../../common/types'; +import type { RegistryPackage } from '../../../../common/types'; +import type { PackagePolicySOAttributes } from '../../../types'; import { createAppContextStartContractMock } from '../../../mocks'; import { appContextService } from '../../app_context'; diff --git a/x-pack/plugins/fleet/server/services/epm/packages/get.ts b/x-pack/plugins/fleet/server/services/epm/packages/get.ts index 351128af7f4bf..696aa6a272970 100644 --- a/x-pack/plugins/fleet/server/services/epm/packages/get.ts +++ b/x-pack/plugins/fleet/server/services/epm/packages/get.ts @@ -16,11 +16,7 @@ import { SO_SEARCH_LIMIT, } from '../../../../common/constants'; import { isPackageLimited } from '../../../../common/services'; -import type { - PackageUsageStats, - PackagePolicySOAttributes, - Installable, -} from '../../../../common/types'; +import type { PackageUsageStats, Installable } from '../../../../common/types'; import { PACKAGES_SAVED_OBJECT_TYPE } from '../../../constants'; import type { ArchivePackage, @@ -28,7 +24,7 @@ import type { EpmPackageAdditions, GetCategoriesRequest, } from '../../../../common/types'; -import type { Installation, PackageInfo } from '../../../types'; +import type { Installation, PackageInfo, PackagePolicySOAttributes } from '../../../types'; import { FleetError, PackageFailedVerificationError, diff --git a/x-pack/plugins/fleet/server/services/output.ts b/x-pack/plugins/fleet/server/services/output.ts index e6ed4d2d4986f..8666330f6640f 100644 --- a/x-pack/plugins/fleet/server/services/output.ts +++ b/x-pack/plugins/fleet/server/services/output.ts @@ -164,7 +164,7 @@ async function validateTypeChanges( soClient: SavedObjectsClientContract, esClient: ElasticsearchClient, id: string, - data: Partial, + data: Nullable>, originalOutput: Output, defaultDataOutputId: string | null, fromPreconfiguration: boolean @@ -194,18 +194,18 @@ async function validateTypeChanges( async function updateFleetServerPoliciesDataOutputId( soClient: SavedObjectsClientContract, esClient: ElasticsearchClient, - data: Partial, + data: Nullable>, isDefault: boolean, defaultDataOutputId: string | null, fleetServerPolicies: AgentPolicy[], fromPreconfiguration: boolean ) { // if a logstash output is updated to become default - // if fleet server policies are don't have data_output_id or if they are using the new output + // if fleet server policies don't have data_output_id // update them to use the default output if (data?.type === outputType.Logstash && isDefault) { for (const policy of fleetServerPolicies) { - if (!policy.data_output_id || policy.data_output_id === data?.id) { + if (!policy.data_output_id) { await agentPolicyService.update( soClient, esClient, @@ -582,7 +582,7 @@ class OutputService { soClient, esClient, id, - data, + updateData, originalOutput, defaultDataOutputId, fromPreconfiguration diff --git a/x-pack/plugins/fleet/server/services/settings.ts b/x-pack/plugins/fleet/server/services/settings.ts index 5b48ee8177885..2b5d228ffc97e 100644 --- a/x-pack/plugins/fleet/server/services/settings.ts +++ b/x-pack/plugins/fleet/server/services/settings.ts @@ -10,7 +10,8 @@ import type { SavedObjectsClientContract } from '@kbn/core/server'; import { normalizeHostsForAgents } from '../../common/services'; import { GLOBAL_SETTINGS_SAVED_OBJECT_TYPE, GLOBAL_SETTINGS_ID } from '../../common/constants'; -import type { SettingsSOAttributes, Settings, BaseSettings } from '../../common/types'; +import type { Settings, BaseSettings } from '../../common/types'; +import type { SettingsSOAttributes } from '../types'; import { appContextService } from './app_context'; import { listFleetServerHosts } from './fleet_server_host'; diff --git a/x-pack/plugins/fleet/server/types/index.tsx b/x-pack/plugins/fleet/server/types/index.tsx index a89405eb54f05..1f669f07d1433 100644 --- a/x-pack/plugins/fleet/server/types/index.tsx +++ b/x-pack/plugins/fleet/server/types/index.tsx @@ -8,7 +8,6 @@ export type { Agent, AgentMetadata, - AgentSOAttributes, AgentStatus, AgentType, AgentAction, @@ -22,12 +21,10 @@ export type { NewPackagePolicy, UpdatePackagePolicy, DryRunPackagePolicy, - PackagePolicySOAttributes, FullAgentPolicyInput, FullAgentPolicy, FullAgentPolicyOutput, AgentPolicy, - AgentPolicySOAttributes, NewAgentPolicy, PreconfiguredAgentPolicy, AgentPolicyStatus, @@ -35,16 +32,12 @@ export type { ShipperOutput, Output, NewOutput, - OutputSOAttributes, OutputType, EnrollmentAPIKey, - EnrollmentAPIKeySOAttributes, NewFleetServerHost, FleetServerHost, - FleetServerHostSOAttributes, NewFleetProxy, FleetProxy, - FleetProxySOAttributes, Installation, EpmPackageInstallStatus, InstallationStatus, @@ -73,7 +66,6 @@ export type { TemplateMap, TemplateMapEntry, Settings, - SettingsSOAttributes, InstallType, InstallSource, InstallResult, @@ -119,4 +111,5 @@ export interface PackageVerificationResult { export * from './models'; export * from './rest_spec'; export * from './extensions'; +export * from './so_attributes'; export type { FleetRequestHandler, FleetRequestHandlerContext } from './request_context'; diff --git a/x-pack/plugins/fleet/server/types/so_attributes.ts b/x-pack/plugins/fleet/server/types/so_attributes.ts new file mode 100644 index 0000000000000..bdc8cf2886fe5 --- /dev/null +++ b/x-pack/plugins/fleet/server/types/so_attributes.ts @@ -0,0 +1,143 @@ +/* + * 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. + */ + +// Definitions for SO attributes. They mirror the types defined under /common/types/models +import type { agentPolicyStatuses } from '../../common/constants'; +import type { + MonitoringType, + ValueOf, + AgentMetadata, + OutputType, + ShipperOutput, +} from '../../common/types'; +import type { AgentType, FleetServerAgentComponent } from '../../common/types/models'; + +import type { + PackagePolicy, + PackagePolicyInput, + PackagePolicyPackage, + PackagePolicyConfigRecord, +} from '../../common/types/models/package_policy'; +import type { PolicySecretReference } from '../../common/types/models/secret'; + +export type AgentPolicyStatus = typeof agentPolicyStatuses; + +export interface AgentPolicySOAttributes { + name: string; + namespace: string; + is_managed: boolean; // required for created policy + updated_at: string; + updated_by: string; + revision: number; + is_protected: boolean; + description?: string; + is_default?: boolean; + is_default_fleet_server?: boolean; // Optional when creating a policy + has_fleet_server?: boolean; + monitoring_enabled?: MonitoringType; + unenroll_timeout?: number; + inactivity_timeout?: number; + is_preconfigured?: boolean; + // Nullable to allow user to reset to default outputs + data_output_id?: string | null; + monitoring_output_id?: string | null; + download_source_id?: string | null; + fleet_server_host_id?: string | null; + schema_version?: string; + agent_features?: Array<{ name: string; enabled: boolean }>; + status: ValueOf; + package_policies?: PackagePolicy[]; + agents?: number; +} + +export interface AgentSOAttributes { + type: AgentType; + active: boolean; + enrolled_at: string; + user_provided_metadata: AgentMetadata; + local_metadata: AgentMetadata; + unenrolled_at?: string; + unenrollment_started_at?: string; + upgraded_at?: string | null; + upgrade_started_at?: string | null; + access_api_key_id?: string; + default_api_key?: string; + default_api_key_id?: string; + policy_id?: string; + policy_revision?: number | null; + last_checkin?: string; + last_checkin_status?: 'error' | 'online' | 'degraded' | 'updating'; + last_checkin_message?: string; + tags?: string[]; + components?: FleetServerAgentComponent[]; + packages?: string[]; +} + +export interface FleetProxySOAttributes { + name: string; + url: string; + is_preconfigured: boolean; + certificate_authorities?: string | null; + certificate?: string | null; + certificate_key?: string | null; + proxy_headers?: string | null; +} + +export interface FleetServerHostSOAttributes { + name: string; + host_urls: string[]; + is_default: boolean; + is_preconfigured: boolean; + proxy_id?: string | null; +} + +export interface PackagePolicySOAttributes { + name: string; + namespace: string; + enabled: boolean; + revision: number; + created_at: string; + created_by: string; + inputs: PackagePolicyInput[]; + policy_id: string; + updated_at: string; + updated_by: string; + description?: string; + is_managed?: boolean; + secret_references?: PolicySecretReference[]; + package?: PackagePolicyPackage; + vars?: PackagePolicyConfigRecord; + elasticsearch?: { + privileges?: { + cluster?: string[]; + }; + }; + agents?: number; +} + +export interface OutputSOAttributes { + is_default: boolean; + is_default_monitoring: boolean; + name: string; + type: ValueOf; + hosts?: string[]; + ca_sha256?: string | null; + ca_trusted_fingerprint?: string | null; + is_preconfigured?: boolean; + config_yaml?: string | null; + proxy_id?: string | null; + shipper?: ShipperOutput | null; + allow_edit?: string[]; + output_id?: string; + ssl?: string | null; // encrypted ssl field +} + +export interface SettingsSOAttributes { + has_seen_add_data_notice?: boolean; + fleet_server_hosts?: string[]; + prerelease_integrations_enabled: boolean; +} From f214b55704dd9c300be845530de956a27fd12bab Mon Sep 17 00:00:00 2001 From: Nikita Indik Date: Thu, 18 May 2023 15:38:03 +0200 Subject: [PATCH 48/78] [Security Solution] Fix error messages on Rule Details page taking too much space (#157271) ## Summary When a large "last execution" error message is displayed on Rule Details page it takes too much vertical space: https://user-images.githubusercontent.com/2946766/214444343-dde0d9cd-6bc7-4aca-a6cf-07891d206888.png This PR changes the error callout component. Error text is now displayed using EUI's TextBlock component. Users will see a scroll if error text takes too much vertical space. Now it's also possible to view the text fullscreen or copy it to clipboard. Screenshot 2023-05-10 at 16 16 40 --- Another addition is a button to expand a row in the Execution Log to view / copy a full error message. Screenshot 2023-05-10 at 16 15 16 ### Checklist - [x] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [x] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [x] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [x] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [x] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [x] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) ### For maintainers - [x] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) **Known issue**: Copy button is not shown in Execution Log expandable row in Safari. Opened an issue in EUI: https://github.com/elastic/eui/issues/6770 --- .../execution_log_columns.tsx | 85 +++++++++++++++---- .../execution_log_table.tsx | 63 ++++++++++++-- .../execution_log_table/translations.ts | 28 ++++++ .../rule_status_failed_callout.tsx | 45 +++++++--- 4 files changed, 184 insertions(+), 37 deletions(-) diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/execution_log_columns.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/execution_log_columns.tsx index 610277ddcd076..f67f538513b73 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/execution_log_columns.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/execution_log_columns.tsx @@ -6,8 +6,15 @@ */ import React from 'react'; +import { css } from '@emotion/react'; import type { EuiBasicTableColumn } from '@elastic/eui'; -import { EuiLink, EuiText } from '@elastic/eui'; +import { + EuiLink, + EuiText, + EuiButtonIcon, + EuiScreenReaderOnly, + RIGHT_ALIGNMENT, +} from '@elastic/eui'; import type { DocLinksStart } from '@kbn/core/public'; import { FormattedMessage } from '@kbn/i18n-react'; @@ -25,6 +32,37 @@ import { RuleDurationFormat } from './rule_duration_format'; import * as i18n from './translations'; +type TableColumn = EuiBasicTableColumn; + +interface UseColumnsArgs { + toggleRowExpanded: (item: RuleExecutionResult) => void; + isRowExpanded: (item: RuleExecutionResult) => boolean; +} + +export const expanderColumn = ({ + toggleRowExpanded, + isRowExpanded, +}: UseColumnsArgs): TableColumn => { + return { + align: RIGHT_ALIGNMENT, + width: '40px', + isExpander: true, + name: ( + + {i18n.EXPAND_ROW} + + ), + render: (item: RuleExecutionResult) => + item.security_status === 'succeeded' ? null : ( + toggleRowExpanded(item)} + aria-label={isRowExpanded(item) ? i18n.COLLAPSE : i18n.EXPAND} + iconType={isRowExpanded(item) ? 'arrowUp' : 'arrowDown'} + /> + ), + }; +}; + export const EXECUTION_LOG_COLUMNS: Array> = [ { name: ( @@ -69,22 +107,39 @@ export const EXECUTION_LOG_COLUMNS: Array - ), - render: (value: string) => <>{value}, - sortable: false, - truncateText: false, - width: '35%', - }, ]; -export const GET_EXECUTION_LOG_METRICS_COLUMNS = ( +export const getMessageColumn = (width: string) => ({ + field: 'security_message', + name: ( + + ), + render: (value: string, record: RuleExecutionResult) => { + if (record.security_status === 'succeeded') { + return value; + } + + return ( +
+ {value} +
+ ); + }, + sortable: false, + width, +}); + +export const getExecutionLogMetricsColumns = ( docLinks: DocLinksStart ): Array> => [ { diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/execution_log_table.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/execution_log_table.tsx index 072d3b6f58174..0c65399792dfd 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/execution_log_table.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/execution_log_table.tsx @@ -20,6 +20,7 @@ import { EuiSwitch, EuiBasicTable, EuiButton, + EuiDescriptionList, } from '@elastic/eui'; import type { Filter, Query } from '@kbn/es-query'; @@ -60,8 +61,15 @@ import { isAbsoluteTimeRange, isRelativeTimeRange } from '../../../../../common/ import { SourcererScopeName } from '../../../../../common/store/sourcerer/model'; import { useExecutionResults } from '../../../../rule_monitoring'; import { useRuleDetailsContext } from '../rule_details_context'; +import { useExpandableRows } from '../../../../rule_monitoring/components/basic/tables/use_expandable_rows'; +import { TextBlock } from '../../../../rule_monitoring/components/basic/text/text_block'; import * as i18n from './translations'; -import { EXECUTION_LOG_COLUMNS, GET_EXECUTION_LOG_METRICS_COLUMNS } from './execution_log_columns'; +import { + EXECUTION_LOG_COLUMNS, + getMessageColumn, + getExecutionLogMetricsColumns, + expanderColumn, +} from './execution_log_columns'; import { ExecutionLogSearchBar } from './execution_log_search_bar'; const EXECUTION_UUID_FIELD_NAME = 'kibana.alert.rule.execution.uuid'; @@ -361,7 +369,7 @@ const ExecutionLogTableComponent: React.FC = ({ { field: EXECUTION_UUID_FIELD_NAME, name: i18n.COLUMN_ACTIONS, - width: '5%', + width: '64px', actions: [ { name: 'Edit', @@ -386,14 +394,50 @@ const ExecutionLogTableComponent: React.FC = ({ [onFilterByExecutionIdCallback] ); - const executionLogColumns = useMemo( - () => - showMetricColumns - ? [...EXECUTION_LOG_COLUMNS, ...GET_EXECUTION_LOG_METRICS_COLUMNS(docLinks), ...actions] - : [...EXECUTION_LOG_COLUMNS, ...actions], - [actions, docLinks, showMetricColumns] + const getItemId = useCallback((item: RuleExecutionResult): string => { + return `${item.execution_uuid}`; + }, []); + + const renderExpandedItem = useCallback( + (item: RuleExecutionResult) => ( + , + }, + ]} + /> + ), + [] ); + const rows = useExpandableRows({ + getItemId, + renderItem: renderExpandedItem, + }); + + const executionLogColumns = useMemo(() => { + const columns = [...EXECUTION_LOG_COLUMNS]; + + if (showMetricColumns) { + columns.push(getMessageColumn('20%'), ...getExecutionLogMetricsColumns(docLinks)); + } else { + columns.push(getMessageColumn('50%')); + } + + columns.push( + ...actions, + expanderColumn({ + toggleRowExpanded: rows.toggleRowExpanded, + isRowExpanded: rows.isRowExpanded, + }) + ); + + return columns; + }, [actions, docLinks, showMetricColumns, rows.toggleRowExpanded, rows.isRowExpanded]); + return ( {/* Filter bar */} @@ -478,6 +522,9 @@ const ExecutionLogTableComponent: React.FC = ({ sorting={sorting} pagination={pagination} onChange={onTableChangeCallback} + itemId={getItemId} + itemIdToExpandedRowMap={rows.itemIdToExpandedRowMap} + isExpandable={true} /> ); diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/translations.ts b/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/translations.ts index 114faa77f871e..0b4e91c5934af 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/translations.ts +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_details_ui/pages/rule_details/execution_log_table/translations.ts @@ -229,3 +229,31 @@ export const GREATER_THAN_YEAR = i18n.translate( defaultMessage: '> 1 Year', } ); + +export const ROW_DETAILS_MESSAGE = i18n.translate( + 'xpack.securitySolution.detectionEngine.ruleDetails.ruleExecutionLog.fullMessage', + { + defaultMessage: 'Full message', + } +); + +export const EXPAND_ROW = i18n.translate( + 'xpack.securitySolution.detectionEngine.ruleDetails.ruleExecutionLog.expandRow', + { + defaultMessage: 'Expand rows', + } +); + +export const EXPAND = i18n.translate( + 'xpack.securitySolution.detectionEngine.ruleDetails.ruleExecutionLog.expand', + { + defaultMessage: 'Expand', + } +); + +export const COLLAPSE = i18n.translate( + 'xpack.securitySolution.detectionEngine.ruleDetails.ruleExecutionLog.collapse', + { + defaultMessage: 'Collapse', + } +); diff --git a/x-pack/plugins/security_solution/public/detections/components/rules/rule_execution_status/rule_status_failed_callout.tsx b/x-pack/plugins/security_solution/public/detections/components/rules/rule_execution_status/rule_status_failed_callout.tsx index e2dc4a842303d..25a6ae0be5c9f 100644 --- a/x-pack/plugins/security_solution/public/detections/components/rules/rule_execution_status/rule_status_failed_callout.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/rules/rule_execution_status/rule_status_failed_callout.tsx @@ -7,7 +7,8 @@ import React from 'react'; -import { EuiCallOut } from '@elastic/eui'; +import { EuiCallOut, EuiCodeBlock } from '@elastic/eui'; + import { FormattedDate } from '../../../../common/components/formatted_date'; import { RuleExecutionStatus } from '../../../../../common/detection_engine/rule_monitoring'; @@ -30,20 +31,36 @@ const RuleStatusFailedCallOutComponent: React.FC = } return ( - - {title} - - } - color={color} - iconType="warning" - data-test-subj="ruleStatusFailedCallOut" +
- {message.split('\n').map((line) => ( -

{line}

- ))} - + + {title} + + } + color={color} + iconType="warning" + data-test-subj="ruleStatusFailedCallOut" + > + + {message} + + +
); }; From 4ac89d09bee37096e4d23dfb1410ea080ed50b05 Mon Sep 17 00:00:00 2001 From: Kurt Date: Thu, 18 May 2023 10:08:22 -0400 Subject: [PATCH 49/78] Disable User Profile theme button group when DarkMode config is set (#158030) ## Summary Closes [#156424](https://github.com/elastic/kibana/issues/156424) When `uiSettings.overrides.theme:darkMode: true` is set in the `kibana.yml` it should take precedence over all other theme selectors. The User Profile theme selector was still interactive while `uiSettings.overrides.theme:darkMode: true` was set in the config, causing a confusing UX. ## Screenshots Screenshot 2023-05-17 at 5 22 58 PM Screenshot 2023-05-17 at 5 23 22 PM ## Testing *When `uiSettings.overrides.theme:darkMode` is `true` the theme is overridden to 'Dark', but if it is set to `false`, it DOES NOT override the theme to 'Light'.* 1) In `kibana.yml`, set `uiSettings.overrides.theme:darkMode: true` 2) Navigate to User Profiles and see that the Theme control is disabled/set to 'Dark' and that there is help text 3) set `uiSettings.overrides.theme:darkMode: false` / remove the configuration line 4) Navigate to User Profiles and see that the Theme control is enabled and set to 'Light' --- .../user_profile/user_profile.test.tsx | 36 +++++++++++++-- .../user_profile/user_profile.tsx | 46 +++++++++++++++++-- 2 files changed, 75 insertions(+), 7 deletions(-) diff --git a/x-pack/plugins/security/public/account_management/user_profile/user_profile.test.tsx b/x-pack/plugins/security/public/account_management/user_profile/user_profile.test.tsx index 57473324b6b4e..a5c7d0e8f50d3 100644 --- a/x-pack/plugins/security/public/account_management/user_profile/user_profile.test.tsx +++ b/x-pack/plugins/security/public/account_management/user_profile/user_profile.test.tsx @@ -58,6 +58,8 @@ describe('useUserProfileForm', () => { coreStart.http.post.mockReset().mockResolvedValue(undefined); coreStart.notifications.toasts.addDanger.mockReset(); coreStart.notifications.toasts.addSuccess.mockReset(); + coreStart.settings.client.get.mockReset(); + coreStart.settings.client.isOverridden.mockReset(); }); it('should initialise form with values from user profile', () => { @@ -254,8 +256,9 @@ describe('useUserProfileForm', () => { ); - - expect(testWrapper.exists('[data-test-subj="darkModeButton"]')).toBeTruthy(); + const darkModeButton = testWrapper.find('EuiButtonGroup[data-test-subj="darkModeButton"]'); + expect(darkModeButton).toBeTruthy(); + expect(darkModeButton.getDOMNode()).not.toBeDisabled(); }); it('should not display if the User is a cloud user', () => { @@ -278,7 +281,7 @@ describe('useUserProfileForm', () => { ); - expect(testWrapper.exists('[data-test-subj="darkModeButton"]')).toBeFalsy(); + expect(testWrapper.exists('EuiButtonGroup[data-test-subj="darkModeButton"]')).toBeFalsy(); }); it('should add special toast after submitting form successfully since darkMode requires a refresh', async () => { @@ -306,5 +309,32 @@ describe('useUserProfileForm', () => { expect.objectContaining({ toastLifeTimeMs: 300000 }) ); }); + + it('should be disabled if the theme has been set in the config', () => { + const data: UserProfileData = {}; + + const nonCloudUser = mockAuthenticatedUser({ elastic_cloud_user: false }); + coreStart.settings.client.get.mockReturnValueOnce(true); + coreStart.settings.client.isOverridden.mockReturnValueOnce(true); + + const testWrapper = mount( + + + + ); + + const darkModeButton = testWrapper.find('EuiButtonGroup[data-test-subj="darkModeButton"]'); + expect(darkModeButton).toBeTruthy(); + expect(darkModeButton.getDOMNode()).toHaveProperty('disabled'); + }); }); }); diff --git a/x-pack/plugins/security/public/account_management/user_profile/user_profile.tsx b/x-pack/plugins/security/public/account_management/user_profile/user_profile.tsx index 3e7d15990e11d..64cb81beb2b07 100644 --- a/x-pack/plugins/security/public/account_management/user_profile/user_profile.tsx +++ b/x-pack/plugins/security/public/account_management/user_profile/user_profile.tsx @@ -29,7 +29,7 @@ import type { FunctionComponent } from 'react'; import React, { useRef, useState } from 'react'; import useUpdateEffect from 'react-use/lib/useUpdateEffect'; -import type { CoreStart, ToastInput, ToastOptions } from '@kbn/core/public'; +import type { CoreStart, IUiSettingsClient, ToastInput, ToastOptions } from '@kbn/core/public'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import { toMountPoint, useKibana } from '@kbn/kibana-react-plugin/public'; @@ -142,11 +142,23 @@ function UserDetailsEditor({ user }: { user: AuthenticatedUser }) { ); } -function UserSettingsEditor({ formik }: { formik: ReturnType }) { +function UserSettingsEditor({ + formik, + isDarkModeOverride, +}: { + formik: ReturnType; + isDarkModeOverride: boolean; +}) { if (!formik.values.data) { return null; } + let idSelected = formik.values.data.userSettings.darkMode; + + if (isDarkModeOverride) { + idSelected = 'dark'; + } + return ( = ({ user, data }) const isCloudUser = user.elastic_cloud_user; + const isDarkModeOverride = determineIfDarkModeOverride(services.settings.client); + const rightSideItems = [ { title: ( @@ -658,7 +674,9 @@ export const UserProfile: FunctionComponent = ({ user, data }) user={user} onShowPasswordForm={() => setShowChangePasswordForm(true)} /> - {isCloudUser ? null : } + {isCloudUser ? null : ( + + )} @@ -878,3 +896,23 @@ export const SaveChangesBottomBar: FunctionComponent = () => { ); }; + +function renderHelpText(isOverridden: boolean) { + if (isOverridden) { + return ( + + + + ); + } +} + +function determineIfDarkModeOverride(settingsClient: IUiSettingsClient) { + const isThemeOverridden = settingsClient.isOverridden('theme:darkMode'); + const isOverriddenThemeDarkMode = settingsClient.get('theme:darkMode'); + + return isThemeOverridden && isOverriddenThemeDarkMode; +} From 833ece60d7cd77cb58f694215aef9c289f0fd284 Mon Sep 17 00:00:00 2001 From: Jiawei Wu <74562234+JiaweiWu@users.noreply.github.com> Date: Thu, 18 May 2023 08:13:15 -0600 Subject: [PATCH 50/78] [RAM] Fix updates also updating createdAt/createdBy for maintenance window and rules settings (#158028) ## Summary Fix a small bug where our update functions were also updating the `createdBy/createdAt` fields for some of our saved objects, we should just be updating the `updatedBy/updatedAt` fields ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --- .../methods/archive.test.ts | 9 ++++++--- .../methods/archive.ts | 3 ++- .../methods/finish.ts | 3 ++- .../methods/update.test.ts | 7 +++++-- .../methods/update.ts | 3 ++- .../rules_settings_flapping_client.test.ts | 20 ++++++++++++++----- .../rules_settings_flapping_client.ts | 3 ++- .../tests/alerting/get_flapping_settings.ts | 1 - .../alerting/update_flapping_settings.ts | 1 - 9 files changed, 34 insertions(+), 16 deletions(-) diff --git a/x-pack/plugins/alerting/server/maintenance_window_client/methods/archive.test.ts b/x-pack/plugins/alerting/server/maintenance_window_client/methods/archive.test.ts index 391a2049d9a56..0bdf0748921f7 100644 --- a/x-pack/plugins/alerting/server/maintenance_window_client/methods/archive.test.ts +++ b/x-pack/plugins/alerting/server/maintenance_window_client/methods/archive.test.ts @@ -85,7 +85,8 @@ describe('MaintenanceWindowClient - archive', () => { { gte: '2023-03-05T00:00:00.000Z', lte: '2023-03-05T01:00:00.000Z' }, ], expirationDate: new Date().toISOString(), - ...updatedMetadata, + updatedAt: updatedMetadata.updatedAt, + updatedBy: updatedMetadata.updatedBy, }, { version: '123' } ); @@ -132,7 +133,8 @@ describe('MaintenanceWindowClient - archive', () => { { gte: '2023-03-05T00:00:00.000Z', lte: '2023-03-05T01:00:00.000Z' }, ], expirationDate: moment.utc().add(1, 'year').toISOString(), - ...updatedMetadata, + updatedAt: updatedMetadata.updatedAt, + updatedBy: updatedMetadata.updatedBy, }, { version: '123' } ); @@ -182,7 +184,8 @@ describe('MaintenanceWindowClient - archive', () => { ...mockMaintenanceWindow, events: modifiedEvents.slice(0, 4), expirationDate: new Date().toISOString(), - ...updatedMetadata, + updatedAt: updatedMetadata.updatedAt, + updatedBy: updatedMetadata.updatedBy, }, { version: '123' } ); diff --git a/x-pack/plugins/alerting/server/maintenance_window_client/methods/archive.ts b/x-pack/plugins/alerting/server/maintenance_window_client/methods/archive.ts index 7e28b7bc1405d..948f3c0e3e06e 100644 --- a/x-pack/plugins/alerting/server/maintenance_window_client/methods/archive.ts +++ b/x-pack/plugins/alerting/server/maintenance_window_client/methods/archive.ts @@ -77,7 +77,8 @@ async function archiveWithOCC( ...attributes, events, expirationDate, - ...modificationMetadata, + updatedAt: modificationMetadata.updatedAt, + updatedBy: modificationMetadata.updatedBy, }, { version, diff --git a/x-pack/plugins/alerting/server/maintenance_window_client/methods/finish.ts b/x-pack/plugins/alerting/server/maintenance_window_client/methods/finish.ts index 975a5caa4a9ed..1853a2e49f94e 100644 --- a/x-pack/plugins/alerting/server/maintenance_window_client/methods/finish.ts +++ b/x-pack/plugins/alerting/server/maintenance_window_client/methods/finish.ts @@ -105,7 +105,8 @@ async function finishWithOCC( { events: eventsWithFinishedEvent, expirationDate: expirationDate.toISOString(), - ...modificationMetadata, + updatedAt: modificationMetadata.updatedAt, + updatedBy: modificationMetadata.updatedBy, }, { version, diff --git a/x-pack/plugins/alerting/server/maintenance_window_client/methods/update.test.ts b/x-pack/plugins/alerting/server/maintenance_window_client/methods/update.test.ts index 481557d9d47a6..7c8f1740a4418 100644 --- a/x-pack/plugins/alerting/server/maintenance_window_client/methods/update.test.ts +++ b/x-pack/plugins/alerting/server/maintenance_window_client/methods/update.test.ts @@ -48,7 +48,7 @@ const mockContext: jest.Mocked = { describe('MaintenanceWindowClient - update', () => { beforeEach(() => { - mockContext.getModificationMetadata.mockResolvedValueOnce(updatedMetadata); + mockContext.getModificationMetadata.mockResolvedValue(updatedMetadata); }); afterEach(() => { @@ -101,7 +101,10 @@ describe('MaintenanceWindowClient - update', () => { { gte: '2023-04-01T23:00:00.000Z', lte: '2023-04-02T01:00:00.000Z' }, // Daylight savings ], expirationDate: moment(new Date(secondTimestamp)).tz('UTC').add(1, 'year').toISOString(), - ...updatedMetadata, + createdAt: '2023-02-26T00:00:00.000Z', + createdBy: 'test-user', + updatedAt: updatedMetadata.updatedAt, + updatedBy: updatedMetadata.updatedBy, }, { id: 'test-id' } ); diff --git a/x-pack/plugins/alerting/server/maintenance_window_client/methods/update.ts b/x-pack/plugins/alerting/server/maintenance_window_client/methods/update.ts index 17a5d2f573ee9..2a0c7ee3bcf87 100644 --- a/x-pack/plugins/alerting/server/maintenance_window_client/methods/update.ts +++ b/x-pack/plugins/alerting/server/maintenance_window_client/methods/update.ts @@ -84,7 +84,8 @@ async function updateWithOCC( ...(typeof enabled === 'boolean' ? { enabled } : {}), expirationDate, events, - ...modificationMetadata, + updatedBy: modificationMetadata.updatedBy, + updatedAt: modificationMetadata.updatedAt, }; // We are deleting and then creating rather than updating because SO.update diff --git a/x-pack/plugins/alerting/server/rules_settings_client/flapping/rules_settings_flapping_client.test.ts b/x-pack/plugins/alerting/server/rules_settings_client/flapping/rules_settings_flapping_client.test.ts index ca69100fcfaed..2b02af1327eea 100644 --- a/x-pack/plugins/alerting/server/rules_settings_client/flapping/rules_settings_flapping_client.test.ts +++ b/x-pack/plugins/alerting/server/rules_settings_client/flapping/rules_settings_flapping_client.test.ts @@ -29,9 +29,9 @@ const getMockRulesSettings = (): RulesSettings => { lookBackWindow: DEFAULT_FLAPPING_SETTINGS.lookBackWindow, statusChangeThreshold: DEFAULT_FLAPPING_SETTINGS.statusChangeThreshold, createdBy: 'test name', + createdAt: '2023-03-24T00:00:00.000Z', updatedBy: 'test name', - createdAt: new Date().toISOString(), - updatedAt: new Date().toISOString(), + updatedAt: '2023-03-24T00:00:00.000Z', }, }; }; @@ -50,7 +50,17 @@ const rulesSettingsFlappingClientParams: jest.Mocked { + beforeEach(() => + rulesSettingsFlappingClientParams.getModificationMetadata.mockResolvedValue(updatedMetadata) + ); beforeAll(() => { jest.useFakeTimers(); jest.setSystemTime(new Date(mockDateString)); @@ -115,10 +125,10 @@ describe('RulesSettingsFlappingClient', () => { enabled: false, lookBackWindow: 19, statusChangeThreshold: 3, + updatedAt: '2023-03-26T00:00:00.000Z', + updatedBy: 'updated-user', createdBy: 'test name', - updatedBy: 'test name', - createdAt: expect.any(String), - updatedAt: expect.any(String), + createdAt: '2023-03-24T00:00:00.000Z', }), }, { version: '123' } diff --git a/x-pack/plugins/alerting/server/rules_settings_client/flapping/rules_settings_flapping_client.ts b/x-pack/plugins/alerting/server/rules_settings_client/flapping/rules_settings_flapping_client.ts index 65db68aaba525..88052ea8cfb6e 100644 --- a/x-pack/plugins/alerting/server/rules_settings_client/flapping/rules_settings_flapping_client.ts +++ b/x-pack/plugins/alerting/server/rules_settings_client/flapping/rules_settings_flapping_client.ts @@ -92,7 +92,8 @@ export class RulesSettingsFlappingClient { flapping: { ...attributes.flapping, ...newFlappingProperties, - ...modificationMetadata, + updatedAt: modificationMetadata.updatedAt, + updatedBy: modificationMetadata.updatedBy, }, }, { diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/get_flapping_settings.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/get_flapping_settings.ts index 386e32b8e5778..8adfa2cfd1b3f 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/get_flapping_settings.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/get_flapping_settings.ts @@ -57,7 +57,6 @@ export default function getFlappingSettingsTests({ getService }: FtrProviderCont expect(response.body.status_change_threshold).to.eql( DEFAULT_FLAPPING_SETTINGS.statusChangeThreshold ); - expect(response.body.created_by).to.be.a('string'); expect(response.body.updated_by).to.be.a('string'); expect(Date.parse(response.body.created_at)).to.be.greaterThan(0); expect(Date.parse(response.body.updated_at)).to.be.greaterThan(0); diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/update_flapping_settings.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/update_flapping_settings.ts index a4d39ad4be89b..4415eda75c3c0 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/update_flapping_settings.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/update_flapping_settings.ts @@ -53,7 +53,6 @@ export default function updateFlappingSettingsTest({ getService }: FtrProviderCo expect(response.body.enabled).to.eql(false); expect(response.body.look_back_window).to.eql(20); expect(response.body.status_change_threshold).to.eql(20); - expect(response.body.created_by).to.eql(user.username); expect(response.body.updated_by).to.eql(user.username); expect(Date.parse(response.body.created_at)).to.be.greaterThan(0); expect(Date.parse(response.body.updated_at)).to.be.greaterThan(0); From 071890f2fb73b9dfb02dc01f5cfa7f38874fc00e Mon Sep 17 00:00:00 2001 From: "Joey F. Poon" Date: Thu, 18 May 2023 09:52:02 -0500 Subject: [PATCH 51/78] [Fleet] update uninstall token length (#158043) --- .../server/services/security/uninstall_token_service/index.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/x-pack/plugins/fleet/server/services/security/uninstall_token_service/index.ts b/x-pack/plugins/fleet/server/services/security/uninstall_token_service/index.ts index 633a431a84914..9998447af12fb 100644 --- a/x-pack/plugins/fleet/server/services/security/uninstall_token_service/index.ts +++ b/x-pack/plugins/fleet/server/services/security/uninstall_token_service/index.ts @@ -374,7 +374,7 @@ export class UninstallTokenService implements UninstallTokenServiceInterface { } private generateToken(): string { - return randomBytes(32).toString('hex'); + return randomBytes(16).toString('hex'); } private hashToken(token: string): string { From b78287b465825c02ae7a840a99e6c08689336cd5 Mon Sep 17 00:00:00 2001 From: Dario Gieselaar Date: Thu, 18 May 2023 17:11:38 +0200 Subject: [PATCH 52/78] Add ELU timings (#154022) Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../__snapshots__/http_config.test.ts.snap | 10 +++ .../src/http_config.ts | 20 +++++ .../src/http_server.ts | 81 +++++++++++++++++++ packages/core/http/core-http-server/index.ts | 2 + .../http/core-http-server/src/elu_monitor.ts | 36 +++++++++ .../core-http-server/src/router/request.ts | 1 + 6 files changed, 150 insertions(+) create mode 100644 packages/core/http/core-http-server/src/elu_monitor.ts diff --git a/packages/core/http/core-http-server-internal/src/__snapshots__/http_config.test.ts.snap b/packages/core/http/core-http-server-internal/src/__snapshots__/http_config.test.ts.snap index 87a5efcc5d279..b8d605bd75824 100644 --- a/packages/core/http/core-http-server-internal/src/__snapshots__/http_config.test.ts.snap +++ b/packages/core/http/core-http-server-internal/src/__snapshots__/http_config.test.ts.snap @@ -56,6 +56,16 @@ Object { "enabled": false, }, "customResponseHeaders": Object {}, + "eluMonitor": Object { + "enabled": true, + "logging": Object { + "enabled": false, + "threshold": Object { + "ela": 250, + "elu": 0.15, + }, + }, + }, "host": "localhost", "keepaliveTimeout": 120000, "maxPayload": ByteSizeValue { diff --git a/packages/core/http/core-http-server-internal/src/http_config.ts b/packages/core/http/core-http-server-internal/src/http_config.ts index 53417d9c533f8..a0ad53d7bc145 100644 --- a/packages/core/http/core-http-server-internal/src/http_config.ts +++ b/packages/core/http/core-http-server-internal/src/http_config.ts @@ -16,6 +16,7 @@ import { hostname } from 'os'; import url from 'url'; import type { Duration } from 'moment'; +import { IHttpEluMonitorConfig } from '@kbn/core-http-server/src/elu_monitor'; import { CspConfigType, CspConfig } from './csp'; import { ExternalUrlConfig } from './external_url'; import { @@ -137,6 +138,21 @@ const configSchema = schema.object( { defaultValue: [] } ), }), + eluMonitor: schema.object({ + enabled: schema.boolean({ defaultValue: true }), + logging: schema.object({ + enabled: schema.conditional( + schema.contextRef('dist'), + false, + schema.boolean({ defaultValue: true }), + schema.boolean({ defaultValue: false }) + ), + threshold: schema.object({ + elu: schema.number({ defaultValue: 0.15, min: 0, max: 1 }), + ela: schema.number({ defaultValue: 250, min: 0 }), + }), + }), + }), requestId: schema.object( { allowFromAnyIp: schema.boolean({ defaultValue: false }), @@ -226,6 +242,8 @@ export class HttpConfig implements IHttpConfig { public shutdownTimeout: Duration; public restrictInternalApis: boolean; + public eluMonitor: IHttpEluMonitorConfig; + /** * @internal */ @@ -265,7 +283,9 @@ export class HttpConfig implements IHttpConfig { this.xsrf = rawHttpConfig.xsrf; this.requestId = rawHttpConfig.requestId; this.shutdownTimeout = rawHttpConfig.shutdownTimeout; + this.restrictInternalApis = rawHttpConfig.restrictInternalApis; + this.eluMonitor = rawHttpConfig.eluMonitor; } } diff --git a/packages/core/http/core-http-server-internal/src/http_server.ts b/packages/core/http/core-http-server-internal/src/http_server.ts index 2bdf76ee23310..747c477d1b41d 100644 --- a/packages/core/http/core-http-server-internal/src/http_server.ts +++ b/packages/core/http/core-http-server-internal/src/http_server.ts @@ -43,6 +43,10 @@ import type { HttpAuth, IAuthHeadersStorage, } from '@kbn/core-http-server'; +import { performance } from 'perf_hooks'; +import { isBoom } from '@hapi/boom'; +import { identity } from 'lodash'; +import { IHttpEluMonitorConfig } from '@kbn/core-http-server/src/elu_monitor'; import { HttpConfig } from './http_config'; import { adoptToHapiAuthFormat } from './lifecycle/auth'; import { adoptToHapiOnPreAuth } from './lifecycle/on_pre_auth'; @@ -55,6 +59,62 @@ import { AuthHeadersStorage } from './auth_headers_storage'; import { BasePath } from './base_path_service'; import { getEcsResponseLog } from './logging'; +/** + * Adds ELU timings for the executed function to the current's context transaction + * + * @param path The request path + * @param log Logger + */ +function startEluMeasurement( + path: string, + log: Logger, + eluMonitorOptions: IHttpEluMonitorConfig | undefined +): () => void { + if (!eluMonitorOptions?.enabled) { + return identity; + } + + const startUtilization = performance.eventLoopUtilization(); + const start = performance.now(); + + return function stopEluMeasurement() { + const { active, utilization } = performance.eventLoopUtilization(startUtilization); + + apm.currentTransaction?.addLabels( + { + event_loop_utilization: utilization, + event_loop_active: active, + }, + false + ); + + const duration = performance.now() - start; + + const { elu: eluThreshold, ela: elaThreshold } = eluMonitorOptions.logging.threshold; + + if ( + eluMonitorOptions.logging.enabled && + active >= eluMonitorOptions.logging.threshold.ela && + utilization >= eluMonitorOptions.logging.threshold.elu + ) { + log.warn( + `Event loop utilization for ${path} exceeded threshold of ${elaThreshold}ms (${Math.round( + active + )}ms out of ${Math.round(duration)}ms) and ${eluThreshold * 100}% (${Math.round( + utilization * 100 + )}%) `, + { + labels: { + request_path: path, + event_loop_active: active, + event_loop_utilization: utilization, + }, + } + ); + } + }; +} + /** @internal */ export interface HttpServerSetup { server: Server; @@ -350,7 +410,27 @@ export class HttpServer { config: HttpConfig, executionContext?: InternalExecutionContextSetup ) { + this.server!.ext('onPreResponse', (request, responseToolkit) => { + const stop = (request.app as KibanaRequestState).measureElu; + + if (!stop) { + return responseToolkit.continue; + } + + if (isBoom(request.response)) { + stop(); + } else { + request.response.events.once('finish', () => { + stop(); + }); + } + + return responseToolkit.continue; + }); + this.server!.ext('onRequest', (request, responseToolkit) => { + const stop = startEluMeasurement(request.path, this.log, this.config?.eluMonitor); + const requestId = getRequestId(request, config.requestId); const parentContext = executionContext?.getParentContextFrom(request.headers); @@ -366,6 +446,7 @@ export class HttpServer { ...(request.app ?? {}), requestId, requestUuid: uuidv4(), + measureElu: stop, // Kibana stores trace.id until https://github.com/elastic/apm-agent-nodejs/issues/2353 is resolved // The current implementation of the APM agent ends a request transaction before "response" log is emitted. traceId: apm.currentTraceIds['trace.id'], diff --git a/packages/core/http/core-http-server/index.ts b/packages/core/http/core-http-server/index.ts index de373db4c27de..043f18e131628 100644 --- a/packages/core/http/core-http-server/index.ts +++ b/packages/core/http/core-http-server/index.ts @@ -107,6 +107,8 @@ export type { ICspConfig } from './src/csp'; export type { IExternalUrlConfig } from './src/external_url'; +export type { IHttpEluMonitorConfig } from './src/elu_monitor'; + export type { IBasePath } from './src/base_path'; export type { diff --git a/packages/core/http/core-http-server/src/elu_monitor.ts b/packages/core/http/core-http-server/src/elu_monitor.ts new file mode 100644 index 0000000000000..6ccb140d3746e --- /dev/null +++ b/packages/core/http/core-http-server/src/elu_monitor.ts @@ -0,0 +1,36 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +/** + * HTTP request ELU monitor config + * @public + */ +export interface IHttpEluMonitorConfig { + /** + * Whether the monitoring of event loop utilization for HTTP requests is enabled. + */ + readonly enabled: boolean; + + readonly logging: { + /** + * Whether to log ELU + ELA violations. Both `.elu` and `.ela` need to be exceeded for it to be considered a violation. + */ + readonly enabled: boolean; + + readonly threshold: { + /** + * The minimum percentage of the request duration that needs to be exceeded (needs to be between 0 and 1) + */ + readonly elu: number; + /** + * The minimum number of milliseconds the event loop was active for the duration of the request. + */ + readonly ela: number; + }; + }; +} diff --git a/packages/core/http/core-http-server/src/router/request.ts b/packages/core/http/core-http-server/src/router/request.ts index e0664cb1ea29a..a92f2d496705a 100644 --- a/packages/core/http/core-http-server/src/router/request.ts +++ b/packages/core/http/core-http-server/src/router/request.ts @@ -30,6 +30,7 @@ export interface KibanaRequestState extends RequestApplicationState { requestUuid: string; rewrittenUrl?: URL; traceId?: string; + measureElu?: () => void; } /** From 293cacde46146ba43264ea40493d9374f2565496 Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Thu, 18 May 2023 17:17:14 +0200 Subject: [PATCH 53/78] Compatible mappings check message (#157964) --- .../src/check_additive_only_change.ts | 13 ++++++++----- .../src/check_additve_only_change.test.ts | 6 ++++-- 2 files changed, 12 insertions(+), 7 deletions(-) diff --git a/packages/kbn-check-mappings-update-cli/src/check_additive_only_change.ts b/packages/kbn-check-mappings-update-cli/src/check_additive_only_change.ts index 7fb42f7115233..d13db53b0110d 100644 --- a/packages/kbn-check-mappings-update-cli/src/check_additive_only_change.ts +++ b/packages/kbn-check-mappings-update-cli/src/check_additive_only_change.ts @@ -27,14 +27,14 @@ export function checkAdditiveOnlyChange( next: SavedObjectsTypeMappingDefinitions ) { let checkedCount = 0; - const Os: Array<[path: string[], value: unknown]> = [[[], current]]; + const pathValueTuples: Array<[path: string[], value: unknown]> = [[[], current]]; const missingProps: string[] = []; - while (Os.length) { - const [path, value] = Os.shift()!; + while (pathValueTuples.length) { + const [path, value] = pathValueTuples.shift()!; // "Recurse" into the value if it's an object if (isObject(value)) { - Object.entries(value).forEach(([k, v]) => Os.push([[...path, k], v])); + Object.entries(value).forEach(([k, v]) => pathValueTuples.push([[...path, k], v])); } // If we're at a "properties" object, check that the next mappings have the same field if (path.length > 1 && path[path.length - 2] === 'properties') { @@ -47,7 +47,10 @@ export function checkAdditiveOnlyChange( if (missingProps.length > 0) { const props = JSON.stringify(missingProps, null, 2); throw createFailError( - `Removing mapped properties is disallowed. Properties found in current mappings but not in next mappings:\n${props}` + `Removing mapped properties is disallowed >8.8. Found the following properties in current mappings but not in next mappings: +${props} + +Reach out to the Kibana core team if you have any questions.` ); } diff --git a/packages/kbn-check-mappings-update-cli/src/check_additve_only_change.test.ts b/packages/kbn-check-mappings-update-cli/src/check_additve_only_change.test.ts index 11f9394b9dd5e..6b0ed703b3836 100644 --- a/packages/kbn-check-mappings-update-cli/src/check_additve_only_change.test.ts +++ b/packages/kbn-check-mappings-update-cli/src/check_additve_only_change.test.ts @@ -40,12 +40,14 @@ describe('#checkAdditiveOnlyChange', () => { delete next.bar.properties.number; expect(() => checkAdditiveOnlyChange(log, current, next)).toThrowErrorMatchingInlineSnapshot(` - "Removing mapped properties is disallowed. Properties found in current mappings but not in next mappings: + "Removing mapped properties is disallowed >8.8. Found the following properties in current mappings but not in next mappings: [ \\"foo.properties.text\\", \\"bar.properties.number\\", \\"foo.properties.object.properties.nestedText\\" - ]" + ] + + Reach out to the Kibana core team if you have any questions." `); }); From 839da37ecb7df655a0fe7c5c2da16bcf11cd20fa Mon Sep 17 00:00:00 2001 From: Terrance DeJesus <99630311+terrancedejesus@users.noreply.github.com> Date: Thu, 18 May 2023 11:18:01 -0400 Subject: [PATCH 54/78] Change Prebuilt Security Rules Changelog Reference (#156716) ## Summary This PR changes the URL reference link from Kibana UI to downloadable updates security docs site. The current link directs the user to the security doc updates that relate to file system rule updates, which is now deprecated. This update would point the user to the downloadable OOB package updates which is how we currently release prebuilt rules. Existing: https://www.elastic.co/guide/en/security/master/prebuilt-rules-changelog.html (docs built from filesystem rules - deprecated) Proposed: https://www.elastic.co/guide/en/security/master/prebuilt-rules-downloadable-updates.html (aligns with OOB packages - currently how we release and build docs) --- packages/kbn-doc-links/src/get_doc_links.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kbn-doc-links/src/get_doc_links.ts b/packages/kbn-doc-links/src/get_doc_links.ts index 04289a84fdd0d..79570d804a20d 100644 --- a/packages/kbn-doc-links/src/get_doc_links.ts +++ b/packages/kbn-doc-links/src/get_doc_links.ts @@ -382,7 +382,7 @@ export const getDocLinks = ({ kibanaBranch }: GetDocLinkOptions): DocLinks => { gettingStarted: `${SECURITY_SOLUTION_DOCS}index.html`, privileges: `${SECURITY_SOLUTION_DOCS}sec-requirements.html`, ml: `${SECURITY_SOLUTION_DOCS}machine-learning.html`, - ruleChangeLog: `${SECURITY_SOLUTION_DOCS}prebuilt-rules-changelog.html`, + ruleChangeLog: `${SECURITY_SOLUTION_DOCS}prebuilt-rules-downloadable-updates.html`, detectionsReq: `${SECURITY_SOLUTION_DOCS}detections-permissions-section.html`, networkMap: `${SECURITY_SOLUTION_DOCS}conf-map-ui.html`, troubleshootGaps: `${SECURITY_SOLUTION_DOCS}alerts-ui-monitor.html#troubleshoot-gaps`, From a9b13c0d96e3008ef856306a2ecdd7ee42032fba Mon Sep 17 00:00:00 2001 From: Chris Cowan Date: Thu, 18 May 2023 10:05:05 -0600 Subject: [PATCH 55/78] [SLO] Adding Data Views to index pattern selector (#158033) ## Summary This PR adds support for picking Data Views to the index selector for the Custom KQL indicator. However, this doesn't actually attach the Data View to the SLO definition, this is only a convenient way to re-use the index pattern defined in the Data View. Keep in mind that if a user updates a Data View, they will need to update the SLO as well since the SLO service uses transforms behind the scenes; transforms do not support Kibana Data Views and there isn't a way to detect when the Data View is updated to re-create the transform. This PR also filters out hidden indices OR indices whose names are prefixed with a dot. image --- .../public/hooks/use_fetch_data_views.ts | 46 ++++++++ .../components/custom_kql/index_selection.tsx | 107 ++++++++++++------ 2 files changed, 117 insertions(+), 36 deletions(-) create mode 100644 x-pack/plugins/observability/public/hooks/use_fetch_data_views.ts diff --git a/x-pack/plugins/observability/public/hooks/use_fetch_data_views.ts b/x-pack/plugins/observability/public/hooks/use_fetch_data_views.ts new file mode 100644 index 0000000000000..f785e4a18bea0 --- /dev/null +++ b/x-pack/plugins/observability/public/hooks/use_fetch_data_views.ts @@ -0,0 +1,46 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + QueryObserverResult, + RefetchOptions, + RefetchQueryFilters, + useQuery, +} from '@tanstack/react-query'; +import { DataView } from '@kbn/data-views-plugin/public'; +import { useKibana } from '../utils/kibana_react'; + +export interface UseFetchDataViewsResponse { + isLoading: boolean; + isSuccess: boolean; + isError: boolean; + dataViews: DataView[] | undefined; + refetch: ( + options?: (RefetchOptions & RefetchQueryFilters) | undefined + ) => Promise>; +} +export interface Index { + name: string; +} + +export function useFetchDataViews(): UseFetchDataViewsResponse { + const { dataViews } = useKibana().services; + + const { isLoading, isError, isSuccess, data, refetch } = useQuery({ + queryKey: ['fetchDataViews'], + queryFn: async () => { + try { + const response = await dataViews.find(''); + return response; + } catch (error) { + throw new Error(`Something went wrong. Error: ${error}`); + } + }, + }); + + return { isLoading, isError, isSuccess, dataViews: data, refetch }; +} diff --git a/x-pack/plugins/observability/public/pages/slo_edit/components/custom_kql/index_selection.tsx b/x-pack/plugins/observability/public/pages/slo_edit/components/custom_kql/index_selection.tsx index 6dd9d16fb5e3b..ac163d5844694 100644 --- a/x-pack/plugins/observability/public/pages/slo_edit/components/custom_kql/index_selection.tsx +++ b/x-pack/plugins/observability/public/pages/slo_edit/components/custom_kql/index_selection.tsx @@ -10,7 +10,9 @@ import { Controller, useFormContext } from 'react-hook-form'; import { EuiComboBox, EuiComboBoxOptionOption, EuiFormRow } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { CreateSLOInput } from '@kbn/slo-schema'; +import { DataView } from '@kbn/data-views-plugin/public'; +import { useFetchDataViews } from '../../../../hooks/use_fetch_data_views'; import { useFetchIndices, Index } from '../../../../hooks/use_fetch_indices'; interface Option { @@ -20,28 +22,33 @@ interface Option { export function IndexSelection() { const { control, getFieldState } = useFormContext(); - const { isLoading, indices = [] } = useFetchIndices(); + const { isLoading: isIndicesLoading, indices = [] } = useFetchIndices(); + const { isLoading: isDataViewsLoading, dataViews = [] } = useFetchDataViews(); const [indexOptions, setIndexOptions] = useState([]); useEffect(() => { - setIndexOptions([createIndexOptions(indices)]); + setIndexOptions(createIndexOptions(indices, dataViews)); // eslint-disable-next-line react-hooks/exhaustive-deps - }, [indices.length]); + }, [indices.length, dataViews.length]); const onSearchChange = (search: string) => { const options: Option[] = []; if (!search) { - return setIndexOptions([createIndexOptions(indices)]); + return setIndexOptions(createIndexOptions(indices, dataViews)); } const searchPattern = search.endsWith('*') ? search.substring(0, search.length - 1) : search; const matchingIndices = indices.filter(({ name }) => name.startsWith(searchPattern)); + const matchingDataViews = dataViews.filter( + (view) => + view.getName().startsWith(searchPattern) || view.getIndexPattern().startsWith(searchPattern) + ); - if (matchingIndices.length === 0) { + if (matchingIndices.length === 0 && matchingDataViews.length === 0) { return setIndexOptions([]); } - options.push(createIndexOptions(matchingIndices)); + createIndexOptions(matchingIndices, matchingDataViews).map((option) => options.push(option)); const searchWithStarSuffix = search.endsWith('*') ? search : `${search}*`; options.push({ @@ -55,6 +62,13 @@ export function IndexSelection() { setIndexOptions(options); }; + const placeholder = i18n.translate( + 'xpack.observability.slo.sloEdit.customKql.indexSelection.placeholder', + { + defaultMessage: 'Select an index or index pattern', + } + ); + return ( ( { if (selected.length) { return field.onChange(selected[0].value); @@ -97,22 +106,9 @@ export function IndexSelection() { }} onSearchChange={onSearchChange} options={indexOptions} - placeholder={i18n.translate( - 'xpack.observability.slo.sloEdit.customKql.indexSelection.placeholder', - { - defaultMessage: 'Select an index or index pattern', - } - )} + placeholder={placeholder} selectedOptions={ - !!field.value - ? [ - { - value: field.value, - label: field.value, - 'data-test-subj': 'indexSelectionSelectedValue', - }, - ] - : [] + !!field.value ? [findSelectedIndexPattern(dataViews, field.value)] : [] } singleSelection /> @@ -122,14 +118,53 @@ export function IndexSelection() { ); } -function createIndexOptions(indices: Index[]): Option { +function findSelectedIndexPattern(dataViews: DataView[], indexPattern: string) { + const selectedDataView = dataViews.find((view) => view.getIndexPattern() === indexPattern); + if (selectedDataView) { + return { + value: selectedDataView.getIndexPattern(), + label: createDataViewLabel(selectedDataView), + 'data-test-subj': 'indexSelectionSelectedValue', + }; + } + return { - label: i18n.translate( - 'xpack.observability.slo.sloEdit.customKql.indexSelection.indexOptionsLabel', - { defaultMessage: 'Select an existing index' } - ), - options: indices - .map(({ name }) => ({ label: name, value: name })) - .sort((a, b) => String(a.label).localeCompare(b.label)), + value: indexPattern, + label: indexPattern, + 'data-test-subj': 'indexSelectionSelectedValue', }; } + +function createDataViewLabel(dataView: DataView) { + return `${dataView.getName()} (${dataView.getIndexPattern()})`; +} + +function createIndexOptions(indices: Index[], dataViews: DataView[]): Option[] { + const options = [ + { + label: i18n.translate( + 'xpack.observability.slo.sloEdit.customKql.indexSelection.indexOptionsLabel', + { defaultMessage: 'Select an existing index' } + ), + options: indices + .filter(({ name }) => !name.startsWith('.')) + .map(({ name }) => ({ label: name, value: name })) + .sort((a, b) => String(a.label).localeCompare(b.label)), + }, + ]; + if (dataViews.length > 0) { + options.unshift({ + label: i18n.translate( + 'xpack.observability.slo.sloEdit.customKql.indexSelection.dataViewOptionsLabel', + { defaultMessage: 'Select an existing Data View' } + ), + options: dataViews + .map((view) => ({ + label: createDataViewLabel(view), + value: view.getIndexPattern(), + })) + .sort((a, b) => String(a.label).localeCompare(b.label)), + }); + } + return options; +} From 731aaa404523edb4268c4c540a54da06b6f13543 Mon Sep 17 00:00:00 2001 From: Tiago Costa Date: Thu, 18 May 2023 17:08:37 +0100 Subject: [PATCH 56/78] chore(NA): add no cache headers for axios requests when downloading cloud dependencies (#158032) There are times when our DRA artifact jobs bundle a previous version of the dependencies (for example beats) even though a new one is already available. I'm not 100% this will fix the problem but I think we should try to use no cache headers on the requests that get the manifest contents for the latest versions. --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- src/dev/build/tasks/download_cloud_dependencies.ts | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/dev/build/tasks/download_cloud_dependencies.ts b/src/dev/build/tasks/download_cloud_dependencies.ts index 266901afb67dc..c0eae308b7d82 100644 --- a/src/dev/build/tasks/download_cloud_dependencies.ts +++ b/src/dev/build/tasks/download_cloud_dependencies.ts @@ -58,11 +58,18 @@ export const DownloadCloudDependencies: Task = { let manifestUrl = ''; let manifestJSON = null; const buildUrl = `https://${subdomain}.elastic.co/beats/latest/${config.getBuildVersion()}.json`; + const axiosConfigWithNoCacheHeaders = { + headers: { + 'Cache-Control': 'no-cache', + Pragma: 'no-cache', + Expires: '0', + }, + }; try { - const latest = await Axios.get(buildUrl); + const latest = await Axios.get(buildUrl, axiosConfigWithNoCacheHeaders); buildId = latest.data.build_id; manifestUrl = latest.data.manifest_url; - manifestJSON = (await Axios.get(manifestUrl)).data; + manifestJSON = (await Axios.get(manifestUrl, axiosConfigWithNoCacheHeaders)).data; if (!(manifestUrl && manifestJSON)) throw new Error('Missing manifest.'); } catch (e) { log.error(`Unable to find Beats artifacts for ${config.getBuildVersion()} at ${buildUrl}.`); From 574d334f07a40a010b1fb110b0f858bcfda7e619 Mon Sep 17 00:00:00 2001 From: Elena Stoeva <59341489+ElenaStoeva@users.noreply.github.com> Date: Thu, 18 May 2023 17:31:06 +0100 Subject: [PATCH 57/78] [Serverless] Disable Migrate plugin (#157881) ## Summary This PR makes the Migrate plugin disable-able for serverless. Partially addresses https://github.com/elastic/kibana/issues/157756 **How to test:** 1. Start Elasticsearch with `yarn es snapshot` and Kibana with yarn `serverless-{mode}` where `{mode}` can be `es`, `security`, or `oblt`. 2. Verify that the Migrate plugin doesn't show up in the nav bar and its path (`management/data/migrate_data`) leads to the Stack Management landing page. --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- config/serverless.yml | 1 + .../cloud_data_migration/server/config.ts | 19 +++++++++++++++++++ .../cloud_data_migration/server/index.ts | 2 ++ .../cloud_data_migration/tsconfig.json | 2 ++ 4 files changed, 24 insertions(+) create mode 100644 x-pack/plugins/cloud_integrations/cloud_data_migration/server/config.ts diff --git a/config/serverless.yml b/config/serverless.yml index b9cf2a384873d..153ca487205ca 100644 --- a/config/serverless.yml +++ b/config/serverless.yml @@ -17,6 +17,7 @@ xpack.license_management.enabled: false # Other disabled plugins #xpack.canvas.enabled: false #only disabable in dev-mode xpack.reporting.enabled: false +xpack.cloud_integrations.data_migration.enabled: false # Enforce restring access to internal APIs see https://github.com/elastic/kibana/issues/151940 # server.restrictInternalApis: true diff --git a/x-pack/plugins/cloud_integrations/cloud_data_migration/server/config.ts b/x-pack/plugins/cloud_integrations/cloud_data_migration/server/config.ts new file mode 100644 index 0000000000000..d1b9842857d47 --- /dev/null +++ b/x-pack/plugins/cloud_integrations/cloud_data_migration/server/config.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { schema, TypeOf } from '@kbn/config-schema'; +import { PluginConfigDescriptor } from '@kbn/core-plugins-server'; + +const configSchema = schema.object({ + enabled: schema.boolean({ defaultValue: true }), +}); + +export type CloudDataMigrationConfig = TypeOf; + +export const config: PluginConfigDescriptor = { + schema: configSchema, +}; diff --git a/x-pack/plugins/cloud_integrations/cloud_data_migration/server/index.ts b/x-pack/plugins/cloud_integrations/cloud_data_migration/server/index.ts index 04fd5a6e67686..5d5388e653cc8 100644 --- a/x-pack/plugins/cloud_integrations/cloud_data_migration/server/index.ts +++ b/x-pack/plugins/cloud_integrations/cloud_data_migration/server/index.ts @@ -7,4 +7,6 @@ import { CloudDataMigrationPlugin } from './plugin'; +export { config } from './config'; + export const plugin = () => new CloudDataMigrationPlugin(); diff --git a/x-pack/plugins/cloud_integrations/cloud_data_migration/tsconfig.json b/x-pack/plugins/cloud_integrations/cloud_data_migration/tsconfig.json index f03c1067af556..8709eb46c3ca1 100644 --- a/x-pack/plugins/cloud_integrations/cloud_data_migration/tsconfig.json +++ b/x-pack/plugins/cloud_integrations/cloud_data_migration/tsconfig.json @@ -19,6 +19,8 @@ "@kbn/kibana-react-plugin", "@kbn/i18n", "@kbn/i18n-react", + "@kbn/config-schema", + "@kbn/core-plugins-server", ], "exclude": [ "target/**/*", From e6ee79bf54a67af267ef1f12de862890b5a898c8 Mon Sep 17 00:00:00 2001 From: Khristinin Nikita Date: Thu, 18 May 2023 18:45:47 +0200 Subject: [PATCH 58/78] Unskip tests (#156489) ## Summary Unskip IM rule tests --- .../security_and_spaces/rule_execution_logic/threat_match.ts | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/threat_match.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/threat_match.ts index 912fa62e8447d..c381c216bbf71 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/threat_match.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/threat_match.ts @@ -145,8 +145,7 @@ export default ({ getService }: FtrProviderContext) => { /** * Specific api integration tests for threat matching rule type */ - // FLAKY: https://github.com/elastic/kibana/issues/155304 - describe.skip('Threat match type rules', () => { + describe('Threat match type rules', () => { before(async () => { // await deleteSignalsIndex(supertest, log); // await deleteAllAlerts(supertest, log); From b754a2df75aa731b063f986f17aecd8550352cea Mon Sep 17 00:00:00 2001 From: Tomasz Kajtoch Date: Thu, 18 May 2023 18:52:40 +0200 Subject: [PATCH 59/78] Upgrade EUI to v80.0.0 (#157939) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary `@elastic/eui@79.0.1` ⏩ `@elastic/eui@80.0.0` --- ## [`80.0.0`](https://github.com/elastic/eui/tree/v80.0.0) - Improved the contrast ratio of meta labels within `EuiSelectableTemplateSitewide` to meet WCAG AA guidelines. ([#6761](https://github.com/elastic/eui/pull/6761)) - Added `vulnerabilityManagementApp` glyph to `EuiIcon` ([#6762](https://github.com/elastic/eui/pull/6762)) - Added `logoVulnerabilityManagement` icon to `EuiIcon` ([#6763](https://github.com/elastic/eui/pull/6763)) - Added `onPanelChange` callback to `EuiContextMenu` to provide consumer access to `panelId` and `direction`. ([#6767](https://github.com/elastic/eui/pull/6767)) **Bug fixes** - Fixed `EuiComboBox` so `append` and `prepend` icon buttons are full height and vertically centered. ([#6766](https://github.com/elastic/eui/pull/6766)) - Improved the uniformity of dropdown components by hiding the dropdown icon of disabled `EuiComboBox`s. ([#6768](https://github.com/elastic/eui/pull/6768)) **Breaking changes** - `EuiFieldNumber` now defaults the `step` prop to `"any"` ([#6760](https://github.com/elastic/eui/pull/6760)) - EUI now globally resets a default Chromium browser style that was decreasing the opacity of disabled `select` items. ([#6768](https://github.com/elastic/eui/pull/6768)) --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- package.json | 2 +- .../__snapshots__/index.test.tsx.snap | 64 ------------------- src/dev/license_checker/config.ts | 2 +- .../set_view_control/decimal_degrees_form.tsx | 3 - .../services/ml/settings_calendar.ts | 4 +- yarn.lock | 8 +-- 6 files changed, 8 insertions(+), 75 deletions(-) diff --git a/package.json b/package.json index fd56c93863397..69502147c0881 100644 --- a/package.json +++ b/package.json @@ -97,7 +97,7 @@ "@elastic/datemath": "5.0.3", "@elastic/elasticsearch": "npm:@elastic/elasticsearch-canary@8.6.0-canary.3", "@elastic/ems-client": "8.4.0", - "@elastic/eui": "79.0.1", + "@elastic/eui": "80.0.0", "@elastic/filesaver": "1.1.2", "@elastic/node-crypto": "1.2.1", "@elastic/numeral": "^2.5.1", diff --git a/packages/kbn-securitysolution-autocomplete/src/field/__tests__/__snapshots__/index.test.tsx.snap b/packages/kbn-securitysolution-autocomplete/src/field/__tests__/__snapshots__/index.test.tsx.snap index d70949aaf3641..daa0fc69771ef 100644 --- a/packages/kbn-securitysolution-autocomplete/src/field/__tests__/__snapshots__/index.test.tsx.snap +++ b/packages/kbn-securitysolution-autocomplete/src/field/__tests__/__snapshots__/index.test.tsx.snap @@ -251,24 +251,6 @@ Object { />
-
- -
@@ -316,24 +298,6 @@ Object { />
-
- -
@@ -629,20 +593,6 @@ Object { class="euiLoadingSpinner emotion-euiLoadingSpinner-m" role="progressbar" /> -
@@ -699,20 +649,6 @@ Object { class="euiLoadingSpinner emotion-euiLoadingSpinner-m" role="progressbar" /> - diff --git a/src/dev/license_checker/config.ts b/src/dev/license_checker/config.ts index 5783cc934f8f8..fd7f3328d864f 100644 --- a/src/dev/license_checker/config.ts +++ b/src/dev/license_checker/config.ts @@ -85,6 +85,6 @@ export const LICENSE_OVERRIDES = { 'jsts@1.6.2': ['Eclipse Distribution License - v 1.0'], // cf. https://github.com/bjornharrtell/jsts '@mapbox/jsonlint-lines-primitives@2.0.2': ['MIT'], // license in readme https://github.com/tmcw/jsonlint '@elastic/ems-client@8.4.0': ['Elastic License 2.0'], - '@elastic/eui@79.0.1': ['SSPL-1.0 OR Elastic License 2.0'], + '@elastic/eui@80.0.0': ['SSPL-1.0 OR Elastic License 2.0'], 'language-subtag-registry@0.3.21': ['CC-BY-4.0'], // retired ODC‑By license https://github.com/mattcg/language-subtag-registry }; diff --git a/x-pack/plugins/maps/public/connected_components/toolbar_overlay/set_view_control/decimal_degrees_form.tsx b/x-pack/plugins/maps/public/connected_components/toolbar_overlay/set_view_control/decimal_degrees_form.tsx index 16e03d4125b44..03b23e409b770 100644 --- a/x-pack/plugins/maps/public/connected_components/toolbar_overlay/set_view_control/decimal_degrees_form.tsx +++ b/x-pack/plugins/maps/public/connected_components/toolbar_overlay/set_view_control/decimal_degrees_form.tsx @@ -90,7 +90,6 @@ export class DecimalDegreesForm extends Component { onChange={this._onLatChange} isInvalid={isLatInvalid} data-test-subj="latitudeInput" - step="any" // Browsers will validate decimals as invalid otherwise /> @@ -108,7 +107,6 @@ export class DecimalDegreesForm extends Component { onChange={this._onLonChange} isInvalid={isLonInvalid} data-test-subj="longitudeInput" - step="any" // Browsers will validate decimals as invalid otherwise /> @@ -126,7 +124,6 @@ export class DecimalDegreesForm extends Component { onChange={this._onZoomChange} isInvalid={isZoomInvalid} data-test-subj="zoomInput" - step="any" // Browsers will validate decimals as invalid otherwise /> diff --git a/x-pack/test/functional/services/ml/settings_calendar.ts b/x-pack/test/functional/services/ml/settings_calendar.ts index 617deeaa0634e..87ffcd2f41b83 100644 --- a/x-pack/test/functional/services/ml/settings_calendar.ts +++ b/x-pack/test/functional/services/ml/settings_calendar.ts @@ -147,7 +147,7 @@ export function MachineLearningSettingsCalendarProvider( async assertJobSelectionEnabled(expectedValue: boolean) { const isEnabled = await testSubjects.isEnabled( - 'mlCalendarJobSelection > comboBoxToggleListButton' + 'mlCalendarJobSelection > comboBoxSearchInput' ); expect(isEnabled).to.eql( expectedValue, @@ -159,7 +159,7 @@ export function MachineLearningSettingsCalendarProvider( async assertJobGroupSelectionEnabled(expectedValue: boolean) { const isEnabled = await testSubjects.isEnabled( - 'mlCalendarJobGroupSelection > comboBoxToggleListButton' + 'mlCalendarJobGroupSelection > comboBoxSearchInput' ); expect(isEnabled).to.eql( expectedValue, diff --git a/yarn.lock b/yarn.lock index c3343f134ff27..f56fab7e3b35f 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1543,10 +1543,10 @@ resolved "https://registry.yarnpkg.com/@elastic/eslint-plugin-eui/-/eslint-plugin-eui-0.0.2.tgz#56b9ef03984a05cc213772ae3713ea8ef47b0314" integrity sha512-IoxURM5zraoQ7C8f+mJb9HYSENiZGgRVcG4tLQxE61yHNNRDXtGDWTZh8N1KIHcsqN1CEPETjuzBXkJYF/fDiQ== -"@elastic/eui@79.0.1": - version "79.0.1" - resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-79.0.1.tgz#bb723c961f438df41f5b92292b59c204cd795558" - integrity sha512-xCB8a2DaiAIg1qsFgegmXT5niKhL6LKqhD0fCc1ut+BZDPq4XvqagwOdmYRvP9IpYDcS6sP+F89JVF0kaQsXXw== +"@elastic/eui@80.0.0": + version "80.0.0" + resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-80.0.0.tgz#33e1df8a3f193fb6a7a4f7e52a3028983856ba3a" + integrity sha512-0xWizIQ/kH9N2n9zOficqXPdRbVxCpHez2ZErnvISAEOneJ6401usI7fILGKrrvR+uyiYnNybfaP3H8HcgDa+g== dependencies: "@types/chroma-js" "^2.0.0" "@types/lodash" "^4.14.160" From ab27caff474b96d0753f52a6d002e8e453e942e4 Mon Sep 17 00:00:00 2001 From: Coen Warmer Date: Thu, 18 May 2023 19:38:36 +0200 Subject: [PATCH 60/78] Reorganize Observability Plugin (#157970) --- .github/CODEOWNERS | 23 +- .../pages/link_to/redirect_to_node_logs.tsx | 2 +- .../public/application/index.tsx | 4 +- .../alert_search_bar.test.tsx | 4 +- .../alert_search_bar/alert_search_bar.tsx | 6 +- .../alert_search_bar_with_url_sync.tsx | 6 +- .../components/alerts_status_filter.tsx | 2 +- .../alert_search_bar/components/index.ts | 0 .../alert_search_bar/constants.ts | 4 +- .../alert_search_bar/containers/index.tsx | 0 .../containers/state_container.tsx | 2 +- .../use_alert_search_bar_state_container.tsx | 6 +- .../get_alert_search_bar_lazy.tsx | 20 ++ .../{shared => }/alert_search_bar/types.ts | 2 +- .../{shared => }/alert_status_indicator.tsx | 0 .../{ => alerts_flyout}/alerts_flyout.mock.ts | 0 .../alerts_flyout.stories.tsx | 4 +- .../alerts_flyout.test.tsx | 6 +- .../{ => alerts_flyout}/alerts_flyout.tsx | 6 +- .../alerts_flyout_body.test.tsx | 10 +- .../alerts_flyout_body.tsx | 14 +- .../alerts_flyout_footer.tsx | 12 +- .../alerts_flyout_header.tsx | 2 +- .../use_get_alert_flyout_components.tsx | 4 +- .../get_alerts_table_configuration.tsx | 2 +- .../alerts_table/render_cell_value.tsx | 4 +- .../timestamp_tooltip.test.tsx} | 2 +- .../timestamp_tooltip.tsx} | 2 +- .../components/app/section/helper.test.ts | 39 --- .../public/components/app/section/helper.ts | 30 -- .../burn_rate_rule_editor/burn_rate.tsx | 0 .../burn_rate_rule_editor.stories.tsx | 4 +- .../burn_rate_rule_editor.tsx | 6 +- .../{app => }/burn_rate_rule_editor/index.tsx | 0 .../long_window_duration.tsx | 4 +- .../slo_selector.stories.tsx | 2 +- .../slo_selector.test.tsx | 8 +- .../burn_rate_rule_editor/slo_selector.tsx | 2 +- .../burn_rate_rule_editor/validation.test.ts | 2 +- .../burn_rate_rule_editor/validation.ts | 2 +- .../__stories__/core_vitals.stories.tsx | 0 .../color_palette_flex_item.tsx | 0 .../core_web_vitals/core_vital_item.test.tsx | 2 +- .../core_web_vitals/core_vital_item.tsx | 0 .../core_vitals.tsx} | 10 +- .../get_core_web_vitals_lazy.tsx | 19 ++ .../core_web_vitals/palette_legends.tsx | 0 .../core_web_vitals/service_name.tsx | 0 .../core_web_vitals/translations.ts | 0 .../core_web_vitals/web_core_vitals_title.tsx | 0 .../{shared => }/experimental_badge.tsx | 0 .../components/loading_observability.tsx | 2 - .../components/shared/action_menu/index.tsx | 76 ----- .../add_data_buttons/mobile_add_data.tsx | 32 -- .../add_data_buttons/synthetics_add_data.tsx | 32 -- .../shared/add_data_buttons/ux_add_data.tsx | 32 -- .../shared/alert_search_bar/index.ts | 9 - .../components/shared/date_picker/typings.ts | 22 -- .../field_value_selection.stories.tsx | 104 ------ .../field_value_combobox.tsx | 116 ------- .../field_value_selection.test.tsx | 81 ----- .../field_value_selection.tsx | 300 ------------------ .../field_value_suggestions/index.test.tsx | 137 -------- .../shared/field_value_suggestions/index.tsx | 89 ------ .../shared/field_value_suggestions/types.ts | 57 ---- .../filter_value_label/filter_value_label.tsx | 107 ------- .../public/components/shared/index.tsx | 102 ------ .../load_when_in_view/load_when_in_view.tsx | 52 --- .../components/shared/page_template/README.md | 176 ---------- .../components/shared/page_template/badge.png | Bin 10163 -> 0 bytes .../components/shared/page_template/index.ts | 9 - .../page_template/lazy_page_template.tsx | 26 -- .../page_template/nav_name_with_badge.tsx | 68 ---- .../nav_name_with_beta_badge.tsx | 47 --- .../shared/page_template/page_template.png | Bin 311243 -> 0 bytes .../page_template/page_template.test.tsx | 121 ------- .../shared/page_template/page_template.tsx | 209 ------------ .../public/components/shared/tour/index.ts | 8 - .../components/shared/tour/steps_config.ts | 122 ------- .../public/components/shared/tour/tour.tsx | 246 -------------- .../public/components/shared/types.ts | 25 -- .../date_picker_context.tsx | 4 +- .../has_data_context}/data_handler.test.ts | 2 +- .../has_data_context}/data_handler.ts | 2 +- .../get_observability_alerts.test.ts | 0 .../get_observability_alerts.ts | 0 .../has_data_context.test.tsx | 8 +- .../has_data_context.tsx | 16 +- .../context/inspector/inspector_context.tsx | 84 ----- .../inspector/use_inspector_context.tsx | 13 - .../{ => plugin_context}/plugin_context.tsx | 6 +- .../public/hooks/create_use_rules_link.ts | 4 +- .../public/hooks/use_alert_permission.test.ts | 108 ------- .../public/hooks/use_alert_permission.ts | 74 ----- .../public/hooks/use_breadcrumbs.test.tsx | 116 ------- .../public/hooks/use_breadcrumbs.ts | 71 ----- .../public/hooks/use_chart_theme.tsx | 42 --- .../public/hooks/use_date_picker_context.ts | 2 +- .../public/hooks/use_es_search.ts | 118 ------- .../hooks/use_fetch_alert_detail.test.ts | 2 +- .../public/hooks/use_fetcher.tsx | 116 ------- .../public/hooks/use_has_data.ts | 2 +- .../public/hooks/use_kibana_space.tsx | 27 -- .../public/hooks/use_link_props.test.tsx | 183 ----------- .../public/hooks/use_link_props.ts | 125 -------- .../public/hooks/use_messages_storage.tsx | 66 ---- .../public/hooks/use_plugin_context.tsx | 2 +- .../hooks/use_prefix_path_with_basepath.tsx | 23 -- .../public/hooks/use_query_params.ts | 34 -- .../public/hooks/use_quick_time_ranges.tsx | 27 -- .../public/hooks/use_route_params.tsx | 53 ---- .../observability/public/hooks/use_theme.tsx | 15 - .../public/hooks/use_time_zone.ts | 21 -- .../public/hooks/use_values_list.ts | 168 ---------- x-pack/plugins/observability/public/index.ts | 54 +--- .../public/locators/rule_details.test.ts | 2 +- .../public/locators/rule_details.ts | 2 +- .../alert_details/alert_details.test.tsx | 4 +- .../pages/alert_details/alert_details.tsx | 2 +- .../public/pages/alerts/alerts.tsx | 6 +- .../chart_container/chart_container.test.tsx} | 2 +- .../chart_container/chart_container.tsx} | 0 .../components/data_assistant_flyout.tsx | 2 +- .../overview/components/data_sections.tsx | 12 +- .../date_picker/date_picker.test.tsx | 4 +- .../components/date_picker/date_picker.tsx} | 21 +- .../{ => header_actions}/header_actions.tsx | 6 +- .../{ => header_menu}/header_menu.tsx | 6 +- .../header_menu}/header_menu_portal.test.tsx | 0 .../header_menu}/header_menu_portal.tsx | 10 +- .../news_feed/helpers}/get_news_feed.test.ts | 0 .../news_feed/helpers}/get_news_feed.ts | 0 .../components/{ => news_feed}/news_feed.scss | 0 .../{ => news_feed}/news_feed.test.tsx | 4 +- .../components/{ => news_feed}/news_feed.tsx | 2 +- .../observability_status/content.ts | 4 +- .../observability_status/index.tsx | 4 +- .../observability_status.stories.tsx | 0 .../observability_status_box.test.tsx | 0 .../observability_status_box.tsx | 2 +- .../observability_status_boxes.test.tsx | 0 .../observability_status_boxes.tsx | 0 .../observability_status_progress.test.tsx | 4 +- .../observability_status_progress.tsx | 2 +- .../sections/apm/apm_section.test.tsx} | 16 +- .../components/sections/apm/apm_section.tsx} | 19 +- .../sections}/apm/mock_data/apm.mock.ts | 2 +- .../empty}/empty_section.test.tsx | 9 +- .../{ => sections/empty}/empty_section.tsx | 16 +- .../{ => sections/empty}/empty_sections.tsx | 13 +- .../sections/error_panel/error_panel.tsx} | 0 .../sections/logs/logs_section.tsx} | 23 +- .../sections}/metrics/host_link.tsx | 2 +- .../metrics/lib/format_duration.test.ts | 0 .../sections}/metrics/lib/format_duration.ts | 0 .../sections}/metrics/logos/aix.svg | 0 .../sections}/metrics/logos/android.svg | 0 .../sections}/metrics/logos/darwin.svg | 0 .../sections}/metrics/logos/dragonfly.svg | 0 .../sections}/metrics/logos/freebsd.svg | 0 .../sections}/metrics/logos/illumos.svg | 0 .../sections}/metrics/logos/linux.svg | 0 .../sections}/metrics/logos/netbsd.svg | 0 .../sections}/metrics/logos/solaris.svg | 0 .../metrics/metric_with_sparkline.tsx | 2 +- .../sections/metrics/metrics_section.tsx} | 14 +- .../sections/section_container.test.tsx} | 4 +- .../sections/section_container.tsx} | 6 +- .../sections/uptime/uptime_section.tsx} | 27 +- .../sections}/ux/mock_data/ux.mock.ts | 2 +- .../sections/ux/ux_section.test.tsx} | 12 +- .../components/sections/ux/ux_section.tsx} | 18 +- .../components/styled_stat/styled_stat.tsx} | 0 .../pages/overview/overview.stories.tsx | 9 +- .../public/pages/overview/overview.tsx | 19 +- .../public/pages/rule_details/index.tsx | 4 +- .../public/pages/rules/rules.test.tsx | 4 +- .../public/pages/rules/rules.tsx | 2 +- .../pages/slo_details/slo_details.test.tsx | 2 +- .../public/pages/slo_details/slo_details.tsx | 2 +- .../public/pages/slo_edit/slo_edit.test.tsx | 2 +- .../public/pages/slo_edit/slo_edit.tsx | 2 +- .../public/pages/slos/slos.test.tsx | 2 +- .../observability/public/pages/slos/slos.tsx | 2 +- .../pages/slos_welcome/slos_welcome.test.tsx | 2 +- ...plugins_start.mock.tsx => plugin.mock.tsx} | 17 - x-pack/plugins/observability/public/plugin.ts | 5 +- .../observability/public/routes/index.tsx | 2 +- .../register_observability_rule_types.ts | 4 +- .../services/call_observability_api/index.ts | 30 -- .../services/call_observability_api/types.ts | 33 -- .../services/navigation_registry.test.ts | 73 ----- .../public/services/navigation_registry.ts | 73 ----- .../typings/fetch_overview_data/index.ts | 2 +- .../public/typings/section/index.ts | 18 -- .../public/update_global_navigation.test.tsx | 236 -------------- .../public/update_global_navigation.tsx | 69 ---- .../public/utils/kibana_react.mock.ts | 2 +- .../kibana_react.storybook_decorator.tsx | 2 +- .../navigation_warning_prompt/context.tsx | 32 -- .../utils/navigation_warning_prompt/index.ts | 9 - .../navigation_warning_prompt/prompt.tsx | 27 -- .../public/utils/test_helper.tsx | 2 +- x-pack/plugins/observability/tsconfig.json | 9 +- .../plugins/observability_shared/kibana.jsonc | 2 +- .../translations/translations/fr-FR.json | 37 --- .../translations/translations/ja-JP.json | 37 --- .../translations/translations/zh-CN.json | 37 --- 208 files changed, 355 insertions(+), 5015 deletions(-) rename x-pack/plugins/observability/public/components/{shared => }/alert_search_bar/alert_search_bar.test.tsx (97%) rename x-pack/plugins/observability/public/components/{shared => }/alert_search_bar/alert_search_bar.tsx (94%) rename x-pack/plugins/observability/public/components/{shared => }/alert_search_bar/alert_search_bar_with_url_sync.tsx (88%) rename x-pack/plugins/observability/public/components/{shared => }/alert_search_bar/components/alerts_status_filter.tsx (95%) rename x-pack/plugins/observability/public/components/{shared => }/alert_search_bar/components/index.ts (100%) rename x-pack/plugins/observability/public/components/{shared => }/alert_search_bar/constants.ts (91%) rename x-pack/plugins/observability/public/components/{shared => }/alert_search_bar/containers/index.tsx (100%) rename x-pack/plugins/observability/public/components/{shared => }/alert_search_bar/containers/state_container.tsx (96%) rename x-pack/plugins/observability/public/components/{shared => }/alert_search_bar/containers/use_alert_search_bar_state_container.tsx (95%) create mode 100644 x-pack/plugins/observability/public/components/alert_search_bar/get_alert_search_bar_lazy.tsx rename x-pack/plugins/observability/public/components/{shared => }/alert_search_bar/types.ts (97%) rename x-pack/plugins/observability/public/components/{shared => }/alert_status_indicator.tsx (100%) rename x-pack/plugins/observability/public/components/{ => alerts_flyout}/alerts_flyout.mock.ts (100%) rename x-pack/plugins/observability/public/components/{ => alerts_flyout}/alerts_flyout.stories.tsx (90%) rename x-pack/plugins/observability/public/components/{ => alerts_flyout}/alerts_flyout.test.tsx (95%) rename x-pack/plugins/observability/public/components/{ => alerts_flyout}/alerts_flyout.tsx (88%) rename x-pack/plugins/observability/public/components/{ => alerts_flyout}/alerts_flyout_body.test.tsx (78%) rename x-pack/plugins/observability/public/components/{ => alerts_flyout}/alerts_flyout_body.tsx (90%) rename x-pack/plugins/observability/public/components/{ => alerts_flyout}/alerts_flyout_footer.tsx (82%) rename x-pack/plugins/observability/public/components/{ => alerts_flyout}/alerts_flyout_header.tsx (92%) rename x-pack/plugins/observability/public/components/{ => alerts_flyout}/use_get_alert_flyout_components.tsx (90%) rename x-pack/plugins/observability/public/components/{shared/timestamp_tooltip/index.test.tsx => alerts_table/timestamp_tooltip.test.tsx} (97%) rename x-pack/plugins/observability/public/components/{shared/timestamp_tooltip/index.tsx => alerts_table/timestamp_tooltip.tsx} (88%) delete mode 100644 x-pack/plugins/observability/public/components/app/section/helper.test.ts delete mode 100644 x-pack/plugins/observability/public/components/app/section/helper.ts rename x-pack/plugins/observability/public/components/{app => }/burn_rate_rule_editor/burn_rate.tsx (100%) rename x-pack/plugins/observability/public/components/{app => }/burn_rate_rule_editor/burn_rate_rule_editor.stories.tsx (85%) rename x-pack/plugins/observability/public/components/{app => }/burn_rate_rule_editor/burn_rate_rule_editor.tsx (96%) rename x-pack/plugins/observability/public/components/{app => }/burn_rate_rule_editor/index.tsx (100%) rename x-pack/plugins/observability/public/components/{app => }/burn_rate_rule_editor/long_window_duration.tsx (96%) rename x-pack/plugins/observability/public/components/{app => }/burn_rate_rule_editor/slo_selector.stories.tsx (89%) rename x-pack/plugins/observability/public/components/{app => }/burn_rate_rule_editor/slo_selector.test.tsx (85%) rename x-pack/plugins/observability/public/components/{app => }/burn_rate_rule_editor/slo_selector.tsx (97%) rename x-pack/plugins/observability/public/components/{app => }/burn_rate_rule_editor/validation.test.ts (97%) rename x-pack/plugins/observability/public/components/{app => }/burn_rate_rule_editor/validation.ts (97%) rename x-pack/plugins/observability/public/components/{shared => }/core_web_vitals/__stories__/core_vitals.stories.tsx (100%) rename x-pack/plugins/observability/public/components/{shared => }/core_web_vitals/color_palette_flex_item.tsx (100%) rename x-pack/plugins/observability/public/components/{shared => }/core_web_vitals/core_vital_item.test.tsx (97%) rename x-pack/plugins/observability/public/components/{shared => }/core_web_vitals/core_vital_item.tsx (100%) rename x-pack/plugins/observability/public/components/{shared/core_web_vitals/index.tsx => core_web_vitals/core_vitals.tsx} (94%) create mode 100644 x-pack/plugins/observability/public/components/core_web_vitals/get_core_web_vitals_lazy.tsx rename x-pack/plugins/observability/public/components/{shared => }/core_web_vitals/palette_legends.tsx (100%) rename x-pack/plugins/observability/public/components/{shared => }/core_web_vitals/service_name.tsx (100%) rename x-pack/plugins/observability/public/components/{shared => }/core_web_vitals/translations.ts (100%) rename x-pack/plugins/observability/public/components/{shared => }/core_web_vitals/web_core_vitals_title.tsx (100%) rename x-pack/plugins/observability/public/components/{shared => }/experimental_badge.tsx (100%) delete mode 100644 x-pack/plugins/observability/public/components/shared/action_menu/index.tsx delete mode 100644 x-pack/plugins/observability/public/components/shared/add_data_buttons/mobile_add_data.tsx delete mode 100644 x-pack/plugins/observability/public/components/shared/add_data_buttons/synthetics_add_data.tsx delete mode 100644 x-pack/plugins/observability/public/components/shared/add_data_buttons/ux_add_data.tsx delete mode 100644 x-pack/plugins/observability/public/components/shared/alert_search_bar/index.ts delete mode 100644 x-pack/plugins/observability/public/components/shared/date_picker/typings.ts delete mode 100644 x-pack/plugins/observability/public/components/shared/field_value_suggestions/__stories__/field_value_selection.stories.tsx delete mode 100644 x-pack/plugins/observability/public/components/shared/field_value_suggestions/field_value_combobox.tsx delete mode 100644 x-pack/plugins/observability/public/components/shared/field_value_suggestions/field_value_selection.test.tsx delete mode 100644 x-pack/plugins/observability/public/components/shared/field_value_suggestions/field_value_selection.tsx delete mode 100644 x-pack/plugins/observability/public/components/shared/field_value_suggestions/index.test.tsx delete mode 100644 x-pack/plugins/observability/public/components/shared/field_value_suggestions/index.tsx delete mode 100644 x-pack/plugins/observability/public/components/shared/field_value_suggestions/types.ts delete mode 100644 x-pack/plugins/observability/public/components/shared/filter_value_label/filter_value_label.tsx delete mode 100644 x-pack/plugins/observability/public/components/shared/index.tsx delete mode 100644 x-pack/plugins/observability/public/components/shared/load_when_in_view/load_when_in_view.tsx delete mode 100644 x-pack/plugins/observability/public/components/shared/page_template/README.md delete mode 100644 x-pack/plugins/observability/public/components/shared/page_template/badge.png delete mode 100644 x-pack/plugins/observability/public/components/shared/page_template/index.ts delete mode 100644 x-pack/plugins/observability/public/components/shared/page_template/lazy_page_template.tsx delete mode 100644 x-pack/plugins/observability/public/components/shared/page_template/nav_name_with_badge.tsx delete mode 100644 x-pack/plugins/observability/public/components/shared/page_template/nav_name_with_beta_badge.tsx delete mode 100644 x-pack/plugins/observability/public/components/shared/page_template/page_template.png delete mode 100644 x-pack/plugins/observability/public/components/shared/page_template/page_template.test.tsx delete mode 100644 x-pack/plugins/observability/public/components/shared/page_template/page_template.tsx delete mode 100644 x-pack/plugins/observability/public/components/shared/tour/index.ts delete mode 100644 x-pack/plugins/observability/public/components/shared/tour/steps_config.ts delete mode 100644 x-pack/plugins/observability/public/components/shared/tour/tour.tsx delete mode 100644 x-pack/plugins/observability/public/components/shared/types.ts rename x-pack/plugins/observability/public/context/{ => date_picker_context}/date_picker_context.tsx (98%) rename x-pack/plugins/observability/public/{ => context/has_data_context}/data_handler.test.ts (99%) rename x-pack/plugins/observability/public/{ => context/has_data_context}/data_handler.ts (90%) rename x-pack/plugins/observability/public/{services => context/has_data_context}/get_observability_alerts.test.ts (100%) rename x-pack/plugins/observability/public/{services => context/has_data_context}/get_observability_alerts.ts (100%) rename x-pack/plugins/observability/public/context/{ => has_data_context}/has_data_context.test.tsx (98%) rename x-pack/plugins/observability/public/context/{ => has_data_context}/has_data_context.tsx (91%) delete mode 100644 x-pack/plugins/observability/public/context/inspector/inspector_context.tsx delete mode 100644 x-pack/plugins/observability/public/context/inspector/use_inspector_context.tsx rename x-pack/plugins/observability/public/context/{ => plugin_context}/plugin_context.tsx (72%) delete mode 100644 x-pack/plugins/observability/public/hooks/use_alert_permission.test.ts delete mode 100644 x-pack/plugins/observability/public/hooks/use_alert_permission.ts delete mode 100644 x-pack/plugins/observability/public/hooks/use_breadcrumbs.test.tsx delete mode 100644 x-pack/plugins/observability/public/hooks/use_breadcrumbs.ts delete mode 100644 x-pack/plugins/observability/public/hooks/use_chart_theme.tsx delete mode 100644 x-pack/plugins/observability/public/hooks/use_es_search.ts delete mode 100644 x-pack/plugins/observability/public/hooks/use_fetcher.tsx delete mode 100644 x-pack/plugins/observability/public/hooks/use_kibana_space.tsx delete mode 100644 x-pack/plugins/observability/public/hooks/use_link_props.test.tsx delete mode 100644 x-pack/plugins/observability/public/hooks/use_link_props.ts delete mode 100644 x-pack/plugins/observability/public/hooks/use_messages_storage.tsx delete mode 100644 x-pack/plugins/observability/public/hooks/use_prefix_path_with_basepath.tsx delete mode 100644 x-pack/plugins/observability/public/hooks/use_query_params.ts delete mode 100644 x-pack/plugins/observability/public/hooks/use_quick_time_ranges.tsx delete mode 100644 x-pack/plugins/observability/public/hooks/use_route_params.tsx delete mode 100644 x-pack/plugins/observability/public/hooks/use_theme.tsx delete mode 100644 x-pack/plugins/observability/public/hooks/use_time_zone.ts delete mode 100644 x-pack/plugins/observability/public/hooks/use_values_list.ts rename x-pack/plugins/observability/public/{components/app/chart_container/index.test.tsx => pages/overview/components/chart_container/chart_container.test.tsx} (95%) rename x-pack/plugins/observability/public/{components/app/chart_container/index.tsx => pages/overview/components/chart_container/chart_container.tsx} (100%) rename x-pack/plugins/observability/public/{components/shared => pages/overview/components}/date_picker/date_picker.test.tsx (96%) rename x-pack/plugins/observability/public/{components/shared/date_picker/index.tsx => pages/overview/components/date_picker/date_picker.tsx} (82%) rename x-pack/plugins/observability/public/pages/overview/components/{ => header_actions}/header_actions.tsx (93%) rename x-pack/plugins/observability/public/pages/overview/components/{ => header_menu}/header_menu.tsx (84%) rename x-pack/plugins/observability/public/{components/shared => pages/overview/components/header_menu}/header_menu_portal.test.tsx (100%) rename x-pack/plugins/observability/public/{components/shared => pages/overview/components/header_menu}/header_menu_portal.tsx (77%) rename x-pack/plugins/observability/public/{services => pages/overview/components/news_feed/helpers}/get_news_feed.test.ts (100%) rename x-pack/plugins/observability/public/{services => pages/overview/components/news_feed/helpers}/get_news_feed.ts (100%) rename x-pack/plugins/observability/public/pages/overview/components/{ => news_feed}/news_feed.scss (100%) rename x-pack/plugins/observability/public/pages/overview/components/{ => news_feed}/news_feed.test.tsx (95%) rename x-pack/plugins/observability/public/pages/overview/components/{ => news_feed}/news_feed.tsx (97%) rename x-pack/plugins/observability/public/{components/app => pages/overview/components}/observability_status/content.ts (97%) rename x-pack/plugins/observability/public/{components/app => pages/overview/components}/observability_status/index.tsx (86%) rename x-pack/plugins/observability/public/{components/app => pages/overview/components}/observability_status/observability_status.stories.tsx (100%) rename x-pack/plugins/observability/public/{components/app => pages/overview/components}/observability_status/observability_status_box.test.tsx (100%) rename x-pack/plugins/observability/public/{components/app => pages/overview/components}/observability_status/observability_status_box.tsx (98%) rename x-pack/plugins/observability/public/{components/app => pages/overview/components}/observability_status/observability_status_boxes.test.tsx (100%) rename x-pack/plugins/observability/public/{components/app => pages/overview/components}/observability_status/observability_status_boxes.tsx (100%) rename x-pack/plugins/observability/public/{components/app => pages/overview/components}/observability_status/observability_status_progress.test.tsx (92%) rename x-pack/plugins/observability/public/{components/app => pages/overview/components}/observability_status/observability_status_progress.tsx (97%) rename x-pack/plugins/observability/public/{components/app/section/apm/index.test.tsx => pages/overview/components/sections/apm/apm_section.test.tsx} (88%) rename x-pack/plugins/observability/public/{components/app/section/apm/index.tsx => pages/overview/components/sections/apm/apm_section.tsx} (89%) rename x-pack/plugins/observability/public/{components/app/section => pages/overview/components/sections}/apm/mock_data/apm.mock.ts (98%) rename x-pack/plugins/observability/public/pages/overview/components/{ => sections/empty}/empty_section.test.tsx (85%) rename x-pack/plugins/observability/public/pages/overview/components/{ => sections/empty}/empty_section.tsx (78%) rename x-pack/plugins/observability/public/pages/overview/components/{ => sections/empty}/empty_sections.tsx (93%) rename x-pack/plugins/observability/public/{components/app/section/error_panel/index.tsx => pages/overview/components/sections/error_panel/error_panel.tsx} (100%) rename x-pack/plugins/observability/public/{components/app/section/logs/index.tsx => pages/overview/components/sections/logs/logs_section.tsx} (87%) rename x-pack/plugins/observability/public/{components/app/section => pages/overview/components/sections}/metrics/host_link.tsx (92%) rename x-pack/plugins/observability/public/{components/app/section => pages/overview/components/sections}/metrics/lib/format_duration.test.ts (100%) rename x-pack/plugins/observability/public/{components/app/section => pages/overview/components/sections}/metrics/lib/format_duration.ts (100%) rename x-pack/plugins/observability/public/{components/app/section => pages/overview/components/sections}/metrics/logos/aix.svg (100%) rename x-pack/plugins/observability/public/{components/app/section => pages/overview/components/sections}/metrics/logos/android.svg (100%) rename x-pack/plugins/observability/public/{components/app/section => pages/overview/components/sections}/metrics/logos/darwin.svg (100%) rename x-pack/plugins/observability/public/{components/app/section => pages/overview/components/sections}/metrics/logos/dragonfly.svg (100%) rename x-pack/plugins/observability/public/{components/app/section => pages/overview/components/sections}/metrics/logos/freebsd.svg (100%) rename x-pack/plugins/observability/public/{components/app/section => pages/overview/components/sections}/metrics/logos/illumos.svg (100%) rename x-pack/plugins/observability/public/{components/app/section => pages/overview/components/sections}/metrics/logos/linux.svg (100%) rename x-pack/plugins/observability/public/{components/app/section => pages/overview/components/sections}/metrics/logos/netbsd.svg (100%) rename x-pack/plugins/observability/public/{components/app/section => pages/overview/components/sections}/metrics/logos/solaris.svg (100%) rename x-pack/plugins/observability/public/{components/app/section => pages/overview/components/sections}/metrics/metric_with_sparkline.tsx (97%) rename x-pack/plugins/observability/public/{components/app/section/metrics/index.tsx => pages/overview/components/sections/metrics/metrics_section.tsx} (93%) rename x-pack/plugins/observability/public/{components/app/section/index.test.tsx => pages/overview/components/sections/section_container.test.tsx} (94%) rename x-pack/plugins/observability/public/{components/app/section/index.tsx => pages/overview/components/sections/section_container.tsx} (91%) rename x-pack/plugins/observability/public/{components/app/section/uptime/index.tsx => pages/overview/components/sections/uptime/uptime_section.tsx} (88%) rename x-pack/plugins/observability/public/{components/app/section => pages/overview/components/sections}/ux/mock_data/ux.mock.ts (89%) rename x-pack/plugins/observability/public/{components/app/section/ux/index.test.tsx => pages/overview/components/sections/ux/ux_section.test.tsx} (89%) rename x-pack/plugins/observability/public/{components/app/section/ux/index.tsx => pages/overview/components/sections/ux/ux_section.tsx} (83%) rename x-pack/plugins/observability/public/{components/app/styled_stat/index.tsx => pages/overview/components/styled_stat/styled_stat.tsx} (100%) rename x-pack/plugins/observability/public/{observability_public_plugins_start.mock.tsx => plugin.mock.tsx} (86%) delete mode 100644 x-pack/plugins/observability/public/services/call_observability_api/index.ts delete mode 100644 x-pack/plugins/observability/public/services/call_observability_api/types.ts delete mode 100644 x-pack/plugins/observability/public/services/navigation_registry.test.ts delete mode 100644 x-pack/plugins/observability/public/services/navigation_registry.ts delete mode 100644 x-pack/plugins/observability/public/typings/section/index.ts delete mode 100644 x-pack/plugins/observability/public/update_global_navigation.test.tsx delete mode 100644 x-pack/plugins/observability/public/update_global_navigation.tsx delete mode 100644 x-pack/plugins/observability/public/utils/navigation_warning_prompt/context.tsx delete mode 100644 x-pack/plugins/observability/public/utils/navigation_warning_prompt/index.ts delete mode 100644 x-pack/plugins/observability/public/utils/navigation_warning_prompt/prompt.tsx diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 5917e1265f66d..128009fbb3d93 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -487,7 +487,7 @@ x-pack/packages/observability/alert_details @elastic/actionable-observability x-pack/test/cases_api_integration/common/plugins/observability @elastic/response-ops x-pack/plugins/observability_onboarding @elastic/apm-ui x-pack/plugins/observability @elastic/actionable-observability -x-pack/plugins/observability_shared @elastic/actionable-observability +x-pack/plugins/observability_shared @elastic/observability-ui x-pack/test/security_api_integration/plugins/oidc_provider @elastic/kibana-security test/common/plugins/otel_metrics @elastic/infra-monitoring-ui packages/kbn-optimizer @elastic/kibana-operations @@ -792,16 +792,7 @@ packages/kbn-yarn-lock-validator @elastic/kibana-operations #CC# /x-pack/plugins/reporting/ @elastic/appex-sharedux #CC# /x-pack/plugins/serverless_security/ @elastic/appex-sharedux -### Observability Plugins - -# Observability Shared App -x-pack/plugins/observability_shared @elastic/observability-ui - -# Observability App -x-pack/plugins/observability @elastic/actionable-observability - -# Observability App > Overview page -x-pack/plugins/observability/public/pages/overview @elastic/observability-ui +### Observability packages # Observability App > Alert Details x-pack/packages/observability/alert_details @elastic/actionable-observability @@ -846,13 +837,6 @@ x-pack/test/observability_functional @elastic/actionable-observability /x-pack/test/functional/services/uptime @elastic/uptime /x-pack/test/api_integration/apis/uptime @elastic/uptime /x-pack/test/api_integration/apis/synthetics @elastic/uptime -/x-pack/plugins/observability/public/components/shared/exploratory_view @elastic/uptime -/x-pack/plugins/observability/public/components/shared/field_value_suggestions @elastic/uptime -/x-pack/plugins/observability/public/components/shared/core_web_vitals @elastic/uptime -/x-pack/plugins/observability/public/components/shared/load_when_in_view @elastic/uptime -/x-pack/plugins/observability/public/components/shared/filter_value_label @elastic/uptime -/x-pack/plugins/observability/public/utils/observability_data_views @elastic/uptime -/x-pack/plugins/observability/e2e @elastic/uptime # Client Side Monitoring / Uptime (lives in APM directories but owned by Uptime) /x-pack/plugins/apm/public/application/uxApp.tsx @elastic/uptime @@ -860,7 +844,7 @@ x-pack/test/observability_functional @elastic/actionable-observability /x-pack/test/apm_api_integration/tests/csm/ @elastic/uptime # Observability onboarding tour -/x-pack/plugins/observability/public/components/shared/tour @elastic/platform-onboarding +/x-pack/plugins/observability_shared/public/components/tour @elastic/platform-onboarding /x-pack/test/functional/apps/infra/tour.ts @elastic/platform-onboarding ### END Observability Plugins @@ -1230,7 +1214,6 @@ x-pack/test/threat_intelligence_cypress @elastic/protections-experience /x-pack/plugins/apm/**/*.scss @elastic/observability-design /x-pack/plugins/infra/**/*.scss @elastic/observability-design /x-pack/plugins/fleet/**/*.scss @elastic/observability-design -/x-pack/plugins/observability/**/*.scss @elastic/observability-design /x-pack/plugins/monitoring/**/*.scss @elastic/observability-design # Ent. Search design diff --git a/x-pack/plugins/infra/public/pages/link_to/redirect_to_node_logs.tsx b/x-pack/plugins/infra/public/pages/link_to/redirect_to_node_logs.tsx index 483e8ccf01e78..ab5723427a1ec 100644 --- a/x-pack/plugins/infra/public/pages/link_to/redirect_to_node_logs.tsx +++ b/x-pack/plugins/infra/public/pages/link_to/redirect_to_node_logs.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import { LinkDescriptor } from '@kbn/observability-plugin/public'; +import { LinkDescriptor } from '@kbn/observability-shared-plugin/public'; import { useEffect } from 'react'; import { RouteComponentProps } from 'react-router-dom'; import { InventoryItemType } from '../../../common/inventory_models/types'; diff --git a/x-pack/plugins/observability/public/application/index.tsx b/x-pack/plugins/observability/public/application/index.tsx index d11173e60aae7..b04dfca154d6b 100644 --- a/x-pack/plugins/observability/public/application/index.tsx +++ b/x-pack/plugins/observability/public/application/index.tsx @@ -22,8 +22,8 @@ import { } from '@kbn/kibana-react-plugin/public'; import { Storage } from '@kbn/kibana-utils-plugin/public'; import { UsageCollectionSetup } from '@kbn/usage-collection-plugin/public'; -import { HasDataContextProvider } from '../context/has_data_context'; -import { PluginContext } from '../context/plugin_context'; +import { HasDataContextProvider } from '../context/has_data_context/has_data_context'; +import { PluginContext } from '../context/plugin_context/plugin_context'; import { ConfigSchema, ObservabilityPublicPluginsStart } from '../plugin'; import { routes } from '../routes'; import { ObservabilityRuleTypeRegistry } from '../rules/create_observability_rule_type_registry'; diff --git a/x-pack/plugins/observability/public/components/shared/alert_search_bar/alert_search_bar.test.tsx b/x-pack/plugins/observability/public/components/alert_search_bar/alert_search_bar.test.tsx similarity index 97% rename from x-pack/plugins/observability/public/components/shared/alert_search_bar/alert_search_bar.test.tsx rename to x-pack/plugins/observability/public/components/alert_search_bar/alert_search_bar.test.tsx index 874e70885ca75..b1a8d9137d9bf 100644 --- a/x-pack/plugins/observability/public/components/shared/alert_search_bar/alert_search_bar.test.tsx +++ b/x-pack/plugins/observability/public/components/alert_search_bar/alert_search_bar.test.tsx @@ -10,8 +10,8 @@ import { waitFor } from '@testing-library/react'; import { timefilterServiceMock } from '@kbn/data-plugin/public/query/timefilter/timefilter_service.mock'; import { ObservabilityAlertSearchBarProps } from './types'; import { ObservabilityAlertSearchBar } from './alert_search_bar'; -import { observabilityAlertFeatureIds } from '../../../config/alert_feature_ids'; -import { render } from '../../../utils/test_helper'; +import { observabilityAlertFeatureIds } from '../../config/alert_feature_ids'; +import { render } from '../../utils/test_helper'; const getAlertsSearchBarMock = jest.fn(); const ALERT_SEARCH_BAR_DATA_TEST_SUBJ = 'alerts-search-bar'; diff --git a/x-pack/plugins/observability/public/components/shared/alert_search_bar/alert_search_bar.tsx b/x-pack/plugins/observability/public/components/alert_search_bar/alert_search_bar.tsx similarity index 94% rename from x-pack/plugins/observability/public/components/shared/alert_search_bar/alert_search_bar.tsx rename to x-pack/plugins/observability/public/components/alert_search_bar/alert_search_bar.tsx index 1442dbb9dbf91..3922b8eeff5cf 100644 --- a/x-pack/plugins/observability/public/components/shared/alert_search_bar/alert_search_bar.tsx +++ b/x-pack/plugins/observability/public/components/alert_search_bar/alert_search_bar.tsx @@ -11,11 +11,11 @@ import React, { useCallback, useEffect } from 'react'; import { i18n } from '@kbn/i18n'; import { Query } from '@kbn/es-query'; import { AlertsStatusFilter } from './components'; -import { observabilityAlertFeatureIds } from '../../../config/alert_feature_ids'; +import { observabilityAlertFeatureIds } from '../../config/alert_feature_ids'; import { ALERT_STATUS_QUERY, DEFAULT_QUERIES, DEFAULT_QUERY_STRING } from './constants'; import { ObservabilityAlertSearchBarProps } from './types'; -import { buildEsQuery } from '../../../utils/build_es_query'; -import { AlertStatus } from '../../../../common/typings'; +import { buildEsQuery } from '../../utils/build_es_query'; +import { AlertStatus } from '../../../common/typings'; const getAlertStatusQuery = (status: string): Query[] => { return ALERT_STATUS_QUERY[status] diff --git a/x-pack/plugins/observability/public/components/shared/alert_search_bar/alert_search_bar_with_url_sync.tsx b/x-pack/plugins/observability/public/components/alert_search_bar/alert_search_bar_with_url_sync.tsx similarity index 88% rename from x-pack/plugins/observability/public/components/shared/alert_search_bar/alert_search_bar_with_url_sync.tsx rename to x-pack/plugins/observability/public/components/alert_search_bar/alert_search_bar_with_url_sync.tsx index 24f8dcd99c83a..93703b2ad2e4f 100644 --- a/x-pack/plugins/observability/public/components/shared/alert_search_bar/alert_search_bar_with_url_sync.tsx +++ b/x-pack/plugins/observability/public/components/alert_search_bar/alert_search_bar_with_url_sync.tsx @@ -13,9 +13,9 @@ import { } from './containers'; import { ObservabilityAlertSearchBar } from './alert_search_bar'; import { AlertSearchBarWithUrlSyncProps } from './types'; -import { useKibana } from '../../../utils/kibana_react'; -import { ObservabilityAppServices } from '../../../application/types'; -import { useToasts } from '../../../hooks/use_toast'; +import { useKibana } from '../../utils/kibana_react'; +import { ObservabilityAppServices } from '../../application/types'; +import { useToasts } from '../../hooks/use_toast'; function AlertSearchbarWithUrlSync(props: AlertSearchBarWithUrlSyncProps) { const { urlStorageKey, ...searchBarProps } = props; diff --git a/x-pack/plugins/observability/public/components/shared/alert_search_bar/components/alerts_status_filter.tsx b/x-pack/plugins/observability/public/components/alert_search_bar/components/alerts_status_filter.tsx similarity index 95% rename from x-pack/plugins/observability/public/components/shared/alert_search_bar/components/alerts_status_filter.tsx rename to x-pack/plugins/observability/public/components/alert_search_bar/components/alerts_status_filter.tsx index 5dbbfd06d744a..73cdfeceade3e 100644 --- a/x-pack/plugins/observability/public/components/shared/alert_search_bar/components/alerts_status_filter.tsx +++ b/x-pack/plugins/observability/public/components/alert_search_bar/components/alerts_status_filter.tsx @@ -10,7 +10,7 @@ import { i18n } from '@kbn/i18n'; import React from 'react'; import { ALL_ALERTS, ACTIVE_ALERTS, RECOVERED_ALERTS } from '../constants'; import { AlertStatusFilterProps } from '../types'; -import { AlertStatus } from '../../../../../common/typings'; +import { AlertStatus } from '../../../../common/typings'; const options: EuiButtonGroupOptionProps[] = [ { diff --git a/x-pack/plugins/observability/public/components/shared/alert_search_bar/components/index.ts b/x-pack/plugins/observability/public/components/alert_search_bar/components/index.ts similarity index 100% rename from x-pack/plugins/observability/public/components/shared/alert_search_bar/components/index.ts rename to x-pack/plugins/observability/public/components/alert_search_bar/components/index.ts diff --git a/x-pack/plugins/observability/public/components/shared/alert_search_bar/constants.ts b/x-pack/plugins/observability/public/components/alert_search_bar/constants.ts similarity index 91% rename from x-pack/plugins/observability/public/components/shared/alert_search_bar/constants.ts rename to x-pack/plugins/observability/public/components/alert_search_bar/constants.ts index 070557f56538e..c067baafe28f1 100644 --- a/x-pack/plugins/observability/public/components/shared/alert_search_bar/constants.ts +++ b/x-pack/plugins/observability/public/components/alert_search_bar/constants.ts @@ -8,8 +8,8 @@ import { Query } from '@kbn/es-query'; import { i18n } from '@kbn/i18n'; import { ALERT_STATUS_ACTIVE, ALERT_STATUS_RECOVERED, ALERT_STATUS } from '@kbn/rule-data-utils'; -import { AlertStatusFilter } from '../../../../common/typings'; -import { ALERT_STATUS_ALL } from '../../../../common/constants'; +import { AlertStatusFilter } from '../../../common/typings'; +import { ALERT_STATUS_ALL } from '../../../common/constants'; export const DEFAULT_QUERIES: Query[] = []; export const DEFAULT_QUERY_STRING = ''; diff --git a/x-pack/plugins/observability/public/components/shared/alert_search_bar/containers/index.tsx b/x-pack/plugins/observability/public/components/alert_search_bar/containers/index.tsx similarity index 100% rename from x-pack/plugins/observability/public/components/shared/alert_search_bar/containers/index.tsx rename to x-pack/plugins/observability/public/components/alert_search_bar/containers/index.tsx diff --git a/x-pack/plugins/observability/public/components/shared/alert_search_bar/containers/state_container.tsx b/x-pack/plugins/observability/public/components/alert_search_bar/containers/state_container.tsx similarity index 96% rename from x-pack/plugins/observability/public/components/shared/alert_search_bar/containers/state_container.tsx rename to x-pack/plugins/observability/public/components/alert_search_bar/containers/state_container.tsx index 8098b33db5b9d..e1fc666df20b5 100644 --- a/x-pack/plugins/observability/public/components/shared/alert_search_bar/containers/state_container.tsx +++ b/x-pack/plugins/observability/public/components/alert_search_bar/containers/state_container.tsx @@ -9,7 +9,7 @@ import { createStateContainer, createStateContainerReactHelpers, } from '@kbn/kibana-utils-plugin/public'; -import { AlertStatus } from '../../../../../common/typings'; +import { AlertStatus } from '../../../../common/typings'; import { ALL_ALERTS } from '../constants'; interface AlertSearchBarContainerState { diff --git a/x-pack/plugins/observability/public/components/shared/alert_search_bar/containers/use_alert_search_bar_state_container.tsx b/x-pack/plugins/observability/public/components/alert_search_bar/containers/use_alert_search_bar_state_container.tsx similarity index 95% rename from x-pack/plugins/observability/public/components/shared/alert_search_bar/containers/use_alert_search_bar_state_container.tsx rename to x-pack/plugins/observability/public/components/alert_search_bar/containers/use_alert_search_bar_state_container.tsx index 4a658d3c261b7..9128fa1c3f723 100644 --- a/x-pack/plugins/observability/public/components/shared/alert_search_bar/containers/use_alert_search_bar_state_container.tsx +++ b/x-pack/plugins/observability/public/components/alert_search_bar/containers/use_alert_search_bar_state_container.tsx @@ -18,9 +18,9 @@ import { IKbnUrlStateStorage, useContainerSelector, } from '@kbn/kibana-utils-plugin/public'; -import { datemathStringRT } from '../../../../utils/datemath'; -import { ALERT_STATUS_ALL } from '../../../../../common/constants'; -import { useTimefilterService } from '../../../../hooks/use_timefilter_service'; +import { datemathStringRT } from '../../../utils/datemath'; +import { ALERT_STATUS_ALL } from '../../../../common/constants'; +import { useTimefilterService } from '../../../hooks/use_timefilter_service'; import { useContainer, diff --git a/x-pack/plugins/observability/public/components/alert_search_bar/get_alert_search_bar_lazy.tsx b/x-pack/plugins/observability/public/components/alert_search_bar/get_alert_search_bar_lazy.tsx new file mode 100644 index 0000000000000..3cd1c1e88c353 --- /dev/null +++ b/x-pack/plugins/observability/public/components/alert_search_bar/get_alert_search_bar_lazy.tsx @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { lazy, Suspense } from 'react'; +import { EuiLoadingSpinner } from '@elastic/eui'; +import { ObservabilityAlertSearchBarProps } from './types'; + +const ObservabilityAlertSearchBarLazy = lazy(() => import('./alert_search_bar')); + +export function ObservabilityAlertSearchBar(props: ObservabilityAlertSearchBarProps) { + return ( + }> + + + ); +} diff --git a/x-pack/plugins/observability/public/components/shared/alert_search_bar/types.ts b/x-pack/plugins/observability/public/components/alert_search_bar/types.ts similarity index 97% rename from x-pack/plugins/observability/public/components/shared/alert_search_bar/types.ts rename to x-pack/plugins/observability/public/components/alert_search_bar/types.ts index 51e3e5fa48bf9..426aea00886cf 100644 --- a/x-pack/plugins/observability/public/components/shared/alert_search_bar/types.ts +++ b/x-pack/plugins/observability/public/components/alert_search_bar/types.ts @@ -10,7 +10,7 @@ import { ToastsStart } from '@kbn/core-notifications-browser'; import { TimefilterContract } from '@kbn/data-plugin/public'; import { AlertsSearchBarProps } from '@kbn/triggers-actions-ui-plugin/public/application/sections/alerts_search_bar'; import { BoolQuery, Query } from '@kbn/es-query'; -import { AlertStatus } from '../../../../common/typings'; +import { AlertStatus } from '../../../common/typings'; export interface AlertStatusFilterProps { status: AlertStatus; diff --git a/x-pack/plugins/observability/public/components/shared/alert_status_indicator.tsx b/x-pack/plugins/observability/public/components/alert_status_indicator.tsx similarity index 100% rename from x-pack/plugins/observability/public/components/shared/alert_status_indicator.tsx rename to x-pack/plugins/observability/public/components/alert_status_indicator.tsx diff --git a/x-pack/plugins/observability/public/components/alerts_flyout.mock.ts b/x-pack/plugins/observability/public/components/alerts_flyout/alerts_flyout.mock.ts similarity index 100% rename from x-pack/plugins/observability/public/components/alerts_flyout.mock.ts rename to x-pack/plugins/observability/public/components/alerts_flyout/alerts_flyout.mock.ts diff --git a/x-pack/plugins/observability/public/components/alerts_flyout.stories.tsx b/x-pack/plugins/observability/public/components/alerts_flyout/alerts_flyout.stories.tsx similarity index 90% rename from x-pack/plugins/observability/public/components/alerts_flyout.stories.tsx rename to x-pack/plugins/observability/public/components/alerts_flyout/alerts_flyout.stories.tsx index 26ed2d240af30..be78ce851053c 100644 --- a/x-pack/plugins/observability/public/components/alerts_flyout.stories.tsx +++ b/x-pack/plugins/observability/public/components/alerts_flyout/alerts_flyout.stories.tsx @@ -8,8 +8,8 @@ import React, { ComponentType } from 'react'; import { ALERT_UUID } from '@kbn/rule-data-utils'; import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; -import { PluginContext, PluginContextValue } from '../context/plugin_context'; -import { createObservabilityRuleTypeRegistryMock } from '../rules/observability_rule_type_registry_mock'; +import { PluginContext, PluginContextValue } from '../../context/plugin_context/plugin_context'; +import { createObservabilityRuleTypeRegistryMock } from '../../rules/observability_rule_type_registry_mock'; import { apmAlertResponseExample } from './alerts_flyout.mock'; import { AlertsFlyout } from './alerts_flyout'; diff --git a/x-pack/plugins/observability/public/components/alerts_flyout.test.tsx b/x-pack/plugins/observability/public/components/alerts_flyout/alerts_flyout.test.tsx similarity index 95% rename from x-pack/plugins/observability/public/components/alerts_flyout.test.tsx rename to x-pack/plugins/observability/public/components/alerts_flyout/alerts_flyout.test.tsx index 84d3046d40b3c..87d476138970c 100644 --- a/x-pack/plugins/observability/public/components/alerts_flyout.test.tsx +++ b/x-pack/plugins/observability/public/components/alerts_flyout/alerts_flyout.test.tsx @@ -7,10 +7,10 @@ import React from 'react'; import * as useUiSettingHook from '@kbn/kibana-react-plugin/public/ui_settings/use_ui_setting'; -import { createObservabilityRuleTypeRegistryMock } from '../rules/observability_rule_type_registry_mock'; -import { render } from '../utils/test_helper'; +import { createObservabilityRuleTypeRegistryMock } from '../../rules/observability_rule_type_registry_mock'; +import { render } from '../../utils/test_helper'; import { AlertsFlyout } from './alerts_flyout'; -import type { TopAlert } from '../typings/alerts'; +import type { TopAlert } from '../../typings/alerts'; describe('AlertsFlyout', () => { jest diff --git a/x-pack/plugins/observability/public/components/alerts_flyout.tsx b/x-pack/plugins/observability/public/components/alerts_flyout/alerts_flyout.tsx similarity index 88% rename from x-pack/plugins/observability/public/components/alerts_flyout.tsx rename to x-pack/plugins/observability/public/components/alerts_flyout/alerts_flyout.tsx index c2e1c9626eb51..d74caac8e496a 100644 --- a/x-pack/plugins/observability/public/components/alerts_flyout.tsx +++ b/x-pack/plugins/observability/public/components/alerts_flyout/alerts_flyout.tsx @@ -12,9 +12,9 @@ import { ALERT_UUID } from '@kbn/rule-data-utils'; import { AlertsFlyoutHeader } from './alerts_flyout_header'; import { AlertsFlyoutBody } from './alerts_flyout_body'; import { AlertsFlyoutFooter } from './alerts_flyout_footer'; -import { parseAlert } from '../pages/alerts/helpers/parse_alert'; -import type { ObservabilityRuleTypeRegistry } from '../rules/create_observability_rule_type_registry'; -import type { TopAlert } from '../typings/alerts'; +import { parseAlert } from '../../pages/alerts/helpers/parse_alert'; +import type { ObservabilityRuleTypeRegistry } from '../../rules/create_observability_rule_type_registry'; +import type { TopAlert } from '../../typings/alerts'; type AlertsFlyoutProps = { alert?: TopAlert; diff --git a/x-pack/plugins/observability/public/components/alerts_flyout_body.test.tsx b/x-pack/plugins/observability/public/components/alerts_flyout/alerts_flyout_body.test.tsx similarity index 78% rename from x-pack/plugins/observability/public/components/alerts_flyout_body.test.tsx rename to x-pack/plugins/observability/public/components/alerts_flyout/alerts_flyout_body.test.tsx index d654b786fc49e..302df59df971e 100644 --- a/x-pack/plugins/observability/public/components/alerts_flyout_body.test.tsx +++ b/x-pack/plugins/observability/public/components/alerts_flyout/alerts_flyout_body.test.tsx @@ -5,13 +5,13 @@ * 2.0. */ import React from 'react'; -import { render } from '../utils/test_helper'; +import { render } from '../../utils/test_helper'; import * as useUiSettingHook from '@kbn/kibana-react-plugin/public/ui_settings/use_ui_setting'; -import { createObservabilityRuleTypeRegistryMock } from '../rules/observability_rule_type_registry_mock'; +import { createObservabilityRuleTypeRegistryMock } from '../../rules/observability_rule_type_registry_mock'; import { AlertsFlyoutBody } from './alerts_flyout_body'; -import { inventoryThresholdAlert } from '../rules/fixtures/example_alerts'; -import { parseAlert } from '../pages/alerts/helpers/parse_alert'; -import { RULE_DETAILS_PAGE_ID } from '../pages/rule_details/constants'; +import { inventoryThresholdAlert } from '../../rules/fixtures/example_alerts'; +import { parseAlert } from '../../pages/alerts/helpers/parse_alert'; +import { RULE_DETAILS_PAGE_ID } from '../../pages/rule_details/constants'; describe('AlertsFlyoutBody', () => { jest diff --git a/x-pack/plugins/observability/public/components/alerts_flyout_body.tsx b/x-pack/plugins/observability/public/components/alerts_flyout/alerts_flyout_body.tsx similarity index 90% rename from x-pack/plugins/observability/public/components/alerts_flyout_body.tsx rename to x-pack/plugins/observability/public/components/alerts_flyout/alerts_flyout_body.tsx index 7686144affbb8..281fed8451ce9 100644 --- a/x-pack/plugins/observability/public/components/alerts_flyout_body.tsx +++ b/x-pack/plugins/observability/public/components/alerts_flyout/alerts_flyout_body.tsx @@ -29,13 +29,13 @@ import { import { AlertLifecycleStatusBadge } from '@kbn/alerts-ui-shared'; import moment from 'moment-timezone'; import { useUiSetting } from '@kbn/kibana-react-plugin/public'; -import { useKibana } from '../utils/kibana_react'; -import { asDuration, toMicroseconds } from '../../common/utils/formatters'; -import { paths } from '../config/paths'; -import { translations } from '../config/translations'; -import { formatAlertEvaluationValue } from '../utils/format_alert_evaluation_value'; -import { RULE_DETAILS_PAGE_ID } from '../pages/rule_details/constants'; -import type { TopAlert } from '../typings/alerts'; +import { useKibana } from '../../utils/kibana_react'; +import { asDuration, toMicroseconds } from '../../../common/utils/formatters'; +import { paths } from '../../config/paths'; +import { translations } from '../../config/translations'; +import { formatAlertEvaluationValue } from '../../utils/format_alert_evaluation_value'; +import { RULE_DETAILS_PAGE_ID } from '../../pages/rule_details/constants'; +import type { TopAlert } from '../../typings/alerts'; interface FlyoutProps { alert: TopAlert; diff --git a/x-pack/plugins/observability/public/components/alerts_flyout_footer.tsx b/x-pack/plugins/observability/public/components/alerts_flyout/alerts_flyout_footer.tsx similarity index 82% rename from x-pack/plugins/observability/public/components/alerts_flyout_footer.tsx rename to x-pack/plugins/observability/public/components/alerts_flyout/alerts_flyout_footer.tsx index 5b82d5b6339f6..c664b6391e299 100644 --- a/x-pack/plugins/observability/public/components/alerts_flyout_footer.tsx +++ b/x-pack/plugins/observability/public/components/alerts_flyout/alerts_flyout_footer.tsx @@ -6,12 +6,12 @@ */ import React from 'react'; import { EuiFlyoutFooter, EuiFlexGroup, EuiFlexItem, EuiButton } from '@elastic/eui'; -import { useKibana } from '../utils/kibana_react'; -import { usePluginContext } from '../hooks/use_plugin_context'; -import { isAlertDetailsEnabledPerApp } from '../utils/is_alert_details_enabled'; -import { translations } from '../config/translations'; -import { paths } from '../config/paths'; -import type { TopAlert } from '../typings/alerts'; +import { useKibana } from '../../utils/kibana_react'; +import { usePluginContext } from '../../hooks/use_plugin_context'; +import { isAlertDetailsEnabledPerApp } from '../../utils/is_alert_details_enabled'; +import { translations } from '../../config/translations'; +import { paths } from '../../config/paths'; +import type { TopAlert } from '../../typings/alerts'; interface FlyoutProps { alert: TopAlert; diff --git a/x-pack/plugins/observability/public/components/alerts_flyout_header.tsx b/x-pack/plugins/observability/public/components/alerts_flyout/alerts_flyout_header.tsx similarity index 92% rename from x-pack/plugins/observability/public/components/alerts_flyout_header.tsx rename to x-pack/plugins/observability/public/components/alerts_flyout/alerts_flyout_header.tsx index fc4f9d4d0d316..b30436efffca6 100644 --- a/x-pack/plugins/observability/public/components/alerts_flyout_header.tsx +++ b/x-pack/plugins/observability/public/components/alerts_flyout/alerts_flyout_header.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { ALERT_RULE_NAME } from '@kbn/rule-data-utils'; import { EuiSpacer, EuiTitle } from '@elastic/eui'; -import type { TopAlert } from '../typings/alerts'; +import type { TopAlert } from '../../typings/alerts'; interface FlyoutProps { alert: TopAlert; diff --git a/x-pack/plugins/observability/public/components/use_get_alert_flyout_components.tsx b/x-pack/plugins/observability/public/components/alerts_flyout/use_get_alert_flyout_components.tsx similarity index 90% rename from x-pack/plugins/observability/public/components/use_get_alert_flyout_components.tsx rename to x-pack/plugins/observability/public/components/alerts_flyout/use_get_alert_flyout_components.tsx index 06d616b067f26..75fe3cb1133a5 100644 --- a/x-pack/plugins/observability/public/components/use_get_alert_flyout_components.tsx +++ b/x-pack/plugins/observability/public/components/alerts_flyout/use_get_alert_flyout_components.tsx @@ -8,11 +8,11 @@ import React, { useCallback, useMemo } from 'react'; import { AlertsTableFlyoutBaseProps } from '@kbn/triggers-actions-ui-plugin/public'; -import type { ObservabilityRuleTypeRegistry } from '../rules/create_observability_rule_type_registry'; +import type { ObservabilityRuleTypeRegistry } from '../../rules/create_observability_rule_type_registry'; import { AlertsFlyoutHeader } from './alerts_flyout_header'; import { AlertsFlyoutBody } from './alerts_flyout_body'; import { AlertsFlyoutFooter } from './alerts_flyout_footer'; -import { parseAlert } from '../pages/alerts/helpers/parse_alert'; +import { parseAlert } from '../../pages/alerts/helpers/parse_alert'; export { AlertsFlyout } from './alerts_flyout'; diff --git a/x-pack/plugins/observability/public/components/alerts_table/get_alerts_table_configuration.tsx b/x-pack/plugins/observability/public/components/alerts_table/get_alerts_table_configuration.tsx index 2127794b6070e..12df94e16e263 100644 --- a/x-pack/plugins/observability/public/components/alerts_table/get_alerts_table_configuration.tsx +++ b/x-pack/plugins/observability/public/components/alerts_table/get_alerts_table_configuration.tsx @@ -20,7 +20,7 @@ import { AlertActions, Props as AlertActionsProps, } from '../../pages/alerts/components/alert_actions'; -import { useGetAlertFlyoutComponents } from '../use_get_alert_flyout_components'; +import { useGetAlertFlyoutComponents } from '../alerts_flyout/use_get_alert_flyout_components'; import type { ObservabilityRuleTypeRegistry } from '../../rules/create_observability_rule_type_registry'; import type { ConfigSchema } from '../../plugin'; import type { TopAlert } from '../../typings/alerts'; diff --git a/x-pack/plugins/observability/public/components/alerts_table/render_cell_value.tsx b/x-pack/plugins/observability/public/components/alerts_table/render_cell_value.tsx index 9e72d7d9f8c78..29433be671d83 100644 --- a/x-pack/plugins/observability/public/components/alerts_table/render_cell_value.tsx +++ b/x-pack/plugins/observability/public/components/alerts_table/render_cell_value.tsx @@ -20,8 +20,8 @@ import type { CellValueElementProps, TimelineNonEcsData } from '@kbn/timelines-p import { asDuration } from '../../../common/utils/formatters'; import { AlertSeverityBadge } from '../alert_severity_badge'; -import { AlertStatusIndicator } from '../shared/alert_status_indicator'; -import { TimestampTooltip } from '../shared/timestamp_tooltip'; +import { AlertStatusIndicator } from '../alert_status_indicator'; +import { TimestampTooltip } from './timestamp_tooltip'; import { parseAlert } from '../../pages/alerts/helpers/parse_alert'; import type { ObservabilityRuleTypeRegistry } from '../../rules/create_observability_rule_type_registry'; import type { TopAlert } from '../../typings/alerts'; diff --git a/x-pack/plugins/observability/public/components/shared/timestamp_tooltip/index.test.tsx b/x-pack/plugins/observability/public/components/alerts_table/timestamp_tooltip.test.tsx similarity index 97% rename from x-pack/plugins/observability/public/components/shared/timestamp_tooltip/index.test.tsx rename to x-pack/plugins/observability/public/components/alerts_table/timestamp_tooltip.test.tsx index ce7fc4f53f799..abff44fa4609c 100644 --- a/x-pack/plugins/observability/public/components/shared/timestamp_tooltip/index.test.tsx +++ b/x-pack/plugins/observability/public/components/alerts_table/timestamp_tooltip.test.tsx @@ -8,7 +8,7 @@ import { shallow } from 'enzyme'; import React from 'react'; import moment from 'moment-timezone'; -import { TimestampTooltip } from '.'; +import { TimestampTooltip } from './timestamp_tooltip'; function mockNow(date: string | number | Date) { const fakeNow = new Date(date).getTime(); diff --git a/x-pack/plugins/observability/public/components/shared/timestamp_tooltip/index.tsx b/x-pack/plugins/observability/public/components/alerts_table/timestamp_tooltip.tsx similarity index 88% rename from x-pack/plugins/observability/public/components/shared/timestamp_tooltip/index.tsx rename to x-pack/plugins/observability/public/components/alerts_table/timestamp_tooltip.tsx index 7b82455ad5932..42a26e9e52b94 100644 --- a/x-pack/plugins/observability/public/components/shared/timestamp_tooltip/index.tsx +++ b/x-pack/plugins/observability/public/components/alerts_table/timestamp_tooltip.tsx @@ -7,7 +7,7 @@ import React from 'react'; import { EuiToolTip } from '@elastic/eui'; -import { asAbsoluteDateTime, TimeUnit } from '../../../../common/utils/formatters/datetime'; +import { asAbsoluteDateTime, TimeUnit } from '../../../common/utils/formatters/datetime'; interface Props { /** diff --git a/x-pack/plugins/observability/public/components/app/section/helper.test.ts b/x-pack/plugins/observability/public/components/app/section/helper.test.ts deleted file mode 100644 index 43c30acbacdc1..0000000000000 --- a/x-pack/plugins/observability/public/components/app/section/helper.test.ts +++ /dev/null @@ -1,39 +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 { onBrushEnd } from './helper'; -import { History } from 'history'; - -describe('Chart helper', () => { - describe('onBrushEnd', () => { - const history = { - push: jest.fn(), - location: { - search: '', - }, - } as unknown as History; - it("doesn't push a new history when x is not defined", () => { - onBrushEnd({ x: undefined, history }); - expect(history.push).not.toBeCalled(); - }); - - it('pushes a new history with time range converted to ISO', () => { - onBrushEnd({ x: [1593409448167, 1593415727797], history }); - expect(history.push).toBeCalledWith({ - search: 'rangeFrom=2020-06-29T05:44:08.167Z&rangeTo=2020-06-29T07:28:47.797Z', - }); - }); - - it('pushes a new history keeping current search', () => { - history.location.search = '?foo=bar'; - onBrushEnd({ x: [1593409448167, 1593415727797], history }); - expect(history.push).toBeCalledWith({ - search: 'foo=bar&rangeFrom=2020-06-29T05:44:08.167Z&rangeTo=2020-06-29T07:28:47.797Z', - }); - }); - }); -}); diff --git a/x-pack/plugins/observability/public/components/app/section/helper.ts b/x-pack/plugins/observability/public/components/app/section/helper.ts deleted file mode 100644 index 077bd67a8590c..0000000000000 --- a/x-pack/plugins/observability/public/components/app/section/helper.ts +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { XYBrushEvent } from '@elastic/charts'; -import { History } from 'history'; -import { fromQuery, toQuery } from '../../../utils/url'; - -export const onBrushEnd = ({ x, history }: { x: XYBrushEvent['x']; history: History }) => { - if (x) { - const start = x[0]; - const end = x[1]; - - const currentSearch = toQuery(history.location.search); - const nextSearch = { - rangeFrom: new Date(start).toISOString(), - rangeTo: new Date(end).toISOString(), - }; - history.push({ - ...history.location, - search: fromQuery({ - ...currentSearch, - ...nextSearch, - }), - }); - } -}; diff --git a/x-pack/plugins/observability/public/components/app/burn_rate_rule_editor/burn_rate.tsx b/x-pack/plugins/observability/public/components/burn_rate_rule_editor/burn_rate.tsx similarity index 100% rename from x-pack/plugins/observability/public/components/app/burn_rate_rule_editor/burn_rate.tsx rename to x-pack/plugins/observability/public/components/burn_rate_rule_editor/burn_rate.tsx diff --git a/x-pack/plugins/observability/public/components/app/burn_rate_rule_editor/burn_rate_rule_editor.stories.tsx b/x-pack/plugins/observability/public/components/burn_rate_rule_editor/burn_rate_rule_editor.stories.tsx similarity index 85% rename from x-pack/plugins/observability/public/components/app/burn_rate_rule_editor/burn_rate_rule_editor.stories.tsx rename to x-pack/plugins/observability/public/components/burn_rate_rule_editor/burn_rate_rule_editor.stories.tsx index 0c53fae9af248..f18f48f5e2ad3 100644 --- a/x-pack/plugins/observability/public/components/app/burn_rate_rule_editor/burn_rate_rule_editor.stories.tsx +++ b/x-pack/plugins/observability/public/components/burn_rate_rule_editor/burn_rate_rule_editor.stories.tsx @@ -8,8 +8,8 @@ import React from 'react'; import { ComponentStory } from '@storybook/react'; -import { KibanaReactStorybookDecorator } from '../../../utils/kibana_react.storybook_decorator'; -import { BurnRateRuleParams } from '../../../typings'; +import { KibanaReactStorybookDecorator } from '../../utils/kibana_react.storybook_decorator'; +import { BurnRateRuleParams } from '../../typings'; import { BurnRateRuleEditor as Component } from './burn_rate_rule_editor'; export default { diff --git a/x-pack/plugins/observability/public/components/app/burn_rate_rule_editor/burn_rate_rule_editor.tsx b/x-pack/plugins/observability/public/components/burn_rate_rule_editor/burn_rate_rule_editor.tsx similarity index 96% rename from x-pack/plugins/observability/public/components/app/burn_rate_rule_editor/burn_rate_rule_editor.tsx rename to x-pack/plugins/observability/public/components/burn_rate_rule_editor/burn_rate_rule_editor.tsx index c5b9349d1948a..b0be19121a74a 100644 --- a/x-pack/plugins/observability/public/components/app/burn_rate_rule_editor/burn_rate_rule_editor.tsx +++ b/x-pack/plugins/observability/public/components/burn_rate_rule_editor/burn_rate_rule_editor.tsx @@ -12,9 +12,9 @@ import React, { useEffect, useState } from 'react'; import { i18n } from '@kbn/i18n'; import { SLOResponse } from '@kbn/slo-schema'; -import { toDuration, toMinutes } from '../../../utils/slo/duration'; -import { useFetchSloDetails } from '../../../hooks/slo/use_fetch_slo_details'; -import { BurnRateRuleParams, Duration, DurationUnit } from '../../../typings'; +import { toDuration, toMinutes } from '../../utils/slo/duration'; +import { useFetchSloDetails } from '../../hooks/slo/use_fetch_slo_details'; +import { BurnRateRuleParams, Duration, DurationUnit } from '../../typings'; import { SloSelector } from './slo_selector'; import { BurnRate } from './burn_rate'; import { LongWindowDuration } from './long_window_duration'; diff --git a/x-pack/plugins/observability/public/components/app/burn_rate_rule_editor/index.tsx b/x-pack/plugins/observability/public/components/burn_rate_rule_editor/index.tsx similarity index 100% rename from x-pack/plugins/observability/public/components/app/burn_rate_rule_editor/index.tsx rename to x-pack/plugins/observability/public/components/burn_rate_rule_editor/index.tsx diff --git a/x-pack/plugins/observability/public/components/app/burn_rate_rule_editor/long_window_duration.tsx b/x-pack/plugins/observability/public/components/burn_rate_rule_editor/long_window_duration.tsx similarity index 96% rename from x-pack/plugins/observability/public/components/app/burn_rate_rule_editor/long_window_duration.tsx rename to x-pack/plugins/observability/public/components/burn_rate_rule_editor/long_window_duration.tsx index 4b5f907460e97..528ddd324110c 100644 --- a/x-pack/plugins/observability/public/components/app/burn_rate_rule_editor/long_window_duration.tsx +++ b/x-pack/plugins/observability/public/components/burn_rate_rule_editor/long_window_duration.tsx @@ -9,8 +9,8 @@ import { EuiFieldNumber, EuiFlexGroup, EuiFlexItem, EuiFormRow, EuiIconTip } fro import { i18n } from '@kbn/i18n'; import React, { ChangeEvent, useState } from 'react'; -import { toMinutes } from '../../../utils/slo/duration'; -import { Duration } from '../../../typings'; +import { toMinutes } from '../../utils/slo/duration'; +import { Duration } from '../../typings'; interface Props { shortWindowDuration: Duration; diff --git a/x-pack/plugins/observability/public/components/app/burn_rate_rule_editor/slo_selector.stories.tsx b/x-pack/plugins/observability/public/components/burn_rate_rule_editor/slo_selector.stories.tsx similarity index 89% rename from x-pack/plugins/observability/public/components/app/burn_rate_rule_editor/slo_selector.stories.tsx rename to x-pack/plugins/observability/public/components/burn_rate_rule_editor/slo_selector.stories.tsx index 1debffc408049..f0f3a4cf44733 100644 --- a/x-pack/plugins/observability/public/components/app/burn_rate_rule_editor/slo_selector.stories.tsx +++ b/x-pack/plugins/observability/public/components/burn_rate_rule_editor/slo_selector.stories.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { ComponentStory } from '@storybook/react'; import { SLOResponse } from '@kbn/slo-schema'; -import { KibanaReactStorybookDecorator } from '../../../utils/kibana_react.storybook_decorator'; +import { KibanaReactStorybookDecorator } from '../../utils/kibana_react.storybook_decorator'; import { SloSelector as Component } from './slo_selector'; export default { diff --git a/x-pack/plugins/observability/public/components/app/burn_rate_rule_editor/slo_selector.test.tsx b/x-pack/plugins/observability/public/components/burn_rate_rule_editor/slo_selector.test.tsx similarity index 85% rename from x-pack/plugins/observability/public/components/app/burn_rate_rule_editor/slo_selector.test.tsx rename to x-pack/plugins/observability/public/components/burn_rate_rule_editor/slo_selector.test.tsx index 60d0d24403103..9c40a23b02d46 100644 --- a/x-pack/plugins/observability/public/components/app/burn_rate_rule_editor/slo_selector.test.tsx +++ b/x-pack/plugins/observability/public/components/burn_rate_rule_editor/slo_selector.test.tsx @@ -10,12 +10,12 @@ import userEvent from '@testing-library/user-event'; import { wait } from '@testing-library/user-event/dist/utils'; import React from 'react'; -import { emptySloList } from '../../../data/slo/slo'; -import { useFetchSloList } from '../../../hooks/slo/use_fetch_slo_list'; -import { render } from '../../../utils/test_helper'; +import { emptySloList } from '../../data/slo/slo'; +import { useFetchSloList } from '../../hooks/slo/use_fetch_slo_list'; +import { render } from '../../utils/test_helper'; import { SloSelector } from './slo_selector'; -jest.mock('../../../hooks/slo/use_fetch_slo_list'); +jest.mock('../../hooks/slo/use_fetch_slo_list'); const useFetchSloListMock = useFetchSloList as jest.Mock; diff --git a/x-pack/plugins/observability/public/components/app/burn_rate_rule_editor/slo_selector.tsx b/x-pack/plugins/observability/public/components/burn_rate_rule_editor/slo_selector.tsx similarity index 97% rename from x-pack/plugins/observability/public/components/app/burn_rate_rule_editor/slo_selector.tsx rename to x-pack/plugins/observability/public/components/burn_rate_rule_editor/slo_selector.tsx index c1f6aa9394cc8..4e92a864fa998 100644 --- a/x-pack/plugins/observability/public/components/app/burn_rate_rule_editor/slo_selector.tsx +++ b/x-pack/plugins/observability/public/components/burn_rate_rule_editor/slo_selector.tsx @@ -11,7 +11,7 @@ import { SLOResponse } from '@kbn/slo-schema'; import { debounce } from 'lodash'; import React, { useEffect, useMemo, useState } from 'react'; -import { useFetchSloList } from '../../../hooks/slo/use_fetch_slo_list'; +import { useFetchSloList } from '../../hooks/slo/use_fetch_slo_list'; interface Props { initialSlo?: SLOResponse; diff --git a/x-pack/plugins/observability/public/components/app/burn_rate_rule_editor/validation.test.ts b/x-pack/plugins/observability/public/components/burn_rate_rule_editor/validation.test.ts similarity index 97% rename from x-pack/plugins/observability/public/components/app/burn_rate_rule_editor/validation.test.ts rename to x-pack/plugins/observability/public/components/burn_rate_rule_editor/validation.test.ts index 13ed0dafa88a3..764ec974891b3 100644 --- a/x-pack/plugins/observability/public/components/app/burn_rate_rule_editor/validation.test.ts +++ b/x-pack/plugins/observability/public/components/burn_rate_rule_editor/validation.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { BurnRateRuleParams } from '../../../typings'; +import { BurnRateRuleParams } from '../../typings'; import { validateBurnRateRule } from './validation'; const VALID_PARAMS: BurnRateRuleParams = { diff --git a/x-pack/plugins/observability/public/components/app/burn_rate_rule_editor/validation.ts b/x-pack/plugins/observability/public/components/burn_rate_rule_editor/validation.ts similarity index 97% rename from x-pack/plugins/observability/public/components/app/burn_rate_rule_editor/validation.ts rename to x-pack/plugins/observability/public/components/burn_rate_rule_editor/validation.ts index 18915b25c5acc..611408ea085c6 100644 --- a/x-pack/plugins/observability/public/components/app/burn_rate_rule_editor/validation.ts +++ b/x-pack/plugins/observability/public/components/burn_rate_rule_editor/validation.ts @@ -7,7 +7,7 @@ import { i18n } from '@kbn/i18n'; import { ValidationResult } from '@kbn/triggers-actions-ui-plugin/public'; -import { BurnRateRuleParams, Duration } from '../../../typings'; +import { BurnRateRuleParams, Duration } from '../../typings'; export type ValidationBurnRateRuleResult = ValidationResult & { errors: { sloId: string[]; longWindow: string[]; burnRateThreshold: string[] }; diff --git a/x-pack/plugins/observability/public/components/shared/core_web_vitals/__stories__/core_vitals.stories.tsx b/x-pack/plugins/observability/public/components/core_web_vitals/__stories__/core_vitals.stories.tsx similarity index 100% rename from x-pack/plugins/observability/public/components/shared/core_web_vitals/__stories__/core_vitals.stories.tsx rename to x-pack/plugins/observability/public/components/core_web_vitals/__stories__/core_vitals.stories.tsx diff --git a/x-pack/plugins/observability/public/components/shared/core_web_vitals/color_palette_flex_item.tsx b/x-pack/plugins/observability/public/components/core_web_vitals/color_palette_flex_item.tsx similarity index 100% rename from x-pack/plugins/observability/public/components/shared/core_web_vitals/color_palette_flex_item.tsx rename to x-pack/plugins/observability/public/components/core_web_vitals/color_palette_flex_item.tsx diff --git a/x-pack/plugins/observability/public/components/shared/core_web_vitals/core_vital_item.test.tsx b/x-pack/plugins/observability/public/components/core_web_vitals/core_vital_item.test.tsx similarity index 97% rename from x-pack/plugins/observability/public/components/shared/core_web_vitals/core_vital_item.test.tsx rename to x-pack/plugins/observability/public/components/core_web_vitals/core_vital_item.test.tsx index da618350ddf6a..91dbc34a47275 100644 --- a/x-pack/plugins/observability/public/components/shared/core_web_vitals/core_vital_item.test.tsx +++ b/x-pack/plugins/observability/public/components/core_web_vitals/core_vital_item.test.tsx @@ -6,7 +6,7 @@ */ import React from 'react'; -import { render } from '../../../utils/test_helper'; +import { render } from '../../utils/test_helper'; import { CoreVitalItem } from './core_vital_item'; import { NO_DATA, diff --git a/x-pack/plugins/observability/public/components/shared/core_web_vitals/core_vital_item.tsx b/x-pack/plugins/observability/public/components/core_web_vitals/core_vital_item.tsx similarity index 100% rename from x-pack/plugins/observability/public/components/shared/core_web_vitals/core_vital_item.tsx rename to x-pack/plugins/observability/public/components/core_web_vitals/core_vital_item.tsx diff --git a/x-pack/plugins/observability/public/components/shared/core_web_vitals/index.tsx b/x-pack/plugins/observability/public/components/core_web_vitals/core_vitals.tsx similarity index 94% rename from x-pack/plugins/observability/public/components/shared/core_web_vitals/index.tsx rename to x-pack/plugins/observability/public/components/core_web_vitals/core_vitals.tsx index 939ed1d9b27e4..b215935ac373e 100644 --- a/x-pack/plugins/observability/public/components/shared/core_web_vitals/index.tsx +++ b/x-pack/plugins/observability/public/components/core_web_vitals/core_vitals.tsx @@ -18,7 +18,15 @@ import { import { CoreVitalItem } from './core_vital_item'; import { WebCoreVitalsTitle } from './web_core_vitals_title'; import { ServiceName } from './service_name'; -import { CoreVitalProps } from '../types'; + +export interface CoreVitalProps { + loading: boolean; + data?: UXMetrics | null; + displayServiceName?: boolean; + serviceName?: string; + totalPageViews?: number; + displayTrafficMetric?: boolean; +} export interface UXMetrics { cls: number | null; diff --git a/x-pack/plugins/observability/public/components/core_web_vitals/get_core_web_vitals_lazy.tsx b/x-pack/plugins/observability/public/components/core_web_vitals/get_core_web_vitals_lazy.tsx new file mode 100644 index 0000000000000..4f24875b1893f --- /dev/null +++ b/x-pack/plugins/observability/public/components/core_web_vitals/get_core_web_vitals_lazy.tsx @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { lazy, Suspense } from 'react'; +import { CoreVitalProps } from './core_vitals'; + +const CoreVitalsLazy = lazy(() => import('./core_vitals')); + +export function getCoreVitalsComponent(props: CoreVitalProps) { + return ( + + + + ); +} diff --git a/x-pack/plugins/observability/public/components/shared/core_web_vitals/palette_legends.tsx b/x-pack/plugins/observability/public/components/core_web_vitals/palette_legends.tsx similarity index 100% rename from x-pack/plugins/observability/public/components/shared/core_web_vitals/palette_legends.tsx rename to x-pack/plugins/observability/public/components/core_web_vitals/palette_legends.tsx diff --git a/x-pack/plugins/observability/public/components/shared/core_web_vitals/service_name.tsx b/x-pack/plugins/observability/public/components/core_web_vitals/service_name.tsx similarity index 100% rename from x-pack/plugins/observability/public/components/shared/core_web_vitals/service_name.tsx rename to x-pack/plugins/observability/public/components/core_web_vitals/service_name.tsx diff --git a/x-pack/plugins/observability/public/components/shared/core_web_vitals/translations.ts b/x-pack/plugins/observability/public/components/core_web_vitals/translations.ts similarity index 100% rename from x-pack/plugins/observability/public/components/shared/core_web_vitals/translations.ts rename to x-pack/plugins/observability/public/components/core_web_vitals/translations.ts diff --git a/x-pack/plugins/observability/public/components/shared/core_web_vitals/web_core_vitals_title.tsx b/x-pack/plugins/observability/public/components/core_web_vitals/web_core_vitals_title.tsx similarity index 100% rename from x-pack/plugins/observability/public/components/shared/core_web_vitals/web_core_vitals_title.tsx rename to x-pack/plugins/observability/public/components/core_web_vitals/web_core_vitals_title.tsx diff --git a/x-pack/plugins/observability/public/components/shared/experimental_badge.tsx b/x-pack/plugins/observability/public/components/experimental_badge.tsx similarity index 100% rename from x-pack/plugins/observability/public/components/shared/experimental_badge.tsx rename to x-pack/plugins/observability/public/components/experimental_badge.tsx diff --git a/x-pack/plugins/observability/public/components/loading_observability.tsx b/x-pack/plugins/observability/public/components/loading_observability.tsx index 889b9c9a31d04..d70d2c6fbef27 100644 --- a/x-pack/plugins/observability/public/components/loading_observability.tsx +++ b/x-pack/plugins/observability/public/components/loading_observability.tsx @@ -9,14 +9,12 @@ import React from 'react'; import { EuiFlexGroup, EuiFlexItem, EuiLoadingSpinner, EuiText } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { usePluginContext } from '../hooks/use_plugin_context'; -import { HeaderMenu } from '../pages/overview/components/header_menu'; export function LoadingObservability() { const { ObservabilityPageTemplate } = usePluginContext(); return ( - diff --git a/x-pack/plugins/observability/public/components/shared/action_menu/index.tsx b/x-pack/plugins/observability/public/components/shared/action_menu/index.tsx deleted file mode 100644 index 08ff33cfcfe95..0000000000000 --- a/x-pack/plugins/observability/public/components/shared/action_menu/index.tsx +++ /dev/null @@ -1,76 +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 { - EuiPopover, - EuiText, - EuiListGroup, - EuiSpacer, - EuiHorizontalRule, - EuiListGroupItem, - EuiPopoverProps, - EuiListGroupItemProps, -} from '@elastic/eui'; -import React, { HTMLAttributes, ReactNode } from 'react'; -import styled from 'styled-components'; -import { EuiListGroupProps } from '@elastic/eui'; - -type Props = EuiPopoverProps & HTMLAttributes; - -export function SectionTitle({ children }: { children?: ReactNode }) { - return ( - <> - -
{children}
-
- - - ); -} - -export function SectionSubtitle({ children }: { children?: ReactNode }) { - return ( - <> - - {children} - - - - ); -} - -export function SectionLinks({ children, ...props }: { children?: ReactNode } & EuiListGroupProps) { - return ( - - {children} - - ); -} - -export function SectionSpacer() { - return ; -} - -export const Section = styled.div` - margin-bottom: 16px; - &:last-of-type { - margin-bottom: 0; - } -`; - -export type SectionLinkProps = EuiListGroupItemProps; -export function SectionLink(props: SectionLinkProps) { - return ; -} - -export function ActionMenuDivider() { - return ; -} - -export function ActionMenu(props: Props) { - return ; -} diff --git a/x-pack/plugins/observability/public/components/shared/add_data_buttons/mobile_add_data.tsx b/x-pack/plugins/observability/public/components/shared/add_data_buttons/mobile_add_data.tsx deleted file mode 100644 index 0e17c6277618b..0000000000000 --- a/x-pack/plugins/observability/public/components/shared/add_data_buttons/mobile_add_data.tsx +++ /dev/null @@ -1,32 +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 { EuiHeaderLink } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; -import React from 'react'; -import { useKibana } from '../../../utils/kibana_react'; - -export function MobileAddData() { - const kibana = useKibana(); - - return ( - - {ADD_DATA_LABEL} - - ); -} - -const ADD_DATA_LABEL = i18n.translate('xpack.observability.mobile.addDataButtonLabel', { - defaultMessage: 'Add Mobile data', -}); diff --git a/x-pack/plugins/observability/public/components/shared/add_data_buttons/synthetics_add_data.tsx b/x-pack/plugins/observability/public/components/shared/add_data_buttons/synthetics_add_data.tsx deleted file mode 100644 index af91624769e6b..0000000000000 --- a/x-pack/plugins/observability/public/components/shared/add_data_buttons/synthetics_add_data.tsx +++ /dev/null @@ -1,32 +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 { EuiHeaderLink } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; -import React from 'react'; -import { useKibana } from '../../../utils/kibana_react'; - -export function SyntheticsAddData() { - const kibana = useKibana(); - - return ( - - {ADD_DATA_LABEL} - - ); -} - -const ADD_DATA_LABEL = i18n.translate('xpack.observability..synthetics.addDataButtonLabel', { - defaultMessage: 'Add synthetics data', -}); diff --git a/x-pack/plugins/observability/public/components/shared/add_data_buttons/ux_add_data.tsx b/x-pack/plugins/observability/public/components/shared/add_data_buttons/ux_add_data.tsx deleted file mode 100644 index c6aa0742466f1..0000000000000 --- a/x-pack/plugins/observability/public/components/shared/add_data_buttons/ux_add_data.tsx +++ /dev/null @@ -1,32 +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 { EuiHeaderLink } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; -import React from 'react'; -import { useKibana } from '../../../utils/kibana_react'; - -export function UXAddData() { - const kibana = useKibana(); - - return ( - - {ADD_DATA_LABEL} - - ); -} - -const ADD_DATA_LABEL = i18n.translate('xpack.observability.ux.addDataButtonLabel', { - defaultMessage: 'Add UX data', -}); diff --git a/x-pack/plugins/observability/public/components/shared/alert_search_bar/index.ts b/x-pack/plugins/observability/public/components/shared/alert_search_bar/index.ts deleted file mode 100644 index c0b1349088dfa..0000000000000 --- a/x-pack/plugins/observability/public/components/shared/alert_search_bar/index.ts +++ /dev/null @@ -1,9 +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. - */ - -export { ObservabilityAlertSearchBar } from './alert_search_bar'; -export { ObservabilityAlertSearchbarWithUrlSync } from './alert_search_bar_with_url_sync'; diff --git a/x-pack/plugins/observability/public/components/shared/date_picker/typings.ts b/x-pack/plugins/observability/public/components/shared/date_picker/typings.ts deleted file mode 100644 index ed41716bfb78a..0000000000000 --- a/x-pack/plugins/observability/public/components/shared/date_picker/typings.ts +++ /dev/null @@ -1,22 +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. - */ - -export interface TimePickerQuickRange { - from: string; - to: string; - display: string; -} - -export interface TimePickerRefreshInterval { - pause: boolean; - value: number; -} - -export interface TimePickerTimeDefaults { - from: string; - to: string; -} diff --git a/x-pack/plugins/observability/public/components/shared/field_value_suggestions/__stories__/field_value_selection.stories.tsx b/x-pack/plugins/observability/public/components/shared/field_value_suggestions/__stories__/field_value_selection.stories.tsx deleted file mode 100644 index 0916cc4673129..0000000000000 --- a/x-pack/plugins/observability/public/components/shared/field_value_suggestions/__stories__/field_value_selection.stories.tsx +++ /dev/null @@ -1,104 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React, { ComponentType, useEffect, useState } from 'react'; -import { __IntlProvider as IntlProvider } from '@kbn/i18n-react'; -import { Observable } from 'rxjs'; -import { CoreStart } from '@kbn/core/public'; -import { text } from '@storybook/addon-knobs'; -import { createKibanaReactContext } from '@kbn/kibana-react-plugin/public'; -import { FieldValueSelectionProps } from '../types'; -import { FieldValueSelection } from '../field_value_selection'; - -const values = [ - { label: 'elastic co frontend', count: 1 }, - { label: 'apm server', count: 2 }, -]; - -const KibanaReactContext = createKibanaReactContext({ - uiSettings: { get: () => {}, get$: () => new Observable() }, -} as unknown as Partial); - -export default { - title: 'app/Shared/FieldValueSuggestions', - component: FieldValueSelection, - decorators: [ - (Story: ComponentType) => ( - - - {}} - selectedValue={[]} - loading={false} - setQuery={() => {}} - /> - - - ), - ], -}; - -export function ValuesLoaded() { - return ( - {}} - selectedValue={[]} - loading={false} - setQuery={() => {}} - /> - ); -} - -export function LoadingState() { - return ( - {}} - selectedValue={[]} - loading={true} - setQuery={() => {}} - /> - ); -} - -export function EmptyState() { - return ( - {}} - selectedValue={[]} - loading={false} - setQuery={() => {}} - /> - ); -} - -export function SearchState(args: FieldValueSelectionProps) { - const name = text('Query', ''); - - const [, setQuery] = useState(''); - useEffect(() => { - setQuery(name); - }, [name]); - - return ( - {}} - selectedValue={[]} - loading={false} - setQuery={setQuery} - /> - ); -} diff --git a/x-pack/plugins/observability/public/components/shared/field_value_suggestions/field_value_combobox.tsx b/x-pack/plugins/observability/public/components/shared/field_value_suggestions/field_value_combobox.tsx deleted file mode 100644 index 7d14a73fa64d7..0000000000000 --- a/x-pack/plugins/observability/public/components/shared/field_value_suggestions/field_value_combobox.tsx +++ /dev/null @@ -1,116 +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 React, { useEffect, useState } from 'react'; -import { union, isEmpty } from 'lodash'; -import { - EuiComboBox, - EuiFormControlLayout, - EuiComboBoxOptionOption, - EuiFormRow, -} from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; -import styled from 'styled-components'; -import { FieldValueSelectionProps } from './types'; -const formatOptions = (values?: string[], allowAllValuesSelection?: boolean) => { - const uniqueValues = Array.from( - new Set( - allowAllValuesSelection && (values ?? []).length > 0 - ? ['ALL_VALUES', ...(values ?? [])] - : values - ) - ); - - return (uniqueValues ?? []).map((label) => ({ - label, - })); -}; - -type ValueOption = EuiComboBoxOptionOption; - -export function FieldValueCombobox({ - label, - selectedValue, - loading, - values, - setQuery, - usePrependLabel = true, - compressed = true, - required = true, - singleSelection = false, - allowAllValuesSelection, - onChange: onSelectionChange, -}: FieldValueSelectionProps) { - const [options, setOptions] = useState(() => - formatOptions( - union(values?.map(({ label: lb }) => lb) ?? [], selectedValue ?? []), - allowAllValuesSelection - ) - ); - - useEffect(() => { - setOptions( - formatOptions( - union(values?.map(({ label: lb }) => lb) ?? [], selectedValue ?? []), - allowAllValuesSelection - ) - ); - }, [allowAllValuesSelection, selectedValue, values]); - - const onChange = (selectedValuesN: ValueOption[]) => { - onSelectionChange(selectedValuesN.map(({ label: lbl }) => lbl)); - }; - - const comboBox = ( - { - setQuery(searchVal); - }} - options={options} - selectedOptions={options.filter((opt) => selectedValue?.includes(opt.label))} - onChange={onChange} - isInvalid={required && isEmpty(selectedValue)} - /> - ); - - return usePrependLabel ? ( - - - {comboBox} - - - ) : ( - - {comboBox} - - ); -} - -const ComboWrapper = styled.div` - &&& { - .euiFormControlLayout { - height: auto; - .euiFormControlLayout__prepend { - margin: auto; - } - .euiComboBoxPill { - max-width: 250px; - } - .euiComboBox__inputWrap { - border-radius: 0; - } - } - } -`; diff --git a/x-pack/plugins/observability/public/components/shared/field_value_suggestions/field_value_selection.test.tsx b/x-pack/plugins/observability/public/components/shared/field_value_suggestions/field_value_selection.test.tsx deleted file mode 100644 index 9839d1d5d58e9..0000000000000 --- a/x-pack/plugins/observability/public/components/shared/field_value_suggestions/field_value_selection.test.tsx +++ /dev/null @@ -1,81 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import React from 'react'; -import { mount, render } from 'enzyme'; -import { FieldValueSelection } from './field_value_selection'; -import { EuiSelectableList } from '@elastic/eui'; -import { EuiThemeProvider } from '@kbn/kibana-react-plugin/common'; - -const values = [ - { label: 'elastic co frontend', count: 1 }, - { label: 'apm server', count: 2 }, -]; - -describe('FieldValueSelection', () => { - it('renders a label for button', async () => { - const wrapper = render( - {}} - selectedValue={[]} - loading={false} - setQuery={() => {}} - /> - ); - - const btn = wrapper.find('[data-test-subj=fieldValueSelectionBtn]'); - - expect(btn.text()).toBe('Service name'); - }); - - it('renders a list on click', async () => { - const wrapper = mount( - - {}} - selectedValue={[]} - loading={false} - setQuery={() => {}} - /> - - ); - - const btn = wrapper.find('button[data-test-subj="fieldValueSelectionBtn"]'); - btn.simulate('click'); - - const list = wrapper.find(EuiSelectableList); - - expect((list.props() as any).visibleOptions).toMatchInlineSnapshot(` - Array [ - Object { - "append": - - 1 - - , - "label": "elastic co frontend", - }, - Object { - "append": - - 2 - - , - "label": "apm server", - }, - ] - `); - }); -}); diff --git a/x-pack/plugins/observability/public/components/shared/field_value_suggestions/field_value_selection.tsx b/x-pack/plugins/observability/public/components/shared/field_value_suggestions/field_value_selection.tsx deleted file mode 100644 index 1e5f7a0e06f97..0000000000000 --- a/x-pack/plugins/observability/public/components/shared/field_value_suggestions/field_value_selection.tsx +++ /dev/null @@ -1,300 +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 React, { FormEvent, useEffect, useState } from 'react'; -import { - EuiText, - EuiButton, - EuiSwitch, - EuiSpacer, - EuiFilterButton, - EuiPopover, - EuiPopoverFooter, - EuiPopoverTitle, - EuiSelectable, - EuiSelectableOption, - EuiLoadingSpinner, - useEuiTheme, -} from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; -import styled from 'styled-components'; -import { isEqual, map } from 'lodash'; -import { euiStyled } from '@kbn/kibana-react-plugin/common'; -import { FieldValueSelectionProps, ListItem } from './types'; - -const Counter = euiStyled.div` - border-radius: ${({ theme }) => theme.eui.euiBorderRadius}; - background: ${({ theme }) => theme.eui.euiColorLightShade}; - padding: 0 ${({ theme }) => theme.eui.euiSizeXS}; -`; - -const formatOptions = ( - values?: ListItem[], - selectedValue?: string[], - excludedValues?: string[], - showCount?: boolean -): EuiSelectableOption[] => { - const uniqueValues: Record = {}; - - values?.forEach(({ label, count }) => { - uniqueValues[label] = count; - }); - - return Object.entries(uniqueValues).map(([label, count]) => ({ - label, - append: showCount ? ( - - {count} - - ) : null, - ...(selectedValue?.includes(label) ? { checked: 'on' } : {}), - ...(excludedValues?.includes(label) ? { checked: 'off' } : {}), - })); -}; - -export function FieldValueSelection({ - fullWidth, - label, - loading, - query, - setQuery, - button, - width, - forceOpen, - setForceOpen, - anchorPosition, - singleSelection, - asFilterButton, - showCount = true, - values = [], - selectedValue, - excludedValue, - allowExclusions = true, - compressed = true, - useLogicalAND, - showLogicalConditionSwitch = false, - onChange: onSelectionChange, -}: FieldValueSelectionProps) { - const { euiTheme } = useEuiTheme(); - - const [options, setOptions] = useState(() => - formatOptions(values, selectedValue, excludedValue, showCount) - ); - - const [isPopoverOpen, setIsPopoverOpen] = useState(false); - - const [isLogicalAND, setIsLogicalAND] = useState(useLogicalAND); - - useEffect(() => { - setIsLogicalAND(useLogicalAND); - }, [useLogicalAND]); - - useEffect(() => { - setOptions(formatOptions(values, selectedValue, excludedValue, showCount)); - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [JSON.stringify(values), JSON.stringify(selectedValue), showCount, excludedValue]); - - const onButtonClick = () => { - setIsPopoverOpen(!isPopoverOpen); - }; - - const closePopover = () => { - setIsPopoverOpen(false); - setForceOpen?.(false); - }; - - const onChange = (optionsN: EuiSelectableOption[]) => { - setOptions(optionsN); - }; - - const onValueChange = (evt: FormEvent) => { - setQuery((evt.target as HTMLInputElement).value); - }; - - const anchorButton = ( - - {label} - - ); - - const numOfFilters = (selectedValue || []).length + (excludedValue || []).length; - - const filterButton = ( - 0} - iconType="arrowDown" - numActiveFilters={numOfFilters} - numFilters={options.length} - onClick={onButtonClick} - > - {label} - - ); - - const applyDisabled = () => { - const currSelected = (options ?? []) - .filter((opt) => opt?.checked === 'on') - .map(({ label: labelN }) => labelN); - - const currExcluded = (options ?? []) - .filter((opt) => opt?.checked === 'off') - .map(({ label: labelN }) => labelN); - - const hasFilterSelected = (selectedValue ?? []).length > 0 || (excludedValue ?? []).length > 0; - - return ( - isEqual(selectedValue ?? [], currSelected) && - isEqual(excludedValue ?? [], currExcluded) && - !(isLogicalAND !== useLogicalAND && hasFilterSelected) - ); - }; - - return ( - - - - {(list, search) => ( -
- {search} - {list} - {loading && query && ( - - {i18n.translate('xpack.observability.fieldValueSelection.loading', { - defaultMessage: 'Loading', - })}{' '} - - - )} - - {showLogicalConditionSwitch && ( - <> - -
- { - setIsLogicalAND(e.target.checked); - }} - /> -
- - - )} - - { - const selectedValuesN = options.filter((opt) => opt?.checked === 'on'); - const excludedValuesN = options.filter((opt) => opt?.checked === 'off'); - - if (showLogicalConditionSwitch) { - onSelectionChange( - map(selectedValuesN, 'label'), - map(excludedValuesN, 'label'), - isLogicalAND - ); - } else { - onSelectionChange( - map(selectedValuesN, 'label'), - map(excludedValuesN, 'label') - ); - } - - setIsPopoverOpen(false); - setForceOpen?.(false); - }} - > - {i18n.translate('xpack.observability.fieldValueSelection.apply', { - defaultMessage: 'Apply', - })} - -
-
- )} -
-
-
- ); -} - -// eslint-disable-next-line import/no-default-export -export default FieldValueSelection; - -const Wrapper = styled.div` - &&& { - div.euiPopover__anchor { - width: 100%; - .euiButton { - width: 100%; - } - } - } -`; diff --git a/x-pack/plugins/observability/public/components/shared/field_value_suggestions/index.test.tsx b/x-pack/plugins/observability/public/components/shared/field_value_suggestions/index.test.tsx deleted file mode 100644 index 249913e91b4e4..0000000000000 --- a/x-pack/plugins/observability/public/components/shared/field_value_suggestions/index.test.tsx +++ /dev/null @@ -1,137 +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 React from 'react'; -import { FieldValueSuggestions } from '.'; -import { render, screen, fireEvent, waitForElementToBeRemoved } from '@testing-library/react'; -import * as searchHook from '../../../hooks/use_es_search'; -import { EuiThemeProvider } from '@kbn/kibana-react-plugin/common'; - -jest.setTimeout(30000); - -describe('FieldValueSuggestions', () => { - jest.spyOn(HTMLElement.prototype, 'offsetHeight', 'get').mockReturnValue(1500); - jest.spyOn(HTMLElement.prototype, 'offsetWidth', 'get').mockReturnValue(1500); - - function setupSearch(data: any) { - // @ts-ignore - jest.spyOn(searchHook, 'useEsSearch').mockReturnValue({ - data: { - took: 17, - timed_out: false, - _shards: { total: 35, successful: 35, skipped: 31, failed: 0 }, - hits: { total: { value: 15299, relation: 'eq' }, hits: [] }, - aggregations: { - values: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: data, - }, - }, - }, - loading: false, - }); - } - - it('renders a list', async () => { - setupSearch([ - { key: 'US', doc_count: 14132 }, - { key: 'Pak', doc_count: 200 }, - { key: 'Japan', doc_count: 100 }, - ]); - - render( - - {}} - selectedValue={[]} - filters={[]} - asCombobox={false} - /> - - ); - - fireEvent.click(screen.getByText('Service name')); - - expect(await screen.findByPlaceholderText('Filter Service name')).toBeInTheDocument(); - expect(await screen.findByText('Apply')).toBeInTheDocument(); - expect(await screen.findByText('US')).toBeInTheDocument(); - expect(await screen.findByText('Pak')).toBeInTheDocument(); - expect(await screen.findByText('Japan')).toBeInTheDocument(); - expect(await screen.findByText('14132')).toBeInTheDocument(); - expect(await screen.findByText('200')).toBeInTheDocument(); - expect(await screen.findByText('100')).toBeInTheDocument(); - - setupSearch([{ key: 'US', doc_count: 14132 }]); - - fireEvent.input(screen.getByTestId('suggestionInputField'), { - target: { value: 'u' }, - }); - - expect(await screen.findByDisplayValue('u')).toBeInTheDocument(); - }); - - it('calls oncChange when applied', async () => { - setupSearch([ - { key: 'US', doc_count: 14132 }, - { key: 'Pak', doc_count: 200 }, - { key: 'Japan', doc_count: 100 }, - ]); - - const onChange = jest.fn(); - - const { rerender } = render( - - - - ); - - fireEvent.click(screen.getByText('Service name')); - - fireEvent.click(await screen.findByText('US')); - fireEvent.click(await screen.findByText('Apply')); - - expect(onChange).toHaveBeenCalledTimes(1); - expect(onChange).toHaveBeenCalledWith(['US'], []); - - await waitForElementToBeRemoved(() => screen.queryByText('Apply')); - - rerender( - - - - ); - - fireEvent.click(screen.getByText('Service name')); - - fireEvent.click(await screen.findByText('US')); - fireEvent.click(await screen.findByText('Pak')); - fireEvent.click(await screen.findByText('Apply')); - - expect(onChange).toHaveBeenCalledTimes(2); - expect(onChange).toHaveBeenLastCalledWith([], ['US']); - }); -}); diff --git a/x-pack/plugins/observability/public/components/shared/field_value_suggestions/index.tsx b/x-pack/plugins/observability/public/components/shared/field_value_suggestions/index.tsx deleted file mode 100644 index ea414260a4380..0000000000000 --- a/x-pack/plugins/observability/public/components/shared/field_value_suggestions/index.tsx +++ /dev/null @@ -1,89 +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 React, { useState } from 'react'; -import { useValuesList } from '../../../hooks/use_values_list'; -import { FieldValueSelection } from './field_value_selection'; -import { FieldValueSuggestionsProps } from './types'; -import { FieldValueCombobox } from './field_value_combobox'; - -export function FieldValueSuggestions({ - fullWidth, - sourceField, - label, - dataViewTitle, - selectedValue, - excludedValue, - filters, - button, - time, - width, - forceOpen, - setForceOpen, - anchorPosition, - singleSelection, - compressed, - asFilterButton, - usePrependLabel, - allowAllValuesSelection, - required, - allowExclusions = true, - cardinalityField, - inspector, - asCombobox = true, - keepHistory = true, - showLogicalConditionSwitch, - useLogicalAND, - onChange: onSelectionChange, -}: FieldValueSuggestionsProps) { - const [query, setQuery] = useState(''); - - const { values, loading } = useValuesList({ - dataViewTitle, - query, - sourceField, - filters, - time, - inspector, - cardinalityField, - keepHistory, - label, - }); - - const SelectionComponent = asCombobox ? FieldValueCombobox : FieldValueSelection; - - return ( - - ); -} - -// eslint-disable-next-line import/no-default-export -export default FieldValueSuggestions; diff --git a/x-pack/plugins/observability/public/components/shared/field_value_suggestions/types.ts b/x-pack/plugins/observability/public/components/shared/field_value_suggestions/types.ts deleted file mode 100644 index 51e89570bc241..0000000000000 --- a/x-pack/plugins/observability/public/components/shared/field_value_suggestions/types.ts +++ /dev/null @@ -1,57 +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 { PopoverAnchorPosition } from '@elastic/eui'; -import { Dispatch, SetStateAction } from 'react'; -import type { ESFilter } from '@kbn/es-types'; -import { IInspectorInfo } from '@kbn/data-plugin/common'; - -interface CommonProps { - selectedValue?: string[]; - excludedValue?: string[]; - label: string; - button?: JSX.Element; - width?: number; - singleSelection?: boolean; - forceOpen?: boolean; - setForceOpen?: (val: boolean) => void; - anchorPosition?: PopoverAnchorPosition; - fullWidth?: boolean; - compressed?: boolean; - asFilterButton?: boolean; - showCount?: boolean; - usePrependLabel?: boolean; - allowExclusions?: boolean; - allowAllValuesSelection?: boolean; - cardinalityField?: string; - required?: boolean; - keepHistory?: boolean; - showLogicalConditionSwitch?: boolean; - useLogicalAND?: boolean; - onChange: (val?: string[], excludedValue?: string[], isLogicalAND?: boolean) => void; -} - -export type FieldValueSuggestionsProps = CommonProps & { - dataViewTitle?: string; - sourceField: string; - asCombobox?: boolean; - filters: ESFilter[]; - time?: { from: string; to: string }; - inspector?: IInspectorInfo; -}; - -export type FieldValueSelectionProps = CommonProps & { - loading?: boolean; - values?: ListItem[]; - query?: string; - setQuery: Dispatch>; -}; - -export interface ListItem { - label: string; - count: number; -} diff --git a/x-pack/plugins/observability/public/components/shared/filter_value_label/filter_value_label.tsx b/x-pack/plugins/observability/public/components/shared/filter_value_label/filter_value_label.tsx deleted file mode 100644 index 3b0221160720c..0000000000000 --- a/x-pack/plugins/observability/public/components/shared/filter_value_label/filter_value_label.tsx +++ /dev/null @@ -1,107 +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 React from 'react'; -import { injectI18n } from '@kbn/i18n-react'; -import { Filter, buildPhrasesFilter, buildPhraseFilter } from '@kbn/es-query'; -import { FilterItem } from '@kbn/unified-search-plugin/public'; -import type { DataView } from '@kbn/data-views-plugin/common'; -import { useKibana } from '@kbn/kibana-react-plugin/public'; - -export function buildFilterLabel({ - field, - value, - label, - dataView, - negate, -}: { - label: string; - value: string | Array; - negate: boolean; - field: string; - dataView: DataView; -}) { - const indexField = dataView.getFieldByName(field)!; - const areMultipleValues = Array.isArray(value) && value.length > 1; - const filter = areMultipleValues - ? buildPhrasesFilter(indexField, value, dataView) - : buildPhraseFilter(indexField, Array.isArray(value) ? value[0] : value, dataView); - - filter.meta.type = areMultipleValues ? 'phrases' : 'phrase'; - - filter.meta.value = Array.isArray(value) - ? !areMultipleValues - ? `${value[0]}` - : undefined - : value; - - filter.meta.key = label; - filter.meta.alias = null; - filter.meta.negate = negate; - filter.meta.disabled = false; - - return filter; -} - -export interface FilterValueLabelProps { - field: string; - label: string; - value: string | Array; - negate: boolean; - removeFilter: (field: string, value: string | Array, notVal: boolean) => void; - invertFilter: (val: { - field: string; - value: string | Array; - negate: boolean; - }) => void; - dataView: DataView; - allowExclusion?: boolean; -} -export function FilterValueLabel({ - label, - field, - value, - negate, - dataView, - invertFilter, - removeFilter, - allowExclusion = true, -}: FilterValueLabelProps) { - const FilterItemI18n = injectI18n(FilterItem); - - const filter = buildFilterLabel({ field, value, label, dataView, negate }); - - const { - services: { uiSettings }, - } = useKibana(); - - return dataView ? ( - { - removeFilter(field, value, false); - }} - onUpdate={(filterN: Filter) => { - if (filterN.meta.negate !== negate) { - invertFilter({ field, value, negate }); - } - }} - uiSettings={uiSettings!} - hiddenPanelOptions={[ - ...(allowExclusion ? [] : ['negateFilter' as const]), - 'pinFilter', - 'editFilter', - 'disableFilter', - ]} - /> - ) : null; -} - -// eslint-disable-next-line import/no-default-export -export default FilterValueLabel; diff --git a/x-pack/plugins/observability/public/components/shared/index.tsx b/x-pack/plugins/observability/public/components/shared/index.tsx deleted file mode 100644 index 04138a22425b1..0000000000000 --- a/x-pack/plugins/observability/public/components/shared/index.tsx +++ /dev/null @@ -1,102 +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 React, { lazy, Suspense } from 'react'; -import { EuiLoadingSpinner } from '@elastic/eui'; -import { LoadWhenInViewProps } from './load_when_in_view/load_when_in_view'; -import { ObservabilityAlertSearchBarProps } from './alert_search_bar/types'; -import type { CoreVitalProps, HeaderMenuPortalProps } from './types'; -import type { - FieldValueSuggestionsProps, - FieldValueSelectionProps, -} from './field_value_suggestions/types'; -import type { DatePickerProps } from './date_picker'; -import type { FilterValueLabelProps } from './filter_value_label/filter_value_label'; -export { createLazyObservabilityPageTemplate } from './page_template'; -export type { LazyObservabilityPageTemplateProps } from './page_template'; - -const CoreVitalsLazy = lazy(() => import('./core_web_vitals')); - -export function getCoreVitalsComponent(props: CoreVitalProps) { - return ( - - - - ); -} - -const HeaderMenuPortalLazy = lazy(() => import('./header_menu_portal')); - -export function HeaderMenuPortal(props: HeaderMenuPortalProps) { - return ( - }> - - - ); -} - -const FieldValueSelectionLazy = lazy( - () => import('./field_value_suggestions/field_value_selection') -); - -export function FieldValueSelection(props: FieldValueSelectionProps) { - return ( - - - - ); -} - -const FieldValueSuggestionsLazy = lazy(() => import('./field_value_suggestions')); - -export function FieldValueSuggestions(props: FieldValueSuggestionsProps) { - return ( - - - - ); -} - -const FilterValueLabelLazy = lazy(() => import('./filter_value_label/filter_value_label')); - -export function FilterValueLabel(props: FilterValueLabelProps) { - return ( - - - - ); -} - -const DatePickerLazy = lazy(() => import('./date_picker')); - -export function DatePicker(props: DatePickerProps) { - return ( - }> - - - ); -} - -const LoadWhenInViewLazy = lazy(() => import('./load_when_in_view/load_when_in_view')); - -export function LoadWhenInView(props: LoadWhenInViewProps) { - return ( - }> - - - ); -} - -const ObservabilityAlertSearchBarLazy = lazy(() => import('./alert_search_bar/alert_search_bar')); - -export function ObservabilityAlertSearchBar(props: ObservabilityAlertSearchBarProps) { - return ( - }> - - - ); -} diff --git a/x-pack/plugins/observability/public/components/shared/load_when_in_view/load_when_in_view.tsx b/x-pack/plugins/observability/public/components/shared/load_when_in_view/load_when_in_view.tsx deleted file mode 100644 index 4eb1a0cf61f0e..0000000000000 --- a/x-pack/plugins/observability/public/components/shared/load_when_in_view/load_when_in_view.tsx +++ /dev/null @@ -1,52 +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 React, { useEffect, useState } from 'react'; -import { EuiSkeletonText } from '@elastic/eui'; -import useIntersection from 'react-use/lib/useIntersection'; - -export interface LoadWhenInViewProps { - children: JSX.Element; - initialHeight?: string | number; - placeholderTitle: string; -} - -// eslint-disable-next-line import/no-default-export -export default function LoadWhenInView({ - children, - placeholderTitle, - initialHeight = 100, -}: LoadWhenInViewProps) { - const intersectionRef = React.useRef(null); - const intersection = useIntersection(intersectionRef, { - root: null, - rootMargin: '0px', - threshold: 0.25, - }); - - const [isVisible, setIsVisible] = useState(false); - - useEffect(() => { - if (intersection && intersection.intersectionRatio > 0.25) { - setIsVisible(true); - } - }, [intersection, intersection?.intersectionRatio]); - - return isVisible ? ( - children - ) : ( -
- -
- ); -} diff --git a/x-pack/plugins/observability/public/components/shared/page_template/README.md b/x-pack/plugins/observability/public/components/shared/page_template/README.md deleted file mode 100644 index 6b8478578cf1c..0000000000000 --- a/x-pack/plugins/observability/public/components/shared/page_template/README.md +++ /dev/null @@ -1,176 +0,0 @@ -## Overview - -Observability solutions can register their navigation structures via the Observability plugin, this ensures that these navigation options display in the Observability page template component. This is a two part process, A) register your navigation structure and B) consume and render the shared page template component. These two elements are documented below. - -## Navigation registration - -To register a solution's navigation structure you'll first need to ensure your solution has the observability plugin specified as a dependency in your `kibana.json` file, e.g. - -```json -"requiredPlugins": [ - "observability" -], -``` - -Now within your solution's **public** plugin `setup` lifecycle method you can -call the `registerSections` method, this will register your solution's specific -navigation structure with the overall Observability navigation registry. - -The `registerSections` function takes an `Observable` of an array of -`NavigationSection`s. Each section can be defined as - -```typescript -export interface NavigationSection { - // the label of the section, should be translated - label: string | undefined; - // the key to sort by in ascending order relative to other entries - sortKey: number; - // the entries to render inside the section - entries: NavigationEntry[]; -} -``` - -Each entry inside of a navigation section is defined as - -```typescript -export interface NavigationEntry { - // the label of the menu entry, should be translated - label: string; - // the kibana app id - app: string; - // the path after the application prefix corresponding to this entry - path: string; - // whether to only match when the full path matches, defaults to `false` - matchFullPath?: boolean; - // whether to ignore trailing slashes, defaults to `true` - ignoreTrailingSlash?: boolean; - // shows NEW badge besides the navigation label, which will automatically disappear when menu item is clicked. - isNewFeature?: boolean; - // shows beta badge lab icon if the feature is still beta besides the navigation label - isBeta?: boolean; -} -``` - -A registration might therefore look like the following: - -```typescript -// x-pack/plugins/example_plugin/public/plugin.ts - -import { of } from 'rxjs'; - -export class Plugin implements PluginClass { - constructor(_context: PluginInitializerContext) {} - - setup(core: CoreSetup, plugins: PluginsSetup) { - plugins.observability.navigation.registerSections( - of([ - { - label: 'A solution section', - sortKey: 200, - entries: [ - { label: 'Home Page', app: 'exampleA', path: '/', matchFullPath: true }, - { label: 'Example Page', app: 'exampleA', path: '/example' }, - { label: 'Another Example Page', app: 'exampleA', path: '/another-example' }, - ], - }, - { - label: 'Another solution section', - sortKey: 300, - entries: [ - { label: 'Example page', app: 'exampleB', path: '/example' }, - ], - }, - ]) - ); - } - - start() {} - - stop() {} -} -``` - -Here `app` would match your solution - e.g. logs, metrics, APM, uptime etc. The registry is fully typed so please refer to the types for specific options. - -Observables are used to facilitate changes over time, for example within the lifetime of your application a license type or set of user permissions may change and as such you may wish to change the navigation structure. If your navigation needs are simple you can pass a value and forget about it. **Solutions are expected to handle their own permissions, and what should or should not be displayed at any time**, the Observability plugin will not add and remove items for you. - -The Observability navigation registry is now aware of your solution's navigation needs ✅ - -## Page template component - -The shared page template component can be used to actually display and render all of the registered navigation structures within your solution. - -The `start` contract of the public Observability plugin exposes a React component, under `navigation.PageTemplate`. - -This can be accessed like so: - -``` -const [coreStart, pluginsStart] = await core.getStartServices(); -const ObservabilityPageTemplate = pluginsStart.observability.navigation.PageTemplate; -``` - -Now that you have access to the component you can render your solution's content using it. - -```jsx - , - ], - }} - > - // Render anything you like here, this is just an example. - - - // Content - - - - // Content - - - -``` - -The `` component is a wrapper around the `` component (which in turn is a wrapper around the `` component). As such the props mostly reflect those available on the wrapped components, again everything is fully typed so please refer to the types for specific options. The `pageSideBar` prop is handled by the component, and will take care of rendering out and managing the items from the registry. - -After these two steps we should see something like the following (note the navigation on the left): - -![Page template rendered example](./page_template.png) - -## Adding NEW badge - -You can add a NEW badge beside the label by using the property `isNewFeature?: boolean;`. - -```js -setup(core: CoreSetup, plugins: PluginsSetup) { - plugins.observability.navigation.registerSections( - of([ - { - label: 'A solution section', - sortKey: 200, - entries: [ - { label: 'Backends', app: 'exampleA', path: '/example', isNewFeature: true }, - ], - } - ]) - ); - } - -``` -![NEW Badge example](./badge.png) - -The badge is going to be shown until user clicks on the menu item for the first time. Then we'll save an information at local storage, following this pattern `observability.nav_item_badge_visible_${app}${path}`, the above example would save `observability.nav_item_badge_visible_exampleA/example`. And the badge is removed. It'll only show again if the item saved at local storage is removed or set to `false`. - -It's recommended to remove the badge (e.g. a new feature promotion) in the subsequent release. - -To avoid the navigation flooding with badges, we also want to propose keeping it to maximum 2 active badges for every iteration - - diff --git a/x-pack/plugins/observability/public/components/shared/page_template/badge.png b/x-pack/plugins/observability/public/components/shared/page_template/badge.png deleted file mode 100644 index 55ebc28febb4340beb2439dfeeefb5136cd95b09..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 10163 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 import('./page_template')); - -export type LazyObservabilityPageTemplateProps = WrappedPageTemplateProps; - -export function createLazyObservabilityPageTemplate( - injectedDeps: ObservabilityPageTemplateDependencies -) { - return (pageTemplateProps: LazyObservabilityPageTemplateProps) => ( - - - - ); -} diff --git a/x-pack/plugins/observability/public/components/shared/page_template/nav_name_with_badge.tsx b/x-pack/plugins/observability/public/components/shared/page_template/nav_name_with_badge.tsx deleted file mode 100644 index 4c12ab810799c..0000000000000 --- a/x-pack/plugins/observability/public/components/shared/page_template/nav_name_with_badge.tsx +++ /dev/null @@ -1,68 +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 { EuiBadge } from '@elastic/eui'; -import { i18n } from '@kbn/i18n'; -import React from 'react'; -import styled from 'styled-components'; - -interface Props { - label: string; - localStorageId: string; -} - -const LabelContainer = styled.span` - max-width: 72%; - float: left; - &:hover, - &:focus { - text-decoration: underline; - } -`; - -const StyledBadge = styled(EuiBadge)` - margin-left: 8px; -`; - -/** - * Gets current state from local storage to show or hide the badge. - * Default value: true - * @param localStorageId - */ -function getBadgeVisibility(localStorageId: string) { - const storedItem = window.localStorage.getItem(localStorageId); - if (storedItem) { - return JSON.parse(storedItem) as boolean; - } - - return true; -} - -/** - * Saves on local storage that this item should no longer be visible - * @param localStorageId - */ -export function hideBadge(localStorageId: string) { - window.localStorage.setItem(localStorageId, JSON.stringify(false)); -} - -export function NavNameWithBadge({ label, localStorageId }: Props) { - const isBadgeVisible = getBadgeVisibility(localStorageId); - return ( - <> - - {label} - - {isBadgeVisible && ( - - {i18n.translate('xpack.observability.navigation.newBadge', { - defaultMessage: 'NEW', - })} - - )} - - ); -} diff --git a/x-pack/plugins/observability/public/components/shared/page_template/nav_name_with_beta_badge.tsx b/x-pack/plugins/observability/public/components/shared/page_template/nav_name_with_beta_badge.tsx deleted file mode 100644 index 20a7286e6073e..0000000000000 --- a/x-pack/plugins/observability/public/components/shared/page_template/nav_name_with_beta_badge.tsx +++ /dev/null @@ -1,47 +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 React from 'react'; -import { i18n } from '@kbn/i18n'; -import { EuiBetaBadge, EuiFlexGroup, EuiFlexItem, IconType } from '@elastic/eui'; - -interface Props { - label?: string; - isTechnicalPreview?: boolean; - iconType?: IconType; -} - -export function NavNameWithBetaBadge({ label, iconType, isTechnicalPreview }: Props) { - return ( - - - - {label} - - - - {isTechnicalPreview ? ( - - ) : ( - - )} - - - ); -} diff --git a/x-pack/plugins/observability/public/components/shared/page_template/page_template.png b/x-pack/plugins/observability/public/components/shared/page_template/page_template.png deleted file mode 100644 index 7dc88b937c27bf2bb43851d641b4b11213b71045..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 311243 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 VXno#evIG2GSGf6~>_3bj{U5)Ckh=f? diff --git a/x-pack/plugins/observability/public/components/shared/page_template/page_template.test.tsx b/x-pack/plugins/observability/public/components/shared/page_template/page_template.test.tsx deleted file mode 100644 index 2a5324ddb5397..0000000000000 --- a/x-pack/plugins/observability/public/components/shared/page_template/page_template.test.tsx +++ /dev/null @@ -1,121 +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 { I18nProvider } from '@kbn/i18n-react'; -import { render } from '@testing-library/react'; -import { shallow } from 'enzyme'; -import React from 'react'; -import { of } from 'rxjs'; -import { getKibanaPageTemplateKibanaDependenciesMock as getPageTemplateServices } from '@kbn/shared-ux-page-kibana-template-mocks'; -import { guidedOnboardingMock } from '@kbn/guided-onboarding-plugin/public/mocks'; - -import { createNavigationRegistry } from '../../../services/navigation_registry'; -import { createLazyObservabilityPageTemplate } from './lazy_page_template'; -import { ObservabilityPageTemplate } from './page_template'; - -jest.mock('react-router-dom', () => ({ - ...jest.requireActual('react-router-dom'), - useLocation: () => ({ - pathname: '/test-path', - }), -})); - -const navigationRegistry = createNavigationRegistry(); - -navigationRegistry.registerSections( - of([ - { - label: 'Test A', - sortKey: 100, - entries: [ - { label: 'Section A Url A', app: 'TestA', path: '/url-a' }, - { label: 'Section A Url B', app: 'TestA', path: '/url-b' }, - ], - }, - { - label: 'Test B', - sortKey: 200, - entries: [ - { label: 'Section B Url A', app: 'TestB', path: '/url-a' }, - { label: 'Section B Url B', app: 'TestB', path: '/url-b' }, - ], - }, - ]) -); - -describe('Page template', () => { - it('Provides a working lazy wrapper', () => { - const LazyObservabilityPageTemplate = createLazyObservabilityPageTemplate({ - currentAppId$: of('Test app ID'), - getUrlForApp: () => '/test-url', - navigateToApp: async () => {}, - navigationSections$: navigationRegistry.sections$, - getPageTemplateServices, - guidedOnboardingApi: guidedOnboardingMock.createStart().guidedOnboardingApi, - }); - - const component = shallow( - Test side item], - }} - > -
Test structure
-
- ); - - expect(component.exists('lazy')).toBe(true); - }); - - it('Utilises the KibanaPageTemplate for rendering', () => { - const component = shallow( - '/test-url'} - navigateToApp={async () => {}} - navigationSections$={navigationRegistry.sections$} - pageHeader={{ - pageTitle: 'Test title', - rightSideItems: [Test side item], - }} - getPageTemplateServices={getPageTemplateServices} - guidedOnboardingApi={guidedOnboardingMock.createStart().guidedOnboardingApi} - > -
Test structure
-
- ); - - expect(component.is('KibanaPageTemplate')); - }); - - it('Handles outputting the registered navigation structures within a side nav', () => { - const { container } = render( - - '/test-url'} - navigateToApp={async () => {}} - navigationSections$={navigationRegistry.sections$} - pageHeader={{ - pageTitle: 'Test title', - rightSideItems: [Test side item], - }} - getPageTemplateServices={getPageTemplateServices} - guidedOnboardingApi={guidedOnboardingMock.createStart().guidedOnboardingApi} - > -
Test structure
-
-
- ); - - expect(container).toHaveTextContent('Section A Url A'); - expect(container).toHaveTextContent('Section A Url B'); - expect(container).toHaveTextContent('Section B Url A'); - expect(container).toHaveTextContent('Section B Url B'); - }); -}); diff --git a/x-pack/plugins/observability/public/components/shared/page_template/page_template.tsx b/x-pack/plugins/observability/public/components/shared/page_template/page_template.tsx deleted file mode 100644 index aa6f99d862a4c..0000000000000 --- a/x-pack/plugins/observability/public/components/shared/page_template/page_template.tsx +++ /dev/null @@ -1,209 +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 { EuiSideNavItemType, EuiPageSectionProps, EuiErrorBoundary } from '@elastic/eui'; -import { _EuiPageBottomBarProps } from '@elastic/eui/src/components/page_template/bottom_bar/page_bottom_bar'; -import { i18n } from '@kbn/i18n'; -import React, { useMemo } from 'react'; -import { matchPath, useLocation } from 'react-router-dom'; -import useObservable from 'react-use/lib/useObservable'; -import type { Observable } from 'rxjs'; -import type { ApplicationStart } from '@kbn/core/public'; -import { useKibana } from '@kbn/kibana-react-plugin/public'; -import { - KibanaPageTemplate, - KibanaPageTemplateKibanaProvider, -} from '@kbn/shared-ux-page-kibana-template'; -import type { - KibanaPageTemplateProps, - KibanaPageTemplateKibanaDependencies, -} from '@kbn/shared-ux-page-kibana-template'; -import { GuidedOnboardingPluginStart } from '@kbn/guided-onboarding-plugin/public'; -import { ObservabilityAppServices } from '../../../application/types'; -import type { NavigationSection } from '../../../services/navigation_registry'; -import { ObservabilityTour } from '../tour'; -import { NavNameWithBadge, hideBadge } from './nav_name_with_badge'; -import { NavNameWithBetaBadge } from './nav_name_with_beta_badge'; - -export type WrappedPageTemplateProps = Pick< - KibanaPageTemplateProps, - | 'children' - | 'data-test-subj' - | 'paddingSize' - | 'pageHeader' - | 'restrictWidth' - | 'isEmptyState' - | 'noDataConfig' -> & { - showSolutionNav?: boolean; - isPageDataLoaded?: boolean; - pageSectionProps?: EuiPageSectionProps; - bottomBar?: React.ReactNode; - bottomBarProps?: _EuiPageBottomBarProps; -}; - -export interface ObservabilityPageTemplateDependencies { - currentAppId$: Observable; - getUrlForApp: ApplicationStart['getUrlForApp']; - navigateToApp: ApplicationStart['navigateToApp']; - navigationSections$: Observable; - getPageTemplateServices: () => KibanaPageTemplateKibanaDependencies; - guidedOnboardingApi: GuidedOnboardingPluginStart['guidedOnboardingApi']; -} - -export type ObservabilityPageTemplateProps = ObservabilityPageTemplateDependencies & - WrappedPageTemplateProps; - -export function ObservabilityPageTemplate({ - children, - currentAppId$, - getUrlForApp, - navigateToApp, - navigationSections$, - showSolutionNav = true, - isPageDataLoaded = true, - getPageTemplateServices, - bottomBar, - bottomBarProps, - pageSectionProps, - guidedOnboardingApi, - ...pageTemplateProps -}: ObservabilityPageTemplateProps): React.ReactElement | null { - const sections = useObservable(navigationSections$, []); - const currentAppId = useObservable(currentAppId$, undefined); - const { pathname: currentPath } = useLocation(); - - const { services } = useKibana(); - - const sideNavItems = useMemo>>( - () => - sections.map(({ label, entries, isBetaFeature }, sectionIndex) => ({ - id: `${sectionIndex}`, - name: isBetaFeature ? : label, - items: entries.map((entry, entryIndex) => { - const href = getUrlForApp(entry.app, { - path: entry.path, - }); - - const isSelected = - entry.app === currentAppId && - (entry.matchPath - ? entry.matchPath(currentPath) - : matchPath(currentPath, { - path: entry.path, - exact: !!entry.matchFullPath, - strict: !entry.ignoreTrailingSlash, - }) != null); - const badgeLocalStorageId = `observability.nav_item_badge_visible_${entry.app}${entry.path}`; - const navId = entry.label.toLowerCase().split(' ').join('_'); - return { - id: `${sectionIndex}.${entryIndex}`, - name: entry.isBetaFeature ? ( - - ) : entry.isNewFeature ? ( - - ) : entry.isTechnicalPreview ? ( - - ) : ( - entry.label - ), - href, - isSelected, - 'data-nav-id': navId, - 'data-test-subj': `observability-nav-${entry.app}-${navId}`, - onClick: (event) => { - if (entry.onClick) { - entry.onClick(event); - } - - // Hides NEW badge when the item is clicked - if (entry.isNewFeature) { - hideBadge(badgeLocalStorageId); - } - - if ( - event.button !== 0 || - event.defaultPrevented || - event.metaKey || - event.altKey || - event.ctrlKey || - event.shiftKey - ) { - return; - } - - event.preventDefault(); - navigateToApp(entry.app, { - path: entry.path, - }); - }, - }; - }), - })), - [currentAppId, currentPath, getUrlForApp, navigateToApp, sections] - ); - - return ( - - - {({ isTourVisible }) => { - return ( - - - - {children} - - - {bottomBar && ( - - {bottomBar} - - )} - - ); - }} - - - ); -} - -// for lazy import -// eslint-disable-next-line import/no-default-export -export default ObservabilityPageTemplate; - -const sideNavTitle = i18n.translate('xpack.observability.pageLayout.sideNavTitle', { - defaultMessage: 'Observability', -}); diff --git a/x-pack/plugins/observability/public/components/shared/tour/index.ts b/x-pack/plugins/observability/public/components/shared/tour/index.ts deleted file mode 100644 index 45449abf3ed5a..0000000000000 --- a/x-pack/plugins/observability/public/components/shared/tour/index.ts +++ /dev/null @@ -1,8 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -export { ObservabilityTour, observTourStepStorageKey, useObservabilityTourContext } from './tour'; diff --git a/x-pack/plugins/observability/public/components/shared/tour/steps_config.ts b/x-pack/plugins/observability/public/components/shared/tour/steps_config.ts deleted file mode 100644 index 7fbf60ef784e3..0000000000000 --- a/x-pack/plugins/observability/public/components/shared/tour/steps_config.ts +++ /dev/null @@ -1,122 +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 { EuiTourStepProps, ElementTarget } from '@elastic/eui'; - -interface TourStep { - content: string; - anchor: ElementTarget; - anchorPosition: EuiTourStepProps['anchorPosition']; - title: EuiTourStepProps['title']; - dataTestSubj: string; - offset?: number; - imageConfig?: { - name: string; - altText: string; - }; -} - -export const tourStepsConfig: TourStep[] = [ - { - title: i18n.translate('xpack.observability.tour.observabilityOverviewStep.tourTitle', { - defaultMessage: 'Welcome to Elastic Observability', - }), - content: i18n.translate('xpack.observability.tour.observabilityOverviewStep.tourContent', { - defaultMessage: - 'Take a quick tour to learn the benefits of having all of your observability data in one stack.', - }), - anchor: `[id^="SolutionNav"]`, - anchorPosition: 'rightUp', - dataTestSubj: 'overviewStep', - }, - { - title: i18n.translate('xpack.observability.tour.streamStep.tourTitle', { - defaultMessage: 'Tail your logs in real time', - }), - content: i18n.translate('xpack.observability.tour.streamStep.tourContent', { - defaultMessage: - 'Monitor, filter, and inspect log events flowing in from your applications, servers, virtual machines, and containers.', - }), - anchor: `[data-nav-id="stream"]`, - anchorPosition: 'rightUp', - dataTestSubj: 'streamStep', - imageConfig: { - name: 'onboarding_tour_step_logs.gif', - altText: i18n.translate('xpack.observability.tour.streamStep.imageAltText', { - defaultMessage: 'Logs stream demonstration', - }), - }, - }, - { - title: i18n.translate('xpack.observability.tour.metricsExplorerStep.tourTitle', { - defaultMessage: 'Monitor your infrastructure health', - }), - content: i18n.translate('xpack.observability.tour.metricsExplorerStep.tourContent', { - defaultMessage: - 'Stream, group, and visualize metrics from your systems, cloud, network, and other infrastructure sources.', - }), - anchor: `[data-nav-id="metrics_explorer"]`, - anchorPosition: 'rightUp', - dataTestSubj: 'metricsExplorerStep', - imageConfig: { - name: 'onboarding_tour_step_metrics.gif', - altText: i18n.translate('xpack.observability.tour.metricsExplorerStep.imageAltText', { - defaultMessage: 'Metrics explorer demonstration', - }), - }, - }, - { - title: i18n.translate('xpack.observability.tour.servicesStep.tourTitle', { - defaultMessage: 'Identify and resolve application issues', - }), - content: i18n.translate('xpack.observability.tour.servicesStep.tourContent', { - defaultMessage: - 'Find and fix performance problems quickly by collecting detailed information about your services.', - }), - anchor: `[data-nav-id="services"]`, - anchorPosition: 'rightUp', - dataTestSubj: 'servicesStep', - imageConfig: { - name: 'onboarding_tour_step_services.gif', - altText: i18n.translate('xpack.observability.tour.servicesStep.imageAltText', { - defaultMessage: 'Services demonstration', - }), - }, - }, - { - title: i18n.translate('xpack.observability.tour.alertsStep.tourTitle', { - defaultMessage: 'Get notified when something changes', - }), - content: i18n.translate('xpack.observability.tour.alertsStep.tourContent', { - defaultMessage: - 'Define and detect conditions that trigger alerts with third-party platform integrations like email, PagerDuty, and Slack.', - }), - anchor: `[data-nav-id="alerts"]`, - anchorPosition: 'rightUp', - dataTestSubj: 'alertStep', - imageConfig: { - name: 'onboarding_tour_step_alerts.gif', - altText: i18n.translate('xpack.observability.tour.alertsStep.imageAltText', { - defaultMessage: 'Alerts demonstration', - }), - }, - }, - { - title: i18n.translate('xpack.observability.tour.guidedSetupStep.tourTitle', { - defaultMessage: 'Do more with Elastic Observability', - }), - content: i18n.translate('xpack.observability.tour.guidedSetupStep.tourContent', { - defaultMessage: - 'The easiest way to continue with Elastic Observability is to follow recommended next steps in the data assistant.', - }), - anchor: '#guidedSetupButton', - anchorPosition: 'rightUp', - dataTestSubj: 'guidedSetupStep', - offset: 10, - }, -]; diff --git a/x-pack/plugins/observability/public/components/shared/tour/tour.tsx b/x-pack/plugins/observability/public/components/shared/tour/tour.tsx deleted file mode 100644 index b0ef0456ef216..0000000000000 --- a/x-pack/plugins/observability/public/components/shared/tour/tour.tsx +++ /dev/null @@ -1,246 +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 React, { - ReactNode, - useState, - useCallback, - useEffect, - createContext, - useContext, -} from 'react'; - -import { i18n } from '@kbn/i18n'; -import { - EuiButton, - EuiButtonEmpty, - EuiFlexGroup, - EuiFlexItem, - EuiTourStep, - EuiTourStepProps, - EuiImage, - EuiSpacer, - EuiText, - useIsWithinBreakpoints, -} from '@elastic/eui'; -import { useLocation } from 'react-router-dom'; -import { ApplicationStart } from '@kbn/core/public'; -import useObservable from 'react-use/lib/useObservable'; -import { of } from 'rxjs'; -import type { GuidedOnboardingApi } from '@kbn/guided-onboarding-plugin/public/types'; -import { observabilityAppId } from '../../../../common'; -import { tourStepsConfig } from './steps_config'; - -const minWidth: EuiTourStepProps['minWidth'] = 360; -const maxWidth: EuiTourStepProps['maxWidth'] = 360; -const offset: EuiTourStepProps['offset'] = 30; -const repositionOnScroll: EuiTourStepProps['repositionOnScroll'] = true; - -const overviewPath = '/overview'; -const dataAssistantStep = 6; - -export const observTourStepStorageKey = 'guidedOnboarding.observability.tourStep'; - -const getSteps = ({ - activeStep, - incrementStep, - endTour, - prependBasePath, -}: { - activeStep: number; - incrementStep: () => void; - endTour: () => void; - prependBasePath?: (imageName: string) => string; -}) => { - const footerAction = ( - - - endTour()} - size="xs" - color="text" - // Used for testing and to track FS usage - data-test-subj="onboarding--observTourSkipButton" - > - {i18n.translate('xpack.observability.tour.skipButtonLabel', { - defaultMessage: 'Skip tour', - })} - - - - incrementStep()} - size="s" - color="success" - // Used for testing and to track FS usage - data-test-subj="onboarding--observTourNextStepButton" - > - {i18n.translate('xpack.observability.tour.nextButtonLabel', { - defaultMessage: 'Next', - })} - - - - ); - - const lastStepFooterAction = ( - // data-test-subj is used for testing and to track FS usage - endTour()} - data-test-subj="onboarding--observTourEndButton" - > - {i18n.translate('xpack.observability.tour.endButtonLabel', { - defaultMessage: 'End tour', - })} - - ); - - return tourStepsConfig.map((stepConfig, index) => { - const step = index + 1; - const { dataTestSubj, content, offset: stepOffset, imageConfig, ...tourStepProps } = stepConfig; - return ( - endTour()} - footerAction={activeStep === tourStepsConfig.length ? lastStepFooterAction : footerAction} - panelProps={{ - 'data-test-subj': dataTestSubj, - }} - content={ - <> - -

{content}

-
- {imageConfig && prependBasePath && ( - <> - - - - )} - - } - /> - ); - }); -}; - -export interface ObservabilityTourContextValue { - endTour: () => void; - isTourVisible: boolean; -} - -const ObservabilityTourContext = createContext({ - endTour: () => {}, - isTourVisible: false, -} as ObservabilityTourContextValue); - -export function ObservabilityTour({ - children, - navigateToApp, - isPageDataLoaded, - showTour, - prependBasePath, - guidedOnboardingApi, -}: { - children: ({ isTourVisible }: { isTourVisible: boolean }) => ReactNode; - navigateToApp: ApplicationStart['navigateToApp']; - isPageDataLoaded: boolean; - showTour: boolean; - prependBasePath?: (imageName: string) => string; - guidedOnboardingApi?: GuidedOnboardingApi; -}) { - const prevActiveStep = localStorage.getItem(observTourStepStorageKey); - const initialActiveStep = prevActiveStep === null ? 1 : Number(prevActiveStep); - - const isGuidedOnboardingActive = useObservable( - // if guided onboarding is not available, return false - guidedOnboardingApi - ? guidedOnboardingApi.isGuideStepActive$('kubernetes', 'tour_observability') - : of(false) - ); - - const [isTourActive, setIsTourActive] = useState(false); - const [activeStep, setActiveStep] = useState(initialActiveStep); - - const { pathname: currentPath } = useLocation(); - - const isSmallBreakpoint = useIsWithinBreakpoints(['s']); - - const isOverviewPage = currentPath === overviewPath; - - const incrementStep = useCallback(() => { - setActiveStep((prevState) => prevState + 1); - }, []); - - const endTour = useCallback(async () => { - // Mark the onboarding guide step as complete - if (guidedOnboardingApi) { - await guidedOnboardingApi.completeGuideStep('kubernetes', 'tour_observability'); - } - // Reset EuiTour step state - setActiveStep(1); - }, [guidedOnboardingApi]); - - /** - * The tour should only be visible if the following conditions are met: - * - Only pages with the side nav should show the tour (showTour === true) - * - Tour is set to active per the guided onboarding service (isTourActive === true) - * - Any page data must be loaded in order for the tour to render correctly - * - The tour should only render on medium-large screens - */ - const isTourVisible = showTour && isTourActive && isPageDataLoaded && isSmallBreakpoint === false; - - const context: ObservabilityTourContextValue = { endTour, isTourVisible }; - - useEffect(() => { - localStorage.setItem(observTourStepStorageKey, String(activeStep)); - }, [activeStep]); - - useEffect(() => { - setIsTourActive(Boolean(isGuidedOnboardingActive)); - }, [isGuidedOnboardingActive]); - - useEffect(() => { - // The user must be on the overview page to view the data assistant step in the tour - if (isTourActive && isOverviewPage === false && activeStep === dataAssistantStep) { - navigateToApp(observabilityAppId, { - path: overviewPath, - }); - } - }, [activeStep, isOverviewPage, isTourActive, navigateToApp]); - - return ( - - <> - {children({ isTourVisible })} - {isTourVisible && getSteps({ activeStep, incrementStep, endTour, prependBasePath })} - - - ); -} - -export const useObservabilityTourContext = (): ObservabilityTourContextValue => { - const ctx = useContext(ObservabilityTourContext); - if (!ctx) { - throw new Error('useObservabilityTourContext can only be called inside of TourContext'); - } - return ctx; -}; diff --git a/x-pack/plugins/observability/public/components/shared/types.ts b/x-pack/plugins/observability/public/components/shared/types.ts deleted file mode 100644 index 856a534a107f1..0000000000000 --- a/x-pack/plugins/observability/public/components/shared/types.ts +++ /dev/null @@ -1,25 +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 { ReactNode } from 'react'; -import { AppMountParameters } from '@kbn/core/public'; -import { UXMetrics } from './core_web_vitals'; - -export interface HeaderMenuPortalProps { - children: ReactNode; - setHeaderActionMenu: AppMountParameters['setHeaderActionMenu']; - theme$: AppMountParameters['theme$']; -} - -export interface CoreVitalProps { - loading: boolean; - data?: UXMetrics | null; - displayServiceName?: boolean; - serviceName?: string; - totalPageViews?: number; - displayTrafficMetric?: boolean; -} diff --git a/x-pack/plugins/observability/public/context/date_picker_context.tsx b/x-pack/plugins/observability/public/context/date_picker_context/date_picker_context.tsx similarity index 98% rename from x-pack/plugins/observability/public/context/date_picker_context.tsx rename to x-pack/plugins/observability/public/context/date_picker_context/date_picker_context.tsx index c1bcc80e29e49..b31b48456a564 100644 --- a/x-pack/plugins/observability/public/context/date_picker_context.tsx +++ b/x-pack/plugins/observability/public/context/date_picker_context/date_picker_context.tsx @@ -10,8 +10,8 @@ import useMount from 'react-use/lib/useMount'; import { useLocation, useHistory } from 'react-router-dom'; import { parse } from 'query-string'; import { useKibana } from '@kbn/kibana-react-plugin/public'; -import { fromQuery, ObservabilityPublicPluginsStart, toQuery } from '..'; -import { getAbsoluteTime } from '../utils/date'; +import { fromQuery, ObservabilityPublicPluginsStart, toQuery } from '../..'; +import { getAbsoluteTime } from '../../utils/date'; export interface DatePickerContextValue { relativeStart: string; diff --git a/x-pack/plugins/observability/public/data_handler.test.ts b/x-pack/plugins/observability/public/context/has_data_context/data_handler.test.ts similarity index 99% rename from x-pack/plugins/observability/public/data_handler.test.ts rename to x-pack/plugins/observability/public/context/has_data_context/data_handler.test.ts index 736fd3d968bda..3b739ae54328c 100644 --- a/x-pack/plugins/observability/public/data_handler.test.ts +++ b/x-pack/plugins/observability/public/context/has_data_context/data_handler.test.ts @@ -7,7 +7,7 @@ import { registerDataHandler, getDataHandler } from './data_handler'; import moment from 'moment'; -import { ApmIndicesConfig } from '../common/typings'; +import { ApmIndicesConfig } from '../../../common/typings'; const sampleAPMIndices = { transaction: 'apm-*' } as ApmIndicesConfig; diff --git a/x-pack/plugins/observability/public/data_handler.ts b/x-pack/plugins/observability/public/context/has_data_context/data_handler.ts similarity index 90% rename from x-pack/plugins/observability/public/data_handler.ts rename to x-pack/plugins/observability/public/context/has_data_context/data_handler.ts index c9866ba09e371..ea2dd534019a0 100644 --- a/x-pack/plugins/observability/public/data_handler.ts +++ b/x-pack/plugins/observability/public/context/has_data_context/data_handler.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { DataHandler, ObservabilityFetchDataPlugins } from './typings/fetch_overview_data'; +import { DataHandler, ObservabilityFetchDataPlugins } from '../../typings/fetch_overview_data'; const dataHandlers: Partial> = {}; diff --git a/x-pack/plugins/observability/public/services/get_observability_alerts.test.ts b/x-pack/plugins/observability/public/context/has_data_context/get_observability_alerts.test.ts similarity index 100% rename from x-pack/plugins/observability/public/services/get_observability_alerts.test.ts rename to x-pack/plugins/observability/public/context/has_data_context/get_observability_alerts.test.ts diff --git a/x-pack/plugins/observability/public/services/get_observability_alerts.ts b/x-pack/plugins/observability/public/context/has_data_context/get_observability_alerts.ts similarity index 100% rename from x-pack/plugins/observability/public/services/get_observability_alerts.ts rename to x-pack/plugins/observability/public/context/has_data_context/get_observability_alerts.ts diff --git a/x-pack/plugins/observability/public/context/has_data_context.test.tsx b/x-pack/plugins/observability/public/context/has_data_context/has_data_context.test.tsx similarity index 98% rename from x-pack/plugins/observability/public/context/has_data_context.test.tsx rename to x-pack/plugins/observability/public/context/has_data_context/has_data_context.test.tsx index 6d6a99e9b8642..d3f62ab50a22d 100644 --- a/x-pack/plugins/observability/public/context/has_data_context.test.tsx +++ b/x-pack/plugins/observability/public/context/has_data_context/has_data_context.test.tsx @@ -9,13 +9,13 @@ import React from 'react'; import { renderHook } from '@testing-library/react-hooks'; import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; import { coreMock } from '@kbn/core/public/mocks'; -import { registerDataHandler, unregisterDataHandler } from '../data_handler'; -import { useHasData } from '../hooks/use_has_data'; -import { HasData, ObservabilityFetchDataPlugins } from '../typings/fetch_overview_data'; +import { registerDataHandler, unregisterDataHandler } from './data_handler'; +import { useHasData } from '../../hooks/use_has_data'; +import { HasData, ObservabilityFetchDataPlugins } from '../../typings/fetch_overview_data'; import { HasDataContextProvider } from './has_data_context'; import { Router } from 'react-router-dom'; import { createMemoryHistory } from 'history'; -import { ApmIndicesConfig } from '../../common/typings'; +import { ApmIndicesConfig } from '../../../common/typings'; import { act } from '@testing-library/react'; const sampleAPMIndices = { transaction: 'apm-*' } as ApmIndicesConfig; diff --git a/x-pack/plugins/observability/public/context/has_data_context.tsx b/x-pack/plugins/observability/public/context/has_data_context/has_data_context.tsx similarity index 91% rename from x-pack/plugins/observability/public/context/has_data_context.tsx rename to x-pack/plugins/observability/public/context/has_data_context/has_data_context.tsx index dda9ca4ef37fe..e72bb0887b717 100644 --- a/x-pack/plugins/observability/public/context/has_data_context.tsx +++ b/x-pack/plugins/observability/public/context/has_data_context/has_data_context.tsx @@ -10,6 +10,7 @@ import React, { createContext, useEffect, useState } from 'react'; import { useRouteMatch } from 'react-router-dom'; import { asyncForEach } from '@kbn/std'; import { useKibana } from '@kbn/kibana-react-plugin/public'; +import { FETCH_STATUS } from '@kbn/observability-shared-plugin/public'; import { ALERT_APP, APM_APP, @@ -17,14 +18,13 @@ import { INFRA_METRICS_APP, UPTIME_APP, UX_APP, -} from './constants'; -import { getDataHandler } from '../data_handler'; -import { FETCH_STATUS } from '../hooks/use_fetcher'; -import { useDatePickerContext } from '../hooks/use_date_picker_context'; -import { getObservabilityAlerts } from '../services/get_observability_alerts'; -import { ObservabilityFetchDataPlugins } from '../typings/fetch_overview_data'; -import { ApmIndicesConfig } from '../../common/typings'; -import { ObservabilityAppServices } from '../application/types'; +} from '../constants'; +import { getDataHandler } from './data_handler'; +import { useDatePickerContext } from '../../hooks/use_date_picker_context'; +import { getObservabilityAlerts } from './get_observability_alerts'; +import { ObservabilityFetchDataPlugins } from '../../typings/fetch_overview_data'; +import { ApmIndicesConfig } from '../../../common/typings'; +import { ObservabilityAppServices } from '../../application/types'; type DataContextApps = ObservabilityFetchDataPlugins | 'alert'; diff --git a/x-pack/plugins/observability/public/context/inspector/inspector_context.tsx b/x-pack/plugins/observability/public/context/inspector/inspector_context.tsx deleted file mode 100644 index b5bc254dd6308..0000000000000 --- a/x-pack/plugins/observability/public/context/inspector/inspector_context.tsx +++ /dev/null @@ -1,84 +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 React, { createContext, ReactNode, useEffect } from 'react'; -import { useHistory } from 'react-router-dom'; -import { RequestAdapter } from '@kbn/inspector-plugin/common'; -import { FetcherResult } from '../../hooks/use_fetcher'; -import { InspectResponse } from '../../../typings/common'; - -export interface InspectorContextValue { - addInspectorRequest: (result: FetcherResult) => void; - inspectorAdapters: { requests: RequestAdapter }; -} - -const value: InspectorContextValue = { - addInspectorRequest: () => {}, - inspectorAdapters: { requests: new RequestAdapter() }, -}; - -export const InspectorContext = createContext(value); - -export type AddInspectorRequest = ( - result: FetcherResult<{ - mainStatisticsData?: { _inspect?: InspectResponse }; - _inspect?: InspectResponse; - }> -) => void; - -export function InspectorContextProvider({ children }: { children: ReactNode }) { - const history = useHistory(); - const { inspectorAdapters } = value; - - function addInspectorRequest( - result: FetcherResult<{ - mainStatisticsData?: { _inspect?: InspectResponse }; - _inspect?: InspectResponse; - }> - ) { - const operations = result.data?._inspect ?? result.data?.mainStatisticsData?._inspect ?? []; - - operations.forEach((operation) => { - if (operation.response) { - const { id, name } = operation; - const requestParams = { id, name }; - - const requestResponder = inspectorAdapters.requests.start( - id, - requestParams, - operation.startTime - ); - - requestResponder.json(operation.json as object); - - if (operation.stats) { - requestResponder.stats(operation.stats); - } - - requestResponder.finish(operation.status, operation.response); - } - }); - } - - useEffect(() => { - const unregisterCallback = history.listen((newLocation) => { - if (history.location.pathname !== newLocation.pathname) { - inspectorAdapters.requests.reset(); - } - }); - - return () => { - unregisterCallback(); - }; - }, [history, inspectorAdapters]); - - return ( - - {children} - - ); -} diff --git a/x-pack/plugins/observability/public/context/inspector/use_inspector_context.tsx b/x-pack/plugins/observability/public/context/inspector/use_inspector_context.tsx deleted file mode 100644 index a60ed6c8c72e1..0000000000000 --- a/x-pack/plugins/observability/public/context/inspector/use_inspector_context.tsx +++ /dev/null @@ -1,13 +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 { useContext } from 'react'; -import { InspectorContext } from './inspector_context'; - -export function useInspectorContext() { - return useContext(InspectorContext); -} diff --git a/x-pack/plugins/observability/public/context/plugin_context.tsx b/x-pack/plugins/observability/public/context/plugin_context/plugin_context.tsx similarity index 72% rename from x-pack/plugins/observability/public/context/plugin_context.tsx rename to x-pack/plugins/observability/public/context/plugin_context/plugin_context.tsx index 2912fe967cab0..d9ae99760a7ad 100644 --- a/x-pack/plugins/observability/public/context/plugin_context.tsx +++ b/x-pack/plugins/observability/public/context/plugin_context/plugin_context.tsx @@ -7,9 +7,9 @@ import { AppMountParameters } from '@kbn/core/public'; import { createContext } from 'react'; -import { ObservabilityRuleTypeRegistry } from '../rules/create_observability_rule_type_registry'; -import type { LazyObservabilityPageTemplateProps } from '../components/shared/page_template/lazy_page_template'; -import { ConfigSchema } from '../plugin'; +import type { LazyObservabilityPageTemplateProps } from '@kbn/observability-shared-plugin/public'; +import { ObservabilityRuleTypeRegistry } from '../../rules/create_observability_rule_type_registry'; +import { ConfigSchema } from '../../plugin'; export interface PluginContextValue { config: ConfigSchema; diff --git a/x-pack/plugins/observability/public/hooks/create_use_rules_link.ts b/x-pack/plugins/observability/public/hooks/create_use_rules_link.ts index 2fd7eee21bce9..5d50efa31a0bf 100644 --- a/x-pack/plugins/observability/public/hooks/create_use_rules_link.ts +++ b/x-pack/plugins/observability/public/hooks/create_use_rules_link.ts @@ -4,11 +4,11 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { Options, useLinkProps } from './use_link_props'; +import { UseLinkPropsOptions, useLinkProps } from '@kbn/observability-shared-plugin/public'; export const createUseRulesLink = () => - (options: Options = {}) => { + (options: UseLinkPropsOptions = {}) => { const linkProps = { app: 'observability', pathname: '/alerts/rules', diff --git a/x-pack/plugins/observability/public/hooks/use_alert_permission.test.ts b/x-pack/plugins/observability/public/hooks/use_alert_permission.test.ts deleted file mode 100644 index f3111328edbea..0000000000000 --- a/x-pack/plugins/observability/public/hooks/use_alert_permission.test.ts +++ /dev/null @@ -1,108 +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 { getAlertsPermissions, useGetUserAlertsPermissions } from './use_alert_permission'; -import { applicationServiceMock } from '@kbn/core/public/mocks'; -import { renderHook } from '@testing-library/react-hooks'; - -describe('getAlertsPermissions', () => { - it('returns a fallback when featureId is nullish or missing from capabilities', () => { - const { capabilities } = applicationServiceMock.createStartContract(); - - expect(getAlertsPermissions(capabilities, '')).toEqual({ - crud: false, - read: false, - loading: false, - featureId: '', - }); - - expect(getAlertsPermissions(capabilities, 'abc')).toEqual({ - crud: false, - read: false, - loading: false, - featureId: 'abc', - }); - }); - - it('returns proper permissions when featureId is a key in capabilities', () => { - const capabilities = Object.assign( - {}, - applicationServiceMock.createStartContract().capabilities, - { - apm: { 'alerting:save': false, 'alerting:show': true, loading: true }, - uptime: { loading: true, save: true, show: true }, - } - ); - - expect(getAlertsPermissions(capabilities, 'uptime')).toEqual({ - crud: true, - read: true, - loading: false, - featureId: 'uptime', - }); - - expect(getAlertsPermissions(capabilities, 'apm')).toEqual({ - crud: false, - read: true, - loading: false, - featureId: 'apm', - }); - }); -}); - -describe('useGetUserAlertPermissions', function () { - const timeout = 1_000; - - it( - 'updates permissions when featureId changes', - async function () { - const capabilities = Object.assign( - {}, - applicationServiceMock.createStartContract().capabilities, - { - apm: { 'alerting:save': false, 'alerting:show': true }, - uptime: { save: true, show: true }, - } - ); - - const { result, rerender } = renderHook( - ({ featureId }) => useGetUserAlertsPermissions(capabilities, featureId), - { - initialProps: { featureId: 'uptime' }, - } - ); - expect(result.current.read).toBe(true); - expect(result.current.crud).toBe(true); - - rerender({ featureId: 'apm' }); - expect(result.current.read).toBe(true); - expect(result.current.crud).toBe(false); - }, - timeout - ); - - it( - 'returns default permissions when permissions for featureId are missing', - async function () { - const { capabilities } = applicationServiceMock.createStartContract(); - - const { result } = renderHook( - ({ featureId }) => useGetUserAlertsPermissions(capabilities, featureId), - { - initialProps: { featureId: 'uptime' }, - } - ); - expect(result.current).toEqual({ - crud: false, - read: false, - loading: false, - featureId: null, - }); - }, - timeout - ); -}); diff --git a/x-pack/plugins/observability/public/hooks/use_alert_permission.ts b/x-pack/plugins/observability/public/hooks/use_alert_permission.ts deleted file mode 100644 index 8669f187dc975..0000000000000 --- a/x-pack/plugins/observability/public/hooks/use_alert_permission.ts +++ /dev/null @@ -1,74 +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 { useEffect, useState } from 'react'; -import { RecursiveReadonly } from '@kbn/utility-types'; -import { Capabilities } from '@kbn/core/types'; - -export interface UseGetUserAlertsPermissionsProps { - crud: boolean; - read: boolean; - loading?: boolean; - featureId: string | null; -} - -export const getAlertsPermissions = ( - uiCapabilities: RecursiveReadonly, - featureId: string -) => { - if (!featureId || !uiCapabilities[featureId]) { - return { - crud: false, - read: false, - loading: false, - featureId, - }; - } - - return { - crud: (featureId === 'apm' - ? uiCapabilities[featureId]['alerting:save'] - : uiCapabilities[featureId].save) as boolean, - read: (featureId === 'apm' - ? uiCapabilities[featureId]['alerting:show'] - : uiCapabilities[featureId].show) as boolean, - loading: false, - featureId, - }; -}; - -export const useGetUserAlertsPermissions = ( - uiCapabilities: RecursiveReadonly, - featureId?: string -): UseGetUserAlertsPermissionsProps => { - const [alertsPermissions, setAlertsPermissions] = useState({ - crud: false, - read: false, - loading: true, - featureId: null, - }); - - useEffect(() => { - if (!featureId || !uiCapabilities[featureId]) { - setAlertsPermissions({ - crud: false, - read: false, - loading: false, - featureId: null, - }); - } else { - setAlertsPermissions((currentAlertPermissions) => { - if (currentAlertPermissions.featureId === featureId) { - return currentAlertPermissions; - } - return getAlertsPermissions(uiCapabilities, featureId); - }); - } - }, [alertsPermissions.featureId, featureId, uiCapabilities]); - - return alertsPermissions; -}; diff --git a/x-pack/plugins/observability/public/hooks/use_breadcrumbs.test.tsx b/x-pack/plugins/observability/public/hooks/use_breadcrumbs.test.tsx deleted file mode 100644 index 08778d8bc3a4d..0000000000000 --- a/x-pack/plugins/observability/public/hooks/use_breadcrumbs.test.tsx +++ /dev/null @@ -1,116 +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 { renderHook } from '@testing-library/react-hooks'; -import React, { ReactNode } from 'react'; -import { MemoryRouter } from 'react-router-dom'; -import { CoreStart } from '@kbn/core/public'; -import { createKibanaReactContext } from '@kbn/kibana-react-plugin/public'; -import { useBreadcrumbs } from './use_breadcrumbs'; - -const setBreadcrumbs = jest.fn(); -const setTitle = jest.fn(); -const kibanaServices = { - application: { getUrlForApp: () => {}, navigateToApp: () => {} }, - chrome: { setBreadcrumbs, docTitle: { change: setTitle } }, - uiSettings: { get: () => true }, -} as unknown as Partial; -const KibanaContext = createKibanaReactContext(kibanaServices); - -function Wrapper({ children }: { children?: ReactNode }) { - return ( - - {children} - - ); -} - -describe('useBreadcrumbs', () => { - afterEach(() => { - setBreadcrumbs.mockClear(); - setTitle.mockClear(); - }); - - describe('when setBreadcrumbs and setTitle are not defined', () => { - it('does not set breadcrumbs or the title', () => { - renderHook(() => useBreadcrumbs([]), { - wrapper: ({ children }) => ( - - - } - > - {children} - - - ), - }); - - expect(setBreadcrumbs).not.toHaveBeenCalled(); - expect(setTitle).not.toHaveBeenCalled(); - }); - }); - - describe('with an empty array', () => { - it('sets the overview breadcrumb', () => { - renderHook(() => useBreadcrumbs([]), { wrapper: Wrapper }); - - expect(setBreadcrumbs).toHaveBeenCalledWith([ - { href: '/overview', onClick: expect.any(Function), text: 'Observability' }, - ]); - }); - - it('sets the overview title', () => { - renderHook(() => useBreadcrumbs([]), { wrapper: Wrapper }); - - expect(setTitle).toHaveBeenCalledWith(['Observability']); - }); - }); - - describe('given breadcrumbs', () => { - it('sets the breadcrumbs', () => { - renderHook( - () => - useBreadcrumbs([ - { text: 'One', href: '/one' }, - { - text: 'Two', - }, - ]), - { wrapper: Wrapper } - ); - - expect(setBreadcrumbs).toHaveBeenCalledWith([ - { href: '/overview', onClick: expect.any(Function), text: 'Observability' }, - { - href: '/one', - onClick: expect.any(Function), - text: 'One', - }, - { - text: 'Two', - }, - ]); - }); - - it('sets the title', () => { - renderHook( - () => - useBreadcrumbs([ - { text: 'One', href: '/one' }, - { - text: 'Two', - }, - ]), - { wrapper: Wrapper } - ); - - expect(setTitle).toHaveBeenCalledWith(['Two', 'One', 'Observability']); - }); - }); -}); diff --git a/x-pack/plugins/observability/public/hooks/use_breadcrumbs.ts b/x-pack/plugins/observability/public/hooks/use_breadcrumbs.ts deleted file mode 100644 index fe828ca663abd..0000000000000 --- a/x-pack/plugins/observability/public/hooks/use_breadcrumbs.ts +++ /dev/null @@ -1,71 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { i18n } from '@kbn/i18n'; -import { ChromeBreadcrumb } from '@kbn/core/public'; -import { MouseEvent, useEffect } from 'react'; -import { useKibana } from '../utils/kibana_react'; -import { useQueryParams } from './use_query_params'; - -function addClickHandlers( - breadcrumbs: ChromeBreadcrumb[], - navigateToHref?: (url: string) => Promise -) { - return breadcrumbs.map((bc) => ({ - ...bc, - ...(bc.href - ? { - onClick: (event: MouseEvent) => { - if (navigateToHref && bc.href) { - event.preventDefault(); - navigateToHref(bc.href); - } - }, - } - : {}), - })); -} - -function getTitleFromBreadCrumbs(breadcrumbs: ChromeBreadcrumb[]) { - return breadcrumbs.map(({ text }) => text?.toString() ?? '').reverse(); -} - -export const useBreadcrumbs = ( - extraCrumbs: ChromeBreadcrumb[], - app?: { id: string; label: string } -) => { - const params = useQueryParams(); - - const { - services: { - chrome: { docTitle, setBreadcrumbs }, - application: { getUrlForApp, navigateToUrl }, - }, - } = useKibana(); - const setTitle = docTitle.change; - const appPath = getUrlForApp(app?.id ?? 'observability-overview') ?? ''; - - useEffect(() => { - const breadcrumbs = [ - { - text: - app?.label ?? - i18n.translate('xpack.observability.breadcrumbs.observabilityLinkText', { - defaultMessage: 'Observability', - }), - href: appPath + '/overview', - }, - ...extraCrumbs, - ]; - if (setBreadcrumbs) { - setBreadcrumbs(addClickHandlers(breadcrumbs, navigateToUrl)); - } - if (setTitle) { - setTitle(getTitleFromBreadCrumbs(breadcrumbs)); - } - }, [app?.label, appPath, extraCrumbs, navigateToUrl, params, setBreadcrumbs, setTitle]); -}; diff --git a/x-pack/plugins/observability/public/hooks/use_chart_theme.tsx b/x-pack/plugins/observability/public/hooks/use_chart_theme.tsx deleted file mode 100644 index 87e9e61036a71..0000000000000 --- a/x-pack/plugins/observability/public/hooks/use_chart_theme.tsx +++ /dev/null @@ -1,42 +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 { PartialTheme } from '@elastic/charts'; -import { EUI_CHARTS_THEME_DARK, EUI_CHARTS_THEME_LIGHT } from '@elastic/eui/dist/eui_charts_theme'; -import { useMemo } from 'react'; -import { useTheme } from './use_theme'; - -export function useChartTheme(): PartialTheme[] { - const theme = useTheme(); - const baseChartTheme = theme.darkMode - ? EUI_CHARTS_THEME_DARK.theme - : EUI_CHARTS_THEME_LIGHT.theme; - - return useMemo( - () => [ - { - chartMargins: { - left: 10, - right: 10, - top: 35, - bottom: 10, - }, - background: { - color: 'transparent', - }, - lineSeriesStyle: { - point: { visible: false }, - }, - areaSeriesStyle: { - point: { visible: false }, - }, - }, - baseChartTheme, - ], - [baseChartTheme] - ); -} diff --git a/x-pack/plugins/observability/public/hooks/use_date_picker_context.ts b/x-pack/plugins/observability/public/hooks/use_date_picker_context.ts index e4d42d4e25f32..82af5d5443981 100644 --- a/x-pack/plugins/observability/public/hooks/use_date_picker_context.ts +++ b/x-pack/plugins/observability/public/hooks/use_date_picker_context.ts @@ -6,7 +6,7 @@ */ import { useContext } from 'react'; -import { DatePickerContext } from '../context/date_picker_context'; +import { DatePickerContext } from '../context/date_picker_context/date_picker_context'; export function useDatePickerContext() { return useContext(DatePickerContext); diff --git a/x-pack/plugins/observability/public/hooks/use_es_search.ts b/x-pack/plugins/observability/public/hooks/use_es_search.ts deleted file mode 100644 index 63aa23c251470..0000000000000 --- a/x-pack/plugins/observability/public/hooks/use_es_search.ts +++ /dev/null @@ -1,118 +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 * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; -import { DataPublicPluginStart } from '@kbn/data-plugin/public'; -import type { ESSearchResponse } from '@kbn/es-types'; -import { useKibana } from '@kbn/kibana-react-plugin/public'; -import { IInspectorInfo, isCompleteResponse, isErrorResponse } from '@kbn/data-plugin/common'; -import { FETCH_STATUS, useFetcher } from './use_fetcher'; -import { useInspectorContext } from '../context/inspector/use_inspector_context'; -import { getInspectResponse } from '../../common/utils/get_inspect_response'; - -export const useEsSearch = ( - params: TParams, - fnDeps: any[], - options: { inspector?: IInspectorInfo; name: string } -) => { - const { - services: { data }, - } = useKibana<{ data: DataPublicPluginStart }>(); - - const { name } = options ?? {}; - - const { addInspectorRequest } = useInspectorContext(); - - const { data: response = {}, loading } = useFetcher(() => { - if (params.index) { - const startTime = Date.now(); - return new Promise((resolve) => { - const search$ = data.search - .search( - { - params, - }, - { - legacyHitsTotal: false, - } - ) - .subscribe({ - next: (result) => { - if (isCompleteResponse(result)) { - if (addInspectorRequest) { - addInspectorRequest({ - data: { - _inspect: [ - getInspectResponse({ - startTime, - esRequestParams: params, - esResponse: result.rawResponse, - esError: null, - esRequestStatus: 1, - operationName: name, - kibanaRequest: { - route: { - path: '/internal/bsearch', - method: 'POST', - }, - } as any, - }), - ], - }, - status: FETCH_STATUS.SUCCESS, - }); - } - // Final result - resolve(result); - search$.unsubscribe(); - } - }, - error: (err) => { - if (isErrorResponse(err)) { - console.error(err); - if (addInspectorRequest) { - addInspectorRequest({ - data: { - _inspect: [ - getInspectResponse({ - startTime, - esRequestParams: params, - esResponse: null, - esError: { originalError: err, name: err.name, message: err.message }, - esRequestStatus: 2, - operationName: name, - kibanaRequest: { - route: { - path: '/internal/bsearch', - method: 'POST', - }, - } as any, - }), - ], - }, - status: FETCH_STATUS.SUCCESS, - }); - } - } - }, - }); - }); - } - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [...fnDeps]); - - const { rawResponse } = response as any; - - return { - data: rawResponse as ESSearchResponse, - loading: Boolean(loading), - }; -}; - -export function createEsParams(params: T): T { - return params; -} diff --git a/x-pack/plugins/observability/public/hooks/use_fetch_alert_detail.test.ts b/x-pack/plugins/observability/public/hooks/use_fetch_alert_detail.test.ts index 479a77f7e5bc6..5139fc5a0a1e7 100644 --- a/x-pack/plugins/observability/public/hooks/use_fetch_alert_detail.test.ts +++ b/x-pack/plugins/observability/public/hooks/use_fetch_alert_detail.test.ts @@ -9,7 +9,7 @@ import { act, renderHook } from '@testing-library/react-hooks'; import { kibanaStartMock } from '../utils/kibana_react.mock'; import * as pluginContext from './use_plugin_context'; import { createObservabilityRuleTypeRegistryMock } from '..'; -import { PluginContextValue } from '../context/plugin_context'; +import { PluginContextValue } from '../context/plugin_context/plugin_context'; import { useFetchAlertDetail } from './use_fetch_alert_detail'; import type { TopAlert } from '../typings/alerts'; diff --git a/x-pack/plugins/observability/public/hooks/use_fetcher.tsx b/x-pack/plugins/observability/public/hooks/use_fetcher.tsx deleted file mode 100644 index 9592f0ede76dd..0000000000000 --- a/x-pack/plugins/observability/public/hooks/use_fetcher.tsx +++ /dev/null @@ -1,116 +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 { useEffect, useState, useMemo } from 'react'; - -export enum FETCH_STATUS { - LOADING = 'loading', - SUCCESS = 'success', - FAILURE = 'failure', - PENDING = 'pending', - NOT_INITIATED = 'not_initiated', -} - -export interface FetcherResult { - data?: Data; - status: FETCH_STATUS; - error?: Error; - loading?: boolean; -} - -// fetcher functions can return undefined OR a promise. Previously we had a more simple type -// but it led to issues when using object destructuring with default values -type InferResponseType = Exclude extends Promise - ? TResponseType - : unknown; - -export function useFetcher( - fn: ({}: { signal: AbortSignal }) => TReturn, - fnDeps: any[], - options: { - preservePreviousData?: boolean; - } = {} -): FetcherResult> & { refetch: () => void } { - const { preservePreviousData = true } = options; - - const [result, setResult] = useState>>({ - data: undefined, - status: FETCH_STATUS.PENDING, - loading: true, - }); - const [counter, setCounter] = useState(0); - useEffect(() => { - let controller: AbortController = new AbortController(); - - async function doFetch() { - controller.abort(); - - controller = new AbortController(); - - const signal = controller.signal; - - const promise = fn({ signal }); - if (!promise) { - setResult((prevResult) => ({ - ...prevResult, - status: FETCH_STATUS.NOT_INITIATED, - })); - return; - } - - setResult((prevResult) => ({ - data: preservePreviousData ? prevResult.data : undefined, - status: FETCH_STATUS.LOADING, - error: undefined, - loading: true, - })); - - try { - const data = await promise; - // when http fetches are aborted, the promise will be rejected - // and this code is never reached. For async operations that are - // not cancellable, we need to check whether the signal was - // aborted before updating the result. - if (!signal.aborted) { - setResult({ - data, - loading: false, - status: FETCH_STATUS.SUCCESS, - error: undefined, - } as FetcherResult>); - } - } catch (e) { - if (!signal.aborted) { - setResult((prevResult) => ({ - data: preservePreviousData ? prevResult.data : undefined, - status: FETCH_STATUS.FAILURE, - error: e, - loading: false, - })); - } - } - } - - doFetch(); - - return () => { - controller.abort(); - }; - // eslint-disable-next-line react-hooks/exhaustive-deps - }, [counter, ...fnDeps]); - - return useMemo(() => { - return { - ...result, - loading: result.status === FETCH_STATUS.LOADING || result.status === FETCH_STATUS.PENDING, - refetch: () => { - // this will invalidate the deps to `useEffect` and will result in a new request - setCounter((count) => count + 1); - }, - }; - }, [result]); -} diff --git a/x-pack/plugins/observability/public/hooks/use_has_data.ts b/x-pack/plugins/observability/public/hooks/use_has_data.ts index b26b44116a395..a00691094f0ba 100644 --- a/x-pack/plugins/observability/public/hooks/use_has_data.ts +++ b/x-pack/plugins/observability/public/hooks/use_has_data.ts @@ -6,7 +6,7 @@ */ import { useContext } from 'react'; -import { HasDataContext } from '../context/has_data_context'; +import { HasDataContext } from '../context/has_data_context/has_data_context'; export function useHasData() { return useContext(HasDataContext); diff --git a/x-pack/plugins/observability/public/hooks/use_kibana_space.tsx b/x-pack/plugins/observability/public/hooks/use_kibana_space.tsx deleted file mode 100644 index 8f2ebf187dc77..0000000000000 --- a/x-pack/plugins/observability/public/hooks/use_kibana_space.tsx +++ /dev/null @@ -1,27 +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 { Space } from '@kbn/spaces-plugin/common'; -import { useKibana } from '@kbn/kibana-react-plugin/public'; -import { ObservabilityPublicPluginsStart, useFetcher } from '..'; - -export const useKibanaSpace = () => { - const { services } = useKibana(); - - const { - data: space, - loading, - error, - } = useFetcher | undefined>(() => { - return services.spaces?.getActiveSpace(); - }, [services.spaces]); - - return { - space, - loading, - error, - }; -}; diff --git a/x-pack/plugins/observability/public/hooks/use_link_props.test.tsx b/x-pack/plugins/observability/public/hooks/use_link_props.test.tsx deleted file mode 100644 index 43650406cc929..0000000000000 --- a/x-pack/plugins/observability/public/hooks/use_link_props.test.tsx +++ /dev/null @@ -1,183 +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 { renderHook } from '@testing-library/react-hooks'; -import { createMemoryHistory } from 'history'; -import React, { PropsWithChildren } from 'react'; -import { Router } from 'react-router-dom'; -import { encode } from '@kbn/rison'; -import { coreMock } from '@kbn/core/public/mocks'; -import { CoreScopedHistory } from '@kbn/core/public'; -import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; -import { LinkDescriptor, useLinkProps } from './use_link_props'; - -const PREFIX = '/test-basepath/s/test-space/app/'; - -const coreStartMock = coreMock.createStart(); - -coreStartMock.application.getUrlForApp.mockImplementation((app, options) => { - return `${PREFIX}${app}${options?.path}`; -}); - -const INTERNAL_APP = 'metrics'; - -const history = createMemoryHistory(); -history.push(`${PREFIX}${INTERNAL_APP}`); -const scopedHistory = new CoreScopedHistory(history, `${PREFIX}${INTERNAL_APP}`); - -function ProviderWrapper({ children }: PropsWithChildren<{}>) { - return ( - - {children}; - - ); -} - -const renderUseLinkPropsHook = (props?: Partial) => { - return renderHook(() => useLinkProps({ app: INTERNAL_APP, ...props }), { - wrapper: ProviderWrapper, - }); -}; -describe('useLinkProps hook', () => { - describe('Handles internal linking', () => { - it('Provides the correct baseline props', () => { - const { result } = renderUseLinkPropsHook({ pathname: '/' }); - expect(result.current.href).toBe('/test-basepath/s/test-space/app/metrics/'); - expect(result.current.onClick).toBeDefined(); - }); - - it('Provides the correct props with options', () => { - const { result } = renderUseLinkPropsHook({ - pathname: '/inventory', - search: { - type: 'host', - id: 'some-id', - count: '12345', - }, - }); - expect(result.current.href).toBe( - '/test-basepath/s/test-space/app/metrics/inventory?type=host&id=some-id&count=12345' - ); - expect(result.current.onClick).toBeDefined(); - }); - - it('Provides the correct props with more complex encoding', () => { - const { result } = renderUseLinkPropsHook({ - pathname: '/inventory', - search: { - type: 'host + host', - name: 'this name has spaces and ** and %', - id: 'some-id', - count: '12345', - animals: ['dog', 'cat', 'bear'], - }, - }); - expect(result.current.href).toBe( - '/test-basepath/s/test-space/app/metrics/inventory?type=host%20%2B%20host&name=this%20name%20has%20spaces%20and%20**%20and%20%25&id=some-id&count=12345&animals=dog,cat,bear' - ); - expect(result.current.onClick).toBeDefined(); - }); - - it('Provides the correct props with a consumer using Rison encoding for search', () => { - const state = { - refreshInterval: { pause: true, value: 0 }, - time: { from: 12345, to: 54321 }, - }; - const { result } = renderUseLinkPropsHook({ - pathname: '/inventory', - search: { - type: 'host + host', - state: encode(state), - }, - }); - expect(result.current.href).toBe( - '/test-basepath/s/test-space/app/metrics/inventory?type=host%20%2B%20host&state=(refreshInterval:(pause:!t,value:0),time:(from:12345,to:54321))' - ); - expect(result.current.onClick).toBeDefined(); - }); - }); - - describe('Handles external linking', () => { - it('Provides the correct baseline props', () => { - const { result } = renderUseLinkPropsHook({ - app: 'ml', - pathname: '/', - }); - expect(result.current.href).toBe('/test-basepath/s/test-space/app/ml/'); - expect(result.current.onClick).toBeDefined(); - }); - - it('Provides the correct props with pathname options', () => { - const { result } = renderUseLinkPropsHook({ - app: 'ml', - pathname: '/explorer', - search: { - type: 'host', - id: 'some-id', - count: '12345', - }, - }); - expect(result.current.href).toBe( - '/test-basepath/s/test-space/app/ml/explorer?type=host&id=some-id&count=12345' - ); - expect(result.current.onClick).toBeDefined(); - }); - - it('Provides the correct props with hash options', () => { - const { result } = renderUseLinkPropsHook({ - app: 'ml', - pathname: '/explorer', - search: { - type: 'host', - id: 'some-id', - count: '12345', - }, - }); - expect(result.current.href).toBe( - '/test-basepath/s/test-space/app/ml/explorer?type=host&id=some-id&count=12345' - ); - expect(result.current.onClick).toBeDefined(); - }); - - it('Provides the correct props with more complex encoding', () => { - const { result } = renderUseLinkPropsHook({ - app: 'ml', - pathname: '/explorer', - search: { - type: 'host + host', - name: 'this name has spaces and ** and %', - id: 'some-id', - count: '12345', - animals: ['dog', 'cat', 'bear'], - }, - }); - expect(result.current.href).toBe( - '/test-basepath/s/test-space/app/ml/explorer?type=host%20%2B%20host&name=this%20name%20has%20spaces%20and%20**%20and%20%25&id=some-id&count=12345&animals=dog,cat,bear' - ); - expect(result.current.onClick).toBeDefined(); - }); - - it('Provides the correct props with a consumer using Rison encoding for search', () => { - const state = { - refreshInterval: { pause: true, value: 0 }, - time: { from: 12345, to: 54321 }, - }; - const { result } = renderUseLinkPropsHook({ - app: 'rison-app', - hash: 'rison-route', - search: { - type: 'host + host', - state: encode(state), - }, - }); - expect(result.current.href).toBe( - '/test-basepath/s/test-space/app/rison-app#rison-route?type=host%20%2B%20host&state=(refreshInterval:(pause:!t,value:0),time:(from:12345,to:54321))' - ); - expect(result.current.onClick).toBeDefined(); - }); - }); -}); diff --git a/x-pack/plugins/observability/public/hooks/use_link_props.ts b/x-pack/plugins/observability/public/hooks/use_link_props.ts deleted file mode 100644 index 55746add79ccc..0000000000000 --- a/x-pack/plugins/observability/public/hooks/use_link_props.ts +++ /dev/null @@ -1,125 +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 { useMemo } from 'react'; -import { stringify } from 'query-string'; -import { url as urlUtils } from '@kbn/kibana-utils-plugin/public'; -import { useKibana } from '@kbn/kibana-react-plugin/public'; -import { usePrefixPathWithBasepath } from './use_prefix_path_with_basepath'; -import { useNavigationWarningPrompt } from '../utils/navigation_warning_prompt'; - -type Search = Record; - -export interface LinkDescriptor { - app: string; - pathname?: string; - hash?: string; - search?: Search; -} - -export interface LinkProps { - href?: string; - onClick?: (e: React.MouseEvent | React.MouseEvent) => void; -} - -export interface Options { - hrefOnly?: boolean; -} - -export const useLinkProps = ( - { app, pathname, hash, search }: LinkDescriptor, - options: Options = {} -): LinkProps => { - validateParams({ app, pathname, hash, search }); - - const { prompt } = useNavigationWarningPrompt(); - const prefixer = usePrefixPathWithBasepath(); - const navigateToApp = useKibana().services.application?.navigateToApp; - const { hrefOnly } = options; - - const encodedSearch = useMemo(() => { - return search ? encodeSearch(search) : undefined; - }, [search]); - - const mergedHash = useMemo(() => { - // The URI spec defines that the query should appear before the fragment - // https://tools.ietf.org/html/rfc3986#section-3 (e.g. url.format()). However, in Kibana, apps that use - // hash based routing expect the query to be part of the hash. This will handle that. - return hash && encodedSearch ? `${hash}?${encodedSearch}` : hash; - }, [hash, encodedSearch]); - - const mergedPathname = useMemo(() => { - return pathname && encodedSearch ? `${pathname}?${encodedSearch}` : pathname; - }, [pathname, encodedSearch]); - - const href = useMemo(() => { - const builtPathname = pathname ?? ''; - const builtHash = mergedHash ? `#${mergedHash}` : ''; - const builtSearch = !hash ? (encodedSearch ? `?${encodedSearch}` : '') : ''; - - const link = `${builtPathname}${builtSearch}${builtHash}`; - - return prefixer(app, link); - }, [mergedHash, hash, encodedSearch, pathname, prefixer, app]); - - const onClick = useMemo(() => { - return (e: React.MouseEvent | React.MouseEvent) => { - if (!shouldHandleLinkEvent(e)) { - return; - } - - e.preventDefault(); - - const navigate = () => { - if (navigateToApp) { - const navigationPath = mergedHash ? `#${mergedHash}` : mergedPathname; - navigateToApp(app, { path: navigationPath ? navigationPath : undefined }); - } - }; - - // A component somewhere within the app hierarchy is requesting that we - // prompt the user before navigating. - if (prompt) { - const wantsToNavigate = window.confirm(prompt); - if (wantsToNavigate) { - navigate(); - } else { - return; - } - } else { - navigate(); - } - }; - }, [navigateToApp, mergedHash, mergedPathname, app, prompt]); - - return { - href, - // Sometimes it may not be desirable to have onClick call "navigateToApp". - // E.g. the management section of Kibana cannot be successfully deeplinked to via - // "navigateToApp". In those cases we can choose to defer to legacy behaviour. - onClick: hrefOnly ? undefined : onClick, - }; -}; - -const encodeSearch = (search: Search) => { - return stringify(urlUtils.encodeQuery(search), { sort: false, encode: false }); -}; - -const validateParams = ({ app, pathname, hash, search }: LinkDescriptor) => { - if (!app && hash) { - throw new Error( - 'The metrics and logs apps use browserHistory. Please provide a pathname rather than a hash.' - ); - } -}; - -const isModifiedEvent = (event: any) => - !!(event.metaKey || event.altKey || event.ctrlKey || event.shiftKey); - -export const shouldHandleLinkEvent = ( - e: React.MouseEvent | React.MouseEvent -) => !e.defaultPrevented && !isModifiedEvent(e); diff --git a/x-pack/plugins/observability/public/hooks/use_messages_storage.tsx b/x-pack/plugins/observability/public/hooks/use_messages_storage.tsx deleted file mode 100644 index d67910f00dc76..0000000000000 --- a/x-pack/plugins/observability/public/hooks/use_messages_storage.tsx +++ /dev/null @@ -1,66 +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 { useCallback } from 'react'; -import { useKibana } from '../utils/kibana_react'; - -export interface UseMessagesStorage { - getMessages: (plugin: string) => string[]; - addMessage: (plugin: string, id: string) => void; - removeMessage: (plugin: string, id: string) => void; - clearAllMessages: (plugin: string) => void; - hasMessage: (plugin: string, id: string) => boolean; -} - -export const useMessagesStorage = (): UseMessagesStorage => { - const { storage } = useKibana().services; - - const getMessages = useCallback( - (plugin: string): string[] => storage.get(`${plugin}-messages`) ?? [], - [storage] - ); - - const addMessage = useCallback( - (plugin: string, id: string) => { - const pluginStorage = storage.get(`${plugin}-messages`) ?? []; - storage.set(`${plugin}-messages`, [...pluginStorage, id]); - }, - [storage] - ); - - const hasMessage = useCallback( - (plugin: string, id: string): boolean => { - const pluginStorage = storage.get(`${plugin}-messages`) ?? []; - return pluginStorage.includes((val: string) => val === id); - }, - [storage] - ); - - const removeMessage = useCallback( - (plugin: string, id: string) => { - const pluginStorage = storage.get(`${plugin}-messages`) ?? []; - storage.set( - `${plugin}-messages`, - pluginStorage.filter((val: string) => val !== id) - ); - }, - [storage] - ); - - const clearAllMessages = useCallback( - (plugin: string): string[] => storage.remove(`${plugin}-messages`), - [storage] - ); - - return { - getMessages, - addMessage, - clearAllMessages, - removeMessage, - hasMessage, - }; -}; diff --git a/x-pack/plugins/observability/public/hooks/use_plugin_context.tsx b/x-pack/plugins/observability/public/hooks/use_plugin_context.tsx index 5ea1d46ac7af3..b54be717b5893 100644 --- a/x-pack/plugins/observability/public/hooks/use_plugin_context.tsx +++ b/x-pack/plugins/observability/public/hooks/use_plugin_context.tsx @@ -6,7 +6,7 @@ */ import { useContext } from 'react'; -import { PluginContext } from '../context/plugin_context'; +import { PluginContext } from '../context/plugin_context/plugin_context'; export function usePluginContext() { return useContext(PluginContext); diff --git a/x-pack/plugins/observability/public/hooks/use_prefix_path_with_basepath.tsx b/x-pack/plugins/observability/public/hooks/use_prefix_path_with_basepath.tsx deleted file mode 100644 index 05fde570878da..0000000000000 --- a/x-pack/plugins/observability/public/hooks/use_prefix_path_with_basepath.tsx +++ /dev/null @@ -1,23 +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 { useMemo } from 'react'; -import { useKibana } from '@kbn/kibana-react-plugin/public'; - -export const usePrefixPathWithBasepath = () => { - const getUrlForApp = useKibana().services.application?.getUrlForApp; - const prefixer = useMemo(() => { - if (!getUrlForApp) { - throw new Error('Application core service is unavailable'); - } - - return (app: string, path: string) => { - return getUrlForApp(app, { path }); - }; - }, [getUrlForApp]); - return prefixer; -}; diff --git a/x-pack/plugins/observability/public/hooks/use_query_params.ts b/x-pack/plugins/observability/public/hooks/use_query_params.ts deleted file mode 100644 index 9fcbe70b5a9ef..0000000000000 --- a/x-pack/plugins/observability/public/hooks/use_query_params.ts +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { useLocation } from 'react-router-dom'; -import { useMemo } from 'react'; -import { parse } from 'query-string'; -import { UI_SETTINGS, useKibanaUISettings } from './use_kibana_ui_settings'; -import { getAbsoluteTime } from '../utils/date'; -import { TimePickerTimeDefaults } from '../components/shared/date_picker/typings'; - -const getParsedParams = (search: string) => { - return search ? parse(search[0] === '?' ? search.slice(1) : search, { sort: false }) : {}; -}; - -export function useQueryParams() { - const { from, to } = useKibanaUISettings( - UI_SETTINGS.TIMEPICKER_TIME_DEFAULTS - ); - - const { rangeFrom, rangeTo } = getParsedParams(useLocation().search); - - return useMemo(() => { - return { - start: (rangeFrom as string) ?? from, - end: (rangeTo as string) ?? to, - absStart: getAbsoluteTime((rangeFrom as string) ?? from)!, - absEnd: getAbsoluteTime((rangeTo as string) ?? to, { roundUp: true })!, - }; - }, [rangeFrom, rangeTo, from, to]); -} diff --git a/x-pack/plugins/observability/public/hooks/use_quick_time_ranges.tsx b/x-pack/plugins/observability/public/hooks/use_quick_time_ranges.tsx deleted file mode 100644 index 81ed31065095b..0000000000000 --- a/x-pack/plugins/observability/public/hooks/use_quick_time_ranges.tsx +++ /dev/null @@ -1,27 +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 { useUiSetting } from '@kbn/kibana-react-plugin/public'; -import { UI_SETTINGS } from '@kbn/data-plugin/common'; - -export interface TimePickerQuickRange { - from: string; - to: string; - display: string; -} - -export function useQuickTimeRanges() { - const timePickerQuickRanges = useUiSetting( - UI_SETTINGS.TIMEPICKER_QUICK_RANGES - ); - - return timePickerQuickRanges.map(({ from, to, display }) => ({ - start: from, - end: to, - label: display, - })); -} diff --git a/x-pack/plugins/observability/public/hooks/use_route_params.tsx b/x-pack/plugins/observability/public/hooks/use_route_params.tsx deleted file mode 100644 index 7752dda76ff75..0000000000000 --- a/x-pack/plugins/observability/public/hooks/use_route_params.tsx +++ /dev/null @@ -1,53 +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 * as t from 'io-ts'; -import { useLocation, useParams } from 'react-router-dom'; -import { isLeft } from 'fp-ts/lib/Either'; -import { PathReporter } from 'io-ts/lib/PathReporter'; -import { Params, RouteParams, routes } from '../routes'; - -function getQueryParams(location: ReturnType) { - const urlSearchParms = new URLSearchParams(location.search); - const queryParams: Record = {}; - urlSearchParms.forEach((value, key) => { - queryParams[key] = value; - }); - return queryParams; -} - -/** - * Extracts query and path params from the url and validate it against the type defined in the route file. - * It removes any aditional item which is not declared in the type. - * @param params - */ -export function useRouteParams(pathName: T): RouteParams { - const location = useLocation(); - const pathParams = useParams(); - const queryParams = getQueryParams(location); - const { query, path } = routes[pathName].params as Params; - - const rts = { - queryRt: query ? t.exact(query) : t.strict({}), - pathRt: path ? t.exact(path) : t.strict({}), - }; - - const queryResult = rts.queryRt.decode(queryParams); - const pathResult = rts.pathRt.decode(pathParams); - if (isLeft(queryResult)) { - console.error(PathReporter.report(queryResult)[0]); - } - - if (isLeft(pathResult)) { - console.error(PathReporter.report(pathResult)[0]); - } - - return { - query: isLeft(queryResult) ? {} : queryResult.right, - path: isLeft(pathResult) ? {} : pathResult.right, - } as unknown as RouteParams; -} diff --git a/x-pack/plugins/observability/public/hooks/use_theme.tsx b/x-pack/plugins/observability/public/hooks/use_theme.tsx deleted file mode 100644 index f0957c15ae1d6..0000000000000 --- a/x-pack/plugins/observability/public/hooks/use_theme.tsx +++ /dev/null @@ -1,15 +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 { useContext } from 'react'; -import { ThemeContext } from 'styled-components'; -import { EuiTheme } from '@kbn/kibana-react-plugin/common'; - -export function useTheme() { - const theme: EuiTheme = useContext(ThemeContext); - return theme; -} diff --git a/x-pack/plugins/observability/public/hooks/use_time_zone.ts b/x-pack/plugins/observability/public/hooks/use_time_zone.ts deleted file mode 100644 index 0e7a8cf7c6a7e..0000000000000 --- a/x-pack/plugins/observability/public/hooks/use_time_zone.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 { useUiSetting } from '@kbn/kibana-react-plugin/public'; -import moment from 'moment-timezone'; - -export const useTimeZone = () => { - const timeZone = useUiSetting('dateFormat:tz'); - - const localTZ = moment.tz.guess(); - - if (!timeZone || timeZone === 'Browser') { - return localTZ; - } - - return timeZone; -}; diff --git a/x-pack/plugins/observability/public/hooks/use_values_list.ts b/x-pack/plugins/observability/public/hooks/use_values_list.ts deleted file mode 100644 index d1b9162f01bf9..0000000000000 --- a/x-pack/plugins/observability/public/hooks/use_values_list.ts +++ /dev/null @@ -1,168 +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 { capitalize, uniqBy } from 'lodash'; -import { useEffect, useState } from 'react'; -import useDebounce from 'react-use/lib/useDebounce'; -import type { ESFilter } from '@kbn/es-types'; -import { IInspectorInfo } from '@kbn/data-plugin/common'; -import { TRANSACTION_URL } from '@kbn/observability-shared-plugin/common'; -import { createEsParams, useEsSearch } from './use_es_search'; - -export interface Props { - sourceField: string; - label: string; - query?: string; - dataViewTitle?: string; - filters?: ESFilter[]; - time?: { from: string; to: string }; - keepHistory?: boolean; - cardinalityField?: string; - inspector?: IInspectorInfo; -} - -export interface ListItem { - label: string; - count: number; -} - -const uniqueValues = (values: ListItem[], prevValues: ListItem[]) => { - return uniqBy([...values, ...prevValues], 'label'); -}; - -const getIncludeClause = (sourceField: string, query?: string) => { - if (!query) { - return ''; - } - - let includeClause = ''; - - if (sourceField === TRANSACTION_URL) { - // for the url we also match leading text - includeClause = `*.${query.toLowerCase()}.*`; - } else { - if (query[0].toLowerCase() === query[0]) { - // if first letter is lowercase we also add the capitalize option - includeClause = `(${query}|${capitalize(query)}).*`; - } else { - // otherwise we add lowercase option prefix - includeClause = `(${query}|${query.toLowerCase()}).*`; - } - } - - return includeClause; -}; - -export const useValuesList = ({ - sourceField, - dataViewTitle, - query = '', - filters, - time, - label, - keepHistory, - cardinalityField, -}: Props): { values: ListItem[]; loading?: boolean } => { - const [debouncedQuery, setDebounceQuery] = useState(query); - const [values, setValues] = useState([]); - - const { from, to } = time ?? {}; - - useDebounce( - () => { - setDebounceQuery(query); - }, - 350, - [query] - ); - - useEffect(() => { - if (!query) { - // in case query is cleared, we don't wait for debounce - setDebounceQuery(query); - } - }, [query]); - - const includeClause = getIncludeClause(sourceField, query); - - const { data, loading } = useEsSearch( - createEsParams({ - index: dataViewTitle!, - body: { - query: { - bool: { - filter: [ - ...(filters ?? []), - ...(from && to - ? [ - { - range: { - '@timestamp': { - gte: from, - lte: to, - }, - }, - }, - ] - : []), - ], - }, - }, - size: 0, - aggs: { - values: { - terms: { - field: sourceField, - size: 50, - ...(query ? { include: includeClause } : {}), - }, - ...(cardinalityField - ? { - aggs: { - count: { - cardinality: { - field: cardinalityField, - }, - }, - }, - } - : {}), - }, - }, - }, - }), - [debouncedQuery, from, to, JSON.stringify(filters), dataViewTitle, sourceField], - { name: `get${label.replace(/\s/g, '')}ValuesList` } - ); - - useEffect(() => { - const valueBuckets = data?.aggregations?.values.buckets; - const newValues = - valueBuckets?.map(({ key: value, doc_count: count, count: aggsCount }) => { - if (aggsCount) { - return { - count: aggsCount.value, - label: String(value), - }; - } - return { - count, - label: String(value), - }; - }) ?? []; - - if (keepHistory) { - setValues((prevState) => { - return uniqueValues(newValues, prevState); - }); - } else { - setValues(newValues); - } - }, [data, keepHistory, loading, query]); - - return { values, loading }; -}; diff --git a/x-pack/plugins/observability/public/index.ts b/x-pack/plugins/observability/public/index.ts index 4cfb6fbcca43a..834861c273559 100644 --- a/x-pack/plugins/observability/public/index.ts +++ b/x-pack/plugins/observability/public/index.ts @@ -23,16 +23,6 @@ export type { ObservabilityPublicPluginsSetup, ObservabilityPublicPluginsStart, }; -export { - syntheticsThrottlingEnabled, - enableInspectEsQueries, - enableComparisonByDefault, - apmServiceGroupMaxNumberOfServices, - enableInfrastructureHostsView, - enableAgentExplorerView, -} from '../common/ui_settings_keys'; -export { uptimeOverviewLocatorID } from '../common'; - export const plugin: PluginInitializer< ObservabilityPublicSetup, ObservabilityPublicStart, @@ -42,27 +32,23 @@ export const plugin: PluginInitializer< return new Plugin(initializerContext); }; -export * from './components/shared/action_menu'; - -export type { UXMetrics } from './components/shared/core_web_vitals'; -export { DatePickerContextProvider } from './context/date_picker_context'; - export { - getCoreVitalsComponent, - HeaderMenuPortal, - FieldValueSuggestions, - FieldValueSelection, - FilterValueLabel, - DatePicker, - LoadWhenInView, - ObservabilityAlertSearchBar, -} from './components/shared'; + syntheticsThrottlingEnabled, + enableInspectEsQueries, + enableComparisonByDefault, + apmServiceGroupMaxNumberOfServices, + enableInfrastructureHostsView, + enableAgentExplorerView, +} from '../common/ui_settings_keys'; +export { uptimeOverviewLocatorID } from '../common'; + +export type { UXMetrics } from './components/core_web_vitals/core_vitals'; +export { getCoreVitalsComponent } from './components/core_web_vitals/get_core_web_vitals_lazy'; -export type { LazyObservabilityPageTemplateProps } from './components/shared'; +export { DatePicker } from './pages/overview/components/date_picker/date_picker'; +export { ObservabilityAlertSearchBar } from './components/alert_search_bar/get_alert_search_bar_lazy'; -export const LazyAlertsFlyout = lazy(() => import('./components/alerts_flyout')); -export { useFetcher, FETCH_STATUS } from './hooks/use_fetcher'; -export { useEsSearch, createEsParams } from './hooks/use_es_search'; +export const LazyAlertsFlyout = lazy(() => import('./components/alerts_flyout/alerts_flyout')); export * from './typings'; import { TopAlert } from './typings/alerts'; @@ -72,16 +58,9 @@ export type { TopAlert, AlertSummary, AlertSummaryField }; export { observabilityFeatureId, observabilityAppId } from '../common'; -export { useChartTheme } from './hooks/use_chart_theme'; -export { useBreadcrumbs } from './hooks/use_breadcrumbs'; -export { useTheme } from './hooks/use_theme'; -export { useTimeZone } from './hooks/use_time_zone'; export { useTimeBuckets } from './hooks/use_time_buckets'; export { createUseRulesLink } from './hooks/create_use_rules_link'; -export { useLinkProps, shouldHandleLinkEvent } from './hooks/use_link_props'; -export type { LinkDescriptor } from './hooks/use_link_props'; -export { NavigationWarningPromptProvider, Prompt } from './utils/navigation_warning_prompt'; export { getApmTraceUrl } from './utils/get_apm_trace_url'; export type { @@ -91,14 +70,11 @@ export type { } from './rules/create_observability_rule_type_registry'; export { createObservabilityRuleTypeRegistryMock } from './rules/observability_rule_type_registry_mock'; -export type { AddInspectorRequest } from './context/inspector/inspector_context'; -export { InspectorContextProvider } from './context/inspector/inspector_context'; -export { useInspectorContext } from './context/inspector/use_inspector_context'; +export { DatePickerContextProvider } from './context/date_picker_context/date_picker_context'; export { fromQuery, toQuery } from './utils/url'; export { getAlertSummaryTimeRange } from './utils/alert_summary_widget'; export { calculateTimeRangeBucketSize } from './pages/overview/helpers/calculate_bucket_size'; -export type { NavigationSection } from './services/navigation_registry'; export { convertTo } from '../common/utils/formatters/duration'; export { formatAlertEvaluationValue } from './utils/format_alert_evaluation_value'; diff --git a/x-pack/plugins/observability/public/locators/rule_details.test.ts b/x-pack/plugins/observability/public/locators/rule_details.test.ts index f63354d29d90a..a00c4389d07ff 100644 --- a/x-pack/plugins/observability/public/locators/rule_details.test.ts +++ b/x-pack/plugins/observability/public/locators/rule_details.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { ACTIVE_ALERTS } from '../components/shared/alert_search_bar/constants'; +import { ACTIVE_ALERTS } from '../components/alert_search_bar/constants'; import { EXECUTION_TAB, ALERTS_TAB } from '../pages/rule_details/constants'; import { getRuleDetailsPath, RuleDetailsLocatorDefinition } from './rule_details'; diff --git a/x-pack/plugins/observability/public/locators/rule_details.ts b/x-pack/plugins/observability/public/locators/rule_details.ts index 13eaddb5b4707..f36662627e0c6 100644 --- a/x-pack/plugins/observability/public/locators/rule_details.ts +++ b/x-pack/plugins/observability/public/locators/rule_details.ts @@ -9,7 +9,7 @@ import { setStateToKbnUrl } from '@kbn/kibana-utils-plugin/public'; import type { SerializableRecord } from '@kbn/utility-types'; import type { LocatorDefinition } from '@kbn/share-plugin/public'; import { ruleDetailsLocatorID } from '../../common'; -import { ALL_ALERTS } from '../components/shared/alert_search_bar/constants'; +import { ALL_ALERTS } from '../components/alert_search_bar/constants'; import { ALERTS_TAB, EXECUTION_TAB, diff --git a/x-pack/plugins/observability/public/pages/alert_details/alert_details.test.tsx b/x-pack/plugins/observability/public/pages/alert_details/alert_details.test.tsx index f8d1b4b43af74..4cc8895ae6a4c 100644 --- a/x-pack/plugins/observability/public/pages/alert_details/alert_details.test.tsx +++ b/x-pack/plugins/observability/public/pages/alert_details/alert_details.test.tsx @@ -12,13 +12,13 @@ import { waitFor } from '@testing-library/react'; import { casesPluginMock } from '@kbn/cases-plugin/public/mocks'; import { __IntlProvider as IntlProvider } from '@kbn/i18n-react'; import * as useUiSettingHook from '@kbn/kibana-react-plugin/public/ui_settings/use_ui_setting'; +import { useBreadcrumbs } from '@kbn/observability-shared-plugin/public'; import { Subset } from '../../typings'; import { render } from '../../utils/test_helper'; import { useKibana } from '../../utils/kibana_react'; import { kibanaStartMock } from '../../utils/kibana_react.mock'; import { useFetchAlertDetail } from '../../hooks/use_fetch_alert_detail'; -import { useBreadcrumbs } from '../../hooks/use_breadcrumbs'; import { AlertDetails } from './alert_details'; import { ConfigSchema } from '../../plugin'; import { alert, alertWithNoData } from './mock/alert'; @@ -74,7 +74,7 @@ jest.mock('../../hooks/use_fetch_rule', () => { }), }; }); -jest.mock('../../hooks/use_breadcrumbs'); +jest.mock('@kbn/observability-shared-plugin/public'); jest.mock('../../hooks/use_get_user_cases_permissions', () => ({ useGetUserCasesPermissions: () => ({ all: true, diff --git a/x-pack/plugins/observability/public/pages/alert_details/alert_details.tsx b/x-pack/plugins/observability/public/pages/alert_details/alert_details.tsx index 7bdb4d1054640..c546476d0619d 100644 --- a/x-pack/plugins/observability/public/pages/alert_details/alert_details.tsx +++ b/x-pack/plugins/observability/public/pages/alert_details/alert_details.tsx @@ -11,11 +11,11 @@ import { useParams } from 'react-router-dom'; import { EuiEmptyPrompt, EuiPanel, EuiSpacer } from '@elastic/eui'; import { ALERT_RULE_CATEGORY, ALERT_RULE_TYPE_ID, ALERT_RULE_UUID } from '@kbn/rule-data-utils'; import { RuleTypeModel } from '@kbn/triggers-actions-ui-plugin/public'; +import { useBreadcrumbs } from '@kbn/observability-shared-plugin/public'; import { useKibana } from '../../utils/kibana_react'; import { useFetchRule } from '../../hooks/use_fetch_rule'; import { usePluginContext } from '../../hooks/use_plugin_context'; -import { useBreadcrumbs } from '../../hooks/use_breadcrumbs'; import { useFetchAlertDetail } from '../../hooks/use_fetch_alert_detail'; import { PageTitle, pageTitleContent } from './components/page_title'; import { HeaderActions } from './components/header_actions'; diff --git a/x-pack/plugins/observability/public/pages/alerts/alerts.tsx b/x-pack/plugins/observability/public/pages/alerts/alerts.tsx index 9defe55a3d1d4..d84f552310ba7 100644 --- a/x-pack/plugins/observability/public/pages/alerts/alerts.tsx +++ b/x-pack/plugins/observability/public/pages/alerts/alerts.tsx @@ -13,20 +13,20 @@ import { i18n } from '@kbn/i18n'; import { useKibana } from '@kbn/kibana-react-plugin/public'; import { loadRuleAggregations } from '@kbn/triggers-actions-ui-plugin/public'; import { AlertConsumers } from '@kbn/rule-data-utils'; +import { useBreadcrumbs } from '@kbn/observability-shared-plugin/public'; import { useHasData } from '../../hooks/use_has_data'; import { usePluginContext } from '../../hooks/use_plugin_context'; -import { useBreadcrumbs } from '../../hooks/use_breadcrumbs'; import { useTimeBuckets } from '../../hooks/use_time_buckets'; import { useToasts } from '../../hooks/use_toast'; -import { ObservabilityAlertSearchBar } from '../../components/shared/alert_search_bar'; import { LoadingObservability } from '../../components/loading_observability'; import { renderRuleStats, RuleStatsState } from './components/rule_stats'; +import { ObservabilityAlertSearchBar } from '../../components/alert_search_bar/alert_search_bar'; import { alertSearchBarStateContainer, Provider, useAlertSearchBarStateContainer, -} from '../../components/shared/alert_search_bar/containers'; +} from '../../components/alert_search_bar/containers'; import { calculateTimeRangeBucketSize } from '../overview/helpers/calculate_bucket_size'; import { getAlertSummaryTimeRange } from '../../utils/alert_summary_widget'; import { observabilityAlertFeatureIds } from '../../config/alert_feature_ids'; diff --git a/x-pack/plugins/observability/public/components/app/chart_container/index.test.tsx b/x-pack/plugins/observability/public/pages/overview/components/chart_container/chart_container.test.tsx similarity index 95% rename from x-pack/plugins/observability/public/components/app/chart_container/index.test.tsx rename to x-pack/plugins/observability/public/pages/overview/components/chart_container/chart_container.test.tsx index 46bbc71a19a0f..31991fcb76b3f 100644 --- a/x-pack/plugins/observability/public/components/app/chart_container/index.test.tsx +++ b/x-pack/plugins/observability/public/pages/overview/components/chart_container/chart_container.test.tsx @@ -7,7 +7,7 @@ import { render } from '@testing-library/react'; import React from 'react'; -import { ChartContainer } from '.'; +import { ChartContainer } from './chart_container'; describe('chart container', () => { it('shows loading indicator', () => { diff --git a/x-pack/plugins/observability/public/components/app/chart_container/index.tsx b/x-pack/plugins/observability/public/pages/overview/components/chart_container/chart_container.tsx similarity index 100% rename from x-pack/plugins/observability/public/components/app/chart_container/index.tsx rename to x-pack/plugins/observability/public/pages/overview/components/chart_container/chart_container.tsx diff --git a/x-pack/plugins/observability/public/pages/overview/components/data_assistant_flyout.tsx b/x-pack/plugins/observability/public/pages/overview/components/data_assistant_flyout.tsx index 9c43f39d6a8f1..76e41ebb60e30 100644 --- a/x-pack/plugins/observability/public/pages/overview/components/data_assistant_flyout.tsx +++ b/x-pack/plugins/observability/public/pages/overview/components/data_assistant_flyout.tsx @@ -15,7 +15,7 @@ import { EuiFlyoutBody, } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; -import { ObservabilityStatus } from '../../../components/app/observability_status'; +import { ObservabilityStatus } from './observability_status'; interface DataAsssistantFlyoutProps { onClose: () => void; diff --git a/x-pack/plugins/observability/public/pages/overview/components/data_sections.tsx b/x-pack/plugins/observability/public/pages/overview/components/data_sections.tsx index 848d469e0e4f1..6451bff2f85f6 100644 --- a/x-pack/plugins/observability/public/pages/overview/components/data_sections.tsx +++ b/x-pack/plugins/observability/public/pages/overview/components/data_sections.tsx @@ -7,12 +7,12 @@ import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import React from 'react'; -import { APMSection } from '../../../components/app/section/apm'; -import { LogsSection } from '../../../components/app/section/logs'; -import { MetricsSection } from '../../../components/app/section/metrics'; -import { UptimeSection } from '../../../components/app/section/uptime'; -import { UXSection } from '../../../components/app/section/ux'; -import { HasDataMap } from '../../../context/has_data_context'; +import { APMSection } from './sections/apm/apm_section'; +import { LogsSection } from './sections/logs/logs_section'; +import { MetricsSection } from './sections/metrics/metrics_section'; +import { UptimeSection } from './sections/uptime/uptime_section'; +import { UXSection } from './sections/ux/ux_section'; +import { HasDataMap } from '../../../context/has_data_context/has_data_context'; import type { BucketSize } from '../helpers/calculate_bucket_size'; interface Props { diff --git a/x-pack/plugins/observability/public/components/shared/date_picker/date_picker.test.tsx b/x-pack/plugins/observability/public/pages/overview/components/date_picker/date_picker.test.tsx similarity index 96% rename from x-pack/plugins/observability/public/components/shared/date_picker/date_picker.test.tsx rename to x-pack/plugins/observability/public/pages/overview/components/date_picker/date_picker.test.tsx index 45eb5e6951f2f..37ccdffc71b1c 100644 --- a/x-pack/plugins/observability/public/components/shared/date_picker/date_picker.test.tsx +++ b/x-pack/plugins/observability/public/pages/overview/components/date_picker/date_picker.test.tsx @@ -12,10 +12,10 @@ import { createMemoryHistory, MemoryHistory } from 'history'; import React from 'react'; import { Router, useLocation } from 'react-router-dom'; import qs from 'query-string'; -import { DatePicker } from '.'; +import { DatePicker } from './date_picker'; import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; import { of } from 'rxjs'; -import { DatePickerContextProvider } from '../../../context/date_picker_context'; +import { DatePickerContextProvider } from '../../../../context/date_picker_context/date_picker_context'; let history: MemoryHistory; diff --git a/x-pack/plugins/observability/public/components/shared/date_picker/index.tsx b/x-pack/plugins/observability/public/pages/overview/components/date_picker/date_picker.tsx similarity index 82% rename from x-pack/plugins/observability/public/components/shared/date_picker/index.tsx rename to x-pack/plugins/observability/public/pages/overview/components/date_picker/date_picker.tsx index 8226e4081b633..1de12b64e6dfb 100644 --- a/x-pack/plugins/observability/public/components/shared/date_picker/index.tsx +++ b/x-pack/plugins/observability/public/pages/overview/components/date_picker/date_picker.tsx @@ -7,9 +7,24 @@ import { EuiSuperDatePicker } from '@elastic/eui'; import React, { useCallback } from 'react'; -import { UI_SETTINGS, useKibanaUISettings } from '../../../hooks/use_kibana_ui_settings'; -import { TimePickerQuickRange } from './typings'; -import { useDatePickerContext } from '../../../hooks/use_date_picker_context'; +import { UI_SETTINGS, useKibanaUISettings } from '../../../../hooks/use_kibana_ui_settings'; +import { useDatePickerContext } from '../../../../hooks/use_date_picker_context'; + +export interface TimePickerQuickRange { + from: string; + to: string; + display: string; +} + +export interface TimePickerRefreshInterval { + pause: boolean; + value: number; +} + +export interface TimePickerTimeDefaults { + from: string; + to: string; +} export interface DatePickerProps { rangeFrom?: string; diff --git a/x-pack/plugins/observability/public/pages/overview/components/header_actions.tsx b/x-pack/plugins/observability/public/pages/overview/components/header_actions/header_actions.tsx similarity index 93% rename from x-pack/plugins/observability/public/pages/overview/components/header_actions.tsx rename to x-pack/plugins/observability/public/pages/overview/components/header_actions/header_actions.tsx index f037fe7750137..f0ead9857fa9f 100644 --- a/x-pack/plugins/observability/public/pages/overview/components/header_actions.tsx +++ b/x-pack/plugins/observability/public/pages/overview/components/header_actions/header_actions.tsx @@ -16,10 +16,10 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; +import { useObservabilityTourContext } from '@kbn/observability-shared-plugin/public'; -import { DatePicker } from '../../../components/shared/date_picker'; -import { useDatePickerContext } from '../../../hooks/use_date_picker_context'; -import { useObservabilityTourContext } from '../../../components/shared/tour'; +import { DatePicker } from '../date_picker/date_picker'; +import { useDatePickerContext } from '../../../../hooks/use_date_picker_context'; export interface HeaderActionsProps { showTour?: boolean; diff --git a/x-pack/plugins/observability/public/pages/overview/components/header_menu.tsx b/x-pack/plugins/observability/public/pages/overview/components/header_menu/header_menu.tsx similarity index 84% rename from x-pack/plugins/observability/public/pages/overview/components/header_menu.tsx rename to x-pack/plugins/observability/public/pages/overview/components/header_menu/header_menu.tsx index 45401437b2dc0..a73f0b2fafac4 100644 --- a/x-pack/plugins/observability/public/pages/overview/components/header_menu.tsx +++ b/x-pack/plugins/observability/public/pages/overview/components/header_menu/header_menu.tsx @@ -9,9 +9,9 @@ import { EuiHeaderLink, EuiHeaderLinks } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React from 'react'; import { useKibana } from '@kbn/kibana-react-plugin/public'; -import { ObservabilityAppServices } from '../../../application/types'; -import { usePluginContext } from '../../../hooks/use_plugin_context'; -import HeaderMenuPortal from '../../../components/shared/header_menu_portal'; +import { ObservabilityAppServices } from '../../../../application/types'; +import { usePluginContext } from '../../../../hooks/use_plugin_context'; +import HeaderMenuPortal from './header_menu_portal'; export function HeaderMenu(): React.ReactElement | null { const { diff --git a/x-pack/plugins/observability/public/components/shared/header_menu_portal.test.tsx b/x-pack/plugins/observability/public/pages/overview/components/header_menu/header_menu_portal.test.tsx similarity index 100% rename from x-pack/plugins/observability/public/components/shared/header_menu_portal.test.tsx rename to x-pack/plugins/observability/public/pages/overview/components/header_menu/header_menu_portal.test.tsx diff --git a/x-pack/plugins/observability/public/components/shared/header_menu_portal.tsx b/x-pack/plugins/observability/public/pages/overview/components/header_menu/header_menu_portal.tsx similarity index 77% rename from x-pack/plugins/observability/public/components/shared/header_menu_portal.tsx rename to x-pack/plugins/observability/public/pages/overview/components/header_menu/header_menu_portal.tsx index dcfe8b9ce85ba..e6359e8c5c743 100644 --- a/x-pack/plugins/observability/public/components/shared/header_menu_portal.tsx +++ b/x-pack/plugins/observability/public/pages/overview/components/header_menu/header_menu_portal.tsx @@ -5,10 +5,16 @@ * 2.0. */ -import React, { useEffect, useMemo } from 'react'; +import React, { ReactNode, useEffect, useMemo } from 'react'; import { createHtmlPortalNode, InPortal, OutPortal } from 'react-reverse-portal'; import { toMountPoint } from '@kbn/kibana-react-plugin/public'; -import { HeaderMenuPortalProps } from './types'; +import { AppMountParameters } from '@kbn/core/public'; + +export interface HeaderMenuPortalProps { + children: ReactNode; + setHeaderActionMenu: AppMountParameters['setHeaderActionMenu']; + theme$: AppMountParameters['theme$']; +} // eslint-disable-next-line import/no-default-export export default function HeaderMenuPortal({ diff --git a/x-pack/plugins/observability/public/services/get_news_feed.test.ts b/x-pack/plugins/observability/public/pages/overview/components/news_feed/helpers/get_news_feed.test.ts similarity index 100% rename from x-pack/plugins/observability/public/services/get_news_feed.test.ts rename to x-pack/plugins/observability/public/pages/overview/components/news_feed/helpers/get_news_feed.test.ts diff --git a/x-pack/plugins/observability/public/services/get_news_feed.ts b/x-pack/plugins/observability/public/pages/overview/components/news_feed/helpers/get_news_feed.ts similarity index 100% rename from x-pack/plugins/observability/public/services/get_news_feed.ts rename to x-pack/plugins/observability/public/pages/overview/components/news_feed/helpers/get_news_feed.ts diff --git a/x-pack/plugins/observability/public/pages/overview/components/news_feed.scss b/x-pack/plugins/observability/public/pages/overview/components/news_feed/news_feed.scss similarity index 100% rename from x-pack/plugins/observability/public/pages/overview/components/news_feed.scss rename to x-pack/plugins/observability/public/pages/overview/components/news_feed/news_feed.scss diff --git a/x-pack/plugins/observability/public/pages/overview/components/news_feed.test.tsx b/x-pack/plugins/observability/public/pages/overview/components/news_feed/news_feed.test.tsx similarity index 95% rename from x-pack/plugins/observability/public/pages/overview/components/news_feed.test.tsx rename to x-pack/plugins/observability/public/pages/overview/components/news_feed/news_feed.test.tsx index f8b9ddc7efd0e..09cad78055d37 100644 --- a/x-pack/plugins/observability/public/pages/overview/components/news_feed.test.tsx +++ b/x-pack/plugins/observability/public/pages/overview/components/news_feed/news_feed.test.tsx @@ -6,8 +6,8 @@ */ import React from 'react'; -import { NewsItem } from '../../../services/get_news_feed'; -import { render } from '../../../utils/test_helper'; +import { NewsItem } from './helpers/get_news_feed'; +import { render } from '../../../../utils/test_helper'; import { NewsFeed } from './news_feed'; const newsFeedItems = [ diff --git a/x-pack/plugins/observability/public/pages/overview/components/news_feed.tsx b/x-pack/plugins/observability/public/pages/overview/components/news_feed/news_feed.tsx similarity index 97% rename from x-pack/plugins/observability/public/pages/overview/components/news_feed.tsx rename to x-pack/plugins/observability/public/pages/overview/components/news_feed/news_feed.tsx index 0f8f948c7357e..7fad8c53564e1 100644 --- a/x-pack/plugins/observability/public/pages/overview/components/news_feed.tsx +++ b/x-pack/plugins/observability/public/pages/overview/components/news_feed/news_feed.tsx @@ -19,7 +19,7 @@ import { i18n } from '@kbn/i18n'; import { truncate } from 'lodash'; import React, { useContext } from 'react'; import { ThemeContext } from 'styled-components'; -import { NewsItem as INewsItem } from '../../../services/get_news_feed'; +import { NewsItem as INewsItem } from './helpers/get_news_feed'; import './news_feed.scss'; interface Props { diff --git a/x-pack/plugins/observability/public/components/app/observability_status/content.ts b/x-pack/plugins/observability/public/pages/overview/components/observability_status/content.ts similarity index 97% rename from x-pack/plugins/observability/public/components/app/observability_status/content.ts rename to x-pack/plugins/observability/public/pages/overview/components/observability_status/content.ts index 3081ee2ebf29b..dc7bada8faef1 100644 --- a/x-pack/plugins/observability/public/components/app/observability_status/content.ts +++ b/x-pack/plugins/observability/public/pages/overview/components/observability_status/content.ts @@ -6,8 +6,8 @@ */ import { i18n } from '@kbn/i18n'; import { HttpSetup, DocLinksStart } from '@kbn/core/public'; -import { ObservabilityFetchDataPlugins } from '../../../typings/fetch_overview_data'; -import { paths } from '../../../config/paths'; +import { ObservabilityFetchDataPlugins } from '../../../../typings/fetch_overview_data'; +import { paths } from '../../../../config/paths'; export interface ObservabilityStatusContent { id: ObservabilityFetchDataPlugins | 'alert'; diff --git a/x-pack/plugins/observability/public/components/app/observability_status/index.tsx b/x-pack/plugins/observability/public/pages/overview/components/observability_status/index.tsx similarity index 86% rename from x-pack/plugins/observability/public/components/app/observability_status/index.tsx rename to x-pack/plugins/observability/public/pages/overview/components/observability_status/index.tsx index f985eac84d72f..5e5a8f6253894 100644 --- a/x-pack/plugins/observability/public/components/app/observability_status/index.tsx +++ b/x-pack/plugins/observability/public/pages/overview/components/observability_status/index.tsx @@ -7,10 +7,10 @@ import React from 'react'; import { useKibana } from '@kbn/kibana-react-plugin/public'; -import { useHasData } from '../../../hooks/use_has_data'; +import { useHasData } from '../../../../hooks/use_has_data'; import { ObservabilityStatusBoxes } from './observability_status_boxes'; import { getContent } from './content'; -import { ObservabilityAppServices } from '../../../application/types'; +import { ObservabilityAppServices } from '../../../../application/types'; export function ObservabilityStatus() { const { http, docLinks } = useKibana().services; diff --git a/x-pack/plugins/observability/public/components/app/observability_status/observability_status.stories.tsx b/x-pack/plugins/observability/public/pages/overview/components/observability_status/observability_status.stories.tsx similarity index 100% rename from x-pack/plugins/observability/public/components/app/observability_status/observability_status.stories.tsx rename to x-pack/plugins/observability/public/pages/overview/components/observability_status/observability_status.stories.tsx diff --git a/x-pack/plugins/observability/public/components/app/observability_status/observability_status_box.test.tsx b/x-pack/plugins/observability/public/pages/overview/components/observability_status/observability_status_box.test.tsx similarity index 100% rename from x-pack/plugins/observability/public/components/app/observability_status/observability_status_box.test.tsx rename to x-pack/plugins/observability/public/pages/overview/components/observability_status/observability_status_box.test.tsx diff --git a/x-pack/plugins/observability/public/components/app/observability_status/observability_status_box.tsx b/x-pack/plugins/observability/public/pages/overview/components/observability_status/observability_status_box.tsx similarity index 98% rename from x-pack/plugins/observability/public/components/app/observability_status/observability_status_box.tsx rename to x-pack/plugins/observability/public/pages/overview/components/observability_status/observability_status_box.tsx index ad05ba3a3b878..f7a409edd9770 100644 --- a/x-pack/plugins/observability/public/components/app/observability_status/observability_status_box.tsx +++ b/x-pack/plugins/observability/public/pages/overview/components/observability_status/observability_status_box.tsx @@ -20,7 +20,7 @@ import { import React, { useCallback } from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; import { useUiTracker } from '@kbn/observability-shared-plugin/public'; -import { useKibana } from '../../../utils/kibana_react'; +import { useKibana } from '../../../../utils/kibana_react'; export interface ObservabilityStatusBoxProps { id: string; diff --git a/x-pack/plugins/observability/public/components/app/observability_status/observability_status_boxes.test.tsx b/x-pack/plugins/observability/public/pages/overview/components/observability_status/observability_status_boxes.test.tsx similarity index 100% rename from x-pack/plugins/observability/public/components/app/observability_status/observability_status_boxes.test.tsx rename to x-pack/plugins/observability/public/pages/overview/components/observability_status/observability_status_boxes.test.tsx diff --git a/x-pack/plugins/observability/public/components/app/observability_status/observability_status_boxes.tsx b/x-pack/plugins/observability/public/pages/overview/components/observability_status/observability_status_boxes.tsx similarity index 100% rename from x-pack/plugins/observability/public/components/app/observability_status/observability_status_boxes.tsx rename to x-pack/plugins/observability/public/pages/overview/components/observability_status/observability_status_boxes.tsx diff --git a/x-pack/plugins/observability/public/components/app/observability_status/observability_status_progress.test.tsx b/x-pack/plugins/observability/public/pages/overview/components/observability_status/observability_status_progress.test.tsx similarity index 92% rename from x-pack/plugins/observability/public/components/app/observability_status/observability_status_progress.test.tsx rename to x-pack/plugins/observability/public/pages/overview/components/observability_status/observability_status_progress.test.tsx index 38626ad0364cc..3e4deb315ab4e 100644 --- a/x-pack/plugins/observability/public/components/app/observability_status/observability_status_progress.test.tsx +++ b/x-pack/plugins/observability/public/pages/overview/components/observability_status/observability_status_progress.test.tsx @@ -6,8 +6,8 @@ */ import React from 'react'; import { render, screen, fireEvent } from '@testing-library/react'; -import { HasDataContextValue } from '../../../context/has_data_context'; -import * as hasDataHook from '../../../hooks/use_has_data'; +import { HasDataContextValue } from '../../../../context/has_data_context/has_data_context'; +import * as hasDataHook from '../../../../hooks/use_has_data'; import { ObservabilityStatusProgress } from './observability_status_progress'; import { I18nProvider } from '@kbn/i18n-react'; diff --git a/x-pack/plugins/observability/public/components/app/observability_status/observability_status_progress.tsx b/x-pack/plugins/observability/public/pages/overview/components/observability_status/observability_status_progress.tsx similarity index 97% rename from x-pack/plugins/observability/public/components/app/observability_status/observability_status_progress.tsx rename to x-pack/plugins/observability/public/pages/overview/components/observability_status/observability_status_progress.tsx index 53d0d13d0b2c4..75d3baf70db93 100644 --- a/x-pack/plugins/observability/public/components/app/observability_status/observability_status_progress.tsx +++ b/x-pack/plugins/observability/public/pages/overview/components/observability_status/observability_status_progress.tsx @@ -17,7 +17,7 @@ import { } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { useUiTracker } from '@kbn/observability-shared-plugin/public'; -import { useGuidedSetupProgress } from '../../../hooks/use_guided_setup_progress'; +import { useGuidedSetupProgress } from '../../../../hooks/use_guided_setup_progress'; interface ObservabilityStatusProgressProps { onViewDetailsClick: () => void; diff --git a/x-pack/plugins/observability/public/components/app/section/apm/index.test.tsx b/x-pack/plugins/observability/public/pages/overview/components/sections/apm/apm_section.test.tsx similarity index 88% rename from x-pack/plugins/observability/public/components/app/section/apm/index.test.tsx rename to x-pack/plugins/observability/public/pages/overview/components/sections/apm/apm_section.test.tsx index b09074501d533..6da498042f8fb 100644 --- a/x-pack/plugins/observability/public/components/app/section/apm/index.test.tsx +++ b/x-pack/plugins/observability/public/pages/overview/components/sections/apm/apm_section.test.tsx @@ -6,17 +6,17 @@ */ import React from 'react'; -import * as fetcherHook from '../../../../hooks/use_fetcher'; -import { render, data as dataMock } from '../../../../utils/test_helper'; +import * as fetcherHook from '@kbn/observability-shared-plugin/public/hooks/use_fetcher'; +import { render, data as dataMock } from '../../../../../utils/test_helper'; import { CoreStart } from '@kbn/core/public'; -import { ConfigSchema, ObservabilityPublicPluginsStart } from '../../../../plugin'; -import { APMSection } from '.'; +import { ConfigSchema, ObservabilityPublicPluginsStart } from '../../../../../plugin'; +import { APMSection } from './apm_section'; import { response } from './mock_data/apm.mock'; -import * as hasDataHook from '../../../../hooks/use_has_data'; -import * as pluginContext from '../../../../hooks/use_plugin_context'; -import { HasDataContextValue } from '../../../../context/has_data_context'; +import * as hasDataHook from '../../../../../hooks/use_has_data'; +import * as pluginContext from '../../../../../hooks/use_plugin_context'; +import { HasDataContextValue } from '../../../../../context/has_data_context/has_data_context'; import { AppMountParameters } from '@kbn/core/public'; -import { createObservabilityRuleTypeRegistryMock } from '../../../../rules/observability_rule_type_registry_mock'; +import { createObservabilityRuleTypeRegistryMock } from '../../../../../rules/observability_rule_type_registry_mock'; import { KibanaPageTemplate } from '@kbn/shared-ux-page-kibana-template'; jest.mock('react-router-dom', () => ({ diff --git a/x-pack/plugins/observability/public/components/app/section/apm/index.tsx b/x-pack/plugins/observability/public/pages/overview/components/sections/apm/apm_section.tsx similarity index 89% rename from x-pack/plugins/observability/public/components/app/section/apm/index.tsx rename to x-pack/plugins/observability/public/pages/overview/components/sections/apm/apm_section.tsx index 7765015c2d1d2..562d01265ac50 100644 --- a/x-pack/plugins/observability/public/components/app/section/apm/index.tsx +++ b/x-pack/plugins/observability/public/pages/overview/components/sections/apm/apm_section.tsx @@ -22,16 +22,15 @@ import moment from 'moment'; import React, { useContext } from 'react'; import { useHistory } from 'react-router-dom'; import { ThemeContext } from 'styled-components'; -import { useDatePickerContext } from '../../../../hooks/use_date_picker_context'; -import { SectionContainer } from '..'; -import { getDataHandler } from '../../../../data_handler'; -import { useChartTheme } from '../../../../hooks/use_chart_theme'; -import { FETCH_STATUS, useFetcher } from '../../../../hooks/use_fetcher'; -import { useHasData } from '../../../../hooks/use_has_data'; -import { ChartContainer } from '../../chart_container'; -import { StyledStat } from '../../styled_stat'; -import { onBrushEnd } from '../helper'; -import type { BucketSize } from '../../../../pages/overview/helpers/calculate_bucket_size'; +import { useChartTheme, FETCH_STATUS, useFetcher } from '@kbn/observability-shared-plugin/public'; +import { useDatePickerContext } from '../../../../../hooks/use_date_picker_context'; +import { SectionContainer } from '../section_container'; +import { getDataHandler } from '../../../../../context/has_data_context/data_handler'; +import { useHasData } from '../../../../../hooks/use_has_data'; +import { ChartContainer } from '../../chart_container/chart_container'; +import { StyledStat } from '../../styled_stat/styled_stat'; +import { onBrushEnd } from '../../../helpers/on_brush_end'; +import type { BucketSize } from '../../../helpers/calculate_bucket_size'; interface Props { bucketSize: BucketSize; diff --git a/x-pack/plugins/observability/public/components/app/section/apm/mock_data/apm.mock.ts b/x-pack/plugins/observability/public/pages/overview/components/sections/apm/mock_data/apm.mock.ts similarity index 98% rename from x-pack/plugins/observability/public/components/app/section/apm/mock_data/apm.mock.ts rename to x-pack/plugins/observability/public/pages/overview/components/sections/apm/mock_data/apm.mock.ts index b9a1f78ab16fa..5133e2a26dcb3 100644 --- a/x-pack/plugins/observability/public/components/app/section/apm/mock_data/apm.mock.ts +++ b/x-pack/plugins/observability/public/pages/overview/components/sections/apm/mock_data/apm.mock.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { ApmFetchDataResponse } from '../../../../../typings'; +import { ApmFetchDataResponse } from '../../../../../../typings'; export const response: ApmFetchDataResponse = { appLink: '/app/apm', diff --git a/x-pack/plugins/observability/public/pages/overview/components/empty_section.test.tsx b/x-pack/plugins/observability/public/pages/overview/components/sections/empty/empty_section.test.tsx similarity index 85% rename from x-pack/plugins/observability/public/pages/overview/components/empty_section.test.tsx rename to x-pack/plugins/observability/public/pages/overview/components/sections/empty/empty_section.test.tsx index 9ed2e0e59a76b..f603d58fc2685 100644 --- a/x-pack/plugins/observability/public/pages/overview/components/empty_section.test.tsx +++ b/x-pack/plugins/observability/public/pages/overview/components/sections/empty/empty_section.test.tsx @@ -6,13 +6,12 @@ */ import React from 'react'; -import { ISection } from '../../../typings/section'; -import { render } from '../../../utils/test_helper'; -import { EmptySection } from './empty_section'; +import { render } from '../../../../../utils/test_helper'; +import { EmptySection, Section } from './empty_section'; describe('EmptySection', () => { it('renders without action button', () => { - const section: ISection = { + const section: Section = { id: 'apm', title: 'APM', icon: 'logoObservability', @@ -25,7 +24,7 @@ describe('EmptySection', () => { expect(queryAllByText('Install agent')).toEqual([]); }); it('renders with action button', () => { - const section: ISection = { + const section: Section = { id: 'apm', title: 'APM', icon: 'logoObservability', diff --git a/x-pack/plugins/observability/public/pages/overview/components/empty_section.tsx b/x-pack/plugins/observability/public/pages/overview/components/sections/empty/empty_section.tsx similarity index 78% rename from x-pack/plugins/observability/public/pages/overview/components/empty_section.tsx rename to x-pack/plugins/observability/public/pages/overview/components/sections/empty/empty_section.tsx index 6d0fd6a1f3cde..39ec9c71223a5 100644 --- a/x-pack/plugins/observability/public/pages/overview/components/empty_section.tsx +++ b/x-pack/plugins/observability/public/pages/overview/components/sections/empty/empty_section.tsx @@ -5,12 +5,22 @@ * 2.0. */ -import { EuiButton, EuiEmptyPrompt, EuiText } from '@elastic/eui'; import React from 'react'; -import { ISection } from '../../../typings/section'; +import { EuiButton, EuiEmptyPrompt, EuiText } from '@elastic/eui'; +import { ObservabilityFetchDataPlugins } from '../../../../../typings'; + +export interface Section { + id: ObservabilityFetchDataPlugins | 'alert'; + title: string; + icon: string; + description: string; + href?: string; + linkTitle?: string; + target?: '_blank'; +} interface Props { - section: ISection; + section: Section; } export function EmptySection({ section }: Props) { diff --git a/x-pack/plugins/observability/public/pages/overview/components/empty_sections.tsx b/x-pack/plugins/observability/public/pages/overview/components/sections/empty/empty_sections.tsx similarity index 93% rename from x-pack/plugins/observability/public/pages/overview/components/empty_sections.tsx rename to x-pack/plugins/observability/public/pages/overview/components/sections/empty/empty_sections.tsx index bc91f20bf3b9c..0424e4865aa6f 100644 --- a/x-pack/plugins/observability/public/pages/overview/components/empty_sections.tsx +++ b/x-pack/plugins/observability/public/pages/overview/components/sections/empty/empty_sections.tsx @@ -11,13 +11,12 @@ import { ThemeContext } from 'styled-components'; import { useKibana } from '@kbn/kibana-react-plugin/public'; import { i18n } from '@kbn/i18n'; import { HttpSetup } from '@kbn/core/public'; +import { FETCH_STATUS } from '@kbn/observability-shared-plugin/public'; -import { ISection } from '../../../typings/section'; -import { paths } from '../../../config/paths'; -import { ObservabilityAppServices } from '../../../application/types'; -import { FETCH_STATUS } from '../../../hooks/use_fetcher'; -import { useHasData } from '../../../hooks/use_has_data'; -import { EmptySection } from './empty_section'; +import { paths } from '../../../../../config/paths'; +import { ObservabilityAppServices } from '../../../../../application/types'; +import { useHasData } from '../../../../../hooks/use_has_data'; +import { EmptySection, Section } from './empty_section'; export function EmptySections() { const { http } = useKibana().services; @@ -59,7 +58,7 @@ export function EmptySections() { ); } -const getEmptySections = ({ http }: { http: HttpSetup }): ISection[] => { +const getEmptySections = ({ http }: { http: HttpSetup }): Section[] => { return [ { id: 'infra_logs', diff --git a/x-pack/plugins/observability/public/components/app/section/error_panel/index.tsx b/x-pack/plugins/observability/public/pages/overview/components/sections/error_panel/error_panel.tsx similarity index 100% rename from x-pack/plugins/observability/public/components/app/section/error_panel/index.tsx rename to x-pack/plugins/observability/public/pages/overview/components/sections/error_panel/error_panel.tsx diff --git a/x-pack/plugins/observability/public/components/app/section/logs/index.tsx b/x-pack/plugins/observability/public/pages/overview/components/sections/logs/logs_section.tsx similarity index 87% rename from x-pack/plugins/observability/public/components/app/section/logs/index.tsx rename to x-pack/plugins/observability/public/pages/overview/components/sections/logs/logs_section.tsx index b9e6478a94036..55363e7272a1b 100644 --- a/x-pack/plugins/observability/public/components/app/section/logs/index.tsx +++ b/x-pack/plugins/observability/public/pages/overview/components/sections/logs/logs_section.tsx @@ -22,18 +22,17 @@ import { isEmpty } from 'lodash'; import moment from 'moment'; import React, { Fragment } from 'react'; import { useHistory } from 'react-router-dom'; -import { SectionContainer } from '..'; -import { getDataHandler } from '../../../../data_handler'; -import { useChartTheme } from '../../../../hooks/use_chart_theme'; -import { FETCH_STATUS, useFetcher } from '../../../../hooks/use_fetcher'; -import { useHasData } from '../../../../hooks/use_has_data'; -import { useDatePickerContext } from '../../../../hooks/use_date_picker_context'; -import { LogsFetchDataResponse } from '../../../../typings'; -import { formatStatValue } from '../../../../utils/format_stat_value'; -import { ChartContainer } from '../../chart_container'; -import { StyledStat } from '../../styled_stat'; -import { onBrushEnd } from '../helper'; -import type { BucketSize } from '../../../../pages/overview/helpers/calculate_bucket_size'; +import { useChartTheme, FETCH_STATUS, useFetcher } from '@kbn/observability-shared-plugin/public'; +import { SectionContainer } from '../section_container'; +import { getDataHandler } from '../../../../../context/has_data_context/data_handler'; +import { useHasData } from '../../../../../hooks/use_has_data'; +import { useDatePickerContext } from '../../../../../hooks/use_date_picker_context'; +import { LogsFetchDataResponse } from '../../../../../typings'; +import { formatStatValue } from '../../../../../utils/format_stat_value'; +import { ChartContainer } from '../../chart_container/chart_container'; +import { StyledStat } from '../../styled_stat/styled_stat'; +import { onBrushEnd } from '../../../helpers/on_brush_end'; +import type { BucketSize } from '../../../helpers/calculate_bucket_size'; interface Props { bucketSize: BucketSize; diff --git a/x-pack/plugins/observability/public/components/app/section/metrics/host_link.tsx b/x-pack/plugins/observability/public/pages/overview/components/sections/metrics/host_link.tsx similarity index 92% rename from x-pack/plugins/observability/public/components/app/section/metrics/host_link.tsx rename to x-pack/plugins/observability/public/pages/overview/components/sections/metrics/host_link.tsx index 81a641bb02a5b..91db16d08144a 100644 --- a/x-pack/plugins/observability/public/components/app/section/metrics/host_link.tsx +++ b/x-pack/plugins/observability/public/pages/overview/components/sections/metrics/host_link.tsx @@ -5,7 +5,7 @@ * 2.0. */ import React from 'react'; -import { StringOrNull } from '../../../..'; +import { StringOrNull } from '../../../../..'; interface Props { name: StringOrNull; diff --git a/x-pack/plugins/observability/public/components/app/section/metrics/lib/format_duration.test.ts b/x-pack/plugins/observability/public/pages/overview/components/sections/metrics/lib/format_duration.test.ts similarity index 100% rename from x-pack/plugins/observability/public/components/app/section/metrics/lib/format_duration.test.ts rename to x-pack/plugins/observability/public/pages/overview/components/sections/metrics/lib/format_duration.test.ts diff --git a/x-pack/plugins/observability/public/components/app/section/metrics/lib/format_duration.ts b/x-pack/plugins/observability/public/pages/overview/components/sections/metrics/lib/format_duration.ts similarity index 100% rename from x-pack/plugins/observability/public/components/app/section/metrics/lib/format_duration.ts rename to x-pack/plugins/observability/public/pages/overview/components/sections/metrics/lib/format_duration.ts diff --git a/x-pack/plugins/observability/public/components/app/section/metrics/logos/aix.svg b/x-pack/plugins/observability/public/pages/overview/components/sections/metrics/logos/aix.svg similarity index 100% rename from x-pack/plugins/observability/public/components/app/section/metrics/logos/aix.svg rename to x-pack/plugins/observability/public/pages/overview/components/sections/metrics/logos/aix.svg diff --git a/x-pack/plugins/observability/public/components/app/section/metrics/logos/android.svg b/x-pack/plugins/observability/public/pages/overview/components/sections/metrics/logos/android.svg similarity index 100% rename from x-pack/plugins/observability/public/components/app/section/metrics/logos/android.svg rename to x-pack/plugins/observability/public/pages/overview/components/sections/metrics/logos/android.svg diff --git a/x-pack/plugins/observability/public/components/app/section/metrics/logos/darwin.svg b/x-pack/plugins/observability/public/pages/overview/components/sections/metrics/logos/darwin.svg similarity index 100% rename from x-pack/plugins/observability/public/components/app/section/metrics/logos/darwin.svg rename to x-pack/plugins/observability/public/pages/overview/components/sections/metrics/logos/darwin.svg diff --git a/x-pack/plugins/observability/public/components/app/section/metrics/logos/dragonfly.svg b/x-pack/plugins/observability/public/pages/overview/components/sections/metrics/logos/dragonfly.svg similarity index 100% rename from x-pack/plugins/observability/public/components/app/section/metrics/logos/dragonfly.svg rename to x-pack/plugins/observability/public/pages/overview/components/sections/metrics/logos/dragonfly.svg diff --git a/x-pack/plugins/observability/public/components/app/section/metrics/logos/freebsd.svg b/x-pack/plugins/observability/public/pages/overview/components/sections/metrics/logos/freebsd.svg similarity index 100% rename from x-pack/plugins/observability/public/components/app/section/metrics/logos/freebsd.svg rename to x-pack/plugins/observability/public/pages/overview/components/sections/metrics/logos/freebsd.svg diff --git a/x-pack/plugins/observability/public/components/app/section/metrics/logos/illumos.svg b/x-pack/plugins/observability/public/pages/overview/components/sections/metrics/logos/illumos.svg similarity index 100% rename from x-pack/plugins/observability/public/components/app/section/metrics/logos/illumos.svg rename to x-pack/plugins/observability/public/pages/overview/components/sections/metrics/logos/illumos.svg diff --git a/x-pack/plugins/observability/public/components/app/section/metrics/logos/linux.svg b/x-pack/plugins/observability/public/pages/overview/components/sections/metrics/logos/linux.svg similarity index 100% rename from x-pack/plugins/observability/public/components/app/section/metrics/logos/linux.svg rename to x-pack/plugins/observability/public/pages/overview/components/sections/metrics/logos/linux.svg diff --git a/x-pack/plugins/observability/public/components/app/section/metrics/logos/netbsd.svg b/x-pack/plugins/observability/public/pages/overview/components/sections/metrics/logos/netbsd.svg similarity index 100% rename from x-pack/plugins/observability/public/components/app/section/metrics/logos/netbsd.svg rename to x-pack/plugins/observability/public/pages/overview/components/sections/metrics/logos/netbsd.svg diff --git a/x-pack/plugins/observability/public/components/app/section/metrics/logos/solaris.svg b/x-pack/plugins/observability/public/pages/overview/components/sections/metrics/logos/solaris.svg similarity index 100% rename from x-pack/plugins/observability/public/components/app/section/metrics/logos/solaris.svg rename to x-pack/plugins/observability/public/pages/overview/components/sections/metrics/logos/solaris.svg diff --git a/x-pack/plugins/observability/public/components/app/section/metrics/metric_with_sparkline.tsx b/x-pack/plugins/observability/public/pages/overview/components/sections/metrics/metric_with_sparkline.tsx similarity index 97% rename from x-pack/plugins/observability/public/components/app/section/metrics/metric_with_sparkline.tsx rename to x-pack/plugins/observability/public/pages/overview/components/sections/metrics/metric_with_sparkline.tsx index 828038fd75436..27a3aa200910f 100644 --- a/x-pack/plugins/observability/public/components/app/section/metrics/metric_with_sparkline.tsx +++ b/x-pack/plugins/observability/public/pages/overview/components/sections/metrics/metric_with_sparkline.tsx @@ -15,7 +15,7 @@ import { } from '@elastic/eui/dist/eui_charts_theme'; import { ThemeContext } from 'styled-components'; -import { NumberOrNull } from '../../../..'; +import { NumberOrNull } from '../../../../..'; interface Props { id: string; diff --git a/x-pack/plugins/observability/public/components/app/section/metrics/index.tsx b/x-pack/plugins/observability/public/pages/overview/components/sections/metrics/metrics_section.tsx similarity index 93% rename from x-pack/plugins/observability/public/components/app/section/metrics/index.tsx rename to x-pack/plugins/observability/public/pages/overview/components/sections/metrics/metrics_section.tsx index 481bf8476f1d7..99d526a66facd 100644 --- a/x-pack/plugins/observability/public/components/app/section/metrics/index.tsx +++ b/x-pack/plugins/observability/public/pages/overview/components/sections/metrics/metrics_section.tsx @@ -16,21 +16,21 @@ import { import numeral from '@elastic/numeral'; import { i18n } from '@kbn/i18n'; import React, { useState, useCallback } from 'react'; +import { FETCH_STATUS, useFetcher } from '@kbn/observability-shared-plugin/public'; import { MetricsFetchDataResponse, MetricsFetchDataSeries, NumberOrNull, StringOrNull, -} from '../../../..'; -import { SectionContainer } from '..'; -import { getDataHandler } from '../../../../data_handler'; -import { FETCH_STATUS, useFetcher } from '../../../../hooks/use_fetcher'; -import { useHasData } from '../../../../hooks/use_has_data'; -import { useDatePickerContext } from '../../../../hooks/use_date_picker_context'; +} from '../../../../..'; +import { SectionContainer } from '../section_container'; +import { getDataHandler } from '../../../../../context/has_data_context/data_handler'; +import { useHasData } from '../../../../../hooks/use_has_data'; +import { useDatePickerContext } from '../../../../../hooks/use_date_picker_context'; import { HostLink } from './host_link'; import { formatDuration } from './lib/format_duration'; import { MetricWithSparkline } from './metric_with_sparkline'; -import type { BucketSize } from '../../../../pages/overview/helpers/calculate_bucket_size'; +import type { BucketSize } from '../../../helpers/calculate_bucket_size'; const COLOR_ORANGE = 7; const COLOR_BLUE = 1; diff --git a/x-pack/plugins/observability/public/components/app/section/index.test.tsx b/x-pack/plugins/observability/public/pages/overview/components/sections/section_container.test.tsx similarity index 94% rename from x-pack/plugins/observability/public/components/app/section/index.test.tsx rename to x-pack/plugins/observability/public/pages/overview/components/sections/section_container.test.tsx index 7217dd78b677f..cb0ee8a71d63a 100644 --- a/x-pack/plugins/observability/public/components/app/section/index.test.tsx +++ b/x-pack/plugins/observability/public/pages/overview/components/sections/section_container.test.tsx @@ -6,8 +6,8 @@ */ import React from 'react'; -import { render } from '../../../utils/test_helper'; -import { SectionContainer } from '.'; +import { render } from '../../../../utils/test_helper'; +import { SectionContainer } from './section_container'; describe('SectionContainer', () => { it('renders section without app link', () => { diff --git a/x-pack/plugins/observability/public/components/app/section/index.tsx b/x-pack/plugins/observability/public/pages/overview/components/sections/section_container.tsx similarity index 91% rename from x-pack/plugins/observability/public/components/app/section/index.tsx rename to x-pack/plugins/observability/public/pages/overview/components/sections/section_container.tsx index def55cb57ba53..0e3aa52c7ad38 100644 --- a/x-pack/plugins/observability/public/components/app/section/index.tsx +++ b/x-pack/plugins/observability/public/pages/overview/components/sections/section_container.tsx @@ -16,9 +16,9 @@ import { } from '@elastic/eui'; import React from 'react'; import { useKibana } from '@kbn/kibana-react-plugin/public'; -import { ObservabilityAppServices } from '../../../application/types'; -import { ErrorPanel } from './error_panel'; -import { ExperimentalBadge } from '../../shared/experimental_badge'; +import { ObservabilityAppServices } from '../../../../application/types'; +import { ErrorPanel } from './error_panel/error_panel'; +import { ExperimentalBadge } from '../../../../components/experimental_badge'; interface AppLink { label: string; diff --git a/x-pack/plugins/observability/public/components/app/section/uptime/index.tsx b/x-pack/plugins/observability/public/pages/overview/components/sections/uptime/uptime_section.tsx similarity index 88% rename from x-pack/plugins/observability/public/components/app/section/uptime/index.tsx rename to x-pack/plugins/observability/public/pages/overview/components/sections/uptime/uptime_section.tsx index a7d482d6da2f6..5dbbcb6834017 100644 --- a/x-pack/plugins/observability/public/components/app/section/uptime/index.tsx +++ b/x-pack/plugins/observability/public/pages/overview/components/sections/uptime/uptime_section.tsx @@ -23,18 +23,21 @@ import moment from 'moment'; import React, { useContext } from 'react'; import { useHistory } from 'react-router-dom'; import { ThemeContext } from 'styled-components'; -import { useTimeZone } from '../../../../hooks/use_time_zone'; -import { SectionContainer } from '..'; -import { getDataHandler } from '../../../../data_handler'; -import { useChartTheme } from '../../../../hooks/use_chart_theme'; -import { FETCH_STATUS, useFetcher } from '../../../../hooks/use_fetcher'; -import { useHasData } from '../../../../hooks/use_has_data'; -import { useDatePickerContext } from '../../../../hooks/use_date_picker_context'; -import { Series } from '../../../../typings'; -import { ChartContainer } from '../../chart_container'; -import { StyledStat } from '../../styled_stat'; -import { onBrushEnd } from '../helper'; -import type { BucketSize } from '../../../../pages/overview/helpers/calculate_bucket_size'; +import { + useTimeZone, + useChartTheme, + useFetcher, + FETCH_STATUS, +} from '@kbn/observability-shared-plugin/public'; +import { SectionContainer } from '../section_container'; +import { getDataHandler } from '../../../../../context/has_data_context/data_handler'; +import { useHasData } from '../../../../../hooks/use_has_data'; +import { useDatePickerContext } from '../../../../../hooks/use_date_picker_context'; +import { Series } from '../../../../../typings'; +import { ChartContainer } from '../../chart_container/chart_container'; +import { StyledStat } from '../../styled_stat/styled_stat'; +import { onBrushEnd } from '../../../helpers/on_brush_end'; +import type { BucketSize } from '../../../helpers/calculate_bucket_size'; interface Props { bucketSize: BucketSize; diff --git a/x-pack/plugins/observability/public/components/app/section/ux/mock_data/ux.mock.ts b/x-pack/plugins/observability/public/pages/overview/components/sections/ux/mock_data/ux.mock.ts similarity index 89% rename from x-pack/plugins/observability/public/components/app/section/ux/mock_data/ux.mock.ts rename to x-pack/plugins/observability/public/pages/overview/components/sections/ux/mock_data/ux.mock.ts index 35fffa87dfeae..63d5843e20ff0 100644 --- a/x-pack/plugins/observability/public/components/app/section/ux/mock_data/ux.mock.ts +++ b/x-pack/plugins/observability/public/pages/overview/components/sections/ux/mock_data/ux.mock.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { UxFetchDataResponse } from '../../../../../typings'; +import { UxFetchDataResponse } from '../../../../../../typings'; export const response: UxFetchDataResponse = { appLink: '/app/ux', diff --git a/x-pack/plugins/observability/public/components/app/section/ux/index.test.tsx b/x-pack/plugins/observability/public/pages/overview/components/sections/ux/ux_section.test.tsx similarity index 89% rename from x-pack/plugins/observability/public/components/app/section/ux/index.test.tsx rename to x-pack/plugins/observability/public/pages/overview/components/sections/ux/ux_section.test.tsx index b263b5c1d5d50..2d7141b371f19 100644 --- a/x-pack/plugins/observability/public/components/app/section/ux/index.test.tsx +++ b/x-pack/plugins/observability/public/pages/overview/components/sections/ux/ux_section.test.tsx @@ -6,17 +6,17 @@ */ import React from 'react'; -import { HasDataContextValue } from '../../../../context/has_data_context'; -import * as fetcherHook from '../../../../hooks/use_fetcher'; -import * as hasDataHook from '../../../../hooks/use_has_data'; -import { render, data as dataMock } from '../../../../utils/test_helper'; -import { UXSection } from '.'; +import { HasDataContextValue } from '../../../../../context/has_data_context/has_data_context'; +import * as fetcherHook from '@kbn/observability-shared-plugin/public/hooks/use_fetcher'; +import * as hasDataHook from '../../../../../hooks/use_has_data'; +import { render, data as dataMock } from '../../../../../utils/test_helper'; +import { UXSection } from './ux_section'; import { response } from './mock_data/ux.mock'; import { LEGEND_GOOD_LABEL, LEGEND_NEEDS_IMPROVEMENT_LABEL, LEGEND_POOR_LABEL, -} from '../../../shared/core_web_vitals/translations'; +} from '../../../../../components/core_web_vitals/translations'; jest.mock('react-router-dom', () => ({ useLocation: () => ({ diff --git a/x-pack/plugins/observability/public/components/app/section/ux/index.tsx b/x-pack/plugins/observability/public/pages/overview/components/sections/ux/ux_section.tsx similarity index 83% rename from x-pack/plugins/observability/public/components/app/section/ux/index.tsx rename to x-pack/plugins/observability/public/pages/overview/components/sections/ux/ux_section.tsx index 35ead518c9152..29a9231f82839 100644 --- a/x-pack/plugins/observability/public/components/app/section/ux/index.tsx +++ b/x-pack/plugins/observability/public/pages/overview/components/sections/ux/ux_section.tsx @@ -10,16 +10,16 @@ import React from 'react'; import { useKibana } from '@kbn/kibana-react-plugin/public'; import { AllSeries } from '@kbn/exploratory-view-plugin/public'; import { SERVICE_NAME, TRANSACTION_DURATION } from '@kbn/observability-shared-plugin/common'; -import { UX_APP } from '../../../../context/constants'; -import { ObservabilityPublicPluginsStart } from '../../../..'; -import { SectionContainer } from '..'; -import { getDataHandler } from '../../../../data_handler'; -import { FETCH_STATUS, useFetcher } from '../../../../hooks/use_fetcher'; -import { useHasData } from '../../../../hooks/use_has_data'; -import { useDatePickerContext } from '../../../../hooks/use_date_picker_context'; -import CoreVitals from '../../../shared/core_web_vitals'; +import { FETCH_STATUS, useFetcher } from '@kbn/observability-shared-plugin/public'; +import { UX_APP } from '../../../../../context/constants'; +import { ObservabilityPublicPluginsStart } from '../../../../..'; +import { SectionContainer } from '../section_container'; +import { getDataHandler } from '../../../../../context/has_data_context/data_handler'; +import { useHasData } from '../../../../../hooks/use_has_data'; +import { useDatePickerContext } from '../../../../../hooks/use_date_picker_context'; +import CoreVitals from '../../../../../components/core_web_vitals/core_vitals'; -import type { BucketSize } from '../../../../pages/overview/helpers/calculate_bucket_size'; +import type { BucketSize } from '../../../helpers/calculate_bucket_size'; interface Props { bucketSize: BucketSize; } diff --git a/x-pack/plugins/observability/public/components/app/styled_stat/index.tsx b/x-pack/plugins/observability/public/pages/overview/components/styled_stat/styled_stat.tsx similarity index 100% rename from x-pack/plugins/observability/public/components/app/styled_stat/index.tsx rename to x-pack/plugins/observability/public/pages/overview/components/styled_stat/styled_stat.tsx diff --git a/x-pack/plugins/observability/public/pages/overview/overview.stories.tsx b/x-pack/plugins/observability/public/pages/overview/overview.stories.tsx index e17a527933806..774c5f8ba293b 100644 --- a/x-pack/plugins/observability/public/pages/overview/overview.stories.tsx +++ b/x-pack/plugins/observability/public/pages/overview/overview.stories.tsx @@ -13,9 +13,12 @@ import { MemoryRouter } from 'react-router-dom'; import { UI_SETTINGS } from '@kbn/data-plugin/public'; import { createKibanaReactContext } from '@kbn/kibana-react-plugin/public'; import { KibanaPageTemplate } from '@kbn/shared-ux-page-kibana-template'; -import { HasDataContextProvider } from '../../context/has_data_context'; -import { PluginContext } from '../../context/plugin_context'; -import { registerDataHandler, unregisterDataHandler } from '../../data_handler'; +import { PluginContext } from '../../context/plugin_context/plugin_context'; +import { HasDataContextProvider } from '../../context/has_data_context/has_data_context'; +import { + registerDataHandler, + unregisterDataHandler, +} from '../../context/has_data_context/data_handler'; import { OverviewPage } from './overview'; import { alertsFetchData } from './mock/alerts.mock'; import { emptyResponse as emptyAPMResponse, fetchApmData } from './mock/apm.mock'; diff --git a/x-pack/plugins/observability/public/pages/overview/overview.tsx b/x-pack/plugins/observability/public/pages/overview/overview.tsx index e4df5f3ae14f3..885ea6a80cc14 100644 --- a/x-pack/plugins/observability/public/pages/overview/overview.tsx +++ b/x-pack/plugins/observability/public/pages/overview/overview.tsx @@ -5,39 +5,38 @@ * 2.0. */ +import React, { useEffect, useMemo, useCallback, useState } from 'react'; import { EuiFlexGroup, EuiFlexItem, EuiHorizontalRule, EuiSpacer } from '@elastic/eui'; import { BoolQuery } from '@kbn/es-query'; import { i18n } from '@kbn/i18n'; import { useKibana } from '@kbn/kibana-react-plugin/public'; import { AlertConsumers } from '@kbn/rule-data-utils'; -import React, { useEffect, useMemo, useCallback, useState } from 'react'; +import { useBreadcrumbs, useFetcher } from '@kbn/observability-shared-plugin/public'; import type { ObservabilityAppServices } from '../../application/types'; import { LoadingObservability } from '../../components/loading_observability'; -import { HeaderActions } from './components/header_actions'; +import { HeaderActions } from './components/header_actions/header_actions'; import { DataAssistantFlyout } from './components/data_assistant_flyout'; -import { EmptySections } from './components/empty_sections'; -import { HeaderMenu } from './components/header_menu'; +import { EmptySections } from './components/sections/empty/empty_sections'; +import { HeaderMenu } from './components/header_menu/header_menu'; import { Resources } from './components/resources'; -import { NewsFeed } from './components/news_feed'; -import { ObservabilityStatusProgress } from '../../components/app/observability_status/observability_status_progress'; +import { NewsFeed } from './components/news_feed/news_feed'; +import { ObservabilityStatusProgress } from './components/observability_status/observability_status_progress'; import { observabilityAlertFeatureIds } from '../../config/alert_feature_ids'; import { paths } from '../../config/paths'; -import { useBreadcrumbs } from '../../hooks/use_breadcrumbs'; import { useDatePickerContext } from '../../hooks/use_date_picker_context'; -import { useFetcher } from '../../hooks/use_fetcher'; import { useGuidedSetupProgress } from '../../hooks/use_guided_setup_progress'; import { useHasData } from '../../hooks/use_has_data'; import { usePluginContext } from '../../hooks/use_plugin_context'; import { useTimeBuckets } from '../../hooks/use_time_buckets'; -import { getNewsFeed } from '../../services/get_news_feed'; +import { getNewsFeed } from './components/news_feed/helpers/get_news_feed'; import { buildEsQuery } from '../../utils/build_es_query'; import { getAlertSummaryTimeRange } from '../../utils/alert_summary_widget'; import { DEFAULT_DATE_FORMAT, DEFAULT_INTERVAL } from '../../constants'; import { calculateBucketSize } from './helpers/calculate_bucket_size'; import { useOverviewMetrics } from './helpers/use_overview_metrics'; -import { SectionContainer } from '../../components/app/section'; +import { SectionContainer } from './components/sections/section_container'; import { DataSections } from './components/data_sections'; const ALERTS_PER_PAGE = 10; diff --git a/x-pack/plugins/observability/public/pages/rule_details/index.tsx b/x-pack/plugins/observability/public/pages/rule_details/index.tsx index f045ec81ed6a1..d9e374d1ca8d1 100644 --- a/x-pack/plugins/observability/public/pages/rule_details/index.tsx +++ b/x-pack/plugins/observability/public/pages/rule_details/index.tsx @@ -38,12 +38,13 @@ import { Query, BoolQuery } from '@kbn/es-query'; import { ValidFeatureId } from '@kbn/rule-data-utils'; import { RuleDefinitionProps } from '@kbn/triggers-actions-ui-plugin/public'; import { useKibana } from '@kbn/kibana-react-plugin/public'; +import { useBreadcrumbs } from '@kbn/observability-shared-plugin/public'; import { fromQuery, toQuery } from '../../utils/url'; import { defaultTimeRange, getDefaultAlertSummaryTimeRange, } from '../../utils/alert_summary_widget'; -import { ObservabilityAlertSearchbarWithUrlSync } from '../../components/shared/alert_search_bar'; +import { ObservabilityAlertSearchbarWithUrlSync } from '../../components/alert_search_bar/alert_search_bar_with_url_sync'; import { DeleteModalConfirmation } from './components/delete_modal_confirmation'; import { CenterJustifiedSpinner } from '../../components/center_justified_spinner'; @@ -55,7 +56,6 @@ import { SEARCH_BAR_URL_STORAGE_KEY, } from './constants'; import { RuleDetailsPathParams, TabId } from './types'; -import { useBreadcrumbs } from '../../hooks/use_breadcrumbs'; import { usePluginContext } from '../../hooks/use_plugin_context'; import { useFetchRule } from '../../hooks/use_fetch_rule'; import { PageTitle } from './components'; diff --git a/x-pack/plugins/observability/public/pages/rules/rules.test.tsx b/x-pack/plugins/observability/public/pages/rules/rules.test.tsx index 1c0aeb3010a7c..8150f3b280df0 100644 --- a/x-pack/plugins/observability/public/pages/rules/rules.test.tsx +++ b/x-pack/plugins/observability/public/pages/rules/rules.test.tsx @@ -24,9 +24,7 @@ jest.mock('../../utils/kibana_react', () => ({ useKibana: jest.fn(() => mockUseKibanaReturnValue), })); -jest.mock('../../hooks/use_breadcrumbs', () => ({ - useBreadcrumbs: jest.fn(), -})); +jest.mock('@kbn/observability-shared-plugin/public'); jest.mock('@kbn/triggers-actions-ui-plugin/public', () => ({ useLoadRuleTypes: jest.fn(), diff --git a/x-pack/plugins/observability/public/pages/rules/rules.tsx b/x-pack/plugins/observability/public/pages/rules/rules.tsx index 40e4c2192a0c0..9b6e43501ebab 100644 --- a/x-pack/plugins/observability/public/pages/rules/rules.tsx +++ b/x-pack/plugins/observability/public/pages/rules/rules.tsx @@ -13,10 +13,10 @@ import { FormattedMessage } from '@kbn/i18n-react'; import { RuleStatus, useLoadRuleTypes } from '@kbn/triggers-actions-ui-plugin/public'; import { ALERTS_FEATURE_ID } from '@kbn/alerting-plugin/common'; import { createKbnUrlStateStorage } from '@kbn/kibana-utils-plugin/public'; +import { useBreadcrumbs } from '@kbn/observability-shared-plugin/public'; import { useKibana } from '../../utils/kibana_react'; import { usePluginContext } from '../../hooks/use_plugin_context'; -import { useBreadcrumbs } from '../../hooks/use_breadcrumbs'; import { useGetFilteredRuleTypes } from '../../hooks/use_get_filtered_rule_types'; export function RulesPage() { diff --git a/x-pack/plugins/observability/public/pages/slo_details/slo_details.test.tsx b/x-pack/plugins/observability/public/pages/slo_details/slo_details.test.tsx index 6268f3682fa55..fbcdf4c46272f 100644 --- a/x-pack/plugins/observability/public/pages/slo_details/slo_details.test.tsx +++ b/x-pack/plugins/observability/public/pages/slo_details/slo_details.test.tsx @@ -33,8 +33,8 @@ jest.mock('react-router-dom', () => ({ useParams: jest.fn(), })); +jest.mock('@kbn/observability-shared-plugin/public'); jest.mock('../../utils/kibana_react'); -jest.mock('../../hooks/use_breadcrumbs'); jest.mock('../../hooks/use_license'); jest.mock('../../hooks/slo/use_capabilities'); jest.mock('../../hooks/slo/use_fetch_active_alerts'); diff --git a/x-pack/plugins/observability/public/pages/slo_details/slo_details.tsx b/x-pack/plugins/observability/public/pages/slo_details/slo_details.tsx index 29a7f573e3c14..9f23c42b06d01 100644 --- a/x-pack/plugins/observability/public/pages/slo_details/slo_details.tsx +++ b/x-pack/plugins/observability/public/pages/slo_details/slo_details.tsx @@ -13,10 +13,10 @@ import { EuiLoadingSpinner } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import type { IBasePath } from '@kbn/core-http-browser'; import type { SLOWithSummaryResponse } from '@kbn/slo-schema'; +import { useBreadcrumbs } from '@kbn/observability-shared-plugin/public'; import { useKibana } from '../../utils/kibana_react'; import { usePluginContext } from '../../hooks/use_plugin_context'; -import { useBreadcrumbs } from '../../hooks/use_breadcrumbs'; import { useFetchSloDetails } from '../../hooks/slo/use_fetch_slo_details'; import { useLicense } from '../../hooks/use_license'; import PageNotFound from '../404'; diff --git a/x-pack/plugins/observability/public/pages/slo_edit/slo_edit.test.tsx b/x-pack/plugins/observability/public/pages/slo_edit/slo_edit.test.tsx index 87345723f48f9..20a5a8edbbf89 100644 --- a/x-pack/plugins/observability/public/pages/slo_edit/slo_edit.test.tsx +++ b/x-pack/plugins/observability/public/pages/slo_edit/slo_edit.test.tsx @@ -31,7 +31,7 @@ jest.mock('react-router-dom', () => ({ useParams: jest.fn(), })); -jest.mock('../../hooks/use_breadcrumbs'); +jest.mock('@kbn/observability-shared-plugin/public'); jest.mock('../../hooks/use_license'); jest.mock('../../hooks/use_fetch_indices'); jest.mock('../../hooks/slo/use_fetch_slo_details'); diff --git a/x-pack/plugins/observability/public/pages/slo_edit/slo_edit.tsx b/x-pack/plugins/observability/public/pages/slo_edit/slo_edit.tsx index ed3422c2ceb5a..bf2d792ff7cb5 100644 --- a/x-pack/plugins/observability/public/pages/slo_edit/slo_edit.tsx +++ b/x-pack/plugins/observability/public/pages/slo_edit/slo_edit.tsx @@ -8,11 +8,11 @@ import React from 'react'; import { useParams } from 'react-router-dom'; import { i18n } from '@kbn/i18n'; +import { useBreadcrumbs } from '@kbn/observability-shared-plugin/public'; import { paths } from '../../config/paths'; import { useKibana } from '../../utils/kibana_react'; import { usePluginContext } from '../../hooks/use_plugin_context'; -import { useBreadcrumbs } from '../../hooks/use_breadcrumbs'; import { useFetchSloDetails } from '../../hooks/slo/use_fetch_slo_details'; import { useLicense } from '../../hooks/use_license'; import { useCapabilities } from '../../hooks/slo/use_capabilities'; diff --git a/x-pack/plugins/observability/public/pages/slos/slos.test.tsx b/x-pack/plugins/observability/public/pages/slos/slos.test.tsx index f017f8690305f..ea03414ebebde 100644 --- a/x-pack/plugins/observability/public/pages/slos/slos.test.tsx +++ b/x-pack/plugins/observability/public/pages/slos/slos.test.tsx @@ -30,8 +30,8 @@ jest.mock('react-router-dom', () => ({ useParams: jest.fn(), })); +jest.mock('@kbn/observability-shared-plugin/public'); jest.mock('../../utils/kibana_react'); -jest.mock('../../hooks/use_breadcrumbs'); jest.mock('../../hooks/use_license'); jest.mock('../../hooks/slo/use_fetch_slo_list'); jest.mock('../../hooks/slo/use_create_slo'); diff --git a/x-pack/plugins/observability/public/pages/slos/slos.tsx b/x-pack/plugins/observability/public/pages/slos/slos.tsx index 6fe200b40523b..7ae94f3749d2d 100644 --- a/x-pack/plugins/observability/public/pages/slos/slos.tsx +++ b/x-pack/plugins/observability/public/pages/slos/slos.tsx @@ -8,11 +8,11 @@ import React, { useEffect, useState } from 'react'; import { EuiButton } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; +import { useBreadcrumbs } from '@kbn/observability-shared-plugin/public'; import { useKibana } from '../../utils/kibana_react'; import { usePluginContext } from '../../hooks/use_plugin_context'; import { useLicense } from '../../hooks/use_license'; -import { useBreadcrumbs } from '../../hooks/use_breadcrumbs'; import { useCapabilities } from '../../hooks/slo/use_capabilities'; import { useFetchSloList } from '../../hooks/slo/use_fetch_slo_list'; import { SloList } from './components/slo_list'; diff --git a/x-pack/plugins/observability/public/pages/slos_welcome/slos_welcome.test.tsx b/x-pack/plugins/observability/public/pages/slos_welcome/slos_welcome.test.tsx index 5b64c0ac5b5e5..35870cb2e4bc4 100644 --- a/x-pack/plugins/observability/public/pages/slos_welcome/slos_welcome.test.tsx +++ b/x-pack/plugins/observability/public/pages/slos_welcome/slos_welcome.test.tsx @@ -18,8 +18,8 @@ import { emptySloList, sloList } from '../../data/slo/slo'; import { useCapabilities } from '../../hooks/slo/use_capabilities'; import { paths } from '../../config/paths'; +jest.mock('@kbn/observability-shared-plugin/public'); jest.mock('../../utils/kibana_react'); -jest.mock('../../hooks/use_breadcrumbs'); jest.mock('../../hooks/use_license'); jest.mock('../../hooks/slo/use_fetch_slo_list'); jest.mock('../../hooks/slo/use_capabilities'); diff --git a/x-pack/plugins/observability/public/observability_public_plugins_start.mock.tsx b/x-pack/plugins/observability/public/plugin.mock.tsx similarity index 86% rename from x-pack/plugins/observability/public/observability_public_plugins_start.mock.tsx rename to x-pack/plugins/observability/public/plugin.mock.tsx index e05fecc8cb440..1a42c2ed98aa8 100644 --- a/x-pack/plugins/observability/public/observability_public_plugins_start.mock.tsx +++ b/x-pack/plugins/observability/public/plugin.mock.tsx @@ -7,22 +7,6 @@ import React from 'react'; import { mockCasesContract } from '@kbn/cases-plugin/public/mocks'; -const embeddableStartMock = { - createStart() { - return { - getEmbeddableFactory: jest.fn(), - getEmbeddableFactories: jest.fn(), - EmbeddablePanel: jest.fn(), - getStateTransfer: jest.fn(), - getAttributeService: jest.fn(), - telemetry: null, - inject: jest.fn(), - extract: jest.fn(), - getAllMigrations: jest.fn(), - }; - }, -}; - const triggersActionsUiStartMock = { createStart() { return { @@ -95,7 +79,6 @@ export const observabilityPublicPluginsStartMock = { createStart() { return { cases: mockCasesContract(), - embeddable: embeddableStartMock.createStart(), triggersActionsUi: triggersActionsUiStartMock.createStart(), data: data.createStart(), lens: null, diff --git a/x-pack/plugins/observability/public/plugin.ts b/x-pack/plugins/observability/public/plugin.ts index 7aa1cff813bfc..eb323a7110a32 100644 --- a/x-pack/plugins/observability/public/plugin.ts +++ b/x-pack/plugins/observability/public/plugin.ts @@ -53,12 +53,11 @@ import { RulesLocatorDefinition } from './locators/rules'; import { RuleDetailsLocatorDefinition } from './locators/rule_details'; import { SloDetailsLocatorDefinition } from './locators/slo_details'; import { observabilityAppId, observabilityFeatureId, casesPath } from '../common'; -import { registerDataHandler } from './data_handler'; +import { registerDataHandler } from './context/has_data_context/data_handler'; import { createObservabilityRuleTypeRegistry, ObservabilityRuleTypeRegistry, } from './rules/create_observability_rule_type_registry'; -import { createCallObservabilityApi } from './services/call_observability_api'; import { createUseRulesLink } from './hooks/create_use_rules_link'; import { registerObservabilityRuleTypes } from './rules/register_observability_rule_types'; @@ -187,8 +186,6 @@ export class Plugin const config = this.initContext.config.get(); const kibanaVersion = this.initContext.env.packageInfo.version; - createCallObservabilityApi(coreSetup.http); - this.observabilityRuleTypeRegistry = createObservabilityRuleTypeRegistry( pluginsSetup.triggersActionsUi.ruleTypeRegistry ); diff --git a/x-pack/plugins/observability/public/routes/index.tsx b/x-pack/plugins/observability/public/routes/index.tsx index 64aadaaca389b..bb398f0533c19 100644 --- a/x-pack/plugins/observability/public/routes/index.tsx +++ b/x-pack/plugins/observability/public/routes/index.tsx @@ -8,7 +8,7 @@ import * as t from 'io-ts'; import React from 'react'; import { useHistory, useLocation } from 'react-router-dom'; -import { DatePickerContextProvider } from '../context/date_picker_context'; +import { DatePickerContextProvider } from '../context/date_picker_context/date_picker_context'; import { useKibana } from '../utils/kibana_react'; import { AlertsPage } from '../pages/alerts/alerts'; import { AlertDetails } from '../pages/alert_details/alert_details'; diff --git a/x-pack/plugins/observability/public/rules/register_observability_rule_types.ts b/x-pack/plugins/observability/public/rules/register_observability_rule_types.ts index 8955798719095..213d5b4eaf768 100644 --- a/x-pack/plugins/observability/public/rules/register_observability_rule_types.ts +++ b/x-pack/plugins/observability/public/rules/register_observability_rule_types.ts @@ -12,7 +12,7 @@ import { SLO_ID_FIELD } from '../../common/field_names/infra_metrics'; import { ConfigSchema } from '../plugin'; import { ObservabilityRuleTypeRegistry } from './create_observability_rule_type_registry'; import { SLO_BURN_RATE_RULE_ID } from '../../common/constants'; -import { validateBurnRateRule } from '../components/app/burn_rate_rule_editor/validation'; +import { validateBurnRateRule } from '../components/burn_rate_rule_editor/validation'; export const registerObservabilityRuleTypes = ( config: ConfigSchema, @@ -33,7 +33,7 @@ export const registerObservabilityRuleTypes = ( documentationUrl(docLinks) { return 'https://www.elastic.co/guide/en/observability/current/slo-burn-rate-alert.html'; }, - ruleParamsExpression: lazy(() => import('../components/app/burn_rate_rule_editor')), + ruleParamsExpression: lazy(() => import('../components/burn_rate_rule_editor')), validate: validateBurnRateRule, requiresAppContext: false, defaultActionMessage: i18n.translate( diff --git a/x-pack/plugins/observability/public/services/call_observability_api/index.ts b/x-pack/plugins/observability/public/services/call_observability_api/index.ts deleted file mode 100644 index f76f9f5cd7e07..0000000000000 --- a/x-pack/plugins/observability/public/services/call_observability_api/index.ts +++ /dev/null @@ -1,30 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { formatRequest } from '@kbn/server-route-repository'; -import type { HttpSetup } from '@kbn/core/public'; -import type { AbstractObservabilityClient, ObservabilityClient } from './types'; - -export let callObservabilityApi: ObservabilityClient = () => { - throw new Error('callObservabilityApi has not been initialized via createCallObservabilityApi'); -}; - -export function createCallObservabilityApi(http: HttpSetup) { - const client: AbstractObservabilityClient = (endpoint, options) => { - const { params: { path, body, query } = {}, ...rest } = options; - - const { method, pathname } = formatRequest(endpoint, path); - - return http[method](pathname, { - ...rest, - body, - query, - }); - }; - - callObservabilityApi = client; -} diff --git a/x-pack/plugins/observability/public/services/call_observability_api/types.ts b/x-pack/plugins/observability/public/services/call_observability_api/types.ts deleted file mode 100644 index 2d0231033ced7..0000000000000 --- a/x-pack/plugins/observability/public/services/call_observability_api/types.ts +++ /dev/null @@ -1,33 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import type { RouteRepositoryClient } from '@kbn/server-route-repository'; -import { HttpFetchOptions } from '@kbn/core/public'; -import type { - AbstractObservabilityServerRouteRepository, - ObservabilityServerRouteRepository, - ObservabilityAPIReturnType, -} from '../../../server'; - -export type ObservabilityClientOptions = Omit< - HttpFetchOptions, - 'query' | 'body' | 'pathname' | 'signal' -> & { - signal: AbortSignal | null; -}; - -export type AbstractObservabilityClient = RouteRepositoryClient< - AbstractObservabilityServerRouteRepository, - ObservabilityClientOptions & { params?: Record } ->; - -export type ObservabilityClient = RouteRepositoryClient< - ObservabilityServerRouteRepository, - ObservabilityClientOptions ->; - -export type { ObservabilityAPIReturnType }; diff --git a/x-pack/plugins/observability/public/services/navigation_registry.test.ts b/x-pack/plugins/observability/public/services/navigation_registry.test.ts deleted file mode 100644 index 7b330abc0f95d..0000000000000 --- a/x-pack/plugins/observability/public/services/navigation_registry.test.ts +++ /dev/null @@ -1,73 +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 { of, firstValueFrom } from 'rxjs'; -import { createNavigationRegistry } from './navigation_registry'; - -describe('Navigation registry', () => { - it('Allows the registration of, and access to, navigation sections', async () => { - const navigationRegistry = createNavigationRegistry(); - - navigationRegistry.registerSections( - of([ - { - label: 'Test A', - sortKey: 100, - entries: [ - { label: 'Url A', app: 'TestA', path: '/url-a' }, - { label: 'Url B', app: 'TestA', path: '/url-b' }, - ], - }, - { - label: 'Test B', - sortKey: 200, - entries: [ - { label: 'Url A', app: 'TestB', path: '/url-a' }, - { label: 'Url B', app: 'TestB', path: '/url-b' }, - ], - }, - ]) - ); - - const sections = await firstValueFrom(navigationRegistry.sections$); - - expect(sections).toEqual([ - { - label: 'Test A', - sortKey: 100, - entries: [ - { - label: 'Url A', - app: 'TestA', - path: '/url-a', - }, - { - label: 'Url B', - app: 'TestA', - path: '/url-b', - }, - ], - }, - { - label: 'Test B', - sortKey: 200, - entries: [ - { - label: 'Url A', - app: 'TestB', - path: '/url-a', - }, - { - label: 'Url B', - app: 'TestB', - path: '/url-b', - }, - ], - }, - ]); - }); -}); diff --git a/x-pack/plugins/observability/public/services/navigation_registry.ts b/x-pack/plugins/observability/public/services/navigation_registry.ts deleted file mode 100644 index 5f10a6f6c6851..0000000000000 --- a/x-pack/plugins/observability/public/services/navigation_registry.ts +++ /dev/null @@ -1,73 +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 { combineLatest, Observable, ReplaySubject } from 'rxjs'; -import { map, scan, shareReplay, switchMap } from 'rxjs/operators'; - -export interface NavigationSection { - // the label of the section, should be translated - label: string | undefined; - // the key to sort by in ascending order relative to other entries - sortKey: number; - // the entries to render inside the section - entries: NavigationEntry[]; - // shows beta badge besides the navigation label - isBetaFeature?: boolean; -} - -export interface NavigationEntry { - // the label of the menu entry, should be translated - label: string; - // the kibana app id - app: string; - // the path after the application prefix corresponding to this entry - path: string; - // whether to only match when the full path matches, defaults to `false` - matchFullPath?: boolean; - // whether to ignore trailing slashes, defaults to `true` - ignoreTrailingSlash?: boolean; - // handler to be called when the item is clicked - onClick?: (event: React.MouseEvent) => void; - // shows NEW badge besides the navigation label, which will automatically disappear when menu item is clicked. - isNewFeature?: boolean; - // shows technical preview lab icon if the feature is still in technical preview besides the navigation label - isTechnicalPreview?: boolean; - // shows beta badge besides the navigation label - isBetaFeature?: boolean; - // override default path matching logic to determine if nav entry is selected - matchPath?: (path: string) => boolean; -} - -export interface NavigationRegistry { - registerSections: (sections$: Observable) => void; - sections$: Observable; -} - -export const createNavigationRegistry = (): NavigationRegistry => { - const registeredSections$ = new ReplaySubject>(); - - const registerSections = (sections$: Observable) => { - registeredSections$.next(sections$); - }; - - const sections$: Observable = registeredSections$.pipe( - scan( - (accumulatedSections$, newSections) => accumulatedSections$.add(newSections), - new Set>() - ), - switchMap((registeredSections) => combineLatest([...registeredSections])), - map((registeredSections) => - registeredSections.flat().sort((first, second) => first.sortKey - second.sortKey) - ), - shareReplay(1) - ); - - return { - registerSections, - sections$, - }; -}; diff --git a/x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts b/x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts index 78837ed27f800..8de756af5ebd3 100644 --- a/x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts +++ b/x-pack/plugins/observability/public/typings/fetch_overview_data/index.ts @@ -6,7 +6,7 @@ */ import type { ObservabilityApp } from '../../../typings/common'; -import type { UXMetrics } from '../../components/shared/core_web_vitals'; +import type { UXMetrics } from '../../components/core_web_vitals/core_vitals'; import { ApmIndicesConfig } from '../../../common/typings'; export interface Stat { diff --git a/x-pack/plugins/observability/public/typings/section/index.ts b/x-pack/plugins/observability/public/typings/section/index.ts deleted file mode 100644 index e1c143ccd8228..0000000000000 --- a/x-pack/plugins/observability/public/typings/section/index.ts +++ /dev/null @@ -1,18 +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 { ObservabilityFetchDataPlugins } from '../fetch_overview_data'; - -export interface ISection { - id: ObservabilityFetchDataPlugins | 'alert'; - title: string; - icon: string; - description: string; - href?: string; - linkTitle?: string; - target?: '_blank'; -} diff --git a/x-pack/plugins/observability/public/update_global_navigation.test.tsx b/x-pack/plugins/observability/public/update_global_navigation.test.tsx deleted file mode 100644 index fa83388760957..0000000000000 --- a/x-pack/plugins/observability/public/update_global_navigation.test.tsx +++ /dev/null @@ -1,236 +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 { Subject } from 'rxjs'; -import { App, AppDeepLink, ApplicationStart, AppNavLinkStatus, AppUpdater } from '@kbn/core/public'; -import { casesFeatureId, sloFeatureId } from '../common'; -import { updateGlobalNavigation } from './update_global_navigation'; - -// Used in updater callback -const app = {} as unknown as App; - -describe('updateGlobalNavigation', () => { - describe('when no observability apps are enabled', () => { - it('hides the overview link', () => { - const capabilities = { - navLinks: { apm: false, logs: false, metrics: false, uptime: false }, - } as unknown as ApplicationStart['capabilities']; - const deepLinks: AppDeepLink[] = []; - const callback = jest.fn(); - const updater$ = { - next: (cb: AppUpdater) => callback(cb(app)), - } as unknown as Subject; - - updateGlobalNavigation({ capabilities, deepLinks, updater$ }); - - expect(callback).toHaveBeenCalledWith({ - deepLinks, - navLinkStatus: AppNavLinkStatus.hidden, - }); - }); - }); - - describe('when one observability app is enabled', () => { - it('shows the overview link', () => { - const capabilities = { - navLinks: { apm: true, logs: false, metrics: false, uptime: false }, - } as unknown as ApplicationStart['capabilities']; - const deepLinks: AppDeepLink[] = []; - const callback = jest.fn(); - const updater$ = { - next: (cb: AppUpdater) => callback(cb(app)), - } as unknown as Subject; - - updateGlobalNavigation({ capabilities, deepLinks, updater$ }); - - expect(callback).toHaveBeenCalledWith({ - deepLinks, - navLinkStatus: AppNavLinkStatus.visible, - }); - }); - - describe('when cases are enabled', () => { - it('shows the cases deep link', () => { - const capabilities = { - [casesFeatureId]: { read_cases: true }, - navLinks: { apm: true, logs: false, metrics: false, uptime: false }, - } as unknown as ApplicationStart['capabilities']; - - const caseRoute = { - id: 'cases', - title: 'Cases', - order: 8003, - path: '/cases', - navLinkStatus: AppNavLinkStatus.hidden, - }; - - const deepLinks = [caseRoute]; - - const callback = jest.fn(); - const updater$ = { - next: (cb: AppUpdater) => callback(cb(app)), - } as unknown as Subject; - - updateGlobalNavigation({ capabilities, deepLinks, updater$ }); - - expect(callback).toHaveBeenCalledWith({ - deepLinks: [ - { - ...caseRoute, - navLinkStatus: AppNavLinkStatus.visible, - }, - ], - navLinkStatus: AppNavLinkStatus.visible, - }); - }); - }); - - describe('with no case read capabilities', () => { - it('hides the cases deep link', () => { - const capabilities = { - [casesFeatureId]: { read_cases: false }, - navLinks: { apm: true, logs: false, metrics: false, uptime: false }, - } as unknown as ApplicationStart['capabilities']; - - const caseRoute = { - id: 'cases', - title: 'Cases', - order: 8003, - path: '/cases', - navLinkStatus: AppNavLinkStatus.hidden, - }; - - const deepLinks = [caseRoute]; - - const callback = jest.fn(); - const updater$ = { - next: (cb: AppUpdater) => callback(cb(app)), - } as unknown as Subject; - - updateGlobalNavigation({ capabilities, deepLinks, updater$ }); - - expect(callback).toHaveBeenCalledWith({ - deepLinks: [ - { - ...caseRoute, - navLinkStatus: AppNavLinkStatus.hidden, - }, - ], - navLinkStatus: AppNavLinkStatus.visible, - }); - }); - }); - - describe('when alerts are enabled', () => { - it('shows the alerts deep link', () => { - const capabilities = { - [casesFeatureId]: { read_cases: true }, - navLinks: { apm: true, logs: false, metrics: false, uptime: false }, - } as unknown as ApplicationStart['capabilities']; - - const deepLinks = [ - { - id: 'alerts', - title: 'Alerts', - order: 8001, - path: '/alerts', - navLinkStatus: AppNavLinkStatus.hidden, - }, - ]; - const callback = jest.fn(); - const updater$ = { - next: (cb: AppUpdater) => callback(cb(app)), - } as unknown as Subject; - - updateGlobalNavigation({ capabilities, deepLinks, updater$ }); - - expect(callback).toHaveBeenCalledWith({ - deepLinks: [ - { - id: 'alerts', - title: 'Alerts', - order: 8001, - path: '/alerts', - navLinkStatus: AppNavLinkStatus.visible, - }, - ], - navLinkStatus: AppNavLinkStatus.visible, - }); - }); - }); - - it("hides the slo link when the capabilities don't include it", () => { - const capabilities = { - navLinks: { apm: true, logs: false, metrics: false, uptime: false }, - } as unknown as ApplicationStart['capabilities']; - - const sloRoute = { - id: 'slos', - title: 'SLOs', - order: 8002, - path: '/slos', - navLinkStatus: AppNavLinkStatus.hidden, - }; - - const deepLinks = [sloRoute]; - - const callback = jest.fn(); - const updater$ = { - next: (cb: AppUpdater) => callback(cb(app)), - } as unknown as Subject; - - updateGlobalNavigation({ capabilities, deepLinks, updater$ }); - - expect(callback).toHaveBeenCalledWith({ - deepLinks: [ - { - ...sloRoute, - navLinkStatus: AppNavLinkStatus.hidden, - }, - ], - navLinkStatus: AppNavLinkStatus.visible, - }); - }); - - describe('when slos are enabled', () => { - it('shows the slos deep link', () => { - const capabilities = { - [casesFeatureId]: { read_cases: true }, - [sloFeatureId]: { read: true }, - navLinks: { apm: false, logs: false, metrics: false, uptime: false }, - } as unknown as ApplicationStart['capabilities']; - - const sloRoute = { - id: 'slos', - title: 'SLOs', - order: 8002, - path: '/slos', - navLinkStatus: AppNavLinkStatus.hidden, - }; - - const deepLinks = [sloRoute]; - - const callback = jest.fn(); - const updater$ = { - next: (cb: AppUpdater) => callback(cb(app)), - } as unknown as Subject; - - updateGlobalNavigation({ capabilities, deepLinks, updater$ }); - - expect(callback).toHaveBeenCalledWith({ - deepLinks: [ - { - ...sloRoute, - navLinkStatus: AppNavLinkStatus.visible, - }, - ], - navLinkStatus: AppNavLinkStatus.visible, - }); - }); - }); - }); -}); diff --git a/x-pack/plugins/observability/public/update_global_navigation.tsx b/x-pack/plugins/observability/public/update_global_navigation.tsx deleted file mode 100644 index 26e3f191ac569..0000000000000 --- a/x-pack/plugins/observability/public/update_global_navigation.tsx +++ /dev/null @@ -1,69 +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 { Subject } from 'rxjs'; -import { AppNavLinkStatus, AppUpdater, ApplicationStart, AppDeepLink } from '@kbn/core/public'; -import { CasesDeepLinkId } from '@kbn/cases-plugin/public'; -import { casesFeatureId, sloFeatureId } from '../common'; - -export function updateGlobalNavigation({ - capabilities, - deepLinks, - updater$, -}: { - capabilities: ApplicationStart['capabilities']; - deepLinks: AppDeepLink[]; - updater$: Subject; -}) { - const { apm, logs, metrics, uptime } = capabilities.navLinks; - const someVisible = Object.values({ - apm, - logs, - metrics, - uptime, - }).some((visible) => visible); - - const updatedDeepLinks = deepLinks.map((link) => { - switch (link.id) { - case CasesDeepLinkId.cases: - return { - ...link, - navLinkStatus: - capabilities[casesFeatureId].read_cases && someVisible - ? AppNavLinkStatus.visible - : AppNavLinkStatus.hidden, - }; - case 'alerts': - return { - ...link, - navLinkStatus: someVisible ? AppNavLinkStatus.visible : AppNavLinkStatus.hidden, - }; - case 'rules': - return { - ...link, - navLinkStatus: someVisible ? AppNavLinkStatus.visible : AppNavLinkStatus.hidden, - }; - case 'slos': - return { - ...link, - navLinkStatus: !!capabilities[sloFeatureId]?.read - ? AppNavLinkStatus.visible - : AppNavLinkStatus.hidden, - }; - default: - return link; - } - }); - - updater$.next(() => ({ - deepLinks: updatedDeepLinks, - navLinkStatus: - someVisible || !!capabilities[sloFeatureId]?.read - ? AppNavLinkStatus.visible - : AppNavLinkStatus.hidden, - })); -} diff --git a/x-pack/plugins/observability/public/utils/kibana_react.mock.ts b/x-pack/plugins/observability/public/utils/kibana_react.mock.ts index 34721c988a2b2..1e854540afb5c 100644 --- a/x-pack/plugins/observability/public/utils/kibana_react.mock.ts +++ b/x-pack/plugins/observability/public/utils/kibana_react.mock.ts @@ -7,7 +7,7 @@ import { casesPluginMock } from '@kbn/cases-plugin/public/mocks'; import { coreMock, notificationServiceMock, overlayServiceMock } from '@kbn/core/public/mocks'; -import { observabilityPublicPluginsStartMock } from '../observability_public_plugins_start.mock'; +import { observabilityPublicPluginsStartMock } from '../plugin.mock'; export const kibanaStartMock = { startContract() { diff --git a/x-pack/plugins/observability/public/utils/kibana_react.storybook_decorator.tsx b/x-pack/plugins/observability/public/utils/kibana_react.storybook_decorator.tsx index c79428b508ef0..1c2367fb5e17e 100644 --- a/x-pack/plugins/observability/public/utils/kibana_react.storybook_decorator.tsx +++ b/x-pack/plugins/observability/public/utils/kibana_react.storybook_decorator.tsx @@ -13,7 +13,7 @@ import { KibanaPageTemplate } from '@kbn/shared-ux-page-kibana-template'; import { CoreTheme } from '@kbn/core-theme-browser'; import { MemoryRouter } from 'react-router-dom'; import { casesFeatureId, sloFeatureId } from '../../common'; -import { PluginContext } from '../context/plugin_context'; +import { PluginContext } from '../context/plugin_context/plugin_context'; import { createObservabilityRuleTypeRegistryMock } from '../rules/observability_rule_type_registry_mock'; import { ConfigSchema } from '../plugin'; diff --git a/x-pack/plugins/observability/public/utils/navigation_warning_prompt/context.tsx b/x-pack/plugins/observability/public/utils/navigation_warning_prompt/context.tsx deleted file mode 100644 index 73e0502890728..0000000000000 --- a/x-pack/plugins/observability/public/utils/navigation_warning_prompt/context.tsx +++ /dev/null @@ -1,32 +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 React, { useState, PropsWithChildren } from 'react'; -import { createContext, useContext } from 'react'; - -interface ContextValues { - prompt?: string; - setPrompt: (prompt: string | undefined) => void; -} - -export const NavigationWarningPromptContext = createContext({ - setPrompt: (prompt: string | undefined) => {}, -}); - -export const useNavigationWarningPrompt = () => { - return useContext(NavigationWarningPromptContext); -}; - -export function NavigationWarningPromptProvider({ children }: PropsWithChildren<{}>) { - const [prompt, setPrompt] = useState(undefined); - - return ( - - {children} - - ); -} diff --git a/x-pack/plugins/observability/public/utils/navigation_warning_prompt/index.ts b/x-pack/plugins/observability/public/utils/navigation_warning_prompt/index.ts deleted file mode 100644 index 52e14b066a72c..0000000000000 --- a/x-pack/plugins/observability/public/utils/navigation_warning_prompt/index.ts +++ /dev/null @@ -1,9 +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. - */ - -export * from './context'; -export * from './prompt'; diff --git a/x-pack/plugins/observability/public/utils/navigation_warning_prompt/prompt.tsx b/x-pack/plugins/observability/public/utils/navigation_warning_prompt/prompt.tsx deleted file mode 100644 index f4d09e24c761c..0000000000000 --- a/x-pack/plugins/observability/public/utils/navigation_warning_prompt/prompt.tsx +++ /dev/null @@ -1,27 +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 React, { useEffect } from 'react'; -import { useNavigationWarningPrompt } from './context'; - -interface Props { - prompt?: string; -} - -// eslint-disable-next-line react/function-component-definition -export const Prompt: React.FC = ({ prompt }) => { - const { setPrompt } = useNavigationWarningPrompt(); - - useEffect(() => { - setPrompt(prompt); - return () => { - setPrompt(undefined); - }; - }, [prompt, setPrompt]); - - return null; -}; diff --git a/x-pack/plugins/observability/public/utils/test_helper.tsx b/x-pack/plugins/observability/public/utils/test_helper.tsx index 9d92b057d5081..9119212bf706e 100644 --- a/x-pack/plugins/observability/public/utils/test_helper.tsx +++ b/x-pack/plugins/observability/public/utils/test_helper.tsx @@ -18,7 +18,7 @@ import translations from '@kbn/translations-plugin/translations/ja-JP.json'; import { EuiThemeProvider } from '@kbn/kibana-react-plugin/common'; import { dataPluginMock } from '@kbn/data-plugin/public/mocks'; -import { PluginContext } from '../context/plugin_context'; +import { PluginContext } from '../context/plugin_context/plugin_context'; import { createObservabilityRuleTypeRegistryMock } from '../rules/observability_rule_type_registry_mock'; import { ConfigSchema } from '../plugin'; import { Subset } from '../typings'; diff --git a/x-pack/plugins/observability/tsconfig.json b/x-pack/plugins/observability/tsconfig.json index ed6cd74104e88..a1f9f56963498 100644 --- a/x-pack/plugins/observability/tsconfig.json +++ b/x-pack/plugins/observability/tsconfig.json @@ -9,7 +9,7 @@ "public/**/*.json", "server/**/*", "typings/**/*", - "../../../typings/**/*", + "../../../typings/**/*" ], "kbn_references": [ "@kbn/core", @@ -41,14 +41,11 @@ "@kbn/std", "@kbn/i18n-react", "@kbn/utility-types", - "@kbn/es-types", - "@kbn/rison", "@kbn/datemath", "@kbn/core-ui-settings-browser", "@kbn/es-query", "@kbn/server-route-repository", "@kbn/ui-theme", - "@kbn/shared-ux-page-kibana-template-mocks", "@kbn/test-jest-helpers", "@kbn/core-http-browser", "@kbn/config-schema", @@ -73,7 +70,5 @@ "@kbn/observability-shared-plugin", "@kbn/exploratory-view-plugin" ], - "exclude": [ - "target/**/*" - ] + "exclude": ["target/**/*"] } diff --git a/x-pack/plugins/observability_shared/kibana.jsonc b/x-pack/plugins/observability_shared/kibana.jsonc index 91b5a9c7d5760..4206097c764e8 100644 --- a/x-pack/plugins/observability_shared/kibana.jsonc +++ b/x-pack/plugins/observability_shared/kibana.jsonc @@ -1,7 +1,7 @@ { "type": "plugin", "id": "@kbn/observability-shared-plugin", - "owner": "@elastic/actionable-observability", + "owner": "@elastic/observability-ui", "plugin": { "id": "observabilityShared", "server": false, diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index ae13d7dc45f3a..ae474ff8410f2 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -25071,10 +25071,6 @@ "xpack.observability.enableAwsLambdaMetricsDescription": "{technicalPreviewLabel} Affichez les indicateurs Amazon Lambda dans l'onglet d'indicateurs de service. {feedbackLink}", "xpack.observability.enableCriticalPathDescription": "{technicalPreviewLabel} Affichez de façon optionnelle le chemin critique d'une trace.", "xpack.observability.enableInfrastructureHostsViewDescription": "{technicalPreviewLabel} Activez la vue Hôtes dans l'application Infrastructure. {feedbackLink}.", - "xpack.observability.fieldValueSelection.apply.label": "Appliquer les filtres sélectionnés pour {label}", - "xpack.observability.fieldValueSelection.placeholder": "Filtrer {label}", - "xpack.observability.fieldValueSelection.placeholder.search": "Rechercher {label}", - "xpack.observability.filterButton.label": "développe le groupe de filtres pour le filtre {label}", "xpack.observability.ruleDetails.executionLogError": "Impossible de charger le log d'exécution de la règle. Raison : {message}", "xpack.observability.ruleDetails.ruleLoadError": "Impossible de charger la règle. Raison : {message}", "xpack.observability.rules.deleteSelectedIdsConfirmModal.deleteButtonLabel": "Supprimer {numIdsToDelete, plural, one {{singleTitle}} other {# {multipleTitle}}} ", @@ -25090,7 +25086,6 @@ "xpack.observability.ux.coreVitals.paletteLegend.rankPercentage": "{labelsInd} ({ranksInd} %)", "xpack.observability.ux.dashboard.webCoreVitals.traffic": "{trafficPerc} du trafic représenté", "xpack.observability.ux.dashboard.webVitals.palette.tooltip": "{percentage} % d'utilisateurs avec expérience {exp}, car {title} {isOrTakes} {moreOrLess} que {value}{averageMessage}.", - "xpack.observability..synthetics.addDataButtonLabel": "Ajouter des données synthétiques", "xpack.observability.alertDetails.actionsButtonLabel": "Actions", "xpack.observability.alertDetails.addToCase": "Ajouter au cas", "xpack.observability.alertDetails.editSnoozeRule": "Répéter la règle", @@ -25156,7 +25151,6 @@ "xpack.observability.apmServiceInventoryOptimizedSorting": "Optimiser les performances de chargement des listes de services dans APM", "xpack.observability.apmTraceExplorerTab": "Explorateur de traces APM", "xpack.observability.breadcrumbs.alertsLinkText": "Alertes", - "xpack.observability.breadcrumbs.observabilityLinkText": "Observabilité", "xpack.observability.breadcrumbs.overviewLinkText": "Aperçu", "xpack.observability.breadcrumbs.rulesLinkText": "Règles", "xpack.observability.breadcrumbs.sloDetailsLinkText": "Détails", @@ -25201,9 +25195,6 @@ "xpack.observability.featureRegistry.deleteSubFeatureName": "Supprimer", "xpack.observability.featureRegistry.linkObservabilityTitle": "Cas", "xpack.observability.feedbackMenu.appName": "Observabilité", - "xpack.observability.fieldValueSelection.apply": "Appliquer", - "xpack.observability.fieldValueSelection.loading": "Chargement", - "xpack.observability.fieldValueSelection.logicalAnd": "Utiliser AND logique", "xpack.observability.formatters.hoursTimeUnitLabel": "h", "xpack.observability.formatters.hoursTimeUnitLabelExtended": "heures", "xpack.observability.formatters.microsTimeUnitLabel": "μs", @@ -25229,10 +25220,6 @@ "xpack.observability.home.addData": "Ajouter des intégrations", "xpack.observability.maxSuggestionsUiSettingDescription": "Nombre maximal de suggestions récupérées pour les zones de saisie semi-automatique.", "xpack.observability.maxSuggestionsUiSettingName": "Nombre maximal de suggestions", - "xpack.observability.mobile.addDataButtonLabel": "Ajouter des données mobiles", - "xpack.observability.navigation.betaBadge": "Bêta", - "xpack.observability.navigation.experimentalBadgeLabel": "Version d'évaluation technique", - "xpack.observability.navigation.newBadge": "NOUVEAUTÉ", "xpack.observability.news.readFullStory": "Lire toute l'histoire", "xpack.observability.news.title": "Nouveautés", "xpack.observability.noDataConfig.beatsCard.description": "Utilisez des agents Beats et APM pour envoyer des données d'observabilité à Elasticsearch. Nous facilitons les choses en proposant un support technique pour un grand nombre de langues, d'applications et de systèmes courants.", @@ -25276,10 +25263,6 @@ "xpack.observability.overview.ux.pageLoadDistribution.title": "Distribution du chargement de la page", "xpack.observability.overview.ux.title": "Expérience utilisateur", "xpack.observability.overviewLinkTitle": "Aperçu", - "xpack.observability.page_header.addMobileDataLink.label": "Accédez à un tutoriel sur l'ajout de données APM mobiles.", - "xpack.observability.page_header.addUptimeDataLink.label": "Accédez à un tutoriel sur l'ajout de données Uptime", - "xpack.observability.page_header.addUXDataLink.label": "Accédez à un tutoriel sur l'ajout de données APM d'expérience utilisateur.", - "xpack.observability.pageLayout.sideNavTitle": "Observabilité", "xpack.observability.resources.documentation": "Documentation", "xpack.observability.resources.forum": "Forum de discussion", "xpack.observability.resources.quick_start": "Vidéos de démarrage rapide", @@ -25365,29 +25348,9 @@ "xpack.observability.statusVisualization.ux.goToAppTitle": "Afficher le tableau de bord", "xpack.observability.statusVisualization.ux.link": "Ajouter des données", "xpack.observability.statusVisualization.ux.title": "Expérience utilisateur", - "xpack.observability.tour.alertsStep.imageAltText": "Démonstration des alertes", - "xpack.observability.tour.alertsStep.tourContent": "Définissez et détectez les conditions qui déclenchent des alertes avec des intégrations de plateformes tierces comme l’e-mail, PagerDuty et Slack.", - "xpack.observability.tour.alertsStep.tourTitle": "Soyez informé en cas de modification", - "xpack.observability.tour.endButtonLabel": "Terminer la visite", - "xpack.observability.tour.guidedSetupStep.tourContent": "La façon la plus facile de continuer avec Elastic Observability est de suivre les prochaines étapes recommandées dans l'assistant de données.", - "xpack.observability.tour.guidedSetupStep.tourTitle": "Toujours plus avec Elastic Observability", - "xpack.observability.tour.metricsExplorerStep.imageAltText": "Démonstration de Metrics Explorer", - "xpack.observability.tour.metricsExplorerStep.tourContent": "Diffusez, regroupez et visualisez les mesures provenant de vos systèmes, du cloud, du réseau et d'autres sources d'infrastructure.", - "xpack.observability.tour.metricsExplorerStep.tourTitle": "Monitorer l’intégrité de votre infrastructure", - "xpack.observability.tour.nextButtonLabel": "Suivant", - "xpack.observability.tour.observabilityOverviewStep.tourContent": "Faites un tour rapide pour découvrir les avantages de disposer de toutes vos données d'observabilité dans une seule suite.", - "xpack.observability.tour.observabilityOverviewStep.tourTitle": "Bienvenue dans Elastic Observability", - "xpack.observability.tour.servicesStep.imageAltText": "Démonstration des services", - "xpack.observability.tour.servicesStep.tourContent": "Détectez et réparez rapidement les problèmes de performances en recueillant des informations détaillées sur vos services.", - "xpack.observability.tour.servicesStep.tourTitle": "Identifier et résoudre les problèmes d'application", - "xpack.observability.tour.skipButtonLabel": "Ignorer la visite", - "xpack.observability.tour.streamStep.imageAltText": "Démonstration du flux de logs", - "xpack.observability.tour.streamStep.tourContent": "Surveillez, filtrez et inspectez les événements de journal provenant de vos applications, serveurs, machines virtuelles et conteneurs.", - "xpack.observability.tour.streamStep.tourTitle": "Suivi de vos logs en temps réel", "xpack.observability.uiSettings.betaLabel": "bêta", "xpack.observability.uiSettings.giveFeedBackLabel": "Donner un retour", "xpack.observability.uiSettings.technicalPreviewLabel": "version d'évaluation technique", - "xpack.observability.ux.addDataButtonLabel": "Ajouter des données d'expérience utilisateur", "xpack.observability.ux.coreVitals.average": "une moyenne", "xpack.observability.ux.coreVitals.cls": "Cumulative Layout Shift", "xpack.observability.ux.coreVitals.cls.help": "Cumulative Layout Shift (CLS) : mesure la stabilité visuelle. Pour offrir une expérience agréable aux utilisateurs, les pages doivent conserver un CLS inférieur à 0,1.", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 04577628fc797..5d7975666d2cd 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -25056,10 +25056,6 @@ "xpack.observability.enableAwsLambdaMetricsDescription": "{technicalPreviewLabel} [サービスメトリック]タブにAmazon Lambdaメトリックを表示します。{feedbackLink}", "xpack.observability.enableCriticalPathDescription": "{technicalPreviewLabel} 任意で、トレースのクリティカルパスを表示します。", "xpack.observability.enableInfrastructureHostsViewDescription": "{technicalPreviewLabel}インフラアプリでホストビューを有効にします。{feedbackLink}。", - "xpack.observability.fieldValueSelection.apply.label": "{label}に選択したフィルターを適用", - "xpack.observability.fieldValueSelection.placeholder": "フィルター{label}", - "xpack.observability.fieldValueSelection.placeholder.search": "{label}を検索", - "xpack.observability.filterButton.label": "{label}フィルターのフィルターグループを展開", "xpack.observability.ruleDetails.executionLogError": "ルール実行ログを読み込めません。理由:{message}", "xpack.observability.ruleDetails.ruleLoadError": "ルールを読み込めません。理由:{message}", "xpack.observability.slo.alerting.burnRate.reason": "過去{longWindowDuration}のバーンレートは{longWindowBurnRate}で、過去{shortWindowDuration}のバーンレートは{shortWindowBurnRate}です。両期間とも{burnRateThreshold}を超えたらアラート", @@ -25071,7 +25067,6 @@ "xpack.observability.ux.coreVitals.paletteLegend.rankPercentage": "{labelsInd}({ranksInd}%)", "xpack.observability.ux.dashboard.webCoreVitals.traffic": "トラフィックの{trafficPerc}が表示されました", "xpack.observability.ux.dashboard.webVitals.palette.tooltip": "{percentage} %のユーザーが{exp}の経験をしているのは、{value}{averageMessage}よりも{title}{isOrTakes}{moreOrLess}の方が多いからです。", - "xpack.observability..synthetics.addDataButtonLabel": "Syntheticsデータの追加", "xpack.observability.alertDetails.actionsButtonLabel": "アクション", "xpack.observability.alertDetails.addToCase": "ケースに追加", "xpack.observability.alertDetails.editSnoozeRule": "ルールをスヌーズ", @@ -25137,7 +25132,6 @@ "xpack.observability.apmServiceInventoryOptimizedSorting": "APMでサービスリストの読み込みパフォーマンスを最適化", "xpack.observability.apmTraceExplorerTab": "APMトレースエクスプローラー", "xpack.observability.breadcrumbs.alertsLinkText": "アラート", - "xpack.observability.breadcrumbs.observabilityLinkText": "Observability", "xpack.observability.breadcrumbs.overviewLinkText": "概要", "xpack.observability.breadcrumbs.rulesLinkText": "ルール", "xpack.observability.breadcrumbs.sloDetailsLinkText": "詳細", @@ -25182,9 +25176,6 @@ "xpack.observability.featureRegistry.deleteSubFeatureName": "削除", "xpack.observability.featureRegistry.linkObservabilityTitle": "ケース", "xpack.observability.feedbackMenu.appName": "Observability", - "xpack.observability.fieldValueSelection.apply": "適用", - "xpack.observability.fieldValueSelection.loading": "読み込み中", - "xpack.observability.fieldValueSelection.logicalAnd": "論理ANDを使用", "xpack.observability.formatters.hoursTimeUnitLabel": "h", "xpack.observability.formatters.hoursTimeUnitLabelExtended": "時間", "xpack.observability.formatters.microsTimeUnitLabel": "μs", @@ -25210,10 +25201,6 @@ "xpack.observability.home.addData": "統合の追加", "xpack.observability.maxSuggestionsUiSettingDescription": "オートコンプリート選択ボックスに取得される候補の最大数。", "xpack.observability.maxSuggestionsUiSettingName": "最大候補数", - "xpack.observability.mobile.addDataButtonLabel": "モバイルデータの追加", - "xpack.observability.navigation.betaBadge": "ベータ", - "xpack.observability.navigation.experimentalBadgeLabel": "テクニカルプレビュー", - "xpack.observability.navigation.newBadge": "新規", "xpack.observability.news.readFullStory": "詳細なストーリーを読む", "xpack.observability.news.title": "新機能", "xpack.observability.noDataConfig.beatsCard.description": "BeatsとAPMエージェントを使用して、オブザーバビリティデータをElasticsearchに送信します。多数の一般的なシステム、アプリ、言語では、サポートによって処理が簡単になりました。", @@ -25257,10 +25244,6 @@ "xpack.observability.overview.ux.pageLoadDistribution.title": "ページ読み込み分布", "xpack.observability.overview.ux.title": "ユーザーエクスペリエンス", "xpack.observability.overviewLinkTitle": "概要", - "xpack.observability.page_header.addMobileDataLink.label": "モバイルAPMデータの追加に関するチュートリアルに移動", - "xpack.observability.page_header.addUptimeDataLink.label": "アップタイムデータの追加に関するチュートリアルに移動", - "xpack.observability.page_header.addUXDataLink.label": "ユーザーエクスペリエンスAPMデータの追加に関するチュートリアルに移動", - "xpack.observability.pageLayout.sideNavTitle": "Observability", "xpack.observability.resources.documentation": "ドキュメント", "xpack.observability.resources.forum": "ディスカッションフォーラム", "xpack.observability.resources.quick_start": "クイックスタートビデオ", @@ -25346,29 +25329,9 @@ "xpack.observability.statusVisualization.ux.goToAppTitle": "ダッシュボードを表示", "xpack.observability.statusVisualization.ux.link": "データの追加", "xpack.observability.statusVisualization.ux.title": "ユーザーエクスペリエンス", - "xpack.observability.tour.alertsStep.imageAltText": "アラートデモ", - "xpack.observability.tour.alertsStep.tourContent": "電子メール、PagerDuty、Slackなどのサードパーティプラットフォーム統合でアラートをトリガーする条件を定義して検出します。", - "xpack.observability.tour.alertsStep.tourTitle": "変更が発生したときに通知", - "xpack.observability.tour.endButtonLabel": "ツアーを終了", - "xpack.observability.tour.guidedSetupStep.tourContent": "Elasticオブザーバビリティに進む最も簡単な方法は、データアシスタントで推奨された次のステップに従うことです。", - "xpack.observability.tour.guidedSetupStep.tourTitle": "Elasticオブザーバビリティのその他の機能", - "xpack.observability.tour.metricsExplorerStep.imageAltText": "メトリックエクスプローラーのデモ", - "xpack.observability.tour.metricsExplorerStep.tourContent": "システム、クラウド、ネットワーク、その他のインフラストラクチャーソースからメトリックをストリーム、グループ化、可視化します。", - "xpack.observability.tour.metricsExplorerStep.tourTitle": "インフラストラクチャーの正常性を監視", - "xpack.observability.tour.nextButtonLabel": "次へ", - "xpack.observability.tour.observabilityOverviewStep.tourContent": "クイックガイドを表示し、オブザーバビリティデータすべてを1つのスタックに格納する利点をご覧ください。", - "xpack.observability.tour.observabilityOverviewStep.tourTitle": "Elasticオブザーバビリティへようこそ", - "xpack.observability.tour.servicesStep.imageAltText": "サービスのデモ", - "xpack.observability.tour.servicesStep.tourContent": "サービスに関する詳細情報を収集し、パフォーマンスの問題をすばやく検出、修正できます。", - "xpack.observability.tour.servicesStep.tourTitle": "アプリケーションの問題を特定して解決", - "xpack.observability.tour.skipButtonLabel": "ツアーをスキップ", - "xpack.observability.tour.streamStep.imageAltText": "ログストリームのデモ", - "xpack.observability.tour.streamStep.tourContent": "アプリケーション、サーバー、仮想マシン、コネクターからのログイベントを監視、フィルター、検査します。", - "xpack.observability.tour.streamStep.tourTitle": "リアルタイムでログを追跡", "xpack.observability.uiSettings.betaLabel": "ベータ", "xpack.observability.uiSettings.giveFeedBackLabel": "フィードバックを作成する", "xpack.observability.uiSettings.technicalPreviewLabel": "テクニカルプレビュー", - "xpack.observability.ux.addDataButtonLabel": "UXデータを追加", "xpack.observability.ux.coreVitals.average": "平均", "xpack.observability.ux.coreVitals.cls": "累積レイアウト変更", "xpack.observability.ux.coreVitals.cls.help": "累積レイアウト変更(CLS):視覚的な安定性を計測します。優れたユーザーエクスペリエンスを実現するには、ページのCLSを0.1未満に保ってください。", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index d48a7ee044126..56c6f55af4807 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -25070,10 +25070,6 @@ "xpack.observability.enableAwsLambdaMetricsDescription": "{technicalPreviewLabel} 在服务指标选项卡中显示 Amazon Lambda 指标。{feedbackLink}", "xpack.observability.enableCriticalPathDescription": "{technicalPreviewLabel}(可选)显示跟踪的关键路径。", "xpack.observability.enableInfrastructureHostsViewDescription": "{technicalPreviewLabel} 在 Infrastructure 应用中启用主机视图。{feedbackLink}。", - "xpack.observability.fieldValueSelection.apply.label": "为 {label} 应用选定筛选", - "xpack.observability.fieldValueSelection.placeholder": "筛选 {label}", - "xpack.observability.fieldValueSelection.placeholder.search": "搜索 {label}", - "xpack.observability.filterButton.label": "展开筛选 {label} 的筛选组", "xpack.observability.ruleDetails.executionLogError": "无法加载规则执行日志。原因:{message}", "xpack.observability.ruleDetails.ruleLoadError": "无法加载规则。原因:{message}", "xpack.observability.rules.deleteSelectedIdsConfirmModal.deleteButtonLabel": "删除{numIdsToDelete, plural, one {{singleTitle}} other {# 个{multipleTitle}}}", @@ -25089,7 +25085,6 @@ "xpack.observability.ux.coreVitals.paletteLegend.rankPercentage": "{labelsInd} ({ranksInd}%)", "xpack.observability.ux.dashboard.webCoreVitals.traffic": "已占 {trafficPerc} 的流量", "xpack.observability.ux.dashboard.webVitals.palette.tooltip": "{percentage} 的用户具有{exp}体验,因为 {title} {isOrTakes} {moreOrLess}于 {value}{averageMessage}", - "xpack.observability..synthetics.addDataButtonLabel": "添加 Synthetics 数据", "xpack.observability.alertDetails.actionsButtonLabel": "操作", "xpack.observability.alertDetails.addToCase": "添加到案例", "xpack.observability.alertDetails.editSnoozeRule": "暂停规则", @@ -25155,7 +25150,6 @@ "xpack.observability.apmServiceInventoryOptimizedSorting": "优化 APM 中的服务列表加载性能", "xpack.observability.apmTraceExplorerTab": "APM Trace Explorer", "xpack.observability.breadcrumbs.alertsLinkText": "告警", - "xpack.observability.breadcrumbs.observabilityLinkText": "Observability", "xpack.observability.breadcrumbs.overviewLinkText": "概览", "xpack.observability.breadcrumbs.rulesLinkText": "规则", "xpack.observability.breadcrumbs.sloDetailsLinkText": "详情", @@ -25200,9 +25194,6 @@ "xpack.observability.featureRegistry.deleteSubFeatureName": "删除", "xpack.observability.featureRegistry.linkObservabilityTitle": "案例", "xpack.observability.feedbackMenu.appName": "Observability", - "xpack.observability.fieldValueSelection.apply": "应用", - "xpack.observability.fieldValueSelection.loading": "正在加载", - "xpack.observability.fieldValueSelection.logicalAnd": "使用逻辑 AND", "xpack.observability.formatters.hoursTimeUnitLabel": "h", "xpack.observability.formatters.hoursTimeUnitLabelExtended": "小时", "xpack.observability.formatters.microsTimeUnitLabel": "μs", @@ -25228,10 +25219,6 @@ "xpack.observability.home.addData": "添加集成", "xpack.observability.maxSuggestionsUiSettingDescription": "在自动完成选择框中提取的最大建议数。", "xpack.observability.maxSuggestionsUiSettingName": "最大建议数", - "xpack.observability.mobile.addDataButtonLabel": "添加移动数据", - "xpack.observability.navigation.betaBadge": "公测版", - "xpack.observability.navigation.experimentalBadgeLabel": "技术预览", - "xpack.observability.navigation.newBadge": "新建", "xpack.observability.news.readFullStory": "详细了解", "xpack.observability.news.title": "最新动态", "xpack.observability.noDataConfig.beatsCard.description": "使用 Beats 和 APM 代理将 Observability 数据发送到 Elasticsearch。我们使许多流行系统、应用和语言都可以轻松获取支持。", @@ -25275,10 +25262,6 @@ "xpack.observability.overview.ux.pageLoadDistribution.title": "页面加载分布", "xpack.observability.overview.ux.title": "用户体验", "xpack.observability.overviewLinkTitle": "概览", - "xpack.observability.page_header.addMobileDataLink.label": "导航到有关如何添加移动 APM 数据的教程", - "xpack.observability.page_header.addUptimeDataLink.label": "导航到有关如何添加 Uptime 数据的教程", - "xpack.observability.page_header.addUXDataLink.label": "导航到有关如何添加用户体验 APM 数据的教程", - "xpack.observability.pageLayout.sideNavTitle": "Observability", "xpack.observability.resources.documentation": "文档", "xpack.observability.resources.forum": "讨论论坛", "xpack.observability.resources.quick_start": "快速入门视频", @@ -25364,29 +25347,9 @@ "xpack.observability.statusVisualization.ux.goToAppTitle": "显示仪表板", "xpack.observability.statusVisualization.ux.link": "添加数据", "xpack.observability.statusVisualization.ux.title": "用户体验", - "xpack.observability.tour.alertsStep.imageAltText": "告警演示", - "xpack.observability.tour.alertsStep.tourContent": "通过电子邮件、PagerDuty 和 Slack 等第三方平台集成定义并检测触发告警的条件。", - "xpack.observability.tour.alertsStep.tourTitle": "发生更改时接收通知", - "xpack.observability.tour.endButtonLabel": "结束教程", - "xpack.observability.tour.guidedSetupStep.tourContent": "继续使用 Elastic Observability 的最简便方法,是按照数据助手中推荐的后续步骤操作。", - "xpack.observability.tour.guidedSetupStep.tourTitle": "Elastic Observability 让您事半功倍", - "xpack.observability.tour.metricsExplorerStep.imageAltText": "指标浏览器演示", - "xpack.observability.tour.metricsExplorerStep.tourContent": "流式传输、分组并可视化您的系统、云、网络和其他基础架构源中的指标。", - "xpack.observability.tour.metricsExplorerStep.tourTitle": "监测基础架构运行状况", - "xpack.observability.tour.nextButtonLabel": "下一步", - "xpack.observability.tour.observabilityOverviewStep.tourContent": "学习快速教程以了解在一个堆栈中保存所有 Observability 数据的优势。", - "xpack.observability.tour.observabilityOverviewStep.tourTitle": "欢迎使用 Elastic Observability", - "xpack.observability.tour.servicesStep.imageAltText": "服务演示", - "xpack.observability.tour.servicesStep.tourContent": "通过收集有关服务的详细信息快速查找并修复性能问题。", - "xpack.observability.tour.servicesStep.tourTitle": "确定并解决应用程序问题", - "xpack.observability.tour.skipButtonLabel": "跳过教程", - "xpack.observability.tour.streamStep.imageAltText": "日志流演示", - "xpack.observability.tour.streamStep.tourContent": "监测、筛选并检查从您的应用程序、服务器、虚拟机和容器中流入的日志事件。", - "xpack.observability.tour.streamStep.tourTitle": "实时跟踪您的日志", "xpack.observability.uiSettings.betaLabel": "公测版", "xpack.observability.uiSettings.giveFeedBackLabel": "反馈", "xpack.observability.uiSettings.technicalPreviewLabel": "技术预览", - "xpack.observability.ux.addDataButtonLabel": "添加 UX 数据", "xpack.observability.ux.coreVitals.average": "平均值", "xpack.observability.ux.coreVitals.cls": "累计布局偏移", "xpack.observability.ux.coreVitals.cls.help": "累计布局偏移 (CLS):衡量视觉稳定性。为了提供良好的用户体验,页面的 CLS 应小于 0.1。", From c94c6a4f252d7b4aa1e70c8b275b632c129aac00 Mon Sep 17 00:00:00 2001 From: Yara Tercero Date: Thu, 18 May 2023 10:52:36 -0700 Subject: [PATCH 61/78] [Codeowners] - Updating codeowners to reflect new D&R team structure (#158086) ## Summary Updating codeowners to reflect new D&R team structure. All previous platform and alerts area ownership is now under @elastic/security-detection-engine --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .github/CODEOWNERS | 69 +++++++++++++++++++++++----------------------- 1 file changed, 34 insertions(+), 35 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 128009fbb3d93..206ab9fdd4dfd 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1069,25 +1069,12 @@ x-pack/plugins/cloud_integrations/cloud_full_story/server/config.ts @elastic/kib /x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/network @elastic/security-threat-hunting-explore /x-pack/plugins/security_solution/server/search_strategy/security_solution/factory/users @elastic/security-threat-hunting-explore -## Security Solution sub teams - Detections and Response Alerts -/x-pack/plugins/security_solution/common/detection_engine/schemas/alerts @elastic/security-detections-response-alerts -/x-pack/plugins/security_solution/common/field_maps @elastic/security-detections-response-alerts - -/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui @elastic/security-detections-response-alerts -/x-pack/plugins/security_solution/public/detections/pages/alerts @elastic/security-detections-response-alerts - -/x-pack/plugins/security_solution/server/lib/detection_engine/migrations @elastic/security-detections-response-alerts -/x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview @elastic/security-detections-response-alerts -/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types @elastic/security-detections-response-alerts -/x-pack/plugins/security_solution/server/lib/detection_engine/routes/index @elastic/security-detections-response-alerts -/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals @elastic/security-detections-response-alerts - ## Security Solution sub teams - Detection Rule Management /x-pack/plugins/security_solution/common/detection_engine/fleet_integrations @elastic/security-detection-rule-management /x-pack/plugins/security_solution/common/detection_engine/prebuilt_rules @elastic/security-detection-rule-management /x-pack/plugins/security_solution/common/detection_engine/rule_management @elastic/security-detection-rule-management /x-pack/plugins/security_solution/common/detection_engine/rule_monitoring @elastic/security-detection-rule-management -/x-pack/plugins/security_solution/common/detection_engine/rule_schema @elastic/security-detection-rule-management @elastic/security-detections-response-alerts +/x-pack/plugins/security_solution/common/detection_engine/rule_schema @elastic/security-detection-rule-management @elastic/security-detection-engine /x-pack/plugins/security_solution/public/common/components/health_truncate_text @elastic/security-detection-rule-management /x-pack/plugins/security_solution/public/common/components/links_to_docs @elastic/security-detection-rule-management @@ -1101,7 +1088,7 @@ x-pack/plugins/cloud_integrations/cloud_full_story/server/config.ts @elastic/kib /x-pack/plugins/security_solution/public/detections/components/callouts @elastic/security-detection-rule-management /x-pack/plugins/security_solution/public/detections/components/modals/ml_job_upgrade_modal @elastic/security-detection-rule-management /x-pack/plugins/security_solution/public/detections/components/rules @elastic/security-detection-rule-management -/x-pack/plugins/security_solution/public/detections/components/rules/rule_preview @elastic/security-detections-response-alerts +/x-pack/plugins/security_solution/public/detections/components/rules/rule_preview @elastic/security-detection-engine /x-pack/plugins/security_solution/public/detections/containers/detection_engine/rules @elastic/security-detection-rule-management /x-pack/plugins/security_solution/public/detections/mitre @elastic/security-detection-rule-management /x-pack/plugins/security_solution/public/detections/pages/detection_engine/rules @elastic/security-detection-rule-management @@ -1111,49 +1098,61 @@ x-pack/plugins/cloud_integrations/cloud_full_story/server/config.ts @elastic/kib /x-pack/plugins/security_solution/server/lib/detection_engine/prebuilt_rules @elastic/security-detection-rule-management /x-pack/plugins/security_solution/server/lib/detection_engine/rule_management @elastic/security-detection-rule-management /x-pack/plugins/security_solution/server/lib/detection_engine/rule_monitoring @elastic/security-detection-rule-management -/x-pack/plugins/security_solution/server/lib/detection_engine/rule_schema @elastic/security-detection-rule-management @elastic/security-detections-response-alerts +/x-pack/plugins/security_solution/server/lib/detection_engine/rule_schema @elastic/security-detection-rule-management @elastic/security-detection-engine /x-pack/plugins/security_solution/server/utils @elastic/security-detection-rule-management -## Security Solution sub teams - Security Platform +## Security Solution sub teams - Detection Engine + +/x-pack/plugins/security_solution/common/detection_engine/schemas/alerts @elastic/security-detection-engine +/x-pack/plugins/security_solution/common/field_maps @elastic/security-detection-engine + +/x-pack/plugins/security_solution/public/detection_engine/rule_creation_ui @elastic/security-detection-engine +/x-pack/plugins/security_solution/public/detections/pages/alerts @elastic/security-detection-engine + +/x-pack/plugins/security_solution/server/lib/detection_engine/migrations @elastic/security-detection-engine +/x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview @elastic/security-detection-engine +/x-pack/plugins/security_solution/server/lib/detection_engine/rule_types @elastic/security-detection-engine +/x-pack/plugins/security_solution/server/lib/detection_engine/routes/index @elastic/security-detection-engine +/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals @elastic/security-detection-engine -/x-pack/plugins/security_solution/cypress/e2e/data_sources @elastic/security-solution-platform -/x-pack/plugins/security_solution/cypress/e2e/exceptions @elastic/security-solution-platform -/x-pack/plugins/security_solution/cypress/e2e/value_lists @elastic/security-solution-platform +/x-pack/plugins/security_solution/cypress/e2e/data_sources @elastic/security-detection-engine +/x-pack/plugins/security_solution/cypress/e2e/exceptions @elastic/security-detection-engine +/x-pack/plugins/security_solution/cypress/e2e/value_lists @elastic/security-detection-engine -/x-pack/plugins/security_solution/common/detection_engine/rule_exceptions @elastic/security-solution-platform +/x-pack/plugins/security_solution/common/detection_engine/rule_exceptions @elastic/security-detection-engine -/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions @elastic/security-solution-platform -/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions_ui @elastic/security-solution-platform -/x-pack/plugins/security_solution/public/common/components/exceptions @elastic/security-solution-platform -/x-pack/plugins/security_solution/public/exceptions @elastic/security-solution-platform -/x-pack/plugins/security_solution/public/detections/containers/detection_engine/lists @elastic/security-solution-platform -/x-pack/plugins/security_solution/public/common/components/sourcerer @elastic/security-solution-platform +/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions @elastic/security-detection-engine +/x-pack/plugins/security_solution/public/detection_engine/rule_exceptions_ui @elastic/security-detection-engine +/x-pack/plugins/security_solution/public/common/components/exceptions @elastic/security-detection-engine +/x-pack/plugins/security_solution/public/exceptions @elastic/security-detection-engine +/x-pack/plugins/security_solution/public/detections/containers/detection_engine/lists @elastic/security-detection-engine +/x-pack/plugins/security_solution/public/common/components/sourcerer @elastic/security-detection-engine -/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy @elastic/security-solution-platform -/x-pack/plugins/security_solution/server/lib/detection_engine/rule_exceptions @elastic/security-solution-platform -/x-pack/plugins/security_solution/server/lib/sourcerer @elastic/security-solution-platform +/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy @elastic/security-detection-engine +/x-pack/plugins/security_solution/server/lib/detection_engine/rule_exceptions @elastic/security-detection-engine +/x-pack/plugins/security_solution/server/lib/sourcerer @elastic/security-detection-engine ## Security Threat Intelligence - Under Security Platform -/x-pack/plugins/security_solution/public/common/components/threat_match @elastic/security-solution-platform +/x-pack/plugins/security_solution/public/common/components/threat_match @elastic/security-detection-engine ## Security Solution cross teams ownership /x-pack/plugins/security_solution/cypress/fixtures @elastic/security-detections-response @elastic/security-threat-hunting /x-pack/plugins/security_solution/cypress/helpers @elastic/security-detections-response @elastic/security-threat-hunting -/x-pack/plugins/security_solution/cypress/e2e/detection_rules @elastic/security-detection-rule-management @elastic/security-detections-response-alerts +/x-pack/plugins/security_solution/cypress/e2e/detection_rules @elastic/security-detection-rule-management @elastic/security-detection-engine /x-pack/plugins/security_solution/cypress/objects @elastic/security-detections-response @elastic/security-threat-hunting /x-pack/plugins/security_solution/cypress/plugins @elastic/security-detections-response @elastic/security-threat-hunting /x-pack/plugins/security_solution/cypress/screens/common @elastic/security-detections-response @elastic/security-threat-hunting /x-pack/plugins/security_solution/cypress/support @elastic/security-detections-response @elastic/security-threat-hunting -/x-pack/plugins/security_solution/cypress/urls @elastic/security-threat-hunting-investigations @elastic/security-solution-platform +/x-pack/plugins/security_solution/cypress/urls @elastic/security-threat-hunting-investigations @elastic/security-detection-engine /x-pack/plugins/security_solution/common/ecs @elastic/security-threat-hunting-investigations -/x-pack/plugins/security_solution/common/test @elastic/security-detection-rule-management @elastic/security-detections-response-alerts +/x-pack/plugins/security_solution/common/test @elastic/security-detection-rule-management @elastic/security-detection-engine /x-pack/plugins/security_solution/public/common/components/callouts @elastic/security-detections-response /x-pack/plugins/security_solution/public/common/components/hover_actions @elastic/security-threat-hunting-explore @elastic/security-threat-hunting-investigations -/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions @elastic/security-solution-platform @elastic/security-detection-rule-management +/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions @elastic/security-detection-engine @elastic/security-detection-rule-management /x-pack/plugins/security_solution/server/routes @elastic/security-detections-response @elastic/security-threat-hunting ## Security Solution sub teams - security-defend-workflows From 8e2b5ae79687f613127c33acf18a71d8b6c2a682 Mon Sep 17 00:00:00 2001 From: Rodney Norris Date: Thu, 18 May 2023 13:20:16 -0500 Subject: [PATCH 62/78] [Serverless Search] API Key Creation (#157655) ## Summary This adds the API key creation flow to the Serverless Search plugin. this is a continuation of the work started in #157431 ### Screenshots ![image](https://github.com/elastic/kibana/assets/1972968/c2f4e6d5-9f5b-488c-aa60-7fbe6e322584) ![image](https://github.com/elastic/kibana/assets/1972968/778c6879-5e5b-4a91-b366-ed0592c79bf4) ![image](https://github.com/elastic/kibana/assets/1972968/f2b1b18f-7a5f-4606-9376-59c1261e15ca) ![image](https://github.com/elastic/kibana/assets/1972968/95cf3e2f-adb7-4486-8147-d0a2e51d70e9) Invalid JSON for metadata ![image](https://github.com/elastic/kibana/assets/1972968/d6558e3d-f440-4db1-9f72-05acb52133c2) Server Error on creation ![image](https://github.com/elastic/kibana/assets/1972968/6ccc81b9-82c1-493e-afb7-e5d4009361e2) --------- Co-authored-by: Sander Philipse Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- packages/kbn-optimizer/limits.yml | 2 +- .../serverless_search/common/doc_links.ts | 4 + .../serverless_search/common/i18n_string.ts | 25 +- .../serverless_search/common/types/index.ts | 13 + x-pack/plugins/serverless_search/kibana.jsonc | 4 +- .../components/api_key/api_key.tsx | 201 ++++++++++++++ .../components/api_key/basic_setup_form.tsx | 157 +++++++++++ .../api_key/create_api_key_flyout.tsx | 257 ++++++++++++++++++ .../components/api_key/metadata_form.tsx | 80 ++++++ .../api_key/security_privileges_form.tsx | 80 ++++++ .../components/languages/javascript.ts | 4 +- .../application/components/overview.scss | 5 - .../application/components/overview.tsx | 98 ++++--- .../overview_panels/overview_panel.tsx | 4 +- .../public/application/hooks/use_kibana.tsx | 9 +- .../public/application/index.tsx | 21 +- .../application/{context.ts => routes.ts} | 8 +- .../serverless_search/public/plugin.ts | 16 +- .../plugins/serverless_search/public/types.ts | 5 + .../serverless_search/public/utils/api.ts | 16 ++ .../serverless_search/server/plugin.ts | 33 ++- .../server/routes/api_key_routes.ts | 30 ++ .../plugins/serverless_search/tsconfig.json | 2 + 23 files changed, 1012 insertions(+), 62 deletions(-) create mode 100644 x-pack/plugins/serverless_search/common/types/index.ts create mode 100644 x-pack/plugins/serverless_search/public/application/components/api_key/api_key.tsx create mode 100644 x-pack/plugins/serverless_search/public/application/components/api_key/basic_setup_form.tsx create mode 100644 x-pack/plugins/serverless_search/public/application/components/api_key/create_api_key_flyout.tsx create mode 100644 x-pack/plugins/serverless_search/public/application/components/api_key/metadata_form.tsx create mode 100644 x-pack/plugins/serverless_search/public/application/components/api_key/security_privileges_form.tsx rename x-pack/plugins/serverless_search/public/application/{context.ts => routes.ts} (52%) create mode 100644 x-pack/plugins/serverless_search/public/utils/api.ts create mode 100644 x-pack/plugins/serverless_search/server/routes/api_key_routes.ts diff --git a/packages/kbn-optimizer/limits.yml b/packages/kbn-optimizer/limits.yml index 637872f0a3e83..40d4dab13f857 100644 --- a/packages/kbn-optimizer/limits.yml +++ b/packages/kbn-optimizer/limits.yml @@ -117,7 +117,7 @@ pageLoadAssetSize: securitySolution: 66738 serverless: 16573 serverlessObservability: 30000 - serverlessSearch: 26000 + serverlessSearch: 30000 serverlessSecurity: 41807 sessionView: 77750 share: 71239 diff --git a/x-pack/plugins/serverless_search/common/doc_links.ts b/x-pack/plugins/serverless_search/common/doc_links.ts index 32e4670ed0665..4ad8578238e76 100644 --- a/x-pack/plugins/serverless_search/common/doc_links.ts +++ b/x-pack/plugins/serverless_search/common/doc_links.ts @@ -17,6 +17,8 @@ class ESDocLinks { public jsBasicConfig: string = ''; public jsClient: string = ''; public logStash: string = ''; + public metadata: string = ''; + public roleDescriptors: string = ''; public rubyAdvancedConfig: string = ''; public rubyBasicConfig: string = ''; public rubyClient: string = ''; @@ -31,6 +33,8 @@ class ESDocLinks { this.jsApiReference = newDocLinks.clients.jsApiReference; this.jsBasicConfig = newDocLinks.clients.jsBasicConfig; this.jsClient = newDocLinks.clients.jsIntro; + this.metadata = newDocLinks.security.mappingRoles; + this.roleDescriptors = newDocLinks.security.mappingRoles; this.rubyAdvancedConfig = newDocLinks.clients.rubyAdvancedConfig; this.rubyBasicConfig = newDocLinks.clients.rubyBasicConfig; this.rubyExamples = newDocLinks.clients.rubyExamples; diff --git a/x-pack/plugins/serverless_search/common/i18n_string.ts b/x-pack/plugins/serverless_search/common/i18n_string.ts index 84193d3527074..23a70f4fe4a13 100644 --- a/x-pack/plugins/serverless_search/common/i18n_string.ts +++ b/x-pack/plugins/serverless_search/common/i18n_string.ts @@ -7,6 +7,29 @@ import { i18n } from '@kbn/i18n'; -export const LEARN_MORE_LABEL = i18n.translate('xpack.serverlessSearch.learnMore', { +export const LEARN_MORE_LABEL: string = i18n.translate('xpack.serverlessSearch.learnMore', { defaultMessage: 'Learn more', }); + +export const CANCEL_LABEL: string = i18n.translate('xpack.serverlessSearch.cancel', { + defaultMessage: 'Cancel', +}); + +export const BACK_LABEL: string = i18n.translate('xpack.serverlessSearch.back', { + defaultMessage: 'Back', +}); + +export const NEXT_LABEL: string = i18n.translate('xpack.serverlessSearch.next', { + defaultMessage: 'Next', +}); + +export const OPTIONAL_LABEL: string = i18n.translate('xpack.serverlessSearch.optional', { + defaultMessage: 'Optional', +}); + +export const INVALID_JSON_ERROR: string = i18n.translate( + 'xpack.serverlessSearch.invalidJsonError', + { + defaultMessage: 'Invalid JSON', + } +); diff --git a/x-pack/plugins/serverless_search/common/types/index.ts b/x-pack/plugins/serverless_search/common/types/index.ts new file mode 100644 index 0000000000000..13c8fc566defd --- /dev/null +++ b/x-pack/plugins/serverless_search/common/types/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 interface CreateAPIKeyArgs { + expiration?: string; + metadata?: Record; + name: string; + role_descriptors?: Record; +} diff --git a/x-pack/plugins/serverless_search/kibana.jsonc b/x-pack/plugins/serverless_search/kibana.jsonc index b360bbb8bb888..e71eea8b39c1a 100644 --- a/x-pack/plugins/serverless_search/kibana.jsonc +++ b/x-pack/plugins/serverless_search/kibana.jsonc @@ -14,7 +14,9 @@ ], "requiredPlugins": [ "serverless", - "management" + "cloud", + "management", + "security", ], "optionalPlugins": [], "requiredBundles": ["kibanaReact"] diff --git a/x-pack/plugins/serverless_search/public/application/components/api_key/api_key.tsx b/x-pack/plugins/serverless_search/public/application/components/api_key/api_key.tsx new file mode 100644 index 0000000000000..10aa357438154 --- /dev/null +++ b/x-pack/plugins/serverless_search/public/application/components/api_key/api_key.tsx @@ -0,0 +1,201 @@ +/* + * 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 { + EuiBadge, + EuiButton, + EuiCodeBlock, + EuiFlexGroup, + EuiFlexItem, + EuiIcon, + EuiPanel, + EuiSpacer, + EuiSplitPanel, + EuiStep, + EuiText, + EuiThemeProvider, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { css } from '@emotion/react'; +import { ApiKey } from '@kbn/security-plugin/common'; +import { useQuery } from '@tanstack/react-query'; +import React, { useState } from 'react'; +import { useKibanaServices } from '../../hooks/use_kibana'; +import { MANAGEMENT_API_KEYS } from '../../routes'; +import { CreateApiKeyFlyout } from './create_api_key_flyout'; + +export const ApiKeyPanel: React.FC = () => { + const { cloud, http, userProfile } = useKibanaServices(); + const [isFlyoutOpen, setIsFlyoutOpen] = useState(false); + const { data } = useQuery({ + queryKey: ['apiKey'], + queryFn: () => http.fetch<{ apiKeys: ApiKey[] }>('/internal/serverless_search/api_keys'), + }); + const [apiKey, setApiKey] = useState(undefined); + + return ( + <> + {isFlyoutOpen && ( + setIsFlyoutOpen(false)} + setApiKey={setApiKey} + username={userProfile.user.full_name || userProfile.user.username} + /> + )} + {apiKey ? ( + + + + {i18n.translate('xpack.serverlessSearch.apiKey.apiKeyStepDescription', { + defaultMessage: + "You'll only see this key once, so save it somewhere safe. We don't store your API keys, so if you lose a key you'll need to generate a replacement.", + })} + + + {JSON.stringify(apiKey, undefined, 2)} + + + ) : ( + + + + {i18n.translate('xpack.serverlessSearch.apiKey.stepOneDescription', { + defaultMessage: 'Unique identifier for authentication and authorization. ', + })} + + + + + + + + setIsFlyoutOpen(true)} + > + + {i18n.translate('xpack.serverlessSearch.apiKey.newButtonLabel', { + defaultMessage: 'New', + })} + + + + + + + + {i18n.translate('xpack.serverlessSearch.apiKey.manageLabel', { + defaultMessage: 'Manage', + })} + + + + + + + {!!data?.apiKeys && ( + + + + + + + 0 ? 'success' : 'warning'}> + {data.apiKeys.length} + + ), + }} + /> + + + + )} + + + + + )} + + + + + + {i18n.translate('xpack.serverlessSearch.apiKey.stepTwoDescription', { + defaultMessage: 'Unique identifier for specific project. ', + })} + + + + + + + {cloud.cloudId || + 'ProjectXDHS:dXMtd2VzdDIuZ2NwLmVsYXN0aWMtY2xvdWQuY29tJDEwMDYxN2IwMzM3ODRiYWJhODc5NzZiOTA0MTA3NGYwJDQ5ZWM'} + + + + + + ); +}; diff --git a/x-pack/plugins/serverless_search/public/application/components/api_key/basic_setup_form.tsx b/x-pack/plugins/serverless_search/public/application/components/api_key/basic_setup_form.tsx new file mode 100644 index 0000000000000..68262b11950c9 --- /dev/null +++ b/x-pack/plugins/serverless_search/public/application/components/api_key/basic_setup_form.tsx @@ -0,0 +1,157 @@ +/* + * 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 { + EuiIcon, + EuiText, + EuiForm, + EuiFieldText, + EuiFormRow, + EuiFieldNumber, + EuiRadioGroup, + EuiFlexGroup, + EuiFlexItem, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { FormattedDate, FormattedMessage } from '@kbn/i18n-react'; +import React from 'react'; + +interface BasicSetupFormProps { + isLoading: boolean; + name: string; + user: string; + expires: string | null; + onChangeName: (name: string) => void; + onChangeExpires: (expires: string | null) => void; +} +export const DEFAULT_EXPIRES_VALUE = '60'; + +export const BasicSetupForm: React.FC = ({ + isLoading, + name, + user, + expires, + onChangeName, + onChangeExpires, +}) => { + let expirationDate: Date | undefined; + if (expires) { + expirationDate = new Date(); + expirationDate.setDate(expirationDate.getDate() + parseInt(expires, 10)); + } + return ( + + + onChangeName(e.currentTarget.value)} + /> + + + onChangeName(e.currentTarget.value)} + /> + + + + + + + + {i18n.translate('xpack.serverlessSearch.apiKey.expiresFieldHelpText', { + defaultMessage: 'API keys should be rotated regularly.', + })} + + +
+ } + label={i18n.translate('xpack.serverlessSearch.apiKey.expiresFieldLabel', { + defaultMessage: 'Expires', + })} + > + onChangeExpires(id === 'never' ? null : DEFAULT_EXPIRES_VALUE)} + /> + + {expires !== null && ( + + + + ), + }} + /> + } + > + onChangeExpires(e.currentTarget.value)} + /> + + )} + + ); +}; diff --git a/x-pack/plugins/serverless_search/public/application/components/api_key/create_api_key_flyout.tsx b/x-pack/plugins/serverless_search/public/application/components/api_key/create_api_key_flyout.tsx new file mode 100644 index 0000000000000..1b0055300db23 --- /dev/null +++ b/x-pack/plugins/serverless_search/public/application/components/api_key/create_api_key_flyout.tsx @@ -0,0 +1,257 @@ +/* + * 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 { + EuiButton, + EuiButtonEmpty, + EuiCallOut, + EuiFlexGroup, + EuiFlexItem, + EuiFlyout, + EuiFlyoutBody, + EuiFlyoutFooter, + EuiFlyoutHeader, + EuiStepsHorizontal, + EuiTitle, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { ApiKey } from '@kbn/security-plugin/common'; +import { useMutation } from '@tanstack/react-query'; +import React, { useState } from 'react'; +import { + BACK_LABEL, + CANCEL_LABEL, + NEXT_LABEL, + INVALID_JSON_ERROR, +} from '../../../../common/i18n_string'; +import { CreateAPIKeyArgs } from '../../../../common/types'; +import { useKibanaServices } from '../../hooks/use_kibana'; +import { CREATE_API_KEY_PATH } from '../../routes'; +import { isApiError } from '../../../utils/api'; +import { BasicSetupForm, DEFAULT_EXPIRES_VALUE } from './basic_setup_form'; +import { MetadataForm } from './metadata_form'; +import { SecurityPrivilegesForm } from './security_privileges_form'; + +interface CreateApiKeyFlyoutProps { + onClose: () => void; + setApiKey: (apiKey: ApiKey) => void; + username: string; +} + +enum Steps { + BASIC_SETUP, + PRIVILEGES, + METADATA, +} + +function getNextStep(currentStep: Steps): Steps { + switch (currentStep) { + case Steps.BASIC_SETUP: + return Steps.PRIVILEGES; + case Steps.PRIVILEGES: + return Steps.METADATA; + case Steps.METADATA: + return Steps.METADATA; + } +} + +function getPreviousStep(currentStep: Steps): Steps { + switch (currentStep) { + case Steps.BASIC_SETUP: + return Steps.BASIC_SETUP; + case Steps.PRIVILEGES: + return Steps.BASIC_SETUP; + case Steps.METADATA: + return Steps.PRIVILEGES; + } +} + +const parseCreateError = (error: unknown): string | undefined => { + if (!error) return undefined; + if (isApiError(error)) { + return error.body.message; + } + if (error instanceof Error) { + return error.message; + } + return JSON.stringify(error); +}; + +export const CreateApiKeyFlyout: React.FC = ({ + onClose, + username, + setApiKey, +}) => { + const { http } = useKibanaServices(); + const [currentStep, setCurrentStep] = useState(Steps.BASIC_SETUP); + const [name, setName] = useState(''); + const [expires, setExpires] = useState(DEFAULT_EXPIRES_VALUE); + const [roleDescriptors, setRoleDescriptors] = useState(''); + const [roleDescriptorsError, setRoleDescriptorsError] = useState(undefined); + const [metadata, setMetadata] = useState(''); + const [metadataError, setMetadataError] = useState(undefined); + + const onCreateClick = () => { + let parsedRoleDescriptors: Record | undefined; + try { + parsedRoleDescriptors = roleDescriptors.length > 0 ? JSON.parse(roleDescriptors) : undefined; + } catch (e) { + setCurrentStep(Steps.PRIVILEGES); + setRoleDescriptorsError(INVALID_JSON_ERROR); + return; + } + if (roleDescriptorsError) setRoleDescriptorsError(undefined); + let parsedMetadata: Record | undefined; + try { + parsedMetadata = metadata.length > 0 ? JSON.parse(metadata) : undefined; + } catch (e) { + setCurrentStep(Steps.METADATA); + setMetadataError(INVALID_JSON_ERROR); + return; + } + if (metadataError) setMetadataError(undefined); + const expiration = expires !== null ? `${expires}d` : undefined; + + mutate({ + expiration, + metadata: parsedMetadata, + name, + role_descriptors: parsedRoleDescriptors, + }); + }; + + const { isLoading, isError, error, mutate } = useMutation({ + mutationFn: async (input: CreateAPIKeyArgs) => { + const result = await http.post(CREATE_API_KEY_PATH, { + body: JSON.stringify(input), + }); + return result; + }, + onSuccess: (apiKey) => { + setApiKey(apiKey); + onClose(); + }, + }); + const createError = parseCreateError(error); + return ( + + + +

+ {i18n.translate('xpack.serverlessSearch.apiKey.flyoutTitle', { + defaultMessage: 'Create an API key', + })} +

+
+
+ + {isError && createError && ( + + {createError} + + )} + setCurrentStep(Steps.BASIC_SETUP), + }, + { + title: i18n.translate('xpack.serverlessSearch.apiKey.privilegesLabel', { + defaultMessage: 'Privileges', + }), + status: + currentStep === Steps.PRIVILEGES + ? 'current' + : currentStep === Steps.METADATA + ? 'complete' + : 'incomplete', + onClick: () => setCurrentStep(Steps.PRIVILEGES), + }, + { + title: i18n.translate('xpack.serverlessSearch.apiKey.metadataLabel', { + defaultMessage: 'Metadata', + }), + status: currentStep === Steps.METADATA ? 'current' : 'incomplete', + onClick: () => setCurrentStep(Steps.METADATA), + }, + ]} + /> + {currentStep === Steps.BASIC_SETUP && ( + setName(newName)} + onChangeExpires={(newExpires: string | null) => setExpires(newExpires)} + /> + )} + {currentStep === Steps.PRIVILEGES && ( + + )} + {currentStep === Steps.METADATA && ( + + )} + + + + + + {CANCEL_LABEL} + + + + + {currentStep !== Steps.BASIC_SETUP && ( + + setCurrentStep(getPreviousStep(currentStep))} + > + {BACK_LABEL} + + + )} + + {currentStep === Steps.METADATA ? ( + + {i18n.translate('xpack.serverlessSearch.apiKey.flyOutCreateLabel', { + defaultMessage: 'Create API Key', + })} + + ) : ( + setCurrentStep(getNextStep(currentStep))} + > + {NEXT_LABEL} + + )} + + + + + +
+ ); +}; diff --git a/x-pack/plugins/serverless_search/public/application/components/api_key/metadata_form.tsx b/x-pack/plugins/serverless_search/public/application/components/api_key/metadata_form.tsx new file mode 100644 index 0000000000000..91d416492e17b --- /dev/null +++ b/x-pack/plugins/serverless_search/public/application/components/api_key/metadata_form.tsx @@ -0,0 +1,80 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + EuiBadge, + EuiTitle, + EuiFlexItem, + EuiFlexGroup, + EuiText, + EuiLink, + EuiSpacer, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { CodeEditorField } from '@kbn/kibana-react-plugin/public'; +import React from 'react'; +import { docLinks } from '../../../../common/doc_links'; +import { OPTIONAL_LABEL } from '../../../../common/i18n_string'; + +interface MetadataFormProps { + metadata: string; + onChangeMetadata: (metadata: string) => void; + error?: React.ReactNode | React.ReactNode[]; +} + +export const MetadataForm: React.FC = ({ + metadata, + onChangeMetadata, + error, +}) => { + return ( + <> + + + +

+ {i18n.translate('xpack.serverlessSearch.apiKey.metadataTitle', { + defaultMessage: 'Add Metadata', + })} +

+
+
+ + {OPTIONAL_LABEL} + +
+ + + {i18n.translate('xpack.serverlessSearch.apiKey.metadataDescription', { + defaultMessage: + 'Use configurable key-value pairs to add information about the API key or customize Elasticsearch resource access.', + })} + + + + {i18n.translate('xpack.serverlessSearch.apiKey.metadataLinkLabel', { + defaultMessage: 'Learn how to structure role metadata', + })} + + + {error && ( + +

{error}

+
+ )} + onChangeMetadata(e)} + value={metadata} + /> + + ); +}; diff --git a/x-pack/plugins/serverless_search/public/application/components/api_key/security_privileges_form.tsx b/x-pack/plugins/serverless_search/public/application/components/api_key/security_privileges_form.tsx new file mode 100644 index 0000000000000..fa839faa9ba7d --- /dev/null +++ b/x-pack/plugins/serverless_search/public/application/components/api_key/security_privileges_form.tsx @@ -0,0 +1,80 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + EuiBadge, + EuiTitle, + EuiFlexItem, + EuiFlexGroup, + EuiText, + EuiLink, + EuiSpacer, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { CodeEditorField } from '@kbn/kibana-react-plugin/public'; +import React from 'react'; +import { docLinks } from '../../../../common/doc_links'; +import { OPTIONAL_LABEL } from '../../../../common/i18n_string'; + +interface SecurityPrivilegesFormProps { + roleDescriptors: string; + onChangeRoleDescriptors: (roleDescriptors: string) => void; + error?: React.ReactNode | React.ReactNode[]; +} + +export const SecurityPrivilegesForm: React.FC = ({ + roleDescriptors, + onChangeRoleDescriptors, + error, +}) => { + return ( + <> + + + +

+ {i18n.translate('xpack.serverlessSearch.apiKey.privilegesTitle', { + defaultMessage: 'Set up security privileges', + })} +

+
+
+ + {OPTIONAL_LABEL} + +
+ + + {i18n.translate('xpack.serverlessSearch.apiKey.privilegesDescription', { + defaultMessage: + 'Control access to specific Elasticsearch APIs and resources using predefined roles or custom privileges per API key.', + })} + + + + {i18n.translate('xpack.serverlessSearch.apiKey.roleDescriptorsLinkLabel', { + defaultMessage: 'Learn how to structure role descriptors', + })} + + + {error && ( + +

{error}

+
+ )} + onChangeRoleDescriptors(e)} + value={roleDescriptors} + /> + + ); +}; diff --git a/x-pack/plugins/serverless_search/public/application/components/languages/javascript.ts b/x-pack/plugins/serverless_search/public/application/components/languages/javascript.ts index df45bbf9160e6..2ec39dcee34e3 100644 --- a/x-pack/plugins/serverless_search/public/application/components/languages/javascript.ts +++ b/x-pack/plugins/serverless_search/public/application/components/languages/javascript.ts @@ -43,9 +43,9 @@ aborted: false */`, configureClient: `const { Client } = require('@elastic/elasticsearch'); const client = Client({ -node: 'https://project-name-abc123.elastic.cloud', +node: 'https://my-deployment-url', auth: { - apiKey: 'VnVhQ2ZHY0JDZGJrUW0tZTVhT3g6dWkybHAyYXhUTm1zeWFrdzl0dk5udw==' + apiKey: 'your_api_key' } });`, docLink: docLinks.jsClient, diff --git a/x-pack/plugins/serverless_search/public/application/components/overview.scss b/x-pack/plugins/serverless_search/public/application/components/overview.scss index 148008e2b507b..6d32df3cd899b 100644 --- a/x-pack/plugins/serverless_search/public/application/components/overview.scss +++ b/x-pack/plugins/serverless_search/public/application/components/overview.scss @@ -1,10 +1,5 @@ -.serverlessSearchHeaderTitle { - color: $euiColorEmptyShade; -} - .serverlessSearchHeaderSection { background-color: $euiColorPrimary; - color: $euiColorEmptyShade; } .serverlessSearchHeaderSection > div { diff --git a/x-pack/plugins/serverless_search/public/application/components/overview.tsx b/x-pack/plugins/serverless_search/public/application/components/overview.tsx index c039c0d1a0a66..9d2b5edd9f2dd 100644 --- a/x-pack/plugins/serverless_search/public/application/components/overview.tsx +++ b/x-pack/plugins/serverless_search/public/application/components/overview.tsx @@ -16,6 +16,7 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import React, { useState } from 'react'; +import { docLinks } from '../../../common/doc_links'; import { PLUGIN_ID } from '../../../common'; import { useKibanaServices } from '../hooks/use_kibana'; import { CodeBox } from './code_box'; @@ -26,51 +27,84 @@ import { InstallClientPanel } from './overview_panels/install_client'; import { OverviewPanel } from './overview_panels/overview_panel'; import './overview.scss'; import { IngestData } from './overview_panels/ingest_data'; +import { ApiKeyPanel } from './api_key/api_key'; export const ElasticsearchOverview = () => { const [selectedLanguage, setSelectedLanguage] = useState(javascriptDefinition); - const { http } = useKibanaServices(); + const { http, userProfile } = useKibanaServices(); return ( - - - - - -

- {i18n.translate('xpack.serverlessSearch.header.title', { - defaultMessage: 'Get started with Elasticsearch', - })} -

-
-
- - - {i18n.translate('xpack.serverlessSearch.header.description', { - defaultMessage: - "Set up your programming language client, ingest some data, and you'll be ready to start searching within minutes.", - })} - - - -
-
+ + + + {/* Reversing column direction here so screenreaders keep h1 as the first element */} + + + +

+ {i18n.translate('xpack.serverlessSearch.header.title', { + defaultMessage: 'Get started with Elasticsearch', + })} +

+
+
+ + +

+ {i18n.translate('xpack.serverlessSearch.header.greeting.title', { + defaultMessage: 'Hi {name}!', + values: { name: userProfile.user.full_name || userProfile.user.username }, + })} +

+
+
+
+ + + {i18n.translate('xpack.serverlessSearch.header.description', { + defaultMessage: + "Set up your programming language client, ingest some data, and you'll be ready to start searching within minutes.", + })} + + +
- - - -
+ + + +
+
+ + } + links={[ + { + href: docLinks.securityApis, + label: i18n.translate('xpack.serverlessSearch.configureClient.basicConfigLabel', { + defaultMessage: 'Basic configuration', + }), + }, + ]} + title={i18n.translate('xpack.serverlessSearch.apiKey.title', { + defaultMessage: 'Store your API key and Cloud ID', + })} + /> + = ({ <> - {leftPanelContent} - + {leftPanelContent} +

{title}

diff --git a/x-pack/plugins/serverless_search/public/application/hooks/use_kibana.tsx b/x-pack/plugins/serverless_search/public/application/hooks/use_kibana.tsx index d1d3fdd28bad1..da27e1058d072 100644 --- a/x-pack/plugins/serverless_search/public/application/hooks/use_kibana.tsx +++ b/x-pack/plugins/serverless_search/public/application/hooks/use_kibana.tsx @@ -5,9 +5,16 @@ * 2.0. */ +import { CloudStart } from '@kbn/cloud-plugin/public'; import type { CoreStart } from '@kbn/core/public'; import { useKibana as useKibanaBase } from '@kbn/kibana-react-plugin/public'; +import { GetUserProfileResponse, UserProfileData } from '@kbn/security-plugin/common'; -type ServerlessSearchKibanaContext = CoreStart; +export interface ServerlessSearchContext { + cloud: CloudStart; + userProfile: GetUserProfileResponse; +} + +type ServerlessSearchKibanaContext = CoreStart & ServerlessSearchContext; export const useKibanaServices = () => useKibanaBase().services; diff --git a/x-pack/plugins/serverless_search/public/application/index.tsx b/x-pack/plugins/serverless_search/public/application/index.tsx index ef039b0230412..92b2d157e1182 100644 --- a/x-pack/plugins/serverless_search/public/application/index.tsx +++ b/x-pack/plugins/serverless_search/public/application/index.tsx @@ -10,15 +10,26 @@ import ReactDOM from 'react-dom'; import { CoreStart } from '@kbn/core/public'; import { KibanaContextProvider, KibanaThemeProvider } from '@kbn/kibana-react-plugin/public'; import { I18nProvider } from '@kbn/i18n-react'; +import { QueryClient, QueryClientProvider } from '@tanstack/react-query'; +import { ReactQueryDevtools } from '@tanstack/react-query-devtools'; +import { ServerlessSearchContext } from './hooks/use_kibana'; -export async function renderApp(element: HTMLElement, core: CoreStart) { +export async function renderApp( + element: HTMLElement, + core: CoreStart, + { cloud, userProfile }: ServerlessSearchContext +) { const { ElasticsearchOverview } = await import('./components/overview'); + const queryClient = new QueryClient(); ReactDOM.render( - - - - + + + + + + + , element diff --git a/x-pack/plugins/serverless_search/public/application/context.ts b/x-pack/plugins/serverless_search/public/application/routes.ts similarity index 52% rename from x-pack/plugins/serverless_search/public/application/context.ts rename to x-pack/plugins/serverless_search/public/application/routes.ts index 2350ad7c10173..1a933d8f01717 100644 --- a/x-pack/plugins/serverless_search/public/application/context.ts +++ b/x-pack/plugins/serverless_search/public/application/routes.ts @@ -4,10 +4,8 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import React, { useContext } from 'react'; -export const ServerlessSearchContext = React.createContext<{} | undefined>(undefined); +export const MANAGEMENT_API_KEYS = '/app/management/security/api_keys'; -export const useServerlessSearchContext = () => { - return useContext(ServerlessSearchContext); -}; +// Server Routes +export const CREATE_API_KEY_PATH = '/internal/security/api_key'; diff --git a/x-pack/plugins/serverless_search/public/plugin.ts b/x-pack/plugins/serverless_search/public/plugin.ts index 38e21f206a3f8..08d8c87bd5bcc 100644 --- a/x-pack/plugins/serverless_search/public/plugin.ts +++ b/x-pack/plugins/serverless_search/public/plugin.ts @@ -16,10 +16,16 @@ import { } from './types'; export class ServerlessSearchPlugin - implements Plugin + implements + Plugin< + ServerlessSearchPluginSetup, + ServerlessSearchPluginStart, + ServerlessSearchPluginSetupDependencies, + ServerlessSearchPluginStartDependencies + > { public setup( - core: CoreSetup, + core: CoreSetup, _setupDeps: ServerlessSearchPluginSetupDependencies ): ServerlessSearchPluginSetup { core.application.register({ @@ -28,10 +34,12 @@ export class ServerlessSearchPlugin appRoute: '/app/elasticsearch', async mount({ element }: AppMountParameters) { const { renderApp } = await import('./application'); - const [coreStart] = await core.getStartServices(); + const [coreStart, { cloud, security }] = await core.getStartServices(); docLinks.setDocLinks(coreStart.docLinks.links); - return await renderApp(element, coreStart); + const userProfile = await security.userProfiles.getCurrent(); + + return await renderApp(element, coreStart, { cloud, userProfile }); }, }); return {}; diff --git a/x-pack/plugins/serverless_search/public/types.ts b/x-pack/plugins/serverless_search/public/types.ts index e5cd1ec28ee03..c861497dd45e6 100644 --- a/x-pack/plugins/serverless_search/public/types.ts +++ b/x-pack/plugins/serverless_search/public/types.ts @@ -5,7 +5,9 @@ * 2.0. */ +import { CloudSetup, CloudStart } from '@kbn/cloud-plugin/public'; import { ManagementSetup, ManagementStart } from '@kbn/management-plugin/public'; +import { SecurityPluginStart } from '@kbn/security-plugin/public'; import { ServerlessPluginSetup, ServerlessPluginStart } from '@kbn/serverless/public'; // eslint-disable-next-line @typescript-eslint/no-empty-interface @@ -15,11 +17,14 @@ export interface ServerlessSearchPluginSetup {} export interface ServerlessSearchPluginStart {} export interface ServerlessSearchPluginSetupDependencies { + cloud: CloudSetup; management: ManagementSetup; serverless: ServerlessPluginSetup; } export interface ServerlessSearchPluginStartDependencies { + cloud: CloudStart; management: ManagementStart; + security: SecurityPluginStart; serverless: ServerlessPluginStart; } diff --git a/x-pack/plugins/serverless_search/public/utils/api.ts b/x-pack/plugins/serverless_search/public/utils/api.ts new file mode 100644 index 0000000000000..ae701d41e26bb --- /dev/null +++ b/x-pack/plugins/serverless_search/public/utils/api.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { has } from 'lodash/fp'; + +export interface ApiError { + body: { + message: string; + }; +} + +export const isApiError = (error: unknown): error is ApiError => has('body.message', error); diff --git a/x-pack/plugins/serverless_search/server/plugin.ts b/x-pack/plugins/serverless_search/server/plugin.ts index 99d9bf01da0df..caa53bcf0adb0 100644 --- a/x-pack/plugins/serverless_search/server/plugin.ts +++ b/x-pack/plugins/serverless_search/server/plugin.ts @@ -5,16 +5,43 @@ * 2.0. */ -import { PluginInitializerContext, Plugin } from '@kbn/core/server'; +import { IRouter, Logger, PluginInitializerContext, Plugin, CoreSetup } from '@kbn/core/server'; +import { SecurityPluginStart } from '@kbn/security-plugin/server'; +import { registerApiKeyRoutes } from './routes/api_key_routes'; +import { ServerlessSearchConfig } from './config'; import { ServerlessSearchPluginSetup, ServerlessSearchPluginStart } from './types'; +interface StartDependencies { + security: SecurityPluginStart; +} +export interface RouteDependencies { + logger: Logger; + router: IRouter; + security: SecurityPluginStart; +} + export class ServerlessSearchPlugin implements Plugin { - constructor(_initializerContext: PluginInitializerContext) {} + // @ts-ignore config is not used for now + private readonly config: ServerlessSearchConfig; + private readonly logger: Logger; + private security?: SecurityPluginStart; + + constructor(initializerContext: PluginInitializerContext) { + this.config = initializerContext.config.get(); + this.logger = initializerContext.logger.get(); + } + + public setup({ getStartServices, http }: CoreSetup) { + const router = http.createRouter(); + getStartServices().then(([, { security }]) => { + this.security = security; + const dependencies = { logger: this.logger, router, security: this.security }; - public setup() { + registerApiKeyRoutes(dependencies); + }); return {}; } diff --git a/x-pack/plugins/serverless_search/server/routes/api_key_routes.ts b/x-pack/plugins/serverless_search/server/routes/api_key_routes.ts new file mode 100644 index 0000000000000..a7fa0f0c2be39 --- /dev/null +++ b/x-pack/plugins/serverless_search/server/routes/api_key_routes.ts @@ -0,0 +1,30 @@ +/* + * 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 { RouteDependencies } from '../plugin'; + +export const registerApiKeyRoutes = ({ logger, router, security }: RouteDependencies) => { + router.get( + { + path: '/internal/serverless_search/api_keys', + validate: {}, + }, + async (context, request, response) => { + const { client } = (await context.core).elasticsearch; + const user = security.authc.getCurrentUser(request); + if (user) { + const apiKeys = await client.asCurrentUser.security.getApiKey({ username: user.username }); + const validKeys = apiKeys.api_keys.filter(({ invalidated }) => !invalidated); + return response.ok({ body: { apiKeys: validKeys } }); + } + return response.customError({ + statusCode: 502, + body: 'Could not retrieve current user, security plugin is not ready', + }); + } + ); +}; diff --git a/x-pack/plugins/serverless_search/tsconfig.json b/x-pack/plugins/serverless_search/tsconfig.json index f51022429ab8b..9547803f9a4cd 100644 --- a/x-pack/plugins/serverless_search/tsconfig.json +++ b/x-pack/plugins/serverless_search/tsconfig.json @@ -24,5 +24,7 @@ "@kbn/kibana-react-plugin", "@kbn/i18n-react", "@kbn/serverless", + "@kbn/security-plugin", + "@kbn/cloud-plugin", ] } From 3766cd66abbc0acb33472759c313f79db160cf8b Mon Sep 17 00:00:00 2001 From: "Quynh Nguyen (Quinn)" <43350163+qn895@users.noreply.github.com> Date: Thu, 18 May 2023 13:24:00 -0500 Subject: [PATCH 63/78] [ML] Add functional tests for reauthorizing transforms (#156699) Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .buildkite/ftr_configs.yml | 4 +- .../transform_management_section.tsx | 1 + x-pack/plugins/transform/readme.md | 4 +- .../apis/transform/reauthorize_transforms.ts | 5 +- .../{start_reset_delete => actions}/config.ts | 2 +- .../deleting.ts | 0 .../{start_reset_delete => actions}/index.ts | 3 +- .../apps/transform/actions/reauthorizing.ts | 221 ++++++++++++++++++ .../resetting.ts | 0 .../starting.ts | 0 .../test/functional/services/transform/api.ts | 7 +- .../services/transform/management.ts | 4 + .../services/transform/transform_table.ts | 41 +++- .../{start_reset_delete => actions}/config.ts | 3 +- .../{start_reset_delete => actions}/index.ts | 2 +- 15 files changed, 282 insertions(+), 15 deletions(-) rename x-pack/test/functional/apps/transform/{start_reset_delete => actions}/config.ts (96%) rename x-pack/test/functional/apps/transform/{start_reset_delete => actions}/deleting.ts (100%) rename x-pack/test/functional/apps/transform/{start_reset_delete => actions}/index.ts (92%) create mode 100644 x-pack/test/functional/apps/transform/actions/reauthorizing.ts rename x-pack/test/functional/apps/transform/{start_reset_delete => actions}/resetting.ts (100%) rename x-pack/test/functional/apps/transform/{start_reset_delete => actions}/starting.ts (100%) rename x-pack/test/functional_basic/apps/transform/{start_reset_delete => actions}/config.ts (85%) rename x-pack/test/functional_basic/apps/transform/{start_reset_delete => actions}/index.ts (95%) diff --git a/.buildkite/ftr_configs.yml b/.buildkite/ftr_configs.yml index 599289b7c6eac..2960327b9087e 100644 --- a/.buildkite/ftr_configs.yml +++ b/.buildkite/ftr_configs.yml @@ -225,7 +225,7 @@ enabled: - x-pack/test/functional_basic/apps/ml/data_visualizer/group2/config.ts - x-pack/test/functional_basic/apps/ml/data_visualizer/group3/config.ts - x-pack/test/functional_basic/apps/transform/creation/index_pattern/config.ts - - x-pack/test/functional_basic/apps/transform/start_reset_delete/config.ts + - x-pack/test/functional_basic/apps/transform/actions/config.ts - x-pack/test/functional_basic/apps/transform/edit_clone/config.ts - x-pack/test/functional_basic/apps/transform/creation/runtime_mappings_saved_search/config.ts - x-pack/test/functional_basic/apps/transform/permissions/config.ts @@ -291,7 +291,7 @@ enabled: - x-pack/test/functional/apps/status_page/config.ts - x-pack/test/functional/apps/transform/creation/index_pattern/config.ts - x-pack/test/functional/apps/transform/creation/runtime_mappings_saved_search/config.ts - - x-pack/test/functional/apps/transform/start_reset_delete/config.ts + - x-pack/test/functional/apps/transform/actions/config.ts - x-pack/test/functional/apps/transform/edit_clone/config.ts - x-pack/test/functional/apps/transform/permissions/config.ts - x-pack/test/functional/apps/transform/feature_controls/config.ts diff --git a/x-pack/plugins/transform/public/app/sections/transform_management/transform_management_section.tsx b/x-pack/plugins/transform/public/app/sections/transform_management/transform_management_section.tsx index fd79e8eb9e2e9..3c74cf450b4b9 100644 --- a/x-pack/plugins/transform/public/app/sections/transform_management/transform_management_section.tsx +++ b/x-pack/plugins/transform/public/app/sections/transform_management/transform_management_section.tsx @@ -114,6 +114,7 @@ export const TransformManagement: FC = () => { diff --git a/x-pack/plugins/transform/readme.md b/x-pack/plugins/transform/readme.md index 7eb1f59250be9..8c25f2ddd8ac4 100644 --- a/x-pack/plugins/transform/readme.md +++ b/x-pack/plugins/transform/readme.md @@ -122,7 +122,7 @@ With PATH_TO_CONFIG and other options as follows. edit, clone | `test/functional/apps/transform/edit_clone/config.ts` feature controls | `test/functional/apps/transform/feature_controls/config.ts` permissions | `test/functional/apps/transform/permissions/config.ts` - start, reset, delete | `test/functional/apps/transform/start_reset_delete/config.ts` + actions | `test/functional/apps/transform/actions/config.ts` 1. Functional UI tests with `Basic` license: @@ -133,7 +133,7 @@ With PATH_TO_CONFIG and other options as follows. edit, clone | `test/functional_basic/apps/transform/edit_clone/config.ts` feature controls | `test/functional_basic/apps/transform/feature_controls/config.ts` permissions | `test/functional_basic/apps/transform/permissions/config.ts` - start, reset, delete | `test/functional_basic/apps/transform/start_reset_delete/config.ts` + actions | `test/functional_basic/apps/transform/actions/config.ts` 1. API integration tests with `Trial` license: diff --git a/x-pack/test/api_integration/apis/transform/reauthorize_transforms.ts b/x-pack/test/api_integration/apis/transform/reauthorize_transforms.ts index 274c1b42a4d07..a33ef09063d37 100644 --- a/x-pack/test/api_integration/apis/transform/reauthorize_transforms.ts +++ b/x-pack/test/api_integration/apis/transform/reauthorize_transforms.ts @@ -21,9 +21,6 @@ export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertestWithoutAuth'); const transform = getService('transform'); - // If transform was created with sufficient -> should still authorize and start - // If transform was created with insufficient -> should still authorize and start - function getTransformIdByUser(username: USER) { return `transform-by-${username}`; } @@ -51,6 +48,8 @@ export default ({ getService }: FtrProviderContext) => { await transform.api.deleteIndices(destinationIndex); } + // If transform was created with sufficient permissions -> should create and start + // If transform was created with insufficient permissions -> should create but not start describe('/api/transform/reauthorize_transforms', function () { const apiKeysForTransformUsers = new Map(); diff --git a/x-pack/test/functional/apps/transform/start_reset_delete/config.ts b/x-pack/test/functional/apps/transform/actions/config.ts similarity index 96% rename from x-pack/test/functional/apps/transform/start_reset_delete/config.ts rename to x-pack/test/functional/apps/transform/actions/config.ts index edf34d16785c4..3b7948e9c66bc 100644 --- a/x-pack/test/functional/apps/transform/start_reset_delete/config.ts +++ b/x-pack/test/functional/apps/transform/actions/config.ts @@ -14,7 +14,7 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { ...functionalConfig.getAll(), testFiles: [require.resolve('.')], junit: { - reportName: 'Chrome X-Pack UI Functional Tests - transform - start reset & delete', + reportName: 'Chrome X-Pack UI Functional Tests - transform - actions', }, }; } diff --git a/x-pack/test/functional/apps/transform/start_reset_delete/deleting.ts b/x-pack/test/functional/apps/transform/actions/deleting.ts similarity index 100% rename from x-pack/test/functional/apps/transform/start_reset_delete/deleting.ts rename to x-pack/test/functional/apps/transform/actions/deleting.ts diff --git a/x-pack/test/functional/apps/transform/start_reset_delete/index.ts b/x-pack/test/functional/apps/transform/actions/index.ts similarity index 92% rename from x-pack/test/functional/apps/transform/start_reset_delete/index.ts rename to x-pack/test/functional/apps/transform/actions/index.ts index 1a606339eb82a..8a156b4bba84d 100644 --- a/x-pack/test/functional/apps/transform/start_reset_delete/index.ts +++ b/x-pack/test/functional/apps/transform/actions/index.ts @@ -11,7 +11,7 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { const esArchiver = getService('esArchiver'); const transform = getService('transform'); - describe('transform - start reset & delete', function () { + describe('transform - actions', function () { this.tags('transform'); before(async () => { @@ -33,6 +33,7 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { }); loadTestFile(require.resolve('./deleting')); + loadTestFile(require.resolve('./reauthorizing')); loadTestFile(require.resolve('./resetting')); loadTestFile(require.resolve('./starting')); }); diff --git a/x-pack/test/functional/apps/transform/actions/reauthorizing.ts b/x-pack/test/functional/apps/transform/actions/reauthorizing.ts new file mode 100644 index 0000000000000..89acef449c2e7 --- /dev/null +++ b/x-pack/test/functional/apps/transform/actions/reauthorizing.ts @@ -0,0 +1,221 @@ +/* + * 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 { TRANSFORM_HEALTH_LABEL, TRANSFORM_STATE } from '@kbn/transform-plugin/common/constants'; +import type { + TransformLatestConfig, + TransformPivotConfig, +} from '@kbn/transform-plugin/common/types/transform'; +import type { SecurityCreateApiKeyResponse } from '@elastic/elasticsearch/lib/api/types'; +import type { FtrProviderContext } from '../../../ftr_provider_context'; +import { getLatestTransformConfig, getPivotTransformConfig } from '../helpers'; +import { USER } from '../../../services/transform/security_common'; +import { COMMON_REQUEST_HEADERS } from '../../../services/ml/common_api'; + +interface TestDataPivot { + suiteTitle: string; + originalConfig: TransformPivotConfig; + mode: 'batch' | 'continuous'; + type: 'pivot'; + expected: { + originalState: object; + reauthorizeEnabled: boolean; + reauthorizedState: object; + }; + created_by_user: USER; + current_user: USER; +} + +interface TestDataLatest { + suiteTitle: string; + originalConfig: TransformLatestConfig; + mode: 'batch' | 'continuous'; + type: 'latest'; + expected: { + originalState: object; + reauthorizeEnabled: boolean; + reauthorizedState: object; + }; + created_by_user: USER; + current_user: USER; +} + +type TestData = TestDataPivot | TestDataLatest; + +function generateHeaders(apiKey: SecurityCreateApiKeyResponse) { + return { + ...COMMON_REQUEST_HEADERS, + 'es-secondary-authorization': `ApiKey ${apiKey.encoded}`, + }; +} + +export default function ({ getService }: FtrProviderContext) { + const esArchiver = getService('esArchiver'); + const transform = getService('transform'); + + const apiKeysForTransformUsers = new Map(); + + describe('reauthorizing', function () { + const PREFIX = 'reauthorizing'; + const testDataList: TestData[] = [ + { + suiteTitle: 'continuous pivot transform (created by viewer, viewed by viewer)', + originalConfig: getPivotTransformConfig(`${PREFIX}-${USER.TRANSFORM_VIEWER}-1`, true), + mode: 'continuous', + type: 'pivot', + expected: { + originalState: { status: TRANSFORM_STATE.STOPPED, health: TRANSFORM_HEALTH_LABEL.red }, + reauthorizeEnabled: false, + reauthorizedState: { + status: TRANSFORM_STATE.STARTED, + health: TRANSFORM_HEALTH_LABEL.green, + }, + }, + created_by_user: USER.TRANSFORM_VIEWER, + current_user: USER.TRANSFORM_VIEWER, + }, + { + suiteTitle: 'batch pivot transform (created by viewer, viewed by poweruser)', + originalConfig: getPivotTransformConfig(PREFIX, false), + mode: 'batch', + type: 'pivot', + expected: { + originalState: { status: TRANSFORM_STATE.STOPPED, health: TRANSFORM_HEALTH_LABEL.red }, + reauthorizeEnabled: true, + reauthorizedState: { + status: TRANSFORM_STATE.STOPPED, + progress: '100', + health: TRANSFORM_HEALTH_LABEL.green, + }, + }, + created_by_user: USER.TRANSFORM_VIEWER, + current_user: USER.TRANSFORM_POWERUSER, + }, + { + suiteTitle: 'continuous pivot transform (created by viewer, authorized by poweruser)', + originalConfig: getPivotTransformConfig(`${PREFIX}-${USER.TRANSFORM_VIEWER}-2`, true), + mode: 'continuous', + type: 'pivot', + expected: { + originalState: { status: TRANSFORM_STATE.STOPPED, health: TRANSFORM_HEALTH_LABEL.red }, + reauthorizeEnabled: true, + reauthorizedState: { + status: TRANSFORM_STATE.STARTED, + health: TRANSFORM_HEALTH_LABEL.green, + }, + }, + created_by_user: USER.TRANSFORM_VIEWER, + current_user: USER.TRANSFORM_POWERUSER, + }, + { + suiteTitle: 'continuous latest transform (created by poweruser, viewed by viewer)', + originalConfig: getLatestTransformConfig(`${PREFIX}-${USER.TRANSFORM_POWERUSER}-1`, true), + mode: 'continuous', + type: 'latest', + expected: { + originalState: { status: TRANSFORM_STATE.STARTED, health: TRANSFORM_HEALTH_LABEL.green }, + reauthorizeEnabled: false, + reauthorizedState: { + status: TRANSFORM_STATE.STARTED, + health: TRANSFORM_HEALTH_LABEL.green, + }, + }, + created_by_user: USER.TRANSFORM_POWERUSER, + current_user: USER.TRANSFORM_VIEWER, + }, + ]; + + before(async () => { + const apiKeyForTransformUsers = + await transform.securityCommon.createApiKeyForTransformUsers(); + + apiKeyForTransformUsers.forEach(({ user, apiKey }) => + apiKeysForTransformUsers.set(user.name as USER, apiKey) + ); + + await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/ecommerce'); + await transform.testResources.createIndexPatternIfNeeded('ft_ecommerce', 'order_date'); + + for (const testData of testDataList) { + await transform.api.createTransform(testData.originalConfig.id, testData.originalConfig, { + deferValidation: true, + // Create transforms with secondary authorization headers + headers: generateHeaders(apiKeysForTransformUsers.get(testData.created_by_user)!), + }); + // For transforms created with insufficient permissions, they can be created but not started + // so we should not assert that the api call is successful here + await transform.api.startTransform(testData.originalConfig.id, false); + } + await transform.testResources.setKibanaTimeZoneToUTC(); + }); + + after(async () => { + await transform.securityCommon.clearAllTransformApiKeys(); + + for (const testData of testDataList) { + await transform.testResources.deleteIndexPatternByTitle(testData.originalConfig.dest.index); + await transform.api.deleteIndices(testData.originalConfig.dest.index); + } + + await transform.api.cleanTransformIndices(); + await transform.testResources.deleteIndexPatternByTitle('ft_ecommerce'); + }); + + for (const testData of testDataList) { + const transformId = testData.originalConfig.id; + + describe(`${testData.suiteTitle}`, function () { + it('reauthorize transform', async () => { + await transform.securityUI.loginAs(testData.current_user); + + await transform.testExecution.logTestStep('should load the home page'); + await transform.navigation.navigateTo(); + await transform.management.assertTransformListPageExists(); + + await transform.testExecution.logTestStep('should display the transforms table'); + await transform.management.assertTransformsTableExists(); + + await transform.testExecution.logTestStep( + 'should display the transforms reauthorize callout' + ); + await transform.management.assertTransformsReauthorizeCalloutExists(); + + await transform.testExecution.logTestStep( + 'should display the original transform in the transform list' + ); + await transform.table.filterWithSearchString(transformId, 1); + await transform.table.assertTransformRowFields( + transformId, + testData.expected.originalState + ); + + if (testData.expected.reauthorizeEnabled) { + await transform.testExecution.logTestStep('should reauthorize the transform'); + await transform.table.assertTransformRowActionEnabled( + transformId, + 'Reauthorize', + testData.expected.reauthorizeEnabled + ); + await transform.table.clickTransformRowAction(transformId, 'Reauthorize'); + await transform.table.confirmReauthorizeTransform(); + + await transform.table.assertTransformRowFields( + transformId, + testData.expected.reauthorizedState + ); + await transform.testExecution.logTestStep('should not show Reauthorize action anymore'); + await transform.table.assertTransformRowActionMissing(transformId, 'Reauthorize'); + } else { + await transform.testExecution.logTestStep('should show disabled action menu button'); + await transform.table.assertTransformRowActionsButtonEnabled(transformId, false); + } + await transform.table.clearSearchString(testDataList.length); + }); + }); + } + }); +} diff --git a/x-pack/test/functional/apps/transform/start_reset_delete/resetting.ts b/x-pack/test/functional/apps/transform/actions/resetting.ts similarity index 100% rename from x-pack/test/functional/apps/transform/start_reset_delete/resetting.ts rename to x-pack/test/functional/apps/transform/actions/resetting.ts diff --git a/x-pack/test/functional/apps/transform/start_reset_delete/starting.ts b/x-pack/test/functional/apps/transform/actions/starting.ts similarity index 100% rename from x-pack/test/functional/apps/transform/start_reset_delete/starting.ts rename to x-pack/test/functional/apps/transform/actions/starting.ts diff --git a/x-pack/test/functional/services/transform/api.ts b/x-pack/test/functional/services/transform/api.ts index 4c6944b64a91d..8fb984e72e0c5 100644 --- a/x-pack/test/functional/services/transform/api.ts +++ b/x-pack/test/functional/services/transform/api.ts @@ -272,10 +272,13 @@ export function TransformAPIProvider({ getService }: FtrProviderContext) { }); }, - async startTransform(transformId: string) { + async startTransform(transformId: string, assertSuccess = true) { log.debug(`Starting transform '${transformId}' ...`); const { body, status } = await esSupertest.post(`/_transform/${transformId}/_start`); - this.assertResponseStatusCode(200, status, body); + + if (assertSuccess) { + this.assertResponseStatusCode(200, status, body); + } }, async stopTransform(transformId: string) { diff --git a/x-pack/test/functional/services/transform/management.ts b/x-pack/test/functional/services/transform/management.ts index 1855159f478b6..4d5a54f38c7f8 100644 --- a/x-pack/test/functional/services/transform/management.ts +++ b/x-pack/test/functional/services/transform/management.ts @@ -32,6 +32,10 @@ export function TransformManagementProvider({ getService }: FtrProviderContext) await testSubjects.existOrFail('transformCreateFirstButton'); }, + async assertTransformsReauthorizeCalloutExists() { + await testSubjects.existOrFail('transformPageReauthorizeCallout'); + }, + async assertCreateFirstTransformButtonEnabled(expectedValue: boolean) { const isEnabled = await testSubjects.isEnabled('transformCreateFirstButton'); expect(isEnabled).to.eql( diff --git a/x-pack/test/functional/services/transform/transform_table.ts b/x-pack/test/functional/services/transform/transform_table.ts index 135aa18af9b40..2af0d129ed51c 100644 --- a/x-pack/test/functional/services/transform/transform_table.ts +++ b/x-pack/test/functional/services/transform/transform_table.ts @@ -9,7 +9,15 @@ import expect from '@kbn/expect'; import { FtrProviderContext } from '../../ftr_provider_context'; -type TransformRowActionName = 'Clone' | 'Delete' | 'Discover' | 'Edit' | 'Reset' | 'Start' | 'Stop'; +type TransformRowActionName = + | 'Clone' + | 'Delete' + | 'Discover' + | 'Edit' + | 'Reset' + | 'Start' + | 'Stop' + | 'Reauthorize'; export function TransformTableProvider({ getService }: FtrProviderContext) { const find = getService('find'); @@ -464,6 +472,21 @@ export function TransformTableProvider({ getService }: FtrProviderContext) { }); } + public async assertTransformRowActionMissing( + transformId: string, + action: TransformRowActionName + ) { + const selector = `transformAction${action}`; + await retry.tryForTime(60 * 1000, async () => { + await this.refreshTransformList(); + + await this.ensureTransformActionsMenuOpen(transformId); + + await testSubjects.missingOrFail(selector, { timeout: 1000 }); + await this.ensureTransformActionsMenuClosed(); + }); + } + public async assertTransformRowActionEnabled( transformId: string, action: TransformRowActionName, @@ -516,6 +539,14 @@ export function TransformTableProvider({ getService }: FtrProviderContext) { await testSubjects.missingOrFail('transformDeleteModal', { timeout: 60 * 1000 }); } + public async assertTransformReauthorizeModalExists() { + await testSubjects.existOrFail('transformReauthorizeModal', { timeout: 60 * 1000 }); + } + + public async assertTransformReauthorizeModalNotExists() { + await testSubjects.missingOrFail('transformReauthorizeModal', { timeout: 60 * 1000 }); + } + public async assertTransformResetModalExists() { await testSubjects.existOrFail('transformResetModal', { timeout: 60 * 1000 }); } @@ -564,6 +595,14 @@ export function TransformTableProvider({ getService }: FtrProviderContext) { }); } + public async confirmReauthorizeTransform() { + await retry.tryForTime(30 * 1000, async () => { + await this.assertTransformReauthorizeModalExists(); + await testSubjects.click('transformReauthorizeModal > confirmModalConfirmButton'); + await this.assertTransformReauthorizeModalNotExists(); + }); + } + public async confirmStartTransform() { await retry.tryForTime(30 * 1000, async () => { await this.assertTransformStartModalExists(); diff --git a/x-pack/test/functional_basic/apps/transform/start_reset_delete/config.ts b/x-pack/test/functional_basic/apps/transform/actions/config.ts similarity index 85% rename from x-pack/test/functional_basic/apps/transform/start_reset_delete/config.ts rename to x-pack/test/functional_basic/apps/transform/actions/config.ts index 6922e0f70c5a5..34c1359750082 100644 --- a/x-pack/test/functional_basic/apps/transform/start_reset_delete/config.ts +++ b/x-pack/test/functional_basic/apps/transform/actions/config.ts @@ -16,8 +16,7 @@ export default async function ({ readConfigFile }: FtrConfigProviderContext) { testFiles: [require.resolve('.')], junit: { ...transformConfig.get('junit'), - reportName: - 'Chrome X-Pack UI Functional Tests Basic License - transform - start reset & delete', + reportName: 'Chrome X-Pack UI Functional Tests Basic License - transform - actions', }, }; } diff --git a/x-pack/test/functional_basic/apps/transform/start_reset_delete/index.ts b/x-pack/test/functional_basic/apps/transform/actions/index.ts similarity index 95% rename from x-pack/test/functional_basic/apps/transform/start_reset_delete/index.ts rename to x-pack/test/functional_basic/apps/transform/actions/index.ts index 14a9bcbc099c8..589e6536ecc1b 100644 --- a/x-pack/test/functional_basic/apps/transform/start_reset_delete/index.ts +++ b/x-pack/test/functional_basic/apps/transform/actions/index.ts @@ -12,6 +12,6 @@ export default function ({ loadTestFile }: FtrProviderContext) { this.tags(['skipFirefox', 'transform']); // The transform UI should work the same as with a trial license - loadTestFile(require.resolve('../../../../functional/apps/transform/start_reset_delete')); + loadTestFile(require.resolve('../../../../functional/apps/transform/actions')); }); } From 2795ac894b25a53a11a8a7b2f18c5a0c2e5b147d Mon Sep 17 00:00:00 2001 From: Lisa Cawley Date: Thu, 18 May 2023 11:42:14 -0700 Subject: [PATCH 64/78] [DOCS] Add revision to alerts schema (#157938) --- docs/api-generated/rules/rule-apis-passthru.asciidoc | 6 ++++++ x-pack/plugins/alerting/docs/openapi/bundled.json | 12 ++++++++++-- x-pack/plugins/alerting/docs/openapi/bundled.yaml | 7 +++++++ .../components/examples/create_rule_response.yaml | 1 + .../components/examples/find_rules_response.yaml | 1 + .../components/examples/get_rule_response.yaml | 1 + .../components/examples/update_rule_response.yaml | 1 + .../components/schemas/rule_response_properties.yaml | 3 +++ ...alerting@rule@{ruleid}@alert@{alertid}@_mute.yaml | 2 +- ...erting@rule@{ruleid}@alert@{alertid}@_unmute.yaml | 2 +- 10 files changed, 32 insertions(+), 4 deletions(-) diff --git a/docs/api-generated/rules/rule-apis-passthru.asciidoc b/docs/api-generated/rules/rule-apis-passthru.asciidoc index ff865f730b780..c4f472c161efe 100644 --- a/docs/api-generated/rules/rule-apis-passthru.asciidoc +++ b/docs/api-generated/rules/rule-apis-passthru.asciidoc @@ -119,6 +119,7 @@ Any modifications made to this file will be overwritten. "enabled" : true, "muted_alert_ids" : [ "muted_alert_ids", "muted_alert_ids" ], "rule_type_id" : "monitoring_alert_cluster_health", + "revision" : 5, "tags" : [ "tags", "tags" ], "running" : true, "api_key_owner" : "elastic", @@ -418,6 +419,7 @@ Any modifications made to this file will be overwritten. "enabled" : true, "muted_alert_ids" : [ "muted_alert_ids", "muted_alert_ids" ], "rule_type_id" : "monitoring_alert_cluster_health", + "revision" : 5, "tags" : [ "tags", "tags" ], "running" : true, "api_key_owner" : "elastic", @@ -487,6 +489,7 @@ Any modifications made to this file will be overwritten. "enabled" : true, "muted_alert_ids" : [ "muted_alert_ids", "muted_alert_ids" ], "rule_type_id" : "monitoring_alert_cluster_health", + "revision" : 5, "tags" : [ "tags", "tags" ], "running" : true, "api_key_owner" : "elastic", @@ -671,6 +674,7 @@ Any modifications made to this file will be overwritten. "enabled" : true, "muted_alert_ids" : [ "muted_alert_ids", "muted_alert_ids" ], "rule_type_id" : "monitoring_alert_cluster_health", + "revision" : 5, "tags" : [ "tags", "tags" ], "running" : true, "api_key_owner" : "elastic", @@ -2032,6 +2036,7 @@ Any modifications made to this file will be overwritten. "enabled" : true, "muted_alert_ids" : [ "muted_alert_ids", "muted_alert_ids" ], "rule_type_id" : "monitoring_alert_cluster_health", + "revision" : 5, "tags" : [ "tags", "tags" ], "running" : true, "api_key_owner" : "elastic", @@ -2597,6 +2602,7 @@ Any modifications made to this file will be overwritten.
next_run (optional)
notify_when (optional)
params
map[String, oas_any_type_not_mapped] The parameters for the rule.
+
revision (optional)
Integer The rule revision number.
rule_type_id
String The identifier for the type of rule. For example, .es-query, .index-threshold, logs.alert.document.count, monitoring_alert_cluster_health, siem.thresholdRule, or xpack.ml.anomaly_detection_alert.
running (optional)
Boolean Indicates whether the rule is running.
schedule
diff --git a/x-pack/plugins/alerting/docs/openapi/bundled.json b/x-pack/plugins/alerting/docs/openapi/bundled.json index c5b99b0c89398..b17dbef7d29c3 100644 --- a/x-pack/plugins/alerting/docs/openapi/bundled.json +++ b/x-pack/plugins/alerting/docs/openapi/bundled.json @@ -1097,7 +1097,7 @@ "post": { "summary": "Mutes an alert.", "operationId": "muteAlert", - "description": "You must have `all` privileges for the appropriate Kibana features, depending on the `consumer` and `rule_type_id` of the rule. For example, the **Management > Stack Rules** feature, **Analytics > Discover** and **Machine Learning** features, **Observability**, and **Security** features. If the rule has actions, you must also have `read` privileges for the **Management > Actions and Connectors** feature. \n", + "description": "You must have `all` privileges for the appropriate Kibana features, depending on the `consumer` and `rule_type_id` of the rule. For example, the **Management > Stack Rules** feature, **Analytics > Discover** and **Machine Learning** features, **Observability**, and **Security** features. If the rule has actions, you must also have `read` privileges for the **Management > Actions and Connectors** feature.\n", "tags": [ "alerting" ], @@ -1146,7 +1146,7 @@ "post": { "summary": "Unmutes an alert.", "operationId": "unmuteAlert", - "description": "You must have `all` privileges for the appropriate Kibana features, depending on the `consumer` and `rule_type_id` of the rule. For example, the **Management > Stack Rules** feature, **Analytics > Discover** and **Machine Learning** features, **Observability**, and **Security** features. If the rule has actions, you must also have `read` privileges for the **Management > Actions and Connectors** feature. \n", + "description": "You must have `all` privileges for the appropriate Kibana features, depending on the `consumer` and `rule_type_id` of the rule. For example, the **Management > Stack Rules** feature, **Analytics > Discover** and **Machine Learning** features, **Observability**, and **Security** features. If the rule has actions, you must also have `read` privileges for the **Management > Actions and Connectors** feature.\n", "tags": [ "alerting" ], @@ -2692,6 +2692,10 @@ "description": "The parameters for the rule.", "additionalProperties": true }, + "revision": { + "type": "integer", + "description": "The rule revision number." + }, "rule_type_id": { "type": "string", "description": "The identifier for the type of rule. For example, `.es-query`, `.index-threshold`, `logs.alert.document.count`, `monitoring_alert_cluster_health`, `siem.thresholdRule`, or `xpack.ml.anomaly_detection_alert`.\n", @@ -3006,6 +3010,7 @@ "aggField": "sheet.version", "termField": "name.keyword" }, + "revision": 1, "rule_type_id": ".index-threshold", "created_by": "elastic", "updated_by": "elastic", @@ -3099,6 +3104,7 @@ "name": "new name", "enabled": true, "throttle": null, + "revision": 1, "running": false, "schedule": { "interval": "10m" @@ -3262,6 +3268,7 @@ "aggField": "sheet.version", "termField": "name.keyword" }, + "revision": 0, "rule_type_id": ".index-threshold", "running": false, "schedule": { @@ -3312,6 +3319,7 @@ "aggField": "sheet.version", "termField": "name.keyword" }, + "revision": 1, "rule_type_id": ".index-threshold", "created_by": "elastic", "updated_by": "elastic", diff --git a/x-pack/plugins/alerting/docs/openapi/bundled.yaml b/x-pack/plugins/alerting/docs/openapi/bundled.yaml index 702fa6b39a328..a734948511606 100644 --- a/x-pack/plugins/alerting/docs/openapi/bundled.yaml +++ b/x-pack/plugins/alerting/docs/openapi/bundled.yaml @@ -1738,6 +1738,9 @@ components: type: object description: The parameters for the rule. additionalProperties: true + revision: + type: integer + description: The rule revision number. rule_type_id: type: string description: | @@ -1973,6 +1976,7 @@ components: timeField: '@timestamp' aggField: sheet.version termField: name.keyword + revision: 1 rule_type_id: .index-threshold created_by: elastic updated_by: elastic @@ -2056,6 +2060,7 @@ components: name: new name enabled: true throttle: null + revision: 1 running: false schedule: interval: 10m @@ -2199,6 +2204,7 @@ components: timeField: '@timestamp' aggField: sheet.version termField: name.keyword + revision: 0 rule_type_id: .index-threshold running: false schedule: @@ -2239,6 +2245,7 @@ components: timeField: '@timestamp' aggField: sheet.version termField: name.keyword + revision: 1 rule_type_id: .index-threshold created_by: elastic updated_by: elastic diff --git a/x-pack/plugins/alerting/docs/openapi/components/examples/create_rule_response.yaml b/x-pack/plugins/alerting/docs/openapi/components/examples/create_rule_response.yaml index 566f57745ed95..34e7e8e1e17b2 100644 --- a/x-pack/plugins/alerting/docs/openapi/components/examples/create_rule_response.yaml +++ b/x-pack/plugins/alerting/docs/openapi/components/examples/create_rule_response.yaml @@ -39,6 +39,7 @@ value: timeField: "@timestamp" aggField: sheet.version termField: name.keyword + revision: 0 rule_type_id: .index-threshold running: false schedule: diff --git a/x-pack/plugins/alerting/docs/openapi/components/examples/find_rules_response.yaml b/x-pack/plugins/alerting/docs/openapi/components/examples/find_rules_response.yaml index 033435ba178a4..d16882b9711c3 100644 --- a/x-pack/plugins/alerting/docs/openapi/components/examples/find_rules_response.yaml +++ b/x-pack/plugins/alerting/docs/openapi/components/examples/find_rules_response.yaml @@ -27,6 +27,7 @@ value: timeField: "@timestamp" aggField: sheet.version termField: name.keyword + revision: 1 rule_type_id: .index-threshold created_by: elastic updated_by: elastic diff --git a/x-pack/plugins/alerting/docs/openapi/components/examples/get_rule_response.yaml b/x-pack/plugins/alerting/docs/openapi/components/examples/get_rule_response.yaml index 2ee88f2589d85..724226aebe0b4 100644 --- a/x-pack/plugins/alerting/docs/openapi/components/examples/get_rule_response.yaml +++ b/x-pack/plugins/alerting/docs/openapi/components/examples/get_rule_response.yaml @@ -23,6 +23,7 @@ value: timeField: "@timestamp" aggField: sheet.version termField: name.keyword + revision: 1 rule_type_id: .index-threshold created_by: elastic updated_by: elastic diff --git a/x-pack/plugins/alerting/docs/openapi/components/examples/update_rule_response.yaml b/x-pack/plugins/alerting/docs/openapi/components/examples/update_rule_response.yaml index 8ebd107c5ac65..2d0f56a04b6b7 100644 --- a/x-pack/plugins/alerting/docs/openapi/components/examples/update_rule_response.yaml +++ b/x-pack/plugins/alerting/docs/openapi/components/examples/update_rule_response.yaml @@ -6,6 +6,7 @@ value: name: new name enabled: true throttle: null + revision: 1 running: false schedule: interval: 10m diff --git a/x-pack/plugins/alerting/docs/openapi/components/schemas/rule_response_properties.yaml b/x-pack/plugins/alerting/docs/openapi/components/schemas/rule_response_properties.yaml index b8617ed1ec5ec..d2d37b8f3736a 100644 --- a/x-pack/plugins/alerting/docs/openapi/components/schemas/rule_response_properties.yaml +++ b/x-pack/plugins/alerting/docs/openapi/components/schemas/rule_response_properties.yaml @@ -115,6 +115,9 @@ properties: type: object description: The parameters for the rule. additionalProperties: true + revision: + type: integer + description: The rule revision number. rule_type_id: type: string description: > diff --git a/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerting@rule@{ruleid}@alert@{alertid}@_mute.yaml b/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerting@rule@{ruleid}@alert@{alertid}@_mute.yaml index 2356bf4a60394..040d6242b0596 100644 --- a/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerting@rule@{ruleid}@alert@{alertid}@_mute.yaml +++ b/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerting@rule@{ruleid}@alert@{alertid}@_mute.yaml @@ -7,7 +7,7 @@ post: **Management > Stack Rules** feature, **Analytics > Discover** and **Machine Learning** features, **Observability**, and **Security** features. If the rule has actions, you must also have `read` privileges for the - **Management > Actions and Connectors** feature. + **Management > Actions and Connectors** feature. tags: - alerting parameters: diff --git a/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerting@rule@{ruleid}@alert@{alertid}@_unmute.yaml b/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerting@rule@{ruleid}@alert@{alertid}@_unmute.yaml index c06eccb531b46..dd78b1d3449d0 100644 --- a/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerting@rule@{ruleid}@alert@{alertid}@_unmute.yaml +++ b/x-pack/plugins/alerting/docs/openapi/paths/s@{spaceid}@api@alerting@rule@{ruleid}@alert@{alertid}@_unmute.yaml @@ -7,7 +7,7 @@ post: **Management > Stack Rules** feature, **Analytics > Discover** and **Machine Learning** features, **Observability**, and **Security** features. If the rule has actions, you must also have `read` privileges for the - **Management > Actions and Connectors** feature. + **Management > Actions and Connectors** feature. tags: - alerting parameters: From 4dd1373571c99540d8ca04846f1e2aeb55fbe80f Mon Sep 17 00:00:00 2001 From: Sergi Massaneda Date: Thu, 18 May 2023 20:49:47 +0200 Subject: [PATCH 65/78] [Security Solution] Add support for multiple values in cell actions (#158060) ## Summary fixes: https://github.com/elastic/kibana/issues/157237 closes: https://github.com/elastic/kibana/issues/157887 Enables cell actions package to support multi-valuated cells. Actions affected: - Filter In - Filter Out - Add To Timeline - Copy To Clipboard ### Recording https://github.com/elastic/kibana/assets/17747913/a192173d-5fca-4b33-91a7-664ecd71550b #### Caveat The `FilterManager` does not recognize the duplicated filter when using the new `Combined` filters (the ones that allow AND/OR operations), so when adding two opposite combined filters, it does not remove the first one and both are applied at the same time: ![combined_filters_problem](https://github.com/elastic/kibana/assets/17747913/dc2f60db-28e7-4656-aaa2-d8550e8ef128) --- .../copy_to_clipboard.test.ts | 20 ++++ .../copy_to_clipboard/copy_to_clipboard.ts | 6 +- .../src/actions/filter/create_filter.test.ts | 41 +++++--- .../src/actions/filter/create_filter.ts | 94 +++++++++++------- .../cell_action/add_to_timeline.test.ts | 96 +++++++++++++++---- .../cell_action/add_to_timeline.ts | 36 +++++-- .../event_details/overview/overview_card.tsx | 2 +- .../table/summary_value_cell.tsx | 2 +- 8 files changed, 212 insertions(+), 85 deletions(-) diff --git a/packages/kbn-cell-actions/src/actions/copy_to_clipboard/copy_to_clipboard.test.ts b/packages/kbn-cell-actions/src/actions/copy_to_clipboard/copy_to_clipboard.test.ts index 395fbd13cfadf..5037e1cd529f5 100644 --- a/packages/kbn-cell-actions/src/actions/copy_to_clipboard/copy_to_clipboard.test.ts +++ b/packages/kbn-cell-actions/src/actions/copy_to_clipboard/copy_to_clipboard.test.ts @@ -48,5 +48,25 @@ describe('Default createCopyToClipboardActionFactory', () => { expect(mockCopy).toHaveBeenCalledWith('user.name: "the value"'); expect(mockSuccessToast).toHaveBeenCalled(); }); + + it('should escape value', async () => { + await copyToClipboardAction.execute({ + ...context, + field: { ...context.field, value: 'the "value"' }, + }); + expect(mockCopy).toHaveBeenCalledWith('user.name: "the \\"value\\""'); + expect(mockSuccessToast).toHaveBeenCalled(); + }); + + it('should suport multiple values', async () => { + await copyToClipboardAction.execute({ + ...context, + field: { ...context.field, value: ['the "value"', 'another value', 'last value'] }, + }); + expect(mockCopy).toHaveBeenCalledWith( + 'user.name: "the \\"value\\"" AND "another value" AND "last value"' + ); + expect(mockSuccessToast).toHaveBeenCalled(); + }); }); }); diff --git a/packages/kbn-cell-actions/src/actions/copy_to_clipboard/copy_to_clipboard.ts b/packages/kbn-cell-actions/src/actions/copy_to_clipboard/copy_to_clipboard.ts index 9d4860da1c77c..cafbd29d91455 100644 --- a/packages/kbn-cell-actions/src/actions/copy_to_clipboard/copy_to_clipboard.ts +++ b/packages/kbn-cell-actions/src/actions/copy_to_clipboard/copy_to_clipboard.ts @@ -23,6 +23,8 @@ const COPY_TO_CLIPBOARD_SUCCESS = i18n.translate( } ); +const escapeValue = (value: string) => value.replace(/"/g, '\\"'); + export const createCopyToClipboardActionFactory = createCellActionFactory( ({ notifications }: { notifications: NotificationsStart }) => ({ type: COPY_CELL_ACTION_TYPE, @@ -34,8 +36,8 @@ export const createCopyToClipboardActionFactory = createCellActionFactory( let textValue: undefined | string; if (field.value != null) { textValue = Array.isArray(field.value) - ? field.value.map((value) => `"${value}"`).join(', ') - : `"${field.value}"`; + ? field.value.map((value) => `"${escapeValue(value)}"`).join(' AND ') + : `"${escapeValue(field.value)}"`; } const text = textValue ? `${field.name}: ${textValue}` : field.name; const isSuccess = copy(text, { debug: true }); diff --git a/packages/kbn-cell-actions/src/actions/filter/create_filter.test.ts b/packages/kbn-cell-actions/src/actions/filter/create_filter.test.ts index 12ae2fa16a2dd..7d4a2f12a216a 100644 --- a/packages/kbn-cell-actions/src/actions/filter/create_filter.test.ts +++ b/packages/kbn-cell-actions/src/actions/filter/create_filter.test.ts @@ -18,21 +18,17 @@ describe('createFilter', () => { ])('should return filter with $caseName value', ({ caseValue }) => { expect(createFilter({ key: field, value: caseValue, negate: false })).toEqual({ meta: { - alias: null, - disabled: false, type: 'phrase', key: field, negate: false, - value, params: { query: value, }, }, query: { - match: { + match_phrase: { [field]: { query: value, - type: 'phrase', }, }, }, @@ -45,27 +41,48 @@ describe('createFilter', () => { ])('should return negate filter with $caseName value', ({ caseValue }) => { expect(createFilter({ key: field, value: caseValue, negate: true })).toEqual({ meta: { - alias: null, - disabled: false, type: 'phrase', key: field, negate: true, - value, params: { query: value, }, }, query: { - match: { + match_phrase: { [field]: { query: value, - type: 'phrase', }, }, }, }); }); + it.each([ + { caseName: 'non-negated', negate: false }, + { caseName: 'negated', negate: true }, + ])('should return combined filter with multiple $caseName values', ({ negate }) => { + const value2 = 'the-value2'; + expect(createFilter({ key: field, value: [value, value2], negate })).toEqual({ + meta: { + type: 'combined', + relation: 'AND', + key: field, + negate, + params: [ + { + meta: { type: 'phrase', key: field, params: { query: value } }, + query: { match_phrase: { [field]: { query: value } } }, + }, + { + meta: { type: 'phrase', key: field, params: { query: value2 } }, + query: { match_phrase: { [field]: { query: value2 } } }, + }, + ], + }, + }); + }); + it.each([ { caseName: 'null', caseValue: null }, { caseName: 'undefined', caseValue: undefined }, @@ -79,8 +96,6 @@ describe('createFilter', () => { }, }, meta: { - alias: null, - disabled: false, key: field, negate: false, type: 'exists', @@ -102,8 +117,6 @@ describe('createFilter', () => { }, }, meta: { - alias: null, - disabled: false, key: field, negate: true, type: 'exists', diff --git a/packages/kbn-cell-actions/src/actions/filter/create_filter.ts b/packages/kbn-cell-actions/src/actions/filter/create_filter.ts index 1dcb44e2b73e7..36a56d602ed97 100644 --- a/packages/kbn-cell-actions/src/actions/filter/create_filter.ts +++ b/packages/kbn-cell-actions/src/actions/filter/create_filter.ts @@ -5,10 +5,54 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ -import type { Filter } from '@kbn/es-query'; +import { + BooleanRelation, + FILTERS, + type CombinedFilter, + type ExistsFilter, + type PhraseFilter, + type Filter, +} from '@kbn/es-query'; -export const isEmptyFilterValue = (value: string[] | string | null | undefined) => - value == null || value.length === 0; +export const isEmptyFilterValue = ( + value: string[] | string | null | undefined +): value is null | undefined | never[] => value == null || value.length === 0; + +const createExistsFilter = ({ key, negate }: { key: string; negate: boolean }): ExistsFilter => ({ + meta: { key, negate, type: FILTERS.EXISTS, value: 'exists' }, + query: { exists: { field: key } }, +}); + +const createPhraseFilter = ({ + key, + negate, + value, +}: { + value: string; + key: string; + negate?: boolean; +}): PhraseFilter => ({ + meta: { key, negate, type: FILTERS.PHRASE, params: { query: value } }, + query: { match_phrase: { [key]: { query: value } } }, +}); + +const createCombinedFilter = ({ + values, + key, + negate, +}: { + values: string[]; + key: string; + negate: boolean; +}): CombinedFilter => ({ + meta: { + key, + negate, + type: FILTERS.COMBINED, + relation: BooleanRelation.AND, + params: values.map((value) => createPhraseFilter({ key, value })), + }, +}); export const createFilter = ({ key, @@ -19,39 +63,15 @@ export const createFilter = ({ value: string[] | string | null | undefined; negate: boolean; }): Filter => { - const queryValue = !isEmptyFilterValue(value) ? (Array.isArray(value) ? value[0] : value) : null; - const meta = { alias: null, disabled: false, key, negate }; - - if (queryValue == null) { - return { - query: { - exists: { - field: key, - }, - }, - meta: { - ...meta, - type: 'exists', - value: 'exists', - }, - }; + if (isEmptyFilterValue(value)) { + return createExistsFilter({ key, negate }); + } + if (Array.isArray(value)) { + if (value.length > 1) { + return createCombinedFilter({ key, negate, values: value }); + } else { + return createPhraseFilter({ key, negate, value: value[0] }); + } } - return { - meta: { - ...meta, - type: 'phrase', - value: queryValue, - params: { - query: queryValue, - }, - }, - query: { - match: { - [key]: { - query: queryValue, - type: 'phrase', - }, - }, - }, - }; + return createPhraseFilter({ key, negate, value }); }; diff --git a/x-pack/plugins/security_solution/public/actions/add_to_timeline/cell_action/add_to_timeline.test.ts b/x-pack/plugins/security_solution/public/actions/add_to_timeline/cell_action/add_to_timeline.test.ts index 340a7cc11c2e2..257316b06f2bc 100644 --- a/x-pack/plugins/security_solution/public/actions/add_to_timeline/cell_action/add_to_timeline.test.ts +++ b/x-pack/plugins/security_solution/public/actions/add_to_timeline/cell_action/add_to_timeline.test.ts @@ -12,6 +12,7 @@ import { createAddToTimelineCellActionFactory } from './add_to_timeline'; import type { CellActionExecutionContext } from '@kbn/cell-actions'; import { GEO_FIELD_TYPE } from '../../../timelines/components/timeline/body/renderers/constants'; import { createStartServicesMock } from '../../../common/lib/kibana/kibana_react.mock'; +import { set } from 'lodash/fp'; const services = createStartServicesMock(); const mockWarningToast = services.notifications.toasts.addWarning; @@ -28,24 +29,24 @@ const context = { } as CellActionExecutionContext; const defaultDataProvider = { + and: [], + enabled: true, + excluded: false, + id: 'event-field-default-timeline-1-user_name-0-the-value', + kqlQuery: '', + name: 'user.name', + queryMatch: { + field: 'user.name', + operator: ':', + value: 'the-value', + }, +}; + +const defaultDataProviderAction = { type: addProvider.type, payload: { id: TimelineId.active, - providers: [ - { - and: [], - enabled: true, - excluded: false, - id: 'event-field-default-timeline-1-user_name-0-the-value', - kqlQuery: '', - name: 'user.name', - queryMatch: { - field: 'user.name', - operator: ':', - value: 'the-value', - }, - }, - ], + providers: [defaultDataProvider], }, }; @@ -80,9 +81,62 @@ describe('createAddToTimelineCellAction', () => { }); describe('execute', () => { - it('should execute normally', async () => { + it('should execute with default value', async () => { await addToTimelineAction.execute(context); - expect(mockDispatch).toHaveBeenCalledWith(defaultDataProvider); + expect(mockDispatch).toHaveBeenCalledWith(defaultDataProviderAction); + expect(mockWarningToast).not.toHaveBeenCalled(); + }); + + it('should execute with null value', async () => { + await addToTimelineAction.execute({ + field: { name: 'user.name', value: null, type: 'text' }, + } as CellActionExecutionContext); + expect(mockDispatch).toHaveBeenCalledWith( + set( + 'payload.providers[0]', + { + ...defaultDataProvider, + id: 'empty-value-timeline-1-user_name-0', + excluded: true, + queryMatch: { + field: 'user.name', + value: '', + operator: ':*', + }, + }, + defaultDataProviderAction + ) + ); + expect(mockWarningToast).not.toHaveBeenCalled(); + }); + + it('should execute with multiple values', async () => { + const value2 = 'value2'; + const value3 = 'value3'; + await addToTimelineAction.execute({ + field: { name: 'user.name', value: [value, value2, value3], type: 'text' }, + } as CellActionExecutionContext); + expect(mockDispatch).toHaveBeenCalledWith( + set( + 'payload.providers[0]', + { + ...defaultDataProvider, + and: [ + { + ...defaultDataProvider, + id: 'event-field-default-timeline-1-user_name-0-value2', + queryMatch: { ...defaultDataProvider.queryMatch, value: value2 }, + }, + { + ...defaultDataProvider, + id: 'event-field-default-timeline-1-user_name-0-value3', + queryMatch: { ...defaultDataProvider.queryMatch, value: value3 }, + }, + ], + }, + defaultDataProviderAction + ) + ); expect(mockWarningToast).not.toHaveBeenCalled(); }); @@ -106,7 +160,7 @@ describe('createAddToTimelineCellAction', () => { negateFilters: false, }, }); - expect(mockDispatch).toHaveBeenCalledWith(defaultDataProvider); + expect(mockDispatch).toHaveBeenCalledWith(defaultDataProviderAction); expect(mockWarningToast).not.toHaveBeenCalled(); }); @@ -118,10 +172,10 @@ describe('createAddToTimelineCellAction', () => { }, }); expect(mockDispatch).toHaveBeenCalledWith({ - ...defaultDataProvider, + ...defaultDataProviderAction, payload: { - ...defaultDataProvider.payload, - providers: [{ ...defaultDataProvider.payload.providers[0], excluded: true }], + ...defaultDataProviderAction.payload, + providers: [{ ...defaultDataProviderAction.payload.providers[0], excluded: true }], }, }); expect(mockWarningToast).not.toHaveBeenCalled(); diff --git a/x-pack/plugins/security_solution/public/actions/add_to_timeline/cell_action/add_to_timeline.ts b/x-pack/plugins/security_solution/public/actions/add_to_timeline/cell_action/add_to_timeline.ts index 1fb2f5cee22f9..961825d9bacd9 100644 --- a/x-pack/plugins/security_solution/public/actions/add_to_timeline/cell_action/add_to_timeline.ts +++ b/x-pack/plugins/security_solution/public/actions/add_to_timeline/cell_action/add_to_timeline.ts @@ -40,22 +40,40 @@ export const createAddToTimelineCellActionFactory = createCellActionFactory( getDisplayNameTooltip: () => ADD_TO_TIMELINE, isCompatible: async ({ field }) => fieldHasCellActions(field.name) && isValidDataProviderField(field.name, field.type), - execute: async ({ field, metadata }) => { - const dataProviders = + execute: async ({ field: { value, type, name }, metadata }) => { + const values = Array.isArray(value) ? value : [value]; + const [firstValue, ...andValues] = values; + const [dataProvider] = createDataProviders({ contextId: TimelineId.active, - fieldType: field.type, - values: field.value, - field: field.name, + fieldType: type, + values: firstValue, + field: name, negate: metadata?.negateFilters === true, }) ?? []; - if (dataProviders.length > 0) { - store.dispatch(addProvider({ id: TimelineId.active, providers: dataProviders })); + if (dataProvider) { + andValues.forEach((andValue) => { + const [andDataProvider] = + createDataProviders({ + contextId: TimelineId.active, + fieldType: type, + values: andValue, + field: name, + negate: metadata?.negateFilters === true, + }) ?? []; + if (andDataProvider) { + dataProvider.and.push(andDataProvider); + } + }); + } + + if (dataProvider) { + store.dispatch(addProvider({ id: TimelineId.active, providers: [dataProvider] })); let messageValue = ''; - if (field.value != null) { - messageValue = Array.isArray(field.value) ? field.value.join(', ') : field.value; + if (value != null) { + messageValue = Array.isArray(value) ? value.join(', ') : value; } notificationsService.toasts.addSuccess({ title: ADD_TO_TIMELINE_SUCCESS_TITLE(messageValue), diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/overview/overview_card.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/overview/overview_card.tsx index e5f107fd31860..cfe4247d4b091 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/overview/overview_card.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/overview/overview_card.tsx @@ -94,7 +94,7 @@ export const OverviewCardWithActions: React.FC = ( = ({ 0 ? values[0] : '', + value: values, type: data.type, aggregatable: fieldFromBrowserField?.aggregatable, }} From 5262da394c06d01e12ed106fc63ac470f679b9ba Mon Sep 17 00:00:00 2001 From: Anton Dosov Date: Thu, 18 May 2023 21:41:47 +0200 Subject: [PATCH 66/78] [Serverless/sidenav] Hide collapsed sidebar on smaller screen, move nav button to the header (#157999) ## Summary Partially addresses https://github.com/elastic/kibana/issues/157819, https://github.com/elastic/kibana/issues/157032 To address https://github.com/elastic/kibana/issues/157032 I've hidden the collapsed side nav on a smaller screen. Since there is no more side nav on smaller screen, I had to move the expand/collapse button to the header. But it was also proposed to have that button in the header constantly [here](https://github.com/elastic/kibana/issues/157819#issuecomment-1551023516), so I decided to just leave it there both for smaller and larger screens. This makes us closer to the recent version (17/05) that @MichaelMarcialis proposed _(Not sure if we it was already decide to go that route?)_ https://github.com/elastic/kibana/assets/7784120/7a163572-ee0a-41d1-89df-2882b786be94 --- .../src/ui/project/header.tsx | 55 +++++++++++-- .../src/ui/project/navigation.tsx | 77 ++++++++----------- 2 files changed, 80 insertions(+), 52 deletions(-) diff --git a/packages/core/chrome/core-chrome-browser-internal/src/ui/project/header.tsx b/packages/core/chrome/core-chrome-browser-internal/src/ui/project/header.tsx index 208f3aac7100d..b85ab8f0e4c89 100644 --- a/packages/core/chrome/core-chrome-browser-internal/src/ui/project/header.tsx +++ b/packages/core/chrome/core-chrome-browser-internal/src/ui/project/header.tsx @@ -6,15 +6,25 @@ * Side Public License, v 1. */ -import React from 'react'; +import React, { createRef, useState } from 'react'; import { Router } from 'react-router-dom'; -import { EuiHeader, EuiHeaderLogo, EuiHeaderSection, EuiHeaderSectionItem } from '@elastic/eui'; +import { + EuiHeader, + EuiHeaderLogo, + EuiHeaderSection, + EuiHeaderSectionItem, + EuiHeaderSectionItemButton, + EuiIcon, + htmlIdGenerator, +} from '@elastic/eui'; import { ChromeBreadcrumb, ChromeGlobalHelpExtensionMenuLink, ChromeHelpExtension, ChromeNavControl, } from '@kbn/core-chrome-browser/src'; +import useLocalStorage from 'react-use/lib/useLocalStorage'; +import { i18n } from '@kbn/i18n'; import { Observable } from 'rxjs'; import { MountPoint } from '@kbn/core-mount-utils-browser'; import { InternalApplicationStart } from '@kbn/core-application-browser-internal'; @@ -37,6 +47,8 @@ interface Props { children: React.ReactNode; } +const LOCAL_STORAGE_IS_OPEN_KEY = 'PROJECT_NAVIGATION_OPEN' as const; + export const ProjectHeader = ({ application, kibanaDocLink, @@ -44,6 +56,10 @@ export const ProjectHeader = ({ children, ...observables }: Props) => { + const [navId] = useState(htmlIdGenerator()()); + const [isOpen, setIsOpen] = useLocalStorage(LOCAL_STORAGE_IS_OPEN_KEY, true); + const toggleCollapsibleNavRef = createRef void }>(); + const renderLogo = () => ( - {renderLogo()} + + + { + setIsOpen(false); + if (toggleCollapsibleNavRef.current) { + toggleCollapsibleNavRef.current.focus(); + } + }} + button={ + setIsOpen(!isOpen)} + aria-expanded={isOpen!} + aria-pressed={isOpen!} + aria-controls={navId} + ref={toggleCollapsibleNavRef} + > + + + } + > + {children} + + + + {renderLogo()} @@ -82,9 +128,6 @@ export const ProjectHeader = ({ - - {children} - ); }; diff --git a/packages/core/chrome/core-chrome-browser-internal/src/ui/project/navigation.tsx b/packages/core/chrome/core-chrome-browser-internal/src/ui/project/navigation.tsx index 649318a26d15e..f22a8acb067ed 100644 --- a/packages/core/chrome/core-chrome-browser-internal/src/ui/project/navigation.tsx +++ b/packages/core/chrome/core-chrome-browser-internal/src/ui/project/navigation.tsx @@ -6,67 +6,52 @@ * Side Public License, v 1. */ -import React, { useCallback } from 'react'; -import useLocalStorage from 'react-use/lib/useLocalStorage'; +import React from 'react'; import { css } from '@emotion/react'; - -import { i18n } from '@kbn/i18n'; -import { EuiButtonIcon, EuiCollapsibleNav } from '@elastic/eui'; - -const LOCAL_STORAGE_IS_OPEN_KEY = 'PROJECT_NAVIGATION_OPEN' as const; -const SIZE_OPEN = 248; -const SIZE_CLOSED = 40; - -const buttonCSS = css` - margin-left: -32px; - margin-top: 12px; - position: fixed; - z-index: 1000; -`; - -const openAriaLabel = i18n.translate('core.ui.chrome.projectNav.collapsibleNavOpenAriaLabel', { - defaultMessage: 'Close navigation', -}); - -const closedAriaLabel = i18n.translate('core.ui.chrome.projectNav.collapsibleNavClosedAriaLabel', { - defaultMessage: 'Open navigation', -}); - -export const ProjectNavigation: React.FC = ({ children }) => { - const [isOpen, setIsOpen] = useLocalStorage(LOCAL_STORAGE_IS_OPEN_KEY, true); - - const toggleOpen = useCallback(() => { - setIsOpen(!isOpen); - }, [isOpen, setIsOpen]); - +import { EuiCollapsibleNav, EuiCollapsibleNavProps, useIsWithinMinBreakpoint } from '@elastic/eui'; + +const SIZE_EXPANDED = 248; +const SIZE_COLLAPSED = 48; + +export interface ProjectNavigationProps { + isOpen: boolean; + closeNav: () => void; + button: EuiCollapsibleNavProps['button']; +} + +export const ProjectNavigation: React.FC = ({ + children, + isOpen, + closeNav, + button, +}) => { const collabsibleNavCSS = css` border-inline-end-width: 1, display: flex, flex-direction: row, `; + // on small screen isOpen hides the nav, + // on larger screen isOpen makes it smaller + const DOCKED_BREAKPOINT = 's' as const; + const isCollapsible = useIsWithinMinBreakpoint(DOCKED_BREAKPOINT); + const isVisible = isCollapsible ? true : isOpen; + const isCollapsed = isCollapsible ? !isOpen : false; + return ( - - - } + button={button} > - {isOpen && children} + {!isCollapsed && children} ); }; From 505b4e8cf0c4cad43e046df0a6c3d5ed79fe80c1 Mon Sep 17 00:00:00 2001 From: Karl Godard Date: Thu, 18 May 2023 14:33:05 -0700 Subject: [PATCH 67/78] [D4C] Fix to k8s option not showing on standalone tab (#158091) ## Summary Adds "cloud_defend" to the list of k8s packages (in order for kubernetes tab to show in standalone agent flyout) --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- x-pack/plugins/fleet/common/constants/epm.ts | 1 + x-pack/plugins/fleet/common/index.ts | 1 + .../public/components/agent_enrollment_flyout/hooks.tsx | 8 ++++++-- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/x-pack/plugins/fleet/common/constants/epm.ts b/x-pack/plugins/fleet/common/constants/epm.ts index ca1a328dc07b9..4132b62fee577 100644 --- a/x-pack/plugins/fleet/common/constants/epm.ts +++ b/x-pack/plugins/fleet/common/constants/epm.ts @@ -21,6 +21,7 @@ export const FLEET_CLOUD_SECURITY_POSTURE_PACKAGE = 'cloud_security_posture'; export const FLEET_CLOUD_SECURITY_POSTURE_KSPM_POLICY_TEMPLATE = 'kspm'; export const FLEET_CLOUD_SECURITY_POSTURE_CSPM_POLICY_TEMPLATE = 'cspm'; export const FLEET_CLOUD_SECURITY_POSTURE_CNVM_POLICY_TEMPLATE = 'vuln_mgmt'; +export const FLEET_CLOUD_DEFEND_PACKAGE = 'cloud_defend'; export const PACKAGE_TEMPLATE_SUFFIX = '@package'; export const USER_SETTINGS_TEMPLATE_SUFFIX = '@custom'; diff --git a/x-pack/plugins/fleet/common/index.ts b/x-pack/plugins/fleet/common/index.ts index 86b18250fda56..bb480542133cb 100644 --- a/x-pack/plugins/fleet/common/index.ts +++ b/x-pack/plugins/fleet/common/index.ts @@ -20,6 +20,7 @@ export { FLEET_CLOUD_SECURITY_POSTURE_KSPM_POLICY_TEMPLATE, FLEET_CLOUD_SECURITY_POSTURE_CSPM_POLICY_TEMPLATE, FLEET_CLOUD_SECURITY_POSTURE_CNVM_POLICY_TEMPLATE, + FLEET_CLOUD_DEFEND_PACKAGE, FLEET_ENDPOINT_PACKAGE, // Saved object type AGENT_POLICY_SAVED_OBJECT_TYPE, diff --git a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/hooks.tsx b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/hooks.tsx index 65600c4e9b6ff..c38407568e310 100644 --- a/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/hooks.tsx +++ b/x-pack/plugins/fleet/public/components/agent_enrollment_flyout/hooks.tsx @@ -9,13 +9,17 @@ import { i18n } from '@kbn/i18n'; import type { PackagePolicy, AgentPolicy } from '../../types'; import { sendGetOneAgentPolicy, useStartServices } from '../../hooks'; -import { FLEET_KUBERNETES_PACKAGE, FLEET_CLOUD_SECURITY_POSTURE_PACKAGE } from '../../../common'; +import { + FLEET_KUBERNETES_PACKAGE, + FLEET_CLOUD_SECURITY_POSTURE_PACKAGE, + FLEET_CLOUD_DEFEND_PACKAGE, +} from '../../../common'; import { getCloudFormationTemplateUrlFromPackagePolicy } from '../../services'; import type { K8sMode, CloudSecurityIntegrationType } from './types'; // Packages that requires custom elastic-agent manifest -const K8S_PACKAGES = new Set([FLEET_KUBERNETES_PACKAGE]); +const K8S_PACKAGES = new Set([FLEET_KUBERNETES_PACKAGE, FLEET_CLOUD_DEFEND_PACKAGE]); export function useAgentPolicyWithPackagePolicies(policyId?: string) { const [agentPolicyWithPackagePolicies, setAgentPolicy] = useState(null); From 6c15bab967e3b5562b012c55380645443f6ec68c Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Fri, 19 May 2023 00:58:45 -0400 Subject: [PATCH 68/78] [api-docs] 2023-05-19 Daily api_docs build (#158129) Generated by https://buildkite.com/elastic/kibana-api-docs-daily/builds/342 --- api_docs/actions.mdx | 2 +- api_docs/advanced_settings.mdx | 2 +- api_docs/aiops.mdx | 2 +- api_docs/alerting.mdx | 2 +- api_docs/apm.mdx | 2 +- api_docs/asset_manager.mdx | 2 +- api_docs/banners.mdx | 2 +- api_docs/bfetch.mdx | 2 +- api_docs/canvas.mdx | 2 +- api_docs/cases.mdx | 2 +- api_docs/charts.mdx | 2 +- api_docs/cloud.mdx | 2 +- api_docs/cloud_chat.mdx | 2 +- api_docs/cloud_data_migration.mdx | 2 +- api_docs/cloud_defend.mdx | 2 +- api_docs/cloud_experiments.mdx | 2 +- api_docs/cloud_security_posture.mdx | 2 +- api_docs/console.mdx | 2 +- api_docs/content_management.mdx | 2 +- api_docs/controls.mdx | 2 +- api_docs/custom_integrations.mdx | 2 +- api_docs/dashboard.mdx | 2 +- api_docs/dashboard_enhanced.mdx | 2 +- api_docs/data.mdx | 2 +- api_docs/data_query.mdx | 2 +- api_docs/data_search.mdx | 2 +- api_docs/data_view_editor.mdx | 2 +- api_docs/data_view_field_editor.mdx | 2 +- api_docs/data_view_management.mdx | 2 +- api_docs/data_views.mdx | 2 +- api_docs/data_visualizer.mdx | 2 +- api_docs/deprecations_by_api.mdx | 2 +- api_docs/deprecations_by_plugin.mdx | 4 +- api_docs/deprecations_by_team.mdx | 2 +- api_docs/dev_tools.mdx | 2 +- api_docs/discover.mdx | 2 +- api_docs/discover_enhanced.mdx | 2 +- api_docs/ecs_data_quality_dashboard.mdx | 2 +- api_docs/embeddable.mdx | 2 +- api_docs/embeddable_enhanced.mdx | 2 +- api_docs/encrypted_saved_objects.mdx | 2 +- api_docs/enterprise_search.mdx | 2 +- api_docs/es_ui_shared.mdx | 2 +- api_docs/event_annotation.mdx | 2 +- api_docs/event_log.mdx | 2 +- api_docs/exploratory_view.mdx | 2 +- api_docs/expression_error.mdx | 2 +- api_docs/expression_gauge.mdx | 2 +- api_docs/expression_heatmap.mdx | 2 +- api_docs/expression_image.mdx | 2 +- api_docs/expression_legacy_metric_vis.mdx | 2 +- api_docs/expression_metric.mdx | 2 +- api_docs/expression_metric_vis.mdx | 2 +- api_docs/expression_partition_vis.mdx | 2 +- api_docs/expression_repeat_image.mdx | 2 +- api_docs/expression_reveal_image.mdx | 2 +- api_docs/expression_shape.mdx | 2 +- api_docs/expression_tagcloud.mdx | 2 +- api_docs/expression_x_y.mdx | 2 +- api_docs/expressions.mdx | 2 +- api_docs/features.mdx | 2 +- api_docs/field_formats.mdx | 2 +- api_docs/file_upload.mdx | 2 +- api_docs/files.mdx | 2 +- api_docs/files_management.mdx | 2 +- api_docs/fleet.devdocs.json | 15 + api_docs/fleet.mdx | 4 +- api_docs/global_search.mdx | 2 +- api_docs/guided_onboarding.mdx | 2 +- api_docs/home.mdx | 2 +- api_docs/image_embeddable.mdx | 2 +- api_docs/index_lifecycle_management.mdx | 2 +- api_docs/index_management.mdx | 2 +- api_docs/infra.mdx | 2 +- api_docs/inspector.mdx | 2 +- api_docs/interactive_setup.mdx | 2 +- api_docs/kbn_ace.mdx | 2 +- api_docs/kbn_aiops_components.mdx | 2 +- api_docs/kbn_aiops_utils.mdx | 2 +- api_docs/kbn_alerting_state_types.mdx | 2 +- api_docs/kbn_alerts_as_data_utils.mdx | 2 +- api_docs/kbn_alerts_ui_shared.mdx | 2 +- api_docs/kbn_analytics.mdx | 2 +- api_docs/kbn_analytics_client.mdx | 2 +- ..._analytics_shippers_elastic_v3_browser.mdx | 2 +- ...n_analytics_shippers_elastic_v3_common.mdx | 2 +- ...n_analytics_shippers_elastic_v3_server.mdx | 2 +- api_docs/kbn_analytics_shippers_fullstory.mdx | 2 +- api_docs/kbn_analytics_shippers_gainsight.mdx | 2 +- api_docs/kbn_apm_config_loader.mdx | 2 +- api_docs/kbn_apm_synthtrace.mdx | 2 +- api_docs/kbn_apm_synthtrace_client.mdx | 2 +- api_docs/kbn_apm_utils.mdx | 2 +- api_docs/kbn_axe_config.mdx | 2 +- api_docs/kbn_cases_components.mdx | 2 +- api_docs/kbn_cell_actions.mdx | 2 +- api_docs/kbn_chart_expressions_common.mdx | 2 +- api_docs/kbn_chart_icons.mdx | 2 +- api_docs/kbn_ci_stats_core.mdx | 2 +- api_docs/kbn_ci_stats_performance_metrics.mdx | 2 +- api_docs/kbn_ci_stats_reporter.mdx | 2 +- api_docs/kbn_cli_dev_mode.mdx | 2 +- api_docs/kbn_code_editor.mdx | 2 +- api_docs/kbn_code_editor_mocks.mdx | 2 +- api_docs/kbn_coloring.mdx | 2 +- api_docs/kbn_config.mdx | 2 +- api_docs/kbn_config_mocks.mdx | 2 +- api_docs/kbn_config_schema.mdx | 2 +- .../kbn_content_management_content_editor.mdx | 2 +- .../kbn_content_management_table_list.mdx | 2 +- api_docs/kbn_content_management_utils.mdx | 2 +- api_docs/kbn_core_analytics_browser.mdx | 2 +- .../kbn_core_analytics_browser_internal.mdx | 2 +- api_docs/kbn_core_analytics_browser_mocks.mdx | 2 +- api_docs/kbn_core_analytics_server.mdx | 2 +- .../kbn_core_analytics_server_internal.mdx | 2 +- api_docs/kbn_core_analytics_server_mocks.mdx | 2 +- api_docs/kbn_core_application_browser.mdx | 2 +- .../kbn_core_application_browser_internal.mdx | 2 +- .../kbn_core_application_browser_mocks.mdx | 2 +- api_docs/kbn_core_application_common.mdx | 2 +- api_docs/kbn_core_apps_browser_internal.mdx | 2 +- api_docs/kbn_core_apps_browser_mocks.mdx | 2 +- api_docs/kbn_core_apps_server_internal.mdx | 2 +- api_docs/kbn_core_base_browser_mocks.mdx | 2 +- api_docs/kbn_core_base_common.mdx | 2 +- api_docs/kbn_core_base_server_internal.mdx | 2 +- api_docs/kbn_core_base_server_mocks.mdx | 2 +- .../kbn_core_capabilities_browser_mocks.mdx | 2 +- api_docs/kbn_core_capabilities_common.mdx | 2 +- api_docs/kbn_core_capabilities_server.mdx | 2 +- .../kbn_core_capabilities_server_mocks.mdx | 2 +- api_docs/kbn_core_chrome_browser.mdx | 2 +- api_docs/kbn_core_chrome_browser_mocks.mdx | 2 +- api_docs/kbn_core_config_server_internal.mdx | 2 +- api_docs/kbn_core_custom_branding_browser.mdx | 2 +- ..._core_custom_branding_browser_internal.mdx | 2 +- ...kbn_core_custom_branding_browser_mocks.mdx | 2 +- api_docs/kbn_core_custom_branding_common.mdx | 2 +- api_docs/kbn_core_custom_branding_server.mdx | 2 +- ...n_core_custom_branding_server_internal.mdx | 2 +- .../kbn_core_custom_branding_server_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_browser.mdx | 2 +- ...kbn_core_deprecations_browser_internal.mdx | 2 +- .../kbn_core_deprecations_browser_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_common.mdx | 2 +- api_docs/kbn_core_deprecations_server.mdx | 2 +- .../kbn_core_deprecations_server_internal.mdx | 2 +- .../kbn_core_deprecations_server_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_browser.mdx | 2 +- api_docs/kbn_core_doc_links_browser_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_server.mdx | 2 +- api_docs/kbn_core_doc_links_server_mocks.mdx | 2 +- ...e_elasticsearch_client_server_internal.mdx | 2 +- ...core_elasticsearch_client_server_mocks.mdx | 2 +- api_docs/kbn_core_elasticsearch_server.mdx | 2 +- ...kbn_core_elasticsearch_server_internal.mdx | 2 +- .../kbn_core_elasticsearch_server_mocks.mdx | 2 +- .../kbn_core_environment_server_internal.mdx | 2 +- .../kbn_core_environment_server_mocks.mdx | 2 +- .../kbn_core_execution_context_browser.mdx | 2 +- ...ore_execution_context_browser_internal.mdx | 2 +- ...n_core_execution_context_browser_mocks.mdx | 2 +- .../kbn_core_execution_context_common.mdx | 2 +- .../kbn_core_execution_context_server.mdx | 2 +- ...core_execution_context_server_internal.mdx | 2 +- ...bn_core_execution_context_server_mocks.mdx | 2 +- api_docs/kbn_core_fatal_errors_browser.mdx | 2 +- .../kbn_core_fatal_errors_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_browser.mdx | 2 +- api_docs/kbn_core_http_browser_internal.mdx | 2 +- api_docs/kbn_core_http_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_common.mdx | 2 +- .../kbn_core_http_context_server_mocks.mdx | 2 +- ...re_http_request_handler_context_server.mdx | 2 +- api_docs/kbn_core_http_resources_server.mdx | 2 +- ...bn_core_http_resources_server_internal.mdx | 2 +- .../kbn_core_http_resources_server_mocks.mdx | 2 +- .../kbn_core_http_router_server_internal.mdx | 2 +- .../kbn_core_http_router_server_mocks.mdx | 2 +- api_docs/kbn_core_http_server.devdocs.json | 59 + api_docs/kbn_core_http_server.mdx | 4 +- ...kbn_core_http_server_internal.devdocs.json | 22 +- api_docs/kbn_core_http_server_internal.mdx | 4 +- api_docs/kbn_core_http_server_mocks.mdx | 2 +- api_docs/kbn_core_i18n_browser.mdx | 2 +- api_docs/kbn_core_i18n_browser_mocks.mdx | 2 +- api_docs/kbn_core_i18n_server.mdx | 2 +- api_docs/kbn_core_i18n_server_internal.mdx | 2 +- api_docs/kbn_core_i18n_server_mocks.mdx | 2 +- ...n_core_injected_metadata_browser_mocks.mdx | 2 +- ...kbn_core_integrations_browser_internal.mdx | 2 +- .../kbn_core_integrations_browser_mocks.mdx | 2 +- api_docs/kbn_core_lifecycle_browser.mdx | 2 +- api_docs/kbn_core_lifecycle_browser_mocks.mdx | 2 +- api_docs/kbn_core_lifecycle_server.mdx | 2 +- api_docs/kbn_core_lifecycle_server_mocks.mdx | 2 +- api_docs/kbn_core_logging_browser_mocks.mdx | 2 +- api_docs/kbn_core_logging_common_internal.mdx | 2 +- api_docs/kbn_core_logging_server.mdx | 2 +- api_docs/kbn_core_logging_server_internal.mdx | 2 +- api_docs/kbn_core_logging_server_mocks.mdx | 2 +- ...ore_metrics_collectors_server_internal.mdx | 2 +- ...n_core_metrics_collectors_server_mocks.mdx | 2 +- api_docs/kbn_core_metrics_server.mdx | 2 +- api_docs/kbn_core_metrics_server_internal.mdx | 2 +- api_docs/kbn_core_metrics_server_mocks.mdx | 2 +- api_docs/kbn_core_mount_utils_browser.mdx | 2 +- api_docs/kbn_core_node_server.mdx | 2 +- api_docs/kbn_core_node_server_internal.mdx | 2 +- api_docs/kbn_core_node_server_mocks.mdx | 2 +- api_docs/kbn_core_notifications_browser.mdx | 2 +- ...bn_core_notifications_browser_internal.mdx | 2 +- .../kbn_core_notifications_browser_mocks.mdx | 2 +- api_docs/kbn_core_overlays_browser.mdx | 2 +- .../kbn_core_overlays_browser_internal.mdx | 2 +- api_docs/kbn_core_overlays_browser_mocks.mdx | 2 +- api_docs/kbn_core_plugins_browser.mdx | 2 +- api_docs/kbn_core_plugins_browser_mocks.mdx | 2 +- api_docs/kbn_core_plugins_server.mdx | 2 +- api_docs/kbn_core_plugins_server_mocks.mdx | 2 +- api_docs/kbn_core_preboot_server.mdx | 2 +- api_docs/kbn_core_preboot_server_mocks.mdx | 2 +- api_docs/kbn_core_rendering_browser_mocks.mdx | 2 +- .../kbn_core_rendering_server_internal.mdx | 2 +- api_docs/kbn_core_rendering_server_mocks.mdx | 2 +- api_docs/kbn_core_root_server_internal.mdx | 2 +- .../kbn_core_saved_objects_api_browser.mdx | 2 +- .../kbn_core_saved_objects_api_server.mdx | 2 +- ...bn_core_saved_objects_api_server_mocks.mdx | 2 +- ...ore_saved_objects_base_server_internal.mdx | 2 +- ...n_core_saved_objects_base_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_browser.mdx | 2 +- ...bn_core_saved_objects_browser_internal.mdx | 2 +- .../kbn_core_saved_objects_browser_mocks.mdx | 2 +- ...kbn_core_saved_objects_common.devdocs.json | 8 - api_docs/kbn_core_saved_objects_common.mdx | 2 +- ..._objects_import_export_server_internal.mdx | 2 +- ...ved_objects_import_export_server_mocks.mdx | 2 +- ...aved_objects_migration_server_internal.mdx | 2 +- ...e_saved_objects_migration_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_server.mdx | 2 +- ...kbn_core_saved_objects_server_internal.mdx | 2 +- .../kbn_core_saved_objects_server_mocks.mdx | 2 +- .../kbn_core_saved_objects_utils_server.mdx | 2 +- api_docs/kbn_core_status_common.mdx | 2 +- api_docs/kbn_core_status_common_internal.mdx | 2 +- api_docs/kbn_core_status_server.mdx | 2 +- api_docs/kbn_core_status_server_internal.mdx | 2 +- api_docs/kbn_core_status_server_mocks.mdx | 2 +- ...core_test_helpers_deprecations_getters.mdx | 2 +- ...n_core_test_helpers_http_setup_browser.mdx | 2 +- api_docs/kbn_core_test_helpers_kbn_server.mdx | 2 +- ...n_core_test_helpers_so_type_serializer.mdx | 2 +- api_docs/kbn_core_test_helpers_test_utils.mdx | 2 +- api_docs/kbn_core_theme_browser.mdx | 2 +- api_docs/kbn_core_theme_browser_internal.mdx | 2 +- api_docs/kbn_core_theme_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_browser.mdx | 2 +- .../kbn_core_ui_settings_browser_internal.mdx | 2 +- .../kbn_core_ui_settings_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_common.mdx | 2 +- api_docs/kbn_core_ui_settings_server.mdx | 2 +- .../kbn_core_ui_settings_server_internal.mdx | 2 +- .../kbn_core_ui_settings_server_mocks.mdx | 2 +- api_docs/kbn_core_usage_data_server.mdx | 2 +- .../kbn_core_usage_data_server_internal.mdx | 2 +- api_docs/kbn_core_usage_data_server_mocks.mdx | 2 +- api_docs/kbn_core_user_settings_server.mdx | 2 +- ...kbn_core_user_settings_server_internal.mdx | 2 +- .../kbn_core_user_settings_server_mocks.mdx | 2 +- api_docs/kbn_crypto.mdx | 2 +- api_docs/kbn_crypto_browser.mdx | 2 +- api_docs/kbn_cypress_config.mdx | 2 +- api_docs/kbn_datemath.mdx | 2 +- api_docs/kbn_dev_cli_errors.mdx | 2 +- api_docs/kbn_dev_cli_runner.mdx | 2 +- api_docs/kbn_dev_proc_runner.mdx | 2 +- api_docs/kbn_dev_utils.mdx | 2 +- api_docs/kbn_doc_links.mdx | 2 +- api_docs/kbn_docs_utils.mdx | 2 +- api_docs/kbn_dom_drag_drop.mdx | 2 +- api_docs/kbn_ebt_tools.mdx | 2 +- api_docs/kbn_ecs.mdx | 2 +- api_docs/kbn_ecs_data_quality_dashboard.mdx | 2 +- api_docs/kbn_es.mdx | 2 +- api_docs/kbn_es_archiver.mdx | 2 +- api_docs/kbn_es_errors.mdx | 2 +- api_docs/kbn_es_query.mdx | 2 +- api_docs/kbn_es_types.mdx | 2 +- api_docs/kbn_eslint_plugin_imports.mdx | 2 +- api_docs/kbn_expandable_flyout.mdx | 2 +- api_docs/kbn_field_types.mdx | 2 +- api_docs/kbn_find_used_node_modules.mdx | 2 +- .../kbn_ftr_common_functional_services.mdx | 2 +- api_docs/kbn_generate.mdx | 2 +- api_docs/kbn_generate_csv.mdx | 2 +- api_docs/kbn_generate_csv_types.mdx | 2 +- api_docs/kbn_guided_onboarding.mdx | 2 +- api_docs/kbn_handlebars.mdx | 2 +- api_docs/kbn_hapi_mocks.mdx | 2 +- api_docs/kbn_health_gateway_server.mdx | 2 +- api_docs/kbn_home_sample_data_card.mdx | 2 +- api_docs/kbn_home_sample_data_tab.mdx | 2 +- api_docs/kbn_i18n.mdx | 2 +- api_docs/kbn_i18n_react.mdx | 2 +- api_docs/kbn_import_resolver.mdx | 2 +- api_docs/kbn_infra_forge.mdx | 2 +- api_docs/kbn_interpreter.mdx | 2 +- api_docs/kbn_io_ts_utils.mdx | 2 +- api_docs/kbn_jest_serializers.mdx | 2 +- api_docs/kbn_journeys.mdx | 2 +- api_docs/kbn_json_ast.mdx | 2 +- api_docs/kbn_kibana_manifest_schema.mdx | 2 +- .../kbn_language_documentation_popover.mdx | 2 +- api_docs/kbn_logging.mdx | 2 +- api_docs/kbn_logging_mocks.mdx | 2 +- api_docs/kbn_managed_vscode_config.mdx | 2 +- api_docs/kbn_mapbox_gl.mdx | 2 +- api_docs/kbn_maps_vector_tile_utils.mdx | 2 +- api_docs/kbn_ml_agg_utils.mdx | 2 +- api_docs/kbn_ml_anomaly_utils.mdx | 2 +- api_docs/kbn_ml_date_picker.mdx | 2 +- api_docs/kbn_ml_error_utils.mdx | 2 +- api_docs/kbn_ml_is_defined.mdx | 2 +- api_docs/kbn_ml_is_populated_object.mdx | 2 +- api_docs/kbn_ml_local_storage.mdx | 2 +- api_docs/kbn_ml_nested_property.mdx | 2 +- api_docs/kbn_ml_number_utils.mdx | 2 +- api_docs/kbn_ml_query_utils.mdx | 2 +- api_docs/kbn_ml_random_sampler_utils.mdx | 2 +- api_docs/kbn_ml_route_utils.mdx | 2 +- api_docs/kbn_ml_string_hash.mdx | 2 +- api_docs/kbn_ml_trained_models_utils.mdx | 2 +- api_docs/kbn_ml_url_state.mdx | 2 +- api_docs/kbn_monaco.mdx | 2 +- api_docs/kbn_object_versioning.mdx | 2 +- api_docs/kbn_observability_alert_details.mdx | 2 +- api_docs/kbn_optimizer.mdx | 2 +- api_docs/kbn_optimizer_webpack_helpers.mdx | 2 +- api_docs/kbn_osquery_io_ts_types.mdx | 2 +- ..._performance_testing_dataset_extractor.mdx | 2 +- api_docs/kbn_plugin_generator.mdx | 2 +- api_docs/kbn_plugin_helpers.mdx | 2 +- api_docs/kbn_random_sampling.mdx | 2 +- api_docs/kbn_react_field.mdx | 2 +- api_docs/kbn_repo_file_maps.mdx | 2 +- api_docs/kbn_repo_linter.mdx | 2 +- api_docs/kbn_repo_path.mdx | 2 +- api_docs/kbn_repo_source_classifier.mdx | 2 +- api_docs/kbn_reporting_common.mdx | 2 +- api_docs/kbn_rison.mdx | 2 +- api_docs/kbn_rule_data_utils.mdx | 2 +- api_docs/kbn_saved_objects_settings.mdx | 2 +- api_docs/kbn_security_solution_side_nav.mdx | 2 +- ...kbn_security_solution_storybook_config.mdx | 2 +- .../kbn_securitysolution_autocomplete.mdx | 2 +- api_docs/kbn_securitysolution_data_table.mdx | 2 +- api_docs/kbn_securitysolution_ecs.mdx | 2 +- api_docs/kbn_securitysolution_es_utils.mdx | 2 +- ...ritysolution_exception_list_components.mdx | 2 +- api_docs/kbn_securitysolution_grouping.mdx | 2 +- api_docs/kbn_securitysolution_hook_utils.mdx | 2 +- ..._securitysolution_io_ts_alerting_types.mdx | 2 +- .../kbn_securitysolution_io_ts_list_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_utils.mdx | 2 +- api_docs/kbn_securitysolution_list_api.mdx | 2 +- .../kbn_securitysolution_list_constants.mdx | 2 +- api_docs/kbn_securitysolution_list_hooks.mdx | 2 +- api_docs/kbn_securitysolution_list_utils.mdx | 2 +- api_docs/kbn_securitysolution_rules.mdx | 2 +- api_docs/kbn_securitysolution_t_grid.mdx | 2 +- api_docs/kbn_securitysolution_utils.mdx | 2 +- api_docs/kbn_server_http_tools.mdx | 2 +- api_docs/kbn_server_route_repository.mdx | 2 +- api_docs/kbn_serverless_project_switcher.mdx | 2 +- api_docs/kbn_serverless_storybook_config.mdx | 2 +- api_docs/kbn_shared_svg.mdx | 2 +- api_docs/kbn_shared_ux_avatar_solution.mdx | 2 +- ...ared_ux_avatar_user_profile_components.mdx | 2 +- .../kbn_shared_ux_button_exit_full_screen.mdx | 2 +- ...hared_ux_button_exit_full_screen_mocks.mdx | 2 +- api_docs/kbn_shared_ux_button_toolbar.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_chrome_navigation.mdx | 2 +- api_docs/kbn_shared_ux_file_context.mdx | 2 +- api_docs/kbn_shared_ux_file_image.mdx | 2 +- api_docs/kbn_shared_ux_file_image_mocks.mdx | 2 +- api_docs/kbn_shared_ux_file_mocks.mdx | 2 +- api_docs/kbn_shared_ux_file_picker.mdx | 2 +- api_docs/kbn_shared_ux_file_types.mdx | 2 +- api_docs/kbn_shared_ux_file_upload.mdx | 2 +- api_docs/kbn_shared_ux_file_util.mdx | 2 +- api_docs/kbn_shared_ux_link_redirect_app.mdx | 2 +- .../kbn_shared_ux_link_redirect_app_mocks.mdx | 2 +- api_docs/kbn_shared_ux_markdown.mdx | 2 +- api_docs/kbn_shared_ux_markdown_mocks.mdx | 2 +- .../kbn_shared_ux_page_analytics_no_data.mdx | 2 +- ...shared_ux_page_analytics_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_page_kibana_no_data.mdx | 2 +- ...bn_shared_ux_page_kibana_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_page_kibana_template.mdx | 2 +- ...n_shared_ux_page_kibana_template_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data.mdx | 2 +- .../kbn_shared_ux_page_no_data_config.mdx | 2 +- ...bn_shared_ux_page_no_data_config_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_solution_nav.mdx | 2 +- .../kbn_shared_ux_prompt_no_data_views.mdx | 2 +- ...n_shared_ux_prompt_no_data_views_mocks.mdx | 2 +- api_docs/kbn_shared_ux_prompt_not_found.mdx | 2 +- api_docs/kbn_shared_ux_router.mdx | 2 +- api_docs/kbn_shared_ux_router_mocks.mdx | 2 +- api_docs/kbn_shared_ux_storybook_config.mdx | 2 +- api_docs/kbn_shared_ux_storybook_mock.mdx | 2 +- api_docs/kbn_shared_ux_utility.mdx | 2 +- api_docs/kbn_slo_schema.mdx | 2 +- api_docs/kbn_some_dev_log.mdx | 2 +- api_docs/kbn_std.mdx | 2 +- api_docs/kbn_stdio_dev_helpers.mdx | 2 +- api_docs/kbn_storybook.mdx | 2 +- api_docs/kbn_telemetry_tools.mdx | 2 +- api_docs/kbn_test.mdx | 2 +- api_docs/kbn_test_jest_helpers.mdx | 2 +- api_docs/kbn_test_subj_selector.mdx | 2 +- api_docs/kbn_tooling_log.mdx | 2 +- api_docs/kbn_ts_projects.mdx | 2 +- api_docs/kbn_typed_react_router_config.mdx | 2 +- api_docs/kbn_ui_actions_browser.mdx | 2 +- api_docs/kbn_ui_shared_deps_src.mdx | 2 +- api_docs/kbn_ui_theme.mdx | 2 +- api_docs/kbn_url_state.mdx | 2 +- api_docs/kbn_user_profile_components.mdx | 2 +- api_docs/kbn_utility_types.mdx | 2 +- api_docs/kbn_utility_types_jest.mdx | 2 +- api_docs/kbn_utils.mdx | 2 +- api_docs/kbn_yarn_lock_validator.mdx | 2 +- api_docs/kibana_overview.mdx | 2 +- api_docs/kibana_react.mdx | 2 +- api_docs/kibana_utils.mdx | 2 +- api_docs/kubernetes_security.mdx | 2 +- api_docs/lens.mdx | 2 +- api_docs/license_api_guard.mdx | 2 +- api_docs/license_management.mdx | 2 +- api_docs/licensing.mdx | 2 +- api_docs/lists.mdx | 2 +- api_docs/management.mdx | 2 +- api_docs/maps.mdx | 2 +- api_docs/maps_ems.mdx | 2 +- api_docs/ml.mdx | 2 +- api_docs/monitoring.mdx | 2 +- api_docs/monitoring_collection.mdx | 2 +- api_docs/navigation.mdx | 2 +- api_docs/newsfeed.mdx | 2 +- api_docs/notifications.mdx | 2 +- api_docs/observability.devdocs.json | 1412 +---------------- api_docs/observability.mdx | 7 +- api_docs/observability_onboarding.mdx | 2 +- api_docs/observability_shared.mdx | 4 +- api_docs/osquery.mdx | 2 +- api_docs/plugin_directory.mdx | 16 +- api_docs/presentation_util.mdx | 2 +- api_docs/profiling.mdx | 2 +- api_docs/remote_clusters.mdx | 2 +- api_docs/reporting.mdx | 2 +- api_docs/rollup.mdx | 2 +- api_docs/rule_registry.mdx | 2 +- api_docs/runtime_fields.mdx | 2 +- api_docs/saved_objects.mdx | 2 +- api_docs/saved_objects_finder.mdx | 2 +- api_docs/saved_objects_management.mdx | 2 +- api_docs/saved_objects_tagging.mdx | 2 +- api_docs/saved_objects_tagging_oss.mdx | 2 +- api_docs/saved_search.mdx | 2 +- api_docs/screenshot_mode.mdx | 2 +- api_docs/screenshotting.mdx | 2 +- api_docs/security.mdx | 2 +- api_docs/security_solution.mdx | 2 +- api_docs/serverless.mdx | 2 +- api_docs/serverless_observability.mdx | 2 +- api_docs/serverless_search.mdx | 2 +- api_docs/serverless_security.mdx | 2 +- api_docs/session_view.mdx | 2 +- api_docs/share.mdx | 2 +- api_docs/snapshot_restore.mdx | 2 +- api_docs/spaces.mdx | 2 +- api_docs/stack_alerts.mdx | 2 +- api_docs/stack_connectors.mdx | 2 +- api_docs/task_manager.mdx | 2 +- api_docs/telemetry.mdx | 2 +- api_docs/telemetry_collection_manager.mdx | 2 +- api_docs/telemetry_collection_xpack.mdx | 2 +- api_docs/telemetry_management_section.mdx | 2 +- api_docs/threat_intelligence.mdx | 2 +- api_docs/timelines.mdx | 2 +- api_docs/transform.mdx | 2 +- api_docs/triggers_actions_ui.mdx | 2 +- api_docs/ui_actions.mdx | 2 +- api_docs/ui_actions_enhanced.mdx | 2 +- api_docs/unified_field_list.mdx | 2 +- api_docs/unified_histogram.mdx | 2 +- api_docs/unified_search.mdx | 2 +- api_docs/unified_search_autocomplete.mdx | 2 +- api_docs/url_forwarding.mdx | 2 +- api_docs/usage_collection.mdx | 2 +- api_docs/ux.mdx | 2 +- api_docs/vis_default_editor.mdx | 2 +- api_docs/vis_type_gauge.mdx | 2 +- api_docs/vis_type_heatmap.mdx | 2 +- api_docs/vis_type_pie.mdx | 2 +- api_docs/vis_type_table.mdx | 2 +- api_docs/vis_type_timelion.mdx | 2 +- api_docs/vis_type_timeseries.mdx | 2 +- api_docs/vis_type_vega.mdx | 2 +- api_docs/vis_type_vislib.mdx | 2 +- api_docs/vis_type_xy.mdx | 2 +- api_docs/visualization_ui_components.mdx | 2 +- api_docs/visualizations.mdx | 2 +- 520 files changed, 707 insertions(+), 1868 deletions(-) diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 3e60af7b58cff..bfa9013b75f5f 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-05-18 +date: 2023-05-19 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 6cc92b7576f03..18081aeb5c682 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-05-18 +date: 2023-05-19 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 32f772b6d121c..ad526f81cc462 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-05-18 +date: 2023-05-19 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 43c50f649ae26..ff131bb16f97c 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-05-18 +date: 2023-05-19 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 f95e36e640515..f56abdcb6f04a 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-05-18 +date: 2023-05-19 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 fabe37bd4ffe7..1663b9541003f 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-05-18 +date: 2023-05-19 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 6af46b50face7..d61eba33fa8c4 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-05-18 +date: 2023-05-19 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 a45b617ef768f..3027ac2ccfae5 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-05-18 +date: 2023-05-19 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 dcd42297a5ce8..d624f83538c28 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-05-18 +date: 2023-05-19 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 32669643f1a59..2c90547a95119 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-05-18 +date: 2023-05-19 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 754940a029fc8..4a04e2c04edf8 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-05-18 +date: 2023-05-19 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 48483571b97cf..c920eaf28491c 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-05-18 +date: 2023-05-19 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 53758e2518ce8..fe080e8194700 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-05-18 +date: 2023-05-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudChat'] --- import cloudChatObj from './cloud_chat.devdocs.json'; diff --git a/api_docs/cloud_data_migration.mdx b/api_docs/cloud_data_migration.mdx index 4bf0313976667..b32d7066869cf 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-05-18 +date: 2023-05-19 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 20d8bf4e40e9e..3293ed07feb8c 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-05-18 +date: 2023-05-19 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 4f166b5268fb8..a17b19adc8dc8 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-05-18 +date: 2023-05-19 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 ce4f5f76e5bcd..875e915dc5114 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-05-18 +date: 2023-05-19 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 a9270ea8c0474..2f557a5b93cd7 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-05-18 +date: 2023-05-19 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 538d97993c437..225fd7cdf9f8d 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-05-18 +date: 2023-05-19 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 ccdb4450fafd8..607518eb9efbc 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-05-18 +date: 2023-05-19 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 5427322dec303..8cc6c66b358ac 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-05-18 +date: 2023-05-19 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 ee846b24e4b36..ba4c616577f73 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-05-18 +date: 2023-05-19 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 5239ec70fae43..7bff72da261a0 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-05-18 +date: 2023-05-19 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 03ce4de03548f..178acb93af36d 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-05-18 +date: 2023-05-19 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 f47af158f55e4..9af16bc59554c 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-05-18 +date: 2023-05-19 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 a81e632be4fcc..e6090bd874d04 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-05-18 +date: 2023-05-19 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 70c46a419af51..9c65bde485cdc 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-05-18 +date: 2023-05-19 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 2e0a3a6570ff0..c5ece2a2f6cd5 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-05-18 +date: 2023-05-19 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 53c748299bb68..c44aeb6c20f95 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-05-18 +date: 2023-05-19 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 18b1a767672ea..94b966843b67a 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-05-18 +date: 2023-05-19 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 0dd8c11e3693b..da91de0abe595 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-05-18 +date: 2023-05-19 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 1f679cb6206ca..b5d8f90d840f7 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-05-18 +date: 2023-05-19 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 359035c5cf8c2..e39ff43cc9a55 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-05-18 +date: 2023-05-19 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -720,7 +720,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [assets.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/assets/assets.tsx#:~:text=ResolvedSimpleSavedObject), [assets.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/public/applications/integrations/sections/epm/screens/detail/assets/assets.tsx#:~:text=ResolvedSimpleSavedObject) | - | | | [install.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/epm/kibana/assets/install.ts#:~:text=migrationVersion) | - | | | [install.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/epm/kibana/assets/install.ts#:~:text=migrationVersion), [get.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/epm/packages/get.test.ts#:~:text=migrationVersion), [get.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/epm/packages/get.test.ts#:~:text=migrationVersion), [get.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/epm/packages/get.test.ts#:~:text=migrationVersion), [get.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/epm/packages/get.test.ts#:~:text=migrationVersion), [install.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/epm/kibana/assets/install.ts#:~:text=migrationVersion), [get.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/epm/packages/get.test.ts#:~:text=migrationVersion), [get.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/epm/packages/get.test.ts#:~:text=migrationVersion), [get.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/epm/packages/get.test.ts#:~:text=migrationVersion), [get.test.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/server/services/epm/packages/get.test.ts#:~:text=migrationVersion) | - | -| | [epm.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/common/types/models/epm.ts#:~:text=SavedObjectAttributes), [epm.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/common/types/models/epm.ts#:~:text=SavedObjectAttributes), [settings.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/common/types/models/settings.ts#:~:text=SavedObjectAttributes), [settings.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/common/types/models/settings.ts#:~:text=SavedObjectAttributes) | - | +| | [epm.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/common/types/models/epm.ts#:~:text=SavedObjectAttributes), [epm.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/common/types/models/epm.ts#:~:text=SavedObjectAttributes) | - | | | [epm.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/common/types/models/epm.ts#:~:text=SavedObjectReference), [epm.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/common/types/models/epm.ts#:~:text=SavedObjectReference), [epm.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/common/types/models/epm.ts#:~:text=SavedObjectReference), [epm.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/fleet/common/types/models/epm.ts#:~:text=SavedObjectReference) | - | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index c5e8d9f879b69..d598bafc0182d 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-05-18 +date: 2023-05-19 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 6d91788da7de4..cc4e7cbd93bbd 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-05-18 +date: 2023-05-19 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 d8945c7cc34ac..f6b271918a1af 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-05-18 +date: 2023-05-19 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 b77f99e0dce41..088d6949d4548 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-05-18 +date: 2023-05-19 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 54143535b331d..e469fe017e128 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-05-18 +date: 2023-05-19 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 85d387ca9e80f..484a9ca054662 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-05-18 +date: 2023-05-19 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 c461f87457412..0ed234add038c 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-05-18 +date: 2023-05-19 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 d05d264f2f26c..0a6fce0ebd2f9 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-05-18 +date: 2023-05-19 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 7a0233b5982eb..4056251c4aab2 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-05-18 +date: 2023-05-19 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 34d4e94eddef8..0951d811c729f 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-05-18 +date: 2023-05-19 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 b30da0cc90881..7bfd05a3a99c7 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-05-18 +date: 2023-05-19 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 3d1d9a2c7e797..4ff9627531a91 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-05-18 +date: 2023-05-19 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 05e9c47ddec44..b872eb864b271 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-05-18 +date: 2023-05-19 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 9473f5c8417d1..79c7e650b42e9 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-05-18 +date: 2023-05-19 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 8aa0dede07b9c..1f0dcc4969337 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-05-18 +date: 2023-05-19 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 14f05615a25e2..133c4f99b46bd 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-05-18 +date: 2023-05-19 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 ee12fde2ac04b..b5c4324ebd1b7 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-05-18 +date: 2023-05-19 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 28eccdca901da..9842de297731f 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-05-18 +date: 2023-05-19 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 3d22297ebe5ba..6713136c91a8a 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-05-18 +date: 2023-05-19 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 05fbc751c4f73..27d55af4f95b6 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-05-18 +date: 2023-05-19 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 de67910f953c8..49f8c3f573695 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-05-18 +date: 2023-05-19 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 89a86c6af703e..480b2f3c7e9a6 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-05-18 +date: 2023-05-19 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 0527060797610..4224880282f82 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-05-18 +date: 2023-05-19 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 aac117fbf83da..860f8e1de0e37 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-05-18 +date: 2023-05-19 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 ac0166d379fdc..d76507e5281d5 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-05-18 +date: 2023-05-19 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 659838ddc7c2b..efd2140e81230 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-05-18 +date: 2023-05-19 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 5a076ccafdcde..ed0aad20afd3f 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-05-18 +date: 2023-05-19 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 27959bbbd9993..2e9aaae75a177 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-05-18 +date: 2023-05-19 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 ecd49c8a72a78..45074567a8d1e 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-05-18 +date: 2023-05-19 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 83a2b97768fb3..25539a53c834b 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-05-18 +date: 2023-05-19 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 6bee99355c42a..26109306fca7e 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-05-18 +date: 2023-05-19 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 c912824e184a5..db3d314b72193 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-05-18 +date: 2023-05-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.devdocs.json b/api_docs/fleet.devdocs.json index 0a8fc41e775b7..c3b98b1f6450c 100644 --- a/api_docs/fleet.devdocs.json +++ b/api_docs/fleet.devdocs.json @@ -22935,6 +22935,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "fleet", + "id": "def-common.FLEET_CLOUD_DEFEND_PACKAGE", + "type": "string", + "tags": [], + "label": "FLEET_CLOUD_DEFEND_PACKAGE", + "description": [], + "signature": [ + "\"cloud_defend\"" + ], + "path": "x-pack/plugins/fleet/common/constants/epm.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "fleet", "id": "def-common.FLEET_CLOUD_SECURITY_POSTURE_CNVM_POLICY_TEMPLATE", diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index e4a58dad79fce..5c4186d5a1b62 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-05-18 +date: 2023-05-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] --- import fleetObj from './fleet.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) for questi | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 1121 | 3 | 1016 | 31 | +| 1122 | 3 | 1017 | 31 | ## Client diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index 394ad10bcf599..9cce49ad90b02 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-05-18 +date: 2023-05-19 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 842da8c236c9f..e4461e49c156f 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-05-18 +date: 2023-05-19 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 eeac16f32cfda..ce491a01862a4 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-05-18 +date: 2023-05-19 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 25b9f0efca4ad..e5d11e0c4a88c 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-05-18 +date: 2023-05-19 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 c530e6ac5db6e..e60b52a67e1a0 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-05-18 +date: 2023-05-19 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 89b01419fd28a..3236b48b39ae3 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-05-18 +date: 2023-05-19 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 a7b30f4f94173..200d7d53b963d 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-05-18 +date: 2023-05-19 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 074c523284a8b..d6d4482e78894 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-05-18 +date: 2023-05-19 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 ef1461f6e6042..5d64a3a11c3e7 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-05-18 +date: 2023-05-19 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 023b876f26f9f..8e5c85681c046 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-05-18 +date: 2023-05-19 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 34d571f5c683e..b42f91e57d90f 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-05-18 +date: 2023-05-19 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 f2b63c78bf3c2..f2058ec2a683c 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-05-18 +date: 2023-05-19 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 61776648c317f..c4000a182d571 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-05-18 +date: 2023-05-19 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 e9a300d012135..36c405be8efa4 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-05-18 +date: 2023-05-19 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 285b2e1309339..fc3132a6e5ddc 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-05-18 +date: 2023-05-19 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 4a3344a24af8a..17e20c741995d 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-05-18 +date: 2023-05-19 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 0395a1284cf05..73bd796a1b309 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-05-18 +date: 2023-05-19 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 827bceefb95f6..f0cf9d84e4f3b 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-05-18 +date: 2023-05-19 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 a626eaa5b2421..259619a8a9e83 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-05-18 +date: 2023-05-19 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 cb991780a9bbb..aa5d61b966824 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-05-18 +date: 2023-05-19 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 6bd6752fb0e29..5c22a892fba23 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-05-18 +date: 2023-05-19 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 0b140ececcced..04f9d9a6c2f60 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-05-18 +date: 2023-05-19 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 b81267c698357..697cb1a252310 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-05-18 +date: 2023-05-19 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 595127447bbc2..f0369b539670a 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-05-18 +date: 2023-05-19 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 94f0cd1bac0e6..4a2f1a931427c 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-05-18 +date: 2023-05-19 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 335e5561adac3..b6b865b28b26f 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-05-18 +date: 2023-05-19 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 2206e57e2aed4..00e0256bedadb 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-05-18 +date: 2023-05-19 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 38159f5268dc1..17e090299db15 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-05-18 +date: 2023-05-19 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 393447e4814e2..49fc2f8ad676f 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-05-18 +date: 2023-05-19 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 045186834ec21..e295a3f410d2b 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-05-18 +date: 2023-05-19 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 1d49604bcec54..c8c175745564d 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-05-18 +date: 2023-05-19 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 4e9beaee303c2..d74c3dece5bef 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-05-18 +date: 2023-05-19 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 74480aced409d..f5d70858dd7bf 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-05-18 +date: 2023-05-19 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 21d269f97d52a..80c9c56c9e9b6 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-05-18 +date: 2023-05-19 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 c10cc1c04a08a..65353906a0793 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-05-18 +date: 2023-05-19 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 952776014650a..0529d257c2497 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-05-18 +date: 2023-05-19 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 e979912a9df49..4a06ad6f9b40f 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-05-18 +date: 2023-05-19 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 fe484d74b3206..e4d23207badc8 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-05-18 +date: 2023-05-19 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 944939010e36a..725f673d8b98f 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-05-18 +date: 2023-05-19 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 3011f4a8352eb..a1f0fd7b351ad 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-05-18 +date: 2023-05-19 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 502d7311342e2..fd424420d2623 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-05-18 +date: 2023-05-19 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 6f405a43f46b1..a4fee6cdcd9ab 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-05-18 +date: 2023-05-19 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_table_list.mdx b/api_docs/kbn_content_management_table_list.mdx index b44e5388b6463..2aafa1a37f6d6 100644 --- a/api_docs/kbn_content_management_table_list.mdx +++ b/api_docs/kbn_content_management_table_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list title: "@kbn/content-management-table-list" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list plugin -date: 2023-05-18 +date: 2023-05-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list'] --- import kbnContentManagementTableListObj from './kbn_content_management_table_list.devdocs.json'; diff --git a/api_docs/kbn_content_management_utils.mdx b/api_docs/kbn_content_management_utils.mdx index 6c63caf243fb6..d064cb30e076b 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-05-18 +date: 2023-05-19 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 9a7e292b7394e..6f93fdf1b1824 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-05-18 +date: 2023-05-19 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 88aa810d3388f..c39910a8800fd 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-05-18 +date: 2023-05-19 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 6de186622bb1d..77a7f70f76fca 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-05-18 +date: 2023-05-19 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 b7b234c58c341..80fe03401076b 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-05-18 +date: 2023-05-19 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 1855a5c30973e..d405279147d94 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-05-18 +date: 2023-05-19 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 c90d3f3ced9e7..b9ff549426784 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-05-18 +date: 2023-05-19 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 dbc419571227a..82eb545f3f446 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-05-18 +date: 2023-05-19 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 8d1fa44ef3c6a..67ef302535f89 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-05-18 +date: 2023-05-19 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 4de611b1af33e..19cdade5c2e56 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-05-18 +date: 2023-05-19 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 f03028872918f..7309ae2311cd9 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-05-18 +date: 2023-05-19 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 6438f13610031..26393cd807ba1 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-05-18 +date: 2023-05-19 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 4b229a57a6643..78c2b52edabda 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-05-18 +date: 2023-05-19 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 35ecae4b739bf..23f64a9c1b4da 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-05-18 +date: 2023-05-19 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 6e422fb91de9f..5afcdfe1b2bfd 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-05-18 +date: 2023-05-19 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 7d70f333d839d..186127e8499bc 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-05-18 +date: 2023-05-19 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 86e81c5a719e2..78833e594876b 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-05-18 +date: 2023-05-19 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 61e6f16b6127f..0fbd1b3894072 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-05-18 +date: 2023-05-19 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 06283a0bbef67..1f682b06eb020 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-05-18 +date: 2023-05-19 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 7f0129187a4dd..939a24e97f11f 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-05-18 +date: 2023-05-19 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 af644b8e52d6f..3fd0cadc02e2f 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-05-18 +date: 2023-05-19 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 1a91b8d322b1b..a8f51114fb337 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-05-18 +date: 2023-05-19 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 2aac2255ab9a4..17cdc30b96197 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-05-18 +date: 2023-05-19 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 e34b72b400da3..5e7fba56c98e3 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-05-18 +date: 2023-05-19 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 655004b1ce293..8c9a7c0a2c7f2 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-05-18 +date: 2023-05-19 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 2d9dcc213534d..90d0b0e208e9b 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-05-18 +date: 2023-05-19 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 9c94cc4451269..95bcfc91378de 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-05-18 +date: 2023-05-19 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 4ada9975aa2c1..83f14d98c1075 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-05-18 +date: 2023-05-19 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 1e9bf010f38fc..d0155b66e7af5 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-05-18 +date: 2023-05-19 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 9792904bf157b..3209cbb347fa2 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-05-18 +date: 2023-05-19 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 ab3db5274b4e6..7500978ae5290 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-05-18 +date: 2023-05-19 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 ce3405889b916..c3d760b1db62e 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-05-18 +date: 2023-05-19 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 d7988fb4cd29d..21e2cd7bebe29 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-05-18 +date: 2023-05-19 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 664d44cedf39e..41dc130884199 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-05-18 +date: 2023-05-19 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 71868055e6aaa..596fc349b8ad4 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-05-18 +date: 2023-05-19 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 d81a56fb3e4bb..222cdc0f1ea6d 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-05-18 +date: 2023-05-19 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 18356638cdb26..e5d2f7d555dec 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-05-18 +date: 2023-05-19 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 6f513c2433be1..ee370f48a0998 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-05-18 +date: 2023-05-19 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 70a94f2795005..a0bf6172a8934 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-05-18 +date: 2023-05-19 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 23bd1b28f269f..73d445d3fe7fa 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-05-18 +date: 2023-05-19 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 cb8fd74dc6f08..c088b25a03b36 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-05-18 +date: 2023-05-19 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 cb1607ce006b8..a082e77eb779a 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-05-18 +date: 2023-05-19 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 7182ec9801f67..707785f6f07f9 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-05-18 +date: 2023-05-19 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 c6ae9f496b705..e04a0e1c30a4c 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-05-18 +date: 2023-05-19 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 0893543593c4d..93e03fa0f147b 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-05-18 +date: 2023-05-19 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 3a54c26a8f4e2..6927dcce21bf6 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-05-18 +date: 2023-05-19 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 05976c31abbec..65910172c3a5d 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-05-18 +date: 2023-05-19 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 1481ec925f611..32df86b751309 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-05-18 +date: 2023-05-19 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 1f79f48492d91..65197106de249 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-05-18 +date: 2023-05-19 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 e780eb7ca482d..6107e19aaab78 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-05-18 +date: 2023-05-19 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 dd61c8fe6bee3..dce573fdfa2a4 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-05-18 +date: 2023-05-19 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 ff0b6f7a9bf82..fc526615e2816 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-05-18 +date: 2023-05-19 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 ce6fb5e96947b..f9cd9610226e2 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-05-18 +date: 2023-05-19 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 f284c4179f0a9..02357f3416fb5 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-05-18 +date: 2023-05-19 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 437d203433a29..963c7265c94b8 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-05-18 +date: 2023-05-19 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 bdc30f3318baf..8b3b7bceb072e 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-05-18 +date: 2023-05-19 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 65b309d23034d..d2d76cbf0e53c 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-05-18 +date: 2023-05-19 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 8a85e855f93f4..766bad062d006 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-05-18 +date: 2023-05-19 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 058b0f1bf4a4d..b71e2c9354432 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-05-18 +date: 2023-05-19 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 2dd56e2078d4c..46371d4bd0cad 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-05-18 +date: 2023-05-19 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 8416821d78387..93d9bc029bc26 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-05-18 +date: 2023-05-19 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 53ce842ae81e8..26dc31281e01a 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-05-18 +date: 2023-05-19 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 bb2134b5d0276..527cf72f142b0 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-05-18 +date: 2023-05-19 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 9e85e4d781894..bf7de1a12ef14 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-05-18 +date: 2023-05-19 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 e8895a4710402..5e6133bd60601 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-05-18 +date: 2023-05-19 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 dbb43f9eb36be..b2bd90f39a0ff 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-05-18 +date: 2023-05-19 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 7b7b963315245..96552bc52eff0 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-05-18 +date: 2023-05-19 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 45741a28acf52..b69343189af0d 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-05-18 +date: 2023-05-19 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 a696a462232f7..73fe7571b0491 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-05-18 +date: 2023-05-19 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 c05f05b3d3fac..64eeb73fb0145 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-05-18 +date: 2023-05-19 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.devdocs.json b/api_docs/kbn_core_http_server.devdocs.json index c2cb299143bbe..c5f8e23d2140a 100644 --- a/api_docs/kbn_core_http_server.devdocs.json +++ b/api_docs/kbn_core_http_server.devdocs.json @@ -2689,6 +2689,49 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-common.IHttpEluMonitorConfig", + "type": "Interface", + "tags": [], + "label": "IHttpEluMonitorConfig", + "description": [ + "\nHTTP request ELU monitor config" + ], + "path": "packages/core/http/core-http-server/src/elu_monitor.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-common.IHttpEluMonitorConfig.enabled", + "type": "boolean", + "tags": [], + "label": "enabled", + "description": [ + "\nWhether the monitoring of event loop utilization for HTTP requests is enabled." + ], + "path": "packages/core/http/core-http-server/src/elu_monitor.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-common.IHttpEluMonitorConfig.logging", + "type": "Object", + "tags": [], + "label": "logging", + "description": [], + "signature": [ + "{ readonly enabled: boolean; readonly threshold: { readonly elu: number; readonly ela: number; }; }" + ], + "path": "packages/core/http/core-http-server/src/elu_monitor.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/core-http-server", "id": "def-common.IKibanaResponse", @@ -5065,6 +5108,22 @@ "path": "packages/core/http/core-http-server/src/router/request.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-http-server", + "id": "def-common.KibanaRequestState.measureElu", + "type": "Function", + "tags": [], + "label": "measureElu", + "description": [], + "signature": [ + "(() => void) | undefined" + ], + "path": "packages/core/http/core-http-server/src/router/request.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] } ], "initialIsOpen": false diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index 73a3dca1cc36a..700276ac750fd 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-05-18 +date: 2023-05-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server'] --- import kbnCoreHttpServerObj from './kbn_core_http_server.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 440 | 1 | 176 | 0 | +| 444 | 1 | 178 | 0 | ## Common diff --git a/api_docs/kbn_core_http_server_internal.devdocs.json b/api_docs/kbn_core_http_server_internal.devdocs.json index 10c1e0de34015..5ab81378db238 100644 --- a/api_docs/kbn_core_http_server_internal.devdocs.json +++ b/api_docs/kbn_core_http_server_internal.devdocs.json @@ -535,6 +535,26 @@ "path": "packages/core/http/core-http-server-internal/src/http_config.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-http-server-internal", + "id": "def-common.HttpConfig.eluMonitor", + "type": "Object", + "tags": [], + "label": "eluMonitor", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-http-server", + "scope": "common", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-common.IHttpEluMonitorConfig", + "text": "IHttpEluMonitorConfig" + } + ], + "path": "packages/core/http/core-http-server-internal/src/http_config.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -881,7 +901,7 @@ "section": "def-common.ByteSizeValue", "text": "ByteSizeValue" }, - "; readonly rewriteBasePath: boolean; readonly keepaliveTimeout: number; readonly socketTimeout: number; readonly xsrf: Readonly<{} & { disableProtection: boolean; allowlist: string[]; }>; readonly requestId: Readonly<{} & { allowFromAnyIp: boolean; ipAllowlist: string[]; }>; readonly restrictInternalApis: boolean; }" + "; readonly rewriteBasePath: boolean; readonly keepaliveTimeout: number; readonly socketTimeout: number; readonly xsrf: Readonly<{} & { disableProtection: boolean; allowlist: string[]; }>; readonly eluMonitor: Readonly<{} & { enabled: boolean; logging: Readonly<{} & { enabled: boolean; threshold: Readonly<{} & { elu: number; ela: number; }>; }>; }>; readonly requestId: Readonly<{} & { allowFromAnyIp: boolean; ipAllowlist: string[]; }>; readonly restrictInternalApis: boolean; }" ], "path": "packages/core/http/core-http-server-internal/src/http_config.ts", "deprecated": false, diff --git a/api_docs/kbn_core_http_server_internal.mdx b/api_docs/kbn_core_http_server_internal.mdx index d8bf9a68571b3..b0f6f527f3148 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-05-18 +date: 2023-05-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-internal'] --- import kbnCoreHttpServerInternalObj from './kbn_core_http_server_internal.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 56 | 0 | 50 | 6 | +| 57 | 0 | 51 | 6 | ## Common diff --git a/api_docs/kbn_core_http_server_mocks.mdx b/api_docs/kbn_core_http_server_mocks.mdx index 8396237623d4d..afafd010a3bbc 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-05-18 +date: 2023-05-19 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 531f3aabd5ca0..88976a612e89f 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-05-18 +date: 2023-05-19 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 03e6bb79df59d..92025eb99b370 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-05-18 +date: 2023-05-19 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 bcbdb003a67af..5eb15a0db592b 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-05-18 +date: 2023-05-19 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 0a6010884a1fc..8b2b0e5505feb 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-05-18 +date: 2023-05-19 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 c38617aaa1513..bfdb9a82a31e1 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-05-18 +date: 2023-05-19 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 1dd7bde101ca3..f200329aafa53 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-05-18 +date: 2023-05-19 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 4f257285463dc..9b5fe61cbfada 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-05-18 +date: 2023-05-19 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 58994a67f82a7..086375a5b2f80 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-05-18 +date: 2023-05-19 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 8a1530fb238ad..64d25f520fc0e 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-05-18 +date: 2023-05-19 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 c997227d7fef0..7203bdcfb3c2a 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-05-18 +date: 2023-05-19 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 2bdf92938be05..4fb9e1712ddb3 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-05-18 +date: 2023-05-19 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 f413f7fa74666..36aa2e0bcc6c5 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-05-18 +date: 2023-05-19 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 c15fc274244b0..2214a2de4d6df 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-05-18 +date: 2023-05-19 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 239dc1a59919b..40fced115b72f 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-05-18 +date: 2023-05-19 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 647917da43094..69dc06b9e2132 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-05-18 +date: 2023-05-19 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 03134f6ab8d97..bbcc332adbff0 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-05-18 +date: 2023-05-19 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 15f74d5e291a5..8731298b5ff05 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-05-18 +date: 2023-05-19 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 3389efb599c4a..6ca0a0a4143ee 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-05-18 +date: 2023-05-19 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 f609247f55e38..b25f080a0fde1 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-05-18 +date: 2023-05-19 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 fdce3130ae39a..39cd868273258 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-05-18 +date: 2023-05-19 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 1f7eaf1ed4cfe..162e3bb2551ed 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-05-18 +date: 2023-05-19 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 4bf4d6cd145f6..1c077b080ce77 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-05-18 +date: 2023-05-19 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 775848f51cace..4236afb5bd68e 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-05-18 +date: 2023-05-19 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 741bd1010d270..cdc62d2f0bab1 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-05-18 +date: 2023-05-19 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 f77aa4788fc7e..4dd3c7019b765 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-05-18 +date: 2023-05-19 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 1bc934b47fef7..fc01eb7e133e0 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-05-18 +date: 2023-05-19 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 ab7d91ad319f7..5423b5b385dfc 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-05-18 +date: 2023-05-19 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 1b40455b4084e..061ae6236649c 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-05-18 +date: 2023-05-19 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 035e121ce9ee8..7cd91348a66ee 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-05-18 +date: 2023-05-19 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 75d53cb85680c..37196f1856060 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-05-18 +date: 2023-05-19 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 91e570fcbd071..4cd74c99b6890 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-05-18 +date: 2023-05-19 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 de29148aa99c3..9554ca99b53c1 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-05-18 +date: 2023-05-19 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 62b13d24d1e47..e7f3dfa35cf63 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-05-18 +date: 2023-05-19 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 e12eecca53949..3a44b7a45e40a 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-05-18 +date: 2023-05-19 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 52a8cdb37eb2c..70e5a84e46bf1 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-05-18 +date: 2023-05-19 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 3e51b0d0db176..1d2f97b2f3912 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-05-18 +date: 2023-05-19 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 122fe57b2d243..0bde60d641673 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-05-18 +date: 2023-05-19 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 a2e6edb02c2b8..ea75ee94995a8 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-05-18 +date: 2023-05-19 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 97c2a86b70084..88cb4e5305536 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-05-18 +date: 2023-05-19 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 5877a04f9ad8e..ee231d4c6d2b6 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-05-18 +date: 2023-05-19 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 5a4fe7467b2d7..dc392025c3756 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-05-18 +date: 2023-05-19 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 8b41f2c2249bd..fc27c7ea16c9d 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-05-18 +date: 2023-05-19 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 36eec3175051c..4d6c9049104b3 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-05-18 +date: 2023-05-19 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 38706906221a7..e7ee63ef954d6 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-05-18 +date: 2023-05-19 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 a587525b3cd47..877b725fb61df 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-05-18 +date: 2023-05-19 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 517d872f2d105..682c6381c6656 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-05-18 +date: 2023-05-19 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 9dd2f32dba97a..571ae5dd8fde1 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-05-18 +date: 2023-05-19 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 84c64b2d79351..1b5a6af3d22ba 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-05-18 +date: 2023-05-19 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 f92ff208218d3..44e91b12ab0dc 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-05-18 +date: 2023-05-19 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 07389f47114d3..69cfc9d71defa 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-05-18 +date: 2023-05-19 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.devdocs.json b/api_docs/kbn_core_saved_objects_common.devdocs.json index c67aaf197d228..cb0cd6f563ee5 100644 --- a/api_docs/kbn_core_saved_objects_common.devdocs.json +++ b/api_docs/kbn_core_saved_objects_common.devdocs.json @@ -2047,14 +2047,6 @@ "plugin": "fleet", "path": "x-pack/plugins/fleet/common/types/models/epm.ts" }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/common/types/models/settings.ts" - }, - { - "plugin": "fleet", - "path": "x-pack/plugins/fleet/common/types/models/settings.ts" - }, { "plugin": "canvas", "path": "x-pack/plugins/canvas/shareable_runtime/types.ts" diff --git a/api_docs/kbn_core_saved_objects_common.mdx b/api_docs/kbn_core_saved_objects_common.mdx index d5f44d7f060d6..5e6c1af7ab24b 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-05-18 +date: 2023-05-19 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 e25dad24d4736..5de25988e8951 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-05-18 +date: 2023-05-19 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 61ee0d8ff7cc9..72045eb7a71ec 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-05-18 +date: 2023-05-19 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 b9545bc3b1a0d..572f5e0b90973 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-05-18 +date: 2023-05-19 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 c1929b3215bf6..dda4135656c7f 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-05-18 +date: 2023-05-19 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 4276d520a64ae..e1003b67b5daa 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-05-18 +date: 2023-05-19 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 5665cd55ba551..1996d99a5011f 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-05-18 +date: 2023-05-19 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 18fe34896028c..c0d9aae9528c6 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-05-18 +date: 2023-05-19 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 6596b156cf40e..e864f63e82516 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-05-18 +date: 2023-05-19 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 a29bbed4a7e0f..542d0304b3b51 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-05-18 +date: 2023-05-19 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 e5a93c304c296..5efa04f9c6bce 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-05-18 +date: 2023-05-19 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 036f1bc8b1ebc..f90450a099f47 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-05-18 +date: 2023-05-19 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 b5eda5f2d253f..09a8ef66525a0 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-05-18 +date: 2023-05-19 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 ab32d4652f38a..3c2a404422e73 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-05-18 +date: 2023-05-19 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 0156486410408..f04560f7aed0a 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-05-18 +date: 2023-05-19 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 c9fd2ff5a4de4..ec05cbbd46370 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-05-18 +date: 2023-05-19 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 a07dee60230da..77696b8988ae8 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-05-18 +date: 2023-05-19 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 a408548b80174..6c9ff0690a8d7 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-05-18 +date: 2023-05-19 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 91996f420e7c6..053e7b8258bcc 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-05-18 +date: 2023-05-19 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 d2469825b8925..8f91f30935847 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-05-18 +date: 2023-05-19 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 5850042114a29..4184e85f0e961 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-05-18 +date: 2023-05-19 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 2bc0b288b28a6..6951bc93ef858 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-05-18 +date: 2023-05-19 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 945e6aff42f6f..a49fa2ccd44dd 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-05-18 +date: 2023-05-19 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 276724fdd5f52..f22dc0d97fa80 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-05-18 +date: 2023-05-19 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 8c5cc0a2d2a65..f703cc9173b22 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-05-18 +date: 2023-05-19 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 393975c244413..656b542545999 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-05-18 +date: 2023-05-19 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 214f10d1504f5..cb25e935df2a6 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-05-18 +date: 2023-05-19 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 a9de34ccebf19..cf00ffa57e811 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-05-18 +date: 2023-05-19 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 9782b991951b3..f8d59c5d5e42b 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-05-18 +date: 2023-05-19 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 1f590947fb32d..5b21b1419e919 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-05-18 +date: 2023-05-19 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 3d60c4b57d1df..110d2848c0513 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-05-18 +date: 2023-05-19 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 272ca266ca97e..114ec6e2391c3 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-05-18 +date: 2023-05-19 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 cc9cf431e5b65..0d936ecf9b05d 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-05-18 +date: 2023-05-19 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 51b5229a82f28..90553d526dd0c 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-05-18 +date: 2023-05-19 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 239e175efac16..82f22d9791b09 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-05-18 +date: 2023-05-19 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 539108c0a5afb..583566b1ddfa0 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-05-18 +date: 2023-05-19 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 0707cb43328ea..b672b83946683 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-05-18 +date: 2023-05-19 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 da21df7c8bf58..3c3d1857b7ce5 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-05-18 +date: 2023-05-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cypress-config'] --- import kbnCypressConfigObj from './kbn_cypress_config.devdocs.json'; diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index 6ea342a2836b9..4a74205951c7c 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-05-18 +date: 2023-05-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] --- import kbnDatemathObj from './kbn_datemath.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index 45fd3bf4b3e55..cd442423edecf 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-05-18 +date: 2023-05-19 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 61a2162aadce4..403fb579b83d1 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-05-18 +date: 2023-05-19 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 dcd5fec5a298b..cb715e2bbfc8d 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-05-18 +date: 2023-05-19 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 3a6b526f4a2da..0a732ea77b975 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-05-18 +date: 2023-05-19 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 90a7ac02e0ba8..7daf0d492f489 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-05-18 +date: 2023-05-19 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 8ebf37b0f4d4f..17b3194c04d59 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-05-18 +date: 2023-05-19 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 2423427622e49..8168aa313ddb3 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-05-18 +date: 2023-05-19 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 96d524f032e4b..3dcec358e5f85 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-05-18 +date: 2023-05-19 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 9b3d3966d1763..9ea66a968c231 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-05-18 +date: 2023-05-19 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 ce0ede2e4b5bc..8ddddbb3fff9d 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-05-18 +date: 2023-05-19 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_es.mdx b/api_docs/kbn_es.mdx index 056ccc6939e6d..e5c369b0e9984 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-05-18 +date: 2023-05-19 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 890d3b49eac80..aaf87655e301a 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-05-18 +date: 2023-05-19 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 235c55f852af6..a55b617aaed0b 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-05-18 +date: 2023-05-19 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 d8d7d3ca663f4..c681da876e331 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-05-18 +date: 2023-05-19 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 f39295d8e24ed..98c4e25af3a7b 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-05-18 +date: 2023-05-19 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 47df8a7241ef9..16183e9a99fae 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-05-18 +date: 2023-05-19 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 3d96623a66638..d347d969c3799 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-05-18 +date: 2023-05-19 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 c4ab6c4f725a9..818250a2dc0b9 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-05-18 +date: 2023-05-19 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 29568a3a6a2e0..7da608ca459e2 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-05-18 +date: 2023-05-19 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 608fc4ed22827..ebdc6fc866e4d 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-05-18 +date: 2023-05-19 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 7a932ae2f0c1a..6b6a8ab05b944 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-05-18 +date: 2023-05-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate'] --- import kbnGenerateObj from './kbn_generate.devdocs.json'; diff --git a/api_docs/kbn_generate_csv.mdx b/api_docs/kbn_generate_csv.mdx index 9d675da1b8c21..5359fd4c792bd 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-05-18 +date: 2023-05-19 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 44c7d5d406746..b636f37dcb952 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-05-18 +date: 2023-05-19 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 e1f41730e4de9..066c4eaefd2ca 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-05-18 +date: 2023-05-19 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 43cc52f5aa37b..3a43be05b962e 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-05-18 +date: 2023-05-19 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 f4c018e2543c9..272ba2807f6b3 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-05-18 +date: 2023-05-19 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 7158251c6eb62..36487a802385d 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-05-18 +date: 2023-05-19 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 5c556b20770b8..b5cd83de3e2aa 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-05-18 +date: 2023-05-19 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 067e97a9aac4c..a769ad3de69c3 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-05-18 +date: 2023-05-19 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 a1dce42051ffe..249aa7582cbdf 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-05-18 +date: 2023-05-19 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 52e789c4f6135..46dc56b9390ba 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-05-18 +date: 2023-05-19 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 df1f119a52ca6..80d6105ab2039 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-05-18 +date: 2023-05-19 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 9119ac3121d02..61f6bc2e9d074 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-05-18 +date: 2023-05-19 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 c47bd4660085b..581c45858b2dd 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-05-18 +date: 2023-05-19 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 a63ee001582ac..d28c82a5a341d 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-05-18 +date: 2023-05-19 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 9ac061098230b..b206bd05957b2 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-05-18 +date: 2023-05-19 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 bfc98e5c74775..df896c04b6efb 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-05-18 +date: 2023-05-19 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 0409aaf3829a9..7114be5df0499 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-05-18 +date: 2023-05-19 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 8e389a1895e01..0a455ecfbc5e8 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-05-18 +date: 2023-05-19 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 1fb021e8dd466..f924a9b5fa7fa 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-05-18 +date: 2023-05-19 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 2aa0a806a4489..559eaba4657bb 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-05-18 +date: 2023-05-19 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 6cc33b842d1a0..63ec78166c53b 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-05-18 +date: 2023-05-19 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 571740198b680..d224c8a34190c 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-05-18 +date: 2023-05-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-vscode-config'] --- import kbnManagedVscodeConfigObj from './kbn_managed_vscode_config.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index 9cd8bd1550f09..11abea96e4b93 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-05-18 +date: 2023-05-19 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 26c769127172b..7fbd810c16309 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-05-18 +date: 2023-05-19 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 b0af5f478a0e4..86988f4ef9456 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-05-18 +date: 2023-05-19 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 92d20e90e10ab..a4e1479efbae2 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-05-18 +date: 2023-05-19 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_date_picker.mdx b/api_docs/kbn_ml_date_picker.mdx index 2383e58320cfd..ae7a0930b11e5 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-05-18 +date: 2023-05-19 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_error_utils.mdx b/api_docs/kbn_ml_error_utils.mdx index e9ea9076c4b63..98bdf022f6997 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-05-18 +date: 2023-05-19 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 3660403b66c43..dc880c6a24deb 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-05-18 +date: 2023-05-19 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 514f58f434d84..5b7582b425e57 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-05-18 +date: 2023-05-19 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_local_storage.mdx b/api_docs/kbn_ml_local_storage.mdx index 113d5851fa907..abce141378302 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-05-18 +date: 2023-05-19 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 b4db8b71de8fb..38af0b861826c 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-05-18 +date: 2023-05-19 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 680c0dae649ec..657ab4638555a 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-05-18 +date: 2023-05-19 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 e9c403c40eb89..b4abbd8117785 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-05-18 +date: 2023-05-19 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 a9f18910bfbc8..383ae93544660 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-05-18 +date: 2023-05-19 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 09af60aa648c8..62de25395f014 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-05-18 +date: 2023-05-19 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_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx index 3f51ca73cc0b8..bc9f9210f5e9e 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-05-18 +date: 2023-05-19 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 4020433b6d3d8..9ed36dfdcbac4 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-05-18 +date: 2023-05-19 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 76648c157fceb..1a8c4010ae514 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-05-18 +date: 2023-05-19 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 184989b5bef43..6d386ea5130b3 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-05-18 +date: 2023-05-19 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 630638c2fdd9e..d4d1fba55f243 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-05-18 +date: 2023-05-19 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 382ca066fc37a..092d2fcd6036d 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-05-18 +date: 2023-05-19 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 502e8f3d26fa8..86f308c3625af 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-05-18 +date: 2023-05-19 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 accfc1417a9b9..097e7334cb476 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-05-18 +date: 2023-05-19 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 ee3cf8b4b14dd..c9986e87b1597 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-05-18 +date: 2023-05-19 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 24609917a7971..03ba5a5a8f344 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-05-18 +date: 2023-05-19 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 5c422d0307dcb..c2d37b1b83749 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-05-18 +date: 2023-05-19 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 2a2874cff8d65..30f8c48297b35 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-05-18 +date: 2023-05-19 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 737ff31ac372c..dab3ae565a524 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-05-18 +date: 2023-05-19 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 b19fd2751cacc..be63692ad0937 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-05-18 +date: 2023-05-19 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 e5d26c1bb614c..6e529a6ffada1 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-05-18 +date: 2023-05-19 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 231a67313db1c..df5eb79c9a9af 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-05-18 +date: 2023-05-19 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 64896d4773f4e..e5242dd60edca 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-05-18 +date: 2023-05-19 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 bccd3fbf3832d..8132b97fb8490 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-05-18 +date: 2023-05-19 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 1419b8f1416af..2cd90171bb404 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-05-18 +date: 2023-05-19 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 44a63ab455e84..de71ff3c4a071 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-05-18 +date: 2023-05-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index 7c7d24f0a190e..0110736639e8f 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-05-18 +date: 2023-05-19 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 dc46e6eb07de6..8e784e2df0dd1 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-05-18 +date: 2023-05-19 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 f409cbcb25c1c..72256aded1561 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-05-18 +date: 2023-05-19 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 420c553aa9633..cc80694896926 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-05-18 +date: 2023-05-19 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 ec2bc56f328d1..04f0d11253813 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-05-18 +date: 2023-05-19 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 4eadf3f1f7e44..1142974f98c94 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-05-18 +date: 2023-05-19 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 680839950cf34..5f7e28b5ede40 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-05-18 +date: 2023-05-19 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 c74bf537c1140..87991c095a426 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-05-18 +date: 2023-05-19 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 af9a7790de758..6ce1cc2707b71 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-05-18 +date: 2023-05-19 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 7a4130e244f99..826e5ee1b3866 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-05-18 +date: 2023-05-19 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 81aa6c010ebfc..79cba070eafde 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-05-18 +date: 2023-05-19 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 575866689ba8a..7eb7945321e90 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-05-18 +date: 2023-05-19 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 a5dceccdd04fb..232f486392333 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-05-18 +date: 2023-05-19 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 28cc36f0b0aff..7d472ac5b2fc4 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-05-18 +date: 2023-05-19 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 93034a895345b..ce1cef828ac6a 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-05-18 +date: 2023-05-19 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 f7f0afbf3b6cd..7aa54766d5f38 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-05-18 +date: 2023-05-19 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 5e21d3b4d37fb..d0d1548e3d7fa 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-05-18 +date: 2023-05-19 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 e78a635537486..9673264454b6c 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-05-18 +date: 2023-05-19 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 9bcb0c8e30076..83d1165adf4ed 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-05-18 +date: 2023-05-19 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 1bf77942c5ea9..5c295751df116 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-05-18 +date: 2023-05-19 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 db72266314827..04f7a3c2226d0 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-05-18 +date: 2023-05-19 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 b28ea22bbac39..f2b8d2b6535ec 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-05-18 +date: 2023-05-19 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 3166993b96d7e..104a207b40637 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-05-18 +date: 2023-05-19 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 473fa3c90c00d..17a29306fdf93 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-05-18 +date: 2023-05-19 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 dfb7536d66da7..4ad67a25f3edc 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-05-18 +date: 2023-05-19 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 a90f12c62b1ee..b1fa82acb3862 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-05-18 +date: 2023-05-19 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 85859c4addda3..af64256862817 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-05-18 +date: 2023-05-19 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 896072d41899b..34821c58eac9e 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-05-18 +date: 2023-05-19 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 095b240d956fa..d1910e42e63da 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-05-18 +date: 2023-05-19 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 28740f35daf75..c41306b653287 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-05-18 +date: 2023-05-19 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 aaba69d838acb..6c57e81190c85 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-05-18 +date: 2023-05-19 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 27948594cc340..e07c3c3836e16 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-05-18 +date: 2023-05-19 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 d0d138d611894..c7823c837ecfe 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-05-18 +date: 2023-05-19 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 0acb44c2ec779..aba8ea4daac85 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-05-18 +date: 2023-05-19 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 f76692a80b8bf..91a7c47e223ab 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-05-18 +date: 2023-05-19 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 8737c4a24fa30..53d07e2c9260e 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-05-18 +date: 2023-05-19 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 2719b9ad96fb6..5656cc5a3d7e8 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-05-18 +date: 2023-05-19 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 ac656267c4f57..15c3f19228371 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-05-18 +date: 2023-05-19 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 931dbbfc20548..bc5b24fbbb682 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-05-18 +date: 2023-05-19 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 4004ce5810e39..55b7bc5968f78 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-05-18 +date: 2023-05-19 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 5abacc44a565f..de48fdf36ebe8 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-05-18 +date: 2023-05-19 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 8a911cd8902e1..df9cd8ace671f 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-05-18 +date: 2023-05-19 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 ac8d90a1886bf..73bdfcc412a62 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-05-18 +date: 2023-05-19 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 65b1df395ddf8..a4393941cb4b9 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-05-18 +date: 2023-05-19 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 fb19bc18e1173..1773217becf8b 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-05-18 +date: 2023-05-19 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 532598e676ae5..66bb4f7148617 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-05-18 +date: 2023-05-19 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 4857a40391413..901f873a73867 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-05-18 +date: 2023-05-19 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 0d50825d033e2..9edc163174e07 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-05-18 +date: 2023-05-19 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 752430af738e7..46e577057709b 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-05-18 +date: 2023-05-19 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 7c3be0445e76d..ce17b09d6fe66 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-05-18 +date: 2023-05-19 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 210ad1c2c6c66..5617c0103b5c0 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-05-18 +date: 2023-05-19 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 79cd6b9e34bba..fdab4bf410411 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-05-18 +date: 2023-05-19 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 64812e1b4435e..3ce076557e2e1 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-05-18 +date: 2023-05-19 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 bb7d93756adbe..8d6bd7d90cd26 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-05-18 +date: 2023-05-19 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 ec16a3d1d47ad..afbc42a2de904 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-05-18 +date: 2023-05-19 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 a7198e53b0979..f6ff85266cb5b 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-05-18 +date: 2023-05-19 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 b28b624a1a2ef..acb6e3c83aa99 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-05-18 +date: 2023-05-19 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 2a558c189f21a..91492bf2c2987 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-05-18 +date: 2023-05-19 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 5b5594c7bbd57..d790ecc72605f 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-05-18 +date: 2023-05-19 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 c2997703c9565..89e7cd190a476 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-05-18 +date: 2023-05-19 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 7baec0a356f3c..11c6cf49e5ecf 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-05-18 +date: 2023-05-19 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 8ddf3275be076..7448254ff2fcb 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-05-18 +date: 2023-05-19 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 4a976e636c965..1e7abc0bc0faa 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-05-18 +date: 2023-05-19 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 2bd7508243dc2..ff3317ff78f6c 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-05-18 +date: 2023-05-19 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 b29f959d62fef..df45142f02422 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-05-18 +date: 2023-05-19 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 9a07598067c41..9bd661a46d7b6 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-05-18 +date: 2023-05-19 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 497a5920c726b..0c26951628a6a 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-05-18 +date: 2023-05-19 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 a7e789db73a48..f710405b65373 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-05-18 +date: 2023-05-19 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 384734430ca2f..00bfa422136c5 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-05-18 +date: 2023-05-19 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 74a168c0d2075..718472906238b 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-05-18 +date: 2023-05-19 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 c50315eac0b75..e3e06cd874390 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-05-18 +date: 2023-05-19 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 8f3129ffcee47..f7125bc0b44ef 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-05-18 +date: 2023-05-19 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 bcdcd2c25b704..d9679cf708262 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-05-18 +date: 2023-05-19 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 4531a0a86e2d7..dfdf5275c6f44 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-05-18 +date: 2023-05-19 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 9ec124c1246a6..bf8bf6c0cdabb 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-05-18 +date: 2023-05-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index 0c97a6c1c7cb0..2dc9c147151fc 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-05-18 +date: 2023-05-19 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 f63bbfcfb383b..dc94be57bdb46 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-05-18 +date: 2023-05-19 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 844c89ba4c198..d31b2804412fb 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-05-18 +date: 2023-05-19 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 6eef9f15b65bd..5c47f9f9a60a1 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-05-18 +date: 2023-05-19 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 49bcf1c7719f4..0cbcf7e871401 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-05-18 +date: 2023-05-19 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 0e6252ab56199..8b53ccb1a7245 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-05-18 +date: 2023-05-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] --- import kbnUiThemeObj from './kbn_ui_theme.devdocs.json'; diff --git a/api_docs/kbn_url_state.mdx b/api_docs/kbn_url_state.mdx index 35d0d8526a486..b8e0a35afe607 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-05-18 +date: 2023-05-19 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 61f00acb9db47..5d4a04793e400 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-05-18 +date: 2023-05-19 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 a12fb2719b42c..12cbaa988385b 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-05-18 +date: 2023-05-19 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 677240213a3f4..e441b3728ab95 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-05-18 +date: 2023-05-19 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 c9c4c06f44e18..350e19a48be14 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-05-18 +date: 2023-05-19 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 177f46ce3bd3b..903f5560d355a 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-05-18 +date: 2023-05-19 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 c5c357d166081..e5441ef8b1363 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-05-18 +date: 2023-05-19 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 b0ef1dd112bc3..b850f99994b81 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-05-18 +date: 2023-05-19 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 27c922d033054..0404de487417a 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-05-18 +date: 2023-05-19 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 6e68f51519b74..692ee0093b3ae 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-05-18 +date: 2023-05-19 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 c55de0cbfe7f7..8ad00083c77ce 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-05-18 +date: 2023-05-19 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 08fdd4eb36261..0957ea55b39f3 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-05-18 +date: 2023-05-19 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 648810747c2c9..5a4bf2b6c10f2 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-05-18 +date: 2023-05-19 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 a6f33f8fea149..e88dbb9dc326d 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-05-18 +date: 2023-05-19 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 feac6f48fec87..b6b8a3195843e 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-05-18 +date: 2023-05-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/management.mdx b/api_docs/management.mdx index 15500c79d2388..5c451c1c485a3 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-05-18 +date: 2023-05-19 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 e60f4154be08e..4a101fa3d622f 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-05-18 +date: 2023-05-19 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 ce8e14f7fb905..76d8ef22f6402 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-05-18 +date: 2023-05-19 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 d5f90e56e9efb..61a31937b78c6 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-05-18 +date: 2023-05-19 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 68d2ba241744e..a5849f25b93f7 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-05-18 +date: 2023-05-19 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 cb27b5cae70f9..25bdce65652d6 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-05-18 +date: 2023-05-19 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 9ea25b3f6754e..70a7c0db53384 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-05-18 +date: 2023-05-19 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 94bc08748805c..d38e3dcf26f7e 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-05-18 +date: 2023-05-19 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 4e069d8aabd1f..558abad735faf 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-05-18 +date: 2023-05-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'notifications'] --- import notificationsObj from './notifications.devdocs.json'; diff --git a/api_docs/observability.devdocs.json b/api_docs/observability.devdocs.json index 53d31d332e4aa..9227728d4211b 100644 --- a/api_docs/observability.devdocs.json +++ b/api_docs/observability.devdocs.json @@ -3,56 +3,6 @@ "client": { "classes": [], "functions": [ - { - "parentPluginId": "observability", - "id": "def-public.ActionMenu", - "type": "Function", - "tags": [], - "label": "ActionMenu", - "description": [], - "signature": [ - "(props: Props) => JSX.Element" - ], - "path": "x-pack/plugins/observability/public/components/shared/action_menu/index.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "observability", - "id": "def-public.ActionMenu.$1", - "type": "CompoundType", - "tags": [], - "label": "props", - "description": [], - "signature": [ - "Props" - ], - "path": "x-pack/plugins/observability/public/components/shared/action_menu/index.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - }, - { - "parentPluginId": "observability", - "id": "def-public.ActionMenuDivider", - "type": "Function", - "tags": [], - "label": "ActionMenuDivider", - "description": [], - "signature": [ - "() => JSX.Element" - ], - "path": "x-pack/plugins/observability/public/components/shared/action_menu/index.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [], - "returnComment": [], - "initialIsOpen": false - }, { "parentPluginId": "observability", "id": "def-public.AlertSummary", @@ -257,39 +207,6 @@ "returnComment": [], "initialIsOpen": false }, - { - "parentPluginId": "observability", - "id": "def-public.createEsParams", - "type": "Function", - "tags": [], - "label": "createEsParams", - "description": [], - "signature": [ - "(params: T) => T" - ], - "path": "x-pack/plugins/observability/public/hooks/use_es_search.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "observability", - "id": "def-public.createEsParams.$1", - "type": "Uncategorized", - "tags": [], - "label": "params", - "description": [], - "signature": [ - "T" - ], - "path": "x-pack/plugins/observability/public/hooks/use_es_search.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - }, { "parentPluginId": "observability", "id": "def-public.createObservabilityRuleTypeRegistryMock", @@ -332,7 +249,13 @@ "description": [], "signature": [ "() => (options?: ", - "Options", + { + "pluginId": "observabilityShared", + "scope": "public", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-public.Options", + "text": "Options" + }, ") => ", "LinkProps" ], @@ -351,11 +274,11 @@ "label": "DatePicker", "description": [], "signature": [ - "(props: ", + "({\n rangeFrom,\n rangeTo,\n refreshPaused,\n refreshInterval,\n width = 'restricted',\n onTimeRangeRefresh,\n}: ", "DatePickerProps", ") => JSX.Element" ], - "path": "x-pack/plugins/observability/public/components/shared/index.tsx", + "path": "x-pack/plugins/observability/public/pages/overview/components/date_picker/date_picker.tsx", "deprecated": false, "trackAdoption": false, "children": [ @@ -364,12 +287,12 @@ "id": "def-public.DatePicker.$1", "type": "Object", "tags": [], - "label": "props", + "label": "{\n rangeFrom,\n rangeTo,\n refreshPaused,\n refreshInterval,\n width = 'restricted',\n onTimeRangeRefresh,\n}", "description": [], "signature": [ "DatePickerProps" ], - "path": "x-pack/plugins/observability/public/components/shared/index.tsx", + "path": "x-pack/plugins/observability/public/pages/overview/components/date_picker/date_picker.tsx", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -388,7 +311,7 @@ "signature": [ "({ children }: { children: React.ReactElement>; }) => JSX.Element" ], - "path": "x-pack/plugins/observability/public/context/date_picker_context.tsx", + "path": "x-pack/plugins/observability/public/context/date_picker_context/date_picker_context.tsx", "deprecated": false, "trackAdoption": false, "children": [ @@ -399,7 +322,7 @@ "tags": [], "label": "{ children }", "description": [], - "path": "x-pack/plugins/observability/public/context/date_picker_context.tsx", + "path": "x-pack/plugins/observability/public/context/date_picker_context/date_picker_context.tsx", "deprecated": false, "trackAdoption": false, "children": [ @@ -413,7 +336,7 @@ "signature": [ "React.ReactElement>" ], - "path": "x-pack/plugins/observability/public/context/date_picker_context.tsx", + "path": "x-pack/plugins/observability/public/context/date_picker_context/date_picker_context.tsx", "deprecated": false, "trackAdoption": false } @@ -423,111 +346,6 @@ "returnComment": [], "initialIsOpen": false }, - { - "parentPluginId": "observability", - "id": "def-public.FieldValueSelection", - "type": "Function", - "tags": [], - "label": "FieldValueSelection", - "description": [], - "signature": [ - "(props: ", - "FieldValueSelectionProps", - ") => JSX.Element" - ], - "path": "x-pack/plugins/observability/public/components/shared/index.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "observability", - "id": "def-public.FieldValueSelection.$1", - "type": "CompoundType", - "tags": [], - "label": "props", - "description": [], - "signature": [ - "FieldValueSelectionProps" - ], - "path": "x-pack/plugins/observability/public/components/shared/index.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - }, - { - "parentPluginId": "observability", - "id": "def-public.FieldValueSuggestions", - "type": "Function", - "tags": [], - "label": "FieldValueSuggestions", - "description": [], - "signature": [ - "(props: ", - "FieldValueSuggestionsProps", - ") => JSX.Element" - ], - "path": "x-pack/plugins/observability/public/components/shared/index.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "observability", - "id": "def-public.FieldValueSuggestions.$1", - "type": "CompoundType", - "tags": [], - "label": "props", - "description": [], - "signature": [ - "FieldValueSuggestionsProps" - ], - "path": "x-pack/plugins/observability/public/components/shared/index.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - }, - { - "parentPluginId": "observability", - "id": "def-public.FilterValueLabel", - "type": "Function", - "tags": [], - "label": "FilterValueLabel", - "description": [], - "signature": [ - "(props: ", - "FilterValueLabelProps", - ") => JSX.Element" - ], - "path": "x-pack/plugins/observability/public/components/shared/index.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "observability", - "id": "def-public.FilterValueLabel.$1", - "type": "Object", - "tags": [], - "label": "props", - "description": [], - "signature": [ - "FilterValueLabelProps" - ], - "path": "x-pack/plugins/observability/public/components/shared/index.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - }, { "parentPluginId": "observability", "id": "def-public.formatAlertEvaluationValue", @@ -769,7 +587,7 @@ "CoreVitalProps", ") => JSX.Element" ], - "path": "x-pack/plugins/observability/public/components/shared/index.tsx", + "path": "x-pack/plugins/observability/public/components/core_web_vitals/get_core_web_vitals_lazy.tsx", "deprecated": false, "trackAdoption": false, "children": [ @@ -783,42 +601,7 @@ "signature": [ "CoreVitalProps" ], - "path": "x-pack/plugins/observability/public/components/shared/index.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - }, - { - "parentPluginId": "observability", - "id": "def-public.HeaderMenuPortal", - "type": "Function", - "tags": [], - "label": "HeaderMenuPortal", - "description": [], - "signature": [ - "(props: ", - "HeaderMenuPortalProps", - ") => JSX.Element" - ], - "path": "x-pack/plugins/observability/public/components/shared/index.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "observability", - "id": "def-public.HeaderMenuPortal.$1", - "type": "Object", - "tags": [], - "label": "props", - "description": [], - "signature": [ - "HeaderMenuPortalProps" - ], - "path": "x-pack/plugins/observability/public/components/shared/index.tsx", + "path": "x-pack/plugins/observability/public/components/core_web_vitals/get_core_web_vitals_lazy.tsx", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -827,51 +610,6 @@ "returnComment": [], "initialIsOpen": false }, - { - "parentPluginId": "observability", - "id": "def-public.InspectorContextProvider", - "type": "Function", - "tags": [], - "label": "InspectorContextProvider", - "description": [], - "signature": [ - "({ children }: { children: React.ReactNode; }) => JSX.Element" - ], - "path": "x-pack/plugins/observability/public/context/inspector/inspector_context.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "observability", - "id": "def-public.InspectorContextProvider.$1", - "type": "Object", - "tags": [], - "label": "{ children }", - "description": [], - "path": "x-pack/plugins/observability/public/context/inspector/inspector_context.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "observability", - "id": "def-public.InspectorContextProvider.$1.children", - "type": "CompoundType", - "tags": [], - "label": "children", - "description": [], - "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" - ], - "path": "x-pack/plugins/observability/public/context/inspector/inspector_context.tsx", - "deprecated": false, - "trackAdoption": false - } - ] - } - ], - "returnComment": [], - "initialIsOpen": false - }, { "parentPluginId": "observability", "id": "def-public.LazyAlertsFlyout", @@ -917,784 +655,46 @@ "parentPluginId": "observability", "id": "def-public.LazyAlertsFlyout.$1", "type": "Uncategorized", - "tags": [], - "label": "props", - "description": [], - "signature": [ - "P" - ], - "path": "node_modules/@types/react/index.d.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "observability", - "id": "def-public.LoadWhenInView", - "type": "Function", - "tags": [], - "label": "LoadWhenInView", - "description": [], - "signature": [ - "(props: ", - "LoadWhenInViewProps", - ") => JSX.Element" - ], - "path": "x-pack/plugins/observability/public/components/shared/index.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "observability", - "id": "def-public.LoadWhenInView.$1", - "type": "Object", - "tags": [], - "label": "props", - "description": [], - "signature": [ - "LoadWhenInViewProps" - ], - "path": "x-pack/plugins/observability/public/components/shared/index.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - }, - { - "parentPluginId": "observability", - "id": "def-public.NavigationWarningPromptProvider", - "type": "Function", - "tags": [], - "label": "NavigationWarningPromptProvider", - "description": [], - "signature": [ - "({ children }: { children?: React.ReactNode; }) => JSX.Element" - ], - "path": "x-pack/plugins/observability/public/utils/navigation_warning_prompt/context.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "observability", - "id": "def-public.NavigationWarningPromptProvider.$1", - "type": "Object", - "tags": [], - "label": "{ children }", - "description": [], - "signature": [ - "{ children?: React.ReactNode; }" - ], - "path": "x-pack/plugins/observability/public/utils/navigation_warning_prompt/context.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - }, - { - "parentPluginId": "observability", - "id": "def-public.ObservabilityAlertSearchBar", - "type": "Function", - "tags": [], - "label": "ObservabilityAlertSearchBar", - "description": [], - "signature": [ - "(props: ", - "ObservabilityAlertSearchBarProps", - ") => JSX.Element" - ], - "path": "x-pack/plugins/observability/public/components/shared/index.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "observability", - "id": "def-public.ObservabilityAlertSearchBar.$1", - "type": "Object", - "tags": [], - "label": "props", - "description": [], - "signature": [ - "ObservabilityAlertSearchBarProps" - ], - "path": "x-pack/plugins/observability/public/components/shared/index.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - }, - { - "parentPluginId": "observability", - "id": "def-public.Prompt", - "type": "Function", - "tags": [], - "label": "Prompt", - "description": [], - "signature": [ - "({ prompt }: React.PropsWithChildren) => null" - ], - "path": "x-pack/plugins/observability/public/utils/navigation_warning_prompt/prompt.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "observability", - "id": "def-public.Prompt.$1", - "type": "CompoundType", - "tags": [], - "label": "{ prompt }", - "description": [], - "signature": [ - "React.PropsWithChildren" - ], - "path": "x-pack/plugins/observability/public/utils/navigation_warning_prompt/prompt.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - }, - { - "parentPluginId": "observability", - "id": "def-public.Section", - "type": "Function", - "tags": [], - "label": "Section", - "description": [], - "signature": [ - "string & ", - "StyledComponentBase", - "<\"div\", any, {}, never> & ", - "NonReactStatics", - "" - ], - "path": "x-pack/plugins/observability/public/components/shared/action_menu/index.tsx", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, - { - "parentPluginId": "observability", - "id": "def-public.SectionLink", - "type": "Function", - "tags": [], - "label": "SectionLink", - "description": [], - "signature": [ - "(props: ", - "EuiListGroupItemProps", - ") => JSX.Element" - ], - "path": "x-pack/plugins/observability/public/components/shared/action_menu/index.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "observability", - "id": "def-public.SectionLink.$1", - "type": "CompoundType", - "tags": [], - "label": "props", - "description": [], - "signature": [ - "EuiListGroupItemProps" - ], - "path": "x-pack/plugins/observability/public/components/shared/action_menu/index.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - }, - { - "parentPluginId": "observability", - "id": "def-public.SectionLinks", - "type": "Function", - "tags": [], - "label": "SectionLinks", - "description": [], - "signature": [ - "({ children, ...props }: { children?: React.ReactNode; } & ", - "CommonProps", - " & Omit, \"color\"> & { bordered?: boolean | undefined; flush?: boolean | undefined; gutterSize?: \"m\" | \"none\" | \"s\" | undefined; listItems?: ", - "EuiListGroupItemProps", - "[] | undefined; color?: \"text\" | \"subdued\" | \"primary\" | undefined; size?: \"m\" | \"s\" | \"xs\" | \"l\" | undefined; maxWidth?: boolean | ", - "Property", - ".MaxWidth | undefined; showToolTips?: boolean | undefined; wrapText?: boolean | undefined; ariaLabelledby?: string | undefined; }) => JSX.Element" - ], - "path": "x-pack/plugins/observability/public/components/shared/action_menu/index.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "observability", - "id": "def-public.SectionLinks.$1", - "type": "CompoundType", - "tags": [], - "label": "{ children, ...props }", - "description": [], - "signature": [ - "{ children?: React.ReactNode; } & ", - "CommonProps", - " & Omit, \"color\"> & { bordered?: boolean | undefined; flush?: boolean | undefined; gutterSize?: \"m\" | \"none\" | \"s\" | undefined; listItems?: ", - "EuiListGroupItemProps", - "[] | undefined; color?: \"text\" | \"subdued\" | \"primary\" | undefined; size?: \"m\" | \"s\" | \"xs\" | \"l\" | undefined; maxWidth?: boolean | ", - "Property", - ".MaxWidth | undefined; showToolTips?: boolean | undefined; wrapText?: boolean | undefined; ariaLabelledby?: string | undefined; }" - ], - "path": "x-pack/plugins/observability/public/components/shared/action_menu/index.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - }, - { - "parentPluginId": "observability", - "id": "def-public.SectionSpacer", - "type": "Function", - "tags": [], - "label": "SectionSpacer", - "description": [], - "signature": [ - "() => JSX.Element" - ], - "path": "x-pack/plugins/observability/public/components/shared/action_menu/index.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [], - "returnComment": [], - "initialIsOpen": false - }, - { - "parentPluginId": "observability", - "id": "def-public.SectionSubtitle", - "type": "Function", - "tags": [], - "label": "SectionSubtitle", - "description": [], - "signature": [ - "({ children }: { children?: React.ReactNode; }) => JSX.Element" - ], - "path": "x-pack/plugins/observability/public/components/shared/action_menu/index.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "observability", - "id": "def-public.SectionSubtitle.$1", - "type": "Object", - "tags": [], - "label": "{ children }", - "description": [], - "path": "x-pack/plugins/observability/public/components/shared/action_menu/index.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "observability", - "id": "def-public.SectionSubtitle.$1.children", - "type": "CompoundType", - "tags": [], - "label": "children", - "description": [], - "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" - ], - "path": "x-pack/plugins/observability/public/components/shared/action_menu/index.tsx", - "deprecated": false, - "trackAdoption": false - } - ] - } - ], - "returnComment": [], - "initialIsOpen": false - }, - { - "parentPluginId": "observability", - "id": "def-public.SectionTitle", - "type": "Function", - "tags": [], - "label": "SectionTitle", - "description": [], - "signature": [ - "({ children }: { children?: React.ReactNode; }) => JSX.Element" - ], - "path": "x-pack/plugins/observability/public/components/shared/action_menu/index.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "observability", - "id": "def-public.SectionTitle.$1", - "type": "Object", - "tags": [], - "label": "{ children }", - "description": [], - "path": "x-pack/plugins/observability/public/components/shared/action_menu/index.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "observability", - "id": "def-public.SectionTitle.$1.children", - "type": "CompoundType", - "tags": [], - "label": "children", - "description": [], - "signature": [ - "boolean | React.ReactChild | React.ReactFragment | React.ReactPortal | null | undefined" - ], - "path": "x-pack/plugins/observability/public/components/shared/action_menu/index.tsx", - "deprecated": false, - "trackAdoption": false - } - ] - } - ], - "returnComment": [], - "initialIsOpen": false - }, - { - "parentPluginId": "observability", - "id": "def-public.shouldHandleLinkEvent", - "type": "Function", - "tags": [], - "label": "shouldHandleLinkEvent", - "description": [], - "signature": [ - "(e: React.MouseEvent | React.MouseEvent) => boolean" - ], - "path": "x-pack/plugins/observability/public/hooks/use_link_props.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "observability", - "id": "def-public.shouldHandleLinkEvent.$1", - "type": "CompoundType", - "tags": [], - "label": "e", - "description": [], - "signature": [ - "React.MouseEvent | React.MouseEvent" - ], - "path": "x-pack/plugins/observability/public/hooks/use_link_props.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [], - "initialIsOpen": false - }, - { - "parentPluginId": "observability", - "id": "def-public.toQuery", - "type": "Function", - "tags": [], - "label": "toQuery", - "description": [], - "signature": [ - "(search: string | undefined) => ", - "ParsedQuery", - "" - ], - "path": "x-pack/plugins/observability/public/utils/url.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "observability", - "id": "def-public.toQuery.$1", - "type": "string", - "tags": [], - "label": "search", - "description": [], - "signature": [ - "string | undefined" - ], - "path": "x-pack/plugins/observability/public/utils/url.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": false - } - ], - "returnComment": [], - "initialIsOpen": false - }, - { - "parentPluginId": "observability", - "id": "def-public.useBreadcrumbs", - "type": "Function", - "tags": [], - "label": "useBreadcrumbs", - "description": [], - "signature": [ - "(extraCrumbs: ", - "EuiBreadcrumbProps", - "[], app?: { id: string; label: string; } | undefined) => void" - ], - "path": "x-pack/plugins/observability/public/hooks/use_breadcrumbs.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "observability", - "id": "def-public.useBreadcrumbs.$1", - "type": "Array", - "tags": [], - "label": "extraCrumbs", - "description": [], - "signature": [ - "EuiBreadcrumbProps", - "[]" - ], - "path": "x-pack/plugins/observability/public/hooks/use_breadcrumbs.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "observability", - "id": "def-public.useBreadcrumbs.$2", - "type": "Object", - "tags": [], - "label": "app", - "description": [], - "path": "x-pack/plugins/observability/public/hooks/use_breadcrumbs.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "observability", - "id": "def-public.useBreadcrumbs.$2.id", - "type": "string", - "tags": [], - "label": "id", - "description": [], - "path": "x-pack/plugins/observability/public/hooks/use_breadcrumbs.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "observability", - "id": "def-public.useBreadcrumbs.$2.label", - "type": "string", - "tags": [], - "label": "label", - "description": [], - "path": "x-pack/plugins/observability/public/hooks/use_breadcrumbs.ts", - "deprecated": false, - "trackAdoption": false - } - ] - } - ], - "returnComment": [], - "initialIsOpen": false - }, - { - "parentPluginId": "observability", - "id": "def-public.useChartTheme", - "type": "Function", - "tags": [], - "label": "useChartTheme", - "description": [], - "signature": [ - "() => ", - "RecursivePartial", - "<", - "Theme", - ">[]" - ], - "path": "x-pack/plugins/observability/public/hooks/use_chart_theme.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [], - "returnComment": [], - "initialIsOpen": false - }, - { - "parentPluginId": "observability", - "id": "def-public.useEsSearch", - "type": "Function", - "tags": [], - "label": "useEsSearch", - "description": [], - "signature": [ - "(params: TParams, fnDeps: any[], options: { inspector?: ", - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.IInspectorInfo", - "text": "IInspectorInfo" - }, - " | undefined; name: string; }) => { data: ", - { - "pluginId": "@kbn/es-types", - "scope": "common", - "docId": "kibKbnEsTypesPluginApi", - "section": "def-common.ESSearchResponse", - "text": "ESSearchResponse" - }, - "; loading: boolean; }" - ], - "path": "x-pack/plugins/observability/public/hooks/use_es_search.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "observability", - "id": "def-public.useEsSearch.$1", - "type": "Uncategorized", - "tags": [], - "label": "params", - "description": [], - "signature": [ - "TParams" - ], - "path": "x-pack/plugins/observability/public/hooks/use_es_search.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "observability", - "id": "def-public.useEsSearch.$2", - "type": "Array", - "tags": [], - "label": "fnDeps", - "description": [], - "signature": [ - "any[]" - ], - "path": "x-pack/plugins/observability/public/hooks/use_es_search.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "observability", - "id": "def-public.useEsSearch.$3", - "type": "Object", - "tags": [], - "label": "options", - "description": [], - "path": "x-pack/plugins/observability/public/hooks/use_es_search.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "observability", - "id": "def-public.useEsSearch.$3.inspector", - "type": "Object", - "tags": [], - "label": "inspector", - "description": [], - "signature": [ - { - "pluginId": "data", - "scope": "common", - "docId": "kibDataSearchPluginApi", - "section": "def-common.IInspectorInfo", - "text": "IInspectorInfo" - }, - " | undefined" - ], - "path": "x-pack/plugins/observability/public/hooks/use_es_search.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "observability", - "id": "def-public.useEsSearch.$3.name", - "type": "string", - "tags": [], - "label": "name", - "description": [], - "path": "x-pack/plugins/observability/public/hooks/use_es_search.ts", - "deprecated": false, - "trackAdoption": false - } - ] - } - ], - "returnComment": [], - "initialIsOpen": false - }, - { - "parentPluginId": "observability", - "id": "def-public.useFetcher", - "type": "Function", - "tags": [], - "label": "useFetcher", - "description": [], - "signature": [ - "(fn: ({}: { signal: AbortSignal; }) => TReturn, fnDeps: any[], options: { preservePreviousData?: boolean | undefined; }) => ", - "FetcherResult", - "> & { refetch: () => void; }" - ], - "path": "x-pack/plugins/observability/public/hooks/use_fetcher.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "observability", - "id": "def-public.useFetcher.$1", - "type": "Function", - "tags": [], - "label": "fn", - "description": [], - "signature": [ - "({}: { signal: AbortSignal; }) => TReturn" - ], - "path": "x-pack/plugins/observability/public/hooks/use_fetcher.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "observability", - "id": "def-public.useFetcher.$2", - "type": "Array", - "tags": [], - "label": "fnDeps", - "description": [], - "signature": [ - "any[]" - ], - "path": "x-pack/plugins/observability/public/hooks/use_fetcher.tsx", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "observability", - "id": "def-public.useFetcher.$3", - "type": "Object", - "tags": [], - "label": "options", - "description": [], - "path": "x-pack/plugins/observability/public/hooks/use_fetcher.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "observability", - "id": "def-public.useFetcher.$3.preservePreviousData", - "type": "CompoundType", - "tags": [], - "label": "preservePreviousData", - "description": [], - "signature": [ - "boolean | undefined" - ], - "path": "x-pack/plugins/observability/public/hooks/use_fetcher.tsx", - "deprecated": false, - "trackAdoption": false - } - ] - } - ], - "returnComment": [], - "initialIsOpen": false - }, - { - "parentPluginId": "observability", - "id": "def-public.useInspectorContext", - "type": "Function", - "tags": [], - "label": "useInspectorContext", - "description": [], - "signature": [ - "() => ", - "InspectorContextValue" + "tags": [], + "label": "props", + "description": [], + "signature": [ + "P" + ], + "path": "node_modules/@types/react/index.d.ts", + "deprecated": false, + "trackAdoption": false + } ], - "path": "x-pack/plugins/observability/public/context/inspector/use_inspector_context.tsx", - "deprecated": false, - "trackAdoption": false, - "children": [], - "returnComment": [], "initialIsOpen": false }, { "parentPluginId": "observability", - "id": "def-public.useLinkProps", + "id": "def-public.ObservabilityAlertSearchBar", "type": "Function", "tags": [], - "label": "useLinkProps", + "label": "ObservabilityAlertSearchBar", "description": [], "signature": [ - "({ app, pathname, hash, search }: ", - { - "pluginId": "observability", - "scope": "public", - "docId": "kibObservabilityPluginApi", - "section": "def-public.LinkDescriptor", - "text": "LinkDescriptor" - }, - ", options?: ", - "Options", - ") => ", - "LinkProps" + "(props: ", + "ObservabilityAlertSearchBarProps", + ") => JSX.Element" ], - "path": "x-pack/plugins/observability/public/hooks/use_link_props.ts", + "path": "x-pack/plugins/observability/public/components/alert_search_bar/get_alert_search_bar_lazy.tsx", "deprecated": false, "trackAdoption": false, "children": [ { "parentPluginId": "observability", - "id": "def-public.useLinkProps.$1", - "type": "Object", - "tags": [], - "label": "{ app, pathname, hash, search }", - "description": [], - "signature": [ - { - "pluginId": "observability", - "scope": "public", - "docId": "kibObservabilityPluginApi", - "section": "def-public.LinkDescriptor", - "text": "LinkDescriptor" - } - ], - "path": "x-pack/plugins/observability/public/hooks/use_link_props.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "observability", - "id": "def-public.useLinkProps.$2", + "id": "def-public.ObservabilityAlertSearchBar.$1", "type": "Object", "tags": [], - "label": "options", + "label": "props", "description": [], "signature": [ - "Options" + "ObservabilityAlertSearchBarProps" ], - "path": "x-pack/plugins/observability/public/hooks/use_link_props.ts", + "path": "x-pack/plugins/observability/public/components/alert_search_bar/get_alert_search_bar_lazy.tsx", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -1705,25 +705,36 @@ }, { "parentPluginId": "observability", - "id": "def-public.useTheme", + "id": "def-public.toQuery", "type": "Function", "tags": [], - "label": "useTheme", + "label": "toQuery", "description": [], "signature": [ - "() => ", - { - "pluginId": "kibanaReact", - "scope": "common", - "docId": "kibKibanaReactPluginApi", - "section": "def-common.EuiTheme", - "text": "EuiTheme" - } + "(search: string | undefined) => ", + "ParsedQuery", + "" ], - "path": "x-pack/plugins/observability/public/hooks/use_theme.tsx", + "path": "x-pack/plugins/observability/public/utils/url.ts", "deprecated": false, "trackAdoption": false, - "children": [], + "children": [ + { + "parentPluginId": "observability", + "id": "def-public.toQuery.$1", + "type": "string", + "tags": [], + "label": "search", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "x-pack/plugins/observability/public/utils/url.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], "returnComment": [], "initialIsOpen": false }, @@ -1750,23 +761,6 @@ "children": [], "returnComment": [], "initialIsOpen": false - }, - { - "parentPluginId": "observability", - "id": "def-public.useTimeZone", - "type": "Function", - "tags": [], - "label": "useTimeZone", - "description": [], - "signature": [ - "() => string" - ], - "path": "x-pack/plugins/observability/public/hooks/use_time_zone.ts", - "deprecated": false, - "trackAdoption": false, - "children": [], - "returnComment": [], - "initialIsOpen": false } ], "interfaces": [ @@ -2528,73 +1522,6 @@ ], "initialIsOpen": false }, - { - "parentPluginId": "observability", - "id": "def-public.LinkDescriptor", - "type": "Interface", - "tags": [], - "label": "LinkDescriptor", - "description": [], - "path": "x-pack/plugins/observability/public/hooks/use_link_props.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "observability", - "id": "def-public.LinkDescriptor.app", - "type": "string", - "tags": [], - "label": "app", - "description": [], - "path": "x-pack/plugins/observability/public/hooks/use_link_props.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "observability", - "id": "def-public.LinkDescriptor.pathname", - "type": "string", - "tags": [], - "label": "pathname", - "description": [], - "signature": [ - "string | undefined" - ], - "path": "x-pack/plugins/observability/public/hooks/use_link_props.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "observability", - "id": "def-public.LinkDescriptor.hash", - "type": "string", - "tags": [], - "label": "hash", - "description": [], - "signature": [ - "string | undefined" - ], - "path": "x-pack/plugins/observability/public/hooks/use_link_props.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "observability", - "id": "def-public.LinkDescriptor.search", - "type": "Object", - "tags": [], - "label": "search", - "description": [], - "signature": [ - "Search | undefined" - ], - "path": "x-pack/plugins/observability/public/hooks/use_link_props.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, { "parentPluginId": "observability", "id": "def-public.LogsFetchDataResponse", @@ -2982,74 +1909,6 @@ ], "initialIsOpen": false }, - { - "parentPluginId": "observability", - "id": "def-public.NavigationSection", - "type": "Interface", - "tags": [], - "label": "NavigationSection", - "description": [], - "path": "x-pack/plugins/observability/public/services/navigation_registry.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "observability", - "id": "def-public.NavigationSection.label", - "type": "string", - "tags": [], - "label": "label", - "description": [], - "signature": [ - "string | undefined" - ], - "path": "x-pack/plugins/observability/public/services/navigation_registry.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "observability", - "id": "def-public.NavigationSection.sortKey", - "type": "number", - "tags": [], - "label": "sortKey", - "description": [], - "path": "x-pack/plugins/observability/public/services/navigation_registry.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "observability", - "id": "def-public.NavigationSection.entries", - "type": "Array", - "tags": [], - "label": "entries", - "description": [], - "signature": [ - "NavigationEntry", - "[]" - ], - "path": "x-pack/plugins/observability/public/services/navigation_registry.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "observability", - "id": "def-public.NavigationSection.isBetaFeature", - "type": "CompoundType", - "tags": [], - "label": "isBetaFeature", - "description": [], - "signature": [ - "boolean | undefined" - ], - "path": "x-pack/plugins/observability/public/services/navigation_registry.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, { "parentPluginId": "observability", "id": "def-public.ObservabilityFetchDataResponse", @@ -4479,7 +3338,7 @@ "tags": [], "label": "UXMetrics", "description": [], - "path": "x-pack/plugins/observability/public/components/shared/core_web_vitals/index.tsx", + "path": "x-pack/plugins/observability/public/components/core_web_vitals/core_vitals.tsx", "deprecated": false, "trackAdoption": false, "children": [ @@ -4493,7 +3352,7 @@ "signature": [ "number | null" ], - "path": "x-pack/plugins/observability/public/components/shared/core_web_vitals/index.tsx", + "path": "x-pack/plugins/observability/public/components/core_web_vitals/core_vitals.tsx", "deprecated": false, "trackAdoption": false }, @@ -4507,7 +3366,7 @@ "signature": [ "number | null | undefined" ], - "path": "x-pack/plugins/observability/public/components/shared/core_web_vitals/index.tsx", + "path": "x-pack/plugins/observability/public/components/core_web_vitals/core_vitals.tsx", "deprecated": false, "trackAdoption": false }, @@ -4521,7 +3380,7 @@ "signature": [ "number | null | undefined" ], - "path": "x-pack/plugins/observability/public/components/shared/core_web_vitals/index.tsx", + "path": "x-pack/plugins/observability/public/components/core_web_vitals/core_vitals.tsx", "deprecated": false, "trackAdoption": false }, @@ -4532,7 +3391,7 @@ "tags": [], "label": "tbt", "description": [], - "path": "x-pack/plugins/observability/public/components/shared/core_web_vitals/index.tsx", + "path": "x-pack/plugins/observability/public/components/core_web_vitals/core_vitals.tsx", "deprecated": false, "trackAdoption": false }, @@ -4546,7 +3405,7 @@ "signature": [ "number | null | undefined" ], - "path": "x-pack/plugins/observability/public/components/shared/core_web_vitals/index.tsx", + "path": "x-pack/plugins/observability/public/components/core_web_vitals/core_vitals.tsx", "deprecated": false, "trackAdoption": false }, @@ -4557,7 +3416,7 @@ "tags": [], "label": "coreVitalPages", "description": [], - "path": "x-pack/plugins/observability/public/components/shared/core_web_vitals/index.tsx", + "path": "x-pack/plugins/observability/public/components/core_web_vitals/core_vitals.tsx", "deprecated": false, "trackAdoption": false }, @@ -4571,7 +3430,7 @@ "signature": [ "number[]" ], - "path": "x-pack/plugins/observability/public/components/shared/core_web_vitals/index.tsx", + "path": "x-pack/plugins/observability/public/components/core_web_vitals/core_vitals.tsx", "deprecated": false, "trackAdoption": false }, @@ -4585,7 +3444,7 @@ "signature": [ "number[]" ], - "path": "x-pack/plugins/observability/public/components/shared/core_web_vitals/index.tsx", + "path": "x-pack/plugins/observability/public/components/core_web_vitals/core_vitals.tsx", "deprecated": false, "trackAdoption": false }, @@ -4599,7 +3458,7 @@ "signature": [ "number[]" ], - "path": "x-pack/plugins/observability/public/components/shared/core_web_vitals/index.tsx", + "path": "x-pack/plugins/observability/public/components/core_web_vitals/core_vitals.tsx", "deprecated": false, "trackAdoption": false } @@ -4607,64 +3466,8 @@ "initialIsOpen": false } ], - "enums": [ - { - "parentPluginId": "observability", - "id": "def-public.FETCH_STATUS", - "type": "Enum", - "tags": [], - "label": "FETCH_STATUS", - "description": [], - "path": "x-pack/plugins/observability/public/hooks/use_fetcher.tsx", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - } - ], + "enums": [], "misc": [ - { - "parentPluginId": "observability", - "id": "def-public.AddInspectorRequest", - "type": "Type", - "tags": [], - "label": "AddInspectorRequest", - "description": [], - "signature": [ - "(result: ", - "FetcherResult", - "<{ mainStatisticsData?: { _inspect?: ", - "InspectResponse", - " | undefined; } | undefined; _inspect?: ", - "InspectResponse", - " | undefined; }>) => void" - ], - "path": "x-pack/plugins/observability/public/context/inspector/inspector_context.tsx", - "deprecated": false, - "trackAdoption": false, - "returnComment": [], - "children": [ - { - "parentPluginId": "observability", - "id": "def-public.AddInspectorRequest.$1", - "type": "Object", - "tags": [], - "label": "result", - "description": [], - "signature": [ - "FetcherResult", - "<{ mainStatisticsData?: { _inspect?: ", - "InspectResponse", - " | undefined; } | undefined; _inspect?: ", - "InspectResponse", - " | undefined; }>" - ], - "path": "x-pack/plugins/observability/public/context/inspector/inspector_context.tsx", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, { "parentPluginId": "observability", "id": "def-public.apmServiceGroupMaxNumberOfServices", @@ -4856,27 +3659,6 @@ ], "initialIsOpen": false }, - { - "parentPluginId": "observability", - "id": "def-public.LazyObservabilityPageTemplateProps", - "type": "Type", - "tags": [], - "label": "LazyObservabilityPageTemplateProps", - "description": [], - "signature": [ - "Pick<", - "KibanaPageTemplateProps", - ", \"children\" | \"paddingSize\" | \"data-test-subj\" | \"pageHeader\" | \"restrictWidth\" | \"isEmptyState\" | \"noDataConfig\"> & { showSolutionNav?: boolean | undefined; isPageDataLoaded?: boolean | undefined; pageSectionProps?: ", - "EuiPageSectionProps", - " | undefined; bottomBar?: React.ReactNode; bottomBarProps?: ", - "_EuiPageBottomBarProps", - " | undefined; }" - ], - "path": "x-pack/plugins/observability/public/components/shared/page_template/lazy_page_template.tsx", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, { "parentPluginId": "observability", "id": "def-public.NumberOrNull", @@ -5008,44 +3790,6 @@ "trackAdoption": false, "initialIsOpen": false }, - { - "parentPluginId": "observability", - "id": "def-public.SectionLinkProps", - "type": "Type", - "tags": [], - "label": "SectionLinkProps", - "description": [], - "signature": [ - "CommonProps", - " & Omit<(", - "DisambiguateSet", - "<(", - "DisambiguateSet", - ", Omit, \"href\">> & Omit, \"href\">) | (", - "DisambiguateSet", - ", \"href\">, React.ButtonHTMLAttributes> & React.ButtonHTMLAttributes), React.HTMLAttributes> & React.HTMLAttributes) | (", - "DisambiguateSet", - ", (", - "DisambiguateSet", - ", Omit, \"href\">> & Omit, \"href\">) | (", - "DisambiguateSet", - ", \"href\">, React.ButtonHTMLAttributes> & React.ButtonHTMLAttributes)> & ((", - "DisambiguateSet", - ", Omit, \"href\">> & Omit, \"href\">) | (", - "DisambiguateSet", - ", \"href\">, React.ButtonHTMLAttributes> & React.ButtonHTMLAttributes))), \"color\" | \"onClick\" | \"rel\" | \"target\"> & { size?: \"m\" | \"s\" | \"xs\" | \"l\" | undefined; color?: \"text\" | \"subdued\" | \"primary\" | undefined; label: React.ReactNode; isActive?: boolean | undefined; isDisabled?: boolean | undefined; href?: string | undefined; target?: string | undefined; rel?: string | undefined; iconType?: ", - "IconType", - " | undefined; iconProps?: Omit<", - "EuiIconProps", - ", \"type\"> | undefined; icon?: React.ReactElement> | undefined; showToolTip?: boolean | undefined; extraAction?: ", - "EuiListGroupItemExtraActionProps", - " | undefined; onClick?: React.MouseEventHandler | undefined; wrapText?: boolean | undefined; buttonRef?: React.Ref | undefined; toolTipText?: string | undefined; }" - ], - "path": "x-pack/plugins/observability/public/components/shared/action_menu/index.tsx", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, { "parentPluginId": "observability", "id": "def-public.StringOrNull", @@ -5159,7 +3903,13 @@ "text": "ObservabilityRuleTypeFormatter" }, " | undefined; list: () => string[]; }; useRulesLink: (options?: ", - "Options", + { + "pluginId": "observabilityShared", + "scope": "public", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-public.Options", + "text": "Options" + }, ") => ", "LinkProps", "; rulesLocator: ", @@ -5225,7 +3975,13 @@ "text": "ObservabilityRuleTypeFormatter" }, " | undefined; list: () => string[]; }; useRulesLink: (options?: ", - "Options", + { + "pluginId": "observabilityShared", + "scope": "public", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-public.Options", + "text": "Options" + }, ") => ", "LinkProps", "; }" diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index 009075e686bf9..86dc7fcd96533 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-05-18 +date: 2023-05-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/actionable-observability](https://github.com/orgs/elastic/team | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 546 | 43 | 540 | 25 | +| 472 | 43 | 466 | 14 | ## Client @@ -37,9 +37,6 @@ Contact [@elastic/actionable-observability](https://github.com/orgs/elastic/team ### Interfaces -### Enums - - ### Consts, variables and types diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx index f55ad2fb4e88c..fd978561af909 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-05-18 +date: 2023-05-19 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 23bd430223149..f9d6adc9005ca 100644 --- a/api_docs/observability_shared.mdx +++ b/api_docs/observability_shared.mdx @@ -8,14 +8,14 @@ slug: /kibana-dev-docs/api/observabilityShared title: "observabilityShared" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityShared plugin -date: 2023-05-18 +date: 2023-05-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityShared'] --- import observabilitySharedObj from './observability_shared.devdocs.json'; -Contact [@elastic/actionable-observability](https://github.com/orgs/elastic/teams/actionable-observability) for questions regarding this plugin. +Contact [@elastic/observability-ui](https://github.com/orgs/elastic/teams/observability-ui) for questions regarding this plugin. **Code health stats** diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index 136fb4dc0c5a1..d79159ed3c545 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-05-18 +date: 2023-05-19 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 8134402908c06..935c90c9fd8f9 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-05-18 +date: 2023-05-19 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -15,13 +15,13 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Count | Plugins or Packages with a
public API | Number of teams | |--------------|----------|------------------------| -| 615 | 508 | 37 | +| 615 | 508 | 38 | ### Public API health stats | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 69637 | 520 | 60003 | 1356 | +| 69569 | 520 | 59933 | 1345 | ## Plugin Directory @@ -92,7 +92,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-gis](https://github.com/orgs/elastic/teams/kibana-gis) | The file upload plugin contains components and services for uploading a file, analyzing its data, and then importing the data into an Elasticsearch index. Supported file types include CSV, TSV, newline-delimited JSON and GeoJSON. | 62 | 0 | 62 | 2 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | File upload, download, sharing, and serving over HTTP implementation in Kibana. | 239 | 0 | 24 | 9 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Simple UI for managing files in Kibana | 2 | 1 | 2 | 0 | -| | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | - | 1121 | 3 | 1016 | 31 | +| | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | - | 1122 | 3 | 1017 | 31 | | ftrApis | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 0 | 0 | 0 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 68 | 0 | 14 | 5 | | globalSearchBar | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 0 | 0 | 0 | 0 | @@ -129,9 +129,9 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 34 | 0 | 34 | 2 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 17 | 0 | 17 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 1 | -| | [@elastic/actionable-observability](https://github.com/orgs/elastic/teams/actionable-observability) | - | 546 | 43 | 540 | 25 | +| | [@elastic/actionable-observability](https://github.com/orgs/elastic/teams/actionable-observability) | - | 472 | 43 | 466 | 14 | | | [@elastic/apm-ui](https://github.com/orgs/elastic/teams/apm-ui) | - | 7 | 0 | 7 | 0 | -| | [@elastic/actionable-observability](https://github.com/orgs/elastic/teams/actionable-observability) | - | 266 | 1 | 265 | 11 | +| | [@elastic/observability-ui](https://github.com/orgs/elastic/teams/observability-ui) | - | 266 | 1 | 265 | 11 | | | [@elastic/security-defend-workflows](https://github.com/orgs/elastic/teams/security-defend-workflows) | - | 22 | 0 | 22 | 6 | | painlessLab | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 0 | 0 | 0 | 0 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | The Presentation Utility Plugin is a set of common, shared components and toolkits for solutions within the Presentation space, (e.g. Dashboards, Canvas). | 218 | 8 | 164 | 11 | @@ -308,8 +308,8 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 7 | 0 | 7 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 26 | 6 | 26 | 1 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 8 | 0 | 8 | 1 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 440 | 1 | 176 | 0 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 56 | 0 | 50 | 6 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 444 | 1 | 178 | 0 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 57 | 0 | 51 | 6 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 41 | 0 | 40 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 4 | 0 | 2 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 3 | 0 | 3 | 0 | diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index 99a2f88630fc6..cd5cdf3ee652b 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-05-18 +date: 2023-05-19 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 47e09c9f69ab0..cd8e9285a19ed 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-05-18 +date: 2023-05-19 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 5c6aae21054e9..a61dd1609be0f 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-05-18 +date: 2023-05-19 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 8d9521e5f79a6..38b329b523a9b 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-05-18 +date: 2023-05-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'reporting'] --- import reportingObj from './reporting.devdocs.json'; diff --git a/api_docs/rollup.mdx b/api_docs/rollup.mdx index 001878a5b7212..0ab5a8eb38482 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-05-18 +date: 2023-05-19 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 f531c3a08e99b..ebd7baa1fb2fe 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-05-18 +date: 2023-05-19 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 4fe2958268071..e6fafd5246405 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-05-18 +date: 2023-05-19 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 68ce2a73a59a8..03718facbd457 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-05-18 +date: 2023-05-19 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 3b0e770733da3..916bf62e668d2 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-05-18 +date: 2023-05-19 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 c4d8acb5b6751..d8e722619e8e7 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-05-18 +date: 2023-05-19 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 580196f43c34c..e52608e4bbdda 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-05-18 +date: 2023-05-19 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 5f8d770fe82aa..52b564148f624 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-05-18 +date: 2023-05-19 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 2c97e70a79fff..b6ba0c9d3ff7b 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-05-18 +date: 2023-05-19 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 98cb5ed971124..b3f18e1a3f730 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-05-18 +date: 2023-05-19 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 c7e15b03b9f47..a89d0deebe664 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-05-18 +date: 2023-05-19 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 5f71e4f66e675..d35985b87f4ca 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-05-18 +date: 2023-05-19 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 ce662b8cb999f..f5b607cc8f403 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-05-18 +date: 2023-05-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.devdocs.json'; diff --git a/api_docs/serverless.mdx b/api_docs/serverless.mdx index 4c26a5142bece..b3b7b04a0e1fb 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-05-18 +date: 2023-05-19 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 d295f8d09aed7..8282fa167bf30 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-05-18 +date: 2023-05-19 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 b1906a9248940..3c2ccb527e837 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-05-18 +date: 2023-05-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessSearch'] --- import serverlessSearchObj from './serverless_search.devdocs.json'; diff --git a/api_docs/serverless_security.mdx b/api_docs/serverless_security.mdx index c25a93feba466..71f3a40a49902 100644 --- a/api_docs/serverless_security.mdx +++ b/api_docs/serverless_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessSecurity title: "serverlessSecurity" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessSecurity plugin -date: 2023-05-18 +date: 2023-05-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessSecurity'] --- import serverlessSecurityObj from './serverless_security.devdocs.json'; diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index c16e9d3204db7..599c470e2ffce 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-05-18 +date: 2023-05-19 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 4c5a26d02f563..e48c0c21f38d5 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-05-18 +date: 2023-05-19 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 130c7ad10da61..7c82815b772d0 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-05-18 +date: 2023-05-19 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 fda9063a4e19a..58eb2a909094d 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-05-18 +date: 2023-05-19 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 7e9ec57f4cc5f..1867ee263fbea 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-05-18 +date: 2023-05-19 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 21a5898282e6a..16771e63e97ac 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-05-18 +date: 2023-05-19 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 230c04c91d962..a85849d1bbad2 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-05-18 +date: 2023-05-19 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 67e3ddb5b99ed..83cae7bc76896 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-05-18 +date: 2023-05-19 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 e1cc662e4bd1b..6d0d8855c6e69 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-05-18 +date: 2023-05-19 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 b97a41efd27b9..54d848833a324 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-05-18 +date: 2023-05-19 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 f25e3376bcdb7..e860a9f4a61b5 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-05-18 +date: 2023-05-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index 3ee91b5f9afdd..d4b516a5cd4d5 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-05-18 +date: 2023-05-19 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 0cc2f86188901..847575a2bed83 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-05-18 +date: 2023-05-19 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 feae321089fee..d798f2efcff2e 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-05-18 +date: 2023-05-19 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 02a0777e1ecca..01887fa665204 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-05-18 +date: 2023-05-19 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 f40bcba70f7b5..cf758b15af74f 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-05-18 +date: 2023-05-19 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 e0f8c1b2597fc..a931bc052e6ba 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-05-18 +date: 2023-05-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] --- import uiActionsEnhancedObj from './ui_actions_enhanced.devdocs.json'; diff --git a/api_docs/unified_field_list.mdx b/api_docs/unified_field_list.mdx index 929745df3aecf..cbc85ecba9fcd 100644 --- a/api_docs/unified_field_list.mdx +++ b/api_docs/unified_field_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedFieldList title: "unifiedFieldList" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedFieldList plugin -date: 2023-05-18 +date: 2023-05-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedFieldList'] --- import unifiedFieldListObj from './unified_field_list.devdocs.json'; diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx index 4f7e769f2c12c..2ed57139aba67 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-05-18 +date: 2023-05-19 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 ea3683b4a1034..4d7364badef54 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-05-18 +date: 2023-05-19 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 ff787e89f0093..fd3fd09c75b5b 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-05-18 +date: 2023-05-19 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 8259cfd84a742..87624337e1399 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-05-18 +date: 2023-05-19 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 1ef6c6e1c7088..baebc9948121f 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-05-18 +date: 2023-05-19 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 5e7501ffa7514..d270bc3729800 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-05-18 +date: 2023-05-19 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 2b97554fb8ebd..f80c42a6ad5b2 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-05-18 +date: 2023-05-19 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 860bbbd032fdd..0275e9847055b 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-05-18 +date: 2023-05-19 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 8e2be13f5a172..bd49daaab6c7f 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-05-18 +date: 2023-05-19 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 dbec9af7f8513..d05dd02300a24 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-05-18 +date: 2023-05-19 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 e869f7630a3e4..98e794512d08f 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-05-18 +date: 2023-05-19 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 b042ce954abcc..ffde51d2b16b9 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-05-18 +date: 2023-05-19 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 f8134bd574f76..0c8be78752940 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-05-18 +date: 2023-05-19 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 97a1dc9041209..ad1b36fcd49e2 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-05-18 +date: 2023-05-19 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 255c6b947fde5..3bf6974a2b30b 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-05-18 +date: 2023-05-19 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 756a51bbdd909..641cedcdee1ee 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-05-18 +date: 2023-05-19 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 a6a23117d2c8e..290b263b3462a 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-05-18 +date: 2023-05-19 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 efec5d69d80d6..44a2c2f1c3de0 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-05-18 +date: 2023-05-19 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; From e0d2bf29b9f74e3f8019d68255b017baba4cfec9 Mon Sep 17 00:00:00 2001 From: Ahmad Bamieh Date: Fri, 19 May 2023 11:44:53 +0300 Subject: [PATCH 69/78] [i18n] Integrate 8.8.0 Translations (#158088) --- .../translations/translations/fr-FR.json | 5437 ++++++++++++----- .../translations/translations/ja-JP.json | 3987 +++++++++--- .../translations/translations/zh-CN.json | 4158 ++++++++++--- 3 files changed, 10032 insertions(+), 3550 deletions(-) diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index ae474ff8410f2..6c067329f4556 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -81,11 +81,11 @@ "advancedSettings.field.defaultValueTypeJsonText": "Par défaut : {value}", "advancedSettings.field.deprecationClickAreaLabel": "Cliquez ici pour afficher la documentation de déclassement pour {settingName}.", "advancedSettings.field.resetToDefaultLinkAriaLabel": "Réinitialiser {ariaName} à la valeur par défaut", - "advancedSettings.form.countOfSettingsChanged": "{unsavedCount} {unsavedCount, plural, one {paramètre non enregistré} other {paramètres non enregistrés}}{hiddenCount, plural, =0 {} other {, # masqué(s)}}", + "advancedSettings.form.countOfSettingsChanged": "{unsavedCount} {unsavedCount, plural, one {paramètre} many {paramètres} other {paramètres}} non enregistré(s){hiddenCount, plural, =0 {} one {, # masqué} many {, # masqués} other {, # masqués}}", "advancedSettings.form.noSearchResultText": "Aucun paramètre trouvé pour {queryText} {clearSearch}", "advancedSettings.form.searchResultText": "Les termes de la recherche masquent {settingsCount} paramètres {clearSearch}", - "advancedSettings.voiceAnnouncement.noSearchResultScreenReaderMessage": "Il {optionLenght, plural, one {y a # option} other {y a # options}} dans {sectionLenght, plural, one {# section} other {# sections}}", - "advancedSettings.voiceAnnouncement.searchResultScreenReaderMessage": "Vous avez recherché {query}. Il {optionLenght, plural, one {y a # option} other {y a # options}} dans {sectionLenght, plural, one {# section} other {# sections}}", + "advancedSettings.voiceAnnouncement.noSearchResultScreenReaderMessage": "Il {optionLenght, plural, one {y a # option} many {y a # options} other {y a # options}} dans {sectionLenght, plural, one {# section} many {# sections} other {# sections}}", + "advancedSettings.voiceAnnouncement.searchResultScreenReaderMessage": "Vous avez recherché {query}. Il {optionLenght, plural, one {y a # option} many {y a # options} other {y a # options}} dans {sectionLenght, plural, one {# section} many {# sections} other {# sections}}", "advancedSettings.advancedSettingsLabel": "Paramètres avancés", "advancedSettings.badge.readOnly.text": "Lecture seule", "advancedSettings.badge.readOnly.tooltip": "Impossible d’enregistrer les paramètres avancés", @@ -104,6 +104,8 @@ "advancedSettings.categoryNames.timelionLabel": "Timelion", "advancedSettings.categoryNames.visualizationsLabel": "Visualisations", "advancedSettings.categorySearchLabel": "Catégorie", + "advancedSettings.defaultSpaceCalloutSubtitle": "Les modifications seront uniquement appliquées à l'espace actuel. Ces paramètres sont destinés aux utilisateurs avancés, car des configurations incorrectes peuvent avoir une incidence négative sur des aspects de Kibana.", + "advancedSettings.defaultSpaceCalloutTitle": "Les modifications affecteront l'espace \"par défaut\"", "advancedSettings.featureCatalogueTitle": "Personnalisez votre expérience Kibana : modifiez le format de date, activez le mode sombre, et bien plus encore.", "advancedSettings.field.changeImageLinkText": "Modifier l'image", "advancedSettings.field.codeEditorSyntaxErrorMessage": "Syntaxe JSON non valide", @@ -125,13 +127,17 @@ "advancedSettings.form.saveButtonLabel": "Enregistrer les modifications", "advancedSettings.form.saveButtonTooltipWithInvalidChanges": "Corrigez les paramètres non valides avant d'enregistrer.", "advancedSettings.form.saveErrorMessage": "Enregistrement impossible", + "advancedSettings.globalCalloutSubtitle": "Les modifications seront appliquées à tous les utilisateurs dans l'ensemble des espaces. Cela inclut les utilisateurs Kibana natifs et les utilisateurs qui se connectent via l'authentification unique.", + "advancedSettings.globalCalloutTitle": "Les modifications auront une incidence sur tous les paramètres utilisateur dans l'ensemble des espaces", + "advancedSettings.globalSettingsTabTitle": "Paramètres généraux", "advancedSettings.pageTitle": "Paramètres", "advancedSettings.searchBar.unableToParseQueryErrorMessage": "Impossible d'analyser la requête", "advancedSettings.searchBarAriaLabel": "Rechercher dans les paramètres avancés", + "advancedSettings.spaceSettingsTabTitle": "Paramètres de l'espace", "advancedSettings.voiceAnnouncement.ariaLabel": "Informations de résultat des paramètres avancés", "autocomplete.conflictIndicesWarning.index.description": "{name} ({count} index)", "autocomplete.customOptionText": "Ajouter {searchValuePlaceholder} comme champ personnalisé", - "autocomplete.conflictIndicesWarning.description": "Ce champ est défini avec plusieurs types sur différents index.", + "autocomplete.conflictIndicesWarning.description": "Ce champ est défini avec différents types dans les index suivants ou il n'est pas mappé, ce qui peut entraîner des résultats inattendus lors des requêtes.", "autocomplete.conflictIndicesWarning.title": "Conflit de mapping", "autocomplete.fieldRequiredError": "Ce champ ne peut pas être vide.", "autocomplete.fieldSpaceWarning": "Avertissement : les espaces au début ou à la fin de cette valeur ne sont pas affichés.", @@ -149,13 +155,17 @@ "bfetch.disableBfetchDesc": "Désactive la mise en lot des requêtes. Cette option augmente le nombre de requêtes HTTP depuis Kibana, mais permet de les déboguer individuellement.", "bfetch.networkError": "Vérifiez votre connexion réseau et réessayez.", "cellActions.youAreInADialogContainingOptionsScreenReaderOnly": "Vous êtes dans une boîte de dialogue contenant des options pour le champ {fieldName}. Appuyez sur Tab pour naviguer entre les options. Appuyez sur Échap pour quitter.", + "cellActions.actions.copyToClipboard.displayName": "Copier dans le Presse-papiers", + "cellActions.actions.copyToClipboard.successMessage": "Copié dans le presse-papiers", + "cellActions.actions.filterIn": "Inclure", + "cellActions.actions.filterOut": "Exclure", "cellActions.actionsAriaLabel": "Actions", "cellActions.extraActionsAriaLabel": "Actions supplémentaires", "cellActions.showMoreActionsLabel": "Plus d'actions", "charts.advancedSettings.visualization.colorMappingText": "Mappe des valeurs à des couleurs spécifiques dans les graphiques avec la palette Compatibilité.", "charts.colorPicker.setColor.screenReaderDescription": "Définir la couleur pour la valeur {legendDataLabel}", "charts.functions.palette.args.colorHelpText": "Les couleurs de la palette. Accepte un nom de couleur {html}, {hex}, {hsl}, {hsla}, {rgb} ou {rgba}.", - "charts.warning.warningLabel": "{numberWarnings, number} {numberWarnings, plural, one {avertissement} other {avertissements}}", + "charts.warning.warningLabel": "{numberWarnings, number} {numberWarnings, plural, one {avertissement} many {avertissements} other {avertissements}}", "charts.advancedSettings.visualization.colorMappingTextDeprecation": "Ce paramètre est déclassé et ne sera plus compatible avec les futures versions.", "charts.advancedSettings.visualization.colorMappingTitle": "Mapping des couleurs", "charts.advancedSettings.visualization.useLegacyTimeAxis.description": "Active l'axe de temps hérité pour les graphiques dans Lens, Discover, Visualize et TSVB", @@ -179,7 +189,7 @@ "charts.noDataLabel": "Résultat introuvable", "charts.palettes.complimentaryLabel": "Gratuite", "charts.palettes.coolLabel": "Froide", - "charts.palettes.customLabel": "Personnalisé", + "charts.palettes.customLabel": "Personnalisée", "charts.palettes.defaultPaletteLabel": "Par défaut", "charts.palettes.grayLabel": "Gris", "charts.palettes.kibanaPaletteLabel": "Compatibilité", @@ -218,11 +228,11 @@ "coloring.dynamicColoring.palettePicker.colorRangesLabel": "Gammes de couleurs", "coloring.dynamicColoring.palettePicker.label": "Palette de couleurs", "coloring.dynamicColoring.rangeType.label": "Type de valeur", - "coloring.dynamicColoring.rangeType.number": "Nombre", + "coloring.dynamicColoring.rangeType.number": "Numéro", "coloring.dynamicColoring.rangeType.percent": "Pourcent", "console.helpPage.learnAboutConsoleAndQueryDslText": "En savoir plus sur {console} et {queryDsl}", "console.historyPage.itemOfRequestListAriaLabel": "Requête : {historyItem}", - "console.settingsPage.refreshInterval.everyNMinutesTimeInterval": "Toutes les {value} {value, plural, one {minute} other {minutes}}", + "console.settingsPage.refreshInterval.everyNMinutesTimeInterval": "Toutes les {value} {value, plural, one {minute} many {minutes} other {minutes}}", "console.variablesPage.descriptionText": "Définissez les variables et utilisez-les dans vos requêtes sous la forme {variable}.", "console.variablesPage.descriptionText.variableNameText": "{variableName}", "console.welcomePage.addCommentsDescription": "Pour utiliser un commentaire d'une seule ligne, utilisez {hash} ou {doubleSlash}. Pour un commentaire de plusieurs lignes, marquez le début avec {slashAsterisk} et la fin avec {asteriskSlash}.", @@ -234,16 +244,16 @@ "console.consoleDisplayName": "Console", "console.consoleMenu.copyAsCurlFailedMessage": "Impossible de copier la requête en tant que cURL", "console.consoleMenu.copyAsCurlMessage": "Requête copiée en tant que cURL", - "console.deprecations.enabled.manualStepOneMessage": "Ouvrir le fichier de configuration kibana.yml.", + "console.deprecations.enabled.manualStepOneMessage": "Ouvrez le fichier de configuration kibana.yml.", "console.deprecations.enabled.manualStepTwoMessage": "Remplacez le paramètre \"console.enabled\" par \"console.ui.enabled\".", "console.deprecations.enabledMessage": "Pour empêcher les utilisateurs d'accéder à l'interface utilisateur de la console, utilisez le paramètre \"console.ui.enabled\" au lieu de \"console.enabled\".", "console.deprecations.enabledTitle": "Le paramètre \"console.enabled\" est déclassé", - "console.deprecations.proxyConfig.manualStepOneMessage": "Ouvrir le fichier de configuration kibana.yml.", + "console.deprecations.proxyConfig.manualStepOneMessage": "Ouvrez le fichier de configuration kibana.yml.", "console.deprecations.proxyConfig.manualStepThreeMessage": "Configurez la connexion sécurisée entre Kibana et Elasticsearch à l'aide des paramètres \"server.ssl.*\".", "console.deprecations.proxyConfig.manualStepTwoMessage": "Supprimez le paramètre \"console.proxyConfig\".", "console.deprecations.proxyConfigMessage": "La configuration de \"console.proxyConfig\" est déclassée et sera supprimée dans la version 8.0.0. Pour sécuriser votre connexion entre Kibana et Elasticsearch, utilisez les paramètres \"server.ssl.*\" standards.", "console.deprecations.proxyConfigTitle": "Le paramètre \"console.proxyConfig\" est déclassé", - "console.deprecations.proxyFilter.manualStepOneMessage": "Ouvrir le fichier de configuration kibana.yml.", + "console.deprecations.proxyFilter.manualStepOneMessage": "Ouvrez le fichier de configuration kibana.yml.", "console.deprecations.proxyFilter.manualStepThreeMessage": "Configurez la connexion sécurisée entre Kibana et Elasticsearch à l'aide des paramètres \"server.ssl.*\".", "console.deprecations.proxyFilter.manualStepTwoMessage": "Supprimez le paramètre \"console.proxyFilter\".", "console.deprecations.proxyFilterMessage": "La configuration de \"console.proxyFilter\" est déclassée et sera supprimée dans la version 8.0.0. Pour sécuriser votre connexion entre Kibana et Elasticsearch, utilisez les paramètres \"server.ssl.*\" standards.", @@ -362,6 +372,7 @@ "contentManagement.contentEditor.metadataForm.nameInputLabel": "Nom", "contentManagement.contentEditor.metadataForm.nameIsEmptyError": "Nom obligatoire.", "contentManagement.contentEditor.metadataForm.tagsLabel": "Balises", + "contentManagement.tableList.actionsDisabledLabel": "Actions désactivées pour cet élément", "contentManagement.tableList.lastUpdatedColumnTitle": "Dernière mise à jour", "contentManagement.tableList.listing.deleteSelectedItemsConfirmModal.cancelButtonLabel": "Annuler", "contentManagement.tableList.listing.deleteSelectedItemsConfirmModal.confirmButtonLabel": "Supprimer", @@ -383,17 +394,17 @@ "contentManagement.tableList.tagFilterPanel.manageAllTagsLinkLabel": "Gérer les balises", "contentManagement.tableList.updatedDateUnknownLabel": "Dernière mise à jour inconnue", "controls.controlGroup.ariaActions.moveControlButtonAction": "Déplacer le contrôle {controlTitle}", - "controls.optionsList.controlAndPopover.exists": "{negate, plural, one {Existe} other {Existent}}", + "controls.optionsList.controlAndPopover.exists": "{negate, plural, one {Existe} many {Existent} other {Existent}}", "controls.optionsList.errors.dataViewNotFound": "Impossible de localiser la vue de données : {dataViewId}", "controls.optionsList.errors.fieldNotFound": "Impossible de localiser le champ : {fieldName}", "controls.optionsList.popover.ariaLabel": "Fenêtre contextuelle pour le contrôle {fieldName}", - "controls.optionsList.popover.cardinalityLabel": "{totalOptions, number} {totalOptions, plural, one {option} other {options}}", - "controls.optionsList.popover.documentCountScreenReaderText": "Apparaît dans {documentCount, number} {documentCount, plural, one {document} other {documents}}", - "controls.optionsList.popover.documentCountTooltip": "Cette valeur apparaît dans {documentCount, number} {documentCount, plural, one {document} other {documents}}", - "controls.optionsList.popover.invalidSelectionsAriaLabel": "{invalidSelectionCount, plural, one {Sélection ignorée} other {Sélections ignorées}} pour {fieldName}", - "controls.optionsList.popover.invalidSelectionsLabel": "{selectedOptions} {selectedOptions, plural, one {sélection ignorée} other {sélections ignorées}}", - "controls.optionsList.popover.invalidSelectionsSectionTitle": "{invalidSelectionCount, plural, one {Sélection ignorée} other {Sélections ignorées}}", - "controls.optionsList.popover.suggestionsAriaLabel": "{optionCount, plural, one {Option disponible} other {Options disponibles}} pour {fieldName}", + "controls.optionsList.popover.cardinalityLabel": "{totalOptions, number} {totalOptions, plural, one {option} many {options} other {options}}", + "controls.optionsList.popover.documentCountScreenReaderText": "Apparaît dans {documentCount, number} {documentCount, plural, one {document} many {documents} other {documents}}", + "controls.optionsList.popover.documentCountTooltip": "Cette valeur apparaît dans {documentCount, number} {documentCount, plural, one {document} many {documents} other {documents}}", + "controls.optionsList.popover.invalidSelectionsAriaLabel": "{invalidSelectionCount, plural, one {Sélection ignorée} many {Sélections ignorées} other {Sélections ignorées}} pour {fieldName}", + "controls.optionsList.popover.invalidSelectionsLabel": "{selectedOptions} {selectedOptions, plural, one {sélection ignorée} many {sélections ignorées} other {sélections ignorées}}", + "controls.optionsList.popover.invalidSelectionsSectionTitle": "{invalidSelectionCount, plural, one {Sélection ignorée} many {Sélections ignorées} other {Sélections ignorées}}", + "controls.optionsList.popover.suggestionsAriaLabel": "{optionCount, plural, one {option disponible} many {options disponibles} other {options disponibles}} pour {fieldName}", "controls.rangeSlider.errors.dataViewNotFound": "Impossible de localiser la vue de données : {dataViewId}", "controls.rangeSlider.errors.fieldNotFound": "Impossible de localiser le champ : {fieldName}", "controls.controlGroup.emptyState.addControlButtonTitle": "Ajouter un contrôle", @@ -516,12 +527,13 @@ "core.euiBasicTable.tablePagination": "Pagination pour le tableau : {tableCaption}", "core.euiBasicTable.tableSimpleAutoCaptionWithPagination": "Ce tableau contient {itemCount} lignes ; page {page} sur {pageCount}.", "core.euiBottomBar.customScreenReaderAnnouncement": "Il y a un nouveau repère de région appelé {landmarkHeading} avec des commandes de niveau de page à la fin du document.", + "core.euiCodeBlockAnnotations.ariaLabel": "Cliquez pour afficher une annotation de code pour la ligne {lineNumber}", "core.euiColorPickerSwatch.ariaLabel": "Sélectionner {color} comme couleur", "core.euiColorStops.screenReaderAnnouncement": "{label} : {readOnly} {disabled} Sélecteur d'arrêt de couleur. Chaque arrêt consiste en un nombre et en une valeur de couleur correspondante. Utilisez les flèches haut et bas pour sélectionner les arrêts. Appuyez sur Entrée pour créer un nouvel arrêt.", "core.euiColumnActions.sort": "Trier {schemaLabel}", "core.euiColumnSelector.buttonActivePlural": "{numberOfHiddenFields} colonnes masquées", "core.euiColumnSelector.buttonActiveSingular": "{numberOfHiddenFields} colonne masquée", - "core.euiColumnSorting.buttonActive": "{numberOfSortedFields, plural, one {# champ trié} other {# champs triés}}", + "core.euiColumnSorting.buttonActive": "{numberOfSortedFields, plural, one {Champ #} many {# champs triés} other {# champs triés}}", "core.euiColumnSortingDraggable.activeSortLabel": "{display} trie cette grille de données", "core.euiColumnSortingDraggable.removeSortLabel": "Retirer {display} du tri de la grille de données", "core.euiColumnSortingDraggable.toggleLegend": "Sélectionner la méthode de tri pour {display}", @@ -554,7 +566,7 @@ "core.euiNotificationEventReadIcon.unreadAria": "{eventName} non lu", "core.euiPagination.firstRangeAriaLabel": "Ignorer les pages 2 à {lastPage}", "core.euiPagination.lastRangeAriaLabel": "Ignorer les pages {firstPage} à {lastPage}", - "core.euiPagination.pageOfTotalCompressed": "{page} sur {total}", + "core.euiPagination.pageOfTotalCompressed": "{page} de {total}", "core.euiPaginationButton.longPageString": "Page {page} sur {totalPages}", "core.euiPaginationButton.shortPageString": "Page {page}", "core.euiPrettyDuration.durationRoundedToDay": "{prettyDuration} arrondie au jour", @@ -565,27 +577,27 @@ "core.euiPrettyDuration.durationRoundedToWeek": "{prettyDuration} arrondie à la semaine", "core.euiPrettyDuration.durationRoundedToYear": "{prettyDuration} arrondie à l'année", "core.euiPrettyDuration.fallbackDuration": "{displayFrom} à {displayTo}", - "core.euiPrettyDuration.lastDurationDays": "{duration, plural, one {# dernier jour} other {# derniers jours}}", - "core.euiPrettyDuration.lastDurationHours": "{duration, plural, one {# dernière heure} other {# dernières heures}}", - "core.euiPrettyDuration.lastDurationMinutes": "{duration, plural, one {# dernière minute} other {# dernières minutes}}", - "core.euiPrettyDuration.lastDurationMonths": "{duration, plural, one {# dernier mois} other {# derniers mois}}", - "core.euiPrettyDuration.lastDurationSeconds": "{duration, plural, one {# dernière seconde} other {# dernières secondes}}", - "core.euiPrettyDuration.lastDurationWeeks": "{duration, plural, one {# dernière semaine} other {# dernières semaines}}", - "core.euiPrettyDuration.lastDurationYears": "{duration, plural, one {# dernière année} other {# dernières années}}", - "core.euiPrettyDuration.nextDurationHours": "{duration, plural, one {# prochaine heure} other {# prochaines heures}}", - "core.euiPrettyDuration.nextDurationMinutes": "{duration, plural, one {# prochaine minute} other {# prochaines minutes}}", - "core.euiPrettyDuration.nextDurationMonths": "{duration, plural, one {# prochain mois} other {# prochains mois}}", - "core.euiPrettyDuration.nextDurationSeconds": "{duration, plural, one {# prochaine seconde} other {# prochaines secondes}}", - "core.euiPrettyDuration.nextDurationWeeks": "{duration, plural, one {# prochaine semaine} other {# prochaines semaines}}", - "core.euiPrettyDuration.nextDurationYears": "{duration, plural, one {# prochaine année} other {# prochaines années}}", - "core.euiPrettyDuration.nexttDurationDays": "{duration, plural, one {# prochain jour} other {# prochains jours}}", - "core.euiPrettyInterval.days": "{interval, plural, one {# jour} other {# jours}}", + "core.euiPrettyDuration.lastDurationDays": "{duration, plural, one {Dernier jour} many {# derniers jours} other {# derniers jours}}", + "core.euiPrettyDuration.lastDurationHours": "{duration, plural, one {Dernière heure} many {# dernières heures} other {# dernières heures}}", + "core.euiPrettyDuration.lastDurationMinutes": "{duration, plural, one {Dernière minute} many {# dernières minutes} other {# dernières minutes}}", + "core.euiPrettyDuration.lastDurationMonths": "{duration, plural, one {Dernier mois} many {# derniers mois} other {# derniers mois}}", + "core.euiPrettyDuration.lastDurationSeconds": "{duration, plural, one {Dernière seconde} many {# dernières secondes} other {# dernières secondes}}", + "core.euiPrettyDuration.lastDurationWeeks": "{duration, plural, one {Dernière semaine} many {# dernières semaines} other {# dernières semaines}}", + "core.euiPrettyDuration.lastDurationYears": "{duration, plural, one {Dernière année} many {# dernières années} other {# dernières années}}", + "core.euiPrettyDuration.nextDurationHours": "{duration, plural, one {Prochaine heure} many {# prochaines heures} other {# prochaines heures}}", + "core.euiPrettyDuration.nextDurationMinutes": "{duration, plural, one {Prochaine minute} many {# prochaines minutes} other {# prochaines minutes}}", + "core.euiPrettyDuration.nextDurationMonths": "{duration, plural, one {Prochain mois} many {# prochains mois} other {# prochains mois}}", + "core.euiPrettyDuration.nextDurationSeconds": "{duration, plural, one {Prochaine seconde} many {# prochaines secondes} other {# prochaines secondes}}", + "core.euiPrettyDuration.nextDurationWeeks": "{duration, plural, one {Prochaine semaine} many {# prochaines semaines} other {# prochaines semaines}}", + "core.euiPrettyDuration.nextDurationYears": "{duration, plural, one {Prochaine année} many {# prochaines années} other {# prochaines années}}", + "core.euiPrettyDuration.nexttDurationDays": "{duration, plural, one {Prochain jour} many {# prochains jours} other {# prochains jours}}", + "core.euiPrettyInterval.days": "{interval, plural, one {# jour} many {# jours} other {# jours}}", "core.euiPrettyInterval.daysShorthand": "{interval} j", - "core.euiPrettyInterval.hours": "{interval, plural, one {# heure} other {# heures}}", + "core.euiPrettyInterval.hours": "{interval, plural, one {# heure} many {# heures} other {# heures}}", "core.euiPrettyInterval.hoursShorthand": "{interval} h", - "core.euiPrettyInterval.minutes": "{interval, plural, one {# minute} other {# minutes}}", + "core.euiPrettyInterval.minutes": "{interval, plural, one {# minute} many {# minutes} other {# minutes}}", "core.euiPrettyInterval.minutesShorthand": "{interval} m", - "core.euiPrettyInterval.seconds": "{interval, plural, one {# seconde} other {# secondes}}", + "core.euiPrettyInterval.seconds": "{interval, plural, one {# seconde} many {# secondes} other {# secondes}}", "core.euiPrettyInterval.secondsShorthand": "{interval} s", "core.euiProgress.valueText": "{value} %", "core.euiQuickSelect.fullDescription": "Elle est actuellement définie sur {timeTense} {timeValue} {timeUnit}.", @@ -593,7 +605,9 @@ "core.euiRefreshInterval.fullDescriptionOn": "L'actualisation est activée, intervalle défini sur {optionValue} {optionText}.", "core.euiRelativeTab.fullDescription": "L'unité peut être modifiée. Elle est actuellement définie sur {unit}.", "core.euiSelectable.noMatchingOptions": "{searchValue} ne correspond à aucune option", - "core.euiSelectable.searchResults": "{resultsLength, plural, one {# résultat disponible} other {# résultats disponibles}}", + "core.euiSelectable.searchResults": "{resultsLength, plural, one {# résultat disponible} many {# résultats disponibles} other {# résultats disponibles}}", + "core.euiSkeletonLoading.loadedAriaText": "{contentAriaLabel} a été chargé", + "core.euiSkeletonLoading.loadingAriaText": "{contentAriaLabel} est en cours de chargement", "core.euiStepStrings.complete": "L'étape {number} : {title} est terminée", "core.euiStepStrings.current": "Étape actuelle {number} : {title}", "core.euiStepStrings.disabled": "L'étape {number} : {title} est désactivée", @@ -614,8 +628,10 @@ "core.euiTablePagination.rowsPerPageOption": "{rowsPerPage} lignes", "core.euiTourStepIndicator.ariaLabel": "Étape {number} {status}", "core.euiTreeView.ariaLabel": "{nodeLabel} enfant de {ariaLabel}", - "core.savedObjects.deprecations.unknownTypes.message": "{objectCount, plural, one {# objet} other {# objets}} avec des types inconnus {objectCount, plural, one {a été trouvé} other {ont été trouvés}} dans les index du système Kibana. La mise à niveau avec des types savedObject inconnus n'est plus compatible. Pour assurer la réussite des mises à niveau à l'avenir, réactivez les plug-ins ou supprimez ces documents dans les indices de Kibana", + "core.savedObjects.deprecations.unknownTypes.message": "{objectCount, plural, one {# objet} many {# objets} other {# objets}} avec des types inconnus {objectCount, plural, one {a été trouvé} many {ont été trouvés} other {ont été trouvés}} dans les index système Kibana. La mise à niveau avec des types savedObject inconnus n'est plus compatible. Pour assurer la réussite des mises à niveau à l'avenir, réactivez les plug-ins ou supprimez ces documents dans les indices de Kibana", "core.statusPage.loadStatus.serverStatusCodeErrorMessage": "Échec de requête du statut du serveur avec le code de statut {responseStatus}", + "core.statusPage.metricsTiles.columns.heapUsedHeader": "Tas utilisé sur {heapTotal}", + "core.statusPage.metricsTiles.columns.utilizationHeader": "Utilisation (actif : {active} / inactif : {idle})", "core.statusPage.serverStatus.statusTitle": "Le statut Kibana est {kibanaStatus}", "core.statusPage.statusApp.statusActions.buildText": "BUILD : {buildNum}", "core.statusPage.statusApp.statusActions.commitText": "VALIDATION : {buildSha}", @@ -734,6 +750,7 @@ "core.euiDisplaySelector.lineCountLabel": "Sous-lignes par ligne", "core.euiDisplaySelector.resetButtonText": "Réinitialiser à la valeur par défaut", "core.euiDisplaySelector.rowHeightLabel": "Hauteur de la ligne", + "core.euiDualRange.sliderScreenReaderInstructions": "Vous êtes dans un curseur de plage personnalisé. Utilisez les flèches vers le haut et vers le bas pour modifier la valeur minimale. Appuyez sur Tabulation pour interagir avec la valeur maximale.", "core.euiErrorBoundary.error": "Erreur", "core.euiFieldPassword.maskPassword": "Masquer le mot de passe", "core.euiFieldPassword.showPassword": "Afficher le mot de passe en texte brut. Remarque : votre mot de passe sera visible à l'écran.", @@ -741,6 +758,9 @@ "core.euiFilePicker.promptText": "Sélectionner ou glisser-déposer un fichier", "core.euiFilePicker.removeSelected": "Supprimer", "core.euiFlyout.closeAriaLabel": "Fermer cette boîte de dialogue", + "core.euiFlyout.screenReaderFixedHeaders": "Vous pouvez quand même continuer à parcourir les en-têtes de page à l'aide de la touche Tabulation en plus de la boîte de dialogue.", + "core.euiFlyout.screenReaderModalDialog": "Vous êtes dans une boîte de dialogue modale. Pour fermer, appuyez sur Échap ou appuyez/cliquez en dehors de la boîte de dialogue sur la superposition masquée.", + "core.euiFlyout.screenReaderNonModalDialog": "Vous êtes dans une boîte de dialogue non modale. Pour fermer la boîte de dialogue, appuyez sur Échap.", "core.euiForm.addressFormErrors": "Veuillez remédier aux erreurs signalées en surbrillance.", "core.euiFormControlLayoutClearButton.label": "Effacer l'entrée", "core.euiFullscreenSelector.fullscreenButton": "Entrer en mode plein écran", @@ -811,7 +831,7 @@ "core.euiPaginationButtonArrow.previousPage": "Page précédente", "core.euiPinnableListGroup.pinExtraActionLabel": "Épingler l'élément", "core.euiPinnableListGroup.pinnedExtraActionLabel": "Désépingler l'élément", - "core.euiPopover.screenReaderAnnouncement": "Il s’agit d’une boîte de dialogue. Appuyez sur Échap pour quitter.", + "core.euiPopover.screenReaderAnnouncement": "Il s’agit d’une boîte de dialogue. Appuyez sur Échap ou appuyez/cliquez en dehors de la boîte de dialogue pour fermer.", "core.euiPrettyDuration.invalid": "Date non valide", "core.euiPrettyDuration.now": "maintenant", "core.euiPrettyInterval.off": "Désactivé", @@ -824,6 +844,7 @@ "core.euiQuickSelect.unitLabel": "Unité de temps", "core.euiQuickSelect.valueLabel": "Valeur de temps", "core.euiQuickSelectPopover.buttonLabel": "Sélection rapide de date", + "core.euiRange.sliderScreenReaderInstructions": "Vous êtes dans un curseur de plage personnalisé. Utilisez les flèches vers le haut et vers le bas pour modifier la valeur.", "core.euiRecentlyUsed.legend": "Plages de dates récemment utilisées", "core.euiRefreshInterval.legend": "Actualiser toutes les", "core.euiRelativeTab.dateInputError": "Doit être une plage valide", @@ -857,6 +878,7 @@ "core.euiSuggest.stateUnchanged": "État : non modifié.", "core.euiSuggest.stateUnsaved": "État : non enregistré.", "core.euiSuggest.stateUnsavedTooltip": "Les modifications n'ont pas été enregistrées.", + "core.euiSuperSelect.ariaLabel": "Sélectionner la zone de liste", "core.euiSuperSelect.screenReaderAnnouncement": "Vous êtes dans un sélecteur de formulaires et vous devez sélectionner une seule option. Utilisez les flèches vers le haut et vers le bas pour naviguer, ou appuyez sur Échap pour fermer.", "core.euiSuperUpdateButton.cannotUpdateTooltip": "Mise à jour impossible", "core.euiSuperUpdateButton.clickToApplyTooltip": "Cliquer pour appliquer", @@ -917,7 +939,7 @@ "core.euiTreeView.listNavigationInstructions": "Utilisez les touches fléchées pour parcourir rapidement cette liste.", "core.fatalErrors.clearYourSessionButtonLabel": "Effacer votre session", "core.fatalErrors.goBackButtonLabel": "Retour", - "core.fatalErrors.somethingWentWrongTitle": "Un problème est survenu", + "core.fatalErrors.somethingWentWrongTitle": "Un problème est survenu.", "core.fatalErrors.tryRefreshingPageDescription": "Essayez d'actualiser la page. Si cela ne fonctionne pas, retournez à la page précédente ou effacez vos données de session.", "core.notifications.errorToast.closeModal": "Fermer", "core.notifications.globalToast.ariaLabel": "Liste de messages de notification", @@ -996,7 +1018,7 @@ "core.ui.errorUrlOverflow.optionsToFixError.enableOptionText.advancedSettingsLinkText": "Paramètres avancés", "core.ui.errorUrlOverflow.optionsToFixError.removeStuffFromDashboardText": "Simplifiez l'objet en cours de modification en supprimant du contenu ou des filtres.", "core.ui.errorUrlOverflow.optionsToFixErrorDescription": "À essayer :", - "core.ui.kibanaNavList.label": "Analyse", + "core.ui.kibanaNavList.label": "Analytique", "core.ui.legacyBrowserMessage": "Cette installation Elastic présente des exigences de sécurité strictes auxquelles votre navigateur ne satisfait pas.", "core.ui.legacyBrowserTitle": "Merci de mettre votre navigateur à niveau.", "core.ui.loadingIndicatorAriaLabel": "Chargement du contenu", @@ -1014,6 +1036,7 @@ "core.ui.recentlyViewed": "Récemment consulté", "core.ui.recentlyViewedAriaLabel": "Liens récemment consultés", "core.ui.securityNavList.label": "Sécurité", + "core.ui.skipToMainButton": "Passer au contenu principal", "core.ui.welcomeErrorMessage": "Elastic ne s'est pas chargé correctement. Vérifiez la sortie du serveur pour plus d'informations.", "core.ui.welcomeMessage": "Chargement d'Elastic", "customIntegrations.components.replacementAccordion.recommendationDescription": "Les intégrations d'Elastic Agent sont recommandées, mais vous pouvez également utiliser Beats. Pour plus de détails, consultez notre {link}.", @@ -1091,6 +1114,7 @@ "dashboard.addPanel.savedObjectAddedToContainerSuccessMessageTitle": "{savedObjectName} a été ajouté", "dashboard.listing.createNewDashboard.newToKibanaDescription": "Vous êtes nouveau sur Kibana ? {sampleDataInstallLink} pour découvrir l'application.", "dashboard.listing.unsaved.editAria": "Continuer à modifier {title}", + "dashboard.listing.unsaved.resetAria": "Réinitialiser les modifications apportées à {title}", "dashboard.listing.unsaved.unsavedChangesTitle": "Vous avez des modifications non enregistrées dans le {dash} suivant :", "dashboard.loadingError.dashboardGridErrorMessage": "Impossible de charger le tableau de bord : {message}", "dashboard.noMatchRoute.bannerText": "L'application de tableau de bord ne reconnaît pas cet itinéraire : {route}.", @@ -1126,16 +1150,35 @@ "dashboard.dashboardPageTitle": "Tableaux de bord", "dashboard.dashboardWasSavedSuccessMessage": "Le tableau de bord \"{dashTitle}\" a été enregistré.", "dashboard.deleteError.toastDescription": "Erreur rencontrée lors de la suppression du tableau de bord", - "dashboard.discardChangesConfirmModal.discardChangesDescription": "Une fois les modifications ignorées, vous ne pourrez pas les récupérer.", + "dashboard.discardChangesConfirmModal.discardChangesDescription": "Toutes les modifications non enregistrées seront perdues.", "dashboard.editingToolbar.addControlButtonTitle": "Ajouter un contrôle", "dashboard.editingToolbar.addTimeSliderControlButtonTitle": "Ajouter un contrôle de curseur temporel", "dashboard.editingToolbar.controlsButtonTitle": "Contrôles", + "dashboard.editingToolbar.editControlGroupButtonTitle": "Paramètres", "dashboard.editingToolbar.onlyOneTimeSliderControlMsg": "Le groupe de contrôle contient déjà un contrôle de curseur temporel.", "dashboard.editorMenu.aggBasedGroupTitle": "Basé sur une agrégation", "dashboard.editorMenu.deprecatedTag": "Déclassé", + "dashboard.embeddableApi.showSettings.flyout.applyButtonTitle": "Appliquer", + "dashboard.embeddableApi.showSettings.flyout.cancelButtonTitle": "Annuler", + "dashboard.embeddableApi.showSettings.flyout.confirmApplyButtonTitle": "Confirmer et appliquer", + "dashboard.embeddableApi.showSettings.flyout.form.duplicateTitleDescription": "L'enregistrement de \"{title}\" crée un doublon de titre.", + "dashboard.embeddableApi.showSettings.flyout.form.duplicateTitleLabel": "Ce tableau de bord existe déjà", + "dashboard.embeddableApi.showSettings.flyout.form.hideAllPanelTitlesSwitchLabel": "Afficher les titres de panneau", + "dashboard.embeddableApi.showSettings.flyout.form.panelDescriptionAriaLabel": "Modifier la description du tableau de bord", + "dashboard.embeddableApi.showSettings.flyout.form.panelDescriptionFormRowLabel": "Description", + "dashboard.embeddableApi.showSettings.flyout.form.panelTitleFormRowLabel": "Titre", + "dashboard.embeddableApi.showSettings.flyout.form.panelTitleInputAriaLabel": "Modifier le titre du tableau de bord", + "dashboard.embeddableApi.showSettings.flyout.form.storeTimeWithDashboardFormRowHelpText": "Le filtre temporel est défini sur l’option sélectionnée chaque fois que ce tableau de bord est chargé.", + "dashboard.embeddableApi.showSettings.flyout.form.storeTimeWithDashboardFormRowLabel": "Enregistrer la plage temporelle avec le tableau de bord", + "dashboard.embeddableApi.showSettings.flyout.form.syncColorsBetweenPanelsSwitchLabel": "Synchroniser les palettes de couleur de tous les panneaux", + "dashboard.embeddableApi.showSettings.flyout.form.syncCursorBetweenPanelsSwitchLabel": "Synchroniser le curseur de tous les panneaux", + "dashboard.embeddableApi.showSettings.flyout.form.syncTooltipsBetweenPanelsSwitchLabel": "Synchroniser les infobulles de tous les panneaux", + "dashboard.embeddableApi.showSettings.flyout.form.tagsFormRowLabel": "Balises", + "dashboard.embeddableApi.showSettings.flyout.form.useMarginsBetweenPanelsSwitchLabel": "Utiliser des marges entre les panneaux", + "dashboard.embeddableApi.showSettings.flyout.title": "Paramètres du tableau de bord", "dashboard.embedUrlParamExtension.filterBar": "Barre de filtre", "dashboard.embedUrlParamExtension.include": "Inclure", - "dashboard.embedUrlParamExtension.query": "Recherche", + "dashboard.embedUrlParamExtension.query": "Requête", "dashboard.embedUrlParamExtension.timeFilter": "Filtre temporel", "dashboard.embedUrlParamExtension.topMenu": "Menu supérieur", "dashboard.emptyDashboardAdditionalPrivilege": "Des privilèges supplémentaires sont requis pour pouvoir modifier ce tableau de bord.", @@ -1156,12 +1199,15 @@ "dashboard.listing.createNewDashboard.inProgressTitle": "Tableau de bord en cours", "dashboard.listing.createNewDashboard.sampleDataInstallLinkText": "Ajoutez des exemples de données", "dashboard.listing.createNewDashboard.title": "Créer votre premier tableau de bord", + "dashboard.listing.newDashboardTitle": "Nouveau tableau de bord", "dashboard.listing.readonlyNoItemsBody": "Aucun tableau de bord n'est disponible. Pour modifier vos autorisations afin d’afficher les tableaux de bord dans cet espace, contactez votre administrateur.", "dashboard.listing.readonlyNoItemsTitle": "Aucun tableau de bord à afficher", "dashboard.listing.table.entityName": "tableau de bord", "dashboard.listing.table.entityNamePlural": "tableaux de bord", + "dashboard.listing.tableListTitle": "Tableaux de bord", "dashboard.listing.unsaved.editTitle": "Poursuivre les modifications", "dashboard.listing.unsaved.loading": "Chargement", + "dashboard.listing.unsaved.resetTitle": "Réinitialiser les modifications", "dashboard.loadingError.dashboardNotFound": "Le tableau de bord demandé est introuvable.", "dashboard.loadURLError.PanelTooOld": "Impossible de charger les panneaux à partir d'une URL créée dans une version antérieure à 7.3", "dashboard.noMatchRoute.bannerTitleText": "Page introuvable", @@ -1187,10 +1233,14 @@ "dashboard.panel.unableToMigratePanelDataForSixOneZeroErrorMessage": "Impossible de migrer les données du panneau pour une rétro-compatibilité \"6.1.0\". Le panneau ne contient pas les champs de colonne et/ou de ligne attendus.", "dashboard.panel.unlinkFromLibrary": "Dissocier de la bibliothèque", "dashboard.placeholder.factory.displayName": "paramètre fictif", + "dashboard.resetChangesConfirmModal.confirmButtonLabel": "Réinitialiser le tableau de bord", + "dashboard.resetChangesConfirmModal.resetChangesDescription": "Ce tableau de bord va revenir à son dernier état d'enregistrement. Vous risquez de perdre les modifications apportées aux filtres et aux requêtes.", + "dashboard.resetChangesConfirmModal.resetChangesTitle": "Réinitialiser le tableau de bord ?", "dashboard.savedDashboard.newDashboardTitle": "Nouveau tableau de bord", "dashboard.snapshotShare.longUrlWarning": "Un ou plusieurs panneaux de ce tableau de bord ont été modifiés. Avant de générer un snapshot, enregistrez le tableau de bord.", "dashboard.solutionToolbar.addPanelButtonLabel": "Créer une visualisation", "dashboard.solutionToolbar.editorMenuButtonLabel": "Sélectionner un type", + "dashboard.solutionToolbar.quickCreateButtonGroupLegend": "Raccourcis vers les types de visualisation populaires", "dashboard.topNav.cloneModal.cancelButtonLabel": "Annuler", "dashboard.topNav.cloneModal.cloneDashboardModalHeaderTitle": "Cloner le tableau de bord", "dashboard.topNav.cloneModal.confirmButtonLabel": "Confirmer le clonage", @@ -1198,11 +1248,6 @@ "dashboard.topNav.cloneModal.enterNewNameForDashboardDescription": "Veuillez saisir un autre nom pour votre tableau de bord.", "dashboard.topNav.labsButtonAriaLabel": "ateliers", "dashboard.topNav.labsConfigDescription": "Ateliers", - "dashboard.embeddableApi.showSettings.flyout.form.hideAllPanelTitlesSwitchLabel": "Afficher les titres de panneau", - "dashboard.embeddableApi.showSettings.flyout.form.syncColorsBetweenPanelsSwitchLabel": "Synchroniser les palettes de couleur de tous les panneaux", - "dashboard.embeddableApi.showSettings.flyout.form.syncCursorBetweenPanelsSwitchLabel": "Synchroniser le curseur de tous les panneaux", - "dashboard.embeddableApi.showSettings.flyout.form.syncTooltipsBetweenPanelsSwitchLabel": "Synchroniser les infobulles de tous les panneaux", - "dashboard.embeddableApi.showSettings.flyout.form.useMarginsBetweenPanelsSwitchLabel": "Utiliser des marges entre les panneaux", "dashboard.topNav.saveModal.descriptionFormRowLabel": "Description", "dashboard.topNav.saveModal.objectType": "tableau de bord", "dashboard.topNav.saveModal.storeTimeWithDashboardFormRowHelpText": "Le filtre temporel est défini sur l’option sélectionnée chaque fois que ce tableau de bord est chargé.", @@ -1214,15 +1259,21 @@ "dashboard.topNave.editConfigDescription": "Basculer en mode Édition", "dashboard.topNave.fullScreenButtonAriaLabel": "plein écran", "dashboard.topNave.fullScreenConfigDescription": "Mode Plein écran", + "dashboard.topNave.resetChangesButtonAriaLabel": "Réinitialiser", + "dashboard.topNave.resetChangesConfigDescription": "Réinitialiser les modifications apportées au tableau de bord", "dashboard.topNave.saveAsButtonAriaLabel": "enregistrer sous", "dashboard.topNave.saveAsConfigDescription": "Enregistrer en tant que nouveau tableau de bord", "dashboard.topNave.saveButtonAriaLabel": "enregistrer", "dashboard.topNave.saveConfigDescription": "Enregistrer le tableau de bord sans invite de confirmation", + "dashboard.topNave.settingsButtonAriaLabel": "paramètres", + "dashboard.topNave.settingsConfigDescription": "Ouvrir les paramètres du tableau de bord", "dashboard.topNave.shareButtonAriaLabel": "partager", "dashboard.topNave.shareConfigDescription": "Partager le tableau de bord", "dashboard.topNave.viewConfigDescription": "Basculer en mode Affichage uniquement", "dashboard.unsavedChangesBadge": "Modifications non enregistrées", + "dashboard.unsavedChangesBadgeToolTipContent": " Vous avez des modifications non enregistrées dans ce tableau de bord. Pour supprimer cette étiquette, enregistrez le tableau de bord.", "data.advancedSettings.autocompleteIgnoreTimerangeText": "Désactivez cette propriété pour obtenir des suggestions de saisie semi-automatique depuis l'intégralité de l'ensemble de données plutôt que depuis la plage temporelle définie. {learnMoreLink}", + "data.advancedSettings.autocompleteValueSuggestionMethodText": "La méthode utilisée pour générer des suggestions de valeur pour la saisie semi-automatique KQL. Sélectionnez terms_enum pour utiliser l'API d'énumération de termes d'Elasticsearch afin d’améliorer les performances de suggestion de saisie semi-automatique. (Notez que terms_enum est incompatible avec la sécurité au niveau du document.) Sélectionnez terms_agg pour utiliser l'agrégation de termes d'Elasticsearch. (Notez que terms_agg est incompatible avec les champs de type IP.) {learnMoreLink}", "data.advancedSettings.courier.customRequestPreferenceText": "{requestPreferenceLink} utilisé quand {setRequestReferenceSetting} est défini sur {customSettingValue}.", "data.advancedSettings.courier.maxRequestsText": "Contrôle le paramètre {maxRequestsLink} utilisé pour les requêtes _msearch envoyées par Kibana. Définir ce paramètre sur 0 permet d’utiliser la valeur Elasticsearch par défaut.", "data.advancedSettings.query.allowWildcardsText": "Lorsque ce paramètre est activé, le caractère \"*\" est autorisé en tant que premier caractère dans une clause de requête. Pour interdire l'utilisation de caractères génériques au début des requêtes Lucene de base, utilisez {queryStringOptionsPattern}.", @@ -1234,7 +1285,7 @@ "data.aggTypes.buckets.ranges.rangesFormatMessageArrowRight": "{from} → {to}", "data.filter.filterBar.fieldNotFound": "Champ {key} introuvable dans la vue de données {dataView}", "data.inspector.table.tableLabel": "Tableau {index}", - "data.inspector.table.tablesDescription": "Il y a {tablesCount, plural, one {# tableau} other {# tableaux}} au total", + "data.inspector.table.tablesDescription": "Il y a {tablesCount, plural, one {# tableau} many {# tableaux} other {# tableaux}} au total", "data.mgmt.searchSessions.api.fetchTimeout": "La récupération des informations de la session de recherche a expiré après {timeout} secondes", "data.mgmt.searchSessions.status.expiresOn": "Expire le {expireDate}", "data.mgmt.searchSessions.status.expiresSoonInDays": "Expire dans {numDays} jours", @@ -1289,11 +1340,11 @@ "data.search.searchSource.requestTimeValue": "{requestTime} ms", "data.search.statusError": "Recherche {searchId} terminée avec un statut {errorCode}", "data.search.statusThrow": "Le statut de la recherche avec l'ID {searchId} a généré une erreur {message} (statusCode : {errorCode})", - "data.search.timeBuckets.dayLabel": "{amount, plural, one {un jour} other {# jours}}", - "data.search.timeBuckets.hourLabel": "{amount, plural, one {une heure} other {# heures}}", - "data.search.timeBuckets.millisecondLabel": "{amount, plural, one {une milliseconde} other {# millisecondes}}", - "data.search.timeBuckets.minuteLabel": "{amount, plural, one {une minute} other {# minutes}}", - "data.search.timeBuckets.secondLabel": "{amount, plural, one {une seconde} other {# secondes}}", + "data.search.timeBuckets.dayLabel": "{amount, plural, one {un jour} many {# jours} other {# jours}}", + "data.search.timeBuckets.hourLabel": "{amount, plural, one {une heure} many {# heures} other {# heures}}", + "data.search.timeBuckets.millisecondLabel": "{amount, plural, one {une milliseconde} many {# millisecondes} other {# millisecondes}}", + "data.search.timeBuckets.minuteLabel": "{amount, plural, one {une minute} many {# minutes} other {# minutes}}", + "data.search.timeBuckets.secondLabel": "{amount, plural, one {une seconde} many {# secondes} other {# secondes}}", "data.searchSessionIndicator.canceledWhenText": "Arrêté {when}", "data.searchSessionIndicator.loadingInTheBackgroundWhenText": "Démarré {when}", "data.searchSessionIndicator.loadingResultsWhenText": "Démarré {when}", @@ -1309,8 +1360,8 @@ "data.advancedSettings.courier.ignoreFilterText": "Cette configuration améliore la prise en charge des tableaux de bord contenant des visualisations accédant à des index différents. Lorsque ce paramètre est désactivé, tous les filtres sont appliqués à toutes les visualisations. En cas d'activation, le ou les filtres sont ignorés pour une visualisation lorsque l'index de celle-ci ne contient pas le champ de filtrage.", "data.advancedSettings.courier.ignoreFilterTitle": "Ignorer le ou les filtres", "data.advancedSettings.courier.maxRequestsTitle": "Requêtes de partitions simultanées max.", - "data.advancedSettings.courier.requestPreferenceCustom": "Personnalisé", - "data.advancedSettings.courier.requestPreferenceNone": "Aucun", + "data.advancedSettings.courier.requestPreferenceCustom": "Personnalisée", + "data.advancedSettings.courier.requestPreferenceNone": "Aucune", "data.advancedSettings.courier.requestPreferenceSessionId": "ID session", "data.advancedSettings.courier.requestPreferenceText": "Permet de définir quelles partitions doivent gérer les requêtes de recherche.\n
    \n
  • {sessionId} : limite les opérations pour exécuter toutes les requêtes de recherche sur les mêmes partitions.\n Cela a l'avantage de réutiliser les caches de partition pour toutes les requêtes.
  • \n
  • {custom} : permet de définir une valeur de préférence.\n Utilisez \"courier:customRequestPreference\" pour personnaliser votre valeur de préférence.
  • \n
  • {none} : permet de ne pas définir de préférence.\n Cela peut permettre de meilleures performances, car les requêtes peuvent être réparties entre toutes les copies de partition.\n Cependant, les résultats peuvent être incohérents, les différentes partitions pouvant se trouver dans différents états d'actualisation.
  • \n
", "data.advancedSettings.courier.requestPreferenceTitle": "Préférence de requête", @@ -1342,7 +1393,7 @@ "data.advancedSettings.sortOptionsTitle": "Options de tri", "data.advancedSettings.suggestFilterValuesText": "Définir cette propriété sur \"faux\" permet d’empêcher l'éditeur de filtres de suggérer des valeurs pour les champs.", "data.advancedSettings.suggestFilterValuesTitle": "Suggestions de l'éditeur de filtres", - "data.advancedSettings.timepicker.last15Minutes": "15 dernières minutes", + "data.advancedSettings.timepicker.last15Minutes": "Dernières 15 minutes", "data.advancedSettings.timepicker.last1Hour": "Dernière heure", "data.advancedSettings.timepicker.last1Year": "Dernière année", "data.advancedSettings.timepicker.last24Hours": "Dernières 24 heures", @@ -1509,7 +1560,7 @@ "data.search.aggs.buckets.intervalOptions.monthlyDisplayName": "Mois", "data.search.aggs.buckets.intervalOptions.secondDisplayName": "Seconde", "data.search.aggs.buckets.intervalOptions.weeklyDisplayName": "Semaine", - "data.search.aggs.buckets.intervalOptions.yearlyDisplayName": "An", + "data.search.aggs.buckets.intervalOptions.yearlyDisplayName": "Année", "data.search.aggs.buckets.ipRange.customLabel.help": "Représente une étiquette personnalisée pour cette agrégation", "data.search.aggs.buckets.ipRange.enabled.help": "Spécifie si cette agrégation doit être activée.", "data.search.aggs.buckets.ipRange.field.help": "Champ à utiliser pour cette agrégation", @@ -2142,14 +2193,17 @@ "discover.docTable.totalDocuments": "{totalDocuments} documents", "discover.dscTour.stepAddFields.description": "Cliquez sur {plusIcon} pour ajouter les champs qui vous intéressent.", "discover.dscTour.stepExpand.description": "Cliquez sur {expandIcon} pour afficher, comparer et filtrer les documents.", + "discover.errorCalloutFormattedTitle": "{title} : {errorMessage}", "discover.grid.copyClipboardButtonTitle": "Copier la valeur de {column}", "discover.grid.copyColumnValuesToClipboard.toastTitle": "Valeurs de la colonne \"{column}\" copiées dans le presse-papiers", "discover.grid.filterForAria": "Filtrer sur cette {value}", "discover.grid.filterOutAria": "Exclure cette {value}", + "discover.gridSampleSize.limitDescription": "Les résultats de recherche sont limités à {sampleSize} documents Ajoutez d'autres termes pour affiner votre recherche.", "discover.howToSeeOtherMatchingDocumentsDescription": "Voici les {sampleSize} premiers documents correspondant à votre recherche. Veuillez affiner cette dernière pour en voir davantage.", "discover.noMatchRoute.bannerText": "L'application Discover ne reconnaît pas cet itinéraire : {route}", "discover.noResults.kqlExamples.kqlDescription": "En savoir plus sur {kqlLink}", "discover.noResults.luceneExamples.footerDescription": "En savoir plus sur {luceneLink}", + "discover.noResults.noDocumentsOrCheckIndicesAndPermissionsDescription": "Vérifiez que la vue de données {dataViewName} avec le modèle d'indexation {dataViewPattern} a des index et documents correspondants et que vous avez l'autorisation requise pour les afficher.", "discover.noResults.suggestion.removeOrDisableFiltersText": "Retirer ou {disableFiltersLink}", "discover.pageTitleWithSavedSearch": "Discover –{savedSearchTitle}", "discover.savedSearchAliasMatchRedirect.objectNoun": "Recherche {savedSearch}", @@ -2161,7 +2215,7 @@ "discover.showingSavedDataViewWarningDescription": "Affichage de la vue de données enregistrée : \"{ownDataViewTitle}\" ({ownDataViewId})", "discover.singleDocRoute.errorMessage": "Aucune vue de données correspondante pour l'ID {dataViewId}", "discover.topNav.optionsPopover.currentViewMode": "{viewModeLabel} : {currentViewMode}", - "discover.utils.formatHit.moreFields": "et {count} {count, plural, one {champ} other {champs}} en plus", + "discover.utils.formatHit.moreFields": "et {count} autre(s) {count, plural, one {champ} many {champs} other {champs}}", "discover.valueIsNotConfiguredDataViewIDWarningTitle": "{stateVal} n'est pas un ID de vue de données configuré", "discover.advancedSettings.context.defaultSizeText": "Le nombre d'entrées connexes à afficher dans la vue contextuelle", "discover.advancedSettings.context.defaultSizeTitle": "Taille de contexte", @@ -2219,7 +2273,7 @@ "discover.context.failedToLoadAnchorDocumentDescription": "Échec de chargement du document ancré", "discover.context.failedToLoadAnchorDocumentErrorDescription": "Le document ancré n’a pas pu être chargé.", "discover.context.invalidTieBreakerFiledSetting": "Paramètre de champ de départage non valide", - "discover.context.loadButtonLabel": "Charge", + "discover.context.loadButtonLabel": "Charger", "discover.context.loadingDescription": "Chargement...", "discover.context.newerDocumentsAriaLabel": "Nombre de documents plus récents", "discover.context.newerDocumentsDescription": "documents plus récents", @@ -2234,12 +2288,12 @@ "discover.controlColumnHeader": "Colonne de commande", "discover.copyToClipboardJSON": "Copier les documents dans le presse-papiers (JSON)", "discover.discoverBreadcrumbTitle": "Découverte", - "discover.discoverDefaultSearchSessionName": "Découverte", + "discover.discoverDefaultSearchSessionName": "Discover", "discover.discoverDescription": "Explorez vos données de manière interactive en interrogeant et en filtrant des documents bruts.", "discover.discoverError.missingIdParamError": "Aucun ID de document fourni. Revenez à Discover pour sélectionner un autre document.", "discover.discoverError.title": "Chargement de cette page impossible", "discover.discoverSubtitle": "Recherchez et obtenez des informations.", - "discover.discoverTitle": "Découverte", + "discover.discoverTitle": "Discover", "discover.doc.couldNotFindDocumentsDescription": "Aucun document ne correspond à cet ID.", "discover.doc.failedToExecuteQueryDescription": "Impossible d'exécuter la recherche", "discover.doc.failedToLocateDocumentDescription": "Document introuvable", @@ -2272,6 +2326,7 @@ "discover.docTable.tableRow.viewSingleDocumentLinkText": "Afficher un seul document", "discover.docTable.tableRow.viewSurroundingDocumentsLinkText": "Afficher les documents alentour", "discover.documentsAriaLabel": "Documents", + "discover.documentsErrorTitle": "Erreur lors de la recherche", "discover.docView.table.actions.label": "Actions", "discover.docView.table.actions.open": "Actions ouvertes", "discover.docView.table.ignored.multiAboveTooltip": "Une ou plusieurs valeurs dans ce champ sont trop longues et ne peuvent pas être recherchées ni filtrées.", @@ -2302,6 +2357,7 @@ "discover.docViews.table.unindexedFieldsCanNotBeSearchedTooltip": "Les champs non indexés ou les valeurs ignorées ne peuvent pas être recherchés", "discover.docViews.table.unpinFieldAriaLabel": "Désépingler le champ", "discover.docViews.table.unpinFieldLabel": "Désépingler le champ", + "discover.dropZoneTableLabel": "Abandonner la zone pour ajouter un champ en tant que colonne dans la table", "discover.dscTour.stepAddFields.imageAltText": "Dans la liste Champs disponibles, cliquez sur l'icône Plus pour afficher/masquer un champ dans le tableau de documents.", "discover.dscTour.stepAddFields.title": "Ajouter des champs dans le tableau", "discover.dscTour.stepChangeRowHeight.description": "Ajustez le nombre de lignes pour adapter la taille au contenu.", @@ -2319,6 +2375,7 @@ "discover.embeddable.inspectorRequestDataTitle": "Données", "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", @@ -2400,6 +2457,7 @@ "discover.noResults.luceneExamples.footerLuceneLink": "syntaxe de chaîne de requête", "discover.noResults.luceneExamples.title": "Exemples Lucene", "discover.noResults.noDocumentsOrCheckPermissionsDescription": "Assurez-vous de disposer de l'autorisation d'afficher les index et vérifiez qu'ils contiennent des documents.", + "discover.noResults.searchExamples.noResultsErrorTitle": "Impossible d'extraire les résultats de recherche", "discover.noResults.searchExamples.noResultsMatchSearchCriteriaTitle": "Aucun résultat ne correspond à vos critères de recherche", "discover.noResults.suggestion.adjustYourQueryText": "Modifiez la requête.", "discover.noResults.suggestion.adjustYourQueryWithExamplesText": "Essayer une autre requête", @@ -2427,6 +2485,7 @@ "discover.savedSearchEmbeddable.action.viewSavedSearch.displayName": "Ouvrir dans Discover", "discover.searchingTitle": "Recherche", "discover.selectColumnHeader": "Sélectionner la colonne", + "discover.serverLocatorExtension.titleFromLocatorUnknown": "Recherche inconnue", "discover.showAllDocuments": "Afficher tous les documents", "discover.showSelectedDocumentsOnly": "Afficher uniquement les documents sélectionnés", "discover.singleDocRoute.errorTitle": "Une erreur s'est produite", @@ -2453,6 +2512,60 @@ "discover.viewAlert.searchSourceErrorTitle": "Erreur lors de la récupération de la source de recherche", "discover.viewModes.document.label": "Documents", "discover.viewModes.fieldStatistics.label": "Statistiques de champ", + "domDragDrop.announce.cancelled": "Mouvement annulé. {label} revenu à sa position initiale", + "domDragDrop.announce.cancelledItem": "Mouvement annulé. {label} revenu au groupe {groupLabel} à la position {position}", + "domDragDrop.announce.dropped.combineCompatible": "{label} combiné dans le groupe {groupLabel} en {dropLabel} dans le groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}", + "domDragDrop.announce.dropped.combineIncompatible": "{label} converti en {nextLabel} dans le groupe {groupLabel} à la position {position} et combiné à {dropLabel} dans le groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}", + "domDragDrop.announce.dropped.duplicated": "{label} dupliqué dans le groupe {groupLabel} à la position {position} dans le calque {layerNumber}", + "domDragDrop.announce.dropped.duplicateIncompatible": "Copie de {label} convertie en {nextLabel} et ajoutée au groupe {groupLabel} à la position {position} dans le calque {dropLayerNumber}", + "domDragDrop.announce.dropped.moveCompatible": "{label} déplacé dans le groupe {groupLabel} à la position {position} dans le calque {dropLayerNumber}", + "domDragDrop.announce.dropped.moveIncompatible": "{label} converti en {nextLabel} et déplacé dans le groupe {groupLabel} à la position {position} dans le calque {dropLayerNumber}", + "domDragDrop.announce.dropped.reordered": "{label} réorganisé dans le groupe {groupLabel} de la position {prevPosition} à la position {position}", + "domDragDrop.announce.dropped.replaceDuplicateIncompatible": "Copie de {label} convertie en {nextLabel} et {dropLabel} remplacé dans le groupe {groupLabel} à la position {position} dans le calque {dropLayerNumber}", + "domDragDrop.announce.dropped.replaceIncompatible": "{label} converti en {nextLabel} et {dropLabel} remplacé dans le groupe {groupLabel} à la position {position} dans le calque {dropLayerNumber}", + "domDragDrop.announce.dropped.swapCompatible": "{label} déplacé vers {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber} et {dropLabel} dans le groupe {groupLabel} à la position {position} dans le calque {layerNumber}", + "domDragDrop.announce.dropped.swapIncompatible": "{label} converti en {nextLabel} dans le groupe {groupLabel} à la position {position} dans le calque {layerNumber} et permuté avec {dropLabel} dans le groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}", + "domDragDrop.announce.droppedDefault": "{label} ajouté dans le groupe {dropGroupLabel} à la position {position} dans le calque {dropLayerNumber}", + "domDragDrop.announce.droppedNoPosition": "{label} ajouté à {dropLabel}", + "domDragDrop.announce.duplicated.combine": "Combiner {dropLabel} avec {label} dans {groupLabel} à la position {position} dans le calque {dropLayerNumber}", + "domDragDrop.announce.duplicated.replace": "{dropLabel} remplacé par {label} dans {groupLabel} à la position {position} dans le calque {dropLayerNumber}", + "domDragDrop.announce.duplicated.replaceDuplicateCompatible": "{dropLabel} remplacé par une copie de {label} dans {groupLabel} à la position {position} dans le calque {dropLayerNumber}", + "domDragDrop.announce.lifted": "{label} levé", + "domDragDrop.announce.selectedTarget.combine": "Combinez {dropLabel} dans le groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber} avec {label}. Appuyez sur la barre d’espace ou sur Entrée pour combiner.", + "domDragDrop.announce.selectedTarget.combineCompatible": "Combinez {label} dans le groupe {groupLabel} à la position {position} dans le calque {layerNumber} avec {dropLabel} dans le groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}. Maintenez la touche Contrôle enfoncée et appuyez sur la barre d’espace ou sur Entrée pour combiner.", + "domDragDrop.announce.selectedTarget.combineIncompatible": "Convertissez {label} en {nextLabel} dans le groupe {groupLabel} à la position {position} dans le calque {layerNumber} combinez-le à {dropLabel} dans le groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}. Maintenez la touche Contrôle enfoncée et appuyez sur la barre d’espace ou sur Entrée pour combiner.", + "domDragDrop.announce.selectedTarget.combineMain": "Vous faites glisser {label} de {groupLabel} à la position {position} dans le calque {layerNumber} sur {dropLabel} à partir du groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}. Appuyez sur la barre d'espace ou sur Entrée pour combiner {dropLabel} à {label}.{duplicateCopy}{swapCopy}{combineCopy}.", + "domDragDrop.announce.selectedTarget.default": "Ajoutez {label} au groupe {dropGroupLabel} à la position {position} dans le calque {dropLayerNumber}. Appuyer sur la barre d'espace ou sur Entrée pour ajouter", + "domDragDrop.announce.selectedTarget.defaultNoPosition": "Ajoutez {label} à {dropLabel}. Appuyer sur la barre d'espace ou sur Entrée pour ajouter", + "domDragDrop.announce.selectedTarget.duplicated": "Dupliquez {label} dans le groupe {dropGroupLabel} à la position {position} dans le calque {layerNumber}. Maintenir la touche Alt ou Option enfoncée et appuyer sur la barre d'espace ou sur Entrée pour dupliquer", + "domDragDrop.announce.selectedTarget.duplicatedInGroup": "Dupliquez {label} dans le groupe {dropGroupLabel} à la position {position} dans le calque {layerNumber}. Appuyer sur la barre d'espace ou sur Entrée pour dupliquer", + "domDragDrop.announce.selectedTarget.duplicateIncompatible": "Convertissez la copie de {label} en {nextLabel} et ajoutez-la au groupe {groupLabel} à la position {position} dans le calque {dropLayerNumber}. Maintenir la touche Alt ou Option enfoncée et appuyer sur la barre d'espace ou sur Entrée pour dupliquer", + "domDragDrop.announce.selectedTarget.moveCompatible": "Déplacez {label} dans le groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}. Appuyer sur la barre d'espace ou sur Entrée pour déplacer", + "domDragDrop.announce.selectedTarget.moveCompatibleMain": "Vous faites glisser {label} de {groupLabel} à la position {position} sur la position {dropPosition} dans le groupe {dropGroupLabel} dans le calque {dropLayerNumber}. Appuyer sur la barre d'espace ou sur Entrée pour déplacer.{duplicateCopy}", + "domDragDrop.announce.selectedTarget.moveIncompatible": "Convertissez {label} en {nextLabel} et déplacez-le dans le groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}. Appuyer sur la barre d'espace ou sur Entrée pour déplacer", + "domDragDrop.announce.selectedTarget.moveIncompatibleMain": "Vous faites glisser {label} de {groupLabel} à la position {position} dans le calque {layerNumber} sur la position {dropPosition} dans le groupe {dropGroupLabel} dans le calque {dropLayerNumber}. Appuyez sur la barre d'espace ou sur Entrée pour convertir {label} en {nextLabel} et le déplacer.{duplicateCopy}", + "domDragDrop.announce.selectedTarget.reordered": "Réorganisez {label} dans le groupe {groupLabel} de la position {prevPosition} à la position {position}. Appuyer sur la barre d'espace ou sur Entrée pour réorganiser", + "domDragDrop.announce.selectedTarget.reorderedBack": "{label} revenu à sa position initiale {prevPosition}", + "domDragDrop.announce.selectedTarget.replace": "Remplacez {dropLabel} dans le groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber} par {label}. Appuyez sur la barre d'espace ou sur Entrée pour remplacer.", + "domDragDrop.announce.selectedTarget.replaceDuplicateCompatible": "Dupliquez {label} et remplacez {dropLabel} dans {groupLabel} à la position {position} dans le calque {dropLayerNumber}. Maintenir la touche Alt ou Option enfoncée et appuyer sur la barre d'espace ou sur Entrée pour dupliquer et remplacer", + "domDragDrop.announce.selectedTarget.replaceDuplicateIncompatible": "Convertissez la copie de {label} en {nextLabel} et remplacez {dropLabel} dans le groupe {groupLabel} à la position {position} dans le calque {dropLayerNumber}. Maintenir la touche Alt ou Option enfoncée et appuyer sur la barre d'espace ou sur Entrée pour dupliquer et remplacer", + "domDragDrop.announce.selectedTarget.replaceIncompatible": "Convertissez {label} en {nextLabel} et remplacez {dropLabel} dans le groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}. Appuyer sur la barre d'espace ou sur Entrée pour remplacer", + "domDragDrop.announce.selectedTarget.replaceIncompatibleMain": "Vous faites glisser {label} de {groupLabel} à la position {position} dans le calque {layerNumber} sur {dropLabel} à partir du groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}. Appuyez sur la barre d'espace ou sur Entrée pour convertir {label} en {nextLabel} et remplacer {dropLabel}.{duplicateCopy}{swapCopy}{combineCopy}", + "domDragDrop.announce.selectedTarget.replaceMain": "Vous faites glisser {label} de {groupLabel} à la position {position} dans le calque {layerNumber} sur {dropLabel} à partir du groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}. Appuyer sur la barre d'espace ou sur Entrée pour remplacer {dropLabel} par {label}.{duplicateCopy}{swapCopy}{combineCopy}", + "domDragDrop.announce.selectedTarget.swapCompatible": "Permutez {label} dans le groupe {groupLabel} à la position {position} dans le calque {layerNumber} avec {dropLabel} dans le groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}. Maintenir la touche Maj enfoncée tout en appuyant sur la barre d'espace ou sur Entrée pour permuter", + "domDragDrop.announce.selectedTarget.swapIncompatible": "Convertissez {label} en {nextLabel} dans le groupe {groupLabel} à la position {position} dans le calque {layerNumber} permutez-le avec {dropLabel} dans le groupe {dropGroupLabel} à la position {dropPosition} dans le calque {dropLayerNumber}. Maintenir la touche Maj enfoncée tout en appuyant sur la barre d'espace ou sur Entrée pour permuter", + "domDragDrop.announce.combine.short": " Maintenir la touche Contrôle enfoncée pour combiner", + "domDragDrop.announce.duplicate.short": " Maintenez la touche Alt ou Option enfoncée pour dupliquer.", + "domDragDrop.announce.selectedTarget.noSelected": "Aucune cible sélectionnée. Utiliser les touches fléchées pour sélectionner une cible", + "domDragDrop.announce.swap.short": " Maintenez la touche Maj enfoncée pour permuter.", + "domDragDrop.dropTargets.altOption": "Alt/Option", + "domDragDrop.dropTargets.combine": "Combiner", + "domDragDrop.dropTargets.control": "Contrôler", + "domDragDrop.dropTargets.duplicate": "Dupliquer", + "domDragDrop.dropTargets.shift": "Déplacer", + "domDragDrop.dropTargets.swap": "Permuter", + "domDragDrop.keyboardInstructions": "Appuyez sur la barre d'espace ou sur Entrée pour commencer à faire glisser. Lors du glissement, utilisez les touches fléchées gauche/droite pour vous déplacer entre les cibles de dépôt. Appuyez à nouveau sur la barre d'espace ou sur Entrée pour terminer.", + "domDragDrop.keyboardInstructionsReorder": "Appuyez sur la barre d'espace ou sur Entrée pour commencer à faire glisser. Lors du glissement, utilisez les touches fléchées haut/bas pour réorganiser les éléments dans le groupe et les touches gauche/droite pour choisir les cibles de dépôt à l'extérieur du groupe. Appuyez à nouveau sur la barre d'espace ou sur Entrée pour terminer.", "embeddableApi.addPanel.savedObjectAddedToContainerSuccessMessageTitle": "{savedObjectName} a été ajouté", "embeddableApi.attributeService.saveToLibraryError": "Une erreur s'est produite lors de l'enregistrement. Erreur : {errorMessage}", "embeddableApi.errors.embeddableFactoryNotFound": "Impossible de charger {type}. Veuillez effectuer une mise à niveau vers la distribution par défaut d'Elasticsearch et de Kibana avec la licence appropriée.", @@ -2496,6 +2609,8 @@ "embeddableApi.panel.removePanel.displayName": "Supprimer du tableau de bord", "embeddableApi.panelBadgeTrigger.description": "Des actions apparaissent dans la barre de titre lorsqu'un élément pouvant être intégré est chargé dans un panneau.", "embeddableApi.panelBadgeTrigger.title": "Badges du panneau", + "embeddableApi.panelHoverTrigger.description": "Une nouvelle action sera ajoutée au menu flottant du panneau", + "embeddableApi.panelHoverTrigger.title": "Menu contextuel du panneau", "embeddableApi.panelNotificationTrigger.description": "Les actions apparaissent dans l’angle supérieur droit des panneaux.", "embeddableApi.panelNotificationTrigger.title": "Notifications du panneau", "embeddableApi.samples.contactCard.displayName": "carte de visite", @@ -2511,8 +2626,8 @@ "esQuery.kql.errors.literalText": "littéral", "esQuery.kql.errors.valueText": "valeur", "esQuery.kql.errors.whitespaceText": "espace", - "esUi.forms.fieldValidation.indexNameInvalidCharactersError": "Le nom de l'index contient {characterListLength, plural, one {le caractère non valide} other {les caractères non valides}} {characterList}.", - "esUi.forms.fieldValidation.indexPatternInvalidCharactersError": "Le modèle d'indexation contient {characterListLength, plural, one {le caractère non valide} other {les caractères non valides}} {characterList}.", + "esUi.forms.fieldValidation.indexNameInvalidCharactersError": "Le nom de l'index contient {characterListLength, plural, one {le caractère non valide suivant} many {les caractères non valides suivants} other {les caractères non valides suivants}} : {characterList}.", + "esUi.forms.fieldValidation.indexPatternInvalidCharactersError": "Le modèle d'indexation contient {characterListLength, plural, one {le caractère non valide suivant} many {les caractères non valides suivants} other {les caractères non valides suivants}} {characterList}.", "esUi.cronEditor.cronDaily.fieldHour.textAtLabel": "À", "esUi.cronEditor.cronDaily.fieldTimeLabel": "Heure", "esUi.cronEditor.cronDaily.hourSelectLabel": "Heure", @@ -2530,7 +2645,7 @@ "esUi.cronEditor.cronWeekly.fieldTimeLabel": "Heure", "esUi.cronEditor.cronWeekly.hourSelectLabel": "Heure", "esUi.cronEditor.cronWeekly.minuteSelectLabel": "Minute", - "esUi.cronEditor.cronWeekly.textOnLabel": "Activé", + "esUi.cronEditor.cronWeekly.textOnLabel": "Le", "esUi.cronEditor.cronYearly.fieldDate.textOnTheLabel": "Le", "esUi.cronEditor.cronYearly.fieldDateLabel": "Date", "esUi.cronEditor.cronYearly.fieldHour.textAtLabel": "À", @@ -2555,7 +2670,7 @@ "esUi.cronEditor.month.july": "juillet", "esUi.cronEditor.month.june": "juin", "esUi.cronEditor.month.march": "mars", - "esUi.cronEditor.month.may": "Mai", + "esUi.cronEditor.month.may": "mai", "esUi.cronEditor.month.november": "novembre", "esUi.cronEditor.month.october": "octobre", "esUi.cronEditor.month.september": "septembre", @@ -2575,24 +2690,26 @@ "exceptionList-components.empty.viewer.state.empty.viewer_button": "Créer une exception {exceptionType}", "exceptionList-components.exception_list_header_edit_modal_name": "Modifier {listName}", "exceptionList-components.exception_list_header_linked_rules": "Associé à {noOfRules} règles", - "exceptionList-components.exceptions.card.exceptionItem.affectedRules": "Affecte {numRules} {numRules, plural, =1 {règle} other {règles}}", + "exceptionList-components.exceptions.card.exceptionItem.affectedRules": "Affecte {numRules} {numRules, plural, =1 {règle} one {règles} many {règles} other {règles}}", "exceptionList-components.exceptions.exceptionItem.card.deleteItemButton": "Supprimer l'exception {listType}", "exceptionList-components.exceptions.exceptionItem.card.editItemButton": "Modifier l'exception {listType}", - "exceptionList-components.exceptions.exceptionItem.card.showCommentsLabel": "Afficher {comments, plural, =1 {le commentaire} other {les commentaires}} ({comments})", + "exceptionList-components.exceptions.exceptionItem.card.showCommentsLabel": "Afficher {comments, plural, =1 {commentaire} one {le commentaire} many {les commentaires} other {les commentaires}} ({comments})", "exceptionList-components.empty.viewer.state.empty_search.body": "Essayez de modifier votre recherche", "exceptionList-components.empty.viewer.state.empty_search.search.title": "Aucun résultat ne correspond à vos critères de recherche.", "exceptionList-components.empty.viewer.state.empty.body": "Aucune exception ne figure dans votre liste. Créez votre première exception.", "exceptionList-components.empty.viewer.state.empty.title": "Ajouter des exceptions à cette liste", "exceptionList-components.empty.viewer.state.error_body": "Une erreur s'est produite lors du chargement des éléments d'exception. Contactez votre administrateur pour obtenir de l'aide.", "exceptionList-components.empty.viewer.state.error_title": "Impossible de charger les éléments d'exception", - "exceptionList-components.exception_list_header_breadcrumb": "Exceptions de règle", + "exceptionList-components.exception_list_header_breadcrumb": "Listes d'exceptions partagées", "exceptionList-components.exception_list_header_delete_action": "Supprimer la liste d'exceptions", "exceptionList-components.exception_list_header_description": "Ajouter une description", "exceptionList-components.exception_list_header_description_textbox": "Description (facultative)", "exceptionList-components.exception_list_header_description_textboxexceptionList-components.exception_list_header_name_required_eror": "Le nom de liste ne peut pas être vide", + "exceptionList-components.exception_list_header_duplicate_action": "Dupliquer la liste d'exceptions", "exceptionList-components.exception_list_header_edit_modal_cancel_button": "Annuler", "exceptionList-components.exception_list_header_edit_modal_save_button": "Enregistrer", "exceptionList-components.exception_list_header_export_action": "Exporter la liste d'exceptions", + "exceptionList-components.exception_list_header_link_rules_button": "Lier les règles", "exceptionList-components.exception_list_header_list_id": "ID de liste", "exceptionList-components.exception_list_header_name": "Ajouter un nom", "exceptionList-components.exception_list_header_Name_textbox": "Nom", @@ -2672,6 +2789,7 @@ "expressionMetricVis.function.dimension.splitGroup": "Diviser le groupe", "expressionMetricVis.function.dimension.timeField": "Champ temporel", "expressionMetricVis.function.help": "Visualisation de l'indicateur", + "expressionMetricVis.function.icon.help": "Fournit une icône de visualisation statique.", "expressionMetricVis.function.inspectorTableId.help": "ID pour le tableau de l'inspecteur", "expressionMetricVis.function.max.help.": "La dimension contenant la valeur maximale.", "expressionMetricVis.function.metric.help": "L’indicateur principal.", @@ -2695,6 +2813,7 @@ "expressionPartitionVis.reusable.function.errors.moreThenNumberBuckets": "Les compartiments de plus de {maxLength} ne sont pas pris en charge.", "expressionPartitionVis.legend.filterForValueButtonAriaLabel": "Filtrer sur la valeur", "expressionPartitionVis.legend.filterOutValueButtonAriaLabel": "Exclure la valeur", + "expressionPartitionVis.legend.legendActionsAria": "Actions de légende", "expressionPartitionVis.metricToLabel.help": "Paires clé-valeur JSON de l'ID de colonne pour l'étiquette", "expressionPartitionVis.partitionLabels.function.args.colorOverrides.help": "Définit des couleurs spécifiques pour des étiquettes spécifiques.", "expressionPartitionVis.partitionLabels.function.args.last_level.help": "Afficher les étiquettes de niveau supérieur uniquement pour les camemberts/graphiques en anneau", @@ -2735,7 +2854,7 @@ "expressionPartitionVis.waffle.function.args.bucketHelpText": "Configuration des dimensions de compartiment", "expressionPartitionVis.waffle.function.args.showValuesInLegendHelpText": "Afficher les valeurs dans la légende", "expressionRepeatImage.error.repeatImage.missingMaxArgument": "{maxArgument} doit être défini si un {emptyImageArgument} est fourni", - "expressionRepeatImage.functions.repeatImage.args.emptyImageHelpText": "Comble la différence entre les paramètres {CONTEXT} et {maxArg}pour l'élément avec cette image. Spécifiez une ressource d'image sous la forme d'une {BASE64} de données {URL}, ou saisissez une sous-expression.", + "expressionRepeatImage.functions.repeatImage.args.emptyImageHelpText": "Comble la différence entre les paramètres {CONTEXT} et {maxArg}pour l'élément avec cette image. Spécifiez une ressource d'image sous la forme d'une {URL} de données {BASE64}, ou saisissez une sous-expression.", "expressionRepeatImage.functions.repeatImage.args.imageHelpText": "L'image à répéter. Spécifiez une ressource d'image sous la forme d'une {URL} de données {BASE64}, ou saisissez une sous-expression.", "expressionRepeatImage.functions.repeatImage.args.maxHelpText": "Le nombre maximal de fois que l'image peut être répétée.", "expressionRepeatImage.functions.repeatImage.args.sizeHelpText": "La hauteur ou largeur maximale de l'image, en pixels. Lorsque l'image est plus haute que large, cette fonction limite la hauteur.", @@ -2911,6 +3030,7 @@ "expressionXY.layers.table.help": "Tableau", "expressionXY.legend.filterForValueButtonAriaLabel": "Filtrer sur la valeur", "expressionXY.legend.filterOutValueButtonAriaLabel": "Exclure la valeur", + "expressionXY.legend.legendActionsAria": "Actions de légende", "expressionXY.legendConfig.floatingColumns.help": "Spécifie le nombre de colonnes lorsque la légende est affichée à l'intérieur du graphique.", "expressionXY.legendConfig.help": "Configurer la légende du graphique xy", "expressionXY.legendConfig.horizontalAlignment.help": "Spécifie l'alignement horizontal de la légende lorsqu'elle est affichée à l'intérieur du graphique.", @@ -3081,10 +3201,31 @@ "fieldFormats.url.types.audio": "Audio", "fieldFormats.url.types.img": "Image", "fieldFormats.url.types.link": "Lien", + "generateCsv.esErrorMessage": "Réponse {statusCode} reçue d'Elasticsearch : {message}", + "generateCsv.incorrectRowCount": "Une erreur a été rencontrée avec le nombre de lignes CSV générées à partir de la recherche : {expected} prévues, {received} reçues.", + "generateCsv.unknownErrorMessage": "Une erreur inconnue est survenue : {message}", + "generateCsv.authenticationExpired.partialResultsMessage": "Ce rapport contient des résultats CSV partiels, car le token d'authentification a expiré. Exportez une quantité moindre de données ou augmentez le délai d'expiration du token d'authentification.", + "generateCsv.csvUnableToClosePit": "Impossible de fermer le point temporel utilisé pour la recherche. Vérifiez les logs de serveur Kibana.", + "generateCsv.escapedFormulaValues": "Le CSV peut contenir des formules dont les valeurs sont précédées d'un caractère d'échappement", + "grouping.eventsTab.unit": "{totalCount, plural, =1 {événement} one {événements} many {événements} other {événements}}", + "grouping.groupByPanelTitle": "Sélectionner jusqu'à {groupingLevelsCount} regroupements", + "grouping.total.unit": "{totalCount, plural, =1 {regrouper} one {groupe} many {groupes} other {groupes}}", + "grouping.additionalActions.takeAction": "Entreprendre des actions", + "grouping.alerts.label": "Regrouper les alertes par", + "grouping.customGroupByOptionName": "Champ personnalisé", + "grouping.customGroupByPanelTitle": "Champ personnalisé Regrouper par", + "grouping.empty.description": "Essayer de rechercher sur une période plus longue ou de modifier votre champ d'alertes de groupe", + "grouping.empty.title": "Aucun résultat de regroupement ne correspond à votre champ d'alertes de groupe sélectionné", + "grouping.groupSelector.customGroupByDropdownPlacehoder": "Effectuez une sélection", + "grouping.groupSelector.customGroupByFieldLabel": "Champ", + "grouping.groupSelector.customGroupByHelpText": "Il s'agit du champ utilisé pour l'agrégation de termes", + "grouping.noneGroupByOptionName": "Aucun", + "grouping.selector.grouping.label.add": "Ajouter", "guidedOnboarding.dropdownPanel.completeGuideFlyoutDescription": "Vous avez terminé le guide Elastic {guideName}. N'hésitez pas à consulter à nouveau les guides pour obtenir une assistance supplémentaire sur l'intégration ou pour un petit rappel.", "guidedOnboarding.dropdownPanel.progressValueLabel": "{stepCount} étapes", "guidedOnboarding.guidedSetupStepButtonLabel": "Guide de configuration : étape {stepNumber}", "guidedOnboarding.dropdownPanel.backToGuidesLink": "Retour aux guides", + "guidedOnboarding.dropdownPanel.closeButton.ariaLabel": "Fermer la boîte de dialogue modale", "guidedOnboarding.dropdownPanel.completedLabel": "Terminé", "guidedOnboarding.dropdownPanel.completeGuideError": "Impossible de mettre à jour le guide. Attendez un moment et réessayez.", "guidedOnboarding.dropdownPanel.completeGuideFlyoutTitle": "Bien joué !", @@ -3101,6 +3242,7 @@ "guidedOnboarding.dropdownPanel.startStepButtonLabel": "Début", "guidedOnboarding.dropdownPanel.stepHandlerError": "Impossible de mettre à jour le guide. Attendez un moment et réessayez.", "guidedOnboarding.dropdownPanel.wellDoneAnimatedGif": "Gif animé de guide terminé", + "guidedOnboarding.featureRegistry.featureName": "Guides de configuration", "guidedOnboarding.guidedSetupButtonLabel": "Guide de configuration", "guidedOnboarding.guidedSetupRedirectButtonLabel": "Guides de configuration", "guidedOnboarding.quitGuideModal.cancelButtonLabel": "Annuler", @@ -3110,7 +3252,7 @@ "guidedOnboarding.quitGuideModal.quitButtonLabel": "Quitter le guide", "guidedOnboardingPackage.gettingStarted.cards.apmObservability.title": "Monitorer les performances de {lineBreak} mon application (APM / traçage)", "guidedOnboardingPackage.gettingStarted.cards.appSearch.title": "Développer une application {lineBreak} au-dessus d'Elasticsearch", - "guidedOnboardingPackage.gettingStarted.cards.cloudSecurity.title": "Sécuriser mes ressources cloud avec {lineBreak} la gestion du niveau de sécurité", + "guidedOnboardingPackage.gettingStarted.cards.cloudSecurity.title": "Sécuriser mes ressources cloud avec {lineBreak} la gestion du niveau de sécurité du cloud (CSPM)", "guidedOnboardingPackage.gettingStarted.cards.databaseSearch.title": "Rechercher dans les bases de données {lineBreak} et les systèmes d'entreprise", "guidedOnboardingPackage.gettingStarted.cards.hostsSecurity.title": "Sécuriser mes hôtes {lineBreak} avec Endpoint Security", "guidedOnboardingPackage.gettingStarted.cards.progressLabel": "{numberCompleteSteps} étape(s) terminée(s) sur {numberSteps}", @@ -3410,6 +3552,17 @@ "home.sampleData.logsSpec.visitorsMapTitle": "[Logs] Mappage des visiteurs", "home.sampleData.logsSpecDescription": "Exemple de données, de visualisations et de tableaux de bord pour le monitoring des logs Internet.", "home.sampleData.logsSpecTitle": "Exemple de logs Internet", + "home.sampleData.logsTsdbSpec.bytesDistributionTitle": "[Logs TSDB] Distribution des octets", + "home.sampleData.logsTsdbSpec.goalsTitle": "[Logs TSDB] Objectifs", + "home.sampleData.logsTsdbSpec.heatmapTitle": "[Logs TSDB] Carte thermique de destination unique", + "home.sampleData.logsTsdbSpec.hostVisitsBytesTableTitle": "[Logs TSDB] Tableau des hôtes, visites et octets", + "home.sampleData.logsTsdbSpec.responseCodesOverTimeTitle": "[Logs TSDB] Codes de réponse sur la durée + annotations", + "home.sampleData.logsTsdbSpec.sourceAndDestinationSankeyChartTitle": "[Logs TSDB] Diagramme de Sankey de système d'exploitation source et destination", + "home.sampleData.logsTsdbSpec.visitorsMapTitle": "[Logs TSDB] Carte des visiteurs", + "home.sampleData.logsTsdbSpec.webTrafficDescription": "Analyser des données de log factices relatives au trafic Internet du site d'Elastic", + "home.sampleData.logsTsdbSpec.webTrafficTitle": "[Logs TSDB] Trafic Internet", + "home.sampleData.logsTsdbSpecDescription": "Exemple de données, de visualisations et de tableaux de bord pour le monitoring des logs Internet.", + "home.sampleData.logsTsdbSpecTitle": "Exemple de logs Internet (TSDB)", "home.solutionsSection.sectionTitle": "Choisir votre solution", "home.tryButtonLabel": "Ajouter des intégrations", "home.tutorial.addDataToKibanaDescription.integrations": "intégrations", @@ -3509,13 +3662,13 @@ "home.tutorials.common.auditbeatInstructions.install.osxTitle": "Télécharger et installer Auditbeat", "home.tutorials.common.auditbeatInstructions.install.rpmTitle": "Télécharger et installer Auditbeat", "home.tutorials.common.auditbeatInstructions.install.windowsTitle": "Télécharger et installer Auditbeat", - "home.tutorials.common.auditbeatInstructions.start.debTextPre": "La commande \"setup\" charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", + "home.tutorials.common.auditbeatInstructions.start.debTextPre": "La commande ''setup'' charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", "home.tutorials.common.auditbeatInstructions.start.debTitle": "Lancer Auditbeat", - "home.tutorials.common.auditbeatInstructions.start.osxTextPre": "La commande \"setup\" charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", + "home.tutorials.common.auditbeatInstructions.start.osxTextPre": "La commande ''setup'' charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", "home.tutorials.common.auditbeatInstructions.start.osxTitle": "Lancer Auditbeat", - "home.tutorials.common.auditbeatInstructions.start.rpmTextPre": "La commande \"setup\" charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", + "home.tutorials.common.auditbeatInstructions.start.rpmTextPre": "La commande ''setup'' charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", "home.tutorials.common.auditbeatInstructions.start.rpmTitle": "Lancer Auditbeat", - "home.tutorials.common.auditbeatInstructions.start.windowsTextPre": "La commande \"setup\" charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", + "home.tutorials.common.auditbeatInstructions.start.windowsTextPre": "La commande ''setup'' charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", "home.tutorials.common.auditbeatInstructions.start.windowsTitle": "Lancer Auditbeat", "home.tutorials.common.auditbeatStatusCheck.buttonLabel": "Vérifier les données", "home.tutorials.common.auditbeatStatusCheck.errorText": "Aucune donnée n'a encore été reçue.", @@ -3539,13 +3692,13 @@ "home.tutorials.common.filebeatInstructions.install.osxTitle": "Télécharger et installer Filebeat", "home.tutorials.common.filebeatInstructions.install.rpmTitle": "Télécharger et installer Filebeat", "home.tutorials.common.filebeatInstructions.install.windowsTitle": "Télécharger et installer Filebeat", - "home.tutorials.common.filebeatInstructions.start.debTextPre": "La commande \"setup\" charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", + "home.tutorials.common.filebeatInstructions.start.debTextPre": "La commande ''setup'' charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", "home.tutorials.common.filebeatInstructions.start.debTitle": "Lancer Filebeat", - "home.tutorials.common.filebeatInstructions.start.osxTextPre": "La commande \"setup\" charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", + "home.tutorials.common.filebeatInstructions.start.osxTextPre": "La commande ''setup'' charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", "home.tutorials.common.filebeatInstructions.start.osxTitle": "Lancer Filebeat", - "home.tutorials.common.filebeatInstructions.start.rpmTextPre": "La commande \"setup\" charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", + "home.tutorials.common.filebeatInstructions.start.rpmTextPre": "La commande ''setup'' charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", "home.tutorials.common.filebeatInstructions.start.rpmTitle": "Lancer Filebeat", - "home.tutorials.common.filebeatInstructions.start.windowsTextPre": "La commande \"setup\" charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", + "home.tutorials.common.filebeatInstructions.start.windowsTextPre": "La commande ''setup'' charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", "home.tutorials.common.filebeatInstructions.start.windowsTitle": "Lancer Filebeat", "home.tutorials.common.filebeatStatusCheck.buttonLabel": "Vérifier les données", "home.tutorials.common.filebeatStatusCheck.errorText": "Aucune donnée n'a encore été reçue de ce module.", @@ -3634,13 +3787,13 @@ "home.tutorials.common.metricbeatInstructions.install.osxTitle": "Télécharger et installer Metricbeat", "home.tutorials.common.metricbeatInstructions.install.rpmTitle": "Télécharger et installer Metricbeat", "home.tutorials.common.metricbeatInstructions.install.windowsTitle": "Télécharger et installer Metricbeat", - "home.tutorials.common.metricbeatInstructions.start.debTextPre": "La commande \"setup\" charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", + "home.tutorials.common.metricbeatInstructions.start.debTextPre": "La commande ''setup'' charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", "home.tutorials.common.metricbeatInstructions.start.debTitle": "Lancer Metricbeat", - "home.tutorials.common.metricbeatInstructions.start.osxTextPre": "La commande \"setup\" charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", + "home.tutorials.common.metricbeatInstructions.start.osxTextPre": "La commande ''setup'' charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", "home.tutorials.common.metricbeatInstructions.start.osxTitle": "Lancer Metricbeat", - "home.tutorials.common.metricbeatInstructions.start.rpmTextPre": "La commande \"setup\" charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", + "home.tutorials.common.metricbeatInstructions.start.rpmTextPre": "La commande ''setup'' charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", "home.tutorials.common.metricbeatInstructions.start.rpmTitle": "Lancer Metricbeat", - "home.tutorials.common.metricbeatInstructions.start.windowsTextPre": "La commande \"setup\" charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", + "home.tutorials.common.metricbeatInstructions.start.windowsTextPre": "La commande ''setup'' charge les tableaux de bord Kibana. Si les tableaux de bord sont déjà configurés, omettez cette commande.", "home.tutorials.common.metricbeatInstructions.start.windowsTitle": "Lancer Metricbeat", "home.tutorials.common.metricbeatStatusCheck.buttonLabel": "Vérifier les données", "home.tutorials.common.metricbeatStatusCheck.errorText": "Aucune donnée n'a encore été reçue de ce module.", @@ -3648,7 +3801,7 @@ "home.tutorials.common.metricbeatStatusCheck.title": "Statut du module", "home.tutorials.common.premCloudInstructions.option1.title": "Option 1 : essayer dans Elastic Cloud", "home.tutorials.common.premCloudInstructions.option2.title": "Option 2 : connecter un Kibana local à une instance cloud", - "home.tutorials.common.winlogbeat.cloudInstructions.gettingStarted.title": "Commencer", + "home.tutorials.common.winlogbeat.cloudInstructions.gettingStarted.title": "Premiers pas", "home.tutorials.common.winlogbeat.premCloudInstructions.gettingStarted.title": "Commencer", "home.tutorials.common.winlogbeat.premInstructions.gettingStarted.title": "Commencer", "home.tutorials.common.winlogbeatCloudInstructions.config.windowsTitle": "Modifier la configuration", @@ -3981,12 +4134,12 @@ "imageEmbeddable.triggers.imageClickTriggerTitle": "Clic sur l'image", "indexPatternEditor.pagingLabel": "Lignes par page : {perPage}", "indexPatternEditor.rollup.uncaughtError": "Erreur de vue de données de cumul : {error}", - "indexPatternEditor.status.matchAnyLabel.matchAnyDetail": "Votre modèle d'indexation peut correspondre à {sourceCount, plural, one {# source} other {# sources}}.", - "indexPatternEditor.status.notMatchLabel.allIndicesLabel": "{indicesLength, plural, one {# source} other {# sources}}", + "indexPatternEditor.status.matchAnyLabel.matchAnyDetail": "Votre modèle d'indexation peut correspondre à {sourceCount, plural, one {# source} many {# sources} other {# sources}}.", + "indexPatternEditor.status.notMatchLabel.allIndicesLabel": "{indicesLength, plural, one {# source} many {# sources} other {# sources}}", "indexPatternEditor.status.notMatchLabel.notMatchDetail": "Le modèle d'indexation spécifié ne correspond à aucun flux de données, index ni alias d'index. Vous pouvez faire correspondre {strongIndices}.", - "indexPatternEditor.status.partialMatchLabel.partialMatchDetail": "Votre modèle d'indexation ne correspond à aucun flux de données, index ni alias d'index, mais {strongIndices} {matchedIndicesLength, plural, one {est semblable} other {sont semblables}}.", - "indexPatternEditor.status.partialMatchLabel.strongIndicesLabel": "{matchedIndicesLength, plural, one {source} other {# sources}}", - "indexPatternEditor.status.successLabel.successDetail": "Votre modèle d'indexation correspond à {sourceCount} {sourceCount, plural, one {source} other {sources}}.", + "indexPatternEditor.status.partialMatchLabel.partialMatchDetail": "Votre modèle d'indexation ne correspond à aucun flux de données, index ni alias d'index, mais {strongIndices} {matchedIndicesLength, plural, one {est} many {sont} other {sont}} semblable(s).", + "indexPatternEditor.status.partialMatchLabel.strongIndicesLabel": "{matchedIndicesLength, plural, one {source} many {# sources} other {# sources}}", + "indexPatternEditor.status.successLabel.successDetail": "Votre modèle d'indexation peut correspondre à {sourceCount} {sourceCount, plural, one {source} many {sources} other {sources}}.", "indexPatternEditor.createIndex.noMatch": "Le nom doit correspondre à au moins un flux de données, index ou alias d'index.", "indexPatternEditor.createIndexPattern.stepTime.noTimeFieldOptionLabel": "--- Je ne souhaite pas utiliser le filtre temporel ---", "indexPatternEditor.dataView.unableSaveLabel": "Échec de l'enregistrement de la vue de données.", @@ -4022,6 +4175,9 @@ "indexPatternEditor.form.titleAriaLabel": "Champ de modèle d'indexation", "indexPatternEditor.goToManagementPage": "Gérer les paramètres et afficher les détails de champ", "indexPatternEditor.loadingHeader": "Recherche d'index correspondants…", + "indexPatternEditor.previewPanel.viewModeGroup.allSourcesButton": "Toutes les sources", + "indexPatternEditor.previewPanel.viewModeGroup.legend": "Sources visibles", + "indexPatternEditor.previewPanel.viewModeGroup.matchingSourcesButton": "Sources correspondantes", "indexPatternEditor.requireTimestampOption.ValidationErrorMessage": "Sélectionnez un champ d'horodatage.", "indexPatternEditor.rollupDataView.createIndex.noMatchError": "Erreur de vue de données de cumul : doit correspondre à un index de cumul", "indexPatternEditor.rollupDataView.createIndex.tooManyMatchesError": "Erreur de vue de données de cumul : ne peut correspondre qu’à un index de cumul", @@ -4033,6 +4189,13 @@ "indexPatternEditor.status.noSystemIndicesWithPromptLabel": "Aucun flux de données, index ni alias d'index ne correspond à votre modèle d'indexation.", "indexPatternEditor.status.notMatchLabel.notMatchNoIndicesDetail": "Le modèle d'indexation spécifié ne correspond à aucun flux de données, index ni alias d'index.", "indexPatternEditor.title": "Créer une vue de données", + "indexPatternEditor.titleDocsPopover.ariaLabel": "Exemples de modèle d'indexation", + "indexPatternEditor.titleDocsPopover.dontUseSpecialCharactersDescription": "Les espaces et les caractères /?\"<>| ne sont pas autorisés.", + "indexPatternEditor.titleDocsPopover.indexPatternDescription": "Un modèle d'indexation est une chaîne que vous utilisez pour une correspondance avec un ou plusieurs flux de données, index ou alias.", + "indexPatternEditor.titleDocsPopover.title": "Modèle d'indexation", + "indexPatternEditor.titleDocsPopover.useCommasDescription": "Séparez plusieurs sources uniques par une virgule (,).", + "indexPatternEditor.titleDocsPopover.useMinusDescription": "Excluez une source en la faisant précéder du signe moins (-).", + "indexPatternEditor.titleDocsPopover.useWildcardDescription": "Faites correspondre plusieurs sources avec un caractère générique (*).", "indexPatternEditor.titleEditMode": "Modifier la vue de données", "indexPatternEditor.typeSelect.betaLabel": "Bêta", "indexPatternEditor.typeSelect.rollup": "Cumul", @@ -4055,7 +4218,7 @@ "indexPatternFieldEditor.number.numeralLabel": "Modèle de format Numeral.js (Par défaut : {defaultPattern})", "indexPatternFieldEditor.cancelField.confirmationModal.cancelButtonLabel": "Annuler", "indexPatternFieldEditor.cancelField.confirmationModal.description": "Les modifications apportées à votre champ seront ignorées. Voulez-vous vraiment continuer ?", - "indexPatternFieldEditor.cancelField.confirmationModal.title": "Abandonner les modifications", + "indexPatternFieldEditor.cancelField.confirmationModal.title": "Ignorer les modifications", "indexPatternFieldEditor.color.actions": "Actions", "indexPatternFieldEditor.color.addColorButton": "Ajouter une couleur", "indexPatternFieldEditor.color.backgroundLabel": "Couleur d'arrière-plan", @@ -4070,7 +4233,7 @@ "indexPatternFieldEditor.defaultFormatDropDown": "- Par défaut -", "indexPatternFieldEditor.deleteField.savedHeader": "\"{fieldName}\" enregistré", "indexPatternFieldEditor.deleteRuntimeField.confirmationModal.cancelButtonLabel": "Annuler", - "indexPatternFieldEditor.deleteRuntimeField.confirmationModal.removeButtonLabel": "Retirer le champ", + "indexPatternFieldEditor.deleteRuntimeField.confirmationModal.removeButtonLabel": "Supprimer le champ", "indexPatternFieldEditor.deleteRuntimeField.confirmationModal.removeMultipleButtonLabel": "Supprimer les champs", "indexPatternFieldEditor.deleteRuntimeField.confirmationModal.saveButtonLabel": "Enregistrer les modifications", "indexPatternFieldEditor.deleteRuntimeField.confirmModal.deleteSingleTitle": "Supprimer le champ \"{name}\"", @@ -4163,7 +4326,7 @@ "indexPatternFieldEditor.number.documentationLabel": "Documentation", "indexPatternFieldEditor.samples.inputHeader": "Entrée", "indexPatternFieldEditor.samples.outputHeader": "Sortie", - "indexPatternFieldEditor.samplesHeader": "Échantillons", + "indexPatternFieldEditor.samplesHeader": "Exemples", "indexPatternFieldEditor.save.deleteErrorTitle": "Impossible d'enregistrer la suppression du champ", "indexPatternFieldEditor.save.errorTitle": "Impossible d'enregistrer la modification du champ", "indexPatternFieldEditor.saveRuntimeField.confirmationModal.cancelButtonLabel": "Annuler", @@ -4182,16 +4345,16 @@ "indexPatternFieldEditor.url.heightLabel": "Hauteur", "indexPatternFieldEditor.url.labelTemplateHelpText": "Aide sur le modèle d'étiquette", "indexPatternFieldEditor.url.labelTemplateLabel": "Modèle d'étiquette", - "indexPatternFieldEditor.url.offLabel": "Désactivé", - "indexPatternFieldEditor.url.onLabel": "Activé", + "indexPatternFieldEditor.url.offLabel": "Off", + "indexPatternFieldEditor.url.onLabel": "On", "indexPatternFieldEditor.url.openTabLabel": "Ouvrir dans un nouvel onglet", "indexPatternFieldEditor.url.template.helpLinkText": "Aide sur le modèle d'URL", "indexPatternFieldEditor.url.typeLabel": "Type", "indexPatternFieldEditor.url.urlTemplateLabel": "Modèle d'URL", "indexPatternFieldEditor.url.widthLabel": "Largeur", "indexPatternManagement.createDataView.emptyState.createAnywayTxt": "Vous pouvez également {link}", - "indexPatternManagement.dataViewTable.deleteButtonLabel": "Supprimer {selectedItems, number} {selectedItems, plural, one {vue de données} other {vues de données}}", - "indexPatternManagement.dataViewTable.deleteConfirmSummary": "Vous allez supprimer définitivement {count, number} {count, plural, one {vue de données} other {vues de données}}.", + "indexPatternManagement.dataViewTable.deleteButtonLabel": "Supprimer {selectedItems, number} {selectedItems, plural, one {Vue de données} many {Vues de données} other {Vues de données}}", + "indexPatternManagement.dataViewTable.deleteConfirmSummary": "Vous allez supprimer définitivement {count, number} {count, plural, one {vue de données} many {vues de données} other {vues de données}}.", "indexPatternManagement.defaultFormatHeader": "Format (Par défaut : {defaultFormat})", "indexPatternManagement.deleteFieldLabel": "Il est impossible de récupérer un champ supprimé.{separator}Voulez-vous vraiment continuer ?", "indexPatternManagement.editDataView.deleteWarning": "La vue de données {dataViewName} va être supprimée. Vous ne pouvez pas annuler cette action.", @@ -4203,7 +4366,7 @@ "indexPatternManagement.editIndexPattern.list.DateHistogramDelaySummary": "retard : {delay},", "indexPatternManagement.editIndexPattern.list.dateHistogramSummary": "{aggName} (intervalle : {interval}, {delay} {time_zone})", "indexPatternManagement.editIndexPattern.list.histogramSummary": "{aggName} (intervalle : {interval})", - "indexPatternManagement.editIndexPattern.mappingConflictLabel": "{conflictFieldsLength, plural, one {Un champ est défini} other {# champs sont définis}} avec plusieurs types (chaîne, entier, etc.) dans les différents index qui correspondent à ce modèle. Vous pourrez peut-être utiliser ce ou ces champs en conflit dans certaines parties de Kibana, mais ils ne seront pas disponibles pour les fonctions qui nécessitent que Kibana connaisse leur type. Pour corriger ce problème, vous devrez réindexer vos données.", + "indexPatternManagement.editIndexPattern.mappingConflictLabel": "{conflictFieldsLength, plural, one {Un champ est défini} many {# champs sont définis} other {# champs sont définis}} avec plusieurs types (chaîne, entier, etc.) dans les différents index qui correspondent à ce modèle. Vous pourrez peut-être utiliser ce ou ces champs en conflit dans certaines parties de Kibana, mais ils ne seront pas disponibles pour les fonctions qui nécessitent que Kibana connaisse leur type. Pour corriger ce problème, vous devrez réindexer vos données.", "indexPatternManagement.editIndexPattern.scripted.deprecationLangLabel.deprecationLangDetail": "Les langages déclassés suivants sont en cours d'utilisation : {deprecatedLangsInUse}. La prise en charge de ces langages sera supprimée dans la prochaine version majeure de Kibana et d'Elasticsearch. Convertissez vos champs scriptés en {link} pour éviter tout problème.", "indexPatternManagement.editIndexPattern.tabs.relationshipsHeader": "Relations ({count})", "indexPatternManagement.mappingConflictLabel.mappingConflictDetail": "{mappingConflict} Vous avez déjà un champ avec le nom {fieldName}. Si vous donnez le même nom à votre champ scripté, vous ne pourrez pas interroger les deux champs en même temps.", @@ -4372,7 +4535,7 @@ "indexPatternManagement.languageLabel": "Langue", "indexPatternManagement.mappingConflictLabel.mappingConflictLabel": "Conflit de mapping :", "indexPatternManagement.multiTypeLabelDesc": "Le type de ce champ varie selon les index. Il n'est pas disponible pour de nombreuses fonctions d'analyse. Les index par type sont les suivants :", - "indexPatternManagement.nameErrorMessage": "Le nom est obligatoire", + "indexPatternManagement.nameErrorMessage": "Nom obligatoire", "indexPatternManagement.nameLabel": "Nom", "indexPatternManagement.namePlaceholder": "Nouveau champ scripté", "indexPatternManagement.objectsTable.relationships.columnTitleDescription": "Titre de l'objet enregistré", @@ -4459,7 +4622,7 @@ "inputControl.vis.listControl.selectPlaceholder": "Sélectionner…", "inputControl.vis.listControl.selectTextPlaceholder": "Sélectionner…", "inspector.requests.requestTimeLabel": "{requestTime} ms", - "inspector.requests.requestWasMadeDescription": "{requestsCount, plural, one {# requête a été effectuée} other {# requêtes ont été effectuées}}{failedRequests}", + "inspector.requests.requestWasMadeDescription": "{requestsCount, plural, one {# demande effectuée} many {# demandes effectuées} other {# demandes effectuées}} {failedRequests}", "inspector.requests.requestWasMadeDescription.requestHadFailureText": ", {failedCount} en échec", "inspector.requests.searchSessionId": "ID de la session de recherche : {searchSessionId}", "inspector.view": "Afficher : {viewName}", @@ -4645,6 +4808,7 @@ "presentationUtil.dashboardPicker.searchDashboardPlaceholder": "Recherche dans les tableaux de bord…", "presentationUtil.dataViewPicker.changeDataViewTitle": "Vue de données", "presentationUtil.fieldPicker.noFieldsLabel": "Aucun champ correspondant", + "presentationUtil.fieldPicker.selectableAriaLabel": "Sélectionner un champ", "presentationUtil.fieldSearch.fieldFilterButtonLabel": "Filtrer par type", "presentationUtil.fieldSearch.filterByTypeLabel": "Filtrer par type", "presentationUtil.fieldSearch.searchPlaceHolder": "Rechercher les noms de champs", @@ -4673,14 +4837,11 @@ "presentationUtil.saveModalDashboard.dashboardInfoTooltip": "Les éléments ajoutés à la bibliothèque Visualize sont disponibles pour tous les tableaux de bord. Les modifications apportées à un élément de bibliothèque sont répercutées partout où il est utilisé.", "presentationUtil.saveModalDashboard.existingDashboardOptionLabel": "Existant", "presentationUtil.saveModalDashboard.libraryOptionLabel": "Ajouter à la bibliothèque", - "presentationUtil.saveModalDashboard.newDashboardOptionLabel": "Nouveauté", + "presentationUtil.saveModalDashboard.newDashboardOptionLabel": "Nouveau", "presentationUtil.saveModalDashboard.noDashboardOptionLabel": "Aucun", "presentationUtil.saveModalDashboard.saveAndGoToDashboardLabel": "Enregistrer et accéder au tableau de bord", "presentationUtil.saveModalDashboard.saveLabel": "Enregistrer", "presentationUtil.saveModalDashboard.saveToLibraryLabel": "Enregistrer et ajouter à la bibliothèque", - "reporting.common.browserCouldNotLaunchErrorMessage": "Impossible de générer des captures d'écran, car le navigateur ne s’est pas lancé. Consultez les logs de serveur pour en savoir plus.", - "reporting.common.cloud.insufficientSystemMemoryError": "Impossible de générer ce rapport en raison d’un manque de mémoire.", - "reporting.common.pdfWorkerOutOfMemoryErrorMessage": "Impossible de générer un PDF en raison d’un manque de mémoire. Essayez de réduire la taille du PDF et relancez ce rapport.", "savedObjects.confirmModal.overwriteConfirmationMessage": "Voulez-vous vraiment écraser {title} ?", "savedObjects.confirmModal.overwriteTitle": "Écraser {name} ?", "savedObjects.confirmModal.saveDuplicateButtonLabel": "Enregistrer {name}", @@ -4704,22 +4865,22 @@ "savedObjectsManagement.importSummary.createdCountHeader": "{createdCount} nouveau", "savedObjectsManagement.importSummary.errorCountHeader": "{errorCount} erreur", "savedObjectsManagement.importSummary.errorOutcomeLabel": "{errorMessage}", - "savedObjectsManagement.importSummary.headerLabel": "{importCount, plural, one {1 objet importé} other {# objets importés}}", + "savedObjectsManagement.importSummary.headerLabel": "{importCount, plural, one {1 objet a été importé} many {# objets ont été importés} other {# objets ont été importés}}", "savedObjectsManagement.importSummary.overwrittenCountHeader": "{overwrittenCount} écrasé", - "savedObjectsManagement.objectsTable.delete.successNotification": "{count, plural, one {# objet a bien été supprimé} other {# objets ont bien été supprimés}}.", - "savedObjectsManagement.objectsTable.deleteConfirmModal.cannotDeleteCallout.content": "{objectCount, plural, one {# objet est masqué et ne peut pas être supprimé} other {# objets sont masqués et ne peuvent pas être supprimés}}. {objectCount, plural, one {Il a été exclu} other {Ils ont été exclus}} du récapitulatif du tableau.", - "savedObjectsManagement.objectsTable.deleteConfirmModal.sharedObjectsCallout.title": "{sharedObjectsCount, plural, one {# objet enregistré est partagé} other {# de vos objets enregistrés sont partagés}}", - "savedObjectsManagement.objectsTable.deleteSavedObjectsConfirmModal.deleteButtonLabel": "Supprimer {objectsCount, plural, one {# objet} other {# objets}}", + "savedObjectsManagement.objectsTable.delete.successNotification": "{count, plural, one {# objet a bien été supprimé.} many {# objets ont bien été supprimés.} other {# objets ont bien été supprimés.}} a bien été supprimé.", + "savedObjectsManagement.objectsTable.deleteConfirmModal.cannotDeleteCallout.content": "{objectCount, plural, one {# objet est masqué et ne peut pas être supprimé} many {# objets sont masqués et ne peuvent pas être supprimés} other {# objets sont masqués et ne peuvent pas être supprimés}}. {objectCount, plural, one {Il a été exclu} many {Ils ont été exclus} other {Ils ont été exclus}} du récapitulatif du tableau.", + "savedObjectsManagement.objectsTable.deleteConfirmModal.sharedObjectsCallout.title": "{sharedObjectsCount, plural, one {# objet enregistré est partagé} many {# de vos objets enregistrés ont été partagés} other {# de vos objets enregistrés ont été partagés}}", + "savedObjectsManagement.objectsTable.deleteSavedObjectsConfirmModal.deleteButtonLabel": "Supprimer {objectsCount, plural, one {# objet} many {# objets} other {# objets}}", "savedObjectsManagement.objectsTable.export.toastErrorMessage": "Impossible de générer l'export : {error}", - "savedObjectsManagement.objectsTable.exportObjectsConfirmModalTitle": "Exporter {filteredItemCount, plural, one {# objet} other {# objets}}", + "savedObjectsManagement.objectsTable.exportObjectsConfirmModalTitle": "Exporter {filteredItemCount, plural, one {# objet} many {# objets} other {# objets}}", "savedObjectsManagement.objectsTable.flyout.importFileErrorMessage": "Impossible de traiter le fichier en raison d'une erreur : \"{error}\"", "savedObjectsManagement.objectsTable.flyout.indexPatternConflictsDescription": "Les objets enregistrés suivants utilisent des vues de données qui n'existent pas. Veuillez sélectionner les vues de données que vous souhaitez réassocier. Vous pouvez {indexPatternLink} si nécessaire.", - "savedObjectsManagement.objectsTable.header.exportButtonLabel": "Exporter {filteredCount, plural, one {# objet} other {# objets}}", + "savedObjectsManagement.objectsTable.header.exportButtonLabel": "Exporter {filteredCount, plural, one {# objet} many {# objets} other {# objets}}", "savedObjectsManagement.objectsTable.overwriteModal.body.ambiguousConflict": "\"{title}\" est en conflit avec plusieurs objets existants. En écraser un ?", "savedObjectsManagement.objectsTable.overwriteModal.body.conflict": "\"{title}\" est en conflit avec un objet existant. L'écraser ?", "savedObjectsManagement.objectsTable.overwriteModal.title": "Écraser {type} ?", "savedObjectsManagement.objectsTable.relationships.relationshipsTitle": "Voici les objets enregistrés associés à {title}. La suppression de ce {type} a un impact sur ses objets parents, mais pas sur ses enfants.", - "savedObjectsManagement.objectsTable.table.tooManyResultsLabel": "Affichage de {limit} sur {totalItemCount, plural, one {# objet} other {# objets}}", + "savedObjectsManagement.objectsTable.table.tooManyResultsLabel": "Affichage de {limit} sur {totalItemCount, plural, one {# objet} many {# objets} other {# objets}}", "savedObjectsManagement.view.howToFixErrorDescription": "Si vous savez à quoi cette erreur fait référence, vous pouvez utiliser les {savedObjectsApis} pour la corriger. Sinon, cliquez sur le bouton Supprimer ci-dessus.", "savedObjectsManagement.view.inspectCodeEditorAriaLabel": "inspecter {title}", "savedObjectsManagement.view.inspectItemTitle": "Inspecter {title}", @@ -4790,7 +4951,7 @@ "savedObjectsManagement.objectsTable.relationships.columnErrorDescription": "Erreur rencontrée avec la relation", "savedObjectsManagement.objectsTable.relationships.columnErrorName": "Erreur", "savedObjectsManagement.objectsTable.relationships.columnIdDescription": "ID de l'objet enregistré", - "savedObjectsManagement.objectsTable.relationships.columnIdName": "Id", + "savedObjectsManagement.objectsTable.relationships.columnIdName": "ID", "savedObjectsManagement.objectsTable.relationships.columnRelationship.childAsValue": "Enfant", "savedObjectsManagement.objectsTable.relationships.columnRelationship.parentAsValue": "Parent", "savedObjectsManagement.objectsTable.relationships.columnRelationshipName": "Relation directe", @@ -4842,6 +5003,196 @@ "savedObjectsManagement.view.savedObjectProblemErrorMessage": "Un problème est survenu avec cet objet enregistré.", "savedObjectsManagement.view.savedSearchDoesNotExistErrorMessage": "La recherche enregistrée associée à cet objet n'existe plus.", "savedSearch.legacyURLConflict.errorMessage": "Cette recherche a la même URL qu'un alias hérité. Désactiver l'alias pour résoudre cette erreur : {json}", + "securitySolutionPackages.dataTable.eventsTab.unit": "{totalCount, plural, =1 {alerte} one {alertes} many {alertes} other {alertes}}", + "securitySolutionPackages.dataTable.unit": "{totalCount, plural, =1 {alerte} one {alertes} many {alertes} other {alertes}}", + "securitySolutionPackages.ecsDataQualityDashboard.allTab.allFieldsTableTitle": "Tous les champs – {indexName}", + "securitySolutionPackages.ecsDataQualityDashboard.checkAllErrorCheckingIndexMessage": "Une erreur s'est produite lors de la vérification de l'index {indexName}", + "securitySolutionPackages.ecsDataQualityDashboard.checkingLabel": "Vérification de {index}", + "securitySolutionPackages.ecsDataQualityDashboard.coldPatternTooltip": "{indices} {indices, plural, =1 {index} one {index} many {index} other {index}} correspondant au modèle {pattern} {indices, plural, =1 {est} one {est} many {sont} other {sont}} cold. Les index \"cold\" ne sont plus mis à jour et ne sont pas interrogés fréquemment. Les informations doivent toujours être interrogeables, mais il est acceptable que ces requêtes soient plus lentes.", + "securitySolutionPackages.ecsDataQualityDashboard.createADataQualityCaseForIndexHeaderText": "Créer un cas de qualité des données pour l'index {indexName}", + "securitySolutionPackages.ecsDataQualityDashboard.customTab.customFieldsTableTitle": "Champs personnalisés – {indexName}", + "securitySolutionPackages.ecsDataQualityDashboard.customTab.ecsComplaintFieldsTableTitle": "Champs de plainte ECS – {indexName}", + "securitySolutionPackages.ecsDataQualityDashboard.emptyErrorPrompt.errorLoadingMappingsBody": "Un problème est survenu lors du chargement des mappings : {error}", + "securitySolutionPackages.ecsDataQualityDashboard.emptyErrorPrompt.errorLoadingMetadataTitle": "Les index correspondant au modèle {pattern} ne seront pas vérifiés", + "securitySolutionPackages.ecsDataQualityDashboard.emptyErrorPrompt.errorLoadingUnallowedValuesBody": "Un problème est survenu lors du chargement des valeurs non autorisées : {error}", + "securitySolutionPackages.ecsDataQualityDashboard.errorLoadingIlmExplainLabel": "Erreur lors du chargement d'ILM Explain : {details}", + "securitySolutionPackages.ecsDataQualityDashboard.errorLoadingMappingsLabel": "Erreur lors du chargement des mappings pour {patternOrIndexName} : {details}", + "securitySolutionPackages.ecsDataQualityDashboard.errorLoadingStatsLabel": "Erreur lors du chargement des statistiques : {details}", + "securitySolutionPackages.ecsDataQualityDashboard.errorLoadingUnallowedValuesLabel": "Erreur lors du chargement des valeurs non autorisées pour l'index {indexName} : {details}", + "securitySolutionPackages.ecsDataQualityDashboard.frozenPatternTooltip": "{indices} {indices, plural, =1 {index} one {index} many {index} other {index}} correspondant au modèle {pattern} {indices, plural, =1 {est} one {est} many {sont} other {sont}} frozen. Les index gelés ne sont plus mis à jour et sont rarement interrogés. Les informations doivent toujours être interrogeables, mais il est acceptable que ces requêtes soient extrêmement lentes.", + "securitySolutionPackages.ecsDataQualityDashboard.hotPatternTooltip": "{indices} {indices, plural, =1 {index} one {index} many {index} other {index}} correspondant au modèle {pattern} {indices, plural, =1 {est} one {est} many {sont} other {sont}} hot. Les index \"hot\" sont mis à jour et interrogés de façon active.", + "securitySolutionPackages.ecsDataQualityDashboard.incompatibleTab.incompatibleFieldMappingsTableTitle": "Mappings de champ incompatibles – {indexName}", + "securitySolutionPackages.ecsDataQualityDashboard.incompatibleTab.incompatibleFieldValuesTableTitle": "Valeurs de champ incompatibles – {indexName}", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.allCallout": "Tous les mappings relatifs aux champs de cet index, y compris ceux qui sont conformes à la version {version} d'Elastic Common Schema (ECS) et ceux qui ne le sont pas", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.allCalloutTitle": "Tous les {fieldCount} {fieldCount, plural, =1 {mapping de champ} one {mappings de champ} many {mappings de champ} other {mappings de champ}}", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.customCallout": "{fieldCount, plural, =1 {Ce champ n'est pas défini} one {Ce champ n'est pas défini} many {Ces champs ne sont pas définis} other {Ces champs ne sont pas définis}} par l'Elastic Common Schema (ECS), version {version}.", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.customCalloutTitle": "{fieldCount} {fieldCount, plural, =1 {mapping de champ} one {mappings de champ} many {mappings de champ} other {mappings de champ}} personnalisé(s)", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.ecsCompliantCallout": "{fieldCount, plural, =1 {Le type de mapping d'index et les valeurs de document pour ce champ sont conformes} one {Le type de mapping d'index et les valeurs de document pour ce champ sont conformes} many {Les types de mapping d'index et les valeurs de document pour ce champ sont conformes} other {Les types de mapping d'index et les valeurs de document pour ce champ sont conformes}} avec la version {version} d'Elastic Common Schema (ECS)", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.ecsCompliantCalloutTitle": "{fieldCount} {fieldCount, plural, =1 {champ} one {champs} many {champs} other {champs}} conforme(s) à ECS", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.incompatibleCallout": "Les champs sont incompatibles avec ECS lorsque les mappings d'index, ou les valeurs des champs de l'index, ne sont pas conformes à la version {version} d'Elastic Common Schema (ECS).", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.incompatibleCalloutTitle": "{fieldCount} {fieldCount, plural, =1 {champ} one {champs} many {champs} other {champs}} incompatible(s), {fieldsInSameFamily} {fieldsInSameFamily, plural, =1 {champ} one {champs} many {champs} other {champs}} avec {fieldsInSameFamily, plural, =1 {un mapping} one {un mapping} many {des mappings} other {des mappings}} dans la même famille", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.summaryMarkdownDescription": "L'index \"{indexName}\" contient des [mappings]({mappingUrl}) ou des valeurs de champs différents des [définitions]({ecsFieldReferenceUrl}) de la version \"{version}\" d'[Elastic Common Schema]({ecsReferenceUrl}) (ECS).", + "securitySolutionPackages.ecsDataQualityDashboard.statLabels.customIndexToolTip": "Décompte des mappings d'index personnalisés dans l'index {indexName}", + "securitySolutionPackages.ecsDataQualityDashboard.statLabels.customPatternToolTip": "Nombre total de mappings d'index personnalisés, dans les index correspondant au modèle {pattern}", + "securitySolutionPackages.ecsDataQualityDashboard.statLabels.incompatibleIndexToolTip": "Mappings et valeurs incompatibles avec ECS, dans l'index {indexName}", + "securitySolutionPackages.ecsDataQualityDashboard.statLabels.incompatiblePatternToolTip": "Nombre total de champs incompatibles avec ECS, dans les index correspondant au modèle {pattern}", + "securitySolutionPackages.ecsDataQualityDashboard.statLabels.indexDocsCountToolTip": "Nombre de documents dans l'index {indexName}", + "securitySolutionPackages.ecsDataQualityDashboard.statLabels.indexDocsPatternToolTip": "Nombre total de documents, dans les index correspondant au modèle {pattern}", + "securitySolutionPackages.ecsDataQualityDashboard.statLabels.indicesSizePatternToolTip": "Taille totale de tous les index principaux correspondant au modèle {pattern} (n'inclut pas de répliques)", + "securitySolutionPackages.ecsDataQualityDashboard.statLabels.totalCountOfIndicesCheckedMatchingPatternToolTip": "Nombre total d'index vérifiés correspondant au modèle {pattern}", + "securitySolutionPackages.ecsDataQualityDashboard.statLabels.totalCountOfIndicesMatchingPatternToolTip": "Nombre total d'index correspondant au modèle {pattern}", + "securitySolutionPackages.ecsDataQualityDashboard.storageTreemap.noDataReasonLabel": "Le champ {stackByField1} n'était présent dans aucun groupe", + "securitySolutionPackages.ecsDataQualityDashboard.summaryTable.indexToolTip": "Cet index correspond au nom d'index ou de modèle : {pattern}", + "securitySolutionPackages.ecsDataQualityDashboard.unmanagedPatternTooltip": "{indices} {indices, plural, =1 {index} one {index} many {index} other {index}} correspondant au modèle {pattern} {indices, plural, =1 {est} one {n’est pas géré} many {ne sont pas gérés} other {ne sont pas gérés}} par Index Lifecycle Management (ILM)", + "securitySolutionPackages.ecsDataQualityDashboard.warmPatternTooltip": "{indices} {indices, plural, =1 {index} one {index} many {index} other {index}} correspondant au modèle {pattern} {indices, plural, =1 {est} one {est} many {sont} other {sont}} warm. Les index \"warm\" ne sont plus mis à jour, mais ils sont toujours interrogés.", + "securitySolutionPackages.dataTable.ariaLabel": "Alertes", + "securitySolutionPackages.dataTable.columnHeaders.flyout.pane.removeColumnButtonLabel": "Supprimer la colonne", + "securitySolutionPackages.dataTable.eventRenderedView.eventSummary.column": "Résumé des événements", + "securitySolutionPackages.dataTable.eventRenderedView.ruleTitle.column": "Règle", + "securitySolutionPackages.dataTable.eventRenderedView.timestampTitle.column": "Horodatage", + "securitySolutionPackages.dataTable.loadingEventsDataLabel": "Chargement des événements", + "securitySolutionPackages.ecsDataQualityDashboard.addToCaseSuccessToast": "Résultats de qualité des données ajoutés avec succès au cas", + "securitySolutionPackages.ecsDataQualityDashboard.addToNewCaseButton": "Ajouter au nouveau cas", + "securitySolutionPackages.ecsDataQualityDashboard.cancelButton": "Annuler", + "securitySolutionPackages.ecsDataQualityDashboard.checkAllButton": "Tout vérifier", + "securitySolutionPackages.ecsDataQualityDashboard.coldDescription": "L'index n'est plus mis à jour et il est interrogé peu fréquemment. Les informations doivent toujours être interrogeables, mais il est acceptable que ces requêtes soient plus lentes.", + "securitySolutionPackages.ecsDataQualityDashboard.compareFieldsTable.documentValuesActualColumn": "Valeurs du document (réelles)", + "securitySolutionPackages.ecsDataQualityDashboard.compareFieldsTable.ecsDescriptionColumn": "Description ECS", + "securitySolutionPackages.ecsDataQualityDashboard.compareFieldsTable.ecsMappingTypeColumn": "Type de mapping ECS", + "securitySolutionPackages.ecsDataQualityDashboard.compareFieldsTable.ecsMappingTypeExpectedColumn": "Type de mapping ECS (attendu)", + "securitySolutionPackages.ecsDataQualityDashboard.compareFieldsTable.ecsValuesColumn": "Valeurs ECS", + "securitySolutionPackages.ecsDataQualityDashboard.compareFieldsTable.ecsValuesExpectedColumn": "Valeurs ECS (attendues)", + "securitySolutionPackages.ecsDataQualityDashboard.compareFieldsTable.fieldColumn": "Champ", + "securitySolutionPackages.ecsDataQualityDashboard.compareFieldsTable.indexMappingTypeActualColumn": "Type de mapping d'index (réel)", + "securitySolutionPackages.ecsDataQualityDashboard.compareFieldsTable.indexMappingTypeColumn": "Type de mapping d'index", + "securitySolutionPackages.ecsDataQualityDashboard.compareFieldsTable.searchFieldsPlaceholder": "Rechercher dans les champs", + "securitySolutionPackages.ecsDataQualityDashboard.copyToClipboardButton": "Copier dans le presse-papiers", + "securitySolutionPackages.ecsDataQualityDashboard.createADataQualityCaseHeaderText": "Créer un cas de qualité des données", + "securitySolutionPackages.ecsDataQualityDashboard.defaultPanelTitle": "Vérifier les mappings d'index", + "securitySolutionPackages.ecsDataQualityDashboard.ecsSummaryDonutChart.chartTitle": "Mappings de champs", + "securitySolutionPackages.ecsDataQualityDashboard.ecsSummaryDonutChart.fieldsLabel": "Champs", + "securitySolutionPackages.ecsDataQualityDashboard.ecsVersionStat": "Version ECS", + "securitySolutionPackages.ecsDataQualityDashboard.emptyErrorPrompt.errorLoadingMappingsTitle": "Impossible de charger les mappings d'index", + "securitySolutionPackages.ecsDataQualityDashboard.emptyErrorPrompt.errorLoadingUnallowedValuesTitle": "Impossible de charger les valeurs non autorisées", + "securitySolutionPackages.ecsDataQualityDashboard.emptyLoadingPrompt.loadingEcsMetadataPrompt": "Chargement des métadonnées ECS", + "securitySolutionPackages.ecsDataQualityDashboard.emptyLoadingPrompt.loadingMappingsPrompt": "Chargement des mappings", + "securitySolutionPackages.ecsDataQualityDashboard.emptyLoadingPrompt.loadingStatsPrompt": "Chargement des statistiques", + "securitySolutionPackages.ecsDataQualityDashboard.emptyLoadingPrompt.loadingUnallowedValuesPrompt": "Chargement des valeurs non autorisées", + "securitySolutionPackages.ecsDataQualityDashboard.errors.errorMayOccurLabel": "Des erreurs peuvent survenir lorsque le modèle ou les métadonnées de l'index sont temporairement indisponibles, ou si vous ne disposez pas des privilèges requis pour l'accès", + "securitySolutionPackages.ecsDataQualityDashboard.errors.manage": "gérer", + "securitySolutionPackages.ecsDataQualityDashboard.errors.monitor": "moniteur", + "securitySolutionPackages.ecsDataQualityDashboard.errors.or": "ou", + "securitySolutionPackages.ecsDataQualityDashboard.errors.read": "lire", + "securitySolutionPackages.ecsDataQualityDashboard.errors.theFollowingPrivilegesLabel": "Les privilèges suivants sont requis pour vérifier un index :", + "securitySolutionPackages.ecsDataQualityDashboard.errors.viewIndexMetadata": "view_index_metadata", + "securitySolutionPackages.ecsDataQualityDashboard.errorsPopover.copyToClipboardButton": "Copier dans le presse-papiers", + "securitySolutionPackages.ecsDataQualityDashboard.errorsPopover.errorsCalloutSummary": "La qualité des données n'a pas été vérifiée pour certains index", + "securitySolutionPackages.ecsDataQualityDashboard.errorsPopover.errorsTitle": "Erreurs", + "securitySolutionPackages.ecsDataQualityDashboard.errorsPopover.viewErrorsButton": "Afficher les erreurs", + "securitySolutionPackages.ecsDataQualityDashboard.errorsViewerTable.errorColumn": "Erreur", + "securitySolutionPackages.ecsDataQualityDashboard.errorsViewerTable.indexColumn": "Index", + "securitySolutionPackages.ecsDataQualityDashboard.errorsViewerTable.patternColumn": "Modèle", + "securitySolutionPackages.ecsDataQualityDashboard.fieldsLabel": "Champs", + "securitySolutionPackages.ecsDataQualityDashboard.frozenDescription": "L'index n'est plus mis à jour et il est rarement interrogé. Les informations doivent toujours être interrogeables, mais il est acceptable que ces requêtes soient extrêmement lentes.", + "securitySolutionPackages.ecsDataQualityDashboard.hotDescription": "L'index est mis à jour et interrogé de façon active", + "securitySolutionPackages.ecsDataQualityDashboard.ilmPhaseLabel": "Phase ILM", + "securitySolutionPackages.ecsDataQualityDashboard.ilmPhasesEmptyPromptBody": "La qualité des données sera vérifiée pour les index comprenant ces phases de gestion du cycle de vie des index (ILM, Index Lifecycle Management)", + "securitySolutionPackages.ecsDataQualityDashboard.ilmPhasesEmptyPromptColdLabel": "froid", + "securitySolutionPackages.ecsDataQualityDashboard.ilmPhasesEmptyPromptFrozenLabel": "frozen", + "securitySolutionPackages.ecsDataQualityDashboard.ilmPhasesEmptyPromptHotLabel": "hot", + "securitySolutionPackages.ecsDataQualityDashboard.ilmPhasesEmptyPromptIlmPhasesThatCanBeCheckedSubtitle": "Phases ILM dans lesquelles la qualité des données peut être vérifiée", + "securitySolutionPackages.ecsDataQualityDashboard.ilmPhasesEmptyPromptIlmPhasesThatCannotBeCheckedSubtitle": "Phases ILM dans lesquelles la vérification ne peut pas être effectuée", + "securitySolutionPackages.ecsDataQualityDashboard.ilmPhasesEmptyPromptITheFollowingIlmPhasesLabel": "Les phases ILM suivantes ne sont pas disponibles pour la vérification de la qualité des données, car leur accès est plus lent", + "securitySolutionPackages.ecsDataQualityDashboard.ilmPhasesEmptyPromptTitle": "Sélectionner une ou plusieurs phases ILM", + "securitySolutionPackages.ecsDataQualityDashboard.ilmPhasesEmptyPromptUnmanagedLabel": "non géré", + "securitySolutionPackages.ecsDataQualityDashboard.ilmPhasesEmptyPromptWarmLabel": "warm", + "securitySolutionPackages.ecsDataQualityDashboard.indexLifecycleManagementPhasesTooltip": "La qualité des données sera vérifiée pour les index comprenant ces phases de gestion du cycle de vie des index (ILM, Index Lifecycle Management)", + "securitySolutionPackages.ecsDataQualityDashboard.indexNameLabel": "Nom de l'index", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.addToNewCaseButton": "Ajouter au nouveau cas", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.allCalloutEmptyContent": "Cet index ne contient aucun mapping", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.allCalloutEmptyTitle": "Aucun mapping", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.allFieldsLabel": "Tous les champs", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.copyToClipboardButton": "Copier dans le presse-papiers", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.customEmptyContent": "Tous les mappings de champs de cet index sont définis par Elastic Common Schema", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.customEmptyTitle": "Tous les mappings de champs définis par ECS", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.customFieldsLabel": "Champs personnalisés", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.custonDetectionEngineRulesWorkMessage": "✅ Les règles de moteur de détection personnalisées fonctionnent", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.detectionEngineRulesWillWorkMessage": "✅ Les règles de moteur de détection fonctionneront pour ces champs", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.detectionEngineRulesWontWorkMessage": "❌ Les règles de moteur de détection référençant ces champs ne leur correspondront peut-être pas correctement", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.docsLabel": "Documents", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.ecsCompliantEmptyContent": "Aucun mapping de champ de cet index n'est conforme à Elastic Common Schema (ECS). L'index doit (au moins) contenir un champ de date @timestamp.", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.ecsCompliantEmptyTitle": "Aucun mapping conforme à ECS", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.ecsCompliantFieldsLabel": "Champs conformes à ECS", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.ecsCompliantMappingsAreFullySupportedMessage": "✅ Les mappings et valeurs de champs conformes à ECS sont totalement pris en charge", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.ecsIsAPermissiveSchemaMessage": "ECS est un schéma permissif. Si vos événements ont des données supplémentaires qui ne peuvent pas être mappées à ECS, vous pouvez tout simplement les ajouter à vos événements à l’aide de noms de champs personnalisés.", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.ecsVersionMarkdownComment": "Version Elastic Common Schema (ECS)", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.incompatibleCallout.incompatibleFieldsWithLabel": "Les champs incompatibles avec des mappings dans la même famille ont exactement le même comportement de recherche, mais ils peuvent avoir une utilisation de l’espace différente ou différentes caractéristiques de performances.", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.incompatibleCallout.whenAnIncompatibleFieldLabel": "Lorsqu'un champ non compatible ne fait pas partie de la même famille :", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.incompatibleEmptyContent": "Tous les mappings de champs et valeurs de documents de cet index sont conformes à Elastic Common Schema (ECS).", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.incompatibleEmptyTitle": "Tous les mappings et valeurs de champs sont conformes à ECS", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.incompatibleFieldsTab": "Champs incompatibles", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.indexMarkdown": "Index", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.mappingThatConflictWithEcsMessage": "❌ Les mappings ou valeurs de champs qui ne sont pas conformes à ECS ne sont pas pris en charge", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.missingTimestampCallout": "Veuillez envisager d'ajouter un mapping de champ de @timestamp (date) à cet index, comme requis par Elastic Common Schema (ECS), car :", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.missingTimestampCalloutTitle": "Mapping de champ @timestamp (date) manquant pour cet index", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.otherAppCapabilitiesWorkProperlyMessage": "✅ Les autres capacités de l'application fonctionnent correctement", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.pagesDisplayEventsMessage": "✅ Les pages affichent les événements et les champs correctement", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.pagesMayNotDisplayEventsMessage": "❌ Les pages peuvent ne pas afficher certains événements ou champs en raison de mappings ou valeurs de champs inattendus", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.pagesMayNotDisplayFieldsMessage": "🌕 Certaines pages et fonctionnalités peuvent ne pas afficher ces champs", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.preBuiltDetectionEngineRulesWorkMessage": "✅ Les règles de moteur de détection préconstruites fonctionnent", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.sometimesIndicesCreatedByOlderDescription": "Parfois, les index créés par des intégrations plus anciennes comporteront des mappings ou des valeurs qui étaient conformes, mais ne le sont plus.", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.summaryMarkdownTitle": "Qualité des données", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.summaryTab": "Résumé", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.unknownCategoryLabel": "Inconnu", + "securitySolutionPackages.ecsDataQualityDashboard.indexSizeTooltip": "La taille de l'index principal (n'inclut pas de répliques)", + "securitySolutionPackages.ecsDataQualityDashboard.lastCheckedLabel": "Dernière vérification", + "securitySolutionPackages.ecsDataQualityDashboard.patternLabel.allPassedTooltip": "Tous les index correspondant à ce modèle ont réussi les vérifications de qualité des données", + "securitySolutionPackages.ecsDataQualityDashboard.patternLabel.someFailedTooltip": "Certains index correspondant à ce modèle ont échoué aux vérifications de qualité des données", + "securitySolutionPackages.ecsDataQualityDashboard.patternLabel.someUncheckedTooltip": "La qualité des données n'a pas été vérifiée pour certains index correspondant à ce modèle", + "securitySolutionPackages.ecsDataQualityDashboard.patternSummary.docsLabel": "Documents", + "securitySolutionPackages.ecsDataQualityDashboard.patternSummary.indicesLabel": "Index", + "securitySolutionPackages.ecsDataQualityDashboard.patternSummary.patternOrIndexTooltip": "Modèle, ou index spécifique", + "securitySolutionPackages.ecsDataQualityDashboard.remoteClustersCallout.title": "Les clusters distants ne seront pas vérifiés", + "securitySolutionPackages.ecsDataQualityDashboard.remoteClustersCallout.toCheckIndicesOnRemoteClustersLabel": "Pour vérifier les index sur des clusters distants prenant en charge la recherche dans différents clusters, connectez-vous à l'instance Kibana du cluster distant", + "securitySolutionPackages.ecsDataQualityDashboard.sameFamilyBadgeLabel": "même famille", + "securitySolutionPackages.ecsDataQualityDashboard.securitySolutionPackages.ecsDataQualityDashboardSubtitle": "Vérifiez la compatibilité des mappings et des valeurs d'index avec", + "securitySolutionPackages.ecsDataQualityDashboard.securitySolutionPackages.ecsDataQualityDashboardTitle": "Qualité des données", + "securitySolutionPackages.ecsDataQualityDashboard.selectAnIndexPrompt": "Sélectionner un index pour le comparer à la version ECS", + "securitySolutionPackages.ecsDataQualityDashboard.selectOneOrMorPhasesPlaceholder": "Sélectionner une ou plusieurs phases ILM", + "securitySolutionPackages.ecsDataQualityDashboard.statLabels.checkedLabel": "vérifié", + "securitySolutionPackages.ecsDataQualityDashboard.statLabels.customLabel": "Personnalisé", + "securitySolutionPackages.ecsDataQualityDashboard.statLabels.docsLabel": "Documents", + "securitySolutionPackages.ecsDataQualityDashboard.statLabels.fieldsLabel": "champs", + "securitySolutionPackages.ecsDataQualityDashboard.statLabels.incompatibleLabel": "Incompatible", + "securitySolutionPackages.ecsDataQualityDashboard.statLabels.indicesLabel": "Index", + "securitySolutionPackages.ecsDataQualityDashboard.statLabels.sizeLabel": "Taille", + "securitySolutionPackages.ecsDataQualityDashboard.statLabels.totalDocsToolTip": "Nombre total de documents, dans tous les index", + "securitySolutionPackages.ecsDataQualityDashboard.statLabels.totalIncompatibleToolTip": "Nombre total de champs incompatibles avec ECS, dans tous les index qui ont été vérifiés", + "securitySolutionPackages.ecsDataQualityDashboard.statLabels.totalIndicesCheckedToolTip": "Nombre total de tous les index vérifiés", + "securitySolutionPackages.ecsDataQualityDashboard.statLabels.totalIndicesToolTip": "Nombre total de tous les index", + "securitySolutionPackages.ecsDataQualityDashboard.statLabels.totalSizeToolTip": "La taille totale de tous les index principaux (n'inclut pas de répliques)", + "securitySolutionPackages.ecsDataQualityDashboard.storageTreemap.noDataLabel": "Aucune donnée à afficher", + "securitySolutionPackages.ecsDataQualityDashboard.summaryTable.collapseLabel": "Réduire", + "securitySolutionPackages.ecsDataQualityDashboard.summaryTable.docsColumn": "Documents", + "securitySolutionPackages.ecsDataQualityDashboard.summaryTable.expandLabel": "Développer", + "securitySolutionPackages.ecsDataQualityDashboard.summaryTable.expandRowsColumn": "Développer les lignes", + "securitySolutionPackages.ecsDataQualityDashboard.summaryTable.failedTooltip": "Échoué", + "securitySolutionPackages.ecsDataQualityDashboard.summaryTable.ilmPhaseColumn": "Phase ILM", + "securitySolutionPackages.ecsDataQualityDashboard.summaryTable.incompatibleFieldsColumn": "Champs incompatibles", + "securitySolutionPackages.ecsDataQualityDashboard.summaryTable.indexColumn": "Index", + "securitySolutionPackages.ecsDataQualityDashboard.summaryTable.indexesNameLabel": "Nom de l'index", + "securitySolutionPackages.ecsDataQualityDashboard.summaryTable.indicesCheckedColumn": "Index vérifiés", + "securitySolutionPackages.ecsDataQualityDashboard.summaryTable.indicesColumn": "Index", + "securitySolutionPackages.ecsDataQualityDashboard.summaryTable.passedTooltip": "Approuvé", + "securitySolutionPackages.ecsDataQualityDashboard.summaryTable.resultColumn": "Résultat", + "securitySolutionPackages.ecsDataQualityDashboard.summaryTable.sizeColumn": "Taille", + "securitySolutionPackages.ecsDataQualityDashboard.summaryTable.thisIndexHasNotBeenCheckedTooltip": "Cet index n'a pas été vérifié", + "securitySolutionPackages.ecsDataQualityDashboard.timestampDescriptionLabel": "Date/heure d'origine de l'événement. Il s'agit des date et heure extraites de l'événement, représentant généralement le moment auquel l'événement a été généré par la source. Si la source de l'événement ne comporte pas d'horodatage original, cette valeur est habituellement remplie la première fois que l'événement a été reçu par le pipeline. Champs requis pour tous les événements.", + "securitySolutionPackages.ecsDataQualityDashboard.toasts.copiedErrorsToastTitle": "Erreurs copiées dans le presse-papiers", + "securitySolutionPackages.ecsDataQualityDashboard.toasts.copiedResultsToastTitle": "Résultats copiés dans le presse-papiers", + "securitySolutionPackages.ecsDataQualityDashboard.unmanagedDescription": "L'index n'est pas géré par la Gestion du cycle de vie des index (ILM)", + "securitySolutionPackages.ecsDataQualityDashboard.warmDescription": "L'index n'est plus mis à jour mais il est toujours interrogé", + "securitySolutionPackages.sideNav.betaBadge.label": "Bêta", "share.contextMenuTitle": "Partager ce {objectType}", "share.urlPanel.canNotShareAsSavedObjectHelpText": "Pour le partager comme objet partagé, enregistrez le {objectType}.", "share.urlPanel.savedObjectDescription": "Vous pouvez partager cette URL avec des personnes pour leur permettre de charger la version enregistrée la plus récente de ce {objectType}.", @@ -4878,11 +5229,11 @@ "sharedUXPackages.codeEditor.stopEditingReadOnly": "Appuyez sur {key} pour arrêter d'interagir avec le code.", "sharedUXPackages.filePicker.deleteFileQuestion": "Voulez-vous vraiment supprimer \"{fileName}\" ?", "sharedUXPackages.filePicker.selectFilesButtonLable": "Sélectionner {nrOfFiles} fichiers", - "sharedUXPackages.fileUpload.fileTooLargeErrorMessage": "Le fichier est trop volumineux. La taille maximale est de {expectedSize, plural, one {# octet} other {# octets}}.", + "sharedUXPackages.fileUpload.fileTooLargeErrorMessage": "Le fichier est trop volumineux. La taille maximale est de {expectedSize, plural, one {# octet} many {# octets} other {# octets}}.", "sharedUXPackages.noDataPage.intro": "Ajoutez vos données pour commencer, ou {link} sur {solution}.", "sharedUXPackages.noDataPage.welcomeTitle": "Bienvenue dans Elastic {solution} !", "sharedUXPackages.solutionNav.mobileTitleText": "{solutionName} {menuText}", - "sharedUXPackages.userProfileComponents.userProfilesSelectable.selectedStatusMessage": "{count, plural, one {# utilisateur sélectionné} other {# utilisateurs sélectionnés}}", + "sharedUXPackages.userProfileComponents.userProfilesSelectable.selectedStatusMessage": "{count, plural, one {# utilisateur sélectionné} many {# utilisateurs sélectionnés} other {# utilisateurs sélectionnés}}", "sharedUXPackages.buttonToolbar.buttons.addFromLibrary.libraryButtonLabel": "Ajouter depuis la bibliothèque", "sharedUXPackages.buttonToolbar.toolbar.errorToolbarText": "Il y a plus de 120 boutons supplémentaires. Nous vous invitons à limiter le nombre de boutons.", "sharedUXPackages.card.noData.description": "Utilisez Elastic Agent pour collecter de manière simple et unifiée les données de vos machines.", @@ -5151,7 +5502,7 @@ "timelion.vis.interval.year": "1 an", "timelion.vis.intervalLabel": "Intervalle", "timelion.vis.invalidIntervalErrorMessage": "Format d'intervalle non valide.", - "timelion.vis.selectIntervalHelpText": "Choisissez une option ou créez une valeur personnalisée. Exemples : 30s, 20m, 24h, 2d, 1w, 1M", + "timelion.vis.selectIntervalHelpText": "Choisissez une option ou créez une valeur personnalisée. Exemples : 30s, 20m, 24h, 2d, 1w, 1M", "timelion.vis.selectIntervalPlaceholder": "Choisir un intervalle", "uiActionsEnhanced.components.DrilldownTable.deleteDrilldownsButtonLabel": "Supprimer ({count})", "uiActionsEnhanced.components.DrilldownTemplateTable.copyButtonLabel": "Copier ({count})", @@ -5159,7 +5510,7 @@ "uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.toast.drilldownCreatedTitle": "Recherche \"{drilldownName}\" créée", "uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.toast.drilldownEditedTitle": "Recherche \"{drilldownName}\" mise à jour", "uiActionsEnhanced.drilldowns.components.flyoutDrilldownWizard.toast.drilldownsDeletedTitle": "{n} recherches supprimées", - "uiActionsEnhanced.drilldowns.containers.drilldownList.copyingNotification.body": "{count, number} {count, plural, one {recherche copiée} other {recherches copiées}}.", + "uiActionsEnhanced.drilldowns.containers.drilldownList.copyingNotification.body": "{count, number} {count, plural, one {exploration copiée} many {explorations copiées} other {explorations copiées}}.", "uiActionsEnhanced.drilldowns.urlDrilldownCollectConfig.urlTemplatePlaceholderText": "Exemple : {exampleUrl}", "uiActionsEnhanced.drilldowns.urlDrilldownValidation.urlFormatErrorMessage": "Format non valide : {message}", "uiActionsEnhanced.drilldowns.urlDrilldownValidation.urlFormatGeneralErrorMessage": "Format non valide. Exemple : {exampleUrl}", @@ -5213,11 +5564,11 @@ "uiActionsEnhanced.drilldowns.containers.createDrilldownForm.primaryButton": "Créer une recherche", "uiActionsEnhanced.drilldowns.containers.createDrilldownForm.title": "Créer une recherche", "uiActionsEnhanced.drilldowns.containers.drilldownList.copyingNotification.dismiss": "Rejeter", - "uiActionsEnhanced.drilldowns.containers.DrilldownManager.createNew": "Créer", + "uiActionsEnhanced.drilldowns.containers.DrilldownManager.createNew": "Créer nouvelle", "uiActionsEnhanced.drilldowns.containers.DrilldownManager.manage": "Gérer", "uiActionsEnhanced.drilldowns.containers.editDrilldownForm.primaryButton": "Enregistrer", "uiActionsEnhanced.drilldowns.containers.editDrilldownForm.title": "Modifier une recherche", - "uiActionsEnhanced.drilldowns.drilldownManager.state.defaultTitle": "Explorations", + "uiActionsEnhanced.drilldowns.drilldownManager.state.defaultTitle": "Recherches", "uiActionsEnhanced.drilldowns.urlDrilldownCollectConfig.additionalOptions": "Options supplémentaires", "uiActionsEnhanced.drilldowns.urlDrilldownCollectConfig.addVariableButtonTitle": "Ajouter une variable", "uiActionsEnhanced.drilldowns.urlDrilldownCollectConfig.encodeDescription": "Si elle est activée, l'URL sera précédée de l’encodage-pourcent comme caractère d'échappement", @@ -5230,19 +5581,26 @@ "uiActionsEnhanced.drilldowns.urlDrilldownCollectConfig.urlTemplateSyntaxHelpLinkText": "Aide pour la syntaxe", "uiActionsEnhanced.drilldowns.urlDrilldownCollectConfig.urlTemplateVariablesFilterPlaceholderText": "Variables de filtre", "uiActionsEnhanced.drilldowns.urlDrilldownCollectConfig.urlTemplateVariablesHelpLinkText": "Aide", - "unifiedFieldList.fieldListGrouped.fieldSearchForAvailableFieldsLiveRegion": "{availableFields} {availableFields, plural, one {champ disponible} other {champs disponibles}}.", - "unifiedFieldList.fieldListGrouped.fieldSearchForEmptyFieldsLiveRegion": "{emptyFields} {emptyFields, plural, one {champ vide} other {champs vides}}.", - "unifiedFieldList.fieldListGrouped.fieldSearchForMetaFieldsLiveRegion": "{metaFields} {metaFields, plural, one {champ méta} other {champs méta}}.", - "unifiedFieldList.fieldListGrouped.fieldSearchForPopularFieldsLiveRegion": "{popularFields} {popularFields, plural, one {champ populaire} other {champs populaires}}.", - "unifiedFieldList.fieldListGrouped.fieldSearchForSelectedFieldsLiveRegion": "{selectedFields} {selectedFields, plural, one {champ sélectionné} other {champs sélectionnés}}.", - "unifiedFieldList.fieldListGrouped.fieldSearchForUnmappedFieldsLiveRegion": "{unmappedFields} {unmappedFields, plural, one {champ non mappé} other {champs non mappés}}.", + "unifiedFieldList.fieldItemButton.addFieldToWorkspaceLabel": "Ajouter un champ \"{field}\"", + "unifiedFieldList.fieldItemButton.ariaLabel": "Aperçu {fieldDisplayName} : {fieldType}", + "unifiedFieldList.fieldItemButton.fieldTitle": "{fieldDisplayName} ({fieldName})", + "unifiedFieldList.fieldItemButton.removeFieldToWorkspaceLabel": "Retirer le champ \"{field}\"", + "unifiedFieldList.fieldListGrouped.fieldSearchForAvailableFieldsLiveRegion": "{availableFields} {availableFields, plural, one {champ} many {champs} other {champs}} disponible(s).", + "unifiedFieldList.fieldListGrouped.fieldSearchForEmptyFieldsLiveRegion": "{emptyFields} {emptyFields, plural, one {champ} many {champs} other {champs}} vide(s).", + "unifiedFieldList.fieldListGrouped.fieldSearchForMetaFieldsLiveRegion": "{metaFields} {metaFields, plural, one {champ} many {champs} other {champs}} méta.", + "unifiedFieldList.fieldListGrouped.fieldSearchForPopularFieldsLiveRegion": "{popularFields} {popularFields, plural, one {champ} many {champs} other {champs}} populaire(s).", + "unifiedFieldList.fieldListGrouped.fieldSearchForSelectedFieldsLiveRegion": "{selectedFields} {selectedFields, plural, one {champ} many {champs} other {champs}} sélectionné(s).", + "unifiedFieldList.fieldListGrouped.fieldSearchForUnmappedFieldsLiveRegion": "{unmappedFields} {unmappedFields, plural, one {champ} many {champs} other {champs}} non mappé(s).", "unifiedFieldList.fieldPopover.addFieldToWorkspaceLabel": "Ajouter un champ \"{field}\"", - "unifiedFieldList.fieldStats.bucketPercentageTooltip": "{formattedPercentage} ({count, plural, one {# enregistrement} other {# enregistrements}})", - "unifiedFieldList.fieldStats.calculatedFromSampleRecordsLabel": "Calculé à partir de {sampledDocumentsFormatted} {sampledDocuments, plural, one {exemple d'enregistrement} other {exemples d'enregistrement}}.", - "unifiedFieldList.fieldStats.calculatedFromTotalRecordsLabel": "Calculé à partir de {totalDocumentsFormatted} {totalDocuments, plural, one {enregistrement} other {enregistrements}}.", + "unifiedFieldList.fieldStats.bucketPercentageTooltip": "{formattedPercentage} ({count, plural, one {# enregistrement} many {# enregistrements} other {# enregistrements}})", + "unifiedFieldList.fieldStats.calculatedFromSampleRecordsLabel": "Calcul effectué à partir de {sampledDocumentsFormatted} exemple(s) d'{sampledDocuments, plural, one {enregistrement} many {enregistrements} other {enregistrements}}.", + "unifiedFieldList.fieldStats.calculatedFromTotalRecordsLabel": "Calcul effectué à partir de {totalDocumentsFormatted} {totalDocuments, plural, one {enregistrement} many {enregistrements} other {enregistrements}}.", "unifiedFieldList.fieldStats.filterOutValueButtonAriaLabel": "Exclure {field} : \"{value}\"", "unifiedFieldList.fieldStats.filterValueButtonAriaLabel": "Filtrer sur {field} : \"{value}\"", - "unifiedFieldList.fieldStats.noFieldDataInSampleDescription": "Aucune donnée de champ pour {sampledDocumentsFormatted} {sampledDocuments, plural, one {exemple d'enregistrement} other {exemples d'enregistrement}}.", + "unifiedFieldList.fieldStats.noFieldDataInSampleDescription": "Aucune donnée de champ pour {sampledDocumentsFormatted} exemple(s) d'{sampledDocuments, plural, one {enregistrement} many {enregistrements} other {enregistrements}}.", + "unifiedFieldList.fieldCategorizeButton.label": "Exécuter l'analyse du modèle", + "unifiedFieldList.fieldItemButton.mappingConflictDescription": "Ce champ est défini avec plusieurs types (chaîne, entier, etc.) dans les différents index qui correspondent à ce modèle. Vous pouvez toujours utiliser ce champ conflictuel, mais il sera indisponible pour les fonctions qui nécessitent que Kibana en connaisse le type. Pour corriger ce problème, vous devrez réindexer vos données.", + "unifiedFieldList.fieldItemButton.mappingConflictTitle": "Conflit de mapping", "unifiedFieldList.fieldList.noFieldsCallout.noDataLabel": "Aucun champ.", "unifiedFieldList.fieldList.noFieldsCallout.noFields.extendTimeBullet": "Extension de la plage temporelle", "unifiedFieldList.fieldList.noFieldsCallout.noFields.fieldTypeFilterBullet": "Utilisation de différents filtres de champ", @@ -5345,8 +5703,8 @@ "unifiedHistogram.breakdownColumnLabel": "Top 3 des valeurs de {fieldName}", "unifiedHistogram.bucketIntervalTooltip": "Cet intervalle crée {bucketsDescription} pour un affichage dans la plage temporelle sélectionnée. Il a donc été scalé à {bucketIntervalDescription}.", "unifiedHistogram.histogramTimeRangeIntervalDescription": "(intervalle : {value})", - "unifiedHistogram.hitsPluralTitle": "{formattedHits} {hits, plural, one {résultat} other {résultats}}", - "unifiedHistogram.partialHits": "≥{formattedHits} {hits, plural, one {résultat} other {résultats}}", + "unifiedHistogram.hitsPluralTitle": "{formattedHits} {hits, plural, one {résultat} many {résultats} other {résultats}}", + "unifiedHistogram.partialHits": "≥{formattedHits} {hits, plural, one {résultat} many {résultats} other {résultats}}", "unifiedHistogram.timeIntervalWithValue": "Intervalle de temps : {timeInterval}", "unifiedHistogram.breakdownFieldSelectorAriaLabel": "Répartir par", "unifiedHistogram.breakdownFieldSelectorLabel": "Répartir par", @@ -5367,6 +5725,8 @@ "unifiedHistogram.lensTitle": "Modifier la visualisation", "unifiedHistogram.resetChartHeight": "Réinitialiser à la hauteur par défaut", "unifiedHistogram.showChart": "Afficher le graphique", + "unifiedHistogram.suggestionSelectorLabel": "Visualisation", + "unifiedHistogram.suggestionSelectorPlaceholder": "Sélectionner la visualisation", "unifiedHistogram.timeIntervals": "Intervalles de temps", "unifiedHistogram.timeIntervalWithValueWarning": "Avertissement", "unifiedSearch.filter.filterBar.filterActionsMessage": "Filtrer : {innerText}. Sélectionner pour plus d’actions de filtrage.", @@ -5384,16 +5744,16 @@ "unifiedSearch.kueryAutocomplete.lessThanOrEqualOperatorDescription": "est {lessThanOrEqualTo} une certaine valeur", "unifiedSearch.kueryAutocomplete.orOperatorDescription": "Nécessite que {oneOrMoreArguments} soient définis sur \"true\"", "unifiedSearch.query.queryBar.comboboxAriaLabel": "Rechercher et filtrer la page {pageType}", - "unifiedSearch.query.queryBar.indexPattern.createForMatchingIndices": "Explorer {indicesLength, plural, one {# index correspondant} other {# index correspondants}}", + "unifiedSearch.query.queryBar.indexPattern.createForMatchingIndices": "Explorer {indicesLength, plural, one {# index correspondant} many {# index correspondants} other {# index correspondants}}", "unifiedSearch.query.queryBar.KQLNestedQuerySyntaxInfoText": "Il semblerait que votre requête porte sur un champ imbriqué. Selon le résultat visé, il existe plusieurs façons de construire une syntaxe KQL pour des requêtes imbriquées. Apprenez-en plus dans notre {link}.", "unifiedSearch.query.queryBar.searchInputAriaLabel": "Commencer à taper pour rechercher et filtrer la page {pageType}", "unifiedSearch.query.queryBar.searchInputPlaceholder": "Filtrer vos données à l'aide de la syntaxe {language}", - "unifiedSearch.query.textBasedLanguagesEditor.errorCount": "{count} {count, plural, one {erreur} other {erreurs}}", - "unifiedSearch.query.textBasedLanguagesEditor.lineCount": "{count} {count, plural, one {ligne} other {lignes}}", + "unifiedSearch.query.textBasedLanguagesEditor.errorCount": "{count} {count, plural, one {erreur} many {erreurs} other {erreurs}}", + "unifiedSearch.query.textBasedLanguagesEditor.lineCount": "{count} {count, plural, one {ligne} many {lignes} other {lignes}}", "unifiedSearch.query.textBasedLanguagesEditor.lineNumber": "Ligne {lineNumber}", "unifiedSearch.search.searchBar.savedQueryPopoverConfirmDeletionTitle": "Supprimer \"{savedQueryName}\" ?", "unifiedSearch.search.searchBar.savedQueryPopoverSaveChangesButtonAriaLabel": "Enregistrer les modifications apportées à {title}", - "unifiedSearch.search.unableToGetSavedQueryToastTitle": "Impossible de charger la requête enregistrée {savedQueryId}", + "unifiedSearch.search.unableToGetSavedQueryToastTitle": "Impossible de charger la requête {savedQueryId}", "unifiedSearch.query.textBasedLanguagesEditor.documentation.addOperator.markdown": "### Add (+)\n```\nSELECT 1 + 1 AS x\n```\n ", "unifiedSearch.query.textBasedLanguagesEditor.documentation.andOperator.markdown": "### AND\n```\nSELECT last_name l FROM \"test_emp\" \nWHERE emp_no > 10000 AND emp_no < 10005 ORDER BY emp_no LIMIT 5\n```\n ", "unifiedSearch.query.textBasedLanguagesEditor.documentation.averageFunction.markdown": "### AVG\nRetourne la moyenne (moyenne arithmétique) des valeurs entrées.\n```\nAVG(numeric_field)\n```\n- champ numérique. Si ce champ contient uniquement des valeurs nulles, la fonction renvoie zéro. Sinon, la fonction ignore les valeurs nulles dans ce champ.\n```\nSELECT AVG(salary) AS avg FROM emp\n```\n ", @@ -5480,6 +5840,7 @@ "unifiedSearch.filter.filterEditor.rangeEndInputPlaceholder": "Fin", "unifiedSearch.filter.filterEditor.rangeInputLabel": "Plage", "unifiedSearch.filter.filterEditor.rangeStartInputPlaceholder": "Début", + "unifiedSearch.filter.filterEditor.spatialFilterQueryDslHelpText": "La modification du langage dédié des requêtes Elasticsearch empêche la géométrie de filtre de s’afficher dans une carte.", "unifiedSearch.filter.filterEditor.trueOptionLabel": "vrai", "unifiedSearch.filter.filterEditor.updateButtonLabel": "Mettre à jour le filtre", "unifiedSearch.filter.filterEditor.valueInputPlaceholder": "Saisir une valeur", @@ -5504,14 +5865,14 @@ "unifiedSearch.filter.options.disableAllFiltersButtonLabel": "Tout désactiver", "unifiedSearch.filter.options.enableAllFiltersButtonLabel": "Tout activer", "unifiedSearch.filter.options.filterLanguageLabel": "Filtrer la langue", - "unifiedSearch.filter.options.filterSetButtonLabel": "Menu de requête enregistré", + "unifiedSearch.filter.options.filterSetButtonLabel": "Menu de recherche", "unifiedSearch.filter.options.invertNegatedFiltersButtonLabel": "Inverser l'inclusion", - "unifiedSearch.filter.options.loadCurrentFilterSetLabel": "Charger une requête enregistrée", - "unifiedSearch.filter.options.loadOtherFilterSetLabel": "Charger une autre requête enregistrée", + "unifiedSearch.filter.options.loadCurrentFilterSetLabel": "Charger la requête", + "unifiedSearch.filter.options.loadOtherFilterSetLabel": "Charger la requête", "unifiedSearch.filter.options.pinAllFiltersButtonLabel": "Tout épingler", - "unifiedSearch.filter.options.saveAsNewFilterSetLabel": "Enregistrer en tant que nouvelle", - "unifiedSearch.filter.options.saveCurrentFilterSetLabel": "Enregistrer la requête enregistrée en cours", - "unifiedSearch.filter.options.saveFilterSetLabel": "Enregistrer la requête enregistrée", + "unifiedSearch.filter.options.saveAsNewFilterSetLabel": "Enregistrer la requête", + "unifiedSearch.filter.options.saveCurrentFilterSetLabel": "Enregistrer en tant que nouvelle", + "unifiedSearch.filter.options.saveFilterSetLabel": "Enregistrer la requête", "unifiedSearch.filter.options.unpinAllFiltersButtonLabel": "Tout désépingler", "unifiedSearch.kueryAutocomplete.andOperatorDescription.bothArgumentsText": "les deux arguments", "unifiedSearch.kueryAutocomplete.equalOperatorDescription.equalsText": "égal", @@ -5533,7 +5894,7 @@ "unifiedSearch.query.queryBar.indexPattern.addNewDataView": "Créer une vue de données", "unifiedSearch.query.queryBar.indexPattern.dataViewsLabel": "Vues de données", "unifiedSearch.query.queryBar.indexPattern.findDataView": "Rechercher une vue de données", - "unifiedSearch.query.queryBar.indexPattern.findFilterSet": "Rechercher une requête enregistrée", + "unifiedSearch.query.queryBar.indexPattern.findFilterSet": "Trouver une requête", "unifiedSearch.query.queryBar.indexPattern.manageFieldButton": "Gérer cette vue de données", "unifiedSearch.query.queryBar.indexPattern.temporaryDataviewLabel": "Temporaire", "unifiedSearch.query.queryBar.indexPattern.textBasedLangSwitchWarning": "Un changement de vue de données supprime la requête SQL en cours. Sauvegardez cette recherche pour ne pas perdre de travail.", @@ -5607,25 +5968,26 @@ "unifiedSearch.queryBarTopRow.submitButton.run": "Exécuter la requête", "unifiedSearch.queryBarTopRow.submitButton.update": "Nécessite une mise à jour", "unifiedSearch.search.searchBar.savedQueryDescriptionText": "Enregistrez le texte et les filtres de la requête que vous souhaitez réutiliser.", - "unifiedSearch.search.searchBar.savedQueryForm.titleConflictText": "Ce nom est en conflit avec une requête enregistrée existante.", + "unifiedSearch.search.searchBar.savedQueryForm.titleConflictText": "Ce nom est en conflit avec une requête existante", "unifiedSearch.search.searchBar.savedQueryForm.titleExistsText": "Un nom est requis.", - "unifiedSearch.search.searchBar.savedQueryFormSaveButtonText": "Enregistrer la requête enregistrée", + "unifiedSearch.search.searchBar.savedQueryFormSaveButtonText": "Enregistrer la requête", "unifiedSearch.search.searchBar.savedQueryIncludeFiltersLabelText": "Inclure les filtres", "unifiedSearch.search.searchBar.savedQueryIncludeTimeFilterLabelText": "Inclure le filtre temporel", "unifiedSearch.search.searchBar.savedQueryNameHelpText": "Le nom ne peut pas contenir d'espace au début ni à la fin, et il doit être unique.", "unifiedSearch.search.searchBar.savedQueryNameLabelText": "Nom", "unifiedSearch.search.searchBar.savedQueryNoSavedQueriesText": "Aucune requête enregistrée.", - "unifiedSearch.search.searchBar.savedQueryPopoverApplyFilterSetLabel": "Appliquer la requête enregistrée", + "unifiedSearch.search.searchBar.savedQueryPopoverApplyFilterSetLabel": "Charger la requête", "unifiedSearch.search.searchBar.savedQueryPopoverConfirmDeletionCancelButtonText": "Annuler", "unifiedSearch.search.searchBar.savedQueryPopoverConfirmDeletionConfirmButtonText": "Supprimer", - "unifiedSearch.search.searchBar.savedQueryPopoverSaveAsNewButtonAriaLabel": "Enregistrer en tant que nouvelle requête enregistrée", + "unifiedSearch.search.searchBar.savedQueryPopoverManageLabel": "Gérer les objets enregistrés", + "unifiedSearch.search.searchBar.savedQueryPopoverSaveAsNewButtonAriaLabel": "Enregistrer en tant que nouvelle requête", "unifiedSearch.search.searchBar.savedQueryPopoverSaveAsNewButtonText": "Enregistrer en tant que nouvelle", - "unifiedSearch.search.searchBar.savedQueryPopoverSaveChangesButtonText": "Enregistrer les modifications", + "unifiedSearch.search.searchBar.savedQueryPopoverSaveChangesButtonText": "Mettre à jour la recherche", "unifiedSearch.switchLanguage.buttonText": "Bouton de changement de langue.", "unifiedSearch.triggers.updateFilterReferencesTrigger": "Mettre à jour les références de filtre", "unifiedSearch.triggers.updateFilterReferencesTriggerDescription": "Mettre à jour les références de filtre", - "userProfileComponents.userProfilesSelectable.limitReachedMessage": "Vous avez sélectionné la limite maximale de {count, plural, one {# utilisateur} other {# utilisateurs}}", - "userProfileComponents.userProfilesSelectable.selectedStatusMessage": "{count, plural, one {# utilisateur sélectionné} other {# utilisateurs sélectionnés}}", + "userProfileComponents.userProfilesSelectable.limitReachedMessage": "Vous avez sélectionné la limite maximale de {count, plural, one {# utilisateur} many {# utilisateurs} other {# utilisateurs}}", + "userProfileComponents.userProfilesSelectable.selectedStatusMessage": "{count, plural, one {# utilisateur sélectionné} many {# utilisateurs sélectionnés} other {# utilisateurs sélectionnés}}", "userProfileComponents.userProfilesSelectable.clearButtonLabel": "Retirer tous les utilisateurs", "userProfileComponents.userProfilesSelectable.defaultOptionsLabel": "Suggérée", "userProfileComponents.userProfilesSelectable.nullOptionLabel": "Aucun utilisateur", @@ -5687,7 +6049,7 @@ "visDefaultEditor.controls.dateRanges.fromColumnLabel": "De", "visDefaultEditor.controls.dateRanges.toColumnLabel": "À", "visDefaultEditor.controls.dotSizeRatioHelpText": "Remplacez le rapport du rayon du plus petit point par le plus grand point.", - "visDefaultEditor.controls.dotSizeRatioLabel": "Rapport de taille des points", + "visDefaultEditor.controls.dotSizeRatioLabel": "Rapport de taille de point", "visDefaultEditor.controls.dropPartialBucketsLabel": "Abandonner les compartiments partiels", "visDefaultEditor.controls.dropPartialBucketsTooltip": "Retirez les compartiments qui s'étendent au-delà de la plage temporelle afin que l'histogramme ne commence pas et ne se termine pas par des compartiments incomplets.", "visDefaultEditor.controls.extendedBounds.errorMessage": "Le minimum doit être inférieur ou égal au maximum.", @@ -5752,7 +6114,7 @@ "visDefaultEditor.controls.timeInterval.invalidFormatErrorMessage": "Format d'intervalle non valide.", "visDefaultEditor.controls.timeInterval.minimumIntervalLabel": "Intervalle minimal", "visDefaultEditor.controls.timeInterval.selectIntervalPlaceholder": "Choisir un intervalle", - "visDefaultEditor.controls.timeInterval.selectOptionHelpText": "Choisissez une option ou créez une valeur personnalisée. Exemples : 30s, 20m, 24h, 2d, 1w, 1M", + "visDefaultEditor.controls.timeInterval.selectOptionHelpText": "Choisissez une option ou créez une valeur personnalisée. Exemples : 30s, 20m, 24h, 2d, 1w, 1M", "visDefaultEditor.controls.useAutoInterval": "Utiliser l'intervalle automatique", "visDefaultEditor.options.colorRanges.errorText": "Chaque plage doit être supérieure à la précédente.", "visDefaultEditor.options.colorSchema.colorSchemaLabel": "Schéma de couleurs", @@ -5765,7 +6127,7 @@ "visDefaultEditor.options.legendSizeSetting.legendSizeOptions.large": "Large", "visDefaultEditor.options.legendSizeSetting.legendSizeOptions.medium": "Moyenne", "visDefaultEditor.options.legendSizeSetting.legendSizeOptions.small": "Petite", - "visDefaultEditor.options.legendSizeSetting.legendVertical": "Requiert que la légende soit alignée à droite ou à gauche.", + "visDefaultEditor.options.legendSizeSetting.legendVertical": "Requiert que la légende soit alignée à droite ou à gauche", "visDefaultEditor.options.longLegends.maxLegendLinesLabel": "Nombre maxi de lignes de légende", "visDefaultEditor.options.longLegends.truncateLegendTextLabel": "Tronquer le texte de la légende", "visDefaultEditor.options.percentageMode.documentationLabel": "Documentation Numeral.js", @@ -5776,9 +6138,9 @@ "visDefaultEditor.palettePicker.label": "Palette de couleurs", "visDefaultEditor.sidebar.autoApplyChangesLabelOff": "Application automatique désactivée", "visDefaultEditor.sidebar.autoApplyChangesLabelOn": "Application automatique activée", - "visDefaultEditor.sidebar.autoApplyChangesOff": "Désactivé", + "visDefaultEditor.sidebar.autoApplyChangesOff": "Off", "visDefaultEditor.sidebar.autoApplyChangesOffLabel": "Application automatique désactivée", - "visDefaultEditor.sidebar.autoApplyChangesOn": "Activé", + "visDefaultEditor.sidebar.autoApplyChangesOn": "On", "visDefaultEditor.sidebar.autoApplyChangesOnLabel": "Application automatique activée", "visDefaultEditor.sidebar.autoApplyChangesTooltip": "Met automatiquement à jour la visualisation à chaque modification.", "visDefaultEditor.sidebar.collapseButtonAriaLabel": "Activer/Désactiver la barre latérale", @@ -5806,8 +6168,8 @@ "visTypeTable.function.args.rowHelpText": "La valeur de ligne est utilisée pour le mode de division de tableau. Définir sur \"vrai\" pour diviser par ligne", "visTypeTable.function.args.showToolbarHelpText": "Définir sur \"vrai\" pour afficher la barre d'outils de la grille avec le bouton \"Exporter\"", "visTypeTable.function.args.showTotalHelpText": "Définir sur \"vrai\" pour afficher le nombre total de lignes", - "visTypeTable.function.args.splitColumnHelpText": "Configuration de la dimension Diviser par colonne", - "visTypeTable.function.args.splitRowHelpText": "Configuration de la dimension Diviser par ligne", + "visTypeTable.function.args.splitColumnHelpText": "Diviser par la configuration des dimensions de colonne", + "visTypeTable.function.args.splitRowHelpText": "Diviser par la configuration des dimensions de ligne", "visTypeTable.function.args.titleHelpText": "Titre de la visualisation. Le titre est utilisé comme nom de fichier par défaut pour l'exportation CSV.", "visTypeTable.function.args.totalFuncHelpText": "Spécifie la fonction de calcul du nombre total de lignes. Les options possibles sont : ", "visTypeTable.function.dimension.metrics": "Indicateurs", @@ -5844,7 +6206,7 @@ "visTypeTable.vis.controls.rawCSVButtonLabel": "Brut", "visTypeTimeseries.advancedSettings.allowStringIndicesText": "Vous permet d'interroger les index Elasticsearch dans les visualisations TSVB.", "visTypeTimeseries.agg.aggIsNotSupportedDescription": "L'agrégation {modelType} n'est plus prise en charge.", - "visTypeTimeseries.agg.aggIsUnsupportedForPanelConfigDescription": "L'agrégation {modelType} n'est plus prise en charge pour la configuration de panneau existante.", + "visTypeTimeseries.agg.aggIsUnsupportedForPanelConfigDescription": "L'agrégation {modelType} n'est pas prise en charge pour la configuration de panneau existante.", "visTypeTimeseries.annotationRequest.label": "Annotation : {id}", "visTypeTimeseries.annotationsEditor.rowTemplateHelpText": "Par ex. {rowTemplateExample}", "visTypeTimeseries.axisLabelOptions.axisLabel": "par {unitValue} {unitString}", @@ -5863,7 +6225,7 @@ "visTypeTimeseries.errors.fieldNotFound": "Champ \"{field}\" introuvable", "visTypeTimeseries.externalUrlErrorModal.bodyMessage": "Configurez {externalUrlPolicy} dans votre {kibanaConfigFileName} pour autoriser l'accès à {url}.", "visTypeTimeseries.fieldSelect.fieldIsNotValid": "La sélection \"{fieldParameter}\" n'est pas valide pour une utilisation avec l'index actuel.", - "visTypeTimeseries.fieldUtils.multiFieldLabel": "{firstFieldLabel} + {count} {count, plural, one {autre} other {autres}}", + "visTypeTimeseries.fieldUtils.multiFieldLabel": "{firstFieldLabel} + {count} {count, plural, one {autre} many {autres} other {autres}}", "visTypeTimeseries.indexPattern.detailLevelHelpText": "Contrôle les intervalles auto et gte en fonction de la plage temporelle. Les paramètres avancés {histogramTargetBars} et {histogramMaxBars} ont un impact sur l'intervalle par défaut.", "visTypeTimeseries.indexPattern.timeRange.error": "Vous ne pouvez pas utiliser \"{mode}\" avec le type d'index actuel.", "visTypeTimeseries.indexPatternSelect.defaultDataViewText": "Utilisation de la vue de données par défaut. {queryAllIndicesHelpText}", @@ -5913,7 +6275,7 @@ "visTypeTimeseries.aggUtils.countLabel": "Décompte", "visTypeTimeseries.aggUtils.cumulativeSumLabel": "Somme cumulée", "visTypeTimeseries.aggUtils.derivativeLabel": "Dérivée", - "visTypeTimeseries.aggUtils.deviationLabel": "Écart général", + "visTypeTimeseries.aggUtils.deviationLabel": "Écart type", "visTypeTimeseries.aggUtils.filterRatioLabel": "Rapport de filtre", "visTypeTimeseries.aggUtils.mathLabel": "Mathématique", "visTypeTimeseries.aggUtils.maxLabel": "Max.", @@ -5979,7 +6341,7 @@ "visTypeTimeseries.dataFormatPicker.formatPatternHelpText": "Documentation", "visTypeTimeseries.dataFormatPicker.fromLabel": "De", "visTypeTimeseries.dataFormatPicker.numberLabel": "Nombre", - "visTypeTimeseries.dataFormatPicker.percentLabel": "Pourcent", + "visTypeTimeseries.dataFormatPicker.percentLabel": "Pour cent", "visTypeTimeseries.dataFormatPicker.toLabel": "À", "visTypeTimeseries.defaultDataFormatterLabel": "Formateur de données", "visTypeTimeseries.derivative.aggregationLabel": "Agrégation", @@ -6031,7 +6393,7 @@ "visTypeTimeseries.gauge.optionsTab.innerLineWidthLabel": "Largeur de la ligne intérieure", "visTypeTimeseries.gauge.optionsTab.optionsButtonLabel": "Options", "visTypeTimeseries.gauge.optionsTab.panelFilterLabel": "Filtre de panneau", - "visTypeTimeseries.gauge.optionsTab.panelOptionsButtonLabel": "Options de panneau", + "visTypeTimeseries.gauge.optionsTab.panelOptionsButtonLabel": "Options du panneau", "visTypeTimeseries.gauge.optionsTab.styleLabel": "Style", "visTypeTimeseries.gauge.styleOptions.circleLabel": "Cercle", "visTypeTimeseries.gauge.styleOptions.halfCircleLabel": "Demi-cercle", @@ -6103,7 +6465,7 @@ "visTypeTimeseries.markdown.optionsTab.openLinksInNewTab": "Ouvrir les liens dans un nouvel onglet ?", "visTypeTimeseries.markdown.optionsTab.optionsButtonLabel": "Options", "visTypeTimeseries.markdown.optionsTab.panelFilterLabel": "Filtre de panneau", - "visTypeTimeseries.markdown.optionsTab.panelOptionsButtonLabel": "Options de panneau", + "visTypeTimeseries.markdown.optionsTab.panelOptionsButtonLabel": "Options du panneau", "visTypeTimeseries.markdown.optionsTab.showScrollbarsLabel": "Afficher les barres de défilement ?", "visTypeTimeseries.markdown.optionsTab.styleLabel": "Style", "visTypeTimeseries.markdown.optionsTab.verticalAlignmentLabel": "Alignement vertical :", @@ -6248,7 +6610,7 @@ "visTypeTimeseries.table.aggregateFunctionLabel": "Fonction agrégée", "visTypeTimeseries.table.avgLabel": "Moy.", "visTypeTimeseries.table.cloneSeriesTooltip": "Cloner la série", - "visTypeTimeseries.table.colorRulesLabel": "Règles de couleur", + "visTypeTimeseries.table.colorRulesLabel": "Règles de couleurs", "visTypeTimeseries.table.columnNotSortableTooltip": "Cette colonne ne peut pas être triée", "visTypeTimeseries.table.cumulativeSumLabel": "Somme cumulée", "visTypeTimeseries.table.dataTab.columnLabel": "Étiquette de colonne", @@ -6261,14 +6623,14 @@ "visTypeTimeseries.table.filterLabel": "Filtre", "visTypeTimeseries.table.labelAriaLabel": "Étiquette", "visTypeTimeseries.table.labelPlaceholder": "Étiquette", - "visTypeTimeseries.table.maxLabel": "Max.", - "visTypeTimeseries.table.minLabel": "Min.", + "visTypeTimeseries.table.maxLabel": "Max", + "visTypeTimeseries.table.minLabel": "Min", "visTypeTimeseries.table.noResultsAvailableWithDescriptionMessage": "Aucun résultat disponible. Vous devez choisir un champ Regrouper par pour cette visualisation.", "visTypeTimeseries.table.optionsTab.dataLabel": "Données", "visTypeTimeseries.table.optionsTab.ignoreGlobalFilterLabel": "Ignorer le filtre global ?", "visTypeTimeseries.table.optionsTab.itemUrlLabel": "URL de l'élément", "visTypeTimeseries.table.optionsTab.panelFilterLabel": "Filtre de panneau", - "visTypeTimeseries.table.optionsTab.panelOptionsButtonLabel": "Options de panneau", + "visTypeTimeseries.table.optionsTab.panelOptionsButtonLabel": "Options du panneau", "visTypeTimeseries.table.overallAvgLabel": "Moy. générale", "visTypeTimeseries.table.overallMaxLabel": "Max. général", "visTypeTimeseries.table.overallMinLabel": "Min. général", @@ -6278,13 +6640,13 @@ "visTypeTimeseries.table.tab.metricsLabel": "Indicateurs", "visTypeTimeseries.table.tab.optionsLabel": "Options", "visTypeTimeseries.table.templateLabel": "Modèle", - "visTypeTimeseries.table.toggleSeriesEditorAriaLabel": "Activer/Désactiver l'éditeur de séries", + "visTypeTimeseries.table.toggleSeriesEditorAriaLabel": "Basculer l'éditeur de séries", "visTypeTimeseries.timeSeries.addSeriesTooltip": "Ajouter une série", "visTypeTimeseries.timeseries.annotationsTab.annotationsButtonLabel": "Annotations", "visTypeTimeseries.timeSeries.axisMaxLabel": "Max. de l'axe", "visTypeTimeseries.timeSeries.axisMinLabel": "Min. de l'axe", "visTypeTimeseries.timeSeries.axisPositionLabel": "Position de l'axe", - "visTypeTimeseries.timeSeries.barLabel": "Barres", + "visTypeTimeseries.timeSeries.barLabel": "Barre", "visTypeTimeseries.timeSeries.chartBar.chartTypeLabel": "Type de graphique", "visTypeTimeseries.timeSeries.chartBar.fillLabel": "Remplissage (0 à 1)", "visTypeTimeseries.timeSeries.chartBar.lineWidthLabel": "Largeur de la ligne", @@ -6312,7 +6674,7 @@ "visTypeTimeseries.timeseries.optionsTab.axisMinLabel": "Min. de l'axe", "visTypeTimeseries.timeseries.optionsTab.axisPositionLabel": "Position de l'axe", "visTypeTimeseries.timeseries.optionsTab.axisScaleLabel": "Échelle de l'axe", - "visTypeTimeseries.timeseries.optionsTab.backgroundColorLabel": "Couleur d'arrière-plan :", + "visTypeTimeseries.timeseries.optionsTab.backgroundColorLabel": "Couleur de l'arrière-plan :", "visTypeTimeseries.timeseries.optionsTab.dataLabel": "Données", "visTypeTimeseries.timeseries.optionsTab.displayGridLabel": "Afficher la grille", "visTypeTimeseries.timeseries.optionsTab.ignoreDaylightTimeLabel": "Ignorer l'heure d'été ?", @@ -6320,7 +6682,7 @@ "visTypeTimeseries.timeseries.optionsTab.legendPositionLabel": "Position de la légende", "visTypeTimeseries.timeseries.optionsTab.maxLinesLabel": "Nombre maxi de lignes de légende", "visTypeTimeseries.timeseries.optionsTab.panelFilterLabel": "Filtre de panneau", - "visTypeTimeseries.timeseries.optionsTab.panelOptionsButtonLabel": "Options de panneau", + "visTypeTimeseries.timeseries.optionsTab.panelOptionsButtonLabel": "Options du panneau", "visTypeTimeseries.timeseries.optionsTab.showLegendLabel": "Afficher la légende ?", "visTypeTimeseries.timeseries.optionsTab.styleLabel": "Style", "visTypeTimeseries.timeseries.optionsTab.tooltipMode": "Infobulle", @@ -6340,7 +6702,7 @@ "visTypeTimeseries.timeSeries.tab.metricsLabel": "Indicateurs", "visTypeTimeseries.timeSeries.tab.optionsLabel": "Options", "visTypeTimeseries.timeSeries.templateLabel": "Modèle", - "visTypeTimeseries.timeSeries.toggleSeriesEditorAriaLabel": "Activer/Désactiver l'éditeur de séries", + "visTypeTimeseries.timeSeries.toggleSeriesEditorAriaLabel": "Basculer l'éditeur de séries", "visTypeTimeseries.timeseries.tooltipOptions.showAll": "Afficher toutes les valeurs", "visTypeTimeseries.timeseries.tooltipOptions.showFocused": "Afficher les valeurs ciblées", "visTypeTimeseries.topHit.aggregateWith.selectPlaceholder": "Sélectionner…", @@ -6348,7 +6710,7 @@ "visTypeTimeseries.topHit.aggregationLabel": "Agrégation", "visTypeTimeseries.topHit.aggWithOptions.averageLabel": "Moy.", "visTypeTimeseries.topHit.aggWithOptions.concatenate": "Concaténer", - "visTypeTimeseries.topHit.aggWithOptions.maxLabel": "Max.", + "visTypeTimeseries.topHit.aggWithOptions.maxLabel": "Max", "visTypeTimeseries.topHit.aggWithOptions.minLabel": "Min.", "visTypeTimeseries.topHit.aggWithOptions.sumLabel": "Somme", "visTypeTimeseries.topHit.fieldLabel": "Champ", @@ -6363,17 +6725,17 @@ "visTypeTimeseries.topN.dataTab.dataButtonLabel": "Données", "visTypeTimeseries.topN.deleteSeriesTooltip": "Supprimer la série", "visTypeTimeseries.topN.labelPlaceholder": "Étiquette", - "visTypeTimeseries.topN.optionsTab.backgroundColorLabel": "Couleur d'arrière-plan :", + "visTypeTimeseries.topN.optionsTab.backgroundColorLabel": "Couleur de l'arrière-plan :", "visTypeTimeseries.topN.optionsTab.colorRulesLabel": "Règles de couleur", "visTypeTimeseries.topN.optionsTab.dataLabel": "Données", "visTypeTimeseries.topN.optionsTab.ignoreGlobalFilterLabel": "Ignorer le filtre global ?", "visTypeTimeseries.topN.optionsTab.itemUrlLabel": "URL de l'élément", "visTypeTimeseries.topN.optionsTab.panelFilterLabel": "Filtre de panneau", - "visTypeTimeseries.topN.optionsTab.panelOptionsButtonLabel": "Options de panneau", + "visTypeTimeseries.topN.optionsTab.panelOptionsButtonLabel": "Options du panneau", "visTypeTimeseries.topN.optionsTab.styleLabel": "Style", "visTypeTimeseries.topN.tab.metricsLabel": "Indicateurs", "visTypeTimeseries.topN.tab.optionsLabel": "Options", - "visTypeTimeseries.topN.toggleSeriesEditorAriaLabel": "Activer/Désactiver l'éditeur de séries", + "visTypeTimeseries.topN.toggleSeriesEditorAriaLabel": "Basculer l'éditeur de séries", "visTypeTimeseries.units.auto": "auto", "visTypeTimeseries.units.perDay": "par jour", "visTypeTimeseries.units.perHour": "par heure", @@ -6482,7 +6844,7 @@ "visTypeVislib.functions.vislib.help": "Visualisation Vislib", "visTypeVislib.vislib.errors.noResultsFoundTitle": "Résultat introuvable", "visTypeVislib.vislib.legend.loadingLabel": "chargement…", - "visTypeVislib.vislib.legend.toggleLegendButtonAriaLabel": "Afficher/Masquer la légende", + "visTypeVislib.vislib.legend.toggleLegendButtonAriaLabel": "Basculer la légende", "visTypeVislib.vislib.legend.toggleLegendButtonTitle": "Afficher/Masquer la légende", "visTypeVislib.vislib.tooltip.fieldLabel": "champ", "visTypeVislib.vislib.tooltip.valueLabel": "valeur", @@ -6508,7 +6870,7 @@ "visTypeXy.chartModes.normalText": "Normal", "visTypeXy.chartModes.stackedText": "Empilé", "visTypeXy.chartTypes.areaText": "Aire", - "visTypeXy.chartTypes.barText": "Barres", + "visTypeXy.chartTypes.barText": "Barre", "visTypeXy.chartTypes.lineText": "Ligne", "visTypeXy.controls.pointSeries.categoryAxis.alignLabel": "Aligner", "visTypeXy.controls.pointSeries.categoryAxis.axisLabelsOptionsMultilayer.disabled": "Cette option peut être configurée uniquement avec des axes non basés sur le temps", @@ -6534,9 +6896,9 @@ "visTypeXy.controls.pointSeries.series.valueAxisLabel": "Axe des valeurs", "visTypeXy.controls.pointSeries.valueAxes.addButtonTooltip": "Ajouter l'axe Y", "visTypeXy.controls.pointSeries.valueAxes.customExtentsLabel": "Extensions personnalisées", - "visTypeXy.controls.pointSeries.valueAxes.maxLabel": "Max.", + "visTypeXy.controls.pointSeries.valueAxes.maxLabel": "Max", "visTypeXy.controls.pointSeries.valueAxes.minErrorMessage": "Min doit être inférieur à Max.", - "visTypeXy.controls.pointSeries.valueAxes.minLabel": "Min.", + "visTypeXy.controls.pointSeries.valueAxes.minLabel": "Min", "visTypeXy.controls.pointSeries.valueAxes.minNeededScaleText": "Min doit être supérieur à 0 lorsqu'une échelle logarithmique est sélectionnée.", "visTypeXy.controls.pointSeries.valueAxes.modeLabel": "Mode", "visTypeXy.controls.pointSeries.valueAxes.positionLabel": "Position", @@ -6618,7 +6980,7 @@ "visualizations.newChart.conditionalMessage.newLibrary": "Passer à la bibliothèque {type} dans {link}", "visualizations.newGaugeChart.notificationMessage": "La nouvelle bibliothèque de graphiques de jauge ne prend pas encore en charge l'agrégation de graphiques fractionnés. {conditionalMessage}", "visualizations.newVisWizard.newVisTypeTitle": "Nouveau {visTypeName}", - "visualizations.newVisWizard.resultsFound": "{resultCount, plural, one {type trouvé} other {types trouvés}}", + "visualizations.newVisWizard.resultsFound": "{resultCount, plural, one {type} many {types} other {types}} trouvé(s)", "visualizations.noMatchRoute.bannerText": "L'application Visualize ne reconnaît pas cet itinéraire : {route}.", "visualizations.oldPieChart.notificationMessage": "Vous utilisez la bibliothèque de graphiques existante qui sera supprimée dans une prochaine version. {conditionalMessage}", "visualizations.pageHeading": "Visualisation {chartName} {chartType}", @@ -6667,7 +7029,7 @@ "visualizations.helpMenu.appName": "Bibliothèque Visualize", "visualizations.legacyCharts.conditionalMessage.noPermissions": "Contactez votre administrateur système pour passer à l'ancienne bibliothèque.", "visualizations.linkedToSearch.unlinkSuccessNotificationText": "Dissocié de la recherche enregistrée \"{searchTitle}\"", - "visualizations.listing.betaTitle": "Bêta", + "visualizations.listing.betaTitle": "Version bêta", "visualizations.listing.betaTooltip": "Cette visualisation est en version bêta et susceptible d'être modifiée. La conception et le code sont moins matures que les fonctionnalités officielles en disponibilité générale et sont fournis tels quels sans aucune garantie. Les fonctionnalités bêta ne sont pas soumises aux accords de niveau de service d'assistance des fonctionnalités officielles en disponibilité générale", "visualizations.listing.breadcrumb": "Bibliothèque Visualize", "visualizations.listing.createNew.createButtonLabel": "Créer une nouvelle visualisation", @@ -6743,11 +7105,12 @@ "xpack.actions.actionTypeRegistry.register.missingSupportedFeatureIds": "Au moins une valeur \"supportedFeatureId\" doit être fournie pour le type de connecteur \"{connectorTypeId}\".", "xpack.actions.apiAllowedHostsError": "erreur lors de la configuration de l'action du connecteur : {message}", "xpack.actions.disabledActionTypeError": "le type d'action \"{actionType}\" n'est pas activé dans la configuration Kibana xpack.actions.enabledActionTypes", - "xpack.actions.savedObjects.onImportText": "{connectorsWithSecretsLength} {connectorsWithSecretsLength, plural, one {connecteur contient} other {connecteurs contiennent}} des informations sensibles qui nécessitent des mises à jour.", + "xpack.actions.savedObjects.onImportText": "{connectorsWithSecretsLength} {connectorsWithSecretsLength, plural, one {connecteur a} many {connecteurs ont} other {connecteurs ont}} des informations sensibles qui nécessitent des mises à jour.", "xpack.actions.serverSideErrors.expirerdLicenseErrorMessage": "Le type d'action {actionTypeId} est désactivé, car votre licence {licenseType} a expiré.", "xpack.actions.serverSideErrors.invalidLicenseErrorMessage": "Le type d'action {actionTypeId} est désactivé, car votre licence {licenseType} ne le prend pas en charge. Veuillez mettre à niveau votre licence.", "xpack.actions.serverSideErrors.predefinedActionDeleteDisabled": "L'action préconfigurée {id} n'est pas autorisée à effectuer des suppressions.", "xpack.actions.serverSideErrors.predefinedActionUpdateDisabled": "L'action préconfigurée {id} n'est pas autorisée à effectuer des mises à jour.", + "xpack.actions.serverSideErrors.predefinedIdConnectorAlreadyExists": "Cet {id} existe déjà dans l'action préconfigurée.", "xpack.actions.serverSideErrors.unavailableLicenseErrorMessage": "Le type d'action {actionTypeId} est désactivé, car les informations de licence ne sont pas disponibles actuellement.", "xpack.actions.subActionsFramework.urlValidationError": "Erreur lors de la validation de l'URL : {message}", "xpack.actions.urlAllowedHostsConfigurationError": "Le {field} cible \"{value}\" n'est pas ajouté à la configuration Kibana xpack.actions.allowedHosts", @@ -6763,36 +7126,71 @@ "xpack.actions.featureRegistry.actionsFeatureName": "Actions et connecteurs", "xpack.actions.savedObjects.goToConnectorsButtonText": "Accéder aux connecteurs", "xpack.actions.serverSideErrors.unavailableLicenseInformationErrorMessage": "Les actions sont indisponibles - les informations de licence ne sont pas disponibles actuellement.", - "xpack.aiops.analysis.errorCallOutTitle": "Génération {errorCount, plural, one {de l'erreur suivante} other {des erreurs suivantes}} au cours de l'analyse.", + "xpack.aiops.analysis.errorCallOutTitle": "{errorCount, plural, one {erreur} many {erreurs} other {erreurs}} lors de l'analyse.", + "xpack.aiops.categorizeFlyout.title": "Analyse du modèle de {name}", "xpack.aiops.changePointDetection.cardinalityWarningMessage": "La cardinalité du champ \"{splitField}\" est {cardinality}, ce qui dépasse la limite de {cardinalityLimit}. Seules les {cardinalityLimit} premières partitions, triées par nombre de documents, sont analysées.", - "xpack.aiops.explainLogRateSpikes.loadingState.identifiedFieldCandidates": "{fieldCandidatesCount, plural, one {# candidat de champ identifié} other {# candidats de champs identifiés}}.", - "xpack.aiops.explainLogRateSpikes.loadingState.identifiedFieldValuePairs": "{fieldValuePairsCount, plural, one {# paire significative champ/valeur identifiée} other {# paires significatives champ/valeur identifiées}}.", + "xpack.aiops.explainLogRateSpikes.loadingState.identifiedFieldCandidates": "{fieldCandidatesCount, plural, one {# champ candidat a été identifié} many {# champs candidats ont été identifiés} other {# champs candidats ont été identifiés}}.", + "xpack.aiops.explainLogRateSpikes.loadingState.identifiedFieldValuePairs": "{fieldValuePairsCount, plural, one {# paire champ/valeur significative a été identifiée} many {# paires champ/valeur significatives ont été identifiées} other {# paires champ/valeur significatives ont été identifiées}}.", + "xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.groupColumnTooltip": "Affiche jusqu'à {maxItemCount} éléments de groupe triés par unicité et nombre de documents. Développez la ligne pour voir toutes les paires champ/valeur.", + "xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.groupItemsInfo": "Affichage de {valuesBadges} éléments sur {count}.", + "xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.groupUniqueItemsInfo": "{count, plural, one {# élément} many {Éléments #} other {Éléments #}} unique(s) à ce groupe.", "xpack.aiops.index.dataLoader.internalServerErrorMessage": "Erreur lors du chargement des données dans l'index {index}. {message}. La requête a peut-être expiré. Essayez d'utiliser un échantillon d'une taille inférieure ou de réduire la plage temporelle.", "xpack.aiops.index.dataViewNotBasedOnTimeSeriesNotificationTitle": "La vue de données \"{dataViewTitle}\" n'est pas basée sur une série temporelle.", "xpack.aiops.index.dataViewWithoutMetricNotificationTitle": "La vue de données \"{dataViewTitle}\" ne contient aucun champ d'indicateurs.", "xpack.aiops.index.errorLoadingDataMessage": "Erreur lors du chargement des données dans l'index {index}. {message}.", + "xpack.aiops.logCategorization.counts": "{count} modèles trouvés", + "xpack.aiops.logCategorization.filterAliasLabel": "Catégorisation - {field}", + "xpack.aiops.logCategorization.filterIn": "Filtrer sur {values, plural, one {un modèle} many {des modèles} other {des modèles}} dans Discover", + "xpack.aiops.logCategorization.filterOut": "Exclure {values, plural, one {un modèle} many {des modèles} other {des modèles}} dans Discover", + "xpack.aiops.logCategorization.flyout.filterIn": "Filtrer sur {values, plural, one {un modèle} many {des modèles} other {des modèles}}", + "xpack.aiops.logCategorization.flyout.filterOut": "Exclure {values, plural, one {un modèle} many {des modèles} other {des modèles}}", + "xpack.aiops.logCategorization.randomSamplerSettingsPopUp.probabilityLabel": "Probabilité utilisée : {samplingProbability} %", + "xpack.aiops.logCategorization.selectedCounts": " | {count} sélectionné(s)", "xpack.aiops.progressTitle": "Progression : {progress} % — {progressMessage}", + "xpack.aiops.searchPanel.sampleProbabilityLabel": "Probabilité d'échantillonnage : {strongSamplingProbability}", + "xpack.aiops.searchPanel.sampleProbabilityNumber": "{sampleProbability, plural, one {#} many {#} other {#}}", "xpack.aiops.searchPanel.totalDocCountLabel": "Total des documents : {strongTotalCount}", - "xpack.aiops.searchPanel.totalDocCountNumber": "{totalCount, plural, other {#}}", + "xpack.aiops.searchPanel.totalDocCountNumber": "{totalCount, plural, one {#} many {#} other {#}}", + "xpack.aiops.analysis.fieldSelectorAriaLabel": "Champs de filtre", + "xpack.aiops.analysis.fieldSelectorNotEnoughFieldsSelected": "Le regroupement nécessite la sélection d'au moins 2 champs.", + "xpack.aiops.analysis.fieldSelectorPlaceholder": "Recherche", "xpack.aiops.cancelAnalysisButtonTitle": "Annuler", + "xpack.aiops.categorizeFieldAction.displayName": "Catégoriser le champ", + "xpack.aiops.categorizeFlyout.loading.title": "Chargement de l'analyse du modèle", + "xpack.aiops.changePointDetection.actions.filterForValueAction": "Filtrer sur la valeur", + "xpack.aiops.changePointDetection.actions.filterOutValueAction": "Exclure la valeur", + "xpack.aiops.changePointDetection.actionsColumn": "Actions", + "xpack.aiops.changePointDetection.addButtonLabel": "Ajouter", "xpack.aiops.changePointDetection.aggregationIntervalTitle": "Intervalle d'agrégation : ", "xpack.aiops.changePointDetection.cardinalityWarningTitle": "L'analyse a été limitée", "xpack.aiops.changePointDetection.changePointTypeLabel": "Type de point de modification", "xpack.aiops.changePointDetection.dipDescription": "Une baisse significative existe au niveau de ce point.", "xpack.aiops.changePointDetection.distributionChangeDescription": "La distribution générale des valeurs a subi une modification significative.", + "xpack.aiops.changePointDetection.expandConfigLabel": "Développer la configuration", "xpack.aiops.changePointDetection.fetchErrorTitle": "Impossible de récupérer les points de modification", + "xpack.aiops.changePointDetection.fetchingChangePointsTitle": "Récupération des points de modification...", + "xpack.aiops.changePointDetection.fieldNameColumn": "Nom du champ", + "xpack.aiops.changePointDetection.fieldValueColumn": "Valeur du champ", "xpack.aiops.changePointDetection.noChangePointsFoundMessage": "Détectez les points de modification statistiquement significatifs tels que les baisses, les pics et les modifications de distribution dans un indicateur. Sélectionnez un indicateur et définissez une plage temporelle pour commencer à détecter les points de modification dans vos données.", "xpack.aiops.changePointDetection.noChangePointsFoundTitle": "Aucun point de modification trouvé", "xpack.aiops.changePointDetection.notResultsWarning": "Avertissement de résultats agrégés d'absence de point de modification", "xpack.aiops.changePointDetection.notSelectedSplitFieldLabel": "--- Non sélectionné ---", + "xpack.aiops.changePointDetection.previewColumn": "Aperçu", "xpack.aiops.changePointDetection.progressBarLabel": "Récupération des points de modification", + "xpack.aiops.changePointDetection.pValueTooltip": "Indique le degré d'importance de la modification. Une valeur inférieure indique une modification plus importante.", + "xpack.aiops.changePointDetection.removeConfigLabel": "Retirer la configuration", "xpack.aiops.changePointDetection.selectAllChangePoints": "Tout sélectionner", + "xpack.aiops.changePointDetection.selectedChangePointsHeader": "Points de modification sélectionnés", "xpack.aiops.changePointDetection.selectFunctionLabel": "Fonction", "xpack.aiops.changePointDetection.selectMetricFieldLabel": "Champ d'indicateur", "xpack.aiops.changePointDetection.selectSpitFieldLabel": "Diviser le champ", "xpack.aiops.changePointDetection.spikeDescription": "Un pic significatif existe au niveau de ce point.", "xpack.aiops.changePointDetection.stepChangeDescription": "La modification indique une hausse ou une baisse statistiquement significative dans la distribution des valeurs.", + "xpack.aiops.changePointDetection.timeColumn": "Heure", "xpack.aiops.changePointDetection.trendChangeDescription": "Une modification générale de tendance existe au niveau de ce point.", + "xpack.aiops.changePointDetection.typeColumn": "Type", + "xpack.aiops.changePointDetection.viewSelectedButtonLabel": "Vue sélectionnée", + "xpack.aiops.changePointDetection.viewSelectedChartsToltip": "Sélectionnez les points de modification pour les afficher en détail.", "xpack.aiops.correlations.highImpactText": "Élevé", "xpack.aiops.correlations.lowImpactText": "Bas", "xpack.aiops.correlations.mediumImpactText": "Moyenne", @@ -6813,7 +7211,7 @@ "xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.fieldNameLabel": "Nom du champ", "xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.fieldValueLabel": "Valeur du champ", "xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.impactLabel": "Impact", - "xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.impactLabelColumnTooltip": "Le niveau d'impact du champ sur la différence de taux de messages", + "xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.impactLabelColumnTooltip": "Le niveau d'impact du champ sur la différence de taux de messages.", "xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.logRateColumnTooltip": "Une représentation visuelle de l'impact du champ sur la différence de taux de messages", "xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.logRateLabel": "Taux du log", "xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.pValueColumnTooltip": "L'importance de changements dans la fréquence des valeurs ; des valeurs plus faibles indiquent un changement plus important.", @@ -6821,31 +7219,55 @@ "xpack.aiops.explainLogRateSpikes.spikeAnalysisTable.uniqueColumnTooltip": "Cette paire champ/valeur apparaît uniquement dans ce groupe", "xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.groupLabel": "Regrouper", "xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.impactLabelColumnTooltip": "Niveau d'impact du groupe sur la différence de taux de messages", - "xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.logRateColumnTooltip": "Représentation visuelle de l'impact du groupe sur la différence de taux de messages", + "xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.logRateColumnTooltip": "Représentation visuelle de l'impact du groupe sur la différence de taux de messages.", "xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.logRateLabel": "Taux du log", "xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.pValueColumnTooltip": "L'importance de changements dans la fréquence des valeurs ; des valeurs plus faibles indiquent un changement plus important.", "xpack.aiops.explainLogRateSpikes.spikeAnalysisTableGroups.pValueLabel": "valeur-p", "xpack.aiops.explainLogRateSpikesPage.emptyPromptBody": "La fonction Expliquer les pics de taux de log identifie les combinaisons champ/valeur statistiquement significatives qui contribuent à un pic de taux de log.", "xpack.aiops.explainLogRateSpikesPage.emptyPromptTitle": "Cliquez sur un pic dans l'histogramme pour lancer l'analyse.", + "xpack.aiops.explainLogRateSpikesPage.fieldFilterApplyButtonLabel": "Appliquer", + "xpack.aiops.explainLogRateSpikesPage.fieldFilterButtonLabel": "Champs de filtre", + "xpack.aiops.explainLogRateSpikesPage.fieldFilterHelpText": "Désélectionnez les champs non pertinents pour les supprimer des groupes et cliquez sur le bouton Appliquer pour réexécuter le regroupement. Utilisez la barre de recherche pour filtrer la liste, puis sélectionnez/désélectionnez plusieurs champs avec les actions ci-dessous.", + "xpack.aiops.explainLogRateSpikesPage.fieldSelector.deselectAllFields": "Désélectionner tous les champs", + "xpack.aiops.explainLogRateSpikesPage.fieldSelector.deselectAllSearchedFields": "Désélectionner les champs filtrés", + "xpack.aiops.explainLogRateSpikesPage.fieldSelector.selectAllFields": "Sélectionner tous les champs", + "xpack.aiops.explainLogRateSpikesPage.fieldSelector.selectAllSearchedFields": "Sélectionner les champs filtrés", "xpack.aiops.explainLogRateSpikesPage.noResultsPromptBody": "Essayez d'ajuster la référence de base et les plages temporelles d'écart-type, et réexécutez l'analyse. Si vous n'obtenez toujours aucun résultat, il se peut qu'il n'y ait aucune entité statistiquement significative contribuant à ce pic dans les taux de log.", "xpack.aiops.explainLogRateSpikesPage.noResultsPromptTitle": "L'analyse n'a retourné aucun résultat.", "xpack.aiops.explainLogRateSpikesPage.tryToContinueAnalysisButtonText": "Essayer de continuer l'analyse", + "xpack.aiops.fieldContextPopover.descriptionTooltipContent": "Afficher les principales valeurs de champ", + "xpack.aiops.fieldContextPopover.notTopTenValueMessage": "Le terme sélectionné n'est pas dans le top 10", + "xpack.aiops.fieldContextPopover.topFieldValuesAriaLabel": "Afficher les principales valeurs de champ", "xpack.aiops.index.changePointTimeSeriesNotificationDescription": "La détection des points de modification ne s'exécute que sur des index temporels.", "xpack.aiops.index.dataViewNotBasedOnTimeSeriesNotificationDescription": "L'analyse des pics de taux de log ne fonctionne que sur des index temporels.", "xpack.aiops.index.dataViewWithoutMetricNotificationDescription": "La détection des points de modification peut être exécutée uniquement sur des vues de données possédant un champ d'indicateur.", "xpack.aiops.logCategorization.categoryFieldSelect": "Champ de catégorie", - "xpack.aiops.logCategorization.chartPointsSplitLabel": "Catégorie sélectionnée", + "xpack.aiops.logCategorization.chartPointsSplitLabel": "Modèle sélectionné", + "xpack.aiops.logCategorization.column.actions": "Actions", "xpack.aiops.logCategorization.column.count": "Décompte", "xpack.aiops.logCategorization.column.examples": "Exemples", "xpack.aiops.logCategorization.column.logRate": "Taux du log", - "xpack.aiops.logCategorization.emptyPromptBody": "Loguez les messages de groupes d'analyse de modèle dans les catégories courantes.", + "xpack.aiops.logCategorization.emptyPromptBody": "L'analyse de modèle de log regroupe les messages dans des modèles courants.", "xpack.aiops.logCategorization.emptyPromptTitle": "Sélectionner un champ de texte et cliquez sur Exécuter la catégorisation pour démarrer l'analyse", "xpack.aiops.logCategorization.errorLoadingCategories": "Erreur lors du chargement des catégories", "xpack.aiops.logCategorization.noCategoriesBody": "Assurez-vous que le champ sélectionné est rempli dans la plage temporelle sélectionnée.", - "xpack.aiops.logCategorization.noCategoriesTitle": "Aucune catégorie trouvée", + "xpack.aiops.logCategorization.noCategoriesTitle": "Aucun modèle n'a été trouvé", "xpack.aiops.logCategorization.noDocsBody": "Assurez-vous que la plage temporelle sélectionnée contient des documents.", "xpack.aiops.logCategorization.noDocsTitle": "Aucun document trouvé", - "xpack.aiops.logCategorization.runButton": "Exécuter la catégorisation", + "xpack.aiops.logCategorization.randomSamplerPreference.offLabel": "Désactivé", + "xpack.aiops.logCategorization.randomSamplerPreference.onAutomaticLabel": "Activé - automatique", + "xpack.aiops.logCategorization.randomSamplerPreference.onManualLabel": "Activé - manuel", + "xpack.aiops.logCategorization.randomSamplerSettingsPopUp.offCallout.button": "Aucun échantillonnage", + "xpack.aiops.logCategorization.randomSamplerSettingsPopUp.offCallout.message": "L'échantillonnage aléatoire peut être activé pour améliorer la vitesse de l'analyse, bien que cela entraînera la perte d'une partie de la précision.", + "xpack.aiops.logCategorization.randomSamplerSettingsPopUp.onAutomaticCallout.button": "Échantillonnage automatique", + "xpack.aiops.logCategorization.randomSamplerSettingsPopUp.onAutomaticCallout.message": "L'analyse de modèle utilisera des agrégations d'échantillonneurs aléatoires. La probabilité est automatiquement réglée pour équilibrer la précision et la vitesse.", + "xpack.aiops.logCategorization.randomSamplerSettingsPopUp.onManualCallout.button": "Échantillonnage manuel", + "xpack.aiops.logCategorization.randomSamplerSettingsPopUp.onManualCallout.message": "L'analyse de modèle utilisera des agrégations d'échantillonneurs aléatoires. Un pourcentage de probabilité plus faible augmente les performances, au prix d’une certaine perte de précision.", + "xpack.aiops.logCategorization.randomSamplerSettingsPopUp.randomSamplerPercentageApply": "Appliquer", + "xpack.aiops.logCategorization.randomSamplerSettingsPopUp.randomSamplerPercentageRowHelpText": "Choisissez une valeur comprise entre 0,001 % et 50 % pour échantillonner aléatoirement les données.", + "xpack.aiops.logCategorization.randomSamplerSettingsPopUp.randomSamplerPercentageRowLabel": "Pourcentage d'échantillonnage", + "xpack.aiops.logCategorization.randomSamplerSettingsPopUp.randomSamplerRowLabel": "Échantillonnage aléatoire", + "xpack.aiops.logCategorization.runButton": "Exécuter l'analyse du modèle", "xpack.aiops.miniHistogram.noDataLabel": "S. O.", "xpack.aiops.progressAriaLabel": "Progression", "xpack.aiops.rerunAnalysisButtonTitle": "Relancer l’analyse", @@ -6855,19 +7277,60 @@ "xpack.aiops.spikeAnalysisPage.documentCountStatsSplitGroupLabel": "Groupe sélectionné", "xpack.aiops.spikeAnalysisTable.actionsColumnName": "Actions", "xpack.aiops.spikeAnalysisTable.autoGeneratedDiscoverLinkErrorMessage": "Liaison avec Discover impossible ; aucune vue de données n'existe pour cet index", + "xpack.aiops.spikeAnalysisTable.autoGeneratedLogPatternAnalysisLinkErrorMessage": "Liaison avec l'analyse de modèle de log impossible ; aucune vue de données n'existe pour cet index", "xpack.aiops.spikeAnalysisTable.discoverLocatorMissingErrorMessage": "Aucun localisateur pour Discover détecté", "xpack.aiops.spikeAnalysisTable.discoverNotEnabledErrorMessage": "Discover n'est pas activé", "xpack.aiops.spikeAnalysisTable.groupedSwitchLabel.groupResults": "Résultats du groupe", - "xpack.aiops.spikeAnalysisTable.groupedSwitchLabel.groupResultsHelpMessage": "Sur une ligne étendue, les paires champ/valeur qui n'apparaissent pas dans d'autres groupes sont marquées d'un astérisque (*).", + "xpack.aiops.spikeAnalysisTable.groupedSwitchLabel.groupResultsHelpMessage": "Les éléments qui sont propres à un groupe sont marqués d'un astérisque (*).", + "xpack.aiops.spikeAnalysisTable.linksMenu.copyToClipboardButtonLabel": "Copier dans le presse-papiers", + "xpack.aiops.spikeAnalysisTable.linksMenu.copyToClipboardGroupMessage": "Copier les éléments de groupe en tant que syntaxe KQL dans le Presse-papiers", + "xpack.aiops.spikeAnalysisTable.linksMenu.copyToClipboardSignificantTermMessage": "Copier la paire clé-valeur en tant que syntaxe KQL dans le Presse-papiers", "xpack.aiops.spikeAnalysisTable.linksMenu.viewInDiscover": "Afficher dans Discover", + "xpack.aiops.spikeAnalysisTable.linksMenu.viewInLogPatternAnalysis": "Voir dans l'analyse du modèle de log", + "xpack.aiops.spikeAnalysisTable.mlLocatorMissingErrorMessage": "Aucun localisateur pour l'analyse de modèle de log", + "xpack.aiops.techPreviewBadge.label": "Version d'évaluation technique", + "xpack.aiops.techPreviewBadge.tooltip": "Cette fonctionnalité est en version d'évaluation technique et pourra être modifiée ou retirée complètement dans une future version. Elastic s'efforcera au maximum de corriger tout problème, mais les fonctionnalités en version d'évaluation technique ne sont pas soumises aux accords de niveau de service d'assistance des fonctionnalités officielles en disponibilité générale.", "xpack.alerting.alertNavigationRegistry.get.missingNavigationError": "La navigation pour le type d'alerte \"{alertType}\" dans \"{consumer}\" n'est pas enregistrée.", "xpack.alerting.alertNavigationRegistry.register.duplicateDefaultError": "La navigation par défaut dans \"{consumer}\" est déjà enregistrée.", "xpack.alerting.alertNavigationRegistry.register.duplicateNavigationError": "La navigation pour le type d'alerte \"{alertType}\" dans \"{consumer}\" est déjà enregistrée.", + "xpack.alerting.maintenanceWindows.createForm.customFrequency.daily": "{interval, plural, one {jour} many {jours} other {jours}}", + "xpack.alerting.maintenanceWindows.createForm.customFrequency.monthly": "{interval, plural, one {mois} many {mois} other {mois}}", + "xpack.alerting.maintenanceWindows.createForm.customFrequency.weekly": "{interval, plural, one {semaine} many {semaines} other {semaines}}", + "xpack.alerting.maintenanceWindows.createForm.customFrequency.yearly": "{interval, plural, one {an} many {années} other {années}}", + "xpack.alerting.maintenanceWindows.createForm.daySummary": "{interval, plural, one {jour} many {# jours} other {# jours}}", + "xpack.alerting.maintenanceWindows.createForm.firstShort": "Le premier {dayOfWeek}", + "xpack.alerting.maintenanceWindows.createForm.fourthShort": "Le quatrième {dayOfWeek}", + "xpack.alerting.maintenanceWindows.createForm.frequency.first": "Tous les mois le premier {dayOfWeek}", + "xpack.alerting.maintenanceWindows.createForm.frequency.fourth": "Tous les mois le quatrième {dayOfWeek}", + "xpack.alerting.maintenanceWindows.createForm.frequency.last": "Tous les mois le dernier {dayOfWeek}", + "xpack.alerting.maintenanceWindows.createForm.frequency.second": "Tous les mois le deuxième {dayOfWeek}", + "xpack.alerting.maintenanceWindows.createForm.frequency.third": "Tous les mois le troisième {dayOfWeek}", + "xpack.alerting.maintenanceWindows.createForm.frequency.weeklyOnWeekday": "Toutes les semaines le {dayOfWeek}", + "xpack.alerting.maintenanceWindows.createForm.frequency.yearlyOn": "Tous les ans le {date}", + "xpack.alerting.maintenanceWindows.createForm.lastShort": "Le dernier {dayOfWeek}", + "xpack.alerting.maintenanceWindows.createForm.monthlyByDaySummary": "le {monthday} du mois", + "xpack.alerting.maintenanceWindows.createForm.monthSummary": "{interval, plural, one {mois} many {# mois} other {# mois}}", + "xpack.alerting.maintenanceWindows.createForm.occurrencesSummary": "pour {count, plural, one {# occurrence} many {# occurrences} other {# occurrences}}", + "xpack.alerting.maintenanceWindows.createForm.recurrenceSummary": "chaque {frequencySummary}{on}{until}", + "xpack.alerting.maintenanceWindows.createForm.recurringSummaryPrefix": "Répétition {summary}", + "xpack.alerting.maintenanceWindows.createForm.repeatOnMonthlyDay": "Le {dayNumber}", + "xpack.alerting.maintenanceWindows.createForm.secondShort": "Le deuxième {dayOfWeek}", + "xpack.alerting.maintenanceWindows.createForm.thirdShort": "Le troisième {dayOfWeek}", + "xpack.alerting.maintenanceWindows.createForm.untilDateSummary": "jusqu'au {date}", + "xpack.alerting.maintenanceWindows.createForm.weeklySummary": "le {weekdays}", + "xpack.alerting.maintenanceWindows.createForm.weekSummary": "{interval, plural, one {semaine} many {# semaines} other {# semaines}}", + "xpack.alerting.maintenanceWindows.createForm.yearlyBymonthSummary": "le {date}", + "xpack.alerting.maintenanceWindows.createForm.yearSummary": "{interval, plural, one {an} many {# ans} other {# ans}}", "xpack.alerting.rulesClient.invalidDate": "Date non valide pour le {field} de paramètre : \"{dateValue}\"", "xpack.alerting.rulesClient.runSoon.getTaskError": "Erreur lors de l'exécution de la règle : {errMessage}", "xpack.alerting.rulesClient.runSoon.runSoonError": "Erreur lors de l'exécution de la règle : {errMessage}", - "xpack.alerting.rulesClient.validateActions.actionsWithInvalidThrottles": "La limitation de l'action ne peut pas être inférieure à l'intervalle de planification de {scheduleIntervalText} : {groups}", - "xpack.alerting.rulesClient.validateActions.errorSummary": "Impossible de valider les actions en raison {errorNum, plural, one {de l'erreur suivante :} other {des # erreurs suivantes :\n-}} {errorList}", + "xpack.alerting.rulesClient.validateActions.actionsWithAlertsFilterWithoutSummaryGetter": "Ce type de règle ({ruleType}) ne peut pas avoir une action avec un filtre d'alertes. Actions : [{uuids}]", + "xpack.alerting.rulesClient.validateActions.actionsWithInvalidAlertsFilter": "Le filtre d'alertes de l'action doit avoir \"query\" ou \"timeframe\" : {uuids}", + "xpack.alerting.rulesClient.validateActions.actionsWithInvalidDays": "Les jours du filtre d'alertes de l'action a des valeurs non valides : {uuidAndDays}", + "xpack.alerting.rulesClient.validateActions.actionsWithInvalidThrottles": "La fréquence de l'action ne peut pas être inférieure à l'intervalle de planification de {scheduleIntervalText} : {groups}", + "xpack.alerting.rulesClient.validateActions.actionsWithInvalidTimeRange": "La plage temporelle du filtre d'alertes de l'action a une valeur non valide : {hours}", + "xpack.alerting.rulesClient.validateActions.actionWithInvalidTimeframe": "La durée du filtre d'alertes de l'action a des champs manquants : jours, heures ou fuseau horaire : {uuids}", + "xpack.alerting.rulesClient.validateActions.errorSummary": "Impossible de valider les actions en raison {errorNum, plural, one {de l'erreur suivante :} many {des # erreurs suivantes :\n-} other {des # erreurs suivantes :\n-}} {errorList}", "xpack.alerting.rulesClient.validateActions.invalidGroups": "Groupes d'actions non valides : {groups}", "xpack.alerting.rulesClient.validateActions.misconfiguredConnector": "Connecteurs non valides : {groups}", "xpack.alerting.rulesClient.validateActions.mixAndMatchFreqParams": "Impossible de spécifier des paramètres de fréquence par action lorsque notify_when et throttle sont définis au niveau de la règle : {groups}", @@ -6878,40 +7341,127 @@ "xpack.alerting.ruleTypeRegistry.register.invalidDefaultTimeoutRuleTypeError": "Le type de règle \"{id}\" a un intervalle par défaut non valide : {errorMessage}.", "xpack.alerting.ruleTypeRegistry.register.invalidTimeoutRuleTypeError": "Le type de règle \"{id}\" a un délai d'expiration non valide : {errorMessage}.", "xpack.alerting.ruleTypeRegistry.register.reservedActionGroupUsageError": "Le type de règle [id=\"{id}\"] ne peut pas être enregistré. Les groupes d'actions [{actionGroups}] sont réservés par le framework.", - "xpack.alerting.savedObjects.onImportText": "{rulesSavedObjectsLength} {rulesSavedObjectsLength, plural, one {La règle doit être activée} other {Les règles doivent être activées}} après l'importation.", + "xpack.alerting.savedObjects.onImportText": "{rulesSavedObjectsLength} {rulesSavedObjectsLength, plural, one {règle} many {règles} other {règles}} doi(ven)t être activée(s) après l'importation.", "xpack.alerting.serverSideErrors.expirerdLicenseErrorMessage": "Le type de règle {ruleTypeId} est désactivé, car votre licence {licenseType} a expiré.", "xpack.alerting.serverSideErrors.invalidLicenseErrorMessage": "La règle {ruleTypeId} est désactivée, car elle requiert une licence {licenseType}. Accédez à Gestion des licences pour consulter les options de mise à niveau.", "xpack.alerting.serverSideErrors.unavailableLicenseErrorMessage": "Le type de règle {ruleTypeId} est désactivé, car les informations de licence ne sont pas disponibles actuellement.", "xpack.alerting.api.error.disabledApiKeys": "L'alerting se base sur les clés d'API qui semblent désactivées", "xpack.alerting.appName": "Alerting", + "xpack.alerting.breadcrumbs.createMaintenanceWindowsLinkText": "Créer", + "xpack.alerting.breadcrumbs.editMaintenanceWindowsLinkText": "Modifier", + "xpack.alerting.breadcrumbs.maintenanceWindowsLinkText": "Fenêtres de maintenance", + "xpack.alerting.breadcrumbs.stackManagementLinkText": "Gestion de la Suite", "xpack.alerting.builtinActionGroups.recovered": "Récupéré", "xpack.alerting.feature.flappingSettingsSubFeatureName": "Détection de bagotement", + "xpack.alerting.feature.maintenanceWindowFeatureName": "Fenêtre de maintenance", "xpack.alerting.feature.rulesSettingsFeatureName": "Paramètres des règles", + "xpack.alerting.getMaintenanceWindowFailure": "Impossible d'obtenir la fenêtre de maintenance.", "xpack.alerting.injectActionParams.email.kibanaFooterLinkText": "Afficher la règle dans Kibana", + "xpack.alerting.maintenanceWindows": "Fenêtres de maintenance", + "xpack.alerting.maintenanceWindows.archive": "Archives", + "xpack.alerting.maintenanceWindows.archive.subtitle": "Les événements de fenêtre de maintenance à venir sont annulés et la fenêtre est mise en file d'attente pour suppression.", + "xpack.alerting.maintenanceWindows.archive.title": "Archiver la fenêtre de maintenance", + "xpack.alerting.maintenanceWindows.archiveCallout.subtitle": "Les modifications que vous avez apportées ici ne seront pas enregistrées. Voulez-vous vraiment abandonner ces modifications non enregistrées et archiver cette fenêtre de maintenance ?", + "xpack.alerting.maintenanceWindows.badge.experimentalDescription": "Cette fonctionnalité est en version d'évaluation technique et pourra être modifiée ou retirée complètement dans une future version. Elastic s'efforcera au maximum de corriger tout problème, mais les fonctionnalités en version d'évaluation technique ne sont pas soumises aux accords de niveau de service d'assistance des fonctionnalités officielles en disponibilité générale.", + "xpack.alerting.maintenanceWindows.badge.experimentalLabel": "Version d'évaluation technique", + "xpack.alerting.maintenanceWindows.cancelAndArchiveModal.subtitle": "Les notifications de règle reprennent immédiatement. L'ensemble des événements de fenêtre de maintenance à venir et en cours d'exécution sont annulés et la fenêtre est mise en file d'attente pour suppression.", + "xpack.alerting.maintenanceWindows.cancelAndArchiveModal.title": "Annuler et archiver la fenêtre de maintenance", + "xpack.alerting.maintenanceWindows.cancelModal.button": "Continuer l'exécution", + "xpack.alerting.maintenanceWindows.cancelModal.subtitle": "Les notifications de règle reprennent immédiatement. Les événements de fenêtre de maintenance en cours d'exécution sont annulés ; les événements à venir ne sont pas affectés.", + "xpack.alerting.maintenanceWindows.cancelModal.title": "Annuler la fenêtre de maintenance", + "xpack.alerting.maintenanceWindows.create.description": "Planifiez une période unique ou récurrente dans laquelle les notifications de règle cessent et les alertes sont en mode maintenance.", + "xpack.alerting.maintenanceWindows.create.maintenanceWindow": "Créer la fenêtre de maintenance", + "xpack.alerting.maintenanceWindows.createForm.cancel": "Annuler", + "xpack.alerting.maintenanceWindows.createForm.count.after": "Après", + "xpack.alerting.maintenanceWindows.createForm.count.occurrence": "occurrence", + "xpack.alerting.maintenanceWindows.createForm.countFieldRequiredError": "Un nombre est requis.", + "xpack.alerting.maintenanceWindows.createForm.ends.afterX": "Après \\{x\\}", + "xpack.alerting.maintenanceWindows.createForm.ends.never": "Jamais", + "xpack.alerting.maintenanceWindows.createForm.ends.onDate": "À la date", + "xpack.alerting.maintenanceWindows.createForm.endsLabel": "Fin", + "xpack.alerting.maintenanceWindows.createForm.frequency.custom": "Personnalisé", + "xpack.alerting.maintenanceWindows.createForm.frequency.daily": "Quotidien", + "xpack.alerting.maintenanceWindows.createForm.frequency.monthly": "Mensuel", + "xpack.alerting.maintenanceWindows.createForm.frequency.weekly": "Hebdomadaire", + "xpack.alerting.maintenanceWindows.createForm.frequency.yearly": "Annuel", + "xpack.alerting.maintenanceWindows.createForm.interval.every": "Chaque", + "xpack.alerting.maintenanceWindows.createForm.intervalFieldRequiredError": "Un intervalle est requis.", + "xpack.alerting.maintenanceWindows.createForm.nameFieldRequiredError": "Nom obligatoire.", + "xpack.alerting.maintenanceWindows.createForm.repeat": "Répéter", + "xpack.alerting.maintenanceWindows.createForm.schedule": "Planification", + "xpack.alerting.maintenanceWindows.createForm.scheduleInvalid": "La date de fin doit être supérieure ou égale à la date de début.", + "xpack.alerting.maintenanceWindows.createForm.timezone": "Fuseau horaire", + "xpack.alerting.maintenanceWindows.createNewButton": "Créer la fenêtre", + "xpack.alerting.maintenanceWindows.description": "Supprimez les notifications de règle pour des périodes planifiées.", + "xpack.alerting.maintenanceWindows.edit.maintenanceWindow": "Modifier la fenêtre de maintenance", + "xpack.alerting.maintenanceWindows.emptyPrompt.button": "Créer une fenêtre de maintenance", + "xpack.alerting.maintenanceWindows.emptyPrompt.description": "Planifiez une période pendant laquelle les notifications de règle cessent.", + "xpack.alerting.maintenanceWindows.emptyPrompt.documentation": "Documentation", + "xpack.alerting.maintenanceWindows.emptyPrompt.title": "Créer votre première fenêtre de maintenance", + "xpack.alerting.maintenanceWindows.name": "Nom", + "xpack.alerting.maintenanceWindows.returnLink": "Renvoyer", + "xpack.alerting.maintenanceWindows.save.maintenanceWindow": "Enregistrer la fenêtre de maintenance", + "xpack.alerting.maintenanceWindows.table.alerts": "Alertes", + "xpack.alerting.maintenanceWindows.table.alertsTooltip": "Le nombre total d'alertes créées dans la fenêtre de maintenance.", + "xpack.alerting.maintenanceWindows.table.cancel": "Annuler", + "xpack.alerting.maintenanceWindows.table.cancelAndArchive": "Annuler et archiver", + "xpack.alerting.maintenanceWindows.table.edit": "Modifier", + "xpack.alerting.maintenanceWindows.table.endTime": "Heure de fin", + "xpack.alerting.maintenanceWindows.table.startTime": "Heure de début", + "xpack.alerting.maintenanceWindows.table.status": "Statut", + "xpack.alerting.maintenanceWindows.table.statusArchived": "Archivées", + "xpack.alerting.maintenanceWindows.table.statusFinished": "Terminées", + "xpack.alerting.maintenanceWindows.table.statusRunning": "En cours d'exécution", + "xpack.alerting.maintenanceWindows.table.statusUpcoming": "À venir", + "xpack.alerting.maintenanceWindows.table.unarchive": "Annuler l'archivage", + "xpack.alerting.maintenanceWindows.unarchiveModal.subtitle": "Des événements de fenêtre de maintenance à venir sont planifiés.", + "xpack.alerting.maintenanceWindows.unarchiveModal.title": "Annuler l'archivage de la fenêtre de maintenance", + "xpack.alerting.maintenanceWindows.upcoming": "À venir", + "xpack.alerting.maintenanceWindowsArchiveFailure": "Impossible d'archiver la fenêtre de maintenance.", + "xpack.alerting.maintenanceWindowsArchiveSuccess": "Fenêtre de maintenance archivée \"{title}\"", + "xpack.alerting.maintenanceWindowsCreateFailure": "Impossible de créer la fenêtre de maintenance.", + "xpack.alerting.maintenanceWindowsCreateSuccess": "Fenêtre de maintenance créée \"{title}\"", + "xpack.alerting.maintenanceWindowsFinishedAndArchiveFailure": "Impossible d'annuler et d'archiver la fenêtre de maintenance.", + "xpack.alerting.maintenanceWindowsFinishedAndArchiveSuccess": "Fenêtre de maintenance en cours d'exécution annulée et archivée \"{title}\"", + "xpack.alerting.maintenanceWindowsFinishedFailure": "Impossible d'annuler la fenêtre de maintenance.", + "xpack.alerting.maintenanceWindowsFinishedSuccess": "Fenêtre de maintenance en cours d'exécution annulée \"{title}\"", + "xpack.alerting.maintenanceWindowsListFailure": "Impossible de charger les fenêtres de maintenance.", + "xpack.alerting.maintenanceWindowsUnarchiveFailure": "Impossible d'annuler l'archivage de la fenêtre de maintenance.", + "xpack.alerting.maintenanceWindowsUnarchiveSuccess": "Fenêtre de maintenance dont l'archivage a été annulé \"{title}\"", + "xpack.alerting.maintenanceWindowsUpdateFailure": "Impossible de mettre à jour la fenêtre de maintenance.", + "xpack.alerting.maintenanceWindowsUpdateSuccess": "Fenêtre de maintenance mise à jour \"{title}\"", + "xpack.alerting.management.section.title": "Fenêtres de maintenance", "xpack.alerting.rulesClient.runSoon.disabledRuleError": "Erreur lors de l'exécution de la règle : la règle est désactivée", "xpack.alerting.rulesClient.runSoon.ruleIsRunning": "La règle est déjà en cours d'exécution", "xpack.alerting.rulesClient.snoozeSchedule.limitReached": "La règle ne peut pas avoir plus de 5 planifications en répétition", + "xpack.alerting.rulesClient.validateActions.hasDuplicatedUuid": "Les actions ont des UUID en double", "xpack.alerting.savedObjects.goToRulesButtonText": "Accéder aux règles", + "xpack.alerting.serverSideErrors.maintenanceWindow.invalidLicenseErrorMessage": "La fenêtre de maintenance est désactivée, car elle nécessite une licence Platinum. Accédez à Gestion des licences pour consulter les options de mise à niveau.", + "xpack.alerting.serverSideErrors.maintenanceWindow.unavailableLicenseErrorMessage": "La fenêtre de maintenance est désactivée, car les informations de licence ne sont pas disponibles actuellement.", "xpack.alerting.serverSideErrors.unavailableLicenseInformationErrorMessage": "Les alertes sont indisponibles – les informations de licence ne sont pas disponibles actuellement.", "xpack.alerting.taskRunner.warning.maxAlerts": "La règle a dépassé le nombre maximal d'alertes au cours d'une même exécution. Les alertes ont peut-être été manquées et les notifications de récupération retardées", "xpack.alerting.taskRunner.warning.maxExecutableActions": "Le nombre maximal d'actions pour ce type de règle a été atteint ; les actions excédentaires n'ont pas été déclenchées.", "xpack.apm.agentConfig.deleteModal.text": "Vous êtes sur le point de supprimer la configuration du service \"{serviceName}\" et de l'environnement \"{environment}\".", "xpack.apm.agentConfig.deleteSection.deleteConfigFailedText": "Une erreur est survenue lors de la suppression d'une configuration pour \"{serviceName}\". Erreur : \"{errorMessage}\"", "xpack.apm.agentConfig.deleteSection.deleteConfigSucceededText": "Vous avez supprimé une configuration de \"{serviceName}\" avec succès. La propagation jusqu'aux agents pourra prendre un certain temps.", - "xpack.apm.agentConfig.range.errorText": "{rangeType, select, between {Doit être compris entre {min} et {max}} gt {Doit être supérieur à {min}} lt {Doit être inférieur à {max}} other {Doit être un entier}}", + "xpack.apm.agentConfig.range.errorText": "{rangeType, select, between {Doit être compris entre {min} et {max}} gt {Doit être supérieur à {min}} lt {Doit être inférieur à {max}} other {Doit être un nombre entier}}", "xpack.apm.agentConfig.saveConfig.failed.text": "Une erreur est survenue pendant l'enregistrement de la configuration de \"{serviceName}\". Erreur : \"{errorMessage}\"", "xpack.apm.agentConfig.saveConfig.succeeded.text": "La configuration de \"{serviceName}\" a été enregistrée. La propagation jusqu'aux agents pourra prendre un certain temps.", - "xpack.apm.agentExplorerInstanceTable.agentVersionColumnLabel.multipleVersions": "{versionsCount, plural, one {1 version} other {# versions}}", + "xpack.apm.agentExplorer.agentLatestVersion.airGappedMessage": "La dernière version de l'agent {agentName} n'a pas pu être récupérée dans le référentiel. Veuillez contacter votre administrateur pour vérifier les logs de serveur.", + "xpack.apm.agentExplorerInstanceTable.agentVersionColumnLabel.multipleVersions": "{versionsCount, plural, one {1 version} many {# versions} other {# versions}}", "xpack.apm.agentExplorerInstanceTable.noServiceNodeName.tooltip.linkToDocs": "Vous pouvez configurer le nom du nœud de service via {seeDocs}.", - "xpack.apm.agentExplorerTable.agentVersionColumnLabel.multipleVersions": "{versionsCount, plural, one {1 version} other {# versions}}", - "xpack.apm.alerts.anomalySeverity.scoreDetailsDescription": "score {value} {value, select, critical {} other {et supérieur}}", + "xpack.apm.agentExplorerTable.agentVersionColumnLabel.multipleVersions": "{versionsCount, plural, one {1 version} many {# versions} other {# versions}}", + "xpack.apm.alerts.anomalySeverity.scoreDetailsDescription": "Score de {value} {value, select, critical {} other {et supérieur}}", + "xpack.apm.alertTypes.errorCount.reason": "Le nombre d'erreurs est {measured} dans le dernier {interval} pour {group}. Alerte lorsque > {threshold}.", "xpack.apm.alertTypes.minimumWindowSize.description": "La valeur minimale recommandée est {sizeValue} {sizeUnit}. Elle permet de s'assurer que l'alerte comporte suffisamment de données à évaluer. Si vous choisissez une valeur trop basse, l'alerte ne se déclenchera peut-être pas comme prévu.", + "xpack.apm.alertTypes.transactionDuration.reason": "La latence de {aggregationType} est {measured} dans le dernier {interval} pour {group}. Alerte lorsque > {threshold}.", "xpack.apm.alertTypes.transactionDurationAnomaly.reason": "Une anomalie {severityLevel} avec un score de {measured} a été détectée dans le dernier {interval} pour {serviceName}.", + "xpack.apm.alertTypes.transactionErrorRate.reason": "L'échec des transactions est {measured} dans le dernier {interval} pour {group}. Alerte lorsque > {threshold}.", "xpack.apm.anomalyDetection.createJobs.failed.text": "Une erreur est survenue lors de la création d'une ou de plusieurs tâches de détection des anomalies pour les environnements de service APM [{environments}]. Erreur : \"{errorMessage}\"", "xpack.apm.anomalyDetection.createJobs.succeeded.text": "Tâches de détection des anomalies créées avec succès pour les environnements de service APM [{environments}]. Le démarrage de l'analyse du trafic à la recherche d'anomalies par le Machine Learning va prendre un certain temps.", "xpack.apm.anomalyDetectionSetup.notEnabledForEnvironmentText": "La détection des anomalies n'est pas encore activée pour l'environnement \"{currentEnvironment}\". Cliquez pour continuer la configuration.", "xpack.apm.apmSettings.kibanaLink": "La liste complète d'options APM est disponible dans {link}", - "xpack.apm.bottomBarActions.unsavedChanges": "{unsavedChangesCount, plural, =0 {0 modification non enregistrée} one {1 modification non enregistrée} other {# modifications non enregistrées}} ", + "xpack.apm.bottomBarActions.unsavedChanges": "{unsavedChangesCount, plural, =0 {0 modification non enregistrée} one {1 modification non enregistrée} many {# modifications non enregistrées} other {# modifications non enregistrées}} ", "xpack.apm.compositeSpanCallsLabel": ", {count} appels, sur une moyenne de {duration}", "xpack.apm.correlations.ccsWarningCalloutBody": "Les données pour l'analyse de corrélation n'ont pas pu être totalement récupérées. Cette fonctionnalité est prise en charge uniquement pour {version} et versions ultérieures.", "xpack.apm.correlations.failedTransactions.helpPopover.basicExplanation": "Les corrélations vous aident à découvrir les attributs qui ont le plus d'influence pour distinguer les échecs et les succès d'une transaction. Les transactions sont considérées comme un échec lorsque leur valeur {field} est {value}.", @@ -6919,26 +7469,26 @@ "xpack.apm.criticalPathFlameGraph.selfTime": "Heure automatique : {value}", "xpack.apm.criticalPathFlameGraph.totalTime": "Temps total : {value}", "xpack.apm.durationDistribution.chart.percentileMarkerLabel": "{markerPercentile}e centile", - "xpack.apm.durationDistributionChart.totalSpansCount": "Total : {totalDocCount} {totalDocCount, plural, one {intervalle} other {intervalles}}", - "xpack.apm.durationDistributionChart.totalTransactionsCount": "Total : {totalDocCount} {totalDocCount, plural, one {transaction} other {transactions}}", + "xpack.apm.durationDistributionChart.totalSpansCount": "{totalDocCount} {totalDocCount, plural, one {intervalle} many {intervalles} other {intervalles}} au total", + "xpack.apm.durationDistributionChart.totalTransactionsCount": "{totalDocCount} {totalDocCount, plural, one {transaction} many {transactions} other {transactions}} au total", "xpack.apm.durationDistributionChartWithScrubber.selectionText": "Sélection : {formattedSelection}", "xpack.apm.errorGroupDetails.errorGroupTitle": "Groupe d'erreurs {errorGroupId}", "xpack.apm.errorGroupDetails.occurrencesLabel": "{occurrencesCount} occ", "xpack.apm.errorGroupTopTransactions.column.occurrences.valueLabel": "{occurrences} occ.", - "xpack.apm.errorSampleDetails.viewOccurrencesInDiscoverButtonLabel": "Afficher {occurrencesCount} {occurrencesCount, plural, one {occurrence} other {occurrences}} dans Discover", + "xpack.apm.errorSampleDetails.viewOccurrencesInDiscoverButtonLabel": "Afficher {occurrencesCount}{occurrencesCount, plural, one {occurrence} many {occurrences} other {occurrences}} dans Discover", "xpack.apm.errorsTable.occurrences": "{occurrences} occ.", "xpack.apm.exactTransactionRateLabel": "{value} tpm", "xpack.apm.fleet_integration.settings.apmAgent.description": "Configurez l'instrumentation pour les applications {title}.", "xpack.apm.fleet_integration.settings.tailSamplingDocsHelpText": "Pour en savoir plus sur les politiques d'échantillonnage de la queue, consultez notre {link}.", "xpack.apm.fleetIntegration.apmAgent.runtimeAttachment.version.helpText": "Entrez la {versionLink} de l'agent Java Elastic APM qui doit être attachée.", "xpack.apm.fleetIntegration.javaRuntime.discoveryRulesDescription": "Pour chaque JVM en cours d'exécution, les règles de découverte sont évaluées dans l'ordre où elles sont fournies. La première règle de correspondance détermine le résultat. Pour en savoir plus, consultez la {docLink}.", - "xpack.apm.instancesLatencyDistributionChartTooltipInstancesTitle": "{instancesCount} {instancesCount, plural, one {instance} other {instances}}", - "xpack.apm.itemsBadge.placeholder": "{itemsCount, plural, one {1 élément} other {# éléments}}", - "xpack.apm.kueryBar.placeholder": "Rechercher dans les {event, select, transaction {transactions} metric {indicateurs} error {erreurs} other {transactions, erreurs et indicateurs}} (par exemple, {queryExample})", + "xpack.apm.instancesLatencyDistributionChartTooltipInstancesTitle": "{instancesCount} {instancesCount, plural, one {instance} many {instances} other {instances}}", + "xpack.apm.itemsBadge.placeholder": "{itemsCount, plural, one {1 élément} many {Éléments #} other {Éléments #}}", + "xpack.apm.kueryBar.placeholder": "Rechercher {event, select, transaction {transactions} metric {indicateurs} error {erreurs} other {transactions, erreurs et indicateurs}} (par exemple {queryExample})", "xpack.apm.propertiesTable.agentFeature.noResultFound": "Aucun résultat pour \"{value}\".", - "xpack.apm.serverlessMetrics.summary.lambdaFunctions": "{serverlessFunctionsTotal, plural, one {fonction} other {fonctions}} Lambda", - "xpack.apm.serviceGroups.cardsList.alertCount": "{alertsCount} {alertsCount, plural, one {alerte} other {alertes}}", - "xpack.apm.serviceGroups.cardsList.serviceCount": "{servicesCount} {servicesCount, plural, one {service} other {services}}", + "xpack.apm.serverlessMetrics.summary.lambdaFunctions": "{serverlessFunctionsTotal, plural, one {fonction} many {Fonctions} other {Fonctions}} lambda", + "xpack.apm.serviceGroups.cardsList.alertCount": "{alertsCount} {alertsCount, plural, one {alerte} many {alertes} other {alertes}}", + "xpack.apm.serviceGroups.cardsList.serviceCount": "{servicesCount} {servicesCount, plural, one {service} many {services} other {services}}", "xpack.apm.serviceGroups.createFailure.toast.title": "Erreur lors de la création du groupe \"{groupName}\"", "xpack.apm.serviceGroups.createSucess.toast.title": "Groupe \"{groupName}\" créé", "xpack.apm.serviceGroups.deleteFailure.toast.title": "Erreur lors de la suppression du groupe \"{groupName}\"", @@ -6946,22 +7496,22 @@ "xpack.apm.serviceGroups.deleteSuccess.toast.title": "Groupe \"{groupName}\" supprimé", "xpack.apm.serviceGroups.editFailure.toast.title": "Erreur lors de la modification du groupe \"{groupName}\"", "xpack.apm.serviceGroups.editSucess.toast.title": "Groupe \"{groupName}\" modifié", - "xpack.apm.serviceGroups.groupsCount": "{servicesCount} {servicesCount, plural, =0 {groupe} one {groupe} other {groupes}}", + "xpack.apm.serviceGroups.groupsCount": "{servicesCount} {servicesCount, plural, =0 {groupe} one {regrouper} many {groupes} other {groupes}}", "xpack.apm.serviceGroups.invalidFields.message": "Le filtre de requête pour le groupe de services ne prend pas en charge les champs [{unsupportedFieldNames}]", - "xpack.apm.serviceGroups.selectServicesForm.matchingServiceCount": "{servicesCount} {servicesCount, plural, =0 {service ne correspond} one {service correspond} other {services correspondent}} à la requête", + "xpack.apm.serviceGroups.selectServicesForm.matchingServiceCount": "{servicesCount} {servicesCount, plural, =0 {service correspond à la requête} one {service correspond à la requête} many {services correspondent à la requête} other {services correspondent à la requête}}", "xpack.apm.serviceGroups.tour.content.link": "Pour en savoir plus, consultez la {docsLink}.", - "xpack.apm.serviceIcons.serviceDetails.cloud.availabilityZoneLabel": "{zones, plural, =0 {Zone de disponibilité} one {Zone de disponibilité} other {Zones de disponibilité}} ", - "xpack.apm.serviceIcons.serviceDetails.cloud.faasTriggerTypeLabel": "{triggerTypes, plural, =0 {Type de déclenchement} one {Type de déclenchement} other {Types de déclenchement}} ", - "xpack.apm.serviceIcons.serviceDetails.cloud.functionNameLabel": "{functionNames, plural, =0 {Nom de fonction} one {Nom de fonction} other {Noms de fonction}} ", - "xpack.apm.serviceIcons.serviceDetails.cloud.machineTypesLabel": "{machineTypes, plural, =0 {Type de machine} one {Type de machine} other {Types de machine}} ", - "xpack.apm.serviceIcons.serviceDetails.cloud.regionLabel": "{regions, plural, =0 {Région} one {Région} other {Régions}} ", + "xpack.apm.serviceIcons.serviceDetails.cloud.availabilityZoneLabel": "{zones, plural, =0 {Zone de disponibilité} one {Zone de disponibilité} many {Zones de disponibilité} other {Zones de disponibilité}} ", + "xpack.apm.serviceIcons.serviceDetails.cloud.faasTriggerTypeLabel": "{triggerTypes, plural, =0 {Type de déclenchement} one {Type de déclenchement} many {Types de déclenchement} other {Types de déclenchement}} ", + "xpack.apm.serviceIcons.serviceDetails.cloud.functionNameLabel": "{functionNames, plural, =0 {Nom de fonction} one {Nom de fonction} many {Noms de fonction} other {Noms de fonction}} ", + "xpack.apm.serviceIcons.serviceDetails.cloud.machineTypesLabel": "{machineTypes, plural, =0 {Type de machine} one {Type de machine} many {Types de machine} other {Types de machine}} ", + "xpack.apm.serviceIcons.serviceDetails.cloud.regionLabel": "{regions, plural, =0 {Région} one {Région} many {Régions} other {Régions}} ", "xpack.apm.serviceMap.resourceCountLabel": "{count} ressources", "xpack.apm.serviceNodeMetrics.unidentifiedServiceNodesWarningText": "Nous n'avons pas pu déterminer à quelles JVM ces indicateurs correspondent. Cela provient probablement du fait que vous exécutez une version du serveur APM antérieure à 7.5. La mise à niveau du serveur APM vers la version 7.5 ou supérieure devrait résoudre le problème. Pour plus d'informations sur la mise à niveau, consultez {link}. Vous pouvez également utiliser la barre de recherche de Kibana pour filtrer par nom d'hôte, par ID de conteneur ou en fonction d'autres champs.", "xpack.apm.serviceOveriew.errorsTableOccurrences": "{occurrences} occ.", "xpack.apm.serviceOverview.embeddedMap.error.toastDescription": "L'usine incorporable ayant l'ID \"{embeddableFactoryId}\" est introuvable.", "xpack.apm.serviceOverview.embeddedMap.subtitle": "Carte affichant le nombre total de {currentMap} en fonction du pays et de la région", "xpack.apm.serviceOverview.mobileCallOutText": "Il s'agit d'un service mobile, qui est actuellement disponible en tant que version d'évaluation technique. Vous pouvez nous aider à améliorer l'expérience en nous envoyant des commentaires. {feedbackLink}.", - "xpack.apm.servicesTable.environmentCount": "{environmentCount, plural, one {1 environnement} other {# environnements}}", + "xpack.apm.servicesTable.environmentCount": "{environmentCount, plural, one {1 environnement} many {# environnements} other {# environnements}}", "xpack.apm.settings.agentKeys.apiKeysDisabledErrorDescription": "Contactez votre administrateur système et reportez-vous à {link} pour activer les clés d'API.", "xpack.apm.settings.agentKeys.copyAgentKeyField.title": "Clé \"{name}\" créée", "xpack.apm.settings.agentKeys.crate.failed": "Erreur lors de la création de la clé de l'agent APM \"{keyName}\". Erreur : \"{message}\"", @@ -6983,10 +7533,12 @@ "xpack.apm.settings.upgradeAvailable.description": "Même si votre intégration APM est configurée, une nouvelle version de l'intégration APM est disponible pour une mise à niveau avec votre stratégie de package. Consultez {upgradePackagePolicyLink} pour tirer le meilleur parti de votre configuration.", "xpack.apm.spanLinks.combo.childrenLinks": "Liens entrants ({linkedChildren})", "xpack.apm.spanLinks.combo.parentsLinks": "Liens sortants ({linkedParents})", - "xpack.apm.stacktraceTab.libraryFramesToogleButtonLabel": "{count, plural, one {# cadre de bibliothèque} other {# cadres de bibliothèque}}", + "xpack.apm.stacktraceTab.libraryFramesToogleButtonLabel": "{count, plural, one {# cadre de la bibliothèque} many {# cadres de la bibliothèque} other {# cadres de la bibliothèque}}", "xpack.apm.storageExplorer.longLoadingTimeCalloutText": "Activez le chargement progressif de données et le tri optimisé pour la liste de services dans {kibanaAdvancedSettingsLink}.", - "xpack.apm.transactionDetails.errorCount": "{errorCount, number} {errorCount, plural, one {erreur} other {erreurs}}", + "xpack.apm.transactionDetails.errorCount": "{errorCount, number} {errorCount, plural, one {Erreur} many {Erreurs} other {Erreurs}}", "xpack.apm.transactionDetails.transFlyout.callout.agentDroppedSpansMessage": "L'agent APM qui a signalé cette transaction a abandonné {dropped} intervalles ou plus, d'après sa configuration.", + "xpack.apm.transactionOverview.treemap.subtitle": "Compartimentage {currentTreemap} affichant le nombre total et les plus utilisés", + "xpack.apm.transactionOverview.treemap.title": "{currentTreemap} les plus utilisés", "xpack.apm.transactionRateLabel": "{displayedValue} tpm", "xpack.apm.tutorial.config_otel.description1": "(1) Les agents et SDK OpenTelemetry doivent prendre en charge les variables {otelExporterOtlpEndpoint}, {otelExporterOtlpHeaders} et {otelResourceAttributes}. Il se peut que certains composants instables ne répondent pas encore à cette exigence.", "xpack.apm.tutorial.config_otel.description3": "La liste exhaustive des variables d'environnement, les paramètres de ligne de commande et les extraits de code de configuration (conformes à la spécification OpenTelemetry) se trouvent dans le {otelInstrumentationGuide}. Certains clients OpenTelemetry instables peuvent ne pas prendre en charge toutes les fonctionnalités et nécessitent peut-être d'autres mécanismes de configuration.", @@ -7015,22 +7567,27 @@ "xpack.apm.tutorial.rackClient.createConfig.textPre": "Créer un fichier de configuration {configFile} :", "xpack.apm.tutorial.railsClient.configure.textPost": "Consultez la [documentation]({documentationLink}) pour découvrir les options de configuration et l'utilisation avancée.\n\n", "xpack.apm.tutorial.railsClient.configure.textPre": "APM se lance automatiquement au démarrage de l'application. Configurer l'agent, en créant le fichier de configuration {configFile}", + "xpack.apm.tutorial.shared_clients.configure.commands.serverUrlHint": "Définir l'URL personnalisée du serveur APM (par défaut : {defaultApmServerUrl}). L'URL doit être complète et inclure le protocole (http ou https) et le port.", "xpack.apm.tutorial.specProvider.longDescription": "Le monitoring des performances applicatives (APM) collecte les indicateurs et les erreurs de performance approfondies depuis votre application. Cela vous permet de monitorer les performances de milliers d'applications en temps réel. [En savoir plus]({learnMoreLink}).", "xpack.apm.tutorial.windowsServerInstructions.textPost": "Remarque : si l'exécution du script est désactivée dans votre système, vous devez définir la politique d'exécution de la session en cours de sorte que l'exécution du script soit autorisée. Par exemple : {command}.", "xpack.apm.tutorial.windowsServerInstructions.textPre": "1. Téléchargez le fichier .zip APM Server pour Windows via la [page de téléchargement]({downloadPageLink}).\n2. Extrayez le contenu du fichier compressé (ZIP) dans {zipFileExtractFolder}.\n3. Renommez le répertoire {apmServerDirectory} en \"APM-Server\".\n4. Ouvrez une invite PowerShell en tant qu'administrateur (faites un clic droit sur l'icône PowerShell et sélectionnez **Exécuter en tant qu'administrateur**). Si vous exécutez Windows XP, vous devrez peut-être télécharger et installer PowerShell.\n5. Dans l'invite PowerShell, exécutez les commandes suivantes pour installer le serveur APM en tant que service Windows :", - "xpack.apm.waterfall.errorCount": "{errorCount, plural, one {Afficher l'erreur liée} other {Afficher # erreurs liées}}", + "xpack.apm.unifiedSearchBar.placeholder": "Rechercher {event, select, transaction {transactions} metric {indicateurs} error {erreurs} other {transactions, erreurs et indicateurs}} (par exemple {queryExample})", + "xpack.apm.waterfall.errorCount": "{errorCount, plural, one {Voir l'erreur associée} many {Voir les # erreurs associées} other {Voir les # erreurs associées}}", "xpack.apm.waterfall.exceedsMax": "Le nombre d'éléments dans cette trace est de {traceItemCount}, ce qui est supérieur à la limite actuelle de {maxTraceItems}. Veuillez augmenter la limite pour afficher la trace complète.", - "xpack.apm.waterfall.spanLinks.badge": "{total} {total, plural, one {lien d'intervalle} other {liens d'intervalle}}", + "xpack.apm.waterfall.spanLinks.badge": "{total} {total, plural, one {Lien d'intervalle} many {Liens d'intervalle} other {Liens d'intervalle}}", "xpack.apm.waterfall.spanLinks.tooltip.linkedChildren": "{linkedChildren} entrants", "xpack.apm.waterfall.spanLinks.tooltip.linkedParents": "{linkedParents} sortants", - "xpack.apm.waterfall.spanLinks.tooltip.title": "{total} {total, plural, one {lien d'intervalle trouvé} other {liens d'intervalle trouvés}}", + "xpack.apm.waterfall.spanLinks.tooltip.title": "{total} {total, plural, one {Lien d'intervalle} many {Liens d'intervalle} other {Liens d'intervalle}} trouvé(s)", "xpack.apm.a.thresholdMet": "Seuil atteint", "xpack.apm.addDataButtonLabel": "Ajouter des données", + "xpack.apm.agent_explorer.error.missing_configuration": "Pour utiliser la toute dernière version de l’agent, vous devez définir xpack.apm.latestAgentVersionsUrl.", "xpack.apm.agentConfig.allOptionLabel": "Tous", "xpack.apm.agentConfig.apiRequestSize.description": "Taille totale compressée maximale du corps de la requête envoyé à l'API d'ingestion du serveur APM depuis un encodage fragmenté (diffusion HTTP).\nVeuillez noter qu'un léger dépassement est possible.\n\nLes unités d'octets autorisées sont \"b\", \"kb\" et \"mb\". \"1kb\" correspond à \"1024b\".", "xpack.apm.agentConfig.apiRequestSize.label": "Taille de la requête API", "xpack.apm.agentConfig.apiRequestTime.description": "Durée maximale de l'ouverture d'une requête HTTP sur le serveur APM.\n\nREMARQUE : cette valeur doit être inférieure à celle du paramètre \"read_timeout\" du serveur APM.", "xpack.apm.agentConfig.apiRequestTime.label": "Heure de la requête API", + "xpack.apm.agentConfig.applicationPackages.description": "Permet de déterminer si un cadre de trace de pile est un cadre dans l'application ou un cadre de bibliothèque. Cela permet à l'application APM de réduire les cadres de pile du code de la bibliothèque et de mettre en surbrillance les cadres de pile qui proviennent de votre application. Plusieurs packages racine peuvent être définis sous forme de liste séparée par des virgules ; il n'est pas nécessaire de configurer des sous-packages. Étant donné que ce paramètre aide à déterminer les classes à analyser au démarrage, la définition de cette option peut également améliorer le temps de démarrage.\n\nVous devez définir cette option afin d'utiliser les annotations d'API \"@CaptureTransaction\" et \"@CaptureSpan\".", + "xpack.apm.agentConfig.applicationPackages.label": "Packages de l'application", "xpack.apm.agentConfig.captureBody.description": "Pour les transactions qui sont des requêtes HTTP, l'agent peut éventuellement capturer le corps de la requête (par ex., variables POST).\nPour les transactions qui sont initiées par la réception d'un message depuis un agent de message, l'agent peut capturer le corps du message texte.", "xpack.apm.agentConfig.captureBody.label": "Capturer le corps", "xpack.apm.agentConfig.captureBodyContentTypes.description": "Configure les types de contenu qui doivent être enregistrés.\n\nLes valeurs par défaut se terminent par un caractère générique afin que les types de contenu tels que \"text/plain; charset=utf-8\" soient également capturés.", @@ -7063,7 +7620,15 @@ "xpack.apm.agentConfig.deleteModal.title": "Supprimer la configuration", "xpack.apm.agentConfig.deleteSection.deleteConfigFailedTitle": "La configuration n'a pas pu être supprimée", "xpack.apm.agentConfig.deleteSection.deleteConfigSucceededTitle": "La configuration a été supprimée", + "xpack.apm.agentConfig.disableInstrumentations.description": "Liste séparée par des virgules de modules pour lesquels désactiver l'instrumentation.\nLorsque l'instrumentation est désactivée pour un module, aucun intervalle n'est collecté pour ce module.\n\nLa liste à jour des modules pour lesquels l'instrumentation peut être désactivée est spécifique du langage et peut être trouvée en cliquant sur les liens suivants : [Java](https://www.elastic.co/guide/en/apm/agent/java/current/config-core.html#config-disable-instrumentations)", + "xpack.apm.agentConfig.disableInstrumentations.label": "Désactiver les instrumentations", + "xpack.apm.agentConfig.disableOutgoingTracecontextHeaders.description": "Utilisez cette option pour désactiver l'injection d'en-têtes \"tracecontext\" dans une communication sortante.\n\nAVERTISSEMENT : La désactivation de l'injection d'en-têtes \"tracecontext\" signifie que le traçage distribué ne fonctionnera pas sur les services en aval.", + "xpack.apm.agentConfig.disableOutgoingTracecontextHeaders.label": "Désactiver les en-têtes tracecontext sortants", "xpack.apm.agentConfig.editConfigTitle": "Modifier la configuration", + "xpack.apm.agentConfig.enableExperimentalInstrumentations.description": "Indique s'il faut appliquer des instrumentations expérimentales.\n\nREMARQUE : Le fait de modifier cette valeur au moment de l'exécution peut ralentir temporairement l'application. Définir cette valeur sur true active les instrumentations dans le groupe expérimental.", + "xpack.apm.agentConfig.enableExperimentalInstrumentations.label": "Activer les instrumentations expérimentales", + "xpack.apm.agentConfig.enableInstrumentations.description": "Une liste des instrumentations qui doivent être activées de façon sélective. Les options valides sont indiquées dans la [documentation de l’agent Java APM](https://www.elastic.co/guide/en/apm/agent/java/current/config-core.html#config-disable-instrumentations).\n\nLorsqu'une valeur non vide est définie, seules les instrumentations répertoriées sont activées si elles ne sont pas désactivées via \"disable_instrumentations\" ou \"enable_experimental_instrumentations\".\nLorsque cette option n'est pas définie ou est vide (par défaut), toutes les instrumentations activées par défaut sont activées, sauf si elles sont désactivées via \"disable_instrumentations\" ou \"enable_experimental_instrumentations\".", + "xpack.apm.agentConfig.enableInstrumentations.label": "Désactiver les instrumentations", "xpack.apm.agentConfig.enableLogCorrelation.description": "Nombre booléen spécifiant si l'agent doit être intégré au MDC de SLF4J pour activer la corrélation de logs de suivi. Si cette option est configurée sur \"true\", l'agent définira \"trace.id\" et \"transaction.id\" pour les intervalles et transactions actifs sur le MDC. Depuis la version 1.16.0 de l'agent Java, l'agent ajoute également le \"error.id\" de l'erreur capturée au MDC juste avant le logging du message d'erreur. REMARQUE : bien qu'il soit autorisé d'activer ce paramètre au moment de l'exécution, vous ne pouvez pas le désactiver sans redémarrage.", "xpack.apm.agentConfig.enableLogCorrelation.label": "Activer la corrélation de logs", "xpack.apm.agentConfig.exitSpanMinDuration.description": "Les intervalles de sortie sont des intervalles qui représentent un appel à un service externe, tel qu'une base de données. Si de tels appels sont très courts, ils ne sont généralement pas pertinents et ils peuvent être ignorés.\n\nREMARQUE : Si un intervalle propage des ID de traçage distribué, il ne sera pas ignoré, même s'il est plus court que le seuil configuré. Cela permet de s'assurer qu'aucune trace interrompue n'est enregistrée.", @@ -7072,8 +7637,14 @@ "xpack.apm.agentConfig.ignoreExceptions.label": "Ignorer les exceptions", "xpack.apm.agentConfig.ignoreMessageQueues.description": "Utilisé pour exclure les files d'attente/sujets de messagerie spécifiques du traçage. \n\nCette propriété doit être définie sur un tableau contenant une ou plusieurs chaînes.\nUne fois définie, les envois vers et les réceptions depuis les files d'attente/sujets spécifiés seront ignorés.", "xpack.apm.agentConfig.ignoreMessageQueues.label": "Ignorer les files d'attente des messages", + "xpack.apm.agentConfig.logEcsReformatting.description": "Spécifier si et comment l'agent doit reformater automatiquement les logs d'application en [JSON compatible avec ECS](https://www.elastic.co/guide/en/ecs-logging/overview/master/intro.html), compatible avec l'ingestion dans Elasticsearch à des fins d'analyse de log plus poussée.", + "xpack.apm.agentConfig.logEcsReformatting.label": "Reformatage ECS des logs", "xpack.apm.agentConfig.logLevel.description": "Définit le niveau de logging pour l'agent", "xpack.apm.agentConfig.logLevel.label": "Niveau du log", + "xpack.apm.agentConfig.logSending.description": "Expérimental, requiert la version la plus récente de l'agent Java.\n\nSi \"true\" est défini,\nL'agent envoie les logs directement au serveur APM.", + "xpack.apm.agentConfig.logSending.label": "Envoi de logs (expérimental)", + "xpack.apm.agentConfig.mongodbCaptureStatementCommands.description": "Les noms de commande MongoDB pour lesquels le document de commande est capturé, limité aux opérations en lecture seule courantes par défaut. Définissez cette option sur \"''\" (vide) pour désactiver la capture, et sur \"*\" pour tout capturer (ce qui est déconseillé car cela peut entraîner la capture d'informations sensibles).\n\nCette option prend en charge le caractère générique \"*\" qui correspond à zéro caractère ou plus. Exemples : \"/foo/*/bar/*/baz*\", \"*foo*\". La correspondance n'est pas sensible à la casse par défaut. L'ajout de \"(?-i)\" au début d'un élément rend la correspondance sensible à la casse.", + "xpack.apm.agentConfig.mongodbCaptureStatementCommands.label": "Commandes d'instruction pour la capture MongoDB", "xpack.apm.agentConfig.newConfig.description": "Affinez votre configuration d'agent depuis l'application APM. Les modifications sont automatiquement propagées à vos agents APM, ce qui vous évite d'effectuer un redéploiement.", "xpack.apm.agentConfig.profilingInferredSpansEnabled.description": "Définissez cette option sur \"true\" pour que l'agent crée des intervalles pour des exécutions de méthodes basées sur async-profiler, un profiler d'échantillonnage (ou profiler statistique). En raison de la nature du fonctionnement des profilers d'échantillonnage, la durée des intervalles générés n'est pas exacte, il ne s'agit que d'estimations. \"profiling_inferred_spans_sampling_interval\" vous permet d'ajuster avec exactitude le compromis entre précision et surcharge. Les intervalles générés sont créés à la fin d'une session de profilage. Cela signifie qu'il existe un délai entre les intervalles réguliers et les intervalles générés visibles dans l'interface utilisateur. REMARQUE : cette fonctionnalité n'est pas disponible sous Windows.", "xpack.apm.agentConfig.profilingInferredSpansEnabled.label": "Intervalles générés par le profilage activés", @@ -7105,7 +7676,7 @@ "xpack.apm.agentConfig.servicePage.service.placeholder": "Sélectionner une option", "xpack.apm.agentConfig.servicePage.service.title": "Service", "xpack.apm.agentConfig.settingsPage.notFound.message": "La configuration demandée n'existe pas", - "xpack.apm.agentConfig.settingsPage.notFound.title": "Désolé, une erreur est survenue.", + "xpack.apm.agentConfig.settingsPage.notFound.title": "Désolé, une erreur est survenue", "xpack.apm.agentConfig.settingsPage.saveButton": "Enregistrer la configuration", "xpack.apm.agentConfig.spanCompressionEnabled.description": "L'attribution de la valeur \"true\" à cette option activera la fonctionnalité de compression de l'intervalle.\nLa compression d'intervalle réduit la surcharge de collecte, de traitement et de stockage, et supprime l'encombrement dans l'interface utilisateur. Le compromis est que certaines informations, telles que les instructions de base de données de tous les intervalles compressés, ne seront pas collectées.", "xpack.apm.agentConfig.spanCompressionEnabled.label": "Compression d'intervalle activée", @@ -7113,8 +7684,12 @@ "xpack.apm.agentConfig.spanCompressionExactMatchMaxDuration.label": "Durée maximale de compression d'intervalles en correspondance parfaite", "xpack.apm.agentConfig.spanCompressionSameKindMaxDuration.description": "Les intervalles consécutifs qui ont la même destination et qui se trouvent sous ce seuil seront compressés en un seul intervalle composite. Cette option ne s'applique pas aux intervalles composites. Cela réduit la surcharge de collecte, de traitement et de stockage, et supprime l'encombrement dans l'interface utilisateur. Le compromis est que les instructions de base de données de tous les intervalles compressés ne seront pas collectées.", "xpack.apm.agentConfig.spanCompressionSameKindMaxDuration.label": "Durée maximale de compression d'intervalles de même genre", - "xpack.apm.agentConfig.spanFramesMinDuration.description": "Dans ses paramètres par défaut, l'agent APM collectera une trace de la pile avec chaque intervalle enregistré.\nBien qu'il soit très pratique de trouver l'endroit exact dans votre code qui provoque l'intervalle, la collecte de cette trace de la pile provoque une certaine surcharge. \nLorsque cette option est définie sur une valeur négative, telle que \"-1ms\", les traces de pile sont collectées pour tous les intervalles. En choisissant une valeur positive, par ex. \"5ms\", la collecte des traces de pile se limitera aux intervalles dont la durée est égale ou supérieure à la valeur donnée, par ex. 5 millisecondes.\n\nPour désactiver complètement la collecte des traces de pile des intervalles, réglez la valeur sur \"0ms\".", + "xpack.apm.agentConfig.spanFramesMinDuration.description": "(déclassé, utilisez \"span_stack_trace_min_duration\" à la place) Dans ses paramètres par défaut, l'agent APM collectera une trace de la pile avec chaque intervalle enregistré.\nBien qu'il soit très pratique de trouver l'endroit exact dans votre code qui provoque l'intervalle, la collecte de cette trace de la pile provoque une certaine surcharge. \nLorsque cette option est définie sur une valeur négative, telle que \"-1ms\", les traces de pile sont collectées pour tous les intervalles. En choisissant une valeur positive, par ex. \"5ms\", la collecte des traces de pile se limitera aux intervalles dont la durée est égale ou supérieure à la valeur donnée, par ex. 5 millisecondes.\n\nPour désactiver complètement la collecte des traces de pile des intervalles, réglez la valeur sur \"0ms\".", "xpack.apm.agentConfig.spanFramesMinDuration.label": "Durée minimale des cadres des intervalles", + "xpack.apm.agentConfig.spanMinDuration.description": "Définit la durée minimale des intervalles. Une tentative visant à ignorer les intervalles qui s'exécutent plus rapidement que ce seuil peut avoir lieu.\n\nLa tentative échoue si elle mène à un intervalle qui ne peut pas être ignoré. Les intervalles qui propagent le contexte de trace aux services en aval, tels que les requêtes HTTP sortantes, ne peuvent pas être ignorés. De plus, les intervalles qui conduisent à une erreur ou qui peuvent être le parent d'une opération asynchrone ne peuvent pas être ignorés.\n\nCependant, les appels externes qui ne propagent pas le contexte, tels que les appels à une base de données, peuvent être ignorés à l'aide de ce seuil.", + "xpack.apm.agentConfig.spanMinDuration.label": "Durée minimale de l'intervalle", + "xpack.apm.agentConfig.spanStackTraceMinDuration.description": "Bien qu'il soit très pratique de trouver l'endroit exact dans votre code qui provoque l'intervalle, la collecte de cette trace de la pile provoque une certaine surcharge. Lorsque cette option est définie sur la valeur \"0ms\", les traces de pile sont collectées pour tous les intervalles. En choisissant une valeur positive, par ex. \"5ms\", la collecte des traces de pile se limitera aux intervalles dont la durée est égale ou supérieure à la valeur donnée, par ex. 5 millisecondes.\n\nPour désactiver complètement la collecte des traces de pile des intervalles, réglez la valeur sur \"-1ms\".", + "xpack.apm.agentConfig.spanStackTraceMinDuration.label": "Durée minimale de la trace de pile de l'intervalle", "xpack.apm.agentConfig.stackTraceLimit.description": "En définissant cette option sur 0, la collecte des traces de pile sera désactivée. Toute valeur entière positive sera utilisée comme nombre maximal de cadres à collecter. La valeur -1 signifie que tous les cadres seront collectés.", "xpack.apm.agentConfig.stackTraceLimit.label": "Limite de trace de pile", "xpack.apm.agentConfig.stressMonitorCpuDurationThreshold.description": "Durée minimale requise pour déterminer si le système est actuellement sous tension ou si la tension précédemment détectée a été allégée. Toutes les mesures réalisées pendant ce laps de temps doivent être cohérentes par rapport au seuil concerné pour pouvoir détecter un changement d'état de tension. La valeur doit être d'au moins \"1m\".", @@ -7163,6 +7738,8 @@ "xpack.apm.agentExplorerInstanceTable.noServiceNodeName.configurationOptions": "options de configuration", "xpack.apm.agentExplorerInstanceTable.noServiceNodeName.tooltip": "Astuce pour serviceNodeName manquant", "xpack.apm.agentExplorerTable.agentDocsColumnLabel": "Documents de l'agent", + "xpack.apm.agentExplorerTable.agentLatestVersionColumnLabel": "Version la plus récente de l'agent", + "xpack.apm.agentExplorerTable.agentLatestVersionColumnTooltip": "La version la plus récente de l'agent.", "xpack.apm.agentExplorerTable.agentNameColumnLabel": "Nom de l'agent", "xpack.apm.agentExplorerTable.agentVersionColumnLabel": "Version d'agent", "xpack.apm.agentExplorerTable.environmentColumnLabel": "Environnement", @@ -7174,6 +7751,7 @@ "xpack.apm.agentInstancesDetails.agentDocsUrlLabel": "Documentation de l'agent", "xpack.apm.agentInstancesDetails.agentNameLabel": "Nom de l'agent", "xpack.apm.agentInstancesDetails.intancesLabel": "Instances", + "xpack.apm.agentInstancesDetails.latestVersionLabel": "Version la plus récente de l'agent", "xpack.apm.agentInstancesDetails.serviceLabel": "Service", "xpack.apm.agentMetrics.java.gcRate": "Taux RM", "xpack.apm.agentMetrics.java.gcRateChartTitle": "Récupération de mémoire par minute", @@ -7202,14 +7780,19 @@ "xpack.apm.aggregatedTransactions.fallback.badge": "Basé sur les transactions échantillonnées", "xpack.apm.aggregatedTransactions.fallback.tooltip": "Cette page utilise les données d'événements de transactions lorsqu'aucun événement d'indicateur n'a été trouvé dans la plage temporelle actuelle, ou lorsqu'un filtre a été appliqué en fonction des champs indisponibles dans les documents des événements d'indicateurs.", "xpack.apm.alerting.fields.environment": "Environnement", + "xpack.apm.alerting.fields.error.group.id": "Clé du groupe d'erreurs", "xpack.apm.alerting.fields.service": "Service", + "xpack.apm.alerting.fields.transaction.name": "Nom", "xpack.apm.alerting.fields.type": "Type", + "xpack.apm.alerting.transaction.name.custom.text": "Ajouter \\{searchValue\\} en tant que nouveau nom de transaction", "xpack.apm.alerts.action_variables.alertDetailsUrl": "Liaison vers la vue dans Elastic qui affiche davantage de détails et de contexte concernant cette alerte", "xpack.apm.alerts.action_variables.environment": "Type de transaction pour lequel l'alerte est créée", + "xpack.apm.alerts.action_variables.errorGroupingKey": "La clé de groupe d'erreurs pour laquelle l'alerte est créée", "xpack.apm.alerts.action_variables.intervalSize": "La longueur et l'unité de la période à laquelle les conditions de l'alerte ont été remplies", "xpack.apm.alerts.action_variables.reasonMessage": "Une description concise de la raison du signalement", "xpack.apm.alerts.action_variables.serviceName": "Service pour lequel l'alerte est créée", "xpack.apm.alerts.action_variables.threshold": "Toute valeur de déclenchement dépassant cette valeur lancera l'alerte", + "xpack.apm.alerts.action_variables.transactionName": "Le nom de transaction pour lequel l'alerte est créée", "xpack.apm.alerts.action_variables.transactionType": "Type de transaction pour lequel l'alerte est créée", "xpack.apm.alerts.action_variables.triggerValue": "Valeur ayant dépassé le seuil et déclenché l'alerte", "xpack.apm.alerts.action_variables.viewInAppUrl": "Lien vers la vue ou la fonctionnalité d'Elastic qui peut être utilisée pour examiner l'alerte et son contexte de manière plus approfondie", @@ -7218,9 +7801,9 @@ "xpack.apm.alerts.anomalySeverity.minor": "mineure", "xpack.apm.alerts.anomalySeverity.warningLabel": "avertissement", "xpack.apm.alertTypes.anomaly.description": "Alerte lorsque la latence, le rendement ou le taux de transactions ayant échoué d'un service est anormal.", - "xpack.apm.alertTypes.errorCount.defaultActionMessage": "L'alerte \\{\\{alertName\\}\\} se déclenche en raison des conditions suivantes :\n\n- Nom de service : \\{\\{context.serviceName\\}\\}\n- Environnement : \\{\\{context.environment\\}\\}\n- Seuil : \\{\\{context.threshold\\}\\} erreurs\n- Valeur de déclenchement : \\{\\{context.triggerValue\\}\\} erreurs sur la dernière période de \\{\\{context.interval\\}\\}", + "xpack.apm.alertTypes.errorCount.defaultActionMessage": "L'alerte \\{\\{alertName\\}\\} se déclenche en raison des conditions suivantes :\n\n- Nom de service : \\{\\{context.serviceName\\}\\}\n- Environnement : \\{\\{context.environment\\}\\}\n- Seuil : \\{\\{context.threshold\\}\\}\n- Valeur de déclenchement : \\{\\{context.triggerValue\\}\\} erreurs sur la dernière période de \\{\\{context.interval\\}\\}", "xpack.apm.alertTypes.errorCount.description": "Alerte lorsque le nombre d'erreurs d'un service dépasse un seuil défini.", - "xpack.apm.alertTypes.transactionDuration.defaultActionMessage": "L'alerte \\{\\{alertName\\}\\} se déclenche en raison des conditions suivantes :\n\n- Nom de service : \\{\\{context.serviceName\\}\\}\n- Type : \\{\\{context.transactionType\\}\\}\n- Environnement : \\{\\{context.environment\\}\\}\n- Seuil de latence : \\{\\{context.threshold\\}\\} ms\n- Latence observée : \\{\\{context.triggerValue\\}\\} sur la dernière période de \\{\\{context.interval\\}\\}", + "xpack.apm.alertTypes.transactionDuration.defaultActionMessage": "L'alerte \\{\\{alertName\\}\\} se déclenche en raison des conditions suivantes :\n\n- Nom de service : \\{\\{context.serviceName\\}\\}\n- Type de transaction : \\{\\{context.transactionType\\}\\}\n- Nom de transaction : \\{\\{context.transactionName\\}\\}\n- Environnement : \\{\\{context.environment\\}\\}\n- Seuil de latence : \\{\\{context.threshold\\}\\} ms\n- Latence observée : \\{\\{context.triggerValue\\}\\} sur la dernière période de \\{\\{context.interval\\}\\}", "xpack.apm.alertTypes.transactionDuration.description": "Alerte lorsque la latence d'un type de transaction spécifique dans un service dépasse le seuil défini.", "xpack.apm.alertTypes.transactionDurationAnomaly.defaultActionMessage": "L'alerte \\{\\{alertName\\}\\} se déclenche en raison des conditions suivantes :\n\n- Nom de service : \\{\\{context.serviceName\\}\\}\n- Type : \\{\\{context.transactionType\\}\\}\n- Environnement : \\{\\{context.environment\\}\\}\n- Seuil de sévérité : \\{\\{context.threshold\\}\\}\n- Valeur de sévérité : \\{\\{context.triggerValue\\}\\}\n", "xpack.apm.alertTypes.transactionErrorRate.defaultActionMessage": "L'alerte \\{\\{alertName\\}\\} se déclenche en raison des conditions suivantes :\n\n- Nom de service : \\{\\{context.serviceName\\}\\}\n- Type : \\{\\{context.transactionType\\}\\}\n- Environnement : \\{\\{context.environment\\}\\}\n- Seuil : \\{\\{context.threshold\\}\\} %\n- Valeur de déclenchement : \\{\\{context.triggerValue\\}\\} % des erreurs sur la dernière période de \\{\\{context.interval\\}\\}", @@ -7252,6 +7835,7 @@ "xpack.apm.apmSettings.kibanaLink.label": "Paramètres avancés de Kibana.", "xpack.apm.apmSettings.save.error": "Une erreur s'est produite lors de l'enregistrement des paramètres", "xpack.apm.apmSettings.saveButton": "Enregistrer les modifications", + "xpack.apm.appName": "APM", "xpack.apm.betaBadgeDescription": "Cette fonctionnalité est actuellement en version bêta. Si vous rencontrez des bugs ou si vous souhaitez apporter des commentaires, ouvrez un ticket de problème ou visitez notre forum de discussion.", "xpack.apm.betaBadgeLabel": "Bêta", "xpack.apm.bottomBarActions.discardChangesButton": "Abandonner les modifications", @@ -7305,7 +7889,7 @@ "xpack.apm.correlations.latencyCorrelations.correlationsTable.actionsLabel": "Filtre", "xpack.apm.correlations.latencyCorrelations.correlationsTable.correlationColumnDescription": "Score de corrélation [0-1] d'un attribut ; plus le score est élevé, plus un attribut augmente la latence.", "xpack.apm.correlations.latencyCorrelations.correlationsTable.correlationLabel": "Corrélation", - "xpack.apm.correlations.latencyCorrelations.correlationsTable.excludeDescription": "Exclure la valeur", + "xpack.apm.correlations.latencyCorrelations.correlationsTable.excludeDescription": "Filtrer la valeur", "xpack.apm.correlations.latencyCorrelations.correlationsTable.excludeLabel": "Exclure", "xpack.apm.correlations.latencyCorrelations.correlationsTable.fieldNameLabel": "Nom du champ", "xpack.apm.correlations.latencyCorrelations.correlationsTable.fieldValueLabel": "Valeur du champ", @@ -7341,6 +7925,7 @@ "xpack.apm.dataView.autoCreateDisabled": "La création automatique des vues de données a été désactivée via l'option de configuration \"autoCreateApmDataView\"", "xpack.apm.dataView.noApmData": "Aucune donnée APM", "xpack.apm.dependecyOperationDetailView.header.backLinkLabel": "Toutes les opérations", + "xpack.apm.dependencies.unifiedSearchBarPlaceholder": "Rechercher dans les indicateurs de dépendance (par ex., span.destination.service.resource:elasticsearch)", "xpack.apm.dependenciesInventory.dependencyTableColumn": "Dépendance", "xpack.apm.dependenciesTable.columnErrorRate": "Taux de transactions ayant échoué", "xpack.apm.dependenciesTable.columnErrorRateTip": "Le pourcentage de transactions ayant échoué pour le service sélectionné. Les transactions du serveur HTTP avec un code du statut 4xx (erreur du client) ne sont pas considérées comme des échecs, car l'appelant, et non le serveur, a provoqué l'échec.", @@ -7396,12 +7981,14 @@ "xpack.apm.errorGroupDetails.logMessageLabel": "Message log", "xpack.apm.errorGroupDetails.occurrencesChartLabel": "Occurrences d'erreurs", "xpack.apm.errorGroupDetails.unhandledLabel": "Non géré", + "xpack.apm.errorGroupingKeySelectPlaceholder": "Sélectionner la clé du groupe d'erreurs", "xpack.apm.errorGroupTopTransactions.column.occurrences": "Occurrences d'erreurs", "xpack.apm.errorGroupTopTransactions.column.transactionName": "Nom de la transaction", "xpack.apm.errorGroupTopTransactions.errorMessage": "Impossible de récupérer", "xpack.apm.errorGroupTopTransactions.loading": "Chargement...", "xpack.apm.errorGroupTopTransactions.noResults": "Aucune erreur trouvée associée à des transactions", "xpack.apm.errorGroupTopTransactions.title": "5 principales transactions affectées", + "xpack.apm.errorKeySelectCustomOptionText": "Ajouter \\{searchValue\\} comme nouvelle clé de groupe d'erreurs", "xpack.apm.errorRate": "Taux de transactions ayant échoué", "xpack.apm.errorRate.chart.errorRate": "Taux de transactions ayant échoué (moy.)", "xpack.apm.errorRate.tip": "Le pourcentage de transactions ayant échoué pour le service sélectionné. Les transactions du serveur HTTP avec un code du statut 4xx (erreur du client) ne sont pas considérées comme des échecs, car l'appelant, et non le serveur, a provoqué l'échec.", @@ -7418,6 +8005,7 @@ "xpack.apm.errorsTable.groupIdColumnDescription": "Hachage de la trace de pile. Regroupe les erreurs similaires, même lorsque le message d'erreur est différent en raison des paramètres dynamiques.", "xpack.apm.errorsTable.groupIdColumnLabel": "ID du groupe", "xpack.apm.errorsTable.lastSeenColumnLabel": "Vu en dernier", + "xpack.apm.errorsTable.loading": "Chargement...", "xpack.apm.errorsTable.noErrorsLabel": "Aucune erreur trouvée", "xpack.apm.errorsTable.occurrencesColumnLabel": "Occurrences", "xpack.apm.errorsTable.typeColumnLabel": "Type", @@ -7632,7 +8220,7 @@ "xpack.apm.latencyChartHistory.chartTitle": " historique des alertes de latence", "xpack.apm.latencyChartHistory.last30days": "30 derniers jours", "xpack.apm.latencyCorrelations.licenseCheckText": "Pour utiliser les corrélations de latence, vous devez disposer d'une licence Elastic Platinum. Elle vous permettra de découvrir quels champs sont corrélés à de faibles performances.", - "xpack.apm.license.betaBadge": "Bêta", + "xpack.apm.license.betaBadge": "Version bêta", "xpack.apm.license.betaTooltipMessage": "Cette fonctionnalité est actuellement en version bêta. Si vous rencontrez des bugs ou si vous souhaitez apporter des commentaires, ouvrez un ticket de problème ou visitez notre forum de discussion.", "xpack.apm.license.button": "Commencer l'essai", "xpack.apm.license.title": "Commencer un essai gratuit de 30 jours", @@ -7653,6 +8241,11 @@ "xpack.apm.mlCallout.updateAvailableCalloutButtonText": "Mettre à jour les tâches", "xpack.apm.mlCallout.updateAvailableCalloutText": "Nous avons mis à jour les tâches de détection des anomalies qui fournissent des indications sur la dégradation des performances et ajouté des détecteurs de débit et de taux de transactions ayant échoué. Si vous choisissez de mettre à jour, nous créerons les nouvelles tâches et fermerons les tâches héritées. Les données affichées dans l'application APM passeront automatiquement aux nouvelles. Veuillez noter que l'option de migration de toutes les tâches existantes ne sera pas disponible si vous choisissez de créer une nouvelle tâche.", "xpack.apm.mlCallout.updateAvailableCalloutTitle": "Mises à jour disponibles", + "xpack.apm.mobile.charts.appVersion": "Version de l'application", + "xpack.apm.mobile.charts.device": "Appareils", + "xpack.apm.mobile.charts.nct": "Type de connexion réseau", + "xpack.apm.mobile.charts.noResultsFound": "Résultat introuvable", + "xpack.apm.mobile.charts.osVersion": "Version du système d'exploitation", "xpack.apm.mobile.coming.soon": "Bientôt disponible", "xpack.apm.mobile.filters.appVersion": "Version de l'application", "xpack.apm.mobile.filters.device": "Appareil", @@ -7666,10 +8259,21 @@ "xpack.apm.mobile.metrics.http.requests": "Requêtes HTTP", "xpack.apm.mobile.metrics.load.time": "Temps de chargement de l'application le plus lent", "xpack.apm.mobile.metrics.sessions": "Sessions", + "xpack.apm.mobile.stats.table.loading": "Chargement...", + "xpack.apm.mobile.stats.table.noDataMessage": "Aucune donnée trouvée", + "xpack.apm.mobile.transactions.overview.table.crashRateColumnLabel": "Taux de panne", + "xpack.apm.mobile.transactions.overview.table.latencyColumnAvgLabel": "Latence (moy.)", + "xpack.apm.mobile.transactions.overview.table.nameColumnLabel": "Nom", + "xpack.apm.mobile.transactions.overview.table.throughputColumnAvgLabel": "Rendement", + "xpack.apm.mobile.transactions.overview.tabs.app.version": "Version de l'application", + "xpack.apm.mobile.transactions.overview.tabs.devices": "Appareils", + "xpack.apm.mobile.transactions.overview.tabs.os.version": "Version du système d'exploitation", + "xpack.apm.mobile.transactions.overview.tabs.transactions": "Transactions", "xpack.apm.mobileServiceDetails.alertsTabLabel": "Alertes", "xpack.apm.mobileServiceDetails.overviewTabLabel": "Aperçu", "xpack.apm.mobileServiceDetails.serviceMapTabLabel": "Carte des services", "xpack.apm.mobileServiceDetails.transactionsTabLabel": "Transactions", + "xpack.apm.mobileServices.breadcrumb.title": "Services", "xpack.apm.navigation.apmSettingsTitle": "Paramètres", "xpack.apm.navigation.apmStorageExplorerTitle": "Explorateur de stockage", "xpack.apm.navigation.dependenciesTitle": "Dépendances", @@ -7681,6 +8285,10 @@ "xpack.apm.noDataConfig.addDataButtonLabel": "Ajouter des données", "xpack.apm.noDataConfig.solutionName": "Observabilité", "xpack.apm.notAvailableLabel": "S. O.", + "xpack.apm.pages.alertDetails.alertSummary.actualValue": "Valeur réelle", + "xpack.apm.pages.alertDetails.alertSummary.expectedValue": "Valeur attendue", + "xpack.apm.pages.alertDetails.alertSummary.serviceEnv": "Environnement de service", + "xpack.apm.pages.alertDetails.alertSummary.serviceName": "Nom de service", "xpack.apm.percentOfParent": "({value} de {parentType, select, transaction { transaction } trace {trace} })", "xpack.apm.propertiesTable.agentFeature.noDataAvailableLabel": "Aucune donnée disponible", "xpack.apm.propertiesTable.tabs.logs.serviceName": "Nom de service", @@ -7688,6 +8296,14 @@ "xpack.apm.propertiesTable.tabs.metadataLabel": "Métadonnées", "xpack.apm.propertiesTable.tabs.spanLinks": "Liens d'intervalle", "xpack.apm.propertiesTable.tabs.timelineLabel": "Chronologie", + "xpack.apm.ruleFlyout.errorCount.createAlertPerHelpText": "Créer une alerte pour chaque valeur unique. Par exemple : \"transaction.name\". Par défaut, une alerte est créée pour chaque service.name et service.environment uniques.", + "xpack.apm.ruleFlyout.errorCount.createAlertPerText": "Regrouper les alertes par", + "xpack.apm.ruleFlyout.errorRate.createAlertPerHelpText": "Créer une alerte pour chaque valeur unique. Par exemple : \"transaction.name\". Par défaut, une alerte est créée pour chaque service.name, service.environment et transaction.type uniques.", + "xpack.apm.ruleFlyout.errorRate.createAlertPerText": "Regrouper les alertes par", + "xpack.apm.ruleFlyout.groupByAriaLabel": "Regrouper par", + "xpack.apm.ruleFlyout.groupByLabel": "Tout", + "xpack.apm.ruleFlyout.transactionDuration.createAlertPerHelpText": "Créer une alerte pour chaque valeur unique. Par exemple : \"transaction.name\". Par défaut, une alerte est créée pour chaque service.name, service.environment et transaction.type uniques.", + "xpack.apm.ruleFlyout.transactionDuration.createAlertPerText": "Regrouper les alertes par", "xpack.apm.searchInput.filter": "Filtrer…", "xpack.apm.selectPlaceholder": "Sélectionner une option :", "xpack.apm.serverlessMetrics.activeInstances.billedDuration": "Durée facturée", @@ -7710,6 +8326,7 @@ "xpack.apm.serverlessMetrics.summary.memoryUsageAvg": "Moy. d'utilisation de la mémoire", "xpack.apm.serverlessMetrics.summary.title": "Résumé", "xpack.apm.serviceDependencies.breakdownChartTitle": "Temps consacré par dépendance", + "xpack.apm.serviceDetail.maxGroup.message": "Le serveur APM a atteint la capacité maximale qu'il peut actuellement gérer en matière d'affichage de services individuels. Envisagez d'augmenter la capacité de votre serveur APM et/ou de régler l'instrumentation de l'application afin d'afficher toutes les données.", "xpack.apm.serviceDetails.dependenciesTabLabel": "Dépendances", "xpack.apm.serviceDetails.errorsTabLabel": "Erreurs", "xpack.apm.serviceDetails.metrics.cpuUsageChartTitle": "Utilisation CPU", @@ -7777,6 +8394,10 @@ "xpack.apm.serviceIcons.azure_functions": "Fonctions Azure", "xpack.apm.serviceIcons.cloud": "Cloud", "xpack.apm.serviceIcons.container": "Conteneur", + "xpack.apm.serviceIcons.opentelemetry": "OpenTelemetry", + "xpack.apm.serviceIcons.otelDetails.opentelemetry.autoVersion": "Version de l'agent d'auto-instrumentation", + "xpack.apm.serviceIcons.otelDetails.opentelemetry.language": "Langue", + "xpack.apm.serviceIcons.otelDetails.opentelemetry.sdkVersion": "Version du SDK OTel", "xpack.apm.serviceIcons.serverless": "Sans serveur", "xpack.apm.serviceIcons.service": "Service", "xpack.apm.serviceIcons.serviceDetails.cloud.architecture": "Architecture", @@ -7809,6 +8430,8 @@ "xpack.apm.serviceMap.avgTransDurationPopoverStat": "Latence (moy.)", "xpack.apm.serviceMap.center": "Centre", "xpack.apm.serviceMap.dependencyDetailsButtonText": "Détails des dépendances", + "xpack.apm.serviceMap.disabledDescription": "La carte des services a été désactivée. Elle peut être activée via \"xpack.apm.serviceMapEnabled\"", + "xpack.apm.serviceMap.disabledTitle": "La carte des services est désactivée", "xpack.apm.serviceMap.download": "Télécharger", "xpack.apm.serviceMap.emptyBanner.docsLink": "En savoir plus dans la documentation", "xpack.apm.serviceMap.emptyBanner.message": "Nous démapperons les services connectés et les requêtes externes si nous parvenons à les détecter. Assurez-vous d'exécuter la dernière version de l'agent APM.", @@ -7830,6 +8453,7 @@ "xpack.apm.serviceMap.viewInTraceExplorer": "Explorer les traces", "xpack.apm.serviceMap.zoomIn": "Zoom avant", "xpack.apm.serviceMap.zoomOut": "Zoom arrière", + "xpack.apm.serviceMetrics.loading": "Chargement des indicateurs", "xpack.apm.serviceNamesSelectCustomOptionText": "Ajouter \\{searchValue\\} en tant que nouveau nom de service", "xpack.apm.serviceNamesSelectPlaceholder": "Sélectionner le nom du service", "xpack.apm.serviceNodeMetrics.containerId": "ID de conteneur", @@ -7918,6 +8542,8 @@ "xpack.apm.settings.agentConfig": "Configuration de l'agent", "xpack.apm.settings.agentConfig.createConfigButton.tooltip": "Vous ne disposez pas d'autorisations pour créer des configurations d'agent", "xpack.apm.settings.agentConfig.descriptionText": "Affinez votre configuration d'agent depuis l'application APM. Les modifications sont automatiquement propagées à vos agents APM, ce qui vous évite d'effectuer un redéploiement.", + "xpack.apm.settings.agentConfiguration.all.option.calloutTitle": "Ce changement de configuration aura un impact sur tous les services, à l'exception de ceux qui utilisent un agent OpenTelemetry. ", + "xpack.apm.settings.agentConfiguration.service.otel.error": "Les services sélectionnés utilisent un agent OpenTelemetry, qui n'est pas pris en charge", "xpack.apm.settings.agentExplorer": "Explorateur d'agent", "xpack.apm.settings.agentExplorer.descriptionText": "La version d'évaluation technique de l'explorateur d'agent fournit un inventaire des agents déployés et des détails les concernant.", "xpack.apm.settings.agentExplorer.title": "Explorateur d'agent", @@ -8023,7 +8649,7 @@ "xpack.apm.settings.customLink.flyout.link.url": "URL", "xpack.apm.settings.customLink.flyout.link.url.doc": "Découvrez plus d'informations dans la documentation.", "xpack.apm.settings.customLink.flyout.link.url.placeholder": "par ex., https://www.elastic.co/fr/", - "xpack.apm.settings.customLink.flyout.required": "Obligatoire", + "xpack.apm.settings.customLink.flyout.required": "Requis", "xpack.apm.settings.customLink.flyout.save": "Enregistrer", "xpack.apm.settings.customLink.flyout.title": "Créer un lien", "xpack.apm.settings.customLink.info": "Ces liens seront affichés dans le menu contextuel Actions, dans des zones sélectionnées de l'application, par ex., par détail de transaction.", @@ -8186,7 +8812,7 @@ "xpack.apm.tracesTable.notFoundLabel": "Aucune trace trouvée pour cette recherche", "xpack.apm.tracesTable.originatingServiceColumnLabel": "Service d'origine", "xpack.apm.tracesTable.tracesPerMinuteColumnLabel": "Traces par minute", - "xpack.apm.transactionActionMenu.actionsButtonLabel": "Examiner", + "xpack.apm.transactionActionMenu.actionsButtonLabel": "Investiguer", "xpack.apm.transactionActionMenu.container.subtitle": "Affichez les logs et les indicateurs de ce conteneur pour plus de détails.", "xpack.apm.transactionActionMenu.container.title": "Détails du conteneur", "xpack.apm.transactionActionMenu.customLink.section": "Liens personnalisés", @@ -8215,6 +8841,7 @@ "xpack.apm.transactionActionMenu.viewSampleDocumentLinkLabel": "Afficher la transaction dans Discover", "xpack.apm.transactionBreakdown.chartHelp": "La durée moyenne de chaque type d'intervalle. \"app\" indique que quelque chose se passait au sein du service - cela peut signifier que le temps a été passé dans le code de l'application et non dans la base de données ou les requêtes externes, ou que l'auto-instrumentation de l'agent APM ne couvre pas le code exécuté.", "xpack.apm.transactionBreakdown.chartTitle": "Temps consacré par type d'intervalle", + "xpack.apm.transactionDetail.maxGroup.message": "Le serveur APM a atteint la capacité maximale qu'il peut actuellement gérer en termes d'affichage de groupes de transactions individuels. Envisagez d'augmenter la capacité de votre serveur APM et/ou de régler l'instrumentation de l'application afin d'afficher toutes les données.", "xpack.apm.transactionDetail.remainingServices": "Transactions restantes", "xpack.apm.transactionDetail.tooltip": "Infobulle de nombre maximal de groupes de transactions atteint", "xpack.apm.transactionDetails.coldstartBadge": "démarrage à froid", @@ -8222,7 +8849,7 @@ "xpack.apm.transactionDetails.distribution.latencyDistributionErrorTitle": "Une erreur s'est produite lors de la récupération de la distribution de la latence globale.", "xpack.apm.transactionDetails.noTraceParentButtonTooltip": "Le parent de la trace n'a pas pu être trouvé", "xpack.apm.transactionDetails.percentOfTraceLabelExplanation": "Le % de {parentType, select, transaction {transaction} trace {trace} } dépasse 100 %, car {childType, select, span {cet intervalle} transaction {cette transaction} } prend plus de temps que la transaction racine.", - "xpack.apm.transactionDetails.requestMethodLabel": "Méthode de la requête", + "xpack.apm.transactionDetails.requestMethodLabel": "Méthode de requête", "xpack.apm.transactionDetails.resultLabel": "Résultat", "xpack.apm.transactionDetails.serviceLabel": "Service", "xpack.apm.transactionDetails.servicesTitle": "Services", @@ -8269,6 +8896,12 @@ "xpack.apm.transactionDurationRuleType.when": "Quand", "xpack.apm.transactionErrorRateAlert.name": "Seuil du taux de transactions ayant échoué", "xpack.apm.transactionErrorRateRuleType.isAbove": "est supérieur à", + "xpack.apm.transactionNamesSelectPlaceholder": "Sélectionner le nom de transaction", + "xpack.apm.transactionOverview.treemap.dropdown.devices": "Compartimentage des appareils", + "xpack.apm.transactionOverview.treemap.dropdown.devices.subtitle": "Cette vue sous forme de compartimentage permet de visualiser plus facilement et rapidement les appareils les plus utilisés.", + "xpack.apm.transactionOverview.treemap.dropdown.versions.subtitle": "Cette vue sous forme de compartimentage permet de visualiser plus facilement et rapidement les versions les plus utilisées.", + "xpack.apm.transactionOverview.treemap.show": "Afficher", + "xpack.apm.transactionOverview.treemap.versions.devices": "Compartimentage des versions", "xpack.apm.transactions.httpRequestsTitle": "Requêtes HTTP", "xpack.apm.transactions.httpRequestsTooltip": "Total des requêtes HTTP", "xpack.apm.transactions.latency.chart.95thPercentileLabel": "95e centile", @@ -8280,6 +8913,8 @@ "xpack.apm.transactionsCallout.transactionGroupLimit.exceeded": "Le nombre maximal de groupes de transactions affichés dans Kibana a été atteint. Essayez d'affiner les résultats à l'aide de la barre de requête.", "xpack.apm.transactionsTable.errorMessage": "Impossible de récupérer", "xpack.apm.transactionsTable.linkText": "Afficher les transactions", + "xpack.apm.transactionsTable.loading": "Chargement...", + "xpack.apm.transactionsTable.noResults": "Aucune transaction trouvée", "xpack.apm.transactionsTable.title": "Transactions", "xpack.apm.transactionTypesSelectCustomOptionText": "Ajouter \\{searchValue\\} en tant que nouveau type de transaction", "xpack.apm.transactionTypesSelectPlaceholder": "Sélectionner le type de transaction", @@ -8316,7 +8951,7 @@ "xpack.apm.tutorial.config_otel.description2": "Les variables d’environnement 'OTEL_METRICS_EXPORTER` et 'OTEL_LOGS_EXPORTER' peuvent ne pas être prises en charge par certains SDK.", "xpack.apm.tutorial.config_otel.instrumentationGuide": "Guide de l’Instrumentation OpenTelemetry", "xpack.apm.tutorial.djangoClient.configure.commands.addAgentComment": "Ajouter l'agent aux applications installées", - "xpack.apm.tutorial.djangoClient.configure.commands.addTracingMiddlewareComment": "Pour envoyer les indicateurs de performance, ajoutez notre intergiciel de traçage :", + "xpack.apm.tutorial.djangoClient.configure.commands.addTracingMiddlewareComment": "Ajoutez notre intergiciel de traçage pour envoyer des indicateurs de performance", "xpack.apm.tutorial.djangoClient.configure.textPre": "Les agents sont des bibliothèques exécutées dans les processus de votre application. Les services APM sont créés par programmation à partir du \"SERVICE_NAME\".", "xpack.apm.tutorial.djangoClient.configure.title": "Configurer l'agent", "xpack.apm.tutorial.djangoClient.install.textPre": "Installez l'agent APM pour Python en tant que dépendance.", @@ -8325,20 +8960,21 @@ "xpack.apm.tutorial.dotNetClient.configureApplication.textPost": "La transmission d'une instance \"IConfiguration\" est facultative mais si cette opération est effectuée, l'agent lira les paramètres de configuration depuis cette instance \"IConfiguration\" (par ex. à partir du fichier \"appsettings.json\").", "xpack.apm.tutorial.dotNetClient.configureApplication.textPre": "Si vous utilisez ASP.NET Core avec le package \"Elastic.Apm.NetCoreAll\", appelez la méthode \"UseAllElasticApm\" dans la méthode \"Configure\" dans le fichier \"Startup.cs\".", "xpack.apm.tutorial.dotNetClient.configureApplication.title": "Ajouter l'agent à l'application", + "xpack.apm.tutorial.dotnetClient.createConfig.commands.defaultServiceName": "La valeur par défaut est l'assemblage d'entrée de l'application.", "xpack.apm.tutorial.dotNetClient.download.title": "Télécharger l'agent APM", "xpack.apm.tutorial.downloadServer.title": "Télécharger et décompresser le serveur APM", "xpack.apm.tutorial.editConfig.textPre": "Si vous utilisez une version sécurisée X-Pack d'Elastic Stack, vous devez spécifier les informations d'identification dans le fichier de configuration \"apm-server.yml\".", "xpack.apm.tutorial.editConfig.title": "Modifier la configuration", "xpack.apm.tutorial.elasticCloudInstructions.title": "Agents APM", - "xpack.apm.tutorial.flaskClient.configure.commands.configureElasticApmComment": "ou configurer l'utilisation d'ELASTIC_APM dans les paramètres de votre application", - "xpack.apm.tutorial.flaskClient.configure.commands.initializeUsingEnvironmentVariablesComment": "initialiser à l'aide des variables d'environnement", + "xpack.apm.tutorial.flaskClient.configure.commands.configureElasticApmComment": "Vous pouvez également utiliser ELASTIC_APM dans les paramètres de votre application", + "xpack.apm.tutorial.flaskClient.configure.commands.initializeUsingEnvironmentVariablesComment": "Initialisez à l'aide des variables d'environnement", "xpack.apm.tutorial.flaskClient.configure.textPre": "Les agents sont des bibliothèques exécutées dans les processus de votre application. Les services APM sont créés par programmation à partir du \"SERVICE_NAME\".", "xpack.apm.tutorial.flaskClient.configure.title": "Configurer l'agent", "xpack.apm.tutorial.flaskClient.install.textPre": "Installez l'agent APM pour Python en tant que dépendance.", "xpack.apm.tutorial.flaskClient.install.title": "Installer l'agent APM", "xpack.apm.tutorial.fleet.title": "Fleet", "xpack.apm.tutorial.goClient.configure.commands.initializeUsingEnvironmentVariablesComment": "Initialisez à l'aide des variables d'environnement :", - "xpack.apm.tutorial.goClient.configure.commands.usedExecutableNameComment": "Si ELASTIC_APM_SERVICE_NAME n'est pas spécifié, le nom de l'exécutable sera utilisé.", + "xpack.apm.tutorial.goClient.configure.commands.usedExecutableNameComment": "En l'absence de spécification, le nom de l'exécutable est utilisé.", "xpack.apm.tutorial.goClient.configure.textPre": "Les agents sont des bibliothèques exécutées dans les processus de votre application. Les services APM sont créés par programmation à partir du nom du fichier exécutable, ou de la variable d'environnement \"ELASTIC_APM_SERVICE_NAME\".", "xpack.apm.tutorial.goClient.configure.title": "Configurer l'agent", "xpack.apm.tutorial.goClient.install.textPre": "Installez les packages d'agent APM pour Go.", @@ -8354,9 +8990,10 @@ "xpack.apm.tutorial.jsClient.installDependency.title": "Configurer l'agent comme dépendance", "xpack.apm.tutorial.jsClient.scriptTags.textPre": "Vous pouvez également utiliser les balises Script pour configurer l'agent. Ajoutez un indicateur \"
Date format: date-time