From 3fa5bdf8732101812a656ec954e2a8d779838938 Mon Sep 17 00:00:00 2001 From: Jean-Louis Leysens Date: Mon, 23 Sep 2024 16:53:31 +0200 Subject: [PATCH 01/41] [HTTP] Set explicit access for `public` HTTP APIs (#192554) ## Summary We will be enforcing restricted access to internal HTTP APIs [from 9.0](https://github.com/elastic/kibana/issues/186781). This PR is part 1 of audit checking that our public APIs have their access tag set explicitly to ensure they are still available to end users after we start enforcing HTTP API restrictions. APIs reviewed in this PR ([docs](https://www.elastic.co/guide/en/kibana/current/dashboard-import-api.html)): Screenshot 2024-09-11 at 11 25 55 ## Note to reviewers This audit is focussed on set `access: 'public'` where needed. Per the screenshot our public-facing documentation is taken as the source of truth for which APIs should be public. This may differ per offering so please consider whether a given HTTP API should be public on both serverless and stateful offerings. ## Risks * If we miss an API that should be public, end users will encounter a `400` response when they try to use the HTTP API on 9.0 * If we set an API's access to "public" it will not have the same restrictions applied to it. --- .../src/routes/index.ts | 8 +++++++- .../src/routes/legacy_import_export/export.ts | 10 +++++++++- .../src/routes/legacy_import_export/import.ts | 10 +++++++++- .../routes/legacy_import_export/export.test.ts | 1 + .../routes/legacy_import_export/import.test.ts | 1 + .../server/routes/authorization/roles/delete.ts | 1 + .../security/server/routes/authorization/roles/get.ts | 1 + .../server/routes/authorization/roles/get_all.ts | 1 + .../server/routes/authorization/roles/post.ts | 1 + .../security/server/routes/authorization/roles/put.ts | 1 + .../routes/session_management/invalidate.test.ts | 1 + .../server/routes/session_management/invalidate.ts | 1 + .../server/routes/api/external/copy_to_space.ts | 11 ++++++++++- .../spaces/server/routes/api/external/delete.ts | 3 ++- .../routes/api/external/disable_legacy_url_aliases.ts | 3 ++- .../plugins/spaces/server/routes/api/external/get.ts | 3 ++- .../spaces/server/routes/api/external/get_all.ts | 3 ++- .../routes/api/external/get_shareable_references.ts | 3 ++- .../plugins/spaces/server/routes/api/external/post.ts | 1 + .../plugins/spaces/server/routes/api/external/put.ts | 1 + .../routes/api/external/update_objects_spaces.ts | 3 ++- 21 files changed, 58 insertions(+), 10 deletions(-) diff --git a/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/index.ts b/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/index.ts index f435e29a22eef..48ac75e045148 100644 --- a/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/index.ts +++ b/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/index.ts @@ -84,8 +84,14 @@ export function registerRoutes({ maxImportPayloadBytes: config.maxImportPayloadBytes, coreUsageData, logger, + access: internalOnServerless, + }); + registerLegacyExportRoute(legacyRouter, { + kibanaVersion, + coreUsageData, + logger, + access: internalOnServerless, }); - registerLegacyExportRoute(legacyRouter, { kibanaVersion, coreUsageData, logger }); const internalRouter = http.createRouter( '/internal/saved_objects/' diff --git a/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/legacy_import_export/export.ts b/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/legacy_import_export/export.ts index cdb04e5afc697..f3cf776f7d977 100644 --- a/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/legacy_import_export/export.ts +++ b/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/legacy_import_export/export.ts @@ -11,6 +11,7 @@ import moment from 'moment'; import { schema } from '@kbn/config-schema'; import type { Logger } from '@kbn/logging'; import type { InternalCoreUsageDataSetup } from '@kbn/core-usage-data-base-server-internal'; +import type { RouteAccess } from '@kbn/core-http-server'; import type { InternalSavedObjectRouter } from '../../internal_types'; import { exportDashboards } from './lib'; @@ -20,7 +21,13 @@ export const registerLegacyExportRoute = ( kibanaVersion, coreUsageData, logger, - }: { kibanaVersion: string; coreUsageData: InternalCoreUsageDataSetup; logger: Logger } + access, + }: { + kibanaVersion: string; + coreUsageData: InternalCoreUsageDataSetup; + logger: Logger; + access: RouteAccess; + } ) => { router.get( { @@ -31,6 +38,7 @@ export const registerLegacyExportRoute = ( }), }, options: { + access, tags: ['api'], }, }, diff --git a/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/legacy_import_export/import.ts b/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/legacy_import_export/import.ts index 186e1cc26dc63..e45ef3205af18 100644 --- a/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/legacy_import_export/import.ts +++ b/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/legacy_import_export/import.ts @@ -11,6 +11,7 @@ import { schema } from '@kbn/config-schema'; import type { Logger } from '@kbn/logging'; import type { SavedObject } from '@kbn/core-saved-objects-server'; import type { InternalCoreUsageDataSetup } from '@kbn/core-usage-data-base-server-internal'; +import type { RouteAccess } from '@kbn/core-http-server'; import type { InternalSavedObjectRouter } from '../../internal_types'; import { importDashboards } from './lib'; @@ -20,7 +21,13 @@ export const registerLegacyImportRoute = ( maxImportPayloadBytes, coreUsageData, logger, - }: { maxImportPayloadBytes: number; coreUsageData: InternalCoreUsageDataSetup; logger: Logger } + access, + }: { + maxImportPayloadBytes: number; + coreUsageData: InternalCoreUsageDataSetup; + logger: Logger; + access: RouteAccess; + } ) => { router.post( { @@ -38,6 +45,7 @@ export const registerLegacyImportRoute = ( }), }, options: { + access, tags: ['api'], body: { maxBytes: maxImportPayloadBytes, diff --git a/src/core/server/integration_tests/saved_objects/routes/legacy_import_export/export.test.ts b/src/core/server/integration_tests/saved_objects/routes/legacy_import_export/export.test.ts index b3660a0aae549..5481fbc807276 100644 --- a/src/core/server/integration_tests/saved_objects/routes/legacy_import_export/export.test.ts +++ b/src/core/server/integration_tests/saved_objects/routes/legacy_import_export/export.test.ts @@ -62,6 +62,7 @@ describe('POST /api/dashboards/export', () => { kibanaVersion: 'mockversion', coreUsageData, logger: loggerMock.create(), + access: 'public', }); handlerContext.savedObjects.client.bulkGet diff --git a/src/core/server/integration_tests/saved_objects/routes/legacy_import_export/import.test.ts b/src/core/server/integration_tests/saved_objects/routes/legacy_import_export/import.test.ts index 388773eea1bed..8157c77e936a9 100644 --- a/src/core/server/integration_tests/saved_objects/routes/legacy_import_export/import.test.ts +++ b/src/core/server/integration_tests/saved_objects/routes/legacy_import_export/import.test.ts @@ -62,6 +62,7 @@ describe('POST /api/dashboards/import', () => { maxImportPayloadBytes: 26214400, coreUsageData, logger: loggerMock.create(), + access: 'public', }); handlerContext.savedObjects.client.bulkCreate.mockResolvedValueOnce({ diff --git a/x-pack/plugins/security/server/routes/authorization/roles/delete.ts b/x-pack/plugins/security/server/routes/authorization/roles/delete.ts index 8a481c4b60cbf..022e574181425 100644 --- a/x-pack/plugins/security/server/routes/authorization/roles/delete.ts +++ b/x-pack/plugins/security/server/routes/authorization/roles/delete.ts @@ -16,6 +16,7 @@ export function defineDeleteRolesRoutes({ router }: RouteDefinitionParams) { { path: '/api/security/role/{name}', options: { + access: 'public', summary: `Delete a role`, }, validate: { diff --git a/x-pack/plugins/security/server/routes/authorization/roles/get.ts b/x-pack/plugins/security/server/routes/authorization/roles/get.ts index 9109d89d956fd..ec2208341dc16 100644 --- a/x-pack/plugins/security/server/routes/authorization/roles/get.ts +++ b/x-pack/plugins/security/server/routes/authorization/roles/get.ts @@ -22,6 +22,7 @@ export function defineGetRolesRoutes({ { path: '/api/security/role/{name}', options: { + access: 'public', summary: `Get a role`, }, validate: { diff --git a/x-pack/plugins/security/server/routes/authorization/roles/get_all.ts b/x-pack/plugins/security/server/routes/authorization/roles/get_all.ts index a7d995f0a2639..ed31aedba7f31 100644 --- a/x-pack/plugins/security/server/routes/authorization/roles/get_all.ts +++ b/x-pack/plugins/security/server/routes/authorization/roles/get_all.ts @@ -22,6 +22,7 @@ export function defineGetAllRolesRoutes({ { path: '/api/security/role', options: { + access: 'public', summary: `Get all roles`, }, validate: false, diff --git a/x-pack/plugins/security/server/routes/authorization/roles/post.ts b/x-pack/plugins/security/server/routes/authorization/roles/post.ts index 07b9886c4072c..37967d208bf3a 100644 --- a/x-pack/plugins/security/server/routes/authorization/roles/post.ts +++ b/x-pack/plugins/security/server/routes/authorization/roles/post.ts @@ -43,6 +43,7 @@ export function defineBulkCreateOrUpdateRolesRoutes({ { path: '/api/security/roles', options: { + access: 'public', summary: 'Create or update roles', }, validate: { diff --git a/x-pack/plugins/security/server/routes/authorization/roles/put.ts b/x-pack/plugins/security/server/routes/authorization/roles/put.ts index 57271235add36..6175ba6f4d64f 100644 --- a/x-pack/plugins/security/server/routes/authorization/roles/put.ts +++ b/x-pack/plugins/security/server/routes/authorization/roles/put.ts @@ -24,6 +24,7 @@ export function definePutRolesRoutes({ { path: '/api/security/role/{name}', options: { + access: 'public', summary: `Create or update a role`, }, validate: { diff --git a/x-pack/plugins/security/server/routes/session_management/invalidate.test.ts b/x-pack/plugins/security/server/routes/session_management/invalidate.test.ts index ccd42b45718f8..fbc14015d80c1 100644 --- a/x-pack/plugins/security/server/routes/session_management/invalidate.test.ts +++ b/x-pack/plugins/security/server/routes/session_management/invalidate.test.ts @@ -44,6 +44,7 @@ describe('Invalidate sessions routes', () => { it('correctly defines route.', () => { expect(routeConfig.options).toEqual({ + access: 'public', summary: 'Invalidate user sessions', tags: ['access:sessionManagement'], }); diff --git a/x-pack/plugins/security/server/routes/session_management/invalidate.ts b/x-pack/plugins/security/server/routes/session_management/invalidate.ts index 1cf65bb9191c6..c7d27b835edf2 100644 --- a/x-pack/plugins/security/server/routes/session_management/invalidate.ts +++ b/x-pack/plugins/security/server/routes/session_management/invalidate.ts @@ -34,6 +34,7 @@ export function defineInvalidateSessionsRoutes({ router, getSession }: RouteDefi }), }, options: { + access: 'public', tags: ['access:sessionManagement'], summary: `Invalidate user sessions`, }, diff --git a/x-pack/plugins/spaces/server/routes/api/external/copy_to_space.ts b/x-pack/plugins/spaces/server/routes/api/external/copy_to_space.ts index c237c86b0b91a..f1f1f22b55e32 100644 --- a/x-pack/plugins/spaces/server/routes/api/external/copy_to_space.ts +++ b/x-pack/plugins/spaces/server/routes/api/external/copy_to_space.ts @@ -24,13 +24,21 @@ const areObjectsUnique = (objects: SavedObjectIdentifier[]) => _.uniqBy(objects, (o: SavedObjectIdentifier) => `${o.type}:${o.id}`).length === objects.length; export function initCopyToSpacesApi(deps: ExternalRouteDeps) { - const { router, getSpacesService, usageStatsServicePromise, getStartServices, log } = deps; + const { + router, + getSpacesService, + usageStatsServicePromise, + getStartServices, + log, + isServerless, + } = deps; const usageStatsClientPromise = usageStatsServicePromise.then(({ getClient }) => getClient()); router.post( { path: '/api/spaces/_copy_saved_objects', options: { + access: isServerless ? 'internal' : 'public', tags: ['access:copySavedObjectsToSpaces'], description: `Copy saved objects to spaces`, }, @@ -148,6 +156,7 @@ export function initCopyToSpacesApi(deps: ExternalRouteDeps) { { path: '/api/spaces/_resolve_copy_saved_objects_errors', options: { + access: isServerless ? 'internal' : 'public', tags: ['access:copySavedObjectsToSpaces'], description: `Resolve conflicts copying saved objects`, }, diff --git a/x-pack/plugins/spaces/server/routes/api/external/delete.ts b/x-pack/plugins/spaces/server/routes/api/external/delete.ts index 30a6f85d6994b..6ede0fa220043 100644 --- a/x-pack/plugins/spaces/server/routes/api/external/delete.ts +++ b/x-pack/plugins/spaces/server/routes/api/external/delete.ts @@ -15,12 +15,13 @@ import { wrapError } from '../../../lib/errors'; import { createLicensedRouteHandler } from '../../lib'; export function initDeleteSpacesApi(deps: ExternalRouteDeps) { - const { router, log, getSpacesService } = deps; + const { router, log, getSpacesService, isServerless } = deps; router.delete( { path: '/api/spaces/space/{id}', options: { + access: isServerless ? 'internal' : 'public', description: `Delete a space`, }, validate: { diff --git a/x-pack/plugins/spaces/server/routes/api/external/disable_legacy_url_aliases.ts b/x-pack/plugins/spaces/server/routes/api/external/disable_legacy_url_aliases.ts index 67bce1bfb742a..6b3c70eb64ffa 100644 --- a/x-pack/plugins/spaces/server/routes/api/external/disable_legacy_url_aliases.ts +++ b/x-pack/plugins/spaces/server/routes/api/external/disable_legacy_url_aliases.ts @@ -12,13 +12,14 @@ import { wrapError } from '../../../lib/errors'; import { createLicensedRouteHandler } from '../../lib'; export function initDisableLegacyUrlAliasesApi(deps: ExternalRouteDeps) { - const { router, getSpacesService, usageStatsServicePromise, log } = deps; + const { router, getSpacesService, usageStatsServicePromise, log, isServerless } = deps; const usageStatsClientPromise = usageStatsServicePromise.then(({ getClient }) => getClient()); router.post( { path: '/api/spaces/_disable_legacy_url_aliases', options: { + access: isServerless ? 'internal' : 'public', description: `Disable legacy URL aliases`, }, validate: { diff --git a/x-pack/plugins/spaces/server/routes/api/external/get.ts b/x-pack/plugins/spaces/server/routes/api/external/get.ts index 99bc646994b5c..dce169449c99a 100644 --- a/x-pack/plugins/spaces/server/routes/api/external/get.ts +++ b/x-pack/plugins/spaces/server/routes/api/external/get.ts @@ -13,12 +13,13 @@ import { wrapError } from '../../../lib/errors'; import { createLicensedRouteHandler } from '../../lib'; export function initGetSpaceApi(deps: ExternalRouteDeps) { - const { router, getSpacesService } = deps; + const { router, getSpacesService, isServerless } = deps; router.get( { path: '/api/spaces/space/{id}', options: { + access: isServerless ? 'internal' : 'public', description: `Get a space`, }, validate: { diff --git a/x-pack/plugins/spaces/server/routes/api/external/get_all.ts b/x-pack/plugins/spaces/server/routes/api/external/get_all.ts index 5b972f6491860..603dc3dfe45ba 100644 --- a/x-pack/plugins/spaces/server/routes/api/external/get_all.ts +++ b/x-pack/plugins/spaces/server/routes/api/external/get_all.ts @@ -13,12 +13,13 @@ import { wrapError } from '../../../lib/errors'; import { createLicensedRouteHandler } from '../../lib'; export function initGetAllSpacesApi(deps: ExternalRouteDeps) { - const { router, log, getSpacesService } = deps; + const { router, log, getSpacesService, isServerless } = deps; router.get( { path: '/api/spaces/space', options: { + access: isServerless ? 'internal' : 'public', description: `Get all spaces`, }, validate: { diff --git a/x-pack/plugins/spaces/server/routes/api/external/get_shareable_references.ts b/x-pack/plugins/spaces/server/routes/api/external/get_shareable_references.ts index 687a51b28f9c8..93a210cd82b3e 100644 --- a/x-pack/plugins/spaces/server/routes/api/external/get_shareable_references.ts +++ b/x-pack/plugins/spaces/server/routes/api/external/get_shareable_references.ts @@ -12,12 +12,13 @@ import { wrapError } from '../../../lib/errors'; import { createLicensedRouteHandler } from '../../lib'; export function initGetShareableReferencesApi(deps: ExternalRouteDeps) { - const { router, getStartServices } = deps; + const { router, getStartServices, isServerless } = deps; router.post( { path: '/api/spaces/_get_shareable_references', options: { + access: isServerless ? 'internal' : 'public', description: `Get shareable references`, }, validate: { diff --git a/x-pack/plugins/spaces/server/routes/api/external/post.ts b/x-pack/plugins/spaces/server/routes/api/external/post.ts index 31dda1285f06a..db3cc2c1cdcae 100644 --- a/x-pack/plugins/spaces/server/routes/api/external/post.ts +++ b/x-pack/plugins/spaces/server/routes/api/external/post.ts @@ -21,6 +21,7 @@ export function initPostSpacesApi(deps: ExternalRouteDeps) { { path: '/api/spaces/space', options: { + access: isServerless ? 'internal' : 'public', description: `Create a space`, }, validate: { diff --git a/x-pack/plugins/spaces/server/routes/api/external/put.ts b/x-pack/plugins/spaces/server/routes/api/external/put.ts index e1defabee7103..4612aedb4c151 100644 --- a/x-pack/plugins/spaces/server/routes/api/external/put.ts +++ b/x-pack/plugins/spaces/server/routes/api/external/put.ts @@ -21,6 +21,7 @@ export function initPutSpacesApi(deps: ExternalRouteDeps) { { path: '/api/spaces/space/{id}', options: { + access: isServerless ? 'internal' : 'public', description: `Update a space`, }, validate: { diff --git a/x-pack/plugins/spaces/server/routes/api/external/update_objects_spaces.ts b/x-pack/plugins/spaces/server/routes/api/external/update_objects_spaces.ts index 8222ceba0813c..68b89d0934cf1 100644 --- a/x-pack/plugins/spaces/server/routes/api/external/update_objects_spaces.ts +++ b/x-pack/plugins/spaces/server/routes/api/external/update_objects_spaces.ts @@ -14,7 +14,7 @@ import { SPACE_ID_REGEX } from '../../../lib/space_schema'; import { createLicensedRouteHandler } from '../../lib'; export function initUpdateObjectsSpacesApi(deps: ExternalRouteDeps) { - const { router, getStartServices } = deps; + const { router, getStartServices, isServerless } = deps; const spacesSchema = schema.arrayOf( schema.string({ @@ -37,6 +37,7 @@ export function initUpdateObjectsSpacesApi(deps: ExternalRouteDeps) { { path: '/api/spaces/_update_objects_spaces', options: { + access: isServerless ? 'internal' : 'public', description: `Update saved objects in spaces`, }, validate: { From 92da1767f3bab00f5b7abca16daec06e2314302b Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Mon, 23 Sep 2024 09:21:37 -0600 Subject: [PATCH 02/41] [dashboard] Migrate Dashboard internal components to DashboardApi (#193220) PR replaces `useDashboardContainer` with `useDashboardApi`. `useDashboardApi` returns `DashboardApi` instead of `DashboardContainer`. After this PR, all react context's in dashboard return `DashboardApi` and thus all components are now prepared for the migration from DashboardContainer to DashboardApi. --------- Co-authored-by: Hannah Mudge Co-authored-by: Elastic Machine --- .../dashboard/public/dashboard_api/types.ts | 33 +++++- .../top_nav/use_dashboard_menu_items.tsx | 5 +- .../dashboard_empty_screen.test.tsx | 9 +- .../empty_screen/dashboard_empty_screen.tsx | 28 +++-- .../component/grid/dashboard_grid.test.tsx | 76 +++++++------ .../component/grid/dashboard_grid.tsx | 29 ++--- .../grid/dashboard_grid_item.test.tsx | 11 +- .../component/grid/dashboard_grid_item.tsx | 44 ++++---- .../grid/use_dashboard_grid_settings.tsx | 11 +- .../component/settings/settings_flyout.tsx | 45 ++++---- .../component/viewport/dashboard_viewport.tsx | 60 ++++++---- .../embeddable/api/index.ts | 2 +- ..._settings.tsx => open_settings_flyout.tsx} | 20 ++-- .../embeddable/dashboard_container.tsx | 104 ++++++++++++++---- .../internal_dashboard_top_nav.tsx | 3 +- 15 files changed, 299 insertions(+), 181 deletions(-) rename src/plugins/dashboard/public/dashboard_container/embeddable/api/{show_settings.tsx => open_settings_flyout.tsx} (68%) diff --git a/src/plugins/dashboard/public/dashboard_api/types.ts b/src/plugins/dashboard/public/dashboard_api/types.ts index 4760d2fd95301..01d12c27ce443 100644 --- a/src/plugins/dashboard/public/dashboard_api/types.ts +++ b/src/plugins/dashboard/public/dashboard_api/types.ts @@ -9,13 +9,17 @@ import { CanExpandPanels, + HasRuntimeChildState, + HasSerializedChildState, PresentationContainer, + SerializedPanelState, TracksOverlays, } from '@kbn/presentation-containers'; import { HasAppContext, HasType, PublishesDataViews, + PublishesPanelDescription, PublishesPanelTitle, PublishesSavedObjectId, PublishesUnifiedSearch, @@ -23,41 +27,64 @@ import { PublishingSubject, ViewMode, } from '@kbn/presentation-publishing'; -import { ControlGroupApi } from '@kbn/controls-plugin/public'; +import { ControlGroupApi, ControlGroupSerializedState } from '@kbn/controls-plugin/public'; import { Filter, Query, TimeRange } from '@kbn/es-query'; +import { DefaultEmbeddableApi, ErrorEmbeddable, IEmbeddable } from '@kbn/embeddable-plugin/public'; import { DashboardPanelMap, DashboardPanelState } from '../../common'; import { SaveDashboardReturn } from '../services/dashboard_content_management/types'; +import { DashboardStateFromSettingsFlyout, UnsavedPanelState } from '../dashboard_container/types'; export type DashboardApi = CanExpandPanels & HasAppContext & + HasRuntimeChildState & + HasSerializedChildState & HasType<'dashboard'> & PresentationContainer & PublishesDataViews & + PublishesPanelDescription & Pick & PublishesSavedObjectId & PublishesUnifiedSearch & PublishesViewMode & TracksOverlays & { addFromLibrary: () => void; + animatePanelTransforms$: PublishingSubject; asyncResetToLastSavedState: () => Promise; controlGroupApi$: PublishingSubject; + embeddedExternally$: PublishingSubject; fullScreenMode$: PublishingSubject; focusedPanelId$: PublishingSubject; forceRefresh: () => void; + getRuntimeStateForControlGroup: () => UnsavedPanelState | undefined; + getSerializedStateForControlGroup: () => SerializedPanelState; + getSettings: () => DashboardStateFromSettingsFlyout; getDashboardPanelFromId: (id: string) => Promise; - getPanelsState: () => DashboardPanelMap; hasOverlays$: PublishingSubject; hasRunMigrations$: PublishingSubject; hasUnsavedChanges$: PublishingSubject; + highlightPanel: (panelRef: HTMLDivElement) => void; + highlightPanelId$: PublishingSubject; managed$: PublishingSubject; + panels$: PublishingSubject; + registerChildApi: (api: DefaultEmbeddableApi) => void; runInteractiveSave: (interactionMode: ViewMode) => Promise; runQuickSave: () => Promise; + scrollToPanel: (panelRef: HTMLDivElement) => void; + scrollToPanelId$: PublishingSubject; scrollToTop: () => void; + setControlGroupApi: (controlGroupApi: ControlGroupApi) => void; + setSettings: (settings: DashboardStateFromSettingsFlyout) => void; setFilters: (filters?: Filter[] | undefined) => void; setFullScreenMode: (fullScreenMode: boolean) => void; + setPanels: (panels: DashboardPanelMap) => void; setQuery: (query?: Query | undefined) => void; setTags: (tags: string[]) => void; setTimeRange: (timeRange?: TimeRange | undefined) => void; setViewMode: (viewMode: ViewMode) => void; - openSettingsFlyout: () => void; + useMargins$: PublishingSubject; + // TODO replace with HasUniqueId once dashboard is refactored and navigateToDashboard is removed + uuid$: PublishingSubject; + + // TODO remove types below this line - from legacy embeddable system + untilEmbeddableLoaded: (id: string) => Promise; }; diff --git a/src/plugins/dashboard/public/dashboard_app/top_nav/use_dashboard_menu_items.tsx b/src/plugins/dashboard/public/dashboard_app/top_nav/use_dashboard_menu_items.tsx index 57bf640a59e20..41ddee24a9330 100644 --- a/src/plugins/dashboard/public/dashboard_app/top_nav/use_dashboard_menu_items.tsx +++ b/src/plugins/dashboard/public/dashboard_app/top_nav/use_dashboard_menu_items.tsx @@ -23,6 +23,7 @@ import { CHANGE_CHECK_DEBOUNCE } from '../../dashboard_constants'; import { confirmDiscardUnsavedChanges } from '../../dashboard_listing/confirm_overlays'; import { SaveDashboardReturn } from '../../services/dashboard_content_management/types'; import { useDashboardApi } from '../../dashboard_api/use_dashboard_api'; +import { openSettingsFlyout } from '../../dashboard_container/embeddable/api'; export const useDashboardMenuItems = ({ isLabsShown, @@ -84,7 +85,7 @@ export const useDashboardMenuItems = ({ anchorElement, savedObjectId: lastSavedId, isDirty: Boolean(hasUnsavedChanges), - getPanelsState: dashboardApi.getPanelsState, + getPanelsState: () => dashboardApi.panels$.value, }); }, [dashboardTitle, hasUnsavedChanges, lastSavedId, dashboardApi] @@ -227,7 +228,7 @@ export const useDashboardMenuItems = ({ id: 'settings', testId: 'dashboardSettingsButton', disableButton: disableTopNav, - run: () => dashboardApi.openSettingsFlyout(), + run: () => openSettingsFlyout(dashboardApi), }, }; }, [ diff --git a/src/plugins/dashboard/public/dashboard_container/component/empty_screen/dashboard_empty_screen.test.tsx b/src/plugins/dashboard/public/dashboard_container/component/empty_screen/dashboard_empty_screen.test.tsx index 3ba77bd29d768..4204953e22696 100644 --- a/src/plugins/dashboard/public/dashboard_container/component/empty_screen/dashboard_empty_screen.test.tsx +++ b/src/plugins/dashboard/public/dashboard_container/component/empty_screen/dashboard_empty_screen.test.tsx @@ -14,7 +14,8 @@ import { findTestSubject } from '@elastic/eui/lib/test'; import { buildMockDashboard } from '../../../mocks'; import { DashboardEmptyScreen } from './dashboard_empty_screen'; import { pluginServices } from '../../../services/plugin_services'; -import { DashboardContainerContext } from '../../embeddable/dashboard_container'; +import { DashboardContext } from '../../../dashboard_api/use_dashboard_api'; +import { DashboardApi } from '../../../dashboard_api/types'; import { ViewMode } from '@kbn/embeddable-plugin/public'; pluginServices.getServices().visualizations.getAliases = jest @@ -23,11 +24,11 @@ pluginServices.getServices().visualizations.getAliases = jest describe('DashboardEmptyScreen', () => { function mountComponent(viewMode: ViewMode) { - const dashboardContainer = buildMockDashboard({ overrides: { viewMode } }); + const dashboardApi = buildMockDashboard({ overrides: { viewMode } }) as DashboardApi; return mountWithIntl( - + - + ); } diff --git a/src/plugins/dashboard/public/dashboard_container/component/empty_screen/dashboard_empty_screen.tsx b/src/plugins/dashboard/public/dashboard_container/component/empty_screen/dashboard_empty_screen.tsx index 60dba3f3f6266..e619c1911d365 100644 --- a/src/plugins/dashboard/public/dashboard_container/component/empty_screen/dashboard_empty_screen.tsx +++ b/src/plugins/dashboard/public/dashboard_container/component/empty_screen/dashboard_empty_screen.tsx @@ -22,9 +22,10 @@ import { import { METRIC_TYPE } from '@kbn/analytics'; import { ViewMode } from '@kbn/embeddable-plugin/public'; +import { useStateFromPublishingSubject } from '@kbn/presentation-publishing'; import { DASHBOARD_UI_METRIC_ID } from '../../../dashboard_constants'; import { pluginServices } from '../../../services/plugin_services'; -import { useDashboardContainer } from '../../embeddable/dashboard_container'; +import { useDashboardApi } from '../../../dashboard_api/use_dashboard_api'; import { emptyScreenStrings } from '../../_dashboard_container_strings'; export function DashboardEmptyScreen() { @@ -45,13 +46,19 @@ export function DashboardEmptyScreen() { [getVisTypeAliases] ); - const dashboardContainer = useDashboardContainer(); + const dashboardApi = useDashboardApi(); const isDarkTheme = useObservable(theme$)?.darkMode; - const isEditMode = - dashboardContainer.select((state) => state.explicitInput.viewMode) === ViewMode.EDIT; - const embeddableAppContext = dashboardContainer.getAppContext(); - const originatingPath = embeddableAppContext?.getCurrentPath?.() ?? ''; - const originatingApp = embeddableAppContext?.currentAppId; + const viewMode = useStateFromPublishingSubject(dashboardApi.viewMode); + const isEditMode = useMemo(() => { + return viewMode === 'edit'; + }, [viewMode]); + const { originatingPath, originatingApp } = useMemo(() => { + const appContext = dashboardApi.getAppContext(); + return { + originatingApp: appContext?.currentAppId, + originatingPath: appContext?.getCurrentPath?.() ?? '', + }; + }, [dashboardApi]); const goToLens = useCallback(() => { if (!lensAlias || !lensAlias.alias) return; @@ -128,7 +135,7 @@ export function DashboardEmptyScreen() { dashboardContainer.addFromLibrary()} + onClick={() => dashboardApi.addFromLibrary()} > {emptyScreenStrings.getAddFromLibraryButtonTitle()} @@ -138,10 +145,7 @@ export function DashboardEmptyScreen() { } if (showWriteControls) { return ( - dashboardContainer.dispatch.setViewMode(ViewMode.EDIT)} - > + dashboardApi.setViewMode(ViewMode.EDIT)}> {emptyScreenStrings.getEditLinkTitle()} ); diff --git a/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid.test.tsx b/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid.test.tsx index dc1d7f4671ce1..b91e972dffa88 100644 --- a/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid.test.tsx +++ b/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid.test.tsx @@ -15,7 +15,9 @@ import { CONTACT_CARD_EMBEDDABLE } from '@kbn/embeddable-plugin/public/lib/test_ import { DashboardGrid } from './dashboard_grid'; import { buildMockDashboard } from '../../../mocks'; import type { Props as DashboardGridItemProps } from './dashboard_grid_item'; -import { DashboardContainerContext } from '../../embeddable/dashboard_container'; +import { DashboardContext } from '../../../dashboard_api/use_dashboard_api'; +import { DashboardApi } from '../../../dashboard_api/types'; +import { DashboardPanelMap } from '../../../../common'; jest.mock('./dashboard_grid_item', () => { return { @@ -45,59 +47,62 @@ jest.mock('./dashboard_grid_item', () => { }; }); -const createAndMountDashboardGrid = async () => { +const PANELS = { + '1': { + gridData: { x: 0, y: 0, w: 6, h: 6, i: '1' }, + type: CONTACT_CARD_EMBEDDABLE, + explicitInput: { id: '1' }, + }, + '2': { + gridData: { x: 6, y: 6, w: 6, h: 6, i: '2' }, + type: CONTACT_CARD_EMBEDDABLE, + explicitInput: { id: '2' }, + }, +}; + +const createAndMountDashboardGrid = async (panels: DashboardPanelMap = PANELS) => { const dashboardContainer = buildMockDashboard({ overrides: { - panels: { - '1': { - gridData: { x: 0, y: 0, w: 6, h: 6, i: '1' }, - type: CONTACT_CARD_EMBEDDABLE, - explicitInput: { id: '1' }, - }, - '2': { - gridData: { x: 6, y: 6, w: 6, h: 6, i: '2' }, - type: CONTACT_CARD_EMBEDDABLE, - explicitInput: { id: '2' }, - }, - }, + panels, }, }); await dashboardContainer.untilContainerInitialized(); const component = mountWithIntl( - + - + ); - return { dashboardContainer, component }; + return { dashboardApi: dashboardContainer, component }; }; test('renders DashboardGrid', async () => { - const { component } = await createAndMountDashboardGrid(); + const { component } = await createAndMountDashboardGrid(PANELS); const panelElements = component.find('GridItem'); expect(panelElements.length).toBe(2); }); test('renders DashboardGrid with no visualizations', async () => { - const { dashboardContainer, component } = await createAndMountDashboardGrid(); - dashboardContainer.updateInput({ panels: {} }); - component.update(); + const { component } = await createAndMountDashboardGrid({}); expect(component.find('GridItem').length).toBe(0); }); test('DashboardGrid removes panel when removed from container', async () => { - const { dashboardContainer, component } = await createAndMountDashboardGrid(); - const originalPanels = dashboardContainer.getInput().panels; - const filteredPanels = { ...originalPanels }; - delete filteredPanels['1']; - dashboardContainer.updateInput({ panels: filteredPanels }); + const { dashboardApi, component } = await createAndMountDashboardGrid(PANELS); + expect(component.find('GridItem').length).toBe(2); + + dashboardApi.setPanels({ + '2': PANELS['2'], + }); + await new Promise((resolve) => setTimeout(resolve, 1)); component.update(); - const panelElements = component.find('GridItem'); - expect(panelElements.length).toBe(1); + + expect(component.find('GridItem').length).toBe(1); }); test('DashboardGrid renders expanded panel', async () => { - const { dashboardContainer, component } = await createAndMountDashboardGrid(); - dashboardContainer.setExpandedPanelId('1'); + const { dashboardApi, component } = await createAndMountDashboardGrid(); + dashboardApi.setExpandedPanelId('1'); + await new Promise((resolve) => setTimeout(resolve, 1)); component.update(); // Both panels should still exist in the dom, so nothing needs to be re-fetched once minimized. expect(component.find('GridItem').length).toBe(2); @@ -105,7 +110,8 @@ test('DashboardGrid renders expanded panel', async () => { expect(component.find('#mockDashboardGridItem_1').hasClass('expandedPanel')).toBe(true); expect(component.find('#mockDashboardGridItem_2').hasClass('hiddenPanel')).toBe(true); - dashboardContainer.setExpandedPanelId(); + dashboardApi.setExpandedPanelId(); + await new Promise((resolve) => setTimeout(resolve, 1)); component.update(); expect(component.find('GridItem').length).toBe(2); @@ -114,8 +120,9 @@ test('DashboardGrid renders expanded panel', async () => { }); test('DashboardGrid renders focused panel', async () => { - const { dashboardContainer, component } = await createAndMountDashboardGrid(); - dashboardContainer.setFocusedPanelId('2'); + const { dashboardApi, component } = await createAndMountDashboardGrid(); + dashboardApi.setFocusedPanelId('2'); + await new Promise((resolve) => setTimeout(resolve, 1)); component.update(); // Both panels should still exist in the dom, so nothing needs to be re-fetched once minimized. expect(component.find('GridItem').length).toBe(2); @@ -123,7 +130,8 @@ test('DashboardGrid renders focused panel', async () => { expect(component.find('#mockDashboardGridItem_1').hasClass('blurredPanel')).toBe(true); expect(component.find('#mockDashboardGridItem_2').hasClass('focusedPanel')).toBe(true); - dashboardContainer.setFocusedPanelId(undefined); + dashboardApi.setFocusedPanelId(undefined); + await new Promise((resolve) => setTimeout(resolve, 1)); component.update(); expect(component.find('GridItem').length).toBe(2); diff --git a/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid.tsx b/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid.tsx index d10f614cc191e..577661b393c67 100644 --- a/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid.tsx +++ b/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid.tsx @@ -17,23 +17,26 @@ import { Layout, Responsive as ResponsiveReactGridLayout } from 'react-grid-layo import { ViewMode } from '@kbn/embeddable-plugin/public'; +import { useBatchedPublishingSubjects } from '@kbn/presentation-publishing'; import { DashboardPanelState } from '../../../../common'; import { DashboardGridItem } from './dashboard_grid_item'; import { useDashboardGridSettings } from './use_dashboard_grid_settings'; -import { useDashboardContainer } from '../../embeddable/dashboard_container'; +import { useDashboardApi } from '../../../dashboard_api/use_dashboard_api'; import { getPanelLayoutsAreEqual } from '../../state/diffing/dashboard_diffing_utils'; import { DASHBOARD_GRID_HEIGHT, DASHBOARD_MARGIN_SIZE } from '../../../dashboard_constants'; export const DashboardGrid = ({ viewportWidth }: { viewportWidth: number }) => { - const dashboard = useDashboardContainer(); - const panels = dashboard.select((state) => state.explicitInput.panels); - const viewMode = dashboard.select((state) => state.explicitInput.viewMode); - const useMargins = dashboard.select((state) => state.explicitInput.useMargins); - const expandedPanelId = dashboard.select((state) => state.componentState.expandedPanelId); - const focusedPanelId = dashboard.select((state) => state.componentState.focusedPanelId); - const animatePanelTransforms = dashboard.select( - (state) => state.componentState.animatePanelTransforms - ); + const dashboardApi = useDashboardApi(); + + const [animatePanelTransforms, expandedPanelId, focusedPanelId, panels, useMargins, viewMode] = + useBatchedPublishingSubjects( + dashboardApi.animatePanelTransforms$, + dashboardApi.expandedPanelId, + dashboardApi.focusedPanelId$, + dashboardApi.panels$, + dashboardApi.useMargins$, + dashboardApi.viewMode + ); /** * Track panel maximized state delayed by one tick and use it to prevent @@ -96,10 +99,10 @@ export const DashboardGrid = ({ viewportWidth }: { viewportWidth: number }) => { {} as { [key: string]: DashboardPanelState } ); if (!getPanelLayoutsAreEqual(panels, updatedPanels)) { - dashboard.dispatch.setPanels(updatedPanels); + dashboardApi.setPanels(updatedPanels); } }, - [dashboard, panels, viewMode] + [dashboardApi, panels, viewMode] ); const classes = classNames({ @@ -110,7 +113,7 @@ export const DashboardGrid = ({ viewportWidth }: { viewportWidth: number }) => { 'dshLayout-isMaximizedPanel': expandedPanelId !== undefined, }); - const { layouts, breakpoints, columns } = useDashboardGridSettings(panelsInOrder); + const { layouts, breakpoints, columns } = useDashboardGridSettings(panelsInOrder, panels); // in print mode, dashboard layout is not controlled by React Grid Layout if (viewMode === ViewMode.PRINT) { diff --git a/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid_item.test.tsx b/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid_item.test.tsx index 6f8c1452c8045..416448f6d8132 100644 --- a/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid_item.test.tsx +++ b/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid_item.test.tsx @@ -14,7 +14,8 @@ import { CONTACT_CARD_EMBEDDABLE } from '@kbn/embeddable-plugin/public/lib/test_ import { buildMockDashboard } from '../../../mocks'; import { Item, Props as DashboardGridItemProps } from './dashboard_grid_item'; -import { DashboardContainerContext } from '../../embeddable/dashboard_container'; +import { DashboardContext } from '../../../dashboard_api/use_dashboard_api'; +import { DashboardApi } from '../../../dashboard_api/types'; jest.mock('@kbn/embeddable-plugin/public', () => { const original = jest.requireActual('@kbn/embeddable-plugin/public'); @@ -44,14 +45,14 @@ const createAndMountDashboardGridItem = (props: DashboardGridItemProps) => { explicitInput: { id: '2' }, }, }; - const dashboardContainer = buildMockDashboard({ overrides: { panels } }); + const dashboardApi = buildMockDashboard({ overrides: { panels } }) as DashboardApi; const component = mountWithIntl( - + - + ); - return { dashboardContainer, component }; + return { dashboardApi, component }; }; test('renders Item', async () => { diff --git a/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid_item.tsx b/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid_item.tsx index fdc0487f17265..0a116eae997d4 100644 --- a/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid_item.tsx +++ b/src/plugins/dashboard/public/dashboard_container/component/grid/dashboard_grid_item.tsx @@ -9,12 +9,13 @@ import { EuiLoadingChart } from '@elastic/eui'; import { css } from '@emotion/react'; -import { EmbeddablePanel, ReactEmbeddableRenderer, ViewMode } from '@kbn/embeddable-plugin/public'; +import { EmbeddablePanel, ReactEmbeddableRenderer } from '@kbn/embeddable-plugin/public'; import classNames from 'classnames'; import React, { useEffect, useLayoutEffect, useMemo, useRef, useState } from 'react'; +import { useBatchedPublishingSubjects } from '@kbn/presentation-publishing'; import { DashboardPanelState } from '../../../../common'; import { pluginServices } from '../../../services/plugin_services'; -import { useDashboardContainer } from '../../embeddable/dashboard_container'; +import { useDashboardApi } from '../../../dashboard_api/use_dashboard_api'; type DivProps = Pick, 'className' | 'style' | 'children'>; @@ -45,10 +46,13 @@ export const Item = React.forwardRef( }, ref ) => { - const container = useDashboardContainer(); - const scrollToPanelId = container.select((state) => state.componentState.scrollToPanelId); - const highlightPanelId = container.select((state) => state.componentState.highlightPanelId); - const useMargins = container.select((state) => state.explicitInput.useMargins); + const dashboardApi = useDashboardApi(); + const [highlightPanelId, scrollToPanelId, useMargins, viewMode] = useBatchedPublishingSubjects( + dashboardApi.highlightPanelId$, + dashboardApi.scrollToPanelId$, + dashboardApi.useMargins$, + dashboardApi.viewMode + ); const expandPanel = expandedPanelId !== undefined && expandedPanelId === id; const hidePanel = expandedPanelId !== undefined && expandedPanelId !== id; @@ -60,17 +64,17 @@ export const Item = React.forwardRef( 'dshDashboardGrid__item--focused': focusPanel, 'dshDashboardGrid__item--blurred': blurPanel, // eslint-disable-next-line @typescript-eslint/naming-convention - printViewport__vis: container.getInput().viewMode === ViewMode.PRINT, + printViewport__vis: viewMode === 'print', }); useLayoutEffect(() => { if (typeof ref !== 'function' && ref?.current) { const panelRef = ref.current; if (scrollToPanelId === id) { - container.scrollToPanel(panelRef); + dashboardApi.scrollToPanel(panelRef); } if (highlightPanelId === id) { - container.highlightPanel(panelRef); + dashboardApi.highlightPanel(panelRef); } panelRef.querySelectorAll('*').forEach((e) => { @@ -83,7 +87,7 @@ export const Item = React.forwardRef( } }); } - }, [id, container, scrollToPanelId, highlightPanelId, ref, blurPanel]); + }, [id, dashboardApi, scrollToPanelId, highlightPanelId, ref, blurPanel]); const focusStyles = blurPanel ? css` @@ -110,10 +114,10 @@ export const Item = React.forwardRef( container} + getParentApi={() => dashboardApi} key={`${type}_${id}`} panelProps={panelProps} - onApiAvailable={(api) => container.registerChildApi(api)} + onApiAvailable={(api) => dashboardApi.registerChildApi(api)} /> ); } @@ -122,11 +126,11 @@ export const Item = React.forwardRef( container.untilEmbeddableLoaded(id)} + embeddable={() => dashboardApi.untilEmbeddableLoaded(id)} {...panelProps} /> ); - }, [id, container, type, index, useMargins]); + }, [id, dashboardApi, type, index, useMargins]); return (
((props, const { settings: { isProjectEnabledInLabs }, } = pluginServices.getServices(); - const container = useDashboardContainer(); - const focusedPanelId = container.select((state) => state.componentState.focusedPanelId); - - const dashboard = useDashboardContainer(); + const dashboardApi = useDashboardApi(); + const [focusedPanelId, viewMode] = useBatchedPublishingSubjects( + dashboardApi.focusedPanelId$, + dashboardApi.viewMode + ); - const isPrintMode = dashboard.select((state) => state.explicitInput.viewMode) === ViewMode.PRINT; const isEnabled = - !isPrintMode && + viewMode !== 'print' && isProjectEnabledInLabs('labs:dashboard:deferBelowFold') && (!focusedPanelId || focusedPanelId === props.id); diff --git a/src/plugins/dashboard/public/dashboard_container/component/grid/use_dashboard_grid_settings.tsx b/src/plugins/dashboard/public/dashboard_container/component/grid/use_dashboard_grid_settings.tsx index e31718654119f..155d7022141db 100644 --- a/src/plugins/dashboard/public/dashboard_container/component/grid/use_dashboard_grid_settings.tsx +++ b/src/plugins/dashboard/public/dashboard_container/component/grid/use_dashboard_grid_settings.tsx @@ -12,15 +12,16 @@ import { useMemo } from 'react'; import { useEuiTheme } from '@elastic/eui'; import { ViewMode } from '@kbn/embeddable-plugin/public'; +import { useStateFromPublishingSubject } from '@kbn/presentation-publishing'; +import { DashboardPanelMap } from '../../../../common'; import { DASHBOARD_GRID_COLUMN_COUNT } from '../../../dashboard_constants'; -import { useDashboardContainer } from '../../embeddable/dashboard_container'; +import { useDashboardApi } from '../../../dashboard_api/use_dashboard_api'; -export const useDashboardGridSettings = (panelsInOrder: string[]) => { - const dashboard = useDashboardContainer(); +export const useDashboardGridSettings = (panelsInOrder: string[], panels: DashboardPanelMap) => { + const dashboardApi = useDashboardApi(); const { euiTheme } = useEuiTheme(); - const panels = dashboard.select((state) => state.explicitInput.panels); - const viewMode = dashboard.select((state) => state.explicitInput.viewMode); + const viewMode = useStateFromPublishingSubject(dashboardApi.viewMode); const layouts = useMemo(() => { return { diff --git a/src/plugins/dashboard/public/dashboard_container/component/settings/settings_flyout.tsx b/src/plugins/dashboard/public/dashboard_container/component/settings/settings_flyout.tsx index 635f0ac5f4309..d4160d7002949 100644 --- a/src/plugins/dashboard/public/dashboard_container/component/settings/settings_flyout.tsx +++ b/src/plugins/dashboard/public/dashboard_container/component/settings/settings_flyout.tsx @@ -31,7 +31,7 @@ import { import { FormattedMessage } from '@kbn/i18n-react'; import { DashboardContainerInput } from '../../../../common'; import { pluginServices } from '../../../services/plugin_services'; -import { useDashboardContainer } from '../../embeddable/dashboard_container'; +import { useDashboardApi } from '../../../dashboard_api/use_dashboard_api'; interface DashboardSettingsProps { onClose: () => void; @@ -45,19 +45,14 @@ export const DashboardSettings = ({ onClose }: DashboardSettingsProps) => { dashboardContentManagement: { checkForDuplicateDashboardTitle }, } = pluginServices.getServices(); - const dashboard = useDashboardContainer(); + const dashboardApi = useDashboardApi(); - const [dashboardSettingsState, setDashboardSettingsState] = useState({ - ...dashboard.getInput(), - }); + const [localSettings, setLocalSettings] = useState(dashboardApi.getSettings()); const [isTitleDuplicate, setIsTitleDuplicate] = useState(false); const [isTitleDuplicateConfirmed, setIsTitleDuplicateConfirmed] = useState(false); const [isApplying, setIsApplying] = useState(false); - const lastSavedId = dashboard.select((state) => state.componentState.lastSavedId); - const lastSavedTitle = dashboard.select((state) => state.explicitInput.title); - const isMounted = useMountedState(); const onTitleDuplicate = () => { @@ -69,9 +64,9 @@ export const DashboardSettings = ({ onClose }: DashboardSettingsProps) => { const onApply = async () => { setIsApplying(true); const validTitle = await checkForDuplicateDashboardTitle({ - title: dashboardSettingsState.title, + title: localSettings.title, copyOnSave: false, - lastSavedTitle, + lastSavedTitle: dashboardApi.panelTitle.value ?? '', onTitleDuplicate, isTitleDuplicateConfirmed, }); @@ -81,15 +76,15 @@ export const DashboardSettings = ({ onClose }: DashboardSettingsProps) => { setIsApplying(false); if (validTitle) { - dashboard.dispatch.setStateFromSettingsFlyout({ lastSavedId, ...dashboardSettingsState }); + dashboardApi.setSettings(localSettings); onClose(); } }; const updateDashboardSetting = useCallback((newSettings: Partial) => { - setDashboardSettingsState((prevDashboardSettingsState) => { + setLocalSettings((prevSettings) => { return { - ...prevDashboardSettingsState, + ...prevSettings, ...newSettings, }; }); @@ -117,7 +112,7 @@ export const DashboardSettings = ({ onClose }: DashboardSettingsProps) => { id="dashboard.embeddableApi.showSettings.flyout.form.duplicateTitleDescription" defaultMessage="Saving ''{title}'' creates a duplicate title." values={{ - title: dashboardSettingsState.title, + title: localSettings.title, }} />

@@ -137,7 +132,7 @@ export const DashboardSettings = ({ onClose }: DashboardSettingsProps) => { } > updateDashboardSetting({ tags: selectedTags })} /> @@ -173,7 +168,7 @@ export const DashboardSettings = ({ onClose }: DashboardSettingsProps) => { data-test-subj="dashboardTitleInput" name="title" type="text" - value={dashboardSettingsState.title} + value={localSettings.title} onChange={(event) => { setIsTitleDuplicate(false); setIsTitleDuplicateConfirmed(false); @@ -201,7 +196,7 @@ export const DashboardSettings = ({ onClose }: DashboardSettingsProps) => { className="dashboardDescriptionInputText" data-test-subj="dashboardDescriptionInput" name="description" - value={dashboardSettingsState.description ?? ''} + value={localSettings.description ?? ''} onChange={(event) => updateDashboardSetting({ description: event.target.value })} aria-label={i18n.translate( 'dashboard.embeddableApi.showSettings.flyout.form.panelDescriptionAriaLabel', @@ -222,7 +217,7 @@ export const DashboardSettings = ({ onClose }: DashboardSettingsProps) => { > updateDashboardSetting({ timeRestore: event.target.checked })} label={ { defaultMessage: 'Use margins between panels', } )} - checked={dashboardSettingsState.useMargins} + checked={localSettings.useMargins} onChange={(event) => updateDashboardSetting({ useMargins: event.target.checked })} data-test-subj="dashboardMarginsCheckbox" /> @@ -254,7 +249,7 @@ export const DashboardSettings = ({ onClose }: DashboardSettingsProps) => { defaultMessage: 'Show panel titles', } )} - checked={!dashboardSettingsState.hidePanelTitles} + checked={!localSettings.hidePanelTitles} onChange={(event) => updateDashboardSetting({ hidePanelTitles: !event.target.checked }) } @@ -313,7 +308,7 @@ export const DashboardSettings = ({ onClose }: DashboardSettingsProps) => { /> } - checked={dashboardSettingsState.syncColors} + checked={localSettings.syncColors} onChange={(event) => updateDashboardSetting({ syncColors: event.target.checked })} data-test-subj="dashboardSyncColorsCheckbox" /> @@ -326,10 +321,10 @@ export const DashboardSettings = ({ onClose }: DashboardSettingsProps) => { defaultMessage: 'Sync cursor across panels', } )} - checked={dashboardSettingsState.syncCursor} + checked={localSettings.syncCursor} onChange={(event) => { const syncCursor = event.target.checked; - if (!syncCursor && dashboardSettingsState.syncTooltips) { + if (!syncCursor && localSettings.syncTooltips) { updateDashboardSetting({ syncCursor, syncTooltips: false }); } else { updateDashboardSetting({ syncCursor }); @@ -346,8 +341,8 @@ export const DashboardSettings = ({ onClose }: DashboardSettingsProps) => { defaultMessage: 'Sync tooltips across panels', } )} - checked={dashboardSettingsState.syncTooltips} - disabled={!Boolean(dashboardSettingsState.syncCursor)} + checked={localSettings.syncTooltips} + disabled={!Boolean(localSettings.syncCursor)} onChange={(event) => updateDashboardSetting({ syncTooltips: event.target.checked }) } diff --git a/src/plugins/dashboard/public/dashboard_container/component/viewport/dashboard_viewport.tsx b/src/plugins/dashboard/public/dashboard_container/component/viewport/dashboard_viewport.tsx index 488f0ba99c098..1e4e0822f7ce8 100644 --- a/src/plugins/dashboard/public/dashboard_container/component/viewport/dashboard_viewport.tsx +++ b/src/plugins/dashboard/public/dashboard_container/component/viewport/dashboard_viewport.tsx @@ -22,9 +22,9 @@ import { ControlGroupSerializedState, } from '@kbn/controls-plugin/public'; import { CONTROL_GROUP_TYPE } from '@kbn/controls-plugin/common'; -import { useStateFromPublishingSubject } from '@kbn/presentation-publishing'; +import { useBatchedPublishingSubjects } from '@kbn/presentation-publishing'; import { DashboardGrid } from '../grid'; -import { useDashboardContainer } from '../../embeddable/dashboard_container'; +import { useDashboardApi } from '../../../dashboard_api/use_dashboard_api'; import { DashboardEmptyScreen } from '../empty_screen/dashboard_empty_screen'; export const useDebouncedWidthObserver = (skipDebounce = false, wait = 100) => { @@ -42,17 +42,33 @@ export const useDebouncedWidthObserver = (skipDebounce = false, wait = 100) => { }; export const DashboardViewportComponent = () => { - const dashboard = useDashboardContainer(); - - const controlGroupApi = useStateFromPublishingSubject(dashboard.controlGroupApi$); - const panelCount = Object.keys(dashboard.select((state) => state.explicitInput.panels)).length; + const dashboardApi = useDashboardApi(); const [hasControls, setHasControls] = useState(false); - const viewMode = dashboard.select((state) => state.explicitInput.viewMode); - const dashboardTitle = dashboard.select((state) => state.explicitInput.title); - const useMargins = dashboard.select((state) => state.explicitInput.useMargins); - const description = dashboard.select((state) => state.explicitInput.description); - const focusedPanelId = dashboard.select((state) => state.componentState.focusedPanelId); - const expandedPanelId = dashboard.select((state) => state.componentState.expandedPanelId); + const [ + controlGroupApi, + dashboardTitle, + description, + expandedPanelId, + focusedPanelId, + panels, + viewMode, + useMargins, + uuid, + ] = useBatchedPublishingSubjects( + dashboardApi.controlGroupApi$, + dashboardApi.panelTitle, + dashboardApi.panelDescription, + dashboardApi.expandedPanelId, + dashboardApi.focusedPanelId$, + dashboardApi.panels$, + dashboardApi.viewMode, + dashboardApi.useMargins$, + dashboardApi.uuid$ + ); + + const panelCount = useMemo(() => { + return Object.keys(panels).length; + }, [panels]); const { ref: resizeRef, width: viewportWidth } = useDebouncedWidthObserver(!!focusedPanelId); @@ -104,19 +120,19 @@ export const DashboardViewportComponent = () => { ControlGroupRuntimeState, ControlGroupApi > - key={dashboard.getInput().id} + key={uuid} hidePanelChrome={true} panelProps={{ hideLoader: true }} type={CONTROL_GROUP_TYPE} maybeId={'control_group'} getParentApi={() => { return { - ...dashboard, - getSerializedStateForChild: dashboard.getSerializedStateForControlGroup, - getRuntimeStateForChild: dashboard.getRuntimeStateForControlGroup, + ...dashboardApi, + getSerializedStateForChild: dashboardApi.getSerializedStateForControlGroup, + getRuntimeStateForChild: dashboardApi.getRuntimeStateForControlGroup, }; }} - onApiAvailable={(api) => dashboard.setControlGroupApi(api)} + onApiAvailable={(api) => dashboardApi.setControlGroupApi(api)} />
) : null} @@ -143,11 +159,11 @@ export const DashboardViewportComponent = () => { // because ExitFullScreenButton sets isFullscreenMode to false on unmount while rerendering. // This specifically fixed maximizing/minimizing panels without exiting fullscreen mode. const WithFullScreenButton = ({ children }: { children: JSX.Element }) => { - const dashboard = useDashboardContainer(); + const dashboardApi = useDashboardApi(); - const isFullScreenMode = dashboard.select((state) => state.componentState.fullScreenMode); - const isEmbeddedExternally = dashboard.select( - (state) => state.componentState.isEmbeddedExternally + const [isFullScreenMode, isEmbeddedExternally] = useBatchedPublishingSubjects( + dashboardApi.fullScreenMode$, + dashboardApi.embeddedExternally$ ); return ( @@ -156,7 +172,7 @@ const WithFullScreenButton = ({ children }: { children: JSX.Element }) => { {isFullScreenMode && ( dashboard.dispatch.setFullScreenMode(false)} + onExit={() => dashboardApi.setFullScreenMode(false)} toggleChrome={!isEmbeddedExternally} /> diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/api/index.ts b/src/plugins/dashboard/public/dashboard_container/embeddable/api/index.ts index 81e8699093fb2..4829a7b61318e 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/api/index.ts +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/api/index.ts @@ -7,7 +7,7 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -export { showSettings } from './show_settings'; +export { openSettingsFlyout } from './open_settings_flyout'; export { addFromLibrary } from './add_panel_from_library'; export { addOrUpdateEmbeddable } from './panel_management'; export { runQuickSave, runInteractiveSave } from './run_save_functions'; diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/api/show_settings.tsx b/src/plugins/dashboard/public/dashboard_container/embeddable/api/open_settings_flyout.tsx similarity index 68% rename from src/plugins/dashboard/public/dashboard_container/embeddable/api/show_settings.tsx rename to src/plugins/dashboard/public/dashboard_container/embeddable/api/open_settings_flyout.tsx index 9433418b0c371..70955ea67d787 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/api/show_settings.tsx +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/api/open_settings_flyout.tsx @@ -13,37 +13,33 @@ import { toMountPoint } from '@kbn/react-kibana-mount'; import { pluginServices } from '../../../services/plugin_services'; import { DashboardSettings } from '../../component/settings/settings_flyout'; -import { DashboardContainer, DashboardContainerContext } from '../dashboard_container'; +import { DashboardContext } from '../../../dashboard_api/use_dashboard_api'; +import { DashboardApi } from '../../../dashboard_api/types'; -export function showSettings(this: DashboardContainer) { +export function openSettingsFlyout(dashboardApi: DashboardApi) { const { analytics, settings: { i18n, theme }, overlays, } = pluginServices.getServices(); - // TODO Move this action into DashboardContainer.openOverlay - this.dispatch.setHasOverlays(true); - - this.openOverlay( + dashboardApi.openOverlay( overlays.openFlyout( toMountPoint( - + { - this.dispatch.setHasOverlays(false); - this.clearOverlays(); + dashboardApi.clearOverlays(); }} /> - , + , { analytics, i18n, theme } ), { size: 's', 'data-test-subj': 'dashboardSettingsFlyout', onClose: (flyout) => { - this.clearOverlays(); - this.dispatch.setHasOverlays(false); + dashboardApi.clearOverlays(); flyout.close(); }, } diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx b/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx index 32262c64d1d06..43f733895f1f5 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx @@ -50,7 +50,7 @@ import { LocatorPublic } from '@kbn/share-plugin/common'; import { ExitFullScreenButtonKibanaProvider } from '@kbn/shared-ux-button-exit-full-screen'; import deepEqual from 'fast-deep-equal'; import { omit } from 'lodash'; -import React, { createContext, useContext } from 'react'; +import React from 'react'; import ReactDOM from 'react-dom'; import { batch } from 'react-redux'; import { BehaviorSubject, Subject, Subscription, first, skipWhile, switchMap } from 'rxjs'; @@ -59,8 +59,13 @@ import { v4 } from 'uuid'; import { PublishesSettings } from '@kbn/presentation-containers/interfaces/publishes_settings'; import { apiHasSerializableState } from '@kbn/presentation-containers/interfaces/serialized_state'; import { ControlGroupApi, ControlGroupSerializedState } from '@kbn/controls-plugin/public'; -import { DashboardLocatorParams, DASHBOARD_CONTAINER_TYPE } from '../..'; -import { DashboardAttributes, DashboardContainerInput, DashboardPanelState } from '../../../common'; +import { DashboardLocatorParams, DASHBOARD_CONTAINER_TYPE, DashboardApi } from '../..'; +import { + DashboardAttributes, + DashboardContainerInput, + DashboardPanelMap, + DashboardPanelState, +} from '../../../common'; import { getReferencesForControls, getReferencesForPanelId, @@ -81,14 +86,13 @@ import { DashboardViewport } from '../component/viewport/dashboard_viewport'; import { getDashboardPanelPlacementSetting } from '../panel_placement/panel_placement_registry'; import { dashboardContainerReducers } from '../state/dashboard_container_reducers'; import { getDiffingMiddleware } from '../state/diffing/dashboard_diffing_integration'; -import { DashboardPublicState, DashboardReduxState, UnsavedPanelState } from '../types'; import { - addFromLibrary, - addOrUpdateEmbeddable, - runQuickSave, - runInteractiveSave, - showSettings, -} from './api'; + DashboardPublicState, + DashboardReduxState, + DashboardStateFromSettingsFlyout, + UnsavedPanelState, +} from '../types'; +import { addFromLibrary, addOrUpdateEmbeddable, runQuickSave, runInteractiveSave } from './api'; import { duplicateDashboardPanel } from './api/duplicate_dashboard_panel'; import { combineDashboardFiltersWithControlGroupFilters, @@ -102,6 +106,7 @@ import { } from './dashboard_container_factory'; import { getPanelAddedSuccessString } from '../../dashboard_app/_dashboard_app_strings'; import { PANELS_CONTROL_GROUP_KEY } from '../../services/dashboard_backup/dashboard_backup_service'; +import { DashboardContext } from '../../dashboard_api/use_dashboard_api'; export interface InheritedChildInput { filters: Filter[]; @@ -124,15 +129,6 @@ type DashboardReduxEmbeddableTools = ReduxEmbeddableTools< typeof dashboardContainerReducers >; -export const DashboardContainerContext = createContext(null); -export const useDashboardContainer = (): DashboardContainer => { - const dashboard = useContext(DashboardContainerContext); - if (dashboard == null) { - throw new Error('useDashboardContainer must be used inside DashboardContainerContext.'); - } - return dashboard!; -}; - export class DashboardContainer extends Container implements @@ -297,6 +293,12 @@ export class DashboardContainer this.dispatch = reduxTools.dispatch; this.select = reduxTools.select; + this.uuid$ = embeddableInputToSubject( + this.publishingSubscription, + this, + 'id' + ) as BehaviorSubject; + this.savedObjectId = new BehaviorSubject(this.getDashboardSavedObjectId()); this.expandedPanelId = new BehaviorSubject(this.getExpandedPanelId()); this.focusedPanelId$ = new BehaviorSubject(this.getState().componentState.focusedPanelId); @@ -307,6 +309,16 @@ export class DashboardContainer ); this.hasUnsavedChanges$ = new BehaviorSubject(this.getState().componentState.hasUnsavedChanges); this.hasOverlays$ = new BehaviorSubject(this.getState().componentState.hasOverlays); + this.useMargins$ = new BehaviorSubject(this.getState().explicitInput.useMargins); + this.scrollToPanelId$ = new BehaviorSubject(this.getState().componentState.scrollToPanelId); + this.highlightPanelId$ = new BehaviorSubject(this.getState().componentState.highlightPanelId); + this.animatePanelTransforms$ = new BehaviorSubject( + this.getState().componentState.animatePanelTransforms + ); + this.panels$ = new BehaviorSubject(this.getState().explicitInput.panels); + this.embeddedExternally$ = new BehaviorSubject( + this.getState().componentState.isEmbeddedExternally + ); this.publishingSubscription.add( this.onStateChange(() => { const state = this.getState(); @@ -334,6 +346,24 @@ export class DashboardContainer if (this.hasOverlays$.value !== state.componentState.hasOverlays) { this.hasOverlays$.next(state.componentState.hasOverlays); } + if (this.useMargins$.value !== state.explicitInput.useMargins) { + this.useMargins$.next(state.explicitInput.useMargins); + } + if (this.scrollToPanelId$.value !== state.componentState.scrollToPanelId) { + this.scrollToPanelId$.next(state.componentState.scrollToPanelId); + } + if (this.highlightPanelId$.value !== state.componentState.highlightPanelId) { + this.highlightPanelId$.next(state.componentState.highlightPanelId); + } + if (this.animatePanelTransforms$.value !== state.componentState.animatePanelTransforms) { + this.animatePanelTransforms$.next(state.componentState.animatePanelTransforms); + } + if (this.embeddedExternally$.value !== state.componentState.isEmbeddedExternally) { + this.embeddedExternally$.next(state.componentState.isEmbeddedExternally); + } + if (this.panels$.value !== state.explicitInput.panels) { + this.panels$.next(state.explicitInput.panels); + } }) ); @@ -452,9 +482,9 @@ export class DashboardContainer - + - + , dom @@ -535,7 +565,6 @@ export class DashboardContainer public runInteractiveSave = runInteractiveSave; public runQuickSave = runQuickSave; - public openSettingsFlyout = showSettings; public addFromLibrary = addFromLibrary; public duplicatePanel(id: string) { @@ -555,6 +584,13 @@ export class DashboardContainer public hasRunMigrations$: BehaviorSubject; public hasUnsavedChanges$: BehaviorSubject; public hasOverlays$: BehaviorSubject; + public useMargins$: BehaviorSubject; + public scrollToPanelId$: BehaviorSubject; + public highlightPanelId$: BehaviorSubject; + public animatePanelTransforms$: BehaviorSubject; + public panels$: BehaviorSubject; + public embeddedExternally$: BehaviorSubject; + public uuid$: BehaviorSubject; public async replacePanel(idToRemove: string, { panelType, initialState }: PanelPackage) { const newId = await this.replaceEmbeddable( @@ -812,6 +848,26 @@ export class DashboardContainer return this.getState().explicitInput.panels; }; + public getSettings = (): DashboardStateFromSettingsFlyout => { + const state = this.getState(); + return { + description: state.explicitInput.description, + hidePanelTitles: state.explicitInput.hidePanelTitles, + lastSavedId: state.componentState.lastSavedId, + syncColors: state.explicitInput.syncColors, + syncCursor: state.explicitInput.syncCursor, + syncTooltips: state.explicitInput.syncTooltips, + tags: state.explicitInput.tags, + timeRestore: state.explicitInput.timeRestore, + title: state.explicitInput.title, + useMargins: state.explicitInput.useMargins, + }; + }; + + public setSettings = (settings: DashboardStateFromSettingsFlyout) => { + this.dispatch.setStateFromSettingsFlyout(settings); + }; + public setExpandedPanelId = (newId?: string) => { this.dispatch.setExpandedPanelId(newId); }; @@ -925,6 +981,10 @@ export class DashboardContainer this.setScrollToPanelId(id); }; + public setPanels = (panels: DashboardPanelMap) => { + this.dispatch.setPanels(panels); + }; + // ------------------------------------------------------------------------------------------------------ // React Embeddable system // ------------------------------------------------------------------------------------------------------ diff --git a/src/plugins/dashboard/public/dashboard_top_nav/internal_dashboard_top_nav.tsx b/src/plugins/dashboard/public/dashboard_top_nav/internal_dashboard_top_nav.tsx index a166a01ba327d..02cbaa7d90100 100644 --- a/src/plugins/dashboard/public/dashboard_top_nav/internal_dashboard_top_nav.tsx +++ b/src/plugins/dashboard/public/dashboard_top_nav/internal_dashboard_top_nav.tsx @@ -48,6 +48,7 @@ import './_dashboard_top_nav.scss'; import { DashboardRedirect } from '../dashboard_container/types'; import { SaveDashboardReturn } from '../services/dashboard_content_management/types'; import { useDashboardApi } from '../dashboard_api/use_dashboard_api'; +import { openSettingsFlyout } from '../dashboard_container/embeddable/api'; export interface InternalDashboardTopNavProps { customLeadingBreadCrumbs?: EuiBreadcrumb[]; @@ -188,7 +189,7 @@ export function InternalDashboardTopNav({ size="s" type="pencil" className="dshTitleBreadcrumbs__updateIcon" - onClick={() => dashboardApi.openSettingsFlyout()} + onClick={() => openSettingsFlyout(dashboardApi)} /> ) : ( From 1cd0531a6a27246a2f3d268f5d37067639fd9479 Mon Sep 17 00:00:00 2001 From: wajihaparvez Date: Mon, 23 Sep 2024 11:54:27 -0400 Subject: [PATCH 03/41] [Docs] Add visuals to the Use and Filter Dashboards page (#193489) ## Summary Added screenshots and gifs to the [Use and Filter Dashboards](https://www.elastic.co/guide/en/kibana/master/_use_and_filter_dashboards.html) page as part of the ongoing project to add more visuals to the Dashboards docs. Rel:[#457](https://github.com/elastic/platform-docs-team/issues/457) and [#466](https://github.com/elastic/platform-docs-team/issues/466) --- .../images/dashboard_filter_pills_8.15.0.png | Bin 0 -> 37136 bytes docs/user/dashboard/use-dashboards.asciidoc | 14 ++++++++++++++ 2 files changed, 14 insertions(+) create mode 100644 docs/user/dashboard/images/dashboard_filter_pills_8.15.0.png diff --git a/docs/user/dashboard/images/dashboard_filter_pills_8.15.0.png b/docs/user/dashboard/images/dashboard_filter_pills_8.15.0.png new file mode 100644 index 0000000000000000000000000000000000000000..220640ceaf41ce073e6c25332ecd67ec84af293a GIT binary patch literal 37136 zcmeFYWmH^CvoMSX32uSlo&<*kw*Z0QZoz{EA9Qen1Pks2cZcAE2X_n33@|`&7$CTR z!#U5r_sIS6{d?DX*Spu=(|dMzS5=pES9e#3sVK={V?M`3KtRBjeJ`bkfPf5vzt^EZ zf&W@iGc+O~V2N8vN~*|8O46t}IapZPnj;{*4@=ZW(@`HJ$<&LB5&wjUk{`5;g8vdR zKWIYYP*FpIfF^+y`E73$`zw%J^=E7YV%6_ISzmm#RNeQf&dx6XirVs<3DspuyPa=^ z4|snwp8Ak30Nh*_LMYCFhDtRR3nF-QAvr3

Z}2_@cCnXqJtb;7_0J47#GT(9j_L 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 literal 0 HcmV?d00001 diff --git a/docs/user/dashboard/use-dashboards.asciidoc b/docs/user/dashboard/use-dashboards.asciidoc index 32ae52d3a512d..1baa7d49ab8f8 100644 --- a/docs/user/dashboard/use-dashboards.asciidoc +++ b/docs/user/dashboard/use-dashboards.asciidoc @@ -78,6 +78,9 @@ The *Exists* query returns all documents that contain an indexed value for the f . To display only the options you selected in the dropdown, click image:images/dashboard_showOnlySelectedOptions_8.3.0.png[The icon to display only the options you have selected in the Options list]. +[role="screenshot"] +image::images/dashboard_controlsOptionsList_8.7.0.png[Options list control] + [float] [[filter-the-data-with-range-slider-controls]] ==== Filter the data with Range slider controls @@ -91,6 +94,9 @@ The dashboard displays only the data for the range of values you specified. . To clear the specified values, click image:images/dashboard_controlsClearSelections_8.3.0.png[The icon to clear all specified values in the Range slider]. +[role="screenshot"] +image::images/dashboard_controlsRangeSlider_8.3.0.png[Range slider control] + [float] [[filter-the-data-with-time-slider-controls]] ==== Filter the data with time slider controls @@ -106,9 +112,17 @@ Filter the data within a specified range of time. . To clear the specified values, click image:images/dashboard_controlsClearSelections_8.3.0.png[The icon to clear all specified values in the Range slider]. +[role="screenshot"] +image::images/dashboard_timeSliderControl_8.7.0.gif[Time slider control] + [float] === Use filter pills +Use filter pills to focus in on the specific data you want. + +[role="screenshot"] +image::images/dashboard_filter_pills_8.15.0.png[Filter pills, width=50%] + [float] ==== Add pills by interacting with visualizations From 886d009418821ae4b6a22d7630bab0c484f137c2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Cau=C3=AA=20Marcondes?= <55978943+cauemarcondes@users.noreply.github.com> Date: Mon, 23 Sep 2024 16:54:50 +0100 Subject: [PATCH 04/41] [APM] Turn 'fast filter' on by default and ensure tech preview badge shows when turned on (#193710) closes https://github.com/elastic/kibana/issues/193406 Screenshot 2024-09-23 at 12 37 41 Screenshot 2024-09-23 at 12 37 56 Screenshot 2024-09-23 at 12 38 04 --- .../service_inventory/service_inventory.cy.ts | 18 +- .../apm_signal_inventory/index.tsx | 23 +- .../service_list/apm_services_table.tsx | 71 +- .../components/shared/managed_table/index.tsx | 2 + .../table_search_bar/table_search_bar.tsx | 44 +- .../observability/server/ui_settings.ts | 4 +- .../translations/translations/fr-FR.json | 3352 ++++++++--------- .../translations/translations/ja-JP.json | 48 +- .../translations/translations/zh-CN.json | 54 +- 9 files changed, 1772 insertions(+), 1844 deletions(-) diff --git a/x-pack/plugins/observability_solution/apm/ftr_e2e/cypress/e2e/service_inventory/service_inventory.cy.ts b/x-pack/plugins/observability_solution/apm/ftr_e2e/cypress/e2e/service_inventory/service_inventory.cy.ts index 614cd8b47b319..3e913d4f527f0 100644 --- a/x-pack/plugins/observability_solution/apm/ftr_e2e/cypress/e2e/service_inventory/service_inventory.cy.ts +++ b/x-pack/plugins/observability_solution/apm/ftr_e2e/cypress/e2e/service_inventory/service_inventory.cy.ts @@ -119,10 +119,8 @@ describe.skip('Service inventory', () => { cy.loginAsEditorUser(); }); - it('Toggles fast filter when clicking on link', () => { + it('Uses the fast filter to search for services', () => { cy.visitKibana(serviceInventoryHref); - cy.get('[data-test-subj="tableSearchInput"]').should('not.exist'); - cy.contains('Enable fast filter').click(); cy.get('[data-test-subj="tableSearchInput"]').should('exist'); cy.contains('opbeans-node'); cy.contains('opbeans-java'); @@ -135,20 +133,6 @@ describe.skip('Service inventory', () => { cy.contains('opbeans-node'); cy.contains('opbeans-java'); cy.contains('opbeans-rum'); - cy.contains('Disable fast filter').click(); - cy.get('[data-test-subj="tableSearchInput"]').should('not.exist'); - }); - }); - - describe('Table search with viewer user', () => { - beforeEach(() => { - cy.loginAsViewerUser(); - }); - - it('Should not be able to turn it on', () => { - cy.visitKibana(serviceInventoryHref); - cy.get('[data-test-subj="tableSearchInput"]').should('not.exist'); - cy.get('[data-test-subj="apmLink"]').should('be.disabled'); }); }); diff --git a/x-pack/plugins/observability_solution/apm/public/components/app/service_inventory/apm_signal_inventory/index.tsx b/x-pack/plugins/observability_solution/apm/public/components/app/service_inventory/apm_signal_inventory/index.tsx index c4553a59be802..63cba0a2fba67 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/app/service_inventory/apm_signal_inventory/index.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/app/service_inventory/apm_signal_inventory/index.tsx @@ -5,13 +5,11 @@ * 2.0. */ -import { usePerformanceContext } from '@kbn/ebt-tools'; import { EuiEmptyPrompt, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; +import { usePerformanceContext } from '@kbn/ebt-tools'; import { i18n } from '@kbn/i18n'; import React, { useCallback, useEffect, useMemo, useState } from 'react'; import { v4 as uuidv4 } from 'uuid'; -import { apmEnableServiceInventoryTableSearchBar } from '@kbn/observability-plugin/common'; -import { useEditableSettings } from '@kbn/observability-shared-plugin/public'; import { ApmDocumentType } from '../../../../../common/document_type'; import { ServiceInventoryFieldName, @@ -182,9 +180,7 @@ function useServicesDetailedStatisticsFetcher({ export function ApmServiceInventory() { const [debouncedSearchQuery, setDebouncedSearchQuery] = useStateDebounced(''); const { onPageReady } = usePerformanceContext(); - const [renderedItems, setRenderedItems] = useState([]); - const mainStatisticsFetch = useServicesMainStatisticsFetcher(debouncedSearchQuery); const { mainStatisticsData, mainStatisticsStatus } = mainStatisticsFetch; @@ -296,19 +292,9 @@ export function ApmServiceInventory() { } }, [mainStatisticsStatus, comparisonFetch.status, onPageReady]); - const { fields, isSaving, saveSingleSetting } = useEditableSettings([ - apmEnableServiceInventoryTableSearchBar, - ]); - - const settingsField = fields[apmEnableServiceInventoryTableSearchBar]; - const isTableSearchBarEnabled = Boolean(settingsField?.savedValue ?? settingsField?.defaultValue); - return ( <> - {/* keep this div as we're collecting telemetry to track the usage of the table fast search vs KQL bar */} -

- -
+ {displayMlCallout && mlCallout} @@ -328,11 +314,6 @@ export function ApmServiceInventory() { onChangeSearchQuery={setDebouncedSearchQuery} maxCountExceeded={mainStatisticsData?.maxCountExceeded ?? false} onChangeRenderedItems={setRenderedItems} - isTableSearchBarEnabled={isTableSearchBarEnabled} - isSavingSetting={isSaving} - onChangeTableSearchBarVisibility={() => { - saveSingleSetting(apmEnableServiceInventoryTableSearchBar, !isTableSearchBarEnabled); - }} /> diff --git a/x-pack/plugins/observability_solution/apm/public/components/app/service_inventory/apm_signal_inventory/service_list/apm_services_table.tsx b/x-pack/plugins/observability_solution/apm/public/components/app/service_inventory/apm_signal_inventory/service_list/apm_services_table.tsx index de2c45862d30f..acb0818797d10 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/app/service_inventory/apm_signal_inventory/service_list/apm_services_table.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/app/service_inventory/apm_signal_inventory/service_list/apm_services_table.tsx @@ -10,18 +10,16 @@ import { EuiFlexGroup, EuiFlexItem, EuiIconTip, - EuiLink, - EuiSpacer, EuiText, EuiToolTip, RIGHT_ALIGNMENT, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { getSurveyFeedbackURL } from '@kbn/observability-shared-plugin/public'; +import { apmEnableServiceInventoryTableSearchBar } from '@kbn/observability-plugin/common'; import { ALERT_STATUS_ACTIVE } from '@kbn/rule-data-utils'; import { TypeOf } from '@kbn/typed-react-router-config'; import { omit } from 'lodash'; -import React, { useContext, useMemo } from 'react'; +import React, { useMemo } from 'react'; import { ServiceHealthStatus } from '../../../../../../common/service_health_status'; import { ServiceInventoryFieldName, @@ -33,7 +31,7 @@ import { asPercent, asTransactionRate, } from '../../../../../../common/utils/formatters'; -import { KibanaEnvironmentContext } from '../../../../../context/kibana_environment_context/kibana_environment_context'; +import { useApmPluginContext } from '../../../../../context/apm_plugin/use_apm_plugin_context'; import { useApmParams } from '../../../../../hooks/use_apm_params'; import { useApmRouter } from '../../../../../hooks/use_apm_router'; import { Breakpoints, useBreakpoints } from '../../../../../hooks/use_breakpoints'; @@ -56,9 +54,8 @@ import { SortFunction, TableSearchBar, } from '../../../../shared/managed_table'; -import { TryItButton } from '../../../../shared/try_it_button'; -import { HealthBadge } from './health_badge'; import { ColumnHeaderWithTooltip } from './column_header_with_tooltip'; +import { HealthBadge } from './health_badge'; type ServicesDetailedStatisticsAPIResponse = APIReturnType<'POST /internal/apm/services/detailed_statistics'>; @@ -305,9 +302,6 @@ interface Props { maxCountExceeded: boolean; onChangeSearchQuery: (searchQuery: string) => void; onChangeRenderedItems: (renderedItems: ServiceListItem[]) => void; - isTableSearchBarEnabled: boolean; - isSavingSetting: boolean; - onChangeTableSearchBarVisibility: () => void; } export function ApmServicesTable({ status, @@ -325,17 +319,13 @@ export function ApmServicesTable({ maxCountExceeded, onChangeSearchQuery, onChangeRenderedItems, - isTableSearchBarEnabled, - isSavingSetting, - onChangeTableSearchBarVisibility, }: Props) { - const { kibanaVersion, isCloudEnv, isServerlessEnv } = useContext(KibanaEnvironmentContext); const breakpoints = useBreakpoints(); + const { core } = useApmPluginContext(); const { link } = useApmRouter(); const showTransactionTypeColumn = items.some( ({ transactionType }) => transactionType && !isDefaultTransactionType(transactionType) ); - const { query } = useApmParams('/services'); const { kuery } = query; const { fallbackToTransactions } = useFallbackToTransactionsFetcher({ @@ -367,6 +357,11 @@ export function ApmServicesTable({ serviceOverflowCount, ]); + const isTableSearchBarEnabled = core.uiSettings.get( + apmEnableServiceInventoryTableSearchBar, + true + ); + const tableSearchBar: TableSearchBar = useMemo(() => { return { isEnabled: isTableSearchBarEnabled, @@ -376,56 +371,12 @@ export function ApmServicesTable({ placeholder: i18n.translate('xpack.apm.servicesTable.filterServicesPlaceholder', { defaultMessage: 'Search services by name', }), + techPreview: true, }; }, [isTableSearchBarEnabled, maxCountExceeded, onChangeSearchQuery]); return ( - - - - {i18n.translate('xpack.apm.serviceList.turnOffFastFilter', { - defaultMessage: - 'Fast filtering allows you to instantly search for your services using free text.', - })} - - {isTableSearchBarEnabled && ( - - - {i18n.translate('xpack.apm.serviceList.giveFeedbackFlexItemLabel', { - defaultMessage: 'Give feedback', - })} - - - )} - - } - /> - - {fallbackToTransactions && ( diff --git a/x-pack/plugins/observability_solution/apm/public/components/shared/managed_table/index.tsx b/x-pack/plugins/observability_solution/apm/public/components/shared/managed_table/index.tsx index dcc5a5ee9c677..908be6a16dcaa 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/shared/managed_table/index.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/shared/managed_table/index.tsx @@ -43,6 +43,7 @@ export interface TableSearchBar { maxCountExceeded: boolean; placeholder: string; onChangeSearchQuery: (searchQuery: string) => void; + techPreview?: boolean; } const PAGE_SIZE_OPTIONS = [10, 25, 50]; @@ -265,6 +266,7 @@ function UnoptimizedManagedTable(props: { placeholder={tableSearchBar.placeholder} searchQuery={searchQuery} onChangeSearchQuery={onChangeSearchQuery} + techPreview={tableSearchBar.techPreview} /> ) : null} diff --git a/x-pack/plugins/observability_solution/apm/public/components/shared/table_search_bar/table_search_bar.tsx b/x-pack/plugins/observability_solution/apm/public/components/shared/table_search_bar/table_search_bar.tsx index 74f9c9ce615b7..59a24e4ade3fd 100644 --- a/x-pack/plugins/observability_solution/apm/public/components/shared/table_search_bar/table_search_bar.tsx +++ b/x-pack/plugins/observability_solution/apm/public/components/shared/table_search_bar/table_search_bar.tsx @@ -4,26 +4,48 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { EuiFieldSearch } from '@elastic/eui'; +import { EuiFieldSearch, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import React from 'react'; +import { css } from '@emotion/react'; +import { TechnicalPreviewBadge } from '../technical_preview_badge'; interface Props { placeholder: string; searchQuery: string; onChangeSearchQuery: (value: string) => void; + techPreview?: boolean; } -export function TableSearchBar({ placeholder, searchQuery, onChangeSearchQuery }: Props) { +export function TableSearchBar({ + placeholder, + searchQuery, + onChangeSearchQuery, + techPreview = false, +}: Props) { return ( - { - onChangeSearchQuery(e.target.value); - }} - /> + + {techPreview ? ( + + + + ) : null} + + { + onChangeSearchQuery(e.target.value); + }} + /> + + ); } diff --git a/x-pack/plugins/observability_solution/observability/server/ui_settings.ts b/x-pack/plugins/observability_solution/observability/server/ui_settings.ts index 81c0596722106..ad7afb004775a 100644 --- a/x-pack/plugins/observability_solution/observability/server/ui_settings.ts +++ b/x-pack/plugins/observability_solution/observability/server/ui_settings.ts @@ -372,8 +372,8 @@ export const uiSettings: Record = { } ), schema: schema.boolean(), - value: false, - requiresPageReload: false, + value: true, + requiresPageReload: true, type: 'boolean', }, [apmAWSLambdaPriceFactor]: { diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index c470f0e6937cc..d2891900a2503 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -2704,6 +2704,31 @@ "embeddableApi.selectRangeTrigger.title": "Sélection de la plage", "embeddableApi.valueClickTrigger.description": "Un point de données cliquable sur la visualisation", "embeddableApi.valueClickTrigger.title": "Clic unique", + "esqlEditor.query.aborted": "La demande a été annulée", + "esqlEditor.query.cancel": "Annuler", + "esqlEditor.query.collapseLabel": "Réduire", + "esqlEditor.query.disableWordWrapLabel": "Supprimer les sauts de ligne des barres verticales", + "esqlEditor.query.EnableWordWrapLabel": "Ajouter des sauts de ligne aux barres verticales", + "esqlEditor.query.errorCount": "{count} {count, plural, one {erreur} other {erreurs}}", + "esqlEditor.query.errorsTitle": "Erreurs", + "esqlEditor.query.expandLabel": "Développer", + "esqlEditor.query.feedback": "Commentaires", + "esqlEditor.query.hideQueriesLabel": "Masquer les recherches récentes", + "esqlEditor.query.lineCount": "{count} {count, plural, one {ligne} other {lignes}}", + "esqlEditor.query.lineNumber": "Ligne {lineNumber}", + "esqlEditor.query.querieshistory.error": "La requête a échouée", + "esqlEditor.query.querieshistory.success": "La requête a été exécuté avec succès", + "esqlEditor.query.querieshistoryCopy": "Copier la requête dans le presse-papier", + "esqlEditor.query.querieshistoryRun": "Exécuter la requête", + "esqlEditor.query.querieshistoryTable": "Tableau d'historique des recherches", + "esqlEditor.query.recentQueriesColumnLabel": "Recherches récentes", + "esqlEditor.query.runQuery": "Exécuter la requête", + "esqlEditor.query.showQueriesLabel": "Afficher les recherches récentes", + "esqlEditor.query.submitFeedback": "Soumettre un commentaire", + "esqlEditor.query.timeRanColumnLabel": "Temps exécuté", + "esqlEditor.query.timestampNotDetected": "@timestamp non trouvé", + "esqlEditor.query.warningCount": "{count} {count, plural, one {avertissement} other {avertissements}}", + "esqlEditor.query.warningsTitle": "Avertissements", "esqlUtils.columnsErrorMsg": "Impossible de charger les colonnes. {errorMessage}", "esQuery.kql.errors.endOfInputText": "fin de l'entrée", "esQuery.kql.errors.fieldNameText": "nom du champ", @@ -5446,1654 +5471,12 @@ "kibanaOverview.manageData.sectionTitle": "Gérer vos données", "kibanaOverview.more.title": "Toujours plus avec Elastic", "kibanaOverview.news.title": "Nouveautés", - "languageDocumentation.documentationLinkLabel": "Voir toute la documentation", - "languageDocumentation.header": "Référence de {language}", - "languageDocumentation.searchPlaceholder": "Recherche", - "languageDocumentation.tooltip": "Référence de {lang}", - "lensFormulaDocs.avg": "Moyenne", - "lensFormulaDocs.boolean": "booléen", - "lensFormulaDocs.cardinality": "Décompte unique", - "lensFormulaDocs.cardinality.documentation.markdown": "\nCalcule le nombre de valeurs uniques d'un champ donné. Fonctionne pour les nombres, les chaînes, les dates et les valeurs booléennes.\n\nExemple : calculer le nombre de produits différents : \n`unique_count(product.name)`\n\nExemple : calculer le nombre de produits différents du groupe \"clothes\" : \n`unique_count(product.name, kql='product.group=clothes')`\n ", - "lensFormulaDocs.cardinality.signature": "champ : chaîne", - "lensFormulaDocs.CommonFormulaDocumentation": "Les formules les plus courantes divisent deux valeurs pour produire un pourcentage. Pour obtenir un affichage correct, définissez \"Format de valeur\" sur \"pourcent\".", - "lensFormulaDocs.count": "Décompte", - "lensFormulaDocs.count.documentation.markdown": "\nNombre total de documents. Lorsque vous fournissez un champ, le nombre total de valeurs de champ est compté. Lorsque vous utilisez la fonction de décompte pour les champs qui comportent plusieurs valeurs dans un même document, toutes les valeurs sont comptées.\n\n#### Exemples\n\nPour calculer le nombre total de documents, utilisez `count()`.\n\nPour calculer le nombre de produits, utilisez `count(products.id)`.\n\nPour calculer le nombre de documents qui correspondent à un filtre donné, utilisez `count(kql='price > 500')`.\n", - "lensFormulaDocs.count.signature": "[champ : chaîne]", - "lensFormulaDocs.counterRate": "Taux de compteur", - "lensFormulaDocs.counterRate.documentation.markdown": "\nCalcule le taux d'un compteur toujours croissant. Cette fonction renvoie uniquement des résultats utiles inhérents aux champs d'indicateurs de compteur qui contiennent une mesure quelconque à croissance régulière.\nSi la valeur diminue, elle est interprétée comme une mesure de réinitialisation de compteur. Pour obtenir des résultats plus précis, `counter_rate\" doit être calculé d’après la valeur `max` du champ.\n\nCe calcul est réalisé séparément pour des séries distinctes définies par des filtres ou des dimensions de valeurs supérieures.\nIl utilise l'intervalle en cours utilisé dans la formule.\n\nExemple : visualiser le taux d'octets reçus au fil du temps par un serveur Memcached : \n`counter_rate(max(memcached.stats.read.bytes))`\n ", - "lensFormulaDocs.counterRate.signature": "indicateur : nombre", - "lensFormulaDocs.cumulative_sum.signature": "indicateur : nombre", - "lensFormulaDocs.cumulativeSum": "Somme cumulée", - "lensFormulaDocs.cumulativeSum.documentation.markdown": "\nCalcule la somme cumulée d'un indicateur au fil du temps, en ajoutant toutes les valeurs précédentes d'une série à chaque valeur. Pour utiliser cette fonction, vous devez également configurer une dimension de l'histogramme de dates.\n\nCe calcul est réalisé séparément pour des séries distinctes définies par des filtres ou des dimensions de valeurs supérieures.\n\nExemple : visualiser les octets reçus cumulés au fil du temps : \n`cumulative_sum(sum(bytes))`\n", - "lensFormulaDocs.derivative": "Différences", - "lensFormulaDocs.differences.documentation.markdown": "\nCalcule la différence par rapport à la dernière valeur d'un indicateur au fil du temps. Pour utiliser cette fonction, vous devez également configurer une dimension de l'histogramme de dates.\nLes données doivent être séquentielles pour les différences. Si vos données sont vides lorsque vous utilisez des différences, essayez d'augmenter l'intervalle de l'histogramme de dates.\n\nCe calcul est réalisé séparément pour des séries distinctes définies par des filtres ou des dimensions de valeurs supérieures.\n\nExemple : visualiser la modification des octets reçus au fil du temps : \n`differences(sum(bytes))`\n", - "lensFormulaDocs.differences.signature": "indicateur : nombre", - "lensFormulaDocs.documentation.columnCalculationSection": "Calculs de colonnes", - "lensFormulaDocs.documentation.columnCalculationSectionDescription": "Ces fonctions sont exécutées pour chaque ligne, mais elles sont fournies avec la colonne entière comme contexte. Elles sont également appelées fonctions de fenêtre.", - "lensFormulaDocs.documentation.comparisonSection": "Comparaison", - "lensFormulaDocs.documentation.comparisonSectionDescription": "Ces fonctions sont utilisées pour effectuer une comparaison de valeurs.", - "lensFormulaDocs.documentation.constantsSection": "Contexte Kibana", - "lensFormulaDocs.documentation.constantsSectionDescription": "Ces fonctions sont utilisées pour récupérer des variables de contexte Kibana, c’est-à-dire l’histogramme de date `interval`, le `now` actuel et le `time_range` sélectionné, et pour vous aider à faire des opérations mathématiques de dates.", - "lensFormulaDocs.documentation.elasticsearchSection": "Elasticsearch", - "lensFormulaDocs.documentation.elasticsearchSectionDescription": "Ces fonctions seront exécutées sur les documents bruts pour chaque ligne du tableau résultant, en agrégeant tous les documents correspondant aux dimensions de répartition en une seule valeur.", - "lensFormulaDocs.documentation.filterRatio": "Rapport de filtre", - "lensFormulaDocs.documentation.filterRatioDescription.markdown": "### Rapport de filtre :\n\nUtilisez `kql=''` pour filtrer un ensemble de documents et le comparer à d'autres documents du même regroupement.\nPar exemple, pour consulter l'évolution du taux d'erreur au fil du temps :\n\n````\ncount(kql='response.status_code > 400') / count()\n````\n ", - "lensFormulaDocs.documentation.markdown": "## Fonctionnement\n\nLes formules Lens permettent de réaliser des calculs à l'aide d'une combinaison d'agrégations Elasticsearch et\nde fonctions mathématiques. Trois types principaux de fonctions existent :\n\n* Indicateurs Elasticsearch, comme `sum(bytes)`\n* Fonctions de séries temporelles utilisant les indicateurs Elasticsearch en tant qu'entrée, comme `cumulative_sum()`\n* Fonctions mathématiques, comme `round()`\n\nVoici un exemple de formule qui les utilise tous :\n\n````\nround(100 * moving_average(\naverage(cpu.load.pct),\nwindow=10,\nkql='datacenter.name: east*'\n))\n````\n\nLes fonctions Elasticsearch utilisent un nom de champ, qui peut être entre guillemets. `sum(bytes)` est ainsi identique à\n`sum('bytes')`.\n\nCertaines fonctions utilisent des arguments nommés, comme `moving_average(count(), window=5)`.\n\nLes indicateurs Elasticsearch peuvent être filtrés à l’aide de la syntaxe KQL ou Lucene. Pour ajouter un filtre, utilisez le paramètre\nnommé `kql='field: value'` ou `lucene=''`. Utilisez toujours des guillemets simples pour écrire des requêtes KQL\nou Lucene. Si votre recherche contient un guillemet simple, utilisez une barre oblique inverse pour l’échapper, par exemple : `kql='Women\\'s\".\n\nLes fonctions mathématiques peuvent utiliser des arguments positionnels : par exemple, pow(count(), 3) est identique à count() * count() * count().\n\nUtilisez les opérateurs +, -, / et * pour réaliser des opérations de base.\n", - "lensFormulaDocs.documentation.mathSection": "Mathématique", - "lensFormulaDocs.documentation.mathSectionDescription": "Ces fonctions seront exécutées pour chaque ligne du tableau résultant en utilisant des valeurs uniques de la même ligne calculées à l'aide d'autres fonctions.", - "lensFormulaDocs.documentation.percentOfTotal": "Pourcentage du total", - "lensFormulaDocs.documentation.percentOfTotalDescription.markdown": "### Pourcentage du total\n\nLes formules peuvent calculer `overall_sum` pour tous les regroupements,\nce qui permet de convertir chaque regroupement en un pourcentage du total :\n\n````\nsum(products.base_price) / overall_sum(sum(products.base_price))\n````\n ", - "lensFormulaDocs.documentation.recentChange": "Modification récente", - "lensFormulaDocs.documentation.recentChangeDescription.markdown": "### Modification récente\n\nUtilisez `reducedTimeRange='30m'` pour ajouter un filtre supplémentaire sur la plage temporelle d'un indicateur aligné avec la fin d'une plage temporelle globale. Vous pouvez l'utiliser pour calculer le degré de modification récente d'une valeur.\n\n````\nmax(system.network.in.bytes, reducedTimeRange=\"30m\")\n- min(system.network.in.bytes, reducedTimeRange=\"30m\")\n````\n ", - "lensFormulaDocs.documentation.weekOverWeek": "Semaine après semaine", - "lensFormulaDocs.documentation.weekOverWeekDescription.markdown": "### Semaine après semaine :\n\nUtilisez `shift='1w'` pour obtenir la valeur de chaque regroupement\nde la semaine précédente. Le décalage ne doit pas être utilisé avec la fonction *Valeurs les plus élevées*.\n\n````\npercentile(system.network.in.bytes, percentile=99) /\npercentile(system.network.in.bytes, percentile=99, shift='1w')\n````\n ", - "lensFormulaDocs.frequentlyUsedHeading": "Formules courantes", - "lensFormulaDocs.interval": "Intervalle de l'histogramme des dates", - "lensFormulaDocs.interval.help": "\nL’intervalle minimum spécifié pour l’histogramme de date, en millisecondes (ms).\n\nExemple : Normalisez l'indicateur de façon dynamique en fonction de la taille d'intervalle du compartiment : \n\"sum(bytes) / interval()\"\n", - "lensFormulaDocs.lastValue": "Dernière valeur", - "lensFormulaDocs.lastValue.documentation.markdown": "\nRenvoie la valeur d'un champ du dernier document, triée par le champ d'heure par défaut de la vue de données.\n\nCette fonction permet de récupérer le dernier état d'une entité.\n\nExemple : obtenir le statut actuel du serveur A : \n`last_value(server.status, kql='server.name=\"A\"')`\n", - "lensFormulaDocs.lastValue.signature": "champ : chaîne", - "lensFormulaDocs.max": "Maximum", - "lensFormulaDocs.median": "Médiane", - "lensFormulaDocs.metric.documentation.markdown": "\nRenvoie l'indicateur {metric} d'un champ. Cette fonction fonctionne uniquement pour les champs numériques.\n\nExemple : obtenir l'indicateur {metric} d'un prix : \n`{metric}(price)`\n\nExemple : obtenir l'indicateur {metric} d'un prix pour des commandes du Royaume-Uni : \n`{metric}(price, kql='location:UK')`\n ", - "lensFormulaDocs.metric.signature": "champ : chaîne", - "lensFormulaDocs.min": "Minimum", - "lensFormulaDocs.moving_average.signature": "indicateur : nombre, [window] : nombre", - "lensFormulaDocs.movingAverage": "Moyenne mobile", - "lensFormulaDocs.movingAverage.documentation.markdown": "\nCalcule la moyenne mobile d'un indicateur au fil du temps, en prenant la moyenne des n dernières valeurs pour calculer la valeur actuelle. Pour utiliser cette fonction, vous devez également configurer une dimension de l'histogramme de dates.\nLa valeur de fenêtre par défaut est {defaultValue}.\n\nCe calcul est réalisé séparément pour des séries distinctes définies par des filtres ou des dimensions de valeurs supérieures.\n\nPrend un paramètre nommé `window` qui spécifie le nombre de dernières valeurs à inclure dans le calcul de la moyenne de la valeur actuelle.\n\nExemple : lisser une ligne de mesures : \n`moving_average(sum(bytes), window=5)`\n", - "lensFormulaDocs.now": "Actuel", - "lensFormulaDocs.now.help": "\nLa durée actuelle passée dans Kibana exprimée en millisecondes (ms).\n\nExemple : Depuis combien de temps (en millisecondes) le serveur est-il en marche depuis son dernier redémarrage ? \n\"now() - last_value(start_time)\"\n", - "lensFormulaDocs.number": "numéro", - "lensFormulaDocs.overall_average.documentation.markdown": "\nCalcule la moyenne d'un indicateur pour tous les points de données d'une série dans le graphique actuel. Une série est définie par une dimension à l'aide d'un histogramme de dates ou d'une fonction d'intervalle.\nD'autres dimensions permettant de répartir les données telles que les valeurs supérieures ou les filtres sont traitées en tant que séries distinctes.\n\nSi le graphique actuel n'utilise aucun histogramme de dates ou aucune fonction d'intervalle, `overall_average` calcule la moyenne pour toutes les dimensions, quelle que soit la fonction utilisée.\n\nExemple : écart par rapport à la moyenne : \n`sum(bytes) - overall_average(sum(bytes))`\n", - "lensFormulaDocs.overall_max.documentation.markdown": "\nCalcule la valeur maximale d'un indicateur pour tous les points de données d'une série dans le graphique actuel. Une série est définie par une dimension à l'aide d'un histogramme de dates ou d'une fonction d'intervalle.\nD'autres dimensions permettant de répartir les données telles que les valeurs supérieures ou les filtres sont traitées en tant que séries distinctes.\n\nSi le graphique actuel n'utilise aucun histogramme de dates ou aucune fonction d'intervalle, `overall_max` calcule la valeur maximale pour toutes les dimensions, quelle que soit la fonction utilisée.\n\nExemple : Pourcentage de plage : \n`(sum(bytes) - overall_min(sum(bytes))) / (overall_max(sum(bytes)) - overall_min(sum(bytes)))`\n", - "lensFormulaDocs.overall_metric": "indicateur : nombre", - "lensFormulaDocs.overall_min.documentation.markdown": "\nCalcule la valeur minimale d'un indicateur pour tous les points de données d'une série dans le graphique actuel. Une série est définie par une dimension à l'aide d'un histogramme de dates ou d'une fonction d'intervalle.\nD'autres dimensions permettant de répartir les données telles que les valeurs supérieures ou les filtres sont traitées en tant que séries distinctes.\n\nSi le graphique actuel n'utilise aucun histogramme de dates ou aucune fonction d'intervalle, `overall_min` calcule la valeur minimale pour toutes les dimensions, quelle que soit la fonction utilisée.\n\nExemple : Pourcentage de plage : \n`(sum(bytes) - overall_min(sum(bytes)) / (overall_max(sum(bytes)) - overall_min(sum(bytes)))`\n", - "lensFormulaDocs.overall_sum.documentation.markdown": "\nCalcule la somme d'un indicateur pour tous les points de données d'une série dans le graphique actuel. Une série est définie par une dimension à l'aide d'un histogramme de dates ou d'une fonction d'intervalle.\nD'autres dimensions permettant de répartir les données telles que les valeurs supérieures ou les filtres sont traitées en tant que séries distinctes.\n\nSi le graphique actuel n'utilise aucun histogramme de dates ou aucune fonction d'intervalle, `overall_sum` calcule la somme pour toutes les dimensions, quelle que soit la fonction utilisée.\n\nExemple : Pourcentage total : \n`sum(bytes) / overall_sum(sum(bytes))`\n", - "lensFormulaDocs.overallAverage": "Moyenne globale", - "lensFormulaDocs.overallMax": "Max général", - "lensFormulaDocs.overallMin": "Min général", - "lensFormulaDocs.overallSum": "Somme générale", - "lensFormulaDocs.percentile": "Centile", - "lensFormulaDocs.percentile.documentation.markdown": "\nRenvoie le centile spécifié des valeurs d'un champ. Il s'agit de la valeur de n pour cent des valeurs présentes dans les documents.\n\nExemple : obtenir le nombre d'octets supérieurs à 95 % des valeurs : \n`percentile(bytes, percentile=95)`\n", - "lensFormulaDocs.percentile.signature": "champ : chaîne, [percentile] : nombre", - "lensFormulaDocs.percentileRank": "Rang centile", - "lensFormulaDocs.percentileRanks.documentation.markdown": "\nRenvoie le pourcentage de valeurs qui sont en dessous d'une certaine valeur. Par exemple, si une valeur est supérieure à 95 % des valeurs observées, elle est placée au 95e rang centile.\n\nExemple : Obtenir le pourcentage de valeurs qui sont en dessous de 100 : \n`percentile_rank(bytes, value=100)`\n", - "lensFormulaDocs.percentileRanks.signature": "champ : chaîne, [valeur] : nombre", - "lensFormulaDocs.standardDeviation": "Écart-type", - "lensFormulaDocs.standardDeviation.documentation.markdown": "\nRenvoie la taille de la variation ou de la dispersion du champ. Cette fonction ne s’applique qu’aux champs numériques.\n\n#### Exemples\n\nPour obtenir l'écart-type d'un prix, utilisez `standard_deviation(price)`.\n\nPour obtenir la variance du prix des commandes passées au Royaume-Uni, utilisez `square(standard_deviation(price, kql='location:UK'))`.\n", - "lensFormulaDocs.string": "chaîne", - "lensFormulaDocs.sum": "Somme", - "lensFormulaDocs.time_range": "Plage temporelle", - "lensFormulaDocs.time_scale": "indicateur : nombre, unité : s|m|h|d|w|M|y", - "lensFormulaDocs.time_scale.documentation.markdown": "\nCette fonction avancée est utile pour normaliser les comptes et les sommes sur un intervalle de temps spécifique. Elle permet l'intégration avec les indicateurs qui sont stockés déjà normalisés sur un intervalle de temps spécifique.\n\nVous pouvez faire appel à cette fonction uniquement si une fonction d'histogramme des dates est utilisée dans le graphique actuel.\n\nExemple : Un rapport comparant un indicateur déjà normalisé à un autre indicateur devant être normalisé. \n`normalize_by_unit(counter_rate(max(system.diskio.write.bytes)), unit='s') / last_value(apache.status.bytes_per_second)`\n", - "lensFormulaDocs.timeRange.help": "\nL'intervalle de temps spécifié, en millisecondes (ms).\n\nExemple : Quelle est la durée de la plage temporelle actuelle en (ms) ?\n`time_range()`\n\nExemple : Une moyenne statique par minute calculée avec l'intervalle de temps actuel :\n`(sum(bytes) / time_range()) * 1000 * 60`\n", - "lensFormulaDocs.timeScale": "Normaliser par unité", - "lensFormulaDocs.tinymath.absFunction.markdown": "\nCalcule une valeur absolue. Une valeur négative est multipliée par -1, une valeur positive reste identique.\n\nExemple : calculer la distance moyenne par rapport au niveau de la mer `abs(average(altitude))`\n ", - "lensFormulaDocs.tinymath.addFunction.markdown": "\nAjoute jusqu'à deux nombres.\nFonctionne également avec le symbole `+`.\n\nExemple : calculer la somme de deux champs\n\n`sum(price) + sum(tax)`\n\nExemple : compenser le compte par une valeur statique\n\n`add(count(), 5)`\n ", - "lensFormulaDocs.tinymath.base": "base", - "lensFormulaDocs.tinymath.cbrtFunction.markdown": "\nÉtablit la racine carrée de la valeur.\n\nExemple : calculer la longueur du côté à partir du volume\n`cbrt(last_value(volume))`\n ", - "lensFormulaDocs.tinymath.ceilFunction.markdown": "\nArrondit le plafond de la valeur au chiffre supérieur.\n\nExemple : arrondir le prix au dollar supérieur\n`ceil(sum(price))`\n ", - "lensFormulaDocs.tinymath.clampFunction.markdown": "\nÉtablit une limite minimale et maximale pour la valeur.\n\nExemple : s'assurer de repérer les valeurs aberrantes\n````\nclamp(\n average(bytes),\n percentile(bytes, percentile=5),\n percentile(bytes, percentile=95)\n)\n````\n", - "lensFormulaDocs.tinymath.condition": "condition", - "lensFormulaDocs.tinymath.cubeFunction.markdown": "\nCalcule le cube d'un nombre.\n\nExemple : calculer le volume à partir de la longueur du côté\n`cube(last_value(length))`\n ", - "lensFormulaDocs.tinymath.decimals": "décimales", - "lensFormulaDocs.tinymath.defaultFunction.markdown": "\nRenvoie une valeur numérique par défaut lorsque la valeur est nulle.\n\nExemple : Renvoie -1 lorsqu'un champ ne contient aucune donnée.\n`defaults(average(bytes), -1)`\n", - "lensFormulaDocs.tinymath.defaultValue": "par défaut", - "lensFormulaDocs.tinymath.divideFunction.markdown": "\nDivise le premier nombre par le deuxième.\nFonctionne également avec le symbole `/`.\n\nExemple : calculer la marge bénéficiaire\n`sum(profit) / sum(revenue)`\n\nExemple : `divide(sum(bytes), 2)`\n ", - "lensFormulaDocs.tinymath.eqFunction.markdown": "\nEffectue une comparaison d'égalité entre deux valeurs.\nÀ utiliser en tant que condition pour la fonction de comparaison `ifelse`.\nFonctionne également avec le symbole `==`.\n\nExemple : Renvoie \"true\" si la moyenne d'octets est égale à la quantité de mémoire moyenne.\n`average(bytes) == average(memory)`\n\nExemple : `eq(sum(bytes), 1000000)`\n ", - "lensFormulaDocs.tinymath.expFunction.markdown": "\nÉlève *e* à la puissance n.\n\nExemple : calculer la fonction exponentielle naturelle\n\n`exp(last_value(duration))`\n ", - "lensFormulaDocs.tinymath.fixFunction.markdown": "\nPour les valeurs positives, part du bas. Pour les valeurs négatives, part du haut.\n\nExemple : arrondir à zéro\n`fix(sum(profit))`\n ", - "lensFormulaDocs.tinymath.floorFunction.markdown": "\nArrondit à la valeur entière inférieure la plus proche.\n\nExemple : arrondir un prix au chiffre inférieur\n`floor(sum(price))`\n ", - "lensFormulaDocs.tinymath.gteFunction.markdown": "\nEffectue une comparaison de supériorité entre deux valeurs.\nÀ utiliser en tant que condition pour la fonction de comparaison `ifelse`.\nFonctionne également avec le symbole `>=`.\n\nExemple : Renvoie \"true\" si la moyenne d'octets est supérieure ou égale à la quantité moyenne de mémoire.\n`average(bytes) >= average(memory)`\n\nExemple : `gte(average(bytes), 1000)`\n ", - "lensFormulaDocs.tinymath.gtFunction.markdown": "\nEffectue une comparaison de supériorité entre deux valeurs.\nÀ utiliser en tant que condition pour la fonction de comparaison `ifelse`.\nFonctionne également avec le symbole `>`.\n\nExemple : Renvoie \"true\" si la moyenne d'octets est supérieure à la quantité moyenne de mémoire.\n`average(bytes) > average(memory)`\n\nExemple : `gt(average(bytes), 1000)`\n ", - "lensFormulaDocs.tinymath.ifElseFunction.markdown": "\nRenvoie une valeur selon si l'élément de condition est \"true\" ou \"false\".\n\nExemple : Revenus moyens par client, mais dans certains cas, l'ID du client n'est pas fourni, et le client est alors compté comme client supplémentaire.\n`sum(total)/(unique_count(customer_id) + ifelse( count() > count(kql='customer_id:*'), 1, 0))`\n ", - "lensFormulaDocs.tinymath.left": "gauche", - "lensFormulaDocs.tinymath.logFunction.markdown": "\nÉtablit un logarithme avec base optionnelle. La base naturelle *e* est utilisée par défaut.\n\nExemple : calculer le nombre de bits nécessaire au stockage de valeurs\n````\nlog(sum(bytes))\nlog(sum(bytes), 2)\n````\n ", - "lensFormulaDocs.tinymath.lteFunction.markdown": "\nEffectue une comparaison d'infériorité ou de supériorité entre deux valeurs.\nÀ utiliser en tant que condition pour la fonction de comparaison `ifelse`.\nFonctionne également avec le symbole `<=`.\n\nExemple : Renvoie \"true\" si la moyenne d'octets est inférieure ou égale à la quantité moyenne de mémoire.\n`average(bytes) <= average(memory)`\n\nExemple : `lte(average(bytes), 1000)`\n ", - "lensFormulaDocs.tinymath.ltFunction.markdown": "\nEffectue une comparaison d'infériorité entre deux valeurs.\nÀ utiliser en tant que condition pour la fonction de comparaison `ifelse`.\nFonctionne également avec le symbole `<`.\n\nExemple : Renvoie \"true\" si la moyenne d'octets est inférieure à la quantité moyenne de mémoire.\n`average(bytes) <= average(memory)`\n\nExemple : `lt(average(bytes), 1000)`\n ", - "lensFormulaDocs.tinymath.max": "max", - "lensFormulaDocs.tinymath.maxFunction.markdown": "\nTrouve la valeur maximale entre deux nombres.\n\nExemple : Trouver le maximum entre deux moyennes de champs\n`pick_max(average(bytes), average(memory))`\n ", - "lensFormulaDocs.tinymath.min": "min", - "lensFormulaDocs.tinymath.minFunction.markdown": "\nTrouve la valeur minimale entre deux nombres.\n\nExemple : Trouver le minimum entre deux moyennes de champs\n`pick_min(average(bytes), average(memory))`\n ", - "lensFormulaDocs.tinymath.modFunction.markdown": "\nÉtablit le reste après division de la fonction par un nombre.\n\nExemple : calculer les trois derniers chiffres d'une valeur\n`mod(sum(price), 1000)`\n ", - "lensFormulaDocs.tinymath.multiplyFunction.markdown": "\nMultiplie deux nombres.\nFonctionne également avec le symbole `*`.\n\nExemple : calculer le prix après application du taux d'imposition courant\n`sum(bytes) * last_value(tax_rate)`\n\nExemple : calculer le prix après application du taux d'imposition constant\n`multiply(sum(price), 1.2)`\n ", - "lensFormulaDocs.tinymath.powFunction.markdown": "\nÉlève la valeur à une puissance spécifique. Le deuxième argument est obligatoire.\n\nExemple : calculer le volume en fonction de la longueur du côté\n`pow(last_value(length), 3)`\n ", - "lensFormulaDocs.tinymath.right": "droite", - "lensFormulaDocs.tinymath.roundFunction.markdown": "\nArrondit à un nombre donné de décimales, 0 étant la valeur par défaut.\n\nExemples : arrondir au centième\n````\nround(sum(bytes))\nround(sum(bytes), 2)\n````\n ", - "lensFormulaDocs.tinymath.sqrtFunction.markdown": "\nÉtablit la racine carrée d'une valeur positive uniquement.\n\nExemple : calculer la longueur du côté en fonction de la surface\n`sqrt(last_value(area))`\n ", - "lensFormulaDocs.tinymath.squareFunction.markdown": "\nÉlève la valeur à la puissance 2.\n\nExemple : calculer l’aire en fonction de la longueur du côté\n`square(last_value(length))`\n ", - "lensFormulaDocs.tinymath.subtractFunction.markdown": "\nSoustrait le premier nombre du deuxième.\nFonctionne également avec le symbole `-`.\n\nExemple : calculer la plage d'un champ\n`subtract(max(bytes), min(bytes))`\n ", - "lensFormulaDocs.tinymath.value": "valeur", - "links.contentManagement.saveModalTitle": "Enregistrer le panneau {contentId} dans la bibliothèque", - "links.dashboardLink.description": "Accéder au tableau de bord", - "links.dashboardLink.displayName": "Dashboard", - "links.dashboardLink.editor.currentDashboardLabel": "Actuel", - "links.dashboardLink.editor.dashboardComboBoxPlaceholder": "Rechercher un tableau de bord", - "links.dashboardLink.editor.dashboardErrorLabel": "Erreur lors de la récupération du tableau de bord", - "links.dashboardLink.editor.dashboardPickerAriaLabel": "Choisir un tableau de bord de destination", - "links.dashboardLink.editor.loadingDashboardLabel": "Chargement...", - "links.dashboardLink.type": "Lien du tableau de bord", - "links.description": "Utiliser des liens pour accéder aux tableaux de bord et aux sites web couramment utilisés.", - "links.editor.addButtonLabel": "Ajouter un lien", - "links.editor.cancelButtonLabel": "Fermer", - "links.editor.deleteLinkTitle": "Supprimer le lien {label}", - "links.editor.editLinkTitle.hasLabel": "Modifier le lien {label}", - "links.editor.horizontalLayout": "Horizontal", - "links.editor.unableToSaveToastTitle": "Erreur lors de l'enregistrement du Panneau de liens", - "links.editor.updateButtonLabel": "Mettre à jour le lien", - "links.editor.verticalLayout": "Vertical", - "links.externalLink.description": "Accéder à l'URL", - "links.externalLink.displayName": "URL", - "links.externalLink.editor.disallowedUrlError": "Cette URL n'est pas autorisée par votre administrateur. Reportez-vous à la configuration \"externalUrl.policy\".", - "links.externalLink.editor.placeholder": "Saisir une URL externe", - "links.externalLink.editor.urlFormatError": "Format non valide. Exemple : {exampleUrl}", - "links.externalLink.type": "URL externe", - "links.linkEditor.goBackAriaLabel": "Retourner à l'éditeur de panneau.", - "links.linkEditor.linkDestinationLabel": "Choisir une destination", - "links.linkEditor.linkOptionsLabel": "Options", - "links.linkEditor.linkTextLabel": "Texte", - "links.linkEditor.linkTextPlaceholder": "Saisir le texte du lien", - "links.linkEditor.linkTypeFormLabel": "Atteindre", - "links.panelEditor.brokenDashboardLinkAriaLabel": "Lien du tableau de bord brisé", - "links.panelEditor.createFlyoutTitle": "Créer le panneau de liens", - "links.panelEditor.dragHandleAriaLabel": "Lier la poignée de glisser-déposer", - "links.panelEditor.editFlyoutTitle": "Modifier le panneau de liens", - "links.panelEditor.emptyLinksMessage": "Vous n'avez pas encore ajouté de liens.", - "links.panelEditor.emptyLinksTooltip": "Ajouter un ou plusieurs liens.", - "links.panelEditor.layoutSettingsLegend": "Choisissez comment afficher vos liens.", - "links.panelEditor.layoutSettingsTitle": "Couche", - "links.panelEditor.linksTitle": "Liens", - "links.panelEditor.saveButtonLabel": "Enregistrer", - "links.panelEditor.saveToLibrarySwitchLabel": "Enregistrer dans la bibliothèque", - "links.panelEditor.saveToLibrarySwitchTooltip": "Enregistrer ce panneau de liens dans la bibliothèque afin de pouvoir l'ajouter facilement à d'autres tableaux de bord.", - "links.panelEditor.titleInputLabel": "Titre", - "links.saveDuplicateRejectedDescription": "La confirmation d'enregistrement avec un doublon de titre a été rejetée.", - "links.visTypeAlias.title": "Liens", - "lists.exceptions.doesNotExistOperatorLabel": "n'existe pas", - "lists.exceptions.doesNotMatchOperatorLabel": "ne correspond pas à", - "lists.exceptions.existsOperatorLabel": "existe", - "lists.exceptions.isInListOperatorLabel": "est dans la liste", - "lists.exceptions.isNotInListOperatorLabel": "n'est pas dans la liste", - "lists.exceptions.isNotOneOfOperatorLabel": "n'est pas l'une des options suivantes", - "lists.exceptions.isNotOperatorLabel": "n'est pas", - "lists.exceptions.isOneOfOperatorLabel": "est l'une des options suivantes", - "lists.exceptions.isOperatorLabel": "est", - "lists.exceptions.matchesOperatorLabel": "correspond à", - "managedContentBadge.text": "Géré", - "management.breadcrumb": "Gestion de la Suite", - "management.landing.header": "Bienvenue dans Gestion de la Suite {version}", - "management.landing.subhead": "Gérez vos index, vues de données, objets enregistrés, paramètres Kibana et plus encore.", - "management.landing.text": "Vous trouverez une liste complète des applications dans le menu de gauche.", - "management.landing.withCardNavigation.accessTitle": "Accès", - "management.landing.withCardNavigation.alertsTitle": "Alertes et informations exploitables", - "management.landing.withCardNavigation.apiKeysDescription": "Autorisez l'accès par programme pour les données et les fonctionnalités de votre projet.", - "management.landing.withCardNavigation.connectorsDescription": "Configurez les connexions avec des systèmes tiers à utiliser pour les cas et les règles.", - "management.landing.withCardNavigation.contentTitle": "Contenu", - "management.landing.withCardNavigation.dataQualityDescription": "Recherchez et gérez les problèmes de qualité dans vos données de logs.", - "management.landing.withCardNavigation.dataTitle": "Données", - "management.landing.withCardNavigation.dataViewsDescription": "Créez et gérez les données Elasticsearch sélectionnées pour l'exploration.", - "management.landing.withCardNavigation.fileManagementDescription": "Accédez à tous les fichiers importés.", - "management.landing.withCardNavigation.indexmanagementDescription": "Configurez et assurez la maintenance de vos index Elasticsearch pour le stockage et la récupération des données.", - "management.landing.withCardNavigation.ingestDescription": "Gérez et visualisez le pipeline Logstash de traitement des événements depuis les entrées jusqu'aux sorties.", - "management.landing.withCardNavigation.ingestPipelinesDescription": "Supprimez des champs, extrayez des valeurs et réalisez des transformations de vos données.", - "management.landing.withCardNavigation.maintenanceWindowsDescription": "Supprimez les notifications de règles pour les périodes où il est prévu d'effectuer des maintenances, des mises à jour et d'autres tâches liées au système.", - "management.landing.withCardNavigation.mlDescription": "Identifiez, analysez et traitez vos données à l'aide de techniques perfectionnées d'analyses.", - "management.landing.withCardNavigation.objectsDescription": "Gérez les tableaux de bords, les visualisations, les cartes et les vues de données que vous avez enregistrés.", - "management.landing.withCardNavigation.otherTitle": "Autre", - "management.landing.withCardNavigation.pageDescription": "Gérez les données et les index, supervisez les règles et les connecteurs, organisez les objets et les fichiers enregistrés et créez des clés d'API dans un emplacement central.", - "management.landing.withCardNavigation.pageTitle": "Gestion", - "management.landing.withCardNavigation.reportingDescription": "Gérez les rapports CSV générés.", - "management.landing.withCardNavigation.rolesDescription": "Créez des rôles uniques pour ce projet et combinez l'ensemble exact de privilèges dont vos utilisateurs ont besoin.", - "management.landing.withCardNavigation.rulesDescription": "Définissez à quel moment générer des alertes et des notifications.", - "management.landing.withCardNavigation.settingsDescription": "Contrôlez les comportements des projets, tels que l'affichage des dates et le tri par défaut.", - "management.landing.withCardNavigation.tagsDescription": "Organisez, recherchez et filtrez vos objets enregistrés en fonction de critères spécifiques.", - "management.landing.withCardNavigation.transformDescription": "Organisez vos données ou copiez les derniers documents dans un index centré sur les entités.", - "management.nav.label": "Gestion", - "management.sections.dataTip": "Gérez les données et les sauvegardes de vos clusters.", - "management.sections.dataTitle": "Données", - "management.sections.ingestTip": "Gérez la manière dont les données sont transformées et chargées dans le cluster.", - "management.sections.ingestTitle": "Ingestion", - "management.sections.insightsAndAlertingTip": "Gérez le mode de détection des changements dans vos données.", - "management.sections.insightsAndAlertingTitle": "Alertes et informations exploitables", - "management.sections.kibanaTip": "Personnalisez Kibana et gérez les objets enregistrés.", - "management.sections.kibanaTitle": "Kibana", - "management.sections.section.tip": "Contrôlez l'accès aux fonctionnalités et aux données.", - "management.sections.section.title": "Sécurité", - "management.sections.stackTip": "Gérez votre licence et mettez la Suite à niveau.", - "management.sections.stackTitle": "Suite", - "management.settings.advancedSettingsLabel": "Paramètres avancés", - "management.settings.badge.readOnly.text": "Lecture seule", - "management.settings.badge.readOnly.tooltip": "Impossible d’enregistrer les paramètres avancés", - "management.settings.categoryNames.accessibilityLabel": "Accessibilité", - "management.settings.categoryNames.autocompleteLabel": "Saisie semi-automatique", - "management.settings.categoryNames.bannerLabel": "Bannière", - "management.settings.categoryNames.devToolsLabel": "Outils de développeur", - "management.settings.categoryNames.discoverLabel": "Discover", - "management.settings.categoryNames.enterpriseSearchLabel": "Enterprise Search", - "management.settings.categoryNames.generalLabel": "Général", - "management.settings.categoryNames.machineLearningLabel": "Machine Learning", - "management.settings.categoryNames.notificationsLabel": "Notifications", - "management.settings.categoryNames.observabilityLabel": "Observabilité", - "management.settings.categoryNames.presentationLabLabel": "Ateliers de présentation", - "management.settings.categoryNames.reportingLabel": "Reporting", - "management.settings.categoryNames.rollupsLabel": "Cumuls", - "management.settings.categoryNames.searchLabel": "Recherche", - "management.settings.categoryNames.securitySolutionLabel": "Solution de sécurité", - "management.settings.categoryNames.timelionLabel": "Timelion", - "management.settings.categoryNames.visualizationsLabel": "Visualisation", - "management.settings.categorySearchLabel": "Catégorie", - "management.settings.changeImageLinkText": "Modifier l'image", - "management.settings.customSettingTooltip": "Paramètre personnalisé", - "management.settings.defaultValueText": "Valeur par défaut : {value}", - "management.settings.emptyState.clearNoSearchResultText": "(effacer la recherche)", - "management.settings.emptyState.noSearchResultText": "Aucun paramètre trouvé pour {queryText}. {clearSearch}", - "management.settings.field.changeImageLinkAriaLabel": "Modifier {ariaLabel}", - "management.settings.field.codeEditorSyntaxErrorMessage": "Syntaxe JSON non valide", - "management.settings.field.customSettingAriaLabel": "Paramètre personnalisé", - "management.settings.field.deprecationClickAreaLabel": "Cliquez ici pour afficher la documentation de déclassement pour {name}.", - "management.settings.field.imageChangeErrorMessage": "Impossible d’enregistrer l'image", - "management.settings.field.invalidIconLabel": "Non valide", - "management.settings.field.resetToDefaultLinkAriaLabel": "Réinitialiser {ariaLabel} aux valeurs par défaut", - "management.settings.field.settingIsUnsaved": "Le paramètre n'est actuellement pas enregistré.", - "management.settings.field.unsavedIconLabel": "Non enregistré", - "management.settings.fieldCategory.clearSearchResultText": "(effacer la recherche)", - "management.settings.fieldCategory.searchResultText": "Les termes de la recherche masquent {settingsCount} paramètres {clearSearch}", - "management.settings.fieldInput.color.invalidMessage": "Fournir une valeur de couleur valide", - "management.settings.form.cancelButtonLabel": "Annuler les modifications", - "management.settings.form.countOfSettingsChanged": "{unsavedCount} {unsavedCount, plural, one {paramètre non enregistré} other {paramètres non enregistrés} }{hiddenCount, plural, =0 {masqué} other {, # masqués} }.", - "management.settings.form.requiresPageReloadToastButtonLabel": "Actualiser la page", - "management.settings.form.requiresPageReloadToastDescription": "Un ou plusieurs paramètres nécessitent d’actualiser la page pour pouvoir prendre effet.", - "management.settings.form.saveButtonLabel": "Enregistrer les modifications", - "management.settings.form.saveButtonTooltipWithInvalidChanges": "Corrigez les paramètres non valides avant d'enregistrer.", - "management.settings.form.saveErrorMessage": "Enregistrement impossible", - "management.settings.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.", - "management.settings.globalCalloutTitle": "Les modifications auront une incidence sur tous les paramètres utilisateur dans l'ensemble des espaces", - "management.settings.globalSettingsTabTitle": "Paramètres généraux", - "management.settings.helpText": "Ce paramètre est défini par le serveur Kibana et ne peut pas être modifié.", - "management.settings.offLabel": "Désactivé", - "management.settings.onLabel": "Activé", - "management.settings.resetToDefaultLinkText": "Réinitialiser à la valeur par défaut", - "management.settings.searchBar.unableToParseQueryErrorMessage": "Impossible d'analyser la requête", - "management.settings.searchBarPlaceholder": "Rechercher dans les paramètres avancés", - "management.settings.spaceCalloutSubtitle": "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.", - "management.settings.spaceCalloutTitle": "Les modifications affecteront l'espace actuel.", - "management.settings.spaceSettingsTabTitle": "Paramètres de l'espace", - "monaco.esql.hover.policyEnrichedFields": "**Champs**", - "monaco.esql.hover.policyIndexes": "**Indexes**", - "monaco.esql.hover.policyMatchingField": "**Champ correspondant**", - "monaco.painlessLanguage.autocomplete.docKeywordDescription": "Accéder à une valeur de champ dans un script au moyen de la syntaxe doc['field_name']", - "monaco.painlessLanguage.autocomplete.emitKeywordDescription": "Émettre une valeur sans rien renvoyer", - "monaco.painlessLanguage.autocomplete.fieldValueDescription": "Récupérer la valeur du champ \"{fieldName}\"", - "monaco.painlessLanguage.autocomplete.paramsKeywordDescription": "Accéder aux variables transmises dans le script", - "newsfeed.emptyPrompt.noNewsText": "Si votre instance Kibana n'a pas accès à Internet, demandez à votre administrateur de désactiver cette fonctionnalité. Sinon, nous continuerons d'essayer de récupérer les actualités.", - "newsfeed.emptyPrompt.noNewsTitle": "Pas d'actualités ?", - "newsfeed.flyoutList.closeButtonLabel": "Fermer", - "newsfeed.flyoutList.versionTextLabel": "{version}", - "newsfeed.flyoutList.whatsNewTitle": "Nouveautés Elastic", - "newsfeed.headerButton.readAriaLabel": "Menu du fil d'actualités – Tous les éléments lus", - "newsfeed.headerButton.unreadAriaLabel": "Menu du fil d'actualités – Éléments non lus disponibles", - "newsfeed.loadingPrompt.gettingNewsText": "Obtention des dernières actualités…", - "observabilityAlertDetails.alertActiveTimeRangeAnnotation.detailsTooltip": "Actif", - "observabilityAlertDetails.alertAnnotation.detailsTooltip": "Alerte démarrée", - "observabilityAlertDetails.alertThresholdAnnotation.detailsTooltip": "Alerte démarrée", - "observabilityAlertDetails.alertThresholdTimeRangeRect.detailsTooltip": "Seuil", - "presentationPanel.action.customizePanel.displayName": "Paramètres", - "presentationPanel.action.customizePanel.flyout.cancelButtonTitle": "Annuler", - "presentationPanel.action.customizePanel.flyout.optionsMenuForm.editFiltersButtonAriaLabel": "Modifier les filtres", - "presentationPanel.action.customizePanel.flyout.optionsMenuForm.editFiltersButtonLabel": "Modifier", - "presentationPanel.action.customizePanel.flyout.optionsMenuForm.editQueryButtonAriaLabel": "Modifier la recherche", - "presentationPanel.action.customizePanel.flyout.optionsMenuForm.editQueryButtonLabel": "Modifier", - "presentationPanel.action.customizePanel.flyout.optionsMenuForm.panelDescriptionAriaLabel": "Entrer une description personnalisée pour votre panneau", - "presentationPanel.action.customizePanel.flyout.optionsMenuForm.panelDescriptionFormRowLabel": "Description", - "presentationPanel.action.customizePanel.flyout.optionsMenuForm.panelTimeRangeFormRowLabel": "Plage temporelle", - "presentationPanel.action.customizePanel.flyout.optionsMenuForm.panelTitleFormRowLabel": "Titre", - "presentationPanel.action.customizePanel.flyout.optionsMenuForm.panelTitleInputAriaLabel": "Entrez un titre personnalisé pour le panneau.", - "presentationPanel.action.customizePanel.flyout.optionsMenuForm.resetCustomDescriptionButtonAriaLabel": "Réinitialiser la description à sa valeur par défaut", - "presentationPanel.action.customizePanel.flyout.optionsMenuForm.resetCustomTitleButtonAriaLabel": "Réinitialiser le titre à sa valeur par défaut", - "presentationPanel.action.customizePanel.flyout.optionsMenuForm.resetCustomTitleButtonLabel": "Réinitialiser à la valeur par défaut", - "presentationPanel.action.customizePanel.flyout.optionsMenuForm.showCustomTimeRangeSwitch": "Appliquer une plage temporelle personnalisée", - "presentationPanel.action.customizePanel.flyout.optionsMenuForm.showTitle": "Afficher le titre", - "presentationPanel.action.customizePanel.flyout.saveButtonTitle": "Appliquer", - "presentationPanel.action.customizePanel.flyout.title": "Paramètres", - "presentationPanel.action.customizePanel.modal.optionsMenuForm.resetCustomDescriptionButtonLabel": "Réinitialiser à la valeur par défaut", - "presentationPanel.action.editPanel.displayName": "Modifier {value}", - "presentationPanel.action.inspectPanel.displayName": "Inspecter", - "presentationPanel.action.inspectPanel.untitledEmbeddableFilename": "[Aucun titre]", - "presentationPanel.action.removePanel.displayName": "Supprimer", - "presentationPanel.ariaLabel": "Panneau", - "presentationPanel.badgeTrigger.description": "Des actions de badge apparaissent dans la barre de titre lorsqu'un élément incorporable est en cours de chargement dans un panneau.", - "presentationPanel.badgeTrigger.title": "Badges du panneau", - "presentationPanel.contextMenu.ariaLabel": "Options de panneau", - "presentationPanel.contextMenu.ariaLabelWithIndex": "Options pour le panneau {index}", - "presentationPanel.contextMenu.ariaLabelWithTitle": "Options de panneau pour {title}", - "presentationPanel.contextMenu.loadingTitle": "Options", - "presentationPanel.contextMenuTrigger.description": "Une nouvelle action sera ajoutée au menu contextuel du panneau", - "presentationPanel.contextMenuTrigger.title": "Menu contextuel", - "presentationPanel.emptyErrorMessage": "Erreur", - "presentationPanel.enhancedAriaLabel": "Panneau : {title}", - "presentationPanel.error.editButton": "Modifier {value}", - "presentationPanel.error.errorWhenLoadingPanel": "Une erreur s'est produite lors du chargement de ce panneau.", - "presentationPanel.filters.filtersTitle": "Filtres", - "presentationPanel.filters.queryTitle": "Recherche", - "presentationPanel.header.titleAriaLabel": "Cliquez pour modifier le titre : {title}", - "presentationPanel.hoverTrigger.description": "Une nouvelle action sera ajoutée au menu flottant du panneau", - "presentationPanel.hoverTrigger.title": "Menu contextuel du panneau", - "presentationPanel.notificationTrigger.description": "Les actions de notification apparaissent dans l'angle supérieur droit des panneaux.", - "presentationPanel.notificationTrigger.title": "Notifications du panneau", - "presentationPanel.placeholderTitle": "[Aucun titre]", - "presentationUtil.dashboardDrilldownConfig.components.openInNewTab": "Ouvrir le tableau de bord dans un nouvel onglet", - "presentationUtil.dashboardDrilldownConfig.components.useCurrentDateRange": "Utiliser la plage de dates du tableau de bord d'origine", - "presentationUtil.dashboardDrilldownConfig.components.useCurrentFiltersLabel": "Utiliser les filtres et la requête du tableau de bord d'origine", - "presentationUtil.dashboardPicker.noDashboardOptionLabel": "Sélectionner le tableau de bord", - "presentationUtil.dashboardPicker.searchDashboardPlaceholder": "Recherche dans les tableaux de bord…", - "presentationUtil.expressionInput.argReferenceAliasesDetail": "{BOLD_MD_TOKEN}Alias{BOLD_MD_TOKEN} : {aliases}", - "presentationUtil.expressionInput.argReferenceDefaultDetail": "{BOLD_MD_TOKEN}Par défaut{BOLD_MD_TOKEN} : {defaultVal}", - "presentationUtil.expressionInput.argReferenceRequiredDetail": "{BOLD_MD_TOKEN}Requis{BOLD_MD_TOKEN} : {required}", - "presentationUtil.expressionInput.argReferenceTypesDetail": "{BOLD_MD_TOKEN}Types{BOLD_MD_TOKEN} : {types}", - "presentationUtil.expressionInput.functionReferenceAccepts": "{BOLD_MD_TOKEN}Accepte{BOLD_MD_TOKEN} : {acceptTypes}", - "presentationUtil.expressionInput.functionReferenceReturns": "{BOLD_MD_TOKEN}Renvoie{BOLD_MD_TOKEN} : {returnType}", - "presentationUtil.fieldPicker.noFieldsLabel": "Aucun champ correspondant", - "presentationUtil.fieldPicker.selectableAriaLabel": "Sélectionner un champ", - "presentationUtil.fieldSearch.fieldFilterButtonLabel": "Filtrer par type", - "presentationUtil.fieldSearch.searchPlaceHolder": "Rechercher les noms de champs", - "presentationUtil.labs.components.browserSwitchHelp": "Active l'atelier pour ce navigateur et persiste après sa fermeture.", - "presentationUtil.labs.components.browserSwitchName": "Navigateur", - "presentationUtil.labs.components.calloutHelp": "Actualiser pour appliquer les modifications", - "presentationUtil.labs.components.closeButtonLabel": "Fermer", - "presentationUtil.labs.components.descriptionMessage": "Essayez des fonctionnalités en cours ou en version d'évaluation technique.", - "presentationUtil.labs.components.disabledStatusMessage": "Par défaut : {status}", - "presentationUtil.labs.components.enabledStatusMessage": "Par défaut : {status}", - "presentationUtil.labs.components.kibanaSwitchHelp": "Active cet atelier pour tous les utilisateurs Kibana.", - "presentationUtil.labs.components.kibanaSwitchName": "Kibana", - "presentationUtil.labs.components.labFlagsLabel": "Indicateurs d'atelier", - "presentationUtil.labs.components.noProjectsinSolutionMessage": "Aucun atelier actuellement dans {solutionName}.", - "presentationUtil.labs.components.noProjectsMessage": "Aucun atelier actuellement disponible.", - "presentationUtil.labs.components.overrideFlagsLabel": "Remplacements", - "presentationUtil.labs.components.overridenIconTipLabel": "Valeur par défaut remplacée", - "presentationUtil.labs.components.resetToDefaultLabel": "Réinitialiser aux valeurs par défaut", - "presentationUtil.labs.components.sessionSwitchHelp": "Active l’atelier pour cette session de navigateur afin de le réinitialiser lors de sa fermeture.", - "presentationUtil.labs.components.sessionSwitchName": "Session", - "presentationUtil.labs.components.titleLabel": "Ateliers", - "presentationUtil.labs.enableByValueEmbeddableDescription": "Active la prise en charge pour les éléments d'incorporation by-value dans Canvas", - "presentationUtil.labs.enableByValueEmbeddableName": "Éléments d'incorporation By-Value", - "presentationUtil.labs.enableDeferBelowFoldProjectDescription": "Les panneaux sous \"le pli\" (la zone masquée en dessous de la fenêtre accessible en faisant défiler), ne se chargeront pas immédiatement, mais seulement lorsqu'ils entreront dans la fenêtre d'affichage.", - "presentationUtil.labs.enableDeferBelowFoldProjectName": "Différer le chargement des panneaux sous \"le pli\"", - "presentationUtil.saveModalDashboard.addToDashboardLabel": "Ajouter au tableau de bord", - "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.existingDashboardRequiredMessage": "Le tableau de bord est requis", - "presentationUtil.saveModalDashboard.libraryOptionLabel": "Ajouter à la bibliothèque", - "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", - "randomSampling.ui.sliderControl.accuracyLabel": "Précision", - "randomSampling.ui.sliderControl.performanceLabel": "Performances", - "reactPackages.mountPointPortal.errorMessage": "Erreur lors du rendu du contenu du portail.", - "reporting.apiClient.unknownError": "La tâche de reporting {job} a échoué. Erreur inconnue.", - "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.", - "reporting.commonExportTypesHelpers.failedToDecryptReportJobDataErrorMessage": "Impossible de déchiffrer les données de la tâche de reporting. Veuillez vous assurer que {encryptionKey} est défini et générez à nouveau ce rapport. {err}", - "reporting.commonExportTypesHelpers.missingJobHeadersErrorMessage": "Les en-têtes de tâche sont manquants", - "reporting.jobCreatedBy.unknownUserPlaceholderText": "Inconnu", - "reporting.jobStatusDetail.attemptXofY": "Tentative {attempts} sur {max_attempts}.", - "reporting.jobStatusDetail.deprecatedText": "Il s'agit d'un type d'exportation déclassé. L'automatisation de ce rapport devra être à nouveau créée pour une question de compatibilité avec les futures versions de Kibana.", - "reporting.jobStatusDetail.errorText": "Consultez les informations de rapport pour plus de détails sur l'erreur.", - "reporting.jobStatusDetail.pendingStatusReachedText": "En attente du traitement de la tâche.", - "reporting.jobStatusDetail.timeoutSeconds": "{timeout} secondes", - "reporting.jobStatusDetail.timeoutSecondsUnknown": "Inconnu", - "reporting.jobStatusDetail.unknownText": "Inconnu", - "reporting.jobStatusDetail.warningsText": "Consultez les informations de rapport pour plus de détails sur les avertissements.", - "reporting.jobStatuses.completedText": "Terminé", - "reporting.jobStatuses.failedText": "Échoué", - "reporting.jobStatuses.pendingText": "En attente", - "reporting.jobStatuses.processingText": "Traitement", - "reporting.jobStatuses.warningText": "Terminé", - "reporting.jobType.csvOutputName": "CSV", - "reporting.jobType.pdfOutputName": "PDF", - "reporting.jobType.pngOutputName": "PNG", - "reporting.jobWarning.csvContainsFormulas": "Votre fichier CSV contient des caractères que les applications de feuilles de calcul pourraient considérer comme des formules.", - "reporting.jobWarning.exportTypeDeprecated": "Il s'agit d'un type d'exportation déclassé. L'automatisation de ce rapport devra être à nouveau créée pour une question de compatibilité avec les futures versions de Kibana.", - "reporting.jobWarning.maxSizeReachedTooltip": "Votre recherche a atteint la taille maximale et contient des données partielles.", - "reporting.pngV2.generateButtonLabel": "Exporter un fichier", - "reporting.pngV2.helpText": "Sélectionnez le type de fichier que vous souhaitez exporter pour cette visualisation.", - "reporting.printablePdfV2.generateButtonLabel": "Exporter un fichier", - "reporting.printablePdfV2.helpText": "Sélectionnez le type de fichier que vous souhaitez exporter pour cette visualisation.", - "reporting.share.contextMenu.export.csvReportsButtonLabel": "Exporter", - "reporting.share.contextMenu.pdfReportsButtonLabel": "Rapports PDF", - "reporting.share.contextMenu.pngReportsButtonLabel": "Rapports PNG", - "reporting.share.csv.reporting.helpTextCSV": "Exporter un fichier CSV à partir de ce {objectType}.", - "reporting.share.generateButtonLabelCSV": "Générer un CSV", - "reporting.share.modalContent.notification.reportingErrorTitle": "Impossible de créer le rapport", - "reporting.share.modalContent.successfullyQueuedReportNotificationDescription": "Suivre sa progression dans {path}", - "reporting.share.modalContent.successfullyQueuedReportNotificationTitle": "Rapport mis en file d'attente pour {objectType}", - "reporting.share.panelAction.csvDownloadStartedMessage": "Votre CSV sera téléchargé dans un instant.", - "reporting.share.panelAction.csvDownloadStartedTitle": "Téléchargement du CSV démarré", - "reporting.share.panelAction.csvReportStartedTitle": "Rapport mis en file d'attente pour CSV", - "reporting.share.panelAction.downloadCsvPanelTitle": "Télécharger CSV", - "reporting.share.panelAction.failedCsvReportMessage": "Nous n'avons pas pu télécharger votre CSV pour le moment.", - "reporting.share.panelAction.failedCsvReportTitle": "Le téléchargement du CSV a échoué", - "reporting.share.panelAction.failedGenerateCsvReportMessage": "Nous n'avons pas pu générer votre CSV pour le moment.", - "reporting.share.panelAction.failedGenerateCsvReportTitle": "Échec du rapport CSV", - "reporting.share.panelAction.generateCsvPanelTitle": "Générer des rapports CSV", - "reporting.share.panelAction.reportLink.reportingSectionUrlLinkLabel": "Gestion de la Suite > Reporting", - "reporting.share.panelAction.successfullyQueuedReportNotificationDescription": "Suivre sa progression dans {path}", - "reporting.share.panelContent.advancedOptions": "Options avancées", - "reporting.share.panelContent.copyUrlButtonLabel": "Copier l'URL POST", - "reporting.share.panelContent.generateButtonLabel": "Générer {reportingType}", - "reporting.share.panelContent.generationTimeDescription": "La génération des {reportingType}s peut prendre une ou deux minutes en fonction de la taille de votre {objectType}.", - "reporting.share.panelContent.howToCallGenerationDescription": "Sinon, copiez cette URL POST pour appeler la génération depuis l'extérieur de Kibana ou à partir de Watcher.", - "reporting.share.panelContent.notification.reportingErrorTitle": "Impossible de créer le rapport", - "reporting.share.panelContent.notification.reportingErrorToastMessage": "Nous n'avons pas pu créer de rapport pour le moment.", - "reporting.share.panelContent.saveWorkDescription": "Veuillez enregistrer votre travail avant de générer un rapport.", - "reporting.share.panelContent.successfullyQueuedReportNotificationDescription": "Suivre sa progression dans {path}", - "reporting.share.panelContent.successfullyQueuedReportNotificationTitle": "Rapport mis en file d'attente pour {objectType}", - "reporting.share.panelContent.unsavedStateAndExceedsMaxLengthDescription": "Impossible de copier cette URL.", - "reporting.share.panelContent.unsavedStateAndExceedsMaxLengthTitle": "URL trop longue", - "reporting.share.panelContent.unsavedStateAndExceedsMaxLengthTrySaveDescription": "Impossible de copier cette URL. Essayez d'enregistrer votre travail.", - "reporting.share.panelContent.unsavedStateErrorText": "Enregistrez votre travail avant de copier cette URL.", - "reporting.share.panelContent.unsavedStateErrorTitle": "Travail non enregistré", - "reporting.share.publicNotifier.reportLink.reportingSectionUrlLinkLabel": "Gestion de la Suite > Reporting", - "reporting.share.screenCapturePanelContent.canvasLayoutHelpText": "Supprimer les bordures et le logo de pied de page", - "reporting.share.screenCapturePanelContent.canvasLayoutLabel": "Mise en page complète", - "reporting.share.screenCapturePanelContent.optimizeForPrintingHelpText": "Utilise plusieurs pages, affichant au maximum 2 visualisations par page", - "reporting.share.screenCapturePanelContent.optimizeForPrintingLabel": "Optimiser pour l'impression", - "reporting.shareContextMenu.ExportsButtonLabel": "PDF", - "reporting.shareContextMenu.ExportsButtonLabelPNG": "Export PNG", - "savedObjects.confirmModal.cancelButtonLabel": "Annuler", - "savedObjects.confirmModal.overwriteButtonLabel": "Écraser", - "savedObjects.confirmModal.overwriteConfirmationMessage": "Êtes-vous sûr de vouloir écraser {title} ?", - "savedObjects.confirmModal.overwriteTitle": "Écraser {name} ?", - "savedObjects.confirmModal.saveDuplicateButtonLabel": "Enregistrer {name}", - "savedObjects.confirmModal.saveDuplicateConfirmationMessage": "Il y a déjà une occurrence de {name} avec le titre \"{title}\". Voulez-vous tout de même enregistrer ?", - "savedObjects.overwriteRejectedDescription": "La confirmation d'écrasement a été rejetée.", - "savedObjects.saveDuplicateRejectedDescription": "La confirmation d'enregistrement avec un doublon de titre a été rejetée.", - "savedObjects.saveModal.cancelButtonLabel": "Annuler", - "savedObjects.saveModal.descriptionLabel": "Description", - "savedObjects.saveModal.duplicateTitleDescription": "L'enregistrement de \"{title}\" crée un doublon de titre.", - "savedObjects.saveModal.duplicateTitleLabel": "Ce {objectType} existe déjà.", - "savedObjects.saveModal.optional": "Facultatif", - "savedObjects.saveModal.saveAsNewLabel": "Enregistrer en tant que nouveau {objectType}", - "savedObjects.saveModal.saveButtonLabel": "Enregistrer", - "savedObjects.saveModal.saveTitle": "Enregistrer {objectType}", - "savedObjects.saveModal.titleLabel": "Titre", - "savedObjects.saveModal.titleRequired": "Un titre est requis", - "savedObjects.saveModalOrigin.addToOriginLabel": "Ajouter", - "savedObjects.saveModalOrigin.originAfterSavingSwitchLabel": "{originVerb} à {origin} après l'enregistrement", - "savedObjects.saveModalOrigin.returnToOriginLabel": "Renvoyer", - "savedObjects.saveModalOrigin.saveAndReturnLabel": "Enregistrer et revenir", - "savedObjectsFinder.advancedSettings.listingLimitText": "Nombre d'objets à récupérer pour les pages de listing", - "savedObjectsFinder.advancedSettings.listingLimitTitle": "Limite de listing d’objets", - "savedObjectsFinder.advancedSettings.perPageText": "Nombre d'objets à afficher par page dans la boîte de dialogue de chargement", - "savedObjectsFinder.advancedSettings.perPageTitle": "Objets par page", - "savedObjectsFinder.filterButtonLabel": "Types", - "savedObjectsFinder.titleDescription": "Titre de l'objet enregistré", - "savedObjectsFinder.titleName": "Titre", - "savedObjectsFinder.typeDescription": "Type de l'objet enregistré", - "savedObjectsFinder.typeName": "Type", - "savedObjectsManagement.breadcrumb.index": "Objets enregistrés", - "savedObjectsManagement.breadcrumb.inspect": "Inspecter {savedObjectType}", - "savedObjectsManagement.copyToSpace.actionDescription": "Effectuer une copie de cet objet enregistré dans un ou plusieurs espaces", - "savedObjectsManagement.copyToSpace.actionTitle": "Copier vers les espaces", - "savedObjectsManagement.deleteConfirm.modalDeleteButtonLabel": "Supprimer", - "savedObjectsManagement.deleteConfirm.modalDescription": "Cette action supprime définitivement l'objet de Kibana.", - "savedObjectsManagement.deleteConfirm.modalTitle": "Supprimer \"{title}\" ?", - "savedObjectsManagement.deleteSavedObjectsConfirmModalDescription": "Cette action supprimera les objets enregistrés suivants :", - "savedObjectsManagement.importSummary.createdCountHeader": "{createdCount} nouveau(x)", - "savedObjectsManagement.importSummary.createdOutcomeLabel": "Créé", - "savedObjectsManagement.importSummary.errorCountHeader": "{errorCount} erreur(s)", - "savedObjectsManagement.importSummary.errorOutcomeLabel": "{errorMessage}", - "savedObjectsManagement.importSummary.headerLabel": "{importCount, plural, one {1 objet importé} other {# objets importés}}", - "savedObjectsManagement.importSummary.overwrittenCountHeader": "{overwrittenCount} écrasé(s)", - "savedObjectsManagement.importSummary.overwrittenOutcomeLabel": "Écrasé", - "savedObjectsManagement.importSummary.warnings.defaultButtonLabel": "Go", - "savedObjectsManagement.managementSectionLabel": "Objets enregistrés", - "savedObjectsManagement.objects.savedObjectsDescription": "Importez, exportez et gérez vos objets enregistrés.", - "savedObjectsManagement.objects.savedObjectsTitle": "Objets enregistrés", - "savedObjectsManagement.objectsTable.deleteConfirmModal.cannotDeleteCallout.content": "{objectCount, plural, one {# objet est} other {# objets sont}} masqués et ne peuvent être supprimés.", - "savedObjectsManagement.objectsTable.deleteConfirmModal.cannotDeleteCallout.title": "Certains objets ont été exclus", - "savedObjectsManagement.objectsTable.deleteConfirmModal.sharedObjectsCallout.content": "Les objets partagés sont supprimés de tous les espaces dans lesquels ils se trouvent.", - "savedObjectsManagement.objectsTable.deleteConfirmModal.sharedObjectsCallout.title": "{sharedObjectsCount, plural, one {# objet enregistré est partagé} other {# de vos objets enregistrés sont partagés}}.", - "savedObjectsManagement.objectsTable.deleteSavedObjectsConfirmModal.cancelButtonLabel": "Annuler", - "savedObjectsManagement.objectsTable.deleteSavedObjectsConfirmModal.deleteButtonLabel": "Supprimer {objectsCount, plural, one {# objet} other {# objets}}", - "savedObjectsManagement.objectsTable.deleteSavedObjectsConfirmModal.idColumnName": "ID", - "savedObjectsManagement.objectsTable.deleteSavedObjectsConfirmModal.titleColumnName": "Titre", - "savedObjectsManagement.objectsTable.deleteSavedObjectsConfirmModal.typeColumnName": "Type", - "savedObjectsManagement.objectsTable.deleteSavedObjectsConfirmModalTitle": "Supprimer les objets enregistrés", - "savedObjectsManagement.objectsTable.export.successNotification": "Votre fichier est en cours de téléchargement en arrière-plan.", - "savedObjectsManagement.objectsTable.export.successWithExcludedObjectsNotification": "Votre fichier est en cours de téléchargement en arrière-plan. Certains objets ont été exclus de l'export. Vous trouverez la liste des objets exclus à la dernière ligne du fichier exporté.", - "savedObjectsManagement.objectsTable.export.successWithMissingRefsNotification": "Votre fichier est en cours de téléchargement en arrière-plan. Certains objets associés sont introuvables. Vous trouverez la liste des objets manquants à la dernière ligne du fichier exporté.", - "savedObjectsManagement.objectsTable.export.toastErrorMessage": "Impossible de générer l'export : {error}", - "savedObjectsManagement.objectsTable.exportObjectsConfirmModal.cancelButtonLabel": "Annuler", - "savedObjectsManagement.objectsTable.exportObjectsConfirmModal.exportAllButtonLabel": "Exporter tout", - "savedObjectsManagement.objectsTable.exportObjectsConfirmModal.exportOptionsLabel": "Options", - "savedObjectsManagement.objectsTable.exportObjectsConfirmModal.includeReferencesDeepLabel": "Inclure les objets associés", - "savedObjectsManagement.objectsTable.exportObjectsConfirmModalDescription": "Sélectionner les types d'objet à exporter", - "savedObjectsManagement.objectsTable.exportObjectsConfirmModalTitle": "Exporter {filteredItemCount, plural, one {# objet} other {# objets}}", - "savedObjectsManagement.objectsTable.flyout.errorCalloutTitle": "Désolé, une erreur est survenue.", - "savedObjectsManagement.objectsTable.flyout.import.cancelButtonLabel": "Annuler", - "savedObjectsManagement.objectsTable.flyout.import.confirmButtonLabel": "Importer", - "savedObjectsManagement.objectsTable.flyout.importFileErrorMessage": "Impossible de traiter le fichier en raison d'une erreur : \"{error}\".", - "savedObjectsManagement.objectsTable.flyout.importPromptText": "Importer", - "savedObjectsManagement.objectsTable.flyout.importSavedObjectTitle": "Importer les objets enregistrés", - "savedObjectsManagement.objectsTable.flyout.importSuccessful.confirmAllChangesButtonLabel": "Confirmer toutes les modifications", - "savedObjectsManagement.objectsTable.flyout.importSuccessful.confirmButtonLabel": "Terminé", - "savedObjectsManagement.objectsTable.flyout.indexPatternConflictsCalloutLinkText": "créer une nouvelle vue de données", - "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.flyout.indexPatternConflictsTitle": "Conflits de vues de données", - "savedObjectsManagement.objectsTable.flyout.renderConflicts.columnCountDescription": "Nombre d'objets concernés", - "savedObjectsManagement.objectsTable.flyout.renderConflicts.columnCountName": "Décompte", - "savedObjectsManagement.objectsTable.flyout.renderConflicts.columnIdDescription": "ID de la vue de données", - "savedObjectsManagement.objectsTable.flyout.renderConflicts.columnIdName": "ID", - "savedObjectsManagement.objectsTable.flyout.renderConflicts.columnNewIndexPatternName": "Nouvelle vue de données", - "savedObjectsManagement.objectsTable.flyout.renderConflicts.columnSampleOfAffectedObjectsDescription": "Exemple d'objets concernés", - "savedObjectsManagement.objectsTable.flyout.renderConflicts.columnSampleOfAffectedObjectsName": "Exemple d'objets concernés", - "savedObjectsManagement.objectsTable.flyout.selectFileToImportFormRowLabel": "Sélectionner un fichier à importer", - "savedObjectsManagement.objectsTable.header.exportButtonLabel": "Exporter {filteredCount, plural, one{# objet} other {# objets}}", - "savedObjectsManagement.objectsTable.header.importButtonLabel": "Importer", - "savedObjectsManagement.objectsTable.header.refreshButtonLabel": "Actualiser", - "savedObjectsManagement.objectsTable.header.savedObjectsTitle": "Objets enregistrés", - "savedObjectsManagement.objectsTable.howToDeleteSavedObjectsDescription": "Gérez et partagez vos objets enregistrés. Pour modifier les données sous-jacentes d'un objet, accédez à l’application associée.", - "savedObjectsManagement.objectsTable.importModeControl.createNewCopies.disabledText": "Vérifiez si les objets ont déjà été copiés ou importés.", - "savedObjectsManagement.objectsTable.importModeControl.createNewCopies.disabledTitle": "Rechercher les objets existants", - "savedObjectsManagement.objectsTable.importModeControl.createNewCopies.enabledText": "Utilisez cette option pour créer une ou plusieurs copies de l'objet.", - "savedObjectsManagement.objectsTable.importModeControl.createNewCopies.enabledTitle": "Créer de nouveaux objets avec des ID aléatoires", - "savedObjectsManagement.objectsTable.importModeControl.importOptionsTitle": "Options d'importation", - "savedObjectsManagement.objectsTable.importModeControl.overwrite.disabledLabel": "Demander une action en cas de conflit", - "savedObjectsManagement.objectsTable.importModeControl.overwrite.enabledLabel": "Écraser automatiquement les conflits", - "savedObjectsManagement.objectsTable.importSummary.unsupportedTypeError": "Type d'objet non pris en charge", - "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.cancelButtonText": "Ignorer", - "savedObjectsManagement.objectsTable.overwriteModal.overwriteButtonText": "Écraser", - "savedObjectsManagement.objectsTable.overwriteModal.selectControlLabel": "ID d'objet", - "savedObjectsManagement.objectsTable.overwriteModal.title": "Écraser {type} ?", - "savedObjectsManagement.objectsTable.relationships.columnActions.inspectActionDescription": "Inspecter cet objet enregistré", - "savedObjectsManagement.objectsTable.relationships.columnActions.inspectActionName": "Inspecter", - "savedObjectsManagement.objectsTable.relationships.columnActionsName": "Actions", - "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.columnRelationship.childAsValue": "Enfant", - "savedObjectsManagement.objectsTable.relationships.columnRelationship.parentAsValue": "Parent", - "savedObjectsManagement.objectsTable.relationships.columnRelationshipName": "Relation directe", - "savedObjectsManagement.objectsTable.relationships.columnTitleDescription": "Titre de l'objet enregistré", - "savedObjectsManagement.objectsTable.relationships.columnTitleName": "Titre", - "savedObjectsManagement.objectsTable.relationships.columnTypeDescription": "Type de l'objet enregistré", - "savedObjectsManagement.objectsTable.relationships.columnTypeName": "Type", - "savedObjectsManagement.objectsTable.relationships.invalidRelationShip": "Cet objet enregistré présente des relations non valides.", - "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.relationships.renderErrorMessage": "Erreur", - "savedObjectsManagement.objectsTable.relationships.search.filters.relationship.childAsValue.view": "Enfant", - "savedObjectsManagement.objectsTable.relationships.search.filters.relationship.name": "Relation directe", - "savedObjectsManagement.objectsTable.relationships.search.filters.relationship.parentAsValue.view": "Parent", - "savedObjectsManagement.objectsTable.relationships.search.filters.type.name": "Type", - "savedObjectsManagement.objectsTable.searchBar.unableToParseQueryErrorMessage": "Impossible d'analyser la requête", - "savedObjectsManagement.objectsTable.table.columnActions.inspectActionDescription": "Inspecter cet objet enregistré", - "savedObjectsManagement.objectsTable.table.columnActions.inspectActionName": "Inspecter", - "savedObjectsManagement.objectsTable.table.columnActions.viewRelationshipsActionDescription": "Afficher les relations entre cet objet enregistré et d'autres objets enregistrés", - "savedObjectsManagement.objectsTable.table.columnActions.viewRelationshipsActionName": "Relations", - "savedObjectsManagement.objectsTable.table.columnActionsName": "Actions", - "savedObjectsManagement.objectsTable.table.columnTitleDescription": "Titre de l'objet enregistré", - "savedObjectsManagement.objectsTable.table.columnTitleName": "Titre", - "savedObjectsManagement.objectsTable.table.columnTypeDescription": "Type de l'objet enregistré", - "savedObjectsManagement.objectsTable.table.columnTypeName": "Type", - "savedObjectsManagement.objectsTable.table.deleteButtonLabel": "Supprimer", - "savedObjectsManagement.objectsTable.table.deleteButtonTitle": "Impossible de supprimer les objets enregistrés", - "savedObjectsManagement.objectsTable.table.deleteDisabledTooltip": "Les objets sélectionnés ne peuvent pas être supprimés, car il s'agit d'objets cachés.", - "savedObjectsManagement.objectsTable.table.exportButtonLabel": "Exporter", - "savedObjectsManagement.objectsTable.table.exportPopoverButtonLabel": "Exporter", - "savedObjectsManagement.objectsTable.table.lastUpdatedColumnTitle": "Dernière mise à jour", - "savedObjectsManagement.objectsTable.table.tooManyResultsLabel": "Affichage de {limit} sur {totalItemCount, plural, one {# objet} other {# objets}}", - "savedObjectsManagement.objectsTable.table.typeFilterName": "Type", - "savedObjectsManagement.objectsTable.table.updatedDateUnknownLabel": "Dernière mise à jour inconnue", - "savedObjectsManagement.objectsTable.unableFindSavedObjectNotificationMessage": "Objet enregistré introuvable", - "savedObjectsManagement.objectsTable.unableFindSavedObjectsNotificationMessage": "Objets enregistrés introuvables", - "savedObjectsManagement.objectView.deleteSavedObjectNotificationMessage": "Suppression de l'objet {type} \"{title}\"", - "savedObjectsManagement.objectView.unableDeleteSavedObjectNotificationMessage": "Impossible de supprimer l'objet {type} \"{title}\"", - "savedObjectsManagement.objectView.unableFindSavedObjectNotificationMessage": "Objet enregistré introuvable", - "savedObjectsManagement.shareToSpace.actionDescription": "Partager cet objet dans un ou plusieurs espaces", - "savedObjectsManagement.shareToSpace.actionTitle": "Partager dans les espaces", - "savedObjectsManagement.shareToSpace.columnDescription": "Espaces auxquels cet objet est actuellement attribué", - "savedObjectsManagement.shareToSpace.columnTitle": "Espaces", - "savedObjectsManagement.shareToSpace.globalObjectTypeContent": "Cet objet enregistré est disponible dans tous les espaces et ne peut pas être modifié.", - "savedObjectsManagement.shareToSpace.globalObjectTypeTitle": "Objet enregistré global", - "savedObjectsManagement.shareToSpace.isolatedObjectTypeContent": "Cet objet enregistré est disponible dans un seul espace ; il ne peut pas être attribué à plusieurs espaces.", - "savedObjectsManagement.shareToSpace.isolatedObjectTypeTitle": "Objet enregistré isolé", - "savedObjectsManagement.shareToSpace.shareableSoonObjectTypeContent": "Cet objet enregistré est disponible dans un seul espace. Dans une prochaine version, vous pourrez l'attribuer à plusieurs espaces.", - "savedObjectsManagement.shareToSpace.shareableSoonObjectTypeTitle": "Bientôt disponible : Attribuer un objet enregistré à plusieurs espaces", - "savedObjectsManagement.view.copyToClipboardLabel": "Copier dans le presse-papiers", - "savedObjectsManagement.view.deleteItemButtonLabel": "Supprimer", - "savedObjectsManagement.view.fieldDoesNotExistErrorMessage": "Un champ associé à cet objet n'existe plus dans la vue de données.", - "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.howToFixErrorDescriptionLinkText": "API des objets enregistrés", - "savedObjectsManagement.view.indexPatternDoesNotExistErrorMessage": "La vue de données associée à cet objet n'existe plus.", - "savedObjectsManagement.view.inspectCodeEditorAriaLabel": "inspecter { title }", - "savedObjectsManagement.view.inspectItemTitle": "Inspecter {title}", - "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.", - "savedObjectsManagement.view.viewItemButtonLabel": "Afficher {title}", - "savedSearch.contentManagementType": "Recherche enregistrée", - "savedSearch.kibana_context.filters.help": "Spécifier des filtres génériques Kibana", - "savedSearch.kibana_context.help": "Met à jour le contexte général de Kibana.", - "savedSearch.kibana_context.q.help": "Spécifier une recherche en texte libre Kibana", - "savedSearch.kibana_context.savedSearchId.help": "Spécifier l'ID de recherche enregistrée à utiliser pour les requêtes et les filtres", - "savedSearch.kibana_context.timeRange.help": "Spécifier le filtre de plage temporelle Kibana", - "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}", - "searchApiPanels.cloudIdDetails.cloudId.description": "Des bibliothèques et des connecteurs clients peuvent utiliser cet identificateur unique propre à Elastic Cloud.", - "searchApiPanels.cloudIdDetails.cloudId.title": "Identifiant du cloud", - "searchApiPanels.cloudIdDetails.description": "Soyez prêt à ingérer et rechercher vos données en choisissant une option de connexion :", - "searchApiPanels.cloudIdDetails.elasticsearchEndpoint.description": "La méthode la plus courante pour établir une connexion Elasticsearch.", - "searchApiPanels.cloudIdDetails.elasticsearchEndpoint.recommendedBadge": "Recommandé", - "searchApiPanels.cloudIdDetails.elasticsearchEndpoint.title": "Point de terminaison Elasticsearch", - "searchApiPanels.cloudIdDetails.title": "Copiez vos informations de connexion", - "searchApiPanels.pipeline.overview.anonymization.description": "Retirez les informations sensibles des documents avant l'indexation.", - "searchApiPanels.pipeline.overview.anonymization.title": "Anonymiser les données", - "searchApiPanels.pipeline.overview.arrayJsonHandling.description": "Exécutez des processeurs par lots, analysez les données JSON et triez les éléments.", - "searchApiPanels.pipeline.overview.arrayJsonHandling.title": "Traitement des tableaux/JSON", - "searchApiPanels.pipeline.overview.dataEnrichment.description": "Ajouter des informations des sources externes ou appliquer des transformations à vos documents pour une recherche plus contextuelle et pertinente.", - "searchApiPanels.pipeline.overview.dataEnrichment.title": "Enrichir les données", - "searchApiPanels.pipeline.overview.dataFiltering.description": "Supprimez des champs spécifiques des documents avant leur indexation, afin d’exclure les informations inutiles ou sensibles.", - "searchApiPanels.pipeline.overview.dataFiltering.title": "Filtrage des données", - "searchApiPanels.pipeline.overview.dataTransformation.description": "Analysez les informations depuis vos documents pour assurer qu'ils sont conformes au format standardisé.", - "searchApiPanels.pipeline.overview.dataTransformation.title": "Transformation des données", - "searchApiPanels.pipeline.overview.extAndStandard.description": "Analysez les informations depuis vos documents pour assurer qu'ils sont conformes au format standardisé.", - "searchApiPanels.pipeline.overview.extAndStandard.title": "Extraire et standardiser", - "searchApiPanels.pipeline.overview.pipelineHandling.description": "Gérez les exceptions d'erreur, exécutez un autre pipeline ou redirigez les documents vers un autre index", - "searchApiPanels.pipeline.overview.pipelineHandling.title": "Traitement du pipeline", - "searchApiPanels.preprocessData.overview.arrayJsonHandling.learnMore": "En savoir plus", - "searchApiPanels.preprocessData.overview.dataEnrichment.description": "Ajouter des informations des sources externes ou appliquer des transformations à vos documents pour une recherche plus contextuelle et pertinente.", - "searchApiPanels.preprocessData.overview.dataEnrichment.learnMore": "En savoir plus", - "searchApiPanels.preprocessData.overview.dataEnrichment.title": "Enrichissement des données", - "searchApiPanels.preprocessData.overview.dataFiltering.learnMore": "En savoir plus", - "searchApiPanels.preprocessData.overview.dataTransformation.learnMore": "En savoir plus", - "searchApiPanels.preprocessData.overview.pipelineHandling.learnMore": "En savoir plus", - "searchApiPanels.welcomeBanner.codeBox.copyButtonLabel": "Copier", - "searchApiPanels.welcomeBanner.header.description": "Configurez votre client de langage de programmation, ingérez des données, et vous serez prêt à commencer vos recherches en quelques minutes.", - "searchApiPanels.welcomeBanner.header.greeting.customTitle": "👋 Bonjour {name} !", - "searchApiPanels.welcomeBanner.header.greeting.defaultTitle": "👋 Bonjour", - "searchApiPanels.welcomeBanner.header.title": "Lancez-vous avec Elasticsearch", - "searchApiPanels.welcomeBanner.ingestData.alternativeOptions": "Autres options d'ingestion", - "searchApiPanels.welcomeBanner.ingestData.alternativeOptions.beatsDescription": "Des agents légers conçus pour le transfert de données pour Elasticsearch. Utilisez Beats pour envoyer des données opérationnelles depuis vos serveurs.", - "searchApiPanels.welcomeBanner.ingestData.alternativeOptions.beatsDocumentationLabel": "Documentation", - "searchApiPanels.welcomeBanner.ingestData.alternativeOptions.beatsTitle": "Beats", - "searchApiPanels.welcomeBanner.ingestData.alternativeOptions.logstashDescription": "Pipeline de traitement des données à usage général pour Elasticsearch. Utilisez Logstash pour extraire et transformer les données d'une variétés d'entrées et de sorties.", - "searchApiPanels.welcomeBanner.ingestData.alternativeOptions.logstashDocumentationLabel": "Documentation", - "searchApiPanels.welcomeBanner.ingestData.alternativeOptions.logstashTitle": "Logstash", - "searchApiPanels.welcomeBanner.ingestData.description": "Ajoutez des données à votre flux de données ou à votre index pour les rendre interrogeables à l'aide de l'API. ", - "searchApiPanels.welcomeBanner.ingestData.title": "Ingérer des données", - "searchApiPanels.welcomeBanner.ingestPipelinePanel.description": "Vous pouvez utiliser des pipelines d'ingestion pour prétraiter vos données avant leur indexation dans Elasticsearch.", - "searchApiPanels.welcomeBanner.ingestPipelinePanel.managedBadge": "Géré", - "searchApiPanels.welcomeBanner.ingestPipelinePanel.optionalBadge": "Facultatif", - "searchApiPanels.welcomeBanner.ingestPipelinePanel.processorCount": "{count} {count, plural, one {processeur} other {processeurs}}", - "searchApiPanels.welcomeBanner.ingestPipelinePanel.recommendedBadge": "Recommandé", - "searchApiPanels.welcomeBanner.ingestPipelinePanel.selectPipelinePlaceholder": "Sélectionner un pipeline", - "searchApiPanels.welcomeBanner.ingestPipelinePanel.title": "Prétraiter vos données", - "searchApiPanels.welcomeBanner.installClient.clientDocLink": "Documentation du client {languageName}", - "searchApiPanels.welcomeBanner.installClient.description": "Vous devez d'abord installer le client de langage de programmation de votre choix.", - "searchApiPanels.welcomeBanner.installClient.title": "Installer un client", - "searchApiPanels.welcomeBanner.panels.learnMore": "En savoir plus", - "searchApiPanels.welcomeBanner.selectClient.apiRequestConsoleDocLink": "Exécuter des requêtes d’API dans la console ", - "searchApiPanels.welcomeBanner.selectClient.callout.description": "Avec la console, vous pouvez directement commencer à utiliser nos API REST. Aucune installation n’est requise.", - "searchApiPanels.welcomeBanner.selectClient.callout.link": "Essayez la console maintenant", - "searchApiPanels.welcomeBanner.selectClient.callout.title": "Lancez-vous dans la console", - "searchApiPanels.welcomeBanner.selectClient.description": "Elastic construit et assure la maintenance des clients dans plusieurs langues populaires et notre communauté a contribué à beaucoup d'autres. Sélectionnez votre client de langage favori ou explorez la {console} pour commencer.", - "searchApiPanels.welcomeBanner.selectClient.elasticsearchClientDocLink": "Clients d'Elasticsearch ", - "searchApiPanels.welcomeBanner.selectClient.heading": "Choisissez-en un", - "searchApiPanels.welcomeBanner.selectClient.title": "Sélectionner votre client", - "searchConnectors.config.invalidInteger": "{label} doit être un nombre entier.", - "searchConnectors.configuration.openPopoverLabel": "Ouvrir la fenêtre contextuelle de licence", - "searchConnectors.configurationConnector.config.advancedConfigurations.title": "Configurations avancées", - "searchConnectors.configurationConnector.config.cancelEditingButton.title": "Annuler", - "searchConnectors.configurationConnector.config.defaultValue": "Si cette option est laissée vide, la valeur par défaut {defaultValue} sera utilisée.", - "searchConnectors.configurationConnector.config.editButton.title": "Modifier la configuration", - "searchConnectors.configurationConnector.config.error.title": "Erreur de connecteur", - "searchConnectors.configurationConnector.config.noConfigCallout.description": "Ce connecteur ne possède aucun champ de configuration. Votre connecteur a-t-il pu se connecter avec succès à Elasticsearch et définir sa configuration ?", - "searchConnectors.configurationConnector.config.noConfigCallout.title": "Aucun champ de configuration", - "searchConnectors.configurationConnector.config.submitButton.title": "Enregistrer la configuration", - "searchConnectors.connector.documentLevelSecurity.enablePanel.description": "Vous permet de contrôler les documents auxquels peuvent accéder les utilisateurs, selon leurs autorisations. Cela permet de vous assurer que les résultats de recherche ne renvoient que des informations pertinentes et autorisées pour les utilisateurs, selon leurs rôles.", - "searchConnectors.connector.documentLevelSecurity.enablePanel.heading": "Sécurité au niveau du document", - "searchConnectors.connectors.subscriptionLabel": "Plans d'abonnement", - "searchConnectors.connectors.upgradeDescription": "Pour utiliser ce connecteur, vous devez mettre à jour votre licence vers Platinum ou commencer un essai gratuit de 30 jours.", - "searchConnectors.connectors.upgradeTitle": "Mettre à niveau vers Elastic Platinum", - "searchConnectors.connectorScheduling.resetButton.label": "Réinitialiser", - "searchConnectors.connectorScheduling.saveButton.label": "Enregistrer", - "searchConnectors.connectorScheduling.schedulePanel.documentLevelSecurity.description": "Contrôlez à quels documents les utilisateurs peuvent y accéder selon leurs autorisations et rôles. Planifiez des synchronisations pour garder ces contrôles d’accès à jour.", - "searchConnectors.connectorScheduling.schedulePanel.documentLevelSecurity.dlsDisabledCallout.link": "Activer la sécurité au niveau du document", - "searchConnectors.connectorScheduling.schedulePanel.documentLevelSecurity.dlsDisabledCallout.text": "{link} pour ce connecteur afin d'activer ces options.", - "searchConnectors.connectorScheduling.schedulePanel.documentLevelSecurity.dlsDisabledCallout.title": "Synchronisations de contrôle d'accès non autorisée", - "searchConnectors.connectorScheduling.schedulePanel.documentLevelSecurity.title": "Sécurité au niveau du document", - "searchConnectors.content.filteringRules.policy.exclude": "Exclure", - "searchConnectors.content.filteringRules.policy.include": "Inclure", - "searchConnectors.content.filteringRules.rules.contains": "Contient", - "searchConnectors.content.filteringRules.rules.endsWith": "Se termine par", - "searchConnectors.content.filteringRules.rules.equals": "Est égal à", - "searchConnectors.content.filteringRules.rules.greaterThan": "Supérieur à", - "searchConnectors.content.filteringRules.rules.lessThan": "Inférieur à", - "searchConnectors.content.filteringRules.rules.regEx": "Expression régulière", - "searchConnectors.content.filteringRules.rules.startsWith": "Commence par", - "searchConnectors.content.indices.connectorScheduling.accordion.accessControlSync.description": "Planifiez des synchronisations de contrôles d’accès pour garder les mappings d’autorisation à jour.", - "searchConnectors.content.indices.connectorScheduling.accordion.accessControlSync.title": "Synchronisation de contrôle d'accès", - "searchConnectors.content.indices.connectorScheduling.accordion.fullSync.description": "Synchronisez toutes vos données depuis votre source de données.", - "searchConnectors.content.indices.connectorScheduling.accordion.fullSync.title": "Synchronisation complète du contenu", - "searchConnectors.content.indices.connectorScheduling.accordion.incrementalSync.description": "Une tâche de synchronisation légère qui ne récupère que le contenu mis à jour depuis votre source de données.", - "searchConnectors.content.indices.connectorScheduling.accordion.incrementalSync.title": "Synchronisation incrémentielle de contenu", - "searchConnectors.content.indices.connectorScheduling.error.title": "Examinez la configuration de votre connecteur pour voir si des erreurs ont été signalées.", - "searchConnectors.content.indices.connectorScheduling.notConnected.button.label": "Configurer", - "searchConnectors.content.indices.connectorScheduling.notConnected.description": "Configurez et déployez votre connecteur, puis revenez ici pour définir votre calendrier de synchronisation. Ce calendrier déterminera l'intervalle de synchronisation du connecteur avec votre source de données pour les documents mis à jour.", - "searchConnectors.content.indices.connectorScheduling.notConnected.title": "Configurer votre connecteur pour planifier une synchronisation", - "searchConnectors.content.indices.connectorScheduling.schedulePanel.contentSync.description": "Récupérez du contenu pour créer ou mettre à jour vos documents Elasticsearch.", - "searchConnectors.content.indices.connectorScheduling.schedulePanel.contentSync.title": "Synchronisation de contenu", - "searchConnectors.content.indices.connectorScheduling.switch.label": "Activé", - "searchConnectors.content.nativeConnectors.googleCloud.name": "Google Cloud Storage", - "searchConnectors.content.nativeConnectors.s3.accessKey.label": "ID de clé d'accès AWS", - "searchConnectors.content.nativeConnectors.s3.buckets.label": "Compartiments AWS", - "searchConnectors.content.nativeConnectors.s3.buckets.tooltip": "Les compartiments AWS sont ignorés lorsque des règles de synchronisation avancées sont appliquées.", - "searchConnectors.content.nativeConnectors.s3.connectTimeout.label": "Délai d'attente de connexion", - "searchConnectors.content.nativeConnectors.s3.maxAttempts.label": "Nombre maximum de nouvelles tentatives", - "searchConnectors.content.nativeConnectors.s3.maxPageSize.label": "Taille maximum de la page", - "searchConnectors.content.nativeConnectors.s3.name": "S3", - "searchConnectors.content.nativeConnectors.s3.readTimeout.label": "Délai d'attente de lecture", - "searchConnectors.content.nativeConnectors.s3.secretKey.label": "Clé secrète AWS", - "searchConnectors.content.nativeConnectors.salesforce.clientId.label": "ID client", - "searchConnectors.content.nativeConnectors.salesforce.clientId.tooltip": "L'ID client de votre application connectée utilisant le protocole OAuth2. Également appelé \"clé consommateur\"", - "searchConnectors.content.nativeConnectors.salesforce.clientSecret.label": "Identifiant client secret", - "searchConnectors.content.nativeConnectors.salesforce.clientSecret.tooltip": "L'identifiant client secret de votre application connectée utilisant le protocole OAuth2. Également appelé \"secret consommateur\"", - "searchConnectors.content.nativeConnectors.salesforce.domain.label": "Domaine", - "searchConnectors.content.nativeConnectors.salesforce.domain.tooltip": "Le domaine de votre instance Salesforce. Si votre URL Salesforce est \"https://foo.salesforce.com\", le domaine est \"foo\".", - "searchConnectors.content.nativeConnectors.salesforce.name": "Salesforce", - "searchConnectors.cronEditor.cronDaily.fieldHour.textAtLabel": "À", - "searchConnectors.cronEditor.cronDaily.fieldTimeLabel": "Heure", - "searchConnectors.cronEditor.cronDaily.hourSelectLabel": "Heure", - "searchConnectors.cronEditor.cronDaily.minuteSelectLabel": "Minute", - "searchConnectors.cronEditor.cronHourly.fieldMinute.textAtLabel": "À", - "searchConnectors.cronEditor.cronHourly.fieldTimeLabel": "Minute", - "searchConnectors.cronEditor.cronMinutely.fieldMinute.textAppendLabel": "minutes", - "searchConnectors.cronEditor.cronMinutely.fieldMinute.textAtLabel": "Chaque", - "searchConnectors.cronEditor.cronMinutely.fieldTimeLabel": "Minute", - "searchConnectors.cronEditor.cronMonthly.fieldDateLabel": "Date", - "searchConnectors.cronEditor.cronMonthly.fieldHour.textAtLabel": "À", - "searchConnectors.cronEditor.cronMonthly.fieldTimeLabel": "Heure", - "searchConnectors.cronEditor.cronMonthly.hourSelectLabel": "Heure", - "searchConnectors.cronEditor.cronMonthly.minuteSelectLabel": "Minute", - "searchConnectors.cronEditor.cronMonthly.textOnTheLabel": "Le", - "searchConnectors.cronEditor.cronWeekly.fieldDateLabel": "Jour", - "searchConnectors.cronEditor.cronWeekly.fieldHour.textAtLabel": "À", - "searchConnectors.cronEditor.cronWeekly.fieldTimeLabel": "Heure", - "searchConnectors.cronEditor.cronWeekly.hourSelectLabel": "Heure", - "searchConnectors.cronEditor.cronWeekly.minuteSelectLabel": "Minute", - "searchConnectors.cronEditor.cronWeekly.textOnLabel": "Le", - "searchConnectors.cronEditor.cronYearly.fieldDate.textOnTheLabel": "Le", - "searchConnectors.cronEditor.cronYearly.fieldDateLabel": "Date", - "searchConnectors.cronEditor.cronYearly.fieldHour.textAtLabel": "À", - "searchConnectors.cronEditor.cronYearly.fieldMonth.textInLabel": "En", - "searchConnectors.cronEditor.cronYearly.fieldMonthLabel": "Mois", - "searchConnectors.cronEditor.cronYearly.fieldTimeLabel": "Heure", - "searchConnectors.cronEditor.cronYearly.hourSelectLabel": "Heure", - "searchConnectors.cronEditor.cronYearly.minuteSelectLabel": "Minute", - "searchConnectors.cronEditor.day.friday": "Vendredi", - "searchConnectors.cronEditor.day.monday": "Lundi", - "searchConnectors.cronEditor.day.saturday": "Samedi", - "searchConnectors.cronEditor.day.sunday": "Dimanche", - "searchConnectors.cronEditor.day.thursday": "Jeudi", - "searchConnectors.cronEditor.day.tuesday": "Mardi", - "searchConnectors.cronEditor.day.wednesday": "Mercredi", - "searchConnectors.cronEditor.fieldFrequencyLabel": "Fréquence", - "searchConnectors.cronEditor.month.april": "Avril", - "searchConnectors.cronEditor.month.august": "Août", - "searchConnectors.cronEditor.month.december": "Décembre", - "searchConnectors.cronEditor.month.february": "Février", - "searchConnectors.cronEditor.month.january": "Janvier", - "searchConnectors.cronEditor.month.july": "Juillet", - "searchConnectors.cronEditor.month.june": "Juin", - "searchConnectors.cronEditor.month.march": "Mars", - "searchConnectors.cronEditor.month.may": "Mai", - "searchConnectors.cronEditor.month.november": "Novembre", - "searchConnectors.cronEditor.month.october": "Octobre", - "searchConnectors.cronEditor.month.september": "Septembre", - "searchConnectors.cronEditor.textEveryLabel": "Chaque", - "searchConnectors.index.filtering.field": "champ", - "searchConnectors.index.filtering.policy": "Politique", - "searchConnectors.index.filtering.priority": "Priorité de la règle", - "searchConnectors.index.filtering.rule": "Règle", - "searchConnectors.index.filtering.value": "Valeur", - "searchConnectors.index.syncJobs.actions.cancelSyncJob.caption": "Annuler cette tâche de synchronisation", - "searchConnectors.index.syncJobs.actions.deleteJob.caption": "Supprimer", - "searchConnectors.index.syncJobs.actions.viewJob.caption": "Afficher cette tâche de synchronisation", - "searchConnectors.index.syncJobs.actions.viewJob.title": "Afficher cette tâche de synchronisation", - "searchConnectors.index.syncJobs.documents.added": "Inséré", - "searchConnectors.index.syncJobs.documents.deleted.tooltip": "Le nombre d'opérations {delete} que le connecteur a envoyé à l'API _bulk Elasticsearch. Peut inclure des documents abandonnés par les règles de synchronisation. N'inclut pas les documents abandonnés par les processeurs d'ingestion. Les documents sont supprimés lorsque le connecteur détermine qu'ils ne sont plus présents dans la source tierce.", - "searchConnectors.index.syncJobs.documents.removed": "Supprimé", - "searchConnectors.index.syncJobs.documents.title": "Documents", - "searchConnectors.index.syncJobs.documents.upserted.tooltip": "Le nombre d'opérations {index} que le connecteur a envoyé à l'API _bulk Elasticsearch, y compris les mises à jour de documents existants. Veuillez noter que le nombre de documents refoulés peut différer du nombre de documents dans l'index.", - "searchConnectors.index.syncJobs.documents.value": "Valeur", - "searchConnectors.index.syncJobs.documents.volume": "Volume", - "searchConnectors.index.syncJobs.documents.volume.aboutLabel": "À propos de {volume}", - "searchConnectors.index.syncJobs.documents.volume.lessThanOneMBLabel": "Inférieur à 1 Mo", - "searchConnectors.index.syncJobs.documents.volume.tooltip": "Le volume, en Mo, des données JSON envoyées avec les opérations {index} à l'API _bulk Elasticsearch. L'index Elasticsearch peut être plus grand, selon les mappings et les paramètres d'index, ou plus petit, si les données sont découpées par les processeurs d'ingestion.", - "searchConnectors.index.syncJobs.events.cancelationRequested": "Annulation demandée", - "searchConnectors.index.syncJobs.events.canceled": "Annulé", - "searchConnectors.index.syncJobs.events.completed": "Terminé", - "searchConnectors.index.syncJobs.events.lastUpdated": "Dernière mise à jour", - "searchConnectors.index.syncJobs.events.state": "État", - "searchConnectors.index.syncJobs.events.syncRequestedManually": "Synchronisation demandée manuellement", - "searchConnectors.index.syncJobs.events.syncRequestedScheduled": "Synchronisation demandée par planification", - "searchConnectors.index.syncJobs.events.syncStarted": "Synchronisation démarrée", - "searchConnectors.index.syncJobs.events.time": "Heure", - "searchConnectors.index.syncJobs.events.title": "Événements", - "searchConnectors.index.syncJobs.pipeline.extractBinaryContent": "Extraire le contenu binaire", - "searchConnectors.index.syncJobs.pipeline.name": "Nom du pipeline", - "searchConnectors.index.syncJobs.pipeline.reduceWhitespace": "Réduire l'espace", - "searchConnectors.index.syncJobs.pipeline.runMlInference": "Inférence de Machine Learning", - "searchConnectors.index.syncJobs.pipeline.setting": "Paramètre de pipeline", - "searchConnectors.index.syncJobs.pipeline.title": "Pipeline", - "searchConnectors.index.syncJobs.syncRulesAdvancedTitle": "Règles de synchronisation avancées", - "searchConnectors.index.syncJobs.syncRulesTitle": "Règles de synchronisation", - "searchConnectors.manageLicenseButtonLabel": "Gérer la licence", - "searchConnectors.nativeConnectors.advancedRulesIgnored.label": "Ce champ configurable est ignoré lorsque les règles de synchronisation avancées sont appliquées.", - "searchConnectors.nativeConnectors.azureBlobStorage.accountKeyLabel": "Clé du compte", - "searchConnectors.nativeConnectors.azureBlobStorage.accountNameLabel": "Nom du compte", - "searchConnectors.nativeConnectors.azureBlobStorage.blobEndpointLabel": "Point de terminaison Blob", - "searchConnectors.nativeConnectors.azureBlobStorage.containerNameLabel": "Liste des conteneurs", - "searchConnectors.nativeConnectors.azureBlobStorage.name": "Stockage Blob Azure", - "searchConnectors.nativeConnectors.box.appKeyLabel": "Clé d’application", - "searchConnectors.nativeConnectors.box.appSecretLabel": "Secret d’application", - "searchConnectors.nativeConnectors.box.includeInheritedUsersLabel": "Inclure les groupes et les utilisateurs hérités", - "searchConnectors.nativeConnectors.box.includeInheritedUsersTooltip": "Incluez les groupes et les utilisateurs hérités lors de l'indexation des autorisations. L'activation de ce champ configurable entraînera une dégradation significative des performances.", - "searchConnectors.nativeConnectors.box.name": "Box", - "searchConnectors.nativeConnectors.box.pathLabel": "Chemin permettant de récupérer les fichiers/dossiers", - "searchConnectors.nativeConnectors.box.pathTooltip": "Le chemin est ignoré lorsque des règles de synchronisation avancées sont appliquées. ", - "searchConnectors.nativeConnectors.box.refreshTokenLabel": "Token d'actualisation", - "searchConnectors.nativeConnectors.boxTooltip.name": "Box", - "searchConnectors.nativeConnectors.confluence.indexLabelsLabel": "Activer les étiquettes d'indexation", - "searchConnectors.nativeConnectors.confluence.indexLabelsTooltip": "Activer cette option augmentera le nombre d'appels réseau vers la source et peut diminuer les performances", - "searchConnectors.nativeConnectors.confluence.name": "Confluence", - "searchConnectors.nativeConnectors.confluence.spaceKeysLabel": "Touche espace Confluence", - "searchConnectors.nativeConnectors.confluence.tooltipName": "Confluence", - "searchConnectors.nativeConnectors.confluence.urlLabel": "Étiquette URL Confluence", - "searchConnectors.nativeConnectors.confluenceCloud.accountEmailLabel": "E-mail du compte Confluence Cloud", - "searchConnectors.nativeConnectors.confluenceCloud.name": "Cloud Confluence", - "searchConnectors.nativeConnectors.confluenceDataCenter.name": "Centre de données Confluence", - "searchConnectors.nativeConnectors.confluenceDataCenter.passwordLabel": "Mot de passe", - "searchConnectors.nativeConnectors.confluenceDataCenter.usernameLabel": "Nom d'utilisateur", - "searchConnectors.nativeConnectors.confluenceServer.apiTokenLabel": "Token d'API de Confluence Cloud", - "searchConnectors.nativeConnectors.confluenceServer.name": "Serveur Confluence", - "searchConnectors.nativeConnectors.confluenceServer.passwordLabel": "Mot de passe du serveur Confluence", - "searchConnectors.nativeConnectors.confluenceServer.usernameLabel": "Nom d'utilisateur du serveur Confluence", - "searchConnectors.nativeConnectors.confluenceSource.label": "Source de données Confluence", - "searchConnectors.nativeConnectors.databaseLabel": "Base de données", - "searchConnectors.nativeConnectors.dropbox.includeInheritedUsersAndGroups.label": "Inclure les groupes et les utilisateurs hérités", - "searchConnectors.nativeConnectors.dropbox.includeInheritedUsersAndGroups.tooltip": "Incluez les groupes et les utilisateurs hérités lors de l'indexation des autorisations. L'activation de ce champ configurable entraînera une dégradation significative des performances.", - "searchConnectors.nativeConnectors.dropbox.name": "Dropbox", - "searchConnectors.nativeConnectors.dropbox.tooltipName": "Dropbox", - "searchConnectors.nativeConnectors.enableDLS.label": "Activer la sécurité au niveau du document", - "searchConnectors.nativeConnectors.enableDLS.tooltip": "La sécurité au niveau du document permet de conserver dans Elasticsearch les identités et autorisations paramétrées dans {serviceName}. Vous pouvez ainsi restreindre et personnaliser l'accès en lecture des utilisateurs et des groupes pour les documents dans cet index. La synchronisation de contrôle d'accès garantit que ces métadonnées sont correctement actualisées dans vos documents Elasticsearch.", - "searchConnectors.nativeConnectors.enableSSL.label": "Activer SSL", - "searchConnectors.nativeConnectors.gdrive.label": "Compte de service JSON Google Drive", - "searchConnectors.nativeConnectors.gdrive.maxHTTPRequest.label": "Requêtes HTTP simultanées maximales", - "searchConnectors.nativeConnectors.gdrive.maxHTTPRequest.tooltip": "Ce paramètre fixe le nombre maximal de requêtes HTTP simultanées envoyées à l'API Google pour récupérer des données. Augmenter cette valeur peut améliorer la vitesse de récupération des données, mais également accroître les demandes de ressources systèmes et de bande passante du réseau.", - "searchConnectors.nativeConnectors.gdrive.tooltip": "Ces connecteurs s'authentifient comme un compte de service afin de synchroniser le contenu depuis Google Drive.", - "searchConnectors.nativeConnectors.gdrive.tooltipName": "Google Drive", - "searchConnectors.nativeConnectors.gdrive.useDomainWideDelegation.label": "Utiliser la délégation à l'échelle du domaine pour la synchronisation des données", - "searchConnectors.nativeConnectors.gdrive.useDomainWideDelegation.tooltip": "Activez la délégation à l'échelle du domaine pour synchroniser automatiquement le contenu de tous les Drive partagés et individuels de Google Workspace. Il n'est donc plus nécessaire de partager manuellement les données de Google Drive avec votre compte de service, mais le temps de synchronisation risque d'être plus long. Si la fonctionnalité est désactivée, seuls les éléments et les dossiers partagés manuellement avec le compte de service seront synchronisés. Veuillez consulter la documentation du connecteur pour vous assurer que la délégation à l'échelle du domaine est correctement configurée et a les cadres appropriés.", - "searchConnectors.nativeConnectors.gdrive.workspaceAdminEmail.label": "E-mail administrateur Google Workspace", - "searchConnectors.nativeConnectors.gdrive.workspaceAdminEmail.tooltip": "Afin d'utiliser la sécurité au niveau du document, vous devez activer la délégation d'autorité au niveau du domaine de Google Workspace pour votre compte de service. Un compte de service dont l'autorité est déléguée peut offrir à l'administrateur des permissions suffisantes pour récupérer tous les utilisateurs et toutes les permissions associées.", - "searchConnectors.nativeConnectors.gdrive.workspaceAdminEmailDataSync.label": "E-mail administrateur Google Workspace", - "searchConnectors.nativeConnectors.gdrive.workspaceAdminEmailDataSync.tooltip": "Indiquez l'e-mail de l'administrateur à utiliser avec la délégation à l'échelle du domaine pour la synchronisation des données. Cette adresse e-mail permet au connecteur d'utiliser l'API Admin Directory pour répertorier les utilisateurs de l'organisation. Veuillez consulter la documentation du connecteur pour vous assurer que la délégation à l'échelle du domaine est correctement configurée et a les cadres appropriés.", - "searchConnectors.nativeConnectors.gdrive.workspaceEmailSharedDrivesSync.label": "E-mail Google Workspace pour la synchronisation des Drive partagés", - "searchConnectors.nativeConnectors.gdrive.workspaceEmailSharedDrivesSync.tooltip": "Fournissez l'e-mail de l'utilisateur de Google Workspace pour la découverte et la synchronisation des Drive partagés. Seuls les Drive partagés auxquels cet utilisateur a accès seront synchronisés.", - "searchConnectors.nativeConnectors.github.appID.label": "ID de l'application", - "searchConnectors.nativeConnectors.github.authMethod.label": "Méthode d'authentification", - "searchConnectors.nativeConnectors.github.configuration.useDocumentLevelSecurityTooltip": "La sécurité au niveau du document permet de conserver dans Elasticsearch les identités et autorisations paramétrées dans GitHub. Vous pouvez ainsi restreindre et personnaliser l'accès en lecture des utilisateurs et des groupes pour les documents dans cet index. La synchronisation de contrôle d'accès garantit que ces métadonnées sont correctement actualisées dans vos documents Elasticsearch.", - "searchConnectors.nativeConnectors.github.label": "Source de données", - "searchConnectors.nativeConnectors.github.listOfRepos.label": "Listes de référentiels", - "searchConnectors.nativeConnectors.github.listOfRepos.tooltip": "Ce champ configurable est ignoré lorsque les règles de synchronisation avancées sont appliquées.", - "searchConnectors.nativeConnectors.github.name": "GitHub", - "searchConnectors.nativeConnectors.github.options.cloudLabel": "Cloud GitHub", - "searchConnectors.nativeConnectors.github.options.cloudServer": "Serveur GitHub", - "searchConnectors.nativeConnectors.github.options.githubApp": "Application GitHub", - "searchConnectors.nativeConnectors.github.options.organization": "Organisation", - "searchConnectors.nativeConnectors.github.options.other": "Autre", - "searchConnectors.nativeConnectors.github.options.personalAccessToken": "Token d'accès personnel", - "searchConnectors.nativeConnectors.github.org_name.label": "Nom de l'organisation", - "searchConnectors.nativeConnectors.github.privateKey.label": "Clé privée de l'application", - "searchConnectors.nativeConnectors.github.repo_type": "La fonctionnalité de sécurité au niveau du document n'est pas disponible pour le type de référentiel \"autre\"", - "searchConnectors.nativeConnectors.github.repo_type.label": "Type de référentiel", - "searchConnectors.nativeConnectors.github.token.label": "Token", - "searchConnectors.nativeConnectors.github.url.label": "URL du serveur", - "searchConnectors.nativeConnectors.gmail.customer_id.label": "ID client Google", - "searchConnectors.nativeConnectors.gmail.customer_id.tooltip": "Console admin Google -> Compte -> Paramètres -> ID client", - "searchConnectors.nativeConnectors.gmail.include_spam_and_trash.label": "Inclure le spam et les e-mails indésirables", - "searchConnectors.nativeConnectors.gmail.include_spam_and_trash.tooltip": "Si réglé sur \"true\", inclura le spam et les e-mails indésirables.", - "searchConnectors.nativeConnectors.gmail.name": "Gmail", - "searchConnectors.nativeConnectors.gmail.service_account_credentials.label": "Compte de service JSON GMail", - "searchConnectors.nativeConnectors.gmail.subject.label": "E-mail administrateur Google Workspace", - "searchConnectors.nativeConnectors.gmail.subject.tooltip": "Adresse e-mail du compte admin", - "searchConnectors.nativeConnectors.gmail.use_document_level_security.label": "Activer la sécurité au niveau du document", - "searchConnectors.nativeConnectors.gmail.use_document_level_security.tooltip": "La sécurité au niveau du document permet de conserver dans Elasticsearch les identités et autorisations paramétrées dans GMail. Vous pouvez ainsi restreindre et personnaliser l'accès en lecture des utilisateurs pour les documents contenus dans cet index. La synchronisation de contrôle d'accès garantit que ces métadonnées sont correctement actualisées dans vos documents Elasticsearch.", - "searchConnectors.nativeConnectors.google_drive.name": "Google Drive", - "searchConnectors.nativeConnectors.googleCloudStorage.bucketNameLabel": "Liste des compartiments", - "searchConnectors.nativeConnectors.googleCloudStorage.label": "Compte de service JSON Google Cloud", - "searchConnectors.nativeConnectors.googleCloudStorage.retry.label": "Nombre maximum de nouvelles tentatives pour les requêtes ayant échoué", - "searchConnectors.nativeConnectors.jira.cloudApiTokenLabel": "Token d'API Jira Cloud", - "searchConnectors.nativeConnectors.jira.cloudServiceAccountLabel": "Adresse e-mail de Jira Cloud", - "searchConnectors.nativeConnectors.jira.cloudServiceAccountTooltip": "Adresse e-mail associée au compte Jira Cloud. Ex. : jane.doe@gmail.com", - "searchConnectors.nativeConnectors.jira.dataCenterPasswordLabel": "Mot de passe", - "searchConnectors.nativeConnectors.jira.dataCenterUsername": "Nom d'utilisateur", - "searchConnectors.nativeConnectors.jira.dataSourceLabel": "Source de données Jira", - "searchConnectors.nativeConnectors.jira.hostUrlLabel": "URL de l'hôte Jira", - "searchConnectors.nativeConnectors.jira.jiraCloudLabel": "Jira Cloud", - "searchConnectors.nativeConnectors.jira.jiraDataCenterLabel": "Centre de données Jira", - "searchConnectors.nativeConnectors.jira.jiraServerLabel": "Serveur Jira", - "searchConnectors.nativeConnectors.jira.name": "Jira", - "searchConnectors.nativeConnectors.jira.projectKeysLabel": "Clés de projet Jira", - "searchConnectors.nativeConnectors.jira.serverPasswordLabel": "Mot de passe serveur Jira", - "searchConnectors.nativeConnectors.jira.serverUsername": "Nom d'utilisateur serveur Jira", - "searchConnectors.nativeConnectors.jiraTooltip.name": "Jira", - "searchConnectors.nativeConnectors.microsoftTeams.clientIdLabel": "ID client", - "searchConnectors.nativeConnectors.microsoftTeams.name": "Microsoft Teams", - "searchConnectors.nativeConnectors.microsoftTeams.secretValueLabel": "Valeur secrète", - "searchConnectors.nativeConnectors.microsoftTeams.tenantIdLabel": "ID locataire", - "searchConnectors.nativeConnectors.mongodb.configuration.collectionLabel": "Collection", - "searchConnectors.nativeConnectors.mongodb.configuration.directConnectionLabel": "Connexion directe", - "searchConnectors.nativeConnectors.mongodb.configuration.hostLabel": "Nom d'hôte du serveur", - "searchConnectors.nativeConnectors.mongodb.configuration.sslCaLabel": "Autorité de certification (.pem)", - "searchConnectors.nativeConnectors.mongodb.configuration.sslCaTooltip": "Précise le certificat racine fourni par l'Autorité de certification. La valeur du certificat permet de valider le certificat présenté par l'instance MongoDB.", - "searchConnectors.nativeConnectors.mongodb.configuration.sslEnabledLabel": "Connexion SSL/TLS", - "searchConnectors.nativeConnectors.mongodb.configuration.sslEnabledTooltip": "Cette option établit une connexion sécurisée au serveur MongoDB grâce au chiffrement SSL/TLS. Assurez-vous que votre déploiement MongoDB prend en charge les connexions SSL/TLS. Activez cette option si le cluster MongoDB utilise des enregistrements DNS SRV.", - "searchConnectors.nativeConnectors.mongodb.configuration.tlsInsecureLabel": "Ignorer la vérification du certificat", - "searchConnectors.nativeConnectors.mongodb.configuration.tlsInsecureTooltip": "Cette option permet d'ignorer la validation du certificat pour les connexions TLS/SSL à votre serveur MongoDB. Nous vous recommandons fortement de la désactiver.", - "searchConnectors.nativeConnectors.mongodb.name": "MongoDB", - "searchConnectors.nativeConnectors.mssql.configuration.hostLabel": "Hôte", - "searchConnectors.nativeConnectors.mssql.configuration.passwordLabel": "Mot de passe", - "searchConnectors.nativeConnectors.mssql.configuration.retriesLabel": "Nouvelles tentatives par requête", - "searchConnectors.nativeConnectors.mssql.configuration.rowsFetchedLabel": "Lignes extraites par requête", - "searchConnectors.nativeConnectors.mssql.configuration.schemaLabel": "Schéma", - "searchConnectors.nativeConnectors.mssql.configuration.tablesLabel": "Liste de tables séparées par des virgules", - "searchConnectors.nativeConnectors.mssql.configuration.usernameLabel": "Nom d'utilisateur", - "searchConnectors.nativeConnectors.mssql.configuration.validateHostLabel": "Valider l’hôte", - "searchConnectors.nativeConnectors.mssql.name": "Microsoft SQL", - "searchConnectors.nativeConnectors.mysql.configuration.hostLabel": "Hôte", - "searchConnectors.nativeConnectors.mysql.configuration.passwordLabel": "Mot de passe", - "searchConnectors.nativeConnectors.mysql.configuration.retriesLabel": "Nouvelles tentatives par requête", - "searchConnectors.nativeConnectors.mysql.configuration.rowsFetchedLabel": "Lignes extraites par requête", - "searchConnectors.nativeConnectors.mysql.configuration.tablesLabel": "Liste de tables séparées par des virgules", - "searchConnectors.nativeConnectors.mysql.configuration.usernameLabel": "Nom d'utilisateur", - "searchConnectors.nativeConnectors.mysql.name": "MySQL", - "searchConnectors.nativeConnectors.nativeConnectors.maximumConcurrentLabel": "Téléchargement actuels maximaux", - "searchConnectors.nativeConnectors.networkDrive.ipAddressLabel": "Adresse IP", - "searchConnectors.nativeConnectors.networkDrive.name": "Lecteur réseau", - "searchConnectors.nativeConnectors.networkDrive.pathLabel": "Chemin", - "searchConnectors.nativeConnectors.networkDriveTooltip.name": "Lecteur réseau", - "searchConnectors.nativeConnectors.notion.databasesLabel": "Liste des bases de données", - "searchConnectors.nativeConnectors.notion.indexCommentsLabel": "Activer les commentaires d'indexation", - "searchConnectors.nativeConnectors.notion.indexCommentsTooltip": "Activer cette option augmentera le nombre d'appels réseau vers la source et peut diminuer les performances", - "searchConnectors.nativeConnectors.notion.name": "Notion", - "searchConnectors.nativeConnectors.notion.notionSecretKeyLabel": "Clé secrète Notion", - "searchConnectors.nativeConnectors.notion.pagesLabel": "Liste de pages", - "searchConnectors.nativeConnectors.oneDrive.azureClientId.label": "ID client application Azure", - "searchConnectors.nativeConnectors.oneDrive.azureClientSecret.label": "Identifiant client secret application Azure", - "searchConnectors.nativeConnectors.onedrive.name": "OneDrive", - "searchConnectors.nativeConnectors.oneDrive.tenantId.label": "ID locataire application Azure", - "searchConnectors.nativeConnectors.oneDriveTooltip.name": "OneDrive", - "searchConnectors.nativeConnectors.oracle.configuration.databaseLabel": "Base de données", - "searchConnectors.nativeConnectors.oracle.configuration.fetch_sizeLabel": "Lignes extraites par requête", - "searchConnectors.nativeConnectors.oracle.configuration.hostLabel": "Hôte", - "searchConnectors.nativeConnectors.oracle.configuration.oracle_homeLabel": "Chemin d'accès à la page d'accueil d'Oracle", - "searchConnectors.nativeConnectors.oracle.configuration.oracle_protocolLabel": "Protocole de connexion à Oracle", - "searchConnectors.nativeConnectors.oracle.configuration.passwordLabel": "Mot de passe", - "searchConnectors.nativeConnectors.oracle.configuration.portLabel": "Port", - "searchConnectors.nativeConnectors.oracle.configuration.retry_countLabel": "Nouvelles tentatives par requête", - "searchConnectors.nativeConnectors.oracle.configuration.tablesLabel": "Liste de tables séparées par des virgules", - "searchConnectors.nativeConnectors.oracle.configuration.usernameLabel": "Nom d'utilisateur", - "searchConnectors.nativeConnectors.oracle.configuration.wallet_configuration_pathLabel": "Chemin d'accès aux fichiers de configuration du portefeuille SSL", - "searchConnectors.nativeConnectors.oracle.name": "Oracle", - "searchConnectors.nativeConnectors.outlook.active_directory_server.label": "Serveur Active Directory", - "searchConnectors.nativeConnectors.outlook.active_directory_server.tooltip": "Adresse IP du serveur Active Directory. P. ex. 127.0.0.1", - "searchConnectors.nativeConnectors.outlook.client_id.label": "ID client", - "searchConnectors.nativeConnectors.outlook.client_secret.label": "Valeur de l'identifiant client secret", - "searchConnectors.nativeConnectors.outlook.data_source.label": "Source de données Outlook", - "searchConnectors.nativeConnectors.outlook.domain.label": "Nom de domaine du serveur Exchange", - "searchConnectors.nativeConnectors.outlook.domain.tooltip": "Nom de domaine, p. ex gmail.com ou outlook.com", - "searchConnectors.nativeConnectors.outlook.exchange_server.label": "Serveur Exchange", - "searchConnectors.nativeConnectors.outlook.exchange_server.tooltip": "Adresse IP du serveur Exchange. P. ex. 127.0.0.1", - "searchConnectors.nativeConnectors.outlook.name": "Outlook", - "searchConnectors.nativeConnectors.outlook.password.label": "Mot de passe du serveur Exchange", - "searchConnectors.nativeConnectors.outlook.ssl_ca.label": "Certificat SSL", - "searchConnectors.nativeConnectors.outlook.ssl_enabled.label": "Activer SSL", - "searchConnectors.nativeConnectors.outlook.tenant_id.label": "ID locataire", - "searchConnectors.nativeConnectors.outlook.use_text_extraction_service.label": "Utiliser un service d’extraction de texte", - "searchConnectors.nativeConnectors.outlook.use_text_extraction_service.toolip": "Nécessite un déploiement distinct du service d'extraction de texte d'Elastic. Nécessite que l'extraction de texte soit désactivée dans les paramètres du pipeline.", - "searchConnectors.nativeConnectors.outlook.username.label": "Nom d'utilisateur du serveur Exchange", - "searchConnectors.nativeConnectors.outlookTooltip.name": "Outlook", - "searchConnectors.nativeConnectors.passwordLabel": "Mot de passe", - "searchConnectors.nativeConnectors.portLabel": "Port", - "searchConnectors.nativeConnectors.postgresql.configuration.hostLabel": "Hôte", - "searchConnectors.nativeConnectors.postgresql.configuration.retriesLabel": "Nouvelles tentatives par requête", - "searchConnectors.nativeConnectors.postgresql.configuration.rowsFetchedLabel": "Lignes extraites par requête", - "searchConnectors.nativeConnectors.postgresql.configuration.tablesLabel": "Liste de tables séparées par des virgules", - "searchConnectors.nativeConnectors.postgresql.name": "PostgreSQL", - "searchConnectors.nativeConnectors.retriesPerRequest.label": "Nouvelles tentatives par requête", - "searchConnectors.nativeConnectors.salesforce.name": "Salesforce", - "searchConnectors.nativeConnectors.schemaLabel": "Schéma", - "searchConnectors.nativeConnectors.servicenow.configuration.useDocumentLevelSecurityTooltip": "La sécurité au niveau du document permet de conserver dans Elasticsearch les identités et autorisations paramétrées dans ServiceNow. Vous pouvez ainsi restreindre et personnaliser l'accès en lecture des utilisateurs et des groupes pour les documents dans cet index. La synchronisation de contrôle d'accès garantit que ces métadonnées sont correctement actualisées dans vos documents Elasticsearch.", - "searchConnectors.nativeConnectors.servicenow.name": "ServiceNow", - "searchConnectors.nativeConnectors.servicenow.password.label": "Mot de passe", - "searchConnectors.nativeConnectors.servicenow.services.label": "Liste des services séparés par des virgules", - "searchConnectors.nativeConnectors.servicenow.services.tooltip": "La liste des services est ignorée lorsque des règles de synchronisation avancées sont appliquées.", - "searchConnectors.nativeConnectors.servicenow.url.label": "URL des services", - "searchConnectors.nativeConnectors.servicenow.username.label": "Nom d'utilisateur", - "searchConnectors.nativeConnectors.sharepoint_online.configuration.clientIdLabel": "ID client", - "searchConnectors.nativeConnectors.sharepoint_online.configuration.enumerateAllSitesLabel": "Énumérer tous les sites ?", - "searchConnectors.nativeConnectors.sharepoint_online.configuration.enumerateAllSitesTooltip": "Si cette fonctionnalité est activée, les sites seront recherchés en bloc, puis filtrés pour obtenir la liste de sites configurés. Cela est efficace pour synchroniser de nombreux sites. Si la fonctionnalité est désactivée, chaque site configuré sera recherché au moyen d'une requête individuelle. Cela est efficace pour synchroniser quelques sites.", - "searchConnectors.nativeConnectors.sharepoint_online.configuration.fetchDriveItemPermissionsLabel": "Récupérer les autorisations d'un driveItem", - "searchConnectors.nativeConnectors.sharepoint_online.configuration.fetchDriveItemPermissionsTooltip": "Activer cette option pour récupérer des autorisations spécifiques d'un driveItem. Ce paramètre est susceptible d'augmenter le délai de synchronisation.", - "searchConnectors.nativeConnectors.sharepoint_online.configuration.fetchSubsitesLabel": "Rechercher les sous-sites des sites configurés ?", - "searchConnectors.nativeConnectors.sharepoint_online.configuration.fetchSubsitesTooltip": "Si les sous-sites du ou des sites configurés doivent être automatiquement recherchés.", - "searchConnectors.nativeConnectors.sharepoint_online.configuration.fetchUniqueListItemPermissionsLabel": "Récupérer les autorisations d'un élément de liste unique", - "searchConnectors.nativeConnectors.sharepoint_online.configuration.fetchUniqueListItemPermissionsTooltip": "Activer cette option pour récupérer les autorisations d'un élément de liste unique. Ce paramètre est susceptible d'augmenter le délai de synchronisation. Si ce paramètre est désactivé, un élément de liste hérite des permissions de son site parent.", - "searchConnectors.nativeConnectors.sharepoint_online.configuration.fetchUniqueListPermissionsLabel": "Récupérer les autorisations de liste unique", - "searchConnectors.nativeConnectors.sharepoint_online.configuration.fetchUniqueListPermissionsTooltip": "Activer cette option pour récupérer les autorisations de liste unique. Ce paramètre est susceptible d'augmenter le délai de synchronisation. Si ce paramètre est désactivé, une liste hérite des permissions de son site parent.", - "searchConnectors.nativeConnectors.sharepoint_online.configuration.fetchUniquePagePermissionsLabel": "Récupérer les autorisations de page unique", - "searchConnectors.nativeConnectors.sharepoint_online.configuration.fetchUniquePagePermissionsTooltip": "Activer cette option pour récupérer les autorisations de page unique. Ce paramètre est susceptible d'augmenter le délai de synchronisation. Si ce paramètre est désactivé, une page hérite des permissions de son site parent.", - "searchConnectors.nativeConnectors.sharepoint_online.configuration.secretValueLabel": "Valeur secrète", - "searchConnectors.nativeConnectors.sharepoint_online.configuration.siteCollectionsLabel": "Liste de sites séparées par des virgules", - "searchConnectors.nativeConnectors.sharepoint_online.configuration.siteCollectionsTooltip": "Une liste de sites séparés par des virgules dont les données doivent être ingérées. Utilisez \"*\" pour inclure tous les sites disponibles.", - "searchConnectors.nativeConnectors.sharepoint_online.configuration.tenantIdLabel": "ID locataire", - "searchConnectors.nativeConnectors.sharepoint_online.configuration.tenantNameLabel": "Nom du locataire", - "searchConnectors.nativeConnectors.sharepoint_online.configuration.useDocumentLevelSecurityLabel": "Activer la sécurité au niveau du document", - "searchConnectors.nativeConnectors.sharepoint_online.configuration.useDocumentLevelSecurityTooltip": "La sécurité au niveau du document préserve dans Elasticsearch les identités et permissions paramétrées dans Sharepoint Online. Ces métadonnées sont ajoutées à votre document Elasticsearch afin que vous puissiez contrôler l'accès en lecture des utilisateurs et des groupes. La synchronisation de contrôle d'accès garantit que ces métadonnées sont correctement actualisées.", - "searchConnectors.nativeConnectors.sharepoint_online.name": "SharePoint en ligne", - "searchConnectors.nativeConnectors.sharepoint_server.configuration.fetchUniqueListItemPermissionsLabel": "Récupérer les autorisations d'un élément de liste unique", - "searchConnectors.nativeConnectors.sharepoint_server.configuration.fetchUniqueListItemPermissionsTooltip": "Activer cette option pour récupérer les autorisations d'un élément de liste unique. Ce paramètre est susceptible d'augmenter le délai de synchronisation. Si ce paramètre est désactivé, un élément de liste hérite des permissions de son site parent.", - "searchConnectors.nativeConnectors.sharepoint_server.configuration.fetchUniqueListPermissionsLabel": "Récupérer les autorisations de liste unique", - "searchConnectors.nativeConnectors.sharepoint_server.configuration.fetchUniqueListPermissionsTooltip": "Activer cette option pour récupérer les autorisations de liste unique. Ce paramètre est susceptible d'augmenter le délai de synchronisation. Si ce paramètre est désactivé, une liste hérite des permissions de son site parent.", - "searchConnectors.nativeConnectors.sharepoint_server.configuration.host": "Hôte SharePoint", - "searchConnectors.nativeConnectors.sharepoint_server.configuration.password": "Mot de passe du serveur SharePoint", - "searchConnectors.nativeConnectors.sharepoint_server.configuration.site_collections": "Liste de collections de sites SharePoint séparées par des virgules à indexer", - "searchConnectors.nativeConnectors.sharepoint_server.configuration.username": "Nom d'utilisateur du serveur SharePoint", - "searchConnectors.nativeConnectors.sharepoint_server.name": "Serveur SharePoint", - "searchConnectors.nativeConnectors.slack.autoJoinChannels.label": "Rejoindre automatiquement les canaux", - "searchConnectors.nativeConnectors.slack.autoJoinChannels.tooltip": "Le bot de l'application Slack pourra seulement lire l'historique des conversations des canaux qu'il a rejoints. L’option par défaut nécessite qu'il soit invité manuellement aux canaux. L'activation de cette option lui permet de s'inviter automatiquement sur tous les canaux publics.", - "searchConnectors.nativeConnectors.slack.fetchLastNDays.label": "Nombre de jours d'historique de messages à récupérer", - "searchConnectors.nativeConnectors.slack.fetchLastNDays.tooltip": "La date à laquelle il est nécessaire de remonter pour demander l'historique des messages à Slack. Les messages plus anciens ne seront pas indexés.", - "searchConnectors.nativeConnectors.slack.name": "Slack", - "searchConnectors.nativeConnectors.slack.syncUsers.label": "Synchroniser les utilisateurs", - "searchConnectors.nativeConnectors.slack.syncUsers.tooltip": "Cette option indique si les utilisateurs de Slack doivent ou non être indexés en tant que documents dans Elasticsearch.", - "searchConnectors.nativeConnectors.slack.token.label": "Jeton d'authentification", - "searchConnectors.nativeConnectors.slack.token.tooltip": "Le token d’authentification Slack pour l’application Slack que vous avez créée. Voir les documents pour plus de détails.", - "searchConnectors.nativeConnectors.sslCertificate.label": "Certificat SSL", - "searchConnectors.nativeConnectors.textExtractionService.label": "Utiliser un service d’extraction de texte", - "searchConnectors.nativeConnectors.textExtractionService.tooltip": "Nécessite un déploiement distinct du service d’extraction de données d’Elastic. Nécessite également que les paramètres de pipeline désactivent l’extraction de texte.", - "searchConnectors.nativeConnectors.usernameLabel": "Nom d'utilisateur", - "searchConnectors.nativeConnectors.zoom.accountId.label": "Identifiant de compte", - "searchConnectors.nativeConnectors.zoom.clientId.label": "ID client", - "searchConnectors.nativeConnectors.zoom.clientSecret.label": "Identifiant client secret", - "searchConnectors.nativeConnectors.zoom.fetchPastMeetingDetails.label": "Récupérer les détails des réunions antérieures", - "searchConnectors.nativeConnectors.zoom.fetchPastMeetingDetails.tooltip": "Activez cette option pour récupérer les détails des réunions antérieures. Ce paramètre est susceptible d'augmenter le délai de synchronisation.", - "searchConnectors.nativeConnectors.zoom.name": "Effectuer un zoom", - "searchConnectors.nativeConnectors.zoom.recordingAge.label": "Limite d'âge pour l'enregistrement (mois)", - "searchConnectors.nativeConnectors.zoom.recordingAge.tooltip": "La date à laquelle il est nécessaire de remonter pour demander des enregistrements à Zoom. Les enregistrements antérieurs à celui-ci ne seront pas indexés.", - "searchConnectors.searchIndices.addedDocs.columnTitle": "Documents insérés", - "searchConnectors.searchIndices.deletedDocs.columnTitle": "Documents supprimés", - "searchConnectors.searchIndices.identitySync.columnTitle": "Identités synchronisées", - "searchConnectors.searchIndices.syncJobType.columnTitle": "Type de synchronisation de contenu", - "searchConnectors.searchIndices.syncStatus.columnTitle": "Statut", - "searchConnectors.selectConnector.openPopoverLabel": "Ouvrir la fenêtre contextuelle de licence", - "searchConnectors.server.connectors.not_found_error": "Impossible de récupérer le connecteur créé", - "searchConnectors.server.connectors.scheduling.error": "Document introuvable", - "searchConnectors.syncJobs.cancelSyncModal.cancelButton": "Annuler", - "searchConnectors.syncJobs.cancelSyncModal.confirmButton": "Confirmer", - "searchConnectors.syncJobs.cancelSyncModal.description": "Êtes-vous sûrs de vouloir annuler cette tâche de synchronisation ?", - "searchConnectors.syncJobs.cancelSyncModal.syncJobId": "ID de tâche de synchronisation :", - "searchConnectors.syncJobs.cancelSyncModal.title": "Annuler la tâche de synchronisation", - "searchConnectors.syncJobs.flyout.canceledDescription": "Synchronisation annulée le {date}", - "searchConnectors.syncJobs.flyout.canceledTitle": "Synchronisation annulée", - "searchConnectors.syncJobs.flyout.completedDescription": "Terminé le {date}", - "searchConnectors.syncJobs.flyout.completedTitle": "Synchronisation terminée", - "searchConnectors.syncJobs.flyout.failureDescription": "Échec de la synchronisation : {error}.", - "searchConnectors.syncJobs.flyout.failureTitle": "Échec de la synchronisation", - "searchConnectors.syncJobs.flyout.inProgressDescription": "La synchronisation est en cours depuis {duration}.", - "searchConnectors.syncJobs.flyout.inProgressTitle": "En cours", - "searchConnectors.syncJobs.flyout.startedAtDescription": "Démarrée le {date}", - "searchConnectors.syncJobs.flyout.sync": "Sync", - "searchConnectors.syncJobs.flyout.sync.id": "ID", - "searchConnectors.syncJobs.flyout.sync.index": "Nom de l'index", - "searchConnectors.syncJobs.flyout.syncStartedManually": "Synchronisation démarrée manuellement", - "searchConnectors.syncJobs.flyout.syncStartedScheduled": "Synchronisation démarrée par planification", - "searchConnectors.syncJobs.flyout.title": "Log d'événements", - "searchConnectors.syncJobs.lastSync.columnTitle": "Dernière synchronisation", - "searchConnectors.syncJobs.lastSync.columnTitle.tooltip": "L'horodatage du {completed_at} d'une tâche donnée. Les synchronisations se terminent par un succès, une erreur, ou une annulation.", - "searchConnectors.syncJobs.syncDuration.columnTitle": "Durée de synchronisation", - "searchConnectors.syncJobs.syncDuration.columnTitle.tooltip": "Le temps passé entre les horodatages {started_at} et {completed_at} d'une synchronisation. N'inclut pas le temps passé à l'étage \"en attente\".", - "searchConnectors.syncJobType.full": "Contenu entier", - "searchConnectors.syncJobType.incremental": "Contenu progressif", - "searchConnectors.syncStatus.canceled": "Annulation de la synchronisation", - "searchConnectors.syncStatus.canceling": "Synchronisation annulée", - "searchConnectors.syncStatus.completed": "Synchronisation terminée", - "searchConnectors.syncStatus.error": "Échec de la synchronisation", - "searchConnectors.syncStatus.inProgress": "Synchronisation en cours", - "searchConnectors.syncStatus.pending": "Synchronisation en attente", - "searchConnectors.syncStatus.suspended": "Synchronisation suspendue", - "searchConnectorsPlugin.content.nativeConnectors.azureBlob.description": "Effectuez des recherches sur votre contenu sur Stockage Blob Azure.", - "searchConnectorsPlugin.content.nativeConnectors.azureBlob.name": "Stockage Blob Azure", - "searchConnectorsPlugin.content.nativeConnectors.box.description": "Effectuez des recherches sur votre contenu dans Box.", - "searchConnectorsPlugin.content.nativeConnectors.box.name": "Box", - "searchConnectorsPlugin.content.nativeConnectors.confluence_data_center.name": "Centre de données Confluence", - "searchConnectorsPlugin.content.nativeConnectors.confluence.description": "Effectuez des recherches sur votre contenu dans Confluence Cloud.", - "searchConnectorsPlugin.content.nativeConnectors.confluence.name": "Confluence Cloud & Server", - "searchConnectorsPlugin.content.nativeConnectors.confluenceDataCenter.description": "Effectuez des recherches sur votre contenu dans le centre de données Confluence.", - "searchConnectorsPlugin.content.nativeConnectors.customConnector.description": "Effectuez des recherches sur des données stockées dans des sources de données personnalisées.", - "searchConnectorsPlugin.content.nativeConnectors.customConnector.name": "Connecteur personnalisé", - "searchConnectorsPlugin.content.nativeConnectors.dropbox.description": "Effectuez des recherches dans vos fichiers et dossiers stockés sur Dropbox.", - "searchConnectorsPlugin.content.nativeConnectors.dropbox.name": "Dropbox", - "searchConnectorsPlugin.content.nativeConnectors.github.description": "Effectuez des recherches sur vos projets et référentiels sur GitHub.", - "searchConnectorsPlugin.content.nativeConnectors.github.name": "Serveurs GitHub & GitHub Enterprise", - "searchConnectorsPlugin.content.nativeConnectors.gmail.description": "Effectuez des recherches sur votre contenu dans Gmail.", - "searchConnectorsPlugin.content.nativeConnectors.gmail.name": "Gmail", - "searchConnectorsPlugin.content.nativeConnectors.googleCloud.description": "Effectuez des recherches sur votre contenu sur Google Cloud Storage.", - "searchConnectorsPlugin.content.nativeConnectors.googleCloud.name": "Google Cloud Storage", - "searchConnectorsPlugin.content.nativeConnectors.googleDrive.description": "Effectuez des recherches sur votre contenu sur Google Drive.", - "searchConnectorsPlugin.content.nativeConnectors.googleDrive.name": "Google Drive", - "searchConnectorsPlugin.content.nativeConnectors.graphQL.description": "Effectuez des recherches dans votre contenu avec GraphQL.", - "searchConnectorsPlugin.content.nativeConnectors.graphQL.name": "GraphQL", - "searchConnectorsPlugin.content.nativeConnectors.jira_data_center.name": "Centre de données Jira", - "searchConnectorsPlugin.content.nativeConnectors.jira.description": "Effectuez des recherches sur votre contenu dans Jira Cloud.", - "searchConnectorsPlugin.content.nativeConnectors.jira.name": "Jira Cloud", - "searchConnectorsPlugin.content.nativeConnectors.jiraDataCenter.description": "Effectuez des recherches sur votre contenu dans le centre de données Jira.", - "searchConnectorsPlugin.content.nativeConnectors.jiraServer.description": "Effectuez des recherches sur votre contenu dans le serveur Jira.", - "searchConnectorsPlugin.content.nativeConnectors.jiraServer.name": "Serveur Jira", - "searchConnectorsPlugin.content.nativeConnectors.microsoftSQL.name": "Microsoft SQL", - "searchConnectorsPlugin.content.nativeConnectors.mongoDB.description": "Effectuez des recherches sur votre contenu dans MongoDB.", - "searchConnectorsPlugin.content.nativeConnectors.mongodb.name": "MongoDB", - "searchConnectorsPlugin.content.nativeConnectors.msSql.description": "Effectuez des recherches sur votre contenu sur Microsoft SQL Server.", - "searchConnectorsPlugin.content.nativeConnectors.mysql.description": "Effectuez des recherches sur votre contenu dans MySQL.", - "searchConnectorsPlugin.content.nativeConnectors.mysql.name": "MySQL", - "searchConnectorsPlugin.content.nativeConnectors.netowkrDrive.description": "Effectuez des recherches sur le contenu de votre lecteur réseau.", - "searchConnectorsPlugin.content.nativeConnectors.networkDrive.name": "Lecteur réseau", - "searchConnectorsPlugin.content.nativeConnectors.notion.description": "Effectuez des recherches sur votre contenu dans Notion.", - "searchConnectorsPlugin.content.nativeConnectors.notion.name": "Notion", - "searchConnectorsPlugin.content.nativeConnectors.oneDrive.description": "Effectuez des recherches sur votre contenu dans OneDrive.", - "searchConnectorsPlugin.content.nativeConnectors.oneDrive.name": "OneDrive", - "searchConnectorsPlugin.content.nativeConnectors.openTextDocumentum.description": "Recherchez votre contenu sur OpenText Documentum.", - "searchConnectorsPlugin.content.nativeConnectors.openTextDocumentum.name": "OpenText Documentum", - "searchConnectorsPlugin.content.nativeConnectors.oracle.description": "Effectuez des recherches sur votre contenu dans Oracle.", - "searchConnectorsPlugin.content.nativeConnectors.oracle.name": "Oracle", - "searchConnectorsPlugin.content.nativeConnectors.outlook.description": "Effectuez des recherches sur votre contenu dans Outlook.", - "searchConnectorsPlugin.content.nativeConnectors.outlook.name": "Outlook", - "searchConnectorsPlugin.content.nativeConnectors.postgreSQL.description": "Effectuez des recherches sur votre contenu dans PostgreSQL.", - "searchConnectorsPlugin.content.nativeConnectors.postgresql.name": "PostgreSQL", - "searchConnectorsPlugin.content.nativeConnectors.redis.description": "Effectuez des recherches sur votre contenu dans Redis.", - "searchConnectorsPlugin.content.nativeConnectors.redis.name": "Redis", - "searchConnectorsPlugin.content.nativeConnectors.s3.description": "Effectuez des recherches sur votre contenu dans Amazon S3.", - "searchConnectorsPlugin.content.nativeConnectors.s3.name": "S3", - "searchConnectorsPlugin.content.nativeConnectors.salesforce.description": "Effectuez des recherches sur votre contenu dans Salesforce.", - "searchConnectorsPlugin.content.nativeConnectors.salesforce.name": "Salesforce", - "searchConnectorsPlugin.content.nativeConnectors.salesforceBox.name": "Sandbox Salesforce", - "searchConnectorsPlugin.content.nativeConnectors.salesforceSandbox.description": "Effectuez des recherches sur votre contenu dans Salesforce Sandbox.", - "searchConnectorsPlugin.content.nativeConnectors.serviceNow.description": "Effectuez des recherches sur votre contenu dans ServiceNow.", - "searchConnectorsPlugin.content.nativeConnectors.serviceNow.name": "ServiceNow", - "searchConnectorsPlugin.content.nativeConnectors.sharepointOnline.description": "Effectuez des recherches sur votre contenu dans SharePoint Online.", - "searchConnectorsPlugin.content.nativeConnectors.sharepointOnline.name": "SharePoint en ligne", - "searchConnectorsPlugin.content.nativeConnectors.sharepointServer.description": "Effectuez des recherches sur votre contenu dans Serveur SharePoint.", - "searchConnectorsPlugin.content.nativeConnectors.sharepointServer.name": "Serveur SharePoint", - "searchConnectorsPlugin.content.nativeConnectors.slack.description": "Effectuez des recherches sur votre contenu dans Slack.", - "searchConnectorsPlugin.content.nativeConnectors.slack.name": "Slack", - "searchConnectorsPlugin.content.nativeConnectors.teams.description": "Effectuez des recherches sur votre contenu dans Teams.", - "searchConnectorsPlugin.content.nativeConnectors.teams.name": "Équipes", - "searchConnectorsPlugin.content.nativeConnectors.zoom.description": "Effectuez des recherches sur votre contenu dans Zoom.", - "searchConnectorsPlugin.content.nativeConnectors.zoom.name": "Effectuer un zoom", - "searchErrors.errors.fetchError": "Vérifiez votre connexion réseau et réessayez.", - "searchErrors.esError.unknownRootCause": "inconnue", - "searchErrors.esError.viewDetailsButtonLabel": "Afficher les détails", - "searchErrors.painlessError.buttonTxt": "Modifier le script", - "searchErrors.painlessError.painlessScriptedFieldErrorMessage": "Erreur d'exécution du champ d'exécution ou du champ scripté sur la vue de données {indexPatternName}", - "searchErrors.search.esErrorTitle": "Impossible d’extraire les résultats de recherche", - "searchErrors.search.httpErrorTitle": "Impossible de se connecter au serveur Kibana", - "searchErrors.tsdbError.message": "Le champ {field} du type de série temporelle [compteur] a été utilisé avec une opération {op} non prise en charge.", - "searchErrors.tsdbError.tsdbCounterDocsLabel": "Pour en savoir plus sur les types de champs des séries temporelles et les agrégations compatibles [counter]", - "searchIndexDocuments.documentList.description": "Affichage de {results} sur {total}. Nombre maximal de résultats de recherche de {maximum} documents.", - "searchIndexDocuments.documentList.docsPerPage": "Nombre de documents par page déroulée", - "searchIndexDocuments.documentList.pagination.itemsPerPage": "Documents par page : {docPerPage}", - "searchIndexDocuments.documentList.paginationAriaLabel": "Pagination pour la liste de documents", - "searchIndexDocuments.documentList.paginationOptions.option": "{docCount} documents", - "searchIndexDocuments.documentList.resultLimit": "Seuls les {number} premiers résultats sont disponibles pour la pagination. Veuillez utiliser la barre de recherche pour filtrer vos résultats.", - "searchIndexDocuments.documentList.resultLimitTitle": "Les résultats sont limités à {number} documents", - "searchIndexDocuments.documents.searchField.placeholder": "Rechercher des documents dans cet index", - "searchIndexDocuments.documents.title": "Parcourir des documents", - "searchIndexDocuments.result.expandTooltip.allVisible": "Tous les champs sont visibles", - "searchIndexDocuments.result.expandTooltip.showFewer": "Afficher {amount} champs en moins", - "searchIndexDocuments.result.expandTooltip.showMore": "Afficher {amount} champs en plus", - "searchIndexDocuments.result.header.metadata.deleteDocument": "Supprimer le document", - "searchIndexDocuments.result.header.metadata.icon.ariaLabel": "Métadonnées pour le document : {id}", - "searchIndexDocuments.result.header.metadata.title": "Métadonnées du document", - "searchIndexDocuments.result.title.id": "ID de document : {id}", - "searchResponseWarnings.badgeButtonLabel": "{warningCount} {warningCount, plural, one {avertissement} other {avertissements}}", - "searchResponseWarnings.description.multipleClusters": "Ces clusters ont rencontré des problèmes lors du renvoi des données et les résultats pourraient être incomplets.", - "searchResponseWarnings.description.singleCluster": "Ce cluster a rencontré des problèmes lors du renvoi des données et les résultats pourraient être incomplets.", - "searchResponseWarnings.noResultsTitle": "Résultat introuvable", - "searchResponseWarnings.title.clustersClause": "Un problème est survenu avec {nonSuccessfulClustersCount} {nonSuccessfulClustersCount, plural, one {cluster} other {clusters}}", - "searchResponseWarnings.title.clustersClauseAndRequestsClause": "{clustersClause} pour {requestsCount} requêtes", - "searchResponseWarnings.viewDetailsButtonLabel": "Afficher les détails", - "securitySolutionPackages.alertSuppressionRuleDetails.upsell": "La suppression d'alertes est configurée mais elle ne sera pas appliquée en raison d'une licence insuffisante", - "securitySolutionPackages.alertSuppressionRuleForm.upsell": "La suppression d'alertes est activée avec la licence {requiredLicense} ou supérieure", - "securitySolutionPackages.beta.label": "Bêta", - "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.eventsTab.unit": "{totalCount, plural, =1 {alerte} other {alertes}}", - "securitySolutionPackages.dataTable.loadingEventsDataLabel": "Chargement des événements", - "securitySolutionPackages.dataTable.unit": "{totalCount, plural, =1 {alerte} other {alertes}}", - "securitySolutionPackages.ecsDataQualityDashboard.addToCaseSuccessToast": "Résultats de qualité des données ajoutés au cas", - "securitySolutionPackages.ecsDataQualityDashboard.addToNewCaseButton": "Ajouter au nouveau cas", - "securitySolutionPackages.ecsDataQualityDashboard.allTab.allFieldsTableTitle": "Tous les champs - {indexName}", - "securitySolutionPackages.ecsDataQualityDashboard.cancelButton": "Annuler", - "securitySolutionPackages.ecsDataQualityDashboard.checkAllButton": "Tout vérifier", - "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.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.coldPatternTooltip": "{indices} {indices, plural, =1 {L'index correspondant} other {Les index correspondants}} au modèle {pattern} {indices, plural, =1 {est} 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.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.createADataQualityCaseForIndexHeaderText": "Créer un cas de qualité des données pour l'index {indexName}", - "securitySolutionPackages.ecsDataQualityDashboard.createADataQualityCaseHeaderText": "Créer un cas de qualité des données", - "securitySolutionPackages.ecsDataQualityDashboard.customTab.customFieldsTableTitle": "Champs personnalisés - {indexName}", - "securitySolutionPackages.ecsDataQualityDashboard.customTab.ecsComplaintFieldsTableTitle": "Champs de plainte ECS - {indexName}", - "securitySolutionPackages.ecsDataQualityDashboard.dataQualityPromptContextPill": "Qualité des données ({indexName})", - "securitySolutionPackages.ecsDataQualityDashboard.dataQualityPromptContextPillTooltip": "Ajoutez ce rapport de Qualité des données comme contexte", - "securitySolutionPackages.ecsDataQualityDashboard.dataQualitySuggestedUserPrompt": "Expliquez les résultats ci-dessus et donnez des options pour résoudre les incompatibilités.", - "securitySolutionPackages.ecsDataQualityDashboard.defaultPanelTitle": "Vérifier les mappings d'index", - "securitySolutionPackages.ecsDataQualityDashboard.ecsVersionStat": "Version ECS", - "securitySolutionPackages.ecsDataQualityDashboard.emptyErrorPrompt.errorLoadingMappingsBody": "Un problème est survenu lors du chargement des mappings : {error}", - "securitySolutionPackages.ecsDataQualityDashboard.emptyErrorPrompt.errorLoadingMappingsTitle": "Impossible de charger les mappings d'index", - "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.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.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.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.viewErrorsButton": "Afficher les erreurs", - "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.frozenPatternTooltip": "{indices} {indices, plural, =1 {L'index correspondant} other {Les index correspondants}} au modèle {pattern} {indices, plural, =1 {est} 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.getResultErrorTitle": "Erreur lors de la lecture des résultats d'examen qualité des données sauvegardées", - "securitySolutionPackages.ecsDataQualityDashboard.hotDescription": "L'index est mis à jour et interrogé de façon active", - "securitySolutionPackages.ecsDataQualityDashboard.hotPatternTooltip": "{indices} {indices, plural, =1 {L'index correspondant} other {Les index correspondants}} au modèle {pattern} {indices, plural, =1 {est} other {sont}} \"hot\". Les index \"hot\" sont mis à jour et interrogés de façon active.", - "securitySolutionPackages.ecsDataQualityDashboard.ilmPhaseCold": "froid", - "securitySolutionPackages.ecsDataQualityDashboard.ilmPhaseFrozen": "frozen", - "securitySolutionPackages.ecsDataQualityDashboard.ilmPhaseHot": "hot", - "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.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.ilmPhaseUnmanaged": "non géré", - "securitySolutionPackages.ecsDataQualityDashboard.ilmPhaseWarm": "warm", - "securitySolutionPackages.ecsDataQualityDashboard.incompatibleTab.incompatibleFieldMappingsTableTitle": "Mappings de champ incompatibles – {indexName}", - "securitySolutionPackages.ecsDataQualityDashboard.incompatibleTab.incompatibleFieldValuesTableTitle": "Valeurs de champ incompatibles – {indexName}", - "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.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.allCalloutEmptyContent": "Cet index ne contient aucun mapping", - "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.allCalloutEmptyTitle": "Aucun mapping", - "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.allCalloutTitle": "L'ensemble {fieldCount} {fieldCount, plural, =1 {du mapping de champs} other {des mappings de champs}}", - "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.allFieldsLabel": "Tous les champs", - "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.copyToClipboardButton": "Copier dans le presse-papiers", - "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.customCallout": "{fieldCount, plural, =1 {Ce champ n'est pas défini} other {Ces champs ne sont pas définis}} par la version {version} d'Elastic Common Schema (ECS).", - "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.customCalloutTitle": "{fieldCount} {fieldCount, plural, =1 {Mapping de champs personnalisé} other {Mappings de champ personnalisés}}", - "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.ecsCompliantCallout": "{fieldCount, plural, =1 {Le type de mapping d'index et les valeurs de document de ce champ sont conformes} other {Les types de mapping d'index et les valeurs de document de ces champs sont conformes}} à la version {version} d'Elastic Common Schema (ECS)", - "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.ecsCompliantCalloutTitle": "{fieldCount} {fieldCount, plural, =1 {Champ conforme} other {Champs conformes}} à ECS", - "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": "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.incompatibleCallout.fieldsWithMappingsSameFamilyLabel": "Les champs avec des mappings dans la même famille ont exactement le même comportement de recherche que le type défini par ECS, mais ils peuvent avoir une utilisation de l'espace différente ou différentes caractéristiques de performances.", - "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.incompatibleCallout.whenAFieldIsIncompatibleLabel": "Lorsqu'un champ est incompatible :", - "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.incompatibleCalloutTitle": "{fieldCount} {fieldCount, plural, =1 {Champ incompatible} other {Champs incompatibles}}", - "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.incompatibleEmptyContent": "Tous les mappings de champs et toutes les valeurs de documents de cet index sont conformes à Elastic Common Schema (ECS).", - "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.incompatibleEmptyTitle": "Toutes les valeurs et tous les mappings de champs sont conformes à ECS", - "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.sameFamilyCallout": "{fieldCount, plural, =1 {Ce champ est défini} other {Ces champs sont définis}} par Elastic Common Schema (ECS), version {version}, mais {fieldCount, plural, =1 {son type de mapping de ne correspond} other {leurs types de mapping ne correspondent}} pas exactement.", - "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.sameFamilyCalloutTitle": "{fieldCount} {fieldCount, plural, =1 {Mapping de champs} other {Mappings de champ}} de même famille", - "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.sameFamilyEmptyContent": "Tous les mappings de champs et toutes les valeurs de documents de cet index sont conformes à Elastic Common Schema (ECS).", - "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.sameFamilyEmptyTitle": "Toutes les valeurs et tous les mappings de champs sont conformes à ECS", - "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.sameFamilyTab": "Même famille", - "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.summaryMarkdownDescription": "L'index `{indexName}` a des [mappings]({mappingUrl}) ou des valeurs de champ différentes de l'[Elastic Common Schema]({ecsReferenceUrl}) (ECS), [définitions]({ecsFieldReferenceUrl}).de version `{version}`.", - "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.summaryMarkdownTitle": "Qualité des données", - "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.patternSummary.docsLabel": "Documents", - "securitySolutionPackages.ecsDataQualityDashboard.patternSummary.indicesLabel": "Index", - "securitySolutionPackages.ecsDataQualityDashboard.patternSummary.patternOrIndexTooltip": "Modèle, ou index spécifique", - "securitySolutionPackages.ecsDataQualityDashboard.postResultErrorTitle": "Erreur lors de l'écriture des résultats d'examen qualité des données sauvegardées", - "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.sameFamilyTab.sameFamilyFieldMappingsTableTitle": "Mêmes familles de mappings de champ – {indexName}", - "securitySolutionPackages.ecsDataQualityDashboard.securitySolutionPackages.ecsDataQualityDashboardSubtitle": "Vérifiez la compatibilité des mappings et des valeurs d'index avec", - "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.docsLabel": "Documents", - "securitySolutionPackages.ecsDataQualityDashboard.statLabels.indicesLabel": "Index", - "securitySolutionPackages.ecsDataQualityDashboard.statLabels.sameFamilyLabel": "Même famille", - "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.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.storage.docs.unit": "{totalCount, plural, =1 {Document} other {Documents}}", - "securitySolutionPackages.ecsDataQualityDashboard.storageTreemap.noDataLabel": "Aucune donnée à afficher", - "securitySolutionPackages.ecsDataQualityDashboard.storageTreemap.noDataReasonLabel": "Le champ {stackByField1} n'était présent dans aucun groupe", - "securitySolutionPackages.ecsDataQualityDashboard.summaryTable.collapseLabel": "Réduire", - "securitySolutionPackages.ecsDataQualityDashboard.summaryTable.expandRowsColumn": "Développer les lignes", - "securitySolutionPackages.ecsDataQualityDashboard.summaryTable.indexesNameLabel": "Nom de l'index", - "securitySolutionPackages.ecsDataQualityDashboard.summaryTable.indexToolTip": "Cet index correspond au nom d'index ou de modèle : {pattern}", - "securitySolutionPackages.ecsDataQualityDashboard.summaryTable.lastCheckColumn": "Dernière vérification", - "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.unmanagedPatternTooltip": "{indices} {indices, plural, =1 {L'index correspondant} other {Les index correspondants}} au modèle {pattern} {indices, plural, =1 {n'est pas géré} other {ne sont pas gérés}} 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.ecsDataQualityDashboard.warmPatternTooltip": "{indices} {indices, plural, =1 {L'index correspondant} other {Les index correspondants}} au modèle {pattern} {indices, plural, =1 {est} other {sont}} \"warm\". Les index \"warm\" ne sont plus mis à jour, mais ils sont toujours interrogés.", - "securitySolutionPackages.entityAnalytics.navigation": "Analyse des entités", - "securitySolutionPackages.entityAnalytics.pageDesc": "Détecter les menaces des utilisateurs et des hôtes de votre réseau avec l'Analyse des entités", - "securitySolutionPackages.entityAnalytics.paywall.upgradeButton": "Passer à {requiredLicenseOrProduct}", - "securitySolutionPackages.features.featureRegistry.assistant.updateAnonymizationSubFeatureDetails": "Autoriser les modifications", - "securitySolutionPackages.features.featureRegistry.assistant.updateAnonymizationSubFeatureName": "Sélection et Anonymisation de champ", - "securitySolutionPackages.features.featureRegistry.casesSettingsSubFeatureDetails": "Modifier les paramètres du cas", - "securitySolutionPackages.features.featureRegistry.casesSettingsSubFeatureName": "Paramètres du cas", - "securitySolutionPackages.features.featureRegistry.deleteSubFeatureDetails": "Supprimer les cas et les commentaires", - "securitySolutionPackages.features.featureRegistry.deleteSubFeatureName": "Supprimer", - "securitySolutionPackages.features.featureRegistry.linkSecuritySolutionAssistantTitle": "Assistant d’intelligence artificielle d’Elastic", - "securitySolutionPackages.features.featureRegistry.linkSecuritySolutionCaseTitle": "Cas", - "securitySolutionPackages.features.featureRegistry.linkSecuritySolutionTitle": "Sécurité", - "securitySolutionPackages.features.featureRegistry.subFeatures.assistant.description": "Modifiez les champs par défaut autorisés à être utilisés par l'assistant IA et Attack discovery. Anonymisez n'importe quel contenu pour les champs sélectionnés.", - "securitySolutionPackages.features.featureRegistry.subFeatures.blockList": "Liste noire", - "securitySolutionPackages.features.featureRegistry.subFeatures.blockList.description": "Étendez la protection d'Elastic Defend contre les processus malveillants et protégez-vous des applications potentiellement nuisibles.", - "securitySolutionPackages.features.featureRegistry.subFeatures.blockList.privilegesTooltip": "\"Tous les espaces\" est requis pour l'accès à la liste noire.", - "securitySolutionPackages.features.featureRegistry.subFeatures.endpointExceptions": "Exceptions de point de terminaison", - "securitySolutionPackages.features.featureRegistry.subFeatures.endpointExceptions.description": "Utiliser les exceptions de point de terminaison (il s'agit d'une sous-fonctionnalité test).", - "securitySolutionPackages.features.featureRegistry.subFeatures.endpointExceptions.privilegesTooltip": "\"Tous les espaces\" est requis pour l'accès aux exceptions de points de terminaison.", - "securitySolutionPackages.features.featureRegistry.subFeatures.endpointList": "Liste de points de terminaison", - "securitySolutionPackages.features.featureRegistry.subFeatures.endpointList.description": "Affiche tous les hôtes exécutant Elastic Defend et leurs détails d'intégration associés.", - "securitySolutionPackages.features.featureRegistry.subFeatures.endpointList.privilegesTooltip": "\"Tous les espaces\" est requis pour l'accès à la liste de points de terminaison.", - "securitySolutionPackages.features.featureRegistry.subFeatures.eventFilters": "Filtres d'événements", - "securitySolutionPackages.features.featureRegistry.subFeatures.eventFilters.description": "Excluez les événements de point de terminaison dont vous n'avez pas besoin ou que vous ne souhaitez pas stocker dans Elasticsearch.", - "securitySolutionPackages.features.featureRegistry.subFeatures.eventFilters.privilegesTooltip": "\"Tous les espaces\" est requis pour l'accès aux filtres d'événements.", - "securitySolutionPackages.features.featureRegistry.subFeatures.executeOperations": "Exécuter les opérations", - "securitySolutionPackages.features.featureRegistry.subFeatures.executeOperations.description": "Effectuez les actions de réponse d'exécution de script dans la console de réponse.", - "securitySolutionPackages.features.featureRegistry.subFeatures.executeOperations.privilegesTooltip": "\"Tous les espaces\" est requis pour l'accès aux opérations d'exécution.", - "securitySolutionPackages.features.featureRegistry.subFeatures.fileOperations": "Opérations de fichier", - "securitySolutionPackages.features.featureRegistry.subFeatures.fileOperations.description": "Effectuez les actions de réponse liées aux fichiers dans la console de réponse.", - "securitySolutionPackages.features.featureRegistry.subFeatures.fileOperations.privilegesTooltip": "\"Tous les espaces\" est requis pour l'accès aux opérations de fichier.", - "securitySolutionPackages.features.featureRegistry.subFeatures.hostIsolation": "Isolation de l'hôte", - "securitySolutionPackages.features.featureRegistry.subFeatures.hostIsolation.description": "Effectuez les actions de réponse \"isoler\" et \"libérer\".", - "securitySolutionPackages.features.featureRegistry.subFeatures.hostIsolation.privilegesTooltip": "\"Tous les espaces\" est requis pour l'accès à l'isolation de l'hôte.", - "securitySolutionPackages.features.featureRegistry.subFeatures.hostIsolationExceptions": "Exceptions d'isolation de l'hôte", - "securitySolutionPackages.features.featureRegistry.subFeatures.hostIsolationExceptions.description": "Ajoutez des adresses IP spécifiques avec lesquelles les hôtes isolés sont toujours autorisés à communiquer, même lorsqu'ils sont isolés du reste du réseau.", - "securitySolutionPackages.features.featureRegistry.subFeatures.hostIsolationExceptions.privilegesTooltip": "\"Tous les espaces\" est requis pour l'accès aux exceptions d'isolation de l'hôte.", - "securitySolutionPackages.features.featureRegistry.subFeatures.policyManagement": "Gestion des politiques Elastic Defend", - "securitySolutionPackages.features.featureRegistry.subFeatures.policyManagement.description": "Accédez à la politique d'intégration Elastic Defend pour configurer les protections, la collecte des événements et les fonctionnalités de politique avancées.", - "securitySolutionPackages.features.featureRegistry.subFeatures.policyManagement.privilegesTooltip": "\"Tous les espaces\" est requis pour l'accès à la gestion des politiques.", - "securitySolutionPackages.features.featureRegistry.subFeatures.processOperations": "Opérations de traitement", - "securitySolutionPackages.features.featureRegistry.subFeatures.processOperations.description": "Effectuez les actions de réponse liées aux processus dans la console de réponse.", - "securitySolutionPackages.features.featureRegistry.subFeatures.processOperations.privilegesTooltip": "\"Tous les espaces\" est requis pour l'accès aux opérations de traitement.", - "securitySolutionPackages.features.featureRegistry.subFeatures.responseActionsHistory": "Historique des actions de réponse", - "securitySolutionPackages.features.featureRegistry.subFeatures.responseActionsHistory.description": "Accédez à l'historique des actions de réponse effectuées sur les points de terminaison.", - "securitySolutionPackages.features.featureRegistry.subFeatures.responseActionsHistory.privilegesTooltip": "\"Tous les espaces\" est requis pour l'accès à l'historique des actions de réponse.", - "securitySolutionPackages.features.featureRegistry.subFeatures.scanOperations": "Opérations d’analyse", - "securitySolutionPackages.features.featureRegistry.subFeatures.scanOperations.description": "Effectuez les actions de réponse liées aux analyses de dossiers dans la console de réponse.", - "securitySolutionPackages.features.featureRegistry.subFeatures.scanOperations.privilegesTooltip": "Tous les espaces est requis pour l'accès aux opérations d’analyse.", - "securitySolutionPackages.features.featureRegistry.subFeatures.trustedApplications": "Applications de confiance", - "securitySolutionPackages.features.featureRegistry.subFeatures.trustedApplications.description": "Aide à atténuer les conflits avec d'autres logiciels, généralement d'autres applications d'antivirus ou de sécurité des points de terminaison.", - "securitySolutionPackages.features.featureRegistry.subFeatures.trustedApplications.privilegesTooltip": "\"Tous les espaces\" est requis pour l'accès aux applications de confiance.", - "securitySolutionPackages.flyout.right.header.collapseDetailButtonAriaLabel": "Réduire les détails", - "securitySolutionPackages.flyout.right.header.collapseDetailButtonLabel": "Réduire les détails", - "securitySolutionPackages.flyout.right.header.expandDetailButtonAriaLabel": "Développer les détails", - "securitySolutionPackages.flyout.right.header.expandDetailButtonLabel": "Développer les détails", - "securitySolutionPackages.flyout.shared.errorDescription": "Une erreur est survenue lors de l'affichage de {message}.", - "securitySolutionPackages.flyout.shared.errorTitle": "Impossible d'afficher {title}.", - "securitySolutionPackages.flyout.shared.ExpandablePanelButtonIconAriaLabel": "Activer/Désactiver le panneau extensible", - "securitySolutionPackages.flyout.shared.expandablePanelLoadingAriaLabel": "panneau extensible", - "securitySolutionPackages.markdown.insight.upsell": "Passez au niveau {requiredLicense} pour pouvoir utiliser les informations des guides d'investigation", - "securitySolutionPackages.markdown.investigationGuideInteractions.upsell": "Passez au niveau {requiredLicense} pour pouvoir utiliser les interactions des guides d'investigation", - "securitySolutionPackages.navigation.landingLinks": "Vues de sécurité", - "securitySolutionPackages.sideNav.betaBadge.label": "Bêta", - "securitySolutionPackages.sideNav.togglePanel": "Activer/Désactiver le panneau de navigation", - "share.advancedSettings.csv.quoteValuesText": "Les valeurs doivent-elles être mises entre guillemets dans les exportations CSV ?", - "share.advancedSettings.csv.quoteValuesTitle": "Mettre les valeurs CSV entre guillemets", - "share.advancedSettings.csv.separatorText": "Séparer les valeurs exportées avec cette chaîne", - "share.advancedSettings.csv.separatorTitle": "Séparateur CSV", - "share.contextMenu.embedCodeLabel": "Incorporer le code", - "share.contextMenu.embedCodePanelTitle": "Incorporer le code", - "share.contextMenu.embedCodeTab": "Intégrer", - "share.contextMenu.exportCodeTab": "Exporter", - "share.contextMenu.permalinkPanelTitle": "Obtenir le lien", - "share.contextMenu.permalinksLabel": "Obtenir les liens", - "share.contextMenu.permalinksTab": "Liens", - "share.contextMenuTitle": "Partager ce {objectType}", - "share.dashboard.link.description": "Partagez un lien direct avec cette recherche.", - "share.embed.dashboard.helpText": "Intégrez ce tableau de bord dans une autre page web. Sélectionnez les éléments à inclure dans la vue intégrable.", - "share.embed.helpText": "Intégrez ce {objectType} dans une autre page web.", - "share.fileType": "Type de fichier", - "share.link.copied": "Texte copié", - "share.link.copyEmbedCodeButton": "Copier le code intégré", - "share.link.copyLinkButton": "Copier le lien", - "share.link.helpText": "Partager un lien direct vers ce {objectType}.", - "share.link.warning.lens": "Copiez le lien afin d’obtenir un lien temporaire. Enregistrez la visualisation Lens pour créer un lien permanent.", - "share.link.warning.title": "Modifications non enregistrées", - "share.modalContent.copyUrlButtonLabel": "Copier l'URL Post", - "share.postURLWatcherMessage": "Copiez cette URL POST pour appeler la génération depuis l'extérieur de Kibana ou à partir de Watcher.", - "share.postURLWatcherMessage.unsavedChanges": "L'URL peut changer si vous mettez Kibana à niveau.", - "share.screenCapturePanelContent.optimizeForPrintingHelpText": "Utilise plusieurs pages, affichant au maximum 2 visualisations par page ", - "share.screenCapturePanelContent.optimizeForPrintingLabel": "Pour l'impression", - "share.urlPanel.canNotShareAsSavedObjectHelpText": "Pour le partager comme objet enregistré, enregistrez le {objectType}.", - "share.urlPanel.copyIframeCodeButtonLabel": "Copier le code iFrame", - "share.urlPanel.copyLinkButtonLabel": "Copier le lien", - "share.urlPanel.generateLinkAsLabel": "Générer le lien en tant que", - "share.urlPanel.publicUrlHelpText": "Utilisez l'URL publique pour partager avec tout le monde. Elle permet un accès anonyme en une étape, en supprimant l'invite de connexion.", - "share.urlPanel.publicUrlLabel": "URL publique", - "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}.", - "share.urlPanel.savedObjectLabel": "Objet enregistré", - "share.urlPanel.shortUrlHelpText": "Nous vous recommandons de partager des URL de snapshot raccourcies pour une compatibilité maximale. Internet Explorer présente des restrictions de longueur d'URL et certains analyseurs de wiki et de balisage ne fonctionnent pas bien avec les URL de snapshot longues, mais les URL courtes devraient bien fonctionner.", - "share.urlPanel.shortUrlLabel": "URL courte", - "share.urlPanel.snapshotDescription": "Les URL de snapshot encodent l'état actuel de {objectType} dans l'URL elle-même. Les modifications apportées au {objectType} enregistré ne seront pas visibles via cette URL.", - "share.urlPanel.snapshotLabel": "Snapshot", - "share.urlPanel.unableCreateShortUrlErrorMessage": "Impossible de créer une URL courte. Erreur : {errorMessage}.", - "share.urlPanel.urlGroupTitle": "URL", - "share.urlService.redirect.components.docTitle": "Introuvable", - "share.urlService.redirect.components.Error.body": "Désolé, l'objet que vous recherchez est introuvable à cet URL. Il a peut-être été supprimé ou renommé, ou peut-être qu'il n'a jamais existé.", - "share.urlService.redirect.components.Error.homeButton": "Retour à l'accueil", - "share.urlService.redirect.components.Error.title": "Impossible d'ouvrir l'URL", - "share.urlService.redirect.components.Spinner.label": "Redirection…", - "share.urlService.redirect.RedirectManager.invalidParamParams": "Impossible d'analyser les paramètres du localisateur. Les paramètres du localisateur doivent être sérialisés en tant que JSON et définis au paramètre de recherche d'URL \"p\".", - "share.urlService.redirect.RedirectManager.locatorNotFound": "Le localisateur [ID = {id}] n'existe pas.", - "share.urlService.redirect.RedirectManager.missingParamLocator": "ID du localisateur non spécifié. Spécifiez le paramètre de recherche \"l\" dans l'URL ; ce devrait être un ID de localisateur existant.", - "share.urlService.redirect.RedirectManager.missingParamParams": "Paramètres du localisateur non spécifiés. Spécifiez le paramètre de recherche \"p\" dans l'URL ; ce devrait être un objet sérialisé JSON des paramètres du localisateur.", - "share.urlService.redirect.RedirectManager.missingParamVersion": "Version des paramètres du localisateur non spécifiée. Spécifiez le paramètre de recherche \"v\" dans l'URL ; ce devrait être la version de Kibana au moment de la génération des paramètres du localisateur.", - "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.", - "sharedUXPackages.card.noData.noPermission.description": "Cette intégration n'est pas encore activée. Votre administrateur possède les autorisations requises pour l'activer.", - "sharedUXPackages.card.noData.noPermission.title": "Contactez votre administrateur", - "sharedUXPackages.card.noData.title": "Ajouter Elastic Agent", - "sharedUXPackages.chrome.sideNavigation.betaBadge.label": "Bêta", - "sharedUXPackages.chrome.sideNavigation.recentlyAccessed.title": "Récent", - "sharedUXPackages.chrome.sideNavigation.togglePanel": "Afficher/Masquer le panneau de navigation \"{title}\"", - "sharedUXPackages.codeEditor.ariaLabel": "Éditeur de code", - "sharedUXPackages.codeEditor.enterKeyLabel": "Entrée", - "sharedUXPackages.codeEditor.escapeKeyLabel": "Échap", - "sharedUXPackages.codeEditor.readOnlyMessage": "Modification impossible dans l'éditeur en lecture seule", - "sharedUXPackages.codeEditor.startEditing": "Appuyez sur {key} pour modifier.", - "sharedUXPackages.codeEditor.startEditingReadOnly": "Appuyez sur {key} pour interagir avec le code.", - "sharedUXPackages.codeEditor.stopEditing": "Appuyez sur {key} pour arrêter la modification.", - "sharedUXPackages.codeEditor.stopEditingReadOnly": "Appuyez sur {key} pour arrêter l'interaction.", - "sharedUXPackages.error_boundary.fatal.prompt.body": "Essayez d'actualiser la page pour résoudre le problème.", - "sharedUXPackages.error_boundary.fatal.prompt.detailButton": "Afficher les détails", - "sharedUXPackages.error_boundary.fatal.prompt.details": "L'erreur ci-dessus a eu lieu dans {name} :", - "sharedUXPackages.error_boundary.fatal.prompt.details.close": "Fermer", - "sharedUXPackages.error_boundary.fatal.prompt.details.copyToClipboard": "Copier l'erreur dans le presse-papiers", - "sharedUXPackages.error_boundary.fatal.prompt.details.title": "Détails de l'erreur", - "sharedUXPackages.error_boundary.fatal.prompt.pageReloadButton": "Actualiser la page", - "sharedUXPackages.error_boundary.fatal.prompt.title": "Impossible de charger la page", - "sharedUXPackages.error_boundary.recoverable.prompt.body": "Cela devrait résoudre les problèmes de chargement de la page.", - "sharedUXPackages.error_boundary.recoverable.prompt.pageReloadButton": "Actualiser la page", - "sharedUXPackages.error_boundary.recoverable.prompt.title": "Actualiser la page", - "sharedUXPackages.exitFullScreenButton.exitFullScreenModeButtonText": "Quitter le plein écran", - "sharedUXPackages.exitFullScreenButton.fullScreenModeDescription": "En mode Plein écran, appuyez sur Échap pour quitter.", - "sharedUXPackages.filePicker.cancel": "Annuler", - "sharedUXPackages.filePicker.clearFilterButtonLabel": "Effacer le filtre", - "sharedUXPackages.filePicker.delete": "Supprimer", - "sharedUXPackages.filePicker.deleteFile": "Supprimer le fichier", - "sharedUXPackages.filePicker.deleteFileQuestion": "Voulez-vous vraiment supprimer \"{fileName}\" ?", - "sharedUXPackages.filePicker.emptyGridPrompt": "Aucun fichier ne correspond à votre filtre", - "sharedUXPackages.filePicker.emptyStatePromptTitle": "Charger votre premier fichier", - "sharedUXPackages.filePicker.error.loadingTitle": "Impossible de charger les fichiers", - "sharedUXPackages.filePicker.error.retryButtonLabel": "Réessayer", - "sharedUXPackages.filePicker.loadMoreButtonLabel": "Charger plus", - "sharedUXPackages.filePicker.searchFieldPlaceholder": "my-file-*", - "sharedUXPackages.filePicker.selectFileButtonLable": "Sélectionner un fichier", - "sharedUXPackages.filePicker.selectFilesButtonLable": "Sélectionner {nrOfFiles} fichiers", - "sharedUXPackages.filePicker.title": "Sélectionner un fichier", - "sharedUXPackages.filePicker.titleMultiple": "Sélectionner des fichiers", - "sharedUXPackages.filePicker.uploadFilePlaceholderText": "Glisser-déposer pour charger de nouveaux fichiers", - "sharedUXPackages.fileUpload.cancelButtonLabel": "Annuler", - "sharedUXPackages.fileUpload.clearButtonLabel": "Effacer", - "sharedUXPackages.fileUpload.defaultFilePickerLabel": "Charger un fichier", - "sharedUXPackages.fileUpload.fileTooLargeErrorMessage": "Le fichier est trop volumineux. La taille maximale est de {expectedSize, plural, one {# octet} other {# octets} }.", - "sharedUXPackages.fileUpload.mimeTypeNotSupportedErrorMessage": "Le type de fichier mime \"{mimeType}\" n'est pas pris en charge. Les types de fichiers mime pris en charge sont : {supportedMimeTypes}.", - "sharedUXPackages.fileUpload.retryButtonLabel": "Réessayer", - "sharedUXPackages.fileUpload.uploadButtonLabel": "Charger", - "sharedUXPackages.fileUpload.uploadCompleteButtonLabel": "Chargement terminé", - "sharedUXPackages.fileUpload.uploadDoneToolTipContent": "Votre fichier a bien été chargé !", - "sharedUXPackages.fileUpload.uploadingButtonLabel": "Chargement", - "sharedUXPackages.no_data_views.esqlButtonLabel": "Langue : ES|QL", - "sharedUXPackages.no_data_views.esqlDocsLink": "En savoir plus.", - "sharedUXPackages.no_data_views.esqlMessage": "Vous pouvez aussi rechercher vos données en utilisant directement ES|QL. {docsLink}", - "sharedUXPackages.noDataConfig.addIntegrationsDescription": "Utilisez Elastic Agent pour collecter des données et créer des solutions Analytics.", - "sharedUXPackages.noDataConfig.addIntegrationsTitle": "Ajouter des intégrations", - "sharedUXPackages.noDataConfig.analytics": "Analyse", - "sharedUXPackages.noDataConfig.analyticsPageTitle": "Bienvenue dans Analytics !", - "sharedUXPackages.noDataConfig.elasticsearch": "Elasticsearch", - "sharedUXPackages.noDataConfig.elasticsearchDescription": "Configurez votre client de langage de programmation, ingérez des données et lancez vos recherches.", - "sharedUXPackages.noDataConfig.elasticsearchPageTitle": "Bienvenue dans Elasticsearch !", - "sharedUXPackages.noDataConfig.elasticsearchTitle": "Ajouter des données", - "sharedUXPackages.noDataConfig.observability": "Observabilité", - "sharedUXPackages.noDataConfig.observabilityDescription": "Commencez par collecter les données en utilisant une de nos nombreuses intégrations.", - "sharedUXPackages.noDataConfig.observabilityPageDescription": "Combinez les indicateurs, les logs et les traces pour surveiller la santé de vos applications.", - "sharedUXPackages.noDataConfig.observabilityPageTitle": "Bienvenue dans Elastic Observability !", - "sharedUXPackages.noDataConfig.observabilityTitle": "Ajouter des données", - "sharedUXPackages.noDataPage.intro": "Ajoutez vos données pour commencer, ou {link} sur {solution}.", - "sharedUXPackages.noDataPage.intro.link": "en savoir plus", - "sharedUXPackages.noDataPage.introNoDocLink": "Ajoutez vos données pour commencer.", - "sharedUXPackages.noDataPage.welcomeTitle": "Bienvenue dans Elastic {solution}.", - "sharedUXPackages.noDataViewsPrompt.addDataViewText": "Créer une vue de données", - "sharedUXPackages.noDataViewsPrompt.dataViewExplanation": "Les vues de données identifient les données Elasticsearch que vous souhaitez explorer. Vous pouvez faire pointer des vues de données vers un ou plusieurs flux de données, index et alias d'index, tels que vos données de log d'hier, ou vers tous les index contenant vos données de log.", - "sharedUXPackages.noDataViewsPrompt.learnMore": "Envie d'en savoir plus ?", - "sharedUXPackages.noDataViewsPrompt.noPermission.dataViewExplanation": "Les vues de données identifient les données Elasticsearch que vous souhaitez explorer. Pour créer des vues de données, demandez les autorisations requises à votre administrateur.", - "sharedUXPackages.noDataViewsPrompt.noPermission.title": "Vous devez disposer d'une autorisation pour pouvoir créer des vues de données", - "sharedUXPackages.noDataViewsPrompt.nowCreate": "Créez à présent une vue de données.", - "sharedUXPackages.noDataViewsPrompt.readDocumentation": "Lisez les documents", - "sharedUXPackages.noDataViewsPrompt.youHaveData": "Vous avez des données dans Elasticsearch.", - "sharedUXPackages.prompt.errors.notFound.body": "Désolé, la page que vous recherchez est introuvable. Elle a peut-être été retirée ou renommée, ou peut-être qu'elle n'a jamais existé.", - "sharedUXPackages.prompt.errors.notFound.goBacklabel": "Retour", - "sharedUXPackages.prompt.errors.notFound.title": "Page introuvable", - "sharedUXPackages.solutionNav.collapsibleLabel": "Réduire la navigation latérale", - "sharedUXPackages.solutionNav.menuText": "menu", - "sharedUXPackages.solutionNav.mobileTitleText": "{solutionName} {menuText}", - "sharedUXPackages.solutionNav.openLabel": "Ouvrir la navigation latérale", - "telemetry.callout.appliesSettingTitle": "Les modifications apportées à ce paramètre s'appliquent dans {allOfKibanaText} et sont enregistrées automatiquement.", - "telemetry.callout.appliesSettingTitle.allOfKibanaText": "tout Kibana", - "telemetry.callout.clusterStatisticsDescription": "Voici un exemple des statistiques de cluster de base que nous collecterons. Cela comprend le nombre d'index, de partitions et de nœuds. Cela comprend également des statistiques d'utilisation de niveau élevé, comme l'état d'activation du monitoring.", - "telemetry.callout.clusterStatisticsTitle": "Statistiques du cluster", - "telemetry.callout.errorLoadingClusterStatisticsDescription": "Une erreur inattendue s'est produite lors de la récupération des statistiques du cluster. Cela peut être dû à un échec d'Elasticsearch ou de Kibana, ou provenir d’une erreur réseau. Vérifiez Kibana, puis rechargez la page et réessayez.", - "telemetry.callout.errorLoadingClusterStatisticsTitle": "Erreur lors du chargement des statistiques du cluster", - "telemetry.callout.errorUnprivilegedUserDescription": "Vous ne disposez pas de l'accès requis pour voir les statistiques non chiffrées du cluster.", - "telemetry.callout.errorUnprivilegedUserTitle": "Erreur lors de l'affichage des statistiques du cluster", - "telemetry.clusterData": "données du cluster", - "telemetry.dataManagementDisableCollectionLink": "Désactivez la collecte de données d’utilisation.", - "telemetry.dataManagementDisclaimerPrivacy": "{optInStatus} Ceci nous permet de savoir ce qui intéresse le plus nos utilisateurs, afin d'améliorer nos produits et services. Veuillez vous référer à notre {privacyStatementLink}.", - "telemetry.dataManagementDisclaimerPrivacyLink": "Déclaration de confidentialité", - "telemetry.dataManagementEnableCollectionLink": "Activez la collecte de données d’utilisation.", - "telemetry.disabledStatus": "La collecte de données d’utilisation est désactivée.", - "telemetry.enabledStatus": "La collecte de données d’utilisation est activée.", - "telemetry.optInErrorToastText": "Une erreur s'est produite lors de la définition des préférences relatives aux statistiques d'utilisation.", - "telemetry.optInErrorToastTitle": "Erreur", - "telemetry.optInNoticeSeenErrorTitle": "Erreur", - "telemetry.optInNoticeSeenErrorToastText": "Une erreur s'est produite lors du rejet de l'avis.", - "telemetry.optInSuccessOff": "Ne partage plus l’utilisation avec Elastic.", - "telemetry.optInSuccessOn": "Le partage d’utilisation avec Elastic est activé.", - "telemetry.provideUsageDataTitle": "Partager l’utilisation avec Elastic", - "telemetry.readOurUsageDataPrivacyStatementLinkText": "Déclaration de confidentialité", - "telemetry.securityData": "données de sécurité", - "telemetry.seeExampleOfClusterDataAndEndpointSecuity": "Découvrez des exemples de {clusterData} et de {securityData} que nous collectons.", - "telemetry.telemetryConfigAndLinkDescription": "Activer la collecte de données d’utilisation nous permet de savoir ce qui intéresse le plus nos utilisateurs, afin de pouvoir améliorer nos produits et services. Veuillez vous référer à notre {privacyStatementLink}.", - "telemetry.telemetryConstant": "données télémétriques", - "telemetry.telemetryOptedInDismissMessage": "Rejeter", - "telemetry.telemetryOptedInNoticeTitle": "Aidez-nous à améliorer la Suite Elastic.", - "telemetry.usageCollectionConstant": "collecte de données d’utilisation", - "telemetry.usageDataTitle": "Collecte de données d’utilisation", - "esqlEditor.query.aborted": "La demande a été annulée", - "languageDocumentation.documentationESQL.aggregationFunctions": "Fonctions d'agrégation", - "languageDocumentation.documentationESQL.aggregationFunctionsDocumentationESQLDescription": "Ces fonctions peuvent être utilisées avec STATS...BY :", - "esqlEditor.query.cancel": "Annuler", - "esqlEditor.query.collapseLabel": "Réduire", - "languageDocumentation.documentationESQL.commandsDescription": "Une commande source produit un tableau, habituellement avec des données issues d'Elasticsearch. ES|QL est compatible avec les commandes sources suivantes.", - "esqlEditor.query.disableWordWrapLabel": "Supprimer les sauts de ligne des barres verticales", "languageDocumentation.documentationESQL.abs": "ABS", "languageDocumentation.documentationESQL.abs.markdown": "\n\n ### ABS\n Renvoie la valeur absolue.\n\n ````\n Numéro ROW = -1.0 \n | EVAL abs_number = ABS(number)\n ````\n ", "languageDocumentation.documentationESQL.acos": "ACOS", "languageDocumentation.documentationESQL.acos.markdown": "\n\n ### ACOS\n Renvoie l'arc cosinus de `n` sous forme d'angle, exprimé en radians.\n\n ````\n ROW a=.9\n | EVAL acos=ACOS(a)\n ````\n ", + "languageDocumentation.documentationESQL.aggregationFunctions": "Fonctions d'agrégation", + "languageDocumentation.documentationESQL.aggregationFunctionsDocumentationESQLDescription": "Ces fonctions peuvent être utilisées avec STATS...BY :", "languageDocumentation.documentationESQL.asin": "ASIN", "languageDocumentation.documentationESQL.asin.markdown": "\n\n ### ASIN\n Renvoie l'arc sinus de l'entrée\n expression numérique sous forme d'angle, exprimée en radians.\n\n ````\n ROW a=.9\n | EVAL asin=ASIN(a)\n ````\n ", "languageDocumentation.documentationESQL.atan": "ATAN", @@ -7120,6 +5503,7 @@ "languageDocumentation.documentationESQL.cidr_match.markdown": "\n\n ### CIDR_MATCH\n Renvoie `true` si l'IP fournie est contenue dans l'un des blocs CIDR fournis.\n\n ````\n FROM hosts \n | WHERE CIDR_MATCH(ip1, \"127.0.0.2/32\", \"127.0.0.3/32\") \n | KEEP card, host, ip0, ip1\n ````\n ", "languageDocumentation.documentationESQL.coalesce": "COALESCE", "languageDocumentation.documentationESQL.coalesce.markdown": "\n\n ### COALESCE\n Renvoie le premier de ses arguments qui n'est pas nul. Si tous les arguments sont nuls, `null` est renvoyé.\n\n ````\n ROW a=null, b=\"b\"\n | EVAL COALESCE(a, b)\n ````\n ", + "languageDocumentation.documentationESQL.commandsDescription": "Une commande source produit un tableau, habituellement avec des données issues d'Elasticsearch. ES|QL est compatible avec les commandes sources suivantes.", "languageDocumentation.documentationESQL.concat": "CONCAT", "languageDocumentation.documentationESQL.concat.markdown": "\n\n ### CONCAT\n Concatène deux ou plusieurs chaînes.\n\n ```\n FROM employees\n | KEEP first_name, last_name\n | EVAL fullname = CONCAT(first_name, \" \", last_name)\n ````\n ", "languageDocumentation.documentationESQL.cos": "COS", @@ -7154,10 +5538,14 @@ "languageDocumentation.documentationESQL.from_base64": "FROM_BASE64", "languageDocumentation.documentationESQL.from_base64.markdown": "\n\n ### FROM_BASE64\n Décodez une chaîne base64.\n\n ````\n row a = \"ZWxhc3RpYw==\" \n | eval d = from_base64(a)\n ````\n ", "languageDocumentation.documentationESQL.from.markdown": "### FROM\nLa commande source `FROM` renvoie un tableau contenant jusqu'à 10 000 documents issus d'un flux de données, d'un index ou d'un alias. Chaque ligne du tableau obtenu correspond à un document. Chaque colonne correspond à un champ et est accessible par le nom de ce champ.\n\n````\nFROM employees\n````\n\nVous pouvez utiliser des [calculs impliquant des dates](https://www.elastic.co/guide/en/elasticsearch/reference/current/api-conventions.html#api-date-math-index-names) pour désigner les indices, les alias et les flux de données. Cela peut s'avérer utile pour les données temporelles.\n\nUtilisez des listes séparées par des virgules ou des caractères génériques pour rechercher plusieurs flux de données, indices ou alias :\n\n````\nFROM employees-00001,employees-*\n````\n\n#### Métadonnées\n\nES|QL peut accéder aux champs de métadonnées suivants :\n\n* `_index` : l'index auquel appartient le document. Le champ est du type `keyword`.\n* `_id` : l'identifiant du document source. Le champ est du type `keyword`.\n* `_id` : la version du document source. Le champ est du type `long`.\n\nUtilisez la directive `METADATA` pour activer les champs de métadonnées :\n\n````\nFROM index [METADATA _index, _id]\n````\n\nLes champs de métadonnées ne sont disponibles que si la source des données est un index. Par conséquent, `FROM` est la seule commande source qui prend en charge la directive `METADATA`.\n\nUne fois activés, les champs sont disponibles pour les commandes de traitement suivantes, tout comme les autres champs de l'index :\n\n````\nFROM ul_logs, apps [METADATA _index, _version]\n| WHERE id IN (13, 14) AND _version == 1\n| EVAL key = CONCAT(_index, \"_\", TO_STR(id))\n| SORT id, _index\n| KEEP id, _index, _version, key\n````\n\nDe même, comme pour les champs d'index, une fois l'agrégation effectuée, un champ de métadonnées ne sera plus accessible aux commandes suivantes, sauf s'il est utilisé comme champ de regroupement :\n\n````\nFROM employees [METADATA _index, _id]\n| STATS max = MAX(emp_no) BY _index\n````\n ", + "languageDocumentation.documentationESQL.functions": "Fonctions", + "languageDocumentation.documentationESQL.functionsDocumentationESQLDescription": "Les fonctions sont compatibles avec \"ROW\" (Ligne), \"EVAL\" (Évaluation) et \"WHERE\" (Où).", "languageDocumentation.documentationESQL.greatest": "GREATEST", "languageDocumentation.documentationESQL.greatest.markdown": "\n\n ### GREATEST\n Renvoie la valeur maximale de plusieurs colonnes. Similaire à `MV_MAX`\n sauf que ceci est destiné à une exécution sur plusieurs colonnes à la fois.\n\n ````\n ROW a = 10, b = 20\n | EVAL g = GREATEST(a, b)\n ````\n Remarque : Lorsque cette fonction est exécutée sur les champs `keyword` ou `text`, elle renvoie la dernière chaîne dans l'ordre alphabétique. Lorsqu'elle est exécutée sur des colonnes `boolean`, elle renvoie `true` si l'une des valeurs l'est.\n ", "languageDocumentation.documentationESQL.grok": "GROK", "languageDocumentation.documentationESQL.grok.markdown": "### GROK\n`GROK` vous permet d'extraire des données structurées d'une chaîne. `GROK` compare la chaîne à des modèles, sur la base d’expressions régulières, et extrait les modèles indiqués en tant que colonnes.\n\nPour obtenir la syntaxe des modèles \"grok\", consultez [la documentation relative au processeur \"grok\"](https://www.elastic.co/guide/en/elasticsearch/reference/current/grok-processor.html).\n\n````\nROW a = \"12 15.5 15.6 true\"\n| GROK a \"%'{NUMBER:b:int}' %'{NUMBER:c:float}' %'{NUMBER:d:double}' %'{WORD:e:boolean}'\"\n````\n ", + "languageDocumentation.documentationESQL.groupingFunctions": "Fonctions de groupage", + "languageDocumentation.documentationESQL.groupingFunctionsDocumentationESQLDescription": "Ces fonctions de regroupement peuvent être utilisées avec `STATS...BY` :", "languageDocumentation.documentationESQL.inOperator": "IN", "languageDocumentation.documentationESQL.inOperator.markdown": "### IN\nL'opérateur `IN` permet de tester si un champ ou une expression est égal à un élément d'une liste de littéraux, de champs ou d'expressions :\n\n````\nROW a = 1, b = 4, c = 3\n| WHERE c-a IN (3, b / 2, a)\n````\n ", "languageDocumentation.documentationESQL.ip_prefix": "IP_PREFIX", @@ -7213,12 +5601,16 @@ "languageDocumentation.documentationESQL.mvExpand.markdown": "### MV_EXPAND\nLa commande de traitement `MV_EXPAND` développe les champs multivalués en indiquant une valeur par ligne et en dupliquant les autres champs : \n````\nROW a=[1,2,3], b=\"b\", j=[\"a\",\"b\"]\n| MV_EXPAND a\n````\n ", "languageDocumentation.documentationESQL.now": "NOW", "languageDocumentation.documentationESQL.now.markdown": "\n\n ### NOW\n Renvoie la date et l'heure actuelles.\n\n ````\n ROW current_date = NOW()\n ````\n ", + "languageDocumentation.documentationESQL.operators": "Opérateurs", + "languageDocumentation.documentationESQL.operatorsDocumentationESQLDescription": "ES|QL est compatible avec les opérateurs suivants :", "languageDocumentation.documentationESQL.pi": "PI", "languageDocumentation.documentationESQL.pi.markdown": "\n\n ### PI\n Renvoie Pi, le rapport entre la circonférence et le diamètre d'un cercle.\n\n ````\n ROW PI()\n ````\n ", "languageDocumentation.documentationESQL.pow": "POW", "languageDocumentation.documentationESQL.pow.markdown": "\n\n ### POW\n Renvoie la valeur d’une `base` élevée à la puissance d’un `exposant`.\n\n ````\n ROW base = 2.0, exponent = 2\n | EVAL result = POW(base, exponent)\n ````\n Remarque : Il est toujours possible de dépasser un résultat double ici ; dans ce cas, la valeur `null` sera renvoyée.\n ", "languageDocumentation.documentationESQL.predicates": "valeurs NULL", "languageDocumentation.documentationESQL.predicates.markdown": "### Valeurs NULL\nPour une comparaison avec une valeur NULL, utilisez les attributs `IS NULL` et `IS NOT NULL` :\n\n````\nFROM employees\n| WHERE birth_date IS NULL\n| KEEP first_name, last_name\n| SORT first_name\n| LIMIT 3\n````\n\n````\nFROM employees\n| WHERE is_rehired IS NOT NULL\n| STATS count(emp_no)\n````\n ", + "languageDocumentation.documentationESQL.processingCommands": "Traitement des commandes", + "languageDocumentation.documentationESQL.processingCommandsDescription": "Le traitement des commandes transforme un tableau des entrées par l'ajout, le retrait ou la modification des lignes et des colonnes. ES|QL est compatible avec le traitement des commandes suivant.", "languageDocumentation.documentationESQL.rename": "RENAME", "languageDocumentation.documentationESQL.rename.markdown": "### RENAME\nUtilisez `RENAME` pour renommer une colonne en utilisant la syntaxe suivante :\n\n````\nRENAME AS \n````\n\nPar exemple :\n\n````\nFROM employees\n| KEEP first_name, last_name, still_hired\n| RENAME still_hired AS employed\n````\n\nSi une colonne portant le nouveau nom existe déjà, elle sera remplacée par la nouvelle colonne.\n\nPlusieurs colonnes peuvent être renommées à l'aide d'une seule commande `RENAME` :\n\n````\nFROM employees\n| KEEP first_name, last_name\n| RENAME first_name AS fn, last_name AS ln\n````\n ", "languageDocumentation.documentationESQL.repeat": "REPEAT", @@ -7243,6 +5635,7 @@ "languageDocumentation.documentationESQL.sinh.markdown": "\n\n ### SINH\n Renvoie le sinus hyperbolique d'un angle.\n\n ````\n ROW a=1.8 \n | EVAL sinh=SINH(a)\n ````\n ", "languageDocumentation.documentationESQL.sort": "SORT", "languageDocumentation.documentationESQL.sort.markdown": "### SORT\nUtilisez la commande `SORT` pour trier les lignes sur un ou plusieurs champs :\n\n````\nFROM employees\n| KEEP first_name, last_name, height\n| SORT height\n````\n\nL'ordre de tri par défaut est croissant. Définissez un ordre de tri explicite en utilisant `ASC` ou `DESC` :\n\n````\nFROM employees\n| KEEP first_name, last_name, height\n| SORT height DESC\n````\n\nSi deux lignes disposent de la même clé de tri, l'ordre original sera préservé. Vous pouvez ajouter des expressions de tri pour départager les deux lignes :\n\n````\nFROM employees\n| KEEP first_name, last_name, height\n| SORT height DESC, first_name ASC\n````\n\n#### valeurs `null`\nPar défaut, les valeurs `null` sont considérées comme étant supérieures à toutes les autres valeurs. Selon un ordre de tri croissant, les valeurs `null` sont classées en dernier. Selon un ordre de tri décroissant, les valeurs `null` sont classées en premier. Pour modifier cet ordre, utilisez `NULLS FIRST` ou `NULLS LAST` :\n\n````\nFROM employees\n| KEEP first_name, last_name, height\n| SORT first_name ASC NULLS FIRST\n````\n ", + "languageDocumentation.documentationESQL.sourceCommands": "Commandes sources", "languageDocumentation.documentationESQL.split": "SPLIT", "languageDocumentation.documentationESQL.split.markdown": "\n\n ### SPLIT\n Divise une chaîne de valeur unique en plusieurs chaînes.\n\n ````\n ROW words=\"foo;bar;baz;qux;quux;corge\"\n | EVAL word = SPLIT(words, \";\")\n ````\n ", "languageDocumentation.documentationESQL.sqrt": "SQRT", @@ -7315,36 +5708,1643 @@ "languageDocumentation.documentationESQL.trim.markdown": "\n\n ### TRIM\n Supprime les espaces de début et de fin d'une chaîne.\n\n ````\n ROW message = \" some text \", color = \" red \"\n | EVAL message = TRIM(message)\n | EVAL color = TRIM(color)\n ````\n ", "languageDocumentation.documentationESQL.where": "WHERE", "languageDocumentation.documentationESQL.where.markdown": "### WHERE\nUtilisez `WHERE` afin d'obtenir un tableau qui comprend toutes les lignes du tableau d'entrée pour lesquelles la condition fournie est évaluée à `true` :\n \n````\nFROM employees\n| KEEP first_name, last_name, still_hired\n| WHERE still_hired == true\n````\n\n#### Opérateurs\n\nPour obtenir un aperçu des opérateurs pris en charge, consultez la section **Opérateurs**.\n\n#### Fonctions\n`WHERE` prend en charge diverses fonctions de calcul des valeurs. Pour en savoir plus, consultez la section **Fonctions**.\n ", - "esqlEditor.query.EnableWordWrapLabel": "Ajouter des sauts de ligne aux barres verticales", - "esqlEditor.query.errorCount": "{count} {count, plural, one {erreur} other {erreurs}}", - "esqlEditor.query.errorsTitle": "Erreurs", - "esqlEditor.query.expandLabel": "Développer", - "esqlEditor.query.feedback": "Commentaires", - "languageDocumentation.documentationESQL.functions": "Fonctions", - "languageDocumentation.documentationESQL.functionsDocumentationESQLDescription": "Les fonctions sont compatibles avec \"ROW\" (Ligne), \"EVAL\" (Évaluation) et \"WHERE\" (Où).", - "languageDocumentation.documentationESQL.groupingFunctions": "Fonctions de groupage", - "languageDocumentation.documentationESQL.groupingFunctionsDocumentationESQLDescription": "Ces fonctions de regroupement peuvent être utilisées avec `STATS...BY` :", - "esqlEditor.query.hideQueriesLabel": "Masquer les recherches récentes", - "esqlEditor.query.lineCount": "{count} {count, plural, one {ligne} other {lignes}}", - "esqlEditor.query.lineNumber": "Ligne {lineNumber}", - "languageDocumentation.documentationESQL.operators": "Opérateurs", - "languageDocumentation.documentationESQL.operatorsDocumentationESQLDescription": "ES|QL est compatible avec les opérateurs suivants :", - "languageDocumentation.documentationESQL.processingCommands": "Traitement des commandes", - "languageDocumentation.documentationESQL.processingCommandsDescription": "Le traitement des commandes transforme un tableau des entrées par l'ajout, le retrait ou la modification des lignes et des colonnes. ES|QL est compatible avec le traitement des commandes suivant.", - "esqlEditor.query.querieshistory.error": "La requête a échouée", - "esqlEditor.query.querieshistory.success": "La requête a été exécuté avec succès", - "esqlEditor.query.querieshistoryCopy": "Copier la requête dans le presse-papier", - "esqlEditor.query.querieshistoryRun": "Exécuter la requête", - "esqlEditor.query.querieshistoryTable": "Tableau d'historique des recherches", - "esqlEditor.query.recentQueriesColumnLabel": "Recherches récentes", - "esqlEditor.query.runQuery": "Exécuter la requête", - "esqlEditor.query.showQueriesLabel": "Afficher les recherches récentes", - "languageDocumentation.documentationESQL.sourceCommands": "Commandes sources", - "esqlEditor.query.submitFeedback": "Soumettre un commentaire", - "esqlEditor.query.timeRanColumnLabel": "Temps exécuté", - "esqlEditor.query.timestampNotDetected": "@timestamp non trouvé", - "esqlEditor.query.warningCount": "{count} {count, plural, one {avertissement} other {avertissements}}", - "esqlEditor.query.warningsTitle": "Avertissements", + "languageDocumentation.documentationLinkLabel": "Voir toute la documentation", + "languageDocumentation.header": "Référence de {language}", + "languageDocumentation.searchPlaceholder": "Recherche", + "languageDocumentation.tooltip": "Référence de {lang}", + "lensFormulaDocs.avg": "Moyenne", + "lensFormulaDocs.boolean": "booléen", + "lensFormulaDocs.cardinality": "Décompte unique", + "lensFormulaDocs.cardinality.documentation.markdown": "\nCalcule le nombre de valeurs uniques d'un champ donné. Fonctionne pour les nombres, les chaînes, les dates et les valeurs booléennes.\n\nExemple : calculer le nombre de produits différents : \n`unique_count(product.name)`\n\nExemple : calculer le nombre de produits différents du groupe \"clothes\" : \n`unique_count(product.name, kql='product.group=clothes')`\n ", + "lensFormulaDocs.cardinality.signature": "champ : chaîne", + "lensFormulaDocs.CommonFormulaDocumentation": "Les formules les plus courantes divisent deux valeurs pour produire un pourcentage. Pour obtenir un affichage correct, définissez \"Format de valeur\" sur \"pourcent\".", + "lensFormulaDocs.count": "Décompte", + "lensFormulaDocs.count.documentation.markdown": "\nNombre total de documents. Lorsque vous fournissez un champ, le nombre total de valeurs de champ est compté. Lorsque vous utilisez la fonction de décompte pour les champs qui comportent plusieurs valeurs dans un même document, toutes les valeurs sont comptées.\n\n#### Exemples\n\nPour calculer le nombre total de documents, utilisez `count()`.\n\nPour calculer le nombre de produits, utilisez `count(products.id)`.\n\nPour calculer le nombre de documents qui correspondent à un filtre donné, utilisez `count(kql='price > 500')`.\n", + "lensFormulaDocs.count.signature": "[champ : chaîne]", + "lensFormulaDocs.counterRate": "Taux de compteur", + "lensFormulaDocs.counterRate.documentation.markdown": "\nCalcule le taux d'un compteur toujours croissant. Cette fonction renvoie uniquement des résultats utiles inhérents aux champs d'indicateurs de compteur qui contiennent une mesure quelconque à croissance régulière.\nSi la valeur diminue, elle est interprétée comme une mesure de réinitialisation de compteur. Pour obtenir des résultats plus précis, `counter_rate\" doit être calculé d’après la valeur `max` du champ.\n\nCe calcul est réalisé séparément pour des séries distinctes définies par des filtres ou des dimensions de valeurs supérieures.\nIl utilise l'intervalle en cours utilisé dans la formule.\n\nExemple : visualiser le taux d'octets reçus au fil du temps par un serveur Memcached : \n`counter_rate(max(memcached.stats.read.bytes))`\n ", + "lensFormulaDocs.counterRate.signature": "indicateur : nombre", + "lensFormulaDocs.cumulative_sum.signature": "indicateur : nombre", + "lensFormulaDocs.cumulativeSum": "Somme cumulée", + "lensFormulaDocs.cumulativeSum.documentation.markdown": "\nCalcule la somme cumulée d'un indicateur au fil du temps, en ajoutant toutes les valeurs précédentes d'une série à chaque valeur. Pour utiliser cette fonction, vous devez également configurer une dimension de l'histogramme de dates.\n\nCe calcul est réalisé séparément pour des séries distinctes définies par des filtres ou des dimensions de valeurs supérieures.\n\nExemple : visualiser les octets reçus cumulés au fil du temps : \n`cumulative_sum(sum(bytes))`\n", + "lensFormulaDocs.derivative": "Différences", + "lensFormulaDocs.differences.documentation.markdown": "\nCalcule la différence par rapport à la dernière valeur d'un indicateur au fil du temps. Pour utiliser cette fonction, vous devez également configurer une dimension de l'histogramme de dates.\nLes données doivent être séquentielles pour les différences. Si vos données sont vides lorsque vous utilisez des différences, essayez d'augmenter l'intervalle de l'histogramme de dates.\n\nCe calcul est réalisé séparément pour des séries distinctes définies par des filtres ou des dimensions de valeurs supérieures.\n\nExemple : visualiser la modification des octets reçus au fil du temps : \n`differences(sum(bytes))`\n", + "lensFormulaDocs.differences.signature": "indicateur : nombre", + "lensFormulaDocs.documentation.columnCalculationSection": "Calculs de colonnes", + "lensFormulaDocs.documentation.columnCalculationSectionDescription": "Ces fonctions sont exécutées pour chaque ligne, mais elles sont fournies avec la colonne entière comme contexte. Elles sont également appelées fonctions de fenêtre.", + "lensFormulaDocs.documentation.comparisonSection": "Comparaison", + "lensFormulaDocs.documentation.comparisonSectionDescription": "Ces fonctions sont utilisées pour effectuer une comparaison de valeurs.", + "lensFormulaDocs.documentation.constantsSection": "Contexte Kibana", + "lensFormulaDocs.documentation.constantsSectionDescription": "Ces fonctions sont utilisées pour récupérer des variables de contexte Kibana, c’est-à-dire l’histogramme de date `interval`, le `now` actuel et le `time_range` sélectionné, et pour vous aider à faire des opérations mathématiques de dates.", + "lensFormulaDocs.documentation.elasticsearchSection": "Elasticsearch", + "lensFormulaDocs.documentation.elasticsearchSectionDescription": "Ces fonctions seront exécutées sur les documents bruts pour chaque ligne du tableau résultant, en agrégeant tous les documents correspondant aux dimensions de répartition en une seule valeur.", + "lensFormulaDocs.documentation.filterRatio": "Rapport de filtre", + "lensFormulaDocs.documentation.filterRatioDescription.markdown": "### Rapport de filtre :\n\nUtilisez `kql=''` pour filtrer un ensemble de documents et le comparer à d'autres documents du même regroupement.\nPar exemple, pour consulter l'évolution du taux d'erreur au fil du temps :\n\n````\ncount(kql='response.status_code > 400') / count()\n````\n ", + "lensFormulaDocs.documentation.markdown": "## Fonctionnement\n\nLes formules Lens permettent de réaliser des calculs à l'aide d'une combinaison d'agrégations Elasticsearch et\nde fonctions mathématiques. Trois types principaux de fonctions existent :\n\n* Indicateurs Elasticsearch, comme `sum(bytes)`\n* Fonctions de séries temporelles utilisant les indicateurs Elasticsearch en tant qu'entrée, comme `cumulative_sum()`\n* Fonctions mathématiques, comme `round()`\n\nVoici un exemple de formule qui les utilise tous :\n\n````\nround(100 * moving_average(\naverage(cpu.load.pct),\nwindow=10,\nkql='datacenter.name: east*'\n))\n````\n\nLes fonctions Elasticsearch utilisent un nom de champ, qui peut être entre guillemets. `sum(bytes)` est ainsi identique à\n`sum('bytes')`.\n\nCertaines fonctions utilisent des arguments nommés, comme `moving_average(count(), window=5)`.\n\nLes indicateurs Elasticsearch peuvent être filtrés à l’aide de la syntaxe KQL ou Lucene. Pour ajouter un filtre, utilisez le paramètre\nnommé `kql='field: value'` ou `lucene=''`. Utilisez toujours des guillemets simples pour écrire des requêtes KQL\nou Lucene. Si votre recherche contient un guillemet simple, utilisez une barre oblique inverse pour l’échapper, par exemple : `kql='Women\\'s\".\n\nLes fonctions mathématiques peuvent utiliser des arguments positionnels : par exemple, pow(count(), 3) est identique à count() * count() * count().\n\nUtilisez les opérateurs +, -, / et * pour réaliser des opérations de base.\n", + "lensFormulaDocs.documentation.mathSection": "Mathématique", + "lensFormulaDocs.documentation.mathSectionDescription": "Ces fonctions seront exécutées pour chaque ligne du tableau résultant en utilisant des valeurs uniques de la même ligne calculées à l'aide d'autres fonctions.", + "lensFormulaDocs.documentation.percentOfTotal": "Pourcentage du total", + "lensFormulaDocs.documentation.percentOfTotalDescription.markdown": "### Pourcentage du total\n\nLes formules peuvent calculer `overall_sum` pour tous les regroupements,\nce qui permet de convertir chaque regroupement en un pourcentage du total :\n\n````\nsum(products.base_price) / overall_sum(sum(products.base_price))\n````\n ", + "lensFormulaDocs.documentation.recentChange": "Modification récente", + "lensFormulaDocs.documentation.recentChangeDescription.markdown": "### Modification récente\n\nUtilisez `reducedTimeRange='30m'` pour ajouter un filtre supplémentaire sur la plage temporelle d'un indicateur aligné avec la fin d'une plage temporelle globale. Vous pouvez l'utiliser pour calculer le degré de modification récente d'une valeur.\n\n````\nmax(system.network.in.bytes, reducedTimeRange=\"30m\")\n- min(system.network.in.bytes, reducedTimeRange=\"30m\")\n````\n ", + "lensFormulaDocs.documentation.weekOverWeek": "Semaine après semaine", + "lensFormulaDocs.documentation.weekOverWeekDescription.markdown": "### Semaine après semaine :\n\nUtilisez `shift='1w'` pour obtenir la valeur de chaque regroupement\nde la semaine précédente. Le décalage ne doit pas être utilisé avec la fonction *Valeurs les plus élevées*.\n\n````\npercentile(system.network.in.bytes, percentile=99) /\npercentile(system.network.in.bytes, percentile=99, shift='1w')\n````\n ", + "lensFormulaDocs.frequentlyUsedHeading": "Formules courantes", + "lensFormulaDocs.interval": "Intervalle de l'histogramme des dates", + "lensFormulaDocs.interval.help": "\nL’intervalle minimum spécifié pour l’histogramme de date, en millisecondes (ms).\n\nExemple : Normalisez l'indicateur de façon dynamique en fonction de la taille d'intervalle du compartiment : \n\"sum(bytes) / interval()\"\n", + "lensFormulaDocs.lastValue": "Dernière valeur", + "lensFormulaDocs.lastValue.documentation.markdown": "\nRenvoie la valeur d'un champ du dernier document, triée par le champ d'heure par défaut de la vue de données.\n\nCette fonction permet de récupérer le dernier état d'une entité.\n\nExemple : obtenir le statut actuel du serveur A : \n`last_value(server.status, kql='server.name=\"A\"')`\n", + "lensFormulaDocs.lastValue.signature": "champ : chaîne", + "lensFormulaDocs.max": "Maximum", + "lensFormulaDocs.median": "Médiane", + "lensFormulaDocs.metric.documentation.markdown": "\nRenvoie l'indicateur {metric} d'un champ. Cette fonction fonctionne uniquement pour les champs numériques.\n\nExemple : obtenir l'indicateur {metric} d'un prix : \n`{metric}(price)`\n\nExemple : obtenir l'indicateur {metric} d'un prix pour des commandes du Royaume-Uni : \n`{metric}(price, kql='location:UK')`\n ", + "lensFormulaDocs.metric.signature": "champ : chaîne", + "lensFormulaDocs.min": "Minimum", + "lensFormulaDocs.moving_average.signature": "indicateur : nombre, [window] : nombre", + "lensFormulaDocs.movingAverage": "Moyenne mobile", + "lensFormulaDocs.movingAverage.documentation.markdown": "\nCalcule la moyenne mobile d'un indicateur au fil du temps, en prenant la moyenne des n dernières valeurs pour calculer la valeur actuelle. Pour utiliser cette fonction, vous devez également configurer une dimension de l'histogramme de dates.\nLa valeur de fenêtre par défaut est {defaultValue}.\n\nCe calcul est réalisé séparément pour des séries distinctes définies par des filtres ou des dimensions de valeurs supérieures.\n\nPrend un paramètre nommé `window` qui spécifie le nombre de dernières valeurs à inclure dans le calcul de la moyenne de la valeur actuelle.\n\nExemple : lisser une ligne de mesures : \n`moving_average(sum(bytes), window=5)`\n", + "lensFormulaDocs.now": "Actuel", + "lensFormulaDocs.now.help": "\nLa durée actuelle passée dans Kibana exprimée en millisecondes (ms).\n\nExemple : Depuis combien de temps (en millisecondes) le serveur est-il en marche depuis son dernier redémarrage ? \n\"now() - last_value(start_time)\"\n", + "lensFormulaDocs.number": "numéro", + "lensFormulaDocs.overall_average.documentation.markdown": "\nCalcule la moyenne d'un indicateur pour tous les points de données d'une série dans le graphique actuel. Une série est définie par une dimension à l'aide d'un histogramme de dates ou d'une fonction d'intervalle.\nD'autres dimensions permettant de répartir les données telles que les valeurs supérieures ou les filtres sont traitées en tant que séries distinctes.\n\nSi le graphique actuel n'utilise aucun histogramme de dates ou aucune fonction d'intervalle, `overall_average` calcule la moyenne pour toutes les dimensions, quelle que soit la fonction utilisée.\n\nExemple : écart par rapport à la moyenne : \n`sum(bytes) - overall_average(sum(bytes))`\n", + "lensFormulaDocs.overall_max.documentation.markdown": "\nCalcule la valeur maximale d'un indicateur pour tous les points de données d'une série dans le graphique actuel. Une série est définie par une dimension à l'aide d'un histogramme de dates ou d'une fonction d'intervalle.\nD'autres dimensions permettant de répartir les données telles que les valeurs supérieures ou les filtres sont traitées en tant que séries distinctes.\n\nSi le graphique actuel n'utilise aucun histogramme de dates ou aucune fonction d'intervalle, `overall_max` calcule la valeur maximale pour toutes les dimensions, quelle que soit la fonction utilisée.\n\nExemple : Pourcentage de plage : \n`(sum(bytes) - overall_min(sum(bytes))) / (overall_max(sum(bytes)) - overall_min(sum(bytes)))`\n", + "lensFormulaDocs.overall_metric": "indicateur : nombre", + "lensFormulaDocs.overall_min.documentation.markdown": "\nCalcule la valeur minimale d'un indicateur pour tous les points de données d'une série dans le graphique actuel. Une série est définie par une dimension à l'aide d'un histogramme de dates ou d'une fonction d'intervalle.\nD'autres dimensions permettant de répartir les données telles que les valeurs supérieures ou les filtres sont traitées en tant que séries distinctes.\n\nSi le graphique actuel n'utilise aucun histogramme de dates ou aucune fonction d'intervalle, `overall_min` calcule la valeur minimale pour toutes les dimensions, quelle que soit la fonction utilisée.\n\nExemple : Pourcentage de plage : \n`(sum(bytes) - overall_min(sum(bytes)) / (overall_max(sum(bytes)) - overall_min(sum(bytes)))`\n", + "lensFormulaDocs.overall_sum.documentation.markdown": "\nCalcule la somme d'un indicateur pour tous les points de données d'une série dans le graphique actuel. Une série est définie par une dimension à l'aide d'un histogramme de dates ou d'une fonction d'intervalle.\nD'autres dimensions permettant de répartir les données telles que les valeurs supérieures ou les filtres sont traitées en tant que séries distinctes.\n\nSi le graphique actuel n'utilise aucun histogramme de dates ou aucune fonction d'intervalle, `overall_sum` calcule la somme pour toutes les dimensions, quelle que soit la fonction utilisée.\n\nExemple : Pourcentage total : \n`sum(bytes) / overall_sum(sum(bytes))`\n", + "lensFormulaDocs.overallAverage": "Moyenne globale", + "lensFormulaDocs.overallMax": "Max général", + "lensFormulaDocs.overallMin": "Min général", + "lensFormulaDocs.overallSum": "Somme générale", + "lensFormulaDocs.percentile": "Centile", + "lensFormulaDocs.percentile.documentation.markdown": "\nRenvoie le centile spécifié des valeurs d'un champ. Il s'agit de la valeur de n pour cent des valeurs présentes dans les documents.\n\nExemple : obtenir le nombre d'octets supérieurs à 95 % des valeurs : \n`percentile(bytes, percentile=95)`\n", + "lensFormulaDocs.percentile.signature": "champ : chaîne, [percentile] : nombre", + "lensFormulaDocs.percentileRank": "Rang centile", + "lensFormulaDocs.percentileRanks.documentation.markdown": "\nRenvoie le pourcentage de valeurs qui sont en dessous d'une certaine valeur. Par exemple, si une valeur est supérieure à 95 % des valeurs observées, elle est placée au 95e rang centile.\n\nExemple : Obtenir le pourcentage de valeurs qui sont en dessous de 100 : \n`percentile_rank(bytes, value=100)`\n", + "lensFormulaDocs.percentileRanks.signature": "champ : chaîne, [valeur] : nombre", + "lensFormulaDocs.standardDeviation": "Écart-type", + "lensFormulaDocs.standardDeviation.documentation.markdown": "\nRenvoie la taille de la variation ou de la dispersion du champ. Cette fonction ne s’applique qu’aux champs numériques.\n\n#### Exemples\n\nPour obtenir l'écart-type d'un prix, utilisez `standard_deviation(price)`.\n\nPour obtenir la variance du prix des commandes passées au Royaume-Uni, utilisez `square(standard_deviation(price, kql='location:UK'))`.\n", + "lensFormulaDocs.string": "chaîne", + "lensFormulaDocs.sum": "Somme", + "lensFormulaDocs.time_range": "Plage temporelle", + "lensFormulaDocs.time_scale": "indicateur : nombre, unité : s|m|h|d|w|M|y", + "lensFormulaDocs.time_scale.documentation.markdown": "\nCette fonction avancée est utile pour normaliser les comptes et les sommes sur un intervalle de temps spécifique. Elle permet l'intégration avec les indicateurs qui sont stockés déjà normalisés sur un intervalle de temps spécifique.\n\nVous pouvez faire appel à cette fonction uniquement si une fonction d'histogramme des dates est utilisée dans le graphique actuel.\n\nExemple : Un rapport comparant un indicateur déjà normalisé à un autre indicateur devant être normalisé. \n`normalize_by_unit(counter_rate(max(system.diskio.write.bytes)), unit='s') / last_value(apache.status.bytes_per_second)`\n", + "lensFormulaDocs.timeRange.help": "\nL'intervalle de temps spécifié, en millisecondes (ms).\n\nExemple : Quelle est la durée de la plage temporelle actuelle en (ms) ?\n`time_range()`\n\nExemple : Une moyenne statique par minute calculée avec l'intervalle de temps actuel :\n`(sum(bytes) / time_range()) * 1000 * 60`\n", + "lensFormulaDocs.timeScale": "Normaliser par unité", + "lensFormulaDocs.tinymath.absFunction.markdown": "\nCalcule une valeur absolue. Une valeur négative est multipliée par -1, une valeur positive reste identique.\n\nExemple : calculer la distance moyenne par rapport au niveau de la mer `abs(average(altitude))`\n ", + "lensFormulaDocs.tinymath.addFunction.markdown": "\nAjoute jusqu'à deux nombres.\nFonctionne également avec le symbole `+`.\n\nExemple : calculer la somme de deux champs\n\n`sum(price) + sum(tax)`\n\nExemple : compenser le compte par une valeur statique\n\n`add(count(), 5)`\n ", + "lensFormulaDocs.tinymath.base": "base", + "lensFormulaDocs.tinymath.cbrtFunction.markdown": "\nÉtablit la racine carrée de la valeur.\n\nExemple : calculer la longueur du côté à partir du volume\n`cbrt(last_value(volume))`\n ", + "lensFormulaDocs.tinymath.ceilFunction.markdown": "\nArrondit le plafond de la valeur au chiffre supérieur.\n\nExemple : arrondir le prix au dollar supérieur\n`ceil(sum(price))`\n ", + "lensFormulaDocs.tinymath.clampFunction.markdown": "\nÉtablit une limite minimale et maximale pour la valeur.\n\nExemple : s'assurer de repérer les valeurs aberrantes\n````\nclamp(\n average(bytes),\n percentile(bytes, percentile=5),\n percentile(bytes, percentile=95)\n)\n````\n", + "lensFormulaDocs.tinymath.condition": "condition", + "lensFormulaDocs.tinymath.cubeFunction.markdown": "\nCalcule le cube d'un nombre.\n\nExemple : calculer le volume à partir de la longueur du côté\n`cube(last_value(length))`\n ", + "lensFormulaDocs.tinymath.decimals": "décimales", + "lensFormulaDocs.tinymath.defaultFunction.markdown": "\nRenvoie une valeur numérique par défaut lorsque la valeur est nulle.\n\nExemple : Renvoie -1 lorsqu'un champ ne contient aucune donnée.\n`defaults(average(bytes), -1)`\n", + "lensFormulaDocs.tinymath.defaultValue": "par défaut", + "lensFormulaDocs.tinymath.divideFunction.markdown": "\nDivise le premier nombre par le deuxième.\nFonctionne également avec le symbole `/`.\n\nExemple : calculer la marge bénéficiaire\n`sum(profit) / sum(revenue)`\n\nExemple : `divide(sum(bytes), 2)`\n ", + "lensFormulaDocs.tinymath.eqFunction.markdown": "\nEffectue une comparaison d'égalité entre deux valeurs.\nÀ utiliser en tant que condition pour la fonction de comparaison `ifelse`.\nFonctionne également avec le symbole `==`.\n\nExemple : Renvoie \"true\" si la moyenne d'octets est égale à la quantité de mémoire moyenne.\n`average(bytes) == average(memory)`\n\nExemple : `eq(sum(bytes), 1000000)`\n ", + "lensFormulaDocs.tinymath.expFunction.markdown": "\nÉlève *e* à la puissance n.\n\nExemple : calculer la fonction exponentielle naturelle\n\n`exp(last_value(duration))`\n ", + "lensFormulaDocs.tinymath.fixFunction.markdown": "\nPour les valeurs positives, part du bas. Pour les valeurs négatives, part du haut.\n\nExemple : arrondir à zéro\n`fix(sum(profit))`\n ", + "lensFormulaDocs.tinymath.floorFunction.markdown": "\nArrondit à la valeur entière inférieure la plus proche.\n\nExemple : arrondir un prix au chiffre inférieur\n`floor(sum(price))`\n ", + "lensFormulaDocs.tinymath.gteFunction.markdown": "\nEffectue une comparaison de supériorité entre deux valeurs.\nÀ utiliser en tant que condition pour la fonction de comparaison `ifelse`.\nFonctionne également avec le symbole `>=`.\n\nExemple : Renvoie \"true\" si la moyenne d'octets est supérieure ou égale à la quantité moyenne de mémoire.\n`average(bytes) >= average(memory)`\n\nExemple : `gte(average(bytes), 1000)`\n ", + "lensFormulaDocs.tinymath.gtFunction.markdown": "\nEffectue une comparaison de supériorité entre deux valeurs.\nÀ utiliser en tant que condition pour la fonction de comparaison `ifelse`.\nFonctionne également avec le symbole `>`.\n\nExemple : Renvoie \"true\" si la moyenne d'octets est supérieure à la quantité moyenne de mémoire.\n`average(bytes) > average(memory)`\n\nExemple : `gt(average(bytes), 1000)`\n ", + "lensFormulaDocs.tinymath.ifElseFunction.markdown": "\nRenvoie une valeur selon si l'élément de condition est \"true\" ou \"false\".\n\nExemple : Revenus moyens par client, mais dans certains cas, l'ID du client n'est pas fourni, et le client est alors compté comme client supplémentaire.\n`sum(total)/(unique_count(customer_id) + ifelse( count() > count(kql='customer_id:*'), 1, 0))`\n ", + "lensFormulaDocs.tinymath.left": "gauche", + "lensFormulaDocs.tinymath.logFunction.markdown": "\nÉtablit un logarithme avec base optionnelle. La base naturelle *e* est utilisée par défaut.\n\nExemple : calculer le nombre de bits nécessaire au stockage de valeurs\n````\nlog(sum(bytes))\nlog(sum(bytes), 2)\n````\n ", + "lensFormulaDocs.tinymath.lteFunction.markdown": "\nEffectue une comparaison d'infériorité ou de supériorité entre deux valeurs.\nÀ utiliser en tant que condition pour la fonction de comparaison `ifelse`.\nFonctionne également avec le symbole `<=`.\n\nExemple : Renvoie \"true\" si la moyenne d'octets est inférieure ou égale à la quantité moyenne de mémoire.\n`average(bytes) <= average(memory)`\n\nExemple : `lte(average(bytes), 1000)`\n ", + "lensFormulaDocs.tinymath.ltFunction.markdown": "\nEffectue une comparaison d'infériorité entre deux valeurs.\nÀ utiliser en tant que condition pour la fonction de comparaison `ifelse`.\nFonctionne également avec le symbole `<`.\n\nExemple : Renvoie \"true\" si la moyenne d'octets est inférieure à la quantité moyenne de mémoire.\n`average(bytes) <= average(memory)`\n\nExemple : `lt(average(bytes), 1000)`\n ", + "lensFormulaDocs.tinymath.max": "max", + "lensFormulaDocs.tinymath.maxFunction.markdown": "\nTrouve la valeur maximale entre deux nombres.\n\nExemple : Trouver le maximum entre deux moyennes de champs\n`pick_max(average(bytes), average(memory))`\n ", + "lensFormulaDocs.tinymath.min": "min", + "lensFormulaDocs.tinymath.minFunction.markdown": "\nTrouve la valeur minimale entre deux nombres.\n\nExemple : Trouver le minimum entre deux moyennes de champs\n`pick_min(average(bytes), average(memory))`\n ", + "lensFormulaDocs.tinymath.modFunction.markdown": "\nÉtablit le reste après division de la fonction par un nombre.\n\nExemple : calculer les trois derniers chiffres d'une valeur\n`mod(sum(price), 1000)`\n ", + "lensFormulaDocs.tinymath.multiplyFunction.markdown": "\nMultiplie deux nombres.\nFonctionne également avec le symbole `*`.\n\nExemple : calculer le prix après application du taux d'imposition courant\n`sum(bytes) * last_value(tax_rate)`\n\nExemple : calculer le prix après application du taux d'imposition constant\n`multiply(sum(price), 1.2)`\n ", + "lensFormulaDocs.tinymath.powFunction.markdown": "\nÉlève la valeur à une puissance spécifique. Le deuxième argument est obligatoire.\n\nExemple : calculer le volume en fonction de la longueur du côté\n`pow(last_value(length), 3)`\n ", + "lensFormulaDocs.tinymath.right": "droite", + "lensFormulaDocs.tinymath.roundFunction.markdown": "\nArrondit à un nombre donné de décimales, 0 étant la valeur par défaut.\n\nExemples : arrondir au centième\n````\nround(sum(bytes))\nround(sum(bytes), 2)\n````\n ", + "lensFormulaDocs.tinymath.sqrtFunction.markdown": "\nÉtablit la racine carrée d'une valeur positive uniquement.\n\nExemple : calculer la longueur du côté en fonction de la surface\n`sqrt(last_value(area))`\n ", + "lensFormulaDocs.tinymath.squareFunction.markdown": "\nÉlève la valeur à la puissance 2.\n\nExemple : calculer l’aire en fonction de la longueur du côté\n`square(last_value(length))`\n ", + "lensFormulaDocs.tinymath.subtractFunction.markdown": "\nSoustrait le premier nombre du deuxième.\nFonctionne également avec le symbole `-`.\n\nExemple : calculer la plage d'un champ\n`subtract(max(bytes), min(bytes))`\n ", + "lensFormulaDocs.tinymath.value": "valeur", + "links.contentManagement.saveModalTitle": "Enregistrer le panneau {contentId} dans la bibliothèque", + "links.dashboardLink.description": "Accéder au tableau de bord", + "links.dashboardLink.displayName": "Dashboard", + "links.dashboardLink.editor.currentDashboardLabel": "Actuel", + "links.dashboardLink.editor.dashboardComboBoxPlaceholder": "Rechercher un tableau de bord", + "links.dashboardLink.editor.dashboardErrorLabel": "Erreur lors de la récupération du tableau de bord", + "links.dashboardLink.editor.dashboardPickerAriaLabel": "Choisir un tableau de bord de destination", + "links.dashboardLink.editor.loadingDashboardLabel": "Chargement...", + "links.dashboardLink.type": "Lien du tableau de bord", + "links.description": "Utiliser des liens pour accéder aux tableaux de bord et aux sites web couramment utilisés.", + "links.editor.addButtonLabel": "Ajouter un lien", + "links.editor.cancelButtonLabel": "Fermer", + "links.editor.deleteLinkTitle": "Supprimer le lien {label}", + "links.editor.editLinkTitle.hasLabel": "Modifier le lien {label}", + "links.editor.horizontalLayout": "Horizontal", + "links.editor.unableToSaveToastTitle": "Erreur lors de l'enregistrement du Panneau de liens", + "links.editor.updateButtonLabel": "Mettre à jour le lien", + "links.editor.verticalLayout": "Vertical", + "links.externalLink.description": "Accéder à l'URL", + "links.externalLink.displayName": "URL", + "links.externalLink.editor.disallowedUrlError": "Cette URL n'est pas autorisée par votre administrateur. Reportez-vous à la configuration \"externalUrl.policy\".", + "links.externalLink.editor.placeholder": "Saisir une URL externe", + "links.externalLink.editor.urlFormatError": "Format non valide. Exemple : {exampleUrl}", + "links.externalLink.type": "URL externe", + "links.linkEditor.goBackAriaLabel": "Retourner à l'éditeur de panneau.", + "links.linkEditor.linkDestinationLabel": "Choisir une destination", + "links.linkEditor.linkOptionsLabel": "Options", + "links.linkEditor.linkTextLabel": "Texte", + "links.linkEditor.linkTextPlaceholder": "Saisir le texte du lien", + "links.linkEditor.linkTypeFormLabel": "Atteindre", + "links.panelEditor.brokenDashboardLinkAriaLabel": "Lien du tableau de bord brisé", + "links.panelEditor.createFlyoutTitle": "Créer le panneau de liens", + "links.panelEditor.dragHandleAriaLabel": "Lier la poignée de glisser-déposer", + "links.panelEditor.editFlyoutTitle": "Modifier le panneau de liens", + "links.panelEditor.emptyLinksMessage": "Vous n'avez pas encore ajouté de liens.", + "links.panelEditor.emptyLinksTooltip": "Ajouter un ou plusieurs liens.", + "links.panelEditor.layoutSettingsLegend": "Choisissez comment afficher vos liens.", + "links.panelEditor.layoutSettingsTitle": "Couche", + "links.panelEditor.linksTitle": "Liens", + "links.panelEditor.saveButtonLabel": "Enregistrer", + "links.panelEditor.saveToLibrarySwitchLabel": "Enregistrer dans la bibliothèque", + "links.panelEditor.saveToLibrarySwitchTooltip": "Enregistrer ce panneau de liens dans la bibliothèque afin de pouvoir l'ajouter facilement à d'autres tableaux de bord.", + "links.panelEditor.titleInputLabel": "Titre", + "links.saveDuplicateRejectedDescription": "La confirmation d'enregistrement avec un doublon de titre a été rejetée.", + "links.visTypeAlias.title": "Liens", + "lists.exceptions.doesNotExistOperatorLabel": "n'existe pas", + "lists.exceptions.doesNotMatchOperatorLabel": "ne correspond pas à", + "lists.exceptions.existsOperatorLabel": "existe", + "lists.exceptions.isInListOperatorLabel": "est dans la liste", + "lists.exceptions.isNotInListOperatorLabel": "n'est pas dans la liste", + "lists.exceptions.isNotOneOfOperatorLabel": "n'est pas l'une des options suivantes", + "lists.exceptions.isNotOperatorLabel": "n'est pas", + "lists.exceptions.isOneOfOperatorLabel": "est l'une des options suivantes", + "lists.exceptions.isOperatorLabel": "est", + "lists.exceptions.matchesOperatorLabel": "correspond à", + "managedContentBadge.text": "Géré", + "management.breadcrumb": "Gestion de la Suite", + "management.landing.header": "Bienvenue dans Gestion de la Suite {version}", + "management.landing.subhead": "Gérez vos index, vues de données, objets enregistrés, paramètres Kibana et plus encore.", + "management.landing.text": "Vous trouverez une liste complète des applications dans le menu de gauche.", + "management.landing.withCardNavigation.accessTitle": "Accès", + "management.landing.withCardNavigation.alertsTitle": "Alertes et informations exploitables", + "management.landing.withCardNavigation.apiKeysDescription": "Autorisez l'accès par programme pour les données et les fonctionnalités de votre projet.", + "management.landing.withCardNavigation.connectorsDescription": "Configurez les connexions avec des systèmes tiers à utiliser pour les cas et les règles.", + "management.landing.withCardNavigation.contentTitle": "Contenu", + "management.landing.withCardNavigation.dataQualityDescription": "Recherchez et gérez les problèmes de qualité dans vos données de logs.", + "management.landing.withCardNavigation.dataTitle": "Données", + "management.landing.withCardNavigation.dataViewsDescription": "Créez et gérez les données Elasticsearch sélectionnées pour l'exploration.", + "management.landing.withCardNavigation.fileManagementDescription": "Accédez à tous les fichiers importés.", + "management.landing.withCardNavigation.indexmanagementDescription": "Configurez et assurez la maintenance de vos index Elasticsearch pour le stockage et la récupération des données.", + "management.landing.withCardNavigation.ingestDescription": "Gérez et visualisez le pipeline Logstash de traitement des événements depuis les entrées jusqu'aux sorties.", + "management.landing.withCardNavigation.ingestPipelinesDescription": "Supprimez des champs, extrayez des valeurs et réalisez des transformations de vos données.", + "management.landing.withCardNavigation.maintenanceWindowsDescription": "Supprimez les notifications de règles pour les périodes où il est prévu d'effectuer des maintenances, des mises à jour et d'autres tâches liées au système.", + "management.landing.withCardNavigation.mlDescription": "Identifiez, analysez et traitez vos données à l'aide de techniques perfectionnées d'analyses.", + "management.landing.withCardNavigation.objectsDescription": "Gérez les tableaux de bords, les visualisations, les cartes et les vues de données que vous avez enregistrés.", + "management.landing.withCardNavigation.otherTitle": "Autre", + "management.landing.withCardNavigation.pageDescription": "Gérez les données et les index, supervisez les règles et les connecteurs, organisez les objets et les fichiers enregistrés et créez des clés d'API dans un emplacement central.", + "management.landing.withCardNavigation.pageTitle": "Gestion", + "management.landing.withCardNavigation.reportingDescription": "Gérez les rapports CSV générés.", + "management.landing.withCardNavigation.rolesDescription": "Créez des rôles uniques pour ce projet et combinez l'ensemble exact de privilèges dont vos utilisateurs ont besoin.", + "management.landing.withCardNavigation.rulesDescription": "Définissez à quel moment générer des alertes et des notifications.", + "management.landing.withCardNavigation.settingsDescription": "Contrôlez les comportements des projets, tels que l'affichage des dates et le tri par défaut.", + "management.landing.withCardNavigation.tagsDescription": "Organisez, recherchez et filtrez vos objets enregistrés en fonction de critères spécifiques.", + "management.landing.withCardNavigation.transformDescription": "Organisez vos données ou copiez les derniers documents dans un index centré sur les entités.", + "management.nav.label": "Gestion", + "management.sections.dataTip": "Gérez les données et les sauvegardes de vos clusters.", + "management.sections.dataTitle": "Données", + "management.sections.ingestTip": "Gérez la manière dont les données sont transformées et chargées dans le cluster.", + "management.sections.ingestTitle": "Ingestion", + "management.sections.insightsAndAlertingTip": "Gérez le mode de détection des changements dans vos données.", + "management.sections.insightsAndAlertingTitle": "Alertes et informations exploitables", + "management.sections.kibanaTip": "Personnalisez Kibana et gérez les objets enregistrés.", + "management.sections.kibanaTitle": "Kibana", + "management.sections.section.tip": "Contrôlez l'accès aux fonctionnalités et aux données.", + "management.sections.section.title": "Sécurité", + "management.sections.stackTip": "Gérez votre licence et mettez la Suite à niveau.", + "management.sections.stackTitle": "Suite", + "management.settings.advancedSettingsLabel": "Paramètres avancés", + "management.settings.badge.readOnly.text": "Lecture seule", + "management.settings.badge.readOnly.tooltip": "Impossible d’enregistrer les paramètres avancés", + "management.settings.categoryNames.accessibilityLabel": "Accessibilité", + "management.settings.categoryNames.autocompleteLabel": "Saisie semi-automatique", + "management.settings.categoryNames.bannerLabel": "Bannière", + "management.settings.categoryNames.devToolsLabel": "Outils de développeur", + "management.settings.categoryNames.discoverLabel": "Discover", + "management.settings.categoryNames.enterpriseSearchLabel": "Enterprise Search", + "management.settings.categoryNames.generalLabel": "Général", + "management.settings.categoryNames.machineLearningLabel": "Machine Learning", + "management.settings.categoryNames.notificationsLabel": "Notifications", + "management.settings.categoryNames.observabilityLabel": "Observabilité", + "management.settings.categoryNames.presentationLabLabel": "Ateliers de présentation", + "management.settings.categoryNames.reportingLabel": "Reporting", + "management.settings.categoryNames.rollupsLabel": "Cumuls", + "management.settings.categoryNames.searchLabel": "Recherche", + "management.settings.categoryNames.securitySolutionLabel": "Solution de sécurité", + "management.settings.categoryNames.timelionLabel": "Timelion", + "management.settings.categoryNames.visualizationsLabel": "Visualisation", + "management.settings.categorySearchLabel": "Catégorie", + "management.settings.changeImageLinkText": "Modifier l'image", + "management.settings.customSettingTooltip": "Paramètre personnalisé", + "management.settings.defaultValueText": "Valeur par défaut : {value}", + "management.settings.emptyState.clearNoSearchResultText": "(effacer la recherche)", + "management.settings.emptyState.noSearchResultText": "Aucun paramètre trouvé pour {queryText}. {clearSearch}", + "management.settings.field.changeImageLinkAriaLabel": "Modifier {ariaLabel}", + "management.settings.field.codeEditorSyntaxErrorMessage": "Syntaxe JSON non valide", + "management.settings.field.customSettingAriaLabel": "Paramètre personnalisé", + "management.settings.field.deprecationClickAreaLabel": "Cliquez ici pour afficher la documentation de déclassement pour {name}.", + "management.settings.field.imageChangeErrorMessage": "Impossible d’enregistrer l'image", + "management.settings.field.invalidIconLabel": "Non valide", + "management.settings.field.resetToDefaultLinkAriaLabel": "Réinitialiser {ariaLabel} aux valeurs par défaut", + "management.settings.field.settingIsUnsaved": "Le paramètre n'est actuellement pas enregistré.", + "management.settings.field.unsavedIconLabel": "Non enregistré", + "management.settings.fieldCategory.clearSearchResultText": "(effacer la recherche)", + "management.settings.fieldCategory.searchResultText": "Les termes de la recherche masquent {settingsCount} paramètres {clearSearch}", + "management.settings.fieldInput.color.invalidMessage": "Fournir une valeur de couleur valide", + "management.settings.form.cancelButtonLabel": "Annuler les modifications", + "management.settings.form.countOfSettingsChanged": "{unsavedCount} {unsavedCount, plural, one {paramètre non enregistré} other {paramètres non enregistrés} }{hiddenCount, plural, =0 {masqué} other {, # masqués} }.", + "management.settings.form.requiresPageReloadToastButtonLabel": "Actualiser la page", + "management.settings.form.requiresPageReloadToastDescription": "Un ou plusieurs paramètres nécessitent d’actualiser la page pour pouvoir prendre effet.", + "management.settings.form.saveButtonLabel": "Enregistrer les modifications", + "management.settings.form.saveButtonTooltipWithInvalidChanges": "Corrigez les paramètres non valides avant d'enregistrer.", + "management.settings.form.saveErrorMessage": "Enregistrement impossible", + "management.settings.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.", + "management.settings.globalCalloutTitle": "Les modifications auront une incidence sur tous les paramètres utilisateur dans l'ensemble des espaces", + "management.settings.globalSettingsTabTitle": "Paramètres généraux", + "management.settings.helpText": "Ce paramètre est défini par le serveur Kibana et ne peut pas être modifié.", + "management.settings.offLabel": "Désactivé", + "management.settings.onLabel": "Activé", + "management.settings.resetToDefaultLinkText": "Réinitialiser à la valeur par défaut", + "management.settings.searchBar.unableToParseQueryErrorMessage": "Impossible d'analyser la requête", + "management.settings.searchBarPlaceholder": "Rechercher dans les paramètres avancés", + "management.settings.spaceCalloutSubtitle": "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.", + "management.settings.spaceCalloutTitle": "Les modifications affecteront l'espace actuel.", + "management.settings.spaceSettingsTabTitle": "Paramètres de l'espace", + "monaco.esql.hover.policyEnrichedFields": "**Champs**", + "monaco.esql.hover.policyIndexes": "**Indexes**", + "monaco.esql.hover.policyMatchingField": "**Champ correspondant**", + "monaco.painlessLanguage.autocomplete.docKeywordDescription": "Accéder à une valeur de champ dans un script au moyen de la syntaxe doc['field_name']", + "monaco.painlessLanguage.autocomplete.emitKeywordDescription": "Émettre une valeur sans rien renvoyer", + "monaco.painlessLanguage.autocomplete.fieldValueDescription": "Récupérer la valeur du champ \"{fieldName}\"", + "monaco.painlessLanguage.autocomplete.paramsKeywordDescription": "Accéder aux variables transmises dans le script", + "newsfeed.emptyPrompt.noNewsText": "Si votre instance Kibana n'a pas accès à Internet, demandez à votre administrateur de désactiver cette fonctionnalité. Sinon, nous continuerons d'essayer de récupérer les actualités.", + "newsfeed.emptyPrompt.noNewsTitle": "Pas d'actualités ?", + "newsfeed.flyoutList.closeButtonLabel": "Fermer", + "newsfeed.flyoutList.versionTextLabel": "{version}", + "newsfeed.flyoutList.whatsNewTitle": "Nouveautés Elastic", + "newsfeed.headerButton.readAriaLabel": "Menu du fil d'actualités – Tous les éléments lus", + "newsfeed.headerButton.unreadAriaLabel": "Menu du fil d'actualités – Éléments non lus disponibles", + "newsfeed.loadingPrompt.gettingNewsText": "Obtention des dernières actualités…", + "observabilityAlertDetails.alertActiveTimeRangeAnnotation.detailsTooltip": "Actif", + "observabilityAlertDetails.alertAnnotation.detailsTooltip": "Alerte démarrée", + "observabilityAlertDetails.alertThresholdAnnotation.detailsTooltip": "Alerte démarrée", + "observabilityAlertDetails.alertThresholdTimeRangeRect.detailsTooltip": "Seuil", + "presentationPanel.action.customizePanel.displayName": "Paramètres", + "presentationPanel.action.customizePanel.flyout.cancelButtonTitle": "Annuler", + "presentationPanel.action.customizePanel.flyout.optionsMenuForm.editFiltersButtonAriaLabel": "Modifier les filtres", + "presentationPanel.action.customizePanel.flyout.optionsMenuForm.editFiltersButtonLabel": "Modifier", + "presentationPanel.action.customizePanel.flyout.optionsMenuForm.editQueryButtonAriaLabel": "Modifier la recherche", + "presentationPanel.action.customizePanel.flyout.optionsMenuForm.editQueryButtonLabel": "Modifier", + "presentationPanel.action.customizePanel.flyout.optionsMenuForm.panelDescriptionAriaLabel": "Entrer une description personnalisée pour votre panneau", + "presentationPanel.action.customizePanel.flyout.optionsMenuForm.panelDescriptionFormRowLabel": "Description", + "presentationPanel.action.customizePanel.flyout.optionsMenuForm.panelTimeRangeFormRowLabel": "Plage temporelle", + "presentationPanel.action.customizePanel.flyout.optionsMenuForm.panelTitleFormRowLabel": "Titre", + "presentationPanel.action.customizePanel.flyout.optionsMenuForm.panelTitleInputAriaLabel": "Entrez un titre personnalisé pour le panneau.", + "presentationPanel.action.customizePanel.flyout.optionsMenuForm.resetCustomDescriptionButtonAriaLabel": "Réinitialiser la description à sa valeur par défaut", + "presentationPanel.action.customizePanel.flyout.optionsMenuForm.resetCustomTitleButtonAriaLabel": "Réinitialiser le titre à sa valeur par défaut", + "presentationPanel.action.customizePanel.flyout.optionsMenuForm.resetCustomTitleButtonLabel": "Réinitialiser à la valeur par défaut", + "presentationPanel.action.customizePanel.flyout.optionsMenuForm.showCustomTimeRangeSwitch": "Appliquer une plage temporelle personnalisée", + "presentationPanel.action.customizePanel.flyout.optionsMenuForm.showTitle": "Afficher le titre", + "presentationPanel.action.customizePanel.flyout.saveButtonTitle": "Appliquer", + "presentationPanel.action.customizePanel.flyout.title": "Paramètres", + "presentationPanel.action.customizePanel.modal.optionsMenuForm.resetCustomDescriptionButtonLabel": "Réinitialiser à la valeur par défaut", + "presentationPanel.action.editPanel.displayName": "Modifier {value}", + "presentationPanel.action.inspectPanel.displayName": "Inspecter", + "presentationPanel.action.inspectPanel.untitledEmbeddableFilename": "[Aucun titre]", + "presentationPanel.action.removePanel.displayName": "Supprimer", + "presentationPanel.ariaLabel": "Panneau", + "presentationPanel.badgeTrigger.description": "Des actions de badge apparaissent dans la barre de titre lorsqu'un élément incorporable est en cours de chargement dans un panneau.", + "presentationPanel.badgeTrigger.title": "Badges du panneau", + "presentationPanel.contextMenu.ariaLabel": "Options de panneau", + "presentationPanel.contextMenu.ariaLabelWithIndex": "Options pour le panneau {index}", + "presentationPanel.contextMenu.ariaLabelWithTitle": "Options de panneau pour {title}", + "presentationPanel.contextMenu.loadingTitle": "Options", + "presentationPanel.contextMenuTrigger.description": "Une nouvelle action sera ajoutée au menu contextuel du panneau", + "presentationPanel.contextMenuTrigger.title": "Menu contextuel", + "presentationPanel.emptyErrorMessage": "Erreur", + "presentationPanel.enhancedAriaLabel": "Panneau : {title}", + "presentationPanel.error.editButton": "Modifier {value}", + "presentationPanel.error.errorWhenLoadingPanel": "Une erreur s'est produite lors du chargement de ce panneau.", + "presentationPanel.filters.filtersTitle": "Filtres", + "presentationPanel.filters.queryTitle": "Recherche", + "presentationPanel.header.titleAriaLabel": "Cliquez pour modifier le titre : {title}", + "presentationPanel.hoverTrigger.description": "Une nouvelle action sera ajoutée au menu flottant du panneau", + "presentationPanel.hoverTrigger.title": "Menu contextuel du panneau", + "presentationPanel.notificationTrigger.description": "Les actions de notification apparaissent dans l'angle supérieur droit des panneaux.", + "presentationPanel.notificationTrigger.title": "Notifications du panneau", + "presentationPanel.placeholderTitle": "[Aucun titre]", + "presentationUtil.dashboardDrilldownConfig.components.openInNewTab": "Ouvrir le tableau de bord dans un nouvel onglet", + "presentationUtil.dashboardDrilldownConfig.components.useCurrentDateRange": "Utiliser la plage de dates du tableau de bord d'origine", + "presentationUtil.dashboardDrilldownConfig.components.useCurrentFiltersLabel": "Utiliser les filtres et la requête du tableau de bord d'origine", + "presentationUtil.dashboardPicker.noDashboardOptionLabel": "Sélectionner le tableau de bord", + "presentationUtil.dashboardPicker.searchDashboardPlaceholder": "Recherche dans les tableaux de bord…", + "presentationUtil.expressionInput.argReferenceAliasesDetail": "{BOLD_MD_TOKEN}Alias{BOLD_MD_TOKEN} : {aliases}", + "presentationUtil.expressionInput.argReferenceDefaultDetail": "{BOLD_MD_TOKEN}Par défaut{BOLD_MD_TOKEN} : {defaultVal}", + "presentationUtil.expressionInput.argReferenceRequiredDetail": "{BOLD_MD_TOKEN}Requis{BOLD_MD_TOKEN} : {required}", + "presentationUtil.expressionInput.argReferenceTypesDetail": "{BOLD_MD_TOKEN}Types{BOLD_MD_TOKEN} : {types}", + "presentationUtil.expressionInput.functionReferenceAccepts": "{BOLD_MD_TOKEN}Accepte{BOLD_MD_TOKEN} : {acceptTypes}", + "presentationUtil.expressionInput.functionReferenceReturns": "{BOLD_MD_TOKEN}Renvoie{BOLD_MD_TOKEN} : {returnType}", + "presentationUtil.fieldPicker.noFieldsLabel": "Aucun champ correspondant", + "presentationUtil.fieldPicker.selectableAriaLabel": "Sélectionner un champ", + "presentationUtil.fieldSearch.fieldFilterButtonLabel": "Filtrer par type", + "presentationUtil.fieldSearch.searchPlaceHolder": "Rechercher les noms de champs", + "presentationUtil.labs.components.browserSwitchHelp": "Active l'atelier pour ce navigateur et persiste après sa fermeture.", + "presentationUtil.labs.components.browserSwitchName": "Navigateur", + "presentationUtil.labs.components.calloutHelp": "Actualiser pour appliquer les modifications", + "presentationUtil.labs.components.closeButtonLabel": "Fermer", + "presentationUtil.labs.components.descriptionMessage": "Essayez des fonctionnalités en cours ou en version d'évaluation technique.", + "presentationUtil.labs.components.disabledStatusMessage": "Par défaut : {status}", + "presentationUtil.labs.components.enabledStatusMessage": "Par défaut : {status}", + "presentationUtil.labs.components.kibanaSwitchHelp": "Active cet atelier pour tous les utilisateurs Kibana.", + "presentationUtil.labs.components.kibanaSwitchName": "Kibana", + "presentationUtil.labs.components.labFlagsLabel": "Indicateurs d'atelier", + "presentationUtil.labs.components.noProjectsinSolutionMessage": "Aucun atelier actuellement dans {solutionName}.", + "presentationUtil.labs.components.noProjectsMessage": "Aucun atelier actuellement disponible.", + "presentationUtil.labs.components.overrideFlagsLabel": "Remplacements", + "presentationUtil.labs.components.overridenIconTipLabel": "Valeur par défaut remplacée", + "presentationUtil.labs.components.resetToDefaultLabel": "Réinitialiser aux valeurs par défaut", + "presentationUtil.labs.components.sessionSwitchHelp": "Active l’atelier pour cette session de navigateur afin de le réinitialiser lors de sa fermeture.", + "presentationUtil.labs.components.sessionSwitchName": "Session", + "presentationUtil.labs.components.titleLabel": "Ateliers", + "presentationUtil.labs.enableByValueEmbeddableDescription": "Active la prise en charge pour les éléments d'incorporation by-value dans Canvas", + "presentationUtil.labs.enableByValueEmbeddableName": "Éléments d'incorporation By-Value", + "presentationUtil.labs.enableDeferBelowFoldProjectDescription": "Les panneaux sous \"le pli\" (la zone masquée en dessous de la fenêtre accessible en faisant défiler), ne se chargeront pas immédiatement, mais seulement lorsqu'ils entreront dans la fenêtre d'affichage.", + "presentationUtil.labs.enableDeferBelowFoldProjectName": "Différer le chargement des panneaux sous \"le pli\"", + "presentationUtil.saveModalDashboard.addToDashboardLabel": "Ajouter au tableau de bord", + "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.existingDashboardRequiredMessage": "Le tableau de bord est requis", + "presentationUtil.saveModalDashboard.libraryOptionLabel": "Ajouter à la bibliothèque", + "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", + "randomSampling.ui.sliderControl.accuracyLabel": "Précision", + "randomSampling.ui.sliderControl.performanceLabel": "Performances", + "reactPackages.mountPointPortal.errorMessage": "Erreur lors du rendu du contenu du portail.", + "reporting.apiClient.unknownError": "La tâche de reporting {job} a échoué. Erreur inconnue.", + "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.", + "reporting.commonExportTypesHelpers.failedToDecryptReportJobDataErrorMessage": "Impossible de déchiffrer les données de la tâche de reporting. Veuillez vous assurer que {encryptionKey} est défini et générez à nouveau ce rapport. {err}", + "reporting.commonExportTypesHelpers.missingJobHeadersErrorMessage": "Les en-têtes de tâche sont manquants", + "reporting.jobCreatedBy.unknownUserPlaceholderText": "Inconnu", + "reporting.jobStatusDetail.attemptXofY": "Tentative {attempts} sur {max_attempts}.", + "reporting.jobStatusDetail.deprecatedText": "Il s'agit d'un type d'exportation déclassé. L'automatisation de ce rapport devra être à nouveau créée pour une question de compatibilité avec les futures versions de Kibana.", + "reporting.jobStatusDetail.errorText": "Consultez les informations de rapport pour plus de détails sur l'erreur.", + "reporting.jobStatusDetail.pendingStatusReachedText": "En attente du traitement de la tâche.", + "reporting.jobStatusDetail.timeoutSeconds": "{timeout} secondes", + "reporting.jobStatusDetail.timeoutSecondsUnknown": "Inconnu", + "reporting.jobStatusDetail.unknownText": "Inconnu", + "reporting.jobStatusDetail.warningsText": "Consultez les informations de rapport pour plus de détails sur les avertissements.", + "reporting.jobStatuses.completedText": "Terminé", + "reporting.jobStatuses.failedText": "Échoué", + "reporting.jobStatuses.pendingText": "En attente", + "reporting.jobStatuses.processingText": "Traitement", + "reporting.jobStatuses.warningText": "Terminé", + "reporting.jobType.csvOutputName": "CSV", + "reporting.jobType.pdfOutputName": "PDF", + "reporting.jobType.pngOutputName": "PNG", + "reporting.jobWarning.csvContainsFormulas": "Votre fichier CSV contient des caractères que les applications de feuilles de calcul pourraient considérer comme des formules.", + "reporting.jobWarning.exportTypeDeprecated": "Il s'agit d'un type d'exportation déclassé. L'automatisation de ce rapport devra être à nouveau créée pour une question de compatibilité avec les futures versions de Kibana.", + "reporting.jobWarning.maxSizeReachedTooltip": "Votre recherche a atteint la taille maximale et contient des données partielles.", + "reporting.pngV2.generateButtonLabel": "Exporter un fichier", + "reporting.pngV2.helpText": "Sélectionnez le type de fichier que vous souhaitez exporter pour cette visualisation.", + "reporting.printablePdfV2.generateButtonLabel": "Exporter un fichier", + "reporting.printablePdfV2.helpText": "Sélectionnez le type de fichier que vous souhaitez exporter pour cette visualisation.", + "reporting.share.contextMenu.export.csvReportsButtonLabel": "Exporter", + "reporting.share.contextMenu.pdfReportsButtonLabel": "Rapports PDF", + "reporting.share.contextMenu.pngReportsButtonLabel": "Rapports PNG", + "reporting.share.csv.reporting.helpTextCSV": "Exporter un fichier CSV à partir de ce {objectType}.", + "reporting.share.generateButtonLabelCSV": "Générer un CSV", + "reporting.share.modalContent.notification.reportingErrorTitle": "Impossible de créer le rapport", + "reporting.share.modalContent.successfullyQueuedReportNotificationDescription": "Suivre sa progression dans {path}", + "reporting.share.modalContent.successfullyQueuedReportNotificationTitle": "Rapport mis en file d'attente pour {objectType}", + "reporting.share.panelAction.csvDownloadStartedMessage": "Votre CSV sera téléchargé dans un instant.", + "reporting.share.panelAction.csvDownloadStartedTitle": "Téléchargement du CSV démarré", + "reporting.share.panelAction.csvReportStartedTitle": "Rapport mis en file d'attente pour CSV", + "reporting.share.panelAction.downloadCsvPanelTitle": "Télécharger CSV", + "reporting.share.panelAction.failedCsvReportMessage": "Nous n'avons pas pu télécharger votre CSV pour le moment.", + "reporting.share.panelAction.failedCsvReportTitle": "Le téléchargement du CSV a échoué", + "reporting.share.panelAction.failedGenerateCsvReportMessage": "Nous n'avons pas pu générer votre CSV pour le moment.", + "reporting.share.panelAction.failedGenerateCsvReportTitle": "Échec du rapport CSV", + "reporting.share.panelAction.generateCsvPanelTitle": "Générer des rapports CSV", + "reporting.share.panelAction.reportLink.reportingSectionUrlLinkLabel": "Gestion de la Suite > Reporting", + "reporting.share.panelAction.successfullyQueuedReportNotificationDescription": "Suivre sa progression dans {path}", + "reporting.share.panelContent.advancedOptions": "Options avancées", + "reporting.share.panelContent.copyUrlButtonLabel": "Copier l'URL POST", + "reporting.share.panelContent.generateButtonLabel": "Générer {reportingType}", + "reporting.share.panelContent.generationTimeDescription": "La génération des {reportingType}s peut prendre une ou deux minutes en fonction de la taille de votre {objectType}.", + "reporting.share.panelContent.howToCallGenerationDescription": "Sinon, copiez cette URL POST pour appeler la génération depuis l'extérieur de Kibana ou à partir de Watcher.", + "reporting.share.panelContent.notification.reportingErrorTitle": "Impossible de créer le rapport", + "reporting.share.panelContent.notification.reportingErrorToastMessage": "Nous n'avons pas pu créer de rapport pour le moment.", + "reporting.share.panelContent.saveWorkDescription": "Veuillez enregistrer votre travail avant de générer un rapport.", + "reporting.share.panelContent.successfullyQueuedReportNotificationDescription": "Suivre sa progression dans {path}", + "reporting.share.panelContent.successfullyQueuedReportNotificationTitle": "Rapport mis en file d'attente pour {objectType}", + "reporting.share.panelContent.unsavedStateAndExceedsMaxLengthDescription": "Impossible de copier cette URL.", + "reporting.share.panelContent.unsavedStateAndExceedsMaxLengthTitle": "URL trop longue", + "reporting.share.panelContent.unsavedStateAndExceedsMaxLengthTrySaveDescription": "Impossible de copier cette URL. Essayez d'enregistrer votre travail.", + "reporting.share.panelContent.unsavedStateErrorText": "Enregistrez votre travail avant de copier cette URL.", + "reporting.share.panelContent.unsavedStateErrorTitle": "Travail non enregistré", + "reporting.share.publicNotifier.reportLink.reportingSectionUrlLinkLabel": "Gestion de la Suite > Reporting", + "reporting.share.screenCapturePanelContent.canvasLayoutHelpText": "Supprimer les bordures et le logo de pied de page", + "reporting.share.screenCapturePanelContent.canvasLayoutLabel": "Mise en page complète", + "reporting.share.screenCapturePanelContent.optimizeForPrintingHelpText": "Utilise plusieurs pages, affichant au maximum 2 visualisations par page", + "reporting.share.screenCapturePanelContent.optimizeForPrintingLabel": "Optimiser pour l'impression", + "reporting.shareContextMenu.ExportsButtonLabel": "PDF", + "reporting.shareContextMenu.ExportsButtonLabelPNG": "Export PNG", + "savedObjects.confirmModal.cancelButtonLabel": "Annuler", + "savedObjects.confirmModal.overwriteButtonLabel": "Écraser", + "savedObjects.confirmModal.overwriteConfirmationMessage": "Êtes-vous sûr de vouloir écraser {title} ?", + "savedObjects.confirmModal.overwriteTitle": "Écraser {name} ?", + "savedObjects.confirmModal.saveDuplicateButtonLabel": "Enregistrer {name}", + "savedObjects.confirmModal.saveDuplicateConfirmationMessage": "Il y a déjà une occurrence de {name} avec le titre \"{title}\". Voulez-vous tout de même enregistrer ?", + "savedObjects.overwriteRejectedDescription": "La confirmation d'écrasement a été rejetée.", + "savedObjects.saveDuplicateRejectedDescription": "La confirmation d'enregistrement avec un doublon de titre a été rejetée.", + "savedObjects.saveModal.cancelButtonLabel": "Annuler", + "savedObjects.saveModal.descriptionLabel": "Description", + "savedObjects.saveModal.duplicateTitleDescription": "L'enregistrement de \"{title}\" crée un doublon de titre.", + "savedObjects.saveModal.duplicateTitleLabel": "Ce {objectType} existe déjà.", + "savedObjects.saveModal.optional": "Facultatif", + "savedObjects.saveModal.saveAsNewLabel": "Enregistrer en tant que nouveau {objectType}", + "savedObjects.saveModal.saveButtonLabel": "Enregistrer", + "savedObjects.saveModal.saveTitle": "Enregistrer {objectType}", + "savedObjects.saveModal.titleLabel": "Titre", + "savedObjects.saveModal.titleRequired": "Un titre est requis", + "savedObjects.saveModalOrigin.addToOriginLabel": "Ajouter", + "savedObjects.saveModalOrigin.originAfterSavingSwitchLabel": "{originVerb} à {origin} après l'enregistrement", + "savedObjects.saveModalOrigin.returnToOriginLabel": "Renvoyer", + "savedObjects.saveModalOrigin.saveAndReturnLabel": "Enregistrer et revenir", + "savedObjectsFinder.advancedSettings.listingLimitText": "Nombre d'objets à récupérer pour les pages de listing", + "savedObjectsFinder.advancedSettings.listingLimitTitle": "Limite de listing d’objets", + "savedObjectsFinder.advancedSettings.perPageText": "Nombre d'objets à afficher par page dans la boîte de dialogue de chargement", + "savedObjectsFinder.advancedSettings.perPageTitle": "Objets par page", + "savedObjectsFinder.filterButtonLabel": "Types", + "savedObjectsFinder.titleDescription": "Titre de l'objet enregistré", + "savedObjectsFinder.titleName": "Titre", + "savedObjectsFinder.typeDescription": "Type de l'objet enregistré", + "savedObjectsFinder.typeName": "Type", + "savedObjectsManagement.breadcrumb.index": "Objets enregistrés", + "savedObjectsManagement.breadcrumb.inspect": "Inspecter {savedObjectType}", + "savedObjectsManagement.copyToSpace.actionDescription": "Effectuer une copie de cet objet enregistré dans un ou plusieurs espaces", + "savedObjectsManagement.copyToSpace.actionTitle": "Copier vers les espaces", + "savedObjectsManagement.deleteConfirm.modalDeleteButtonLabel": "Supprimer", + "savedObjectsManagement.deleteConfirm.modalDescription": "Cette action supprime définitivement l'objet de Kibana.", + "savedObjectsManagement.deleteConfirm.modalTitle": "Supprimer \"{title}\" ?", + "savedObjectsManagement.deleteSavedObjectsConfirmModalDescription": "Cette action supprimera les objets enregistrés suivants :", + "savedObjectsManagement.importSummary.createdCountHeader": "{createdCount} nouveau(x)", + "savedObjectsManagement.importSummary.createdOutcomeLabel": "Créé", + "savedObjectsManagement.importSummary.errorCountHeader": "{errorCount} erreur(s)", + "savedObjectsManagement.importSummary.errorOutcomeLabel": "{errorMessage}", + "savedObjectsManagement.importSummary.headerLabel": "{importCount, plural, one {1 objet importé} other {# objets importés}}", + "savedObjectsManagement.importSummary.overwrittenCountHeader": "{overwrittenCount} écrasé(s)", + "savedObjectsManagement.importSummary.overwrittenOutcomeLabel": "Écrasé", + "savedObjectsManagement.importSummary.warnings.defaultButtonLabel": "Go", + "savedObjectsManagement.managementSectionLabel": "Objets enregistrés", + "savedObjectsManagement.objects.savedObjectsDescription": "Importez, exportez et gérez vos objets enregistrés.", + "savedObjectsManagement.objects.savedObjectsTitle": "Objets enregistrés", + "savedObjectsManagement.objectsTable.deleteConfirmModal.cannotDeleteCallout.content": "{objectCount, plural, one {# objet est} other {# objets sont}} masqués et ne peuvent être supprimés.", + "savedObjectsManagement.objectsTable.deleteConfirmModal.cannotDeleteCallout.title": "Certains objets ont été exclus", + "savedObjectsManagement.objectsTable.deleteConfirmModal.sharedObjectsCallout.content": "Les objets partagés sont supprimés de tous les espaces dans lesquels ils se trouvent.", + "savedObjectsManagement.objectsTable.deleteConfirmModal.sharedObjectsCallout.title": "{sharedObjectsCount, plural, one {# objet enregistré est partagé} other {# de vos objets enregistrés sont partagés}}.", + "savedObjectsManagement.objectsTable.deleteSavedObjectsConfirmModal.cancelButtonLabel": "Annuler", + "savedObjectsManagement.objectsTable.deleteSavedObjectsConfirmModal.deleteButtonLabel": "Supprimer {objectsCount, plural, one {# objet} other {# objets}}", + "savedObjectsManagement.objectsTable.deleteSavedObjectsConfirmModal.idColumnName": "ID", + "savedObjectsManagement.objectsTable.deleteSavedObjectsConfirmModal.titleColumnName": "Titre", + "savedObjectsManagement.objectsTable.deleteSavedObjectsConfirmModal.typeColumnName": "Type", + "savedObjectsManagement.objectsTable.deleteSavedObjectsConfirmModalTitle": "Supprimer les objets enregistrés", + "savedObjectsManagement.objectsTable.export.successNotification": "Votre fichier est en cours de téléchargement en arrière-plan.", + "savedObjectsManagement.objectsTable.export.successWithExcludedObjectsNotification": "Votre fichier est en cours de téléchargement en arrière-plan. Certains objets ont été exclus de l'export. Vous trouverez la liste des objets exclus à la dernière ligne du fichier exporté.", + "savedObjectsManagement.objectsTable.export.successWithMissingRefsNotification": "Votre fichier est en cours de téléchargement en arrière-plan. Certains objets associés sont introuvables. Vous trouverez la liste des objets manquants à la dernière ligne du fichier exporté.", + "savedObjectsManagement.objectsTable.export.toastErrorMessage": "Impossible de générer l'export : {error}", + "savedObjectsManagement.objectsTable.exportObjectsConfirmModal.cancelButtonLabel": "Annuler", + "savedObjectsManagement.objectsTable.exportObjectsConfirmModal.exportAllButtonLabel": "Exporter tout", + "savedObjectsManagement.objectsTable.exportObjectsConfirmModal.exportOptionsLabel": "Options", + "savedObjectsManagement.objectsTable.exportObjectsConfirmModal.includeReferencesDeepLabel": "Inclure les objets associés", + "savedObjectsManagement.objectsTable.exportObjectsConfirmModalDescription": "Sélectionner les types d'objet à exporter", + "savedObjectsManagement.objectsTable.exportObjectsConfirmModalTitle": "Exporter {filteredItemCount, plural, one {# objet} other {# objets}}", + "savedObjectsManagement.objectsTable.flyout.errorCalloutTitle": "Désolé, une erreur est survenue.", + "savedObjectsManagement.objectsTable.flyout.import.cancelButtonLabel": "Annuler", + "savedObjectsManagement.objectsTable.flyout.import.confirmButtonLabel": "Importer", + "savedObjectsManagement.objectsTable.flyout.importFileErrorMessage": "Impossible de traiter le fichier en raison d'une erreur : \"{error}\".", + "savedObjectsManagement.objectsTable.flyout.importPromptText": "Importer", + "savedObjectsManagement.objectsTable.flyout.importSavedObjectTitle": "Importer les objets enregistrés", + "savedObjectsManagement.objectsTable.flyout.importSuccessful.confirmAllChangesButtonLabel": "Confirmer toutes les modifications", + "savedObjectsManagement.objectsTable.flyout.importSuccessful.confirmButtonLabel": "Terminé", + "savedObjectsManagement.objectsTable.flyout.indexPatternConflictsCalloutLinkText": "créer une nouvelle vue de données", + "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.flyout.indexPatternConflictsTitle": "Conflits de vues de données", + "savedObjectsManagement.objectsTable.flyout.renderConflicts.columnCountDescription": "Nombre d'objets concernés", + "savedObjectsManagement.objectsTable.flyout.renderConflicts.columnCountName": "Décompte", + "savedObjectsManagement.objectsTable.flyout.renderConflicts.columnIdDescription": "ID de la vue de données", + "savedObjectsManagement.objectsTable.flyout.renderConflicts.columnIdName": "ID", + "savedObjectsManagement.objectsTable.flyout.renderConflicts.columnNewIndexPatternName": "Nouvelle vue de données", + "savedObjectsManagement.objectsTable.flyout.renderConflicts.columnSampleOfAffectedObjectsDescription": "Exemple d'objets concernés", + "savedObjectsManagement.objectsTable.flyout.renderConflicts.columnSampleOfAffectedObjectsName": "Exemple d'objets concernés", + "savedObjectsManagement.objectsTable.flyout.selectFileToImportFormRowLabel": "Sélectionner un fichier à importer", + "savedObjectsManagement.objectsTable.header.exportButtonLabel": "Exporter {filteredCount, plural, one{# objet} other {# objets}}", + "savedObjectsManagement.objectsTable.header.importButtonLabel": "Importer", + "savedObjectsManagement.objectsTable.header.refreshButtonLabel": "Actualiser", + "savedObjectsManagement.objectsTable.header.savedObjectsTitle": "Objets enregistrés", + "savedObjectsManagement.objectsTable.howToDeleteSavedObjectsDescription": "Gérez et partagez vos objets enregistrés. Pour modifier les données sous-jacentes d'un objet, accédez à l’application associée.", + "savedObjectsManagement.objectsTable.importModeControl.createNewCopies.disabledText": "Vérifiez si les objets ont déjà été copiés ou importés.", + "savedObjectsManagement.objectsTable.importModeControl.createNewCopies.disabledTitle": "Rechercher les objets existants", + "savedObjectsManagement.objectsTable.importModeControl.createNewCopies.enabledText": "Utilisez cette option pour créer une ou plusieurs copies de l'objet.", + "savedObjectsManagement.objectsTable.importModeControl.createNewCopies.enabledTitle": "Créer de nouveaux objets avec des ID aléatoires", + "savedObjectsManagement.objectsTable.importModeControl.importOptionsTitle": "Options d'importation", + "savedObjectsManagement.objectsTable.importModeControl.overwrite.disabledLabel": "Demander une action en cas de conflit", + "savedObjectsManagement.objectsTable.importModeControl.overwrite.enabledLabel": "Écraser automatiquement les conflits", + "savedObjectsManagement.objectsTable.importSummary.unsupportedTypeError": "Type d'objet non pris en charge", + "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.cancelButtonText": "Ignorer", + "savedObjectsManagement.objectsTable.overwriteModal.overwriteButtonText": "Écraser", + "savedObjectsManagement.objectsTable.overwriteModal.selectControlLabel": "ID d'objet", + "savedObjectsManagement.objectsTable.overwriteModal.title": "Écraser {type} ?", + "savedObjectsManagement.objectsTable.relationships.columnActions.inspectActionDescription": "Inspecter cet objet enregistré", + "savedObjectsManagement.objectsTable.relationships.columnActions.inspectActionName": "Inspecter", + "savedObjectsManagement.objectsTable.relationships.columnActionsName": "Actions", + "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.columnRelationship.childAsValue": "Enfant", + "savedObjectsManagement.objectsTable.relationships.columnRelationship.parentAsValue": "Parent", + "savedObjectsManagement.objectsTable.relationships.columnRelationshipName": "Relation directe", + "savedObjectsManagement.objectsTable.relationships.columnTitleDescription": "Titre de l'objet enregistré", + "savedObjectsManagement.objectsTable.relationships.columnTitleName": "Titre", + "savedObjectsManagement.objectsTable.relationships.columnTypeDescription": "Type de l'objet enregistré", + "savedObjectsManagement.objectsTable.relationships.columnTypeName": "Type", + "savedObjectsManagement.objectsTable.relationships.invalidRelationShip": "Cet objet enregistré présente des relations non valides.", + "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.relationships.renderErrorMessage": "Erreur", + "savedObjectsManagement.objectsTable.relationships.search.filters.relationship.childAsValue.view": "Enfant", + "savedObjectsManagement.objectsTable.relationships.search.filters.relationship.name": "Relation directe", + "savedObjectsManagement.objectsTable.relationships.search.filters.relationship.parentAsValue.view": "Parent", + "savedObjectsManagement.objectsTable.relationships.search.filters.type.name": "Type", + "savedObjectsManagement.objectsTable.searchBar.unableToParseQueryErrorMessage": "Impossible d'analyser la requête", + "savedObjectsManagement.objectsTable.table.columnActions.inspectActionDescription": "Inspecter cet objet enregistré", + "savedObjectsManagement.objectsTable.table.columnActions.inspectActionName": "Inspecter", + "savedObjectsManagement.objectsTable.table.columnActions.viewRelationshipsActionDescription": "Afficher les relations entre cet objet enregistré et d'autres objets enregistrés", + "savedObjectsManagement.objectsTable.table.columnActions.viewRelationshipsActionName": "Relations", + "savedObjectsManagement.objectsTable.table.columnActionsName": "Actions", + "savedObjectsManagement.objectsTable.table.columnTitleDescription": "Titre de l'objet enregistré", + "savedObjectsManagement.objectsTable.table.columnTitleName": "Titre", + "savedObjectsManagement.objectsTable.table.columnTypeDescription": "Type de l'objet enregistré", + "savedObjectsManagement.objectsTable.table.columnTypeName": "Type", + "savedObjectsManagement.objectsTable.table.deleteButtonLabel": "Supprimer", + "savedObjectsManagement.objectsTable.table.deleteButtonTitle": "Impossible de supprimer les objets enregistrés", + "savedObjectsManagement.objectsTable.table.deleteDisabledTooltip": "Les objets sélectionnés ne peuvent pas être supprimés, car il s'agit d'objets cachés.", + "savedObjectsManagement.objectsTable.table.exportButtonLabel": "Exporter", + "savedObjectsManagement.objectsTable.table.exportPopoverButtonLabel": "Exporter", + "savedObjectsManagement.objectsTable.table.lastUpdatedColumnTitle": "Dernière mise à jour", + "savedObjectsManagement.objectsTable.table.tooManyResultsLabel": "Affichage de {limit} sur {totalItemCount, plural, one {# objet} other {# objets}}", + "savedObjectsManagement.objectsTable.table.typeFilterName": "Type", + "savedObjectsManagement.objectsTable.table.updatedDateUnknownLabel": "Dernière mise à jour inconnue", + "savedObjectsManagement.objectsTable.unableFindSavedObjectNotificationMessage": "Objet enregistré introuvable", + "savedObjectsManagement.objectsTable.unableFindSavedObjectsNotificationMessage": "Objets enregistrés introuvables", + "savedObjectsManagement.objectView.deleteSavedObjectNotificationMessage": "Suppression de l'objet {type} \"{title}\"", + "savedObjectsManagement.objectView.unableDeleteSavedObjectNotificationMessage": "Impossible de supprimer l'objet {type} \"{title}\"", + "savedObjectsManagement.objectView.unableFindSavedObjectNotificationMessage": "Objet enregistré introuvable", + "savedObjectsManagement.shareToSpace.actionDescription": "Partager cet objet dans un ou plusieurs espaces", + "savedObjectsManagement.shareToSpace.actionTitle": "Partager dans les espaces", + "savedObjectsManagement.shareToSpace.columnDescription": "Espaces auxquels cet objet est actuellement attribué", + "savedObjectsManagement.shareToSpace.columnTitle": "Espaces", + "savedObjectsManagement.shareToSpace.globalObjectTypeContent": "Cet objet enregistré est disponible dans tous les espaces et ne peut pas être modifié.", + "savedObjectsManagement.shareToSpace.globalObjectTypeTitle": "Objet enregistré global", + "savedObjectsManagement.shareToSpace.isolatedObjectTypeContent": "Cet objet enregistré est disponible dans un seul espace ; il ne peut pas être attribué à plusieurs espaces.", + "savedObjectsManagement.shareToSpace.isolatedObjectTypeTitle": "Objet enregistré isolé", + "savedObjectsManagement.shareToSpace.shareableSoonObjectTypeContent": "Cet objet enregistré est disponible dans un seul espace. Dans une prochaine version, vous pourrez l'attribuer à plusieurs espaces.", + "savedObjectsManagement.shareToSpace.shareableSoonObjectTypeTitle": "Bientôt disponible : Attribuer un objet enregistré à plusieurs espaces", + "savedObjectsManagement.view.copyToClipboardLabel": "Copier dans le presse-papiers", + "savedObjectsManagement.view.deleteItemButtonLabel": "Supprimer", + "savedObjectsManagement.view.fieldDoesNotExistErrorMessage": "Un champ associé à cet objet n'existe plus dans la vue de données.", + "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.howToFixErrorDescriptionLinkText": "API des objets enregistrés", + "savedObjectsManagement.view.indexPatternDoesNotExistErrorMessage": "La vue de données associée à cet objet n'existe plus.", + "savedObjectsManagement.view.inspectCodeEditorAriaLabel": "inspecter { title }", + "savedObjectsManagement.view.inspectItemTitle": "Inspecter {title}", + "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.", + "savedObjectsManagement.view.viewItemButtonLabel": "Afficher {title}", + "savedSearch.contentManagementType": "Recherche enregistrée", + "savedSearch.kibana_context.filters.help": "Spécifier des filtres génériques Kibana", + "savedSearch.kibana_context.help": "Met à jour le contexte général de Kibana.", + "savedSearch.kibana_context.q.help": "Spécifier une recherche en texte libre Kibana", + "savedSearch.kibana_context.savedSearchId.help": "Spécifier l'ID de recherche enregistrée à utiliser pour les requêtes et les filtres", + "savedSearch.kibana_context.timeRange.help": "Spécifier le filtre de plage temporelle Kibana", + "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}", + "searchApiPanels.cloudIdDetails.cloudId.description": "Des bibliothèques et des connecteurs clients peuvent utiliser cet identificateur unique propre à Elastic Cloud.", + "searchApiPanels.cloudIdDetails.cloudId.title": "Identifiant du cloud", + "searchApiPanels.cloudIdDetails.description": "Soyez prêt à ingérer et rechercher vos données en choisissant une option de connexion :", + "searchApiPanels.cloudIdDetails.elasticsearchEndpoint.description": "La méthode la plus courante pour établir une connexion Elasticsearch.", + "searchApiPanels.cloudIdDetails.elasticsearchEndpoint.recommendedBadge": "Recommandé", + "searchApiPanels.cloudIdDetails.elasticsearchEndpoint.title": "Point de terminaison Elasticsearch", + "searchApiPanels.cloudIdDetails.title": "Copiez vos informations de connexion", + "searchApiPanels.pipeline.overview.anonymization.description": "Retirez les informations sensibles des documents avant l'indexation.", + "searchApiPanels.pipeline.overview.anonymization.title": "Anonymiser les données", + "searchApiPanels.pipeline.overview.arrayJsonHandling.description": "Exécutez des processeurs par lots, analysez les données JSON et triez les éléments.", + "searchApiPanels.pipeline.overview.arrayJsonHandling.title": "Traitement des tableaux/JSON", + "searchApiPanels.pipeline.overview.dataEnrichment.description": "Ajouter des informations des sources externes ou appliquer des transformations à vos documents pour une recherche plus contextuelle et pertinente.", + "searchApiPanels.pipeline.overview.dataEnrichment.title": "Enrichir les données", + "searchApiPanels.pipeline.overview.dataFiltering.description": "Supprimez des champs spécifiques des documents avant leur indexation, afin d’exclure les informations inutiles ou sensibles.", + "searchApiPanels.pipeline.overview.dataFiltering.title": "Filtrage des données", + "searchApiPanels.pipeline.overview.dataTransformation.description": "Analysez les informations depuis vos documents pour assurer qu'ils sont conformes au format standardisé.", + "searchApiPanels.pipeline.overview.dataTransformation.title": "Transformation des données", + "searchApiPanels.pipeline.overview.extAndStandard.description": "Analysez les informations depuis vos documents pour assurer qu'ils sont conformes au format standardisé.", + "searchApiPanels.pipeline.overview.extAndStandard.title": "Extraire et standardiser", + "searchApiPanels.pipeline.overview.pipelineHandling.description": "Gérez les exceptions d'erreur, exécutez un autre pipeline ou redirigez les documents vers un autre index", + "searchApiPanels.pipeline.overview.pipelineHandling.title": "Traitement du pipeline", + "searchApiPanels.preprocessData.overview.arrayJsonHandling.learnMore": "En savoir plus", + "searchApiPanels.preprocessData.overview.dataEnrichment.description": "Ajouter des informations des sources externes ou appliquer des transformations à vos documents pour une recherche plus contextuelle et pertinente.", + "searchApiPanels.preprocessData.overview.dataEnrichment.learnMore": "En savoir plus", + "searchApiPanels.preprocessData.overview.dataEnrichment.title": "Enrichissement des données", + "searchApiPanels.preprocessData.overview.dataFiltering.learnMore": "En savoir plus", + "searchApiPanels.preprocessData.overview.dataTransformation.learnMore": "En savoir plus", + "searchApiPanels.preprocessData.overview.pipelineHandling.learnMore": "En savoir plus", + "searchApiPanels.welcomeBanner.codeBox.copyButtonLabel": "Copier", + "searchApiPanels.welcomeBanner.header.description": "Configurez votre client de langage de programmation, ingérez des données, et vous serez prêt à commencer vos recherches en quelques minutes.", + "searchApiPanels.welcomeBanner.header.greeting.customTitle": "👋 Bonjour {name} !", + "searchApiPanels.welcomeBanner.header.greeting.defaultTitle": "👋 Bonjour", + "searchApiPanels.welcomeBanner.header.title": "Lancez-vous avec Elasticsearch", + "searchApiPanels.welcomeBanner.ingestData.alternativeOptions": "Autres options d'ingestion", + "searchApiPanels.welcomeBanner.ingestData.alternativeOptions.beatsDescription": "Des agents légers conçus pour le transfert de données pour Elasticsearch. Utilisez Beats pour envoyer des données opérationnelles depuis vos serveurs.", + "searchApiPanels.welcomeBanner.ingestData.alternativeOptions.beatsDocumentationLabel": "Documentation", + "searchApiPanels.welcomeBanner.ingestData.alternativeOptions.beatsTitle": "Beats", + "searchApiPanels.welcomeBanner.ingestData.alternativeOptions.logstashDescription": "Pipeline de traitement des données à usage général pour Elasticsearch. Utilisez Logstash pour extraire et transformer les données d'une variétés d'entrées et de sorties.", + "searchApiPanels.welcomeBanner.ingestData.alternativeOptions.logstashDocumentationLabel": "Documentation", + "searchApiPanels.welcomeBanner.ingestData.alternativeOptions.logstashTitle": "Logstash", + "searchApiPanels.welcomeBanner.ingestData.description": "Ajoutez des données à votre flux de données ou à votre index pour les rendre interrogeables à l'aide de l'API. ", + "searchApiPanels.welcomeBanner.ingestData.title": "Ingérer des données", + "searchApiPanels.welcomeBanner.ingestPipelinePanel.description": "Vous pouvez utiliser des pipelines d'ingestion pour prétraiter vos données avant leur indexation dans Elasticsearch.", + "searchApiPanels.welcomeBanner.ingestPipelinePanel.managedBadge": "Géré", + "searchApiPanels.welcomeBanner.ingestPipelinePanel.optionalBadge": "Facultatif", + "searchApiPanels.welcomeBanner.ingestPipelinePanel.processorCount": "{count} {count, plural, one {processeur} other {processeurs}}", + "searchApiPanels.welcomeBanner.ingestPipelinePanel.recommendedBadge": "Recommandé", + "searchApiPanels.welcomeBanner.ingestPipelinePanel.selectPipelinePlaceholder": "Sélectionner un pipeline", + "searchApiPanels.welcomeBanner.ingestPipelinePanel.title": "Prétraiter vos données", + "searchApiPanels.welcomeBanner.installClient.clientDocLink": "Documentation du client {languageName}", + "searchApiPanels.welcomeBanner.installClient.description": "Vous devez d'abord installer le client de langage de programmation de votre choix.", + "searchApiPanels.welcomeBanner.installClient.title": "Installer un client", + "searchApiPanels.welcomeBanner.panels.learnMore": "En savoir plus", + "searchApiPanels.welcomeBanner.selectClient.apiRequestConsoleDocLink": "Exécuter des requêtes d’API dans la console ", + "searchApiPanels.welcomeBanner.selectClient.callout.description": "Avec la console, vous pouvez directement commencer à utiliser nos API REST. Aucune installation n’est requise.", + "searchApiPanels.welcomeBanner.selectClient.callout.link": "Essayez la console maintenant", + "searchApiPanels.welcomeBanner.selectClient.callout.title": "Lancez-vous dans la console", + "searchApiPanels.welcomeBanner.selectClient.description": "Elastic construit et assure la maintenance des clients dans plusieurs langues populaires et notre communauté a contribué à beaucoup d'autres. Sélectionnez votre client de langage favori ou explorez la {console} pour commencer.", + "searchApiPanels.welcomeBanner.selectClient.elasticsearchClientDocLink": "Clients d'Elasticsearch ", + "searchApiPanels.welcomeBanner.selectClient.heading": "Choisissez-en un", + "searchApiPanels.welcomeBanner.selectClient.title": "Sélectionner votre client", + "searchConnectors.config.invalidInteger": "{label} doit être un nombre entier.", + "searchConnectors.configuration.openPopoverLabel": "Ouvrir la fenêtre contextuelle de licence", + "searchConnectors.configurationConnector.config.advancedConfigurations.title": "Configurations avancées", + "searchConnectors.configurationConnector.config.cancelEditingButton.title": "Annuler", + "searchConnectors.configurationConnector.config.defaultValue": "Si cette option est laissée vide, la valeur par défaut {defaultValue} sera utilisée.", + "searchConnectors.configurationConnector.config.editButton.title": "Modifier la configuration", + "searchConnectors.configurationConnector.config.error.title": "Erreur de connecteur", + "searchConnectors.configurationConnector.config.noConfigCallout.description": "Ce connecteur ne possède aucun champ de configuration. Votre connecteur a-t-il pu se connecter avec succès à Elasticsearch et définir sa configuration ?", + "searchConnectors.configurationConnector.config.noConfigCallout.title": "Aucun champ de configuration", + "searchConnectors.configurationConnector.config.submitButton.title": "Enregistrer la configuration", + "searchConnectors.connector.documentLevelSecurity.enablePanel.description": "Vous permet de contrôler les documents auxquels peuvent accéder les utilisateurs, selon leurs autorisations. Cela permet de vous assurer que les résultats de recherche ne renvoient que des informations pertinentes et autorisées pour les utilisateurs, selon leurs rôles.", + "searchConnectors.connector.documentLevelSecurity.enablePanel.heading": "Sécurité au niveau du document", + "searchConnectors.connectors.subscriptionLabel": "Plans d'abonnement", + "searchConnectors.connectors.upgradeDescription": "Pour utiliser ce connecteur, vous devez mettre à jour votre licence vers Platinum ou commencer un essai gratuit de 30 jours.", + "searchConnectors.connectors.upgradeTitle": "Mettre à niveau vers Elastic Platinum", + "searchConnectors.connectorScheduling.resetButton.label": "Réinitialiser", + "searchConnectors.connectorScheduling.saveButton.label": "Enregistrer", + "searchConnectors.connectorScheduling.schedulePanel.documentLevelSecurity.description": "Contrôlez à quels documents les utilisateurs peuvent y accéder selon leurs autorisations et rôles. Planifiez des synchronisations pour garder ces contrôles d’accès à jour.", + "searchConnectors.connectorScheduling.schedulePanel.documentLevelSecurity.dlsDisabledCallout.link": "Activer la sécurité au niveau du document", + "searchConnectors.connectorScheduling.schedulePanel.documentLevelSecurity.dlsDisabledCallout.text": "{link} pour ce connecteur afin d'activer ces options.", + "searchConnectors.connectorScheduling.schedulePanel.documentLevelSecurity.dlsDisabledCallout.title": "Synchronisations de contrôle d'accès non autorisée", + "searchConnectors.connectorScheduling.schedulePanel.documentLevelSecurity.title": "Sécurité au niveau du document", + "searchConnectors.content.filteringRules.policy.exclude": "Exclure", + "searchConnectors.content.filteringRules.policy.include": "Inclure", + "searchConnectors.content.filteringRules.rules.contains": "Contient", + "searchConnectors.content.filteringRules.rules.endsWith": "Se termine par", + "searchConnectors.content.filteringRules.rules.equals": "Est égal à", + "searchConnectors.content.filteringRules.rules.greaterThan": "Supérieur à", + "searchConnectors.content.filteringRules.rules.lessThan": "Inférieur à", + "searchConnectors.content.filteringRules.rules.regEx": "Expression régulière", + "searchConnectors.content.filteringRules.rules.startsWith": "Commence par", + "searchConnectors.content.indices.connectorScheduling.accordion.accessControlSync.description": "Planifiez des synchronisations de contrôles d’accès pour garder les mappings d’autorisation à jour.", + "searchConnectors.content.indices.connectorScheduling.accordion.accessControlSync.title": "Synchronisation de contrôle d'accès", + "searchConnectors.content.indices.connectorScheduling.accordion.fullSync.description": "Synchronisez toutes vos données depuis votre source de données.", + "searchConnectors.content.indices.connectorScheduling.accordion.fullSync.title": "Synchronisation complète du contenu", + "searchConnectors.content.indices.connectorScheduling.accordion.incrementalSync.description": "Une tâche de synchronisation légère qui ne récupère que le contenu mis à jour depuis votre source de données.", + "searchConnectors.content.indices.connectorScheduling.accordion.incrementalSync.title": "Synchronisation incrémentielle de contenu", + "searchConnectors.content.indices.connectorScheduling.error.title": "Examinez la configuration de votre connecteur pour voir si des erreurs ont été signalées.", + "searchConnectors.content.indices.connectorScheduling.notConnected.button.label": "Configurer", + "searchConnectors.content.indices.connectorScheduling.notConnected.description": "Configurez et déployez votre connecteur, puis revenez ici pour définir votre calendrier de synchronisation. Ce calendrier déterminera l'intervalle de synchronisation du connecteur avec votre source de données pour les documents mis à jour.", + "searchConnectors.content.indices.connectorScheduling.notConnected.title": "Configurer votre connecteur pour planifier une synchronisation", + "searchConnectors.content.indices.connectorScheduling.schedulePanel.contentSync.description": "Récupérez du contenu pour créer ou mettre à jour vos documents Elasticsearch.", + "searchConnectors.content.indices.connectorScheduling.schedulePanel.contentSync.title": "Synchronisation de contenu", + "searchConnectors.content.indices.connectorScheduling.switch.label": "Activé", + "searchConnectors.content.nativeConnectors.googleCloud.name": "Google Cloud Storage", + "searchConnectors.content.nativeConnectors.s3.accessKey.label": "ID de clé d'accès AWS", + "searchConnectors.content.nativeConnectors.s3.buckets.label": "Compartiments AWS", + "searchConnectors.content.nativeConnectors.s3.buckets.tooltip": "Les compartiments AWS sont ignorés lorsque des règles de synchronisation avancées sont appliquées.", + "searchConnectors.content.nativeConnectors.s3.connectTimeout.label": "Délai d'attente de connexion", + "searchConnectors.content.nativeConnectors.s3.maxAttempts.label": "Nombre maximum de nouvelles tentatives", + "searchConnectors.content.nativeConnectors.s3.maxPageSize.label": "Taille maximum de la page", + "searchConnectors.content.nativeConnectors.s3.name": "S3", + "searchConnectors.content.nativeConnectors.s3.readTimeout.label": "Délai d'attente de lecture", + "searchConnectors.content.nativeConnectors.s3.secretKey.label": "Clé secrète AWS", + "searchConnectors.content.nativeConnectors.salesforce.clientId.label": "ID client", + "searchConnectors.content.nativeConnectors.salesforce.clientId.tooltip": "L'ID client de votre application connectée utilisant le protocole OAuth2. Également appelé \"clé consommateur\"", + "searchConnectors.content.nativeConnectors.salesforce.clientSecret.label": "Identifiant client secret", + "searchConnectors.content.nativeConnectors.salesforce.clientSecret.tooltip": "L'identifiant client secret de votre application connectée utilisant le protocole OAuth2. Également appelé \"secret consommateur\"", + "searchConnectors.content.nativeConnectors.salesforce.domain.label": "Domaine", + "searchConnectors.content.nativeConnectors.salesforce.domain.tooltip": "Le domaine de votre instance Salesforce. Si votre URL Salesforce est \"https://foo.salesforce.com\", le domaine est \"foo\".", + "searchConnectors.content.nativeConnectors.salesforce.name": "Salesforce", + "searchConnectors.cronEditor.cronDaily.fieldHour.textAtLabel": "À", + "searchConnectors.cronEditor.cronDaily.fieldTimeLabel": "Heure", + "searchConnectors.cronEditor.cronDaily.hourSelectLabel": "Heure", + "searchConnectors.cronEditor.cronDaily.minuteSelectLabel": "Minute", + "searchConnectors.cronEditor.cronHourly.fieldMinute.textAtLabel": "À", + "searchConnectors.cronEditor.cronHourly.fieldTimeLabel": "Minute", + "searchConnectors.cronEditor.cronMinutely.fieldMinute.textAppendLabel": "minutes", + "searchConnectors.cronEditor.cronMinutely.fieldMinute.textAtLabel": "Chaque", + "searchConnectors.cronEditor.cronMinutely.fieldTimeLabel": "Minute", + "searchConnectors.cronEditor.cronMonthly.fieldDateLabel": "Date", + "searchConnectors.cronEditor.cronMonthly.fieldHour.textAtLabel": "À", + "searchConnectors.cronEditor.cronMonthly.fieldTimeLabel": "Heure", + "searchConnectors.cronEditor.cronMonthly.hourSelectLabel": "Heure", + "searchConnectors.cronEditor.cronMonthly.minuteSelectLabel": "Minute", + "searchConnectors.cronEditor.cronMonthly.textOnTheLabel": "Le", + "searchConnectors.cronEditor.cronWeekly.fieldDateLabel": "Jour", + "searchConnectors.cronEditor.cronWeekly.fieldHour.textAtLabel": "À", + "searchConnectors.cronEditor.cronWeekly.fieldTimeLabel": "Heure", + "searchConnectors.cronEditor.cronWeekly.hourSelectLabel": "Heure", + "searchConnectors.cronEditor.cronWeekly.minuteSelectLabel": "Minute", + "searchConnectors.cronEditor.cronWeekly.textOnLabel": "Le", + "searchConnectors.cronEditor.cronYearly.fieldDate.textOnTheLabel": "Le", + "searchConnectors.cronEditor.cronYearly.fieldDateLabel": "Date", + "searchConnectors.cronEditor.cronYearly.fieldHour.textAtLabel": "À", + "searchConnectors.cronEditor.cronYearly.fieldMonth.textInLabel": "En", + "searchConnectors.cronEditor.cronYearly.fieldMonthLabel": "Mois", + "searchConnectors.cronEditor.cronYearly.fieldTimeLabel": "Heure", + "searchConnectors.cronEditor.cronYearly.hourSelectLabel": "Heure", + "searchConnectors.cronEditor.cronYearly.minuteSelectLabel": "Minute", + "searchConnectors.cronEditor.day.friday": "Vendredi", + "searchConnectors.cronEditor.day.monday": "Lundi", + "searchConnectors.cronEditor.day.saturday": "Samedi", + "searchConnectors.cronEditor.day.sunday": "Dimanche", + "searchConnectors.cronEditor.day.thursday": "Jeudi", + "searchConnectors.cronEditor.day.tuesday": "Mardi", + "searchConnectors.cronEditor.day.wednesday": "Mercredi", + "searchConnectors.cronEditor.fieldFrequencyLabel": "Fréquence", + "searchConnectors.cronEditor.month.april": "Avril", + "searchConnectors.cronEditor.month.august": "Août", + "searchConnectors.cronEditor.month.december": "Décembre", + "searchConnectors.cronEditor.month.february": "Février", + "searchConnectors.cronEditor.month.january": "Janvier", + "searchConnectors.cronEditor.month.july": "Juillet", + "searchConnectors.cronEditor.month.june": "Juin", + "searchConnectors.cronEditor.month.march": "Mars", + "searchConnectors.cronEditor.month.may": "Mai", + "searchConnectors.cronEditor.month.november": "Novembre", + "searchConnectors.cronEditor.month.october": "Octobre", + "searchConnectors.cronEditor.month.september": "Septembre", + "searchConnectors.cronEditor.textEveryLabel": "Chaque", + "searchConnectors.index.filtering.field": "champ", + "searchConnectors.index.filtering.policy": "Politique", + "searchConnectors.index.filtering.priority": "Priorité de la règle", + "searchConnectors.index.filtering.rule": "Règle", + "searchConnectors.index.filtering.value": "Valeur", + "searchConnectors.index.syncJobs.actions.cancelSyncJob.caption": "Annuler cette tâche de synchronisation", + "searchConnectors.index.syncJobs.actions.deleteJob.caption": "Supprimer", + "searchConnectors.index.syncJobs.actions.viewJob.caption": "Afficher cette tâche de synchronisation", + "searchConnectors.index.syncJobs.actions.viewJob.title": "Afficher cette tâche de synchronisation", + "searchConnectors.index.syncJobs.documents.added": "Inséré", + "searchConnectors.index.syncJobs.documents.deleted.tooltip": "Le nombre d'opérations {delete} que le connecteur a envoyé à l'API _bulk Elasticsearch. Peut inclure des documents abandonnés par les règles de synchronisation. N'inclut pas les documents abandonnés par les processeurs d'ingestion. Les documents sont supprimés lorsque le connecteur détermine qu'ils ne sont plus présents dans la source tierce.", + "searchConnectors.index.syncJobs.documents.removed": "Supprimé", + "searchConnectors.index.syncJobs.documents.title": "Documents", + "searchConnectors.index.syncJobs.documents.upserted.tooltip": "Le nombre d'opérations {index} que le connecteur a envoyé à l'API _bulk Elasticsearch, y compris les mises à jour de documents existants. Veuillez noter que le nombre de documents refoulés peut différer du nombre de documents dans l'index.", + "searchConnectors.index.syncJobs.documents.value": "Valeur", + "searchConnectors.index.syncJobs.documents.volume": "Volume", + "searchConnectors.index.syncJobs.documents.volume.aboutLabel": "À propos de {volume}", + "searchConnectors.index.syncJobs.documents.volume.lessThanOneMBLabel": "Inférieur à 1 Mo", + "searchConnectors.index.syncJobs.documents.volume.tooltip": "Le volume, en Mo, des données JSON envoyées avec les opérations {index} à l'API _bulk Elasticsearch. L'index Elasticsearch peut être plus grand, selon les mappings et les paramètres d'index, ou plus petit, si les données sont découpées par les processeurs d'ingestion.", + "searchConnectors.index.syncJobs.events.cancelationRequested": "Annulation demandée", + "searchConnectors.index.syncJobs.events.canceled": "Annulé", + "searchConnectors.index.syncJobs.events.completed": "Terminé", + "searchConnectors.index.syncJobs.events.lastUpdated": "Dernière mise à jour", + "searchConnectors.index.syncJobs.events.state": "État", + "searchConnectors.index.syncJobs.events.syncRequestedManually": "Synchronisation demandée manuellement", + "searchConnectors.index.syncJobs.events.syncRequestedScheduled": "Synchronisation demandée par planification", + "searchConnectors.index.syncJobs.events.syncStarted": "Synchronisation démarrée", + "searchConnectors.index.syncJobs.events.time": "Heure", + "searchConnectors.index.syncJobs.events.title": "Événements", + "searchConnectors.index.syncJobs.pipeline.extractBinaryContent": "Extraire le contenu binaire", + "searchConnectors.index.syncJobs.pipeline.name": "Nom du pipeline", + "searchConnectors.index.syncJobs.pipeline.reduceWhitespace": "Réduire l'espace", + "searchConnectors.index.syncJobs.pipeline.runMlInference": "Inférence de Machine Learning", + "searchConnectors.index.syncJobs.pipeline.setting": "Paramètre de pipeline", + "searchConnectors.index.syncJobs.pipeline.title": "Pipeline", + "searchConnectors.index.syncJobs.syncRulesAdvancedTitle": "Règles de synchronisation avancées", + "searchConnectors.index.syncJobs.syncRulesTitle": "Règles de synchronisation", + "searchConnectors.manageLicenseButtonLabel": "Gérer la licence", + "searchConnectors.nativeConnectors.advancedRulesIgnored.label": "Ce champ configurable est ignoré lorsque les règles de synchronisation avancées sont appliquées.", + "searchConnectors.nativeConnectors.azureBlobStorage.accountKeyLabel": "Clé du compte", + "searchConnectors.nativeConnectors.azureBlobStorage.accountNameLabel": "Nom du compte", + "searchConnectors.nativeConnectors.azureBlobStorage.blobEndpointLabel": "Point de terminaison Blob", + "searchConnectors.nativeConnectors.azureBlobStorage.containerNameLabel": "Liste des conteneurs", + "searchConnectors.nativeConnectors.azureBlobStorage.name": "Stockage Blob Azure", + "searchConnectors.nativeConnectors.box.appKeyLabel": "Clé d’application", + "searchConnectors.nativeConnectors.box.appSecretLabel": "Secret d’application", + "searchConnectors.nativeConnectors.box.includeInheritedUsersLabel": "Inclure les groupes et les utilisateurs hérités", + "searchConnectors.nativeConnectors.box.includeInheritedUsersTooltip": "Incluez les groupes et les utilisateurs hérités lors de l'indexation des autorisations. L'activation de ce champ configurable entraînera une dégradation significative des performances.", + "searchConnectors.nativeConnectors.box.name": "Box", + "searchConnectors.nativeConnectors.box.pathLabel": "Chemin permettant de récupérer les fichiers/dossiers", + "searchConnectors.nativeConnectors.box.pathTooltip": "Le chemin est ignoré lorsque des règles de synchronisation avancées sont appliquées. ", + "searchConnectors.nativeConnectors.box.refreshTokenLabel": "Token d'actualisation", + "searchConnectors.nativeConnectors.boxTooltip.name": "Box", + "searchConnectors.nativeConnectors.confluence.indexLabelsLabel": "Activer les étiquettes d'indexation", + "searchConnectors.nativeConnectors.confluence.indexLabelsTooltip": "Activer cette option augmentera le nombre d'appels réseau vers la source et peut diminuer les performances", + "searchConnectors.nativeConnectors.confluence.name": "Confluence", + "searchConnectors.nativeConnectors.confluence.spaceKeysLabel": "Touche espace Confluence", + "searchConnectors.nativeConnectors.confluence.tooltipName": "Confluence", + "searchConnectors.nativeConnectors.confluence.urlLabel": "Étiquette URL Confluence", + "searchConnectors.nativeConnectors.confluenceCloud.accountEmailLabel": "E-mail du compte Confluence Cloud", + "searchConnectors.nativeConnectors.confluenceCloud.name": "Cloud Confluence", + "searchConnectors.nativeConnectors.confluenceDataCenter.name": "Centre de données Confluence", + "searchConnectors.nativeConnectors.confluenceDataCenter.passwordLabel": "Mot de passe", + "searchConnectors.nativeConnectors.confluenceDataCenter.usernameLabel": "Nom d'utilisateur", + "searchConnectors.nativeConnectors.confluenceServer.apiTokenLabel": "Token d'API de Confluence Cloud", + "searchConnectors.nativeConnectors.confluenceServer.name": "Serveur Confluence", + "searchConnectors.nativeConnectors.confluenceServer.passwordLabel": "Mot de passe du serveur Confluence", + "searchConnectors.nativeConnectors.confluenceServer.usernameLabel": "Nom d'utilisateur du serveur Confluence", + "searchConnectors.nativeConnectors.confluenceSource.label": "Source de données Confluence", + "searchConnectors.nativeConnectors.databaseLabel": "Base de données", + "searchConnectors.nativeConnectors.dropbox.includeInheritedUsersAndGroups.label": "Inclure les groupes et les utilisateurs hérités", + "searchConnectors.nativeConnectors.dropbox.includeInheritedUsersAndGroups.tooltip": "Incluez les groupes et les utilisateurs hérités lors de l'indexation des autorisations. L'activation de ce champ configurable entraînera une dégradation significative des performances.", + "searchConnectors.nativeConnectors.dropbox.name": "Dropbox", + "searchConnectors.nativeConnectors.dropbox.tooltipName": "Dropbox", + "searchConnectors.nativeConnectors.enableDLS.label": "Activer la sécurité au niveau du document", + "searchConnectors.nativeConnectors.enableDLS.tooltip": "La sécurité au niveau du document permet de conserver dans Elasticsearch les identités et autorisations paramétrées dans {serviceName}. Vous pouvez ainsi restreindre et personnaliser l'accès en lecture des utilisateurs et des groupes pour les documents dans cet index. La synchronisation de contrôle d'accès garantit que ces métadonnées sont correctement actualisées dans vos documents Elasticsearch.", + "searchConnectors.nativeConnectors.enableSSL.label": "Activer SSL", + "searchConnectors.nativeConnectors.gdrive.label": "Compte de service JSON Google Drive", + "searchConnectors.nativeConnectors.gdrive.maxHTTPRequest.label": "Requêtes HTTP simultanées maximales", + "searchConnectors.nativeConnectors.gdrive.maxHTTPRequest.tooltip": "Ce paramètre fixe le nombre maximal de requêtes HTTP simultanées envoyées à l'API Google pour récupérer des données. Augmenter cette valeur peut améliorer la vitesse de récupération des données, mais également accroître les demandes de ressources systèmes et de bande passante du réseau.", + "searchConnectors.nativeConnectors.gdrive.tooltip": "Ces connecteurs s'authentifient comme un compte de service afin de synchroniser le contenu depuis Google Drive.", + "searchConnectors.nativeConnectors.gdrive.tooltipName": "Google Drive", + "searchConnectors.nativeConnectors.gdrive.useDomainWideDelegation.label": "Utiliser la délégation à l'échelle du domaine pour la synchronisation des données", + "searchConnectors.nativeConnectors.gdrive.useDomainWideDelegation.tooltip": "Activez la délégation à l'échelle du domaine pour synchroniser automatiquement le contenu de tous les Drive partagés et individuels de Google Workspace. Il n'est donc plus nécessaire de partager manuellement les données de Google Drive avec votre compte de service, mais le temps de synchronisation risque d'être plus long. Si la fonctionnalité est désactivée, seuls les éléments et les dossiers partagés manuellement avec le compte de service seront synchronisés. Veuillez consulter la documentation du connecteur pour vous assurer que la délégation à l'échelle du domaine est correctement configurée et a les cadres appropriés.", + "searchConnectors.nativeConnectors.gdrive.workspaceAdminEmail.label": "E-mail administrateur Google Workspace", + "searchConnectors.nativeConnectors.gdrive.workspaceAdminEmail.tooltip": "Afin d'utiliser la sécurité au niveau du document, vous devez activer la délégation d'autorité au niveau du domaine de Google Workspace pour votre compte de service. Un compte de service dont l'autorité est déléguée peut offrir à l'administrateur des permissions suffisantes pour récupérer tous les utilisateurs et toutes les permissions associées.", + "searchConnectors.nativeConnectors.gdrive.workspaceAdminEmailDataSync.label": "E-mail administrateur Google Workspace", + "searchConnectors.nativeConnectors.gdrive.workspaceAdminEmailDataSync.tooltip": "Indiquez l'e-mail de l'administrateur à utiliser avec la délégation à l'échelle du domaine pour la synchronisation des données. Cette adresse e-mail permet au connecteur d'utiliser l'API Admin Directory pour répertorier les utilisateurs de l'organisation. Veuillez consulter la documentation du connecteur pour vous assurer que la délégation à l'échelle du domaine est correctement configurée et a les cadres appropriés.", + "searchConnectors.nativeConnectors.gdrive.workspaceEmailSharedDrivesSync.label": "E-mail Google Workspace pour la synchronisation des Drive partagés", + "searchConnectors.nativeConnectors.gdrive.workspaceEmailSharedDrivesSync.tooltip": "Fournissez l'e-mail de l'utilisateur de Google Workspace pour la découverte et la synchronisation des Drive partagés. Seuls les Drive partagés auxquels cet utilisateur a accès seront synchronisés.", + "searchConnectors.nativeConnectors.github.appID.label": "ID de l'application", + "searchConnectors.nativeConnectors.github.authMethod.label": "Méthode d'authentification", + "searchConnectors.nativeConnectors.github.configuration.useDocumentLevelSecurityTooltip": "La sécurité au niveau du document permet de conserver dans Elasticsearch les identités et autorisations paramétrées dans GitHub. Vous pouvez ainsi restreindre et personnaliser l'accès en lecture des utilisateurs et des groupes pour les documents dans cet index. La synchronisation de contrôle d'accès garantit que ces métadonnées sont correctement actualisées dans vos documents Elasticsearch.", + "searchConnectors.nativeConnectors.github.label": "Source de données", + "searchConnectors.nativeConnectors.github.listOfRepos.label": "Listes de référentiels", + "searchConnectors.nativeConnectors.github.listOfRepos.tooltip": "Ce champ configurable est ignoré lorsque les règles de synchronisation avancées sont appliquées.", + "searchConnectors.nativeConnectors.github.name": "GitHub", + "searchConnectors.nativeConnectors.github.options.cloudLabel": "Cloud GitHub", + "searchConnectors.nativeConnectors.github.options.cloudServer": "Serveur GitHub", + "searchConnectors.nativeConnectors.github.options.githubApp": "Application GitHub", + "searchConnectors.nativeConnectors.github.options.organization": "Organisation", + "searchConnectors.nativeConnectors.github.options.other": "Autre", + "searchConnectors.nativeConnectors.github.options.personalAccessToken": "Token d'accès personnel", + "searchConnectors.nativeConnectors.github.org_name.label": "Nom de l'organisation", + "searchConnectors.nativeConnectors.github.privateKey.label": "Clé privée de l'application", + "searchConnectors.nativeConnectors.github.repo_type": "La fonctionnalité de sécurité au niveau du document n'est pas disponible pour le type de référentiel \"autre\"", + "searchConnectors.nativeConnectors.github.repo_type.label": "Type de référentiel", + "searchConnectors.nativeConnectors.github.token.label": "Token", + "searchConnectors.nativeConnectors.github.url.label": "URL du serveur", + "searchConnectors.nativeConnectors.gmail.customer_id.label": "ID client Google", + "searchConnectors.nativeConnectors.gmail.customer_id.tooltip": "Console admin Google -> Compte -> Paramètres -> ID client", + "searchConnectors.nativeConnectors.gmail.include_spam_and_trash.label": "Inclure le spam et les e-mails indésirables", + "searchConnectors.nativeConnectors.gmail.include_spam_and_trash.tooltip": "Si réglé sur \"true\", inclura le spam et les e-mails indésirables.", + "searchConnectors.nativeConnectors.gmail.name": "Gmail", + "searchConnectors.nativeConnectors.gmail.service_account_credentials.label": "Compte de service JSON GMail", + "searchConnectors.nativeConnectors.gmail.subject.label": "E-mail administrateur Google Workspace", + "searchConnectors.nativeConnectors.gmail.subject.tooltip": "Adresse e-mail du compte admin", + "searchConnectors.nativeConnectors.gmail.use_document_level_security.label": "Activer la sécurité au niveau du document", + "searchConnectors.nativeConnectors.gmail.use_document_level_security.tooltip": "La sécurité au niveau du document permet de conserver dans Elasticsearch les identités et autorisations paramétrées dans GMail. Vous pouvez ainsi restreindre et personnaliser l'accès en lecture des utilisateurs pour les documents contenus dans cet index. La synchronisation de contrôle d'accès garantit que ces métadonnées sont correctement actualisées dans vos documents Elasticsearch.", + "searchConnectors.nativeConnectors.google_drive.name": "Google Drive", + "searchConnectors.nativeConnectors.googleCloudStorage.bucketNameLabel": "Liste des compartiments", + "searchConnectors.nativeConnectors.googleCloudStorage.label": "Compte de service JSON Google Cloud", + "searchConnectors.nativeConnectors.googleCloudStorage.retry.label": "Nombre maximum de nouvelles tentatives pour les requêtes ayant échoué", + "searchConnectors.nativeConnectors.jira.cloudApiTokenLabel": "Token d'API Jira Cloud", + "searchConnectors.nativeConnectors.jira.cloudServiceAccountLabel": "Adresse e-mail de Jira Cloud", + "searchConnectors.nativeConnectors.jira.cloudServiceAccountTooltip": "Adresse e-mail associée au compte Jira Cloud. Ex. : jane.doe@gmail.com", + "searchConnectors.nativeConnectors.jira.dataCenterPasswordLabel": "Mot de passe", + "searchConnectors.nativeConnectors.jira.dataCenterUsername": "Nom d'utilisateur", + "searchConnectors.nativeConnectors.jira.dataSourceLabel": "Source de données Jira", + "searchConnectors.nativeConnectors.jira.hostUrlLabel": "URL de l'hôte Jira", + "searchConnectors.nativeConnectors.jira.jiraCloudLabel": "Jira Cloud", + "searchConnectors.nativeConnectors.jira.jiraDataCenterLabel": "Centre de données Jira", + "searchConnectors.nativeConnectors.jira.jiraServerLabel": "Serveur Jira", + "searchConnectors.nativeConnectors.jira.name": "Jira", + "searchConnectors.nativeConnectors.jira.projectKeysLabel": "Clés de projet Jira", + "searchConnectors.nativeConnectors.jira.serverPasswordLabel": "Mot de passe serveur Jira", + "searchConnectors.nativeConnectors.jira.serverUsername": "Nom d'utilisateur serveur Jira", + "searchConnectors.nativeConnectors.jiraTooltip.name": "Jira", + "searchConnectors.nativeConnectors.microsoftTeams.clientIdLabel": "ID client", + "searchConnectors.nativeConnectors.microsoftTeams.name": "Microsoft Teams", + "searchConnectors.nativeConnectors.microsoftTeams.secretValueLabel": "Valeur secrète", + "searchConnectors.nativeConnectors.microsoftTeams.tenantIdLabel": "ID locataire", + "searchConnectors.nativeConnectors.mongodb.configuration.collectionLabel": "Collection", + "searchConnectors.nativeConnectors.mongodb.configuration.directConnectionLabel": "Connexion directe", + "searchConnectors.nativeConnectors.mongodb.configuration.hostLabel": "Nom d'hôte du serveur", + "searchConnectors.nativeConnectors.mongodb.configuration.sslCaLabel": "Autorité de certification (.pem)", + "searchConnectors.nativeConnectors.mongodb.configuration.sslCaTooltip": "Précise le certificat racine fourni par l'Autorité de certification. La valeur du certificat permet de valider le certificat présenté par l'instance MongoDB.", + "searchConnectors.nativeConnectors.mongodb.configuration.sslEnabledLabel": "Connexion SSL/TLS", + "searchConnectors.nativeConnectors.mongodb.configuration.sslEnabledTooltip": "Cette option établit une connexion sécurisée au serveur MongoDB grâce au chiffrement SSL/TLS. Assurez-vous que votre déploiement MongoDB prend en charge les connexions SSL/TLS. Activez cette option si le cluster MongoDB utilise des enregistrements DNS SRV.", + "searchConnectors.nativeConnectors.mongodb.configuration.tlsInsecureLabel": "Ignorer la vérification du certificat", + "searchConnectors.nativeConnectors.mongodb.configuration.tlsInsecureTooltip": "Cette option permet d'ignorer la validation du certificat pour les connexions TLS/SSL à votre serveur MongoDB. Nous vous recommandons fortement de la désactiver.", + "searchConnectors.nativeConnectors.mongodb.name": "MongoDB", + "searchConnectors.nativeConnectors.mssql.configuration.hostLabel": "Hôte", + "searchConnectors.nativeConnectors.mssql.configuration.passwordLabel": "Mot de passe", + "searchConnectors.nativeConnectors.mssql.configuration.retriesLabel": "Nouvelles tentatives par requête", + "searchConnectors.nativeConnectors.mssql.configuration.rowsFetchedLabel": "Lignes extraites par requête", + "searchConnectors.nativeConnectors.mssql.configuration.schemaLabel": "Schéma", + "searchConnectors.nativeConnectors.mssql.configuration.tablesLabel": "Liste de tables séparées par des virgules", + "searchConnectors.nativeConnectors.mssql.configuration.usernameLabel": "Nom d'utilisateur", + "searchConnectors.nativeConnectors.mssql.configuration.validateHostLabel": "Valider l’hôte", + "searchConnectors.nativeConnectors.mssql.name": "Microsoft SQL", + "searchConnectors.nativeConnectors.mysql.configuration.hostLabel": "Hôte", + "searchConnectors.nativeConnectors.mysql.configuration.passwordLabel": "Mot de passe", + "searchConnectors.nativeConnectors.mysql.configuration.retriesLabel": "Nouvelles tentatives par requête", + "searchConnectors.nativeConnectors.mysql.configuration.rowsFetchedLabel": "Lignes extraites par requête", + "searchConnectors.nativeConnectors.mysql.configuration.tablesLabel": "Liste de tables séparées par des virgules", + "searchConnectors.nativeConnectors.mysql.configuration.usernameLabel": "Nom d'utilisateur", + "searchConnectors.nativeConnectors.mysql.name": "MySQL", + "searchConnectors.nativeConnectors.nativeConnectors.maximumConcurrentLabel": "Téléchargement actuels maximaux", + "searchConnectors.nativeConnectors.networkDrive.ipAddressLabel": "Adresse IP", + "searchConnectors.nativeConnectors.networkDrive.name": "Lecteur réseau", + "searchConnectors.nativeConnectors.networkDrive.pathLabel": "Chemin", + "searchConnectors.nativeConnectors.networkDriveTooltip.name": "Lecteur réseau", + "searchConnectors.nativeConnectors.notion.databasesLabel": "Liste des bases de données", + "searchConnectors.nativeConnectors.notion.indexCommentsLabel": "Activer les commentaires d'indexation", + "searchConnectors.nativeConnectors.notion.indexCommentsTooltip": "Activer cette option augmentera le nombre d'appels réseau vers la source et peut diminuer les performances", + "searchConnectors.nativeConnectors.notion.name": "Notion", + "searchConnectors.nativeConnectors.notion.notionSecretKeyLabel": "Clé secrète Notion", + "searchConnectors.nativeConnectors.notion.pagesLabel": "Liste de pages", + "searchConnectors.nativeConnectors.oneDrive.azureClientId.label": "ID client application Azure", + "searchConnectors.nativeConnectors.oneDrive.azureClientSecret.label": "Identifiant client secret application Azure", + "searchConnectors.nativeConnectors.onedrive.name": "OneDrive", + "searchConnectors.nativeConnectors.oneDrive.tenantId.label": "ID locataire application Azure", + "searchConnectors.nativeConnectors.oneDriveTooltip.name": "OneDrive", + "searchConnectors.nativeConnectors.oracle.configuration.databaseLabel": "Base de données", + "searchConnectors.nativeConnectors.oracle.configuration.fetch_sizeLabel": "Lignes extraites par requête", + "searchConnectors.nativeConnectors.oracle.configuration.hostLabel": "Hôte", + "searchConnectors.nativeConnectors.oracle.configuration.oracle_homeLabel": "Chemin d'accès à la page d'accueil d'Oracle", + "searchConnectors.nativeConnectors.oracle.configuration.oracle_protocolLabel": "Protocole de connexion à Oracle", + "searchConnectors.nativeConnectors.oracle.configuration.passwordLabel": "Mot de passe", + "searchConnectors.nativeConnectors.oracle.configuration.portLabel": "Port", + "searchConnectors.nativeConnectors.oracle.configuration.retry_countLabel": "Nouvelles tentatives par requête", + "searchConnectors.nativeConnectors.oracle.configuration.tablesLabel": "Liste de tables séparées par des virgules", + "searchConnectors.nativeConnectors.oracle.configuration.usernameLabel": "Nom d'utilisateur", + "searchConnectors.nativeConnectors.oracle.configuration.wallet_configuration_pathLabel": "Chemin d'accès aux fichiers de configuration du portefeuille SSL", + "searchConnectors.nativeConnectors.oracle.name": "Oracle", + "searchConnectors.nativeConnectors.outlook.active_directory_server.label": "Serveur Active Directory", + "searchConnectors.nativeConnectors.outlook.active_directory_server.tooltip": "Adresse IP du serveur Active Directory. P. ex. 127.0.0.1", + "searchConnectors.nativeConnectors.outlook.client_id.label": "ID client", + "searchConnectors.nativeConnectors.outlook.client_secret.label": "Valeur de l'identifiant client secret", + "searchConnectors.nativeConnectors.outlook.data_source.label": "Source de données Outlook", + "searchConnectors.nativeConnectors.outlook.domain.label": "Nom de domaine du serveur Exchange", + "searchConnectors.nativeConnectors.outlook.domain.tooltip": "Nom de domaine, p. ex gmail.com ou outlook.com", + "searchConnectors.nativeConnectors.outlook.exchange_server.label": "Serveur Exchange", + "searchConnectors.nativeConnectors.outlook.exchange_server.tooltip": "Adresse IP du serveur Exchange. P. ex. 127.0.0.1", + "searchConnectors.nativeConnectors.outlook.name": "Outlook", + "searchConnectors.nativeConnectors.outlook.password.label": "Mot de passe du serveur Exchange", + "searchConnectors.nativeConnectors.outlook.ssl_ca.label": "Certificat SSL", + "searchConnectors.nativeConnectors.outlook.ssl_enabled.label": "Activer SSL", + "searchConnectors.nativeConnectors.outlook.tenant_id.label": "ID locataire", + "searchConnectors.nativeConnectors.outlook.use_text_extraction_service.label": "Utiliser un service d’extraction de texte", + "searchConnectors.nativeConnectors.outlook.use_text_extraction_service.toolip": "Nécessite un déploiement distinct du service d'extraction de texte d'Elastic. Nécessite que l'extraction de texte soit désactivée dans les paramètres du pipeline.", + "searchConnectors.nativeConnectors.outlook.username.label": "Nom d'utilisateur du serveur Exchange", + "searchConnectors.nativeConnectors.outlookTooltip.name": "Outlook", + "searchConnectors.nativeConnectors.passwordLabel": "Mot de passe", + "searchConnectors.nativeConnectors.portLabel": "Port", + "searchConnectors.nativeConnectors.postgresql.configuration.hostLabel": "Hôte", + "searchConnectors.nativeConnectors.postgresql.configuration.retriesLabel": "Nouvelles tentatives par requête", + "searchConnectors.nativeConnectors.postgresql.configuration.rowsFetchedLabel": "Lignes extraites par requête", + "searchConnectors.nativeConnectors.postgresql.configuration.tablesLabel": "Liste de tables séparées par des virgules", + "searchConnectors.nativeConnectors.postgresql.name": "PostgreSQL", + "searchConnectors.nativeConnectors.retriesPerRequest.label": "Nouvelles tentatives par requête", + "searchConnectors.nativeConnectors.salesforce.name": "Salesforce", + "searchConnectors.nativeConnectors.schemaLabel": "Schéma", + "searchConnectors.nativeConnectors.servicenow.configuration.useDocumentLevelSecurityTooltip": "La sécurité au niveau du document permet de conserver dans Elasticsearch les identités et autorisations paramétrées dans ServiceNow. Vous pouvez ainsi restreindre et personnaliser l'accès en lecture des utilisateurs et des groupes pour les documents dans cet index. La synchronisation de contrôle d'accès garantit que ces métadonnées sont correctement actualisées dans vos documents Elasticsearch.", + "searchConnectors.nativeConnectors.servicenow.name": "ServiceNow", + "searchConnectors.nativeConnectors.servicenow.password.label": "Mot de passe", + "searchConnectors.nativeConnectors.servicenow.services.label": "Liste des services séparés par des virgules", + "searchConnectors.nativeConnectors.servicenow.services.tooltip": "La liste des services est ignorée lorsque des règles de synchronisation avancées sont appliquées.", + "searchConnectors.nativeConnectors.servicenow.url.label": "URL des services", + "searchConnectors.nativeConnectors.servicenow.username.label": "Nom d'utilisateur", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.clientIdLabel": "ID client", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.enumerateAllSitesLabel": "Énumérer tous les sites ?", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.enumerateAllSitesTooltip": "Si cette fonctionnalité est activée, les sites seront recherchés en bloc, puis filtrés pour obtenir la liste de sites configurés. Cela est efficace pour synchroniser de nombreux sites. Si la fonctionnalité est désactivée, chaque site configuré sera recherché au moyen d'une requête individuelle. Cela est efficace pour synchroniser quelques sites.", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.fetchDriveItemPermissionsLabel": "Récupérer les autorisations d'un driveItem", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.fetchDriveItemPermissionsTooltip": "Activer cette option pour récupérer des autorisations spécifiques d'un driveItem. Ce paramètre est susceptible d'augmenter le délai de synchronisation.", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.fetchSubsitesLabel": "Rechercher les sous-sites des sites configurés ?", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.fetchSubsitesTooltip": "Si les sous-sites du ou des sites configurés doivent être automatiquement recherchés.", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.fetchUniqueListItemPermissionsLabel": "Récupérer les autorisations d'un élément de liste unique", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.fetchUniqueListItemPermissionsTooltip": "Activer cette option pour récupérer les autorisations d'un élément de liste unique. Ce paramètre est susceptible d'augmenter le délai de synchronisation. Si ce paramètre est désactivé, un élément de liste hérite des permissions de son site parent.", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.fetchUniqueListPermissionsLabel": "Récupérer les autorisations de liste unique", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.fetchUniqueListPermissionsTooltip": "Activer cette option pour récupérer les autorisations de liste unique. Ce paramètre est susceptible d'augmenter le délai de synchronisation. Si ce paramètre est désactivé, une liste hérite des permissions de son site parent.", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.fetchUniquePagePermissionsLabel": "Récupérer les autorisations de page unique", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.fetchUniquePagePermissionsTooltip": "Activer cette option pour récupérer les autorisations de page unique. Ce paramètre est susceptible d'augmenter le délai de synchronisation. Si ce paramètre est désactivé, une page hérite des permissions de son site parent.", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.secretValueLabel": "Valeur secrète", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.siteCollectionsLabel": "Liste de sites séparées par des virgules", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.siteCollectionsTooltip": "Une liste de sites séparés par des virgules dont les données doivent être ingérées. Utilisez \"*\" pour inclure tous les sites disponibles.", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.tenantIdLabel": "ID locataire", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.tenantNameLabel": "Nom du locataire", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.useDocumentLevelSecurityLabel": "Activer la sécurité au niveau du document", + "searchConnectors.nativeConnectors.sharepoint_online.configuration.useDocumentLevelSecurityTooltip": "La sécurité au niveau du document préserve dans Elasticsearch les identités et permissions paramétrées dans Sharepoint Online. Ces métadonnées sont ajoutées à votre document Elasticsearch afin que vous puissiez contrôler l'accès en lecture des utilisateurs et des groupes. La synchronisation de contrôle d'accès garantit que ces métadonnées sont correctement actualisées.", + "searchConnectors.nativeConnectors.sharepoint_online.name": "SharePoint en ligne", + "searchConnectors.nativeConnectors.sharepoint_server.configuration.fetchUniqueListItemPermissionsLabel": "Récupérer les autorisations d'un élément de liste unique", + "searchConnectors.nativeConnectors.sharepoint_server.configuration.fetchUniqueListItemPermissionsTooltip": "Activer cette option pour récupérer les autorisations d'un élément de liste unique. Ce paramètre est susceptible d'augmenter le délai de synchronisation. Si ce paramètre est désactivé, un élément de liste hérite des permissions de son site parent.", + "searchConnectors.nativeConnectors.sharepoint_server.configuration.fetchUniqueListPermissionsLabel": "Récupérer les autorisations de liste unique", + "searchConnectors.nativeConnectors.sharepoint_server.configuration.fetchUniqueListPermissionsTooltip": "Activer cette option pour récupérer les autorisations de liste unique. Ce paramètre est susceptible d'augmenter le délai de synchronisation. Si ce paramètre est désactivé, une liste hérite des permissions de son site parent.", + "searchConnectors.nativeConnectors.sharepoint_server.configuration.host": "Hôte SharePoint", + "searchConnectors.nativeConnectors.sharepoint_server.configuration.password": "Mot de passe du serveur SharePoint", + "searchConnectors.nativeConnectors.sharepoint_server.configuration.site_collections": "Liste de collections de sites SharePoint séparées par des virgules à indexer", + "searchConnectors.nativeConnectors.sharepoint_server.configuration.username": "Nom d'utilisateur du serveur SharePoint", + "searchConnectors.nativeConnectors.sharepoint_server.name": "Serveur SharePoint", + "searchConnectors.nativeConnectors.slack.autoJoinChannels.label": "Rejoindre automatiquement les canaux", + "searchConnectors.nativeConnectors.slack.autoJoinChannels.tooltip": "Le bot de l'application Slack pourra seulement lire l'historique des conversations des canaux qu'il a rejoints. L’option par défaut nécessite qu'il soit invité manuellement aux canaux. L'activation de cette option lui permet de s'inviter automatiquement sur tous les canaux publics.", + "searchConnectors.nativeConnectors.slack.fetchLastNDays.label": "Nombre de jours d'historique de messages à récupérer", + "searchConnectors.nativeConnectors.slack.fetchLastNDays.tooltip": "La date à laquelle il est nécessaire de remonter pour demander l'historique des messages à Slack. Les messages plus anciens ne seront pas indexés.", + "searchConnectors.nativeConnectors.slack.name": "Slack", + "searchConnectors.nativeConnectors.slack.syncUsers.label": "Synchroniser les utilisateurs", + "searchConnectors.nativeConnectors.slack.syncUsers.tooltip": "Cette option indique si les utilisateurs de Slack doivent ou non être indexés en tant que documents dans Elasticsearch.", + "searchConnectors.nativeConnectors.slack.token.label": "Jeton d'authentification", + "searchConnectors.nativeConnectors.slack.token.tooltip": "Le token d’authentification Slack pour l’application Slack que vous avez créée. Voir les documents pour plus de détails.", + "searchConnectors.nativeConnectors.sslCertificate.label": "Certificat SSL", + "searchConnectors.nativeConnectors.textExtractionService.label": "Utiliser un service d’extraction de texte", + "searchConnectors.nativeConnectors.textExtractionService.tooltip": "Nécessite un déploiement distinct du service d’extraction de données d’Elastic. Nécessite également que les paramètres de pipeline désactivent l’extraction de texte.", + "searchConnectors.nativeConnectors.usernameLabel": "Nom d'utilisateur", + "searchConnectors.nativeConnectors.zoom.accountId.label": "Identifiant de compte", + "searchConnectors.nativeConnectors.zoom.clientId.label": "ID client", + "searchConnectors.nativeConnectors.zoom.clientSecret.label": "Identifiant client secret", + "searchConnectors.nativeConnectors.zoom.fetchPastMeetingDetails.label": "Récupérer les détails des réunions antérieures", + "searchConnectors.nativeConnectors.zoom.fetchPastMeetingDetails.tooltip": "Activez cette option pour récupérer les détails des réunions antérieures. Ce paramètre est susceptible d'augmenter le délai de synchronisation.", + "searchConnectors.nativeConnectors.zoom.name": "Effectuer un zoom", + "searchConnectors.nativeConnectors.zoom.recordingAge.label": "Limite d'âge pour l'enregistrement (mois)", + "searchConnectors.nativeConnectors.zoom.recordingAge.tooltip": "La date à laquelle il est nécessaire de remonter pour demander des enregistrements à Zoom. Les enregistrements antérieurs à celui-ci ne seront pas indexés.", + "searchConnectors.searchIndices.addedDocs.columnTitle": "Documents insérés", + "searchConnectors.searchIndices.deletedDocs.columnTitle": "Documents supprimés", + "searchConnectors.searchIndices.identitySync.columnTitle": "Identités synchronisées", + "searchConnectors.searchIndices.syncJobType.columnTitle": "Type de synchronisation de contenu", + "searchConnectors.searchIndices.syncStatus.columnTitle": "Statut", + "searchConnectors.selectConnector.openPopoverLabel": "Ouvrir la fenêtre contextuelle de licence", + "searchConnectors.server.connectors.not_found_error": "Impossible de récupérer le connecteur créé", + "searchConnectors.server.connectors.scheduling.error": "Document introuvable", + "searchConnectors.syncJobs.cancelSyncModal.cancelButton": "Annuler", + "searchConnectors.syncJobs.cancelSyncModal.confirmButton": "Confirmer", + "searchConnectors.syncJobs.cancelSyncModal.description": "Êtes-vous sûrs de vouloir annuler cette tâche de synchronisation ?", + "searchConnectors.syncJobs.cancelSyncModal.syncJobId": "ID de tâche de synchronisation :", + "searchConnectors.syncJobs.cancelSyncModal.title": "Annuler la tâche de synchronisation", + "searchConnectors.syncJobs.flyout.canceledDescription": "Synchronisation annulée le {date}", + "searchConnectors.syncJobs.flyout.canceledTitle": "Synchronisation annulée", + "searchConnectors.syncJobs.flyout.completedDescription": "Terminé le {date}", + "searchConnectors.syncJobs.flyout.completedTitle": "Synchronisation terminée", + "searchConnectors.syncJobs.flyout.failureDescription": "Échec de la synchronisation : {error}.", + "searchConnectors.syncJobs.flyout.failureTitle": "Échec de la synchronisation", + "searchConnectors.syncJobs.flyout.inProgressDescription": "La synchronisation est en cours depuis {duration}.", + "searchConnectors.syncJobs.flyout.inProgressTitle": "En cours", + "searchConnectors.syncJobs.flyout.startedAtDescription": "Démarrée le {date}", + "searchConnectors.syncJobs.flyout.sync": "Sync", + "searchConnectors.syncJobs.flyout.sync.id": "ID", + "searchConnectors.syncJobs.flyout.sync.index": "Nom de l'index", + "searchConnectors.syncJobs.flyout.syncStartedManually": "Synchronisation démarrée manuellement", + "searchConnectors.syncJobs.flyout.syncStartedScheduled": "Synchronisation démarrée par planification", + "searchConnectors.syncJobs.flyout.title": "Log d'événements", + "searchConnectors.syncJobs.lastSync.columnTitle": "Dernière synchronisation", + "searchConnectors.syncJobs.lastSync.columnTitle.tooltip": "L'horodatage du {completed_at} d'une tâche donnée. Les synchronisations se terminent par un succès, une erreur, ou une annulation.", + "searchConnectors.syncJobs.syncDuration.columnTitle": "Durée de synchronisation", + "searchConnectors.syncJobs.syncDuration.columnTitle.tooltip": "Le temps passé entre les horodatages {started_at} et {completed_at} d'une synchronisation. N'inclut pas le temps passé à l'étage \"en attente\".", + "searchConnectors.syncJobType.full": "Contenu entier", + "searchConnectors.syncJobType.incremental": "Contenu progressif", + "searchConnectors.syncStatus.canceled": "Annulation de la synchronisation", + "searchConnectors.syncStatus.canceling": "Synchronisation annulée", + "searchConnectors.syncStatus.completed": "Synchronisation terminée", + "searchConnectors.syncStatus.error": "Échec de la synchronisation", + "searchConnectors.syncStatus.inProgress": "Synchronisation en cours", + "searchConnectors.syncStatus.pending": "Synchronisation en attente", + "searchConnectors.syncStatus.suspended": "Synchronisation suspendue", + "searchConnectorsPlugin.content.nativeConnectors.azureBlob.description": "Effectuez des recherches sur votre contenu sur Stockage Blob Azure.", + "searchConnectorsPlugin.content.nativeConnectors.azureBlob.name": "Stockage Blob Azure", + "searchConnectorsPlugin.content.nativeConnectors.box.description": "Effectuez des recherches sur votre contenu dans Box.", + "searchConnectorsPlugin.content.nativeConnectors.box.name": "Box", + "searchConnectorsPlugin.content.nativeConnectors.confluence_data_center.name": "Centre de données Confluence", + "searchConnectorsPlugin.content.nativeConnectors.confluence.description": "Effectuez des recherches sur votre contenu dans Confluence Cloud.", + "searchConnectorsPlugin.content.nativeConnectors.confluence.name": "Confluence Cloud & Server", + "searchConnectorsPlugin.content.nativeConnectors.confluenceDataCenter.description": "Effectuez des recherches sur votre contenu dans le centre de données Confluence.", + "searchConnectorsPlugin.content.nativeConnectors.customConnector.description": "Effectuez des recherches sur des données stockées dans des sources de données personnalisées.", + "searchConnectorsPlugin.content.nativeConnectors.customConnector.name": "Connecteur personnalisé", + "searchConnectorsPlugin.content.nativeConnectors.dropbox.description": "Effectuez des recherches dans vos fichiers et dossiers stockés sur Dropbox.", + "searchConnectorsPlugin.content.nativeConnectors.dropbox.name": "Dropbox", + "searchConnectorsPlugin.content.nativeConnectors.github.description": "Effectuez des recherches sur vos projets et référentiels sur GitHub.", + "searchConnectorsPlugin.content.nativeConnectors.github.name": "Serveurs GitHub & GitHub Enterprise", + "searchConnectorsPlugin.content.nativeConnectors.gmail.description": "Effectuez des recherches sur votre contenu dans Gmail.", + "searchConnectorsPlugin.content.nativeConnectors.gmail.name": "Gmail", + "searchConnectorsPlugin.content.nativeConnectors.googleCloud.description": "Effectuez des recherches sur votre contenu sur Google Cloud Storage.", + "searchConnectorsPlugin.content.nativeConnectors.googleCloud.name": "Google Cloud Storage", + "searchConnectorsPlugin.content.nativeConnectors.googleDrive.description": "Effectuez des recherches sur votre contenu sur Google Drive.", + "searchConnectorsPlugin.content.nativeConnectors.googleDrive.name": "Google Drive", + "searchConnectorsPlugin.content.nativeConnectors.graphQL.description": "Effectuez des recherches dans votre contenu avec GraphQL.", + "searchConnectorsPlugin.content.nativeConnectors.graphQL.name": "GraphQL", + "searchConnectorsPlugin.content.nativeConnectors.jira_data_center.name": "Centre de données Jira", + "searchConnectorsPlugin.content.nativeConnectors.jira.description": "Effectuez des recherches sur votre contenu dans Jira Cloud.", + "searchConnectorsPlugin.content.nativeConnectors.jira.name": "Jira Cloud", + "searchConnectorsPlugin.content.nativeConnectors.jiraDataCenter.description": "Effectuez des recherches sur votre contenu dans le centre de données Jira.", + "searchConnectorsPlugin.content.nativeConnectors.jiraServer.description": "Effectuez des recherches sur votre contenu dans le serveur Jira.", + "searchConnectorsPlugin.content.nativeConnectors.jiraServer.name": "Serveur Jira", + "searchConnectorsPlugin.content.nativeConnectors.microsoftSQL.name": "Microsoft SQL", + "searchConnectorsPlugin.content.nativeConnectors.mongoDB.description": "Effectuez des recherches sur votre contenu dans MongoDB.", + "searchConnectorsPlugin.content.nativeConnectors.mongodb.name": "MongoDB", + "searchConnectorsPlugin.content.nativeConnectors.msSql.description": "Effectuez des recherches sur votre contenu sur Microsoft SQL Server.", + "searchConnectorsPlugin.content.nativeConnectors.mysql.description": "Effectuez des recherches sur votre contenu dans MySQL.", + "searchConnectorsPlugin.content.nativeConnectors.mysql.name": "MySQL", + "searchConnectorsPlugin.content.nativeConnectors.netowkrDrive.description": "Effectuez des recherches sur le contenu de votre lecteur réseau.", + "searchConnectorsPlugin.content.nativeConnectors.networkDrive.name": "Lecteur réseau", + "searchConnectorsPlugin.content.nativeConnectors.notion.description": "Effectuez des recherches sur votre contenu dans Notion.", + "searchConnectorsPlugin.content.nativeConnectors.notion.name": "Notion", + "searchConnectorsPlugin.content.nativeConnectors.oneDrive.description": "Effectuez des recherches sur votre contenu dans OneDrive.", + "searchConnectorsPlugin.content.nativeConnectors.oneDrive.name": "OneDrive", + "searchConnectorsPlugin.content.nativeConnectors.openTextDocumentum.description": "Recherchez votre contenu sur OpenText Documentum.", + "searchConnectorsPlugin.content.nativeConnectors.openTextDocumentum.name": "OpenText Documentum", + "searchConnectorsPlugin.content.nativeConnectors.oracle.description": "Effectuez des recherches sur votre contenu dans Oracle.", + "searchConnectorsPlugin.content.nativeConnectors.oracle.name": "Oracle", + "searchConnectorsPlugin.content.nativeConnectors.outlook.description": "Effectuez des recherches sur votre contenu dans Outlook.", + "searchConnectorsPlugin.content.nativeConnectors.outlook.name": "Outlook", + "searchConnectorsPlugin.content.nativeConnectors.postgreSQL.description": "Effectuez des recherches sur votre contenu dans PostgreSQL.", + "searchConnectorsPlugin.content.nativeConnectors.postgresql.name": "PostgreSQL", + "searchConnectorsPlugin.content.nativeConnectors.redis.description": "Effectuez des recherches sur votre contenu dans Redis.", + "searchConnectorsPlugin.content.nativeConnectors.redis.name": "Redis", + "searchConnectorsPlugin.content.nativeConnectors.s3.description": "Effectuez des recherches sur votre contenu dans Amazon S3.", + "searchConnectorsPlugin.content.nativeConnectors.s3.name": "S3", + "searchConnectorsPlugin.content.nativeConnectors.salesforce.description": "Effectuez des recherches sur votre contenu dans Salesforce.", + "searchConnectorsPlugin.content.nativeConnectors.salesforce.name": "Salesforce", + "searchConnectorsPlugin.content.nativeConnectors.salesforceBox.name": "Sandbox Salesforce", + "searchConnectorsPlugin.content.nativeConnectors.salesforceSandbox.description": "Effectuez des recherches sur votre contenu dans Salesforce Sandbox.", + "searchConnectorsPlugin.content.nativeConnectors.serviceNow.description": "Effectuez des recherches sur votre contenu dans ServiceNow.", + "searchConnectorsPlugin.content.nativeConnectors.serviceNow.name": "ServiceNow", + "searchConnectorsPlugin.content.nativeConnectors.sharepointOnline.description": "Effectuez des recherches sur votre contenu dans SharePoint Online.", + "searchConnectorsPlugin.content.nativeConnectors.sharepointOnline.name": "SharePoint en ligne", + "searchConnectorsPlugin.content.nativeConnectors.sharepointServer.description": "Effectuez des recherches sur votre contenu dans Serveur SharePoint.", + "searchConnectorsPlugin.content.nativeConnectors.sharepointServer.name": "Serveur SharePoint", + "searchConnectorsPlugin.content.nativeConnectors.slack.description": "Effectuez des recherches sur votre contenu dans Slack.", + "searchConnectorsPlugin.content.nativeConnectors.slack.name": "Slack", + "searchConnectorsPlugin.content.nativeConnectors.teams.description": "Effectuez des recherches sur votre contenu dans Teams.", + "searchConnectorsPlugin.content.nativeConnectors.teams.name": "Équipes", + "searchConnectorsPlugin.content.nativeConnectors.zoom.description": "Effectuez des recherches sur votre contenu dans Zoom.", + "searchConnectorsPlugin.content.nativeConnectors.zoom.name": "Effectuer un zoom", + "searchErrors.errors.fetchError": "Vérifiez votre connexion réseau et réessayez.", + "searchErrors.esError.unknownRootCause": "inconnue", + "searchErrors.esError.viewDetailsButtonLabel": "Afficher les détails", + "searchErrors.painlessError.buttonTxt": "Modifier le script", + "searchErrors.painlessError.painlessScriptedFieldErrorMessage": "Erreur d'exécution du champ d'exécution ou du champ scripté sur la vue de données {indexPatternName}", + "searchErrors.search.esErrorTitle": "Impossible d’extraire les résultats de recherche", + "searchErrors.search.httpErrorTitle": "Impossible de se connecter au serveur Kibana", + "searchErrors.tsdbError.message": "Le champ {field} du type de série temporelle [compteur] a été utilisé avec une opération {op} non prise en charge.", + "searchErrors.tsdbError.tsdbCounterDocsLabel": "Pour en savoir plus sur les types de champs des séries temporelles et les agrégations compatibles [counter]", + "searchIndexDocuments.documentList.description": "Affichage de {results} sur {total}. Nombre maximal de résultats de recherche de {maximum} documents.", + "searchIndexDocuments.documentList.docsPerPage": "Nombre de documents par page déroulée", + "searchIndexDocuments.documentList.pagination.itemsPerPage": "Documents par page : {docPerPage}", + "searchIndexDocuments.documentList.paginationAriaLabel": "Pagination pour la liste de documents", + "searchIndexDocuments.documentList.paginationOptions.option": "{docCount} documents", + "searchIndexDocuments.documentList.resultLimit": "Seuls les {number} premiers résultats sont disponibles pour la pagination. Veuillez utiliser la barre de recherche pour filtrer vos résultats.", + "searchIndexDocuments.documentList.resultLimitTitle": "Les résultats sont limités à {number} documents", + "searchIndexDocuments.documents.searchField.placeholder": "Rechercher des documents dans cet index", + "searchIndexDocuments.documents.title": "Parcourir des documents", + "searchIndexDocuments.result.expandTooltip.allVisible": "Tous les champs sont visibles", + "searchIndexDocuments.result.expandTooltip.showFewer": "Afficher {amount} champs en moins", + "searchIndexDocuments.result.expandTooltip.showMore": "Afficher {amount} champs en plus", + "searchIndexDocuments.result.header.metadata.deleteDocument": "Supprimer le document", + "searchIndexDocuments.result.header.metadata.icon.ariaLabel": "Métadonnées pour le document : {id}", + "searchIndexDocuments.result.header.metadata.title": "Métadonnées du document", + "searchIndexDocuments.result.title.id": "ID de document : {id}", + "searchResponseWarnings.badgeButtonLabel": "{warningCount} {warningCount, plural, one {avertissement} other {avertissements}}", + "searchResponseWarnings.description.multipleClusters": "Ces clusters ont rencontré des problèmes lors du renvoi des données et les résultats pourraient être incomplets.", + "searchResponseWarnings.description.singleCluster": "Ce cluster a rencontré des problèmes lors du renvoi des données et les résultats pourraient être incomplets.", + "searchResponseWarnings.noResultsTitle": "Résultat introuvable", + "searchResponseWarnings.title.clustersClause": "Un problème est survenu avec {nonSuccessfulClustersCount} {nonSuccessfulClustersCount, plural, one {cluster} other {clusters}}", + "searchResponseWarnings.title.clustersClauseAndRequestsClause": "{clustersClause} pour {requestsCount} requêtes", + "searchResponseWarnings.viewDetailsButtonLabel": "Afficher les détails", + "securitySolutionPackages.alertSuppressionRuleDetails.upsell": "La suppression d'alertes est configurée mais elle ne sera pas appliquée en raison d'une licence insuffisante", + "securitySolutionPackages.alertSuppressionRuleForm.upsell": "La suppression d'alertes est activée avec la licence {requiredLicense} ou supérieure", + "securitySolutionPackages.beta.label": "Bêta", + "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.eventsTab.unit": "{totalCount, plural, =1 {alerte} other {alertes}}", + "securitySolutionPackages.dataTable.loadingEventsDataLabel": "Chargement des événements", + "securitySolutionPackages.dataTable.unit": "{totalCount, plural, =1 {alerte} other {alertes}}", + "securitySolutionPackages.ecsDataQualityDashboard.addToCaseSuccessToast": "Résultats de qualité des données ajoutés au cas", + "securitySolutionPackages.ecsDataQualityDashboard.addToNewCaseButton": "Ajouter au nouveau cas", + "securitySolutionPackages.ecsDataQualityDashboard.allTab.allFieldsTableTitle": "Tous les champs - {indexName}", + "securitySolutionPackages.ecsDataQualityDashboard.cancelButton": "Annuler", + "securitySolutionPackages.ecsDataQualityDashboard.checkAllButton": "Tout vérifier", + "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.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.coldPatternTooltip": "{indices} {indices, plural, =1 {L'index correspondant} other {Les index correspondants}} au modèle {pattern} {indices, plural, =1 {est} 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.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.createADataQualityCaseForIndexHeaderText": "Créer un cas de qualité des données pour l'index {indexName}", + "securitySolutionPackages.ecsDataQualityDashboard.createADataQualityCaseHeaderText": "Créer un cas de qualité des données", + "securitySolutionPackages.ecsDataQualityDashboard.customTab.customFieldsTableTitle": "Champs personnalisés - {indexName}", + "securitySolutionPackages.ecsDataQualityDashboard.customTab.ecsComplaintFieldsTableTitle": "Champs de plainte ECS - {indexName}", + "securitySolutionPackages.ecsDataQualityDashboard.dataQualityPromptContextPill": "Qualité des données ({indexName})", + "securitySolutionPackages.ecsDataQualityDashboard.dataQualityPromptContextPillTooltip": "Ajoutez ce rapport de Qualité des données comme contexte", + "securitySolutionPackages.ecsDataQualityDashboard.dataQualitySuggestedUserPrompt": "Expliquez les résultats ci-dessus et donnez des options pour résoudre les incompatibilités.", + "securitySolutionPackages.ecsDataQualityDashboard.defaultPanelTitle": "Vérifier les mappings d'index", + "securitySolutionPackages.ecsDataQualityDashboard.ecsVersionStat": "Version ECS", + "securitySolutionPackages.ecsDataQualityDashboard.emptyErrorPrompt.errorLoadingMappingsBody": "Un problème est survenu lors du chargement des mappings : {error}", + "securitySolutionPackages.ecsDataQualityDashboard.emptyErrorPrompt.errorLoadingMappingsTitle": "Impossible de charger les mappings d'index", + "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.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.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.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.viewErrorsButton": "Afficher les erreurs", + "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.frozenPatternTooltip": "{indices} {indices, plural, =1 {L'index correspondant} other {Les index correspondants}} au modèle {pattern} {indices, plural, =1 {est} 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.getResultErrorTitle": "Erreur lors de la lecture des résultats d'examen qualité des données sauvegardées", + "securitySolutionPackages.ecsDataQualityDashboard.hotDescription": "L'index est mis à jour et interrogé de façon active", + "securitySolutionPackages.ecsDataQualityDashboard.hotPatternTooltip": "{indices} {indices, plural, =1 {L'index correspondant} other {Les index correspondants}} au modèle {pattern} {indices, plural, =1 {est} other {sont}} \"hot\". Les index \"hot\" sont mis à jour et interrogés de façon active.", + "securitySolutionPackages.ecsDataQualityDashboard.ilmPhaseCold": "froid", + "securitySolutionPackages.ecsDataQualityDashboard.ilmPhaseFrozen": "frozen", + "securitySolutionPackages.ecsDataQualityDashboard.ilmPhaseHot": "hot", + "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.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.ilmPhaseUnmanaged": "non géré", + "securitySolutionPackages.ecsDataQualityDashboard.ilmPhaseWarm": "warm", + "securitySolutionPackages.ecsDataQualityDashboard.incompatibleTab.incompatibleFieldMappingsTableTitle": "Mappings de champ incompatibles – {indexName}", + "securitySolutionPackages.ecsDataQualityDashboard.incompatibleTab.incompatibleFieldValuesTableTitle": "Valeurs de champ incompatibles – {indexName}", + "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.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.allCalloutEmptyContent": "Cet index ne contient aucun mapping", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.allCalloutEmptyTitle": "Aucun mapping", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.allCalloutTitle": "L'ensemble {fieldCount} {fieldCount, plural, =1 {du mapping de champs} other {des mappings de champs}}", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.allFieldsLabel": "Tous les champs", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.copyToClipboardButton": "Copier dans le presse-papiers", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.customCallout": "{fieldCount, plural, =1 {Ce champ n'est pas défini} other {Ces champs ne sont pas définis}} par la version {version} d'Elastic Common Schema (ECS).", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.customCalloutTitle": "{fieldCount} {fieldCount, plural, =1 {Mapping de champs personnalisé} other {Mappings de champ personnalisés}}", + "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.ecsCompliantCallout": "{fieldCount, plural, =1 {Le type de mapping d'index et les valeurs de document de ce champ sont conformes} other {Les types de mapping d'index et les valeurs de document de ces champs sont conformes}} à la version {version} d'Elastic Common Schema (ECS)", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.ecsCompliantCalloutTitle": "{fieldCount} {fieldCount, plural, =1 {Champ conforme} other {Champs conformes}} à ECS", + "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": "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.incompatibleCallout.fieldsWithMappingsSameFamilyLabel": "Les champs avec des mappings dans la même famille ont exactement le même comportement de recherche que le type défini par ECS, mais ils peuvent avoir une utilisation de l'espace différente ou différentes caractéristiques de performances.", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.incompatibleCallout.whenAFieldIsIncompatibleLabel": "Lorsqu'un champ est incompatible :", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.incompatibleCalloutTitle": "{fieldCount} {fieldCount, plural, =1 {Champ incompatible} other {Champs incompatibles}}", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.incompatibleEmptyContent": "Tous les mappings de champs et toutes les valeurs de documents de cet index sont conformes à Elastic Common Schema (ECS).", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.incompatibleEmptyTitle": "Toutes les valeurs et tous les mappings de champs sont conformes à ECS", + "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.sameFamilyCallout": "{fieldCount, plural, =1 {Ce champ est défini} other {Ces champs sont définis}} par Elastic Common Schema (ECS), version {version}, mais {fieldCount, plural, =1 {son type de mapping de ne correspond} other {leurs types de mapping ne correspondent}} pas exactement.", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.sameFamilyCalloutTitle": "{fieldCount} {fieldCount, plural, =1 {Mapping de champs} other {Mappings de champ}} de même famille", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.sameFamilyEmptyContent": "Tous les mappings de champs et toutes les valeurs de documents de cet index sont conformes à Elastic Common Schema (ECS).", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.sameFamilyEmptyTitle": "Toutes les valeurs et tous les mappings de champs sont conformes à ECS", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.sameFamilyTab": "Même famille", + "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.summaryMarkdownDescription": "L'index `{indexName}` a des [mappings]({mappingUrl}) ou des valeurs de champ différentes de l'[Elastic Common Schema]({ecsReferenceUrl}) (ECS), [définitions]({ecsFieldReferenceUrl}).de version `{version}`.", + "securitySolutionPackages.ecsDataQualityDashboard.indexProperties.summaryMarkdownTitle": "Qualité des données", + "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.patternSummary.docsLabel": "Documents", + "securitySolutionPackages.ecsDataQualityDashboard.patternSummary.indicesLabel": "Index", + "securitySolutionPackages.ecsDataQualityDashboard.patternSummary.patternOrIndexTooltip": "Modèle, ou index spécifique", + "securitySolutionPackages.ecsDataQualityDashboard.postResultErrorTitle": "Erreur lors de l'écriture des résultats d'examen qualité des données sauvegardées", + "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.sameFamilyTab.sameFamilyFieldMappingsTableTitle": "Mêmes familles de mappings de champ – {indexName}", + "securitySolutionPackages.ecsDataQualityDashboard.securitySolutionPackages.ecsDataQualityDashboardSubtitle": "Vérifiez la compatibilité des mappings et des valeurs d'index avec", + "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.docsLabel": "Documents", + "securitySolutionPackages.ecsDataQualityDashboard.statLabels.indicesLabel": "Index", + "securitySolutionPackages.ecsDataQualityDashboard.statLabels.sameFamilyLabel": "Même famille", + "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.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.storage.docs.unit": "{totalCount, plural, =1 {Document} other {Documents}}", + "securitySolutionPackages.ecsDataQualityDashboard.storageTreemap.noDataLabel": "Aucune donnée à afficher", + "securitySolutionPackages.ecsDataQualityDashboard.storageTreemap.noDataReasonLabel": "Le champ {stackByField1} n'était présent dans aucun groupe", + "securitySolutionPackages.ecsDataQualityDashboard.summaryTable.collapseLabel": "Réduire", + "securitySolutionPackages.ecsDataQualityDashboard.summaryTable.expandRowsColumn": "Développer les lignes", + "securitySolutionPackages.ecsDataQualityDashboard.summaryTable.indexesNameLabel": "Nom de l'index", + "securitySolutionPackages.ecsDataQualityDashboard.summaryTable.indexToolTip": "Cet index correspond au nom d'index ou de modèle : {pattern}", + "securitySolutionPackages.ecsDataQualityDashboard.summaryTable.lastCheckColumn": "Dernière vérification", + "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.unmanagedPatternTooltip": "{indices} {indices, plural, =1 {L'index correspondant} other {Les index correspondants}} au modèle {pattern} {indices, plural, =1 {n'est pas géré} other {ne sont pas gérés}} 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.ecsDataQualityDashboard.warmPatternTooltip": "{indices} {indices, plural, =1 {L'index correspondant} other {Les index correspondants}} au modèle {pattern} {indices, plural, =1 {est} other {sont}} \"warm\". Les index \"warm\" ne sont plus mis à jour, mais ils sont toujours interrogés.", + "securitySolutionPackages.entityAnalytics.navigation": "Analyse des entités", + "securitySolutionPackages.entityAnalytics.pageDesc": "Détecter les menaces des utilisateurs et des hôtes de votre réseau avec l'Analyse des entités", + "securitySolutionPackages.entityAnalytics.paywall.upgradeButton": "Passer à {requiredLicenseOrProduct}", + "securitySolutionPackages.features.featureRegistry.assistant.updateAnonymizationSubFeatureDetails": "Autoriser les modifications", + "securitySolutionPackages.features.featureRegistry.assistant.updateAnonymizationSubFeatureName": "Sélection et Anonymisation de champ", + "securitySolutionPackages.features.featureRegistry.casesSettingsSubFeatureDetails": "Modifier les paramètres du cas", + "securitySolutionPackages.features.featureRegistry.casesSettingsSubFeatureName": "Paramètres du cas", + "securitySolutionPackages.features.featureRegistry.deleteSubFeatureDetails": "Supprimer les cas et les commentaires", + "securitySolutionPackages.features.featureRegistry.deleteSubFeatureName": "Supprimer", + "securitySolutionPackages.features.featureRegistry.linkSecuritySolutionAssistantTitle": "Assistant d’intelligence artificielle d’Elastic", + "securitySolutionPackages.features.featureRegistry.linkSecuritySolutionCaseTitle": "Cas", + "securitySolutionPackages.features.featureRegistry.linkSecuritySolutionTitle": "Sécurité", + "securitySolutionPackages.features.featureRegistry.subFeatures.assistant.description": "Modifiez les champs par défaut autorisés à être utilisés par l'assistant IA et Attack discovery. Anonymisez n'importe quel contenu pour les champs sélectionnés.", + "securitySolutionPackages.features.featureRegistry.subFeatures.blockList": "Liste noire", + "securitySolutionPackages.features.featureRegistry.subFeatures.blockList.description": "Étendez la protection d'Elastic Defend contre les processus malveillants et protégez-vous des applications potentiellement nuisibles.", + "securitySolutionPackages.features.featureRegistry.subFeatures.blockList.privilegesTooltip": "\"Tous les espaces\" est requis pour l'accès à la liste noire.", + "securitySolutionPackages.features.featureRegistry.subFeatures.endpointExceptions": "Exceptions de point de terminaison", + "securitySolutionPackages.features.featureRegistry.subFeatures.endpointExceptions.description": "Utiliser les exceptions de point de terminaison (il s'agit d'une sous-fonctionnalité test).", + "securitySolutionPackages.features.featureRegistry.subFeatures.endpointExceptions.privilegesTooltip": "\"Tous les espaces\" est requis pour l'accès aux exceptions de points de terminaison.", + "securitySolutionPackages.features.featureRegistry.subFeatures.endpointList": "Liste de points de terminaison", + "securitySolutionPackages.features.featureRegistry.subFeatures.endpointList.description": "Affiche tous les hôtes exécutant Elastic Defend et leurs détails d'intégration associés.", + "securitySolutionPackages.features.featureRegistry.subFeatures.endpointList.privilegesTooltip": "\"Tous les espaces\" est requis pour l'accès à la liste de points de terminaison.", + "securitySolutionPackages.features.featureRegistry.subFeatures.eventFilters": "Filtres d'événements", + "securitySolutionPackages.features.featureRegistry.subFeatures.eventFilters.description": "Excluez les événements de point de terminaison dont vous n'avez pas besoin ou que vous ne souhaitez pas stocker dans Elasticsearch.", + "securitySolutionPackages.features.featureRegistry.subFeatures.eventFilters.privilegesTooltip": "\"Tous les espaces\" est requis pour l'accès aux filtres d'événements.", + "securitySolutionPackages.features.featureRegistry.subFeatures.executeOperations": "Exécuter les opérations", + "securitySolutionPackages.features.featureRegistry.subFeatures.executeOperations.description": "Effectuez les actions de réponse d'exécution de script dans la console de réponse.", + "securitySolutionPackages.features.featureRegistry.subFeatures.executeOperations.privilegesTooltip": "\"Tous les espaces\" est requis pour l'accès aux opérations d'exécution.", + "securitySolutionPackages.features.featureRegistry.subFeatures.fileOperations": "Opérations de fichier", + "securitySolutionPackages.features.featureRegistry.subFeatures.fileOperations.description": "Effectuez les actions de réponse liées aux fichiers dans la console de réponse.", + "securitySolutionPackages.features.featureRegistry.subFeatures.fileOperations.privilegesTooltip": "\"Tous les espaces\" est requis pour l'accès aux opérations de fichier.", + "securitySolutionPackages.features.featureRegistry.subFeatures.hostIsolation": "Isolation de l'hôte", + "securitySolutionPackages.features.featureRegistry.subFeatures.hostIsolation.description": "Effectuez les actions de réponse \"isoler\" et \"libérer\".", + "securitySolutionPackages.features.featureRegistry.subFeatures.hostIsolation.privilegesTooltip": "\"Tous les espaces\" est requis pour l'accès à l'isolation de l'hôte.", + "securitySolutionPackages.features.featureRegistry.subFeatures.hostIsolationExceptions": "Exceptions d'isolation de l'hôte", + "securitySolutionPackages.features.featureRegistry.subFeatures.hostIsolationExceptions.description": "Ajoutez des adresses IP spécifiques avec lesquelles les hôtes isolés sont toujours autorisés à communiquer, même lorsqu'ils sont isolés du reste du réseau.", + "securitySolutionPackages.features.featureRegistry.subFeatures.hostIsolationExceptions.privilegesTooltip": "\"Tous les espaces\" est requis pour l'accès aux exceptions d'isolation de l'hôte.", + "securitySolutionPackages.features.featureRegistry.subFeatures.policyManagement": "Gestion des politiques Elastic Defend", + "securitySolutionPackages.features.featureRegistry.subFeatures.policyManagement.description": "Accédez à la politique d'intégration Elastic Defend pour configurer les protections, la collecte des événements et les fonctionnalités de politique avancées.", + "securitySolutionPackages.features.featureRegistry.subFeatures.policyManagement.privilegesTooltip": "\"Tous les espaces\" est requis pour l'accès à la gestion des politiques.", + "securitySolutionPackages.features.featureRegistry.subFeatures.processOperations": "Opérations de traitement", + "securitySolutionPackages.features.featureRegistry.subFeatures.processOperations.description": "Effectuez les actions de réponse liées aux processus dans la console de réponse.", + "securitySolutionPackages.features.featureRegistry.subFeatures.processOperations.privilegesTooltip": "\"Tous les espaces\" est requis pour l'accès aux opérations de traitement.", + "securitySolutionPackages.features.featureRegistry.subFeatures.responseActionsHistory": "Historique des actions de réponse", + "securitySolutionPackages.features.featureRegistry.subFeatures.responseActionsHistory.description": "Accédez à l'historique des actions de réponse effectuées sur les points de terminaison.", + "securitySolutionPackages.features.featureRegistry.subFeatures.responseActionsHistory.privilegesTooltip": "\"Tous les espaces\" est requis pour l'accès à l'historique des actions de réponse.", + "securitySolutionPackages.features.featureRegistry.subFeatures.scanOperations": "Opérations d’analyse", + "securitySolutionPackages.features.featureRegistry.subFeatures.scanOperations.description": "Effectuez les actions de réponse liées aux analyses de dossiers dans la console de réponse.", + "securitySolutionPackages.features.featureRegistry.subFeatures.scanOperations.privilegesTooltip": "Tous les espaces est requis pour l'accès aux opérations d’analyse.", + "securitySolutionPackages.features.featureRegistry.subFeatures.trustedApplications": "Applications de confiance", + "securitySolutionPackages.features.featureRegistry.subFeatures.trustedApplications.description": "Aide à atténuer les conflits avec d'autres logiciels, généralement d'autres applications d'antivirus ou de sécurité des points de terminaison.", + "securitySolutionPackages.features.featureRegistry.subFeatures.trustedApplications.privilegesTooltip": "\"Tous les espaces\" est requis pour l'accès aux applications de confiance.", + "securitySolutionPackages.flyout.right.header.collapseDetailButtonAriaLabel": "Réduire les détails", + "securitySolutionPackages.flyout.right.header.collapseDetailButtonLabel": "Réduire les détails", + "securitySolutionPackages.flyout.right.header.expandDetailButtonAriaLabel": "Développer les détails", + "securitySolutionPackages.flyout.right.header.expandDetailButtonLabel": "Développer les détails", + "securitySolutionPackages.flyout.shared.errorDescription": "Une erreur est survenue lors de l'affichage de {message}.", + "securitySolutionPackages.flyout.shared.errorTitle": "Impossible d'afficher {title}.", + "securitySolutionPackages.flyout.shared.ExpandablePanelButtonIconAriaLabel": "Activer/Désactiver le panneau extensible", + "securitySolutionPackages.flyout.shared.expandablePanelLoadingAriaLabel": "panneau extensible", + "securitySolutionPackages.markdown.insight.upsell": "Passez au niveau {requiredLicense} pour pouvoir utiliser les informations des guides d'investigation", + "securitySolutionPackages.markdown.investigationGuideInteractions.upsell": "Passez au niveau {requiredLicense} pour pouvoir utiliser les interactions des guides d'investigation", + "securitySolutionPackages.navigation.landingLinks": "Vues de sécurité", + "securitySolutionPackages.sideNav.betaBadge.label": "Bêta", + "securitySolutionPackages.sideNav.togglePanel": "Activer/Désactiver le panneau de navigation", + "share.advancedSettings.csv.quoteValuesText": "Les valeurs doivent-elles être mises entre guillemets dans les exportations CSV ?", + "share.advancedSettings.csv.quoteValuesTitle": "Mettre les valeurs CSV entre guillemets", + "share.advancedSettings.csv.separatorText": "Séparer les valeurs exportées avec cette chaîne", + "share.advancedSettings.csv.separatorTitle": "Séparateur CSV", + "share.contextMenu.embedCodeLabel": "Incorporer le code", + "share.contextMenu.embedCodePanelTitle": "Incorporer le code", + "share.contextMenu.embedCodeTab": "Intégrer", + "share.contextMenu.exportCodeTab": "Exporter", + "share.contextMenu.permalinkPanelTitle": "Obtenir le lien", + "share.contextMenu.permalinksLabel": "Obtenir les liens", + "share.contextMenu.permalinksTab": "Liens", + "share.contextMenuTitle": "Partager ce {objectType}", + "share.dashboard.link.description": "Partagez un lien direct avec cette recherche.", + "share.embed.dashboard.helpText": "Intégrez ce tableau de bord dans une autre page web. Sélectionnez les éléments à inclure dans la vue intégrable.", + "share.embed.helpText": "Intégrez ce {objectType} dans une autre page web.", + "share.fileType": "Type de fichier", + "share.link.copied": "Texte copié", + "share.link.copyEmbedCodeButton": "Copier le code intégré", + "share.link.copyLinkButton": "Copier le lien", + "share.link.helpText": "Partager un lien direct vers ce {objectType}.", + "share.link.warning.lens": "Copiez le lien afin d’obtenir un lien temporaire. Enregistrez la visualisation Lens pour créer un lien permanent.", + "share.link.warning.title": "Modifications non enregistrées", + "share.modalContent.copyUrlButtonLabel": "Copier l'URL Post", + "share.postURLWatcherMessage": "Copiez cette URL POST pour appeler la génération depuis l'extérieur de Kibana ou à partir de Watcher.", + "share.postURLWatcherMessage.unsavedChanges": "L'URL peut changer si vous mettez Kibana à niveau.", + "share.screenCapturePanelContent.optimizeForPrintingHelpText": "Utilise plusieurs pages, affichant au maximum 2 visualisations par page ", + "share.screenCapturePanelContent.optimizeForPrintingLabel": "Pour l'impression", + "share.urlPanel.canNotShareAsSavedObjectHelpText": "Pour le partager comme objet enregistré, enregistrez le {objectType}.", + "share.urlPanel.copyIframeCodeButtonLabel": "Copier le code iFrame", + "share.urlPanel.copyLinkButtonLabel": "Copier le lien", + "share.urlPanel.generateLinkAsLabel": "Générer le lien en tant que", + "share.urlPanel.publicUrlHelpText": "Utilisez l'URL publique pour partager avec tout le monde. Elle permet un accès anonyme en une étape, en supprimant l'invite de connexion.", + "share.urlPanel.publicUrlLabel": "URL publique", + "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}.", + "share.urlPanel.savedObjectLabel": "Objet enregistré", + "share.urlPanel.shortUrlHelpText": "Nous vous recommandons de partager des URL de snapshot raccourcies pour une compatibilité maximale. Internet Explorer présente des restrictions de longueur d'URL et certains analyseurs de wiki et de balisage ne fonctionnent pas bien avec les URL de snapshot longues, mais les URL courtes devraient bien fonctionner.", + "share.urlPanel.shortUrlLabel": "URL courte", + "share.urlPanel.snapshotDescription": "Les URL de snapshot encodent l'état actuel de {objectType} dans l'URL elle-même. Les modifications apportées au {objectType} enregistré ne seront pas visibles via cette URL.", + "share.urlPanel.snapshotLabel": "Snapshot", + "share.urlPanel.unableCreateShortUrlErrorMessage": "Impossible de créer une URL courte. Erreur : {errorMessage}.", + "share.urlPanel.urlGroupTitle": "URL", + "share.urlService.redirect.components.docTitle": "Introuvable", + "share.urlService.redirect.components.Error.body": "Désolé, l'objet que vous recherchez est introuvable à cet URL. Il a peut-être été supprimé ou renommé, ou peut-être qu'il n'a jamais existé.", + "share.urlService.redirect.components.Error.homeButton": "Retour à l'accueil", + "share.urlService.redirect.components.Error.title": "Impossible d'ouvrir l'URL", + "share.urlService.redirect.components.Spinner.label": "Redirection…", + "share.urlService.redirect.RedirectManager.invalidParamParams": "Impossible d'analyser les paramètres du localisateur. Les paramètres du localisateur doivent être sérialisés en tant que JSON et définis au paramètre de recherche d'URL \"p\".", + "share.urlService.redirect.RedirectManager.locatorNotFound": "Le localisateur [ID = {id}] n'existe pas.", + "share.urlService.redirect.RedirectManager.missingParamLocator": "ID du localisateur non spécifié. Spécifiez le paramètre de recherche \"l\" dans l'URL ; ce devrait être un ID de localisateur existant.", + "share.urlService.redirect.RedirectManager.missingParamParams": "Paramètres du localisateur non spécifiés. Spécifiez le paramètre de recherche \"p\" dans l'URL ; ce devrait être un objet sérialisé JSON des paramètres du localisateur.", + "share.urlService.redirect.RedirectManager.missingParamVersion": "Version des paramètres du localisateur non spécifiée. Spécifiez le paramètre de recherche \"v\" dans l'URL ; ce devrait être la version de Kibana au moment de la génération des paramètres du localisateur.", + "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.", + "sharedUXPackages.card.noData.noPermission.description": "Cette intégration n'est pas encore activée. Votre administrateur possède les autorisations requises pour l'activer.", + "sharedUXPackages.card.noData.noPermission.title": "Contactez votre administrateur", + "sharedUXPackages.card.noData.title": "Ajouter Elastic Agent", + "sharedUXPackages.chrome.sideNavigation.betaBadge.label": "Bêta", + "sharedUXPackages.chrome.sideNavigation.recentlyAccessed.title": "Récent", + "sharedUXPackages.chrome.sideNavigation.togglePanel": "Afficher/Masquer le panneau de navigation \"{title}\"", + "sharedUXPackages.codeEditor.ariaLabel": "Éditeur de code", + "sharedUXPackages.codeEditor.enterKeyLabel": "Entrée", + "sharedUXPackages.codeEditor.escapeKeyLabel": "Échap", + "sharedUXPackages.codeEditor.readOnlyMessage": "Modification impossible dans l'éditeur en lecture seule", + "sharedUXPackages.codeEditor.startEditing": "Appuyez sur {key} pour modifier.", + "sharedUXPackages.codeEditor.startEditingReadOnly": "Appuyez sur {key} pour interagir avec le code.", + "sharedUXPackages.codeEditor.stopEditing": "Appuyez sur {key} pour arrêter la modification.", + "sharedUXPackages.codeEditor.stopEditingReadOnly": "Appuyez sur {key} pour arrêter l'interaction.", + "sharedUXPackages.error_boundary.fatal.prompt.body": "Essayez d'actualiser la page pour résoudre le problème.", + "sharedUXPackages.error_boundary.fatal.prompt.detailButton": "Afficher les détails", + "sharedUXPackages.error_boundary.fatal.prompt.details": "L'erreur ci-dessus a eu lieu dans {name} :", + "sharedUXPackages.error_boundary.fatal.prompt.details.close": "Fermer", + "sharedUXPackages.error_boundary.fatal.prompt.details.copyToClipboard": "Copier l'erreur dans le presse-papiers", + "sharedUXPackages.error_boundary.fatal.prompt.details.title": "Détails de l'erreur", + "sharedUXPackages.error_boundary.fatal.prompt.pageReloadButton": "Actualiser la page", + "sharedUXPackages.error_boundary.fatal.prompt.title": "Impossible de charger la page", + "sharedUXPackages.error_boundary.recoverable.prompt.body": "Cela devrait résoudre les problèmes de chargement de la page.", + "sharedUXPackages.error_boundary.recoverable.prompt.pageReloadButton": "Actualiser la page", + "sharedUXPackages.error_boundary.recoverable.prompt.title": "Actualiser la page", + "sharedUXPackages.exitFullScreenButton.exitFullScreenModeButtonText": "Quitter le plein écran", + "sharedUXPackages.exitFullScreenButton.fullScreenModeDescription": "En mode Plein écran, appuyez sur Échap pour quitter.", + "sharedUXPackages.filePicker.cancel": "Annuler", + "sharedUXPackages.filePicker.clearFilterButtonLabel": "Effacer le filtre", + "sharedUXPackages.filePicker.delete": "Supprimer", + "sharedUXPackages.filePicker.deleteFile": "Supprimer le fichier", + "sharedUXPackages.filePicker.deleteFileQuestion": "Voulez-vous vraiment supprimer \"{fileName}\" ?", + "sharedUXPackages.filePicker.emptyGridPrompt": "Aucun fichier ne correspond à votre filtre", + "sharedUXPackages.filePicker.emptyStatePromptTitle": "Charger votre premier fichier", + "sharedUXPackages.filePicker.error.loadingTitle": "Impossible de charger les fichiers", + "sharedUXPackages.filePicker.error.retryButtonLabel": "Réessayer", + "sharedUXPackages.filePicker.loadMoreButtonLabel": "Charger plus", + "sharedUXPackages.filePicker.searchFieldPlaceholder": "my-file-*", + "sharedUXPackages.filePicker.selectFileButtonLable": "Sélectionner un fichier", + "sharedUXPackages.filePicker.selectFilesButtonLable": "Sélectionner {nrOfFiles} fichiers", + "sharedUXPackages.filePicker.title": "Sélectionner un fichier", + "sharedUXPackages.filePicker.titleMultiple": "Sélectionner des fichiers", + "sharedUXPackages.filePicker.uploadFilePlaceholderText": "Glisser-déposer pour charger de nouveaux fichiers", + "sharedUXPackages.fileUpload.cancelButtonLabel": "Annuler", + "sharedUXPackages.fileUpload.clearButtonLabel": "Effacer", + "sharedUXPackages.fileUpload.defaultFilePickerLabel": "Charger un fichier", + "sharedUXPackages.fileUpload.fileTooLargeErrorMessage": "Le fichier est trop volumineux. La taille maximale est de {expectedSize, plural, one {# octet} other {# octets} }.", + "sharedUXPackages.fileUpload.mimeTypeNotSupportedErrorMessage": "Le type de fichier mime \"{mimeType}\" n'est pas pris en charge. Les types de fichiers mime pris en charge sont : {supportedMimeTypes}.", + "sharedUXPackages.fileUpload.retryButtonLabel": "Réessayer", + "sharedUXPackages.fileUpload.uploadButtonLabel": "Charger", + "sharedUXPackages.fileUpload.uploadCompleteButtonLabel": "Chargement terminé", + "sharedUXPackages.fileUpload.uploadDoneToolTipContent": "Votre fichier a bien été chargé !", + "sharedUXPackages.fileUpload.uploadingButtonLabel": "Chargement", + "sharedUXPackages.no_data_views.esqlButtonLabel": "Langue : ES|QL", + "sharedUXPackages.no_data_views.esqlDocsLink": "En savoir plus.", + "sharedUXPackages.no_data_views.esqlMessage": "Vous pouvez aussi rechercher vos données en utilisant directement ES|QL. {docsLink}", + "sharedUXPackages.noDataConfig.addIntegrationsDescription": "Utilisez Elastic Agent pour collecter des données et créer des solutions Analytics.", + "sharedUXPackages.noDataConfig.addIntegrationsTitle": "Ajouter des intégrations", + "sharedUXPackages.noDataConfig.analytics": "Analyse", + "sharedUXPackages.noDataConfig.analyticsPageTitle": "Bienvenue dans Analytics !", + "sharedUXPackages.noDataConfig.elasticsearch": "Elasticsearch", + "sharedUXPackages.noDataConfig.elasticsearchDescription": "Configurez votre client de langage de programmation, ingérez des données et lancez vos recherches.", + "sharedUXPackages.noDataConfig.elasticsearchPageTitle": "Bienvenue dans Elasticsearch !", + "sharedUXPackages.noDataConfig.elasticsearchTitle": "Ajouter des données", + "sharedUXPackages.noDataConfig.observability": "Observabilité", + "sharedUXPackages.noDataConfig.observabilityDescription": "Commencez par collecter les données en utilisant une de nos nombreuses intégrations.", + "sharedUXPackages.noDataConfig.observabilityPageDescription": "Combinez les indicateurs, les logs et les traces pour surveiller la santé de vos applications.", + "sharedUXPackages.noDataConfig.observabilityPageTitle": "Bienvenue dans Elastic Observability !", + "sharedUXPackages.noDataConfig.observabilityTitle": "Ajouter des données", + "sharedUXPackages.noDataPage.intro": "Ajoutez vos données pour commencer, ou {link} sur {solution}.", + "sharedUXPackages.noDataPage.intro.link": "en savoir plus", + "sharedUXPackages.noDataPage.introNoDocLink": "Ajoutez vos données pour commencer.", + "sharedUXPackages.noDataPage.welcomeTitle": "Bienvenue dans Elastic {solution}.", + "sharedUXPackages.noDataViewsPrompt.addDataViewText": "Créer une vue de données", + "sharedUXPackages.noDataViewsPrompt.dataViewExplanation": "Les vues de données identifient les données Elasticsearch que vous souhaitez explorer. Vous pouvez faire pointer des vues de données vers un ou plusieurs flux de données, index et alias d'index, tels que vos données de log d'hier, ou vers tous les index contenant vos données de log.", + "sharedUXPackages.noDataViewsPrompt.learnMore": "Envie d'en savoir plus ?", + "sharedUXPackages.noDataViewsPrompt.noPermission.dataViewExplanation": "Les vues de données identifient les données Elasticsearch que vous souhaitez explorer. Pour créer des vues de données, demandez les autorisations requises à votre administrateur.", + "sharedUXPackages.noDataViewsPrompt.noPermission.title": "Vous devez disposer d'une autorisation pour pouvoir créer des vues de données", + "sharedUXPackages.noDataViewsPrompt.nowCreate": "Créez à présent une vue de données.", + "sharedUXPackages.noDataViewsPrompt.readDocumentation": "Lisez les documents", + "sharedUXPackages.noDataViewsPrompt.youHaveData": "Vous avez des données dans Elasticsearch.", + "sharedUXPackages.prompt.errors.notFound.body": "Désolé, la page que vous recherchez est introuvable. Elle a peut-être été retirée ou renommée, ou peut-être qu'elle n'a jamais existé.", + "sharedUXPackages.prompt.errors.notFound.goBacklabel": "Retour", + "sharedUXPackages.prompt.errors.notFound.title": "Page introuvable", + "sharedUXPackages.solutionNav.collapsibleLabel": "Réduire la navigation latérale", + "sharedUXPackages.solutionNav.menuText": "menu", + "sharedUXPackages.solutionNav.mobileTitleText": "{solutionName} {menuText}", + "sharedUXPackages.solutionNav.openLabel": "Ouvrir la navigation latérale", + "telemetry.callout.appliesSettingTitle": "Les modifications apportées à ce paramètre s'appliquent dans {allOfKibanaText} et sont enregistrées automatiquement.", + "telemetry.callout.appliesSettingTitle.allOfKibanaText": "tout Kibana", + "telemetry.callout.clusterStatisticsDescription": "Voici un exemple des statistiques de cluster de base que nous collecterons. Cela comprend le nombre d'index, de partitions et de nœuds. Cela comprend également des statistiques d'utilisation de niveau élevé, comme l'état d'activation du monitoring.", + "telemetry.callout.clusterStatisticsTitle": "Statistiques du cluster", + "telemetry.callout.errorLoadingClusterStatisticsDescription": "Une erreur inattendue s'est produite lors de la récupération des statistiques du cluster. Cela peut être dû à un échec d'Elasticsearch ou de Kibana, ou provenir d’une erreur réseau. Vérifiez Kibana, puis rechargez la page et réessayez.", + "telemetry.callout.errorLoadingClusterStatisticsTitle": "Erreur lors du chargement des statistiques du cluster", + "telemetry.callout.errorUnprivilegedUserDescription": "Vous ne disposez pas de l'accès requis pour voir les statistiques non chiffrées du cluster.", + "telemetry.callout.errorUnprivilegedUserTitle": "Erreur lors de l'affichage des statistiques du cluster", + "telemetry.clusterData": "données du cluster", + "telemetry.dataManagementDisableCollectionLink": "Désactivez la collecte de données d’utilisation.", + "telemetry.dataManagementDisclaimerPrivacy": "{optInStatus} Ceci nous permet de savoir ce qui intéresse le plus nos utilisateurs, afin d'améliorer nos produits et services. Veuillez vous référer à notre {privacyStatementLink}.", + "telemetry.dataManagementDisclaimerPrivacyLink": "Déclaration de confidentialité", + "telemetry.dataManagementEnableCollectionLink": "Activez la collecte de données d’utilisation.", + "telemetry.disabledStatus": "La collecte de données d’utilisation est désactivée.", + "telemetry.enabledStatus": "La collecte de données d’utilisation est activée.", + "telemetry.optInErrorToastText": "Une erreur s'est produite lors de la définition des préférences relatives aux statistiques d'utilisation.", + "telemetry.optInErrorToastTitle": "Erreur", + "telemetry.optInNoticeSeenErrorTitle": "Erreur", + "telemetry.optInNoticeSeenErrorToastText": "Une erreur s'est produite lors du rejet de l'avis.", + "telemetry.optInSuccessOff": "Ne partage plus l’utilisation avec Elastic.", + "telemetry.optInSuccessOn": "Le partage d’utilisation avec Elastic est activé.", + "telemetry.provideUsageDataTitle": "Partager l’utilisation avec Elastic", + "telemetry.readOurUsageDataPrivacyStatementLinkText": "Déclaration de confidentialité", + "telemetry.securityData": "données de sécurité", + "telemetry.seeExampleOfClusterDataAndEndpointSecuity": "Découvrez des exemples de {clusterData} et de {securityData} que nous collectons.", + "telemetry.telemetryConfigAndLinkDescription": "Activer la collecte de données d’utilisation nous permet de savoir ce qui intéresse le plus nos utilisateurs, afin de pouvoir améliorer nos produits et services. Veuillez vous référer à notre {privacyStatementLink}.", + "telemetry.telemetryConstant": "données télémétriques", + "telemetry.telemetryOptedInDismissMessage": "Rejeter", + "telemetry.telemetryOptedInNoticeTitle": "Aidez-nous à améliorer la Suite Elastic.", + "telemetry.usageCollectionConstant": "collecte de données d’utilisation", + "telemetry.usageDataTitle": "Collecte de données d’utilisation", "timelion.emptyExpressionErrorMessage": "Erreur Timelion : aucune expression fournie", "timelion.expressionSuggestions.argument.description.acceptsText": "Accepte", "timelion.expressionSuggestions.func.description.chainableHelpText": "Enchaînable", @@ -10971,10 +10971,6 @@ "xpack.apm.serviceIcons.serviceDetails.service.versionLabel": "Version du service", "xpack.apm.serviceLink.otherBucketName": "Services restants", "xpack.apm.serviceLink.tooltip": "Le nombre de services instrumentés a atteint la capacité actuelle du serveur APM", - "xpack.apm.serviceList.disableFastFilter": "Désactiver le filtre rapide", - "xpack.apm.serviceList.enableFastFilter": "Activer le filtre rapide", - "xpack.apm.serviceList.giveFeedbackFlexItemLabel": "Donner un retour", - "xpack.apm.serviceList.turnOffFastFilter": "Le filtre rapide vous permet de rechercher instantanément vos services en texte libre.", "xpack.apm.serviceMap.anomalyDetectionPopoverDisabled": "Affichez les indicateurs d'intégrité du service en activant la détection des anomalies dans les paramètres APM.", "xpack.apm.serviceMap.anomalyDetectionPopoverLink": "Afficher les anomalies", "xpack.apm.serviceMap.anomalyDetectionPopoverNoData": "Nous n'avons pas trouvé de score d'anomalie dans la plage temporelle sélectionnée. Consultez les détails dans l'explorateur d'anomalies.", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index fc88d13bdc273..368ffa47cec39 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -2699,6 +2699,28 @@ "embeddableApi.selectRangeTrigger.title": "範囲選択", "embeddableApi.valueClickTrigger.description": "ビジュアライゼーションでデータポイントをクリック", "embeddableApi.valueClickTrigger.title": "シングルクリック", + "esqlEditor.query.aborted": "リクエストが中断されました", + "esqlEditor.query.EnableWordWrapLabel": "パイプの改行を追加", + "esqlEditor.query.errorCount": "{count} {count, plural, other {# 件のエラー}}", + "esqlEditor.query.errorsTitle": "エラー", + "esqlEditor.query.expandLabel": "拡張", + "esqlEditor.query.feedback": "フィードバック", + "esqlEditor.query.hideQueriesLabel": "最近のクエリーを非表示", + "esqlEditor.query.lineCount": "{count} {count, plural, other {行}}", + "esqlEditor.query.lineNumber": "行{lineNumber}", + "esqlEditor.query.querieshistory.error": "クエリ失敗", + "esqlEditor.query.querieshistory.success": "クエリは正常に実行されました", + "esqlEditor.query.querieshistoryCopy": "クエリをクリップボードにコピー", + "esqlEditor.query.querieshistoryRun": "クエリーを実行", + "esqlEditor.query.querieshistoryTable": "クエリ履歴テーブル", + "esqlEditor.query.recentQueriesColumnLabel": "最近のクエリー", + "esqlEditor.query.runQuery": "クエリーを実行", + "esqlEditor.query.showQueriesLabel": "最近のクエリを表示", + "esqlEditor.query.submitFeedback": "フィードバックを送信", + "esqlEditor.query.timeRanColumnLabel": "実行時間", + "esqlEditor.query.timestampNotDetected": "@timestampが見つかりません", + "esqlEditor.query.warningCount": "{count} {count, plural, other {件の警告}}", + "esqlEditor.query.warningsTitle": "警告", "esqlUtils.columnsErrorMsg": "列を読み込めません。{errorMessage}", "esQuery.kql.errors.endOfInputText": "インプットの終わり", "esQuery.kql.errors.fieldNameText": "フィールド名", @@ -7076,28 +7098,6 @@ "telemetry.telemetryOptedInNoticeTitle": "Elastic Stack の改善にご協力ください", "telemetry.usageCollectionConstant": "使用状況の収集", "telemetry.usageDataTitle": "使用状況の収集", - "esqlEditor.query.aborted": "リクエストが中断されました", - "esqlEditor.query.EnableWordWrapLabel": "パイプの改行を追加", - "esqlEditor.query.errorCount": "{count} {count, plural, other {# 件のエラー}}", - "esqlEditor.query.errorsTitle": "エラー", - "esqlEditor.query.expandLabel": "拡張", - "esqlEditor.query.feedback": "フィードバック", - "esqlEditor.query.hideQueriesLabel": "最近のクエリーを非表示", - "esqlEditor.query.lineCount": "{count} {count, plural, other {行}}", - "esqlEditor.query.lineNumber": "行{lineNumber}", - "esqlEditor.query.querieshistory.error": "クエリ失敗", - "esqlEditor.query.querieshistory.success": "クエリは正常に実行されました", - "esqlEditor.query.querieshistoryCopy": "クエリをクリップボードにコピー", - "esqlEditor.query.querieshistoryRun": "クエリーを実行", - "esqlEditor.query.querieshistoryTable": "クエリ履歴テーブル", - "esqlEditor.query.recentQueriesColumnLabel": "最近のクエリー", - "esqlEditor.query.runQuery": "クエリーを実行", - "esqlEditor.query.showQueriesLabel": "最近のクエリを表示", - "esqlEditor.query.submitFeedback": "フィードバックを送信", - "esqlEditor.query.timeRanColumnLabel": "実行時間", - "esqlEditor.query.timestampNotDetected": "@timestampが見つかりません", - "esqlEditor.query.warningCount": "{count} {count, plural, other {件の警告}}", - "esqlEditor.query.warningsTitle": "警告", "timelion.emptyExpressionErrorMessage": "Timelion エラー:式が入力されていません", "timelion.expressionSuggestions.argument.description.acceptsText": "受け入れ", "timelion.expressionSuggestions.func.description.chainableHelpText": "連鎖可能", @@ -10720,10 +10720,6 @@ "xpack.apm.serviceIcons.serviceDetails.service.versionLabel": "サービスバージョン", "xpack.apm.serviceLink.otherBucketName": "残りのサービス", "xpack.apm.serviceLink.tooltip": "実行されたサービス数がAPMサーバーの現在の能力に達しました。", - "xpack.apm.serviceList.disableFastFilter": "高速フィルターを無効化", - "xpack.apm.serviceList.enableFastFilter": "高速フィルターを有効化", - "xpack.apm.serviceList.giveFeedbackFlexItemLabel": "フィードバックを作成する", - "xpack.apm.serviceList.turnOffFastFilter": "高速フィルタリングでは、フリーテキストを使用してサービスを瞬時に検索できます。", "xpack.apm.serviceMap.anomalyDetectionPopoverDisabled": "APM 設定で異常検知を有効にすると、サービス正常性インジケーターが表示されます。", "xpack.apm.serviceMap.anomalyDetectionPopoverLink": "異常を表示", "xpack.apm.serviceMap.anomalyDetectionPopoverNoData": "選択した時間範囲で、異常スコアを検出できませんでした。異常エクスプローラーで詳細を確認してください。", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 358bd91cf2d02..8ddfd9427e738 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -2705,6 +2705,31 @@ "embeddableApi.selectRangeTrigger.title": "范围选择", "embeddableApi.valueClickTrigger.description": "可视化上的数据点单击", "embeddableApi.valueClickTrigger.title": "单击", + "esqlEditor.query.aborted": "请求已中止", + "esqlEditor.query.cancel": "取消", + "esqlEditor.query.collapseLabel": "折叠", + "esqlEditor.query.disableWordWrapLabel": "移除管道符上的换行符", + "esqlEditor.query.EnableWordWrapLabel": "在管道符上添加换行符", + "esqlEditor.query.errorCount": "{count} 个{count, plural, other {错误}}", + "esqlEditor.query.errorsTitle": "错误", + "esqlEditor.query.expandLabel": "展开", + "esqlEditor.query.feedback": "反馈", + "esqlEditor.query.hideQueriesLabel": "隐藏最近查询", + "esqlEditor.query.lineCount": "{count} {count, plural, other {行}}", + "esqlEditor.query.lineNumber": "第 {lineNumber} 行", + "esqlEditor.query.querieshistory.error": "查询失败", + "esqlEditor.query.querieshistory.success": "已成功运行查询", + "esqlEditor.query.querieshistoryCopy": "复制查询到剪贴板", + "esqlEditor.query.querieshistoryRun": "运行查询", + "esqlEditor.query.querieshistoryTable": "查询历史记录表", + "esqlEditor.query.recentQueriesColumnLabel": "最近查询", + "esqlEditor.query.runQuery": "运行查询", + "esqlEditor.query.showQueriesLabel": "显示最近查询", + "esqlEditor.query.submitFeedback": "提交反馈", + "esqlEditor.query.timeRanColumnLabel": "运行时间", + "esqlEditor.query.timestampNotDetected": "未找到 @timestamp", + "esqlEditor.query.warningCount": "{count} 个{count, plural, other {警告}}", + "esqlEditor.query.warningsTitle": "警告", "esqlUtils.columnsErrorMsg": "无法加载列。{errorMessage}", "esQuery.kql.errors.endOfInputText": "输入结束", "esQuery.kql.errors.fieldNameText": "字段名称", @@ -7089,31 +7114,6 @@ "telemetry.telemetryOptedInNoticeTitle": "帮助我们改进 Elastic Stack", "telemetry.usageCollectionConstant": "使用情况收集", "telemetry.usageDataTitle": "使用情况收集", - "esqlEditor.query.aborted": "请求已中止", - "esqlEditor.query.cancel": "取消", - "esqlEditor.query.collapseLabel": "折叠", - "esqlEditor.query.disableWordWrapLabel": "移除管道符上的换行符", - "esqlEditor.query.EnableWordWrapLabel": "在管道符上添加换行符", - "esqlEditor.query.errorCount": "{count} 个{count, plural, other {错误}}", - "esqlEditor.query.errorsTitle": "错误", - "esqlEditor.query.expandLabel": "展开", - "esqlEditor.query.feedback": "反馈", - "esqlEditor.query.hideQueriesLabel": "隐藏最近查询", - "esqlEditor.query.lineCount": "{count} {count, plural, other {行}}", - "esqlEditor.query.lineNumber": "第 {lineNumber} 行", - "esqlEditor.query.querieshistory.error": "查询失败", - "esqlEditor.query.querieshistory.success": "已成功运行查询", - "esqlEditor.query.querieshistoryCopy": "复制查询到剪贴板", - "esqlEditor.query.querieshistoryRun": "运行查询", - "esqlEditor.query.querieshistoryTable": "查询历史记录表", - "esqlEditor.query.recentQueriesColumnLabel": "最近查询", - "esqlEditor.query.runQuery": "运行查询", - "esqlEditor.query.showQueriesLabel": "显示最近查询", - "esqlEditor.query.submitFeedback": "提交反馈", - "esqlEditor.query.timeRanColumnLabel": "运行时间", - "esqlEditor.query.timestampNotDetected": "未找到 @timestamp", - "esqlEditor.query.warningCount": "{count} 个{count, plural, other {警告}}", - "esqlEditor.query.warningsTitle": "警告", "timelion.emptyExpressionErrorMessage": "Timelion 错误:未提供表达式", "timelion.expressionSuggestions.argument.description.acceptsText": "接受", "timelion.expressionSuggestions.func.description.chainableHelpText": "可串接", @@ -10742,10 +10742,6 @@ "xpack.apm.serviceIcons.serviceDetails.service.versionLabel": "服务版本", "xpack.apm.serviceLink.otherBucketName": "剩余服务", "xpack.apm.serviceLink.tooltip": "检测的服务数已达到 APM 服务器的当前容量", - "xpack.apm.serviceList.disableFastFilter": "禁用快速筛选", - "xpack.apm.serviceList.enableFastFilter": "启用快速筛选", - "xpack.apm.serviceList.giveFeedbackFlexItemLabel": "反馈", - "xpack.apm.serviceList.turnOffFastFilter": "借助快速筛选,您可以立即使用自定义文本搜索服务。", "xpack.apm.serviceMap.anomalyDetectionPopoverDisabled": "通过在 APM 设置中启用异常检测来显示服务运行状况指标。", "xpack.apm.serviceMap.anomalyDetectionPopoverLink": "查看异常", "xpack.apm.serviceMap.anomalyDetectionPopoverNoData": "在选定时间范围内找不到异常分数。请在 Anomaly Explorer 中查看详情。", From ee5ef8166b74041f359862f3f22e0eb491f1443c Mon Sep 17 00:00:00 2001 From: Carlos Crespo Date: Mon, 23 Sep 2024 17:59:08 +0200 Subject: [PATCH 05/41] [APM] Use excluded data tiers setting (#192373) closes [#190559](https://github.com/elastic/kibana/issues/190559) ## Summary This PR updates the ES clients in APM to respect the excluded tier configuration. When this config is set, the ES clients will automatically add a filter to exclude the specified tiers from queries. image All queries in APM should have the `_tier` filter (via `get_apm_events_client`) image This change also affects alerting (via `alerting_es_client`) image And it impacts the alerts column (via `get_apm_alert_client`) image ### What won't automatically add a filter for `_tier` - Embeddables - ML queries ### How to test - Set the config in Advanced Settings to exclude `data_frozen` and `data_cold` (optional) - Navigate to APM and check the query `Inspect` to see if the filter is present. - Click through APM to confirm things still work. - Create one of each type of APM alerts - Without the config set, queries should not include the `_tier` filter` --------- Co-authored-by: Elastic Machine --- .../es/queries/exclude_frozen_query.ts | 15 +- .../es/queries/exclude_tiers_query.ts | 26 ++ .../apm/common/storage_explorer_types.ts | 20 +- .../lib/helpers/get_apm_alerts_client.test.ts | 95 +++++++ .../lib/helpers/get_apm_alerts_client.ts | 28 +- .../lib/helpers/get_apm_event_client.ts | 20 +- .../routes/alerts/alerting_es_client.test.ts | 93 ++++++ .../routes/alerts/alerting_es_client.ts | 15 + .../get_service_group_fields_for_anomaly.ts | 9 +- .../anomaly/register_anomaly_rule_type.ts | 3 +- .../register_error_count_rule_type.ts | 3 +- ...register_transaction_duration_rule_type.ts | 3 +- ...gister_transaction_error_rate_rule_type.ts | 3 +- .../server/routes/alerts/test_utils/index.ts | 3 + .../has_historical_agent_data.ts | 4 +- .../create_apm_event_client/index.test.ts | 267 ++++++++++++++---- .../create_apm_event_client/index.ts | 35 ++- .../server/lib/helpers/index.ts | 2 + .../server/lib/helpers/tier_filter.ts | 29 ++ .../apm_data_access/server/utils.ts | 1 + .../apm_data_access/tsconfig.json | 3 +- .../observability/server/ui_settings.ts | 3 +- .../observability_shared/common/ilm_types.ts | 24 ++ .../observability_shared/common/index.ts | 5 + .../profiling/common/storage_explorer.ts | 20 +- 25 files changed, 612 insertions(+), 117 deletions(-) create mode 100644 x-pack/packages/observability/observability_utils/es/queries/exclude_tiers_query.ts create mode 100644 x-pack/plugins/observability_solution/apm/server/lib/helpers/get_apm_alerts_client.test.ts create mode 100644 x-pack/plugins/observability_solution/apm/server/routes/alerts/alerting_es_client.test.ts create mode 100644 x-pack/plugins/observability_solution/apm_data_access/server/lib/helpers/tier_filter.ts create mode 100644 x-pack/plugins/observability_solution/observability_shared/common/ilm_types.ts diff --git a/x-pack/packages/observability/observability_utils/es/queries/exclude_frozen_query.ts b/x-pack/packages/observability/observability_utils/es/queries/exclude_frozen_query.ts index f348d925c41ca..1dd0bb736c644 100644 --- a/x-pack/packages/observability/observability_utils/es/queries/exclude_frozen_query.ts +++ b/x-pack/packages/observability/observability_utils/es/queries/exclude_frozen_query.ts @@ -5,19 +5,8 @@ * 2.0. */ import type { estypes } from '@elastic/elasticsearch'; +import { excludeTiersQuery } from './exclude_tiers_query'; export function excludeFrozenQuery(): estypes.QueryDslQueryContainer[] { - return [ - { - bool: { - must_not: [ - { - term: { - _tier: 'data_frozen', - }, - }, - ], - }, - }, - ]; + return excludeTiersQuery(['data_frozen']); } diff --git a/x-pack/packages/observability/observability_utils/es/queries/exclude_tiers_query.ts b/x-pack/packages/observability/observability_utils/es/queries/exclude_tiers_query.ts new file mode 100644 index 0000000000000..16bb9e24f505a --- /dev/null +++ b/x-pack/packages/observability/observability_utils/es/queries/exclude_tiers_query.ts @@ -0,0 +1,26 @@ +/* + * 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 { estypes } from '@elastic/elasticsearch'; + +export function excludeTiersQuery( + excludedDataTiers: Array<'data_frozen' | 'data_cold' | 'data_warm' | 'data_hot'> +): estypes.QueryDslQueryContainer[] { + return [ + { + bool: { + must_not: [ + { + terms: { + _tier: excludedDataTiers, + }, + }, + ], + }, + }, + ]; +} diff --git a/x-pack/plugins/observability_solution/apm/common/storage_explorer_types.ts b/x-pack/plugins/observability_solution/apm/common/storage_explorer_types.ts index 579417a0f8e03..b6db4dd7405b9 100644 --- a/x-pack/plugins/observability_solution/apm/common/storage_explorer_types.ts +++ b/x-pack/plugins/observability_solution/apm/common/storage_explorer_types.ts @@ -5,23 +5,13 @@ * 2.0. */ +import { + IndexLifecyclePhaseSelectOption, + indexLifeCyclePhaseToDataTier, +} from '@kbn/observability-shared-plugin/common'; import * as t from 'io-ts'; -export enum IndexLifecyclePhaseSelectOption { - All = 'all', - Hot = 'hot', - Warm = 'warm', - Cold = 'cold', - Frozen = 'frozen', -} - -export const indexLifeCyclePhaseToDataTier = { - [IndexLifecyclePhaseSelectOption.Hot]: 'data_hot', - [IndexLifecyclePhaseSelectOption.Warm]: 'data_warm', - [IndexLifecyclePhaseSelectOption.Cold]: 'data_cold', - [IndexLifecyclePhaseSelectOption.Frozen]: 'data_frozen', -}; - +export { IndexLifecyclePhaseSelectOption, indexLifeCyclePhaseToDataTier }; export const indexLifecyclePhaseRt = t.type({ indexLifecyclePhase: t.union([ t.literal(IndexLifecyclePhaseSelectOption.All), diff --git a/x-pack/plugins/observability_solution/apm/server/lib/helpers/get_apm_alerts_client.test.ts b/x-pack/plugins/observability_solution/apm/server/lib/helpers/get_apm_alerts_client.test.ts new file mode 100644 index 0000000000000..2479cad9f213b --- /dev/null +++ b/x-pack/plugins/observability_solution/apm/server/lib/helpers/get_apm_alerts_client.test.ts @@ -0,0 +1,95 @@ +/* + * 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 ApmAlertsRequiredParams, getApmAlertsClient } from './get_apm_alerts_client'; +import type { + IScopedClusterClient, + IUiSettingsClient, + KibanaRequest, + SavedObjectsClientContract, +} from '@kbn/core/server'; +import { AlertsClient, RuleRegistryPluginStartContract } from '@kbn/rule-registry-plugin/server'; + +describe('get_apm_alerts_client', () => { + let ruleRegistryMock: jest.Mocked; + let alertClient: jest.Mocked; + let uiSettingsClientMock: jest.Mocked; + + const params: ApmAlertsRequiredParams = { + size: 10, + track_total_hits: true, + query: { + match: { field: 'value' }, + }, + }; + + beforeEach(async () => { + uiSettingsClientMock = { + get: jest.fn().mockResolvedValue(undefined), + } as unknown as jest.Mocked; + + alertClient = { + find: jest.fn().mockResolvedValue({}), + getAuthorizedAlertsIndices: jest.fn().mockResolvedValue(['apm']), + } as unknown as jest.Mocked; + + ruleRegistryMock = { + getRacClientWithRequest: jest.fn().mockResolvedValue(alertClient), + alerting: jest.fn(), + } as unknown as jest.Mocked; + }); + + afterEach(() => { + jest.resetAllMocks(); + }); + + // Helper function to create the APM alerts client + const createApmAlertsClient = async () => { + return await getApmAlertsClient({ + context: { + core: Promise.resolve({ + uiSettings: { client: uiSettingsClientMock }, + elasticsearch: { client: {} as IScopedClusterClient }, + savedObjects: { client: {} as SavedObjectsClientContract }, + }), + } as any, + plugins: { + ruleRegistry: { + start: jest.fn().mockResolvedValue(ruleRegistryMock), + setup: {} as any, + }, + } as any, + request: {} as KibanaRequest, + }); + }; + + it('should call search', async () => { + const apmAlertsClient = await createApmAlertsClient(); + + await apmAlertsClient.search(params); + + const searchParams = alertClient.find.mock.calls[0][0] as ApmAlertsRequiredParams; + expect(searchParams.query).toEqual({ match: { field: 'value' } }); + }); + + it('should call search with filters containing excluded data tiers', async () => { + const excludedDataTiers = ['data_warm', 'data_cold']; + uiSettingsClientMock.get.mockResolvedValue(excludedDataTiers); + + const apmAlertsClient = await createApmAlertsClient(); + + await apmAlertsClient.search(params); + + const searchParams = alertClient.find.mock.calls[0][0] as ApmAlertsRequiredParams; + expect(searchParams.query?.bool).toEqual({ + must: [ + { match: { field: 'value' } }, + { bool: { must_not: [{ terms: { _tier: ['data_warm', 'data_cold'] } }] } }, + ], + }); + }); +}); diff --git a/x-pack/plugins/observability_solution/apm/server/lib/helpers/get_apm_alerts_client.ts b/x-pack/plugins/observability_solution/apm/server/lib/helpers/get_apm_alerts_client.ts index 3c885eef658d5..b0e601fd4c0db 100644 --- a/x-pack/plugins/observability_solution/apm/server/lib/helpers/get_apm_alerts_client.ts +++ b/x-pack/plugins/observability_solution/apm/server/lib/helpers/get_apm_alerts_client.ts @@ -8,14 +8,27 @@ import { isEmpty } from 'lodash'; import { ESSearchRequest, InferSearchResponseOf } from '@kbn/es-types'; import { ParsedTechnicalFields } from '@kbn/rule-registry-plugin/common'; +import { DataTier } from '@kbn/observability-shared-plugin/common'; +import { searchExcludedDataTiers } from '@kbn/observability-plugin/common/ui_settings_keys'; +import { estypes } from '@elastic/elasticsearch'; +import { getDataTierFilterCombined } from '@kbn/apm-data-access-plugin/server/utils'; import type { MinimalAPMRouteHandlerResources } from '../../routes/apm_routes/register_apm_server_routes'; export type ApmAlertsClient = Awaited>; +export type ApmAlertsRequiredParams = ESSearchRequest & { + size: number; + track_total_hits: boolean | number; + query?: estypes.QueryDslQueryContainer; +}; + export async function getApmAlertsClient({ + context, plugins, request, -}: Pick) { +}: Pick) { + const coreContext = await context.core; + const ruleRegistryPluginStart = await plugins.ruleRegistry.start(); const alertsClient = await ruleRegistryPluginStart.getRacClientWithRequest(request); const apmAlertsIndices = await alertsClient.getAuthorizedAlertsIndices(['apm']); @@ -24,17 +37,20 @@ export async function getApmAlertsClient({ throw Error('No alert indices exist for "apm"'); } - type RequiredParams = ESSearchRequest & { - size: number; - track_total_hits: boolean | number; - }; + const excludedDataTiers = await coreContext.uiSettings.client.get( + searchExcludedDataTiers + ); return { - search( + search( searchParams: TParams ): Promise> { return alertsClient.find({ ...searchParams, + query: getDataTierFilterCombined({ + filter: searchParams.query, + excludedDataTiers, + }), index: apmAlertsIndices.join(','), }) as Promise; }, diff --git a/x-pack/plugins/observability_solution/apm/server/lib/helpers/get_apm_event_client.ts b/x-pack/plugins/observability_solution/apm/server/lib/helpers/get_apm_event_client.ts index 8f21bf8f1c691..8d2f61a20500d 100644 --- a/x-pack/plugins/observability_solution/apm/server/lib/helpers/get_apm_event_client.ts +++ b/x-pack/plugins/observability_solution/apm/server/lib/helpers/get_apm_event_client.ts @@ -6,6 +6,8 @@ */ import { UI_SETTINGS } from '@kbn/data-plugin/common'; +import { DataTier } from '@kbn/observability-shared-plugin/common'; +import { searchExcludedDataTiers } from '@kbn/observability-plugin/common/ui_settings_keys'; import { APMEventClient } from './create_es_client/create_apm_event_client'; import { withApmSpan } from '../../utils/with_apm_span'; import { MinimalAPMRouteHandlerResources } from '../../routes/apm_routes/register_apm_server_routes'; @@ -22,11 +24,18 @@ export async function getApmEventClient({ >): Promise { return withApmSpan('get_apm_event_client', async () => { const coreContext = await context.core; - const [indices, includeFrozen] = await Promise.all([ + const [indices, uiSettings] = await Promise.all([ getApmIndices(), - withApmSpan('get_ui_settings', () => - coreContext.uiSettings.client.get(UI_SETTINGS.SEARCH_INCLUDE_FROZEN) - ), + withApmSpan('get_ui_settings', async () => { + const includeFrozen = await coreContext.uiSettings.client.get( + UI_SETTINGS.SEARCH_INCLUDE_FROZEN + ); + const excludedDataTiers = await coreContext.uiSettings.client.get( + searchExcludedDataTiers + ); + + return { includeFrozen, excludedDataTiers }; + }), ]); return new APMEventClient({ @@ -35,7 +44,8 @@ export async function getApmEventClient({ request, indices, options: { - includeFrozen, + includeFrozen: uiSettings.includeFrozen, + excludedDataTiers: uiSettings.excludedDataTiers, inspectableEsQueriesMap, }, }); diff --git a/x-pack/plugins/observability_solution/apm/server/routes/alerts/alerting_es_client.test.ts b/x-pack/plugins/observability_solution/apm/server/routes/alerts/alerting_es_client.test.ts new file mode 100644 index 0000000000000..757b199940547 --- /dev/null +++ b/x-pack/plugins/observability_solution/apm/server/routes/alerts/alerting_es_client.test.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 { type APMEventESSearchRequestParams, alertingEsClient } from './alerting_es_client'; +import type { RuleExecutorServices } from '@kbn/alerting-plugin/server'; +import type { ElasticsearchClient, IUiSettingsClient } from '@kbn/core/server'; +import type { ESSearchResponse } from '@kbn/es-types'; + +describe('alertingEsClient', () => { + let scopedClusterClientMock: jest.Mocked<{ + asCurrentUser: jest.Mocked; + }>; + + let uiSettingsClientMock: jest.Mocked; + + const params = { + body: { + size: 10, + track_total_hits: true, + query: { + match: { field: 'value' }, + }, + }, + }; + + const mockSearchResponse = { + hits: { + total: { value: 1, relation: 'eq' }, + hits: [{ _source: {}, _index: '' }], + max_score: 1, + }, + took: 1, + _shards: { total: 1, successful: 1, skipped: 0, failed: 0 }, + timed_out: false, + } as unknown as ESSearchResponse; + + beforeEach(() => { + scopedClusterClientMock = { + asCurrentUser: { + search: jest.fn().mockResolvedValue(mockSearchResponse), + } as unknown as jest.Mocked, + }; + + uiSettingsClientMock = { + get: jest.fn().mockResolvedValue(undefined), + } as unknown as jest.Mocked; + }); + + afterEach(() => { + jest.resetAllMocks(); + }); + + // Helper function to perform the search + const performSearch = async (searchParams: APMEventESSearchRequestParams) => { + return await alertingEsClient({ + scopedClusterClient: scopedClusterClientMock as unknown as RuleExecutorServices< + never, + never, + never + >['scopedClusterClient'], + uiSettingsClient: uiSettingsClientMock, + params: searchParams, + }); + }; + + it('should call search with default params', async () => { + await performSearch(params); + + const searchParams = scopedClusterClientMock.asCurrentUser.search.mock + .calls[0][0] as APMEventESSearchRequestParams; + expect(searchParams.body?.query).toEqual({ match: { field: 'value' } }); + }); + + it('should call search with filters containing excluded data tiers', async () => { + const excludedDataTiers = ['data_warm', 'data_cold']; + uiSettingsClientMock.get.mockResolvedValue(excludedDataTiers); + + await performSearch(params); + + const searchParams = scopedClusterClientMock.asCurrentUser.search.mock + .calls[0][0] as APMEventESSearchRequestParams; + expect(searchParams.body?.query?.bool).toEqual({ + must: [ + { match: { field: 'value' } }, + { bool: { must_not: [{ terms: { _tier: ['data_warm', 'data_cold'] } }] } }, + ], + }); + }); +}); diff --git a/x-pack/plugins/observability_solution/apm/server/routes/alerts/alerting_es_client.ts b/x-pack/plugins/observability_solution/apm/server/routes/alerts/alerting_es_client.ts index 1a9daf6ad41a6..5638acd293538 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/alerts/alerting_es_client.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/alerts/alerting_es_client.ts @@ -7,6 +7,10 @@ import type { ESSearchRequest, ESSearchResponse } from '@kbn/es-types'; import { RuleExecutorServices } from '@kbn/alerting-plugin/server'; +import { IUiSettingsClient } from '@kbn/core/server'; +import type { DataTier } from '@kbn/observability-shared-plugin/common'; +import { getDataTierFilterCombined } from '@kbn/apm-data-access-plugin/server/utils'; +import { searchExcludedDataTiers } from '@kbn/observability-plugin/common/ui_settings_keys'; export type APMEventESSearchRequestParams = ESSearchRequest & { body: { size: number; track_total_hits: boolean | number }; @@ -14,13 +18,24 @@ export type APMEventESSearchRequestParams = ESSearchRequest & { export async function alertingEsClient({ scopedClusterClient, + uiSettingsClient, params, }: { scopedClusterClient: RuleExecutorServices['scopedClusterClient']; + uiSettingsClient: IUiSettingsClient; params: TParams; }): Promise> { + const excludedDataTiers = await uiSettingsClient.get(searchExcludedDataTiers); + const response = await scopedClusterClient.asCurrentUser.search({ ...params, + body: { + ...params.body, + query: getDataTierFilterCombined({ + filter: params.body.query, + excludedDataTiers, + }), + }, ignore_unavailable: true, }); diff --git a/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/anomaly/get_service_group_fields_for_anomaly.ts b/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/anomaly/get_service_group_fields_for_anomaly.ts index ce8783ad517f9..c617bfd74dc22 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/anomaly/get_service_group_fields_for_anomaly.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/anomaly/get_service_group_fields_for_anomaly.ts @@ -5,7 +5,11 @@ * 2.0. */ -import { IScopedClusterClient, SavedObjectsClientContract } from '@kbn/core/server'; +import type { + IScopedClusterClient, + IUiSettingsClient, + SavedObjectsClientContract, +} from '@kbn/core/server'; import type { APMIndices } from '@kbn/apm-data-access-plugin/server'; import { SERVICE_ENVIRONMENT, @@ -23,6 +27,7 @@ export async function getServiceGroupFieldsForAnomaly({ apmIndices, scopedClusterClient, serviceName, + uiSettingsClient, environment, transactionType, timestamp, @@ -31,6 +36,7 @@ export async function getServiceGroupFieldsForAnomaly({ apmIndices: APMIndices; scopedClusterClient: IScopedClusterClient; savedObjectsClient: SavedObjectsClientContract; + uiSettingsClient: IUiSettingsClient; serviceName: string; environment: string; transactionType: string; @@ -70,6 +76,7 @@ export async function getServiceGroupFieldsForAnomaly({ const response = await alertingEsClient({ scopedClusterClient, + uiSettingsClient, params, }); diff --git a/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/anomaly/register_anomaly_rule_type.ts b/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/anomaly/register_anomaly_rule_type.ts index 4678622a7d122..d9a58d23a5888 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/anomaly/register_anomaly_rule_type.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/anomaly/register_anomaly_rule_type.ts @@ -129,7 +129,7 @@ export function registerAnomalyRuleType({ } const { params, services, spaceId, startedAt, getTimeRange } = options; - const { alertsClient, savedObjectsClient, scopedClusterClient } = services; + const { alertsClient, savedObjectsClient, scopedClusterClient, uiSettingsClient } = services; if (!alertsClient) { throw new AlertsClientError(); } @@ -283,6 +283,7 @@ export function registerAnomalyRuleType({ apmIndices, scopedClusterClient, savedObjectsClient, + uiSettingsClient, serviceName, environment, transactionType, diff --git a/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/error_count/register_error_count_rule_type.ts b/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/error_count/register_error_count_rule_type.ts index d90aa0e143a14..2539a63ea8575 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/error_count/register_error_count_rule_type.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/error_count/register_error_count_rule_type.ts @@ -128,7 +128,7 @@ export function registerErrorCountRuleType({ > ) => { const { params: ruleParams, services, spaceId, startedAt, getTimeRange } = options; - const { alertsClient, savedObjectsClient, scopedClusterClient } = services; + const { alertsClient, savedObjectsClient, scopedClusterClient, uiSettingsClient } = services; if (!alertsClient) { throw new AlertsClientError(); } @@ -187,6 +187,7 @@ export function registerErrorCountRuleType({ const response = await alertingEsClient({ scopedClusterClient, + uiSettingsClient, params: searchParams, }); diff --git a/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/transaction_duration/register_transaction_duration_rule_type.ts b/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/transaction_duration/register_transaction_duration_rule_type.ts index 299615e7663ef..96ddbe15c4287 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/transaction_duration/register_transaction_duration_rule_type.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/transaction_duration/register_transaction_duration_rule_type.ts @@ -140,7 +140,7 @@ export function registerTransactionDurationRuleType({ > ) => { const { params: ruleParams, services, spaceId, getTimeRange } = options; - const { alertsClient, savedObjectsClient, scopedClusterClient } = services; + const { alertsClient, savedObjectsClient, scopedClusterClient, uiSettingsClient } = services; if (!alertsClient) { throw new AlertsClientError(); } @@ -221,6 +221,7 @@ export function registerTransactionDurationRuleType({ const response = await alertingEsClient({ scopedClusterClient, + uiSettingsClient, params: searchParams, }); diff --git a/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/transaction_error_rate/register_transaction_error_rate_rule_type.ts b/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/transaction_error_rate/register_transaction_error_rate_rule_type.ts index 81b4612244b1b..cff5a481f9200 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/transaction_error_rate/register_transaction_error_rate_rule_type.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/alerts/rule_types/transaction_error_rate/register_transaction_error_rate_rule_type.ts @@ -138,7 +138,7 @@ export function registerTransactionErrorRateRuleType({ > ) => { const { services, spaceId, params: ruleParams, startedAt, getTimeRange } = options; - const { alertsClient, savedObjectsClient, scopedClusterClient } = services; + const { alertsClient, savedObjectsClient, scopedClusterClient, uiSettingsClient } = services; if (!alertsClient) { throw new AlertsClientError(); } @@ -223,6 +223,7 @@ export function registerTransactionErrorRateRuleType({ const response = await alertingEsClient({ scopedClusterClient, + uiSettingsClient, params: searchParams, }); diff --git a/x-pack/plugins/observability_solution/apm/server/routes/alerts/test_utils/index.ts b/x-pack/plugins/observability_solution/apm/server/routes/alerts/test_utils/index.ts index 1f8ddeaff4620..8db29408d4752 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/alerts/test_utils/index.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/alerts/test_utils/index.ts @@ -40,6 +40,9 @@ export const createRuleTypeMocks = () => { savedObjectsClient: { get: () => ({ attributes: { consumer: APM_SERVER_FEATURE_ID } }), }, + uiSettingsClient: { + get: jest.fn(), + }, alertFactory: { create: jest.fn(() => ({ scheduleActions, getUuid })), done: {}, diff --git a/x-pack/plugins/observability_solution/apm/server/routes/historical_data/has_historical_agent_data.ts b/x-pack/plugins/observability_solution/apm/server/routes/historical_data/has_historical_agent_data.ts index 1b34aa001dd93..5489d893f86f1 100644 --- a/x-pack/plugins/observability_solution/apm/server/routes/historical_data/has_historical_agent_data.ts +++ b/x-pack/plugins/observability_solution/apm/server/routes/historical_data/has_historical_agent_data.ts @@ -6,6 +6,7 @@ */ import { ProcessorEvent } from '@kbn/observability-plugin/common'; +import type { DataTier } from '@kbn/observability-shared-plugin/common'; import { APMEventClient } from '../../lib/helpers/create_es_client/create_apm_event_client'; export async function hasHistoricalAgentData(apmEventClient: APMEventClient) { @@ -23,8 +24,9 @@ export async function hasHistoricalAgentData(apmEventClient: APMEventClient) { return hasDataUnbounded; } -type DataTier = 'data_hot' | 'data_warm' | 'data_cold' | 'data_frozen'; async function hasDataRequest(apmEventClient: APMEventClient, dataTiers?: DataTier[]) { + // the `observability:searchExcludedDataTiers` setting will also be considered + // in the `search` function to exclude data tiers from the search const query = dataTiers ? { terms: { _tier: dataTiers } } : undefined; const params = { diff --git a/x-pack/plugins/observability_solution/apm_data_access/server/lib/helpers/create_es_client/create_apm_event_client/index.test.ts b/x-pack/plugins/observability_solution/apm_data_access/server/lib/helpers/create_es_client/create_apm_event_client/index.test.ts index 2239f6d8d8fb0..a349c7c48f687 100644 --- a/x-pack/plugins/observability_solution/apm_data_access/server/lib/helpers/create_es_client/create_apm_event_client/index.test.ts +++ b/x-pack/plugins/observability_solution/apm_data_access/server/lib/helpers/create_es_client/create_apm_event_client/index.test.ts @@ -7,80 +7,245 @@ import { setTimeout as setTimeoutPromise } from 'timers/promises'; import { contextServiceMock, executionContextServiceMock } from '@kbn/core/server/mocks'; import { createHttpService } from '@kbn/core-http-server-mocks'; +import type { ElasticsearchClient, KibanaRequest } from '@kbn/core/server'; +import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import type { + TermsEnumRequest, + MsearchMultisearchBody, +} from '@elastic/elasticsearch/lib/api/types'; import supertest from 'supertest'; -import { APMEventClient } from '.'; +import { APMEventClient, type APMEventESSearchRequest, type APMEventFieldCapsRequest } from '.'; +import { APMIndices } from '../../../..'; -describe('APMEventClient', () => { - let server: ReturnType; +import * as cancelEsRequestOnAbortModule from '../cancel_es_request_on_abort'; +import * as observabilityPluginModule from '@kbn/observability-plugin/server'; - beforeEach(() => { - server = createHttpService(); - }); +jest.mock('@kbn/observability-plugin/server', () => ({ + __esModule: true, + ...jest.requireActual('@kbn/observability-plugin/server'), +})); - afterEach(async () => { - await server.stop(); - }); - it('cancels a search when a request is aborted', async () => { - await server.preboot({ - context: contextServiceMock.createPrebootContract(), +describe('APMEventClient', () => { + describe('Abort controller', () => { + let server: ReturnType; + beforeEach(() => { + server = createHttpService(); }); - const { server: innerServer, createRouter } = await server.setup({ - context: contextServiceMock.createSetupContract(), - executionContext: executionContextServiceMock.createInternalSetupContract(), + + afterEach(async () => { + await server.stop(); }); - const router = createRouter('/'); - - let abortSignal: AbortSignal | undefined; - router.get({ path: '/', validate: false }, async (context, request, res) => { - const eventClient = new APMEventClient({ - esClient: { - search: async (params: any, { signal }: { signal: AbortSignal }) => { - abortSignal = signal; - await setTimeoutPromise(3_000, undefined, { - signal: abortSignal, - }); - return {}; + + it('cancels a search when a request is aborted', async () => { + await server.preboot({ + context: contextServiceMock.createPrebootContract(), + }); + const { server: innerServer, createRouter } = await server.setup({ + context: contextServiceMock.createSetupContract(), + executionContext: executionContextServiceMock.createInternalSetupContract(), + }); + const router = createRouter('/'); + + let abortSignal: AbortSignal | undefined; + router.get({ path: '/', validate: false }, async (context, request, res) => { + const eventClient = new APMEventClient({ + esClient: { + search: async (params: any, { signal }: { signal: AbortSignal }) => { + abortSignal = signal; + await setTimeoutPromise(3_000, undefined, { + signal: abortSignal, + }); + return {}; + }, + } as any, + debug: false, + request, + indices: {} as APMIndices, + options: { + includeFrozen: false, }, - } as any, + }); + + await eventClient.search('foo', { + apm: { + events: [], + }, + body: { size: 0, track_total_hits: false }, + }); + + return res.ok({ body: 'ok' }); + }); + + await server.start(); + + expect(abortSignal?.aborted).toBeFalsy(); + + const incomingRequest = supertest(innerServer.listener) + .get('/') + // end required to send request + .end(); + + await new Promise((resolve) => { + setTimeout(() => { + void incomingRequest.on('abort', () => { + setTimeout(() => { + resolve(undefined); + }, 100); + }); + + void incomingRequest.abort(); + }, 200); + }); + + expect(abortSignal?.aborted).toBe(true); + }); + }); + + describe('excludedDataTiers filter', () => { + let esClientMock: jest.Mocked; + let apmEventClient: APMEventClient; + let cancelEsRequestOnAbortSpy: jest.SpyInstance; + let unwrapEsResponseSpy: jest.SpyInstance; + + const esResponse: estypes.SearchResponse = { + hits: { + total: { value: 1, relation: 'eq' }, + hits: [{ _source: {}, _index: '' }], + max_score: 1, + }, + took: 1, + _shards: { total: 1, successful: 1, skipped: 0, failed: 0 }, + timed_out: false, + }; + + beforeAll(() => { + jest.resetModules(); + }); + + beforeEach(() => { + cancelEsRequestOnAbortSpy = jest + .spyOn(cancelEsRequestOnAbortModule, 'cancelEsRequestOnAbort') + .mockImplementation(jest.fn()); + + unwrapEsResponseSpy = jest + .spyOn(observabilityPluginModule, 'unwrapEsResponse') + .mockImplementation(jest.fn()); + + esClientMock = { + search: jest.fn(), + msearch: jest.fn(), + eql: { search: jest.fn() }, + fieldCaps: jest.fn(), + termsEnum: jest.fn(), + } as unknown as jest.Mocked; + + apmEventClient = new APMEventClient({ + esClient: esClientMock, debug: false, - request, - indices: {} as any, + request: {} as KibanaRequest, + indices: {} as APMIndices, options: { includeFrozen: false, + excludedDataTiers: ['data_warm', 'data_cold'], }, }); + }); + + afterAll(() => { + cancelEsRequestOnAbortSpy.mockReset(); + unwrapEsResponseSpy.mockReset(); + }); - await eventClient.search('foo', { - apm: { - events: [], + it('includes excludedDataTiers filter in search params', async () => { + esClientMock.search.mockResolvedValue(esResponse); + + await apmEventClient.search('testOperation', { + apm: { events: [] }, + body: { + size: 0, + track_total_hits: false, + query: { bool: { filter: [{ match_all: {} }] } }, }, - body: { size: 0, track_total_hits: false }, }); - return res.ok({ body: 'ok' }); + const searchParams = esClientMock.search.mock.calls[0][0] as APMEventESSearchRequest; + + expect(searchParams.body.query?.bool).toEqual({ + filter: [ + { terms: { 'processor.event': [] } }, + { bool: { must_not: [{ terms: { _tier: ['data_warm', 'data_cold'] } }] } }, + ], + must: [{ bool: { filter: [{ match_all: {} }] } }], + }); }); - await server.start(); + it('includes excludedDataTiers filter in msearch params', async () => { + esClientMock.msearch.mockResolvedValue({ responses: [esResponse], took: 1 }); - expect(abortSignal?.aborted).toBeFalsy(); + await apmEventClient.msearch('testOperation', { + apm: { events: [] }, + body: { + size: 0, + track_total_hits: false, + query: { bool: { filter: [{ match_all: {} }] } }, + }, + }); - const incomingRequest = supertest(innerServer.listener) - .get('/') - // end required to send request - .end(); + const msearchParams = esClientMock.msearch.mock.calls[0][0] as { + searches: MsearchMultisearchBody[]; + }; - await new Promise((resolve) => { - setTimeout(() => { - void incomingRequest.on('abort', () => { - setTimeout(() => { - resolve(undefined); - }, 100); - }); + expect(msearchParams.searches[1].query?.bool).toEqual({ + filter: [ + { bool: { filter: [{ match_all: {} }] } }, + { terms: { 'processor.event': [] } }, + { bool: { must_not: [{ terms: { _tier: ['data_warm', 'data_cold'] } }] } }, + ], + }); + }); + + it('includes excludedDataTiers filter in fieldCaps params', async () => { + esClientMock.fieldCaps.mockResolvedValue({ + fields: {}, + indices: '', + }); - void incomingRequest.abort(); - }, 200); + await apmEventClient.fieldCaps('testOperation', { + apm: { events: [] }, + fields: ['field1'], + index_filter: { bool: { filter: [{ match_all: {} }] } }, + }); + + const fieldCapsParams = esClientMock.fieldCaps.mock.calls[0][0] as APMEventFieldCapsRequest; + expect(fieldCapsParams?.index_filter?.bool).toEqual({ + must: [ + { bool: { filter: [{ match_all: {} }] } }, + { bool: { must_not: [{ terms: { _tier: ['data_warm', 'data_cold'] } }] } }, + ], + }); }); - expect(abortSignal?.aborted).toBe(true); + it('includes excludedDataTiers filter in termsEnum params', async () => { + esClientMock.termsEnum.mockResolvedValue({ + terms: [''], + _shards: { total: 1, successful: 1, failed: 0 }, + complete: true, + }); + + await apmEventClient.termsEnum('testOperation', { + apm: { events: [] }, + field: 'field1', + index_filter: { bool: { filter: [{ match_all: {} }] } }, + }); + + const termsEnumParams = esClientMock.termsEnum.mock.calls[0][0] as TermsEnumRequest; + + expect(termsEnumParams.index_filter?.bool).toEqual({ + must: [ + { bool: { filter: [{ match_all: {} }] } }, + { bool: { must_not: [{ terms: { _tier: ['data_warm', 'data_cold'] } }] } }, + ], + }); + }); }); }); diff --git a/x-pack/plugins/observability_solution/apm_data_access/server/lib/helpers/create_es_client/create_apm_event_client/index.ts b/x-pack/plugins/observability_solution/apm_data_access/server/lib/helpers/create_es_client/create_apm_event_client/index.ts index 3c195b752c854..c6c68830ae10c 100644 --- a/x-pack/plugins/observability_solution/apm_data_access/server/lib/helpers/create_es_client/create_apm_event_client/index.ts +++ b/x-pack/plugins/observability_solution/apm_data_access/server/lib/helpers/create_es_client/create_apm_event_client/index.ts @@ -22,6 +22,8 @@ import { compact, omit } from 'lodash'; import { ValuesType } from 'utility-types'; import type { APMError, Metric, Span, Transaction, Event } from '@kbn/apm-types/es_schemas_ui'; import type { InspectResponse } from '@kbn/observability-plugin/typings/common'; +import type { DataTier } from '@kbn/observability-shared-plugin/common'; +import { excludeTiersQuery } from '@kbn/observability-utils/es/queries/exclude_tiers_query'; import { withApmSpan } from '../../../../utils'; import type { ApmDataSource } from '../../../../../common/data_source'; import { cancelEsRequestOnAbort } from '../cancel_es_request_on_abort'; @@ -29,6 +31,7 @@ import { callAsyncWithDebug, getDebugBody, getDebugTitle } from '../call_async_w import type { ProcessorEventOfDocumentType } from '../document_type'; import type { APMIndices } from '../../../..'; import { getRequestBase, processorEventsToIndex } from './get_request_base'; +import { getDataTierFilterCombined } from '../../tier_filter'; export type APMEventESSearchRequest = Omit & { apm: { @@ -51,9 +54,9 @@ type APMEventWrapper = Omit & { apm: { events: ProcessorEvent[] }; }; -type APMEventTermsEnumRequest = APMEventWrapper; +export type APMEventTermsEnumRequest = APMEventWrapper; type APMEventEqlSearchRequest = APMEventWrapper; -type APMEventFieldCapsRequest = APMEventWrapper; +export type APMEventFieldCapsRequest = APMEventWrapper; type TypeOfProcessorEvent = { [ProcessorEvent.error]: APMError; @@ -88,6 +91,7 @@ export interface APMEventClientConfig { options: { includeFrozen: boolean; inspectableEsQueriesMap?: WeakMap; + excludedDataTiers?: DataTier[]; }; } @@ -96,7 +100,10 @@ export class APMEventClient { private readonly debug: boolean; private readonly request: KibanaRequest; public readonly indices: APMIndices; + /** @deprecated Use {@link excludedDataTiers} instead. + * See https://www.elastic.co/guide/en/kibana/current/advanced-options.html **/ private readonly includeFrozen: boolean; + private readonly excludedDataTiers?: DataTier[]; private readonly inspectableEsQueriesMap?: WeakMap; constructor(config: APMEventClientConfig) { @@ -105,6 +112,7 @@ export class APMEventClient { this.request = config.request; this.indices = config.indices; this.includeFrozen = config.options.includeFrozen; + this.excludedDataTiers = config.options.excludedDataTiers; this.inspectableEsQueriesMap = config.options.inspectableEsQueriesMap; } @@ -159,6 +167,10 @@ export class APMEventClient { indices: this.indices, }); + if (this.excludedDataTiers) { + filters.push(...excludeTiersQuery(this.excludedDataTiers)); + } + const searchParams = { ...omit(params, 'apm', 'body'), index, @@ -195,6 +207,8 @@ export class APMEventClient { // Reusing indices configured for errors since both events and errors are stored as logs. const index = processorEventsToIndex([ProcessorEvent.error], this.indices); + const filter = this.excludedDataTiers ? excludeTiersQuery(this.excludedDataTiers) : undefined; + const searchParams = { ...omit(params, 'body'), index, @@ -202,6 +216,7 @@ export class APMEventClient { ...params.body, query: { bool: { + filter, must: compact([params.body.query]), }, }, @@ -234,6 +249,10 @@ export class APMEventClient { indices: this.indices, }); + if (this.excludedDataTiers) { + filters.push(...excludeTiersQuery(this.excludedDataTiers)); + } + const searchParams: [MsearchMultisearchHeader, MsearchMultisearchBody] = [ { index, @@ -295,9 +314,13 @@ export class APMEventClient { ): Promise { const index = processorEventsToIndex(params.apm.events, this.indices); - const requestParams = { + const requestParams: Omit & { index: string[] } = { ...omit(params, 'apm'), index, + index_filter: getDataTierFilterCombined({ + filter: params.index_filter, + excludedDataTiers: this.excludedDataTiers, + }), }; return this.callAsyncWithDebug({ @@ -314,9 +337,13 @@ export class APMEventClient { ): Promise { const index = processorEventsToIndex(params.apm.events, this.indices); - const requestParams = { + const requestParams: Omit & { index: string } = { ...omit(params, 'apm'), index: index.join(','), + index_filter: getDataTierFilterCombined({ + filter: params.index_filter, + excludedDataTiers: this.excludedDataTiers, + }), }; return this.callAsyncWithDebug({ diff --git a/x-pack/plugins/observability_solution/apm_data_access/server/lib/helpers/index.ts b/x-pack/plugins/observability_solution/apm_data_access/server/lib/helpers/index.ts index 30a2ff30d98ee..a912b2a1d60bb 100644 --- a/x-pack/plugins/observability_solution/apm_data_access/server/lib/helpers/index.ts +++ b/x-pack/plugins/observability_solution/apm_data_access/server/lib/helpers/index.ts @@ -21,3 +21,5 @@ export { } from './create_es_client/call_async_with_debug'; export { cancelEsRequestOnAbort } from './create_es_client/cancel_es_request_on_abort'; + +export { getDataTierFilterCombined } from './tier_filter'; diff --git a/x-pack/plugins/observability_solution/apm_data_access/server/lib/helpers/tier_filter.ts b/x-pack/plugins/observability_solution/apm_data_access/server/lib/helpers/tier_filter.ts new file mode 100644 index 0000000000000..ae29575c044c6 --- /dev/null +++ b/x-pack/plugins/observability_solution/apm_data_access/server/lib/helpers/tier_filter.ts @@ -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 type { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import type { DataTier } from '@kbn/observability-shared-plugin/common'; +import { excludeTiersQuery } from '@kbn/observability-utils/es/queries/exclude_tiers_query'; + +export function getDataTierFilterCombined({ + filter, + excludedDataTiers, +}: { + filter?: QueryDslQueryContainer; + excludedDataTiers?: DataTier[]; +}): QueryDslQueryContainer | undefined { + if (!filter) { + return excludedDataTiers ? excludeTiersQuery(excludedDataTiers)[0] : undefined; + } + + return !excludedDataTiers + ? filter + : { + bool: { + must: [filter, ...excludeTiersQuery(excludedDataTiers)], + }, + }; +} diff --git a/x-pack/plugins/observability_solution/apm_data_access/server/utils.ts b/x-pack/plugins/observability_solution/apm_data_access/server/utils.ts index b1e768edf3733..2fac072a8cdb5 100644 --- a/x-pack/plugins/observability_solution/apm_data_access/server/utils.ts +++ b/x-pack/plugins/observability_solution/apm_data_access/server/utils.ts @@ -11,6 +11,7 @@ export { cancelEsRequestOnAbort, getDebugBody, getDebugTitle, + getDataTierFilterCombined, } from './lib/helpers'; export { withApmSpan } from './utils/with_apm_span'; diff --git a/x-pack/plugins/observability_solution/apm_data_access/tsconfig.json b/x-pack/plugins/observability_solution/apm_data_access/tsconfig.json index 589d08ba56b4e..ea3ebf77b25be 100644 --- a/x-pack/plugins/observability_solution/apm_data_access/tsconfig.json +++ b/x-pack/plugins/observability_solution/apm_data_access/tsconfig.json @@ -19,6 +19,7 @@ "@kbn/core-http-server-mocks", "@kbn/apm-utils", "@kbn/core-http-server", - "@kbn/security-plugin-types-server" + "@kbn/security-plugin-types-server", + "@kbn/observability-utils" ] } diff --git a/x-pack/plugins/observability_solution/observability/server/ui_settings.ts b/x-pack/plugins/observability_solution/observability/server/ui_settings.ts index ad7afb004775a..dae7e2ad9ab5b 100644 --- a/x-pack/plugins/observability_solution/observability/server/ui_settings.ts +++ b/x-pack/plugins/observability_solution/observability/server/ui_settings.ts @@ -649,8 +649,9 @@ export const uiSettings: Record = { description: i18n.translate( 'xpack.observability.advancedSettings.searchExcludedDataTiersDesc', { - defaultMessage: `Specify the data tiers to exclude from search, such as data_cold and/or data_frozen. + defaultMessage: `{technicalPreviewLabel} Specify the data tiers to exclude from search, such as data_cold and/or data_frozen. When configured, indices allocated in the selected tiers will be ignored from search requests. Affected apps: APM`, + values: { technicalPreviewLabel: `[${technicalPreviewLabel}]` }, } ), value: [], diff --git a/x-pack/plugins/observability_solution/observability_shared/common/ilm_types.ts b/x-pack/plugins/observability_solution/observability_shared/common/ilm_types.ts new file mode 100644 index 0000000000000..9a96f8c39c459 --- /dev/null +++ b/x-pack/plugins/observability_solution/observability_shared/common/ilm_types.ts @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export enum IndexLifecyclePhaseSelectOption { + All = 'all', + Hot = 'hot', + Warm = 'warm', + Cold = 'cold', + Frozen = 'frozen', +} + +export const indexLifeCyclePhaseToDataTier = { + [IndexLifecyclePhaseSelectOption.Hot]: 'data_hot', + [IndexLifecyclePhaseSelectOption.Warm]: 'data_warm', + [IndexLifecyclePhaseSelectOption.Cold]: 'data_cold', + [IndexLifecyclePhaseSelectOption.Frozen]: 'data_frozen', +} as const; + +export type DataTier = + (typeof indexLifeCyclePhaseToDataTier)[keyof typeof indexLifeCyclePhaseToDataTier]; diff --git a/x-pack/plugins/observability_solution/observability_shared/common/index.ts b/x-pack/plugins/observability_solution/observability_shared/common/index.ts index 82d4bbfe6b3d6..d845ea1d398fd 100644 --- a/x-pack/plugins/observability_solution/observability_shared/common/index.ts +++ b/x-pack/plugins/observability_solution/observability_shared/common/index.ts @@ -144,6 +144,11 @@ export { export { type Color, colorTransformer } from './color_palette'; export { ObservabilityTriggerId } from './trigger_ids'; export { getInspectResponse } from './utils/get_inspect_response'; +export { + type DataTier, + indexLifeCyclePhaseToDataTier, + IndexLifecyclePhaseSelectOption, +} from './ilm_types'; export const LOGS_ONBOARDING_FEEDBACK_LINK = 'https://ela.st/logs-onboarding-feedback'; export const LOGS_EXPLORER_FEEDBACK_LINK = 'https://ela.st/explorer-feedback'; diff --git a/x-pack/plugins/observability_solution/profiling/common/storage_explorer.ts b/x-pack/plugins/observability_solution/profiling/common/storage_explorer.ts index 984619af5ea98..7705988274c41 100644 --- a/x-pack/plugins/observability_solution/profiling/common/storage_explorer.ts +++ b/x-pack/plugins/observability_solution/profiling/common/storage_explorer.ts @@ -4,16 +4,13 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ +import { + IndexLifecyclePhaseSelectOption, + indexLifeCyclePhaseToDataTier, +} from '@kbn/observability-shared-plugin/common'; import * as t from 'io-ts'; -export enum IndexLifecyclePhaseSelectOption { - All = 'all', - Hot = 'hot', - Warm = 'warm', - Cold = 'cold', - Frozen = 'frozen', -} - +export { IndexLifecyclePhaseSelectOption, indexLifeCyclePhaseToDataTier }; export const indexLifecyclePhaseRt = t.type({ indexLifecyclePhase: t.union([ t.literal(IndexLifecyclePhaseSelectOption.All), @@ -24,13 +21,6 @@ export const indexLifecyclePhaseRt = t.type({ ]), }); -export const indexLifeCyclePhaseToDataTier = { - [IndexLifecyclePhaseSelectOption.Hot]: 'data_hot', - [IndexLifecyclePhaseSelectOption.Warm]: 'data_warm', - [IndexLifecyclePhaseSelectOption.Cold]: 'data_cold', - [IndexLifecyclePhaseSelectOption.Frozen]: 'data_frozen', -}; - export interface StorageExplorerSummaryAPIResponse { totalProfilingSizeBytes: number; totalSymbolsSizeBytes: number; From cd32affc9265a8ed4d135d19f046c343c6317502 Mon Sep 17 00:00:00 2001 From: Kevin Delemme Date: Mon, 23 Sep 2024 12:02:44 -0400 Subject: [PATCH 06/41] feat(slo): Add optional pipeline processor in the SLI ingest pipeline for advanced customer (#193628) --- .../assets/ingest_templates/slo_pipeline_template.ts | 7 +++++++ .../server/services/__snapshots__/create_slo.test.ts.snap | 7 +++++++ .../server/services/__snapshots__/reset_slo.test.ts.snap | 7 +++++++ 3 files changed, 21 insertions(+) diff --git a/x-pack/plugins/observability_solution/slo/server/assets/ingest_templates/slo_pipeline_template.ts b/x-pack/plugins/observability_solution/slo/server/assets/ingest_templates/slo_pipeline_template.ts index e5aaa260e2f1d..c378cd745397c 100644 --- a/x-pack/plugins/observability_solution/slo/server/assets/ingest_templates/slo_pipeline_template.ts +++ b/x-pack/plugins/observability_solution/slo/server/assets/ingest_templates/slo_pipeline_template.ts @@ -64,6 +64,13 @@ export const getSLOPipelineTemplate = (slo: SLODefinition) => ({ .join(','), }, }, + { + pipeline: { + ignore_missing_pipeline: true, + ignore_failure: true, + name: `slo-${slo.id}@custom`, + }, + }, ], _meta: { description: 'Ingest pipeline for SLO rollup data', diff --git a/x-pack/plugins/observability_solution/slo/server/services/__snapshots__/create_slo.test.ts.snap b/x-pack/plugins/observability_solution/slo/server/services/__snapshots__/create_slo.test.ts.snap index ef8c79410fb39..d747d5083cd28 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/__snapshots__/create_slo.test.ts.snap +++ b/x-pack/plugins/observability_solution/slo/server/services/__snapshots__/create_slo.test.ts.snap @@ -57,6 +57,13 @@ Array [ "value": "*", }, }, + Object { + "pipeline": Object { + "ignore_failure": true, + "ignore_missing_pipeline": true, + "name": "slo-unique-id@custom", + }, + }, ], }, ] diff --git a/x-pack/plugins/observability_solution/slo/server/services/__snapshots__/reset_slo.test.ts.snap b/x-pack/plugins/observability_solution/slo/server/services/__snapshots__/reset_slo.test.ts.snap index 95f767988708c..00dc9bb4654ae 100644 --- a/x-pack/plugins/observability_solution/slo/server/services/__snapshots__/reset_slo.test.ts.snap +++ b/x-pack/plugins/observability_solution/slo/server/services/__snapshots__/reset_slo.test.ts.snap @@ -253,6 +253,13 @@ exports[`ResetSLO resets all associated resources 8`] = ` "value": "*", }, }, + Object { + "pipeline": Object { + "ignore_failure": true, + "ignore_missing_pipeline": true, + "name": "slo-irrelevant@custom", + }, + }, ], }, ], From 80c7583c57db76c0c643fc889fdf6719782a3171 Mon Sep 17 00:00:00 2001 From: Elena Stoeva <59341489+ElenaStoeva@users.noreply.github.com> Date: Mon, 23 Sep 2024 17:18:48 +0100 Subject: [PATCH 07/41] [Console] Fix overflow of editor actions panel (#193714) ## Summary This PR fixes the bug in Console where, when you scroll an editor content that contains an editor actions panel, the actions panel would move to the other panel and would be displayed on top of it, while it should be hidden. Before: https://github.com/user-attachments/assets/e29640cc-8ce3-4b5b-bbb6-ca6a5ce86ff3 Now: https://github.com/user-attachments/assets/25b3aa41-4ad0-48f7-925c-c5f354f551ed --- .../console/public/application/containers/main/main.tsx | 2 +- src/plugins/console/public/styles/_app.scss | 7 ++----- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/src/plugins/console/public/application/containers/main/main.tsx b/src/plugins/console/public/application/containers/main/main.tsx index c52e94f50749f..ef55f5406edaf 100644 --- a/src/plugins/console/public/application/containers/main/main.tsx +++ b/src/plugins/console/public/application/containers/main/main.tsx @@ -322,7 +322,7 @@ export function Main({ currentTabProp, isEmbeddable = false }: MainProps) { {currentTab === HISTORY_TAB_ID && } {currentTab === CONFIG_TAB_ID && } - + Date: Mon, 23 Sep 2024 18:43:45 +0200 Subject: [PATCH 08/41] Allow elasticsearch.publicBaseUrl to be set using an environment variable (#193716) ## Summary Allows users to set `elasticsearch.publicBaseUrl` with a ELASTICSEARCH_PUBLICBASEURL environment variable. --- .../docker_generator/resources/base/bin/kibana-docker | 1 + x-pack/plugins/cloud/public/types.ts | 2 +- 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker b/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker index 841be2f775336..110ca72895e86 100755 --- a/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker +++ b/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker @@ -64,6 +64,7 @@ kibana_vars=( elasticsearch.logQueries elasticsearch.password elasticsearch.pingTimeout + elasticsearch.publicBaseUrl elasticsearch.requestHeadersWhitelist elasticsearch.requestTimeout elasticsearch.serviceAccountToken diff --git a/x-pack/plugins/cloud/public/types.ts b/x-pack/plugins/cloud/public/types.ts index 1428e887f1b9f..2a6140ba8e97e 100644 --- a/x-pack/plugins/cloud/public/types.ts +++ b/x-pack/plugins/cloud/public/types.ts @@ -228,7 +228,7 @@ export interface CloudSetup { export interface PublicElasticsearchConfigType { /** - * The URL to the Elasticsearch cluster, derived from xpack.elasticsearch.publicBaseUrl if populated + * The URL to the Elasticsearch cluster, derived from elasticsearch.publicBaseUrl if populated * Otherwise this is based on the cloudId * If neither is populated, this will be undefined */ From e6e170e687a2221ebdcf49c0942cf6e40aed9b59 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20Haro?= Date: Mon, 23 Sep 2024 19:01:08 +0200 Subject: [PATCH 09/41] [Dev Server] Remove dead code (#193736) --- packages/kbn-cli-dev-mode/src/dev_server.ts | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/packages/kbn-cli-dev-mode/src/dev_server.ts b/packages/kbn-cli-dev-mode/src/dev_server.ts index 631eda24ba07f..2a47042959e77 100644 --- a/packages/kbn-cli-dev-mode/src/dev_server.ts +++ b/packages/kbn-cli-dev-mode/src/dev_server.ts @@ -196,16 +196,6 @@ export class DevServer { this.phase$.next('listening'); this.ready$.next(true); } - - // TODO: remove this once Pier is done migrating log rotation to KP - if (msg === 'RELOAD_LOGGING_CONFIG_FROM_SERVER_WORKER') { - // When receive that event from server worker - // forward a reloadLoggingConfig message to parent - // and child proc. This is only used by LogRotator service - // when the cluster mode is enabled - process.emit('message' as any, { reloadLoggingConfig: true } as any); - proc.send({ reloadLoggingConfig: true }); - } }), takeUntil(exit$) ); From b1290ceca87e9a385db5e2be574bdd101caa559e Mon Sep 17 00:00:00 2001 From: Justin Kambic Date: Mon, 23 Sep 2024 13:30:02 -0400 Subject: [PATCH 10/41] [Synthetics] Add tests for default alerting service (#193235) ## Summary As noted in https://github.com/elastic/kibana/pull/193201, I am attempting to increase module-level testing in Synthetics by strategically targeting critical segments of code that are untested, or very lightly tested, at the module level. While this doesn't provide the same quality assurance as e2e tests, it will help increase our confidence when we make changes that those changes have the intended effects, and that they don't introduce small regressions that may go unnoticed in smoke testing or code review. This PR is WIP as I haven't fully tested the module yet and I can only work on this as time allows. --- .../default_alert_service.test.ts | 465 ++++++++++++++++++ .../default_alerts/default_alert_service.ts | 14 +- .../synthetics/tsconfig.json | 3 +- 3 files changed, 474 insertions(+), 8 deletions(-) create mode 100644 x-pack/plugins/observability_solution/synthetics/server/routes/default_alerts/default_alert_service.test.ts diff --git a/x-pack/plugins/observability_solution/synthetics/server/routes/default_alerts/default_alert_service.test.ts b/x-pack/plugins/observability_solution/synthetics/server/routes/default_alerts/default_alert_service.test.ts new file mode 100644 index 0000000000000..887d7c71564c2 --- /dev/null +++ b/x-pack/plugins/observability_solution/synthetics/server/routes/default_alerts/default_alert_service.test.ts @@ -0,0 +1,465 @@ +/* + * 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 { SanitizedRule } from '@kbn/alerting-types'; +import { omit } from 'lodash'; +import { + SYNTHETICS_STATUS_RULE, + SYNTHETICS_TLS_RULE, +} from '../../../common/constants/synthetics_alerts'; +import { DefaultAlertService } from './default_alert_service'; +import { DYNAMIC_SETTINGS_DEFAULTS } from '../../constants/settings'; + +describe('DefaultAlertService', () => { + describe('getSettings', () => { + const expectedSettings = { + certAgeThreshold: 50, + certExpirationThreshold: 10, + defaultConnectors: ['slack', 'email'], + }; + const soResponse = { attributes: { ...expectedSettings } }; + it('returns settings if already set', async () => { + const soClient = { get: jest.fn() } as any; + const service = new DefaultAlertService({} as any, {} as any, soClient); + service.settings = expectedSettings; + const settings = await service.getSettings(); + expect(settings).toEqual(expectedSettings); + expect(soClient.get).not.toHaveBeenCalled(); + }); + + it('fetches settings if not set', async () => { + const soClient = { get: jest.fn() } as any; + const service = new DefaultAlertService({} as any, {} as any, soClient); + soClient.get.mockResolvedValueOnce(soResponse); + const settings = await service.getSettings(); + expect(settings).toEqual({ + ...expectedSettings, + defaultEmail: undefined, + defaultStatusRuleEnabled: true, + defaultTLSRuleEnabled: true, + }); + expect(soClient.get).toHaveBeenCalledTimes(1); + }); + }); + + describe('setupDefaultAlerts', () => { + afterEach(() => jest.resetAllMocks()); + + it('sets up status and tls rules', async () => { + const soClient = { get: jest.fn() } as any; + const service = new DefaultAlertService({} as any, {} as any, soClient); + service.getSettings = jest.fn().mockResolvedValue({ + certAgeThreshold: 50, + certExpirationThreshold: 10, + defaultConnectors: ['slack', 'email'], + defaultEmail: undefined, + defaultStatusRuleEnabled: true, + defaultTLSRuleEnabled: true, + }); + const setupStatusRule = jest.fn(); + const setupTlsRule = jest.fn(); + service.setupStatusRule = setupStatusRule; + service.setupTlsRule = setupTlsRule; + setupStatusRule.mockResolvedValueOnce({ status: 'fulfilled', value: {} }); + setupTlsRule.mockResolvedValueOnce({ status: 'fulfilled', value: {} }); + const result = await service.setupDefaultAlerts(); + expect(setupStatusRule).toHaveBeenCalledTimes(1); + expect(setupTlsRule).toHaveBeenCalledTimes(1); + expect(result).toEqual({ + statusRule: { status: 'fulfilled', value: {} }, + tlsRule: { status: 'fulfilled', value: {} }, + }); + }); + it('returns null rules if value is falsy', async () => { + const soClient = { get: jest.fn() } as any; + const service = new DefaultAlertService({} as any, {} as any, soClient); + service.getSettings = jest.fn().mockResolvedValue({ + certAgeThreshold: 50, + certExpirationThreshold: 10, + defaultConnectors: ['slack', 'email'], + defaultEmail: undefined, + defaultStatusRuleEnabled: true, + defaultTLSRuleEnabled: true, + }); + const setupStatusRule = jest.fn(); + const setupTlsRule = jest.fn(); + service.setupStatusRule = setupStatusRule; + service.setupTlsRule = setupTlsRule; + setupStatusRule.mockResolvedValueOnce(undefined); + setupTlsRule.mockResolvedValueOnce(undefined); + const result = await service.setupDefaultAlerts(); + expect(setupStatusRule).toHaveBeenCalledTimes(1); + expect(setupTlsRule).toHaveBeenCalledTimes(1); + expect(result).toEqual({ + statusRule: null, + tlsRule: null, + }); + }); + }); + + describe('getMinimumRuleInterval', () => { + it('returns 1m if minimum interval is less than 1m', () => { + const server = { + alerting: { getConfig: () => ({ minimumScheduleInterval: { value: '30s' } }) }, + } as any; + const service = new DefaultAlertService({} as any, server, {} as any); + expect(service.getMinimumRuleInterval()).toBe('1m'); + }); + + it('returns minimum interval if greater than 1m', () => { + const server = { + alerting: { getConfig: () => ({ minimumScheduleInterval: { value: '5m' } }) }, + } as any; + const service = new DefaultAlertService({} as any, server, {} as any); + expect(service.getMinimumRuleInterval()).toBe('5m'); + }); + }); + + describe('setupStatusRule', () => { + it('creates status rule if enabled', async () => { + const service = new DefaultAlertService({} as any, {} as any, {} as any); + service.getMinimumRuleInterval = jest.fn().mockReturnValue('1m'); + service.createDefaultRuleIfNotExist = jest.fn(); + service.settings = { defaultStatusRuleEnabled: true } as any; + service.getSettings = jest.fn().mockResolvedValue({ + defaultStatusRuleEnabled: true, + }); + await service.setupStatusRule(); + expect(service.createDefaultRuleIfNotExist).toHaveBeenCalledWith( + SYNTHETICS_STATUS_RULE, + 'Synthetics status internal rule', + '1m' + ); + }); + + it('does not create status rule if disabled', async () => { + const service = new DefaultAlertService({} as any, {} as any, {} as any); + service.getMinimumRuleInterval = jest.fn().mockReturnValue('1m'); + service.createDefaultRuleIfNotExist = jest.fn(); + service.settings = { defaultStatusRuleEnabled: false } as any; + const result = await service.setupStatusRule(); + expect(service.createDefaultRuleIfNotExist).not.toHaveBeenCalled(); + expect(result).toBeUndefined(); + }); + }); + + describe('setupTlsRule', () => { + it('creates tls rule if enabled', async () => { + const service = new DefaultAlertService({} as any, {} as any, {} as any); + service.getMinimumRuleInterval = jest.fn().mockReturnValue('1m'); + service.createDefaultRuleIfNotExist = jest.fn(); + service.settings = { defaultTlsRuleEnabled: true } as any; + service.getSettings = jest.fn().mockResolvedValue({ + defaultTlsRuleEnabled: true, + }); + await service.setupTlsRule(); + expect(service.createDefaultRuleIfNotExist).toHaveBeenCalledWith( + SYNTHETICS_TLS_RULE, + 'Synthetics internal TLS rule', + '1m' + ); + }); + + it('does not create tls rule if disabled', async () => { + const service = new DefaultAlertService({} as any, {} as any, {} as any); + service.getMinimumRuleInterval = jest.fn().mockReturnValue('1m'); + service.createDefaultRuleIfNotExist = jest.fn(); + service.settings = { defaultTLSRuleEnabled: false } as any; + const result = await service.setupTlsRule(); + expect(service.createDefaultRuleIfNotExist).not.toHaveBeenCalled(); + expect(result).toBeUndefined(); + }); + }); + + describe('existing alerts', () => { + function setUpExistingRules>( + ruleOverride?: Partial>, + getRulesClientMocks = {} + ) { + const getRulesClient = jest.fn(); + const mockRule: any = ruleOverride ?? { + actions: [{ alertsFilter: { query: { kql: 'some kql', filters: [] } } }], + systemActions: [{ id: 'some system action', actionTypeId: 'actionTypeId', params: {} }], + ruleTypeId: 'xpack.synthetics.alerts.monitorStatus', + alertTypeId: 'xpack.synthetics.alerts.monitorStatus', + id: '123', + }; + const find = jest.fn(); + find.mockResolvedValue({ + data: [mockRule], + }); + getRulesClient.mockReturnValue({ find, ...getRulesClientMocks }); + + return { getRulesClient, mockRule }; + } + + function formatMockRuleResult(mockRule: any) { + return { + ...omit(mockRule, 'systemActions'), + actions: [...mockRule.actions, ...mockRule.systemActions], + }; + } + + afterEach(() => jest.resetAllMocks()); + + describe('getExistingAlert', () => { + it('returns rule if exists', async () => { + const { getRulesClient, mockRule } = setUpExistingRules(); + const service = new DefaultAlertService( + { alerting: { getRulesClient } } as any, + {} as any, + {} as any + ); + const result = await service.getExistingAlert('xpack.synthetics.alerts.monitorStatus'); + expect(result).toEqual(formatMockRuleResult(mockRule)); + }); + + it('returns undefined if rule does not exist', async () => { + const find = jest.fn().mockResolvedValue({ data: [] }); + const getRulesClient = jest.fn(); + getRulesClient.mockReturnValue({ find }); + const service = new DefaultAlertService( + { alerting: { getRulesClient } } as any, + {} as any, + {} as any + ); + const result = await service.getExistingAlert('xpack.synthetics.alerts.monitorStatus'); + expect(result).toBeUndefined(); + }); + }); + describe('createDefaultAlertIfNotExist', () => { + it('returns rule if exists', async () => { + const { getRulesClient, mockRule } = setUpExistingRules(); + const service = new DefaultAlertService( + { alerting: { getRulesClient } } as any, + {} as any, + {} as any + ); + const alert = await service.createDefaultRuleIfNotExist( + 'xpack.synthetics.alerts.monitorStatus', + 'name', + '1m' + ); + expect(alert).toEqual(formatMockRuleResult(mockRule)); + expect(getRulesClient).toHaveBeenCalled(); + }); + + it('creates rule if does not exist', async () => { + const sampleAction = { alertsFilter: { query: { kql: 'some kql', filters: [] } } }; + const find = jest.fn().mockResolvedValue({ data: [] }); + const create = jest.fn().mockResolvedValue({ + actions: [sampleAction], + systemActions: [], + id: '123', + alertTypeId: 'testalertid', + }); + const getActionsClient = jest.fn(); + getActionsClient.mockReturnValue({ + getAll: jest + .fn() + .mockResolvedValue([{ id: 'id', actionTypeId: 'actionTypeId', name: 'action name' }]), + }); + const getRulesClient = jest.fn(); + getRulesClient.mockReturnValue({ find, create }); + const service = new DefaultAlertService( + { actions: { getActionsClient }, alerting: { getRulesClient } } as any, + {} as any, + {} as any + ); + service.settings = { defaultConnectors: ['slack', 'email'] } as any; + const result = await service.createDefaultRuleIfNotExist( + 'xpack.synthetics.alerts.monitorStatus', + 'name', + '1m' + ); + expect(result).toEqual({ + actions: [sampleAction], + id: '123', + alertTypeId: 'testalertid', + ruleTypeId: 'testalertid', + }); + }); + }); + + function setUpUpdateTest>(mockRule?: Partial>) { + const update = jest.fn().mockResolvedValue({ + alertTypeId: 'test-alert-type-id', + actions: [{ id: 'id', actionTypeId: 'actionTypeId', name: 'action name' }], + systemActions: [{ id: 'sys-id', actionTypeId: 'actionTypeId', name: 'action name' }], + updatedAlertField: 'value', + }); + const { getRulesClient } = setUpExistingRules(mockRule ?? { schedule: { interval: '1m' } }, { + update, + }); + const getConfig = jest.fn().mockReturnValue({ minimumScheduleInterval: { value: '3m' } }); + const server = { + alerting: { + getConfig, + }, + } as any; + const getActionsClient = jest.fn(); + const getAll = jest + .fn() + .mockResolvedValue([{ id: 'id', actionTypeId: 'actionTypeId', name: 'action name' }]); + getActionsClient.mockReturnValue({ + getAll, + }); + const context = { actions: { getActionsClient }, alerting: { getRulesClient } }; + + return { + context, + server, + mocks: { update, getRulesClient, getConfig, getActionsClient, getAll }, + }; + } + + describe('updateStatusRule', () => { + it('updates the rule if it is enabled', async () => { + const { + context, + server, + mocks: { update, getAll }, + } = setUpUpdateTest({ + id: 'test-alert-id', + name: 'test-alert-name', + tags: ['test-alert-tags'], + schedule: { interval: '1m' }, + params: { param: 'value' }, + }); + const service = new DefaultAlertService(context as any, server as any, {} as any); + service.settings = { defaultConnectors: ['slack', 'email'] } as any; + const result = await service.updateStatusRule(true); + expect(result).toEqual({ + actions: [ + { actionTypeId: 'actionTypeId', id: 'id', name: 'action name' }, + { actionTypeId: 'actionTypeId', id: 'sys-id', name: 'action name' }, + ], + alertTypeId: 'test-alert-type-id', + ruleTypeId: 'test-alert-type-id', + updatedAlertField: 'value', + }); + expect(update).toHaveBeenCalledTimes(1); + expect(update.mock.calls[0][0]).toEqual({ + data: { + actions: [], + name: 'test-alert-name', + params: { param: 'value' }, + schedule: { interval: '3m' }, + tags: ['test-alert-tags'], + }, + id: 'test-alert-id', + }); + expect(getAll).toHaveBeenCalled(); + }); + + it('deletes the rule if it is disabled', async () => { + const server = { + alerting: { + getConfig: jest.fn().mockReturnValue({ minimumScheduleInterval: { value: '3m' } }), + }, + } as any; + const bulkDeleteRules = jest.fn(); + const { getRulesClient } = setUpExistingRules(undefined, { bulkDeleteRules }); + const service = new DefaultAlertService( + { alerting: { getRulesClient } } as any, + server as any, + {} as any + ); + await service.updateStatusRule(false); + expect(bulkDeleteRules).toHaveBeenCalled(); + expect(bulkDeleteRules.mock.calls[0][0]).toEqual({ + filter: + 'alert.attributes.alertTypeId:"xpack.synthetics.alerts.monitorStatus" AND alert.attributes.tags:"SYNTHETICS_DEFAULT_ALERT"', + }); + }); + }); + + describe('updateTlsRule', () => { + it('updates the rule if it is enabled', async () => { + const { context, server } = setUpUpdateTest(); + const service = new DefaultAlertService(context as any, server as any, {} as any); + service.settings = { defaultConnectors: ['slack', 'email'] } as any; + const result = await service.updateTlsRule(true); + expect(result).toEqual({ + actions: [ + { actionTypeId: 'actionTypeId', id: 'id', name: 'action name' }, + { actionTypeId: 'actionTypeId', id: 'sys-id', name: 'action name' }, + ], + alertTypeId: 'test-alert-type-id', + ruleTypeId: 'test-alert-type-id', + updatedAlertField: 'value', + }); + }); + + it('creates the rule if it does not exist', async () => { + const { context, server } = setUpUpdateTest(); + const service = new DefaultAlertService(context as any, server as any, {} as any); + service.settings = { defaultConnectors: ['slack', 'email'] } as any; + const getExistingAlertMock = jest.fn().mockResolvedValue(undefined); + service.getExistingAlert = getExistingAlertMock; + const createDefaultAlertIfNotExistMock = jest.fn(); + service.createDefaultRuleIfNotExist = createDefaultAlertIfNotExistMock; + const result = await service.updateTlsRule(true); + expect(result).toBeUndefined(); + expect(service.getExistingAlert).toHaveBeenCalled(); + expect(service.createDefaultRuleIfNotExist).toHaveBeenCalled(); + expect(getExistingAlertMock.mock.calls[0][0]).toBe('xpack.synthetics.alerts.tls'); + expect(createDefaultAlertIfNotExistMock.mock.calls[0]).toStrictEqual([ + 'xpack.synthetics.alerts.tls', + 'Synthetics internal TLS rule', + '3m', + ]); + }); + + it('deletes the rule if it is disabled', async () => { + const server = { + alerting: { + getConfig: jest.fn().mockReturnValue({ minimumScheduleInterval: { value: '3m' } }), + }, + } as any; + const bulkDeleteRules = jest.fn(); + const { getRulesClient } = setUpExistingRules(undefined, { bulkDeleteRules }); + const service = new DefaultAlertService( + { alerting: { getRulesClient } } as any, + server as any, + {} as any + ); + await service.updateTlsRule(false); + expect(bulkDeleteRules).toHaveBeenCalled(); + expect(bulkDeleteRules.mock.calls[0][0]).toEqual({ + filter: + 'alert.attributes.alertTypeId:"xpack.synthetics.alerts.tls" AND alert.attributes.tags:"SYNTHETICS_DEFAULT_ALERT"', + }); + }); + }); + }); + + describe('getActionConnectors', () => { + it('fetches settings if not set', async () => { + const getActionsClient = jest.fn(); + const getAll = jest.fn().mockResolvedValue([{ id: 'id', actionTypeId: 'actionTypeId' }]); + getActionsClient.mockReturnValue({ + getAll, + }); + const service = new DefaultAlertService( + { actions: { getActionsClient } } as any, + {} as any, + { get: jest.fn() } as any + ); + const connectors = await service.getActionConnectors(); + expect(connectors).toEqual({ + actionConnectors: [{ id: 'id', actionTypeId: 'actionTypeId' }], + settings: { + ...DYNAMIC_SETTINGS_DEFAULTS, + defaultStatusRuleEnabled: true, + defaultTLSRuleEnabled: true, + }, + }); + expect(getAll).toHaveBeenCalled(); + }); + }); +}); diff --git a/x-pack/plugins/observability_solution/synthetics/server/routes/default_alerts/default_alert_service.ts b/x-pack/plugins/observability_solution/synthetics/server/routes/default_alerts/default_alert_service.ts index 4b7aeb5eed7e8..2e2263f6e3965 100644 --- a/x-pack/plugins/observability_solution/synthetics/server/routes/default_alerts/default_alert_service.ts +++ b/x-pack/plugins/observability_solution/synthetics/server/routes/default_alerts/default_alert_service.ts @@ -79,7 +79,7 @@ export class DefaultAlertService { if (this.settings?.defaultStatusRuleEnabled === false) { return; } - return this.createDefaultAlertIfNotExist( + return this.createDefaultRuleIfNotExist( SYNTHETICS_STATUS_RULE, `Synthetics status internal rule`, minimumRuleInterval @@ -91,7 +91,7 @@ export class DefaultAlertService { if (this.settings?.defaultTLSRuleEnabled === false) { return; } - return this.createDefaultAlertIfNotExist( + return this.createDefaultRuleIfNotExist( SYNTHETICS_TLS_RULE, `Synthetics internal TLS rule`, minimumRuleInterval @@ -116,7 +116,7 @@ export class DefaultAlertService { return { ...alert, actions: [...actions, ...systemActions], ruleTypeId: alert.alertTypeId }; } - async createDefaultAlertIfNotExist(ruleType: DefaultRuleType, name: string, interval: string) { + async createDefaultRuleIfNotExist(ruleType: DefaultRuleType, name: string, interval: string) { const alert = await this.getExistingAlert(ruleType); if (alert) { return alert; @@ -152,7 +152,7 @@ export class DefaultAlertService { async updateStatusRule(enabled?: boolean) { const minimumRuleInterval = this.getMinimumRuleInterval(); if (enabled) { - return this.updateDefaultAlert( + return this.upsertDefaultAlert( SYNTHETICS_STATUS_RULE, `Synthetics status internal rule`, minimumRuleInterval @@ -168,7 +168,7 @@ export class DefaultAlertService { async updateTlsRule(enabled?: boolean) { const minimumRuleInterval = this.getMinimumRuleInterval(); if (enabled) { - return this.updateDefaultAlert( + return this.upsertDefaultAlert( SYNTHETICS_TLS_RULE, `Synthetics internal TLS rule`, minimumRuleInterval @@ -181,7 +181,7 @@ export class DefaultAlertService { } } - async updateDefaultAlert(ruleType: DefaultRuleType, name: string, interval: string) { + async upsertDefaultAlert(ruleType: DefaultRuleType, name: string, interval: string) { const rulesClient = (await this.context.alerting)?.getRulesClient(); const alert = await this.getExistingAlert(ruleType); @@ -213,7 +213,7 @@ export class DefaultAlertService { }; } - return await this.createDefaultAlertIfNotExist(ruleType, name, interval); + return await this.createDefaultRuleIfNotExist(ruleType, name, interval); } async getAlertActions(ruleType: DefaultRuleType) { diff --git a/x-pack/plugins/observability_solution/synthetics/tsconfig.json b/x-pack/plugins/observability_solution/synthetics/tsconfig.json index 8446b7850d3a9..d0822a733baff 100644 --- a/x-pack/plugins/observability_solution/synthetics/tsconfig.json +++ b/x-pack/plugins/observability_solution/synthetics/tsconfig.json @@ -99,7 +99,8 @@ "@kbn/core-application-browser", "@kbn/dashboard-plugin", "@kbn/slo-plugin", - "@kbn/ebt-tools" + "@kbn/ebt-tools", + "@kbn/alerting-types" ], "exclude": ["target/**/*"] } From df2ccb6789537a5a7474cc8a1601696188551352 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Alejandro=20Fern=C3=A1ndez=20Haro?= Date: Mon, 23 Sep 2024 19:33:47 +0200 Subject: [PATCH 11/41] [#192624] Fix archive for `incompatible_cluster_routing_allocation` (#193741) --- ...1_migrations_sample_data_saved_objects.zip | Bin 6423883 -> 6627686 bytes ...patible_cluster_routing_allocation.test.ts | 3 +-- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/src/core/server/integration_tests/saved_objects/migrations/archives/8.0.0_v1_migrations_sample_data_saved_objects.zip b/src/core/server/integration_tests/saved_objects/migrations/archives/8.0.0_v1_migrations_sample_data_saved_objects.zip index ff02fcf204845da36bab4e54db0f42781370e01f..b409f3d8a722785f0afa47dd2592ead22a7368d6 100644 GIT binary patch delta 212372 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

dbudAp^)UoQ6`@*Fb*t-RV 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�!6srztgR-H|FvFb-l5E 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

^-IXWD>C2)(3z zUnSoG)oqIARtYDfUdY-Iw|ysAQ@OdX4WYIg1m?%@GPb!!Nc8!U*KES*5l%B0(SN~@ zg@ae-kX_A6;hzFx2%TBA>MEa=&3m94ZP32lOF|Uu(JP1gvNkAg! z6WMLd{Ok4r!u~2Hf~s~Sruxyin|4d!GiuAT_r3;Z5E!fZxtO|sXpO~WPH63Ub7Z)2 zEPWs6=pquD1pcjQ5H<$vN{VNnKYwR%U(V!+tt=2fFOdXZNXmw<8eDgd)zXuGPqxKC z6#n2y`YZU}hPE@;4CWB@^&LO;z3wudF0qfR62*b_L^U&8QtdRT4WUu}YLFV}wLgYD zQj8~@qfs5OG21# z-iFrF-ENzh#>_aE^l;>7 z34dL*JR1>EQht!yLfE2CYK%Fkva&y z8O*T)iusOmr!W(`an0BB#Qm&0KAx3(@p6c!d$vV@VLW;nuFvE82!DlZa(^T-^%5`l z3=PnbAwMze4a);llx57~d4;RfZ9LispW;G{l(*(SWu~u~=65d!vR3{~*hue?&rhwsG@Urc7rE1P zn(Y@k>S*sV@2^7ebEm-*eAo1hF2Y@mKNQs{SIVi%jj->Rw|}pk@cY*KFG@`kuiI1L zj=_e5>&mL!k$P*aUwf3pbLL-gp|DQnNP|@H1M~~Gf~$|{d(=W(K=?kf+~Ngyld`!a zhCZx&(csyTOz*_Fs*|Fpp%F2&i6&@}urfSLv+feU&yt$Iho<;%Loa{u>!FXe(s{pezxOh`{nXj68r<$r!E9Wj5=#gD)0)kjhSBhx4@qBAhPTZ?)Yxr-Sn*q9ym|BbOZM5>lhFuoOU24bX*2Jl-&ChxH<=S&0BK) z=@hz!_kSuO^9fR|CRJ-I*a$8xXS{TomeF+Zbd$>T%p?nn{J_O9X}+k+VPXW9!dqvr zUE+ltc-R-PY7n7KtPOB5LB6uQn@3w)NO*t^WK`i^e@;WR=#$U#UWRJRwUTSEzIL%J zgLcb>vw1$?i+_Eep?d9RXXK2JdZ;CIXo=kvgMaR3E$=Ihk7Q-Lkvvh}Wke)FdT!SA zfCS^LiI1leG^~yqYClh|?+MnoP2{PPTV(7R?DFqaRtJ+uK?XOhVdyCKMsYxY-=64@ zFdmCr<>Ivj0j%Tj&^?StUW_S2&OQ~;261sv|G*7o5sM0)X>lITO6B=8 zvVWSf)wCNhojCby+@(8sffJF`doxhwr7_f9Z4O0othp-nzwJS}C+w(5I`pC@L4EGu z$!o1^+w+jp;c@a|FVpKhqtlsxL_kx~!6?Z9bkZ-ZfVRhg;trd=Au4R1woBQjMSEDY z9fMp0)Hx3v6n|tQ=h+3>LFRX5aPqB_Q?Srwj`4Q z>D;lqJ#^G*DZ&--`qGAYPm?_Z1>M+XFCg!BAshCosPw(bpU}N%-<2J#{3@BmKWUA< zSeD~K7shEl34~o=hX%+l?@_X_%)*&u1G0I69Npvd?dBf$9|CFEBBy~S;6=AU!+$gO zMtGltl11MLfw@bCY=#TC*X<;{e)N|e2{WtKAQ+7L@1+frAnWC*V16C-v@q=j1kndy zFiw=YzMuFia3Fl68UMHuHDCkg<^Th5e}M4x0D(Y$zs8n7Z0`lqkimUJikD}a>gT@H zKkuQqEX<31@c1dEy!WQFIify5JIb9O6N`Vhze$6qXiHgqB)DR;3>h7zXk?>R2%~$P zm{$1@FbFjsFTUi7mubO!{(e9nB+~wxnWJknc9tx=dzq&qY=g7dUsCg-PbEg^z_HLz z2BT^}_ds4aUSFW&>k&8Ky%cZW0v$+iiM^VibZ@Amupigni{H}?ua5}FisS2Yc;A1M zt>AyjaYtVTo#foX_^&T9_(%pOlO2$?8_uXXWME%)}@ zY5!9XW)8LXYv#=&ffLc8L!6#&!u+epu&09vUIl+FE%N-_wp_ef9kDYg-Eg)?fw-L(t7y5^ zkEH<22S;g~yyn!z`vQr5mpSQcx8Y0{oPPd+5YhmQgY`_OG^cJH8BLhXP1MF8L+GKbQV( zL`k+ob?U}gVoo239r`RBf|h5-5Ki!p!mP6OwdJbaIQc3n9;<&4Wdo@~4J@l!?*4Lw zrV$)StW&^4u?5urK^y_H=KgG>G)d9jS)OFoPPp`pz*2CACQ&5>ulgz2vPP8=K#zC? z@Oc*2_X@?y*glf6i$;}DN&INPH#RA{fo`w1@MKw;jnf=tV>RqMBSP-AQ!6G-ao|1P zMKH@>5N1{BuXTUQb(C3JzJ{|KmJa7dbll*vM3%dsgzo}KAtJz`;i43un zj`-J*UcFul3J`fzcw1CnSN$EyFx$o(wRMtAgx4cN$oYetH1vUz^~+k1ST9E7_Q~5u zDHJ|keyz^T1O^02&9wy)sDc(u19At0Tft(8_j?7^&!V|Yzm{tP6R^J*eMwe zHdEgh4JSmpvOtxEayXFF+xgV`oufg&k%^Iuh_d!B62p9_LlwRCy{+iZA_zY=rT*D< zrf2T=ecS~BpnOoCK5iko#Rx-Y1j1rB{TB_);96}pv{_z~drfbng11_{5JYu%cNBwS z;_J89m5P6hmsSMKLN-j|g{I_b3|T6c5Luk3cwE^Z5@vyJX1*gD#IfHn`a65xBz_eG zua>_+82x!xQyRllzrsecpW>g3SRP< zHKR8B3g$M_DmCwu39${TBhs{%ZvDyHNEE#H3~GXN2mUUP)bBEm?it)WOq`h<^52nk z1Pgz7_b+pW=sDlY=RR>|r%lS?zg|?Q1L19wPA}dZVDBLh1bcli^UFU8tG}!ed$~An z3I$(#Q360iz%XCd6x&tP!eJh1Y7etwv>uFG1nPyiU9}q>s@w(0R%BU(jMwF(g7D^Z zy*5t`b{~V@_U0|z1y2NMXd1egg2n_e``&*TcHtIpQH6ma1G5zogOW@GAv!QNqz$#h z;X_Ds-nuhqjhl?1@aNdBL zE3A`72|fC*t#PtLG`K;aG;L=t1Ek=FN1)Rf(6yYAi{ZSnqmjGTSqM9xG*&YHN*#YU zZ-253?vqZ7g4pFq4n1#(Qa`tgRiB{tfskR%YfjY9H!EX0izhqRxe-^#%s$oa(nmFr zEb)CoqH^s2h%&xtY6xwVCi~V4d>TNnI;obbH~I7u%j{6eGlJLh@a^b0q{>7aMG*4i zq(u)EfUPiiOa?9SeGyEg5#v?4jhKHmv**9X$3z`ePluw1^t8AwmP@k1eMePw#gkvszAVU=5>bllXR96dMy2Wrg3Un> z1!mmVo{S=Q^7@QE70FZTVi}6`LtCI1fa^}kx@oWKsS39zvd(=nj!O6|plf7#=(S_z9Mo1&1bJw+EnU934gMnsdpN}r?j zw=VnL{KiVKBv4-S@>kK2DL65luJC2I?#;J@2x%^6oy+194b8jX+~9dx_BY_^hJ z&rifIP0#9jP=z;%dr(a%-#h;#OQf;;X1UfWg~YF%v3&X z1l6Cv0og2Pc}Bt1st*t^1}5;p3Br*c@1XK5h>lOgg>U}Dv$PW$J63-Ol--U%hJ4=e z{IizcmD#ha8R~h+=-N0WOG(N<2G3Ap-(_nqa{PR{gsPfR%-iiY|90NnXGdHWe;)l0 z={Am-)pZs?3Y`+oMR|j!Y*G1h7DYpD`kKS+^vf+Pest}rC`?KKrp+ZD&2_gHT8JQ@ zqfAg(5${LXcFU3j!y@~_x1en3P)ZcR&2%Xlk)aw-`6E-nDbi6{S0oY5=NnIus6{OzW7 z8R7MPbsSrTIWuXKbAat>{USs$G$4Q+*x#Rb?2D`nt#eC&cVU13R_5hpj(HZI7y93J z&YYe5qy5p!#a8lfjU#Al*WmgBw7T4c3CY!gtqClQ**wU>+@3>to@M+vH%{1rUL9EL zi`PoXnVr)C%{QNt-_&pR^P4;pWI8tl`3IH5i=+Pb=tGt6wpOXmURragDvi^D?qgvKStVh|O9xi2DR5Bg@6$xR5ppC`scL`umpJZQ01xqBXII)Mwg}&E z^L4@g6gnoE*AQhqC82oBHl*k08DQOa!KsulTU+n#H|R7zx|q2Q_DI_|(GERFJ($m34@ju{ zQODhu7NFq^M=cIJ^ZWw9r)SUUwS&2dUsj&9ypU>iUb^-72F|1^jNdwPsokMuxYwQD0 zmxf;ub1gkKS*l6V+J?RvCzP2D>*qCd54X##IPj0gtDkKOyR2rA7jEkaefe>^xY}O1 zZ@?d$yJb2`#1S4EW%=UpXp*2oN%(ta@FAFll!yS)&P$xCww{`^;P~ixOnHsOp6%q5TM`F6+Se)zA9(w%N+`(Bi)7HH`SpQhPvOOpXI^qr!ByVaW~LPJaH~wWI#ujxXx_Q3-w~0uCGhJ z6nrjPn*kq&9Y%-8S~6vTG^_`WvcXiCYq*rzdI>8=;8>GwXlGIJht+V-%uor&@nz30VpdN6Y;TqIM+W(YW3^+YBwdd5^3NFepk?7`! z32Fk<6#rPZT_J==>oA8YBOb3GVCIdGQb1euALDTA2zw;u4lnQQOw{H)qX8s?^Pu>Z z6A8;)zDXKhhOAfs}398@G6u`R$Kl| z6^+6i;vp2c=QuwGPf?fu0`XF$;S{U7xGCCMK;uNxvUz5PW}Xsm2lecz(&73EXK7rgqiD8MKo3{;Oqqj3snM#W@pS{8-c0HP2Bf z;YCb^Yn$=}6PZ=T-Fny9zwkvQ*%(hMP>x7f0tyNyRZw1KRN&mu4Cn&gKxdXXdOxU) z3sIA>)LFFpp2i>r9>wOxu7`)k9e_5akPKqn2#U$-BL#m`Q*qpCPe=9h zn6?k(M3@EiDEn5o?$wYXv?BzP}P~g zX!v%X;6%tEZ*GpO;SdQdAHvGkP$(+*D7(RZ)P^0#%thKeT zOQeRPg~xw1vGL64C=%mv^;c#;X^XSrjj>Lb2A+H6p72T3OB%FS@UqPRO1<5 zD=AVKnOn;j*ugX*(Z}p!kGd11u$rE}o?Nc5&kPrwV`dMTlEhfwJ>@(6dH(Jv>AOE? zMA?hJv~PA{)8X7Ye}N1im^A#!nodXkZ!G1&+x~y)vVA^ncZI_${3AuVcSQ_x>}UKV z0r!u1?Hn%X&m2^uJ>QdE)=M7h37uld3!Y;SRbV;DX7!qyLoo6{F6v7$!z4ObfZZUH zDirmH+s}^hcW~T^1NQ~J;BM6*Qi+hbj0udT+ZfJLC8%fZT&O)t4PY-|7 z%1lu$yCjGK7!YEUkQ(A090|u=)qBf9w_`%cnm4$ytu*)4x@vs8J@E|R6XCq|(+%PR zz%7S3pnP7&GP|23K%bFB_o4)sH(smq?iJDYg{sncvTm8%?XkI)`<2x|r1dFNhEy(+8t8np_ zfBGFSY?qvmcYiTdEq{_w`fm->ORx2(O*qqmM z7v~fmwZt@`S?|0qHqx;B)yGAV$-=WYXr?=(0vD>M-dHOj+uEaMZXdROJ3II$;z@ls9c(Y=u=VN!n~1SP*)^-qyS zrZ-3h1VdSoc6T-&mA;xTJn&Y7jik-nO<1M4U6~yV3oJOr^1SyWTL1ml-QUif)30?Y z0r9_I>p$?dPIWzhzR~)3UyE=r_$orhOW78Xyb~&1KOPt$hc@_8!Au1~73~Z7B!0Re z3z{02+}N0bH0BxuJqdpkv92~OihI6*hdi`YIyIAu5-dtnqU-zM#Gzukq+Za;p{vg@ ziug?VG-ztWH^p`z5`{LaEhVZPp}xcjdnW@gzr(nk__AhrWN$C-3JldxvUd9aJoVI7 z`;Yl&r+}hAHCbof3fzUg;6fj7#{joFj+0nqImg|)q&gTB!-Ri$5biJxIY{=B{PFvE zN$id%1q4XKzIL%|RWtXieZh@rU#pWwQ%Y>sCKzYkeJQb!%eO(PMEbri+$~=@WOK!0 zwrIYz*fqK?yb3-wC=9x}XpiVI37h=-hBm`&{J;$U5kCITxOpr#tbFr;n84Q>zWp&A zJ-O6U=yEvH+})%p{bBUb`MjjLr?~^pEY`4t!OCrMq5eZ2pIei&N|oE+EfF(G4-mfY zt3ZE%UYnjIiemPNO;+o8{9h+v zuc%CgQ-$fXS~p5jqeo|3x29~{&H+}jZY?8v8B#V_wPr28MbWZ-R6Iee>U)QjSC3^{ z9RcxZV@QH;P;Zl=H$mQ%p@DmPjw%J7y0O!sdwiItJ7uIt8Se0215Pl`*GeKl^xRZh z1BkMn4K9EGf}GSn&{P2`ViEB>xf@Lzb2!76tpl#R^>@g~oIz6c$7KNhKr+%iHQcucZ7%xh(>Vd8M16#a-U( zQ{%m8Loco9g2IUFGCh)kWN^3{JxVGwUuAP4ra6C^iaS6^<-Ip;cCmEJ$FE;^?XfDi z9P*nm!$mP$GQ%aENcRlM@7M?55(;}JXC%;^dP}{ahKby|+02T1hy@nm^X4eML8-J) zT-R5NC9eojPSV^^csa|CMHl`_)UD-ouUvez$+{-D3itcg=5veXnu~XCH zkXwJhv<}IyMuy44N=;=S#YP#RFHH>N+Ibl5&HU(59aUa@;|5e`FoRD7^ScL4n1W5v z-tYHDXTnI5+{3}0SH1{Gq{^x>-}m&8TyT`$rRYX;Jp#{j6MLO0%g^#|7eCF?3jpr( zRT=PzMe+`xUS)(%J{lJtgLIvG{h5EakZ51ikGt4@eJZvpCSa-BQ4tW(*PQwW z&M$GX3`M5U0v!#_3Dm_n?Fro%a?+jcR7hMDy#r24KtljwA%!Beyko@@BimZ%ULda! zZL$%jexabP9H_X{q_T8ACzTRubtl!Bb|ut6^=9#haRS@9MD|IFjfQN&@eVBq@Q#1* zn8hlK2;#Pu1&GXhPy0ni$2L%Tzl?&kfUj9#d}&vv9nUtd5vFKE^6!&cq(W6`vLna# zqYL|VOP@N+DOr%z0^>+OaOT1FXZUoYNy!$zh@HsA2wGySH$u_%U*HDTBZClF`qh*Y;=iCN>> zUMTc1EE3%cg4_GLqp7Q$jr zS7WUXjT!GZKf}pe(EhysCDhzu%3V2E~b5fEsy1=352SSdr;H=JP^+PX}7H0 z%R~bjdN)5<$4G}r0ULj}wkJ)f44FC%@e=ejbZVfzQfVC^FhbI9?p5OTVIb_L0)W(h zZ-S37>xvO{9^m5HpoRm6kC5x^Q9DP${PAeI_%W6CQn_ys4sZB!z((B<$2y$JBZySB zU8Gy%Z7_VYu=08c-n#8Rr*NCwV^ksH_n$Z!)?O`mzJgeIeDHq;hM#uRg7DG2(Idk{ zO^-*=A*PBGkenu#xlqyxrU8)#J@=g%NdnlEFq+`6$=!RjvprU~ShQnz&6s+@dG5=m z|04#m`}LSR(&=-~FFkLsO#)SQwa3O^xh6o(IOHF7r$4b>r{MHlD48<!vb>jDYzQe zIOjkYw3$Ua2t;&_FEFFddUV72pw~3%l&}_+oTxybR)@4bjm=GHnJHmPubh9=~LcSjdPbT;ETbO189GMP?Z&9x74xsu%&R_166{xwKB5M zaV`giE-1X#)USF2$v;$&OI+YBSMq-A4Nn%`8|Xj~RbPp!+%+{lI*=+K(`I_A^?>N7 zu_Wf?rE{ZvRgxym11WI~S+TfM+<~-*Wg*0U7RdvI)WO?NMTqVM?L#?C!}K*rEAHFS zfY*O+l(!64D=hMox41ukzMyhDtsRst#vr2v%$s?fpXb?h{-ou$j%`Xme*J(Kk$E%`QX~Cp4`tLncf9PnQLOjx}$c@KYxoV zz0M?9_0(x_H7!{HE&-_N%wT0#2xRlx@8^FG;oGFQ;gj}ItdI$`BVTKx7|CezENPIk ziyOJQh*3K<{C-m+Z}zi*GayCW6qp?80t zTgz!gw!mMT2Eiey=rrkUQLPLy9_h7Z%j9;=d16s9u}*?!4CZMSDhR_bU^gMEB)g)| zAktX@&?Lw?$osO{%g7m3-|@vSI(ISMMq%IDidn$-Lu71iJm(iyn4|X6GL*I`?Se1S zYjjFgTNEplBa5vs;WGd>P34qB$RyhPtx5Vt{`5+`(0P;eUrzU5;^Y5QlN5M@ zL1m%Q;XVVEo&#X<9UnP|T{8Ox3YFzb2v+7Vc0j0UFP5;L+c>fQ)y4_!|H!@x?H`-< zw4bETf6+dRpJm(sJ8ip2WAT4iV}t%@;5@$LBY!qFfM;F>Q9fTfdAXeV+*r`QSUvrp z&*uT3{ij`Wx%&Rnj=0}9v~3Mc9RVW$k#4)d;>Y;F>>M5=)lRq+@T1Dxo-vMO_A#+z z`Sg&A?eHH!Qmqon0|zovw9ICSt>g<4h@@>(kY@z)D&+=0(SO2Ci@<-t5e%V-c=>4; zWQ`1bnyz^;025-D@}hlB_dd@amGRGo=(DeBKO*oHjkyw*lf3fP0t#Adc~u5Th%0 z3l0B3{^#;;+!Y&(bo_t2bOPJLfNuzSYQyu6?~ceeuO>kI_}|XnDOR0!>X%Oj!ZLw+ zL_fH_zN7q44eUR)fqv6#e}RNKU)J`oK}!Cy)$s2_N(jF}N-l$*|NjFiIc@WQ0#fq5 zu~#9``Hp*G&&?EAzbx&clCz&ffnY-|TN7F{em+ zsy{^1|Ce{1Sh<^ z?kaC)!mw1MIT+|+V<5HQh!@C$tX6oHNqq~++2G`BW{ACoKL@8NOrw)y=HE3IdEPkM zEbN8k;F=1mE9!r$&L?i8g2@$~?4p%W`Xs|Me7%&|J*#pgq0dGXkGzyBT$j2eZt<~* z9cAU0UF=#DSWzMp#-J_Yg1v*_EkK75Vk@5Z{%)0wib>@u9m*Mc`tfhk)0Z(Hm*Eu= zKP84cx6Xb8ECBsM>SGw(e-yp&7XY}B^IF805NBW~b)A2{QqAJ;jxnV1PS@ULkRF01 zHU&qCCn%w+(9234;=K$eWU84&t#3CM0ihSTq5aelZZ?*Ymy_zwI~q>(l{=dTszy-$ zWTiAES+Bevf;;E(HGa*QBMKYJa~{aI>BHinop^;?)v3;}ttfA^ejCWQ`>F_94L6U6 zDYr0AJMMpNMk(t%(d!7SDS~F^U%q&9^u1k?C{qRsJrq*X2L_;Ffcdt+p@9pq5)G*@ zBD`_$xeUPdv2lT250eT@0nYS7gBP9oBZwT@%)n?A2JGmLqsi_O5^;l)wsH_0H%FK? zDM?bzATBAfMa&)gJNW8_*U}w_&ql;)fMcw$Yo>n-6u3LBI6Ed!Io5?cmPkG+Bsi}R zcY+HN@l#01&r2Wvt?bIB%8Wnt$r7%lBKt|^$mpt*{~Iu@Q?{)?ZN-Ig zf60dZKR@nI7vsMj_k?Fhtd&1cZ+WRJO25S{JjZH{ z;78;1;~_NwU~d+FXbQZV_$eRy1SUDqB(vK$(SHRj(BR+ zy-*A@gS<@C)~#I_HMoqFD)$2i1I>iud@y2rO|VP@@hsyc`0{me-9e0o%o1rWes%FX zv(yjgd)s$ZgK9rcGtbw7Dv)}mM1VoJQQJoiGkM=h7`xc|3wiTD zj%LqO7+)L};3w6GucXz?f!svV zyWLx|rH;%xu~c7ZI;RBb*a(^6r^tVTt{$(wdiXv~=1RVGwqD7BuY?Ad@P0|0OaAa) zrqcT^Q%Waa-oR%NggBcR9q5fsTi`lkE34^FJeu;JGsUJ{hApHlpCK7kXE6+Oi4d7d zY2d9wE7E7(G(DicWTCPnPn24hkwv`@&o0@`cLH(ZswIT?q3{P`x9-ldG_HReil`^I zG*i915nF_;xXcIb?uSSBJntG=8Qr4 z%v&@0O{{&{H~Vdo;@>76&kcX^{}y=jblCliAkHi2*(Ju-pRC_k&a?9^{_oDSe=U)A z27~>83a>WmdK?aISb<$L>7P3rr<00K3?AG z=gc=vgNTlg$R9``@uGf|STu0keVFvc8o&?pj(IgKWnyu#Jr|211}rAUF^xwC)rJ@&Gza zn@ky|?LV2&jyo+grA>d6X`6KHT~E^Ach0@LcOTc1Kr0?G;~BK)o_p>&-}%mWzVrJY z=e-rp>z})!{^|O^N&idyt+Vd0zWs}z-EhrI6K{RK<<^%j3_tnJf16w1{F4=L{q<|- zTh7`(_sUh@`@!_;-~Qe9?`%95xu?Bu@?2u(bN_koNN~^5WAA^~&OGxM8E<6QuYUUc z3r7dD&o?~%m$kdnQU68|guN*@3D^?!Kh%kMqC?f$>&9vMDAbL!l~ zKe{u+R=)b$GlPG7)2;j8ICRa~XY1~Ce({Zq!5{X!4-7o}nHL{)o_%EY3!k}faO->C zuMb{hzp(P16aRnsAN7_qPt`qD|HXfQ`RYG-|MAVuzm%))yXM@Ne*cE?>;Lahei84# zxM5&L>hr6jcmDWCug+Zczh8a%?su=@%_3T|NX1Sw*A`Ed2M>% zow!5v#-Bcs+4$yoPtDu^x-QgkL(lmqUi`0rYWwB(e@=f-kH2#EruYBn_;o+Kcxim> zmFLdB`s*)E{)6-H^i)*&DDLuzYEhs-v8X?xKQA%7o5XVIG2>JEo>Bnfw=g2GGxXL-V9mW z!xu6~cszfc7uj5tyR5QmSzyB!W@ApPt{_ zeND6eWbdZQ?8PJE5Ko78$`hh4b(&H8k885MHAj#r1)(R%S}IrD*HqhoQjJUEAD-}q z!YSl?LBiE=Y!`ABAp78SB9v5WPLvekO8NIQ<6VE0{UnI|g|S51(!fHc#A7@BM6-f= zrIcY)LxcWANApmiWzfyKoQ@gRVe|F}K@b+^bWnuvr3*fXy%4U5z%obF2j!i9&%>AyrK&UNo$DLs4%e6b^^fuUxfZ#hz&B z+~J51oDUpYz2(a%PSOvg2a2T<2qjBJLrH)2=EMAL*_(`Y6)eO9ygX4@cvwX)6<-oO zcD^3}t(x|DJUz`_4Z%oYMp=_=2uwtKV>`mm*--mzOR%-Uw{x~{VAqVZbEt26Ys%jd z9Ja-~XLrV3J*++G8)nn)Kz+pB;@Z*ZigZp41?2GHrjB8Gs~9B@x{$D9p=L!tiBR!4VtpQpZa=R|Ney{m1sy~jS_ZyV?vbj0K-NB^3ZXop9! zyOg$|$KTk&JgzMRj^L=RqrEXTIFoJ-$!*Q)lyh=q*ts(?wyC9Wb60$}+1a>dOEliQ zD&}YY?vDDnr$KHXmPdBBZi)|g_bPv``k*J-o@|zf<)Kk`%dTNtpF^IUPANMAwqXBc z{jRWW>rgW8bou*wn>t!LTARB!PtJ@)HZ_kWCe&oOKA!0B@NC#{=@bkCiDc1qy`Ie; zKx8Xiurl`J$P>BL5bi}a>Rm1@Uf545Hd;rl>{NhK-7 zcCPf8p0o-Kh$d_BI=ct2b@A7D4wi(HU~@&k_fo}!kSdBV5JdF>ks}H(sEE{4t&oBd zmF=yur$lqZSSv&-t9O?#oKk3bJNwk_D8Q4P6wMQ$f<(I|tH zl-knfGWsDtYgi|GNO|#kG0WFekcrW9Ta^)tw^mgRVjIh^C*(6%llToe85SvkwDqxC znhu5nK`G#iQeGdwQiXr?!6G#qHbBW&v@lmoFdg#uL(yHaDfCsM$srwy@&Q$e9Ll-x zs#eK^bWHvf(!?XJx}>dCdMy?Rq!N_Oji+|w%fCvW2i012iQRPpf(JY4WH{!>ogkv+ zhYFWsZsv#!sCH4RZFWR|P>_D1+$@Rq`3uOYmPw9i`RsK|sF;5i%3_Do1x8?z^)1WjE^d(dw$3_iRAYu&9_l70{f#l3atKOVfd>Tpn za1{&OBQ|V6(!GC_as+Ec)8sB>4#3E!MCFV+(ys(!30dO7${+x74PQO1wO12mlx&(m zR_*K0_v&I=s?GPgmN+1{H`MOlE$LD)|IOSiOMCXzO4JcB=X59;L>?=i1Wz(~Pk)Tp zfVy5hDps^MNLu4;Pi9}zH`$I&!|RX9X*D#UB*EfoDMx=_F)v85NNie5mCywuD{F10 zU+nHX%1(w=qv1)7W05gCnHG}0h8R^drlhTNOFb)pFT|s+){{8RX zYp5zg#4mpzacNXW>hS;n|NsC0|NsC0|NsC0?3#^knW@cAfz-oVXE+~wA>)&Zic29B zwRd1=Dx?NU>}y3jBR|-5hq{WLzFiP;yATWsMNVP+&)3#v!V)m23H^$@yv*d=kKH^1 zxjcyfNnyn&({4q(9tar<(~nZpEfc}0XUj|tb{K!m)Tc2MG##JVQ&hE2Td`Co1R@sa z1>-hlzVDRZzJ^V9p}tZk?DZy6I9G1OS$(O*W|g{qG_FZt+3z@L!+^K31-C1yBjxu{$?om z`DuSJRpZCa(h(P{@4XzF-l5_;Crt~4-cHIl9XpSm$L40$wL_lH86pIEt#OME3HV!Y zl?)ZE93D|epheZy?yg-~{20ox_Ha+_%1f+OPtDBcdcDa=+)JH+=MUFZ#nE>^6`>n< z&{s<8NH=egqN#A0)ac^(@Ab(9i~-$`}^8+2tG*f>@ zR-G|Lpo&k_SYQQ?Y{Vu9)IcH>2b^-u%O^>E4rqud=MHe%JRK0|<@qhXxKt8!Ct)s? zX{p1f2JyUZ<+>{RdL1-hobYh;F>Bn)Yv443j1bc9DoJNe!cWj9e`*C(wOL71qmsnG zp6{Kp&M+N1L@kZMwb2l$gNlaNtW%Zyasr zE9*{g)zs`BNkN|CvaM^T;DxlUXExJ#z}WJ<{gPuTe;5hq1!yB)t=dz?=b_x}m6WaH zb%ml(S6z-VszGX;H#6)TV4razN%+^4Aie)v560OPt%|sbn2>X0^1fnjeSN>a~*A0r7jaR2_(=qDjL8@q3)}aOHT&q=S&H z_RC`$AYc=h z6|m)kv8`454&1s~g95F{pDBL>p3eRBL7h)pQK+Nt8t_!3p~eR@M|03EZl6^8+Lc%r zjQxYPwNE3MDms2JnB91|sIn#{jhR zud>Ig+1)y@X3f>nfX^azRz2^Lim+IY+VWToBT}s6zj6#WYY+m=kz%?;QqyQx1HDZW zJPd4Dg2F+#@C5x4qD_!&HUie8T^nOdD1a9L8W7$_M%G+dNDkxEZ}V7SSP0+s-=%vs zK<))z_PqGhP+8aRLal$`Q*tH(kMLNwG~uoXjs5mCUfVr%| z;1p~Z3mI1$>*~UR4-B(1kH@?v-r-TbL9aA_u{y6zDOZ;(5?ioL@@G`?2 z8`nyFA5i>r!i+X~+uUspvCX}(bJmw@1m<-KpPCBLF}@ZEh&m5tx>l!)C2ULGpq_4xNluCie8>-edtR%DpS~}_H z#frM{Pm4j<79Yre*{_giCp8F9E&QQ5R+;sv&b`v0^mA^1yhoUS1PD(&t!>S%t-?)< zJvdTl&7V^&cTBIctaR5|tgBYC(=E5y8*X7n7)lRRuoy%D$J?&JP)h_u>BgrqgS=e= z!>@m-{QZQV<4wId^T+ruF?OS!o%?b28YokS4g1Yq7=uNWE?yi{m&;hR1hVRK zX%??Is^kS5)XUPS0L^Y);#G8qF(cAaEFOPjd)8w2hEMq7F%J%y&$+9=fXu}!r)(TY z1zo(#Wi!R77yLZ9t^_67>@0kZ+L}WLRAnK1536SPEkQh zwS|yc^y0kJJs9&$d%Arr9NIeK3XVFuT>(db*x%P$rYzRfJlvQb8|@AUqGRDP&rlQM zBAYx--8+08o8ovcjyA%9v^}{s>Pdh3+uKsj9h<@dHk_6t!&An;@!n<+MG4~G!=p$a z7=o`akDgK}p!1$4$PEsQj%4)H>Eq3Riy>TtGuXQl%ng%wOeZnd$xVT&l z3sw%y8S3+JUTsF$(;4=y412~v$!9a{xhA_)K21c2@q;cz^r{F8ki`_(#T0*Jv+U0@ z>_v@Ot?i?Z;Plp!?nEo=js+s&S-CwN^hbtgyGHDxK(kBTI^ygcwKoRkj{e|QHfj7D z)QWj%(Cj4Ja)MAv8G39t+-Wc906#}W_rXblKCJ5Fk99?cn>+@7 zh_tC=BXRITf7c58!ejoJ7KCS1Vyn}{U}31G$%6PKp|oF|h$qIxAM@s$TmD6z(7 zAIm;zKPzL*XSMP)d_S3(C!-VpF0lDU;sz7B+9WZr_zKSye~Bk8tsKdxUp67R!--Aeq)u|fr3fWNXRm|a>XW}+5DWzS(2FZaxCds9**2y zUTv{iog|)5XtY}-Lw>BNS4qzMy{F7L&jHT6-{E%6BSL?dWHsY6%OE51mF19;@@LDd zk2V|^9gvYaO&7_MiKBfha4K`*xO%K%@qAjm$i*qGK+`IJN?RfU*{~ek z7?}N<$&T%`(+U@KTO==jd?;5*j=S!06OOYv8nG)ket=zh(TmvZm^?oVE=GIQt{JMd z@_6^NCaizxa^p~WLL=xRdGX^<(n|8^jgOk}sKeDTmOX9E;x|7`rNJ~t324TD2!$;H z?&#Q3Cf{HsF}pEst2H3A0>iWsM?EwZ@*`)Fh5P?lU@Vyrkmbl_!46O|{sKVuqeZU; zkbBQ{E526(ToOF(u(})|f*pCpOz`J|BY_Ud?lFIv*#(9-RdTimHGy0-+fFD}5Xi^4 z8%5q)vaF+~c&^Hw53hRBL~y#@(0%Ny7dOMXe5nR}jn?jB5@1)*F44QMEDrCqHaH;C zPH4USpcB0mgRiW;1yEhhwk^DI4esvluEB#l!QI^n5M<*{a5nC4!QI{6-6cSRd*CPM z-S3?5-uwP~=LuC^wb;9$XN?}KXOFRZ^*l2*sAN1MYo9Tu&79aMlpEmnd8|!*ZV=U6Sc;V;Z?#D{J+GD0M z1umsD-lq6kyS5btbBF%iIK3tgSzUR_npva3166q2_tRW)g;?i|WW-^PW^fTw?Om2D zSr(WoZ)^6NN9f$Ez(Cof?yjZSPh`?cD-HU$0pW%Yu3$YM+0SLk{NDXnBE8W&Pz}W= zxkjf=3Ibqcyr@QegCr4K>W@Ka#4F`G5$!X3_9A8zbXo_AXFs(PzZ%iky({Ald$%~v zDWXVHMOt@KVT$64`dj4p7mL3%S;X{!e`_{rrg2Qo;FbAes2LTXh^RT?p)V8!E5|EG zgst_QoIcX{`UU_1-rj%^02(YcV`nL`&nDt(Tx@b2>>g}VECwo;7VrQxaNISBR_u$n zkth{;hj|thL8qO5W?|UdUQ*IaDh3Hrx)0hB_4O(zd1csR_*3?X;peN9)-I?1jiMD; zmxU2J3kKba!kD|<4I@y@lT2vT-rnrjhZA1DuD=eWpL&Z|O+0}+W^(wsbl*>N0TRB| zKl8s~Gw5q(%L!XiJ$&~RDKPbp(%HTWgf?Nw0S!;_j^NHzgEI-yDKlxaFe6m3=auNU zx!kDZ8|%%7$+uwqGRB7sH3uShF-B{;rN}H9{e; zCvwlbuOc@|1b;Uv=yt|Qzuco>VC7@(e7d;Zibrp%Stn0QVS&eRQR%)A@_zaWyXNH+ ze?;~>f8Ii1LKglb*LYbh{HGkh;*0StVMnTQes1mLD5Sd(YkJ%Q#e1S0-}%(MO29Ak zJ?5%>&dpRn{XGj3dAc&YO~MQhIiFX4*~C6d$0qKLk|YSo8v(7gx^;dov^9CHk3s!@ zm{}fOi%_^hhllqpl{z+{t#f_-D=K#LF^s zFVKI6AA$$aO_Ol^PKAH`^jx#<|NZwCP@j~NECeLR`?s(F<4A6;mLg*#BrpI#Izc%L z1C8C5$;Ilk8XN#(IPB8=PfH*L#|K)WWTa)Kr)lh_f|92IkgA+rf_BE1+gN=qYh@>MU!wHFtlZozQXMB>D`jUo8*K$ECuj?4 zb9-wiX=8h^@3}2;ExG=sadF|nH8oP|##(v$%2q^DMCO2|xVS9;tlY-ns?WK&+?pa< z*7`EOaj`&UV`qi302g0n5np9vI3-$DU)E3u5R-u{qQeL z9RI>(;vJ7a?cc$~=AW3*5TLwH^?)F_q`osWl<=?%#Z0J7O)E{sR`PV!)9@y7G8WhK z1lCcob2l_our~QEO|K8HPj}A`56`am3RBS6Fera7;XtN9X7^hgmYNctQd$#TnpTU# zugGEGWTxzr8t$TD<)!}I!`oFt(nV7PS&~TGmD0z}s?{T;Ng5#7rO8}F!y71wDxQ|= z2==Iiu7xOnGoHG#8;x)i!M-A*=B!PZ$Yh=v3L_3GPXVVQ!O0P3pAX0X8z_H>@}cJP z*aZdvz(z=@$wo(iXNrlr%YUT`25?t3Eh7zNZMB_|trKgI2HK6+j354=P{vR6PWaZC z<@Vi{iW~e3?>5C?Nx4JQ4Cua;1f9bH4)}t*eb%jdD~!t4RB4@YUf=r_p^nq?R+%LjCF6 z38Y=|@9d$HmNq}YO%*{sK#hae#}rAH4&N~{SJpS8U0G3{6d7n7=OfWWte{QJ$r+Jn zpaF#NA<*-av$Ib#m}=NeZ8bv^DO&yvfu{ZF9_T9FXAHslrRNh$*cS9BbM;R}gEXH$ zv7T)Xk=i2Ff>s!LAT0%`$z9aQS@aDb_4epDy1Xi5~cjly*eaHjMS=&F&Z=;-u3 z1uMBCcHw2SB~S&k2zdMHxg5?Mt`j_ify2zA(iIa>OincZe|bxxggK!~zHmDlMpI-VA-joMP^ z(UB``<>sN?Ot&r#IeU!fYjDF_==FkYPogaUIERn^#6dz6znkBlSmRldS2^%8gPP&% zenqwM*X0OGWw#?QP|~VApQ-&Xr>Bdpp`MD(E~smBMg&C+_cl5f-t(F>%u~ipZ366- zHfOF0v<&P?Dz2dr_N%wMNcS&O{4VomNcShWTQ69c^S1DU%hl)Y=@?7m2^<4g7=6*$ z{2%len9_Mf0&hnP3ENlBiEDxP9~){gCPC}@(E3=?vs)6M_WG)Jq=8a?&6yyroJ5( zo-#zGH*f777Km}K>1V&H3eEbRE#DK!`nt7F=u)aeUvY4^%3=@XKAobwj|p#? zLX5uVxncB4o_Z;6r!H#@%i#WvbMLTI8e=m~?;8q7DClwca`fakw!1yvGk%dCxISVgkJgG6s0wKyRiDt5wR{mmLznO3Eow*A&l*6@3mU#x7-P}uCBe!O< zy|?4qoKejX9G85N2XKy@xc0+}%-Q?NW7dT7Zx`oq@)`TfJAL)Q;V%nFEre_C%!F1NoWbaJIbiwWI!$6AKy=otnNQL}s>I!ma_&x@1yy98?nw9M#JKGo?WEEE!sRUju_Iq*&ph;|3BGwAho4pu*Xki_LBUf@ zdYU~vU#!IXV4L>??T?XGa;=nE!kc~=yp%n$|7@W{u+Ln+%y6f?56xD@W-npd-?+3< zVACl7S-uq>ZbO}M*%YRPy4I6{*)z#^k~2)(q;P3+o|KxvbBBA55GDI?cNh~lX}9^K zw_vSfcdTFwyN$wL(E6r&M&EiP^bEh$tF`lNx#x#Xo%OFephkLA)jF;xv$;aW=Fj#@ zMShTd$CuNqLgpnVH;*X;^e;Z19tVe+U-&`8zg#ri+O#iLMUqLzni>P#!3C+*U#kRt zjjQ~19Da|h5z$`Hbzqw%K~XU}w$=z!>`8TV%-O{0SK{@0YNRt)naQNvds@!Dg%j5X z*>ZzL;CS9KJ!zn z7G1`!OR~&sS<0M&)30#QmrrN2dkxY4=wHjoXzx$H9vr-816|zRpWZeX+Ja7M zMopo;m?S{~d$yD>qTIz4U$?G>vPm*#T{I&0x~cJBe}Uv*okg8tovohl#K-haeWyc` znEoVe%)c$|zCkqfGC=_VFtGn4W83{-Wo-8UMaKU5mADmlmia6(Av=RmB{2;zUON$C z2077ObZH!_VTf(h4{RVOMc_b`2HiA^LQYTE*Gbx3|Em+wL)l!~I!@M?jf8L1R)G*Tin6Ysm5tCB!4gz*8lU2%hB@-B1NdE^bLsMfjQ|l;WQ;a^McAlUK zkvq0Fs8B%kk*Vo7Yse53atLx&^l1upM>%0B1P(WO61Oa+7?7~le)mP{mnihOpFufH zoM1yB3w>>0*2NNIGul!HDKkT3(+6ZIxmvJN2}3<#wXo9|^Qb(-j4XsIK{ZKtVMQ|s zBV%2_3}BxzIiUYWO-aQM7s(j{!a~8=Nm@WE0!}Z25-O!5bw;A4n-tAJJ1w-eO19D11AeovA=V(B%H&ai?@!b7|9Yccsq7YYwD0H7?Yl zaqrk?3Z{;V3ASYJ@ECXoRmCZHjZEO6Ida~mt6p;;b$Y1b@=^1BBYgWWmviTp)x0;S zEqCILG_8|k0iD6{h9P;Y08NQ7FV(|0y1tV!2IAMEql1+QKW9&rWZZ>Aqwo!s`o znMT8=L|s}Zd)3gVa)_o$7B83)_e4H+2YdGt?YrE;l%d1z%A>fv>_sj*-pPe+mYZk3 zyaSl=7m1t-&Gxlx|2j31@@Vr>vrD`4WI+C|?wd=_S$sDw`=WvO>!!%hvkNWD5+x?r?gxl1^W7H(=2t%sC;rZ2dT$TF`%sTkkz?bTFFz1S2S1 zbT*5BhTZ!f@}Kr^hh4<5u}7!#UigzJ!_5wE2Lz`XCJ%8t+W2GC_8 z7K(%%TEExTajC&eOLqpR+Zu;mN(A9|Bkoj~_Wy|2g;o!H5Tpu{r$k;R&3Lhf^$|9? zLLezAM6@6#T>J1}0!N+VdHBn-z(lq9OP>D~`@bX4-@^unYVl7&4T|IKC3zBpF+f@- z>8PF0+Z}%q;F1*-6B86`+k zLuUIgg`S|5{3AYF_kY60BDS;*6LUZy1YUvxi*S!qTay0Ydi!IM3^j>r#r+S?JN}bA zfB7T-HhJDnlK(a5?+2=cH2hG>^ud#0w9?kVFf$@QtJ+6Eql;%mqE^u|F9rMu=Q*l{ zdEAr;VK}I|{P0Ezb1HbWQ2!S89}|Peo|KONUm&sD8nFHoq`x^{7}Ea+NC`L}aB)et z{Ra23m8b&q3Pu$E*4dvC+2ub%{SS=H{)y55_PlV5`~MoFRi%+X11tQ&jL>qzq8|Kj zVgDIgp%|L2zhh+oH;n!o;Xg$BcQ8W0{ToJo;+qPzf9vcIM)_2u4gZ0W>Hj%K4gb%1 zX|5%Ib zspv^zC}U(bA|fCVKgH#gVAL9d7ToljCOTr8FfvFY`~ zZ3`I+3?Ru*mS7R{K+9wS!gRfxd1P~-V-Yy_km~X}n{Cf#5uQ*$)H zg0MZFHM~25^)A*a99Ln9+UwR&W+P0-Xq@q^1=gBWzf{rGFyzQc5DH*8#c3hx39hK1 zBoI04!3&s6Ydgik#6fPPh;y~f%02okeVVMBQT+EHhX!lp7{-ss*Jm=u(=heY+F zr<>cTbrqL}r1Aj{RxAKEar$zhNT5b)Wrsis!_2pZ5r(S01YsDA#=JEmqE|{HNbU2hQ8Y-5Y4@zJ*0Bl1U*&t-PV}(6TksFbD&e*Op z{7VnvND4&Rc*;1MpR^{|_)Z3#utsu~$grNC^iI`a+(*V-WeUtU5d_#|K)cZzTbqBs4it7VQ+9; z(3GDMHb^+Y2o3~SVuXnB{v4qHozZ_9D9!~OBcZz-4%iP%QNhuo32eZ`Fgv8e`b_6; zeppzb-VaJPFAAbMDl|8Pg82%mjVA$_mW&SyO-+M_x_f_>c%Pa&+4S&ez@q5I8j=o? z;UZFw&S?@6XTkE)pCFqR#^l-Gr|tyfDq+w? ztr6^B(M|t}&OaWUJYl&CmvlcdTL|iJfBI*V*_+Mi-+33pDDU<)XM#}+b;4WC2atTk z`%U}Tbo^g#TA$Be9BQ5f*lW_#>32bvO`_ECRw2>2>LIv&Y%>@q{-<2`p>5_rJAU@% zFU_hGNsyJ=HN^_>)fZSY#>o_)s5M@d4AV)+RL)bGFE+k!+RJ)9e!b+sfA)Rp+?txo z7c=5Y%`?I~J^`MbC>kScv{@xAoDjedl?E<88c^1=3gW$ji@<<5xcJ<+> zImU9Rcv7pugK1fMEH@>0$6+vGO%hQsKP14Ku?txZX-c6g02s{HL!WRWNJ;!5OsdJ^ zL}|~bsDz#U&^}>iNU4cHIBN=gdZfGX5FTAo+C&T)WCI!&Jj^X}5J9jc78W9A09Xsa z@%G+JsN#!Th;?(w8qQbue-UeD8Q+{7;!0d**syk>Zu}sztZF${(}Yj^R)CDA`E8L9(9_Oc&V++&XjMQ#hsi^>- zV%~;CY72BP6tIw_w(v)Iv!N!6Y11i34Ns6s!Qwj|w!{zta3!l`CHLvieG(S+*bf4d za^IW8-4O-1BUbv6D8KYogn8&PaeHNi4&}lMlOU>tcfCa?Oya_ktxSslVLvVmy@01$ zp+X)Z4pN2E_En8D4-J(D3+%Qq$0${IBL`Y65Rd=?Y*fIB->X25QkY9)M~r}UxPnvh z;78y6EGJb!9Z=ySDv)Vx_S}HiIy3(TfduViI;RH7biwgpIv!DGrw&8hj}3j7n0j3n zpZPPXrulQl8L}7zR2yUa&+rLT9J;5cHQ(9Fxm*&`bA4VoV%JTBA|b)GP6Lm6uOiN9jCRHF@W^}8&d)95 z7(;%fuz;s@uV*kKaGl@rf|%gL@dT09Iy#Uz@?=QQ{3}_(U+D*W-MEtLD}JAS!LseP zsTb^3X3s_0^p;KrQZiPdg3q4sY7K9v129B(1Z#-95bM^dij0i@v`U+7)5uZpAn2Ea zLB{92vIsdD%-4oq^TFA&F(q}2KJ1-O22`A~ZR&~pMW|2QKatzzTJ2QaFMH%B9aLTm zMJ&^;9DFJ|ZIfCP%F-`uxz<`IjCOh}gZuL4A2JGp9|=X4(hF40-8>a5fiHQTlRz$V zM=PK7lG@$c(~aJ9n7Y#_`PrYOzWC7_bP_ElC%G>pBkn)a%Yt~9-e0V@=~_~> zFSpG0dJ)zSvoV+72FtfC2&=coc*vg8O%>#Hcj&B}&@wu|5yL2I`ng}uX5BI>?nB3b z9Qt)#u`^4xbMvCe$L^GV>(TB8a}3y&A1E6y@7SKuI0kaG8vo=e9 zSYd^?vT!hq>6l{B!Q7w&T&LAU%=hm&pYzpqY@JoUQHXQcThj5ESk#>mYH$Fj2r3M| zC?$NHVkD{jwM=}#eFs&cKCW`vk-XJ1eO2ALA=B&Dy0~E(MN@iYEarN(suTDOPlR3n zaCt3PoH*fY^iuJ1aDp^jGX0?J?pZZ9BMlLQynkaasITo<>J{!-?9&9<;Jtfz%~k$e z?zctiFT7EKeozGOJyKJ2gheaxi!RI7%FySZ&8vC>Q#|DPrB6!-%`3)<0s^i7-M#=VEfTb+Gt{?E8}$|CJrP z+i;0)Rt=s2fBP?gG|`zlSRe2EYPAI%v_lKVf%Y#w_m?92xAoixZvV>eha32-$Pe!> z2C7V8km^+e{dADlO|2>$vM?``V^4c62GS?kAwoJDv|o6(MwS?{2Dzf2n&MU&$;< zs`K3>2{R0Fe2(=7J%iIN$CxVGLm>pQ!>stNW5B7y-jl_H(Guqb#3(V0b@V{*C>Zu) z3JXK9^N_}GInj?YNNxK|J&EXz5+g@CDHS9g*l&l10S^M6NtoS(F@o6B@j)Zq$9IxS zfl`NX+l?RHLvh7t2MNn>X@#swcXhME01P`kNYNyga)j^CuEFs>BA)+*Q~evre}?L- zX#%9^JIK)BApbFN^!MQ+PKY{&L*o2z1BD4vN(Dy%a(=#EyXFRE3pE_Cn0Gt3v?a|X zCZxv&f`PZ5`9re9P(!%18-b^Lr4Eg>{Bk9Lsalx|&t~sU#uX7>R z5U3Cf)8g=`MkfU?4F?Cu(LV!{vw!^N&mwS|#!T~#(vA9WKq8sEBRLJxGKl<+r0Rdr z)#;zIapaxuf7-uI*FfB$KXjF0L-=F55y{m3F|sg(d6AUx3b-hRJRuTKVKve-;~ybL zo&0BwFROa64i$JGA6x8Gc_~XJggd0IQjwxitcWQ(Xwh>5UX?^pWA(-I{a)V31K56J z99D@8O9$>52uFtNw}jd9LCH*7iimz>+y@L(AsGI8s4oC*Kd3elU>@cH5x?icEDZG= zC(6X_57nC*I8@VuSb;KPHe59dSoC-3q(H(6;25B83vg0Yr@!2@ zztH=4+_OO3zc&2*pKorN@9q`<|J&T6^?$#)k;eWf%kQ=ygADcn;^sW$+Y%wUbY*dv!f- z{PO+ob(D^4HNajv_;fqaoEVpkoRKbnR68JN+@Og9)`ai11w5Zp?7G_;>jYYMU)?Mm zky}CS{ywtPZnV4{tk9J*A3TV>9tlVsQg0wK-LA>P*N3q?-TkyVUp9BCl^LC#G9?6b z-}(rI$o6A;8?ZM zh+8Pzs>I{fdWJQd)=W)Sd>ea(3nqrh?4(PYC<;xW-TxdNw-glqA$FB*)6@^(pNo8A zzlS5Z)m~OpdDhqub;H zAGl+LYzRCq+Ju@nP(W_O+?_5i`te+{mP&$TR%VWUv9kN@?ZYuw(!SKh2juNFgnN{} z1os$?RE|^EyyB)042uY15hkgk+DNCe_p{Pn$|VzoYgy_CR%Kj@De2|fS(e(4<%^Z- z-m-U^XQnZu^F>MYeMYsK_{SW9TN*aN+qYSneBti|oo7(NE+$Dl)BU8FyJsW8aX~wy!%KPk; zZM;sGpnsx1(QImnOo~#Z@e4N8r;7)x{a2ul&_}G7XN_Mi2h5SkA6?uX*|Oz<(x{$I zy0No0rc`lJvd(f$hXvls$ydq)jD6``^!7Vnbmez?qn9k8OGh0bH?ILuOOihSDyJLdAgN4JGbApFyfKh`Zn2IdyPJpLV*?GNlP_|Fk<`Z zTSTcEVa24ZaUM}87B)NjuJ^XLA#&ehO(F$mtKZk2O*oyQYh!z_;zjK&AeM_X36W#H z7zt)?2j<7T6=m18Af7ZiN`$s4OfxG%SP{Up)&(nbB)ZCO?+l?zJBb4d`)+e$GMgmM zcfIt1OQ$F*)F2d;A$ZNK#90ViaFXjT#<0uGqk;nO9hPPMo=s#BhD)%i_78}g&pP^F zagk)hHTf{n(N9bV5!#$jfH;v^Umd@016ypVw1yA0Dh~U3tTSbJ4Nam-`PDRjm0v%# ze~ejTgcQrn<%(&l8L_xr^!h=dP%FTrz15u4WHy2u$0sRvucdz4Djb-<)@qr#JlfD- z>Grl$6?IHIn$0(RFTlOvy;n$V&~aWzxB-);<7l`PVIcH+EzJs&1yb&jxrkDL6cs2` zXPYtBQVAs1#Ph6qIZ{C>5{2SHr5LypTRV`-hmj|ViD*tTgYs%g^0!2#XU)1O2j_)# zL+O#PRok;46sHRjK$)IYs08_$i+uRlD5HxQo_gmH)HPWtE&&PpdgF+9vD!n**zN-j zlZyO0&k|Vd9>$hh?v`q__}xLM$l+M-Nxj$HlVBMe=;b!U>{2+io9N> z=kb_&>RkBLOmBbP)Yv-q+tiw9f2{4f54H|DaSYN% zw#P>hoDTggjHmt~L(UMsH`?xG8m>qmf2edtbLc3yO91TJE9zKh5^8Zj`_YkcM(SQ< zqy+g|MKSX8Am884{p=v56$WMM&g=!{`?s>IiDu0r?x2@B501PL-ND8Fe2$}HA$)$R zgscw8@}+_t0#b5r+=K8IP5luDEskaNDQd|Wvg{pft1A9o<72pi&GL_HV`kc9mS)m3 zNeeh#HEqC?X5bLBRgsRfo%?{YaeWPazT>PNYL5wO%($`1_ql>>uZl;r`kmnq980~T zAzs&KYsVk+EaLg^e(iy;pT6u+gm?5AC}5FJJlRGBz1}+O2#Yu(+wnT{9?e{==Z=MI zAN{oL)GBrn`bN~8@t!|~Tszw|3SFK9fq7mdWKKYRLuvUwnIm-Cv0Ib+w@#l)XY6Xj zga^Wu2#ciYxM>tJ=2kWLoBXf8EweHs@)zlkuD;JkZ9UD+99gZJbSyk#M0-^T;ZWB! zJvvWH`x4VWRW=O^zq#C8cId8)y^#bsu`3iWDC)Y8yLLr#kLmQQDf9j8NK=*EVb4&MqnWp0m6cmYLWaG(Mrjj> z98IZgy5ZWbwBVBEB7^W%#Hp*TWTx5@>qS|>0QFUQ^=x%i_UgP3a;TYn(PWsp?fT_7 zBDOY}>TwF|jLY<;w=a>O6sMin>myS94;uq%MP188;uJen*^;xWk0V~>`hcspDv+n{ zR;!*wvti%f3m`4v&WksUDr3(*PEOs#`uf249v%y{R|!?JrX8z}HQ3CnAb%~oZY$&k z)?5)}`cvkE-Ilr+E*6D+BRE?s`AkIoIl7m)iq;{U2cB0|F>_u`RQ_bD}0_UU!=JQvCza+th4HZcSop8L~sn5+;J=h}le({MK|%)h%b z6_AxQ*s6k3O3kt|8X~hfS{_PMwFeP_98D`|<4Gm#pZ9~c=&u5#<3Q$RVYrs|b#X0d zZbcF8tTqyxEVNfgsdUEBX=}FrM>6xNbXPkSn2*y1!$a(!``^($UEZl1JsYOUV>&XM zV@>6-9jtG9%<>5p_R1#PHiX~80E zhP9BTi#i2~5qoGbzHJ!5Udl)%yA@$pYpJV(M^)m^KzV4kw|pz-t)1}^ob(GpK3B;7 zwiRm^e~4(|2`#Sl9Hq|q5ar}HG^PC+>-kR1!F)8MS^rF8Vzr9#f@C$pmfpdy26MWJ z@C-h3E5_gr-tgl7s|D-@Gmm7TNjf^34x6!d?G&7{-6}fI(0VLa7Tsub5YJIieZwmI z9Ss7^3MaMc-3c3rC~cI}Mf8G8&yh80)R#XQv@iM*mstw#x4h(eh9)Q-F_Q2H+k)d1 z95Y99xDcjTZ$|8<0hM4#Y`olX7B8tlHnX{L-dQGkZ!20n!4$R2_-rTeiaH*0omFmc z5WXfTF&;i%*FxwsZ8|GIGh)|8gbMG-mdoe%AEZIlKYH|^2jeurpVqV*Cx$ycSD;>h68{{6I4vR%*XHOf4r3Py5Ijm}8&Brw7>OcoN3VY(@NFi}r0-q_ifQIrls&VX$HIxEG!9 z2M5;ctfUFcgoq^J)2Wuc zx>~jl8->DHgW!RKH{$qUE{lOvJ1x61d!`j$1+7O`wCdi>i>nLX8R{jUJ8BEIi_+`^ znbt9ROl_dqkDPdgaHx+{BVC96m4ouKWU?&KaYal(dIb}8v=`n!|tcE7&4J-(0?4bZEFtsSG3No3IU)mOtP_bLl zs%ioy7<;`@Qfy(1+eD7RLeGuqTm#eXO@f6fBgDDoX~jiI8j?lmT>Y0iLGTdU4L^%T zA=eih)Q$t6l;CR`bxNyIUV5=EU_WXP5f+T03Z1huN}ntJ%zzp6?N=rcW$rN_%Aqac%%Uf*_pY77VX6pifsnnh z{SarqYd^*Qg6><7ikloV?D6|GD?7^BJ{4y&Q@+VGNt($a>i3^G8%)P36VsMju&rj6 z+`4&Bh55Z`oA8W2iYn~q?}ZnLg}YK@@qG=MyH85u@WnrqGV2ze?)f*!5hCkWSndIX zKhg#+-65iIYtH(~1{`IOoh_=t39BsZ^XJg80XW^ZhxAJZy#cZi%U<2LcuL3wpOeDE zQ*E{7^k81B#4Y=IgPk9oz$;-S0k)@MZE(j_WE`X?`2Boz#DE4hBa|LtE? zB%IKdE4YkiX=erh)nl_~?{IeP=Mj&7M>t?n9UGy9A`|F3QJ^|{RQIS!RB2huIy#vs z=JTaY-QHhio+D5q9FJk4#0o4zc@9y1M*~m*w|*a3h${cvk=B~8Cr@GmwVDPvsQ*E3 z59N;1@+YaIwkSykTt+N~fL%zFUD*JFCo6gRFC>$2V|`b@4x*rYSmvOf35v7cR4;(z z;i?^2glb1}h}KR~kz9Iorag)vpqe)!a#_bog^{YDIz@Gm1lwu!-?UiTk_K-M2EGnGsDS| ziw>2p{ke4CG*zYfe%%{nBT})WH*1?+x8>Sc&_v%QgWI5Q%}rhxTvsZIEX$Yon9)_46OCYJFo4?)pB;d&Yy!8_*2@y8dh6$ zxdm*49bRP2ii9FZS!&K4FSz1ICdv^i9*>Bl(?@?t{T+xOn41M3cQ6^U3&8_6dVg8g zU9i|;_)4D!XYaP?lo~XHoo)$_o6Q$PeKj=#a;y^THE-YaNc=8lj6nMGC8({nSC8;K zuJfm(gS&=7q0d(JIL-8w7w{@zRQoa@^qW4G{ zj(NoA8nsHi5WIS8?2yr+Z3;pXZ%8Cre(j{hiU{lv6J=bx>J_a?P-WafnR=EBs3lD| z0oAB|*EpBcOb^5hWi7@PG?9C=g^B0^h9;srYPn>vcEYy&r6}N8-+(pX;TYipzl%gM zvUh^-bQ;mbk1=YfQVTfTc>=m|HmK-$b@ zuL0Xvn`ChQo zRC;`<mIOM+FJ66Tke2WxB?PuB?h#m^8M z4Z7rI>MS6y>Hg^Yw_w-NQYF z5tfH___RsLryOlNW9OD;+w^MnLk=Djk|LF;{u&q_Qtcd=qf#phQxrwYp&6@}dG1kE z)C=u>5009s#Ei`XbY2Rc@C?L@?Ha36yaY?=Of*dq0tCMVi+gHjB851PJ2{Hf%dr|M>m%b!dTPMgmz@NVY^%nrCd*_+>qI=U;w45**wOjrH}79GrKK zwRKs%wgnf4E|8I$*EFi4vgPz^FY5`!E4<}pkY`Xa5Xq$^I~TKWbT{l>V%x)6Z; zc>ln2Av82JXNrZ#j$r#1l#AJWF}7vG1>o>70=9+tbA@Bi#n?ZvAS<`^MdBKN$*GE3OmqBPpvRA}r^z@qHzIesdgu6GJ?^e~ufUm+JO4EFQ3AQcK$P)GRmeBOp5dB9!4i>g~q1DCJp2^9c$<^7VzLB1Z zkx4Pfvp8w!iQE-1w?!^vLJM-=D)}>eCVe6zeIh1> zxSmdZ|4yQwHx|V=Rmqoik2HepSUhyz=i!*IGIIUvrm`3))A;CMLAW82fd(tdI3#Si zNKFhOeZt6Wx`@@P_5cDhaGE7BEFd)^uJ2K?tX~sv--V>#uxT^7pWF^cDD@s`A0rqp z^#__omV>&wO0>w}Q=VJU56^bdL@Qeh@ zGTQzYbeYG=i?{cSw=0noDp17NNaQ0bEm_=%AemE<|FdN1jY;F%*H{~ue%Q~96s!s# zD$#NW_nWmnL^bjF_=>TTW3jT!m>?_trr-4U$e~_A(Tdmzq0O*2JqmU#bXQ~I(76%i z$yqpPjhc+#atHA~jKadlNSOsMiG;FTIU(*kz=@I58*LA*2-n$z;Iq6I6vUqyF`lVxveXx=#Du3L-5Aa28ZjSB2o2(B>k<8t56OEvG3o$u-P;fZ;^eGQkuasP`hqlEsHe3hxN9`+4ytT`iqU*5 zc-^;ZNF07PAi_Dz=_!k3jPb52d7kE@J3M`N5Kci(8V+`RN-x@FBF`W*+?(V^W@2Jk zHAhO4Su-`u>=}R>GZB~Vbg#dl;1gIpPfo}R0FBwvjLx5L8x2}v299>xts*K$N-r(8 z9fyn)2`ldf12R#{IiSz#MAlekRupF%*mG(EM{p)CK%_|4{cP6f=%_m2 z8T<$d84Qc_1r;0yLl_AOJQRK%B@A}x3@8pRQW1Y0^Bt-u2s}P)Z?MDhpXoP&Cg&1Uxa)G_u+ikbyR*lE?0c%VAdX7%cP|3FWvVTx|P-pi>2G zjjt$k@FCCa8*Cz=TcO18uAAyx`-h!)=;h3k`+@FxFv$uDA3E^6JVDqs-ym6nZ6q?? z06)hRH!RmNf*};_!wwt-SXp>j*$a5s%ZQ5}U}JSkRCP+dUv-IJGl^~F@0;X0q?;za z%X8hgOF(&@b2jS^DQgts?KH>WE(w;46}!nz>&4_iu5)ni7cl5%C6Ykn-M}22?%{4c z&3rj3k%iFl1AvF(b_RfR8lI$SdYT!0^b3l171UD?CJ7(rD%z(}5#fF4r;8z4Kf;g; zU?^BO99SMd+a!OMkx^MWUdWRwBL;tN*eHy-+A5af(N zLJ)7s1*i`6%S4I=`DNle9)OKf1D12s-;kCirmdArglY@otO6*|VA=qg{qj3lySuyl zDEkL!`{;=Ub1hbAWUeAXVJJ09UY9_iZ4KQ}b1MDiOoO!}aVFx+y*vHJDjkZ(c_th2fqKwRAm?bHrReD zd9grLRd`j5U|)lG0zt!2%W7Z;_=vMmfF1(FEbt(7KVJ{N zZeEBhTE7d3Z(@KQuy6(^h57`vxLGum92XlJSezd?e3q6aG%Kk#Qm{a2%Zp1V)rI|s z>TH&H9<-NG@;Irww6`Om3O>!-IZnBajDeFJYar_u!QmAE!s9@V1zA6i0}<(UMAxYM zC#t+!K_z&7f>QTipEmS*4E;>WDu{ZV}4}d)g_v} z%PG6?j)_NrSWo2M}xa$8s_UQUM|3eELi9QfjM5W)7|ZfiqwG! zhRN*8spLA@zT)FdkaTjZ1hXTfrG3IMpin5`!;@mhDm4tn=lD*1KL9RrwD-k&{3`f) zr)ues!kfO|YM4>rCT0ZrL4OASTqZ39gbV->NsTYLqR*^@M0R6@ZwpYW;wb2YJX*8O z^mX(NRa7(#6qQvJj1=TeP4(og%}q@-OpFnnB{(n${LJ8@M0*p+&tXI7YHElfABS zHRE6#Q_DNyWP8$PfBv~hMe_LS>FytULNa&Z0VH);F%Sleg@Ls%4x3}py8{C*PI+@% z5Rg@g1SGuW@ExKtw7N+UZ&7=LO@B;gU%Xf!tPQ& z;YP=DpdH(ZW6j3NAYGBPF%N98+Od@F56>E%P>)Ff^Zvqz5iUSyL?NtD#@qXe?K=WR1)w9`XQe|ptB zsifPi9LU_30Qn^46Xvw{z@&$rcPysRVoh!E1u`MgXgx&%);B$lEBuaO*CTOBkXkIr zv3hUrVs!gH(^76oiGfXr4q-`xYoCoSbx?0Kavx2ZO#rXfYikF#OIhps;UqaZvCND? zX&U8qgA9TgQ^^4+k&1&?j>xVGJpWqmKxt(djEZ6hkbZ~~x;Q^b^TTs+^Y~TS)KtE2 zU)5Cl(T<0emD#SAl~oZh9FE4oaItHHXdC(Nk9f>eqxEJgoQTrmRR6<4A_n@Tp0=iQ z^?;J}9vu724f0S`Ni!S^r<$$0b%s&DkPb--4Ke}RMZ$_ErA9*zMT^5>W7Z2n!b>OG z!c$TM>_I`u-rn>cvs}sGYBSSEX-F?Z^Wm&zngJ@GW!9F{qZE+B0vJv=(h6515yyNBqyV`8_Q-4?9R&Wh4N2& zP|@@eQhN}}(E18dY%c2O=$B%zl~fc2u=w=n4jfhN1yeriA=rkpgqK`hnQE}u4p#Gr zBYbgE1l2_Ar&RY2|Xl%C=@Yl&_2@jZwAO9^47G%Ge}EPLQXyrArlkS zkAXPP4B0PU3ds^L$MC1Hf+}n?pkEmtA$i`V^i54YX?|-N820u10=zJY($}bWb4Ymn zRYlQ6jlO7flcRl>HoLgz4Vvm+ya$e~3?bO9sr>I+U|$0fJJ)-E2+Q_mM{>(X{g&9; zQ$#fqdke}TFX{8o(8fv)1>Mrn^;w>R6Kz4N7$s6*2pxtPDi}PW%1x*6z8fd@2WZV5 zX&tFK1pEmRA|Pjm2s%8rnGla*43!GC7ov#b;!tC3$vE=x2&Te~N}86P1gH>*pBeRP zE)*Nh?9R&PdsT^hlOwtQCF&>XswLgYvNNv`m$34)$jC5Q3M1SQzpyPie~M z;4D0&_V?>#!2=TmnwEsP0VL-Y{Mw_%XWl`qw zdf*CX^k7F%6mlLJ%E!>wPfCc>z}b#2<=66A1d*=OT#K{tXn?nX^3DOKSGds(tRUV| z4WSh}f=N9;)sMFLG!x>v6ek0Lvak#xu#d{jDGYnc>iW7(sLl^wv3EOE60+IyZ2I?o2w&mb>P=I`jFr1c4{^JE06f`rj-B- z714C9GWu4o@NjiXbvQ|yTQI*KjNSFgOlskG`udz!#4bYL6{41S=VZ5w5mz}QgFy&b z0?L6;yp5jL?9I; zaPsVNb+pS+%+N5jW|{@R3&s>dq3o=^jid-nrpmC!s5$QACEAE9iE+lDIUnG)u2gf> z9KR&~@ncsu736Wnp0|sbY!#kxaZzsK0%{l9Bnb^AO8U{h9F< zpAuG!o?@82v*kT)_!>s5fZ{cP)CaUaKbq7jUSPVQx$~H236BYq_O1Tnmk$1uZo9(^ z5@3aS=z+Q*#29pb6N%_0)P2`aD0IAidl3`GhSRLz!+J<+BDjJOBvL76`))Rl-Wz#B zm;-Ciy3*=ImG#)gnSw#9r9D5BMwpzRoSL3q=1X?^EY)XwLE>LySUCqMKEQzNQE#ig z&YttXwb$kn0w`ZT3FVeSOS~Avy%m%B$OO;Mn&x6j@RX3{sXb>o5g!3Tf#}(O8>9#= z#&V3iToo1aFPwJJ;_<2+x#J+la?IeCt}#`JPG6mX%a-vRIhv*%lkLIBCNf+(0+h^K z8*~qH!EmcTg5d%7EX`N5NH6ElkozXh3Wrkr><`CyN5Cwd5CzpR4L)Ld=G;V>8Xsze z1|R-CbHC1Z_;yWCk2TGBOONHN{Trcc4`U;uz4|2M3k#-0wZ@}Og_Pp=98mz)^pbrT zwFz96=krDSw2PFZtozaye6?$vS54#f+V55*ttQ{l#sLQsKJvh)9AHA$uJ$p(EDQcP zsXl-gl3pYpG$gl4c==ChSlK@_3-ig??MR3KL{7aP?n5tGLEvro!cYuCDowG+FAdse za-ln-LQ$0wlqd{mAOp-1{+atvw^0UiQisGOzSk&3gqAmy_f}NYv@{j$Zxj zzIV9nO%~J5^BX&d07qx|Jj&Y95)TN>fqebMMa@FO&@{X(l2RIi9wsIkE{4a$)Lgn$ z^~7By0z3LETMFC(!W}zTEWyF};%o?tfeVd9DFW_+AFE|w0{fjMovfWtu#&5}Q6|Na z^Oq3P@3VFoe5%Eo+eo)Z?)gV@BJ}zwWBddmU4z4+4pf zKpJVD)q$;{24%lZMT!%gRDK~hpvQ*1l@sCDL2nR#PQoL(Bn;0}Z75{OzJ!GSJ%a8T z%{ZcTJ8*8D#(zPkp`$Ibg^(om4%UacWZ@O(WBmaLP|B%Nck$1(r~_TFU8c%bu~)`G zosq75J3TuZ4eLaM)`rk9sxnaz`%&3 zCxWetp0%usm!XV>iSeUq)zzO8dI5w6PVmel>f5-C(3+H61b-iTv2n|Py17^2Rq{pm zjedZrj+`bPg0n}BdKWAA^T`>c+$VZTiz(?+^^0L+?kx_#e+>f2x(`1~k?dl2E=SaU zrN2$=v7vMI?~jVw(V?m#CFQD0)1ep(Sa+$GGzmsEBayT!nJ^pTybFj~jDv$geAxZ~ z+0@p#DDDAMjsz8*%K@Ewzl&TpM&p_RvIIap=_vcOkkvj$Ux3esd>}5Uo?0-vbAB}z zMQRR<(6MwoJ_QYZc$Kx>-oilSfY_WKl>UC_`-vn-l#fOpoqLLr%<#gokSMNu+GyHL&;o zh}8|Z4;{i~lrkIR{{}z!n<@8EA-Dkf0evF1aJ8!EiO)!p7E*yYpp6xX@O~ggn*yY% zcWd~g5td~FV|I3R2aAn?(nh!5LK5C#3^5o$baME!GYq#5ZZAcbJ}v5RlWZTn8yU%n z5*2C_TwL&*otvAR-6A2}HJRPo1r}2A(g@R{R!KiVn75Afw9#F8Q2v$#sPk`L!*5*5yg;MQrn4;?QEOcgiZ=zvZCn-CM_zz36KFDN~a0cfg0 z<|n3KDYV7E3b#FWxES@{h2bw6nA(B8@JMJlva3sW7{AizU!C3rz{jHh@;4 zw7L%nZMO}AG%QamF>^?>yx`;_)h<9D4GJ)ez@}A9yb_s z|MgP$-JQCRc-cHJ98F2z@or8_-#78{YdVRilcQ3^lrdXte&2{Kc#>&J?hY8rlp7szo=n(@?Xl|v8Q!S$YHl)az;^- z!rl%(!B$mTS4}9BzC6D~Q)hE*a?gkGmYTe-Gbu(w#XCY9TTg5irP-XSIFLRa%1}5_ zDvE$0ua1kAc4Zaj<=-3~-xS;Ru&>uD>6L!}k* z^peE-RX0cnWPwF}uv&iFP#>D)VQ+OA8=L3Q4BK}FI=hi!#Ee(fihO9XNMFyN770Y< zhBd>7G_u3S5Nc6~^@)L+nvw%5WsYza-mv_G^aQoGX#D9z{lw&tBEg&mBpd<4JE9+)D+p5jtdy}HbR*eUq z3XhTo56pmv!H9>$g2%aIV+W_Jv&t8p?4F7Jo=Ee)P4B*9^^*MSeooL>Qz%C-MR_W7 zMXEzhDrv1=YD2Sg$G{p+)Qv8&h&_?!M}pgq$d zslvdjdj6+J#rv;WIR0$Zp|y*#`kv_qGWIp0LPqz&pM6g}_YJ8hTt09V4_3En*7%#( z`p48-j+y*gZSd_<+&?zVIw4ysFsSX|GXAG%eC}BHbG_lAMDb?MaEXq<=E@w9_XWyt{m-xt@yp*2#J^k~1I`%^P%$z~} zoWa?m0rkAW=xcWkcXtc7lW4b@$vF|AdQRkcQG|S6WboKj?ZnjV*9!C(Y-X;dY0hl6 zrqx?*l)UbQqv6D};)J~Nq^SIBwaRjnp{T8zC|VsULj$RE1u1?dX;wL@VR=WVA+M(z zFIbXS{hf9EQg>VPTTQPjRpP+3qFNCoZ=qD$b{FzNZMPCt=|ScgY)I8TXgh z5JjdMWu_Uq5tQ6xnt#Q>p}Aqfb~II<_wT^(F$!( zv%Kq=yp3`Gu2&A1B@26VspEt|{jZX?U#VHYTKN`8#Vea$Yi;`H_fQHvL4^OYy%BMC z62W)A6(9ZWp0sLIwfdL7)vaEf!6CU_WHhFrbw9s#Io~fZ&kwu6(3?bv9FxW!^QSlF zvn6J~Ip#JG=A0d-PhrK!#EQ1|3Xjf;(8db;h6>-DisR-AiD?bP5smdVKtpunwRK~b zd_$IgPS$vH7Wwp=!pPdh+8WEoyRgRg_YF4@JSS0u->1bWUy)M=xl_(~Q=VHED7TA* zS&4uLMdZcS@yOTt+}C5h*Q+hpbIsR>tv>qJ^w8K--cMtWdtJq#ORevMDr=KtPU-AYEE z)_LPB3E&8S#|hZR3Gt)8U6POe#q~B80URB(=~15UR3p^uoqWSch?fn zjI=%pQ)VEFdnW4JbX4nl)JYyD^0`JvzpK zT6{0E^OW!Sl)Q3Bopd4j;c(gfFsOF@946T77Yq+HgX>Vj&(PqQZ=a~7ejlQ88N5`Q1-EY_qFl)LL)o&+!=IfX zZ-nWbod}kjAJO~)T1dHhL^+G0H|C_a+&KhIR2_rXji77b5@GhvJs$gOymW6|{yW#h zUM6)65zY8(jrb%D4R1|#H}&yO^>JoRb|KB0YmJ&D4L5I1cQ^HuPW6+gw$mwrrTH5Q1ZNY_6rWC>Q1fm%sBah)~UoEPrnaTyBvq+ZC$ZwXZlat~?1* z5{*^m-LT^Qq>{p4nKLHH%kA{@6XTVM?M>^Cn=8ZX<)8Ds2mEZgOs%PmPA2MX3P^Ci*~qdFZGqh#=lV2#RtId7$Db@%Qbx6+H?(cC^Ll6m zsOLl|gGB$m8~Qz(OWrKPnpxo2mTP!K;*X2jV~&~TgNgp7!lSmrAfWUZle115(2rX_B9IwHFX9LqChcpZvtPhCGJ4zj#b5-=%-(DlyMH;21Mf zVW+Ibx&2xrXsp{i{iAd9N8<9J!SdkR!l201VB^5xc6E$HZ_ENTCLyWH1zHvK;jk=h z22Z!CT8bCtr{wTLh&n~BA>1&k_Ciu{dwG1ZWD*W+mWt6@4a@d}YOVnaYVyAt1<4u( zesBz^RE85Ne`GP7;{M~g^N5r=##@-43t}|+b|#0X1Bys{DJ%aUw{939grh!Z>k>`7VFIh(&8`#^T+yqx8zEa; z`vSmb2Z$yU*(Ur+_z=-k_?#d4Dk%rBDD5Tl<|6)eSHS4#4fDwFD&Hu79-1f(@&n*3svp~G7euZ|C&~!@(LE%OL$s}E!dNn@)X$Q{w`Mgi{jrYp(j<@T^cJoby!#<|YXD%_- zpx>9?QZ^^SP8)wv-rE7k1OK=&X?F@gyc3hw4S2V3D5MZXgB|odzw_8ILp~Qk|FH|e z`)W1T-MI0k@sYTZ;i=L7lc#{2CkC-+Eup9RmotgCXVJ43+MV!MuZa6jh{5j-J6@8g{Z=f3m#uD~M~VseSXj zun~SQ1b^At^SVHZHPv{V%~9-OBJ-mz6v%dSkZgO#|Na7HtXM^01W^zLEMZ2OLj9pf z^lj;6Y7zf*HZT$o-&f_3(u?6du^6S?68{$jcb60J^DO$C7_yH|7DSvgo9{!Si3>)K}Cn?m^|x};U7o9@4E<* zFAgy{hB^k+yn$0CUZaVewQpuaq*j?Wc-ZIN=mpFfWSH6IH@N#(>HCE_`d!#7?yh!R zs5h`qUOT_6@;<>uJz*L-CxYiNq2e1tnc?mPjW;B3uC9N~P+s&3z7Nd%HeChxW&ZFJ zKCT3pdhb6%{v@IK%96!w;tKZ<@K1H)*=13>t`t539G3s&eE4>98S3@!Idgt9>)q{` z)9mC0%HuwTbJ9%W+m`2lzozSZ=eg1My+?51_+MLBId*a!Q%T-}dt5LXuHTpGol6SSDApCd3}Gkh`3Iv^h#|IKr_W0cUaXfd-k{ z3YoK!#8r(Y)`F$pn_4)TF{+g7MYP}YT~pi}$J#gkU2i-v7ot_K}Phh$?xxG*~ zSWY|4W=<4Xx_i|6Lj8J4`uC;bDaPb!y!r3%{8J(PKYENtdo~8c3^^92J662TTQ|i$ zdlSx@3*0XLew0|uk^JrD1GpYJn1?+?8~_XLLNh`$n`N0ix{D(}>j`C+ctV}^?x+|B z46e@b(lE^!q?Z`V^LK3OhO5?wdvW7+83|%Dk-i%s&~o%=bN5dRAm}o)k*VirGNn{7 zc~yVZ`o&BC=x1c-Z_Sbt_W5%dk6|{(A%iD zWy>l7waKPtm)pwc*q?ATk>^)ZH+Sdr&$x+t5Gf#t@S9-i^k!rpfPM$pvtI1JD&rwL zZhG~pUbm*+OVBVu6>y4#Yp21dd@H+7Uh!o;RF7p9Ff7Z&ZG0LCdnXy;sH%a!~nJ$TK74u|pOk*oyB9kC?7=y}|YX zKV{=x@Vn)=4_5UTz5a{v%A`!+Pi9&A3+Xp(lb z`R-c z?euP5VZ&E3-FBZ3NB4EiOp^@Y7ZV6w1IHupq_ zW%-+xCGJ`$4L0B{4c?PSzf2XsH{-ikX1QPDxhxR5{0jDudr(E6$Q5^D$h{QLxC|h5 zs!h6l4-vqwj%6ZtmmiMNTm4l1d&y`zkYkxHD`M6)U5Eyg!V4`)Hi5-do6xf=4rhJ{ z-&0-P(+$&e70>g9zj64r=YF8)lDuaCRMjwDbv;5=6biUllcdNCr|3(jjMJr%D|DoO zv@n}}qi}T9dUU&VjeL3?73uE+T{cc%{t>Y(2wj#;2+|jBvXS)ad+9_UAY~XQb?zs{ zA0W*dCN-Su=q%#(Oyvb{>!$DNwruHQZrkJ!7wb>;b{7Hrbnw?obeaZqqY8AqN+oof zw%YA|Yd~Q5O(X&(em{YFzW`=`JYN44iGc=OTla_bdt5%ng$2>5nJ^;H@;HCjc>k{W zLS2F`QwCpkgV1`V&`;`*>)L;4X@|ibNGh5Lhb;1H*>u?&-a?wG@0iER35-0|J-OAt z6fjXtJj3G;BcAgETGMxI3WoSs1v?b&9yZ~AbHLql3W1<(PsqXY^Qp+IRj!DZHmkCw z)!0RFPxW~DGw0<7PLjpn&J&r;bV|>h`L@hz?H%$Qx(F+(Yp%6nEh;_ut`B*8Z}0A& zOWGJ~C%#WW+ROi@)8T(F?@kJB%|hSSN##3PZKA_>c2nr2#n(kjcOH14QzHA|uLDC4 zbp(oQG&=PYjWh5*bm)_DYp`Kt>oJih4Y>U=vZbH$CW%8`D3njHH-|2uZPK0#yMcmh z{SmjqndmS&4C+N*O1ZK!i`691GU(2cUi}SfAV#9fihIqFcQooHhY-Z=Vw6&eLT;N> zYD*zO`1#pBmL1A*lz1UWuoZ3rHlh46576n;qhm-ih7Q!r;fn82aM($x4DfK+iEvhlw+O>Xa8_-+)!x|sc}?3a_m&vFC~+9-dI6|gis+wDg~*b;9cqTXRZ`|xz?n6_C-Foapd1#+ z!F1@cgAG`9NuF-0)u~APbs$=e<~LPCu24!%;%LElnFhpa2obROd}3Rq`w)3;7$tNb z&CznvY3tPd89dtiYFDY(P99MgaM%$T{K)aB3RAhaNleenvbbK;>!LnX;!Q#RFpm{1 zmv=+aEeCLBCN-R1M7#QA1e3bP37U z8n_tD^o_;V1?IZwj!IIAb@-MoapY942-b=_TV4APgv$he+i7gqKF5s>5D=%AJjnFL z5O}P+@l$M%7{qKR(p0qLwlNCyazvQZ6XupQ%Ubi&gJbQ`jIWqpOkaZ4LGgc0uRyRU zgMOzM@kUZwg>l35Sg>%e{8}eM#q;ua2;G)6SX@a$t%3w?Y$-y?iG+~rST0az&FvY z7?@sD^Z};if(kkDXrkGHST4atKW>@CM*r3YhB6JvFGU9ur$ab4UjILkkW!ew4A&|C&+zE~ z47ch9*OL^n|4!Dk%uPSN+qC_cqi_MQx4|VZh@!>E5GeFfk?<=@>&J@0b`cteM7087 zLYFrCDRBqPI&m>d_`s?yiHo30Ie3BAjIR)Tw;$Ixb(L!ZAra`_DyN~-1R4Lu`;Q55 zIwbyMf?smbxzla}h$Pb8f&Ba``fn`qq~_)M+!qtN2BR7IBusV34bqk}aDtXPkzc%S zHqwIeKVFx(g*(tt;)c1U2)tmN>pvKG`wzxHxq|zJ^xKfWu|@MGA@RRTSE3iI-Nu*O z9`5|gmsD`_vQw8raqF64HuS7pkssig==(@o+e)v=9VU=?*fDX50zxlp_ot|iaOL}! zlfJHdE__AzHgyCm?3gWV!});@fB2~|dl=03un^+*grNJ4st-V8$ts(4tyiWU?Z_SV z{w|lL8bq60sW#If1W(C{Y(t=0>Lz}z!HLHQwGey}T_aaH49RE(ugwEFl&$}BJ9haT z7YN+Y=PNTvE6g#3==WHi&uT3(U;~Utm6; z{W3>RKR|$j81h`ijXqkP^ol=K3%iN&f7w08UIShYWlTTSkN4(=+=#R#_*K6R3P-m}9XFMnQX&J8g8Qul5Aa(lgkVtbJ83jRMR>ib zG#*|xs#IC(km>)0W!$^}a!~dENN(^S$(gNiDK0z&nQ<2FU<@EeLN$a9@5!0}K`}kq zWC_xGU|FI{XA6;wSh;H48Hn+>-0ySYmLj|}I!Pt^ZJ%+4BD9qFj89T|SghYyjoe1?u?C9wj=!wSC1+J^TPB=M~x+C_8Ku?UZ8AIH5- z?7{Uih3?Lk0j!~YMtT^Y0v58c3)DeCP*_dbX+~(5hy@EVmh$euw0OMfmt5E^SP; z?W~9QQ~d>UXeo`|+6j58QOHUeneS5Xq@&Ah5Qgafmv}h;^q)S#(G$`<^i*ZMsJd?!I(s z7^wVVTvQRLYZP6msy|TD3@Pt08y=7ERkKC98Vz8IsfL7m75ee-p?r6ZtwatEZU@O0 zlc3cxlz$$iww+60hIg+VWg-bY?vigEsI1KZn8M}M$Ox&y0>_|qSK=!l2zL0>|q-M7*uCb-9B z{eQGekPS+0Kfc)yP|{<%B-Zl7J2VlPMl?#3>O)j7l*P5}MBc*jn5EOdH!F(elU*YR zK=v0P(m?|BdtLPhvZH>KqDeEi5oe1}B zZuEZYm6Dg}sUV4OC*LLr(jr)?28bq9CYv$ojK*&uss@O$3H33u^cX?5kuQ}K`l%9B zd3GAq9F053QQJdas?mTVWnds@=`Sp$j`hEaC6pC`=`xCeF^Xh*#&~+H7ZWKN>Vsn^ zOM)i{{`ZySFR#qp5_66>S+pnGHN>>t&<8nSGt*5Qf^;hesaL$W<-3^wk;0sHK5)}x zuihid+KWvMI{rEbNp0UN8ohM}?K3@@kv_0CGU2hr4RF*TWXCn@-5{q=muc7{p%c9D zuNgqmE5<0s#)R1zmqDImYQugTzb-uI!5t7jz2XCPRWDZRpE?r%nS(OASUnUPyT%*n zFa7{xqVL9Xg?_|RnMnVo`9xe`ScELLY_J%j948KZ!QTbZ8-L3k-^W)(Dggl*O~m!3 zP@L6KA`6?PH$ziws*1SRc+3ITX0z}_=%K1}XbeVi119MBwb15%Ub@mEyw4ha+>t*E z@w$=GgZ&7OrqBlqFiGrc!$)l7B7ncV$~7+YdD_qvF+n>P%sKiwH#-vlT3gs7tM33n z$0`*`75>+zP8D96|A{U7(-+%3B+Nm+*wT*#SnW(2;1_hIi@mhsh5;99NRXyrsr%yL z!qSmA1!cmhS~f^6Lv28_{7amL1~Lp>L|TCM@rZq6abK=|JnSf13?$tDV3H@kO2tRxddEb#K7F|avNfyS8mo{Y;ll2(1umOpgcrtgWC#Ns|dnTu7+SF)~ogvA-9`2b5o zn{y_2I0ZpB6W(X@76p*XBM$i#FX{rRUtM#er&G2fLZ-H_;DJPS&LZi*YyfjtoMd9f znxH6YA}MnszFY_y;JJuRIf59Zxe41c;{o}+n(0J9(cWw+Zy8*BEs?8QgXq%|aN+OM ziAX7=W~AoI%D@#JhyszvN$YCQjUyYv22r4(Aq?+b6rmYAU~bLvq3ldpfTGJ{=iEkp zo;he8qU?B~mA!c8j|y};yig$F6+!7-6XFz_;1?!^C?*_q{AgOKYY-ob_wRbUr@YtS z?)!i!WAHPt_j4d!LP2VZJ9-9%{G*^Hob>Mq!lmq82mf!vGg%09+B37L@9FPx4>ANr z`U~_6QDzW3+oRqYzYsr>%1YUP+%u$1W%4YobW%w}L%J<;a)11{s&P_kKe1fR3e zF=U$ml^0etlNi`z@57`rbWR*a-wLHmfzpw_)#thV|H6{>ON^*z@fJuxT)?9;CVL&# zEP!{Y*d9UqztLt8*HdOuhrq60E!reCG2bO{QO{RS5uH*9c(L=&@9I)0?Z$7g?Hno< z%r_g6W7)TFiWx6xg}w2j|iW;_?Z;8m3ItJRAu?&prIQJ@MVaVJ9v1o z15HN4h^11dB9SGm*G_n!-9GmYW@AG5ba@OldOvN~0GwNx<#Ik`k8y(+dT7|VQQQBO z1n5hP06ppNf=h_eoUr4r*6sMc-YCwxS#Kv|K})m2XglITD{Kg*0;4EFNM0jq-08+MZWbpbMYjV_cpnX6vy{s{A(y z({$u9axE7gkGM`KF5ST08A=~5gdt@lD3q@!^1nU&SYBi+`eSgi13{SpdS^|wnqL`% zb_4_Ve@VMj`0`vSXxF7`TVO~hO!}IOh%oGJbzxWa$N)9)-^rzPc|IJoxGr}4<2xnIr_|7nesxDZe=7g`_hF4=dVIpU|iV3RPp0dp*k9O9k zG8go5J%{RruqIN-zTB8bQD|#l^ZW8VmpcQ-PH%%F#b3Adn+19 zp(@JHVh2YCf-yJ%YCehm?WlS1%bG(WX%^01KQ=l=_hKsB;#LJCTqyWIacCzM&yL|m z@8dt6X37%?JX(k!FG$;-`P{i0oe5cpE60Hwbs`g6`48bqFeo-PY90&RS7T4Mk72M6 zVQUqrOT%#J;sel@>qW}eqD$xIAPApbfrWk=D*96wKp93QS8)iU`9g(PRT7D5^uNBR zCI6x~5~VYF85tpp_D^Ox+*-s;1;_qZUrcv^hWB5vk8!mIjb`MG@fAv*`~D|omp;E# zEOL3cHgWy&4%MG#dB!FNs8ECn(!EjtdlGV293z#`Nt$k+P2NBOVe>l|@Isf#Z}Bi_ z?es*ni;(=DZa2)Viyw>rc`Ql4P04wdVpsU_2SZ!fD)i)WC|A~VCmGq=Qrb*2e!$NjU3IkBQ8lr$#-eTZE zu2$sx=(kXE)MMAY2K5b(qJ}y$I;?oseyzL)FxFBkB~~@zwmb{l$JfpBa5Ir;VSxdz z-+!@WCz_JOH+5Rz?mn_Uq4t(|I)sU2DBEU$9}=aHEGjv{h2Y@8wAevsvtV*wvJt-X z3!@a1&FGWKLTx-=9u=yJ$E*hW@o)4vc4x6`dICYAcn$RYw<#dxnOv4FxWPOx!&}DZ zL%z#^4X?qbWgpRgG*6RI!^T|~_lGG|!jF5b(9OEPNZY3A-|!D{9eeH1BT}F?$YUme zAI!vmjSNf1S5VWeW|zLWkr3dN7D-ag%^J<_GkRTlu~Lx-_CrCqhFmkrWA;abE$LGE z20ui7FXkp2+TFs{-n9h3(PR?ns~2}hnWfO5wq+NZZO}~H$-~DJY<}t4DtGGdu{U8D zBfCr!QGUSP?_+?iXxlzIM0|%bmsS8gOdw)42!8rSZw`WBf1)kGiF_-Mryw`%`q32X z#L#d-;v;C>_Zs4lP=h`9D5qftQA4f}V=!lz-xJXKOpY!A%^Z&V5SuAzu2P3I0?x@5 z?hTthg{*c_|7o*X5ImNxatYHOxZbS_Fd+=n8Nz!O!5{1|jHQQZ4dHDyH3BS;h09>r zTWXh*$2c#FN2hlvd4kf22dW=wRH|H>wU4f`K9d)Huyg;twvTrQdSVB&OPY^mTb8~cG0R*^8iVsTMysVKN4CJ~Z!U99{< z`{fpAxrM6GU*R?MY_!>A`Iau%_>3C?T4CfPf2Y1xKKtrn6SJ-wfSWvU$CA(_j|-KT z25iDy59m(OlYa3!_Mu%u`3%F9i;QozAF4{8DsJZzD@Ezb2YLrk51P{TgL6uoEM2Ub zL}JC)TM3N~bS~1Sh?W+bI=h;XVq{4XRQiM>9t~95-ZiPjlYgR8t9J00$Ns~LXadPM zTOfc&;tS~zCwfZ&gfBl?KX2B)yU$5I3G&I*`|}P|u&a(M+00z@4qCKS zNJ_MYRvoz?mmqsQ*GD6PXfihAzQHQIjh;gIaz`srv$3LpYLdzIR&8C~0NK#%*p7;A z*Sm-i`9BSBInSsqI=i*X>~^c#U1B^vE=~jZWg^Dh z@3Q*~Gm}yl$(=A|1KXjuV^&8cn$G9b9SxAIVpr{jRjl+J&~G_4V4`ScPbRE|l!Lv>R-Q zE0|<4$T`K;|AE)Yk>^)^a9X~5U&O52;)T=AXWr)Uul#rI{al#tnUj?Jsdrh<+k3B& zE~9xCAWKm^((hR$ida(VLiP4Q#6xhqefNE*NJnWiK(Bd0t@xPQ7gz1wF8$LmL@5Rs4OTJ?*jb3e9f3`IEq`jca-PCt`+a7{A5$=UG!z)>{{9a@3bD>`o`Oap; zitb=#6QbSYs@ct|Z+dzg0r|g!05#sUf=E$i#b%?- z5IWOhChlBGw&up7d@uPaFU>D%la=qrR%Dnn%`}+KblbC5e9h*%e+!o?UywDdX#d<* z@(!Cpco=MN&k@NSml=)OL1;JX)K&6}T6x%bh5;)5KJDj(O&w+gUlS~vO}O3r<=}3` ziY$9PDr--u(VWQzd*h$3E)CG*143ku&bUm?YygG5gH~UKUXgRj@MN^cC=cyIMbyx8 zvGTtS=Ph-8mN-_Sb%y1TJDrhqhpX!^g@>3tAM|Th!m2-R@}I}!q(tU+n;i+$Mn90} zgaKiPJwFn})^2>gE-A%&>-37N{onIQ_JngEUoUgdVDdbhezEsSK8-+%I=u2&;~y~W z@QBAbn_Ub0`u@jp*_-v7&6IB$U9Ivpms3{55u9uNQ2W2U_>H<42Tl73$c=04dglYjYWnn`nzL!7W{>0cUM5}jx@uyZW#&TLsYV2-hO#>HtnYldgJ@F z%aE(@c_XlFbu zrbQOlUw!|LVq2ro7!-d>YA<_Qbn+4(=`rB1{-WPw#qXsSX7jVF=q+#E3bf_hjp%asT9D3X7K>9P3F1pOSOrvazt6zUmPgy&8o4dK|Wl{fAOZ9H%tiCqt zcIU2k)mp_ZASQbwW866LJA#Gb>ju=+;YXfmr<`mz@5-U3d3e^*yRWYvl)bbV0VmaT z8F$$|f5~1uSH*e7y3`I%nI>uhb?*KJoZ6nTZ7ZQQz@SbAkk!}xl<=X02m# zU&w)1^U23k{T~2DK)SzEEG8yyvlf@YmsL)%y&ZAp@XhVT22pGwtGw3qa36HvUm&S} zo>gwz9)%G(WuGhOn!EVav9{yL*GPW=k4hhTeZht^{kdv$kd$a!RO@|L>t8^h5>uAWU$f%e%@1^R~-J+@V zBV~L?-VDFA3i7<2H1>6|)oL1b1+_bc>LhVYruE6bMV5;1^F$p^tl@ZO^w!;FNz!YT z;~C$^j%7_R#R=pt81z^Cffcm>YD%%*a8yWZ>1vs>js81E4tzUnbS*Y2<$%|Jfkw)t z%GSw97uTL!$3@#b%rs9mr(GGn+qX`Q@4>k*p7>8D4{4t%+Ak2k#Y>!ue^gZ0TV=3m zD=obhd`e-7odnM%uct9n?=!`GCEs3375Tz<#*CxEvE26L#>Rq=90gzZg)J(IFnj%d zT}-WD2xhQa?nJ)xWvOAW@0>G#&TNM|uzg@J9vpL@pskSHYICxF^j%aL=~9#Q`jz+A zzS20gVZ&}J&Jq{{3-J2*w`U>=PeY&I^_5-JDil_=;YMs-iEsOo?~#Vy7dUoyq_@() zU6NODvsii;g98$$Z910s1dBCR6&IdV*?y$9E)uUTfw4 z{O(hqt1pjp5vK=knI`Bx)*b7M-Ee&1`q#pb8-!E4{9ah6oDM&OCIvV|ko^>A};=*A;`dsEu%MT~Vo|*-Y%!KgP#x#=iQhLBtpH=N|11 zfycN`V+uk>1GNMnSQvllRlHJ-WUJQqifs|JFO|6*A4-%-m+K5(Yr>uBB0=iZ$ZeOv zWm5?j62uw}qNFud%1QE6Gj@HcFhb=Ia$5?PHCrKGGUNBQdHX@dqXGDjPv`#Q<5eQyKbdzZ*Kbd&Dw9% z)}Cxg|99cN06TLZkQ}P;jj0a01 z9g??hCZ}IK&3!DSuK+n~$tBwA-9ak5jTfalr}B-0OPVR3eqX-%2%DXh)bWVGm|+&{ z@}1$^@g(JtpQ^^t;D`A>He|YM^M$v*6@{ewOG+E$`%T|}r>!0;9w{?PSvj!CTTpW2 z(2bFuk2oYuxk7h%U$xu!X>r}FjgI#@r_>ySbXGm$8d;q}Yg|n}S8`CYs1)#WTSiJq z2-$7JKTOjVvFqKxW><-FTvt}0uITg2-nhQ}sdWy+{99k|C)Fl-HE=$3yxjOIP)7UC z<(nP>N>>wq=k?WOCq(SpbK}}hwUNr);rv)n%Yk{?*>8sT^p-W8&x&=3P|(|}5gRg5 z`_if^#w%}f{X=Z&{^d<-H`SMIinF%gnN`HdT_M4Ezoj=l6*P6XrmX+i)_1i10^0=- zN86(vT~_y0bBOG2QL$wFwsSS`liRUPha*P!X)+Kw1T!b9;km| z_r_!C;;n8H*3aKl-Oduv9$Q)dKwRcrTSHPi=`dZ2V_C+=oWR6Gaqe#`Me-iK9>i{KZxRbubQ-MVy=pd32y$7n@;^V3TP);m{E z@7T$IePN-(XC-r`+yUH~s zM3Zs1&b?%@QtC6;msif*Nz}U((5@HnXLGQI^72}i)QhCG*z*asg&D$6GY7Zw*==1i z&A#fG)__VFzVZU#%gpa#YtR}$s>~@oxp-uM!SQ}6!(*jCZrV2yH*DMW!^8fNMw(;l z$`Eby*Q=K9y_9sKhm-K&(%TnLkG=PjI4)Y${#;?r!*|x?O+!|f4|ixfXI?ttIA2Aj zOdFBV3r%+=8oFN5O|*Q@?w2@tGlhGWE$#8gcU=v=l zTDLdSZat9Da}7%yJbk`=e6M2*0;sy z7}*_Mqk8z}`wfamn(%KmZ;PGNkP*Fq5||D6{LNOIURG@XacGrvrQKG^sC^rDXqJ}& zqq5yEZ1?l-l=mI?-*vzI^4MGMdr6$#(b?a0?_VjZu*JK?97Oe|;9Mq>}nmX}`ByT*frTY;3LVa_N=0>gDllmNgMUuVi zs)e^#+v&`o%<AB&%9fI>-N}cu(6j!sCn>1i`qsECX(un-GPGC;>*pYkEJbw zbT=#(e$pQucjTRPV~Gp)SoHm-fLFDF(nBrpj=x*<$RsR;5#kuCd7Ks%vhJ0Ck-&~1 zzTQ3o@prw$r}|9XTyvEk2HQQh2-`PW?)J^C=yra*BA_?W1^1M(-H~B`KV;RY)N`i; zv-H{72bFnU?qXW`8$W&B+7V^b;$L<8R>r06#x-o&mv2U=5({?r9oD&EA>_U3*jr(n z6^av;*XLU-elgbnoJjco?9*E1q3$KooDYu{O1NLJ7S@+M( z7OA|Ctv25@y~?AscemAlBPZ2#eamSMbvKH^!F^UC3(TBE?mx|rtS{XoSW;4wEn~k8 z$tKEJJNJekHRRsqqCgyS!DTCu+7*ad)LaWYO)IKpS20(daIfpBzVYaT7~Kw9-PX33 zzH9js8qMx8bc1g>NW_0{Le9EG7MJbSPPMst_sQ8!c`puP#!b6_GN(nheL>`ipcsF{ zJos5IfzMsE{mMOM@IpGL>{PPLvND{-ZCBacb$oe)&3<39UvuY2am(!+y;!l^n50NQ zaNyb|>icy;i<%bfPe~%}u{R+Bog}~Uis$W-oOBf z#?8X_t3J=}gSGr{L&&!MY?s}!-%TI-Ch8`wiqKaOp-S33G3t&(=-(yocH zf;!%ma#6N5ar-KAg$n)sIRkdw*$;}xJ^YST8 zzVQR4KelrAJNLSkeKbC_xc!xH&OBGXy###Ko=o~?ur{UlZhL4|(wfHn(o3CvL=85Y z4S!s5T<+D2dD@1iy|lnuIw3f_xq%%P<5uI zk=iZS+pFb&^`x%zt}884zdUH6yv*_k*mGkwnkg7PoSl~3^2t!-!!#0N%3?z1|zCCmeVbMC#wYRxzGSGS*R)K7XD6^FIZ zPBF3)z9SvAvdOF#yLRglHuoBlYQK>P(upGO!EXnpwiXtq(4=mB5Z0^8DWs(@v~HKr zVEeJnKvz=HOMc$D;CPO=YF`ZAk4`q&Uf6BnKGkrnX{2FW6T|u4-G$2b^j(%+*7e?# z8zN294XPc4t0vJTdYI;l*mse0Rp+YlY(U@05-# z-G>gJbq;xNTW-YH^u01q*J2}o`O*Bnt!dU#$5u=mZAyMEE49YzX5_ohHzucBo~`r_ z)7Uqa|1xvJK`yn|cx~LJzHAHQc^enA^mlS9)^S*v$!^OF*!O3 z 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 Bvy}h< delta 16898 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 TrB6$#rF4BhzKG9C$KU=RCPCX~ diff --git a/src/core/server/integration_tests/saved_objects/migrations/group3/incompatible_cluster_routing_allocation.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group3/incompatible_cluster_routing_allocation.test.ts index b4d1aaa24675c..ee6c499da7ce8 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group3/incompatible_cluster_routing_allocation.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group3/incompatible_cluster_routing_allocation.test.ts @@ -97,8 +97,7 @@ async function updateRoutingAllocations( }); } -// Failing 9.0 version update: https://github.com/elastic/kibana/issues/192624 -describe.skip('incompatible_cluster_routing_allocation', () => { +describe('incompatible_cluster_routing_allocation', () => { let client: ElasticsearchClient; let root: Root; From 9e9c539a89ceeaa089321908926ee40a5c8a6ea4 Mon Sep 17 00:00:00 2001 From: Hanna Tamoudi Date: Mon, 23 Sep 2024 20:42:20 +0200 Subject: [PATCH 12/41] [Automatic Import] Replace import all (#193707) --- .../server/integration_builder/agent.test.ts | 12 +-- .../build_integration.test.ts | 84 +++++++------------ .../integration_builder/data_stream.test.ts | 27 +++--- .../server/integration_builder/fields.test.ts | 26 ++---- .../integration_builder/pipeline.test.ts | 6 +- .../server/util/samples.ts | 4 +- 6 files changed, 60 insertions(+), 99 deletions(-) diff --git a/x-pack/plugins/integration_assistant/server/integration_builder/agent.test.ts b/x-pack/plugins/integration_assistant/server/integration_builder/agent.test.ts index 44a26e40fe780..4c20c44b2ea78 100644 --- a/x-pack/plugins/integration_assistant/server/integration_builder/agent.test.ts +++ b/x-pack/plugins/integration_assistant/server/integration_builder/agent.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import * as Utils from '../util'; +import { ensureDirSync, createSync } from '../util'; import { createAgentInput } from './agent'; import { InputType } from '../../common'; @@ -27,13 +27,13 @@ describe('createAgentInput', () => { createAgentInput(dataStreamPath, inputTypes); - expect(Utils.ensureDirSync).toHaveBeenCalledWith(`${dataStreamPath}/agent/stream`); + expect(ensureDirSync).toHaveBeenCalledWith(`${dataStreamPath}/agent/stream`); - expect(Utils.createSync).toHaveBeenCalledWith( + expect(createSync).toHaveBeenCalledWith( `${dataStreamPath}/agent/stream/aws-s3.yml.hbs`, expect.any(String) ); - expect(Utils.createSync).toHaveBeenCalledWith( + expect(createSync).toHaveBeenCalledWith( `${dataStreamPath}/agent/stream/filestream.yml.hbs`, expect.any(String) ); @@ -42,7 +42,7 @@ describe('createAgentInput', () => { it('Should not create agent files if there are no input types', async () => { createAgentInput(dataStreamPath, []); - expect(Utils.ensureDirSync).toHaveBeenCalledWith(`${dataStreamPath}/agent/stream`); - expect(Utils.createSync).not.toHaveBeenCalled(); + expect(ensureDirSync).toHaveBeenCalledWith(`${dataStreamPath}/agent/stream`); + expect(createSync).not.toHaveBeenCalled(); }); }); diff --git a/x-pack/plugins/integration_assistant/server/integration_builder/build_integration.test.ts b/x-pack/plugins/integration_assistant/server/integration_builder/build_integration.test.ts index d3bd013e6e267..e8800af12653f 100644 --- a/x-pack/plugins/integration_assistant/server/integration_builder/build_integration.test.ts +++ b/x-pack/plugins/integration_assistant/server/integration_builder/build_integration.test.ts @@ -5,15 +5,14 @@ * 2.0. */ -import * as buildIntegrationModule from './build_integration'; +import { buildPackage, renderPackageManifestYAML } from './build_integration'; import { testIntegration } from '../../__jest__/fixtures/build_integration'; -import * as Utils from '../util'; -import * as DataStreamModule from './data_stream'; -import * as FieldsModule from './fields'; -import * as AgentModule from './agent'; -import * as PipelineModule from './pipeline'; +import { generateUniqueId, ensureDirSync, createSync } from '../util'; +import { createDataStream } from './data_stream'; +import { createFieldMapping } from './fields'; +import { createAgentInput } from './agent'; +import { createPipeline } from './pipeline'; import { DataStream, Docs, InputType, Pipeline, Integration } from '../../common'; -import { renderPackageManifestYAML } from './build_integration'; import yaml from 'js-yaml'; const mockedDataPath = 'path'; @@ -25,7 +24,7 @@ jest.mock('./fields'); jest.mock('./agent'); jest.mock('./pipeline'); -(Utils.generateUniqueId as jest.Mock).mockReturnValue(mockedId); +(generateUniqueId as jest.Mock).mockReturnValue(mockedId); jest.mock('@kbn/utils', () => ({ getDataPath: jest.fn(() => mockedDataPath), @@ -97,77 +96,68 @@ describe('buildPackage', () => { beforeEach(async () => { jest.clearAllMocks(); - await buildIntegrationModule.buildPackage(testIntegration); + await buildPackage(testIntegration); }); it('Should create expected directories and files', async () => { // Package & integration folders - expect(Utils.ensureDirSync).toHaveBeenCalledWith(packagePath); - expect(Utils.ensureDirSync).toHaveBeenCalledWith(integrationPath); + expect(ensureDirSync).toHaveBeenCalledWith(packagePath); + expect(ensureDirSync).toHaveBeenCalledWith(integrationPath); // _dev files - expect(Utils.ensureDirSync).toHaveBeenCalledWith(`${integrationPath}/_dev/build`); - expect(Utils.createSync).toHaveBeenCalledWith( + expect(ensureDirSync).toHaveBeenCalledWith(`${integrationPath}/_dev/build`); + expect(createSync).toHaveBeenCalledWith( `${integrationPath}/_dev/build/docs/README.md`, expect.any(String) ); - expect(Utils.createSync).toHaveBeenCalledWith( + expect(createSync).toHaveBeenCalledWith( `${integrationPath}/_dev/build/build.yml`, expect.any(String) ); // Docs files - expect(Utils.ensureDirSync).toHaveBeenCalledWith(`${integrationPath}/docs/`); - expect(Utils.createSync).toHaveBeenCalledWith( + expect(ensureDirSync).toHaveBeenCalledWith(`${integrationPath}/docs/`); + expect(createSync).toHaveBeenCalledWith( `${integrationPath}/docs/README.md`, expect.any(String) ); // Changelog file - expect(Utils.createSync).toHaveBeenCalledWith( - `${integrationPath}/changelog.yml`, - expect.any(String) - ); + expect(createSync).toHaveBeenCalledWith(`${integrationPath}/changelog.yml`, expect.any(String)); // Manifest files - expect(Utils.createSync).toHaveBeenCalledWith( - `${integrationPath}/manifest.yml`, - expect.any(String) - ); + expect(createSync).toHaveBeenCalledWith(`${integrationPath}/manifest.yml`, expect.any(String)); }); it('Should create logo files if info is present in the integration', async () => { testIntegration.logo = 'logo'; - await buildIntegrationModule.buildPackage(testIntegration); + await buildPackage(testIntegration); - expect(Utils.ensureDirSync).toHaveBeenCalledWith(`${integrationPath}/img`); - expect(Utils.createSync).toHaveBeenCalledWith( - `${integrationPath}/img/logo.svg`, - expect.any(Buffer) - ); + expect(ensureDirSync).toHaveBeenCalledWith(`${integrationPath}/img`); + expect(createSync).toHaveBeenCalledWith(`${integrationPath}/img/logo.svg`, expect.any(Buffer)); }); it('Should not create logo files if info is not present in the integration', async () => { jest.clearAllMocks(); testIntegration.logo = undefined; - await buildIntegrationModule.buildPackage(testIntegration); + await buildPackage(testIntegration); - expect(Utils.ensureDirSync).not.toHaveBeenCalledWith(`${integrationPath}/img`); - expect(Utils.createSync).not.toHaveBeenCalledWith( + expect(ensureDirSync).not.toHaveBeenCalledWith(`${integrationPath}/img`); + expect(createSync).not.toHaveBeenCalledWith( `${integrationPath}/img/logo.svg`, expect.any(Buffer) ); }); it('Should call createDataStream for each datastream', async () => { - expect(DataStreamModule.createDataStream).toHaveBeenCalledWith( + expect(createDataStream).toHaveBeenCalledWith( 'integration', firstDatastreamPath, firstDataStream ); - expect(DataStreamModule.createDataStream).toHaveBeenCalledWith( + expect(createDataStream).toHaveBeenCalledWith( 'integration', secondDatastreamPath, secondDataStream @@ -175,35 +165,23 @@ describe('buildPackage', () => { }); it('Should call createAgentInput for each datastream', async () => { - expect(AgentModule.createAgentInput).toHaveBeenCalledWith( - firstDatastreamPath, - firstDataStreamInputTypes - ); - expect(AgentModule.createAgentInput).toHaveBeenCalledWith( - secondDatastreamPath, - secondDataStreamInputTypes - ); + expect(createAgentInput).toHaveBeenCalledWith(firstDatastreamPath, firstDataStreamInputTypes); + expect(createAgentInput).toHaveBeenCalledWith(secondDatastreamPath, secondDataStreamInputTypes); }); it('Should call createPipeline for each datastream', async () => { - expect(PipelineModule.createPipeline).toHaveBeenCalledWith( - firstDatastreamPath, - firstDataStreamPipeline - ); - expect(PipelineModule.createPipeline).toHaveBeenCalledWith( - secondDatastreamPath, - secondDataStreamPipeline - ); + expect(createPipeline).toHaveBeenCalledWith(firstDatastreamPath, firstDataStreamPipeline); + expect(createPipeline).toHaveBeenCalledWith(secondDatastreamPath, secondDataStreamPipeline); }); it('Should call createFieldMapping for each datastream', async () => { - expect(FieldsModule.createFieldMapping).toHaveBeenCalledWith( + expect(createFieldMapping).toHaveBeenCalledWith( 'integration', firstDatastreamName, firstDatastreamPath, firstDataStreamDocs ); - expect(FieldsModule.createFieldMapping).toHaveBeenCalledWith( + expect(createFieldMapping).toHaveBeenCalledWith( 'integration', secondDatastreamName, secondDatastreamPath, diff --git a/x-pack/plugins/integration_assistant/server/integration_builder/data_stream.test.ts b/x-pack/plugins/integration_assistant/server/integration_builder/data_stream.test.ts index e5b00b85bf1d5..550c6118636cc 100644 --- a/x-pack/plugins/integration_assistant/server/integration_builder/data_stream.test.ts +++ b/x-pack/plugins/integration_assistant/server/integration_builder/data_stream.test.ts @@ -5,10 +5,10 @@ * 2.0. */ -import * as Utils from '../util'; +import { ensureDirSync, createSync, copySync } from '../util'; import { DataStream, Docs, InputType, Pipeline } from '../../common'; import { createDataStream } from './data_stream'; -import * as nunjucks from 'nunjucks'; +import { render } from 'nunjucks'; jest.mock('nunjucks'); @@ -59,31 +59,26 @@ describe('createDataStream', () => { createDataStream(packageName, dataStreamPath, firstDataStream); // pipeline - expect(Utils.ensureDirSync).toHaveBeenCalledWith(dataStreamPath); - expect(Utils.ensureDirSync).toHaveBeenCalledWith( - `${dataStreamPath}/elasticsearch/ingest_pipeline` - ); + expect(ensureDirSync).toHaveBeenCalledWith(dataStreamPath); + expect(ensureDirSync).toHaveBeenCalledWith(`${dataStreamPath}/elasticsearch/ingest_pipeline`); // dataStream files - expect(Utils.copySync).toHaveBeenCalledWith(expect.any(String), `${dataStreamPath}/fields`); + expect(copySync).toHaveBeenCalledWith(expect.any(String), `${dataStreamPath}/fields`); // test files - expect(Utils.ensureDirSync).toHaveBeenCalledWith(`${dataStreamPath}/_dev/test/pipeline`); - expect(Utils.copySync).toHaveBeenCalledWith( + expect(ensureDirSync).toHaveBeenCalledWith(`${dataStreamPath}/_dev/test/pipeline`); + expect(copySync).toHaveBeenCalledWith( expect.any(String), `${dataStreamPath}/_dev/test/pipeline/test-common-config.yml` ); - expect(Utils.createSync).toHaveBeenCalledWith( + expect(createSync).toHaveBeenCalledWith( `${dataStreamPath}/_dev/test/pipeline/test-${packageName}-datastream-1.log`, samples ); // // Manifest files - expect(Utils.createSync).toHaveBeenCalledWith(`${dataStreamPath}/manifest.yml`, undefined); - expect(nunjucks.render).toHaveBeenCalledWith(`filestream_manifest.yml.njk`, expect.anything()); - expect(nunjucks.render).toHaveBeenCalledWith( - `azure_eventhub_manifest.yml.njk`, - expect.anything() - ); + expect(createSync).toHaveBeenCalledWith(`${dataStreamPath}/manifest.yml`, undefined); + expect(render).toHaveBeenCalledWith(`filestream_manifest.yml.njk`, expect.anything()); + expect(render).toHaveBeenCalledWith(`azure_eventhub_manifest.yml.njk`, expect.anything()); }); }); diff --git a/x-pack/plugins/integration_assistant/server/integration_builder/fields.test.ts b/x-pack/plugins/integration_assistant/server/integration_builder/fields.test.ts index 9bd134b21b62e..4b85cfe7324d5 100644 --- a/x-pack/plugins/integration_assistant/server/integration_builder/fields.test.ts +++ b/x-pack/plugins/integration_assistant/server/integration_builder/fields.test.ts @@ -5,8 +5,8 @@ * 2.0. */ -import * as Utils from '../util'; -import * as nunjucks from 'nunjucks'; +import { createSync } from '../util'; +import { render } from 'nunjucks'; import { createFieldMapping } from './fields'; import { Docs } from '../../common'; @@ -19,7 +19,7 @@ jest.mock('../util', () => ({ const mockedTemplate = 'mocked template'; -(nunjucks.render as jest.Mock).mockReturnValue(mockedTemplate); +(render as jest.Mock).mockReturnValue(mockedTemplate); describe('createFieldMapping', () => { const dataStreamPath = 'path'; @@ -46,14 +46,8 @@ describe('createFieldMapping', () => { type: keyword `; - expect(Utils.createSync).toHaveBeenCalledWith( - `${dataStreamPath}/base-fields.yml`, - mockedTemplate - ); - expect(Utils.createSync).toHaveBeenCalledWith( - `${dataStreamPath}/fields/fields.yml`, - expectedFields - ); + expect(createSync).toHaveBeenCalledWith(`${dataStreamPath}/base-fields.yml`, mockedTemplate); + expect(createSync).toHaveBeenCalledWith(`${dataStreamPath}/fields/fields.yml`, expectedFields); }); it('Should create fields files even if docs value is empty', async () => { @@ -62,13 +56,7 @@ describe('createFieldMapping', () => { const expectedFields = `[] `; - expect(Utils.createSync).toHaveBeenCalledWith( - `${dataStreamPath}/base-fields.yml`, - mockedTemplate - ); - expect(Utils.createSync).toHaveBeenCalledWith( - `${dataStreamPath}/fields/fields.yml`, - expectedFields - ); + expect(createSync).toHaveBeenCalledWith(`${dataStreamPath}/base-fields.yml`, mockedTemplate); + expect(createSync).toHaveBeenCalledWith(`${dataStreamPath}/fields/fields.yml`, expectedFields); }); }); diff --git a/x-pack/plugins/integration_assistant/server/integration_builder/pipeline.test.ts b/x-pack/plugins/integration_assistant/server/integration_builder/pipeline.test.ts index 95d197ba2081b..a416add5f1048 100644 --- a/x-pack/plugins/integration_assistant/server/integration_builder/pipeline.test.ts +++ b/x-pack/plugins/integration_assistant/server/integration_builder/pipeline.test.ts @@ -6,7 +6,7 @@ */ import { Pipeline } from '../../common'; -import * as Utils from '../util'; +import { createSync } from '../util'; import { createPipeline } from './pipeline'; jest.mock('../util'); @@ -50,7 +50,7 @@ processors: ignore_missing: true if: ctx.event?.original == null `; - expect(Utils.createSync).toHaveBeenCalledWith( + expect(createSync).toHaveBeenCalledWith( `${dataStreamPath}/elasticsearch/ingest_pipeline/default.yml`, expectYamlContent ); @@ -62,7 +62,7 @@ processors: const expectYamlContent = `--- {} `; - expect(Utils.createSync).toHaveBeenCalledWith( + expect(createSync).toHaveBeenCalledWith( `${dataStreamPath}/elasticsearch/ingest_pipeline/default.yml`, expectYamlContent ); diff --git a/x-pack/plugins/integration_assistant/server/util/samples.ts b/x-pack/plugins/integration_assistant/server/util/samples.ts index 65b26ef0476d0..a29813c1643f8 100644 --- a/x-pack/plugins/integration_assistant/server/util/samples.ts +++ b/x-pack/plugins/integration_assistant/server/util/samples.ts @@ -5,7 +5,7 @@ * 2.0. */ /* eslint-disable @typescript-eslint/no-explicit-any */ -import * as yaml from 'js-yaml'; +import { dump } from 'js-yaml'; import type { CategorizationState, EcsMappingState, RelatedState } from '../types'; interface SampleObj { @@ -160,7 +160,7 @@ export function generateFields(mergedDocs: string): string { .filter((key) => !ecsTopKeysSet.has(key)) .map((key) => recursiveParse(doc[key], [key])); - return yaml.dump(fieldsStructure, { sortKeys: false }); + return dump(fieldsStructure, { sortKeys: false }); } export function merge( From cd5ff16dfdbc5ff46199f4ce5785bf52da22fa8a Mon Sep 17 00:00:00 2001 From: Alexi Doak <109488926+doakalexi@users.noreply.github.com> Date: Mon, 23 Sep 2024 12:09:40 -0700 Subject: [PATCH 13/41] =?UTF-8?q?[ResponseOps]=20Flaky=20test=20x-pack/tes?= =?UTF-8?q?t/alerting=5Fapi=5Fintegration/spaces=5Fonly/tests/alerting/gro?= =?UTF-8?q?up2/monitoring=C2=B7ts=20(#193614)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Resolves https://github.com/elastic/kibana/issues/193072 ## Summary Removes the skip on flaky monitoring tests --- .../tests/alerting/group2/monitoring.ts | 46 ++++++++++++++----- 1 file changed, 34 insertions(+), 12 deletions(-) diff --git a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group2/monitoring.ts b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group2/monitoring.ts index a86db4a8c27e4..480150b9a97a6 100644 --- a/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group2/monitoring.ts +++ b/x-pack/test/alerting_api_integration/spaces_only/tests/alerting/group2/monitoring.ts @@ -13,18 +13,28 @@ import { FtrProviderContext } from '../../../../common/ftr_provider_context'; // eslint-disable-next-line import/no-default-export export default function monitoringAlertTests({ getService }: FtrProviderContext) { const supertest = getService('supertest'); + const retry = getService('retry'); - // Failing: See https://github.com/elastic/kibana/issues/193072 - describe.skip('monitoring', () => { + describe('monitoring', () => { const objectRemover = new ObjectRemover(supertest); + const run = async (id: string) => { + await retry.try(async () => { + // Sometimes the rule may already be running, which returns a 200. Try until it isn't + const response = await supertest + .post(`${getUrlPrefix(Spaces.space1.id)}/internal/alerting/rule/${id}/_run_soon`) + .set('kbn-xsrf', 'foo'); + expect(response.status).to.eql(204); + }); + }; + after(async () => await objectRemover.removeAll()); it('should return an accurate history for a single success', async () => { const createResponse = await supertest .post(`${getUrlPrefix(Spaces.space1.id)}/api/alerting/rule`) .set('kbn-xsrf', 'foo') - .send(getTestRuleData({ schedule: { interval: '3s' } })); + .send(getTestRuleData({ schedule: { interval: '1h' } })); expect(createResponse.status).to.eql(200); objectRemover.add(Spaces.space1.id, createResponse.body.id, 'rule', 'alerting'); @@ -45,15 +55,21 @@ export default function monitoringAlertTests({ getService }: FtrProviderContext) const createResponse = await supertest .post(`${getUrlPrefix(Spaces.space1.id)}/api/alerting/rule`) .set('kbn-xsrf', 'foo') - .send(getTestRuleData({ schedule: { interval: '3s' } })); + .send(getTestRuleData({ schedule: { interval: '1h' } })); expect(createResponse.status).to.eql(200); - objectRemover.add(Spaces.space1.id, createResponse.body.id, 'rule', 'alerting'); + const ruleId = createResponse.body.id; + objectRemover.add(Spaces.space1.id, ruleId, 'rule', 'alerting'); + + for (let i = 1; i < 3; i++) { + await waitForExecutionCount(i, ruleId); + await run(ruleId); + } // Allow at least three executions - await waitForExecutionCount(3, createResponse.body.id); + await waitForExecutionCount(3, ruleId); const getResponse = await supertest.get( - `${getUrlPrefix(Spaces.space1.id)}/internal/alerting/rule/${createResponse.body.id}` + `${getUrlPrefix(Spaces.space1.id)}/internal/alerting/rule/${ruleId}` ); expect(getResponse.status).to.eql(200); @@ -72,20 +88,26 @@ export default function monitoringAlertTests({ getService }: FtrProviderContext) .send( getTestRuleData({ rule_type_id: 'test.patternSuccessOrFailure', - schedule: { interval: '3s' }, + schedule: { interval: '1h' }, params: { pattern, }, }) ); expect(createResponse.status).to.eql(200); - objectRemover.add(Spaces.space1.id, createResponse.body.id, 'rule', 'alerting'); - // Allow at least three executions - await waitForExecutionCount(5, createResponse.body.id); + const ruleId = createResponse.body.id; + objectRemover.add(Spaces.space1.id, ruleId, 'rule', 'alerting'); + + for (let i = 1; i < 5; i++) { + await waitForExecutionCount(i, ruleId); + await run(ruleId); + } + // Allow at least five executions + await waitForExecutionCount(5, ruleId); const getResponse = await supertest.get( - `${getUrlPrefix(Spaces.space1.id)}/internal/alerting/rule/${createResponse.body.id}` + `${getUrlPrefix(Spaces.space1.id)}/internal/alerting/rule/${ruleId}` ); expect(getResponse.status).to.eql(200); From fb9700caa097dbdac310f8fd3a387b8d218a7428 Mon Sep 17 00:00:00 2001 From: Tim Sullivan Date: Mon, 23 Sep 2024 12:13:56 -0700 Subject: [PATCH 14/41] Assign Roles to Space from Spaces Management (#191795) ## Summary Epic link: https://github.com/elastic/kibana-team/issues/785 This changes bring a new design to the management of Spaces in Stack Management / Security. We have a new page to view the details of the Space, and new UX to assign Roles to a Space. ### Release Note Added several UX improvements to the management of Spaces in **Stack Management > Spaces**, including the ability to assign Roles to an existing Space. ### Checklist Delete any items that are not applicable to this PR. - [x] Use flaky test runner on changed functional tests: https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/6953 - [x] Create test for the ability to change space avatar from `initials` to `image` and vice versa - [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] [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) --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Eyo Okon Eyo Co-authored-by: Elastic Machine Co-authored-by: Aleh Zasypkin --- .../security/plugin_types_public/index.ts | 7 +- .../src/privileges/privileges_api_client.ts | 2 +- .../plugin_types_public/src/roles/index.ts | 7 +- .../src/roles/roles_api_client.ts | 11 + .../feature_table.test.tsx | 2 +- .../kibana_privilege_table/feature_table.tsx | 27 +- .../feature_table_expanded_row.test.tsx | 2 +- .../privilege_form_calculator.test.ts | 2 +- .../public/authentication/index.mock.ts | 2 + .../authorization/authorization_service.ts | 1 + .../roles/edit_role/edit_role_page.tsx | 190 +++--- .../privilege_space_form.tsx | 10 +- .../space_aware_privilege_section.tsx | 2 +- .../management/roles/roles_api_client.mock.ts | 1 + .../management/roles/roles_api_client.test.ts | 532 ++++++++------- .../management/roles/roles_api_client.ts | 13 + .../plugins/security/public/plugin.test.tsx | 1 + x-pack/plugins/spaces/common/constants.ts | 12 + .../plugins/spaces/common/types/space/v1.ts | 4 +- x-pack/plugins/spaces/public/constants.ts | 2 +- .../customize_space.test.tsx.snap | 2 +- .../customize_space/customize_space.tsx | 10 +- .../customize_space_avatar.tsx | 8 +- .../solution_view/solution_view.tsx | 2 +- .../create_space_page.test.tsx} | 26 +- .../create_space_page.tsx} | 16 +- .../public/management/create_space/index.ts | 8 + .../public/management/edit_space/constants.ts | 10 + .../management/edit_space/edit_space.tsx | 283 ++++++++ .../edit_space_content_tab.test.tsx | 125 ++++ .../edit_space/edit_space_content_tab.tsx | 147 +++++ .../edit_space/edit_space_features_tab.tsx | 77 +++ .../edit_space_general_tab.test.tsx | 489 ++++++++++++++ .../edit_space/edit_space_general_tab.tsx | 297 +++++++++ .../management/edit_space/edit_space_page.tsx | 40 ++ .../edit_space/edit_space_roles_tab.test.tsx | 119 ++++ .../edit_space/edit_space_roles_tab.tsx | 207 ++++++ .../management/edit_space/edit_space_tabs.tsx | 125 ++++ .../public/management/edit_space/footer.tsx | 87 +++ .../management/edit_space/handle_api_error.ts | 27 + .../management/edit_space/hooks/use_tabs.ts | 41 ++ .../public/management/edit_space/index.ts | 2 +- .../provider/edit_space_provider.test.tsx | 113 ++++ .../provider/edit_space_provider.tsx | 149 +++++ .../management/edit_space/provider/index.ts | 13 + .../edit_space/provider/reducers/index.ts | 66 ++ .../space_assign_role_privilege_form.test.tsx | 308 +++++++++ .../space_assign_role_privilege_form.tsx | 610 ++++++++++++++++++ .../space_assigned_roles_table.test.tsx | 146 +++++ .../component/space_assigned_roles_table.tsx | 509 +++++++++++++++ .../spaces/public/management/lib/index.ts | 2 + .../public/management/lib/sort_roles.test.ts | 171 +++++ .../public/management/lib/sort_roles.ts | 28 + .../public/management/lib/validate_space.ts | 24 +- .../management/management_service.test.ts | 5 + .../public/management/management_service.tsx | 4 + .../management/privilege_api_client.mock.ts | 18 + .../management/roles_api_client.mock.ts | 1 + .../spaces_grid/spaces_grid_page.tsx | 60 +- .../management/spaces_management_app.test.tsx | 27 +- .../management/spaces_management_app.tsx | 58 +- .../plugins/spaces/public/management/types.ts | 18 + x-pack/plugins/spaces/public/plugin.tsx | 1 + .../spaces_manager/spaces_manager.mock.ts | 2 + .../spaces_manager/spaces_manager.test.ts | 28 + .../public/spaces_manager/spaces_manager.ts | 12 + x-pack/plugins/spaces/public/types.ts | 11 + x-pack/plugins/spaces/tsconfig.json | 16 +- .../apps/spaces/create_edit_space.ts | 36 -- .../spaces/create_edit_space/acme_logo.png | Bin 0 -> 3243 bytes .../create_edit_space/create_edit_space.ts | 117 ++++ .../apps/spaces/create_edit_space/index.ts | 14 + .../feature_controls/spaces_security.ts | 4 +- .../create_edit_space.ts | 10 +- .../functional/apps/spaces/spaces_grid.ts | 119 +++- .../page_objects/space_selector_page.ts | 5 + 76 files changed, 5207 insertions(+), 476 deletions(-) rename x-pack/plugins/spaces/public/management/{edit_space/manage_space_page.test.tsx => create_space/create_space_page.test.tsx} (98%) rename x-pack/plugins/spaces/public/management/{edit_space/manage_space_page.tsx => create_space/create_space_page.tsx} (97%) create mode 100644 x-pack/plugins/spaces/public/management/create_space/index.ts create mode 100644 x-pack/plugins/spaces/public/management/edit_space/constants.ts create mode 100644 x-pack/plugins/spaces/public/management/edit_space/edit_space.tsx create mode 100644 x-pack/plugins/spaces/public/management/edit_space/edit_space_content_tab.test.tsx create mode 100644 x-pack/plugins/spaces/public/management/edit_space/edit_space_content_tab.tsx create mode 100644 x-pack/plugins/spaces/public/management/edit_space/edit_space_features_tab.tsx create mode 100644 x-pack/plugins/spaces/public/management/edit_space/edit_space_general_tab.test.tsx create mode 100644 x-pack/plugins/spaces/public/management/edit_space/edit_space_general_tab.tsx create mode 100644 x-pack/plugins/spaces/public/management/edit_space/edit_space_page.tsx create mode 100644 x-pack/plugins/spaces/public/management/edit_space/edit_space_roles_tab.test.tsx create mode 100644 x-pack/plugins/spaces/public/management/edit_space/edit_space_roles_tab.tsx create mode 100644 x-pack/plugins/spaces/public/management/edit_space/edit_space_tabs.tsx create mode 100644 x-pack/plugins/spaces/public/management/edit_space/footer.tsx create mode 100644 x-pack/plugins/spaces/public/management/edit_space/handle_api_error.ts create mode 100644 x-pack/plugins/spaces/public/management/edit_space/hooks/use_tabs.ts create mode 100644 x-pack/plugins/spaces/public/management/edit_space/provider/edit_space_provider.test.tsx create mode 100644 x-pack/plugins/spaces/public/management/edit_space/provider/edit_space_provider.tsx create mode 100644 x-pack/plugins/spaces/public/management/edit_space/provider/index.ts create mode 100644 x-pack/plugins/spaces/public/management/edit_space/provider/reducers/index.ts create mode 100644 x-pack/plugins/spaces/public/management/edit_space/roles/component/space_assign_role_privilege_form.test.tsx create mode 100644 x-pack/plugins/spaces/public/management/edit_space/roles/component/space_assign_role_privilege_form.tsx create mode 100644 x-pack/plugins/spaces/public/management/edit_space/roles/component/space_assigned_roles_table.test.tsx create mode 100644 x-pack/plugins/spaces/public/management/edit_space/roles/component/space_assigned_roles_table.tsx create mode 100644 x-pack/plugins/spaces/public/management/lib/sort_roles.test.ts create mode 100644 x-pack/plugins/spaces/public/management/lib/sort_roles.ts create mode 100644 x-pack/plugins/spaces/public/management/privilege_api_client.mock.ts create mode 100644 x-pack/plugins/spaces/public/management/types.ts delete mode 100644 x-pack/test/functional/apps/spaces/create_edit_space.ts create mode 100644 x-pack/test/functional/apps/spaces/create_edit_space/acme_logo.png create mode 100644 x-pack/test/functional/apps/spaces/create_edit_space/create_edit_space.ts create mode 100644 x-pack/test/functional/apps/spaces/create_edit_space/index.ts diff --git a/x-pack/packages/security/plugin_types_public/index.ts b/x-pack/packages/security/plugin_types_public/index.ts index a2a6f4ea6a3ee..a48511441382a 100644 --- a/x-pack/packages/security/plugin_types_public/index.ts +++ b/x-pack/packages/security/plugin_types_public/index.ts @@ -16,6 +16,11 @@ export type { UserProfileSuggestParams, UserProfileAPIClient, } from './src/user_profile'; -export type { RolePutPayload, RolesAPIClient } from './src/roles'; +export type { + BulkUpdatePayload, + BulkUpdateRoleResponse, + RolePutPayload, + RolesAPIClient, +} from './src/roles'; export { PrivilegesAPIClientPublicContract } from './src/privileges'; export type { PrivilegesAPIClientGetAllArgs } from './src/privileges'; diff --git a/x-pack/packages/security/plugin_types_public/src/privileges/privileges_api_client.ts b/x-pack/packages/security/plugin_types_public/src/privileges/privileges_api_client.ts index e3a97398db7a3..25d768cb7b1ac 100644 --- a/x-pack/packages/security/plugin_types_public/src/privileges/privileges_api_client.ts +++ b/x-pack/packages/security/plugin_types_public/src/privileges/privileges_api_client.ts @@ -15,7 +15,7 @@ export interface PrivilegesAPIClientGetAllArgs { */ respectLicenseLevel: boolean; } -// TODO: Eyo include the proper return types for contract + export abstract class PrivilegesAPIClientPublicContract { abstract getAll(args: PrivilegesAPIClientGetAllArgs): Promise; } diff --git a/x-pack/packages/security/plugin_types_public/src/roles/index.ts b/x-pack/packages/security/plugin_types_public/src/roles/index.ts index 36a3e85fa8767..9364f7cee0bc2 100644 --- a/x-pack/packages/security/plugin_types_public/src/roles/index.ts +++ b/x-pack/packages/security/plugin_types_public/src/roles/index.ts @@ -5,4 +5,9 @@ * 2.0. */ -export type { RolePutPayload, RolesAPIClient } from './roles_api_client'; +export type { + BulkUpdatePayload, + BulkUpdateRoleResponse, + RolePutPayload, + RolesAPIClient, +} from './roles_api_client'; diff --git a/x-pack/packages/security/plugin_types_public/src/roles/roles_api_client.ts b/x-pack/packages/security/plugin_types_public/src/roles/roles_api_client.ts index b5c45c5160fde..12f79d3c3449e 100644 --- a/x-pack/packages/security/plugin_types_public/src/roles/roles_api_client.ts +++ b/x-pack/packages/security/plugin_types_public/src/roles/roles_api_client.ts @@ -11,9 +11,20 @@ export interface RolePutPayload { createOnly?: boolean; } +export interface BulkUpdatePayload { + rolesUpdate: Role[]; +} + +export interface BulkUpdateRoleResponse { + created?: string[]; + updated?: string[]; + errors?: Record; +} + export interface RolesAPIClient { getRoles: () => Promise; getRole: (roleName: string) => Promise; deleteRole: (roleName: string) => Promise; saveRole: (payload: RolePutPayload) => Promise; + bulkUpdateRoles: (payload: BulkUpdatePayload) => Promise; } diff --git a/x-pack/packages/security/ui_components/src/kibana_privilege_table/feature_table.test.tsx b/x-pack/packages/security/ui_components/src/kibana_privilege_table/feature_table.test.tsx index 83a0da2e26815..2380088dd713f 100644 --- a/x-pack/packages/security/ui_components/src/kibana_privilege_table/feature_table.test.tsx +++ b/x-pack/packages/security/ui_components/src/kibana_privilege_table/feature_table.test.tsx @@ -15,10 +15,10 @@ import { kibanaFeatures, } from '@kbn/security-role-management-model/src/__fixtures__'; import { findTestSubject, mountWithIntl } from '@kbn/test-jest-helpers'; +import type { Role } from '@kbn/security-plugin-types-common'; import { getDisplayedFeaturePrivileges } from './__fixtures__'; import { FeatureTable } from './feature_table'; -import type { Role } from '@kbn/security-plugin-types-common'; import { PrivilegeFormCalculator } from '../privilege_form_calculator'; const createRole = (kibana: Role['kibana'] = []): Role => { diff --git a/x-pack/packages/security/ui_components/src/kibana_privilege_table/feature_table.tsx b/x-pack/packages/security/ui_components/src/kibana_privilege_table/feature_table.tsx index daa1ddd704f74..45b263b66f2fb 100644 --- a/x-pack/packages/security/ui_components/src/kibana_privilege_table/feature_table.tsx +++ b/x-pack/packages/security/ui_components/src/kibana_privilege_table/feature_table.tsx @@ -48,6 +48,10 @@ interface Props { canCustomizeSubFeaturePrivileges: boolean; allSpacesSelected: boolean; disabled?: boolean; + /** + * default is true, to remain backwards compatible + */ + showTitle?: boolean; } interface State { @@ -58,6 +62,7 @@ export class FeatureTable extends Component { public static defaultProps = { privilegeIndex: -1, showLocks: true, + showTitle: true, }; private featureCategories: Map = new Map(); @@ -187,16 +192,18 @@ export class FeatureTable extends Component {

- - - {i18n.translate( - 'xpack.security.management.editRole.featureTable.featureVisibilityTitle', - { - defaultMessage: 'Customize feature privileges', - } - )} - - + {this.props.showTitle && ( + + + {i18n.translate( + 'xpack.security.management.editRole.featureTable.featureVisibilityTitle', + { + defaultMessage: 'Customize feature privileges', + } + )} + + + )} {!this.props.disabled && ( diff --git a/x-pack/packages/security/ui_components/src/kibana_privilege_table/feature_table_expanded_row.test.tsx b/x-pack/packages/security/ui_components/src/kibana_privilege_table/feature_table_expanded_row.test.tsx index 3b787f01cdf92..5e4f4ce021d44 100644 --- a/x-pack/packages/security/ui_components/src/kibana_privilege_table/feature_table_expanded_row.test.tsx +++ b/x-pack/packages/security/ui_components/src/kibana_privilege_table/feature_table_expanded_row.test.tsx @@ -12,10 +12,10 @@ import { createKibanaPrivileges, kibanaFeatures, } from '@kbn/security-role-management-model/src/__fixtures__'; +import type { Role } from '@kbn/security-plugin-types-common'; import { findTestSubject, mountWithIntl } from '@kbn/test-jest-helpers'; import { FeatureTableExpandedRow } from './feature_table_expanded_row'; -import type { Role } from '@kbn/security-plugin-types-common'; import { PrivilegeFormCalculator } from '../privilege_form_calculator'; const createRole = (kibana: Role['kibana'] = []): Role => { diff --git a/x-pack/packages/security/ui_components/src/privilege_form_calculator/privilege_form_calculator.test.ts b/x-pack/packages/security/ui_components/src/privilege_form_calculator/privilege_form_calculator.test.ts index 0281605f00f34..e61134b816ffa 100644 --- a/x-pack/packages/security/ui_components/src/privilege_form_calculator/privilege_form_calculator.test.ts +++ b/x-pack/packages/security/ui_components/src/privilege_form_calculator/privilege_form_calculator.test.ts @@ -9,9 +9,9 @@ import { createKibanaPrivileges, kibanaFeatures, } from '@kbn/security-role-management-model/src/__fixtures__'; +import type { Role } from '@kbn/security-plugin-types-common'; import { PrivilegeFormCalculator } from './privilege_form_calculator'; -import type { Role } from '@kbn/security-plugin-types-common'; const createRole = (kibana: Role['kibana'] = []): Role => { return { diff --git a/x-pack/plugins/security/public/authentication/index.mock.ts b/x-pack/plugins/security/public/authentication/index.mock.ts index 166583b1274cb..f30d47af3f701 100644 --- a/x-pack/plugins/security/public/authentication/index.mock.ts +++ b/x-pack/plugins/security/public/authentication/index.mock.ts @@ -31,6 +31,7 @@ export const authorizationMock = { getRole: jest.fn(), deleteRole: jest.fn(), saveRole: jest.fn(), + bulkUpdateRoles: jest.fn(), }, privileges: { getAll: jest.fn(), @@ -43,6 +44,7 @@ export const authorizationMock = { getRole: jest.fn(), deleteRole: jest.fn(), saveRole: jest.fn(), + bulkUpdateRoles: jest.fn(), }, privileges: { getAll: jest.fn(), diff --git a/x-pack/plugins/security/public/authorization/authorization_service.ts b/x-pack/plugins/security/public/authorization/authorization_service.ts index c650d381be1af..4fbae4fb54e6a 100644 --- a/x-pack/plugins/security/public/authorization/authorization_service.ts +++ b/x-pack/plugins/security/public/authorization/authorization_service.ts @@ -29,6 +29,7 @@ export class AuthorizationService { getRole: rolesAPIClient.getRole, deleteRole: rolesAPIClient.deleteRole, saveRole: rolesAPIClient.saveRole, + bulkUpdateRoles: rolesAPIClient.bulkUpdateRoles, }, privileges: { getAll: privilegesAPIClient.getAll.bind(privilegesAPIClient), diff --git a/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx b/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx index 63229be3c8683..02812eda34c7b 100644 --- a/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx +++ b/x-pack/plugins/security/public/management/roles/edit_role/edit_role_page.tsx @@ -14,6 +14,7 @@ import { EuiFlexItem, EuiForm, EuiFormRow, + EuiIconTip, EuiPanel, EuiSpacer, EuiText, @@ -556,30 +557,27 @@ export const EditRolePage: FunctionComponent = ({ const getElasticsearchPrivileges = () => { return ( -
- - -
+ ); }; @@ -587,21 +585,18 @@ export const EditRolePage: FunctionComponent = ({ const getKibanaPrivileges = () => { return ( -
- - -
+ ); }; @@ -800,44 +795,89 @@ export const EditRolePage: FunctionComponent = ({ return (
- - {getFormTitle()} - - - - - {isRoleReserved && ( - - - -

+ + + + {getFormTitle()} + + + + + + + {isRoleReserved && ( + + +

+ +

+
+
+ )} + + + {isDeprecatedRole && ( + + + + + )} + + {getRoleNameAndDescription()} + + -

- - - )} - {isDeprecatedRole && ( - - - - - )} - - {getRoleNameAndDescription()} - {getElasticsearchPrivileges()} - {getKibanaPrivileges()} - - {getFormButtons()} + } + > + {getElasticsearchPrivileges()} +
+
+ + + + + + + + } + /> + + + } + > + {getKibanaPrivileges()} + + + + {getFormButtons()} + +
); diff --git a/x-pack/plugins/security/public/management/roles/edit_role/privileges/kibana/space_aware_privilege_section/privilege_space_form.tsx b/x-pack/plugins/security/public/management/roles/edit_role/privileges/kibana/space_aware_privilege_section/privilege_space_form.tsx index a37fd799a035e..8275a7b1203ab 100644 --- a/x-pack/plugins/security/public/management/roles/edit_role/privileges/kibana/space_aware_privilege_section/privilege_space_form.tsx +++ b/x-pack/plugins/security/public/management/roles/edit_role/privileges/kibana/space_aware_privilege_section/privilege_space_form.tsx @@ -107,10 +107,18 @@ export class PrivilegeSpaceForm extends Component {

+ +

+ +

+
{this.getForm()} diff --git a/x-pack/plugins/security/public/management/roles/edit_role/privileges/kibana/space_aware_privilege_section/space_aware_privilege_section.tsx b/x-pack/plugins/security/public/management/roles/edit_role/privileges/kibana/space_aware_privilege_section/space_aware_privilege_section.tsx index e5a4cb1494d77..2bb3292932870 100644 --- a/x-pack/plugins/security/public/management/roles/edit_role/privileges/kibana/space_aware_privilege_section/space_aware_privilege_section.tsx +++ b/x-pack/plugins/security/public/management/roles/edit_role/privileges/kibana/space_aware_privilege_section/space_aware_privilege_section.tsx @@ -206,7 +206,7 @@ export class SpaceAwarePrivilegeSection extends Component { > ); diff --git a/x-pack/plugins/security/public/management/roles/roles_api_client.mock.ts b/x-pack/plugins/security/public/management/roles/roles_api_client.mock.ts index 0e756e87c081c..5f868fda093a4 100644 --- a/x-pack/plugins/security/public/management/roles/roles_api_client.mock.ts +++ b/x-pack/plugins/security/public/management/roles/roles_api_client.mock.ts @@ -11,5 +11,6 @@ export const rolesAPIClientMock = { getRole: jest.fn(), deleteRole: jest.fn(), saveRole: jest.fn(), + bulkUpdateRoles: jest.fn(), }), }; diff --git a/x-pack/plugins/security/public/management/roles/roles_api_client.test.ts b/x-pack/plugins/security/public/management/roles/roles_api_client.test.ts index e7f4839e56c5d..688aa78699769 100644 --- a/x-pack/plugins/security/public/management/roles/roles_api_client.test.ts +++ b/x-pack/plugins/security/public/management/roles/roles_api_client.test.ts @@ -11,260 +11,330 @@ import { RolesAPIClient } from './roles_api_client'; import type { Role } from '../../../common'; describe('RolesAPIClient', () => { - async function saveRole(role: Role) { - const httpMock = httpServiceMock.createStartContract(); - const rolesAPIClient = new RolesAPIClient(httpMock); - - await rolesAPIClient.saveRole({ role }); - expect(httpMock.put).toHaveBeenCalledTimes(1); - - return JSON.parse((httpMock.put.mock.calls[0] as any)[1]?.body as any); - } - - it('removes placeholder index privileges', async () => { - const role: Role = { - name: 'my role', - elasticsearch: { - cluster: [], - indices: [{ names: [], privileges: [] }], - remote_indices: [{ clusters: [], names: [], privileges: [] }], - run_as: [], - }, - kibana: [], - }; - - const result = await saveRole(role); - - expect(result).toEqual({ - elasticsearch: { - cluster: [], - indices: [], - remote_indices: [], - run_as: [], - }, - kibana: [], - }); - }); + describe('#saveRole', () => { + async function saveRole(role: Role) { + const httpMock = httpServiceMock.createStartContract(); + const rolesAPIClient = new RolesAPIClient(httpMock); + + await rolesAPIClient.saveRole({ role }); + expect(httpMock.put).toHaveBeenCalledTimes(1); + + return JSON.parse((httpMock.put.mock.calls[0] as any)[1]?.body as any); + } - it('removes placeholder query entries', async () => { - const role: Role = { - name: 'my role', - elasticsearch: { - cluster: [], - indices: [{ names: ['.kibana*'], privileges: ['all'], query: '' }], - run_as: [], - }, - kibana: [], - }; - - const result = await saveRole(role); - - expect(result).toEqual({ - elasticsearch: { - cluster: [], - indices: [{ names: ['.kibana*'], privileges: ['all'] }], - run_as: [], - }, - kibana: [], + it('removes placeholder index privileges', async () => { + const role: Role = { + name: 'my role', + elasticsearch: { + cluster: [], + indices: [{ names: [], privileges: [] }], + remote_indices: [{ clusters: [], names: [], privileges: [] }], + run_as: [], + }, + kibana: [], + }; + + const result = await saveRole(role); + + expect(result).toEqual({ + elasticsearch: { + cluster: [], + indices: [], + remote_indices: [], + run_as: [], + }, + kibana: [], + }); }); - }); - it('removes transient fields not required for save', async () => { - const role: Role = { - name: 'my role', - transient_metadata: { - foo: 'bar', - }, - _transform_error: ['kibana'], - metadata: { - someOtherMetadata: true, - }, - _unrecognized_applications: ['foo'], - elasticsearch: { - cluster: [], - indices: [], - run_as: [], - }, - kibana: [], - }; - - const result = await saveRole(role); - - expect(result).toEqual({ - metadata: { - someOtherMetadata: true, - }, - elasticsearch: { - cluster: [], - indices: [], - run_as: [], - }, - kibana: [], + it('removes placeholder query entries', async () => { + const role: Role = { + name: 'my role', + elasticsearch: { + cluster: [], + indices: [{ names: ['.kibana*'], privileges: ['all'], query: '' }], + run_as: [], + }, + kibana: [], + }; + + const result = await saveRole(role); + + expect(result).toEqual({ + elasticsearch: { + cluster: [], + indices: [{ names: ['.kibana*'], privileges: ['all'] }], + run_as: [], + }, + kibana: [], + }); }); - }); - it('does not remove actual query entries', async () => { - const role: Role = { - name: 'my role', - elasticsearch: { - cluster: [], - indices: [{ names: ['.kibana*'], privileges: ['all'], query: 'something' }], - remote_indices: [ - { clusters: ['cluster'], names: ['.kibana*'], privileges: ['all'], query: 'something' }, - ], - run_as: [], - }, - kibana: [], - }; - - const result = await saveRole(role); - - expect(result).toEqual({ - elasticsearch: { - cluster: [], - indices: [{ names: ['.kibana*'], privileges: ['all'], query: 'something' }], - remote_indices: [ - { clusters: ['cluster'], names: ['.kibana*'], privileges: ['all'], query: 'something' }, - ], - run_as: [], - }, - kibana: [], + it('removes transient fields not required for save', async () => { + const role: Role = { + name: 'my role', + transient_metadata: { + foo: 'bar', + }, + _transform_error: ['kibana'], + metadata: { + someOtherMetadata: true, + }, + _unrecognized_applications: ['foo'], + elasticsearch: { + cluster: [], + indices: [], + run_as: [], + }, + kibana: [], + }; + + const result = await saveRole(role); + + expect(result).toEqual({ + metadata: { + someOtherMetadata: true, + }, + elasticsearch: { + cluster: [], + indices: [], + run_as: [], + }, + kibana: [], + }); }); - }); - it('should remove feature privileges if a corresponding base privilege is defined', async () => { - const role: Role = { - name: 'my role', - elasticsearch: { - cluster: [], - indices: [], - run_as: [], - }, - kibana: [ - { - spaces: ['foo'], - base: ['all'], - feature: { - feature1: ['read'], - feature2: ['write'], - }, + it('does not remove actual query entries', async () => { + const role: Role = { + name: 'my role', + elasticsearch: { + cluster: [], + indices: [{ names: ['.kibana*'], privileges: ['all'], query: 'something' }], + remote_indices: [ + { + clusters: ['cluster'], + names: ['.kibana*'], + privileges: ['all'], + query: 'something', + }, + ], + run_as: [], }, - ], - }; - - const result = await saveRole(role); - - expect(result).toEqual({ - elasticsearch: { - cluster: [], - indices: [], - run_as: [], - }, - kibana: [ - { - spaces: ['foo'], - base: ['all'], - feature: {}, + kibana: [], + }; + + const result = await saveRole(role); + + expect(result).toEqual({ + elasticsearch: { + cluster: [], + indices: [{ names: ['.kibana*'], privileges: ['all'], query: 'something' }], + remote_indices: [ + { + clusters: ['cluster'], + names: ['.kibana*'], + privileges: ['all'], + query: 'something', + }, + ], + run_as: [], }, - ], + kibana: [], + }); }); - }); - it('should not remove feature privileges if a corresponding base privilege is not defined', async () => { - const role: Role = { - name: 'my role', - elasticsearch: { - cluster: [], - indices: [], - run_as: [], - }, - kibana: [ - { - spaces: ['foo'], - base: [], - feature: { - feature1: ['read'], - feature2: ['write'], - }, + it('should remove feature privileges if a corresponding base privilege is defined', async () => { + const role: Role = { + name: 'my role', + elasticsearch: { + cluster: [], + indices: [], + run_as: [], }, - ], - }; - - const result = await saveRole(role); - - expect(result).toEqual({ - elasticsearch: { - cluster: [], - indices: [], - run_as: [], - }, - kibana: [ - { - spaces: ['foo'], - base: [], - feature: { - feature1: ['read'], - feature2: ['write'], + kibana: [ + { + spaces: ['foo'], + base: ['all'], + feature: { + feature1: ['read'], + feature2: ['write'], + }, }, + ], + }; + + const result = await saveRole(role); + + expect(result).toEqual({ + elasticsearch: { + cluster: [], + indices: [], + run_as: [], }, - ], + kibana: [ + { + spaces: ['foo'], + base: ['all'], + feature: {}, + }, + ], + }); }); - }); - it('should not remove space privileges', async () => { - const role: Role = { - name: 'my role', - elasticsearch: { - cluster: [], - indices: [], - run_as: [], - }, - kibana: [ - { - spaces: ['*'], - base: [], - feature: { - feature1: ['read'], - feature2: ['write'], - }, + it('should not remove feature privileges if a corresponding base privilege is not defined', async () => { + const role: Role = { + name: 'my role', + elasticsearch: { + cluster: [], + indices: [], + run_as: [], }, - { - spaces: ['marketing'], - base: [], - feature: { - feature1: ['read'], - feature2: ['write'], + kibana: [ + { + spaces: ['foo'], + base: [], + feature: { + feature1: ['read'], + feature2: ['write'], + }, }, + ], + }; + + const result = await saveRole(role); + + expect(result).toEqual({ + elasticsearch: { + cluster: [], + indices: [], + run_as: [], }, - ], - }; - - const result = await saveRole(role); - - expect(result).toEqual({ - elasticsearch: { - cluster: [], - indices: [], - run_as: [], - }, - kibana: [ - { - spaces: ['*'], - base: [], - feature: { - feature1: ['read'], - feature2: ['write'], + kibana: [ + { + spaces: ['foo'], + base: [], + feature: { + feature1: ['read'], + feature2: ['write'], + }, }, + ], + }); + }); + + it('should not remove space privileges', async () => { + const role: Role = { + name: 'my role', + elasticsearch: { + cluster: [], + indices: [], + run_as: [], }, - { - spaces: ['marketing'], - base: [], - feature: { - feature1: ['read'], - feature2: ['write'], + kibana: [ + { + spaces: ['*'], + base: [], + feature: { + feature1: ['read'], + feature2: ['write'], + }, }, + { + spaces: ['marketing'], + base: [], + feature: { + feature1: ['read'], + feature2: ['write'], + }, + }, + ], + }; + + const result = await saveRole(role); + + expect(result).toEqual({ + elasticsearch: { + cluster: [], + indices: [], + run_as: [], }, - ], + kibana: [ + { + spaces: ['*'], + base: [], + feature: { + feature1: ['read'], + feature2: ['write'], + }, + }, + { + spaces: ['marketing'], + base: [], + feature: { + feature1: ['read'], + feature2: ['write'], + }, + }, + ], + }); + }); + + describe('#bulkUpdateRoles', () => { + async function bulkUpdateRoles(roles: Role[]) { + const httpMock = httpServiceMock.createStartContract(); + const rolesAPIClient = new RolesAPIClient(httpMock); + + await rolesAPIClient.bulkUpdateRoles({ rolesUpdate: roles }); + expect(httpMock.post).toHaveBeenCalledTimes(1); + + return JSON.parse((httpMock.post.mock.calls[0] as any)[1]?.body as any); + } + + it('send payload in the accepted format', async () => { + const roles: Role[] = [ + { + name: 'role1', + elasticsearch: { + cluster: [], + indices: [], + run_as: [], + }, + kibana: [], + }, + { + name: 'role2', + elasticsearch: { + cluster: [], + indices: [], + run_as: [], + }, + kibana: [], + }, + ]; + + const result = await bulkUpdateRoles(roles); + + expect(result).toEqual({ + roles: { + role1: { + elasticsearch: { + cluster: [], + indices: [], + run_as: [], + }, + kibana: [], + }, + role2: { + elasticsearch: { + cluster: [], + indices: [], + run_as: [], + }, + kibana: [], + }, + }, + }); + }); }); }); }); diff --git a/x-pack/plugins/security/public/management/roles/roles_api_client.ts b/x-pack/plugins/security/public/management/roles/roles_api_client.ts index c870f99e24dd3..d6dcab658d21c 100644 --- a/x-pack/plugins/security/public/management/roles/roles_api_client.ts +++ b/x-pack/plugins/security/public/management/roles/roles_api_client.ts @@ -6,6 +6,7 @@ */ import type { HttpStart } from '@kbn/core/public'; +import type { BulkUpdatePayload, BulkUpdateRoleResponse } from '@kbn/security-plugin-types-public'; import type { Role, RoleIndexPrivilege, RoleRemoteIndexPrivilege } from '../../../common'; import { copyRole } from '../../../common/model'; @@ -32,6 +33,18 @@ export class RolesAPIClient { }); }; + public bulkUpdateRoles = async ({ + rolesUpdate, + }: BulkUpdatePayload): Promise => { + return await this.http.post('/api/security/roles', { + body: JSON.stringify({ + roles: Object.fromEntries( + rolesUpdate.map((role) => [role.name, this.transformRoleForSave(copyRole(role))]) + ), + }), + }); + }; + private transformRoleForSave = (role: Role) => { // Remove any placeholder index privileges const isPlaceholderPrivilege = ( diff --git a/x-pack/plugins/security/public/plugin.test.tsx b/x-pack/plugins/security/public/plugin.test.tsx index 336a42a1fd324..e58539bf2bc8f 100644 --- a/x-pack/plugins/security/public/plugin.test.tsx +++ b/x-pack/plugins/security/public/plugin.test.tsx @@ -137,6 +137,7 @@ describe('Security Plugin', () => { "getAll": [Function], }, "roles": Object { + "bulkUpdateRoles": [Function], "deleteRole": [Function], "getRole": [Function], "getRoles": [Function], diff --git a/x-pack/plugins/spaces/common/constants.ts b/x-pack/plugins/spaces/common/constants.ts index d70c332fb62ab..bbbe38451fedf 100644 --- a/x-pack/plugins/spaces/common/constants.ts +++ b/x-pack/plugins/spaces/common/constants.ts @@ -31,3 +31,15 @@ export const MAX_SPACE_INITIALS = 2; * The path to enter a space. */ export const ENTER_SPACE_PATH = '/spaces/enter'; + +/** + * The 'classic' solution view is the default, non-project type of solution view + */ +export const SOLUTION_VIEW_CLASSIC = 'classic' as const; + +/** + * The feature privileges constants are used to identify the granularity of the configured feature visibility + */ +export const FEATURE_PRIVILEGES_ALL = 'all' as const; +export const FEATURE_PRIVILEGES_READ = 'read' as const; +export const FEATURE_PRIVILEGES_CUSTOM = 'custom' as const; diff --git a/x-pack/plugins/spaces/common/types/space/v1.ts b/x-pack/plugins/spaces/common/types/space/v1.ts index 9ba2deb09aaa2..ebd841e914e69 100644 --- a/x-pack/plugins/spaces/common/types/space/v1.ts +++ b/x-pack/plugins/spaces/common/types/space/v1.ts @@ -7,7 +7,9 @@ import type { OnBoardingDefaultSolution } from '@kbn/cloud-plugin/common'; -export type SolutionView = OnBoardingDefaultSolution | 'classic'; +import type { SOLUTION_VIEW_CLASSIC } from '../../constants'; + +export type SolutionView = OnBoardingDefaultSolution | typeof SOLUTION_VIEW_CLASSIC; /** * A Space. diff --git a/x-pack/plugins/spaces/public/constants.ts b/x-pack/plugins/spaces/public/constants.ts index 64781228d4f43..09bab1124f27d 100644 --- a/x-pack/plugins/spaces/public/constants.ts +++ b/x-pack/plugins/spaces/public/constants.ts @@ -13,7 +13,7 @@ export const getSpacesFeatureDescription = () => { if (!spacesFeatureDescription) { spacesFeatureDescription = i18n.translate('xpack.spaces.featureDescription', { defaultMessage: - 'Organize your dashboards and other saved objects into meaningful categories.', + 'Organize Kibana into spaces with dedicated navigation, privileges and objects.', }); } return spacesFeatureDescription; diff --git a/x-pack/plugins/spaces/public/management/components/customize_space/__snapshots__/customize_space.test.tsx.snap b/x-pack/plugins/spaces/public/management/components/customize_space/__snapshots__/customize_space.test.tsx.snap index 7eac1c7499919..d7527e300eece 100644 --- a/x-pack/plugins/spaces/public/management/components/customize_space/__snapshots__/customize_space.test.tsx.snap +++ b/x-pack/plugins/spaces/public/management/components/customize_space/__snapshots__/customize_space.test.tsx.snap @@ -5,7 +5,7 @@ exports[`renders correctly 1`] = ` dataTestSubj="generalPanel" > interface Props { validator: SpaceValidator; - space: FormValues; + space: CustomizeSpaceFormValues; editingExistingSpace: boolean; - onChange: (space: FormValues) => void; + onChange: (space: CustomizeSpaceFormValues) => void; title?: string; } @@ -71,7 +71,7 @@ export class CustomizeSpace extends Component { description={i18n.translate( 'xpack.spaces.management.manageSpacePage.describeSpaceDescription', { - defaultMessage: "Give your space a name that's memorable.", + defaultMessage: 'Give your space a meaningful name and description.', } )} fullWidth @@ -258,7 +258,7 @@ export class CustomizeSpace extends Component { }); }; - public onAvatarChange = (space: FormValues) => { + public onAvatarChange = (space: CustomizeSpaceFormValues) => { this.props.onChange(space); }; } diff --git a/x-pack/plugins/spaces/public/management/components/customize_space/customize_space_avatar.tsx b/x-pack/plugins/spaces/public/management/components/customize_space/customize_space_avatar.tsx index 4faa29d77e037..1a317a4fe9e9a 100644 --- a/x-pack/plugins/spaces/public/management/components/customize_space/customize_space_avatar.tsx +++ b/x-pack/plugins/spaces/public/management/components/customize_space/customize_space_avatar.tsx @@ -19,12 +19,12 @@ import { i18n } from '@kbn/i18n'; import { MAX_SPACE_INITIALS } from '../../../../common'; import { encode, imageTypes } from '../../../../common/lib/dataurl'; -import type { FormValues } from '../../edit_space/manage_space_page'; import type { SpaceValidator } from '../../lib'; +import type { CustomizeSpaceFormValues } from '../../types'; interface Props { - space: FormValues; - onChange: (space: FormValues) => void; + space: CustomizeSpaceFormValues; + onChange: (space: CustomizeSpaceFormValues) => void; validator: SpaceValidator; } @@ -127,7 +127,7 @@ export class CustomizeSpaceAvatar extends Component { onChange={(avatarType: string) => this.props.onChange({ ...space, - avatarType: avatarType as FormValues['avatarType'], + avatarType: avatarType as CustomizeSpaceFormValues['avatarType'], }) } buttonSize="m" diff --git a/x-pack/plugins/spaces/public/management/components/solution_view/solution_view.tsx b/x-pack/plugins/spaces/public/management/components/solution_view/solution_view.tsx index 9d7ca7140956c..c336791991df4 100644 --- a/x-pack/plugins/spaces/public/management/components/solution_view/solution_view.tsx +++ b/x-pack/plugins/spaces/public/management/components/solution_view/solution_view.tsx @@ -153,7 +153,7 @@ export const SolutionView: FunctionComponent = ({ placeholder={i18n.translate( 'xpack.spaces.management.navigation.solutionViewDefaultValue', { - defaultMessage: 'Classic (Default)', + defaultMessage: 'Select view', } )} isInvalid={validator.validateSolutionView(space, isEditing).isInvalid} diff --git a/x-pack/plugins/spaces/public/management/edit_space/manage_space_page.test.tsx b/x-pack/plugins/spaces/public/management/create_space/create_space_page.test.tsx similarity index 98% rename from x-pack/plugins/spaces/public/management/edit_space/manage_space_page.test.tsx rename to x-pack/plugins/spaces/public/management/create_space/create_space_page.test.tsx index 9fd90d739df41..4c8617ff007b8 100644 --- a/x-pack/plugins/spaces/public/management/edit_space/manage_space_page.test.tsx +++ b/x-pack/plugins/spaces/public/management/create_space/create_space_page.test.tsx @@ -18,7 +18,7 @@ import { KibanaFeature } from '@kbn/features-plugin/public'; import { featuresPluginMock } from '@kbn/features-plugin/public/mocks'; import { findTestSubject, mountWithIntl } from '@kbn/test-jest-helpers'; -import { ManageSpacePage } from './manage_space_page'; +import { CreateSpacePage } from './create_space_page'; import type { SolutionView, Space } from '../../../common/types/latest'; import { EventTracker } from '../../analytics'; import type { SpacesManager } from '../../spaces_manager'; @@ -70,7 +70,7 @@ describe('ManageSpacePage', () => { spacesManager.getActiveSpace = jest.fn().mockResolvedValue(space); const wrapper = mountWithIntl( - { spacesManager.getActiveSpace = jest.fn().mockResolvedValue(space); const wrapper = mountWithIntl( - { spacesManager.getActiveSpace = jest.fn().mockResolvedValue(space); const wrapper = mountWithIntl( - { spacesManager.getActiveSpace = jest.fn().mockResolvedValue(space); const wrapper = mountWithIntl( - { spacesManager.getActiveSpace = jest.fn().mockResolvedValue(space); const wrapper = mountWithIntl( - { spacesManager.getActiveSpace = jest.fn().mockResolvedValue(space); const wrapper = mountWithIntl( - { const spacesManager = spacesManagerMock.create(); const wrapper = mountWithIntl( - { const onLoadSpace = jest.fn(); const wrapper = mountWithIntl( - { const onLoadSpace = jest.fn(); const wrapper = mountWithIntl( - { const notifications = notificationServiceMock.createStartContract(); const wrapper = mountWithIntl( - Promise.reject(error)} notifications={notifications} @@ -542,7 +542,7 @@ describe('ManageSpacePage', () => { spacesManager.getActiveSpace = jest.fn().mockResolvedValue(space); const wrapper = mountWithIntl( - { spacesManager.getActiveSpace = jest.fn().mockResolvedValue(space); const wrapper = mountWithIntl( - { - customIdentifier?: boolean; - avatarType?: 'initials' | 'image'; - customAvatarInitials?: boolean; - customAvatarColor?: boolean; -} +import type { CustomizeSpaceFormValues } from '../types'; interface Props { getFeatures: FeaturesPluginStart['getFeatures']; @@ -62,7 +56,7 @@ interface Props { } interface State { - space: FormValues; + space: CustomizeSpaceFormValues; features: KibanaFeature[]; originalSpace?: Partial; showAlteringActiveSpaceDialog: boolean; @@ -77,7 +71,7 @@ interface State { }; } -export class ManageSpacePage extends Component { +export class CreateSpacePage extends Component { private readonly validator: SpaceValidator; constructor(props: Props) { @@ -189,7 +183,7 @@ export class ManageSpacePage extends Component { const { showAlteringActiveSpaceDialog } = this.state; return ( -
+
{ this.onSpaceChange(space); }; - public onSpaceChange = (updatedSpace: FormValues) => { + public onSpaceChange = (updatedSpace: CustomizeSpaceFormValues) => { this.setState({ space: updatedSpace, }); diff --git a/x-pack/plugins/spaces/public/management/create_space/index.ts b/x-pack/plugins/spaces/public/management/create_space/index.ts new file mode 100644 index 0000000000000..df9774f722dd3 --- /dev/null +++ b/x-pack/plugins/spaces/public/management/create_space/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 { CreateSpacePage } from './create_space_page'; diff --git a/x-pack/plugins/spaces/public/management/edit_space/constants.ts b/x-pack/plugins/spaces/public/management/edit_space/constants.ts new file mode 100644 index 0000000000000..21e10c547800f --- /dev/null +++ b/x-pack/plugins/spaces/public/management/edit_space/constants.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export const TAB_ID_CONTENT = 'content'; +export const TAB_ID_ROLES = 'roles'; +export const TAB_ID_GENERAL = 'general'; diff --git a/x-pack/plugins/spaces/public/management/edit_space/edit_space.tsx b/x-pack/plugins/spaces/public/management/edit_space/edit_space.tsx new file mode 100644 index 0000000000000..cd2bd76a57928 --- /dev/null +++ b/x-pack/plugins/spaces/public/management/edit_space/edit_space.tsx @@ -0,0 +1,283 @@ +/* + * 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, + EuiFlexGroup, + EuiFlexItem, + EuiLoadingSpinner, + EuiSpacer, + EuiTab, + EuiTabs, + EuiText, + EuiTitle, +} from '@elastic/eui'; +import React, { lazy, Suspense, useEffect, useState } from 'react'; +import type { FC } from 'react'; + +import type { ScopedHistory } from '@kbn/core/public'; +import type { FeaturesPluginStart, KibanaFeature } from '@kbn/features-plugin/public'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { reactRouterNavigate } from '@kbn/kibana-react-plugin/public'; +import type { Role } from '@kbn/security-plugin-types-common'; + +import { TAB_ID_CONTENT, TAB_ID_GENERAL, TAB_ID_ROLES } from './constants'; +import { handleApiError } from './handle_api_error'; +import { useTabs } from './hooks/use_tabs'; +import { useEditSpaceServices, useEditSpaceStore } from './provider'; +import { addSpaceIdToPath, ENTER_SPACE_PATH, type Space } from '../../../common'; +import { SOLUTION_VIEW_CLASSIC } from '../../../common/constants'; +import { getSpaceAvatarComponent } from '../../space_avatar'; +import { SpaceSolutionBadge } from '../../space_solution_badge'; + +// No need to wrap LazySpaceAvatar in an error boundary, because it is one of the first chunks loaded when opening Kibana. +const LazySpaceAvatar = lazy(() => + getSpaceAvatarComponent().then((component) => ({ default: component })) +); + +const getSelectedTabId = (canUserViewRoles: boolean, selectedTabId?: string) => { + // Validation of the selectedTabId routing parameter, default to the Content tab + return selectedTabId && + [TAB_ID_CONTENT, canUserViewRoles ? TAB_ID_ROLES : null].filter(Boolean).includes(selectedTabId) + ? selectedTabId + : TAB_ID_GENERAL; +}; + +interface PageProps { + spaceId?: string; + history: ScopedHistory; + selectedTabId?: string; + getFeatures: FeaturesPluginStart['getFeatures']; + onLoadSpace: (space: Space) => void; + allowFeatureVisibility: boolean; + allowSolutionVisibility: boolean; +} + +export const EditSpace: FC = ({ + spaceId, + getFeatures, + history, + onLoadSpace, + selectedTabId: _selectedTabId, + ...props +}) => { + const { state, dispatch } = useEditSpaceStore(); + const { invokeClient } = useEditSpaceServices(); + const { spacesManager, capabilities, serverBasePath, logger, notifications } = + useEditSpaceServices(); + const [space, setSpace] = useState(null); + const [userActiveSpace, setUserActiveSpace] = useState(null); + const [features, setFeatures] = useState(null); + const [isLoadingSpace, setIsLoadingSpace] = useState(true); + const [isLoadingFeatures, setIsLoadingFeatures] = useState(true); + const [isLoadingRoles, setIsLoadingRoles] = useState(true); + const selectedTabId = getSelectedTabId(Boolean(capabilities?.roles?.view), _selectedTabId); + const [tabs, selectedTabContent] = useTabs({ + space, + features, + rolesCount: state.roles.size, + capabilities, + history, + currentSelectedTabId: selectedTabId, + ...props, + }); + + useEffect(() => { + if (!spaceId) { + return; + } + + const getSpaceInfo = async () => { + // active space: the space that is active in the user's session + // current space: the space being edited by the user + const [activeSpace, currentSpace] = await Promise.all([ + spacesManager.getActiveSpace(), + spacesManager.getSpace(spaceId), + ]); + + setSpace(currentSpace); + setUserActiveSpace(activeSpace); + setIsLoadingSpace(false); + }; + + getSpaceInfo().catch((error) => + handleApiError(error, { logger, toasts: notifications.toasts }) + ); + }, [spaceId, spacesManager, logger, notifications.toasts]); + + // Load roles to show the count of assigned roles as a badge in the "Assigned roles" tab title + useEffect(() => { + if (!spaceId) { + return; + } + + const getRoles = async () => { + await invokeClient(async (clients) => { + let result: Role[] = []; + try { + result = await clients.spacesManager.getRolesForSpace(spaceId); + } catch (error) { + const message = error?.body?.message ?? error.toString(); + const statusCode = error?.body?.statusCode ?? null; + if (statusCode === 403) { + logger.error('Insufficient permissions to get list of roles for the space'); + logger.error(message); + } else { + logger.error('Encountered error while getting list of roles for space!'); + logger.error(error); + } + dispatch({ type: 'fetch_roles_error', payload: true }); + } + dispatch({ type: 'update_roles', payload: result }); + }); + + setIsLoadingRoles(false); + }; + + if (!state.roles.size && !state.fetchRolesError) { + getRoles(); + } + }, [dispatch, invokeClient, spaceId, state.roles, state.fetchRolesError, logger]); + + useEffect(() => { + const _getFeatures = async () => { + const result = await getFeatures(); + setFeatures(result); + setIsLoadingFeatures(false); + }; + _getFeatures().catch((error) => + handleApiError(error, { logger, toasts: notifications.toasts }) + ); + }, [getFeatures, logger, notifications.toasts]); + + useEffect(() => { + if (space) { + onLoadSpace?.(space); + } + }, [onLoadSpace, space]); + + if (!space) { + return null; + } + + if (isLoadingSpace || isLoadingFeatures || isLoadingRoles) { + return ( + + + + + + ); + } + + const HeaderAvatar = () => { + return ( + }> + + + ); + }; + + const { id, solution: spaceSolution } = space; + const solution = spaceSolution ?? SOLUTION_VIEW_CLASSIC; + const shouldShowSolutionBadge = + props.allowSolutionVisibility || solution !== SOLUTION_VIEW_CLASSIC; + + return ( +
+ + + + + + + + + + + + +

{space.name}

+
+
+ + + {userActiveSpace?.id !== id ? ( + + + + ) : null} + + +
+
+ +
+ {shouldShowSolutionBadge ? ( + + ) : null} + {userActiveSpace?.id === id ? ( + + + + ) : null} +
+
+
+
+
+
+ + +

{space.description}

+
+
+
+ + + + + {tabs.map((tab, index) => ( + + {tab.name} + + ))} + + + {selectedTabContent ?? null} + +
+ ); +}; diff --git a/x-pack/plugins/spaces/public/management/edit_space/edit_space_content_tab.test.tsx b/x-pack/plugins/spaces/public/management/edit_space/edit_space_content_tab.test.tsx new file mode 100644 index 0000000000000..209f65b9a6783 --- /dev/null +++ b/x-pack/plugins/spaces/public/management/edit_space/edit_space_content_tab.test.tsx @@ -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 { render, screen, waitFor } from '@testing-library/react'; +import React from 'react'; + +import { + httpServiceMock, + i18nServiceMock, + loggingSystemMock, + notificationServiceMock, + overlayServiceMock, + themeServiceMock, +} from '@kbn/core/public/mocks'; +import { __IntlProvider as IntlProvider } from '@kbn/i18n-react'; + +import { EditSpaceContentTab } from './edit_space_content_tab'; +import { EditSpaceProvider } from './provider'; +import type { Space } from '../../../common'; +import { spacesManagerMock } from '../../spaces_manager/spaces_manager.mock'; +import type { SpaceContentTypeSummaryItem } from '../../types'; +import { getPrivilegeAPIClientMock } from '../privilege_api_client.mock'; +import { getRolesAPIClientMock } from '../roles_api_client.mock'; + +const getUrlForApp = (appId: string) => appId; +const navigateToUrl = jest.fn(); +const spacesManager = spacesManagerMock.create(); +const getRolesAPIClient = getRolesAPIClientMock; +const getPrivilegeAPIClient = getPrivilegeAPIClientMock; + +const http = httpServiceMock.createStartContract(); +const notifications = notificationServiceMock.createStartContract(); +const overlays = overlayServiceMock.createStartContract(); +const theme = themeServiceMock.createStartContract(); +const i18n = i18nServiceMock.createStartContract(); +const logger = loggingSystemMock.createLogger(); + +const TestComponent: React.FC = ({ children }) => { + return ( + + + {children} + + + ); +}; + +describe('EditSpaceContentTab', () => { + const space: Space = { + id: '1', + name: 'space1', + disabledFeatures: [], + }; + + const getSpaceContentSpy = jest.spyOn(spacesManager, 'getContentForSpace'); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('should render with a loading indicator initially', () => { + render( + + + + ); + + expect(screen.getByTestId('editSpaceContentTabLoadingIndicator')).toBeInTheDocument(); + }); + + it('should render the space content on resolving the saved objects within the space', async () => { + const spaceContentSummary: SpaceContentTypeSummaryItem[] = [ + { + type: 'dashboard', + count: 1, + displayName: 'Dashboard', + }, + ]; + + getSpaceContentSpy.mockResolvedValue({ + summary: spaceContentSummary, + total: spaceContentSummary.length, + }); + + render( + + + + ); + + await waitFor(() => null); + + expect(getSpaceContentSpy).toHaveBeenCalledTimes(1); + expect(getSpaceContentSpy).toHaveBeenCalledWith(space.id); + + expect(screen.queryByTestId('editSpaceContentTabLoadingIndicator')).not.toBeInTheDocument(); + + spaceContentSummary.forEach((item) => { + expect(screen.getByTestId(`space-content-row-${item.type}`)).toBeInTheDocument(); + }); + }); +}); diff --git a/x-pack/plugins/spaces/public/management/edit_space/edit_space_content_tab.tsx b/x-pack/plugins/spaces/public/management/edit_space/edit_space_content_tab.tsx new file mode 100644 index 0000000000000..2c20e61800174 --- /dev/null +++ b/x-pack/plugins/spaces/public/management/edit_space/edit_space_content_tab.tsx @@ -0,0 +1,147 @@ +/* + * 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 { EuiBasicTableColumn, EuiTableFieldDataColumnType } from '@elastic/eui'; +import { + EuiBasicTable, + EuiFlexGroup, + EuiFlexItem, + EuiIcon, + EuiLink, + EuiLoadingSpinner, + EuiText, +} from '@elastic/eui'; +import { capitalize } from 'lodash'; +import type { FC } from 'react'; +import React, { useEffect, useState } from 'react'; + +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n-react'; + +import { handleApiError } from './handle_api_error'; +import { useEditSpaceServices } from './provider'; +import { addSpaceIdToPath, ENTER_SPACE_PATH, type Space } from '../../../common'; +import type { SpaceContentTypeSummaryItem } from '../../types'; + +export const EditSpaceContentTab: FC<{ space: Space }> = ({ space }) => { + const { id: spaceId } = space; + const { spacesManager, serverBasePath, logger, notifications } = useEditSpaceServices(); + const [isLoading, setIsLoading] = useState(true); + const [items, setItems] = useState(null); + + const columns: Array> = [ + { + field: 'type', + name: 'Type', + render: (_value: string, item: SpaceContentTypeSummaryItem) => { + const { icon, displayName } = item; + return ( + + + + + {capitalize(displayName)} + + ); + }, + }, + { + field: 'count', + name: 'Count', + render: (value: string, item: SpaceContentTypeSummaryItem) => { + const uriComponent = encodeURIComponent( + `/app/management/kibana/objects?initialQuery=type:(${item.type})` + ); + const href = addSpaceIdToPath( + serverBasePath, + space.id, + `${ENTER_SPACE_PATH}?next=${uriComponent}` + ); + return {value}; + }, + }, + ]; + + const getRowProps = (item: SpaceContentTypeSummaryItem) => { + const { type } = item; + return { + 'data-test-subj': `space-content-row-${type}`, + onClick: () => {}, + }; + }; + + const getCellProps = ( + item: SpaceContentTypeSummaryItem, + column: EuiTableFieldDataColumnType + ) => { + const { type } = item; + const { field } = column; + return { + 'data-test-subj': `space-content-cell-${type}-${String(field)}`, + textOnly: true, + }; + }; + + useEffect(() => { + const getItems = async () => { + const result = await spacesManager.getContentForSpace(spaceId); + const { summary } = result; + setItems(summary); + setIsLoading(false); + }; + + getItems().catch((error) => { + handleApiError(error, { logger, toasts: notifications.toasts }); + }); + }, [spaceId, spacesManager, logger, notifications.toasts]); + + if (isLoading) { + return ( + + + + + + ); + } + + if (!items) { + return null; + } + + return ( + + + + + + + + + + + ); +}; diff --git a/x-pack/plugins/spaces/public/management/edit_space/edit_space_features_tab.tsx b/x-pack/plugins/spaces/public/management/edit_space/edit_space_features_tab.tsx new file mode 100644 index 0000000000000..f5bfbe79ec2d4 --- /dev/null +++ b/x-pack/plugins/spaces/public/management/edit_space/edit_space_features_tab.tsx @@ -0,0 +1,77 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiFlexGroup, EuiFlexItem, EuiLink, EuiSpacer, EuiText, EuiTitle } from '@elastic/eui'; +import type { FC } from 'react'; +import React from 'react'; + +import type { KibanaFeature } from '@kbn/features-plugin/common'; +import { FormattedMessage } from '@kbn/i18n-react'; + +import { useEditSpaceServices } from './provider'; +import type { Space } from '../../../common'; +import { FeatureTable } from '../components/enabled_features/feature_table'; +import { SectionPanel } from '../components/section_panel'; + +interface Props { + space: Partial; + features: KibanaFeature[]; + onChange: (updatedSpace: Partial) => void; +} + +export const EditSpaceEnabledFeatures: FC = ({ features, space, onChange }) => { + const { capabilities, getUrlForApp } = useEditSpaceServices(); + const canManageRoles = capabilities.roles?.save === true; + + if (!features) { + return null; + } + + return ( + + + + +

+ +

+
+ + +

+ + + + ) : ( + + ), + }} + /> +

+
+
+ + + +
+
+ ); +}; diff --git a/x-pack/plugins/spaces/public/management/edit_space/edit_space_general_tab.test.tsx b/x-pack/plugins/spaces/public/management/edit_space/edit_space_general_tab.test.tsx new file mode 100644 index 0000000000000..433362777f4d2 --- /dev/null +++ b/x-pack/plugins/spaces/public/management/edit_space/edit_space_general_tab.test.tsx @@ -0,0 +1,489 @@ +/* + * 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 { act, fireEvent, render, screen, waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import React from 'react'; + +import { + httpServiceMock, + i18nServiceMock, + loggingSystemMock, + notificationServiceMock, + overlayServiceMock, + scopedHistoryMock, + themeServiceMock, +} from '@kbn/core/public/mocks'; +import { DEFAULT_APP_CATEGORIES } from '@kbn/core-application-common'; +import { KibanaFeature } from '@kbn/features-plugin/common'; +import { __IntlProvider as IntlProvider } from '@kbn/i18n-react'; + +import { EditSpaceSettingsTab } from './edit_space_general_tab'; +import { EditSpaceProvider } from './provider/edit_space_provider'; +import type { SolutionView } from '../../../common'; +import { SOLUTION_VIEW_CLASSIC } from '../../../common/constants'; +import { spacesManagerMock } from '../../spaces_manager/spaces_manager.mock'; +import { getPrivilegeAPIClientMock } from '../privilege_api_client.mock'; +import { getRolesAPIClientMock } from '../roles_api_client.mock'; + +const space = { id: 'default', name: 'Default', disabledFeatures: [], _reserved: true }; +const history = scopedHistoryMock.create(); +const getUrlForApp = (appId: string) => appId; +const navigateToUrl = jest.fn(); +const spacesManager = spacesManagerMock.create(); +const getRolesAPIClient = getRolesAPIClientMock; +const getPrivilegeAPIClient = getPrivilegeAPIClientMock; +const reloadWindow = jest.fn(); + +const http = httpServiceMock.createStartContract(); +const notifications = notificationServiceMock.createStartContract(); +const overlays = overlayServiceMock.createStartContract(); +const theme = themeServiceMock.createStartContract(); +const i18n = i18nServiceMock.createStartContract(); +const logger = loggingSystemMock.createLogger(); + +const navigateSpy = jest.spyOn(history, 'push').mockImplementation(() => {}); +const updateSpaceSpy = jest + .spyOn(spacesManager, 'updateSpace') + .mockImplementation(() => Promise.resolve()); +const deleteSpaceSpy = jest + .spyOn(spacesManager, 'deleteSpace') + .mockImplementation(() => Promise.resolve()); + +describe('EditSpaceSettings', () => { + beforeEach(() => { + navigateSpy.mockReset(); + updateSpaceSpy.mockReset(); + deleteSpaceSpy.mockReset(); + }); + + const TestComponent: React.FC = ({ children }) => { + return ( + + + {children} + + + ); + }; + + it('should render controls for initial state of editing a space', () => { + render( + + + + ); + + expect(screen.getByTestId('addSpaceName')).toBeInTheDocument(); + expect(screen.getByTestId('descriptionSpaceText')).toBeInTheDocument(); + expect(screen.getByTestId('spaceLetterInitial')).toBeInTheDocument(); + expect(screen.getByTestId('euiColorPickerAnchor')).toBeInTheDocument(); + + expect(screen.queryByTestId('solutionViewSelect')).not.toBeInTheDocument(); // hides solution view when not not set to visible + expect(screen.queryByTestId('enabled-features-panel')).not.toBeInTheDocument(); // hides navigation features table when not set to visible + }); + + it('shows solution view select when visible', async () => { + render( + + + + ); + + expect(screen.getByTestId('solutionViewSelect')).toBeInTheDocument(); + expect(screen.queryByTestId('enabled-features-panel')).not.toBeInTheDocument(); // hides navigation features table when not set to visible + }); + + it('shows feature visibility controls when allowed', async () => { + const features = [ + new KibanaFeature({ + id: 'feature-1', + name: 'feature 1', + app: [], + category: DEFAULT_APP_CATEGORIES.kibana, + privileges: null, + }), + ]; + + render( + + + + ); + + expect(screen.getByTestId('enabled-features-panel')).toBeInTheDocument(); + expect(screen.queryByTestId('solutionViewSelect')).not.toBeInTheDocument(); // hides solution view when not not set to visible + }); + + it('allows a space to be updated', async () => { + const spaceToUpdate = { + id: 'existing-space', + name: 'Existing Space', + description: 'hey an existing space', + color: '#aabbcc', + initials: 'AB', + disabledFeatures: [], + solution: 'es' as SolutionView, + }; + + render( + + + + ); + + await act(async () => { + // update the space name + const nameInput = screen.getByTestId('addSpaceName'); + fireEvent.change(nameInput, { target: { value: 'Updated Name Of Space' } }); + + expect(screen.queryByTestId('space-edit-page-user-impact-warning')).not.toBeInTheDocument(); + expect(screen.queryByTestId('confirmModalTitleText')).not.toBeInTheDocument(); + + const updateButton = await screen.findByTestId('save-space-button'); // appears via re-render + await userEvent.click(updateButton); + + expect(updateSpaceSpy).toHaveBeenCalledWith({ + ...spaceToUpdate, + name: 'Updated Name Of Space', + initials: 'UN', + imageUrl: '', + color: '#D6BF57', + }); + }); + + expect(navigateSpy).toHaveBeenCalledTimes(1); + }); + + it('allows space to be deleted', async () => { + const spaceToDelete = { + id: 'delete-me-space', + name: 'Delete Me Space', + description: 'This is a very nice space... for me to DELETE!', + color: '#aabbcc', + initials: 'XX', + disabledFeatures: [], + }; + + render( + + + + ); + + await act(async () => { + const deleteButton = screen.getByTestId('delete-space-button'); + await userEvent.click(deleteButton); + + const confirmButton = await screen.findByTestId('confirmModalConfirmButton'); // click delete confirm + await userEvent.click(confirmButton); + + expect(deleteSpaceSpy).toHaveBeenCalledWith(spaceToDelete); + }); + }); + + it('sets calculated fields for existing spaces', async () => { + // The Spaces plugin provides functions to calculate the initials and color of a space if they have not been customized. The new space + // management page explicitly sets these fields when a new space is created, but it should also handle existing "legacy" spaces that do + // not already have these fields set. + const spaceToUpdate = { + id: 'existing-space', + name: 'Existing Space', + description: 'hey an existing space', + color: undefined, + initials: undefined, + imageUrl: undefined, + disabledFeatures: [], + }; + + render( + + + + ); + + await act(async () => { + // update the space name + const nameInput = screen.getByTestId('addSpaceName'); + fireEvent.change(nameInput, { target: { value: 'Updated Existing Space' } }); + + const updateButton = await screen.findByTestId('save-space-button'); // appears via re-render + await userEvent.click(updateButton); + + expect(updateSpaceSpy).toHaveBeenCalledWith({ + ...spaceToUpdate, + name: 'Updated Existing Space', + color: '#D6BF57', + initials: 'UE', + imageUrl: '', + }); + }); + }); + + it('warns when updating solution view', async () => { + const spaceToUpdate = { + id: 'existing-space', + name: 'Existing Space', + description: 'hey an existing space', + color: '#aabbcc', + initials: 'AB', + disabledFeatures: [], + solution: undefined, + }; + + render( + + + + ); + + // update the space solution view + await act(async () => { + const solutionViewPicker = screen.getByTestId('solutionViewSelect'); + await userEvent.click(solutionViewPicker); + + const esSolutionOption = await screen.findByTestId('solutionViewEsOption'); // appears via re-render + await userEvent.click(esSolutionOption); + + expect(screen.getByTestId('space-edit-page-user-impact-warning')).toBeInTheDocument(); + expect(screen.queryByTestId('confirmModalTitleText')).not.toBeInTheDocument(); + + const updateButton = screen.getByTestId('save-space-button'); + await userEvent.click(updateButton); + + expect(screen.getByTestId('confirmModalTitleText')).toBeInTheDocument(); + + const confirmButton = screen.getByTestId('confirmModalConfirmButton'); + await userEvent.click(confirmButton); + + await waitFor(() => { + expect(updateSpaceSpy).toHaveBeenCalledWith({ + ...spaceToUpdate, + imageUrl: '', + solution: 'es', + }); + }); + }); + + expect(navigateSpy).toHaveBeenCalledTimes(1); + }); + + it('warns when updating features in the active space', async () => { + const features = [ + new KibanaFeature({ + id: 'feature-1', + name: 'feature 1', + app: [], + category: DEFAULT_APP_CATEGORIES.kibana, + privileges: null, + }), + ]; + + const spaceToUpdate = { + id: 'existing-space', + name: 'Existing Space', + description: 'hey an existing space', + color: '#aabbcc', + initials: 'AB', + disabledFeatures: [], + solution: SOLUTION_VIEW_CLASSIC, + }; + + render( + + + + ); + + // update the space visible features + await act(async () => { + const feature1Checkbox = screen.getByTestId('featureCheckbox_feature-1'); + expect(feature1Checkbox).toBeChecked(); + + await userEvent.click(feature1Checkbox); + await waitFor(() => { + expect(feature1Checkbox).not.toBeChecked(); + }); + + expect(screen.getByTestId('space-edit-page-user-impact-warning')).toBeInTheDocument(); + expect(screen.queryByTestId('confirmModalTitleText')).not.toBeInTheDocument(); + + const updateButton = screen.getByTestId('save-space-button'); + await userEvent.click(updateButton); + + expect(screen.getByTestId('confirmModalTitleText')).toBeInTheDocument(); + + const confirmButton = screen.getByTestId('confirmModalConfirmButton'); + await userEvent.click(confirmButton); + + await waitFor(() => { + expect(updateSpaceSpy).toHaveBeenCalledWith({ + ...spaceToUpdate, + imageUrl: '', + disabledFeatures: ['feature-1'], + }); + }); + }); + + expect(navigateSpy).toHaveBeenCalledTimes(1); + }); + + it('empties the disabled features list when the solution view non-classic', async () => { + const features = [ + new KibanaFeature({ + id: 'feature-1', + name: 'feature 1', + app: [], + category: DEFAULT_APP_CATEGORIES.kibana, + privileges: null, + }), + ]; + + const spaceToUpdate = { + id: 'existing-space', + name: 'Existing Space', + description: 'hey an existing space', + color: '#aabbcc', + initials: 'AB', + disabledFeatures: [], + solution: SOLUTION_VIEW_CLASSIC, + }; + + render( + + + + ); + + // customize the space visible features to disable feature-1 + await act(async () => { + const feature1Checkbox = screen.getByTestId('featureCheckbox_feature-1'); + expect(feature1Checkbox).toBeChecked(); + + await userEvent.click(feature1Checkbox); + await waitFor(() => { + expect(feature1Checkbox).not.toBeChecked(); + }); + + expect(screen.getByTestId('space-edit-page-user-impact-warning')).toBeInTheDocument(); + expect(screen.queryByTestId('confirmModalTitleText')).not.toBeInTheDocument(); + }); + + // change the selected solution view to es + await act(async () => { + const solutionViewPicker = screen.getByTestId('solutionViewSelect'); + await userEvent.click(solutionViewPicker); + + const esSolutionOption = await screen.findByTestId('solutionViewEsOption'); // appears via re-render + await userEvent.click(esSolutionOption); + }); + + // perform the save + await act(async () => { + const updateButton = screen.getByTestId('save-space-button'); + await userEvent.click(updateButton); + + expect(screen.getByTestId('confirmModalTitleText')).toBeInTheDocument(); + + const confirmButton = screen.getByTestId('confirmModalConfirmButton'); + await userEvent.click(confirmButton); + + await waitFor(() => { + expect(updateSpaceSpy).toHaveBeenCalledWith({ + ...spaceToUpdate, + imageUrl: '', + solution: 'es', + disabledFeatures: [], // "feature-1" became deselected + }); + }); + }); + + expect(navigateSpy).toHaveBeenCalledTimes(1); + }); +}); diff --git a/x-pack/plugins/spaces/public/management/edit_space/edit_space_general_tab.tsx b/x-pack/plugins/spaces/public/management/edit_space/edit_space_general_tab.tsx new file mode 100644 index 0000000000000..2b7f04e4d9417 --- /dev/null +++ b/x-pack/plugins/spaces/public/management/edit_space/edit_space_general_tab.tsx @@ -0,0 +1,297 @@ +/* + * 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 { EuiCallOut, EuiSpacer } from '@elastic/eui'; +import React, { useCallback, useState } from 'react'; + +import type { ScopedHistory } from '@kbn/core-application-browser'; +import type { KibanaFeature } from '@kbn/features-plugin/common'; +import { i18n } from '@kbn/i18n'; +import { useUnsavedChangesPrompt } from '@kbn/unsaved-changes-prompt'; + +import { EditSpaceEnabledFeatures } from './edit_space_features_tab'; +import { EditSpaceTabFooter } from './footer'; +import { useEditSpaceServices } from './provider'; +import type { Space } from '../../../common'; +import { SOLUTION_VIEW_CLASSIC } from '../../../common/constants'; +import { ConfirmDeleteModal } from '../components'; +import { ConfirmAlterActiveSpaceModal } from '../components/confirm_alter_active_space_modal'; +import { CustomizeSpace } from '../components/customize_space'; +import { SolutionView } from '../components/solution_view'; +import { SpaceValidator } from '../lib'; +import type { CustomizeSpaceFormValues } from '../types'; + +interface Props { + space: Space; + history: ScopedHistory; + features: KibanaFeature[]; + allowFeatureVisibility: boolean; + allowSolutionVisibility: boolean; + reloadWindow: () => void; +} + +export const EditSpaceSettingsTab: React.FC = ({ space, features, history, ...props }) => { + const imageAvatarSelected = Boolean(space.imageUrl); + const [formValues, setFormValues] = useState({ + ...space, + avatarType: imageAvatarSelected ? 'image' : 'initials', + imageUrl: imageAvatarSelected ? space.imageUrl : '', + }); + + const [isDirty, setIsDirty] = useState(false); // track if unsaved changes have been made + const [isLoading, setIsLoading] = useState(false); // track if user has just clicked the Update button + const [showUserImpactWarning, setShowUserImpactWarning] = useState(false); + const [showAlteringActiveSpaceDialog, setShowAlteringActiveSpaceDialog] = useState(false); + const [showConfirmDeleteModal, setShowConfirmDeleteModal] = useState(false); + const { http, overlays, logger, notifications, navigateToUrl, spacesManager } = + useEditSpaceServices(); + + const [solution, setSolution] = useState(space.solution); + + useUnsavedChangesPrompt({ + hasUnsavedChanges: isDirty, + http, + openConfirm: overlays.openConfirm, + navigateToUrl, + history, + titleText: i18n.translate('xpack.spaces.management.spaceDetails.unsavedChangesPromptTitle', { + defaultMessage: 'Leave without saving?', + }), + messageText: i18n.translate( + 'xpack.spaces.management.spaceDetails.unsavedChangesPromptMessage', + { + defaultMessage: "Unsaved changes won't be applied to the space and will be lost.", + } + ), + cancelButtonText: i18n.translate('xpack.spaces.management.spaceDetails.keepEditingButton', { + defaultMessage: 'Save before leaving', + }), + confirmButtonText: i18n.translate('xpack.spaces.management.spaceDetails.leavePageButton', { + defaultMessage: 'Leave', + }), + }); + + const onChangeSpaceSettings = useCallback( + (newFormValues: CustomizeSpaceFormValues) => { + setFormValues({ ...formValues, ...newFormValues }); + setIsDirty(true); + }, + [formValues] + ); + + const onChangeFeatures = useCallback( + (updatedSpace: Partial) => { + setFormValues({ ...formValues, ...updatedSpace }); + setIsDirty(true); + setShowUserImpactWarning(true); + }, + [formValues] + ); + + const onSolutionViewChange = useCallback( + (updatedSpace: Partial) => { + setSolution(updatedSpace.solution); + onChangeFeatures(updatedSpace); + }, + [onChangeFeatures] + ); + + const backToSpacesList = useCallback(() => { + history.push('/'); + }, [history]); + + const onClickCancel = useCallback(() => { + setShowAlteringActiveSpaceDialog(false); + setShowUserImpactWarning(false); + backToSpacesList(); + }, [backToSpacesList]); + + const onClickDeleteSpace = useCallback(() => { + setShowConfirmDeleteModal(true); + }, []); + + const performSave = useCallback( + async ({ requiresReload = false }) => { + const { + avatarType, + customIdentifier, + customAvatarColor, + customAvatarInitials, + ...partialSpace + } = formValues; + + const spaceClone = structuredClone(partialSpace as Partial); + const { id, name } = spaceClone; + + if (!id) { + throw new Error(`Can not update space without id field!`); + } + if (!name) { + throw new Error(`Can not update space without name field!`); + } + + setIsLoading(true); + + let disabledFeatures: string[] | undefined; + if (spaceClone.solution === SOLUTION_VIEW_CLASSIC) { + disabledFeatures = spaceClone.disabledFeatures; + } + + try { + await spacesManager.updateSpace({ + ...spaceClone, + id, + name, + disabledFeatures: disabledFeatures ?? [], + imageUrl: avatarType === 'image' ? spaceClone.imageUrl : '', + }); + + notifications.toasts.addSuccess( + i18n.translate( + 'xpack.spaces.management.spaceDetails.spaceSuccessfullySavedNotificationMessage', + { + defaultMessage: 'Space "{name}" was saved.', + values: { name }, + } + ) + ); + + setIsDirty(false); + backToSpacesList(); + if (requiresReload) { + props.reloadWindow(); + } + } catch (error) { + logger.error('Could not save changes to space!', error); + const message = error?.body?.message ?? error.toString(); + notifications.toasts.addError(error, { + title: i18n.translate('xpack.spaces.management.spaceDetails.errorSavingSpaceTitle', { + defaultMessage: 'Error saving space: {message}', + values: { message }, + }), + }); + } finally { + setIsLoading(false); + } + }, + [backToSpacesList, notifications.toasts, formValues, spacesManager, logger, props] + ); + + const onClickSubmit = useCallback(() => { + if (showUserImpactWarning) { + setShowAlteringActiveSpaceDialog(true); + } else { + performSave({ requiresReload: false }); + } + }, [performSave, showUserImpactWarning]); + + const doShowAlteringActiveSpaceDialog = () => { + return ( + showAlteringActiveSpaceDialog && ( + performSave({ requiresReload: true })} + onCancel={() => { + setShowAlteringActiveSpaceDialog(false); + }} + /> + ) + ); + }; + + const doShowConfirmDeleteSpaceDialog = () => { + return ( + showConfirmDeleteModal && ( + { + setShowConfirmDeleteModal(false); + }} + onSuccess={() => { + setShowConfirmDeleteModal(false); + backToSpacesList(); + }} + /> + ) + ); + }; + + // Show if user has changed disabled features + // Show if user has changed solution view + const doShowUserImpactWarning = () => { + return ( + showUserImpactWarning && ( + <> + + + {i18n.translate( + 'xpack.spaces.management.spaceDetails.spaceChangesWarning.impactAllUsersInSpace', + { + defaultMessage: 'The changes made will impact all users in the space.', + } + )} + + + ) + ); + }; + + const validator = new SpaceValidator(); + + return ( + <> + {doShowAlteringActiveSpaceDialog()} + {doShowConfirmDeleteSpaceDialog()} + + + + {props.allowSolutionVisibility && ( + <> + + + + )} + + {props.allowFeatureVisibility && (solution == null || solution === SOLUTION_VIEW_CLASSIC) && ( + <> + + + + )} + + {doShowUserImpactWarning()} + + + + + ); +}; diff --git a/x-pack/plugins/spaces/public/management/edit_space/edit_space_page.tsx b/x-pack/plugins/spaces/public/management/edit_space/edit_space_page.tsx new file mode 100644 index 0000000000000..882301d36459a --- /dev/null +++ b/x-pack/plugins/spaces/public/management/edit_space/edit_space_page.tsx @@ -0,0 +1,40 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React from 'react'; +import type { ComponentProps, PropsWithChildren } from 'react'; + +import { EditSpace } from './edit_space'; +import { EditSpaceProvider, type EditSpaceProviderProps } from './provider'; + +type EditSpacePageProps = ComponentProps & EditSpaceProviderProps; + +export function EditSpacePage({ + spaceId, + getFeatures, + history, + onLoadSpace, + selectedTabId, + allowFeatureVisibility, + allowSolutionVisibility, + children, + ...editSpaceServicesProps +}: PropsWithChildren) { + return ( + + + + ); +} diff --git a/x-pack/plugins/spaces/public/management/edit_space/edit_space_roles_tab.test.tsx b/x-pack/plugins/spaces/public/management/edit_space/edit_space_roles_tab.test.tsx new file mode 100644 index 0000000000000..ca6d8e1c0767d --- /dev/null +++ b/x-pack/plugins/spaces/public/management/edit_space/edit_space_roles_tab.test.tsx @@ -0,0 +1,119 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { act, render, waitFor } from '@testing-library/react'; +import React from 'react'; + +import { + httpServiceMock, + i18nServiceMock, + loggingSystemMock, + notificationServiceMock, + overlayServiceMock, + themeServiceMock, +} from '@kbn/core/public/mocks'; +import { __IntlProvider as IntlProvider } from '@kbn/i18n-react'; + +import { EditSpaceAssignedRolesTab } from './edit_space_roles_tab'; +import { EditSpaceProvider } from './provider'; +import { spacesManagerMock } from '../../spaces_manager/spaces_manager.mock'; +import { getPrivilegeAPIClientMock } from '../privilege_api_client.mock'; +import { getRolesAPIClientMock } from '../roles_api_client.mock'; + +const getUrlForApp = (appId: string) => appId; +const navigateToUrl = jest.fn(); +const spacesManager = spacesManagerMock.create(); +const getRolesAPIClient = getRolesAPIClientMock; +const getPrivilegeAPIClient = getPrivilegeAPIClientMock; + +const http = httpServiceMock.createStartContract(); +const notifications = notificationServiceMock.createStartContract(); +const overlays = overlayServiceMock.createStartContract(); +const theme = themeServiceMock.createStartContract(); +const i18n = i18nServiceMock.createStartContract(); +const logger = loggingSystemMock.createLogger(); + +const space = { + id: 'space-a', + name: 'Space A', + disabledFeatures: [], + _reserved: false, +}; + +describe('EditSpaceAssignedRolesTab', () => { + const loadRolesSpy = jest.spyOn(spacesManager, 'getRolesForSpace'); + const toastErrorSpy = jest.spyOn(notifications.toasts, 'addError'); + + const TestComponent: React.FC = ({ children }) => { + return ( + + + {children} + + + ); + }; + + beforeEach(() => { + loadRolesSpy.mockReset(); + toastErrorSpy.mockReset(); + }); + + it('loads the assigned roles', async () => { + act(() => { + render( + + + + ); + }); + + await waitFor(() => { + expect(loadRolesSpy).toHaveBeenCalledTimes(1); + }); + }); + + it('shows an error toast if there is an error loading the assigned roles', async () => { + loadRolesSpy.mockImplementation(() => { + throw new Error('test error'); + }); + + act(() => { + render( + + + + ); + }); + + await waitFor(() => { + expect(loadRolesSpy).toHaveBeenCalledTimes(1); + expect(toastErrorSpy).toHaveBeenCalledWith(new Error('test error'), { + title: 'Error: test error', + }); + }); + }); +}); diff --git a/x-pack/plugins/spaces/public/management/edit_space/edit_space_roles_tab.tsx b/x-pack/plugins/spaces/public/management/edit_space/edit_space_roles_tab.tsx new file mode 100644 index 0000000000000..2733790d8de8b --- /dev/null +++ b/x-pack/plugins/spaces/public/management/edit_space/edit_space_roles_tab.tsx @@ -0,0 +1,207 @@ +/* + * 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 { EuiFlexGroup, EuiFlexItem, EuiText } from '@elastic/eui'; +import type { FC } from 'react'; +import React, { useCallback, useEffect } from 'react'; + +import type { KibanaFeature } from '@kbn/features-plugin/common'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { toMountPoint } from '@kbn/react-kibana-mount'; +import type { Role } from '@kbn/security-plugin-types-common'; + +import { handleApiError } from './handle_api_error'; +import { EditSpaceProvider, useEditSpaceServices, useEditSpaceStore } from './provider'; +import { PrivilegesRolesForm } from './roles/component/space_assign_role_privilege_form'; +import { SpaceAssignedRolesTable } from './roles/component/space_assigned_roles_table'; +import type { Space } from '../../../common'; + +interface Props { + space: Space; + features: KibanaFeature[]; + isReadOnly: boolean; +} + +export const EditSpaceAssignedRolesTab: FC = ({ space, features, isReadOnly }) => { + const { dispatch, state } = useEditSpaceStore(); // no loading state because roles have already been loaded + const services = useEditSpaceServices(); + const { + getUrlForApp, + overlays, + theme, + i18n: i18nStart, + logger, + notifications, + invokeClient, + } = services; + + // Roles are already loaded in app state, refresh them when user navigates to this tab + useEffect(() => { + const getRoles = async () => { + await invokeClient(async (clients) => { + let result: Role[] = []; + try { + result = await clients.spacesManager.getRolesForSpace(space.id); + + dispatch({ type: 'update_roles', payload: result }); + } catch (error) { + handleApiError(error, { logger, toasts: notifications.toasts }); + } + }); + }; + + getRoles(); + }, [dispatch, invokeClient, space.id, logger, notifications.toasts]); + + const showRolesPrivilegeEditor = useCallback( + (defaultSelected?: Role[]) => { + const overlayRef = overlays.openFlyout( + toMountPoint( + + { + const { updated, errors } = response; + + if (updated) { + notifications.toasts.addSuccess( + i18n.translate( + 'xpack.spaces.management.spaceDetails.roles.assignmentSuccessMsg', + { + defaultMessage: `Selected roles have been assigned to the "{spaceName}" space`, + values: { spaceName: space.name }, + } + ) + ); + } + + for (const [roleName, error] of Object.entries(errors ?? {})) { + notifications.toasts.addError(new Error(JSON.stringify(error)), { + title: `Error updating ${roleName}`, + }); + } + overlayRef.close(); + }, + closeFlyout: () => overlayRef.close(), + defaultSelected, + storeDispatch: dispatch, + spacesClientsInvocator: invokeClient, + getUrlForApp, + }} + /> + , + { theme, i18n: i18nStart } + ), + { + size: 'm', + maxWidth: true, + maskProps: { headerZindexLocation: 'below' }, + } + ); + }, + [ + overlays, + services, + space, + features, + dispatch, + invokeClient, + getUrlForApp, + theme, + i18nStart, + notifications.toasts, + ] + ); + + const removeRole = useCallback( + async (payload: Role[]) => { + // To remove the role from the space in bulk-edit, we take the payload of roles to edit, loop over + // each role, and modify the kibana.spaces field of each role by stripping them of the space to + // disassociate + const updateDoc = structuredClone(payload).map((roleDef) => { + roleDef.kibana = roleDef.kibana.filter(({ spaces }) => { + let spaceIdIndex: number; + + if (spaces.length && (spaceIdIndex = spaces.indexOf(space.id)) > -1) { + if (spaces.length > 1) { + spaces.splice(spaceIdIndex, 1); + return true; + } else { + return false; + } + } + return true; + }); + + return roleDef; + }); + + await invokeClient((clients) => { + return clients.rolesClient.bulkUpdateRoles({ rolesUpdate: updateDoc }).then((response) => { + const { updated, errors } = response; + + if (updated) { + notifications.toasts.addSuccess( + i18n.translate('xpack.spaces.management.spaceDetails.roles.removalSuccessMsg', { + defaultMessage: + 'Removed {count, plural, one {role} other {{count} roles}} from "{spaceName}" space', + values: { + spaceName: space.name, + count: updateDoc.length, + }, + }) + ); + } + + for (const [roleName, error] of Object.entries(errors ?? {})) { + notifications.toasts.addError(new Error(JSON.stringify(error)), { + title: `Error updating ${roleName}`, + }); + } + }); + }); + + dispatch({ type: 'remove_roles', payload: updateDoc }); + }, + [dispatch, invokeClient, notifications.toasts, space.id, space.name] + ); + + return ( + + + + + + + + + showRolesPrivilegeEditor([rowRecord])} + onClickBulkRemove={async (selectedRoles) => { + await removeRole(selectedRoles); + }} + onClickRowRemoveAction={async (rowRecord) => { + await removeRole([rowRecord]); + }} + onClickAssignNewRole={async () => { + showRolesPrivilegeEditor(); + }} + /> + + + + ); +}; diff --git a/x-pack/plugins/spaces/public/management/edit_space/edit_space_tabs.tsx b/x-pack/plugins/spaces/public/management/edit_space/edit_space_tabs.tsx new file mode 100644 index 0000000000000..48731de7af98c --- /dev/null +++ b/x-pack/plugins/spaces/public/management/edit_space/edit_space_tabs.tsx @@ -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 { EuiNotificationBadge } from '@elastic/eui'; +import React from 'react'; + +import type { Capabilities, ScopedHistory } from '@kbn/core/public'; +import type { KibanaFeature } from '@kbn/features-plugin/common'; +import { i18n } from '@kbn/i18n'; +import { withSuspense } from '@kbn/shared-ux-utility'; + +import { TAB_ID_CONTENT, TAB_ID_GENERAL, TAB_ID_ROLES } from './constants'; +import type { Space } from '../../../common'; + +export interface EditSpaceTab { + id: string; + name: string; + content: JSX.Element; + append?: JSX.Element; + href?: string; +} + +export interface GetTabsProps { + space: Space; + rolesCount: number; + features: KibanaFeature[]; + history: ScopedHistory; + capabilities: Capabilities & { + roles?: { view: boolean; save: boolean }; + }; + allowFeatureVisibility: boolean; + allowSolutionVisibility: boolean; +} + +const SuspenseEditSpaceSettingsTab = withSuspense( + React.lazy(() => + import('./edit_space_general_tab').then(({ EditSpaceSettingsTab }) => ({ + default: EditSpaceSettingsTab, + })) + ) +); + +const SuspenseEditSpaceAssignedRolesTab = withSuspense( + React.lazy(() => + import('./edit_space_roles_tab').then(({ EditSpaceAssignedRolesTab }) => ({ + default: EditSpaceAssignedRolesTab, + })) + ) +); + +const SuspenseEditSpaceContentTab = withSuspense( + React.lazy(() => + import('./edit_space_content_tab').then(({ EditSpaceContentTab }) => ({ + default: EditSpaceContentTab, + })) + ) +); + +export const getTabs = ({ + space, + features, + history, + capabilities, + rolesCount, + ...props +}: GetTabsProps): EditSpaceTab[] => { + const canUserViewRoles = Boolean(capabilities?.roles?.view); + const canUserModifyRoles = Boolean(capabilities?.roles?.save); + const reloadWindow = () => { + window.location.reload(); + }; + + const tabsDefinition: EditSpaceTab[] = [ + { + id: TAB_ID_GENERAL, + name: i18n.translate('xpack.spaces.management.spaceDetails.contentTabs.general.heading', { + defaultMessage: 'General settings', + }), + content: ( + + ), + }, + ]; + + if (canUserViewRoles) { + tabsDefinition.push({ + id: TAB_ID_ROLES, + name: i18n.translate('xpack.spaces.management.spaceDetails.contentTabs.roles.heading', { + defaultMessage: 'Permissions', + }), + append: ( + + {rolesCount} + + ), + content: ( + + ), + }); + } + + tabsDefinition.push({ + id: TAB_ID_CONTENT, + name: i18n.translate('xpack.spaces.management.spaceDetails.contentTabs.content.heading', { + defaultMessage: 'Content', + }), + content: , + }); + + return tabsDefinition; +}; diff --git a/x-pack/plugins/spaces/public/management/edit_space/footer.tsx b/x-pack/plugins/spaces/public/management/edit_space/footer.tsx new file mode 100644 index 0000000000000..013a356f9b400 --- /dev/null +++ b/x-pack/plugins/spaces/public/management/edit_space/footer.tsx @@ -0,0 +1,87 @@ +/* + * 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, + EuiFlexGroup, + EuiFlexItem, + EuiLoadingSpinner, +} from '@elastic/eui'; +import React from 'react'; + +import { FormattedMessage } from '@kbn/i18n-react'; + +interface Props { + isDirty: boolean; + isLoading: boolean; + onClickCancel: () => void; + onClickSubmit: () => void; + onClickDeleteSpace: () => void; +} + +export const EditSpaceTabFooter: React.FC = ({ + isDirty, + isLoading, + onClickCancel, + onClickSubmit, + onClickDeleteSpace, +}) => { + return ( + <> + {isLoading && ( + + + + + + )} + {!isLoading && ( + + + + + + + + + + + + + + + {isDirty && ( + + + + + + )} + + )} + + ); +}; diff --git a/x-pack/plugins/spaces/public/management/edit_space/handle_api_error.ts b/x-pack/plugins/spaces/public/management/edit_space/handle_api_error.ts new file mode 100644 index 0000000000000..2d40a1c34b990 --- /dev/null +++ b/x-pack/plugins/spaces/public/management/edit_space/handle_api_error.ts @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { NotificationsStart } from '@kbn/core-notifications-browser'; +import type { Logger } from '@kbn/logging'; + +interface HandleErrorDeps { + toasts: NotificationsStart['toasts']; + logger: Logger; +} + +export const handleApiError = (error: any, deps: HandleErrorDeps) => { + const { logger, toasts } = deps; + + const message = error?.body?.message ?? error.toString(); + + logger.error(message); + logger.error(error); + + toasts.addError(error, { + title: message, + }); +}; diff --git a/x-pack/plugins/spaces/public/management/edit_space/hooks/use_tabs.ts b/x-pack/plugins/spaces/public/management/edit_space/hooks/use_tabs.ts new file mode 100644 index 0000000000000..fc583e54b0693 --- /dev/null +++ b/x-pack/plugins/spaces/public/management/edit_space/hooks/use_tabs.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 { useMemo } from 'react'; + +import type { ScopedHistory } from '@kbn/core-application-browser'; +import type { KibanaFeature } from '@kbn/features-plugin/public'; + +import type { Space } from '../../../../common'; +import { type EditSpaceTab, getTabs, type GetTabsProps } from '../edit_space_tabs'; + +type UseTabsProps = Pick & { + space: Space | null; + features: KibanaFeature[] | null; + currentSelectedTabId: string; + history: ScopedHistory; + allowFeatureVisibility: boolean; + allowSolutionVisibility: boolean; +}; + +export const useTabs = ({ + space, + features, + currentSelectedTabId, + ...getTabsArgs +}: UseTabsProps): [EditSpaceTab[], JSX.Element | undefined] => { + const [tabs, selectedTabContent] = useMemo(() => { + if (space === null || features === null) { + return [[]]; + } + + const _tabs = space != null ? getTabs({ space, features, ...getTabsArgs }) : []; + return [_tabs, _tabs.find((obj) => obj.id === currentSelectedTabId)?.content]; + }, [space, features, getTabsArgs, currentSelectedTabId]); + + return [tabs, selectedTabContent]; +}; diff --git a/x-pack/plugins/spaces/public/management/edit_space/index.ts b/x-pack/plugins/spaces/public/management/edit_space/index.ts index 78c3b0fc42e04..c85e8f1c2e499 100644 --- a/x-pack/plugins/spaces/public/management/edit_space/index.ts +++ b/x-pack/plugins/spaces/public/management/edit_space/index.ts @@ -5,4 +5,4 @@ * 2.0. */ -export { ManageSpacePage } from './manage_space_page'; +export { EditSpacePage } from './edit_space_page'; diff --git a/x-pack/plugins/spaces/public/management/edit_space/provider/edit_space_provider.test.tsx b/x-pack/plugins/spaces/public/management/edit_space/provider/edit_space_provider.test.tsx new file mode 100644 index 0000000000000..bfd7d7b6059e8 --- /dev/null +++ b/x-pack/plugins/spaces/public/management/edit_space/provider/edit_space_provider.test.tsx @@ -0,0 +1,113 @@ +/* + * 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 type { PropsWithChildren } from 'react'; +import React from 'react'; + +import { + httpServiceMock, + i18nServiceMock, + loggingSystemMock, + notificationServiceMock, + overlayServiceMock, + themeServiceMock, +} from '@kbn/core/public/mocks'; +import type { ApplicationStart } from '@kbn/core-application-browser'; +import { __IntlProvider as IntlProvider } from '@kbn/i18n-react'; + +import { EditSpaceProvider, useEditSpaceServices, useEditSpaceStore } from './edit_space_provider'; +import { spacesManagerMock } from '../../../spaces_manager/spaces_manager.mock'; +import { getPrivilegeAPIClientMock } from '../../privilege_api_client.mock'; +import { getRolesAPIClientMock } from '../../roles_api_client.mock'; + +const http = httpServiceMock.createStartContract(); +const notifications = notificationServiceMock.createStartContract(); +const overlays = overlayServiceMock.createStartContract(); +const theme = themeServiceMock.createStartContract(); +const i18n = i18nServiceMock.createStartContract(); +const logger = loggingSystemMock.createLogger(); + +const spacesManager = spacesManagerMock.create(); + +const SUTProvider = ({ + children, + capabilities = { + navLinks: {}, + management: {}, + catalogue: {}, + spaces: { manage: true }, + }, +}: PropsWithChildren>>) => { + return ( + + _, + getRolesAPIClient: getRolesAPIClientMock, + getPrivilegesAPIClient: getPrivilegeAPIClientMock, + navigateToUrl: jest.fn(), + capabilities, + }} + > + {children} + + + ); +}; + +describe('EditSpaceProvider', () => { + describe('useEditSpaceServices', () => { + it('returns an object of predefined properties', () => { + const { result } = renderHook(useEditSpaceServices, { wrapper: SUTProvider }); + + expect(result.current).toEqual( + expect.objectContaining({ + invokeClient: expect.any(Function), + }) + ); + }); + + it('throws when the hook is used within a tree that does not have the provider', () => { + const { result } = renderHook(useEditSpaceServices); + expect(result.error).toBeDefined(); + expect(result.error?.message).toEqual( + expect.stringMatching('EditSpaceService Context is missing.') + ); + }); + }); + + describe('useEditSpaceStore', () => { + it('returns an object of predefined properties', () => { + const { result } = renderHook(useEditSpaceStore, { wrapper: SUTProvider }); + + expect(result.current).toEqual( + expect.objectContaining({ + state: expect.objectContaining({ roles: expect.any(Map) }), + dispatch: expect.any(Function), + }) + ); + }); + + it('throws when the hook is used within a tree that does not have the provider', () => { + const { result } = renderHook(useEditSpaceStore); + + expect(result.error).toBeDefined(); + expect(result.error?.message).toEqual( + expect.stringMatching('EditSpaceStore Context is missing.') + ); + }); + }); +}); diff --git a/x-pack/plugins/spaces/public/management/edit_space/provider/edit_space_provider.tsx b/x-pack/plugins/spaces/public/management/edit_space/provider/edit_space_provider.tsx new file mode 100644 index 0000000000000..75af2beea2108 --- /dev/null +++ b/x-pack/plugins/spaces/public/management/edit_space/provider/edit_space_provider.tsx @@ -0,0 +1,149 @@ +/* + * 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 { once } from 'lodash'; +import React, { + createContext, + type Dispatch, + type PropsWithChildren, + useCallback, + useContext, + useEffect, + useReducer, + useRef, +} from 'react'; + +import type { ApplicationStart } from '@kbn/core-application-browser'; +import type { CoreStart } from '@kbn/core-lifecycle-browser'; +import type { Logger } from '@kbn/logging'; +import type { + PrivilegesAPIClientPublicContract, + RolesAPIClient, +} from '@kbn/security-plugin-types-public'; + +import { + createSpaceRolesReducer, + type IDispatchAction, + type IEditSpaceStoreState, +} from './reducers'; +import type { SpacesManager } from '../../../spaces_manager'; + +export interface EditSpaceProviderProps + extends Pick { + logger: Logger; + capabilities: ApplicationStart['capabilities']; + getUrlForApp: ApplicationStart['getUrlForApp']; + navigateToUrl: ApplicationStart['navigateToUrl']; + serverBasePath: string; + spacesManager: SpacesManager; + getRolesAPIClient: () => Promise; + getPrivilegesAPIClient: () => Promise; +} + +export interface EditSpaceServices extends EditSpaceProviderProps { + invokeClient(arg: (clients: EditSpaceClients) => Promise): Promise; +} + +interface EditSpaceClients { + spacesManager: SpacesManager; + rolesClient: RolesAPIClient; + privilegesClient: PrivilegesAPIClientPublicContract; +} + +export interface EditSpaceStore { + state: IEditSpaceStoreState; + dispatch: Dispatch; +} + +const createSpaceRolesContext = once(() => createContext(null)); + +const createEditSpaceServicesContext = once(() => createContext(null)); + +export const EditSpaceProvider = ({ + children, + ...services +}: PropsWithChildren) => { + const EditSpaceStoreContext = createSpaceRolesContext(); + const EditSpaceServicesContext = createEditSpaceServicesContext(); + + const clients = useRef( + Promise.all([services.getRolesAPIClient(), services.getPrivilegesAPIClient()]) + ); + const rolesAPIClientRef = useRef(); + const privilegesClientRef = useRef(); + + const initialStoreState = useRef({ + roles: new Map(), + fetchRolesError: false, + }); + + const { logger } = services; + const resolveAPIClients = useCallback(async () => { + try { + [rolesAPIClientRef.current, privilegesClientRef.current] = await clients.current; + } catch (err) { + logger.error('Could not resolve API Clients!', err); + } + }, [logger]); + + useEffect(() => { + resolveAPIClients(); + }, [resolveAPIClients]); + + const createInitialState = useCallback((state: IEditSpaceStoreState) => { + return state; + }, []); + + const [state, dispatch] = useReducer( + createSpaceRolesReducer, + initialStoreState.current, + createInitialState + ); + + const invokeClient: EditSpaceServices['invokeClient'] = useCallback( + async (...args) => { + await resolveAPIClients(); + + return args[0]({ + spacesManager: services.spacesManager, + rolesClient: rolesAPIClientRef.current!, + privilegesClient: privilegesClientRef.current!, + }); + }, + [resolveAPIClients, services.spacesManager] + ); + + return ( + + + {children} + + + ); +}; + +export const useEditSpaceServices = (): EditSpaceServices => { + const context = useContext(createEditSpaceServicesContext()); + if (!context) { + throw new Error( + 'EditSpaceService Context is missing. Ensure the component or React root is wrapped with EditSpaceProvider' + ); + } + + return context; +}; + +export const useEditSpaceStore = () => { + const context = useContext(createSpaceRolesContext()); + if (!context) { + throw new Error( + 'EditSpaceStore Context is missing. Ensure the component or React root is wrapped with EditSpaceProvider' + ); + } + + return context; +}; diff --git a/x-pack/plugins/spaces/public/management/edit_space/provider/index.ts b/x-pack/plugins/spaces/public/management/edit_space/provider/index.ts new file mode 100644 index 0000000000000..7ae7301cd2c60 --- /dev/null +++ b/x-pack/plugins/spaces/public/management/edit_space/provider/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 { EditSpaceProvider, useEditSpaceServices, useEditSpaceStore } from './edit_space_provider'; +export type { + EditSpaceProviderProps, + EditSpaceServices, + EditSpaceStore, +} from './edit_space_provider'; diff --git a/x-pack/plugins/spaces/public/management/edit_space/provider/reducers/index.ts b/x-pack/plugins/spaces/public/management/edit_space/provider/reducers/index.ts new file mode 100644 index 0000000000000..66e66681fc759 --- /dev/null +++ b/x-pack/plugins/spaces/public/management/edit_space/provider/reducers/index.ts @@ -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 { type Reducer } from 'react'; + +import type { Role } from '@kbn/security-plugin-types-common'; + +export type IDispatchAction = + | { + /** @description updates the records of roles for a space */ + type: 'update_roles' | 'remove_roles'; + payload: Role[]; + } + | { + /** @description updates to true if user does not have privilege to view roles */ + type: 'fetch_roles_error'; + payload: boolean; + } + | { + type: 'string'; + payload: unknown; + }; + +export interface IEditSpaceStoreState { + /** roles assigned to current space */ + roles: Map; + /** track if there was an error on the attempt to fetch roles **/ + fetchRolesError: boolean; +} + +export const createSpaceRolesReducer: Reducer = ( + state, + action +) => { + const clonedState = structuredClone(state); + + switch (action.type) { + case 'update_roles': { + if (action.payload) { + action.payload.forEach((role) => { + clonedState.roles.set(role.name, role); + }); + } + + return clonedState; + } + case 'remove_roles': { + action.payload.forEach((role) => { + clonedState.roles.delete(role.name); + }); + + return clonedState; + } + case 'fetch_roles_error': { + clonedState.fetchRolesError = action.payload; + return clonedState; + } + default: { + return clonedState; + } + } +}; diff --git a/x-pack/plugins/spaces/public/management/edit_space/roles/component/space_assign_role_privilege_form.test.tsx b/x-pack/plugins/spaces/public/management/edit_space/roles/component/space_assign_role_privilege_form.test.tsx new file mode 100644 index 0000000000000..9150f0c211adb --- /dev/null +++ b/x-pack/plugins/spaces/public/management/edit_space/roles/component/space_assign_role_privilege_form.test.tsx @@ -0,0 +1,308 @@ +/* + * 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, screen, waitFor } from '@testing-library/react'; +import userEvent from '@testing-library/user-event'; +import crypto from 'crypto'; +import React from 'react'; + +import { + httpServiceMock, + i18nServiceMock, + loggingSystemMock, + notificationServiceMock, + overlayServiceMock, + themeServiceMock, +} from '@kbn/core/public/mocks'; +import { __IntlProvider as IntlProvider } from '@kbn/i18n-react'; +import type { Role } from '@kbn/security-plugin-types-common'; +import { + createRawKibanaPrivileges, + kibanaFeatures, +} from '@kbn/security-role-management-model/src/__fixtures__'; + +import { PrivilegesRolesForm } from './space_assign_role_privilege_form'; +import type { Space } from '../../../../../common'; +import { FEATURE_PRIVILEGES_ALL, FEATURE_PRIVILEGES_READ } from '../../../../../common/constants'; +import { spacesManagerMock } from '../../../../spaces_manager/spaces_manager.mock'; +import { + createPrivilegeAPIClientMock, + getPrivilegeAPIClientMock, +} from '../../../privilege_api_client.mock'; +import { createRolesAPIClientMock, getRolesAPIClientMock } from '../../../roles_api_client.mock'; +import { EditSpaceProvider } from '../../provider'; + +const rolesAPIClient = createRolesAPIClientMock(); +const privilegeAPIClient = createPrivilegeAPIClientMock(); +const http = httpServiceMock.createStartContract(); +const notifications = notificationServiceMock.createStartContract(); +const overlays = overlayServiceMock.createStartContract(); +const theme = themeServiceMock.createStartContract(); +const i18n = i18nServiceMock.createStartContract(); +const logger = loggingSystemMock.createLogger(); +const spacesManager = spacesManagerMock.create(); + +const createRole = (roleName: string, kibana: Role['kibana'] = []): Role => { + return { + name: roleName, + elasticsearch: { cluster: [], run_as: [], indices: [] }, + kibana, + }; +}; + +const space: Space = { + id: crypto.randomUUID(), + name: 'Odyssey', + description: 'Journey vs. Destination', + disabledFeatures: [], +}; + +const spacesClientsInvocatorMock = jest.fn((fn) => + fn({ + rolesClient: rolesAPIClient, + privilegesClient: privilegeAPIClient, + }) +); +const dispatchMock = jest.fn(); +const onSaveCompleted = jest.fn(); +const closeFlyout = jest.fn(); + +const renderPrivilegeRolesForm = ({ + preSelectedRoles, +}: { + preSelectedRoles?: Role[]; +} = {}) => { + return render( + + _), + getRolesAPIClient: getRolesAPIClientMock, + getPrivilegesAPIClient: getPrivilegeAPIClientMock, + navigateToUrl: jest.fn(), + capabilities: { + navLinks: {}, + management: {}, + catalogue: {}, + spaces: { manage: true }, + }, + }} + > + _), + }} + /> + + + ); +}; + +describe('PrivilegesRolesForm', () => { + let getRolesSpy: jest.SpiedFunction['getRoles']>; + let getAllKibanaPrivilegeSpy: jest.SpiedFunction< + ReturnType['getAll'] + >; + + beforeAll(() => { + getRolesSpy = jest.spyOn(rolesAPIClient, 'getRoles'); + getAllKibanaPrivilegeSpy = jest.spyOn(privilegeAPIClient, 'getAll'); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); + + it('does not display the privilege selection buttons or customization form when no role is selected', async () => { + getRolesSpy.mockResolvedValue([]); + getAllKibanaPrivilegeSpy.mockResolvedValue(createRawKibanaPrivileges(kibanaFeatures)); + + renderPrivilegeRolesForm(); + + await waitFor(() => null); + + ['all', 'read', 'custom'].forEach((privilege) => { + expect(screen.queryByTestId(`${privilege}-privilege-button`)).not.toBeInTheDocument(); + }); + + expect( + screen.queryByTestId('space-assign-role-privilege-customization-form') + ).not.toBeInTheDocument(); + }); + + it('renders with the assign roles button disabled when no role is selected', async () => { + getRolesSpy.mockResolvedValue([]); + getAllKibanaPrivilegeSpy.mockResolvedValue(createRawKibanaPrivileges(kibanaFeatures)); + + renderPrivilegeRolesForm(); + + await waitFor(() => null); + + expect(screen.getByTestId('space-assign-role-create-roles-privilege-button')).toBeDisabled(); + }); + + it('preselects the privilege of the selected role when one is provided', async () => { + getRolesSpy.mockResolvedValue([]); + getAllKibanaPrivilegeSpy.mockResolvedValue(createRawKibanaPrivileges(kibanaFeatures)); + + renderPrivilegeRolesForm({ + preSelectedRoles: [ + createRole('test_role_1', [ + { base: [FEATURE_PRIVILEGES_ALL], feature: {}, spaces: [space.id] }, + ]), + ], + }); + + await waitFor(() => null); + + expect(screen.getByTestId(`${FEATURE_PRIVILEGES_ALL}-privilege-button`)).toHaveAttribute( + 'aria-pressed', + String(true) + ); + }); + + it('displays the privilege customization form, when there is a selected role', async () => { + getRolesSpy.mockResolvedValue([]); + getAllKibanaPrivilegeSpy.mockResolvedValue(createRawKibanaPrivileges(kibanaFeatures)); + + const roles: Role[] = [ + createRole('test_role_1', [ + { base: [FEATURE_PRIVILEGES_READ], feature: {}, spaces: [space.id] }, + ]), + ]; + + renderPrivilegeRolesForm({ + preSelectedRoles: roles, + }); + + await waitFor(() => null); + + expect(screen.getByTestId(`${FEATURE_PRIVILEGES_READ}-privilege-button`)).toHaveAttribute( + 'aria-pressed', + String(true) + ); + + expect( + screen.getByTestId('space-assign-role-privilege-customization-form') + ).toBeInTheDocument(); + + expect( + screen.getByTestId('space-update-role-create-roles-privilege-button') + ).not.toBeDisabled(); + }); + + describe('selecting multiple roles', () => { + it('displays a warning message when roles with different privilege levels are selected', async () => { + getRolesSpy.mockResolvedValue([]); + getAllKibanaPrivilegeSpy.mockResolvedValue(createRawKibanaPrivileges(kibanaFeatures)); + + const roles: Role[] = [ + createRole('test_role_1', [ + { base: [FEATURE_PRIVILEGES_ALL], feature: {}, spaces: [space.id] }, + ]), + createRole('test_role_2', [ + { base: [FEATURE_PRIVILEGES_READ], feature: {}, spaces: [space.id] }, + ]), + ]; + + renderPrivilegeRolesForm({ + preSelectedRoles: roles, + }); + + await waitFor(() => null); + + expect(screen.getByTestId('privilege-conflict-callout')).toBeInTheDocument(); + }); + + it('does not display the permission conflict message when roles with the same privilege levels are selected', async () => { + getRolesSpy.mockResolvedValue([]); + getAllKibanaPrivilegeSpy.mockResolvedValue(createRawKibanaPrivileges(kibanaFeatures)); + + const roles: Role[] = [ + createRole('test_role_1', [ + { base: [FEATURE_PRIVILEGES_READ], feature: {}, spaces: [space.id] }, + ]), + createRole('test_role_2', [ + { base: [FEATURE_PRIVILEGES_READ], feature: {}, spaces: [space.id] }, + ]), + ]; + + renderPrivilegeRolesForm({ + preSelectedRoles: roles, + }); + + await waitFor(() => null); + + expect(screen.queryByTestId('privilege-conflict-callout')).not.toBeInTheDocument(); + }); + }); + + describe('applying custom privileges', () => { + it('for a selection of roles pre-assigned to a space, the first encountered privilege with a custom privilege is used as the starting point', async () => { + getRolesSpy.mockResolvedValue([]); + getAllKibanaPrivilegeSpy.mockResolvedValue(createRawKibanaPrivileges(kibanaFeatures)); + + const featureIds: string[] = kibanaFeatures.map((kibanaFeature) => kibanaFeature.id); + + const roles: Role[] = [ + createRole('test_role_1', [ + { base: [FEATURE_PRIVILEGES_ALL], feature: {}, spaces: [space.id] }, + ]), + createRole('test_role_2', [ + { base: [], feature: { [featureIds[0]]: [FEATURE_PRIVILEGES_ALL] }, spaces: [space.id] }, + ]), + createRole('test_role_3', [ + { base: [FEATURE_PRIVILEGES_READ], feature: {}, spaces: [space.id] }, + ]), + createRole('test_role_4', [ + { base: [FEATURE_PRIVILEGES_READ], feature: {}, spaces: [space.id] }, + ]), + // empty base denotes role with custom privilege + createRole('test_role_5', [ + { base: [], feature: { [featureIds[0]]: [FEATURE_PRIVILEGES_READ] }, spaces: [space.id] }, + ]), + ]; + + renderPrivilegeRolesForm({ + preSelectedRoles: roles, + }); + + await waitFor(() => null); + + await userEvent.click(screen.getByTestId('custom-privilege-button')); + + expect( + screen.getByTestId('space-assign-role-privilege-customization-form') + ).toBeInTheDocument(); + + expect(screen.queryByTestId(`${featureIds[0]}_read`)).not.toHaveAttribute( + 'aria-pressed', + String(true) + ); + + expect(screen.getByTestId(`${featureIds[0]}_all`)).toHaveAttribute( + 'aria-pressed', + String(true) + ); + }); + }); +}); diff --git a/x-pack/plugins/spaces/public/management/edit_space/roles/component/space_assign_role_privilege_form.tsx b/x-pack/plugins/spaces/public/management/edit_space/roles/component/space_assign_role_privilege_form.tsx new file mode 100644 index 0000000000000..658730a848a33 --- /dev/null +++ b/x-pack/plugins/spaces/public/management/edit_space/roles/component/space_assign_role_privilege_form.tsx @@ -0,0 +1,610 @@ +/* + * 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, + EuiButtonGroup, + EuiCallOut, + EuiComboBox, + EuiFlexGroup, + EuiFlexItem, + EuiFlyoutBody, + EuiFlyoutFooter, + EuiFlyoutHeader, + EuiForm, + EuiFormRow, + EuiLink, + EuiLoadingSpinner, + EuiSpacer, + EuiText, + EuiTitle, +} from '@elastic/eui'; +import type { EuiComboBoxOptionOption } from '@elastic/eui'; +import type { FC } from 'react'; +import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; + +import type { KibanaFeature, KibanaFeatureConfig } from '@kbn/features-plugin/common'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { type RawKibanaPrivileges } from '@kbn/security-authorization-core'; +import type { Role } from '@kbn/security-plugin-types-common'; +import type { BulkUpdateRoleResponse } from '@kbn/security-plugin-types-public/src/roles/roles_api_client'; +import { KibanaPrivileges } from '@kbn/security-role-management-model'; +import { KibanaPrivilegeTable, PrivilegeFormCalculator } from '@kbn/security-ui-components'; + +import type { Space } from '../../../../../common'; +import { + FEATURE_PRIVILEGES_ALL, + FEATURE_PRIVILEGES_CUSTOM, + FEATURE_PRIVILEGES_READ, +} from '../../../../../common/constants'; +import { type EditSpaceServices, type EditSpaceStore, useEditSpaceServices } from '../../provider'; + +type KibanaRolePrivilege = + | keyof NonNullable + | typeof FEATURE_PRIVILEGES_CUSTOM; + +interface PrivilegesRolesFormProps { + space: Space; + features: KibanaFeature[]; + closeFlyout: () => void; + onSaveCompleted: (response: BulkUpdateRoleResponse) => void; + /** + * @description default roles that should be selected when the form is opened, + * this is useful when the form is opened in edit mode + */ + defaultSelected?: Role[]; + storeDispatch: EditSpaceStore['dispatch']; + spacesClientsInvocator: EditSpaceServices['invokeClient']; + getUrlForApp: EditSpaceServices['getUrlForApp']; +} + +const createRolesComboBoxOptions = (roles: Role[]): Array> => + roles.map((role) => ({ + label: role.name, + value: role, + })); + +export const PrivilegesRolesForm: FC = (props) => { + const { + space, + onSaveCompleted, + closeFlyout, + features, + defaultSelected = [], + spacesClientsInvocator, + storeDispatch, + getUrlForApp, + } = props; + const { logger, notifications } = useEditSpaceServices(); + const [assigningToRole, setAssigningToRole] = useState(false); + const [fetchingDataDeps, setFetchingDataDeps] = useState(false); + const [kibanaPrivileges, setKibanaPrivileges] = useState(null); + const [spaceUnallocatedRoles, setSpaceUnallocatedRole] = useState([]); + const [selectedRoles, setSelectedRoles] = useState>( + createRolesComboBoxOptions(defaultSelected) + ); + const isEditOperation = useRef(Boolean(defaultSelected.length)); + + useEffect(() => { + async function fetchRequiredData(spaceId: string) { + setFetchingDataDeps(true); + + const [systemRoles, _kibanaPrivileges] = await spacesClientsInvocator((clients) => + Promise.all([ + clients.rolesClient.getRoles(), + clients.privilegesClient.getAll({ includeActions: true, respectLicenseLevel: false }), + ]) + ); + + // exclude roles that are already assigned to this space + setSpaceUnallocatedRole( + systemRoles.filter( + (role) => + !role.metadata?._reserved && + (!role.kibana.length || + role.kibana.every((rolePrivileges) => { + return !( + rolePrivileges.spaces.includes(spaceId) || rolePrivileges.spaces.includes('*') + ); + })) + ) + ); + + setKibanaPrivileges(_kibanaPrivileges); + } + + fetchRequiredData(space.id!).finally(() => setFetchingDataDeps(false)); + }, [space.id, spacesClientsInvocator]); + + const selectedRolesCombinedPrivileges = useMemo(() => { + const combinedPrivilege = new Set( + selectedRoles.reduce((result, selectedRole) => { + let match: KibanaRolePrivilege[] = []; + for (let i = 0; i < selectedRole.value!.kibana.length; i++) { + const { spaces, base } = selectedRole.value!.kibana[i]; + if (spaces.includes(space.id!)) { + match = (base.length ? base : [FEATURE_PRIVILEGES_CUSTOM]) as [KibanaRolePrivilege]; + break; + } + } + + return result.concat(match); + }, [] as KibanaRolePrivilege[]) + ); + + return Array.from(combinedPrivilege); + }, [selectedRoles, space.id]); + + const [roleSpacePrivilege, setRoleSpacePrivilege] = useState( + !selectedRoles.length || !selectedRolesCombinedPrivileges.length + ? FEATURE_PRIVILEGES_ALL + : selectedRolesCombinedPrivileges[0] + ); + + const [roleCustomizationAnchor, setRoleCustomizationAnchor] = useState<{ + value: Role; + privilegeIndex: number; + }>(() => { + if (!selectedRoles.length) { + // return a skeleton anchor on init when no roles are selected + return { + value: { + name: 'placeholder', + elasticsearch: { + cluster: [], + run_as: [], + indices: [], + }, + kibana: [ + { + spaces: [space.id], + base: [roleSpacePrivilege === FEATURE_PRIVILEGES_CUSTOM ? '' : roleSpacePrivilege], + feature: {}, + }, + ], + }, + privilegeIndex: 0, + }; + } + + // support instance where the form is opened with roles already preselected + const defaultAnchor = selectedRoles[0]?.value!; + const privilegeIndex = defaultAnchor.kibana.findIndex(({ spaces }) => + spaces.includes(space.id!) + ); + + return { + value: defaultAnchor, + privilegeIndex: (privilegeIndex || -1) >= 0 ? privilegeIndex : 0, + }; + }); + + /** + * @description computes the value anchor role that will be used as the starting point for granular customizations + * on the selected roles. + */ + const computeRoleCustomizationAnchor = useCallback( + (spaceId: string, _selectedRoles: ReturnType) => { + let anchor: typeof roleCustomizationAnchor | null = null; + + for (let i = 0; i < _selectedRoles.length; i++) { + let role; + + if ((role = _selectedRoles[i].value)) { + for (let j = 0; j < _selectedRoles[i].value!.kibana.length; j++) { + let privilegeIterationIndexValue; + + if ((privilegeIterationIndexValue = role.kibana[j])) { + const { spaces, base } = privilegeIterationIndexValue; + /* + * check to see if current role already has a custom privilege, if it does we use that as the starting point for all customizations + * that will happen to all the other selected roles and exit + */ + if (spaces.includes(spaceId) && !base.length) { + anchor = { + value: structuredClone(role), + privilegeIndex: j, + }; + + break; + } + } + } + } + + if (anchor) break; + + // provide a fallback anchor if no suitable anchor was discovered, and we have reached the end of selected roles iteration + if (!anchor && role && i === _selectedRoles.length - 1) { + const fallbackRole = structuredClone(role); + + const spacePrivilegeIndex = fallbackRole.kibana.findIndex(({ spaces }) => + spaces.includes(spaceId) + ); + + anchor = { + value: fallbackRole, + privilegeIndex: + (spacePrivilegeIndex || -1) >= 0 + ? spacePrivilegeIndex + : (fallbackRole?.kibana?.push?.({ + spaces: [spaceId], + base: [], + feature: {}, + }) || 0) - 1, + }; + } + } + + return anchor; + }, + [] + ); + + const onRoleSpacePrivilegeChange = useCallback( + (spacePrivilege: KibanaRolePrivilege) => { + if (spacePrivilege === FEATURE_PRIVILEGES_CUSTOM) { + const _roleCustomizationAnchor = computeRoleCustomizationAnchor(space.id, selectedRoles); + if (_roleCustomizationAnchor) setRoleCustomizationAnchor(_roleCustomizationAnchor); + } else { + // opt for simple updates for customization anchor when privilege is not a custom one, especially that it's used only for visual treatment + setRoleCustomizationAnchor(({ value, privilegeIndex }) => { + value.kibana[privilegeIndex!] = { + spaces: [space.id], + base: [spacePrivilege], + feature: {}, + }; + + return { value, privilegeIndex }; + }); + } + + // persist selected privilege for UI + setRoleSpacePrivilege(spacePrivilege); + }, + [computeRoleCustomizationAnchor, selectedRoles, space.id] + ); + + const assignRolesToSpace = useCallback(async () => { + try { + setAssigningToRole(true); + + const newPrivileges = { + base: roleSpacePrivilege === FEATURE_PRIVILEGES_CUSTOM ? [] : [roleSpacePrivilege], + feature: + roleSpacePrivilege === FEATURE_PRIVILEGES_CUSTOM + ? roleCustomizationAnchor.value?.kibana[roleCustomizationAnchor.privilegeIndex!] + .feature! + : {}, + }; + + const updatedRoles = structuredClone(selectedRoles).map((selectedRole) => { + let found = false; + + for (let i = 0; i < selectedRole.value!.kibana.length; i++) { + const { spaces } = selectedRole.value!.kibana[i]; + + if (spaces.includes(space.id!)) { + if (spaces.length > 1) { + // account for instance where current space belongs to a collection of other spaces that share the same privileges that are grouped together, + // since we intend to apply the new privilege exclusively to the current space + // we remove the space from the shared privilege. + spaces.splice(i, 1); + } else { + Object.assign(selectedRole.value!.kibana[i], newPrivileges); + found = true; + } + + break; + } + } + + if (!found) { + selectedRole.value?.kibana.push(Object.assign({ spaces: [space.id] }, newPrivileges)); + } + + return selectedRole.value!; + }); + + await spacesClientsInvocator((clients) => + clients.rolesClient.bulkUpdateRoles({ rolesUpdate: updatedRoles }).then((response) => { + setAssigningToRole(false); + onSaveCompleted(response); + }) + ); + + storeDispatch({ + type: 'update_roles', + payload: updatedRoles, + }); + } catch (error) { + logger.error('Could not assign role to space!', error); + const message = error?.body?.message ?? error.toString(); + + notifications.toasts.addError(error, { + title: i18n.translate('xpack.spaces.management.spaceDetails.errorAssigningRoleTitle', { + defaultMessage: 'Error assigning role to space: {message}', + values: { message }, + }), + }); + } + }, [ + selectedRoles, + spacesClientsInvocator, + storeDispatch, + onSaveCompleted, + space.id, + roleSpacePrivilege, + roleCustomizationAnchor, + logger, + notifications.toasts, + ]); + + const getForm = () => { + return ( + + + {!isEditOperation.current && ( + + {i18n.translate( + 'xpack.spaces.management.spaceDetails.roles.selectRolesFormRowLabelAnchor', + { defaultMessage: 'Manage roles' } + )} + + } + helpText={i18n.translate( + 'xpack.spaces.management.spaceDetails.roles.selectRolesHelp', + { + defaultMessage: 'Select Kibana spaces to which you wish to assign privileges.', + } + )} + > + setSelectedRoles(value)} + fullWidth + /> + + )} + + + {Boolean(selectedRoles.length) && ( + + + {selectedRolesCombinedPrivileges.length > 1 ? ( + + {i18n.translate( + 'xpack.spaces.management.spaceDetails.roles.assign.privilegeConflictMsg.description', + { + defaultMessage: + 'Updating the settings here in a bulk will override current individual settings.', + } + )} + + ) : ( + + )} + + + ({ + ...privilege, + 'data-test-subj': `${privilege.id}-privilege-button`, + }))} + color="primary" + idSelected={roleSpacePrivilege} + onChange={(id) => onRoleSpacePrivilegeChange(id as KibanaRolePrivilege)} + isFullWidth + /> + + {Boolean(selectedRoles.length) && ( + + + {!kibanaPrivileges ? ( + + ) : ( + { + // apply selected changes only to the designated customization anchor, this way we delay reconciling the intending privileges + // to all of the selected roles till we decide to commit the changes chosen + setRoleCustomizationAnchor(({ value, privilegeIndex }) => { + let privilege; + + if ((privilege = value!.kibana?.[privilegeIndex!])) { + privilege.feature[featureId] = selectedPrivileges; + } + + return { value, privilegeIndex }; + }); + }} + onChangeAll={(_privilege) => { + // apply selected changes only to the designated customization anchor, this way we delay reconciling the intending privileges + // to all of the selected roles till we decide to commit the changes chosen + setRoleCustomizationAnchor(({ value, privilegeIndex }) => { + let privilege; + + if ((privilege = value!.kibana?.[privilegeIndex!])) { + privilege.base = _privilege; + } + + return { value, privilegeIndex }; + }); + }} + kibanaPrivileges={new KibanaPrivileges(kibanaPrivileges, features)} + privilegeCalculator={ + new PrivilegeFormCalculator( + new KibanaPrivileges(kibanaPrivileges, features), + roleCustomizationAnchor.value! + ) + } + allSpacesSelected={false} + canCustomizeSubFeaturePrivileges={false} + /> + )} + + + )} + + )} + + + ); + }; + + const getSaveButton = useCallback(() => { + return ( + assignRolesToSpace()} + data-test-subj={`space-${ + isEditOperation.current ? 'update' : 'assign' + }-role-create-roles-privilege-button`} + > + {isEditOperation.current + ? i18n.translate('xpack.spaces.management.spaceDetails.roles.updateRoleButton', { + defaultMessage: 'Update', + }) + : i18n.translate('xpack.spaces.management.spaceDetails.roles.assignRoleButton', { + defaultMessage: 'Assign', + })} + + ); + }, [assignRolesToSpace, assigningToRole, selectedRoles.length]); + + return ( + + + +

+ {isEditOperation.current + ? i18n.translate('xpack.spaces.management.spaceDetails.roles.assignRoleButton', { + defaultMessage: 'Edit role privileges', + }) + : i18n.translate( + 'xpack.spaces.management.spaceDetails.roles.assign.privileges.custom', + { + defaultMessage: 'Assign roles to space', + } + )} +

+
+ + +

+ +

+
+
+ {getForm()} + + + + + {i18n.translate('xpack.spaces.management.spaceDetails.roles.cancelRoleButton', { + defaultMessage: 'Cancel', + })} + + + {getSaveButton()} + + +
+ ); +}; diff --git a/x-pack/plugins/spaces/public/management/edit_space/roles/component/space_assigned_roles_table.test.tsx b/x-pack/plugins/spaces/public/management/edit_space/roles/component/space_assigned_roles_table.test.tsx new file mode 100644 index 0000000000000..f909dba415c41 --- /dev/null +++ b/x-pack/plugins/spaces/public/management/edit_space/roles/component/space_assigned_roles_table.test.tsx @@ -0,0 +1,146 @@ +/* + * 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, screen, within } from '@testing-library/react'; +import React, { type ComponentProps } from 'react'; + +import { __IntlProvider as IntlProvider } from '@kbn/i18n-react'; +import type { Role } from '@kbn/security-plugin-types-common'; + +import { SpaceAssignedRolesTable } from './space_assigned_roles_table'; + +const defaultProps: Pick< + ComponentProps, + | 'onClickAssignNewRole' + | 'onClickBulkRemove' + | 'onClickRowEditAction' + | 'onClickRowRemoveAction' + | 'currentSpace' +> = { + currentSpace: { + id: 'odyssey', + name: 'Odyssey', + disabledFeatures: [], + }, + onClickBulkRemove: jest.fn(), + onClickRowEditAction: jest.fn(), + onClickAssignNewRole: jest.fn(), + onClickRowRemoveAction: jest.fn(), +}; + +const renderTestComponent = ( + props: Pick< + ComponentProps, + 'assignedRoles' | 'isReadOnly' | 'supportsBulkAction' + > +) => { + render( + + + + ); +}; + +describe('SpaceAssignedRolesTable', () => { + const spaceAssignedRoles = new Map( + [ + { + name: 'Odyssey', + description: 'Journey vs. Destination', + elasticsearch: { cluster: [], run_as: [], indices: [] }, + kibana: [ + { + spaces: [defaultProps.currentSpace.id], + base: ['all'], + feature: {}, + }, + ], + }, + { + name: 'Iliad', + description: '???', + elasticsearch: { cluster: [], run_as: [], indices: [] }, + kibana: [ + { + spaces: [defaultProps.currentSpace.id], + base: ['read'], + feature: {}, + }, + ], + }, + { + name: 'Trisolaris', + description: 'Dark Forest???', + elasticsearch: { cluster: [], run_as: [], indices: [] }, + kibana: [ + { + spaces: ['*'], + base: ['read'], + feature: {}, + }, + ], + metadata: { + _reserved: true, + }, + }, + ].map((role) => [role.name.toLocaleLowerCase(), role]) + ); + + it('renders the table', () => { + renderTestComponent({ + assignedRoles: spaceAssignedRoles, + }); + + expect(screen.getByTestId('spaceAssignedRolesTable')).toBeInTheDocument(); + }); + + it('does not render row selection and bulk actions context menu by default', () => { + renderTestComponent({ + assignedRoles: spaceAssignedRoles, + supportsBulkAction: false, + }); + + expect(screen.getByTestId('spaceAssignedRolesTable')).toBeInTheDocument(); + expect(screen.queryByTestId('bulkActionsContextMenuOpener')).toBeNull(); + expect(screen.queryByTestId('checkboxSelectAll')).toBeNull(); + }); + + it('renders with row selection and bulk actions context menu when bulk action are supported and table is not in readOnly mode', () => { + renderTestComponent({ + assignedRoles: spaceAssignedRoles, + supportsBulkAction: true, + }); + + expect(screen.getByTestId('spaceAssignedRolesTable')).toBeInTheDocument(); + expect(screen.getByTestId('bulkActionsContextMenuOpener')).toBeInTheDocument(); + expect(screen.getByTestId('checkboxSelectAll')).toBeInTheDocument(); + }); + + // it('will not render the bulk actions context menu when the table is in readOnly mode', () => {}) + + it('prevents modification of reserved roles', () => { + renderTestComponent({ + assignedRoles: spaceAssignedRoles, + supportsBulkAction: true, + }); + + expect(screen.getByTestId('spaceAssignedRolesTable')).toBeInTheDocument(); + + const trisolarisRow = screen.getByTestId('space-role-row-Trisolaris'); + + expect(trisolarisRow).toBeInTheDocument(); + + // We expect a length of 2 because EUI also adds a second node for screen readers + expect(within(trisolarisRow).getAllByText('Reserved')).toHaveLength(2); + expect(within(trisolarisRow).getByTestId('spaceRoleCellActionLocked')).toBeInTheDocument(); + expect(within(trisolarisRow).getByTestId('spaceRoleCellActionLocked')).toBeDisabled(); + expect( + within(trisolarisRow).queryByTestId('spaceRoleCellDeleteAction') + ).not.toBeInTheDocument(); + expect(within(trisolarisRow).queryByTestId('spaceRoleCellEditAction')).not.toBeInTheDocument(); + }); +}); diff --git a/x-pack/plugins/spaces/public/management/edit_space/roles/component/space_assigned_roles_table.tsx b/x-pack/plugins/spaces/public/management/edit_space/roles/component/space_assigned_roles_table.tsx new file mode 100644 index 0000000000000..6a1d9f24bc042 --- /dev/null +++ b/x-pack/plugins/spaces/public/management/edit_space/roles/component/space_assigned_roles_table.tsx @@ -0,0 +1,509 @@ +/* + * 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, + EuiButtonEmpty, + EuiContextMenu, + EuiFlexGroup, + EuiFlexItem, + EuiHorizontalRule, + EuiIcon, + EuiInMemoryTable, + EuiPopover, + EuiText, + EuiTextColor, +} from '@elastic/eui'; +import type { + CriteriaWithPagination, + EuiBasicTableColumn, + EuiInMemoryTableProps, + EuiSearchBarProps, + EuiTableFieldDataColumnType, + EuiTableSelectionType, +} from '@elastic/eui'; +import React, { useCallback, useEffect, useMemo, useState } from 'react'; + +import { i18n } from '@kbn/i18n'; +import type { Role } from '@kbn/security-plugin-types-common'; + +import type { Space } from '../../../../../common'; +import { sortRolesForListing } from '../../../lib'; + +interface ISpaceAssignedRolesTableProps { + isReadOnly?: boolean; + currentSpace: Space; + assignedRoles: Map; + onClickAssignNewRole: () => Promise; + onClickRowEditAction: (role: Role) => void; + onClickRowRemoveAction: (role: Role) => void; + supportsBulkAction?: boolean; + onClickBulkRemove?: (selectedRoles: Role[]) => void; +} + +const isRoleReserved = (role: Role) => { + return role.metadata?._reserved; +}; +const isRoleAssignedToAll = (role: Role) => { + return role.kibana.reduce((acc, cur) => { + return cur.spaces.includes('*') || acc; + }, false); +}; + +/** + * @description checks if the passed role qualifies as one that can + * be edited by a user with sufficient permissions + */ +export const isEditableRole = (role: Role) => { + return !(isRoleReserved(role) || isRoleAssignedToAll(role)); +}; + +const getTableColumns = ({ + isReadOnly, + currentSpace, + onClickRowEditAction, + onClickRowRemoveAction, +}: Pick< + ISpaceAssignedRolesTableProps, + 'isReadOnly' | 'onClickRowEditAction' | 'onClickRowRemoveAction' | 'currentSpace' +>) => { + const columns: Array> = [ + { + field: 'name', + name: i18n.translate('xpack.spaces.management.spaceDetails.rolesTable.column.name.title', { + defaultMessage: 'Role', + }), + }, + { + field: 'privileges', + name: i18n.translate( + 'xpack.spaces.management.spaceDetails.rolesTable.column.privileges.title', + { defaultMessage: 'Privileges' } + ), + render: (_, record) => { + const uniquePrivilege = new Set( + record.kibana.reduce((privilegeBaseTuple, kibanaPrivilege) => { + if ( + kibanaPrivilege.spaces.includes(currentSpace.id) || + kibanaPrivilege.spaces.includes('*') + ) { + if (!kibanaPrivilege.base.length) { + privilegeBaseTuple.push( + i18n.translate( + 'xpack.spaces.management.spaceDetails.rolesTable.column.privileges.customPrivilege', + { defaultMessage: 'custom' } + ) + ); + } else { + return privilegeBaseTuple.concat(kibanaPrivilege.base); + } + } + + return privilegeBaseTuple; + }, [] as string[]) + ); + + return Array.from(uniquePrivilege).join(','); + }, + }, + { + field: 'metadata', + name: i18n.translate( + 'xpack.spaces.management.spaceDetails.rolesTable.column.roleType.title', + { defaultMessage: 'Role type' } + ), + render: (_value: Role['metadata']) => { + return React.createElement(EuiBadge, { + children: _value?._reserved + ? i18n.translate( + 'xpack.spaces.management.spaceDetails.rolesTable.column.roleType.reserved', + { defaultMessage: 'Reserved' } + ) + : i18n.translate( + 'xpack.spaces.management.spaceDetails.rolesTable.column.roleType.custom', + { defaultMessage: 'Custom' } + ), + color: _value?._reserved ? undefined : 'success', + }); + }, + }, + ]; + + if (!isReadOnly) { + columns.push({ + name: 'Actions', + actions: [ + { + type: 'icon', + icon: 'lock', + href: '#', + target: '_self', + 'data-test-subj': 'spaceRoleCellActionLocked', + name: (role) => + isRoleReserved(role) + ? i18n.translate( + 'xpack.spaces.management.spaceDetails.rolesTable.column.actions.notEditableTitle.isReserved', + { defaultMessage: 'Reserved' } + ) + : i18n.translate( + 'xpack.spaces.management.spaceDetails.rolesTable.column.actions.notEditableTitle.isAssignedToAll', + { defaultMessage: 'Assigned to all spaces' } + ), + description: (role) => + isRoleReserved(role) + ? i18n.translate( + 'xpack.spaces.management.spaceDetails.rolesTable.column.actions.notEditableDescription.isReserved', + { defaultMessage: `You can’t edit the access of reserved roles to this space.` } + ) + : i18n.translate( + 'xpack.spaces.management.spaceDetails.rolesTable.column.actions.notEditableDescription.isAssignedToAll', + { + defaultMessage: `Can't perform actions on a role that is assigned to all spaces`, + } + ), + isPrimary: true, + enabled: () => false, + available: (rowRecord) => !isEditableRole(rowRecord), + }, + { + type: 'icon', + icon: 'pencil', + 'data-test-subj': 'spaceRoleCellEditAction', + name: i18n.translate( + 'xpack.spaces.management.spaceDetails.rolesTable.column.actions.edit.title', + { defaultMessage: 'Remove from space' } + ), + isPrimary: true, + description: i18n.translate( + 'xpack.spaces.management.spaceDetails.rolesTable.column.actions.edit.description', + { + defaultMessage: + 'Click this action to edit the role privileges of this user for this space.', + } + ), + showOnHover: true, + available: (rowRecord) => isEditableRole(rowRecord), + onClick: onClickRowEditAction, + }, + { + isPrimary: true, + type: 'icon', + icon: 'trash', + color: 'danger', + 'data-test-subj': 'spaceRoleCellDeleteAction', + name: i18n.translate( + 'xpack.spaces.management.spaceDetails.rolesTable.column.actions.remove.title', + { defaultMessage: 'Remove from space' } + ), + description: i18n.translate( + 'xpack.spaces.management.spaceDetails.rolesTable.column.actions.edit.description', + { defaultMessage: 'Click this action to remove the user from this space.' } + ), + showOnHover: true, + available: (rowRecord) => isEditableRole(rowRecord), + onClick: onClickRowRemoveAction, + }, + ], + }); + } + + return columns; +}; + +const getRowProps = (item: Role) => { + const { name } = item; + return { + 'data-test-subj': `space-role-row-${name}`, + onClick: () => {}, + }; +}; + +const getCellProps = (item: Role, column: EuiTableFieldDataColumnType) => { + const { name } = item; + const { field } = column; + return { + 'data-test-subj': `space-role-cell-${name}-${String(field)}`, + textOnly: true, + }; +}; + +export const SpaceAssignedRolesTable = ({ + assignedRoles, + currentSpace, + onClickAssignNewRole, + onClickBulkRemove, + onClickRowEditAction, + onClickRowRemoveAction, + isReadOnly = false, + supportsBulkAction = false, +}: ISpaceAssignedRolesTableProps) => { + const tableColumns = useMemo( + () => + getTableColumns({ isReadOnly, onClickRowEditAction, onClickRowRemoveAction, currentSpace }), + [currentSpace, isReadOnly, onClickRowEditAction, onClickRowRemoveAction] + ); + const [rolesInView, setRolesInView] = useState([]); + const [selectedRoles, setSelectedRoles] = useState([]); + const [isBulkActionContextOpen, setBulkActionContextOpen] = useState(false); + const [pagination, setPagination] = useState['page']>({ + index: 0, + size: 10, + }); + + useEffect(() => { + const valuesFromMap = Array.from(assignedRoles.values()); + const sortedRoles = valuesFromMap.sort(sortRolesForListing); + setRolesInView(sortedRoles); + }, [assignedRoles]); + + const onSearchQueryChange = useCallback>>( + ({ query }) => { + const _assignedRolesTransformed = Array.from(assignedRoles.values()); + + if (query?.text) { + setRolesInView( + _assignedRolesTransformed.filter((role) => role.name.includes(query.text.toLowerCase())) + ); + } else { + setRolesInView(_assignedRolesTransformed); + } + }, + [assignedRoles] + ); + + const searchElementDefinition = useMemo(() => { + return { + box: { + fullWidth: false, + incremental: true, + 'data-test-subj': 'spaceAssignedRolesSearchBox', + placeholder: i18n.translate( + 'xpack.spaces.management.spaceDetails.roles.searchField.placeholder', + { defaultMessage: 'Filter assigned roles...' } + ), + }, + onChange: onSearchQueryChange, + toolsRight: ( + <> + {!isReadOnly && ( + + + {i18n.translate('xpack.spaces.management.spaceDetails.roles.assign', { + defaultMessage: 'Assign new roles', + })} + + + )} + + ), + }; + }, [isReadOnly, onClickAssignNewRole, onSearchQueryChange]); + + const tableHeader = useMemo['childrenBetween']>(() => { + if (!supportsBulkAction) { + return null; + } + + const pageSize = pagination.size; + const pageIndex = pagination.index; + + const selectableRoles = rolesInView.filter((role) => isEditableRole(role) && !isReadOnly); + + return ( + + + + + + + + {i18n.translate( + 'xpack.spaces.management.spaceDetails.rolesTable.selectedStatusInfo', + { + defaultMessage: + 'Showing: {pageItemLength} of {rolesInViewCount} | Selected: {selectedCount, plural, one {one role} other {{selectedCount} roles}}', + values: { + pageItemLength: Math.floor( + rolesInView.length / (pageSize * (pageIndex + 1)) + ) + ? pageSize * (pageIndex + 1) + : rolesInView.length % pageSize, + rolesInViewCount: rolesInView.length, + selectedCount: selectedRoles.length, + }, + } + )} + + + + + + {!isReadOnly && ( + + + + {i18n.translate( + 'xpack.spaces.management.spaceDetails.rolesTable.bulkActions.contextMenuOpener', + { defaultMessage: 'Bulk actions' } + )} + + } + > + , + name: ( + + {i18n.translate( + 'xpack.spaces.management.spaceDetails.rolesTable.bulkActions.remove', + { defaultMessage: 'Remove from space' } + )} + + ), + onClick: async () => { + onClickBulkRemove?.(selectedRoles); + setBulkActionContextOpen(false); + }, + }, + ], + }, + ]} + /> + + + + {Boolean(selectableRoles.length) && + React.createElement(EuiButtonEmpty, { + size: 's', + ...(Boolean(selectedRoles.length) + ? { + iconType: 'crossInCircle', + onClick: setSelectedRoles.bind(null, []), + children: i18n.translate( + 'xpack.spaces.management.spaceDetails.rolesTable.clearRolesSelection', + { defaultMessage: 'Clear selection' } + ), + } + : { + iconType: 'pagesSelect', + onClick: setSelectedRoles.bind(null, selectableRoles), + children: i18n.translate( + 'xpack.spaces.management.spaceDetails.rolesTable.selectAllRoles', + { + defaultMessage: + 'Select {count, plural, one {role} other {all {count} roles}}', + values: { count: selectableRoles.length }, + } + ), + }), + })} + + + )} + + + + + + + + ); + }, [ + pagination.size, + pagination.index, + rolesInView, + selectedRoles, + isReadOnly, + supportsBulkAction, + isBulkActionContextOpen, + onClickBulkRemove, + ]); + + const onTableChange = ({ page }: CriteriaWithPagination) => { + setPagination(page); + }; + + const onSelectionChange = (selection: Role[]) => { + setSelectedRoles(selection); + }; + + const selection: EuiTableSelectionType | undefined = useMemo(() => { + if (!supportsBulkAction) { + return void 0; + } + + return { + selected: selectedRoles, + selectable: (role) => isEditableRole(role), + selectableMessage: (_selectable, role) => { + if (isRoleReserved(role)) { + return i18n.translate( + 'xpack.spaces.management.spaceDetails.rolesTable.selectableMessage.isReserved', + { defaultMessage: `You can't select a role that is reserved` } + ); + } + if (isRoleAssignedToAll(role)) { + return i18n.translate( + 'xpack.spaces.management.spaceDetails.rolesTable.selectableMessage.isRoleAssignedToAll', + { defaultMessage: `You can't select a role that is assigned to all spaces` } + ); + } + + return i18n.translate( + 'xpack.spaces.management.spaceDetails.rolesTable.selectableMessage.selectRole', + { defaultMessage: `Select {roleName}`, values: { roleName: role.name } } + ); + }, + onSelectionChange, + }; + }, [selectedRoles, supportsBulkAction]); + + return ( + + + + data-test-subj="spaceAssignedRolesTable" + search={searchElementDefinition} + childrenBetween={tableHeader} + itemId="name" + columns={tableColumns} + items={rolesInView} + rowProps={getRowProps} + cellProps={getCellProps} + selection={selection} + pagination={{ + pageSize: pagination.size, + pageIndex: pagination.index, + pageSizeOptions: [50, 25, 10], + }} + onChange={onTableChange} + /> + + + ); +}; diff --git a/x-pack/plugins/spaces/public/management/lib/index.ts b/x-pack/plugins/spaces/public/management/lib/index.ts index cbeb9036ec4ed..0507a79cb76a5 100644 --- a/x-pack/plugins/spaces/public/management/lib/index.ts +++ b/x-pack/plugins/spaces/public/management/lib/index.ts @@ -8,3 +8,5 @@ export { toSpaceIdentifier, isValidSpaceIdentifier } from './space_identifier_utils'; export { SpaceValidator } from './validate_space'; + +export { sortRolesForListing } from './sort_roles'; diff --git a/x-pack/plugins/spaces/public/management/lib/sort_roles.test.ts b/x-pack/plugins/spaces/public/management/lib/sort_roles.test.ts new file mode 100644 index 0000000000000..bba4e1e7430c9 --- /dev/null +++ b/x-pack/plugins/spaces/public/management/lib/sort_roles.test.ts @@ -0,0 +1,171 @@ +/* + * 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 { Role } from '@kbn/security-plugin-types-common'; + +import { sortRolesForListing } from './sort_roles'; + +const createCustom = (name: string): Role => { + return { + name, + metadata: { _reserved: false }, + } as unknown as Role; +}; + +const createReserved = (name: string): Role => { + return { + name, + metadata: { _reserved: true }, + } as unknown as Role; +}; + +const expected = [ + 'Apple', + 'Banana', + 'Cherry', + 'Date', + 'Elderberry', + 'Fig', + 'Grape', + 'Honeydew melon', + 'Indian fig', + 'Jackfruit', + 'Kiwi', + 'Lemon', + 'Mango', + 'Nectarine', + 'Orange', + 'Papaya', + 'Quince', + 'Raspberry', + 'Strawberry', + 'Tangerine', + 'Artichoke', + 'Broccoli', + 'Carrot', + 'Daikon', + 'Eggplant', + 'Fennel', + 'Garlic', + 'Horseradish', + 'Iceberg lettuce', + 'Jalapeño', + 'Kale', + 'Leek', + 'Mushroom', + 'Napa cabbage', + 'Okra', + 'Parsnip', + 'Quinoa greens', + 'Radish', + 'Spinach', + 'Turnip', +]; + +describe('sortRolesForListing: sorts the roles correctly', () => { + it('when they are originally sorted alphabetically', () => { + const roles = [ + createCustom('Apple'), + createReserved('Artichoke'), + createCustom('Banana'), + createReserved('Broccoli'), + createReserved('Carrot'), + createCustom('Cherry'), + createReserved('Daikon'), + createCustom('Date'), + createReserved('Eggplant'), + createCustom('Elderberry'), + createReserved('Fennel'), + createCustom('Fig'), + createReserved('Garlic'), + createCustom('Grape'), + createCustom('Honeydew melon'), + createReserved('Horseradish'), + createReserved('Iceberg lettuce'), + createCustom('Indian fig'), + createCustom('Jackfruit'), + createReserved('Jalapeño'), + createReserved('Kale'), + createCustom('Kiwi'), + createReserved('Leek'), + createCustom('Lemon'), + createCustom('Mango'), + createReserved('Mushroom'), + createReserved('Napa cabbage'), + createCustom('Nectarine'), + createReserved('Okra'), + createCustom('Orange'), + createCustom('Papaya'), + createReserved('Parsnip'), + createCustom('Quince'), + createReserved('Quinoa greens'), + createReserved('Radish'), + createCustom('Raspberry'), + createReserved('Spinach'), + createCustom('Strawberry'), + createCustom('Tangerine'), + createReserved('Turnip'), + ]; + + const sortResult = roles.sort(sortRolesForListing); + const names = sortResult.map(({ name }) => name); + + // expect fruits to be at the top, otherwise sorted alphabetically + expect(names).toEqual(expected); + }); + + it('when they are originally sorted randomly', () => { + const roles = [ + createReserved('Iceberg lettuce'), + createCustom('Nectarine'), + createCustom('Strawberry'), + createReserved('Jalapeño'), + createCustom('Papaya'), + createReserved('Fennel'), + createCustom('Lemon'), + createCustom('Grape'), + createReserved('Artichoke'), + createCustom('Apple'), + createReserved('Quinoa greens'), + createCustom('Quince'), + createCustom('Raspberry'), + createReserved('Leek'), + createReserved('Radish'), + createReserved('Daikon'), + createReserved('Turnip'), + createCustom('Elderberry'), + createCustom('Tangerine'), + createReserved('Broccoli'), + createReserved('Mushroom'), + createCustom('Honeydew melon'), + createCustom('Kiwi'), + createCustom('Fig'), + createCustom('Mango'), + createCustom('Banana'), + createCustom('Jackfruit'), + createReserved('Napa cabbage'), + createReserved('Spinach'), + createCustom('Orange'), + createReserved('Okra'), + createReserved('Eggplant'), + createReserved('Kale'), + createCustom('Cherry'), + createReserved('Horseradish'), + createReserved('Garlic'), + createReserved('Carrot'), + createCustom('Date'), + createReserved('Parsnip'), + createCustom('Indian fig'), + ]; + + const sortResult = roles.sort(sortRolesForListing); + const names = sortResult.map(({ name }) => name); + + // expect fruits to be at the top, otherwise sorted alphabetically + expect(names).toEqual(expected); + }); +}); diff --git a/x-pack/plugins/spaces/public/management/lib/sort_roles.ts b/x-pack/plugins/spaces/public/management/lib/sort_roles.ts new file mode 100644 index 0000000000000..952502fcc777b --- /dev/null +++ b/x-pack/plugins/spaces/public/management/lib/sort_roles.ts @@ -0,0 +1,28 @@ +/* + * 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 { Role } from '@kbn/security-plugin-types-common'; + +/** + * Roles in the listing must be sorted so that custom roles appear in the beginning + * and reserved roles appear at the end + */ +export function sortRolesForListing(aRole: Role, bRole: Role) { + const { name: aName, metadata: aMeta } = aRole; + const { name: bName, metadata: bMeta } = bRole; + const aReserved = aMeta?._reserved ?? false; + const bReserved = bMeta?._reserved ?? false; + + if (aReserved && !bReserved) { + return 1; + } + if (!aReserved && bReserved) { + return -1; + } + + return aName.localeCompare(bName); +} diff --git a/x-pack/plugins/spaces/public/management/lib/validate_space.ts b/x-pack/plugins/spaces/public/management/lib/validate_space.ts index 9a9ae0cbe98fd..7a7980028dad0 100644 --- a/x-pack/plugins/spaces/public/management/lib/validate_space.ts +++ b/x-pack/plugins/spaces/public/management/lib/validate_space.ts @@ -11,7 +11,7 @@ import { i18n } from '@kbn/i18n'; import { isValidSpaceIdentifier } from './space_identifier_utils'; import { isReservedSpace } from '../../../common/is_reserved_space'; -import type { FormValues } from '../edit_space/manage_space_page'; +import type { CustomizeSpaceFormValues } from '../types'; interface SpaceValidatorOptions { shouldValidate?: boolean; @@ -32,7 +32,7 @@ export class SpaceValidator { this.shouldValidate = false; } - public validateSpaceName(space: FormValues) { + public validateSpaceName(space: CustomizeSpaceFormValues) { if (!this.shouldValidate) { return valid(); } @@ -56,7 +56,7 @@ export class SpaceValidator { return valid(); } - public validateSpaceDescription(space: FormValues) { + public validateSpaceDescription(space: CustomizeSpaceFormValues) { if (!this.shouldValidate) { return valid(); } @@ -72,7 +72,7 @@ export class SpaceValidator { return valid(); } - public validateURLIdentifier(space: FormValues) { + public validateURLIdentifier(space: CustomizeSpaceFormValues) { if (!this.shouldValidate) { return valid(); } @@ -104,7 +104,7 @@ export class SpaceValidator { return valid(); } - public validateAvatarInitials(space: FormValues) { + public validateAvatarInitials(space: CustomizeSpaceFormValues) { if (!this.shouldValidate) { return valid(); } @@ -129,7 +129,7 @@ export class SpaceValidator { return valid(); } - public validateAvatarColor(space: FormValues) { + public validateAvatarColor(space: CustomizeSpaceFormValues) { if (!this.shouldValidate) { return valid(); } @@ -153,7 +153,7 @@ export class SpaceValidator { return valid(); } - public validateAvatarImage(space: FormValues) { + public validateAvatarImage(space: CustomizeSpaceFormValues) { if (!this.shouldValidate) { return valid(); } @@ -170,7 +170,7 @@ export class SpaceValidator { } public validateSolutionView( - space: FormValues, + space: CustomizeSpaceFormValues, isEditing: boolean, allowSolutionVisibility = true ) { @@ -189,11 +189,15 @@ export class SpaceValidator { return valid(); } - public validateEnabledFeatures(space: FormValues) { + public validateEnabledFeatures(space: CustomizeSpaceFormValues) { return valid(); } - public validateForSave(space: FormValues, isEditing: boolean, allowSolutionVisibility: boolean) { + public validateForSave( + space: CustomizeSpaceFormValues, + isEditing: boolean, + allowSolutionVisibility: boolean + ) { const { isInvalid: isNameInvalid } = this.validateSpaceName(space); const { isInvalid: isDescriptionInvalid } = this.validateSpaceDescription(space); const { isInvalid: isIdentifierInvalid } = this.validateURLIdentifier(space); diff --git a/x-pack/plugins/spaces/public/management/management_service.test.ts b/x-pack/plugins/spaces/public/management/management_service.test.ts index e5438c0cf5e9c..40a61397e286f 100644 --- a/x-pack/plugins/spaces/public/management/management_service.test.ts +++ b/x-pack/plugins/spaces/public/management/management_service.test.ts @@ -7,6 +7,7 @@ import type { CoreSetup } from '@kbn/core/public'; import { coreMock } from '@kbn/core/public/mocks'; +import { loggingSystemMock } from '@kbn/core-logging-browser-mocks'; import type { ManagementSection } from '@kbn/management-plugin/public'; import { managementPluginMock } from '@kbn/management-plugin/public/mocks'; @@ -18,6 +19,7 @@ import type { PluginsStart } from '../plugin'; import { spacesManagerMock } from '../spaces_manager/mocks'; const eventTracker = new EventTracker({ reportEvent: jest.fn() }); +const logger = loggingSystemMock.createLogger(); describe('ManagementService', () => { const config: ConfigType = { @@ -44,6 +46,7 @@ describe('ManagementService', () => { .getStartServices as CoreSetup['getStartServices'], spacesManager: spacesManagerMock.create(), config, + logger, getRolesAPIClient: getRolesAPIClientMock, getPrivilegesAPIClient: jest.fn(), eventTracker, @@ -66,6 +69,7 @@ describe('ManagementService', () => { .getStartServices as CoreSetup['getStartServices'], spacesManager: spacesManagerMock.create(), config, + logger, getRolesAPIClient: getRolesAPIClientMock, getPrivilegesAPIClient: jest.fn(), eventTracker, @@ -89,6 +93,7 @@ describe('ManagementService', () => { .getStartServices as CoreSetup['getStartServices'], spacesManager: spacesManagerMock.create(), config, + logger, getRolesAPIClient: jest.fn(), getPrivilegesAPIClient: jest.fn(), eventTracker, diff --git a/x-pack/plugins/spaces/public/management/management_service.tsx b/x-pack/plugins/spaces/public/management/management_service.tsx index b186135d88e05..0379189e192c3 100644 --- a/x-pack/plugins/spaces/public/management/management_service.tsx +++ b/x-pack/plugins/spaces/public/management/management_service.tsx @@ -6,6 +6,7 @@ */ import type { StartServicesAccessor } from '@kbn/core/public'; +import type { Logger } from '@kbn/logging'; import type { ManagementApp, ManagementSetup } from '@kbn/management-plugin/public'; import type { PrivilegesAPIClientPublicContract, @@ -26,6 +27,7 @@ interface SetupDeps { getRolesAPIClient: () => Promise; eventTracker: EventTracker; getPrivilegesAPIClient: () => Promise; + logger: Logger; } export class ManagementService { @@ -36,6 +38,7 @@ export class ManagementService { management, spacesManager, config, + logger, getRolesAPIClient, eventTracker, getPrivilegesAPIClient, @@ -45,6 +48,7 @@ export class ManagementService { getStartServices, spacesManager, config, + logger, getRolesAPIClient, eventTracker, getPrivilegesAPIClient, diff --git a/x-pack/plugins/spaces/public/management/privilege_api_client.mock.ts b/x-pack/plugins/spaces/public/management/privilege_api_client.mock.ts new file mode 100644 index 0000000000000..a8351e2d88ad5 --- /dev/null +++ b/x-pack/plugins/spaces/public/management/privilege_api_client.mock.ts @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { PrivilegesAPIClientPublicContract } from '@kbn/security-plugin-types-public'; + +export const createPrivilegeAPIClientMock = (): PrivilegesAPIClientPublicContract => { + return { + getAll: jest.fn(), + }; +}; + +export const getPrivilegeAPIClientMock = jest + .fn() + .mockResolvedValue(createPrivilegeAPIClientMock()); diff --git a/x-pack/plugins/spaces/public/management/roles_api_client.mock.ts b/x-pack/plugins/spaces/public/management/roles_api_client.mock.ts index dd996814f9e51..66a356b3fdb75 100644 --- a/x-pack/plugins/spaces/public/management/roles_api_client.mock.ts +++ b/x-pack/plugins/spaces/public/management/roles_api_client.mock.ts @@ -13,6 +13,7 @@ export const createRolesAPIClientMock = (): RolesAPIClient => { getRole: jest.fn(), saveRole: jest.fn(), deleteRole: jest.fn(), + bulkUpdateRoles: jest.fn(), }; }; diff --git a/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.tsx b/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.tsx index 2bbcc290a8a83..5ac3ecf0ca687 100644 --- a/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.tsx +++ b/x-pack/plugins/spaces/public/management/spaces_grid/spaces_grid_page.tsx @@ -35,7 +35,11 @@ import { reactRouterNavigate } from '@kbn/kibana-react-plugin/public'; import { addSpaceIdToPath, type Space } from '../../../common'; import { isReservedSpace } from '../../../common'; -import { DEFAULT_SPACE_ID, ENTER_SPACE_PATH } from '../../../common/constants'; +import { + DEFAULT_SPACE_ID, + ENTER_SPACE_PATH, + SOLUTION_VIEW_CLASSIC, +} from '../../../common/constants'; import { getSpacesFeatureDescription } from '../../constants'; import { getSpaceAvatarComponent } from '../../space_avatar'; import { SpaceSolutionBadge } from '../../space_solution_badge'; @@ -251,6 +255,9 @@ export class SpacesGridPage extends Component { }; public getColumnConfig() { + const { activeSpace, features } = this.state; + const { solution: activeSolution } = activeSpace ?? {}; + const config: Array> = [ { field: 'initials', @@ -306,17 +313,21 @@ export class SpacesGridPage extends Component { truncateText: true, width: '30%', }, - { + ]; + + const shouldShowFeaturesColumn = !activeSolution || activeSolution === SOLUTION_VIEW_CLASSIC; + if (shouldShowFeaturesColumn) { + config.push({ field: 'disabledFeatures', name: i18n.translate('xpack.spaces.management.spacesGridPage.featuresColumnName', { defaultMessage: 'Features visible', }), sortable: (space: Space) => { - return getEnabledFeatures(this.state.features, space).length; + return getEnabledFeatures(features, space).length; }, render: (_disabledFeatures: string[], rowRecord: Space) => { - const enabledFeatureCount = getEnabledFeatures(this.state.features, rowRecord).length; - if (enabledFeatureCount === this.state.features.length) { + const enabledFeatureCount = getEnabledFeatures(features, rowRecord).length; + if (enabledFeatureCount === features.length) { return ( { } if (enabledFeatureCount === 0) { return ( - + { defaultMessage="{enabledFeatureCount} / {totalFeatureCount}" values={{ enabledFeatureCount, - totalFeatureCount: this.state.features.length, + totalFeatureCount: features.length, }} /> ); }, + }); + } + + config.push({ + field: 'id', + name: i18n.translate('xpack.spaces.management.spacesGridPage.identifierColumnName', { + defaultMessage: 'Identifier', + }), + sortable: true, + render(id: string) { + if (id === DEFAULT_SPACE_ID) { + return ''; + } + return id; }, - { - field: 'id', - name: i18n.translate('xpack.spaces.management.spacesGridPage.identifierColumnName', { - defaultMessage: 'Identifier', - }), - sortable: true, - render(id: string) { - if (id === DEFAULT_SPACE_ID) { - return ''; - } - return id; - }, - }, - ]; + }); if (this.props.allowSolutionVisibility) { config.push({ @@ -404,7 +416,7 @@ export class SpacesGridPage extends Component { defaultMessage: 'Switch', }), description: (rowRecord) => - this.state.activeSpace?.name !== rowRecord.name + activeSpace?.name !== rowRecord.name ? i18n.translate( 'xpack.spaces.management.spacesGridPage.switchSpaceActionDescription', { @@ -428,7 +440,7 @@ export class SpacesGridPage extends Component { rowRecord.id, `${ENTER_SPACE_PATH}?next=/app/management/kibana/spaces/` ), - enabled: (rowRecord) => this.state.activeSpace?.name !== rowRecord.name, + enabled: (rowRecord) => activeSpace?.name !== rowRecord.name, 'data-test-subj': (rowRecord) => `${rowRecord.name}-switchSpace`, }, { @@ -440,7 +452,7 @@ export class SpacesGridPage extends Component { ? i18n.translate( 'xpack.spaces.management.spacesGridPage.deleteActionDisabledDescription', { - defaultMessage: `{spaceName} is reserved`, + defaultMessage: `You can't delete the {spaceName} space`, values: { spaceName: rowRecord.name }, } ) diff --git a/x-pack/plugins/spaces/public/management/spaces_management_app.test.tsx b/x-pack/plugins/spaces/public/management/spaces_management_app.test.tsx index d9852a82f8259..a04335613e59b 100644 --- a/x-pack/plugins/spaces/public/management/spaces_management_app.test.tsx +++ b/x-pack/plugins/spaces/public/management/spaces_management_app.test.tsx @@ -9,8 +9,17 @@ jest.mock('./spaces_grid', () => ({ SpacesGridPage: (props: any) => `Spaces Page: ${JSON.stringify(props)}`, })); +jest.mock('./create_space', () => ({ + CreateSpacePage: (props: any) => { + if (props.spacesManager && props.onLoadSpace) { + props.spacesManager.getSpace().then((space: any) => props.onLoadSpace(space)); + } + return `Spaces Create Page: ${JSON.stringify(props)}`; + }, +})); + jest.mock('./edit_space', () => ({ - ManageSpacePage: (props: any) => { + EditSpacePage: (props: any) => { if (props.spacesManager && props.onLoadSpace) { props.spacesManager.getSpace().then((space: any) => props.onLoadSpace(space)); } @@ -18,7 +27,12 @@ jest.mock('./edit_space', () => ({ }, })); -import { coreMock, scopedHistoryMock, themeServiceMock } from '@kbn/core/public/mocks'; +import { + coreMock, + loggingSystemMock, + scopedHistoryMock, + themeServiceMock, +} from '@kbn/core/public/mocks'; import { featuresPluginMock } from '@kbn/features-plugin/public/mocks'; import { spacesManagementApp } from './spaces_management_app'; @@ -37,6 +51,7 @@ const config: ConfigType = { }; const eventTracker = new EventTracker({ reportEvent: jest.fn() }); +const logger = loggingSystemMock.createLogger(); async function mountApp(basePath: string, pathname: string, spaceId?: string) { const container = document.createElement('div'); @@ -59,6 +74,7 @@ async function mountApp(basePath: string, pathname: string, spaceId?: string) { spacesManager, getStartServices: async () => [coreStart, pluginsStart as PluginsStart, {}], config, + logger, getRolesAPIClient: jest.fn(), getPrivilegesAPIClient: jest.fn(), eventTracker, @@ -82,6 +98,7 @@ describe('spacesManagementApp', () => { spacesManager: spacesManagerMock.create(), getStartServices: coreMock.createSetup().getStartServices as any, config, + logger, getRolesAPIClient: jest.fn(), getPrivilegesAPIClient: jest.fn(), eventTracker, @@ -136,7 +153,7 @@ describe('spacesManagementApp', () => { css="You have tried to stringify object returned from \`css\` function. It isn't supposed to be used directly (e.g. as value of the \`className\` prop), but rather handed to emotion so it can handle it (e.g. as value of \`css\` prop)." data-test-subj="kbnRedirectAppLink" > - Spaces Edit Page: {"capabilities":{"catalogue":{},"management":{},"navLinks":{}},"notifications":{"toasts":{}},"spacesManager":{"onActiveSpaceChange$":{}},"history":{"action":"PUSH","length":1,"location":{"pathname":"/create","search":"","hash":""}},"allowFeatureVisibility":true,"allowSolutionVisibility":true,"eventTracker":{"analytics":{}}} + Spaces Create Page: {"capabilities":{"catalogue":{},"management":{},"navLinks":{}},"notifications":{"toasts":{}},"spacesManager":{"onActiveSpaceChange$":{}},"history":{"action":"PUSH","length":1,"location":{"pathname":"/create","search":"","hash":""}},"allowFeatureVisibility":true,"allowSolutionVisibility":true,"eventTracker":{"analytics":{}}}
`); @@ -159,7 +176,7 @@ describe('spacesManagementApp', () => { expect(setBreadcrumbs).toHaveBeenCalledTimes(1); expect(setBreadcrumbs).toHaveBeenCalledWith([ { href: `/`, text: 'Spaces' }, - { text: `space with id some-space` }, + { text: `Edit "space with id some-space"` }, ]); expect(docTitle.change).toHaveBeenCalledWith('Spaces'); expect(docTitle.reset).not.toHaveBeenCalled(); @@ -169,7 +186,7 @@ describe('spacesManagementApp', () => { css="You have tried to stringify object returned from \`css\` function. It isn't supposed to be used directly (e.g. as value of the \`className\` prop), but rather handed to emotion so it can handle it (e.g. as value of \`css\` prop)." data-test-subj="kbnRedirectAppLink" > - Spaces Edit Page: {"capabilities":{"catalogue":{},"management":{},"navLinks":{}},"notifications":{"toasts":{}},"spacesManager":{"onActiveSpaceChange$":{}},"spaceId":"some-space","history":{"action":"PUSH","length":1,"location":{"pathname":"/edit/some-space","search":"","hash":""}},"allowFeatureVisibility":true,"allowSolutionVisibility":true,"eventTracker":{"analytics":{}}} + Spaces Edit Page: {"capabilities":{"catalogue":{},"management":{},"navLinks":{}},"serverBasePath":"","http":{"basePath":{"basePath":"","serverBasePath":"","assetsHrefBase":""},"anonymousPaths":{},"externalUrl":{},"staticAssets":{}},"overlays":{"banners":{}},"notifications":{"toasts":{}},"theme":{"theme$":{}},"i18n":{},"logger":{"context":[]},"spacesManager":{"onActiveSpaceChange$":{}},"spaceId":"some-space","history":{"action":"PUSH","length":1,"location":{"pathname":"/edit/some-space","search":"","hash":""}},"allowFeatureVisibility":true,"allowSolutionVisibility":true}
`); diff --git a/x-pack/plugins/spaces/public/management/spaces_management_app.tsx b/x-pack/plugins/spaces/public/management/spaces_management_app.tsx index 40532a7259521..fa74316779a7e 100644 --- a/x-pack/plugins/spaces/public/management/spaces_management_app.tsx +++ b/x-pack/plugins/spaces/public/management/spaces_management_app.tsx @@ -12,6 +12,7 @@ import { useParams } from 'react-router-dom'; import type { StartServicesAccessor } from '@kbn/core/public'; import { i18n } from '@kbn/i18n'; import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; +import type { Logger } from '@kbn/logging'; import type { RegisterManagementAppArgs } from '@kbn/management-plugin/public'; import { KibanaRenderContextProvider } from '@kbn/react-kibana-context-render'; import type { @@ -31,6 +32,7 @@ interface CreateParams { getStartServices: StartServicesAccessor; spacesManager: SpacesManager; config: ConfigType; + logger: Logger; getRolesAPIClient: () => Promise; eventTracker: EventTracker; getPrivilegesAPIClient: () => Promise; @@ -38,7 +40,15 @@ interface CreateParams { export const spacesManagementApp = Object.freeze({ id: 'spaces', - create({ getStartServices, spacesManager, config, eventTracker }: CreateParams) { + create({ + getStartServices, + spacesManager, + config, + logger, + eventTracker, + getRolesAPIClient, + getPrivilegesAPIClient, + }: CreateParams) { const title = i18n.translate('xpack.spaces.displayName', { defaultMessage: 'Spaces', }); @@ -49,14 +59,23 @@ export const spacesManagementApp = Object.freeze({ title, async mount({ element, setBreadcrumbs, history }) { - const [[coreStart, { features }], { SpacesGridPage }, { ManageSpacePage }] = - await Promise.all([getStartServices(), import('./spaces_grid'), import('./edit_space')]); + const [ + [coreStart, { features }], + { SpacesGridPage }, + { CreateSpacePage }, + { EditSpacePage }, + ] = await Promise.all([ + getStartServices(), + import('./spaces_grid'), + import('./create_space'), + import('./edit_space'), + ]); const spacesFirstBreadcrumb = { text: title, href: `/`, }; - const { notifications, application, chrome, http } = coreStart; + const { notifications, application, chrome, http, overlays, theme } = coreStart; chrome.docTitle.change(title); @@ -88,7 +107,7 @@ export const spacesManagementApp = Object.freeze({ ]); return ( - { - const { spaceId } = useParams<{ spaceId: string }>(); + const { spaceId, selectedTabId } = useParams<{ + spaceId: string; + selectedTabId?: string; + }>(); + + const breadcrumbText = (space: Space) => + i18n.translate('xpack.spaces.management.editSpaceBreadcrumb', { + defaultMessage: 'Edit "{space}"', + values: { space: space.name }, + }); const onLoadSpace = (space: Space) => { setBreadcrumbs([ spacesFirstBreadcrumb, { - text: space.name, + text: breadcrumbText(space), }, ]); }; return ( - ); }; @@ -141,7 +179,7 @@ export const spacesManagementApp = Object.freeze({ - + diff --git a/x-pack/plugins/spaces/public/management/types.ts b/x-pack/plugins/spaces/public/management/types.ts new file mode 100644 index 0000000000000..dbf839256e43e --- /dev/null +++ b/x-pack/plugins/spaces/public/management/types.ts @@ -0,0 +1,18 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { Space } from '../../common'; + +/** + * Values used in the "Customize Space" form + */ +export interface CustomizeSpaceFormValues extends Partial { + customIdentifier?: boolean; + avatarType?: 'initials' | 'image'; + customAvatarInitials?: boolean; + customAvatarColor?: boolean; +} diff --git a/x-pack/plugins/spaces/public/plugin.tsx b/x-pack/plugins/spaces/public/plugin.tsx index 6d545cdb70e61..86196333c0883 100644 --- a/x-pack/plugins/spaces/public/plugin.tsx +++ b/x-pack/plugins/spaces/public/plugin.tsx @@ -125,6 +125,7 @@ export class SpacesPlugin implements Plugin; } diff --git a/x-pack/plugins/spaces/public/spaces_manager/spaces_manager.test.ts b/x-pack/plugins/spaces/public/spaces_manager/spaces_manager.test.ts index bed49326efea5..021620b41dc55 100644 --- a/x-pack/plugins/spaces/public/spaces_manager/spaces_manager.test.ts +++ b/x-pack/plugins/spaces/public/spaces_manager/spaces_manager.test.ts @@ -183,4 +183,32 @@ describe('SpacesManager', () => { }); }); }); + + describe('#getRolesForSpace', () => { + it('retrieves roles for the specified space', async () => { + const coreStart = coreMock.createStart(); + const rolesForSpace = [Symbol()]; + coreStart.http.get.mockResolvedValue(rolesForSpace); + const spacesManager = new SpacesManager(coreStart.http); + + const result = await spacesManager.getRolesForSpace('foo'); + expect(coreStart.http.get).toHaveBeenCalledTimes(1); + expect(coreStart.http.get).toHaveBeenLastCalledWith('/internal/security/roles/foo'); + expect(result).toEqual(rolesForSpace); + }); + }); + + describe('#getContentForSpace', () => { + it('retrieves content for the specified space', async () => { + const coreStart = coreMock.createStart(); + const spaceContent = [Symbol()]; + coreStart.http.get.mockResolvedValue({ summary: spaceContent, total: spaceContent.length }); + const spacesManager = new SpacesManager(coreStart.http); + + const result = await spacesManager.getContentForSpace('foo'); + expect(coreStart.http.get).toHaveBeenCalledTimes(1); + expect(coreStart.http.get).toHaveBeenLastCalledWith('/internal/spaces/foo/content_summary'); + expect(result).toEqual({ summary: spaceContent, total: spaceContent.length }); + }); + }); }); diff --git a/x-pack/plugins/spaces/public/spaces_manager/spaces_manager.ts b/x-pack/plugins/spaces/public/spaces_manager/spaces_manager.ts index 7762158a4379b..962f02ca2bd79 100644 --- a/x-pack/plugins/spaces/public/spaces_manager/spaces_manager.ts +++ b/x-pack/plugins/spaces/public/spaces_manager/spaces_manager.ts @@ -11,9 +11,11 @@ import { BehaviorSubject, skipWhile } from 'rxjs'; import type { HttpSetup } from '@kbn/core/public'; import type { SavedObjectsCollectMultiNamespaceReferencesResponse } from '@kbn/core-saved-objects-api-server'; import type { LegacyUrlAliasTarget } from '@kbn/core-saved-objects-common'; +import type { Role } from '@kbn/security-plugin-types-common'; import type { GetAllSpacesOptions, GetSpaceResult, Space } from '../../common'; import type { CopySavedObjectsToSpaceResponse } from '../copy_saved_objects_to_space/types'; +import type { SpaceContentTypeSummaryItem } from '../types'; interface SavedObjectTarget { type: string; @@ -192,4 +194,14 @@ export class SpacesManager { private isAnonymousPath() { return this.http.anonymousPaths.isAnonymous(window.location.pathname); } + + public getContentForSpace( + id: string + ): Promise<{ summary: SpaceContentTypeSummaryItem[]; total: number }> { + return this.http.get(`/internal/spaces/${id}/content_summary`); + } + + public getRolesForSpace(id: string): Promise { + return this.http.get(`/internal/security/roles/${id}`); + } } diff --git a/x-pack/plugins/spaces/public/types.ts b/x-pack/plugins/spaces/public/types.ts index b5540df1fdd5a..874ed9e8fd7d3 100644 --- a/x-pack/plugins/spaces/public/types.ts +++ b/x-pack/plugins/spaces/public/types.ts @@ -66,3 +66,14 @@ export interface SpacesApi { */ isSolutionViewEnabled: boolean; } + +/** + * The API for retrieving content associated with a space returns an array of summary data for each type of + * saved object content. SpaceContentTypeSummaryItem is the format of the items included in this summary data. + */ +export interface SpaceContentTypeSummaryItem { + displayName: string; + icon?: string; + count: number; + type: string; // the type of saved object content (dashboard, search, config, etc) +} diff --git a/x-pack/plugins/spaces/tsconfig.json b/x-pack/plugins/spaces/tsconfig.json index ba13f984ef66d..20d3f7d3175d8 100644 --- a/x-pack/plugins/spaces/tsconfig.json +++ b/x-pack/plugins/spaces/tsconfig.json @@ -37,7 +37,21 @@ "@kbn/utility-types-jest", "@kbn/security-plugin-types-public", "@kbn/cloud-plugin", - "@kbn/core-analytics-browser" + "@kbn/core-analytics-browser", + "@kbn/core-analytics-browser", + "@kbn/security-plugin-types-common", + "@kbn/core-application-browser", + "@kbn/unsaved-changes-prompt", + "@kbn/core-lifecycle-browser", + "@kbn/security-role-management-model", + "@kbn/security-ui-components", + "@kbn/react-kibana-mount", + "@kbn/shared-ux-utility", + "@kbn/core-application-common", + "@kbn/security-authorization-core", + "@kbn/core-notifications-browser", + "@kbn/logging", + "@kbn/core-logging-browser-mocks", ], "exclude": [ "target/**/*", diff --git a/x-pack/test/functional/apps/spaces/create_edit_space.ts b/x-pack/test/functional/apps/spaces/create_edit_space.ts deleted file mode 100644 index cfffc752cca0c..0000000000000 --- a/x-pack/test/functional/apps/spaces/create_edit_space.ts +++ /dev/null @@ -1,36 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import { FtrProviderContext } from '../../ftr_provider_context'; - -export default function ({ getPageObjects, getService }: FtrProviderContext) { - const kibanaServer = getService('kibanaServer'); - const PageObjects = getPageObjects(['common', 'settings', 'security', 'spaceSelector']); - const testSubjects = getService('testSubjects'); - - describe('edit space', () => { - before(async () => { - await kibanaServer.savedObjects.cleanStandardList(); - }); - - after(async () => { - await kibanaServer.savedObjects.cleanStandardList(); - }); - - describe('solution view', () => { - it('does not show solution view panel', async () => { - await PageObjects.common.navigateToUrl('management', 'kibana/spaces/edit/default', { - shouldUseHashForSubUrl: false, - }); - - await testSubjects.existOrFail('spaces-edit-page'); - await testSubjects.existOrFail('spaces-edit-page > generalPanel'); - await testSubjects.missingOrFail('spaces-edit-page > navigationPanel'); - }); - }); - }); -} diff --git a/x-pack/test/functional/apps/spaces/create_edit_space/acme_logo.png b/x-pack/test/functional/apps/spaces/create_edit_space/acme_logo.png new file mode 100644 index 0000000000000000000000000000000000000000..8e8ed078b8b614775ab0aebcb4d7731a9b5b242a GIT binary patch literal 3243 zcmeH}_ct2~8^C4rQY>97+4j;~|w8~|)U5IYB$lZ*Ql4=*3T zfZ!iOr-emC#l$5f&zzN#J|`o4UQS*?5u&85q6$@0*MMolwX}6~_4NO|U|?uuY+`D5 z(Hw!aKv|-#tZi)VE@AAk4miA{le5cZS2u#Yho_gfk1z3xpMOALP;kiA(6DRa5!WOC zii*Awb2BzBJ|Qvb@8nyzQ&Q8?GcvR8Was4G&AXRhKq@LO`KR=L*@N2s%vV= zl)A@Ho<6I8-q6_eqWR^kme#iR*Bw+^XBYiVcMqetuYcg};LyAG!^{sOqhsR}lOLz1 zXJ+T-KP@aSeg3k%vby&5+xPX2%^zFaJG(zwd%yM%4v&rrOAGH$NU(WZqY%eTK$imm zz=cI4%y8lo-#Zgx-*EsLKUh)J;BSXYHjv5BQK$8)V9L~R$XCWL{axQ(b>?9j-l=A_ z(4mmDsHC#rLYMqCShcb+VUezCLg{Ac3^^8`BfF7A;FG)fmG+K|#|ZKDt5Nk>w6>yVDF>(}>1DDo>mca3?6G${o?O}zJ%$=Sfjx$I6o6Bf2irIS~bzXF9m7)otqnLm6@c}olc_eq|KWrP$1WcVA?Uy*g4W5D+4T`Y^;ZF}g zM#`bS8qRyZQvdSNyWF4UV#634l*XZ&zgE9KDBv+))k}pLk~3Y&HN^l#Agqg|yiqm3jo;@t({41f^fPunu+>DAZixZ+U$0f;Ns#Q03^GmOPs?8^( z>QI*V06IMP7{Tw0e?Um~QQtfmBBXQe^So>0njwxu9unhX87S@s6Zzm{ zb`WgQtFa?9x@#{XwuFw6RPu*9_-X9Lpi8*3?mjt^3=9h{GAGHLi-jmJ1D!&151aqDx*NR;DxFJmJ!8?M9NKosW{Mp$Mj0lbNp0QZ85?RcmQT918T%zGrm z+on55U;apR;=F?{>>?B6*=947$d|W}S^w5S;nEDs5fi+Z#87|K_aqM%JQy< zu3}WFJJ>?SG?&Lt)mwn1-p~zH)t0m*c>t>s0e@`X0SP z9SB!Y16{?JSDF@SbJLxF>9E0dz|j`*Q9f3=?ws*8rjT-6>y}aqek&8)tSnumO8s6m z6g8qsgK>lj(Wk%I=f>;Lh7Gn=39Uwh?4xV zisbk|_CEH(fJG4V--|_Vbr$Xl)U*!emZJ7XbA?EdZhsR<974y=^GOILk>NVWka*M> z)!6Un;mBj5;MCB9)l)LoDf;EL9lSJG{CG7wj^Bv3Q%l-DcD0RP2XA@t}tB2HK0cSh63&8 zgKD4_PSO8NSaayO8H@i8wPp88xxNLl1b84E$)%6=i1%ts%$qs}K(Q^NCTzdP`vmh& zBM=)|iw)J`u6^&OOQaEZNbD@WrIh9zI3YRxzdYFHdVuEo$Z~ zMjGGxbT14aEk+f_57%%_-KY4r3M6yVe}XB3B{?A-=J;L1Y~mx8GoQOiq7_yto<9b| zl`xGV&iqCRLAQd{QWEChGzZ1J6r8+Z*gl-RS~G=D&Rz9;euLi+dWmp^G{y^W%;lD} zsy7N!Mbz+(S3>QRH?(4LQRNTRp~--<5LW8SzTS`^ZPZb0xDTYiUH^)uE;WTCy=QwC zY?R!614uth7%`+7G?`63)$7(4aKPVjjcOzNY}fIF7;9f2cCi3YWn0T@gK0Akg@SRC zN>VjE{&8G%c>;6rwm1nvQKa+0s%k}J?stbRxu*hOpy}GE7vXeG8-vtTa)Wv%LEP{X zg(Uf`Cp>VqUbhpjvwqNJ3^kd3csatbG{@t|r?)elmll=@9}$Ie@YS=UAsM5e19R*9 zP{bOso;AOKf_jma*(b+ubx#h|JD%qz>bR~y3?9K zpN(=w8o!o{xGEot6`%$c;ExS)-^Ighv&l=4-1zR1Pf$ULoc4+^J2 z(K6=P^GE}pV%e!=>2?^ZL@vUC?R0*ZT*IG6d9AtX%Eihh=CfWOJd0L$*TcCBkd4RFM9s{FPIIBVE_OC literal 0 HcmV?d00001 diff --git a/x-pack/test/functional/apps/spaces/create_edit_space/create_edit_space.ts b/x-pack/test/functional/apps/spaces/create_edit_space/create_edit_space.ts new file mode 100644 index 0000000000000..4b100595a38c6 --- /dev/null +++ b/x-pack/test/functional/apps/spaces/create_edit_space/create_edit_space.ts @@ -0,0 +1,117 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { faker } from '@faker-js/faker'; +import { FtrProviderContext } from '../../../ftr_provider_context'; + +export default function ({ getPageObjects, getService }: FtrProviderContext) { + const kibanaServer = getService('kibanaServer'); + const PageObjects = getPageObjects(['common', 'settings', 'security', 'spaceSelector']); + const testSubjects = getService('testSubjects'); + const spacesServices = getService('spaces'); + const log = getService('log'); + + describe('Spaces Management: Create and Edit', () => { + before(async () => { + await kibanaServer.savedObjects.cleanStandardList(); + }); + + after(async () => { + await kibanaServer.savedObjects.cleanStandardList(); + }); + + describe('create space', () => { + const spaceName = `${faker.word.adjective()} space`; + const spaceId = spaceName.replace(' ', '-'); + + before(async () => { + await PageObjects.common.navigateToApp('spacesManagement'); + await testSubjects.existOrFail('spaces-grid-page'); + + await PageObjects.spaceSelector.clickCreateSpace(); + await testSubjects.existOrFail('spaces-create-page'); + }); + + after(async () => { + await spacesServices.delete(spaceId); + }); + + it('create a space with a given name', async () => { + await PageObjects.spaceSelector.addSpaceName(spaceName); + await PageObjects.spaceSelector.clickSaveSpaceCreation(); + await testSubjects.existOrFail(`spacesListTableRow-${spaceId}`); + }); + }); + + describe('edit space', () => { + const spaceName = `${faker.word.adjective()} space`; + const spaceId = spaceName.replace(' ', '-'); + + before(async () => { + log.debug(`Creating space named "${spaceName}" with ID "${spaceId}"`); + + await spacesServices.create({ + id: spaceId, + name: spaceName, + disabledFeatures: [], + color: '#AABBCC', + }); + + await PageObjects.common.navigateToApp('spacesManagement'); + await testSubjects.existOrFail('spaces-grid-page'); + }); + + after(async () => { + await spacesServices.delete(spaceId); + }); + + it('allows changing space initials', async () => { + const spaceInitials = faker.string.alpha(2); + + await testSubjects.click(`${spaceId}-hyperlink`); + await testSubjects.existOrFail('spaces-view-page > generalPanel'); + + await testSubjects.setValue('spaceLetterInitial', spaceInitials); + await testSubjects.click('save-space-button'); + + await testSubjects.existOrFail('spaces-grid-page'); // wait for grid page to reload + await testSubjects.existOrFail(`space-avatar-${spaceId}`); + expect(await testSubjects.getVisibleText(`space-avatar-${spaceId}`)).to.be(spaceInitials); + }); + + it('allows changing space avatar', async () => { + await testSubjects.click(`${spaceId}-hyperlink`); + await testSubjects.existOrFail('spaces-view-page > generalPanel'); + + await testSubjects.click('image'); + + const avatarPath = require.resolve('./acme_logo.png'); + log.debug(`Importing file '${avatarPath}' ...`); + await PageObjects.common.setFileInputPath(avatarPath); + + await testSubjects.click('save-space-button'); + await testSubjects.existOrFail('spaces-grid-page'); // wait for grid page to reload + await testSubjects.existOrFail(`space-avatar-${spaceId}`); + const avatarEl = await testSubjects.find(`space-avatar-${spaceId}`); + expect(await avatarEl.getAttribute('role')).to.be('img'); // expect that the space uses image avatar + }); + }); + + describe('solution view', () => { + it('does not show solution view panel', async () => { + await PageObjects.common.navigateToUrl('management', 'kibana/spaces/edit/default', { + shouldUseHashForSubUrl: false, + }); + + await testSubjects.existOrFail('spaces-view-page'); + await testSubjects.existOrFail('spaces-view-page > generalPanel'); + await testSubjects.missingOrFail('spaces-view-page > navigationPanel'); // xpack.spaces.allowSolutionVisibility is not enabled, so the solution view picker should not appear + }); + }); + }); +} diff --git a/x-pack/test/functional/apps/spaces/create_edit_space/index.ts b/x-pack/test/functional/apps/spaces/create_edit_space/index.ts new file mode 100644 index 0000000000000..dc96179e1cb7c --- /dev/null +++ b/x-pack/test/functional/apps/spaces/create_edit_space/index.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrProviderContext } from '../../../ftr_provider_context'; + +export default function spacesApp({ loadTestFile }: FtrProviderContext) { + describe('Spaces app', function spacesAppTestSuite() { + loadTestFile(require.resolve('./create_edit_space')); + }); +} diff --git a/x-pack/test/functional/apps/spaces/feature_controls/spaces_security.ts b/x-pack/test/functional/apps/spaces/feature_controls/spaces_security.ts index be03af7c896a0..66d5eb280d613 100644 --- a/x-pack/test/functional/apps/spaces/feature_controls/spaces_security.ts +++ b/x-pack/test/functional/apps/spaces/feature_controls/spaces_security.ts @@ -92,7 +92,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { shouldUseHashForSubUrl: false, }); - await testSubjects.existOrFail('spaces-edit-page'); + await testSubjects.existOrFail('spaces-create-page'); }); it(`can navigate to edit space page`, async () => { @@ -102,7 +102,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { shouldUseHashForSubUrl: false, }); - await testSubjects.existOrFail('spaces-edit-page'); + await testSubjects.existOrFail('spaces-view-page'); }); }); diff --git a/x-pack/test/functional/apps/spaces/solution_view_flag_enabled/create_edit_space.ts b/x-pack/test/functional/apps/spaces/solution_view_flag_enabled/create_edit_space.ts index 3f00dda32c878..f6f69ada3c0c1 100644 --- a/x-pack/test/functional/apps/spaces/solution_view_flag_enabled/create_edit_space.ts +++ b/x-pack/test/functional/apps/spaces/solution_view_flag_enabled/create_edit_space.ts @@ -28,9 +28,9 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { shouldUseHashForSubUrl: false, }); - await testSubjects.existOrFail('spaces-edit-page'); - await testSubjects.existOrFail('spaces-edit-page > generalPanel'); - await testSubjects.existOrFail('spaces-edit-page > navigationPanel'); + await testSubjects.existOrFail('spaces-view-page'); + await testSubjects.existOrFail('spaces-view-page > generalPanel'); + await testSubjects.existOrFail('spaces-view-page > navigationPanel'); }); it('changes the space solution and updates the side navigation', async () => { @@ -58,9 +58,9 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { shouldUseHashForSubUrl: false, }); - await testSubjects.missingOrFail('userImpactWarning'); + await testSubjects.missingOrFail('space-edit-page-user-impact-warning'); await PageObjects.spaceSelector.changeSolutionView('classic'); - await testSubjects.existOrFail('userImpactWarning'); // Warn that the change will impact other users + await testSubjects.existOrFail('space-edit-page-user-impact-warning'); // Warn that the change will impact other users await PageObjects.spaceSelector.clickSaveSpaceCreation(); await PageObjects.spaceSelector.confirmModal(); diff --git a/x-pack/test/functional/apps/spaces/spaces_grid.ts b/x-pack/test/functional/apps/spaces/spaces_grid.ts index 62363802db98a..bcb04f45b87cb 100644 --- a/x-pack/test/functional/apps/spaces/spaces_grid.ts +++ b/x-pack/test/functional/apps/spaces/spaces_grid.ts @@ -5,43 +5,120 @@ * 2.0. */ -import { FtrProviderContext } from '../../ftr_provider_context'; +import crypto from 'crypto'; +import expect from '@kbn/expect'; +import { type FtrProviderContext } from '../../ftr_provider_context'; -export default function enterSpaceFunctionalTests({ +export default function spaceDetailsViewFunctionalTests({ getService, getPageObjects, }: FtrProviderContext) { - const kibanaServer = getService('kibanaServer'); - const PageObjects = getPageObjects(['security', 'spaceSelector', 'common']); + const PageObjects = getPageObjects(['common', 'settings', 'spaceSelector']); const spacesService = getService('spaces'); const testSubjects = getService('testSubjects'); + const retry = getService('retry'); - const anotherSpace = { - id: 'space2', - name: 'space2', - disabledFeatures: [], - }; + const testSpacesIds = [ + 'odyssey', + // this number is chosen intentionally to not exceed the default 10 items displayed by spaces table + ...Array.from(new Array(5)).map((_) => `space-${crypto.randomUUID()}`), + ]; - describe('Spaces grid', function () { + describe('Spaces Management: List of Spaces', function () { before(async () => { - await spacesService.create(anotherSpace); + for (const testSpaceId of testSpacesIds) { + await spacesService.create({ id: testSpaceId, name: `${testSpaceId}-name` }); + } + + await PageObjects.settings.navigateTo(); + await testSubjects.existOrFail('spaces'); + }); + + beforeEach(async () => { + await PageObjects.common.navigateToUrl('management', 'kibana/spaces', { + ensureCurrentUrl: false, + shouldLoginIfPrompted: false, + shouldUseHashForSubUrl: false, + }); - await PageObjects.common.navigateToApp('spacesManagement'); await testSubjects.existOrFail('spaces-grid-page'); }); after(async () => { - await spacesService.delete('another-space'); - await kibanaServer.savedObjects.cleanStandardList(); + for (const testSpaceId of testSpacesIds) { + await spacesService.delete(testSpaceId); + } + }); + + it('should list all the spaces populated', async () => { + const renderedSpaceRow = await testSubjects.findAll('*spacesListTableRow-'); + + expect(renderedSpaceRow.length).to.equal(testSpacesIds.length + 1); }); - it('can switch to a space from the row in the grid', async () => { - // use the "current" badge confirm that Default is the current space - await testSubjects.existOrFail('spacesListCurrentBadge-default'); - // click the switch button of "another space" - await PageObjects.spaceSelector.clickSwitchSpaceButton('space2'); - // use the "current" badge confirm that "Another Space" is now the current space - await testSubjects.existOrFail('spacesListCurrentBadge-space2'); + it('does not display the space switcher button when viewing the details page for the current selected space', async () => { + const currentSpaceTitle = ( + await PageObjects.spaceSelector.currentSelectedSpaceTitle() + )?.toLowerCase(); + + expect(currentSpaceTitle).to.equal('default'); + + await testSubjects.click('default-hyperlink'); + await testSubjects.existOrFail('space-view-page-details-header'); + expect( + (await testSubjects.getVisibleText('space-view-page-details-header')) + .toLowerCase() + .includes('default') + ).to.be(true); + await testSubjects.missingOrFail('spaces-view-page-switcher-button'); + }); + + it("displays the space switcher button when viewing the details page of the space that's not the current selected one", async () => { + const testSpaceId = testSpacesIds[Math.floor(Math.random() * testSpacesIds.length)]; + + const currentSpaceTitle = ( + await PageObjects.spaceSelector.currentSelectedSpaceTitle() + )?.toLowerCase(); + + expect(currentSpaceTitle).to.equal('default'); + + await testSubjects.click(`${testSpaceId}-hyperlink`); + await testSubjects.existOrFail('space-view-page-details-header'); + expect( + (await testSubjects.getVisibleText('space-view-page-details-header')) + .toLowerCase() + .includes(`${testSpaceId}-name`) + ).to.be(true); + await testSubjects.existOrFail('spaces-view-page-switcher-button'); + }); + + it('switches to a new space using the space switcher button', async () => { + const currentSpaceTitle = ( + await PageObjects.spaceSelector.currentSelectedSpaceTitle() + )?.toLowerCase(); + + expect(currentSpaceTitle).to.equal('default'); + + const testSpaceId = testSpacesIds[Math.floor(Math.random() * testSpacesIds.length)]; + + await testSubjects.click(`${testSpaceId}-hyperlink`); + await testSubjects.click('spaces-view-page-switcher-button'); + + await retry.try(async () => { + const detailsTitle = ( + await testSubjects.getVisibleText('space-view-page-details-header') + ).toLowerCase(); + + const currentSwitchSpaceTitle = ( + await PageObjects.spaceSelector.currentSelectedSpaceTitle() + )?.toLocaleLowerCase(); + + return ( + currentSwitchSpaceTitle && + currentSwitchSpaceTitle === `${testSpaceId}-name` && + detailsTitle.includes(currentSwitchSpaceTitle) + ); + }); }); }); } diff --git a/x-pack/test/functional/page_objects/space_selector_page.ts b/x-pack/test/functional/page_objects/space_selector_page.ts index 5dce6ed2d7c94..e5afbd78fe767 100644 --- a/x-pack/test/functional/page_objects/space_selector_page.ts +++ b/x-pack/test/functional/page_objects/space_selector_page.ts @@ -288,4 +288,9 @@ export class SpaceSelectorPageObject extends FtrService { ); expect(await msgElem.getVisibleText()).to.be('no spaces found'); } + + async currentSelectedSpaceTitle() { + const spacesNavSelector = await this.testSubjects.find('spacesNavSelector'); + return spacesNavSelector.getAttribute('title'); + } } From f6c5dd99c6d67e0ba7846e262a1ef401d3e37f03 Mon Sep 17 00:00:00 2001 From: Philippe Oberti Date: Mon, 23 Sep 2024 21:22:11 +0200 Subject: [PATCH 15/41] [Security Solution] - fix Cypress not running locally (#193622) --- x-pack/test/security_solution_cypress/runner.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/runner.ts b/x-pack/test/security_solution_cypress/runner.ts index fb58d22a40cdc..0b815e2a14033 100644 --- a/x-pack/test/security_solution_cypress/runner.ts +++ b/x-pack/test/security_solution_cypress/runner.ts @@ -7,6 +7,7 @@ import Url from 'url'; +import { createEsClientForFtrConfig } from '@kbn/test'; import { TransportResult } from '@elastic/elasticsearch'; import { FtrProviderContext } from '../common/ftr_provider_context'; import { tiAbusechMalware } from './pipelines/ti_abusech_malware'; @@ -20,7 +21,7 @@ export async function SecuritySolutionConfigurableCypressTestRunner({ }: FtrProviderContext) { const log = getService('log'); const config = getService('config'); - const es = getService('es'); + const es = createEsClientForFtrConfig(config); const pipelines = [tiAbusechMalware, tiAbusechMalwareBazaar, tiAbusechUrl]; From a8ebc7f4686e359e9893e7e6fed291711c38dad4 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Mon, 23 Sep 2024 14:58:09 -0600 Subject: [PATCH 16/41] [maps embeddable] fix map layers disappear from map panel when using session storage to continue editing a dashboard (#193629) Closes https://github.com/elastic/kibana/issues/190468 and https://github.com/elastic/kibana/issues/193601 Dashboard unsaved changes for a panel are obtained from the embeddable comparator subject for each comparator. If comparator subject does not return a value, then this information is lost when returning to a dashboard with unsaved changes. This is why layers and filters where disappearing from a map when returning to a dashboard with unsaved changes. This PR resolves this issue by providing comparator subjects and setters for `savedObjectId`, `attributes`, and `mapSettings`. PR also resolves issue of passing props from `MapRenderer` component into map embeddable. Instead of passing props via state, props should be passed from `MapRenderer` parent api. --------- Co-authored-by: Elastic Machine --- x-pack/plugins/maps/public/api/start_api.ts | 2 +- .../region_map/region_map_visualization.tsx | 2 +- .../tile_map/tile_map_visualization.tsx | 2 +- .../plugins/maps/public/lens/passive_map.tsx | 2 +- x-pack/plugins/maps/public/plugin.ts | 2 +- .../react_embeddable/map_react_embeddable.tsx | 36 +++++++++---- .../{ => map_renderer}/map_renderer.tsx | 50 ++++++++++--------- .../{ => map_renderer}/map_renderer_lazy.tsx | 0 .../react_embeddable/map_renderer/types.ts | 21 ++++++++ .../maps/public/react_embeddable/types.ts | 7 --- 10 files changed, 79 insertions(+), 45 deletions(-) rename x-pack/plugins/maps/public/react_embeddable/{ => map_renderer}/map_renderer.tsx (66%) rename x-pack/plugins/maps/public/react_embeddable/{ => map_renderer}/map_renderer_lazy.tsx (100%) create mode 100644 x-pack/plugins/maps/public/react_embeddable/map_renderer/types.ts diff --git a/x-pack/plugins/maps/public/api/start_api.ts b/x-pack/plugins/maps/public/api/start_api.ts index fcf9dab69e40a..4047c88268e04 100644 --- a/x-pack/plugins/maps/public/api/start_api.ts +++ b/x-pack/plugins/maps/public/api/start_api.ts @@ -9,7 +9,7 @@ import type { LayerDescriptor } from '../../common/descriptor_types'; import type { CreateLayerDescriptorParams } from '../classes/sources/es_search_source'; import type { SampleValuesConfig, EMSTermJoinConfig } from '../ems_autosuggest'; import type { Props as PassiveMapProps } from '../lens/passive_map'; -import type { Props as MapProps } from '../react_embeddable/map_renderer'; +import type { Props as MapProps } from '../react_embeddable/map_renderer/map_renderer'; export interface MapsStartApi { createLayerDescriptors: { diff --git a/x-pack/plugins/maps/public/legacy_visualizations/region_map/region_map_visualization.tsx b/x-pack/plugins/maps/public/legacy_visualizations/region_map/region_map_visualization.tsx index d8bc9a56f062a..09cf94a097767 100644 --- a/x-pack/plugins/maps/public/legacy_visualizations/region_map/region_map_visualization.tsx +++ b/x-pack/plugins/maps/public/legacy_visualizations/region_map/region_map_visualization.tsx @@ -11,7 +11,7 @@ import { first } from 'rxjs'; import type { Filter } from '@kbn/es-query'; import type { Query, TimeRange } from '@kbn/es-query'; import { RegionMapVisConfig } from './types'; -import { MapRenderer } from '../../react_embeddable/map_renderer'; +import { MapRenderer } from '../../react_embeddable/map_renderer/map_renderer'; import { createRegionMapLayerDescriptor } from '../../classes/layers/create_region_map_layer_descriptor'; interface Props { diff --git a/x-pack/plugins/maps/public/legacy_visualizations/tile_map/tile_map_visualization.tsx b/x-pack/plugins/maps/public/legacy_visualizations/tile_map/tile_map_visualization.tsx index f1cc8d437e082..35960c0c0dead 100644 --- a/x-pack/plugins/maps/public/legacy_visualizations/tile_map/tile_map_visualization.tsx +++ b/x-pack/plugins/maps/public/legacy_visualizations/tile_map/tile_map_visualization.tsx @@ -11,7 +11,7 @@ import { first } from 'rxjs'; import type { Filter } from '@kbn/es-query'; import type { Query, TimeRange } from '@kbn/es-query'; import type { TileMapVisConfig } from './types'; -import { MapRenderer } from '../../react_embeddable/map_renderer'; +import { MapRenderer } from '../../react_embeddable/map_renderer/map_renderer'; import { createTileMapLayerDescriptor } from '../../classes/layers/create_tile_map_layer_descriptor'; interface Props { diff --git a/x-pack/plugins/maps/public/lens/passive_map.tsx b/x-pack/plugins/maps/public/lens/passive_map.tsx index 30a4b8013b8ab..1be544a8cb423 100644 --- a/x-pack/plugins/maps/public/lens/passive_map.tsx +++ b/x-pack/plugins/maps/public/lens/passive_map.tsx @@ -53,6 +53,7 @@ export function PassiveMap(props: Props) { type={MAP_SAVED_OBJECT_TYPE} getParentApi={() => ({ + hideFilterActions: true, getSerializedStateForChild: () => { const basemapLayerDescriptor = createBasemapLayerDescriptor(); const intialLayers = basemapLayerDescriptor ? [basemapLayerDescriptor] : []; @@ -66,7 +67,6 @@ export function PassiveMap(props: Props) { hidePanelTitles: true, viewMode: ViewMode.VIEW, isLayerTOCOpen: false, - hideFilterActions: true, mapSettings: { disableInteractive: false, hideToolbarOverlay: false, diff --git a/x-pack/plugins/maps/public/plugin.ts b/x-pack/plugins/maps/public/plugin.ts index cc4cc4bcc91e8..fbdb2ef67d2ed 100644 --- a/x-pack/plugins/maps/public/plugin.ts +++ b/x-pack/plugins/maps/public/plugin.ts @@ -88,7 +88,7 @@ import { VectorTileInspectorView } from './inspector/vector_tile_adapter/vector_ import { PassiveMapLazy, setupLensChoroplethChart } from './lens'; import { CONTENT_ID, LATEST_VERSION } from '../common/content_management'; import { setupMapEmbeddable } from './react_embeddable/setup_map_embeddable'; -import { MapRendererLazy } from './react_embeddable/map_renderer_lazy'; +import { MapRendererLazy } from './react_embeddable/map_renderer/map_renderer_lazy'; export interface MapsPluginSetupDependencies { cloud?: CloudSetup; diff --git a/x-pack/plugins/maps/public/react_embeddable/map_react_embeddable.tsx b/x-pack/plugins/maps/public/react_embeddable/map_react_embeddable.tsx index 28a14592a8c32..b20c05dba244b 100644 --- a/x-pack/plugins/maps/public/react_embeddable/map_react_embeddable.tsx +++ b/x-pack/plugins/maps/public/react_embeddable/map_react_embeddable.tsx @@ -40,6 +40,9 @@ import { initializeDataViews } from './initialize_data_views'; import { initializeFetch } from './initialize_fetch'; import { initializeEditApi } from './initialize_edit_api'; import { extractReferences } from '../../common/migrations/references'; +import { MapAttributes } from '../../common/content_management'; +import { MapSettings } from '../../common/descriptor_types'; +import { isMapRendererApi } from './map_renderer/types'; export function getControlledBy(id: string) { return `mapEmbeddablePanel${id}`; @@ -65,6 +68,10 @@ export const mapEmbeddableFactory: ReactEmbeddableFactory< }); await savedMap.whenReady(); + const attributes$ = new BehaviorSubject(state.attributes); + const mapSettings$ = new BehaviorSubject | undefined>(state.mapSettings); + const savedObjectId$ = new BehaviorSubject(state.savedObjectId); + // eslint bug, eslint thinks api is never reassigned even though it is // eslint-disable-next-line prefer-const let api: MapApi | undefined; @@ -171,14 +178,14 @@ export const mapEmbeddableFactory: ReactEmbeddableFactory< }), ...crossPanelActions.comparators, ...reduxSync.comparators, + attributes: [attributes$, (next: MapAttributes | undefined) => attributes$.next(next)], + mapSettings: [ + mapSettings$, + (next: Partial | undefined) => mapSettings$.next(next), + ], + savedObjectId: [savedObjectId$, (next: string | undefined) => savedObjectId$.next(next)], // readonly comparators - attributes: getUnchangingComparator(), mapBuffer: getUnchangingComparator(), - savedObjectId: getUnchangingComparator(), - mapSettings: getUnchangingComparator(), - hideFilterActions: getUnchangingComparator(), - isSharable: getUnchangingComparator(), - tooltipRenderer: getUnchangingComparator(), } ); @@ -229,17 +236,28 @@ export const mapEmbeddableFactory: ReactEmbeddableFactory< ); diff --git a/x-pack/plugins/maps/public/react_embeddable/map_renderer.tsx b/x-pack/plugins/maps/public/react_embeddable/map_renderer/map_renderer.tsx similarity index 66% rename from x-pack/plugins/maps/public/react_embeddable/map_renderer.tsx rename to x-pack/plugins/maps/public/react_embeddable/map_renderer/map_renderer.tsx index 7701c7ebbe11b..459c99f9d981c 100644 --- a/x-pack/plugins/maps/public/react_embeddable/map_renderer.tsx +++ b/x-pack/plugins/maps/public/react_embeddable/map_renderer/map_renderer.tsx @@ -9,11 +9,16 @@ import React, { useEffect, useRef } from 'react'; import type { Filter, Query, TimeRange } from '@kbn/es-query'; import { ReactEmbeddableRenderer } from '@kbn/embeddable-plugin/public'; import { useSearchApi } from '@kbn/presentation-publishing'; -import type { LayerDescriptor, MapCenterAndZoom, MapSettings } from '../../common/descriptor_types'; -import { createBasemapLayerDescriptor } from '../classes/layers/create_basemap_layer_descriptor'; -import { MapApi, MapRuntimeState, MapSerializedState } from './types'; -import { MAP_SAVED_OBJECT_TYPE } from '../../common/constants'; -import { RenderToolTipContent } from '../classes/tooltips/tooltip_property'; +import type { + LayerDescriptor, + MapCenterAndZoom, + MapSettings, +} from '../../../common/descriptor_types'; +import { createBasemapLayerDescriptor } from '../../classes/layers/create_basemap_layer_descriptor'; +import { MapApi, MapRuntimeState, MapSerializedState } from '../types'; +import { MAP_SAVED_OBJECT_TYPE } from '../../../common/constants'; +import { RenderToolTipContent } from '../../classes/tooltips/tooltip_property'; +import { MAP_RENDERER_TYPE } from './types'; function getLayers(layerList: LayerDescriptor[]) { const basemapLayer = createBasemapLayerDescriptor(); @@ -61,30 +66,27 @@ export function MapRenderer(props: Props) { type={MAP_SAVED_OBJECT_TYPE} getParentApi={() => ({ - ...searchApi, + type: MAP_RENDERER_TYPE, + getTooltipRenderer: props.getTooltipRenderer, + hideFilterActions: props.hideFilterActions, + isSharable: props.isSharable, getSerializedStateForChild: () => { - const rawState: MapSerializedState = { - attributes: { - title: props.title ?? '', - layerListJSON: JSON.stringify(getLayers(props.layerList)), - }, - hidePanelTitles: !Boolean(props.title), - isLayerTOCOpen: - typeof props.isLayerTOCOpen === 'boolean' ? props.isLayerTOCOpen : false, - hideFilterActions: - typeof props.hideFilterActions === 'boolean' ? props.hideFilterActions : false, - mapCenter: props.mapCenter, - mapSettings: props.mapSettings ?? {}, - isSharable: props.isSharable, - }; - if (props.getTooltipRenderer) { - rawState.tooltipRenderer = props.getTooltipRenderer(); - } return { - rawState, + rawState: { + attributes: { + title: props.title ?? '', + layerListJSON: JSON.stringify(getLayers(props.layerList)), + }, + hidePanelTitles: !Boolean(props.title), + isLayerTOCOpen: + typeof props.isLayerTOCOpen === 'boolean' ? props.isLayerTOCOpen : false, + mapCenter: props.mapCenter, + mapSettings: props.mapSettings ?? {}, + }, references: [], }; }, + ...searchApi, })} onApiAvailable={(api) => { mapApiRef.current = api; diff --git a/x-pack/plugins/maps/public/react_embeddable/map_renderer_lazy.tsx b/x-pack/plugins/maps/public/react_embeddable/map_renderer/map_renderer_lazy.tsx similarity index 100% rename from x-pack/plugins/maps/public/react_embeddable/map_renderer_lazy.tsx rename to x-pack/plugins/maps/public/react_embeddable/map_renderer/map_renderer_lazy.tsx diff --git a/x-pack/plugins/maps/public/react_embeddable/map_renderer/types.ts b/x-pack/plugins/maps/public/react_embeddable/map_renderer/types.ts new file mode 100644 index 0000000000000..0e92e551c821a --- /dev/null +++ b/x-pack/plugins/maps/public/react_embeddable/map_renderer/types.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 { HasType, apiIsOfType } from '@kbn/presentation-publishing'; +import { RenderToolTipContent } from '../../classes/tooltips/tooltip_property'; + +export const MAP_RENDERER_TYPE = 'mapRenderer'; + +export type MapRendererApi = HasType & { + getTooltipRenderer?: () => RenderToolTipContent; + hideFilterActions?: boolean; + isSharable?: boolean; +}; + +export function isMapRendererApi(api: unknown): api is MapRendererApi { + return Boolean(api && apiIsOfType(api, MAP_RENDERER_TYPE)); +} diff --git a/x-pack/plugins/maps/public/react_embeddable/types.ts b/x-pack/plugins/maps/public/react_embeddable/types.ts index f020e75723c6c..a61a7e1ce6a03 100644 --- a/x-pack/plugins/maps/public/react_embeddable/types.ts +++ b/x-pack/plugins/maps/public/react_embeddable/types.ts @@ -31,7 +31,6 @@ import { MapSettings, } from '../../common/descriptor_types'; import { ILayer } from '../classes/layers/layer'; -import { RenderToolTipContent } from '../classes/tooltips/tooltip_property'; import { EventHandlers } from '../reducers/non_serializable_instances'; export type MapSerializedState = SerializedTitles & @@ -47,15 +46,9 @@ export type MapSerializedState = SerializedTitles & mapBuffer?: MapExtent; mapSettings?: Partial; hiddenLayers?: string[]; - hideFilterActions?: boolean; timeRange?: TimeRange; filterByMapExtent?: boolean; isMovementSynchronized?: boolean; - - // Configuration item that are never persisted - // Putting in state as a temporary work around - isSharable?: boolean; - tooltipRenderer?: RenderToolTipContent; }; export type MapRuntimeState = MapSerializedState; From 9bbb296078ea385561d46819001644cdb4fdc714 Mon Sep 17 00:00:00 2001 From: Cee Chen <549407+cee-chen@users.noreply.github.com> Date: Mon, 23 Sep 2024 15:45:19 -0700 Subject: [PATCH 17/41] Upgrade EUI to v95.11.0 (#192756) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `v95.10.1`⏩`v95.11.0` > [!note] > The bulk of this release is **EuiDataGrid**. The component has been fully converted to Emotion, and several UX changes have been made to data cell actions. We recommend QA testing any data grid(s) that have custom styles applied to them. _[Questions? Please see our Kibana upgrade FAQ.](https://github.com/elastic/eui/blob/main/wiki/eui-team-processes/upgrading-kibana.md#faq-for-kibana-teams)_ --- ## [`v95.11.0`](https://github.com/elastic/eui/releases/v95.11.0) - Updated `EuiText`, `EuiTextColor`, and `EuiTextAlign` with a new `component` prop that allows changing the default rendered `
` wrapper to a `` or `

` tag. ([#7993](https://github.com/elastic/eui/pull/7993)) - Updated `EuiDataGrid`'s cell actions to always consistently be left-aligned, regardless of text content alignment ([#8011](https://github.com/elastic/eui/pull/8011)) - Increased `EuiDataGrid`'s cell actions hover zone to reduce UX friction when mousing over from the grid cell to its actions ([#8011](https://github.com/elastic/eui/pull/8011)) **Bug fixes** - Fixed `EuiPopover` to correctly inherit from `EuiProvider`'s `componentDefaults.EuiPortal.insert` ([#8003](https://github.com/elastic/eui/pull/8003)) - Fixed push `EuiFlyoutResizable`s to not potentially block scrollbars on outside content ([#8010](https://github.com/elastic/eui/pull/8010)) - Fixed an `EuiDataGrid` bug where the `setCellProps` callback passed by `renderCellValue` was not correctly applying custom `data-test-subj`s ([#8011](https://github.com/elastic/eui/pull/8011)) **Accessibility** - Updated the `EuiBasicTable` actions button's `aria-label` by adding a reference to the current row ([#7994](https://github.com/elastic/eui/pull/7994)) **CSS-in-JS conversions** - Converted `EuiDataGrid`'s toolbar controls to Emotion ([#7997](https://github.com/elastic/eui/pull/7997)) - Removed `$euiDataGridPopoverMaxHeight` - Converted `EuiDataGrid` to Emotion ([#7998](https://github.com/elastic/eui/pull/7998)) - Removed `$euiZDataGrid` - Removed `$euiZHeaderBelowDataGrid` - Converted `EuiDataGrid`'s `gridStyle`s to Emotion; Removed the following Sass variables and mixins: ([#8006](https://github.com/elastic/eui/pull/8006)) - `$euiDataGridCellPaddingS` - `$euiDataGridCellPaddingM` - `$euiDataGridCellPaddingL` - `$euiDataGridVerticalBorder` - `$euiDataGridPrefix` - `$euiDataGridStyles` - `@euiDataGridSelector` - `@euiDataGridStyles` - Converted `EuiDataGrid`'s cell popover, actions, and focus outline to Emotion; Removed the following Sass variables and mixins: ([#8011](https://github.com/elastic/eui/pull/8011)) - `$euiZDataGridCellPopover` - `@euiDataGridCellFocus` - Converted `EuiDataGrid`'s row, header, and footer cells to Emotion; Removed the following Sass variables and mixins: ([#8013](https://github.com/elastic/eui/pull/8013)) - `$euiDataGridColumnResizerWidth` - `@euiDataGridRowCell` - `@euiDataGridHeaderCell` - `@euiDataGridFooterCell` --- package.json | 2 +- .../__snapshots__/i18n_service.test.tsx.snap | 4 +- .../src/i18n_eui_mapping.tsx | 25 ++++++++--- .../src/components/data_table.scss | 33 ++++---------- src/dev/license_checker/config.ts | 2 +- .../components/doc_viewer_table/table.scss | 4 +- .../apps/discover/esql/_esql_view.ts | 2 +- test/functional/services/data_grid.ts | 33 +++++++++----- .../components/data_table/index.test.tsx | 4 +- .../datatable/components/table_basic.test.tsx | 22 +++++----- .../slo/public/pages/slos/slos.test.tsx | 10 ++--- .../query_tab_unified_components.test.tsx | 32 +++----------- .../unified_components/index.test.tsx | 44 ++++--------------- .../translations/translations/fr-FR.json | 3 +- .../translations/translations/ja-JP.json | 3 +- .../translations/translations/zh-CN.json | 3 +- .../alerts_table/alerts_table_state.test.tsx | 4 +- .../test/functional/apps/lens/group2/table.ts | 4 +- .../apps/lens/group2/table_dashboard.ts | 2 +- .../test/functional/page_objects/lens_page.ts | 15 ++----- .../services/ml/common_data_grid.ts | 16 +++---- .../common/discover/esql/_esql_view.ts | 2 +- yarn.lock | 8 ++-- 23 files changed, 113 insertions(+), 164 deletions(-) diff --git a/package.json b/package.json index ea24d9016a81c..1aec2e615a1be 100644 --- a/package.json +++ b/package.json @@ -115,7 +115,7 @@ "@elastic/ecs": "^8.11.1", "@elastic/elasticsearch": "^8.15.0", "@elastic/ems-client": "8.5.3", - "@elastic/eui": "95.10.1", + "@elastic/eui": "95.11.0", "@elastic/filesaver": "1.1.2", "@elastic/node-crypto": "1.2.1", "@elastic/numeral": "^2.5.1", diff --git a/packages/core/i18n/core-i18n-browser-internal/src/__snapshots__/i18n_service.test.tsx.snap b/packages/core/i18n/core-i18n-browser-internal/src/__snapshots__/i18n_service.test.tsx.snap index 2285da518ce29..23a5239116c98 100644 --- a/packages/core/i18n/core-i18n-browser-internal/src/__snapshots__/i18n_service.test.tsx.snap +++ b/packages/core/i18n/core-i18n-browser-internal/src/__snapshots__/i18n_service.test.tsx.snap @@ -35,8 +35,9 @@ exports[`#start() returns \`Context\` component 1`] = ` "euiCodeBlockCopy.copy": "Copy", "euiCodeBlockFullScreen.fullscreenCollapse": "Collapse", "euiCodeBlockFullScreen.fullscreenExpand": "Expand", - "euiCollapsedItemActions.allActions": "All actions", + "euiCollapsedItemActions.allActions": [Function], "euiCollapsedItemActions.allActionsDisabled": "Individual item actions are disabled when rows are being selected.", + "euiCollapsedItemActions.allActionsTooltip": "All actions", "euiCollapsedNavButton.ariaLabelButtonIcon": [Function], "euiCollapsibleNavBeta.ariaLabel": "Site menu", "euiCollapsibleNavButton.ariaLabelClose": "Close navigation", @@ -58,6 +59,7 @@ exports[`#start() returns \`Context\` component 1`] = ` "euiColumnActions.moveLeft": "Move left", "euiColumnActions.moveRight": "Move right", "euiColumnActions.sort": [Function], + "euiColumnActions.unsort": [Function], "euiColumnSelector.button": "Columns", "euiColumnSelector.dragHandleAriaLabel": "Drag handle", "euiColumnSelector.hideAll": "Hide all", diff --git a/packages/core/i18n/core-i18n-browser-internal/src/i18n_eui_mapping.tsx b/packages/core/i18n/core-i18n-browser-internal/src/i18n_eui_mapping.tsx index c81aca1e5b4e6..3fa687fddd9da 100644 --- a/packages/core/i18n/core-i18n-browser-internal/src/i18n_eui_mapping.tsx +++ b/packages/core/i18n/core-i18n-browser-internal/src/i18n_eui_mapping.tsx @@ -163,12 +163,18 @@ export const getEuiContextMapping = (): EuiTokensObject => { description: 'ARIA label for a button that enters fullscreen view', } ), - 'euiCollapsedItemActions.allActions': i18n.translate( - 'core.euiCollapsedItemActions.allActions', + 'euiCollapsedItemActions.allActions': ({ index }: EuiValues) => + i18n.translate('core.euiCollapsedItemActions.allActions', { + defaultMessage: 'All actions, row {index}', + values: { index }, + description: + 'ARIA label for a button that is rendered on multiple table rows, that expands an actions menu', + }), + 'euiCollapsedItemActions.allActionsTooltip': i18n.translate( + 'core.euiCollapsedItemActions.allActionsTooltip', { defaultMessage: 'All actions', - description: - 'ARIA label and tooltip content describing a button that expands an actions menu', + description: 'Tooltip content describing a button that expands an actions menu', } ), 'euiCollapsedItemActions.allActionsDisabled': i18n.translate( @@ -251,6 +257,11 @@ export const getEuiContextMapping = (): EuiTokensObject => { defaultMessage: 'Sort {schemaLabel}', values: { schemaLabel }, }), + 'euiColumnActions.unsort': ({ schemaLabel }: EuiValues) => + i18n.translate('core.euiColumnActions.unsort', { + defaultMessage: 'Unsort {schemaLabel}', + values: { schemaLabel }, + }), 'euiColumnActions.moveLeft': i18n.translate('core.euiColumnActions.moveLeft', { defaultMessage: 'Move left', }), @@ -529,10 +540,10 @@ export const getEuiContextMapping = (): EuiTokensObject => { values: { page, pageCount }, description: 'Screen reader text to describe the size of the data grid', }), - 'euiDataGridCell.position': ({ columnId, row, col }: EuiValues) => + 'euiDataGridCell.position': ({ columnName, columnIndex, rowIndex }: EuiValues) => i18n.translate('core.euiDataGridCell.position', { - defaultMessage: '{columnId}, column {col}, row {row}', - values: { columnId, row, col }, + defaultMessage: '{columnName}, column {columnIndex}, row {rowIndex}', + values: { columnName, columnIndex, rowIndex }, }), 'euiDataGridCell.expansionEnterPrompt': i18n.translate( 'core.euiDataGridCell.expansionEnterPrompt', diff --git a/packages/kbn-unified-data-table/src/components/data_table.scss b/packages/kbn-unified-data-table/src/components/data_table.scss index 44801b4052dfe..5bf8773db9c0b 100644 --- a/packages/kbn-unified-data-table/src/components/data_table.scss +++ b/packages/kbn-unified-data-table/src/components/data_table.scss @@ -43,13 +43,16 @@ .euiDataGridHeaderCell { align-items: start; - &:not(.euiDataGridHeaderCell--controlColumn) .euiDataGridHeaderCell__button { - height: 100%; - align-items: flex-start; + .euiPopover[class*='euiDataGridHeaderCell__popover'] { + align-self: center; } } - .euiDataGrid--headerUnderline .euiDataGridHeaderCell { + .euiDataGrid--bordersHorizontal .euiDataGridHeader { + border-top: none; + } + + .euiDataGrid--headerUnderline .euiDataGridHeader { border-bottom: $euiBorderThin; } @@ -93,7 +96,8 @@ } .euiDataGridRowCell__content--autoHeight, - .euiDataGridRowCell__content--lineCountHeight { + .euiDataGridRowCell__content--lineCountHeight, + .euiDataGridHeaderCell__content { white-space: pre-wrap; } } @@ -104,25 +108,6 @@ min-height: 0; } -// We only truncate if the cell is not a control column. -.euiDataGridHeader { - - .euiDataGridHeaderCell__content { - white-space: pre-wrap; - } - - .euiDataGridHeaderCell__popover { - flex-grow: 0; - flex-basis: auto; - width: auto; - padding-left: $euiSizeXS; - } -} - -.euiDataGridRowCell--numeric { - text-align: right; -} - .euiDataGrid__loading, .euiDataGrid__noResults { display: flex; diff --git a/src/dev/license_checker/config.ts b/src/dev/license_checker/config.ts index 7f6a9e53f6678..df5da2aff7183 100644 --- a/src/dev/license_checker/config.ts +++ b/src/dev/license_checker/config.ts @@ -87,7 +87,7 @@ 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.5.3': ['Elastic License 2.0'], - '@elastic/eui@95.10.1': ['Elastic License 2.0 OR AGPL-3.0-only OR SSPL-1.0'], + '@elastic/eui@95.11.0': ['Elastic License 2.0 OR AGPL-3.0-only OR SSPL-1.0'], 'language-subtag-registry@0.3.21': ['CC-BY-4.0'], // retired ODC‑By license https://github.com/mattcg/language-subtag-registry 'buffers@0.1.1': ['MIT'], // license in importing module https://www.npmjs.com/package/binary '@bufbuild/protobuf@1.2.1': ['Apache-2.0'], // license (Apache-2.0 AND BSD-3-Clause) diff --git a/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/table.scss b/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/table.scss index 330cf364ae55e..25a41710e4818 100644 --- a/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/table.scss +++ b/src/plugins/unified_doc_viewer/public/components/doc_viewer_table/table.scss @@ -68,11 +68,11 @@ } .kbnDocViewer__fieldsGrid { - &.euiDataGrid--noControls.euiDataGrid--bordersHorizontal .euiDataGridHeaderCell { + &.euiDataGrid--noControls.euiDataGrid--bordersHorizontal .euiDataGridHeader { border-top: none; } - &.euiDataGrid--headerUnderline .euiDataGridHeaderCell { + &.euiDataGrid--headerUnderline .euiDataGridHeader { border-bottom: $euiBorderThin; } diff --git a/test/functional/apps/discover/esql/_esql_view.ts b/test/functional/apps/discover/esql/_esql_view.ts index 01660925db799..98bf29b187402 100644 --- a/test/functional/apps/discover/esql/_esql_view.ts +++ b/test/functional/apps/discover/esql/_esql_view.ts @@ -199,7 +199,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const cell = await dataGrid.getCellElementExcludingControlColumns(0, 1); expect(await cell.getVisibleText()).to.be(' - '); expect(await dataGrid.getHeaders()).to.eql([ - 'Select column', + "Select columnPress the Enter key to interact with this cell's contents.", // contains screen reader help text 'Control column', 'Access to degraded docs', 'Access to available stacktraces', diff --git a/test/functional/services/data_grid.ts b/test/functional/services/data_grid.ts index a280c6556bbd7..c5c8db4a9886b 100644 --- a/test/functional/services/data_grid.ts +++ b/test/functional/services/data_grid.ts @@ -34,7 +34,7 @@ export class DataGridService extends FtrService { const table = await this.find.byCssSelector('.euiDataGrid'); const $ = await table.parseDomContent(); - const columns = $('.euiDataGridHeaderCell__content') + const columns = $('.euiDataGridHeaderCell') .toArray() .map((cell) => $(cell).text()); const cells = $.findTestSubjects('dataGridRowCell') @@ -59,7 +59,7 @@ export class DataGridService extends FtrService { cellDataTestSubj: string ): Promise { const $ = await element.parseDomContent(); - const columnNumber = $('.euiDataGridHeaderCell__content').length; + const columnNumber = $('.euiDataGridHeaderCell').length; const cells = $.findTestSubjects('dataGridRowCell') .toArray() .map((cell) => @@ -79,7 +79,7 @@ export class DataGridService extends FtrService { public async getHeaders() { const header = await this.testSubjects.find('euiDataGridBody > dataGridHeader'); const $ = await header.parseDomContent(); - return $('.euiDataGridHeaderCell__content') + return $('.euiDataGridHeaderCell') .toArray() .map((cell) => $(cell).text()); } @@ -134,6 +134,7 @@ export class DataGridService extends FtrService { let actionButton: WebElementWrapper | undefined; await this.retry.try(async () => { const cell = await this.getCellElement(rowIndex, columnIndex); + await cell.moveMouseTo(); await cell.click(); actionButton = await cell.findByTestSubject(selector); if (!actionButton) { @@ -154,6 +155,7 @@ export class DataGridService extends FtrService { columnIndex, 'euiDataGridCellExpandButton' ); + await actionButton.moveMouseTo(); await actionButton.click(); await this.retry.waitFor('popover to be opened', async () => { return await this.testSubjects.exists('euiDataGridExpansionPopover'); @@ -197,6 +199,7 @@ export class DataGridService extends FtrService { */ public async clickCellFilterForButton(rowIndex: number = 0, columnIndex: number = 0) { const actionButton = await this.getCellActionButton(rowIndex, columnIndex, 'filterForButton'); + await actionButton.moveMouseTo(); await actionButton.click(); } @@ -215,11 +218,13 @@ export class DataGridService extends FtrService { controlsCount + columnIndex, 'filterForButton' ); + await actionButton.moveMouseTo(); await actionButton.click(); } public async clickCellFilterOutButton(rowIndex: number = 0, columnIndex: number = 0) { const actionButton = await this.getCellActionButton(rowIndex, columnIndex, 'filterOutButton'); + await actionButton.moveMouseTo(); await actionButton.click(); } @@ -233,6 +238,7 @@ export class DataGridService extends FtrService { controlsCount + columnIndex, 'filterOutButton' ); + await actionButton.moveMouseTo(); await actionButton.click(); } @@ -374,6 +380,7 @@ export class DataGridService extends FtrService { if (toggle) { await toggle.scrollIntoViewIfNecessary(); + await toggle.moveMouseTo(); await toggle.click(); await this.retry.waitFor('doc viewer to open', async () => { return this.isShowingDocViewer(); @@ -402,9 +409,7 @@ export class DataGridService extends FtrService { } public async getHeaderFields(): Promise { - const result = await this.find.allByCssSelector( - '.euiDataGridHeaderCell:not(.euiDataGridHeaderCell--controlColumn) .euiDataGridHeaderCell__content' - ); + const result = await this.find.allByCssSelector('.euiDataGridHeaderCell__content'); const textArr = []; for (const cell of result) { @@ -415,9 +420,7 @@ export class DataGridService extends FtrService { } public async getControlColumnHeaderFields(): Promise { - const result = await this.find.allByCssSelector( - '.euiDataGridHeaderCell--controlColumn .euiDataGridHeaderCell__content' - ); + const result = await this.find.allByCssSelector('.euiDataGridHeaderCell--controlColumn'); const textArr = []; for (const cell of result) { @@ -628,7 +631,9 @@ export class DataGridService extends FtrService { const cellSelector = ['addFilterForValueButton', 'addFilterOutValueButton'].includes(actionName) ? `tableDocViewRow-${fieldName}-value` : `tableDocViewRow-${fieldName}-name`; + await this.testSubjects.moveMouseTo(cellSelector); await this.testSubjects.click(cellSelector); + await this.retry.waitFor('grid cell actions to appear', async () => { return this.testSubjects.exists(`${actionName}-${fieldName}`); }); @@ -636,7 +641,10 @@ export class DataGridService extends FtrService { public async clickFieldActionInFlyout(fieldName: string, actionName: string): Promise { await this.showFieldCellActionInFlyout(fieldName, actionName); - await this.testSubjects.click(`${actionName}-${fieldName}`); + + const actionSelector = `${actionName}-${fieldName}`; + await this.testSubjects.moveMouseTo(actionSelector); + await this.testSubjects.click(actionSelector); } public async isFieldPinnedInFlyout(fieldName: string): Promise { @@ -658,11 +666,14 @@ export class DataGridService extends FtrService { } public async expandFieldNameCellInFlyout(fieldName: string): Promise { + const cellSelector = `tableDocViewRow-${fieldName}-name`; const buttonSelector = 'euiDataGridCellExpandButton'; - await this.testSubjects.click(`tableDocViewRow-${fieldName}-name`); + await this.testSubjects.moveMouseTo(cellSelector); + await this.testSubjects.click(cellSelector); await this.retry.waitFor('grid cell actions to appear', async () => { return this.testSubjects.exists(buttonSelector); }); + await this.testSubjects.moveMouseTo(buttonSelector); await this.testSubjects.click(buttonSelector); } diff --git a/x-pack/packages/security-solution/data_table/components/data_table/index.test.tsx b/x-pack/packages/security-solution/data_table/components/data_table/index.test.tsx index f8183c51e4678..7a0a3e8f76caa 100644 --- a/x-pack/packages/security-solution/data_table/components/data_table/index.test.tsx +++ b/x-pack/packages/security-solution/data_table/components/data_table/index.test.tsx @@ -139,9 +139,9 @@ describe('DataTable', () => { wrapper.update(); expect( wrapper - .find('[data-test-subj="dataGridRowCell"]') + .find('div[data-test-subj="dataGridRowCell"]') .at(0) - .find('.euiDataGridRowCell__content') + .find('div.euiDataGridRowCell__content') .childAt(0) .text() ).toEqual(mockTimelineData[0].ecs.timestamp); diff --git a/x-pack/plugins/lens/public/visualizations/datatable/components/table_basic.test.tsx b/x-pack/plugins/lens/public/visualizations/datatable/components/table_basic.test.tsx index 7ca9137f938fb..21361f874e83e 100644 --- a/x-pack/plugins/lens/public/visualizations/datatable/components/table_basic.test.tsx +++ b/x-pack/plugins/lens/public/visualizations/datatable/components/table_basic.test.tsx @@ -141,9 +141,9 @@ describe('DatatableComponent', () => { expect(screen.getByLabelText('My fanci metric chart')).toBeInTheDocument(); expect(screen.getByRole('row')).toBeInTheDocument(); expect(screen.queryAllByRole('gridcell').map((cell) => cell.textContent)).toEqual([ - 'shoes- a, column 1, row 1', - '1588024800000- b, column 2, row 1', - '3- c, column 3, row 1', + 'shoes', + '1588024800000', + '3', ]); }); @@ -352,8 +352,8 @@ describe('DatatableComponent', () => { }, }); expect(screen.queryAllByRole('gridcell').map((cell) => cell.textContent)).toEqual([ - '1588024800000- b, column 1, row 1', - '3- c, column 2, row 1', + '1588024800000', + '3', ]); }); @@ -698,9 +698,9 @@ describe('DatatableComponent', () => { .map((cell) => [cell.textContent, cell.style.backgroundColor]); expect(cellColors).toEqual([ - ['shoes- a, column 1, row 1', 'red'], - ['1588024800000- b, column 2, row 1', ''], - ['3- c, column 3, row 1', ''], + ['shoes', 'red'], + ['1588024800000', ''], + ['3', ''], ]); }); @@ -717,9 +717,9 @@ describe('DatatableComponent', () => { .map((cell) => [cell.textContent, cell.style.backgroundColor]); expect(cellColors).toEqual([ - ['shoes- a, column 1, row 1', ''], - ['1588024800000- b, column 2, row 1', ''], - ['3- c, column 3, row 1', 'red'], + ['shoes', ''], + ['1588024800000', ''], + ['3', 'red'], ]); }); }); diff --git a/x-pack/plugins/observability_solution/slo/public/pages/slos/slos.test.tsx b/x-pack/plugins/observability_solution/slo/public/pages/slos/slos.test.tsx index f8db25d20c9f2..905e6088ef74b 100644 --- a/x-pack/plugins/observability_solution/slo/public/pages/slos/slos.test.tsx +++ b/x-pack/plugins/observability_solution/slo/public/pages/slos/slos.test.tsx @@ -285,7 +285,7 @@ describe('SLOs Page', () => { expect(await screen.findByTestId('compactView')).toBeTruthy(); fireEvent.click(screen.getByTestId('compactView')); - (await screen.findAllByLabelText('All actions')).at(0)?.click(); + (await screen.findByLabelText('All actions, row 1')).click(); await waitForEuiPopoverOpen(); @@ -311,7 +311,7 @@ describe('SLOs Page', () => { }); expect(await screen.findByTestId('compactView')).toBeTruthy(); fireEvent.click(screen.getByTestId('compactView')); - screen.getAllByLabelText('All actions').at(0)?.click(); + screen.getByLabelText('All actions, row 1').click(); await waitForEuiPopoverOpen(); @@ -337,7 +337,7 @@ describe('SLOs Page', () => { }); expect(await screen.findByTestId('compactView')).toBeTruthy(); fireEvent.click(screen.getByTestId('compactView')); - screen.getAllByLabelText('All actions').at(0)?.click(); + screen.getByLabelText('All actions, row 1').click(); await waitForEuiPopoverOpen(); @@ -364,7 +364,7 @@ describe('SLOs Page', () => { expect(await screen.findByTestId('compactView')).toBeTruthy(); fireEvent.click(screen.getByTestId('compactView')); - (await screen.findAllByLabelText('All actions')).at(0)?.click(); + screen.getByLabelText('All actions, row 1').click(); await waitForEuiPopoverOpen(); @@ -396,7 +396,7 @@ describe('SLOs Page', () => { expect(await screen.findByTestId('compactView')).toBeTruthy(); fireEvent.click(screen.getByTestId('compactView')); - screen.getAllByLabelText('All actions').at(0)?.click(); + screen.getByLabelText('All actions, row 1').click(); await waitForEuiPopoverOpen(); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/query/query_tab_unified_components.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/query/query_tab_unified_components.test.tsx index bd8a002666aaf..f70f4e1f261f2 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/query/query_tab_unified_components.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/tabs/query/query_tab_unified_components.test.tsx @@ -383,11 +383,7 @@ describe('query tab with unified timeline', () => { expect(container.querySelector('[data-gridcell-column-id="message"]')).toBeInTheDocument(); - fireEvent.click( - container.querySelector( - '[data-gridcell-column-id="message"] .euiDataGridHeaderCell__icon' - ) as HTMLElement - ); + fireEvent.click(screen.getByTestId('dataGridHeaderCellActionButton-message')); await waitFor(() => { expect(screen.getByTitle('Move left')).toBeEnabled(); @@ -416,11 +412,7 @@ describe('query tab with unified timeline', () => { expect(container.querySelector('[data-gridcell-column-id="message"]')).toBeInTheDocument(); - fireEvent.click( - container.querySelector( - '[data-gridcell-column-id="message"] .euiDataGridHeaderCell__icon' - ) as HTMLElement - ); + fireEvent.click(screen.getByTestId('dataGridHeaderCellActionButton-message')); await waitFor(() => { expect(screen.getByTitle('Remove column')).toBeVisible(); @@ -449,16 +441,12 @@ describe('query tab with unified timeline', () => { container.querySelector('[data-gridcell-column-id="@timestamp"]') ).toBeInTheDocument(); - fireEvent.click( - container.querySelector( - '[data-gridcell-column-id="@timestamp"] .euiDataGridHeaderCell__icon' - ) as HTMLElement - ); + fireEvent.click(screen.getByTestId('dataGridHeaderCellActionButton-@timestamp')); await waitFor(() => { expect(screen.getByTitle('Sort Old-New')).toBeVisible(); }); - expect(screen.getByTitle('Sort New-Old')).toBeVisible(); + expect(screen.getByTitle('Unsort New-Old')).toBeVisible(); useTimelineEventsMock.mockClear(); @@ -495,11 +483,7 @@ describe('query tab with unified timeline', () => { container.querySelector('[data-gridcell-column-id="host.name"]') ).toBeInTheDocument(); - fireEvent.click( - container.querySelector( - '[data-gridcell-column-id="host.name"] .euiDataGridHeaderCell__icon' - ) as HTMLElement - ); + fireEvent.click(screen.getByTestId('dataGridHeaderCellActionButton-host.name')); await waitFor(() => { expect(screen.getByTestId('dataGridHeaderCellActionGroup-host.name')).toBeVisible(); @@ -554,11 +538,7 @@ describe('query tab with unified timeline', () => { container.querySelector(`[data-gridcell-column-id="${field.name}"]`) ).toBeInTheDocument(); - fireEvent.click( - container.querySelector( - `[data-gridcell-column-id="${field.name}"] .euiDataGridHeaderCell__icon` - ) as HTMLElement - ); + fireEvent.click(screen.getByTestId(`dataGridHeaderCellActionButton-${field.name}`)); await waitFor(() => { expect(screen.getByTestId(`dataGridHeaderCellActionGroup-${field.name}`)).toBeVisible(); diff --git a/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/index.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/index.test.tsx index b1f05281de803..c50c2877e2fe1 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/index.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/timeline/unified_components/index.test.tsx @@ -239,11 +239,7 @@ describe('unified timeline', () => { container.querySelector(`[data-gridcell-column-id="${field.name}"]`) ).toBeInTheDocument(); - fireEvent.click( - container.querySelector( - `[data-gridcell-column-id="${field.name}"] .euiDataGridHeaderCell__icon` - ) as HTMLElement - ); + fireEvent.click(screen.getByTestId(`dataGridHeaderCellActionButton-${field.name}`)); await waitFor(() => { expect(screen.getByTitle('Move left')).toBeEnabled(); @@ -278,11 +274,7 @@ describe('unified timeline', () => { container.querySelector(`[data-gridcell-column-id="${field.name}"]`) ).toBeInTheDocument(); - fireEvent.click( - container.querySelector( - `[data-gridcell-column-id="${field.name}"] .euiDataGridHeaderCell__icon` - ) as HTMLElement - ); + fireEvent.click(screen.getByTestId(`dataGridHeaderCellActionButton-${field.name}`)); await waitFor(() => { expect(screen.getByTitle('Move right')).toBeEnabled(); @@ -314,11 +306,7 @@ describe('unified timeline', () => { container.querySelector(`[data-gridcell-column-id="${field.name}"]`) ).toBeInTheDocument(); - fireEvent.click( - container.querySelector( - `[data-gridcell-column-id="${field.name}"] .euiDataGridHeaderCell__icon` - ) as HTMLElement - ); + fireEvent.click(screen.getByTestId(`dataGridHeaderCellActionButton-${field.name}`)); // column is currently present in the state const currentColumns = getTimelineFromStore(customStore).columns; @@ -363,16 +351,12 @@ describe('unified timeline', () => { container.querySelector('[data-gridcell-column-id="@timestamp"]') ).toBeInTheDocument(); - fireEvent.click( - container.querySelector( - '[data-gridcell-column-id="@timestamp"] .euiDataGridHeaderCell__icon' - ) as HTMLElement - ); + fireEvent.click(screen.getByTestId('dataGridHeaderCellActionButton-@timestamp')); await waitFor(() => { expect(screen.getByTitle('Sort Old-New')).toBeVisible(); }); - expect(screen.getByTitle('Sort New-Old')).toBeVisible(); + expect(screen.getByTitle('Unsort New-Old')).toBeVisible(); useTimelineEventsMock.mockClear(); @@ -404,11 +388,7 @@ describe('unified timeline', () => { container.querySelector('[data-gridcell-column-id="host.name"]') ).toBeInTheDocument(); - fireEvent.click( - container.querySelector( - '[data-gridcell-column-id="host.name"] .euiDataGridHeaderCell__icon' - ) as HTMLElement - ); + fireEvent.click(screen.getByTestId('dataGridHeaderCellActionButton-host.name')); await waitFor(() => { expect(screen.getByTestId('dataGridHeaderCellActionGroup-host.name')).toBeVisible(); @@ -457,11 +437,7 @@ describe('unified timeline', () => { container.querySelector(`[data-gridcell-column-id="${field.name}"]`) ).toBeInTheDocument(); - fireEvent.click( - container.querySelector( - `[data-gridcell-column-id="${field.name}"] .euiDataGridHeaderCell__icon` - ) as HTMLElement - ); + fireEvent.click(screen.getByTestId(`dataGridHeaderCellActionButton-${field.name}`)); await waitFor(() => { expect(screen.getByTestId(`dataGridHeaderCellActionGroup-${field.name}`)).toBeVisible(); @@ -512,11 +488,7 @@ describe('unified timeline', () => { container.querySelector(`[data-gridcell-column-id="${field.name}"]`) ).toBeInTheDocument(); - fireEvent.click( - container.querySelector( - `[data-gridcell-column-id="${field.name}"] .euiDataGridHeaderCell__icon` - ) as HTMLElement - ); + fireEvent.click(screen.getByTestId(`dataGridHeaderCellActionButton-${field.name}`)); await waitFor(() => { expect(screen.getByTitle('Edit data view field')).toBeEnabled(); diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index d2891900a2503..a14f2ce6d398d 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -626,7 +626,6 @@ "core.euiCodeBlockCopy.copy": "Copier", "core.euiCodeBlockFullScreen.fullscreenCollapse": "Réduire", "core.euiCodeBlockFullScreen.fullscreenExpand": "Développer", - "core.euiCollapsedItemActions.allActions": "Toutes les actions", "core.euiCollapsedItemActions.allActionsDisabled": "Les actions individuelles sont désactivées lorsque plusieurs lignes sont sélectionnées.", "core.euiCollapsedNavButton.ariaLabelButtonIcon": "{title}, menu de navigation rapide", "core.euiCollapsibleNavBeta.ariaLabel": "Menu du site", @@ -681,7 +680,7 @@ "core.euiDataGrid.screenReaderNotice": "Cette cellule contient du contenu interactif.", "core.euiDataGridCell.expansionEnterPrompt": "Appuyez sur Entrée pour développer cette cellule.", "core.euiDataGridCell.focusTrapEnterPrompt": "Appuyez sur Entrée pour interagir avec le contenu de cette cellule.", - "core.euiDataGridCell.position": "{columnId}, colonne {col}, ligne {row}", + "core.euiDataGridCell.position": "{columnName}, colonne {columnIndex}, ligne {rowIndex}", "core.euiDataGridCellActions.expandButtonTitle": "Cliquez ou appuyez sur Entrée pour interagir avec le contenu de la cellule.", "core.euiDataGridHeaderCell.actionsButtonAriaLabel": "{title}. Cliquez pour afficher les actions d'en-tête de colonne", "core.euiDataGridHeaderCell.actionsPopoverScreenReaderText": "Pour naviguer dans la liste des actions de la colonne, appuyez sur la touche Tab ou sur les flèches vers le haut et vers le bas.", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 368ffa47cec39..5184bf3718ef6 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -628,7 +628,6 @@ "core.euiCodeBlockCopy.copy": "コピー", "core.euiCodeBlockFullScreen.fullscreenCollapse": "縮小", "core.euiCodeBlockFullScreen.fullscreenExpand": "拡張", - "core.euiCollapsedItemActions.allActions": "すべてのアクション", "core.euiCollapsedItemActions.allActionsDisabled": "行が選択されているときには、個別の項目アクションは無効です。", "core.euiCollapsedNavButton.ariaLabelButtonIcon": "{title}、クイックナビゲーションメニュー", "core.euiCollapsibleNavBeta.ariaLabel": "サイトメニュー", @@ -683,7 +682,7 @@ "core.euiDataGrid.screenReaderNotice": "セルにはインタラクティブコンテンツが含まれます。", "core.euiDataGridCell.expansionEnterPrompt": "このセルを展開するには、Enterキーを押してください。", "core.euiDataGridCell.focusTrapEnterPrompt": "このセルの内容を操作するには、Enterキーを押してください。", - "core.euiDataGridCell.position": "{columnId}, 列{col}, 行{row}", + "core.euiDataGridCell.position": "{columnName}, 列{columnIndex}, 行{rowIndex}", "core.euiDataGridCellActions.expandButtonTitle": "クリックするか enter を押すと、セルのコンテンツとインタラクトできます。", "core.euiDataGridHeaderCell.actionsButtonAriaLabel": "{title}。クリックすると、列ヘッダーアクションが表示されます", "core.euiDataGridHeaderCell.actionsPopoverScreenReaderText": "列アクションのリストを移動するには、Tabまたは上下矢印キーを押します。", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 8ddfd9427e738..dcc0af6a008c3 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -626,7 +626,6 @@ "core.euiCodeBlockCopy.copy": "复制", "core.euiCodeBlockFullScreen.fullscreenCollapse": "折叠", "core.euiCodeBlockFullScreen.fullscreenExpand": "展开", - "core.euiCollapsedItemActions.allActions": "所有操作", "core.euiCollapsedItemActions.allActionsDisabled": "正选择行时将禁用单个项目操作。", "core.euiCollapsedNavButton.ariaLabelButtonIcon": "{title},快速导航菜单", "core.euiCollapsibleNavBeta.ariaLabel": "站点菜单", @@ -681,7 +680,7 @@ "core.euiDataGrid.screenReaderNotice": "单元格包含交互内容。", "core.euiDataGridCell.expansionEnterPrompt": "按 Enter 键展开此单元格。", "core.euiDataGridCell.focusTrapEnterPrompt": "按 Enter 键与此单元格的内容进行交互。", - "core.euiDataGridCell.position": "{columnId},列 {col},行 {row}", + "core.euiDataGridCell.position": "{columnName},列 {columnIndex},行 {rowIndex}", "core.euiDataGridCellActions.expandButtonTitle": "单击或按 Enter 键以便与单元格内容进行交互", "core.euiDataGridHeaderCell.actionsButtonAriaLabel": "{title}。单击以查看列标题操作", "core.euiDataGridHeaderCell.actionsPopoverScreenReaderText": "要在列操作列表中导航,请按 Tab 键或向上和向下箭头键。", diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/alerts_table_state.test.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/alerts_table_state.test.tsx index 2834d9f7665f4..13b9433ce4b9e 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/alerts_table_state.test.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/alerts_table_state.test.tsx @@ -907,8 +907,8 @@ describe('AlertsTableState', () => { await waitFor(() => { expect(queryByTestId(`dataGridHeaderCell-${AlertsField.uuid}`)).not.toBe(null); expect( - getByTestId('dataGridHeader') - .querySelectorAll('.euiDataGridHeaderCell__content')[2] + queryByTestId(`dataGridHeaderCell-${AlertsField.uuid}`)! + .querySelector('.euiDataGridHeaderCell__content')! .getAttribute('title') ).toBe(AlertsField.uuid); }); diff --git a/x-pack/test/functional/apps/lens/group2/table.ts b/x-pack/test/functional/apps/lens/group2/table.ts index f98bb6328c3f9..7de5645b16b03 100644 --- a/x-pack/test/functional/apps/lens/group2/table.ts +++ b/x-pack/test/functional/apps/lens/group2/table.ts @@ -36,7 +36,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(await lens.getDatatableCellText(0, 0)).to.eql('169.228.188.120'); // Remove the sorting await retry.try(async () => { - await lens.changeTableSortingBy(0, 'none'); + await lens.changeTableSortingBy(0, 'descending'); await lens.waitForVisualization(); expect(await lens.isDatatableHeaderSorted(0)).to.eql(false); }); @@ -73,7 +73,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(await lens.getDatatableCellText(0, 0)).to.eql('169.228.188.120'); await retry.try(async () => { - await lens.changeTableSortingBy(4, 'none'); + await lens.changeTableSortingBy(4, 'descending'); await lens.waitForVisualization(); expect(await lens.isDatatableHeaderSorted(0)).to.eql(false); }); diff --git a/x-pack/test/functional/apps/lens/group2/table_dashboard.ts b/x-pack/test/functional/apps/lens/group2/table_dashboard.ts index ddbe8d4a1ff40..a877211030972 100644 --- a/x-pack/test/functional/apps/lens/group2/table_dashboard.ts +++ b/x-pack/test/functional/apps/lens/group2/table_dashboard.ts @@ -28,7 +28,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { expect(await lens.getDatatableCellText(0, 0)).to.eql('169.228.188.120'); // Remove the sorting await retry.try(async () => { - await lens.changeTableSortingBy(0, 'none'); + await lens.changeTableSortingBy(0, 'ascending'); await lens.waitForVisualization(); expect(await lens.isDatatableHeaderSorted(0)).to.eql(false); }); diff --git a/x-pack/test/functional/page_objects/lens_page.ts b/x-pack/test/functional/page_objects/lens_page.ts index 4b2ece9a7ca92..310f52f7e651b 100644 --- a/x-pack/test/functional/page_objects/lens_page.ts +++ b/x-pack/test/functional/page_objects/lens_page.ts @@ -1255,21 +1255,14 @@ export function LensPageProvider({ getService, getPageObjects }: FtrProviderCont ); }, - async changeTableSortingBy(colIndex = 0, direction: 'none' | 'ascending' | 'descending') { + async changeTableSortingBy(colIndex = 0, direction: 'ascending' | 'descending') { const el = await this.getDatatableHeader(colIndex); await el.moveMouseTo({ xOffset: 0, yOffset: -16 }); // Prevent the first data row's cell actions from overlapping/intercepting the header click const popoverToggle = await el.findByClassName('euiDataGridHeaderCell__button'); await popoverToggle.click(); - let buttonEl; - if (direction !== 'none') { - buttonEl = await find.byCssSelector( - `[data-test-subj^="dataGridHeaderCellActionGroup"] [title="Sort ${direction}"]` - ); - } else { - buttonEl = await find.byCssSelector( - `[data-test-subj^="dataGridHeaderCellActionGroup"] li[class*="selected"] [title^="Sort"]` - ); - } + const buttonEl = await find.byCssSelector( + `[data-test-subj^="dataGridHeaderCellActionGroup"] [title="Sort ${direction}"]` + ); return buttonEl.click(); }, diff --git a/x-pack/test/functional/services/ml/common_data_grid.ts b/x-pack/test/functional/services/ml/common_data_grid.ts index 9950d6b8f7205..a920b427e9adc 100644 --- a/x-pack/test/functional/services/ml/common_data_grid.ts +++ b/x-pack/test/functional/services/ml/common_data_grid.ts @@ -37,16 +37,14 @@ export function MachineLearningCommonDataGridProvider({ getService }: FtrProvide // Get the content of each cell and divide them up into rows. // Virtualized cells outside the view area are not present in the DOM until they // are scroilled into view, so we're limiting the number of parsed columns. - // To determine row and column of a cell, we're utilizing the screen reader - // help text, which enumerates the rows and columns 1-based. + // To determine row and column of a cell, we're utilizing EUI's data attributes const cells = $.findTestSubjects('dataGridRowCell') .toArray() .map((cell) => { const cellText = $(cell).text(); - const pattern = /^(.*)-(?:.*), column (\d+), row (\d+)$/; - const matches = cellText.match(pattern); - expect(matches).to.not.eql(null, `Cell text should match pattern '${pattern}'`); - return { text: matches![1], column: Number(matches![2]), row: Number(matches![3]) }; + const columnData = $(cell).attr('data-gridcell-column-index'); + const rowData = $(cell).attr('data-gridcell-row-index'); + return { text: cellText, column: Number(columnData) + 1, row: Number(rowData) }; }) .filter((cell) => maxColumnsToParse !== undefined ? cell?.column <= maxColumnsToParse : false @@ -150,9 +148,9 @@ export function MachineLearningCommonDataGridProvider({ getService }: FtrProvide async assertColumnSelectorsSwitchState(expectedState: boolean) { await retry.tryForTime(5 * 1000, async () => { - const visibilityToggles = await ( - await find.byClassName('euiDataGrid__controlScroll') - ).findAllByCssSelector('[role="switch"]'); + const visibilityToggles = await find.allByCssSelector( + '.euiDataGridColumnSelector__item [role="switch"]' + ); await asyncForEachWithLimit(visibilityToggles, 1, async (toggle) => { const checked = (await toggle.getAttribute('aria-checked')) === 'true'; diff --git a/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts b/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts index 1bedd0acd0cc4..7881f5545388f 100644 --- a/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts +++ b/x-pack/test_serverless/functional/test_suites/common/discover/esql/_esql_view.ts @@ -202,7 +202,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const cell = await dataGrid.getCellElementExcludingControlColumns(0, 1); expect(await cell.getVisibleText()).to.be(' - '); expect(await dataGrid.getHeaders()).to.eql([ - 'Select column', + "Select columnPress the Enter key to interact with this cell's contents.", // contains screen reader help text 'Control column', 'Access to degraded docs', 'Access to available stacktraces', diff --git a/yarn.lock b/yarn.lock index 11bae58bb6cfc..666bf8d3e984d 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1741,10 +1741,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@95.10.1": - version "95.10.1" - resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-95.10.1.tgz#f3fb356ad49ba45e42981e39748693ba392567fe" - integrity sha512-1kqyx/NfiQE/bKMf1E3uJEpYZnQnPBrI5zO0l2FB+fs7Naf7wT7zq1VFRzNLn/r1x6mnou8wJ+VlouHCI+prLw== +"@elastic/eui@95.11.0": + version "95.11.0" + resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-95.11.0.tgz#40e8124ac54c625ba7160cb84a378507abdeaf40" + integrity sha512-O688EbhrgSrV9j54mnK4xLyhv+imkBv5ti7isqLxJtd0L7Fe2A1d6EaA11Qv5plOwwC+cGsrkrDnlSqi1MtNoQ== dependencies: "@hello-pangea/dnd" "^16.6.0" "@types/lodash" "^4.14.202" From b3d28c8290891b42175c335ea22c550392bbca9c Mon Sep 17 00:00:00 2001 From: Cee Chen <549407+cee-chen@users.noreply.github.com> Date: Mon, 23 Sep 2024 17:04:45 -0700 Subject: [PATCH 18/41] [Unified Search] Remove soon-to-be-deprecated EuiFormControl Sass mixins (#193472) ## Summary As part of our ongoing transition towards CSS-in-JS, EUI is cleaning up and removing several publicly exported Sass mixins and variables with very low usage (0-1 usages across Kibana and Cloud) (full list in https://github.com/elastic/eui/pull/8031). This PR identifies and replaces one of them (`@euiFormControlWithIcon`) with their functional padding output equivalents (still using generic EUI Sass variables - there are no plans to immediately deprecate those). There should be **no UI regressions** in the unified search query bar compared to main, the right and left padding should remain the same: ### Checklist Delete any items that are not applicable to this PR. - [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) --- .../query_string_input/query_string_input.scss | 18 ++++++++---------- .../query_string_input/query_string_input.tsx | 1 + 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/src/plugins/unified_search/public/query_string_input/query_string_input.scss b/src/plugins/unified_search/public/query_string_input/query_string_input.scss index f0a682564fa0e..a8642ae0f9846 100644 --- a/src/plugins/unified_search/public/query_string_input/query_string_input.scss +++ b/src/plugins/unified_search/public/query_string_input/query_string_input.scss @@ -19,15 +19,20 @@ .kbnQueryBar__textarea { z-index: $euiZContentMenu; - resize: none !important; // When in the group, it will autosize height: $euiFormControlHeight; // Unlike most inputs within layout control groups, the text area still needs a border // for multi-line content. These adjusts help it sit above the control groups // shadow to line up correctly. - padding: ($euiSizeS + 2px) $euiSizeS $euiSizeS; + padding: $euiSizeS; + padding-top: $euiSizeS + 2px; + padding-left: $euiSizeXXL; // Account for search icon // Firefox adds margin to textarea margin: 0; + &--isClearable { + padding-right: $euiSizeXXL; // Account for clear button + } + &:not(.kbnQueryBar__textarea--autoHeight) { overflow-y: hidden; overflow-x: hidden; @@ -38,7 +43,6 @@ overflow-x: auto; overflow-y: auto; white-space: normal; - } &.kbnQueryBar__textarea--isSuggestionsVisible { @@ -46,12 +50,6 @@ border-bottom-left-radius: 0; } - &--isClearable { - @include euiFormControlWithIcon($isIconOptional: false, $side: 'right'); - } - - @include euiFormControlWithIcon($isIconOptional: true); - ~.euiFormControlLayoutIcons { // By default form control layout icon is vertically centered, but our textarea // can expand to be multi-line, so we position it with padding that matches @@ -67,4 +65,4 @@ margin-left: -1px; width: calc(100% + 1px); } -} \ No newline at end of file +} diff --git a/src/plugins/unified_search/public/query_string_input/query_string_input.tsx b/src/plugins/unified_search/public/query_string_input/query_string_input.tsx index f9862b736698e..2fc06e4aeaf53 100644 --- a/src/plugins/unified_search/public/query_string_input/query_string_input.tsx +++ b/src/plugins/unified_search/public/query_string_input/query_string_input.tsx @@ -830,6 +830,7 @@ export default class QueryStringInputUI extends PureComponent Date: Mon, 23 Sep 2024 19:30:52 -0500 Subject: [PATCH 19/41] [data views] Remove regex for creating dot notation (#193795) ## Summary Use basic string and array functions instead of regex to create short dot field names. --- src/plugins/data_views/common/fields/utils.ts | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/src/plugins/data_views/common/fields/utils.ts b/src/plugins/data_views/common/fields/utils.ts index 380493ed07668..23f0bf3a8651d 100644 --- a/src/plugins/data_views/common/fields/utils.ts +++ b/src/plugins/data_views/common/fields/utils.ts @@ -26,14 +26,22 @@ export const isMultiField = isDataViewFieldSubtypeMulti; export const getFieldSubtypeMulti = getDataViewFieldSubtypeMulti; export const getFieldSubtypeNested = getDataViewFieldSubtypeNested; -const DOT_PREFIX_RE = /(.).+?\./g; - /** * Convert a dot.notated.string into a short * version (d.n.string) */ export function shortenDottedString(input: string): string { - return typeof input !== 'string' ? input : input.replace(DOT_PREFIX_RE, '$1.'); + if (typeof input === 'string') { + const split = input.split('.'); + return split.reduce((acc, part, i) => { + if (i === split.length - 1) { + return acc + part; + } + return acc + part[0] + '.'; + }, ''); + } + + return input; } // Note - this code is duplicated from @kbn/es-query From 141a34579b5115b414e7ad06d583aa420e5c4552 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Tue, 24 Sep 2024 11:55:29 +1000 Subject: [PATCH 20/41] skip failing test suite (#193804) --- .../e2e/investigations/threat_intelligence/query_bar.cy.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/threat_intelligence/query_bar.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/threat_intelligence/query_bar.cy.ts index a7cefa41bc678..3dd0dd765fcc5 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/threat_intelligence/query_bar.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/threat_intelligence/query_bar.cy.ts @@ -32,7 +32,8 @@ import { login } from '../../../tasks/login'; const URL = '/app/security/threat_intelligence/indicators'; -describe('Indicators query bar interaction', { tags: ['@ess'] }, () => { +// Failing: See https://github.com/elastic/kibana/issues/193804 +describe.skip('Indicators query bar interaction', { tags: ['@ess'] }, () => { before(() => cy.task('esArchiverLoad', { archiveName: 'ti_indicators_data_multiple' })); after(() => cy.task('esArchiverUnload', { archiveName: 'ti_indicators_data_multiple' })); From 6db2fe6e26138e057070173c5ab884ff15c96d1a Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Tue, 24 Sep 2024 15:06:53 +1000 Subject: [PATCH 21/41] [api-docs] 2024-09-24 Daily api_docs build (#193813) Generated by https://buildkite.com/elastic/kibana-api-docs-daily/builds/840 --- api_docs/actions.mdx | 2 +- api_docs/advanced_settings.mdx | 2 +- .../ai_assistant_management_selection.mdx | 2 +- api_docs/aiops.mdx | 2 +- api_docs/alerting.mdx | 2 +- api_docs/apm.devdocs.json | 200 +++++- api_docs/apm.mdx | 4 +- api_docs/apm_data_access.devdocs.json | 18 +- api_docs/apm_data_access.mdx | 4 +- 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_data_migration.mdx | 2 +- api_docs/cloud_defend.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.devdocs.json | 192 +++++- api_docs/dashboard.mdx | 4 +- api_docs/dashboard_enhanced.mdx | 2 +- api_docs/data.mdx | 2 +- api_docs/data_quality.mdx | 2 +- api_docs/data_query.mdx | 2 +- api_docs/data_search.mdx | 2 +- api_docs/data_usage.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/dataset_quality.mdx | 2 +- api_docs/deprecations_by_api.mdx | 2 +- api_docs/deprecations_by_plugin.mdx | 10 +- 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/discover_shared.mdx | 2 +- api_docs/ecs_data_quality_dashboard.mdx | 2 +- api_docs/elastic_assistant.mdx | 2 +- api_docs/embeddable.devdocs.json | 12 +- 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/entities_data_access.mdx | 2 +- api_docs/entity_manager.mdx | 2 +- api_docs/es_ui_shared.mdx | 2 +- api_docs/esql.devdocs.json | 196 +++--- api_docs/esql.mdx | 2 +- api_docs/esql_data_grid.mdx | 2 +- api_docs/event_annotation.mdx | 2 +- api_docs/event_annotation_listing.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/fields_metadata.mdx | 2 +- api_docs/file_upload.mdx | 2 +- api_docs/files.mdx | 2 +- api_docs/files_management.mdx | 2 +- api_docs/fleet.mdx | 2 +- 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/inference.mdx | 2 +- api_docs/infra.mdx | 2 +- api_docs/ingest_pipelines.mdx | 2 +- api_docs/inspector.mdx | 2 +- api_docs/integration_assistant.mdx | 2 +- api_docs/interactive_setup.mdx | 2 +- api_docs/inventory.devdocs.json | 18 +- api_docs/inventory.mdx | 2 +- api_docs/investigate.mdx | 2 +- api_docs/investigate_app.mdx | 2 +- api_docs/kbn_ace.mdx | 2 +- api_docs/kbn_actions_types.mdx | 2 +- api_docs/kbn_aiops_components.mdx | 2 +- api_docs/kbn_aiops_log_pattern_analysis.mdx | 2 +- api_docs/kbn_aiops_log_rate_analysis.mdx | 2 +- .../kbn_alerting_api_integration_helpers.mdx | 2 +- api_docs/kbn_alerting_comparators.mdx | 2 +- api_docs/kbn_alerting_state_types.mdx | 2 +- api_docs/kbn_alerting_types.mdx | 2 +- api_docs/kbn_alerts_as_data_utils.mdx | 2 +- api_docs/kbn_alerts_grouping.mdx | 2 +- api_docs/kbn_alerts_ui_shared.mdx | 2 +- api_docs/kbn_analytics.mdx | 2 +- api_docs/kbn_analytics_collection_utils.mdx | 2 +- api_docs/kbn_apm_config_loader.mdx | 2 +- api_docs/kbn_apm_data_view.mdx | 2 +- api_docs/kbn_apm_synthtrace.mdx | 2 +- api_docs/kbn_apm_synthtrace_client.mdx | 2 +- api_docs/kbn_apm_types.mdx | 2 +- api_docs/kbn_apm_utils.mdx | 2 +- api_docs/kbn_avc_banner.mdx | 2 +- api_docs/kbn_axe_config.mdx | 2 +- api_docs/kbn_bfetch_error.mdx | 2 +- api_docs/kbn_calculate_auto.mdx | 2 +- .../kbn_calculate_width_from_char_count.mdx | 2 +- api_docs/kbn_cases_components.mdx | 2 +- api_docs/kbn_cbor.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_cloud_security_posture.mdx | 2 +- .../kbn_cloud_security_posture_common.mdx | 2 +- api_docs/kbn_code_editor.mdx | 2 +- api_docs/kbn_code_editor_mock.mdx | 2 +- api_docs/kbn_code_owners.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 +- ...ent_management_content_insights_public.mdx | 2 +- ...ent_management_content_insights_server.mdx | 2 +- ...bn_content_management_favorites_public.mdx | 2 +- ...bn_content_management_favorites_server.mdx | 2 +- ...tent_management_tabbed_table_list_view.mdx | 2 +- ...kbn_content_management_table_list_view.mdx | 2 +- ...tent_management_table_list_view_common.mdx | 2 +- ...ntent_management_table_list_view_table.mdx | 2 +- .../kbn_content_management_user_profiles.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_feature_flags_browser.mdx | 2 +- ...bn_core_feature_flags_browser_internal.mdx | 2 +- .../kbn_core_feature_flags_browser_mocks.mdx | 2 +- api_docs/kbn_core_feature_flags_server.mdx | 2 +- ...kbn_core_feature_flags_server_internal.mdx | 2 +- .../kbn_core_feature_flags_server_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 +- .../kbn_core_plugins_contracts_browser.mdx | 2 +- .../kbn_core_plugins_contracts_server.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 +- ...saved_objects_server_internal.devdocs.json | 52 +- ...kbn_core_saved_objects_server_internal.mdx | 4 +- .../kbn_core_saved_objects_server_mocks.mdx | 2 +- .../kbn_core_saved_objects_utils_server.mdx | 2 +- api_docs/kbn_core_security_browser.mdx | 2 +- .../kbn_core_security_browser_internal.mdx | 2 +- api_docs/kbn_core_security_browser_mocks.mdx | 2 +- api_docs/kbn_core_security_common.mdx | 2 +- api_docs/kbn_core_security_server.mdx | 2 +- .../kbn_core_security_server_internal.mdx | 2 +- api_docs/kbn_core_security_server_mocks.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 +- .../kbn_core_test_helpers_model_versions.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_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_profile_browser.mdx | 2 +- ...kbn_core_user_profile_browser_internal.mdx | 2 +- .../kbn_core_user_profile_browser_mocks.mdx | 2 +- api_docs/kbn_core_user_profile_common.mdx | 2 +- api_docs/kbn_core_user_profile_server.mdx | 2 +- .../kbn_core_user_profile_server_internal.mdx | 2 +- .../kbn_core_user_profile_server_mocks.mdx | 2 +- api_docs/kbn_core_user_settings_server.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_custom_icons.mdx | 2 +- api_docs/kbn_custom_integrations.mdx | 2 +- api_docs/kbn_cypress_config.mdx | 2 +- api_docs/kbn_data_forge.mdx | 2 +- api_docs/kbn_data_service.mdx | 2 +- api_docs/kbn_data_stream_adapter.mdx | 2 +- api_docs/kbn_data_view_utils.mdx | 2 +- api_docs/kbn_datemath.mdx | 2 +- api_docs/kbn_deeplinks_analytics.mdx | 2 +- api_docs/kbn_deeplinks_devtools.mdx | 2 +- api_docs/kbn_deeplinks_fleet.mdx | 2 +- api_docs/kbn_deeplinks_management.mdx | 2 +- api_docs/kbn_deeplinks_ml.mdx | 2 +- api_docs/kbn_deeplinks_observability.mdx | 2 +- api_docs/kbn_deeplinks_search.mdx | 2 +- api_docs/kbn_deeplinks_security.mdx | 2 +- api_docs/kbn_deeplinks_shared.mdx | 2 +- api_docs/kbn_default_nav_analytics.mdx | 2 +- api_docs/kbn_default_nav_devtools.mdx | 2 +- api_docs/kbn_default_nav_management.mdx | 2 +- api_docs/kbn_default_nav_ml.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_discover_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_data_quality_dashboard.mdx | 2 +- api_docs/kbn_elastic_agent_utils.mdx | 2 +- api_docs/kbn_elastic_assistant.mdx | 2 +- api_docs/kbn_elastic_assistant_common.mdx | 2 +- api_docs/kbn_entities_schema.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_esql_ast.mdx | 2 +- api_docs/kbn_esql_editor.devdocs.json | 608 ++++++++++++++++++ api_docs/kbn_esql_editor.mdx | 33 + api_docs/kbn_esql_utils.mdx | 2 +- api_docs/kbn_esql_validation_autocomplete.mdx | 2 +- api_docs/kbn_event_annotation_common.mdx | 2 +- api_docs/kbn_event_annotation_components.mdx | 2 +- api_docs/kbn_expandable_flyout.mdx | 2 +- api_docs/kbn_field_types.mdx | 2 +- api_docs/kbn_field_utils.mdx | 2 +- api_docs/kbn_find_used_node_modules.mdx | 2 +- api_docs/kbn_formatters.mdx | 2 +- .../kbn_ftr_common_functional_services.mdx | 2 +- .../kbn_ftr_common_functional_ui_services.mdx | 2 +- api_docs/kbn_generate.mdx | 2 +- api_docs/kbn_generate_console_definitions.mdx | 2 +- api_docs/kbn_generate_csv.mdx | 2 +- api_docs/kbn_grid_layout.mdx | 2 +- api_docs/kbn_grouping.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 +- .../kbn_index_management_shared_types.mdx | 2 +- api_docs/kbn_inference_integration_flyout.mdx | 2 +- api_docs/kbn_infra_forge.mdx | 2 +- api_docs/kbn_interpreter.mdx | 2 +- api_docs/kbn_investigation_shared.mdx | 2 +- api_docs/kbn_io_ts_utils.mdx | 2 +- api_docs/kbn_ipynb.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_json_schemas.mdx | 2 +- api_docs/kbn_kibana_manifest_schema.mdx | 2 +- .../kbn_language_documentation.devdocs.json | 199 ++++++ api_docs/kbn_language_documentation.mdx | 33 + api_docs/kbn_lens_embeddable_utils.mdx | 2 +- api_docs/kbn_lens_formula_docs.mdx | 2 +- api_docs/kbn_logging.mdx | 2 +- api_docs/kbn_logging_mocks.mdx | 2 +- api_docs/kbn_managed_content_badge.mdx | 2 +- api_docs/kbn_managed_vscode_config.mdx | 2 +- api_docs/kbn_management_cards_navigation.mdx | 2 +- .../kbn_management_settings_application.mdx | 2 +- ...ent_settings_components_field_category.mdx | 2 +- ...gement_settings_components_field_input.mdx | 2 +- ...nagement_settings_components_field_row.mdx | 2 +- ...bn_management_settings_components_form.mdx | 2 +- ...n_management_settings_field_definition.mdx | 2 +- api_docs/kbn_management_settings_ids.mdx | 2 +- ...n_management_settings_section_registry.mdx | 2 +- api_docs/kbn_management_settings_types.mdx | 2 +- .../kbn_management_settings_utilities.mdx | 2 +- api_docs/kbn_management_storybook_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_cancellable_search.mdx | 2 +- api_docs/kbn_ml_category_validator.mdx | 2 +- api_docs/kbn_ml_chi2test.mdx | 2 +- .../kbn_ml_data_frame_analytics_utils.mdx | 2 +- api_docs/kbn_ml_data_grid.mdx | 2 +- api_docs/kbn_ml_date_picker.mdx | 2 +- api_docs/kbn_ml_date_utils.mdx | 2 +- api_docs/kbn_ml_error_utils.mdx | 2 +- api_docs/kbn_ml_in_memory_table.mdx | 2 +- api_docs/kbn_ml_is_defined.mdx | 2 +- api_docs/kbn_ml_is_populated_object.mdx | 2 +- api_docs/kbn_ml_kibana_theme.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_runtime_field_utils.mdx | 2 +- api_docs/kbn_ml_string_hash.mdx | 2 +- api_docs/kbn_ml_time_buckets.mdx | 2 +- api_docs/kbn_ml_trained_models_utils.mdx | 2 +- api_docs/kbn_ml_ui_actions.mdx | 2 +- api_docs/kbn_ml_url_state.mdx | 2 +- api_docs/kbn_mock_idp_utils.mdx | 2 +- api_docs/kbn_monaco.mdx | 2 +- api_docs/kbn_object_versioning.mdx | 2 +- api_docs/kbn_object_versioning_utils.mdx | 2 +- api_docs/kbn_observability_alert_details.mdx | 2 +- .../kbn_observability_alerting_rule_utils.mdx | 2 +- .../kbn_observability_alerting_test_data.mdx | 2 +- ...ility_get_padded_alert_time_range_util.mdx | 2 +- api_docs/kbn_openapi_bundler.mdx | 2 +- api_docs/kbn_openapi_generator.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 +- api_docs/kbn_panel_loader.mdx | 2 +- ..._performance_testing_dataset_extractor.mdx | 2 +- api_docs/kbn_plugin_check.mdx | 2 +- api_docs/kbn_plugin_generator.mdx | 2 +- api_docs/kbn_plugin_helpers.mdx | 2 +- api_docs/kbn_presentation_containers.mdx | 2 +- api_docs/kbn_presentation_publishing.mdx | 2 +- api_docs/kbn_profiling_utils.mdx | 2 +- api_docs/kbn_random_sampling.mdx | 2 +- api_docs/kbn_react_field.mdx | 2 +- api_docs/kbn_react_hooks.mdx | 2 +- api_docs/kbn_react_kibana_context_common.mdx | 2 +- api_docs/kbn_react_kibana_context_render.mdx | 2 +- api_docs/kbn_react_kibana_context_root.mdx | 2 +- api_docs/kbn_react_kibana_context_styled.mdx | 2 +- api_docs/kbn_react_kibana_context_theme.mdx | 2 +- api_docs/kbn_react_kibana_mount.mdx | 2 +- api_docs/kbn_recently_accessed.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_reporting_csv_share_panel.mdx | 2 +- api_docs/kbn_reporting_export_types_csv.mdx | 2 +- .../kbn_reporting_export_types_csv_common.mdx | 2 +- api_docs/kbn_reporting_export_types_pdf.mdx | 2 +- .../kbn_reporting_export_types_pdf_common.mdx | 2 +- api_docs/kbn_reporting_export_types_png.mdx | 2 +- .../kbn_reporting_export_types_png_common.mdx | 2 +- api_docs/kbn_reporting_mocks_server.mdx | 2 +- api_docs/kbn_reporting_public.mdx | 2 +- api_docs/kbn_reporting_server.mdx | 2 +- api_docs/kbn_resizable_layout.mdx | 2 +- .../kbn_response_ops_feature_flag_service.mdx | 2 +- api_docs/kbn_rison.mdx | 2 +- api_docs/kbn_rollup.mdx | 2 +- api_docs/kbn_router_to_openapispec.mdx | 2 +- api_docs/kbn_router_utils.mdx | 2 +- api_docs/kbn_rrule.mdx | 2 +- api_docs/kbn_rule_data_utils.mdx | 2 +- api_docs/kbn_saved_objects_settings.mdx | 2 +- api_docs/kbn_screenshotting_server.mdx | 2 +- api_docs/kbn_search_api_panels.mdx | 2 +- api_docs/kbn_search_connectors.mdx | 2 +- api_docs/kbn_search_errors.mdx | 2 +- api_docs/kbn_search_index_documents.mdx | 2 +- api_docs/kbn_search_response_warnings.mdx | 2 +- api_docs/kbn_search_types.mdx | 2 +- api_docs/kbn_security_api_key_management.mdx | 2 +- api_docs/kbn_security_authorization_core.mdx | 2 +- api_docs/kbn_security_form_components.mdx | 2 +- api_docs/kbn_security_hardening.mdx | 2 +- api_docs/kbn_security_plugin_types_common.mdx | 2 +- ..._security_plugin_types_public.devdocs.json | 145 +++++ api_docs/kbn_security_plugin_types_public.mdx | 4 +- api_docs/kbn_security_plugin_types_server.mdx | 2 +- .../kbn_security_role_management_model.mdx | 2 +- api_docs/kbn_security_solution_common.mdx | 2 +- ...kbn_security_solution_distribution_bar.mdx | 2 +- api_docs/kbn_security_solution_features.mdx | 2 +- api_docs/kbn_security_solution_navigation.mdx | 2 +- api_docs/kbn_security_solution_side_nav.mdx | 2 +- ...kbn_security_solution_storybook_config.mdx | 2 +- .../kbn_security_ui_components.devdocs.json | 11 + api_docs/kbn_security_ui_components.mdx | 4 +- .../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_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 +- ...curitysolution_list_constants.devdocs.json | 48 -- .../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 +- .../kbn_server_route_repository_client.mdx | 2 +- .../kbn_server_route_repository_utils.mdx | 2 +- api_docs/kbn_serverless_common_settings.mdx | 2 +- .../kbn_serverless_observability_settings.mdx | 2 +- api_docs/kbn_serverless_project_switcher.mdx | 2 +- api_docs/kbn_serverless_search_settings.mdx | 2 +- api_docs/kbn_serverless_security_settings.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 +- .../kbn_shared_ux_button_exit_full_screen.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_error_boundary.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_tabbed_modal.mdx | 2 +- api_docs/kbn_shared_ux_table_persist.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_sort_predicates.mdx | 2 +- api_docs/kbn_sse_utils.mdx | 2 +- api_docs/kbn_sse_utils_client.mdx | 2 +- api_docs/kbn_sse_utils_server.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_synthetics_e2e.mdx | 2 +- api_docs/kbn_synthetics_private_location.mdx | 2 +- api_docs/kbn_telemetry_tools.mdx | 2 +- api_docs/kbn_test.devdocs.json | 14 + api_docs/kbn_test.mdx | 4 +- api_docs/kbn_test_eui_helpers.mdx | 2 +- api_docs/kbn_test_jest_helpers.mdx | 2 +- api_docs/kbn_test_subj_selector.mdx | 2 +- api_docs/kbn_timerange.mdx | 2 +- api_docs/kbn_tooling_log.mdx | 2 +- api_docs/kbn_triggers_actions_ui_types.mdx | 2 +- api_docs/kbn_try_in_console.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_unified_data_table.mdx | 2 +- api_docs/kbn_unified_doc_viewer.mdx | 2 +- api_docs/kbn_unified_field_list.mdx | 2 +- api_docs/kbn_unsaved_changes_badge.mdx | 2 +- api_docs/kbn_unsaved_changes_prompt.mdx | 2 +- api_docs/kbn_use_tracked_promise.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_visualization_ui_components.mdx | 2 +- api_docs/kbn_visualization_utils.mdx | 2 +- api_docs/kbn_xstate_utils.mdx | 2 +- api_docs/kbn_yarn_lock_validator.mdx | 2 +- api_docs/kbn_zod.mdx | 2 +- api_docs/kbn_zod_helpers.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/links.mdx | 2 +- api_docs/lists.mdx | 2 +- api_docs/logs_data_access.mdx | 2 +- api_docs/logs_explorer.mdx | 2 +- api_docs/logs_shared.mdx | 2 +- api_docs/management.mdx | 2 +- api_docs/maps.devdocs.json | 6 +- api_docs/maps.mdx | 4 +- api_docs/maps_ems.mdx | 2 +- api_docs/metrics_data_access.mdx | 2 +- api_docs/ml.mdx | 2 +- api_docs/mock_idp_plugin.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/no_data_page.mdx | 2 +- api_docs/notifications.mdx | 2 +- api_docs/observability.devdocs.json | 4 +- api_docs/observability.mdx | 2 +- api_docs/observability_a_i_assistant.mdx | 2 +- api_docs/observability_a_i_assistant_app.mdx | 2 +- .../observability_ai_assistant_management.mdx | 2 +- api_docs/observability_logs_explorer.mdx | 2 +- api_docs/observability_onboarding.mdx | 2 +- api_docs/observability_shared.devdocs.json | 45 +- api_docs/observability_shared.mdx | 7 +- api_docs/osquery.mdx | 2 +- api_docs/painless_lab.mdx | 2 +- api_docs/plugin_directory.mdx | 28 +- api_docs/presentation_panel.mdx | 2 +- api_docs/presentation_util.mdx | 2 +- api_docs/profiling.mdx | 2 +- api_docs/profiling_data_access.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/search_assistant.mdx | 2 +- api_docs/search_connectors.mdx | 2 +- api_docs/search_homepage.mdx | 2 +- api_docs/search_indices.mdx | 2 +- api_docs/search_inference_endpoints.mdx | 2 +- api_docs/search_notebooks.mdx | 2 +- api_docs/search_playground.mdx | 2 +- api_docs/security.mdx | 2 +- api_docs/security_solution.mdx | 2 +- api_docs/security_solution_ess.mdx | 2 +- api_docs/security_solution_serverless.mdx | 2 +- api_docs/serverless.mdx | 2 +- api_docs/serverless_observability.mdx | 2 +- api_docs/serverless_search.mdx | 2 +- api_docs/session_view.mdx | 2 +- api_docs/share.mdx | 2 +- api_docs/slo.mdx | 2 +- api_docs/snapshot_restore.mdx | 2 +- api_docs/spaces.devdocs.json | 74 +++ api_docs/spaces.mdx | 4 +- 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_doc_viewer.mdx | 2 +- api_docs/unified_histogram.mdx | 2 +- api_docs/unified_search.mdx | 2 +- api_docs/unified_search_autocomplete.mdx | 2 +- api_docs/uptime.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/visualizations.mdx | 2 +- 758 files changed, 2467 insertions(+), 976 deletions(-) create mode 100644 api_docs/kbn_esql_editor.devdocs.json create mode 100644 api_docs/kbn_esql_editor.mdx create mode 100644 api_docs/kbn_language_documentation.devdocs.json create mode 100644 api_docs/kbn_language_documentation.mdx diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index 35ad4814bdb77..702d3b61ef429 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: 2024-09-23 +date: 2024-09-24 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 ec3deb5a4bc1d..dc7a8fb9725de 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; diff --git a/api_docs/ai_assistant_management_selection.mdx b/api_docs/ai_assistant_management_selection.mdx index 832dc0148fc16..4281acad37dfa 100644 --- a/api_docs/ai_assistant_management_selection.mdx +++ b/api_docs/ai_assistant_management_selection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiAssistantManagementSelection title: "aiAssistantManagementSelection" image: https://source.unsplash.com/400x175/?github description: API docs for the aiAssistantManagementSelection plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiAssistantManagementSelection'] --- import aiAssistantManagementSelectionObj from './ai_assistant_management_selection.devdocs.json'; diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index 8a1af6c7ed4d9..1a05df11b6c7c 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: 2024-09-23 +date: 2024-09-24 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 f84ea0fce4f9a..df529a2b16f9e 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] --- import alertingObj from './alerting.devdocs.json'; diff --git a/api_docs/apm.devdocs.json b/api_docs/apm.devdocs.json index 7a76874a7835b..5316e7fb7fccf 100644 --- a/api_docs/apm.devdocs.json +++ b/api_docs/apm.devdocs.json @@ -2502,23 +2502,53 @@ "<[", "LiteralC", "<", - "IndexLifecyclePhaseSelectOption", + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.IndexLifecyclePhaseSelectOption", + "text": "IndexLifecyclePhaseSelectOption" + }, ".All>, ", "LiteralC", "<", - "IndexLifecyclePhaseSelectOption", + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.IndexLifecyclePhaseSelectOption", + "text": "IndexLifecyclePhaseSelectOption" + }, ".Hot>, ", "LiteralC", "<", - "IndexLifecyclePhaseSelectOption", + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.IndexLifecyclePhaseSelectOption", + "text": "IndexLifecyclePhaseSelectOption" + }, ".Warm>, ", "LiteralC", "<", - "IndexLifecyclePhaseSelectOption", + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.IndexLifecyclePhaseSelectOption", + "text": "IndexLifecyclePhaseSelectOption" + }, ".Cold>, ", "LiteralC", "<", - "IndexLifecyclePhaseSelectOption", + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.IndexLifecyclePhaseSelectOption", + "text": "IndexLifecyclePhaseSelectOption" + }, ".Frozen>]>; }>, ", "TypeC", "<{ environment: ", @@ -2584,23 +2614,53 @@ "<[", "LiteralC", "<", - "IndexLifecyclePhaseSelectOption", + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.IndexLifecyclePhaseSelectOption", + "text": "IndexLifecyclePhaseSelectOption" + }, ".All>, ", "LiteralC", "<", - "IndexLifecyclePhaseSelectOption", + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.IndexLifecyclePhaseSelectOption", + "text": "IndexLifecyclePhaseSelectOption" + }, ".Hot>, ", "LiteralC", "<", - "IndexLifecyclePhaseSelectOption", + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.IndexLifecyclePhaseSelectOption", + "text": "IndexLifecyclePhaseSelectOption" + }, ".Warm>, ", "LiteralC", "<", - "IndexLifecyclePhaseSelectOption", + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.IndexLifecyclePhaseSelectOption", + "text": "IndexLifecyclePhaseSelectOption" + }, ".Cold>, ", "LiteralC", "<", - "IndexLifecyclePhaseSelectOption", + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.IndexLifecyclePhaseSelectOption", + "text": "IndexLifecyclePhaseSelectOption" + }, ".Frozen>]>; }>, ", "TypeC", "<{ probability: ", @@ -2672,23 +2732,53 @@ "<[", "LiteralC", "<", - "IndexLifecyclePhaseSelectOption", + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.IndexLifecyclePhaseSelectOption", + "text": "IndexLifecyclePhaseSelectOption" + }, ".All>, ", "LiteralC", "<", - "IndexLifecyclePhaseSelectOption", + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.IndexLifecyclePhaseSelectOption", + "text": "IndexLifecyclePhaseSelectOption" + }, ".Hot>, ", "LiteralC", "<", - "IndexLifecyclePhaseSelectOption", + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.IndexLifecyclePhaseSelectOption", + "text": "IndexLifecyclePhaseSelectOption" + }, ".Warm>, ", "LiteralC", "<", - "IndexLifecyclePhaseSelectOption", + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.IndexLifecyclePhaseSelectOption", + "text": "IndexLifecyclePhaseSelectOption" + }, ".Cold>, ", "LiteralC", "<", - "IndexLifecyclePhaseSelectOption", + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.IndexLifecyclePhaseSelectOption", + "text": "IndexLifecyclePhaseSelectOption" + }, ".Frozen>]>; }>, ", "TypeC", "<{ probability: ", @@ -2752,23 +2842,53 @@ "<[", "LiteralC", "<", - "IndexLifecyclePhaseSelectOption", + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.IndexLifecyclePhaseSelectOption", + "text": "IndexLifecyclePhaseSelectOption" + }, ".All>, ", "LiteralC", "<", - "IndexLifecyclePhaseSelectOption", + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.IndexLifecyclePhaseSelectOption", + "text": "IndexLifecyclePhaseSelectOption" + }, ".Hot>, ", "LiteralC", "<", - "IndexLifecyclePhaseSelectOption", + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.IndexLifecyclePhaseSelectOption", + "text": "IndexLifecyclePhaseSelectOption" + }, ".Warm>, ", "LiteralC", "<", - "IndexLifecyclePhaseSelectOption", + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.IndexLifecyclePhaseSelectOption", + "text": "IndexLifecyclePhaseSelectOption" + }, ".Cold>, ", "LiteralC", "<", - "IndexLifecyclePhaseSelectOption", + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.IndexLifecyclePhaseSelectOption", + "text": "IndexLifecyclePhaseSelectOption" + }, ".Frozen>]>; }>, ", "TypeC", "<{ probability: ", @@ -2828,23 +2948,53 @@ "<[", "LiteralC", "<", - "IndexLifecyclePhaseSelectOption", + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.IndexLifecyclePhaseSelectOption", + "text": "IndexLifecyclePhaseSelectOption" + }, ".All>, ", "LiteralC", "<", - "IndexLifecyclePhaseSelectOption", + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.IndexLifecyclePhaseSelectOption", + "text": "IndexLifecyclePhaseSelectOption" + }, ".Hot>, ", "LiteralC", "<", - "IndexLifecyclePhaseSelectOption", + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.IndexLifecyclePhaseSelectOption", + "text": "IndexLifecyclePhaseSelectOption" + }, ".Warm>, ", "LiteralC", "<", - "IndexLifecyclePhaseSelectOption", + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.IndexLifecyclePhaseSelectOption", + "text": "IndexLifecyclePhaseSelectOption" + }, ".Cold>, ", "LiteralC", "<", - "IndexLifecyclePhaseSelectOption", + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.IndexLifecyclePhaseSelectOption", + "text": "IndexLifecyclePhaseSelectOption" + }, ".Frozen>]>; }>, ", "TypeC", "<{ probability: ", diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index 805621f44124c..fd1fa67f059aa 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] --- import apmObj from './apm.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/te | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 29 | 0 | 29 | 119 | +| 29 | 0 | 29 | 118 | ## Client diff --git a/api_docs/apm_data_access.devdocs.json b/api_docs/apm_data_access.devdocs.json index 365d08f247e17..be97ce96ca40e 100644 --- a/api_docs/apm_data_access.devdocs.json +++ b/api_docs/apm_data_access.devdocs.json @@ -295,7 +295,9 @@ "label": "fieldCaps", "description": [], "signature": [ - "(operationName: string, params: APMEventFieldCapsRequest) => Promise<", + "(operationName: string, params: ", + "APMEventFieldCapsRequest", + ") => Promise<", "FieldCapsResponse", ">" ], @@ -344,7 +346,9 @@ "label": "termsEnum", "description": [], "signature": [ - "(operationName: string, params: APMEventTermsEnumRequest) => Promise<", + "(operationName: string, params: ", + "APMEventTermsEnumRequest", + ") => Promise<", "TermsEnumResponse", ">" ], @@ -1886,7 +1890,15 @@ }, ", ", "InspectResponse", - "> | undefined; }" + "> | undefined; excludedDataTiers?: ", + { + "pluginId": "observabilityShared", + "scope": "common", + "docId": "kibObservabilitySharedPluginApi", + "section": "def-common.DataTier", + "text": "DataTier" + }, + "[] | undefined; }" ], "path": "x-pack/plugins/observability_solution/apm_data_access/server/lib/helpers/create_es_client/create_apm_event_client/index.ts", "deprecated": false, diff --git a/api_docs/apm_data_access.mdx b/api_docs/apm_data_access.mdx index 1c86ea4253378..dc9de2dafd71d 100644 --- a/api_docs/apm_data_access.mdx +++ b/api_docs/apm_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apmDataAccess title: "apmDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the apmDataAccess plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apmDataAccess'] --- import apmDataAccessObj from './apm_data_access.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs- | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 93 | 0 | 93 | 1 | +| 93 | 0 | 93 | 3 | ## Server diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index 444d5bdae536c..87110f6690416 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: 2024-09-23 +date: 2024-09-24 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 368cbbd4b250b..324bde9877aa0 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: 2024-09-23 +date: 2024-09-24 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 3eb2bea386ac9..91f20f0ef205f 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: 2024-09-23 +date: 2024-09-24 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 263fa4e8c6da2..da3880d6b999c 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: 2024-09-23 +date: 2024-09-24 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 438ab5bdbf27b..66edc46724027 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: 2024-09-23 +date: 2024-09-24 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 356d069211f3a..ad530d356f042 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] --- import cloudObj from './cloud.devdocs.json'; diff --git a/api_docs/cloud_data_migration.mdx b/api_docs/cloud_data_migration.mdx index 7bf7712e6416e..00f2a65430f74 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: 2024-09-23 +date: 2024-09-24 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 efe9ab2122970..7a87e7dae3714 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDefend'] --- import cloudDefendObj from './cloud_defend.devdocs.json'; diff --git a/api_docs/cloud_security_posture.mdx b/api_docs/cloud_security_posture.mdx index b04ffbebe34d6..1e346d79133c3 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: 2024-09-23 +date: 2024-09-24 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 b1ba453d27262..7cbbc780a57be 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: 2024-09-23 +date: 2024-09-24 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 b346e7e7869ba..47f004535dbd4 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: 2024-09-23 +date: 2024-09-24 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 828ebf90b5f85..9fb044552570b 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: 2024-09-23 +date: 2024-09-24 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 8953357ee4a5d..1d81b7d44dcf5 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'customIntegrations'] --- import customIntegrationsObj from './custom_integrations.devdocs.json'; diff --git a/api_docs/dashboard.devdocs.json b/api_docs/dashboard.devdocs.json index 8cb2ab4a82d47..0a0720d46b3bc 100644 --- a/api_docs/dashboard.devdocs.json +++ b/api_docs/dashboard.devdocs.json @@ -812,6 +812,22 @@ "text": "HasAppContext" }, " & ", + { + "pluginId": "@kbn/presentation-containers", + "scope": "public", + "docId": "kibKbnPresentationContainersPluginApi", + "section": "def-public.HasRuntimeChildState", + "text": "HasRuntimeChildState" + }, + " & ", + { + "pluginId": "@kbn/presentation-containers", + "scope": "public", + "docId": "kibKbnPresentationContainersPluginApi", + "section": "def-public.HasSerializedChildState", + "text": "HasSerializedChildState" + }, + " & ", { "pluginId": "@kbn/presentation-publishing", "scope": "public", @@ -835,6 +851,14 @@ "section": "def-public.PublishesDataViews", "text": "PublishesDataViews" }, + " & ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.PublishesPanelDescription", + "text": "PublishesPanelDescription" + }, " & Pick<", { "pluginId": "@kbn/presentation-publishing", @@ -907,7 +931,15 @@ "section": "def-public.TracksOverlays", "text": "TracksOverlays" }, - " & { addFromLibrary: () => void; asyncResetToLastSavedState: () => Promise; controlGroupApi$: ", + " & { addFromLibrary: () => void; animatePanelTransforms$: ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.PublishingSubject", + "text": "PublishingSubject" + }, + "; asyncResetToLastSavedState: () => Promise; controlGroupApi$: ", { "pluginId": "@kbn/presentation-publishing", "scope": "public", @@ -923,7 +955,15 @@ "section": "def-public.ControlGroupApi", "text": "ControlGroupApi" }, - " | undefined>; fullScreenMode$: ", + " | undefined>; embeddedExternally$: ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.PublishingSubject", + "text": "PublishingSubject" + }, + "; fullScreenMode$: ", { "pluginId": "@kbn/presentation-publishing", "scope": "public", @@ -939,7 +979,27 @@ "section": "def-public.PublishingSubject", "text": "PublishingSubject" }, - "; forceRefresh: () => void; getDashboardPanelFromId: (id: string) => Promise<", + "; forceRefresh: () => void; getRuntimeStateForControlGroup: () => ", + "UnsavedPanelState", + " | undefined; getSerializedStateForControlGroup: () => ", + { + "pluginId": "@kbn/presentation-containers", + "scope": "public", + "docId": "kibKbnPresentationContainersPluginApi", + "section": "def-public.SerializedPanelState", + "text": "SerializedPanelState" + }, + "<", + { + "pluginId": "controls", + "scope": "common", + "docId": "kibControlsPluginApi", + "section": "def-common.ControlGroupSerializedState", + "text": "ControlGroupSerializedState" + }, + ">; getSettings: () => ", + "DashboardStateFromSettingsFlyout", + "; getDashboardPanelFromId: (id: string) => Promise<", { "pluginId": "dashboard", "scope": "common", @@ -955,15 +1015,7 @@ "section": "def-common.SavedObjectEmbeddableInput", "text": "SavedObjectEmbeddableInput" }, - ">>; getPanelsState: () => ", - { - "pluginId": "dashboard", - "scope": "common", - "docId": "kibDashboardPluginApi", - "section": "def-common.DashboardPanelMap", - "text": "DashboardPanelMap" - }, - "; hasOverlays$: ", + ">>; hasOverlays$: ", { "pluginId": "@kbn/presentation-publishing", "scope": "public", @@ -987,7 +1039,7 @@ "section": "def-public.PublishingSubject", "text": "PublishingSubject" }, - "; managed$: ", + "; highlightPanel: (panelRef: HTMLDivElement) => void; highlightPanelId$: ", { "pluginId": "@kbn/presentation-publishing", "scope": "public", @@ -995,7 +1047,39 @@ "section": "def-public.PublishingSubject", "text": "PublishingSubject" }, - "; runInteractiveSave: (interactionMode: ", + "; managed$: ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.PublishingSubject", + "text": "PublishingSubject" + }, + "; panels$: ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.PublishingSubject", + "text": "PublishingSubject" + }, + "<", + { + "pluginId": "dashboard", + "scope": "common", + "docId": "kibDashboardPluginApi", + "section": "def-common.DashboardPanelMap", + "text": "DashboardPanelMap" + }, + ">; registerChildApi: (api: ", + { + "pluginId": "embeddable", + "scope": "public", + "docId": "kibEmbeddablePluginApi", + "section": "def-public.DefaultEmbeddableApi", + "text": "DefaultEmbeddableApi" + }, + ") => void; runInteractiveSave: (interactionMode: ", { "pluginId": "@kbn/presentation-publishing", "scope": "public", @@ -1005,7 +1089,25 @@ }, ") => Promise<", "SaveDashboardReturn", - " | undefined>; runQuickSave: () => Promise; scrollToTop: () => void; setFilters: (filters?: ", + " | undefined>; runQuickSave: () => Promise; scrollToPanel: (panelRef: HTMLDivElement) => void; scrollToPanelId$: ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.PublishingSubject", + "text": "PublishingSubject" + }, + "; scrollToTop: () => void; setControlGroupApi: (controlGroupApi: ", + { + "pluginId": "controls", + "scope": "public", + "docId": "kibControlsPluginApi", + "section": "def-public.ControlGroupApi", + "text": "ControlGroupApi" + }, + ") => void; setSettings: (settings: ", + "DashboardStateFromSettingsFlyout", + ") => void; setFilters: (filters?: ", { "pluginId": "@kbn/es-query", "scope": "common", @@ -1013,7 +1115,15 @@ "section": "def-common.Filter", "text": "Filter" }, - "[] | undefined) => void; setFullScreenMode: (fullScreenMode: boolean) => void; setQuery: (query?: ", + "[] | undefined) => void; setFullScreenMode: (fullScreenMode: boolean) => void; setPanels: (panels: ", + { + "pluginId": "dashboard", + "scope": "common", + "docId": "kibDashboardPluginApi", + "section": "def-common.DashboardPanelMap", + "text": "DashboardPanelMap" + }, + ") => void; setQuery: (query?: ", { "pluginId": "@kbn/es-query", "scope": "common", @@ -1037,7 +1147,55 @@ "section": "def-public.ViewMode", "text": "ViewMode" }, - ") => void; openSettingsFlyout: () => void; }" + ") => void; useMargins$: ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.PublishingSubject", + "text": "PublishingSubject" + }, + "; uuid$: ", + { + "pluginId": "@kbn/presentation-publishing", + "scope": "public", + "docId": "kibKbnPresentationPublishingPluginApi", + "section": "def-public.PublishingSubject", + "text": "PublishingSubject" + }, + "; untilEmbeddableLoaded: (id: string) => Promise<", + { + "pluginId": "embeddable", + "scope": "public", + "docId": "kibEmbeddablePluginApi", + "section": "def-public.IEmbeddable", + "text": "IEmbeddable" + }, + "<", + { + "pluginId": "embeddable", + "scope": "common", + "docId": "kibEmbeddablePluginApi", + "section": "def-common.EmbeddableInput", + "text": "EmbeddableInput" + }, + ", ", + { + "pluginId": "embeddable", + "scope": "public", + "docId": "kibEmbeddablePluginApi", + "section": "def-public.EmbeddableOutput", + "text": "EmbeddableOutput" + }, + ", any> | ", + { + "pluginId": "embeddable", + "scope": "public", + "docId": "kibEmbeddablePluginApi", + "section": "def-public.ErrorEmbeddable", + "text": "ErrorEmbeddable" + }, + ">; }" ], "path": "src/plugins/dashboard/public/dashboard_api/types.ts", "deprecated": false, diff --git a/api_docs/dashboard.mdx b/api_docs/dashboard.mdx index 787ea074ae56f..56ce41d219bba 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboard'] --- import dashboardObj from './dashboard.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 | |-------------------|-----------|------------------------|-----------------| -| 128 | 0 | 123 | 13 | +| 128 | 0 | 123 | 15 | ## Client diff --git a/api_docs/dashboard_enhanced.mdx b/api_docs/dashboard_enhanced.mdx index b7193bdad55a2..17caaf4a5ab28 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: 2024-09-23 +date: 2024-09-24 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 aff51e317e940..d607f3d38f9ad 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; diff --git a/api_docs/data_quality.mdx b/api_docs/data_quality.mdx index c9232391a7a37..cb63ec21f6424 100644 --- a/api_docs/data_quality.mdx +++ b/api_docs/data_quality.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataQuality title: "dataQuality" image: https://source.unsplash.com/400x175/?github description: API docs for the dataQuality plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataQuality'] --- import dataQualityObj from './data_quality.devdocs.json'; diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index 18c76189bbdc1..2824c8d8b7cec 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: 2024-09-23 +date: 2024-09-24 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 0a8beabf4a094..f40ff400b2024 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; diff --git a/api_docs/data_usage.mdx b/api_docs/data_usage.mdx index 998b0ebf701f4..71dfafeb85b77 100644 --- a/api_docs/data_usage.mdx +++ b/api_docs/data_usage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataUsage title: "dataUsage" image: https://source.unsplash.com/400x175/?github description: API docs for the dataUsage plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataUsage'] --- import dataUsageObj from './data_usage.devdocs.json'; diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index 69b7fabcc9c15..15970da6b9f5a 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: 2024-09-23 +date: 2024-09-24 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 6726baec9021a..8a5aa058db705 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: 2024-09-23 +date: 2024-09-24 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 d6ef9036e376e..74ccd7f4b7195 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: 2024-09-23 +date: 2024-09-24 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 f175b39c846b2..e10e310cf51a2 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: 2024-09-23 +date: 2024-09-24 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 f5d9baae2b729..364bc0825d089 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] --- import dataVisualizerObj from './data_visualizer.devdocs.json'; diff --git a/api_docs/dataset_quality.mdx b/api_docs/dataset_quality.mdx index ed346bb4f6136..b4d759325585f 100644 --- a/api_docs/dataset_quality.mdx +++ b/api_docs/dataset_quality.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/datasetQuality title: "datasetQuality" image: https://source.unsplash.com/400x175/?github description: API docs for the datasetQuality plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'datasetQuality'] --- import datasetQualityObj from './dataset_quality.devdocs.json'; diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index 510fd282bfb48..ac63699a82353 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 90decb28037bf..60426b7496b4c 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -1366,16 +1366,16 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | | [links.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/links.ts#:~:text=authc), [hooks.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/lib/kibana/hooks.ts#:~:text=authc) | - | | | [use_bulk_get_user_profiles.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/user_profiles/use_bulk_get_user_profiles.tsx#:~:text=userProfiles), [use_get_current_user_profile.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/user_profiles/use_get_current_user_profile.tsx#:~:text=userProfiles), [overlay.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/assistant/overlay.tsx#:~:text=userProfiles) | - | | | [request_context_factory.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/request_context_factory.ts#:~:text=audit), [plugin.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/plugin.ts#:~:text=audit) | - | -| | [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/trusted_apps/constants.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_ID), [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/trusted_apps/constants.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_ID), [api_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/trusted_apps/service/api_client.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_ID), [api_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/trusted_apps/service/api_client.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_ID), [api_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/trusted_apps/service/api_client.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_ID), [policy_hooks.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_hooks.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_ID), [policy_hooks.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_hooks.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_ID), [lists.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/lists.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_ID), [lists.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/lists.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_ID), [trusted_app_validator.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lists_integration/endpoint/validators/trusted_app_validator.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_ID)+ 25 more | - | +| | [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/trusted_apps/constants.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_ID), [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/trusted_apps/constants.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_ID), [policy_hooks.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_hooks.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_ID), [policy_hooks.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_hooks.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_ID), [lists.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/lists.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_ID), [lists.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/lists.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_ID), [trusted_app_validator.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lists_integration/endpoint/validators/trusted_app_validator.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_ID), [trusted_app_validator.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lists_integration/endpoint/validators/trusted_app_validator.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_ID), [exceptions_list_item_generator.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/endpoint/data_generators/exceptions_list_item_generator.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_ID), [exceptions_list_item_generator.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/endpoint/data_generators/exceptions_list_item_generator.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_ID)+ 22 more | - | | | [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/trusted_apps/constants.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_NAME), [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/trusted_apps/constants.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_NAME), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/scripts/endpoint/trusted_apps/index.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_NAME), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/scripts/endpoint/trusted_apps/index.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_NAME) | - | | | [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/trusted_apps/constants.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_DESCRIPTION), [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/trusted_apps/constants.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_DESCRIPTION), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/scripts/endpoint/trusted_apps/index.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_DESCRIPTION), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/scripts/endpoint/trusted_apps/index.ts#:~:text=ENDPOINT_TRUSTED_APPS_LIST_DESCRIPTION) | - | -| | [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/event_filters/constants.ts#:~:text=ENDPOINT_EVENT_FILTERS_LIST_ID), [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/event_filters/constants.ts#:~:text=ENDPOINT_EVENT_FILTERS_LIST_ID), [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/event_filters/constants.ts#:~:text=ENDPOINT_EVENT_FILTERS_LIST_ID), [form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/form.tsx#:~:text=ENDPOINT_EVENT_FILTERS_LIST_ID), [form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/form.tsx#:~:text=ENDPOINT_EVENT_FILTERS_LIST_ID), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/event_filters/view/utils.ts#:~:text=ENDPOINT_EVENT_FILTERS_LIST_ID), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/event_filters/view/utils.ts#:~:text=ENDPOINT_EVENT_FILTERS_LIST_ID), [service_actions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/event_filters/service/service_actions.ts#:~:text=ENDPOINT_EVENT_FILTERS_LIST_ID), [service_actions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/event_filters/service/service_actions.ts#:~:text=ENDPOINT_EVENT_FILTERS_LIST_ID), [service_actions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/event_filters/service/service_actions.ts#:~:text=ENDPOINT_EVENT_FILTERS_LIST_ID)+ 24 more | - | +| | [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/event_filters/constants.ts#:~:text=ENDPOINT_EVENT_FILTERS_LIST_ID), [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/event_filters/constants.ts#:~:text=ENDPOINT_EVENT_FILTERS_LIST_ID), [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/event_filters/constants.ts#:~:text=ENDPOINT_EVENT_FILTERS_LIST_ID), [form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/form.tsx#:~:text=ENDPOINT_EVENT_FILTERS_LIST_ID), [form.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/event_filters/view/components/form.tsx#:~:text=ENDPOINT_EVENT_FILTERS_LIST_ID), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/event_filters/view/utils.ts#:~:text=ENDPOINT_EVENT_FILTERS_LIST_ID), [utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/event_filters/view/utils.ts#:~:text=ENDPOINT_EVENT_FILTERS_LIST_ID), [service_actions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/event_filters/service/service_actions.ts#:~:text=ENDPOINT_EVENT_FILTERS_LIST_ID), [service_actions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/event_filters/service/service_actions.ts#:~:text=ENDPOINT_EVENT_FILTERS_LIST_ID), [service_actions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/event_filters/service/service_actions.ts#:~:text=ENDPOINT_EVENT_FILTERS_LIST_ID)+ 21 more | - | | | [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/event_filters/constants.ts#:~:text=ENDPOINT_EVENT_FILTERS_LIST_NAME), [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/event_filters/constants.ts#:~:text=ENDPOINT_EVENT_FILTERS_LIST_NAME), [create_event_filters.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/handlers/create_event_filters.ts#:~:text=ENDPOINT_EVENT_FILTERS_LIST_NAME), [create_event_filters.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/handlers/create_event_filters.ts#:~:text=ENDPOINT_EVENT_FILTERS_LIST_NAME), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/scripts/endpoint/event_filters/index.ts#:~:text=ENDPOINT_EVENT_FILTERS_LIST_NAME), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/scripts/endpoint/event_filters/index.ts#:~:text=ENDPOINT_EVENT_FILTERS_LIST_NAME) | - | | | [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/event_filters/constants.ts#:~:text=ENDPOINT_EVENT_FILTERS_LIST_DESCRIPTION), [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/event_filters/constants.ts#:~:text=ENDPOINT_EVENT_FILTERS_LIST_DESCRIPTION), [create_event_filters.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/handlers/create_event_filters.ts#:~:text=ENDPOINT_EVENT_FILTERS_LIST_DESCRIPTION), [create_event_filters.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/fleet_integration/handlers/create_event_filters.ts#:~:text=ENDPOINT_EVENT_FILTERS_LIST_DESCRIPTION), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/scripts/endpoint/event_filters/index.ts#:~:text=ENDPOINT_EVENT_FILTERS_LIST_DESCRIPTION), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/scripts/endpoint/event_filters/index.ts#:~:text=ENDPOINT_EVENT_FILTERS_LIST_DESCRIPTION) | - | -| | [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/constants.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_ID), [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/constants.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_ID), [host_isolation_exceptions_api_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/host_isolation_exceptions_api_client.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_ID), [host_isolation_exceptions_api_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/host_isolation_exceptions_api_client.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_ID), [host_isolation_exceptions_api_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/host_isolation_exceptions_api_client.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_ID), [lists.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/lists.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_ID), [lists.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/lists.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_ID), [host_isolation_exceptions_validator.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lists_integration/endpoint/validators/host_isolation_exceptions_validator.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_ID), [host_isolation_exceptions_validator.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lists_integration/endpoint/validators/host_isolation_exceptions_validator.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_ID), [exceptions_list_item_generator.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/endpoint/data_generators/exceptions_list_item_generator.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_ID)+ 8 more | - | +| | [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/constants.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_ID), [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/constants.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_ID), [lists.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/lists.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_ID), [lists.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/lists.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_ID), [host_isolation_exceptions_validator.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lists_integration/endpoint/validators/host_isolation_exceptions_validator.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_ID), [host_isolation_exceptions_validator.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lists_integration/endpoint/validators/host_isolation_exceptions_validator.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_ID), [exceptions_list_item_generator.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/endpoint/data_generators/exceptions_list_item_generator.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_ID), [exceptions_list_item_generator.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/endpoint/data_generators/exceptions_list_item_generator.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_ID), [host_isolation_exception_generator.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/endpoint/data_generators/host_isolation_exception_generator.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_ID), [host_isolation_exception_generator.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/endpoint/data_generators/host_isolation_exception_generator.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_ID)+ 5 more | - | | | [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/constants.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_NAME), [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/constants.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_NAME), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/scripts/endpoint/host_isolation_exceptions/index.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_NAME), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/scripts/endpoint/host_isolation_exceptions/index.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_NAME) | - | | | [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/constants.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_DESCRIPTION), [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/constants.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_DESCRIPTION), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/scripts/endpoint/host_isolation_exceptions/index.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_DESCRIPTION), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/scripts/endpoint/host_isolation_exceptions/index.ts#:~:text=ENDPOINT_HOST_ISOLATION_EXCEPTIONS_LIST_DESCRIPTION) | - | -| | [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/blocklist/constants.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID), [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/blocklist/constants.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID), [blocklists_api_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/blocklist/services/blocklists_api_client.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID), [blocklists_api_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/blocklist/services/blocklists_api_client.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID), [blocklists_api_client.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/blocklist/services/blocklists_api_client.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID), [policy_hooks.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_hooks.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID), [policy_hooks.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_hooks.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID), [lists.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/lists.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID), [lists.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/lists.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID), [exceptions_list_item_generator.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/endpoint/data_generators/exceptions_list_item_generator.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID)+ 6 more | - | +| | [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/blocklist/constants.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID), [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/blocklist/constants.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID), [policy_hooks.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_hooks.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID), [policy_hooks.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/policy/view/policy_hooks.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID), [lists.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/lists.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID), [lists.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/endpoint/lib/artifacts/lists.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID), [exceptions_list_item_generator.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/endpoint/data_generators/exceptions_list_item_generator.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID), [exceptions_list_item_generator.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/endpoint/data_generators/exceptions_list_item_generator.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/scripts/endpoint/blocklists/index.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/scripts/endpoint/blocklists/index.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_ID)+ 3 more | - | | | [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/blocklist/constants.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_NAME), [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/blocklist/constants.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_NAME), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/scripts/endpoint/blocklists/index.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_NAME), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/scripts/endpoint/blocklists/index.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_NAME) | - | | | [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/blocklist/constants.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_DESCRIPTION), [constants.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/blocklist/constants.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_DESCRIPTION), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/scripts/endpoint/blocklists/index.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_DESCRIPTION), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/scripts/endpoint/blocklists/index.ts#:~:text=ENDPOINT_BLOCKLISTS_LIST_DESCRIPTION) | - | | | [use_colors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/resolver/view/use_colors.ts#:~:text=darkMode), [use_colors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/resolver/view/use_colors.ts#:~:text=darkMode), [use_colors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/resolver/view/use_colors.ts#:~:text=darkMode), [use_colors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/resolver/view/use_colors.ts#:~:text=darkMode), [use_colors.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/resolver/view/use_colors.ts#:~:text=darkMode) | - | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 338a02ad98539..65b694dcc0e7e 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 657e376b63954..553a77780b679 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: 2024-09-23 +date: 2024-09-24 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 41762cbdf56fe..545e2c8bf26e3 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: 2024-09-23 +date: 2024-09-24 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 7ba88702a6dd0..f81ee39b23971 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/discover_shared.mdx b/api_docs/discover_shared.mdx index cb18e2eb1833a..86ddced539c3d 100644 --- a/api_docs/discover_shared.mdx +++ b/api_docs/discover_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverShared title: "discoverShared" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverShared plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverShared'] --- import discoverSharedObj from './discover_shared.devdocs.json'; diff --git a/api_docs/ecs_data_quality_dashboard.mdx b/api_docs/ecs_data_quality_dashboard.mdx index b6daf0319568b..8d455d8acdec7 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ecsDataQualityDashboard'] --- import ecsDataQualityDashboardObj from './ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/elastic_assistant.mdx b/api_docs/elastic_assistant.mdx index a7fab4235ca9f..ea99ae447628d 100644 --- a/api_docs/elastic_assistant.mdx +++ b/api_docs/elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/elasticAssistant title: "elasticAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the elasticAssistant plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'elasticAssistant'] --- import elasticAssistantObj from './elastic_assistant.devdocs.json'; diff --git a/api_docs/embeddable.devdocs.json b/api_docs/embeddable.devdocs.json index 6b628765d44af..c0489ce48f626 100644 --- a/api_docs/embeddable.devdocs.json +++ b/api_docs/embeddable.devdocs.json @@ -1000,7 +1000,7 @@ "section": "def-public.IEmbeddable", "text": "IEmbeddable" }, - ">(type: string, explicitInput: Partial, attributes?: unknown) => Promise>(type: string, explicitInput: Partial, attributes?: unknown) => Promise<", { "pluginId": "embeddable", "scope": "public", @@ -1008,7 +1008,7 @@ "section": "def-public.ErrorEmbeddable", "text": "ErrorEmbeddable" }, - ">" + " | E>" ], "path": "src/plugins/embeddable/public/lib/containers/container.ts", "deprecated": false, @@ -10322,7 +10322,7 @@ "section": "def-public.ContainerOutput", "text": "ContainerOutput" }, - "> | undefined) => Promise | undefined) => Promise<", { "pluginId": "embeddable", "scope": "public", @@ -10330,7 +10330,7 @@ "section": "def-public.ErrorEmbeddable", "text": "ErrorEmbeddable" }, - ">" + " | TEmbeddable>" ], "path": "src/plugins/embeddable/public/lib/embeddables/embeddable_factory.ts", "deprecated": false, @@ -10443,7 +10443,7 @@ "section": "def-public.ContainerOutput", "text": "ContainerOutput" }, - "> | undefined) => Promise | undefined) => Promise<", { "pluginId": "embeddable", "scope": "public", @@ -10451,7 +10451,7 @@ "section": "def-public.ErrorEmbeddable", "text": "ErrorEmbeddable" }, - " | undefined>" + " | TEmbeddable | undefined>" ], "path": "src/plugins/embeddable/public/lib/embeddables/embeddable_factory.ts", "deprecated": false, diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index a3d122feb00d8..11a911f9d15d4 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: 2024-09-23 +date: 2024-09-24 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 422668bbf2dcd..98b90f5f1c9d4 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: 2024-09-23 +date: 2024-09-24 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 932f0d19f5124..ef4547e1121d8 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: 2024-09-23 +date: 2024-09-24 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 5ab0d4227eda9..7580ad70b1f6a 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] --- import enterpriseSearchObj from './enterprise_search.devdocs.json'; diff --git a/api_docs/entities_data_access.mdx b/api_docs/entities_data_access.mdx index c6f6f28744668..de920bb86c5e2 100644 --- a/api_docs/entities_data_access.mdx +++ b/api_docs/entities_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/entitiesDataAccess title: "entitiesDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the entitiesDataAccess plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'entitiesDataAccess'] --- import entitiesDataAccessObj from './entities_data_access.devdocs.json'; diff --git a/api_docs/entity_manager.mdx b/api_docs/entity_manager.mdx index 9af13b2901cad..ee0b5be96eb83 100644 --- a/api_docs/entity_manager.mdx +++ b/api_docs/entity_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/entityManager title: "entityManager" image: https://source.unsplash.com/400x175/?github description: API docs for the entityManager plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'entityManager'] --- import entityManagerObj from './entity_manager.devdocs.json'; diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index cfbbe006a111b..8c0e855b68ba3 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] --- import esUiSharedObj from './es_ui_shared.devdocs.json'; diff --git a/api_docs/esql.devdocs.json b/api_docs/esql.devdocs.json index 772be100e7465..29c31d5f3b749 100644 --- a/api_docs/esql.devdocs.json +++ b/api_docs/esql.devdocs.json @@ -5,19 +5,19 @@ "functions": [ { "parentPluginId": "esql", - "id": "def-public.TextBasedLangEditor", + "id": "def-public.ESQLLangEditor", "type": "Function", "tags": [], - "label": "TextBasedLangEditor", + "label": "ESQLLangEditor", "description": [], "signature": [ "(props: ", { - "pluginId": "@kbn/text-based-editor", + "pluginId": "@kbn/esql-editor", "scope": "public", - "docId": "kibKbnTextBasedEditorPluginApi", - "section": "def-public.TextBasedLanguagesEditorProps", - "text": "TextBasedLanguagesEditorProps" + "docId": "kibKbnEsqlEditorPluginApi", + "section": "def-public.ESQLEditorProps", + "text": "ESQLEditorProps" }, ") => JSX.Element" ], @@ -27,18 +27,18 @@ "children": [ { "parentPluginId": "esql", - "id": "def-public.TextBasedLangEditor.$1", + "id": "def-public.ESQLLangEditor.$1", "type": "Object", "tags": [], "label": "props", "description": [], "signature": [ { - "pluginId": "@kbn/text-based-editor", + "pluginId": "@kbn/esql-editor", "scope": "public", - "docId": "kibKbnTextBasedEditorPluginApi", - "section": "def-public.TextBasedLanguagesEditorProps", - "text": "TextBasedLanguagesEditorProps" + "docId": "kibKbnEsqlEditorPluginApi", + "section": "def-public.ESQLEditorProps", + "text": "ESQLEditorProps" } ], "path": "src/plugins/esql/public/create_editor.tsx", @@ -54,62 +54,18 @@ "interfaces": [ { "parentPluginId": "esql", - "id": "def-public.EsqlPluginStart", - "type": "Interface", - "tags": [], - "label": "EsqlPluginStart", - "description": [], - "path": "src/plugins/esql/public/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "esql", - "id": "def-public.EsqlPluginStart.Editor", - "type": "CompoundType", - "tags": [], - "label": "Editor", - "description": [], - "signature": [ - "React.ComponentClass<", - { - "pluginId": "@kbn/text-based-editor", - "scope": "public", - "docId": "kibKbnTextBasedEditorPluginApi", - "section": "def-public.TextBasedLanguagesEditorProps", - "text": "TextBasedLanguagesEditorProps" - }, - ", any> | React.FunctionComponent<", - { - "pluginId": "@kbn/text-based-editor", - "scope": "public", - "docId": "kibKbnTextBasedEditorPluginApi", - "section": "def-public.TextBasedLanguagesEditorProps", - "text": "TextBasedLanguagesEditorProps" - }, - ">" - ], - "path": "src/plugins/esql/public/types.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, - { - "parentPluginId": "esql", - "id": "def-public.TextBasedLanguagesEditorProps", + "id": "def-public.ESQLEditorProps", "type": "Interface", "tags": [], - "label": "TextBasedLanguagesEditorProps", + "label": "ESQLEditorProps", "description": [], - "path": "packages/kbn-text-based-editor/src/types.ts", + "path": "packages/kbn-esql-editor/src/types.ts", "deprecated": false, "trackAdoption": false, "children": [ { "parentPluginId": "esql", - "id": "def-public.TextBasedLanguagesEditorProps.query", + "id": "def-public.ESQLEditorProps.query", "type": "Object", "tags": [], "label": "query", @@ -119,13 +75,13 @@ "signature": [ "{ esql: string; }" ], - "path": "packages/kbn-text-based-editor/src/types.ts", + "path": "packages/kbn-esql-editor/src/types.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "esql", - "id": "def-public.TextBasedLanguagesEditorProps.onTextLangQueryChange", + "id": "def-public.ESQLEditorProps.onTextLangQueryChange", "type": "Function", "tags": [], "label": "onTextLangQueryChange", @@ -143,13 +99,13 @@ }, ") => void" ], - "path": "packages/kbn-text-based-editor/src/types.ts", + "path": "packages/kbn-esql-editor/src/types.ts", "deprecated": false, "trackAdoption": false, "children": [ { "parentPluginId": "esql", - "id": "def-public.TextBasedLanguagesEditorProps.onTextLangQueryChange.$1", + "id": "def-public.ESQLEditorProps.onTextLangQueryChange.$1", "type": "Object", "tags": [], "label": "query", @@ -163,7 +119,7 @@ "text": "AggregateQuery" } ], - "path": "packages/kbn-text-based-editor/src/types.ts", + "path": "packages/kbn-esql-editor/src/types.ts", "deprecated": false, "trackAdoption": false, "isRequired": true @@ -173,7 +129,7 @@ }, { "parentPluginId": "esql", - "id": "def-public.TextBasedLanguagesEditorProps.onTextLangQuerySubmit", + "id": "def-public.ESQLEditorProps.onTextLangQuerySubmit", "type": "Function", "tags": [], "label": "onTextLangQuerySubmit", @@ -191,13 +147,13 @@ }, " | undefined, abortController?: AbortController | undefined) => Promise" ], - "path": "packages/kbn-text-based-editor/src/types.ts", + "path": "packages/kbn-esql-editor/src/types.ts", "deprecated": false, "trackAdoption": false, "children": [ { "parentPluginId": "esql", - "id": "def-public.TextBasedLanguagesEditorProps.onTextLangQuerySubmit.$1", + "id": "def-public.ESQLEditorProps.onTextLangQuerySubmit.$1", "type": "Object", "tags": [], "label": "query", @@ -212,14 +168,14 @@ }, " | undefined" ], - "path": "packages/kbn-text-based-editor/src/types.ts", + "path": "packages/kbn-esql-editor/src/types.ts", "deprecated": false, "trackAdoption": false, "isRequired": false }, { "parentPluginId": "esql", - "id": "def-public.TextBasedLanguagesEditorProps.onTextLangQuerySubmit.$2", + "id": "def-public.ESQLEditorProps.onTextLangQuerySubmit.$2", "type": "Object", "tags": [], "label": "abortController", @@ -227,7 +183,7 @@ "signature": [ "AbortController | undefined" ], - "path": "packages/kbn-text-based-editor/src/types.ts", + "path": "packages/kbn-esql-editor/src/types.ts", "deprecated": false, "trackAdoption": false, "isRequired": false @@ -237,7 +193,7 @@ }, { "parentPluginId": "esql", - "id": "def-public.TextBasedLanguagesEditorProps.detectedTimestamp", + "id": "def-public.ESQLEditorProps.detectedTimestamp", "type": "string", "tags": [], "label": "detectedTimestamp", @@ -247,13 +203,13 @@ "signature": [ "string | undefined" ], - "path": "packages/kbn-text-based-editor/src/types.ts", + "path": "packages/kbn-esql-editor/src/types.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "esql", - "id": "def-public.TextBasedLanguagesEditorProps.errors", + "id": "def-public.ESQLEditorProps.errors", "type": "Array", "tags": [], "label": "errors", @@ -263,13 +219,13 @@ "signature": [ "Error[] | undefined" ], - "path": "packages/kbn-text-based-editor/src/types.ts", + "path": "packages/kbn-esql-editor/src/types.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "esql", - "id": "def-public.TextBasedLanguagesEditorProps.warning", + "id": "def-public.ESQLEditorProps.warning", "type": "string", "tags": [], "label": "warning", @@ -279,13 +235,13 @@ "signature": [ "string | undefined" ], - "path": "packages/kbn-text-based-editor/src/types.ts", + "path": "packages/kbn-esql-editor/src/types.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "esql", - "id": "def-public.TextBasedLanguagesEditorProps.isLoading", + "id": "def-public.ESQLEditorProps.isLoading", "type": "CompoundType", "tags": [], "label": "isLoading", @@ -295,13 +251,13 @@ "signature": [ "boolean | undefined" ], - "path": "packages/kbn-text-based-editor/src/types.ts", + "path": "packages/kbn-esql-editor/src/types.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "esql", - "id": "def-public.TextBasedLanguagesEditorProps.isDisabled", + "id": "def-public.ESQLEditorProps.isDisabled", "type": "CompoundType", "tags": [], "label": "isDisabled", @@ -311,13 +267,13 @@ "signature": [ "boolean | undefined" ], - "path": "packages/kbn-text-based-editor/src/types.ts", + "path": "packages/kbn-esql-editor/src/types.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "esql", - "id": "def-public.TextBasedLanguagesEditorProps.dataTestSubj", + "id": "def-public.ESQLEditorProps.dataTestSubj", "type": "string", "tags": [], "label": "dataTestSubj", @@ -325,13 +281,13 @@ "signature": [ "string | undefined" ], - "path": "packages/kbn-text-based-editor/src/types.ts", + "path": "packages/kbn-esql-editor/src/types.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "esql", - "id": "def-public.TextBasedLanguagesEditorProps.hideRunQueryText", + "id": "def-public.ESQLEditorProps.hideRunQueryText", "type": "CompoundType", "tags": [], "label": "hideRunQueryText", @@ -341,13 +297,13 @@ "signature": [ "boolean | undefined" ], - "path": "packages/kbn-text-based-editor/src/types.ts", + "path": "packages/kbn-esql-editor/src/types.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "esql", - "id": "def-public.TextBasedLanguagesEditorProps.editorIsInline", + "id": "def-public.ESQLEditorProps.editorIsInline", "type": "CompoundType", "tags": [], "label": "editorIsInline", @@ -357,13 +313,13 @@ "signature": [ "boolean | undefined" ], - "path": "packages/kbn-text-based-editor/src/types.ts", + "path": "packages/kbn-esql-editor/src/types.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "esql", - "id": "def-public.TextBasedLanguagesEditorProps.disableSubmitAction", + "id": "def-public.ESQLEditorProps.disableSubmitAction", "type": "CompoundType", "tags": [], "label": "disableSubmitAction", @@ -373,13 +329,13 @@ "signature": [ "boolean | undefined" ], - "path": "packages/kbn-text-based-editor/src/types.ts", + "path": "packages/kbn-esql-editor/src/types.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "esql", - "id": "def-public.TextBasedLanguagesEditorProps.allowQueryCancellation", + "id": "def-public.ESQLEditorProps.allowQueryCancellation", "type": "CompoundType", "tags": [], "label": "allowQueryCancellation", @@ -389,13 +345,13 @@ "signature": [ "boolean | undefined" ], - "path": "packages/kbn-text-based-editor/src/types.ts", + "path": "packages/kbn-esql-editor/src/types.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "esql", - "id": "def-public.TextBasedLanguagesEditorProps.hideTimeFilterInfo", + "id": "def-public.ESQLEditorProps.hideTimeFilterInfo", "type": "CompoundType", "tags": [], "label": "hideTimeFilterInfo", @@ -405,13 +361,13 @@ "signature": [ "boolean | undefined" ], - "path": "packages/kbn-text-based-editor/src/types.ts", + "path": "packages/kbn-esql-editor/src/types.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "esql", - "id": "def-public.TextBasedLanguagesEditorProps.hideQueryHistory", + "id": "def-public.ESQLEditorProps.hideQueryHistory", "type": "CompoundType", "tags": [], "label": "hideQueryHistory", @@ -421,13 +377,13 @@ "signature": [ "boolean | undefined" ], - "path": "packages/kbn-text-based-editor/src/types.ts", + "path": "packages/kbn-esql-editor/src/types.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "esql", - "id": "def-public.TextBasedLanguagesEditorProps.hasOutline", + "id": "def-public.ESQLEditorProps.hasOutline", "type": "CompoundType", "tags": [], "label": "hasOutline", @@ -437,13 +393,13 @@ "signature": [ "boolean | undefined" ], - "path": "packages/kbn-text-based-editor/src/types.ts", + "path": "packages/kbn-esql-editor/src/types.ts", "deprecated": false, "trackAdoption": false }, { "parentPluginId": "esql", - "id": "def-public.TextBasedLanguagesEditorProps.displayDocumentationAsFlyout", + "id": "def-public.ESQLEditorProps.displayDocumentationAsFlyout", "type": "CompoundType", "tags": [], "label": "displayDocumentationAsFlyout", @@ -453,7 +409,51 @@ "signature": [ "boolean | undefined" ], - "path": "packages/kbn-text-based-editor/src/types.ts", + "path": "packages/kbn-esql-editor/src/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "esql", + "id": "def-public.EsqlPluginStart", + "type": "Interface", + "tags": [], + "label": "EsqlPluginStart", + "description": [], + "path": "src/plugins/esql/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "esql", + "id": "def-public.EsqlPluginStart.Editor", + "type": "CompoundType", + "tags": [], + "label": "Editor", + "description": [], + "signature": [ + "React.ComponentClass<", + { + "pluginId": "@kbn/esql-editor", + "scope": "public", + "docId": "kibKbnEsqlEditorPluginApi", + "section": "def-public.ESQLEditorProps", + "text": "ESQLEditorProps" + }, + ", any> | React.FunctionComponent<", + { + "pluginId": "@kbn/esql-editor", + "scope": "public", + "docId": "kibKbnEsqlEditorPluginApi", + "section": "def-public.ESQLEditorProps", + "text": "ESQLEditorProps" + }, + ">" + ], + "path": "src/plugins/esql/public/types.ts", "deprecated": false, "trackAdoption": false } diff --git a/api_docs/esql.mdx b/api_docs/esql.mdx index 69b083d4da898..9efe959e7bc70 100644 --- a/api_docs/esql.mdx +++ b/api_docs/esql.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esql title: "esql" image: https://source.unsplash.com/400x175/?github description: API docs for the esql plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esql'] --- import esqlObj from './esql.devdocs.json'; diff --git a/api_docs/esql_data_grid.mdx b/api_docs/esql_data_grid.mdx index bc93b6299f454..95b3c88b57af0 100644 --- a/api_docs/esql_data_grid.mdx +++ b/api_docs/esql_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esqlDataGrid title: "esqlDataGrid" image: https://source.unsplash.com/400x175/?github description: API docs for the esqlDataGrid plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esqlDataGrid'] --- import esqlDataGridObj from './esql_data_grid.devdocs.json'; diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index 048fb53c21021..0d28886605bc4 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] --- import eventAnnotationObj from './event_annotation.devdocs.json'; diff --git a/api_docs/event_annotation_listing.mdx b/api_docs/event_annotation_listing.mdx index 2d0f4d86336de..d660fba41a46f 100644 --- a/api_docs/event_annotation_listing.mdx +++ b/api_docs/event_annotation_listing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotationListing title: "eventAnnotationListing" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotationListing plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotationListing'] --- import eventAnnotationListingObj from './event_annotation_listing.devdocs.json'; diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index 667d3856064a3..59f8b295ca997 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: 2024-09-23 +date: 2024-09-24 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 48659743aef7b..63521a0579490 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: 2024-09-23 +date: 2024-09-24 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 170f3a43e0dd6..7d49149b646fb 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: 2024-09-23 +date: 2024-09-24 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 203e92bfa12ef..e281d351e3ba0 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: 2024-09-23 +date: 2024-09-24 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 e54d35f29b3d8..094ec8fcd5455 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: 2024-09-23 +date: 2024-09-24 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 e2068a08af1da..8d16b7d8a239d 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: 2024-09-23 +date: 2024-09-24 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 0d78ea0ebe73b..4c8e773bdccaf 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: 2024-09-23 +date: 2024-09-24 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 410b3326a166a..102cb268395a8 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: 2024-09-23 +date: 2024-09-24 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 d07bdccd3715f..c779047f78321 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: 2024-09-23 +date: 2024-09-24 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 0b7d9d8319e00..f5150747dea3d 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: 2024-09-23 +date: 2024-09-24 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 60f3ff0e65a7f..50b3ca00941a0 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: 2024-09-23 +date: 2024-09-24 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 a91258587d0fa..5637121433fee 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: 2024-09-23 +date: 2024-09-24 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 1a8bdcff2906b..ea4c2b66d66fc 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: 2024-09-23 +date: 2024-09-24 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 710cfd3cb0a0f..17bcaa1f8197e 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: 2024-09-23 +date: 2024-09-24 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 7d9f43c97005b..7daa45e0d681a 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: 2024-09-23 +date: 2024-09-24 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 3b6d9e10572e2..44f62b6432446 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: 2024-09-23 +date: 2024-09-24 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 cf27946387260..61589cb0f7bb7 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: 2024-09-23 +date: 2024-09-24 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 0c0fcebcdd25d..23cdfcc28f72a 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] --- import fieldFormatsObj from './field_formats.devdocs.json'; diff --git a/api_docs/fields_metadata.mdx b/api_docs/fields_metadata.mdx index d142d487f17db..6371bb70d8cf4 100644 --- a/api_docs/fields_metadata.mdx +++ b/api_docs/fields_metadata.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldsMetadata title: "fieldsMetadata" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldsMetadata plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldsMetadata'] --- import fieldsMetadataObj from './fields_metadata.devdocs.json'; diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index ee8533dc63e73..11f5d410bf24a 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: 2024-09-23 +date: 2024-09-24 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 c4d67f2e5c3d4..eedeedd1b1a97 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: 2024-09-23 +date: 2024-09-24 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 84b2e56d30778..d3041bd9eae02 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index 8629c06773f43..51ae737bb7487 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] --- import fleetObj from './fleet.devdocs.json'; diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index 872e356706dbc..0cc7e9c537606 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: 2024-09-23 +date: 2024-09-24 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 0a05893662545..08058b8d537bc 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: 2024-09-23 +date: 2024-09-24 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 f17cf5c15ada2..eba6796cd71d7 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: 2024-09-23 +date: 2024-09-24 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 9049b20281b5f..594fe09b2ab16 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: 2024-09-23 +date: 2024-09-24 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 235229cc67312..aa035bdd68ac8 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: 2024-09-23 +date: 2024-09-24 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 4f5a15d8155fd..9e529b8626571 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] --- import indexManagementObj from './index_management.devdocs.json'; diff --git a/api_docs/inference.mdx b/api_docs/inference.mdx index bbe87f141d4f6..bc6f6dede9319 100644 --- a/api_docs/inference.mdx +++ b/api_docs/inference.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inference title: "inference" image: https://source.unsplash.com/400x175/?github description: API docs for the inference plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inference'] --- import inferenceObj from './inference.devdocs.json'; diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index a2ac0dcf4f298..5250a33b95bb3 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] --- import infraObj from './infra.devdocs.json'; diff --git a/api_docs/ingest_pipelines.mdx b/api_docs/ingest_pipelines.mdx index e15c16e85aedb..2b06d27539715 100644 --- a/api_docs/ingest_pipelines.mdx +++ b/api_docs/ingest_pipelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ingestPipelines title: "ingestPipelines" image: https://source.unsplash.com/400x175/?github description: API docs for the ingestPipelines plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ingestPipelines'] --- import ingestPipelinesObj from './ingest_pipelines.devdocs.json'; diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index aa9bfcf0cd663..add2168a24238 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] --- import inspectorObj from './inspector.devdocs.json'; diff --git a/api_docs/integration_assistant.mdx b/api_docs/integration_assistant.mdx index a690a6a8defae..5aa7290485662 100644 --- a/api_docs/integration_assistant.mdx +++ b/api_docs/integration_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/integrationAssistant title: "integrationAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the integrationAssistant plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'integrationAssistant'] --- import integrationAssistantObj from './integration_assistant.devdocs.json'; diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx index 62c33ea5d9f3f..36e36f907bd99 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] --- import interactiveSetupObj from './interactive_setup.devdocs.json'; diff --git a/api_docs/inventory.devdocs.json b/api_docs/inventory.devdocs.json index d58433a956b01..770e17cffa5c2 100644 --- a/api_docs/inventory.devdocs.json +++ b/api_docs/inventory.devdocs.json @@ -50,7 +50,19 @@ "label": "InventoryServerRouteRepository", "description": [], "signature": [ - "{ \"GET /internal/inventory/entities\": ", + "{ \"GET /internal/inventory/entities/types\": ", + { + "pluginId": "@kbn/server-route-repository-utils", + "scope": "common", + "docId": "kibKbnServerRouteRepositoryUtilsPluginApi", + "section": "def-common.ServerRoute", + "text": "ServerRoute" + }, + "<\"GET /internal/inventory/entities/types\", undefined, ", + "InventoryRouteHandlerResources", + ", { entityTypes: (\"service\" | \"host\" | \"container\")[]; }, ", + "InventoryRouteCreateOptions", + ">; \"GET /internal/inventory/entities\": ", { "pluginId": "@kbn/server-route-repository-utils", "scope": "common", @@ -76,7 +88,9 @@ "PartialC", "<{ entityTypes: ", "Type", - "<(\"service\" | \"host\" | \"container\")[], string, unknown>; }>]>; }>, ", + "<(\"service\" | \"host\" | \"container\")[], string, unknown>; kuery: ", + "StringC", + "; }>]>; }>, ", "InventoryRouteHandlerResources", ", { entities: ", "LatestEntity", diff --git a/api_docs/inventory.mdx b/api_docs/inventory.mdx index 1f78420c8ff8b..18f4903574348 100644 --- a/api_docs/inventory.mdx +++ b/api_docs/inventory.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inventory title: "inventory" image: https://source.unsplash.com/400x175/?github description: API docs for the inventory plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inventory'] --- import inventoryObj from './inventory.devdocs.json'; diff --git a/api_docs/investigate.mdx b/api_docs/investigate.mdx index 9cf9face3de83..e66ab71980e21 100644 --- a/api_docs/investigate.mdx +++ b/api_docs/investigate.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/investigate title: "investigate" image: https://source.unsplash.com/400x175/?github description: API docs for the investigate plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'investigate'] --- import investigateObj from './investigate.devdocs.json'; diff --git a/api_docs/investigate_app.mdx b/api_docs/investigate_app.mdx index f7f900f1d0a77..82456ae64e3dc 100644 --- a/api_docs/investigate_app.mdx +++ b/api_docs/investigate_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/investigateApp title: "investigateApp" image: https://source.unsplash.com/400x175/?github description: API docs for the investigateApp plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'investigateApp'] --- import investigateAppObj from './investigate_app.devdocs.json'; diff --git a/api_docs/kbn_ace.mdx b/api_docs/kbn_ace.mdx index 223bef365590a..825691399434a 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] --- import kbnAceObj from './kbn_ace.devdocs.json'; diff --git a/api_docs/kbn_actions_types.mdx b/api_docs/kbn_actions_types.mdx index 75a9b76c7977e..3a21501f65d61 100644 --- a/api_docs/kbn_actions_types.mdx +++ b/api_docs/kbn_actions_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-actions-types title: "@kbn/actions-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/actions-types plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/actions-types'] --- import kbnActionsTypesObj from './kbn_actions_types.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index 13403c78daa5e..2ca07490b0fcf 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components'] --- import kbnAiopsComponentsObj from './kbn_aiops_components.devdocs.json'; diff --git a/api_docs/kbn_aiops_log_pattern_analysis.mdx b/api_docs/kbn_aiops_log_pattern_analysis.mdx index f9cfbf17ec235..4cf7bd6a2b7d3 100644 --- a/api_docs/kbn_aiops_log_pattern_analysis.mdx +++ b/api_docs/kbn_aiops_log_pattern_analysis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-log-pattern-analysis title: "@kbn/aiops-log-pattern-analysis" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-log-pattern-analysis plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-log-pattern-analysis'] --- import kbnAiopsLogPatternAnalysisObj from './kbn_aiops_log_pattern_analysis.devdocs.json'; diff --git a/api_docs/kbn_aiops_log_rate_analysis.mdx b/api_docs/kbn_aiops_log_rate_analysis.mdx index 06db362fa0e67..4a09956ab859c 100644 --- a/api_docs/kbn_aiops_log_rate_analysis.mdx +++ b/api_docs/kbn_aiops_log_rate_analysis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-log-rate-analysis title: "@kbn/aiops-log-rate-analysis" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-log-rate-analysis plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-log-rate-analysis'] --- import kbnAiopsLogRateAnalysisObj from './kbn_aiops_log_rate_analysis.devdocs.json'; diff --git a/api_docs/kbn_alerting_api_integration_helpers.mdx b/api_docs/kbn_alerting_api_integration_helpers.mdx index cc78a9a6a3ca7..92c062e3a2d1d 100644 --- a/api_docs/kbn_alerting_api_integration_helpers.mdx +++ b/api_docs/kbn_alerting_api_integration_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-api-integration-helpers title: "@kbn/alerting-api-integration-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-api-integration-helpers plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-api-integration-helpers'] --- import kbnAlertingApiIntegrationHelpersObj from './kbn_alerting_api_integration_helpers.devdocs.json'; diff --git a/api_docs/kbn_alerting_comparators.mdx b/api_docs/kbn_alerting_comparators.mdx index 19ff3f819f4eb..3703cb083cbe4 100644 --- a/api_docs/kbn_alerting_comparators.mdx +++ b/api_docs/kbn_alerting_comparators.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-comparators title: "@kbn/alerting-comparators" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-comparators plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-comparators'] --- import kbnAlertingComparatorsObj from './kbn_alerting_comparators.devdocs.json'; diff --git a/api_docs/kbn_alerting_state_types.mdx b/api_docs/kbn_alerting_state_types.mdx index aefbfa43fedc1..d7ffd7156a302 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-state-types'] --- import kbnAlertingStateTypesObj from './kbn_alerting_state_types.devdocs.json'; diff --git a/api_docs/kbn_alerting_types.mdx b/api_docs/kbn_alerting_types.mdx index 7f4c4d1754e02..3371c21676aa4 100644 --- a/api_docs/kbn_alerting_types.mdx +++ b/api_docs/kbn_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-types title: "@kbn/alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-types plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-types'] --- import kbnAlertingTypesObj from './kbn_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_alerts_as_data_utils.mdx b/api_docs/kbn_alerts_as_data_utils.mdx index 96e8bfd263664..9494274dbff73 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: 2024-09-23 +date: 2024-09-24 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_grouping.mdx b/api_docs/kbn_alerts_grouping.mdx index 3d8d52b82115d..1ea07b57ce762 100644 --- a/api_docs/kbn_alerts_grouping.mdx +++ b/api_docs/kbn_alerts_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-grouping title: "@kbn/alerts-grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-grouping plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-grouping'] --- import kbnAlertsGroupingObj from './kbn_alerts_grouping.devdocs.json'; diff --git a/api_docs/kbn_alerts_ui_shared.mdx b/api_docs/kbn_alerts_ui_shared.mdx index d993d7cde041c..6d8c23d337f3d 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: 2024-09-23 +date: 2024-09-24 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 ecf18883e4caa..f0c91e74aa0c8 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_collection_utils.mdx b/api_docs/kbn_analytics_collection_utils.mdx index d418b6c484928..5ab7f518c409f 100644 --- a/api_docs/kbn_analytics_collection_utils.mdx +++ b/api_docs/kbn_analytics_collection_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-collection-utils title: "@kbn/analytics-collection-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-collection-utils plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-collection-utils'] --- import kbnAnalyticsCollectionUtilsObj from './kbn_analytics_collection_utils.devdocs.json'; diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index 4e2c15838912d..c0fc9de61a0ed 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: 2024-09-23 +date: 2024-09-24 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_data_view.mdx b/api_docs/kbn_apm_data_view.mdx index a8c0305f6150c..0454535a451cb 100644 --- a/api_docs/kbn_apm_data_view.mdx +++ b/api_docs/kbn_apm_data_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-data-view title: "@kbn/apm-data-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-data-view plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-data-view'] --- import kbnApmDataViewObj from './kbn_apm_data_view.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace.mdx b/api_docs/kbn_apm_synthtrace.mdx index 7b3e0e5edc359..6cd306df8c2ca 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: 2024-09-23 +date: 2024-09-24 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 3da033437336b..63b8c74ab736c 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: 2024-09-23 +date: 2024-09-24 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_types.mdx b/api_docs/kbn_apm_types.mdx index 4d63a2bce4ad9..ddf11aabe123c 100644 --- a/api_docs/kbn_apm_types.mdx +++ b/api_docs/kbn_apm_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-types title: "@kbn/apm-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-types plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-types'] --- import kbnApmTypesObj from './kbn_apm_types.devdocs.json'; diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index 30568f136c9af..a08508ecc0345 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils'] --- import kbnApmUtilsObj from './kbn_apm_utils.devdocs.json'; diff --git a/api_docs/kbn_avc_banner.mdx b/api_docs/kbn_avc_banner.mdx index 6914e4d17b2d5..ff52e8a16a17e 100644 --- a/api_docs/kbn_avc_banner.mdx +++ b/api_docs/kbn_avc_banner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-avc-banner title: "@kbn/avc-banner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/avc-banner plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/avc-banner'] --- import kbnAvcBannerObj from './kbn_avc_banner.devdocs.json'; diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx index 54fe0e7af796b..7a81c0e0236d4 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config'] --- import kbnAxeConfigObj from './kbn_axe_config.devdocs.json'; diff --git a/api_docs/kbn_bfetch_error.mdx b/api_docs/kbn_bfetch_error.mdx index 4b3ce4f3b7a0b..2828d79e64272 100644 --- a/api_docs/kbn_bfetch_error.mdx +++ b/api_docs/kbn_bfetch_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-bfetch-error title: "@kbn/bfetch-error" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/bfetch-error plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/bfetch-error'] --- import kbnBfetchErrorObj from './kbn_bfetch_error.devdocs.json'; diff --git a/api_docs/kbn_calculate_auto.mdx b/api_docs/kbn_calculate_auto.mdx index 300f6a8b014cd..6a9955c54a6cd 100644 --- a/api_docs/kbn_calculate_auto.mdx +++ b/api_docs/kbn_calculate_auto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-auto title: "@kbn/calculate-auto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-auto plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-auto'] --- import kbnCalculateAutoObj from './kbn_calculate_auto.devdocs.json'; diff --git a/api_docs/kbn_calculate_width_from_char_count.mdx b/api_docs/kbn_calculate_width_from_char_count.mdx index 2096ccac4090d..b2a23f717f07a 100644 --- a/api_docs/kbn_calculate_width_from_char_count.mdx +++ b/api_docs/kbn_calculate_width_from_char_count.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-calculate-width-from-char-count title: "@kbn/calculate-width-from-char-count" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/calculate-width-from-char-count plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/calculate-width-from-char-count'] --- import kbnCalculateWidthFromCharCountObj from './kbn_calculate_width_from_char_count.devdocs.json'; diff --git a/api_docs/kbn_cases_components.mdx b/api_docs/kbn_cases_components.mdx index d41720408675d..e364e6c974dbc 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cases-components'] --- import kbnCasesComponentsObj from './kbn_cases_components.devdocs.json'; diff --git a/api_docs/kbn_cbor.mdx b/api_docs/kbn_cbor.mdx index 27ac176c8cf32..f423e9f3eefeb 100644 --- a/api_docs/kbn_cbor.mdx +++ b/api_docs/kbn_cbor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cbor title: "@kbn/cbor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cbor plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cbor'] --- import kbnCborObj from './kbn_cbor.devdocs.json'; diff --git a/api_docs/kbn_cell_actions.mdx b/api_docs/kbn_cell_actions.mdx index 7c0938d1e26db..8ca941727f143 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: 2024-09-23 +date: 2024-09-24 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 9b78eaf259dbe..58cb89e593100 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: 2024-09-23 +date: 2024-09-24 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 1eed2b9bc6890..01878560ada48 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: 2024-09-23 +date: 2024-09-24 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 2ed7486db39a2..90bc0b48a618a 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: 2024-09-23 +date: 2024-09-24 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 4b16b5201bcb0..f940e447f6e2e 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: 2024-09-23 +date: 2024-09-24 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 3b7a10aba6001..f84b88253e17f 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: 2024-09-23 +date: 2024-09-24 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 9fd6a7e3b867b..c2e6471748c8f 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] --- import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json'; diff --git a/api_docs/kbn_cloud_security_posture.mdx b/api_docs/kbn_cloud_security_posture.mdx index 691626a71a317..e40a512efa066 100644 --- a/api_docs/kbn_cloud_security_posture.mdx +++ b/api_docs/kbn_cloud_security_posture.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cloud-security-posture title: "@kbn/cloud-security-posture" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cloud-security-posture plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cloud-security-posture'] --- import kbnCloudSecurityPostureObj from './kbn_cloud_security_posture.devdocs.json'; diff --git a/api_docs/kbn_cloud_security_posture_common.mdx b/api_docs/kbn_cloud_security_posture_common.mdx index 17eb8b25275aa..a45af9f8a75c9 100644 --- a/api_docs/kbn_cloud_security_posture_common.mdx +++ b/api_docs/kbn_cloud_security_posture_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cloud-security-posture-common title: "@kbn/cloud-security-posture-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cloud-security-posture-common plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cloud-security-posture-common'] --- import kbnCloudSecurityPostureCommonObj from './kbn_cloud_security_posture_common.devdocs.json'; diff --git a/api_docs/kbn_code_editor.mdx b/api_docs/kbn_code_editor.mdx index 82682a7f71edb..ac6c40d7fde46 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor'] --- import kbnCodeEditorObj from './kbn_code_editor.devdocs.json'; diff --git a/api_docs/kbn_code_editor_mock.mdx b/api_docs/kbn_code_editor_mock.mdx index e783fcab60b15..0b4b8b28d104d 100644 --- a/api_docs/kbn_code_editor_mock.mdx +++ b/api_docs/kbn_code_editor_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor-mock title: "@kbn/code-editor-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor-mock plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor-mock'] --- import kbnCodeEditorMockObj from './kbn_code_editor_mock.devdocs.json'; diff --git a/api_docs/kbn_code_owners.mdx b/api_docs/kbn_code_owners.mdx index cad5babc102ce..84af4b907f5ff 100644 --- a/api_docs/kbn_code_owners.mdx +++ b/api_docs/kbn_code_owners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-owners title: "@kbn/code-owners" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-owners plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-owners'] --- import kbnCodeOwnersObj from './kbn_code_owners.devdocs.json'; diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index e2c8154445726..5f3a39a329d3d 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: 2024-09-23 +date: 2024-09-24 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 b0a57f489dd65..3f21285fe83cc 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: 2024-09-23 +date: 2024-09-24 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 b07591481d449..9fad42f34500f 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: 2024-09-23 +date: 2024-09-24 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 9613201257629..390bf7bc9c535 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: 2024-09-23 +date: 2024-09-24 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 fba75dfb37d0b..a9a49ec18d91c 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: 2024-09-23 +date: 2024-09-24 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_content_insights_public.mdx b/api_docs/kbn_content_management_content_insights_public.mdx index acfd3607beeb1..5005bbe661b87 100644 --- a/api_docs/kbn_content_management_content_insights_public.mdx +++ b/api_docs/kbn_content_management_content_insights_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-insights-public title: "@kbn/content-management-content-insights-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-insights-public plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-insights-public'] --- import kbnContentManagementContentInsightsPublicObj from './kbn_content_management_content_insights_public.devdocs.json'; diff --git a/api_docs/kbn_content_management_content_insights_server.mdx b/api_docs/kbn_content_management_content_insights_server.mdx index 96948fd3e472a..517758c9de2a7 100644 --- a/api_docs/kbn_content_management_content_insights_server.mdx +++ b/api_docs/kbn_content_management_content_insights_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-insights-server title: "@kbn/content-management-content-insights-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-insights-server plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-insights-server'] --- import kbnContentManagementContentInsightsServerObj from './kbn_content_management_content_insights_server.devdocs.json'; diff --git a/api_docs/kbn_content_management_favorites_public.mdx b/api_docs/kbn_content_management_favorites_public.mdx index a8097901e5762..49dc90b955fd7 100644 --- a/api_docs/kbn_content_management_favorites_public.mdx +++ b/api_docs/kbn_content_management_favorites_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-favorites-public title: "@kbn/content-management-favorites-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-favorites-public plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-favorites-public'] --- import kbnContentManagementFavoritesPublicObj from './kbn_content_management_favorites_public.devdocs.json'; diff --git a/api_docs/kbn_content_management_favorites_server.mdx b/api_docs/kbn_content_management_favorites_server.mdx index 30bb73888d630..79aee99bddbd6 100644 --- a/api_docs/kbn_content_management_favorites_server.mdx +++ b/api_docs/kbn_content_management_favorites_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-favorites-server title: "@kbn/content-management-favorites-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-favorites-server plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-favorites-server'] --- import kbnContentManagementFavoritesServerObj from './kbn_content_management_favorites_server.devdocs.json'; diff --git a/api_docs/kbn_content_management_tabbed_table_list_view.mdx b/api_docs/kbn_content_management_tabbed_table_list_view.mdx index d51ad9435f37c..6d34a118dd6b5 100644 --- a/api_docs/kbn_content_management_tabbed_table_list_view.mdx +++ b/api_docs/kbn_content_management_tabbed_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-tabbed-table-list-view title: "@kbn/content-management-tabbed-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-tabbed-table-list-view plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-tabbed-table-list-view'] --- import kbnContentManagementTabbedTableListViewObj from './kbn_content_management_tabbed_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view.mdx b/api_docs/kbn_content_management_table_list_view.mdx index c25636de5b881..6f915b592ba90 100644 --- a/api_docs/kbn_content_management_table_list_view.mdx +++ b/api_docs/kbn_content_management_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view title: "@kbn/content-management-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view'] --- import kbnContentManagementTableListViewObj from './kbn_content_management_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_common.mdx b/api_docs/kbn_content_management_table_list_view_common.mdx index 8cec9381c2e09..86873e3e295fd 100644 --- a/api_docs/kbn_content_management_table_list_view_common.mdx +++ b/api_docs/kbn_content_management_table_list_view_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-common title: "@kbn/content-management-table-list-view-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-common plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-common'] --- import kbnContentManagementTableListViewCommonObj from './kbn_content_management_table_list_view_common.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_table.mdx b/api_docs/kbn_content_management_table_list_view_table.mdx index cefa6049ed1f2..37daad191264f 100644 --- a/api_docs/kbn_content_management_table_list_view_table.mdx +++ b/api_docs/kbn_content_management_table_list_view_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-table title: "@kbn/content-management-table-list-view-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-table plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-table'] --- import kbnContentManagementTableListViewTableObj from './kbn_content_management_table_list_view_table.devdocs.json'; diff --git a/api_docs/kbn_content_management_user_profiles.mdx b/api_docs/kbn_content_management_user_profiles.mdx index f2787cb616266..c7a476c20345f 100644 --- a/api_docs/kbn_content_management_user_profiles.mdx +++ b/api_docs/kbn_content_management_user_profiles.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-user-profiles title: "@kbn/content-management-user-profiles" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-user-profiles plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-user-profiles'] --- import kbnContentManagementUserProfilesObj from './kbn_content_management_user_profiles.devdocs.json'; diff --git a/api_docs/kbn_content_management_utils.mdx b/api_docs/kbn_content_management_utils.mdx index 18200b9f8e0b2..e75fefdec0e1a 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: 2024-09-23 +date: 2024-09-24 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 3df1a69e6174e..bf58aa3b9e7ba 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: 2024-09-23 +date: 2024-09-24 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 c96b5e320ab6b..6e2624a97ff9e 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: 2024-09-23 +date: 2024-09-24 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 f4f858e5b2d7a..5f7a50b0c20a2 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: 2024-09-23 +date: 2024-09-24 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 16f5d3717632a..2dea65ee976b8 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: 2024-09-23 +date: 2024-09-24 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 a5cf641e919f3..e433a632cc926 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: 2024-09-23 +date: 2024-09-24 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 60be05ba7e737..fc0af57e9e14d 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: 2024-09-23 +date: 2024-09-24 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 be42486b562d4..05c44d3b644d0 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: 2024-09-23 +date: 2024-09-24 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 205a250d1930f..dcdda31b470f1 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: 2024-09-23 +date: 2024-09-24 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 c41a646fe5221..e52d3279b046e 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: 2024-09-23 +date: 2024-09-24 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 199985afc9f9d..61b3ff477524c 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: 2024-09-23 +date: 2024-09-24 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 119ac3ed0c04d..b2cd0d5d78c5b 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: 2024-09-23 +date: 2024-09-24 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 782e77c9ce722..4a2b01d424b30 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: 2024-09-23 +date: 2024-09-24 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 5d999e66afed4..dc2b30308a6d9 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: 2024-09-23 +date: 2024-09-24 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 6261ffe7253f4..519e005896c56 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: 2024-09-23 +date: 2024-09-24 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 83a086198b20e..5edd5d262e249 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: 2024-09-23 +date: 2024-09-24 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 9711ba19a7bd6..c3687d9c9c17c 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: 2024-09-23 +date: 2024-09-24 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 1755fb65da97b..6237ffd4285f0 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: 2024-09-23 +date: 2024-09-24 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 f526e3e0e4647..104553da41440 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: 2024-09-23 +date: 2024-09-24 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 29da7fdc03769..c8a1bc9a05d0a 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: 2024-09-23 +date: 2024-09-24 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 4701a1361bc4e..6ae1c0e439ee6 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: 2024-09-23 +date: 2024-09-24 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 4a42206bfddd4..46f5c8697faef 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: 2024-09-23 +date: 2024-09-24 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 f91ce095a8381..f9c93a880895e 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: 2024-09-23 +date: 2024-09-24 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 ee61bc9c6a7eb..56d71e4597126 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: 2024-09-23 +date: 2024-09-24 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 b7668081d4ee3..8dddec0d32f69 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: 2024-09-23 +date: 2024-09-24 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 e48e917415d0b..bcff55c0f500b 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: 2024-09-23 +date: 2024-09-24 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 95cf740feff7a..0fd5f0297a345 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: 2024-09-23 +date: 2024-09-24 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 9ceacd82ea55f..82252bd500047 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: 2024-09-23 +date: 2024-09-24 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 3022568b2d394..b972d08ebffe7 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: 2024-09-23 +date: 2024-09-24 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 b38405d330388..0e039413890bc 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: 2024-09-23 +date: 2024-09-24 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 81f3b6504ecac..518f49862ed95 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: 2024-09-23 +date: 2024-09-24 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 949467426e44f..2fb28f64d61eb 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: 2024-09-23 +date: 2024-09-24 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 27fa7e7ad6f52..ef9578b7f7a61 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: 2024-09-23 +date: 2024-09-24 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 0ce1fe6cab123..7ce85cb651f5b 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: 2024-09-23 +date: 2024-09-24 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 7823847efc55e..c738167ae23fb 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: 2024-09-23 +date: 2024-09-24 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 2ca1a9a5995d7..fffb68281ff70 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: 2024-09-23 +date: 2024-09-24 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 05a6fc2800d45..3ca291e9552eb 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: 2024-09-23 +date: 2024-09-24 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 76401015261f3..3bbf68ed0a847 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: 2024-09-23 +date: 2024-09-24 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 f26999c9ccb92..98f2d49e899fa 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: 2024-09-23 +date: 2024-09-24 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 89510f89fb446..00d3b8591e35f 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: 2024-09-23 +date: 2024-09-24 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 e2ace01f4d91a..eca7508ef03a5 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: 2024-09-23 +date: 2024-09-24 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 cb0e47e526147..1ef18b3dc5d01 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: 2024-09-23 +date: 2024-09-24 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 cd6c785eb9766..074380deeb36f 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: 2024-09-23 +date: 2024-09-24 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 a64c8e76457c0..54fa1b9a69f78 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: 2024-09-23 +date: 2024-09-24 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 d318ce092bde2..c1b7cf307564a 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: 2024-09-23 +date: 2024-09-24 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 d7a7d8dd79fb1..57a8b871b936d 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: 2024-09-23 +date: 2024-09-24 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 28b041ffda656..5d5cc8ce86658 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: 2024-09-23 +date: 2024-09-24 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 a4d11955f590b..22db32b3f31c2 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: 2024-09-23 +date: 2024-09-24 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 a878b7bb2d05a..957f6de5250eb 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: 2024-09-23 +date: 2024-09-24 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 f65a6cfa25bac..a8d089021c654 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: 2024-09-23 +date: 2024-09-24 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 e18bbbd590468..5928db58af79e 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: 2024-09-23 +date: 2024-09-24 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 eb02a6e79738b..11f5835fb8af9 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: 2024-09-23 +date: 2024-09-24 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 e4be154316277..5fb9b9a780ddc 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: 2024-09-23 +date: 2024-09-24 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 0fec1d4fd393c..f125035f25c0e 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: 2024-09-23 +date: 2024-09-24 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 d041cff71dab2..c333a6fb7c18d 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: 2024-09-23 +date: 2024-09-24 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 c9014070e632a..3028695166712 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: 2024-09-23 +date: 2024-09-24 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 ff4178f885f5d..319ff8b506216 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: 2024-09-23 +date: 2024-09-24 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 94b91df2ade37..13767574d9515 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: 2024-09-23 +date: 2024-09-24 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 5ae9ae2e2c637..27d8661b46a4d 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: 2024-09-23 +date: 2024-09-24 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_feature_flags_browser.mdx b/api_docs/kbn_core_feature_flags_browser.mdx index 837e3e33a632c..9195541902410 100644 --- a/api_docs/kbn_core_feature_flags_browser.mdx +++ b/api_docs/kbn_core_feature_flags_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-browser title: "@kbn/core-feature-flags-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-browser plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-browser'] --- import kbnCoreFeatureFlagsBrowserObj from './kbn_core_feature_flags_browser.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_browser_internal.mdx b/api_docs/kbn_core_feature_flags_browser_internal.mdx index 8f9b324aa48fa..0646157b7095c 100644 --- a/api_docs/kbn_core_feature_flags_browser_internal.mdx +++ b/api_docs/kbn_core_feature_flags_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-browser-internal title: "@kbn/core-feature-flags-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-browser-internal plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-browser-internal'] --- import kbnCoreFeatureFlagsBrowserInternalObj from './kbn_core_feature_flags_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_browser_mocks.mdx b/api_docs/kbn_core_feature_flags_browser_mocks.mdx index 6ddb387cac9d0..df8c23f101c0f 100644 --- a/api_docs/kbn_core_feature_flags_browser_mocks.mdx +++ b/api_docs/kbn_core_feature_flags_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-browser-mocks title: "@kbn/core-feature-flags-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-browser-mocks plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-browser-mocks'] --- import kbnCoreFeatureFlagsBrowserMocksObj from './kbn_core_feature_flags_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_server.mdx b/api_docs/kbn_core_feature_flags_server.mdx index 5b1946b309e32..c691c5ff9f9b1 100644 --- a/api_docs/kbn_core_feature_flags_server.mdx +++ b/api_docs/kbn_core_feature_flags_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-server title: "@kbn/core-feature-flags-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-server plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-server'] --- import kbnCoreFeatureFlagsServerObj from './kbn_core_feature_flags_server.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_server_internal.mdx b/api_docs/kbn_core_feature_flags_server_internal.mdx index 4fec14f7aab91..9188cab8754fc 100644 --- a/api_docs/kbn_core_feature_flags_server_internal.mdx +++ b/api_docs/kbn_core_feature_flags_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-server-internal title: "@kbn/core-feature-flags-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-server-internal plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-server-internal'] --- import kbnCoreFeatureFlagsServerInternalObj from './kbn_core_feature_flags_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_feature_flags_server_mocks.mdx b/api_docs/kbn_core_feature_flags_server_mocks.mdx index bb595ca54c5b5..2fe8dc9e4d285 100644 --- a/api_docs/kbn_core_feature_flags_server_mocks.mdx +++ b/api_docs/kbn_core_feature_flags_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-feature-flags-server-mocks title: "@kbn/core-feature-flags-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-feature-flags-server-mocks plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-feature-flags-server-mocks'] --- import kbnCoreFeatureFlagsServerMocksObj from './kbn_core_feature_flags_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser.mdx b/api_docs/kbn_core_http_browser.mdx index e6b8cd311ee63..a0fda3da34787 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: 2024-09-23 +date: 2024-09-24 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 8dcf27cacafce..deb8775518e00 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: 2024-09-23 +date: 2024-09-24 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 9369f65971af7..e4c7624cf4743 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: 2024-09-23 +date: 2024-09-24 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 f1d1f27d7d1b0..1aff1db377ea2 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: 2024-09-23 +date: 2024-09-24 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 db25080fbfe34..e2a4f17233d5a 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: 2024-09-23 +date: 2024-09-24 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 68278c812c48d..0e1c9a0b3e9c8 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: 2024-09-23 +date: 2024-09-24 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 8be0dbf992f29..4969ec7d2ec69 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: 2024-09-23 +date: 2024-09-24 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 1407c288d0d11..d29648445158a 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: 2024-09-23 +date: 2024-09-24 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 4a68a3b2a6730..9cac9f4f0c09f 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: 2024-09-23 +date: 2024-09-24 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 e3dfaae50bad8..90284610261bf 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: 2024-09-23 +date: 2024-09-24 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 d6647890e2a91..f1de9cce03445 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: 2024-09-23 +date: 2024-09-24 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 2e4af146f8ebb..4a9ac51fd1d42 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: 2024-09-23 +date: 2024-09-24 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 77084a93da169..99ca28f6df4ed 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: 2024-09-23 +date: 2024-09-24 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 1eab4edff9c52..df56c8d174100 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: 2024-09-23 +date: 2024-09-24 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 a4f8c0fd2cbe5..f313421a8cd00 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: 2024-09-23 +date: 2024-09-24 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 15cfc791df38d..49b5b1c23148d 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: 2024-09-23 +date: 2024-09-24 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 bb18ae0f8a60c..ee9d85ba61060 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: 2024-09-23 +date: 2024-09-24 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 e2d19c3d25631..6f611e902adf2 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: 2024-09-23 +date: 2024-09-24 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 e44a4572314cd..38d8a4ffd0ae9 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: 2024-09-23 +date: 2024-09-24 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 5e6b40e7fcf81..c58fe1973f840 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: 2024-09-23 +date: 2024-09-24 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 57c01c416bf0d..f2c589880a58e 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: 2024-09-23 +date: 2024-09-24 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 51537ccdaf7d2..97437f4879de2 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: 2024-09-23 +date: 2024-09-24 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 87ac6c95413d2..0bf1731a38b35 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: 2024-09-23 +date: 2024-09-24 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 affa19778068b..7c23468e5999c 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: 2024-09-23 +date: 2024-09-24 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 c4d7d63de5056..cd7cc824ab049 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: 2024-09-23 +date: 2024-09-24 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 3a891fb4544e5..d5f3ce0d580fd 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: 2024-09-23 +date: 2024-09-24 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 fc775df783422..16357c88b73c9 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: 2024-09-23 +date: 2024-09-24 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 31d862162945c..805148d177193 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: 2024-09-23 +date: 2024-09-24 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 07d1af4780246..9c6d4234fa88b 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: 2024-09-23 +date: 2024-09-24 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 7e1a3d308c6e6..1f5c7c2bda574 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: 2024-09-23 +date: 2024-09-24 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 1fa6a538f1a4f..4151311533c68 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: 2024-09-23 +date: 2024-09-24 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 4216acde77ada..5221005748b32 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: 2024-09-23 +date: 2024-09-24 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 f69efae675890..89cf888a7b7e0 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: 2024-09-23 +date: 2024-09-24 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 0aedefa5eb611..91866e335fe22 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: 2024-09-23 +date: 2024-09-24 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 a853bf3e68453..20d1a03bf21b4 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: 2024-09-23 +date: 2024-09-24 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 04bcdf30a541b..73574035fc535 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: 2024-09-23 +date: 2024-09-24 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 ca1f8c737bc4d..c5bfb2e1bad13 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: 2024-09-23 +date: 2024-09-24 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 af8203ba16d6b..7ffe383f4034e 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: 2024-09-23 +date: 2024-09-24 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 406099649b20c..3a3c85c7d665e 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: 2024-09-23 +date: 2024-09-24 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 4fd0ccf534623..48b6dabfe0272 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: 2024-09-23 +date: 2024-09-24 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 3f328d5fd528a..ae6d4a367313c 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: 2024-09-23 +date: 2024-09-24 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 67ed0a8bdbcc4..d1b3a8a22a5c0 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: 2024-09-23 +date: 2024-09-24 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 2db575f4214ff..94f42f57589df 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: 2024-09-23 +date: 2024-09-24 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 65a9eea7ef721..fa316f5e6b120 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: 2024-09-23 +date: 2024-09-24 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 c903a18965096..aa538bfba32dd 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: 2024-09-23 +date: 2024-09-24 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 23ccca8c3830e..02633a8e2f2d2 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: 2024-09-23 +date: 2024-09-24 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 b16f285fe3142..46a92b54f8164 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: 2024-09-23 +date: 2024-09-24 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 29b8824299f38..dc198a84311d9 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: 2024-09-23 +date: 2024-09-24 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_contracts_browser.mdx b/api_docs/kbn_core_plugins_contracts_browser.mdx index 7f88e41b9d32d..07030be07a31a 100644 --- a/api_docs/kbn_core_plugins_contracts_browser.mdx +++ b/api_docs/kbn_core_plugins_contracts_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-browser title: "@kbn/core-plugins-contracts-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-browser plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-browser'] --- import kbnCorePluginsContractsBrowserObj from './kbn_core_plugins_contracts_browser.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_contracts_server.mdx b/api_docs/kbn_core_plugins_contracts_server.mdx index 5aa93ae65598f..e8cbf6061556c 100644 --- a/api_docs/kbn_core_plugins_contracts_server.mdx +++ b/api_docs/kbn_core_plugins_contracts_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-contracts-server title: "@kbn/core-plugins-contracts-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-contracts-server plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-contracts-server'] --- import kbnCorePluginsContractsServerObj from './kbn_core_plugins_contracts_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server.mdx b/api_docs/kbn_core_plugins_server.mdx index 6b7c1cb0e3e52..264934d0ac05c 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: 2024-09-23 +date: 2024-09-24 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 714f322fc6027..4aab9bdb47542 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: 2024-09-23 +date: 2024-09-24 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 7edc7d68323b6..e3ef2aa8c3b3c 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: 2024-09-23 +date: 2024-09-24 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 d063c725f3972..71c852f15a219 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: 2024-09-23 +date: 2024-09-24 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 07d54b4cb8684..e9523a8674cb4 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: 2024-09-23 +date: 2024-09-24 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 92820e3d64972..98e13f9a9b289 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: 2024-09-23 +date: 2024-09-24 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 9079f89e087d9..6c0f733d5f165 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: 2024-09-23 +date: 2024-09-24 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 6218d4de657a8..1ba0f4ccaa60e 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: 2024-09-23 +date: 2024-09-24 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 1633a36f8c337..5f3a766286d8f 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: 2024-09-23 +date: 2024-09-24 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 ad0fe6b3c998a..20c618f4dca84 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: 2024-09-23 +date: 2024-09-24 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 6fab97d53cfcc..1d84dd4dca4a0 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: 2024-09-23 +date: 2024-09-24 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 7d9cef51ef466..d585d6c781eff 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: 2024-09-23 +date: 2024-09-24 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 25fc98860f37d..ec049a76e9501 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: 2024-09-23 +date: 2024-09-24 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 19c1c438ef70a..7046e244a8e32 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: 2024-09-23 +date: 2024-09-24 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 8530211f6f79f..3fe35025be86c 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: 2024-09-23 +date: 2024-09-24 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 a4b2fc329a2ae..1cfb6ec690696 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: 2024-09-23 +date: 2024-09-24 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 40f466e485ddd..a29631317ce2e 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: 2024-09-23 +date: 2024-09-24 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 7f8c90761846f..766af64bc7e31 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: 2024-09-23 +date: 2024-09-24 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 5f823a88de866..033b4ff72652f 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: 2024-09-23 +date: 2024-09-24 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 6486972bba111..9898955b54ffb 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: 2024-09-23 +date: 2024-09-24 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 71154fc04758b..f3ce1fc648139 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: 2024-09-23 +date: 2024-09-24 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 f8ccda3f7d1bb..541689afaf19e 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: 2024-09-23 +date: 2024-09-24 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.devdocs.json b/api_docs/kbn_core_saved_objects_server_internal.devdocs.json index 15beae7f68086..fd3c2bfbcd0a3 100644 --- a/api_docs/kbn_core_saved_objects_server_internal.devdocs.json +++ b/api_docs/kbn_core_saved_objects_server_internal.devdocs.json @@ -772,7 +772,7 @@ "signature": [ "(router: ", "InternalSavedObjectRouter", - ", { kibanaVersion, coreUsageData, logger, }: { kibanaVersion: string; coreUsageData: ", + ", { kibanaVersion, coreUsageData, logger, access, }: { kibanaVersion: string; coreUsageData: ", "InternalCoreUsageDataSetup", "; logger: ", { @@ -782,6 +782,14 @@ "section": "def-common.Logger", "text": "Logger" }, + "; access: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.RouteAccess", + "text": "RouteAccess" + }, "; }) => void" ], "path": "packages/core/saved-objects/core-saved-objects-server-internal/src/routes/legacy_import_export/export.ts", @@ -808,7 +816,7 @@ "id": "def-server.registerLegacyExportRoute.$2", "type": "Object", "tags": [], - "label": "{\n kibanaVersion,\n coreUsageData,\n logger,\n }", + "label": "{\n kibanaVersion,\n coreUsageData,\n logger,\n access,\n }", "description": [], "path": "packages/core/saved-objects/core-saved-objects-server-internal/src/routes/legacy_import_export/export.ts", "deprecated": false, @@ -858,6 +866,20 @@ "path": "packages/core/saved-objects/core-saved-objects-server-internal/src/routes/legacy_import_export/export.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-server-internal", + "id": "def-server.registerLegacyExportRoute.$2.access", + "type": "CompoundType", + "tags": [], + "label": "access", + "description": [], + "signature": [ + "\"internal\" | \"public\"" + ], + "path": "packages/core/saved-objects/core-saved-objects-server-internal/src/routes/legacy_import_export/export.ts", + "deprecated": false, + "trackAdoption": false } ] } @@ -875,7 +897,7 @@ "signature": [ "(router: ", "InternalSavedObjectRouter", - ", { maxImportPayloadBytes, coreUsageData, logger, }: { maxImportPayloadBytes: number; coreUsageData: ", + ", { maxImportPayloadBytes, coreUsageData, logger, access, }: { maxImportPayloadBytes: number; coreUsageData: ", "InternalCoreUsageDataSetup", "; logger: ", { @@ -885,6 +907,14 @@ "section": "def-common.Logger", "text": "Logger" }, + "; access: ", + { + "pluginId": "@kbn/core-http-server", + "scope": "server", + "docId": "kibKbnCoreHttpServerPluginApi", + "section": "def-server.RouteAccess", + "text": "RouteAccess" + }, "; }) => void" ], "path": "packages/core/saved-objects/core-saved-objects-server-internal/src/routes/legacy_import_export/import.ts", @@ -911,7 +941,7 @@ "id": "def-server.registerLegacyImportRoute.$2", "type": "Object", "tags": [], - "label": "{\n maxImportPayloadBytes,\n coreUsageData,\n logger,\n }", + "label": "{\n maxImportPayloadBytes,\n coreUsageData,\n logger,\n access,\n }", "description": [], "path": "packages/core/saved-objects/core-saved-objects-server-internal/src/routes/legacy_import_export/import.ts", "deprecated": false, @@ -961,6 +991,20 @@ "path": "packages/core/saved-objects/core-saved-objects-server-internal/src/routes/legacy_import_export/import.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-server-internal", + "id": "def-server.registerLegacyImportRoute.$2.access", + "type": "CompoundType", + "tags": [], + "label": "access", + "description": [], + "signature": [ + "\"internal\" | \"public\"" + ], + "path": "packages/core/saved-objects/core-saved-objects-server-internal/src/routes/legacy_import_export/import.ts", + "deprecated": false, + "trackAdoption": false } ] } diff --git a/api_docs/kbn_core_saved_objects_server_internal.mdx b/api_docs/kbn_core_saved_objects_server_internal.mdx index a55da08ff21ba..30670c2000a0b 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-internal'] --- import kbnCoreSavedObjectsServerInternalObj from './kbn_core_saved_objects_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 | |-------------------|-----------|------------------------|-----------------| -| 71 | 0 | 70 | 5 | +| 73 | 0 | 72 | 5 | ## Server diff --git a/api_docs/kbn_core_saved_objects_server_mocks.mdx b/api_docs/kbn_core_saved_objects_server_mocks.mdx index 17869c68b780e..72873939e3e4b 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: 2024-09-23 +date: 2024-09-24 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 e97cdfbaa797c..35cbd21430c7b 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: 2024-09-23 +date: 2024-09-24 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_security_browser.mdx b/api_docs/kbn_core_security_browser.mdx index 5b0dd0a3cc671..87930f393cc4d 100644 --- a/api_docs/kbn_core_security_browser.mdx +++ b/api_docs/kbn_core_security_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser title: "@kbn/core-security-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser'] --- import kbnCoreSecurityBrowserObj from './kbn_core_security_browser.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser_internal.mdx b/api_docs/kbn_core_security_browser_internal.mdx index ca57c9be043ad..2d371abb5ac31 100644 --- a/api_docs/kbn_core_security_browser_internal.mdx +++ b/api_docs/kbn_core_security_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser-internal title: "@kbn/core-security-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser-internal plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser-internal'] --- import kbnCoreSecurityBrowserInternalObj from './kbn_core_security_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_security_browser_mocks.mdx b/api_docs/kbn_core_security_browser_mocks.mdx index ce45682d04a39..6139c768c27b5 100644 --- a/api_docs/kbn_core_security_browser_mocks.mdx +++ b/api_docs/kbn_core_security_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-browser-mocks title: "@kbn/core-security-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-browser-mocks plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-browser-mocks'] --- import kbnCoreSecurityBrowserMocksObj from './kbn_core_security_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_security_common.mdx b/api_docs/kbn_core_security_common.mdx index 587556bc1fed6..6a06e3353720c 100644 --- a/api_docs/kbn_core_security_common.mdx +++ b/api_docs/kbn_core_security_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-common title: "@kbn/core-security-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-common plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-common'] --- import kbnCoreSecurityCommonObj from './kbn_core_security_common.devdocs.json'; diff --git a/api_docs/kbn_core_security_server.mdx b/api_docs/kbn_core_security_server.mdx index d5720cf4d8ee0..1853330c91f0f 100644 --- a/api_docs/kbn_core_security_server.mdx +++ b/api_docs/kbn_core_security_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server title: "@kbn/core-security-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server'] --- import kbnCoreSecurityServerObj from './kbn_core_security_server.devdocs.json'; diff --git a/api_docs/kbn_core_security_server_internal.mdx b/api_docs/kbn_core_security_server_internal.mdx index 3bc87b9b6b31a..3799c2cdfa701 100644 --- a/api_docs/kbn_core_security_server_internal.mdx +++ b/api_docs/kbn_core_security_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server-internal title: "@kbn/core-security-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server-internal plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server-internal'] --- import kbnCoreSecurityServerInternalObj from './kbn_core_security_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_security_server_mocks.mdx b/api_docs/kbn_core_security_server_mocks.mdx index d8fd38089b569..3abf8b66ad13d 100644 --- a/api_docs/kbn_core_security_server_mocks.mdx +++ b/api_docs/kbn_core_security_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-security-server-mocks title: "@kbn/core-security-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-security-server-mocks plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-security-server-mocks'] --- import kbnCoreSecurityServerMocksObj from './kbn_core_security_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_status_common.mdx b/api_docs/kbn_core_status_common.mdx index 437af097eb034..b7399947e7df5 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: 2024-09-23 +date: 2024-09-24 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 47a7a13a2f986..da4d5070b8db0 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: 2024-09-23 +date: 2024-09-24 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 261c01f4b8d54..1b8525568dd80 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: 2024-09-23 +date: 2024-09-24 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 8c16ca745633d..6301bfbdedc3d 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: 2024-09-23 +date: 2024-09-24 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 a2c3da7cb79d0..0f51d91e666a4 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: 2024-09-23 +date: 2024-09-24 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 05beae7a392b8..f442adc443f99 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: 2024-09-23 +date: 2024-09-24 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 35fe4ef4201ba..00db253cd3da7 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: 2024-09-23 +date: 2024-09-24 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 390b950a797c9..ff70543f7d961 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: 2024-09-23 +date: 2024-09-24 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_model_versions.mdx b/api_docs/kbn_core_test_helpers_model_versions.mdx index 10b31a192613c..48f5ca4c2be3b 100644 --- a/api_docs/kbn_core_test_helpers_model_versions.mdx +++ b/api_docs/kbn_core_test_helpers_model_versions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-model-versions title: "@kbn/core-test-helpers-model-versions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-model-versions plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-model-versions'] --- import kbnCoreTestHelpersModelVersionsObj from './kbn_core_test_helpers_model_versions.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 ae560d98dea8e..b4421d5fc48c7 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: 2024-09-23 +date: 2024-09-24 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 10da68c7c119c..2a4f22aef6fd8 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: 2024-09-23 +date: 2024-09-24 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 8e04d58b85fa2..b80a8d974a10b 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: 2024-09-23 +date: 2024-09-24 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_mocks.mdx b/api_docs/kbn_core_theme_browser_mocks.mdx index a609e539c7caa..5a0f9270fd477 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: 2024-09-23 +date: 2024-09-24 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 628bd1977ccb8..e01c1ad6b163e 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: 2024-09-23 +date: 2024-09-24 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 e9ccf2a9746bc..b28ac8b0f33c2 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: 2024-09-23 +date: 2024-09-24 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 818a098a0efe6..181b27633ca5f 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: 2024-09-23 +date: 2024-09-24 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 d0a835c7a8249..636742347f5d4 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: 2024-09-23 +date: 2024-09-24 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 b9d6c66e2a498..52538150f882f 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: 2024-09-23 +date: 2024-09-24 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 88773a76d6a16..db37bc554f992 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: 2024-09-23 +date: 2024-09-24 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 af896fd4460f4..89803f069568d 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: 2024-09-23 +date: 2024-09-24 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 65a647a301dd5..50fa827b0995f 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: 2024-09-23 +date: 2024-09-24 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 9d32d0d062140..7e983e09b34c6 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: 2024-09-23 +date: 2024-09-24 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 7f9476d3b0512..2849050e3408e 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: 2024-09-23 +date: 2024-09-24 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_profile_browser.mdx b/api_docs/kbn_core_user_profile_browser.mdx index ad6ddaf9454a8..3d483175c25f5 100644 --- a/api_docs/kbn_core_user_profile_browser.mdx +++ b/api_docs/kbn_core_user_profile_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser title: "@kbn/core-user-profile-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser'] --- import kbnCoreUserProfileBrowserObj from './kbn_core_user_profile_browser.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser_internal.mdx b/api_docs/kbn_core_user_profile_browser_internal.mdx index a222c881003e8..ee70335ebc716 100644 --- a/api_docs/kbn_core_user_profile_browser_internal.mdx +++ b/api_docs/kbn_core_user_profile_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser-internal title: "@kbn/core-user-profile-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser-internal plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser-internal'] --- import kbnCoreUserProfileBrowserInternalObj from './kbn_core_user_profile_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_browser_mocks.mdx b/api_docs/kbn_core_user_profile_browser_mocks.mdx index 05ca54ae3a50f..51570265be6be 100644 --- a/api_docs/kbn_core_user_profile_browser_mocks.mdx +++ b/api_docs/kbn_core_user_profile_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-browser-mocks title: "@kbn/core-user-profile-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-browser-mocks plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-browser-mocks'] --- import kbnCoreUserProfileBrowserMocksObj from './kbn_core_user_profile_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_common.mdx b/api_docs/kbn_core_user_profile_common.mdx index 2fe79c73f31ab..9ec75c7cbc4f1 100644 --- a/api_docs/kbn_core_user_profile_common.mdx +++ b/api_docs/kbn_core_user_profile_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-common title: "@kbn/core-user-profile-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-common plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-common'] --- import kbnCoreUserProfileCommonObj from './kbn_core_user_profile_common.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server.mdx b/api_docs/kbn_core_user_profile_server.mdx index 530ca6ef4db78..dfd18fc69c8a3 100644 --- a/api_docs/kbn_core_user_profile_server.mdx +++ b/api_docs/kbn_core_user_profile_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server title: "@kbn/core-user-profile-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server'] --- import kbnCoreUserProfileServerObj from './kbn_core_user_profile_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server_internal.mdx b/api_docs/kbn_core_user_profile_server_internal.mdx index 80a149ad5b1d0..c3c1ed37557c7 100644 --- a/api_docs/kbn_core_user_profile_server_internal.mdx +++ b/api_docs/kbn_core_user_profile_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server-internal title: "@kbn/core-user-profile-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server-internal plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server-internal'] --- import kbnCoreUserProfileServerInternalObj from './kbn_core_user_profile_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_profile_server_mocks.mdx b/api_docs/kbn_core_user_profile_server_mocks.mdx index 7bda5bd6128be..831098241ae9c 100644 --- a/api_docs/kbn_core_user_profile_server_mocks.mdx +++ b/api_docs/kbn_core_user_profile_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-profile-server-mocks title: "@kbn/core-user-profile-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-profile-server-mocks plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-profile-server-mocks'] --- import kbnCoreUserProfileServerMocksObj from './kbn_core_user_profile_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 e5aa8d61b6358..4c08a438e77fc 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: 2024-09-23 +date: 2024-09-24 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_mocks.mdx b/api_docs/kbn_core_user_settings_server_mocks.mdx index 7368d5c511a72..6dbfefe92bb4c 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: 2024-09-23 +date: 2024-09-24 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 c8e0fdca4b427..4f9d09e06e648 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: 2024-09-23 +date: 2024-09-24 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 4ad2cd407b4eb..f969919bf2039 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_custom_icons.mdx b/api_docs/kbn_custom_icons.mdx index 6fb423169bca1..f373a00145789 100644 --- a/api_docs/kbn_custom_icons.mdx +++ b/api_docs/kbn_custom_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-icons title: "@kbn/custom-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-icons plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-icons'] --- import kbnCustomIconsObj from './kbn_custom_icons.devdocs.json'; diff --git a/api_docs/kbn_custom_integrations.mdx b/api_docs/kbn_custom_integrations.mdx index a2b59efce2016..6c65351918d84 100644 --- a/api_docs/kbn_custom_integrations.mdx +++ b/api_docs/kbn_custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-integrations title: "@kbn/custom-integrations" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-integrations plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-integrations'] --- import kbnCustomIntegrationsObj from './kbn_custom_integrations.devdocs.json'; diff --git a/api_docs/kbn_cypress_config.mdx b/api_docs/kbn_cypress_config.mdx index 86f7892f60a2e..9d851064387f1 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cypress-config'] --- import kbnCypressConfigObj from './kbn_cypress_config.devdocs.json'; diff --git a/api_docs/kbn_data_forge.mdx b/api_docs/kbn_data_forge.mdx index df182db59ddc1..12dd2fab7a871 100644 --- a/api_docs/kbn_data_forge.mdx +++ b/api_docs/kbn_data_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-forge title: "@kbn/data-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-forge plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-forge'] --- import kbnDataForgeObj from './kbn_data_forge.devdocs.json'; diff --git a/api_docs/kbn_data_service.mdx b/api_docs/kbn_data_service.mdx index 31ff87ecce731..a9b63475575dc 100644 --- a/api_docs/kbn_data_service.mdx +++ b/api_docs/kbn_data_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-service title: "@kbn/data-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-service plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-service'] --- import kbnDataServiceObj from './kbn_data_service.devdocs.json'; diff --git a/api_docs/kbn_data_stream_adapter.mdx b/api_docs/kbn_data_stream_adapter.mdx index 4c4a7af436d8f..1e8e8096b5986 100644 --- a/api_docs/kbn_data_stream_adapter.mdx +++ b/api_docs/kbn_data_stream_adapter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-stream-adapter title: "@kbn/data-stream-adapter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-stream-adapter plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-stream-adapter'] --- import kbnDataStreamAdapterObj from './kbn_data_stream_adapter.devdocs.json'; diff --git a/api_docs/kbn_data_view_utils.mdx b/api_docs/kbn_data_view_utils.mdx index 9294e9dad74e2..dab1c22bdeb54 100644 --- a/api_docs/kbn_data_view_utils.mdx +++ b/api_docs/kbn_data_view_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-view-utils title: "@kbn/data-view-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-view-utils plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-view-utils'] --- import kbnDataViewUtilsObj from './kbn_data_view_utils.devdocs.json'; diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index 00a0091b4e25a..c2ad39fd283d5 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] --- import kbnDatemathObj from './kbn_datemath.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_analytics.mdx b/api_docs/kbn_deeplinks_analytics.mdx index 1ab560b521fba..20651c9cce02e 100644 --- a/api_docs/kbn_deeplinks_analytics.mdx +++ b/api_docs/kbn_deeplinks_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-analytics title: "@kbn/deeplinks-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-analytics plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-analytics'] --- import kbnDeeplinksAnalyticsObj from './kbn_deeplinks_analytics.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_devtools.mdx b/api_docs/kbn_deeplinks_devtools.mdx index 333d5e971fc79..d15349cc772da 100644 --- a/api_docs/kbn_deeplinks_devtools.mdx +++ b/api_docs/kbn_deeplinks_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-devtools title: "@kbn/deeplinks-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-devtools plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-devtools'] --- import kbnDeeplinksDevtoolsObj from './kbn_deeplinks_devtools.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_fleet.mdx b/api_docs/kbn_deeplinks_fleet.mdx index fa860e767f515..38e9eed3cc9e3 100644 --- a/api_docs/kbn_deeplinks_fleet.mdx +++ b/api_docs/kbn_deeplinks_fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-fleet title: "@kbn/deeplinks-fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-fleet plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-fleet'] --- import kbnDeeplinksFleetObj from './kbn_deeplinks_fleet.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_management.mdx b/api_docs/kbn_deeplinks_management.mdx index cfce275d8f5a7..e1130e87700cf 100644 --- a/api_docs/kbn_deeplinks_management.mdx +++ b/api_docs/kbn_deeplinks_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-management title: "@kbn/deeplinks-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-management plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-management'] --- import kbnDeeplinksManagementObj from './kbn_deeplinks_management.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_ml.mdx b/api_docs/kbn_deeplinks_ml.mdx index 28d7b85129a78..6a49b3db4cffa 100644 --- a/api_docs/kbn_deeplinks_ml.mdx +++ b/api_docs/kbn_deeplinks_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-ml title: "@kbn/deeplinks-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-ml plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-ml'] --- import kbnDeeplinksMlObj from './kbn_deeplinks_ml.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_observability.mdx b/api_docs/kbn_deeplinks_observability.mdx index 44764c9eebdba..780338c8bf701 100644 --- a/api_docs/kbn_deeplinks_observability.mdx +++ b/api_docs/kbn_deeplinks_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-observability title: "@kbn/deeplinks-observability" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-observability plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-observability'] --- import kbnDeeplinksObservabilityObj from './kbn_deeplinks_observability.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_search.mdx b/api_docs/kbn_deeplinks_search.mdx index 0c7586b782191..a33eb3472345a 100644 --- a/api_docs/kbn_deeplinks_search.mdx +++ b/api_docs/kbn_deeplinks_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-search title: "@kbn/deeplinks-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-search plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-search'] --- import kbnDeeplinksSearchObj from './kbn_deeplinks_search.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_security.mdx b/api_docs/kbn_deeplinks_security.mdx index 6685fc795dd59..62a8cf6fa0f5b 100644 --- a/api_docs/kbn_deeplinks_security.mdx +++ b/api_docs/kbn_deeplinks_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-security title: "@kbn/deeplinks-security" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-security plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-security'] --- import kbnDeeplinksSecurityObj from './kbn_deeplinks_security.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_shared.mdx b/api_docs/kbn_deeplinks_shared.mdx index d49678efcf267..58b7a79c0ecfc 100644 --- a/api_docs/kbn_deeplinks_shared.mdx +++ b/api_docs/kbn_deeplinks_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-shared title: "@kbn/deeplinks-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-shared plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-shared'] --- import kbnDeeplinksSharedObj from './kbn_deeplinks_shared.devdocs.json'; diff --git a/api_docs/kbn_default_nav_analytics.mdx b/api_docs/kbn_default_nav_analytics.mdx index c474e0d80dd97..937d7c56a5774 100644 --- a/api_docs/kbn_default_nav_analytics.mdx +++ b/api_docs/kbn_default_nav_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-analytics title: "@kbn/default-nav-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-analytics plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-analytics'] --- import kbnDefaultNavAnalyticsObj from './kbn_default_nav_analytics.devdocs.json'; diff --git a/api_docs/kbn_default_nav_devtools.mdx b/api_docs/kbn_default_nav_devtools.mdx index ceb026c1ace28..efe9fcd022a9f 100644 --- a/api_docs/kbn_default_nav_devtools.mdx +++ b/api_docs/kbn_default_nav_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-devtools title: "@kbn/default-nav-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-devtools plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-devtools'] --- import kbnDefaultNavDevtoolsObj from './kbn_default_nav_devtools.devdocs.json'; diff --git a/api_docs/kbn_default_nav_management.mdx b/api_docs/kbn_default_nav_management.mdx index cf9dcfc6ad8bf..ea27dddd30114 100644 --- a/api_docs/kbn_default_nav_management.mdx +++ b/api_docs/kbn_default_nav_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-management title: "@kbn/default-nav-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-management plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-management'] --- import kbnDefaultNavManagementObj from './kbn_default_nav_management.devdocs.json'; diff --git a/api_docs/kbn_default_nav_ml.mdx b/api_docs/kbn_default_nav_ml.mdx index ad251be44742b..351ac9d05129c 100644 --- a/api_docs/kbn_default_nav_ml.mdx +++ b/api_docs/kbn_default_nav_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-ml title: "@kbn/default-nav-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-ml plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-ml'] --- import kbnDefaultNavMlObj from './kbn_default_nav_ml.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index fed28786cb4c3..7772551709d01 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: 2024-09-23 +date: 2024-09-24 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 40e82da067937..5e09a187014e1 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: 2024-09-23 +date: 2024-09-24 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 33d242ac18540..e57e4f707ef34 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: 2024-09-23 +date: 2024-09-24 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 0012a1a8b17be..3172916742b32 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_discover_utils.mdx b/api_docs/kbn_discover_utils.mdx index a61fae2d2cee9..9f256ff66f589 100644 --- a/api_docs/kbn_discover_utils.mdx +++ b/api_docs/kbn_discover_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-discover-utils title: "@kbn/discover-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/discover-utils plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-utils'] --- import kbnDiscoverUtilsObj from './kbn_discover_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index 1539bb867dcbc..dbde8c64ca82e 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: 2024-09-23 +date: 2024-09-24 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 6b10346fa89d4..048c9e223e676 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: 2024-09-23 +date: 2024-09-24 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 2af9237f2b094..59cce12109035 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: 2024-09-23 +date: 2024-09-24 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 6c40665c51af3..38879846d7026 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt-tools'] --- import kbnEbtToolsObj from './kbn_ebt_tools.devdocs.json'; diff --git a/api_docs/kbn_ecs_data_quality_dashboard.mdx b/api_docs/kbn_ecs_data_quality_dashboard.mdx index 3e1e59b44d7da..6b70f53b07a7d 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs-data-quality-dashboard'] --- import kbnEcsDataQualityDashboardObj from './kbn_ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/kbn_elastic_agent_utils.mdx b/api_docs/kbn_elastic_agent_utils.mdx index 08ec1d8c5b895..65dc6e2ad06de 100644 --- a/api_docs/kbn_elastic_agent_utils.mdx +++ b/api_docs/kbn_elastic_agent_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-agent-utils title: "@kbn/elastic-agent-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-agent-utils plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-agent-utils'] --- import kbnElasticAgentUtilsObj from './kbn_elastic_agent_utils.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant.mdx b/api_docs/kbn_elastic_assistant.mdx index b11f52d280ac1..bab3e2f4a2950 100644 --- a/api_docs/kbn_elastic_assistant.mdx +++ b/api_docs/kbn_elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant title: "@kbn/elastic-assistant" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant'] --- import kbnElasticAssistantObj from './kbn_elastic_assistant.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant_common.mdx b/api_docs/kbn_elastic_assistant_common.mdx index b94b9f5f33d98..c83d317a3377c 100644 --- a/api_docs/kbn_elastic_assistant_common.mdx +++ b/api_docs/kbn_elastic_assistant_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant-common title: "@kbn/elastic-assistant-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant-common plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant-common'] --- import kbnElasticAssistantCommonObj from './kbn_elastic_assistant_common.devdocs.json'; diff --git a/api_docs/kbn_entities_schema.mdx b/api_docs/kbn_entities_schema.mdx index 8d719f787b7e1..0ebfc4a459b95 100644 --- a/api_docs/kbn_entities_schema.mdx +++ b/api_docs/kbn_entities_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-entities-schema title: "@kbn/entities-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/entities-schema plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/entities-schema'] --- import kbnEntitiesSchemaObj from './kbn_entities_schema.devdocs.json'; diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index ffd46ffe37600..4ec23e85a8454 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: 2024-09-23 +date: 2024-09-24 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 23a296f918f8f..9cc8a0142169b 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: 2024-09-23 +date: 2024-09-24 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 3c6a0011f72cb..3e8c3a8b2a60a 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: 2024-09-23 +date: 2024-09-24 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 d4cb67acee503..8ff890309d4fe 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: 2024-09-23 +date: 2024-09-24 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 96e0807e16bd1..069c62fcaefbf 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: 2024-09-23 +date: 2024-09-24 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 69242ac642d6d..3d4a2b81dec0b 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] --- import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json'; diff --git a/api_docs/kbn_esql_ast.mdx b/api_docs/kbn_esql_ast.mdx index 9f7edd14d028b..39efb816da72f 100644 --- a/api_docs/kbn_esql_ast.mdx +++ b/api_docs/kbn_esql_ast.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-ast title: "@kbn/esql-ast" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-ast plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-ast'] --- import kbnEsqlAstObj from './kbn_esql_ast.devdocs.json'; diff --git a/api_docs/kbn_esql_editor.devdocs.json b/api_docs/kbn_esql_editor.devdocs.json new file mode 100644 index 0000000000000..4e3942cddc17c --- /dev/null +++ b/api_docs/kbn_esql_editor.devdocs.json @@ -0,0 +1,608 @@ +{ + "id": "@kbn/esql-editor", + "client": { + "classes": [], + "functions": [ + { + "parentPluginId": "@kbn/esql-editor", + "id": "def-public.ESQLEditor", + "type": "Function", + "tags": [], + "label": "ESQLEditor", + "description": [], + "signature": [ + "React.NamedExoticComponent<", + { + "pluginId": "@kbn/esql-editor", + "scope": "public", + "docId": "kibKbnEsqlEditorPluginApi", + "section": "def-public.ESQLEditorProps", + "text": "ESQLEditorProps" + }, + ">" + ], + "path": "packages/kbn-esql-editor/src/esql_editor.tsx", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/esql-editor", + "id": "def-public.ESQLEditor.$1", + "type": "Uncategorized", + "tags": [], + "label": "props", + "description": [], + "signature": [ + "P" + ], + "path": "node_modules/@types/react/index.d.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/esql-editor", + "id": "def-public.fetchFieldsFromESQL", + "type": "Function", + "tags": [], + "label": "fetchFieldsFromESQL", + "description": [], + "signature": [ + "(query: ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Query", + "text": "Query" + }, + " | ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.AggregateQuery", + "text": "AggregateQuery" + }, + ", expressions: ", + { + "pluginId": "expressions", + "scope": "public", + "docId": "kibExpressionsPluginApi", + "section": "def-public.ExpressionsStart", + "text": "ExpressionsStart" + }, + ", time: ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.TimeRange", + "text": "TimeRange" + }, + " | undefined, abortController: AbortController | undefined, dataView: ", + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.DataView", + "text": "DataView" + }, + " | undefined) => Promise<", + { + "pluginId": "expressions", + "scope": "common", + "docId": "kibExpressionsPluginApi", + "section": "def-common.Datatable", + "text": "Datatable" + }, + " | undefined>" + ], + "path": "packages/kbn-esql-editor/src/fetch_fields_from_esql.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/esql-editor", + "id": "def-public.fetchFieldsFromESQL.$1", + "type": "CompoundType", + "tags": [], + "label": "query", + "description": [], + "signature": [ + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Query", + "text": "Query" + }, + " | ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.AggregateQuery", + "text": "AggregateQuery" + } + ], + "path": "packages/kbn-esql-editor/src/fetch_fields_from_esql.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/esql-editor", + "id": "def-public.fetchFieldsFromESQL.$2", + "type": "Object", + "tags": [], + "label": "expressions", + "description": [], + "signature": [ + { + "pluginId": "expressions", + "scope": "public", + "docId": "kibExpressionsPluginApi", + "section": "def-public.ExpressionsStart", + "text": "ExpressionsStart" + } + ], + "path": "packages/kbn-esql-editor/src/fetch_fields_from_esql.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "@kbn/esql-editor", + "id": "def-public.fetchFieldsFromESQL.$3", + "type": "Object", + "tags": [], + "label": "time", + "description": [], + "signature": [ + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.TimeRange", + "text": "TimeRange" + }, + " | undefined" + ], + "path": "packages/kbn-esql-editor/src/fetch_fields_from_esql.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + }, + { + "parentPluginId": "@kbn/esql-editor", + "id": "def-public.fetchFieldsFromESQL.$4", + "type": "Object", + "tags": [], + "label": "abortController", + "description": [], + "signature": [ + "AbortController | undefined" + ], + "path": "packages/kbn-esql-editor/src/fetch_fields_from_esql.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + }, + { + "parentPluginId": "@kbn/esql-editor", + "id": "def-public.fetchFieldsFromESQL.$5", + "type": "Object", + "tags": [], + "label": "dataView", + "description": [], + "signature": [ + { + "pluginId": "dataViews", + "scope": "common", + "docId": "kibDataViewsPluginApi", + "section": "def-common.DataView", + "text": "DataView" + }, + " | undefined" + ], + "path": "packages/kbn-esql-editor/src/fetch_fields_from_esql.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [ + { + "parentPluginId": "@kbn/esql-editor", + "id": "def-public.ESQLEditorProps", + "type": "Interface", + "tags": [], + "label": "ESQLEditorProps", + "description": [], + "path": "packages/kbn-esql-editor/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/esql-editor", + "id": "def-public.ESQLEditorProps.query", + "type": "Object", + "tags": [], + "label": "query", + "description": [ + "The aggregate type query" + ], + "signature": [ + "{ esql: string; }" + ], + "path": "packages/kbn-esql-editor/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/esql-editor", + "id": "def-public.ESQLEditorProps.onTextLangQueryChange", + "type": "Function", + "tags": [], + "label": "onTextLangQueryChange", + "description": [ + "Callback running everytime the query changes" + ], + "signature": [ + "(query: ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.AggregateQuery", + "text": "AggregateQuery" + }, + ") => void" + ], + "path": "packages/kbn-esql-editor/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/esql-editor", + "id": "def-public.ESQLEditorProps.onTextLangQueryChange.$1", + "type": "Object", + "tags": [], + "label": "query", + "description": [], + "signature": [ + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.AggregateQuery", + "text": "AggregateQuery" + } + ], + "path": "packages/kbn-esql-editor/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/esql-editor", + "id": "def-public.ESQLEditorProps.onTextLangQuerySubmit", + "type": "Function", + "tags": [], + "label": "onTextLangQuerySubmit", + "description": [ + "Callback running when the user submits the query" + ], + "signature": [ + "(query?: ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.AggregateQuery", + "text": "AggregateQuery" + }, + " | undefined, abortController?: AbortController | undefined) => Promise" + ], + "path": "packages/kbn-esql-editor/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/esql-editor", + "id": "def-public.ESQLEditorProps.onTextLangQuerySubmit.$1", + "type": "Object", + "tags": [], + "label": "query", + "description": [], + "signature": [ + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.AggregateQuery", + "text": "AggregateQuery" + }, + " | undefined" + ], + "path": "packages/kbn-esql-editor/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + }, + { + "parentPluginId": "@kbn/esql-editor", + "id": "def-public.ESQLEditorProps.onTextLangQuerySubmit.$2", + "type": "Object", + "tags": [], + "label": "abortController", + "description": [], + "signature": [ + "AbortController | undefined" + ], + "path": "packages/kbn-esql-editor/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/esql-editor", + "id": "def-public.ESQLEditorProps.detectedTimestamp", + "type": "string", + "tags": [], + "label": "detectedTimestamp", + "description": [ + "If it is true, the editor displays the message @timestamp found\nThe text based queries are relying on adhoc dataviews which\ncan have an @timestamp timefield or nothing" + ], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-esql-editor/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/esql-editor", + "id": "def-public.ESQLEditorProps.errors", + "type": "Array", + "tags": [], + "label": "errors", + "description": [ + "Array of errors" + ], + "signature": [ + "Error[] | undefined" + ], + "path": "packages/kbn-esql-editor/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/esql-editor", + "id": "def-public.ESQLEditorProps.warning", + "type": "string", + "tags": [], + "label": "warning", + "description": [ + "Warning string as it comes from ES" + ], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-esql-editor/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/esql-editor", + "id": "def-public.ESQLEditorProps.isLoading", + "type": "CompoundType", + "tags": [], + "label": "isLoading", + "description": [ + "Disables the editor and displays loading icon in run button\nIt is also used for hiding the history component if it is not defined" + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-esql-editor/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/esql-editor", + "id": "def-public.ESQLEditorProps.isDisabled", + "type": "CompoundType", + "tags": [], + "label": "isDisabled", + "description": [ + "Disables the editor" + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-esql-editor/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/esql-editor", + "id": "def-public.ESQLEditorProps.dataTestSubj", + "type": "string", + "tags": [], + "label": "dataTestSubj", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-esql-editor/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/esql-editor", + "id": "def-public.ESQLEditorProps.hideRunQueryText", + "type": "CompoundType", + "tags": [], + "label": "hideRunQueryText", + "description": [ + "Hide the Run query information which appears on the footer" + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-esql-editor/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/esql-editor", + "id": "def-public.ESQLEditorProps.editorIsInline", + "type": "CompoundType", + "tags": [], + "label": "editorIsInline", + "description": [ + "This is used for applications (such as the inline editing flyout in dashboards)\nwhich want to add the editor without being part of the Unified search component\nIt renders a submit query button inside the editor" + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-esql-editor/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/esql-editor", + "id": "def-public.ESQLEditorProps.disableSubmitAction", + "type": "CompoundType", + "tags": [], + "label": "disableSubmitAction", + "description": [ + "Disables the submit query action" + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-esql-editor/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/esql-editor", + "id": "def-public.ESQLEditorProps.allowQueryCancellation", + "type": "CompoundType", + "tags": [], + "label": "allowQueryCancellation", + "description": [ + "when set to true enables query cancellation" + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-esql-editor/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/esql-editor", + "id": "def-public.ESQLEditorProps.hideTimeFilterInfo", + "type": "CompoundType", + "tags": [], + "label": "hideTimeFilterInfo", + "description": [ + "hide @timestamp info" + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-esql-editor/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/esql-editor", + "id": "def-public.ESQLEditorProps.hideQueryHistory", + "type": "CompoundType", + "tags": [], + "label": "hideQueryHistory", + "description": [ + "hide query history" + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-esql-editor/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/esql-editor", + "id": "def-public.ESQLEditorProps.hasOutline", + "type": "CompoundType", + "tags": [], + "label": "hasOutline", + "description": [ + "adds border in the editor" + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-esql-editor/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/esql-editor", + "id": "def-public.ESQLEditorProps.displayDocumentationAsFlyout", + "type": "CompoundType", + "tags": [], + "label": "displayDocumentationAsFlyout", + "description": [ + "adds a documentation icon in the footer which opens the inline docs as a flyout" + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/kbn-esql-editor/src/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_esql_editor.mdx b/api_docs/kbn_esql_editor.mdx new file mode 100644 index 0000000000000..d70810e5de337 --- /dev/null +++ b/api_docs/kbn_esql_editor.mdx @@ -0,0 +1,33 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibKbnEsqlEditorPluginApi +slug: /kibana-dev-docs/api/kbn-esql-editor +title: "@kbn/esql-editor" +image: https://source.unsplash.com/400x175/?github +description: API docs for the @kbn/esql-editor plugin +date: 2024-09-24 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-editor'] +--- +import kbnEsqlEditorObj from './kbn_esql_editor.devdocs.json'; + + + +Contact [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 29 | 0 | 12 | 0 | + +## Client + +### Functions + + +### Interfaces + + diff --git a/api_docs/kbn_esql_utils.mdx b/api_docs/kbn_esql_utils.mdx index df8162b9811ac..577f8f2eca9a2 100644 --- a/api_docs/kbn_esql_utils.mdx +++ b/api_docs/kbn_esql_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-utils title: "@kbn/esql-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-utils plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-utils'] --- import kbnEsqlUtilsObj from './kbn_esql_utils.devdocs.json'; diff --git a/api_docs/kbn_esql_validation_autocomplete.mdx b/api_docs/kbn_esql_validation_autocomplete.mdx index a2531506312ab..e86c3f9db33e0 100644 --- a/api_docs/kbn_esql_validation_autocomplete.mdx +++ b/api_docs/kbn_esql_validation_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-esql-validation-autocomplete title: "@kbn/esql-validation-autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/esql-validation-autocomplete plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/esql-validation-autocomplete'] --- import kbnEsqlValidationAutocompleteObj from './kbn_esql_validation_autocomplete.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_common.mdx b/api_docs/kbn_event_annotation_common.mdx index 9bdc5db15b39e..c83b8ea153f2b 100644 --- a/api_docs/kbn_event_annotation_common.mdx +++ b/api_docs/kbn_event_annotation_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-common title: "@kbn/event-annotation-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-common plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-common'] --- import kbnEventAnnotationCommonObj from './kbn_event_annotation_common.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_components.mdx b/api_docs/kbn_event_annotation_components.mdx index 07896aff3c309..7d75932df22ca 100644 --- a/api_docs/kbn_event_annotation_components.mdx +++ b/api_docs/kbn_event_annotation_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-components title: "@kbn/event-annotation-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-components plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-components'] --- import kbnEventAnnotationComponentsObj from './kbn_event_annotation_components.devdocs.json'; diff --git a/api_docs/kbn_expandable_flyout.mdx b/api_docs/kbn_expandable_flyout.mdx index 10d0e62ac4d7c..bbd1caab561ca 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: 2024-09-23 +date: 2024-09-24 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 2921dad0145fe..e7d582ecea90a 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] --- import kbnFieldTypesObj from './kbn_field_types.devdocs.json'; diff --git a/api_docs/kbn_field_utils.mdx b/api_docs/kbn_field_utils.mdx index 31cc07ce9e31e..e0e50d56e0ef6 100644 --- a/api_docs/kbn_field_utils.mdx +++ b/api_docs/kbn_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-utils title: "@kbn/field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-utils plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-utils'] --- import kbnFieldUtilsObj from './kbn_field_utils.devdocs.json'; diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx index 7b3935680f5ea..c2c1ea03b2338 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: 2024-09-23 +date: 2024-09-24 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_formatters.mdx b/api_docs/kbn_formatters.mdx index 99f6b7a4bf6ae..48450d365f9cd 100644 --- a/api_docs/kbn_formatters.mdx +++ b/api_docs/kbn_formatters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-formatters title: "@kbn/formatters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/formatters plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/formatters'] --- import kbnFormattersObj from './kbn_formatters.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_services.mdx b/api_docs/kbn_ftr_common_functional_services.mdx index 0b01afe6d040c..40bc8f0d65f0a 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: 2024-09-23 +date: 2024-09-24 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_ftr_common_functional_ui_services.mdx b/api_docs/kbn_ftr_common_functional_ui_services.mdx index 7f434326f7fbc..6dacafeef15c9 100644 --- a/api_docs/kbn_ftr_common_functional_ui_services.mdx +++ b/api_docs/kbn_ftr_common_functional_ui_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-ui-services title: "@kbn/ftr-common-functional-ui-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-ui-services plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-ui-services'] --- import kbnFtrCommonFunctionalUiServicesObj from './kbn_ftr_common_functional_ui_services.devdocs.json'; diff --git a/api_docs/kbn_generate.mdx b/api_docs/kbn_generate.mdx index ebd8c583cf605..a78d03fddaca9 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate'] --- import kbnGenerateObj from './kbn_generate.devdocs.json'; diff --git a/api_docs/kbn_generate_console_definitions.mdx b/api_docs/kbn_generate_console_definitions.mdx index 868ed29f3b812..937f0040b3445 100644 --- a/api_docs/kbn_generate_console_definitions.mdx +++ b/api_docs/kbn_generate_console_definitions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-console-definitions title: "@kbn/generate-console-definitions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-console-definitions plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-console-definitions'] --- import kbnGenerateConsoleDefinitionsObj from './kbn_generate_console_definitions.devdocs.json'; diff --git a/api_docs/kbn_generate_csv.mdx b/api_docs/kbn_generate_csv.mdx index 4e1510ea3a4cf..16ac039682d5d 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; diff --git a/api_docs/kbn_grid_layout.mdx b/api_docs/kbn_grid_layout.mdx index 611d2de1d982f..a8bd4d91aa76d 100644 --- a/api_docs/kbn_grid_layout.mdx +++ b/api_docs/kbn_grid_layout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-grid-layout title: "@kbn/grid-layout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/grid-layout plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/grid-layout'] --- import kbnGridLayoutObj from './kbn_grid_layout.devdocs.json'; diff --git a/api_docs/kbn_grouping.mdx b/api_docs/kbn_grouping.mdx index e8de165e89275..6f140e328e3f9 100644 --- a/api_docs/kbn_grouping.mdx +++ b/api_docs/kbn_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-grouping title: "@kbn/grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/grouping plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/grouping'] --- import kbnGroupingObj from './kbn_grouping.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index 275deed3fdbdc..345f31168b592 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: 2024-09-23 +date: 2024-09-24 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 2625bd075157e..6faa7b7c8a276 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: 2024-09-23 +date: 2024-09-24 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 0de11a46c7612..7a2bda0436aa5 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: 2024-09-23 +date: 2024-09-24 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 77f9a691a60f2..03469bd91e3fd 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: 2024-09-23 +date: 2024-09-24 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 c5a3c60751653..b6dc5332df24a 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: 2024-09-23 +date: 2024-09-24 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 d336e64f848ee..89265c5132718 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: 2024-09-23 +date: 2024-09-24 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 9de15eceddd4b..c3d8cb6900694 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: 2024-09-23 +date: 2024-09-24 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 9a1721e7d5238..c5553ebaeeb38 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: 2024-09-23 +date: 2024-09-24 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 28e030581846a..687951a9e281b 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_index_management_shared_types.mdx b/api_docs/kbn_index_management_shared_types.mdx index 71e31aca65572..8e3f15d657b18 100644 --- a/api_docs/kbn_index_management_shared_types.mdx +++ b/api_docs/kbn_index_management_shared_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-index-management-shared-types title: "@kbn/index-management-shared-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/index-management-shared-types plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/index-management-shared-types'] --- import kbnIndexManagementSharedTypesObj from './kbn_index_management_shared_types.devdocs.json'; diff --git a/api_docs/kbn_inference_integration_flyout.mdx b/api_docs/kbn_inference_integration_flyout.mdx index 93ba346755a27..a7d9f9cc3a307 100644 --- a/api_docs/kbn_inference_integration_flyout.mdx +++ b/api_docs/kbn_inference_integration_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-inference_integration_flyout title: "@kbn/inference_integration_flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/inference_integration_flyout plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/inference_integration_flyout'] --- import kbnInferenceIntegrationFlyoutObj from './kbn_inference_integration_flyout.devdocs.json'; diff --git a/api_docs/kbn_infra_forge.mdx b/api_docs/kbn_infra_forge.mdx index f0934e6a1fb19..030c4499d48e5 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: 2024-09-23 +date: 2024-09-24 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 1af1924b18213..7cba4568f730d 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter'] --- import kbnInterpreterObj from './kbn_interpreter.devdocs.json'; diff --git a/api_docs/kbn_investigation_shared.mdx b/api_docs/kbn_investigation_shared.mdx index c8ccd6f73f5cf..c461d32c4eb80 100644 --- a/api_docs/kbn_investigation_shared.mdx +++ b/api_docs/kbn_investigation_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-investigation-shared title: "@kbn/investigation-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/investigation-shared plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/investigation-shared'] --- import kbnInvestigationSharedObj from './kbn_investigation_shared.devdocs.json'; diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx index 4d99772315f37..8d305aec8ace5 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils'] --- import kbnIoTsUtilsObj from './kbn_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_ipynb.mdx b/api_docs/kbn_ipynb.mdx index a69412659157c..84f451447344f 100644 --- a/api_docs/kbn_ipynb.mdx +++ b/api_docs/kbn_ipynb.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ipynb title: "@kbn/ipynb" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ipynb plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ipynb'] --- import kbnIpynbObj from './kbn_ipynb.devdocs.json'; diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index ee64021bda464..1285db64ec804 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: 2024-09-23 +date: 2024-09-24 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 e86743aad8296..2e7b0c484cdd8 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: 2024-09-23 +date: 2024-09-24 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 2b27d1c94f5fe..5195452f244d8 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-ast'] --- import kbnJsonAstObj from './kbn_json_ast.devdocs.json'; diff --git a/api_docs/kbn_json_schemas.mdx b/api_docs/kbn_json_schemas.mdx index 960b977c357fa..c4f9619400340 100644 --- a/api_docs/kbn_json_schemas.mdx +++ b/api_docs/kbn_json_schemas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-schemas title: "@kbn/json-schemas" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/json-schemas plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-schemas'] --- import kbnJsonSchemasObj from './kbn_json_schemas.devdocs.json'; diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx index 8e6c94a7fe5c5..966b2dee049b6 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: 2024-09-23 +date: 2024-09-24 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.devdocs.json b/api_docs/kbn_language_documentation.devdocs.json new file mode 100644 index 0000000000000..e1b9340dec261 --- /dev/null +++ b/api_docs/kbn_language_documentation.devdocs.json @@ -0,0 +1,199 @@ +{ + "id": "@kbn/language-documentation", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [ + { + "parentPluginId": "@kbn/language-documentation", + "id": "def-common.LanguageDocumentationFlyout", + "type": "Function", + "tags": [], + "label": "LanguageDocumentationFlyout", + "description": [], + "signature": [ + "React.NamedExoticComponent & { readonly type: ({ searchInDescription, linkToDocumentation, isHelpMenuOpen, onHelpMenuVisibilityChange, }: DocumentationFlyoutProps) => JSX.Element; }" + ], + "path": "packages/kbn-language-documentation/src/components/as_flyout/index.tsx", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/language-documentation", + "id": "def-common.LanguageDocumentationFlyout.$1", + "type": "Uncategorized", + "tags": [], + "label": "props", + "description": [], + "signature": [ + "P" + ], + "path": "node_modules/@types/react/index.d.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/language-documentation", + "id": "def-common.LanguageDocumentationInline", + "type": "Function", + "tags": [], + "label": "LanguageDocumentationInline", + "description": [], + "signature": [ + "React.NamedExoticComponent & { readonly type: ({ searchInDescription }: DocumentationInlineProps) => JSX.Element; }" + ], + "path": "packages/kbn-language-documentation/src/components/as_inline/index.tsx", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/language-documentation", + "id": "def-common.LanguageDocumentationInline.$1", + "type": "Uncategorized", + "tags": [], + "label": "props", + "description": [], + "signature": [ + "P" + ], + "path": "node_modules/@types/react/index.d.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/language-documentation", + "id": "def-common.LanguageDocumentationPopover", + "type": "Function", + "tags": [], + "label": "LanguageDocumentationPopover", + "description": [], + "signature": [ + "React.NamedExoticComponent & { readonly type: ({ language, sections, buttonProps, searchInDescription, linkToDocumentation, isHelpMenuOpen, onHelpMenuVisibilityChange, }: DocumentationPopoverProps) => JSX.Element; }" + ], + "path": "packages/kbn-language-documentation/src/components/as_popover/index.tsx", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/language-documentation", + "id": "def-common.LanguageDocumentationPopover.$1", + "type": "Uncategorized", + "tags": [], + "label": "props", + "description": [], + "signature": [ + "P" + ], + "path": "node_modules/@types/react/index.d.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/language-documentation", + "id": "def-common.LanguageDocumentationPopoverContent", + "type": "Function", + "tags": [], + "label": "LanguageDocumentationPopoverContent", + "description": [], + "signature": [ + "React.NamedExoticComponent & { readonly type: ({ language, sections, searchInDescription, linkToDocumentation, }: DocumentationProps) => JSX.Element; }" + ], + "path": "packages/kbn-language-documentation/src/components/as_popover/popover_content.tsx", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/language-documentation", + "id": "def-common.LanguageDocumentationPopoverContent.$1", + "type": "Uncategorized", + "tags": [], + "label": "props", + "description": [], + "signature": [ + "P" + ], + "path": "node_modules/@types/react/index.d.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], + "interfaces": [ + { + "parentPluginId": "@kbn/language-documentation", + "id": "def-common.LanguageDocumentationSections", + "type": "Interface", + "tags": [], + "label": "LanguageDocumentationSections", + "description": [], + "path": "packages/kbn-language-documentation/src/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/language-documentation", + "id": "def-common.LanguageDocumentationSections.groups", + "type": "Array", + "tags": [], + "label": "groups", + "description": [], + "signature": [ + "{ label: string; description?: string | undefined; items: { label: string; description?: JSX.Element | undefined; }[]; }[]" + ], + "path": "packages/kbn-language-documentation/src/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/language-documentation", + "id": "def-common.LanguageDocumentationSections.initialSection", + "type": "Object", + "tags": [], + "label": "initialSection", + "description": [], + "signature": [ + "JSX.Element" + ], + "path": "packages/kbn-language-documentation/src/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_language_documentation.mdx b/api_docs/kbn_language_documentation.mdx new file mode 100644 index 0000000000000..9d61a36cfe83c --- /dev/null +++ b/api_docs/kbn_language_documentation.mdx @@ -0,0 +1,33 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibKbnLanguageDocumentationPluginApi +slug: /kibana-dev-docs/api/kbn-language-documentation +title: "@kbn/language-documentation" +image: https://source.unsplash.com/400x175/?github +description: API docs for the @kbn/language-documentation plugin +date: 2024-09-24 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/language-documentation'] +--- +import kbnLanguageDocumentationObj from './kbn_language_documentation.devdocs.json'; + + + +Contact [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 11 | 0 | 7 | 0 | + +## Common + +### Functions + + +### Interfaces + + diff --git a/api_docs/kbn_lens_embeddable_utils.mdx b/api_docs/kbn_lens_embeddable_utils.mdx index 3d0e122faa3ed..d4aa1a698a4d5 100644 --- a/api_docs/kbn_lens_embeddable_utils.mdx +++ b/api_docs/kbn_lens_embeddable_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-embeddable-utils title: "@kbn/lens-embeddable-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-embeddable-utils plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-embeddable-utils'] --- import kbnLensEmbeddableUtilsObj from './kbn_lens_embeddable_utils.devdocs.json'; diff --git a/api_docs/kbn_lens_formula_docs.mdx b/api_docs/kbn_lens_formula_docs.mdx index ea64fc29ae107..edf0a7aa49284 100644 --- a/api_docs/kbn_lens_formula_docs.mdx +++ b/api_docs/kbn_lens_formula_docs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-formula-docs title: "@kbn/lens-formula-docs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-formula-docs plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-formula-docs'] --- import kbnLensFormulaDocsObj from './kbn_lens_formula_docs.devdocs.json'; diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index d8cffe4ccc85e..5f2742d2ac8bb 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: 2024-09-23 +date: 2024-09-24 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 8bc93766c482e..a24b7327e8d51 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks'] --- import kbnLoggingMocksObj from './kbn_logging_mocks.devdocs.json'; diff --git a/api_docs/kbn_managed_content_badge.mdx b/api_docs/kbn_managed_content_badge.mdx index 561498e5fed4a..90d04e4754f64 100644 --- a/api_docs/kbn_managed_content_badge.mdx +++ b/api_docs/kbn_managed_content_badge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-content-badge title: "@kbn/managed-content-badge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-content-badge plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-content-badge'] --- import kbnManagedContentBadgeObj from './kbn_managed_content_badge.devdocs.json'; diff --git a/api_docs/kbn_managed_vscode_config.mdx b/api_docs/kbn_managed_vscode_config.mdx index e4d60bd081150..a547267936a93 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-vscode-config'] --- import kbnManagedVscodeConfigObj from './kbn_managed_vscode_config.devdocs.json'; diff --git a/api_docs/kbn_management_cards_navigation.mdx b/api_docs/kbn_management_cards_navigation.mdx index 92e1e9bfb8567..02fcbc40287e1 100644 --- a/api_docs/kbn_management_cards_navigation.mdx +++ b/api_docs/kbn_management_cards_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-cards-navigation title: "@kbn/management-cards-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-cards-navigation plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-cards-navigation'] --- import kbnManagementCardsNavigationObj from './kbn_management_cards_navigation.devdocs.json'; diff --git a/api_docs/kbn_management_settings_application.mdx b/api_docs/kbn_management_settings_application.mdx index bd69288458650..a5cb41aa6c3a1 100644 --- a/api_docs/kbn_management_settings_application.mdx +++ b/api_docs/kbn_management_settings_application.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-application title: "@kbn/management-settings-application" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-application plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-application'] --- import kbnManagementSettingsApplicationObj from './kbn_management_settings_application.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_category.mdx b/api_docs/kbn_management_settings_components_field_category.mdx index 64992b8b4fa5e..ccd794a53e0c5 100644 --- a/api_docs/kbn_management_settings_components_field_category.mdx +++ b/api_docs/kbn_management_settings_components_field_category.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-category title: "@kbn/management-settings-components-field-category" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-category plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-category'] --- import kbnManagementSettingsComponentsFieldCategoryObj from './kbn_management_settings_components_field_category.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_input.mdx b/api_docs/kbn_management_settings_components_field_input.mdx index f2e83f90fd4d3..03e845efd69b8 100644 --- a/api_docs/kbn_management_settings_components_field_input.mdx +++ b/api_docs/kbn_management_settings_components_field_input.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-input title: "@kbn/management-settings-components-field-input" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-input plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-input'] --- import kbnManagementSettingsComponentsFieldInputObj from './kbn_management_settings_components_field_input.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_row.mdx b/api_docs/kbn_management_settings_components_field_row.mdx index 9f53a5b60ec0d..fc7cf5b6dc655 100644 --- a/api_docs/kbn_management_settings_components_field_row.mdx +++ b/api_docs/kbn_management_settings_components_field_row.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-row title: "@kbn/management-settings-components-field-row" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-row plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-row'] --- import kbnManagementSettingsComponentsFieldRowObj from './kbn_management_settings_components_field_row.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_form.mdx b/api_docs/kbn_management_settings_components_form.mdx index 3fc1641619df5..26c9648bf9d4c 100644 --- a/api_docs/kbn_management_settings_components_form.mdx +++ b/api_docs/kbn_management_settings_components_form.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-form title: "@kbn/management-settings-components-form" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-form plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-form'] --- import kbnManagementSettingsComponentsFormObj from './kbn_management_settings_components_form.devdocs.json'; diff --git a/api_docs/kbn_management_settings_field_definition.mdx b/api_docs/kbn_management_settings_field_definition.mdx index 4a12af56fbcbf..7c9448beaface 100644 --- a/api_docs/kbn_management_settings_field_definition.mdx +++ b/api_docs/kbn_management_settings_field_definition.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-field-definition title: "@kbn/management-settings-field-definition" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-field-definition plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-field-definition'] --- import kbnManagementSettingsFieldDefinitionObj from './kbn_management_settings_field_definition.devdocs.json'; diff --git a/api_docs/kbn_management_settings_ids.mdx b/api_docs/kbn_management_settings_ids.mdx index 32c8a42e879cf..4dae71b418f05 100644 --- a/api_docs/kbn_management_settings_ids.mdx +++ b/api_docs/kbn_management_settings_ids.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-ids title: "@kbn/management-settings-ids" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-ids plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-ids'] --- import kbnManagementSettingsIdsObj from './kbn_management_settings_ids.devdocs.json'; diff --git a/api_docs/kbn_management_settings_section_registry.mdx b/api_docs/kbn_management_settings_section_registry.mdx index 37cfbf9a6ee5a..b41cfd76cb413 100644 --- a/api_docs/kbn_management_settings_section_registry.mdx +++ b/api_docs/kbn_management_settings_section_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-section-registry title: "@kbn/management-settings-section-registry" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-section-registry plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-section-registry'] --- import kbnManagementSettingsSectionRegistryObj from './kbn_management_settings_section_registry.devdocs.json'; diff --git a/api_docs/kbn_management_settings_types.mdx b/api_docs/kbn_management_settings_types.mdx index 7fe34f1f7499e..fb7be4a0a6f5e 100644 --- a/api_docs/kbn_management_settings_types.mdx +++ b/api_docs/kbn_management_settings_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-types title: "@kbn/management-settings-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-types plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-types'] --- import kbnManagementSettingsTypesObj from './kbn_management_settings_types.devdocs.json'; diff --git a/api_docs/kbn_management_settings_utilities.mdx b/api_docs/kbn_management_settings_utilities.mdx index 147aca08d1c80..271380096c415 100644 --- a/api_docs/kbn_management_settings_utilities.mdx +++ b/api_docs/kbn_management_settings_utilities.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-utilities title: "@kbn/management-settings-utilities" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-utilities plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-utilities'] --- import kbnManagementSettingsUtilitiesObj from './kbn_management_settings_utilities.devdocs.json'; diff --git a/api_docs/kbn_management_storybook_config.mdx b/api_docs/kbn_management_storybook_config.mdx index cee63cb3e1cb1..82029cb19e7f8 100644 --- a/api_docs/kbn_management_storybook_config.mdx +++ b/api_docs/kbn_management_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-storybook-config title: "@kbn/management-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-storybook-config plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-storybook-config'] --- import kbnManagementStorybookConfigObj from './kbn_management_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index 8608dc57bc6a7..fc829585e4080 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: 2024-09-23 +date: 2024-09-24 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 0c5af93071e02..e88d92b4fdcff 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: 2024-09-23 +date: 2024-09-24 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 4c113b69ed52d..77bde341bea78 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: 2024-09-23 +date: 2024-09-24 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 0302a54f6d0c1..95ed78dfae6c5 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: 2024-09-23 +date: 2024-09-24 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_cancellable_search.mdx b/api_docs/kbn_ml_cancellable_search.mdx index 330bbc438ebf4..1ebfbcad0ba07 100644 --- a/api_docs/kbn_ml_cancellable_search.mdx +++ b/api_docs/kbn_ml_cancellable_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-cancellable-search title: "@kbn/ml-cancellable-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-cancellable-search plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-cancellable-search'] --- import kbnMlCancellableSearchObj from './kbn_ml_cancellable_search.devdocs.json'; diff --git a/api_docs/kbn_ml_category_validator.mdx b/api_docs/kbn_ml_category_validator.mdx index 8428901ef144a..c9930c7f2d32e 100644 --- a/api_docs/kbn_ml_category_validator.mdx +++ b/api_docs/kbn_ml_category_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-category-validator title: "@kbn/ml-category-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-category-validator plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-category-validator'] --- import kbnMlCategoryValidatorObj from './kbn_ml_category_validator.devdocs.json'; diff --git a/api_docs/kbn_ml_chi2test.mdx b/api_docs/kbn_ml_chi2test.mdx index cec9210edece5..a4dcb125522e8 100644 --- a/api_docs/kbn_ml_chi2test.mdx +++ b/api_docs/kbn_ml_chi2test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-chi2test title: "@kbn/ml-chi2test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-chi2test plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-chi2test'] --- import kbnMlChi2testObj from './kbn_ml_chi2test.devdocs.json'; diff --git a/api_docs/kbn_ml_data_frame_analytics_utils.mdx b/api_docs/kbn_ml_data_frame_analytics_utils.mdx index eee4921d398f3..1d90039ce053d 100644 --- a/api_docs/kbn_ml_data_frame_analytics_utils.mdx +++ b/api_docs/kbn_ml_data_frame_analytics_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-frame-analytics-utils title: "@kbn/ml-data-frame-analytics-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-frame-analytics-utils plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-frame-analytics-utils'] --- import kbnMlDataFrameAnalyticsUtilsObj from './kbn_ml_data_frame_analytics_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_data_grid.mdx b/api_docs/kbn_ml_data_grid.mdx index 6249238c7100e..30bcb864cd371 100644 --- a/api_docs/kbn_ml_data_grid.mdx +++ b/api_docs/kbn_ml_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-grid title: "@kbn/ml-data-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-grid plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-grid'] --- import kbnMlDataGridObj from './kbn_ml_data_grid.devdocs.json'; diff --git a/api_docs/kbn_ml_date_picker.mdx b/api_docs/kbn_ml_date_picker.mdx index 83bcbb3817b0f..a8e1c566e8536 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-picker'] --- import kbnMlDatePickerObj from './kbn_ml_date_picker.devdocs.json'; diff --git a/api_docs/kbn_ml_date_utils.mdx b/api_docs/kbn_ml_date_utils.mdx index fbbe0626d1b25..a2df8d96d804e 100644 --- a/api_docs/kbn_ml_date_utils.mdx +++ b/api_docs/kbn_ml_date_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-utils title: "@kbn/ml-date-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-utils plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-utils'] --- import kbnMlDateUtilsObj from './kbn_ml_date_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_error_utils.mdx b/api_docs/kbn_ml_error_utils.mdx index 4d8967ce4716d..9a335128e7dd1 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: 2024-09-23 +date: 2024-09-24 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_in_memory_table.mdx b/api_docs/kbn_ml_in_memory_table.mdx index cf72734da4aff..c6af24318e267 100644 --- a/api_docs/kbn_ml_in_memory_table.mdx +++ b/api_docs/kbn_ml_in_memory_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-in-memory-table title: "@kbn/ml-in-memory-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-in-memory-table plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-in-memory-table'] --- import kbnMlInMemoryTableObj from './kbn_ml_in_memory_table.devdocs.json'; diff --git a/api_docs/kbn_ml_is_defined.mdx b/api_docs/kbn_ml_is_defined.mdx index d60a2105d1a09..89e13ce57b605 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: 2024-09-23 +date: 2024-09-24 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 c771ed4b4d36b..c5a1bca77459d 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-populated-object'] --- import kbnMlIsPopulatedObjectObj from './kbn_ml_is_populated_object.devdocs.json'; diff --git a/api_docs/kbn_ml_kibana_theme.mdx b/api_docs/kbn_ml_kibana_theme.mdx index 0b53670964b75..f5c94947ecf1f 100644 --- a/api_docs/kbn_ml_kibana_theme.mdx +++ b/api_docs/kbn_ml_kibana_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-kibana-theme title: "@kbn/ml-kibana-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-kibana-theme plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-kibana-theme'] --- import kbnMlKibanaThemeObj from './kbn_ml_kibana_theme.devdocs.json'; diff --git a/api_docs/kbn_ml_local_storage.mdx b/api_docs/kbn_ml_local_storage.mdx index f4492fc4f7e1d..ba107f3e99eb7 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: 2024-09-23 +date: 2024-09-24 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 f11a3dbc91b40..a35f96e8e8c1b 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: 2024-09-23 +date: 2024-09-24 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 7078beea82198..a0f7e4a98a261 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: 2024-09-23 +date: 2024-09-24 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 b7e43de80739d..bd8f8045bfea4 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: 2024-09-23 +date: 2024-09-24 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 1d5fef27ddf5e..95d8fd4386c43 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: 2024-09-23 +date: 2024-09-24 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 4ac3d0802dd8e..1cfeb656c7912 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-route-utils'] --- import kbnMlRouteUtilsObj from './kbn_ml_route_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_runtime_field_utils.mdx b/api_docs/kbn_ml_runtime_field_utils.mdx index 9c62d8e102ceb..3ffe2612069dc 100644 --- a/api_docs/kbn_ml_runtime_field_utils.mdx +++ b/api_docs/kbn_ml_runtime_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-runtime-field-utils title: "@kbn/ml-runtime-field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-runtime-field-utils plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-runtime-field-utils'] --- import kbnMlRuntimeFieldUtilsObj from './kbn_ml_runtime_field_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx index c5fd2c474a42e..d7ba722b1c6bf 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: 2024-09-23 +date: 2024-09-24 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_time_buckets.mdx b/api_docs/kbn_ml_time_buckets.mdx index e2c52a88f341f..832924b81ea1c 100644 --- a/api_docs/kbn_ml_time_buckets.mdx +++ b/api_docs/kbn_ml_time_buckets.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-time-buckets title: "@kbn/ml-time-buckets" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-time-buckets plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-time-buckets'] --- import kbnMlTimeBucketsObj from './kbn_ml_time_buckets.devdocs.json'; diff --git a/api_docs/kbn_ml_trained_models_utils.mdx b/api_docs/kbn_ml_trained_models_utils.mdx index e6455263686a9..0c92e0138377e 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: 2024-09-23 +date: 2024-09-24 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_ui_actions.mdx b/api_docs/kbn_ml_ui_actions.mdx index a46f15a08be6d..a9754b10ac00c 100644 --- a/api_docs/kbn_ml_ui_actions.mdx +++ b/api_docs/kbn_ml_ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-ui-actions title: "@kbn/ml-ui-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-ui-actions plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-ui-actions'] --- import kbnMlUiActionsObj from './kbn_ml_ui_actions.devdocs.json'; diff --git a/api_docs/kbn_ml_url_state.mdx b/api_docs/kbn_ml_url_state.mdx index 19c30dd290bdf..077546b056bd3 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-url-state'] --- import kbnMlUrlStateObj from './kbn_ml_url_state.devdocs.json'; diff --git a/api_docs/kbn_mock_idp_utils.mdx b/api_docs/kbn_mock_idp_utils.mdx index 626f33e40318b..1ed8cd14ce33e 100644 --- a/api_docs/kbn_mock_idp_utils.mdx +++ b/api_docs/kbn_mock_idp_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mock-idp-utils title: "@kbn/mock-idp-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mock-idp-utils plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mock-idp-utils'] --- import kbnMockIdpUtilsObj from './kbn_mock_idp_utils.devdocs.json'; diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index 967b9dc9b0a5f..15fd7a53315b6 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: 2024-09-23 +date: 2024-09-24 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 3951f8e7a0410..fd3634050e847 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning'] --- import kbnObjectVersioningObj from './kbn_object_versioning.devdocs.json'; diff --git a/api_docs/kbn_object_versioning_utils.mdx b/api_docs/kbn_object_versioning_utils.mdx index 3217a9f73542b..774216b925a34 100644 --- a/api_docs/kbn_object_versioning_utils.mdx +++ b/api_docs/kbn_object_versioning_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-object-versioning-utils title: "@kbn/object-versioning-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/object-versioning-utils plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning-utils'] --- import kbnObjectVersioningUtilsObj from './kbn_object_versioning_utils.devdocs.json'; diff --git a/api_docs/kbn_observability_alert_details.mdx b/api_docs/kbn_observability_alert_details.mdx index 2b4e94b45cfa3..e68128540d8c5 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alert-details'] --- import kbnObservabilityAlertDetailsObj from './kbn_observability_alert_details.devdocs.json'; diff --git a/api_docs/kbn_observability_alerting_rule_utils.mdx b/api_docs/kbn_observability_alerting_rule_utils.mdx index dd36cbc2aa500..7989ae83738e8 100644 --- a/api_docs/kbn_observability_alerting_rule_utils.mdx +++ b/api_docs/kbn_observability_alerting_rule_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alerting-rule-utils title: "@kbn/observability-alerting-rule-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alerting-rule-utils plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alerting-rule-utils'] --- import kbnObservabilityAlertingRuleUtilsObj from './kbn_observability_alerting_rule_utils.devdocs.json'; diff --git a/api_docs/kbn_observability_alerting_test_data.mdx b/api_docs/kbn_observability_alerting_test_data.mdx index 560d2ee996014..741e5ed532032 100644 --- a/api_docs/kbn_observability_alerting_test_data.mdx +++ b/api_docs/kbn_observability_alerting_test_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alerting-test-data title: "@kbn/observability-alerting-test-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alerting-test-data plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alerting-test-data'] --- import kbnObservabilityAlertingTestDataObj from './kbn_observability_alerting_test_data.devdocs.json'; diff --git a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx index a1bba7021a37e..48cbc92758bbe 100644 --- a/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx +++ b/api_docs/kbn_observability_get_padded_alert_time_range_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-get-padded-alert-time-range-util title: "@kbn/observability-get-padded-alert-time-range-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-get-padded-alert-time-range-util plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-get-padded-alert-time-range-util'] --- import kbnObservabilityGetPaddedAlertTimeRangeUtilObj from './kbn_observability_get_padded_alert_time_range_util.devdocs.json'; diff --git a/api_docs/kbn_openapi_bundler.mdx b/api_docs/kbn_openapi_bundler.mdx index 5ade1ce96ac66..49cee992658de 100644 --- a/api_docs/kbn_openapi_bundler.mdx +++ b/api_docs/kbn_openapi_bundler.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-bundler title: "@kbn/openapi-bundler" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-bundler plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-bundler'] --- import kbnOpenapiBundlerObj from './kbn_openapi_bundler.devdocs.json'; diff --git a/api_docs/kbn_openapi_generator.mdx b/api_docs/kbn_openapi_generator.mdx index 71e36a7054d43..cd29668d5f5f4 100644 --- a/api_docs/kbn_openapi_generator.mdx +++ b/api_docs/kbn_openapi_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-generator title: "@kbn/openapi-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-generator plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-generator'] --- import kbnOpenapiGeneratorObj from './kbn_openapi_generator.devdocs.json'; diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index 9dd0338036648..28cd7b2f95f7c 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: 2024-09-23 +date: 2024-09-24 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 c61c32e1d4d76..4b0cc1710bfaa 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: 2024-09-23 +date: 2024-09-24 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 783c3e9fdebe1..17c90c0132fad 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: 2024-09-23 +date: 2024-09-24 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_panel_loader.mdx b/api_docs/kbn_panel_loader.mdx index f84e89b2cd9e8..75bf267d3c8cd 100644 --- a/api_docs/kbn_panel_loader.mdx +++ b/api_docs/kbn_panel_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-panel-loader title: "@kbn/panel-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/panel-loader plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/panel-loader'] --- import kbnPanelLoaderObj from './kbn_panel_loader.devdocs.json'; diff --git a/api_docs/kbn_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index 74f0ba2a3e699..bc14a17c72143 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: 2024-09-23 +date: 2024-09-24 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_check.mdx b/api_docs/kbn_plugin_check.mdx index 96938025d5f12..66d75ca9ec108 100644 --- a/api_docs/kbn_plugin_check.mdx +++ b/api_docs/kbn_plugin_check.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-check title: "@kbn/plugin-check" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-check plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-check'] --- import kbnPluginCheckObj from './kbn_plugin_check.devdocs.json'; diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx index a2b4440e01cd9..34138f14b11c9 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: 2024-09-23 +date: 2024-09-24 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 e8a5d612921f8..21fdb68f9d5ec 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_presentation_containers.mdx b/api_docs/kbn_presentation_containers.mdx index 093268d1c5e48..635ccbe14b7ff 100644 --- a/api_docs/kbn_presentation_containers.mdx +++ b/api_docs/kbn_presentation_containers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-presentation-containers title: "@kbn/presentation-containers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/presentation-containers plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-containers'] --- import kbnPresentationContainersObj from './kbn_presentation_containers.devdocs.json'; diff --git a/api_docs/kbn_presentation_publishing.mdx b/api_docs/kbn_presentation_publishing.mdx index e52d6723bc59e..772e0f6f1cd8b 100644 --- a/api_docs/kbn_presentation_publishing.mdx +++ b/api_docs/kbn_presentation_publishing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-presentation-publishing title: "@kbn/presentation-publishing" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/presentation-publishing plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/presentation-publishing'] --- import kbnPresentationPublishingObj from './kbn_presentation_publishing.devdocs.json'; diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx index f1526632ac998..2d790bcd51972 100644 --- a/api_docs/kbn_profiling_utils.mdx +++ b/api_docs/kbn_profiling_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-profiling-utils title: "@kbn/profiling-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/profiling-utils plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/profiling-utils'] --- import kbnProfilingUtilsObj from './kbn_profiling_utils.devdocs.json'; diff --git a/api_docs/kbn_random_sampling.mdx b/api_docs/kbn_random_sampling.mdx index c5c501bbd0468..f5050257d73aa 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: 2024-09-23 +date: 2024-09-24 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 43507c21c5d55..82ddf73c74788 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_react_hooks.mdx b/api_docs/kbn_react_hooks.mdx index 7a025fb416b72..c9904ca24279f 100644 --- a/api_docs/kbn_react_hooks.mdx +++ b/api_docs/kbn_react_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-hooks title: "@kbn/react-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-hooks plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-hooks'] --- import kbnReactHooksObj from './kbn_react_hooks.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_common.mdx b/api_docs/kbn_react_kibana_context_common.mdx index 3d5f558bfcdc3..b42f455a396d8 100644 --- a/api_docs/kbn_react_kibana_context_common.mdx +++ b/api_docs/kbn_react_kibana_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-common title: "@kbn/react-kibana-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-common plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-common'] --- import kbnReactKibanaContextCommonObj from './kbn_react_kibana_context_common.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_render.mdx b/api_docs/kbn_react_kibana_context_render.mdx index 6a4070152d7b2..85a471d382b1a 100644 --- a/api_docs/kbn_react_kibana_context_render.mdx +++ b/api_docs/kbn_react_kibana_context_render.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-render title: "@kbn/react-kibana-context-render" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-render plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-render'] --- import kbnReactKibanaContextRenderObj from './kbn_react_kibana_context_render.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_root.mdx b/api_docs/kbn_react_kibana_context_root.mdx index 17427b1839000..1224b94d076af 100644 --- a/api_docs/kbn_react_kibana_context_root.mdx +++ b/api_docs/kbn_react_kibana_context_root.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-root title: "@kbn/react-kibana-context-root" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-root plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-root'] --- import kbnReactKibanaContextRootObj from './kbn_react_kibana_context_root.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_styled.mdx b/api_docs/kbn_react_kibana_context_styled.mdx index c14c49f13bf2c..a005b694f0d2e 100644 --- a/api_docs/kbn_react_kibana_context_styled.mdx +++ b/api_docs/kbn_react_kibana_context_styled.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-styled title: "@kbn/react-kibana-context-styled" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-styled plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-styled'] --- import kbnReactKibanaContextStyledObj from './kbn_react_kibana_context_styled.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_theme.mdx b/api_docs/kbn_react_kibana_context_theme.mdx index b43391865cd14..6420f41c79f5b 100644 --- a/api_docs/kbn_react_kibana_context_theme.mdx +++ b/api_docs/kbn_react_kibana_context_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-theme title: "@kbn/react-kibana-context-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-theme plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-theme'] --- import kbnReactKibanaContextThemeObj from './kbn_react_kibana_context_theme.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_mount.mdx b/api_docs/kbn_react_kibana_mount.mdx index b28ede79412b5..8ed4c817730c8 100644 --- a/api_docs/kbn_react_kibana_mount.mdx +++ b/api_docs/kbn_react_kibana_mount.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-mount title: "@kbn/react-kibana-mount" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-mount plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-mount'] --- import kbnReactKibanaMountObj from './kbn_react_kibana_mount.devdocs.json'; diff --git a/api_docs/kbn_recently_accessed.mdx b/api_docs/kbn_recently_accessed.mdx index 013f293e89ad0..2d6104a934395 100644 --- a/api_docs/kbn_recently_accessed.mdx +++ b/api_docs/kbn_recently_accessed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-recently-accessed title: "@kbn/recently-accessed" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/recently-accessed plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/recently-accessed'] --- import kbnRecentlyAccessedObj from './kbn_recently_accessed.devdocs.json'; diff --git a/api_docs/kbn_repo_file_maps.mdx b/api_docs/kbn_repo_file_maps.mdx index 330d2abdb797e..94e86b05fe693 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: 2024-09-23 +date: 2024-09-24 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 007dbefecd0d2..0354079544740 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: 2024-09-23 +date: 2024-09-24 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 308a7ef29bb0e..59a3aec48da24 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: 2024-09-23 +date: 2024-09-24 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 e29c251a102fd..ff65a219dc12d 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: 2024-09-23 +date: 2024-09-24 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 625fd8b8e6244..10eb3da3b72cc 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-common'] --- import kbnReportingCommonObj from './kbn_reporting_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_csv_share_panel.mdx b/api_docs/kbn_reporting_csv_share_panel.mdx index d066ae0847f95..cbb2b62920edd 100644 --- a/api_docs/kbn_reporting_csv_share_panel.mdx +++ b/api_docs/kbn_reporting_csv_share_panel.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-csv-share-panel title: "@kbn/reporting-csv-share-panel" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-csv-share-panel plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-csv-share-panel'] --- import kbnReportingCsvSharePanelObj from './kbn_reporting_csv_share_panel.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv.mdx b/api_docs/kbn_reporting_export_types_csv.mdx index db072fbe60154..10881ee026d12 100644 --- a/api_docs/kbn_reporting_export_types_csv.mdx +++ b/api_docs/kbn_reporting_export_types_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv title: "@kbn/reporting-export-types-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv'] --- import kbnReportingExportTypesCsvObj from './kbn_reporting_export_types_csv.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_csv_common.mdx b/api_docs/kbn_reporting_export_types_csv_common.mdx index 22b8aa3f81a79..d932fb4519300 100644 --- a/api_docs/kbn_reporting_export_types_csv_common.mdx +++ b/api_docs/kbn_reporting_export_types_csv_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-csv-common title: "@kbn/reporting-export-types-csv-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-csv-common plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-csv-common'] --- import kbnReportingExportTypesCsvCommonObj from './kbn_reporting_export_types_csv_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf.mdx b/api_docs/kbn_reporting_export_types_pdf.mdx index 93d7aa50342ac..95601986ae8a4 100644 --- a/api_docs/kbn_reporting_export_types_pdf.mdx +++ b/api_docs/kbn_reporting_export_types_pdf.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf title: "@kbn/reporting-export-types-pdf" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf'] --- import kbnReportingExportTypesPdfObj from './kbn_reporting_export_types_pdf.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_pdf_common.mdx b/api_docs/kbn_reporting_export_types_pdf_common.mdx index 4ab3a75890cd4..dcd09969d7ceb 100644 --- a/api_docs/kbn_reporting_export_types_pdf_common.mdx +++ b/api_docs/kbn_reporting_export_types_pdf_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-pdf-common title: "@kbn/reporting-export-types-pdf-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-pdf-common plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-pdf-common'] --- import kbnReportingExportTypesPdfCommonObj from './kbn_reporting_export_types_pdf_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png.mdx b/api_docs/kbn_reporting_export_types_png.mdx index a8d72e96ab6df..f3794f22034f2 100644 --- a/api_docs/kbn_reporting_export_types_png.mdx +++ b/api_docs/kbn_reporting_export_types_png.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png title: "@kbn/reporting-export-types-png" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png'] --- import kbnReportingExportTypesPngObj from './kbn_reporting_export_types_png.devdocs.json'; diff --git a/api_docs/kbn_reporting_export_types_png_common.mdx b/api_docs/kbn_reporting_export_types_png_common.mdx index 5f62347638c95..d44823239f7bf 100644 --- a/api_docs/kbn_reporting_export_types_png_common.mdx +++ b/api_docs/kbn_reporting_export_types_png_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-export-types-png-common title: "@kbn/reporting-export-types-png-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-export-types-png-common plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-export-types-png-common'] --- import kbnReportingExportTypesPngCommonObj from './kbn_reporting_export_types_png_common.devdocs.json'; diff --git a/api_docs/kbn_reporting_mocks_server.mdx b/api_docs/kbn_reporting_mocks_server.mdx index 35dc2dcc5021e..df4a6ed008ca5 100644 --- a/api_docs/kbn_reporting_mocks_server.mdx +++ b/api_docs/kbn_reporting_mocks_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-mocks-server title: "@kbn/reporting-mocks-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-mocks-server plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-mocks-server'] --- import kbnReportingMocksServerObj from './kbn_reporting_mocks_server.devdocs.json'; diff --git a/api_docs/kbn_reporting_public.mdx b/api_docs/kbn_reporting_public.mdx index d6e176f90971d..9bc03cd634231 100644 --- a/api_docs/kbn_reporting_public.mdx +++ b/api_docs/kbn_reporting_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-public title: "@kbn/reporting-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-public plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-public'] --- import kbnReportingPublicObj from './kbn_reporting_public.devdocs.json'; diff --git a/api_docs/kbn_reporting_server.mdx b/api_docs/kbn_reporting_server.mdx index c5839b6e455fa..790e88d144e90 100644 --- a/api_docs/kbn_reporting_server.mdx +++ b/api_docs/kbn_reporting_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-server title: "@kbn/reporting-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-server plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-server'] --- import kbnReportingServerObj from './kbn_reporting_server.devdocs.json'; diff --git a/api_docs/kbn_resizable_layout.mdx b/api_docs/kbn_resizable_layout.mdx index b73272d3ee342..c3d77955d16b6 100644 --- a/api_docs/kbn_resizable_layout.mdx +++ b/api_docs/kbn_resizable_layout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-resizable-layout title: "@kbn/resizable-layout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/resizable-layout plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/resizable-layout'] --- import kbnResizableLayoutObj from './kbn_resizable_layout.devdocs.json'; diff --git a/api_docs/kbn_response_ops_feature_flag_service.mdx b/api_docs/kbn_response_ops_feature_flag_service.mdx index b11bce7147c35..b33c44434cfa4 100644 --- a/api_docs/kbn_response_ops_feature_flag_service.mdx +++ b/api_docs/kbn_response_ops_feature_flag_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-response-ops-feature-flag-service title: "@kbn/response-ops-feature-flag-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/response-ops-feature-flag-service plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/response-ops-feature-flag-service'] --- import kbnResponseOpsFeatureFlagServiceObj from './kbn_response_ops_feature_flag_service.devdocs.json'; diff --git a/api_docs/kbn_rison.mdx b/api_docs/kbn_rison.mdx index 5847166a54698..ec0590f4fdc3f 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_rollup.mdx b/api_docs/kbn_rollup.mdx index 5ba66ef55d0e4..ebf2b2fd3a47a 100644 --- a/api_docs/kbn_rollup.mdx +++ b/api_docs/kbn_rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rollup title: "@kbn/rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rollup plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rollup'] --- import kbnRollupObj from './kbn_rollup.devdocs.json'; diff --git a/api_docs/kbn_router_to_openapispec.mdx b/api_docs/kbn_router_to_openapispec.mdx index ca2d2c607866a..50890bc47c903 100644 --- a/api_docs/kbn_router_to_openapispec.mdx +++ b/api_docs/kbn_router_to_openapispec.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-router-to-openapispec title: "@kbn/router-to-openapispec" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/router-to-openapispec plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/router-to-openapispec'] --- import kbnRouterToOpenapispecObj from './kbn_router_to_openapispec.devdocs.json'; diff --git a/api_docs/kbn_router_utils.mdx b/api_docs/kbn_router_utils.mdx index 9f7088a41f727..65dedea855a97 100644 --- a/api_docs/kbn_router_utils.mdx +++ b/api_docs/kbn_router_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-router-utils title: "@kbn/router-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/router-utils plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/router-utils'] --- import kbnRouterUtilsObj from './kbn_router_utils.devdocs.json'; diff --git a/api_docs/kbn_rrule.mdx b/api_docs/kbn_rrule.mdx index 761e219f44a45..6a5e2125b9f1e 100644 --- a/api_docs/kbn_rrule.mdx +++ b/api_docs/kbn_rrule.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rrule title: "@kbn/rrule" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rrule plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rrule'] --- import kbnRruleObj from './kbn_rrule.devdocs.json'; diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index dd294080f2912..f0f0fde4eb64a 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: 2024-09-23 +date: 2024-09-24 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 d0264c0a1256d..6ce299ddf620b 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/saved-objects-settings'] --- import kbnSavedObjectsSettingsObj from './kbn_saved_objects_settings.devdocs.json'; diff --git a/api_docs/kbn_screenshotting_server.mdx b/api_docs/kbn_screenshotting_server.mdx index d534f1b236dec..fb39c0360212a 100644 --- a/api_docs/kbn_screenshotting_server.mdx +++ b/api_docs/kbn_screenshotting_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-screenshotting-server title: "@kbn/screenshotting-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/screenshotting-server plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/screenshotting-server'] --- import kbnScreenshottingServerObj from './kbn_screenshotting_server.devdocs.json'; diff --git a/api_docs/kbn_search_api_panels.mdx b/api_docs/kbn_search_api_panels.mdx index bdbb8230ef336..0944771a55a45 100644 --- a/api_docs/kbn_search_api_panels.mdx +++ b/api_docs/kbn_search_api_panels.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-panels title: "@kbn/search-api-panels" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-panels plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-panels'] --- import kbnSearchApiPanelsObj from './kbn_search_api_panels.devdocs.json'; diff --git a/api_docs/kbn_search_connectors.mdx b/api_docs/kbn_search_connectors.mdx index 0bc67b9ff7ba5..cf8f45cedcd36 100644 --- a/api_docs/kbn_search_connectors.mdx +++ b/api_docs/kbn_search_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-connectors title: "@kbn/search-connectors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-connectors plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-connectors'] --- import kbnSearchConnectorsObj from './kbn_search_connectors.devdocs.json'; diff --git a/api_docs/kbn_search_errors.mdx b/api_docs/kbn_search_errors.mdx index d89cc987031b7..7c6b33a05ae06 100644 --- a/api_docs/kbn_search_errors.mdx +++ b/api_docs/kbn_search_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-errors title: "@kbn/search-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-errors plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-errors'] --- import kbnSearchErrorsObj from './kbn_search_errors.devdocs.json'; diff --git a/api_docs/kbn_search_index_documents.mdx b/api_docs/kbn_search_index_documents.mdx index a9d521133f4be..40f78972ebc3f 100644 --- a/api_docs/kbn_search_index_documents.mdx +++ b/api_docs/kbn_search_index_documents.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-index-documents title: "@kbn/search-index-documents" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-index-documents plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-index-documents'] --- import kbnSearchIndexDocumentsObj from './kbn_search_index_documents.devdocs.json'; diff --git a/api_docs/kbn_search_response_warnings.mdx b/api_docs/kbn_search_response_warnings.mdx index 9c44887a59fac..e959f55724772 100644 --- a/api_docs/kbn_search_response_warnings.mdx +++ b/api_docs/kbn_search_response_warnings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-response-warnings title: "@kbn/search-response-warnings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-response-warnings plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-response-warnings'] --- import kbnSearchResponseWarningsObj from './kbn_search_response_warnings.devdocs.json'; diff --git a/api_docs/kbn_search_types.mdx b/api_docs/kbn_search_types.mdx index d1ff681fd4f44..47b42153e38b7 100644 --- a/api_docs/kbn_search_types.mdx +++ b/api_docs/kbn_search_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-types title: "@kbn/search-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-types plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-types'] --- import kbnSearchTypesObj from './kbn_search_types.devdocs.json'; diff --git a/api_docs/kbn_security_api_key_management.mdx b/api_docs/kbn_security_api_key_management.mdx index 430201c3823e9..b48f1e9a1d479 100644 --- a/api_docs/kbn_security_api_key_management.mdx +++ b/api_docs/kbn_security_api_key_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-api-key-management title: "@kbn/security-api-key-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-api-key-management plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-api-key-management'] --- import kbnSecurityApiKeyManagementObj from './kbn_security_api_key_management.devdocs.json'; diff --git a/api_docs/kbn_security_authorization_core.mdx b/api_docs/kbn_security_authorization_core.mdx index 551b7cb7e2ed7..087e374b58f89 100644 --- a/api_docs/kbn_security_authorization_core.mdx +++ b/api_docs/kbn_security_authorization_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-authorization-core title: "@kbn/security-authorization-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-authorization-core plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-authorization-core'] --- import kbnSecurityAuthorizationCoreObj from './kbn_security_authorization_core.devdocs.json'; diff --git a/api_docs/kbn_security_form_components.mdx b/api_docs/kbn_security_form_components.mdx index b977eb5c6b07f..c80b937aa084e 100644 --- a/api_docs/kbn_security_form_components.mdx +++ b/api_docs/kbn_security_form_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-form-components title: "@kbn/security-form-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-form-components plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-form-components'] --- import kbnSecurityFormComponentsObj from './kbn_security_form_components.devdocs.json'; diff --git a/api_docs/kbn_security_hardening.mdx b/api_docs/kbn_security_hardening.mdx index 93d97b71a654d..153f9eb0aee53 100644 --- a/api_docs/kbn_security_hardening.mdx +++ b/api_docs/kbn_security_hardening.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-hardening title: "@kbn/security-hardening" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-hardening plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-hardening'] --- import kbnSecurityHardeningObj from './kbn_security_hardening.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_common.mdx b/api_docs/kbn_security_plugin_types_common.mdx index 907803e38525b..18585add928b5 100644 --- a/api_docs/kbn_security_plugin_types_common.mdx +++ b/api_docs/kbn_security_plugin_types_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-common title: "@kbn/security-plugin-types-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-common plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-common'] --- import kbnSecurityPluginTypesCommonObj from './kbn_security_plugin_types_common.devdocs.json'; diff --git a/api_docs/kbn_security_plugin_types_public.devdocs.json b/api_docs/kbn_security_plugin_types_public.devdocs.json index 3dee61c995c96..bd68a41ab5e36 100644 --- a/api_docs/kbn_security_plugin_types_public.devdocs.json +++ b/api_docs/kbn_security_plugin_types_public.devdocs.json @@ -207,6 +207,97 @@ ], "initialIsOpen": false }, + { + "parentPluginId": "@kbn/security-plugin-types-public", + "id": "def-public.BulkUpdatePayload", + "type": "Interface", + "tags": [], + "label": "BulkUpdatePayload", + "description": [], + "path": "x-pack/packages/security/plugin_types_public/src/roles/roles_api_client.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-plugin-types-public", + "id": "def-public.BulkUpdatePayload.rolesUpdate", + "type": "Array", + "tags": [], + "label": "rolesUpdate", + "description": [], + "signature": [ + { + "pluginId": "@kbn/security-plugin-types-common", + "scope": "common", + "docId": "kibKbnSecurityPluginTypesCommonPluginApi", + "section": "def-common.Role", + "text": "Role" + }, + "[]" + ], + "path": "x-pack/packages/security/plugin_types_public/src/roles/roles_api_client.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-public", + "id": "def-public.BulkUpdateRoleResponse", + "type": "Interface", + "tags": [], + "label": "BulkUpdateRoleResponse", + "description": [], + "path": "x-pack/packages/security/plugin_types_public/src/roles/roles_api_client.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-plugin-types-public", + "id": "def-public.BulkUpdateRoleResponse.created", + "type": "Array", + "tags": [], + "label": "created", + "description": [], + "signature": [ + "string[] | undefined" + ], + "path": "x-pack/packages/security/plugin_types_public/src/roles/roles_api_client.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-public", + "id": "def-public.BulkUpdateRoleResponse.updated", + "type": "Array", + "tags": [], + "label": "updated", + "description": [], + "signature": [ + "string[] | undefined" + ], + "path": "x-pack/packages/security/plugin_types_public/src/roles/roles_api_client.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-plugin-types-public", + "id": "def-public.BulkUpdateRoleResponse.errors", + "type": "Object", + "tags": [], + "label": "errors", + "description": [], + "signature": [ + "Record | undefined" + ], + "path": "x-pack/packages/security/plugin_types_public/src/roles/roles_api_client.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, { "parentPluginId": "@kbn/security-plugin-types-public", "id": "def-public.GetUserProfileResponse", @@ -514,6 +605,60 @@ } ], "returnComment": [] + }, + { + "parentPluginId": "@kbn/security-plugin-types-public", + "id": "def-public.RolesAPIClient.bulkUpdateRoles", + "type": "Function", + "tags": [], + "label": "bulkUpdateRoles", + "description": [], + "signature": [ + "(payload: ", + { + "pluginId": "@kbn/security-plugin-types-public", + "scope": "public", + "docId": "kibKbnSecurityPluginTypesPublicPluginApi", + "section": "def-public.BulkUpdatePayload", + "text": "BulkUpdatePayload" + }, + ") => Promise<", + { + "pluginId": "@kbn/security-plugin-types-public", + "scope": "public", + "docId": "kibKbnSecurityPluginTypesPublicPluginApi", + "section": "def-public.BulkUpdateRoleResponse", + "text": "BulkUpdateRoleResponse" + }, + ">" + ], + "path": "x-pack/packages/security/plugin_types_public/src/roles/roles_api_client.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/security-plugin-types-public", + "id": "def-public.RolesAPIClient.bulkUpdateRoles.$1", + "type": "Object", + "tags": [], + "label": "payload", + "description": [], + "signature": [ + { + "pluginId": "@kbn/security-plugin-types-public", + "scope": "public", + "docId": "kibKbnSecurityPluginTypesPublicPluginApi", + "section": "def-public.BulkUpdatePayload", + "text": "BulkUpdatePayload" + } + ], + "path": "x-pack/packages/security/plugin_types_public/src/roles/roles_api_client.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] } ], "initialIsOpen": false diff --git a/api_docs/kbn_security_plugin_types_public.mdx b/api_docs/kbn_security_plugin_types_public.mdx index 226d97fb685e4..e69f8fc8beaa0 100644 --- a/api_docs/kbn_security_plugin_types_public.mdx +++ b/api_docs/kbn_security_plugin_types_public.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-public title: "@kbn/security-plugin-types-public" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-public plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-public'] --- import kbnSecurityPluginTypesPublicObj from './kbn_security_plugin_types_public.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana- | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 58 | 0 | 31 | 0 | +| 66 | 0 | 39 | 0 | ## Client diff --git a/api_docs/kbn_security_plugin_types_server.mdx b/api_docs/kbn_security_plugin_types_server.mdx index 4c98ea2d4ba89..f9cd5c7a1e574 100644 --- a/api_docs/kbn_security_plugin_types_server.mdx +++ b/api_docs/kbn_security_plugin_types_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-plugin-types-server title: "@kbn/security-plugin-types-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-plugin-types-server plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-plugin-types-server'] --- import kbnSecurityPluginTypesServerObj from './kbn_security_plugin_types_server.devdocs.json'; diff --git a/api_docs/kbn_security_role_management_model.mdx b/api_docs/kbn_security_role_management_model.mdx index 73a5349592f9f..b660ac277f03f 100644 --- a/api_docs/kbn_security_role_management_model.mdx +++ b/api_docs/kbn_security_role_management_model.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-role-management-model title: "@kbn/security-role-management-model" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-role-management-model plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-role-management-model'] --- import kbnSecurityRoleManagementModelObj from './kbn_security_role_management_model.devdocs.json'; diff --git a/api_docs/kbn_security_solution_common.mdx b/api_docs/kbn_security_solution_common.mdx index 2d1be761995a4..9539f7a4ba6c2 100644 --- a/api_docs/kbn_security_solution_common.mdx +++ b/api_docs/kbn_security_solution_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-common title: "@kbn/security-solution-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-common plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-common'] --- import kbnSecuritySolutionCommonObj from './kbn_security_solution_common.devdocs.json'; diff --git a/api_docs/kbn_security_solution_distribution_bar.mdx b/api_docs/kbn_security_solution_distribution_bar.mdx index 8503aa5d74388..80a5516a74739 100644 --- a/api_docs/kbn_security_solution_distribution_bar.mdx +++ b/api_docs/kbn_security_solution_distribution_bar.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-distribution-bar title: "@kbn/security-solution-distribution-bar" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-distribution-bar plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-distribution-bar'] --- import kbnSecuritySolutionDistributionBarObj from './kbn_security_solution_distribution_bar.devdocs.json'; diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx index ccfa1fa9d7d13..0f323bc749528 100644 --- a/api_docs/kbn_security_solution_features.mdx +++ b/api_docs/kbn_security_solution_features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-features title: "@kbn/security-solution-features" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-features plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-features'] --- import kbnSecuritySolutionFeaturesObj from './kbn_security_solution_features.devdocs.json'; diff --git a/api_docs/kbn_security_solution_navigation.mdx b/api_docs/kbn_security_solution_navigation.mdx index fe03fe3b0e13a..7fb8e566f683c 100644 --- a/api_docs/kbn_security_solution_navigation.mdx +++ b/api_docs/kbn_security_solution_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-navigation title: "@kbn/security-solution-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-navigation plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-navigation'] --- import kbnSecuritySolutionNavigationObj from './kbn_security_solution_navigation.devdocs.json'; diff --git a/api_docs/kbn_security_solution_side_nav.mdx b/api_docs/kbn_security_solution_side_nav.mdx index d4dc7d870615b..bdb7be78afd86 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: 2024-09-23 +date: 2024-09-24 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 4c9e135f87832..921d5e2a93d1a 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: 2024-09-23 +date: 2024-09-24 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_security_ui_components.devdocs.json b/api_docs/kbn_security_ui_components.devdocs.json index 9a0cd5098d114..20238b9a4bcc4 100644 --- a/api_docs/kbn_security_ui_components.devdocs.json +++ b/api_docs/kbn_security_ui_components.devdocs.json @@ -71,6 +71,17 @@ "path": "x-pack/packages/security/ui_components/src/kibana_privilege_table/feature_table.tsx", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/security-ui-components", + "id": "def-common.FeatureTable.defaultProps.showTitle", + "type": "boolean", + "tags": [], + "label": "showTitle", + "description": [], + "path": "x-pack/packages/security/ui_components/src/kibana_privilege_table/feature_table.tsx", + "deprecated": false, + "trackAdoption": false } ] }, diff --git a/api_docs/kbn_security_ui_components.mdx b/api_docs/kbn_security_ui_components.mdx index e83036d5ab054..22297b8475aba 100644 --- a/api_docs/kbn_security_ui_components.mdx +++ b/api_docs/kbn_security_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-ui-components title: "@kbn/security-ui-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-ui-components plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-ui-components'] --- import kbnSecurityUiComponentsObj from './kbn_security_ui_components.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana- | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 47 | 0 | 12 | 0 | +| 48 | 0 | 13 | 0 | ## Common diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index 833aeb7ad7fbb..e05b4d57d2c14 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: 2024-09-23 +date: 2024-09-24 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 8ba7ec8de8e0e..d2dd6cb7bbbec 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: 2024-09-23 +date: 2024-09-24 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 498e5e5fed3bf..bbe20aee0392a 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: 2024-09-23 +date: 2024-09-24 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 531a468db9243..a03279bbc3fc3 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: 2024-09-23 +date: 2024-09-24 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 686633330f022..13604800ff3dd 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-exception-list-components'] --- import kbnSecuritysolutionExceptionListComponentsObj from './kbn_securitysolution_exception_list_components.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index 9fc84aa46b2b4..d476cf9e8f94b 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: 2024-09-23 +date: 2024-09-24 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 ef945a4a42ca1..9341d9d288df2 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: 2024-09-23 +date: 2024-09-24 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 318a63cc4d18d..9e661429c7213 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: 2024-09-23 +date: 2024-09-24 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 36736d13b18d3..374cfbbf9763f 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: 2024-09-23 +date: 2024-09-24 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 1f9321708acd7..228baf41cc6d3 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: 2024-09-23 +date: 2024-09-24 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 c56286a1cf17a..9af9067db204b 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: 2024-09-23 +date: 2024-09-24 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.devdocs.json b/api_docs/kbn_securitysolution_list_constants.devdocs.json index e1069bb51c152..0723d3a24ca19 100644 --- a/api_docs/kbn_securitysolution_list_constants.devdocs.json +++ b/api_docs/kbn_securitysolution_list_constants.devdocs.json @@ -75,18 +75,6 @@ "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/public/management/pages/blocklist/constants.ts" }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/management/pages/blocklist/services/blocklists_api_client.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/management/pages/blocklist/services/blocklists_api_client.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/management/pages/blocklist/services/blocklists_api_client.ts" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/public/management/pages/policy/view/policy_hooks.ts" @@ -259,18 +247,6 @@ "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/public/management/pages/event_filters/service/service_actions.ts" }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/management/pages/event_filters/service/api_client.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/management/pages/event_filters/service/api_client.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/management/pages/event_filters/service/api_client.ts" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/public/management/pages/policy/view/policy_hooks.ts" @@ -451,18 +427,6 @@ "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/constants.ts" }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/host_isolation_exceptions_api_client.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/host_isolation_exceptions_api_client.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/management/pages/host_isolation_exceptions/host_isolation_exceptions_api_client.ts" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/server/endpoint/lib/artifacts/lists.ts" @@ -752,18 +716,6 @@ "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/public/management/pages/trusted_apps/constants.ts" }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/management/pages/trusted_apps/service/api_client.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/management/pages/trusted_apps/service/api_client.ts" - }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/management/pages/trusted_apps/service/api_client.ts" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/public/management/pages/policy/view/policy_hooks.ts" diff --git a/api_docs/kbn_securitysolution_list_constants.mdx b/api_docs/kbn_securitysolution_list_constants.mdx index a3f01236e42be..51ca0abce1af0 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: 2024-09-23 +date: 2024-09-24 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 773e1daec362c..fbe6d150b69f9 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: 2024-09-23 +date: 2024-09-24 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 bf31df6242884..a596556f65093 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: 2024-09-23 +date: 2024-09-24 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 b5c2c0ab5d945..824d4ffcecec4 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: 2024-09-23 +date: 2024-09-24 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 749914a01e6d7..6a9e3795760b9 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: 2024-09-23 +date: 2024-09-24 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 6079071cfb138..247c0682c3bba 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: 2024-09-23 +date: 2024-09-24 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 9396d7c2232e2..16906090fe6c7 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: 2024-09-23 +date: 2024-09-24 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 b44dc646e392e..19d2b56e2bbe6 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository_client.mdx b/api_docs/kbn_server_route_repository_client.mdx index 0add7375192b1..be3c01cc82f1a 100644 --- a/api_docs/kbn_server_route_repository_client.mdx +++ b/api_docs/kbn_server_route_repository_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository-client title: "@kbn/server-route-repository-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository-client plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository-client'] --- import kbnServerRouteRepositoryClientObj from './kbn_server_route_repository_client.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository_utils.mdx b/api_docs/kbn_server_route_repository_utils.mdx index d1debbddaca93..b80ac91a334d9 100644 --- a/api_docs/kbn_server_route_repository_utils.mdx +++ b/api_docs/kbn_server_route_repository_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository-utils title: "@kbn/server-route-repository-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository-utils plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository-utils'] --- import kbnServerRouteRepositoryUtilsObj from './kbn_server_route_repository_utils.devdocs.json'; diff --git a/api_docs/kbn_serverless_common_settings.mdx b/api_docs/kbn_serverless_common_settings.mdx index e400e245a5666..ba38a879e8cbc 100644 --- a/api_docs/kbn_serverless_common_settings.mdx +++ b/api_docs/kbn_serverless_common_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-common-settings title: "@kbn/serverless-common-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-common-settings plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-common-settings'] --- import kbnServerlessCommonSettingsObj from './kbn_serverless_common_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_observability_settings.mdx b/api_docs/kbn_serverless_observability_settings.mdx index 69e176fcb4826..925948c62b190 100644 --- a/api_docs/kbn_serverless_observability_settings.mdx +++ b/api_docs/kbn_serverless_observability_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-observability-settings title: "@kbn/serverless-observability-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-observability-settings plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-observability-settings'] --- import kbnServerlessObservabilitySettingsObj from './kbn_serverless_observability_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_project_switcher.mdx b/api_docs/kbn_serverless_project_switcher.mdx index 63bf5abb87465..85dc550f4f81b 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: 2024-09-23 +date: 2024-09-24 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_search_settings.mdx b/api_docs/kbn_serverless_search_settings.mdx index 88d04b09705c6..5834b8f963253 100644 --- a/api_docs/kbn_serverless_search_settings.mdx +++ b/api_docs/kbn_serverless_search_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-search-settings title: "@kbn/serverless-search-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-search-settings plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-search-settings'] --- import kbnServerlessSearchSettingsObj from './kbn_serverless_search_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_security_settings.mdx b/api_docs/kbn_serverless_security_settings.mdx index e1e55d16279c3..8aa71fd69cbba 100644 --- a/api_docs/kbn_serverless_security_settings.mdx +++ b/api_docs/kbn_serverless_security_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-security-settings title: "@kbn/serverless-security-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-security-settings plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-security-settings'] --- import kbnServerlessSecuritySettingsObj from './kbn_serverless_security_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_storybook_config.mdx b/api_docs/kbn_serverless_storybook_config.mdx index 49c01eff9f08b..02fbdf4ac59d6 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: 2024-09-23 +date: 2024-09-24 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 08a357609c485..68bf546b0acc0 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: 2024-09-23 +date: 2024-09-24 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 fb3eaac8e1e27..28bd58f8ad8e5 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: 2024-09-23 +date: 2024-09-24 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_button_exit_full_screen.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx index de3cc1de65686..976f6c5168c72 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: 2024-09-23 +date: 2024-09-24 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_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index ea3a14ecee95e..e5040895a82d5 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: 2024-09-23 +date: 2024-09-24 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 2c885efc3b477..8ef367fbbb148 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: 2024-09-23 +date: 2024-09-24 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 17cc3985df693..fd12f98500caa 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: 2024-09-23 +date: 2024-09-24 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 2fe86f20afe94..a46fab5d2f93a 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: 2024-09-23 +date: 2024-09-24 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_error_boundary.mdx b/api_docs/kbn_shared_ux_error_boundary.mdx index 8a6ea5e7d5e1a..5a6b8ad3d1289 100644 --- a/api_docs/kbn_shared_ux_error_boundary.mdx +++ b/api_docs/kbn_shared_ux_error_boundary.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-error-boundary title: "@kbn/shared-ux-error-boundary" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-error-boundary plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-error-boundary'] --- import kbnSharedUxErrorBoundaryObj from './kbn_shared_ux_error_boundary.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_context.mdx b/api_docs/kbn_shared_ux_file_context.mdx index 1f3d3787e97b3..428d5e4966bab 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: 2024-09-23 +date: 2024-09-24 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 d7c5702615c03..00307f9cf4cf1 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: 2024-09-23 +date: 2024-09-24 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 433920e7f2a82..8bb6d90f73dc0 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: 2024-09-23 +date: 2024-09-24 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 776c77925ca2c..5b9e6e3a13f26 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: 2024-09-23 +date: 2024-09-24 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 ff85e6cb9ef13..2eaffad0430af 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: 2024-09-23 +date: 2024-09-24 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 c34da905340bf..7511df71b7b71 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: 2024-09-23 +date: 2024-09-24 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 7e2e1d3cdf8be..d1d986c489b4f 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: 2024-09-23 +date: 2024-09-24 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 2916508704eed..ec7e0da9cd4ef 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: 2024-09-23 +date: 2024-09-24 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 3fb8e93c040f5..8f80be8027654 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: 2024-09-23 +date: 2024-09-24 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 468a75505fc68..85e89912a6b06 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: 2024-09-23 +date: 2024-09-24 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 b7e26e3a325a1..946b177a8bc5b 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: 2024-09-23 +date: 2024-09-24 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 a9af6dd596ee8..490ed6a86e00f 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: 2024-09-23 +date: 2024-09-24 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 50ced0c469c6a..208724c15c7af 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: 2024-09-23 +date: 2024-09-24 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 9b0d832459f6a..632863f5a78ed 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: 2024-09-23 +date: 2024-09-24 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 c6efae402cd7d..894f62966c264 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: 2024-09-23 +date: 2024-09-24 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 a610a7d039891..903edaaf4bc2e 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: 2024-09-23 +date: 2024-09-24 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 c0e6fc9cce67e..5ad534979683d 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: 2024-09-23 +date: 2024-09-24 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 15ac61055a3c4..23ea2f2179ca7 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: 2024-09-23 +date: 2024-09-24 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 732e72914177f..457690c75ac54 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: 2024-09-23 +date: 2024-09-24 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 04e01ad524697..946dfb6493fd7 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: 2024-09-23 +date: 2024-09-24 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 fd6efac3677b8..06500383074c3 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: 2024-09-23 +date: 2024-09-24 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 640aacf851153..461038b27ab92 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: 2024-09-23 +date: 2024-09-24 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 55da6e727db31..4a96dd19e8eea 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: 2024-09-23 +date: 2024-09-24 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 3cca1c55c90c1..d80a0d4daf992 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: 2024-09-23 +date: 2024-09-24 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 013b6710af92b..bd965d6f8a1e7 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: 2024-09-23 +date: 2024-09-24 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 1e75b502b6071..7f60bdbcda74f 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: 2024-09-23 +date: 2024-09-24 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 7f81a25577314..4eb3401787f76 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: 2024-09-23 +date: 2024-09-24 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 3df06efe880ef..3fd1ecfaca26d 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: 2024-09-23 +date: 2024-09-24 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 0f1819b81ad26..001e67ca40b55 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: 2024-09-23 +date: 2024-09-24 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 7cae455e6a1e0..beb01262123d4 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: 2024-09-23 +date: 2024-09-24 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_tabbed_modal.mdx b/api_docs/kbn_shared_ux_tabbed_modal.mdx index af59b63499e6d..bef733e1cc0ca 100644 --- a/api_docs/kbn_shared_ux_tabbed_modal.mdx +++ b/api_docs/kbn_shared_ux_tabbed_modal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-tabbed-modal title: "@kbn/shared-ux-tabbed-modal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-tabbed-modal plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-tabbed-modal'] --- import kbnSharedUxTabbedModalObj from './kbn_shared_ux_tabbed_modal.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_table_persist.mdx b/api_docs/kbn_shared_ux_table_persist.mdx index 10d777179400b..e0851a0716a51 100644 --- a/api_docs/kbn_shared_ux_table_persist.mdx +++ b/api_docs/kbn_shared_ux_table_persist.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-table-persist title: "@kbn/shared-ux-table-persist" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-table-persist plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-table-persist'] --- import kbnSharedUxTablePersistObj from './kbn_shared_ux_table_persist.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index 848c4c296e70b..d2a116eb56612 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: 2024-09-23 +date: 2024-09-24 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 a234e4cbe481e..fa216d6618b94 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: 2024-09-23 +date: 2024-09-24 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 fc34df579d514..da7c32ead3c89 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log'] --- import kbnSomeDevLogObj from './kbn_some_dev_log.devdocs.json'; diff --git a/api_docs/kbn_sort_predicates.mdx b/api_docs/kbn_sort_predicates.mdx index 38c3c1117245e..ce0311aec050e 100644 --- a/api_docs/kbn_sort_predicates.mdx +++ b/api_docs/kbn_sort_predicates.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sort-predicates title: "@kbn/sort-predicates" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sort-predicates plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sort-predicates'] --- import kbnSortPredicatesObj from './kbn_sort_predicates.devdocs.json'; diff --git a/api_docs/kbn_sse_utils.mdx b/api_docs/kbn_sse_utils.mdx index 0568e570fc1c5..7c449be03d703 100644 --- a/api_docs/kbn_sse_utils.mdx +++ b/api_docs/kbn_sse_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sse-utils title: "@kbn/sse-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sse-utils plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sse-utils'] --- import kbnSseUtilsObj from './kbn_sse_utils.devdocs.json'; diff --git a/api_docs/kbn_sse_utils_client.mdx b/api_docs/kbn_sse_utils_client.mdx index 40647dd4610de..db796fe1bf7a9 100644 --- a/api_docs/kbn_sse_utils_client.mdx +++ b/api_docs/kbn_sse_utils_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sse-utils-client title: "@kbn/sse-utils-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sse-utils-client plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sse-utils-client'] --- import kbnSseUtilsClientObj from './kbn_sse_utils_client.devdocs.json'; diff --git a/api_docs/kbn_sse_utils_server.mdx b/api_docs/kbn_sse_utils_server.mdx index 668403a8ff8d1..704cd926a928c 100644 --- a/api_docs/kbn_sse_utils_server.mdx +++ b/api_docs/kbn_sse_utils_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-sse-utils-server title: "@kbn/sse-utils-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/sse-utils-server plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/sse-utils-server'] --- import kbnSseUtilsServerObj from './kbn_sse_utils_server.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index e5efc79a74b52..c089f4b7e5ecd 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: 2024-09-23 +date: 2024-09-24 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 9404f3632c20a..7f499380ac830 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: 2024-09-23 +date: 2024-09-24 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 9e268bfbb941e..9fa38b6bd8449 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] --- import kbnStorybookObj from './kbn_storybook.devdocs.json'; diff --git a/api_docs/kbn_synthetics_e2e.mdx b/api_docs/kbn_synthetics_e2e.mdx index d78169ef551f5..a5302b46a57f9 100644 --- a/api_docs/kbn_synthetics_e2e.mdx +++ b/api_docs/kbn_synthetics_e2e.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-synthetics-e2e title: "@kbn/synthetics-e2e" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/synthetics-e2e plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/synthetics-e2e'] --- import kbnSyntheticsE2eObj from './kbn_synthetics_e2e.devdocs.json'; diff --git a/api_docs/kbn_synthetics_private_location.mdx b/api_docs/kbn_synthetics_private_location.mdx index 7fcda51c5d677..e784b21aa155d 100644 --- a/api_docs/kbn_synthetics_private_location.mdx +++ b/api_docs/kbn_synthetics_private_location.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-synthetics-private-location title: "@kbn/synthetics-private-location" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/synthetics-private-location plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/synthetics-private-location'] --- import kbnSyntheticsPrivateLocationObj from './kbn_synthetics_private_location.devdocs.json'; diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index dd053904dfae6..6afb451c1b864 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/telemetry-tools'] --- import kbnTelemetryToolsObj from './kbn_telemetry_tools.devdocs.json'; diff --git a/api_docs/kbn_test.devdocs.json b/api_docs/kbn_test.devdocs.json index a8df40b09e765..0d76ad2a80c02 100644 --- a/api_docs/kbn_test.devdocs.json +++ b/api_docs/kbn_test.devdocs.json @@ -3313,6 +3313,20 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/test", + "id": "def-common.CreateTestEsClusterOptions.esVersion", + "type": "string", + "tags": [], + "label": "esVersion", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/kbn-test/src/es/test_es_cluster.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/test", "id": "def-common.CreateTestEsClusterOptions.esFrom", diff --git a/api_docs/kbn_test.mdx b/api_docs/kbn_test.mdx index 523844ac6b3db..61621422a6a3d 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] --- import kbnTestObj from './kbn_test.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kiban | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 315 | 4 | 267 | 14 | +| 316 | 4 | 268 | 14 | ## Common diff --git a/api_docs/kbn_test_eui_helpers.mdx b/api_docs/kbn_test_eui_helpers.mdx index 62146c2d53d3f..170119688acef 100644 --- a/api_docs/kbn_test_eui_helpers.mdx +++ b/api_docs/kbn_test_eui_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-eui-helpers title: "@kbn/test-eui-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-eui-helpers plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-eui-helpers'] --- import kbnTestEuiHelpersObj from './kbn_test_eui_helpers.devdocs.json'; diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index caff33e1682d3..940772dec3c1b 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: 2024-09-23 +date: 2024-09-24 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 5f459edbdc56f..5d39b58cdf29e 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_timerange.mdx b/api_docs/kbn_timerange.mdx index 6699d6636baf4..39e843d94e176 100644 --- a/api_docs/kbn_timerange.mdx +++ b/api_docs/kbn_timerange.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-timerange title: "@kbn/timerange" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/timerange plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/timerange'] --- import kbnTimerangeObj from './kbn_timerange.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index 073e449b295de..2f0f25b34c4a3 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_triggers_actions_ui_types.mdx b/api_docs/kbn_triggers_actions_ui_types.mdx index 5849a9efd2b90..cdb2699c6b0e6 100644 --- a/api_docs/kbn_triggers_actions_ui_types.mdx +++ b/api_docs/kbn_triggers_actions_ui_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-triggers-actions-ui-types title: "@kbn/triggers-actions-ui-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/triggers-actions-ui-types plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/triggers-actions-ui-types'] --- import kbnTriggersActionsUiTypesObj from './kbn_triggers_actions_ui_types.devdocs.json'; diff --git a/api_docs/kbn_try_in_console.mdx b/api_docs/kbn_try_in_console.mdx index 69bcf41fd473f..a0889a98e6dc0 100644 --- a/api_docs/kbn_try_in_console.mdx +++ b/api_docs/kbn_try_in_console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-try-in-console title: "@kbn/try-in-console" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/try-in-console plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/try-in-console'] --- import kbnTryInConsoleObj from './kbn_try_in_console.devdocs.json'; diff --git a/api_docs/kbn_ts_projects.mdx b/api_docs/kbn_ts_projects.mdx index 6a054f4a256ea..6773aff5340f3 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: 2024-09-23 +date: 2024-09-24 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 1ac4cba85ef1c..9fc5dcc7a75ea 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: 2024-09-23 +date: 2024-09-24 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 43a43ac88b405..331996f81f725 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: 2024-09-23 +date: 2024-09-24 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 7f7ec69fed93c..37e77aaf0c4e9 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: 2024-09-23 +date: 2024-09-24 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 23194ca7186a8..cdb779b8bfc99 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] --- import kbnUiThemeObj from './kbn_ui_theme.devdocs.json'; diff --git a/api_docs/kbn_unified_data_table.mdx b/api_docs/kbn_unified_data_table.mdx index d2d8042d94608..975ca83011472 100644 --- a/api_docs/kbn_unified_data_table.mdx +++ b/api_docs/kbn_unified_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-data-table title: "@kbn/unified-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-data-table plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-data-table'] --- import kbnUnifiedDataTableObj from './kbn_unified_data_table.devdocs.json'; diff --git a/api_docs/kbn_unified_doc_viewer.mdx b/api_docs/kbn_unified_doc_viewer.mdx index c767f5609cd6e..15084aa613f7b 100644 --- a/api_docs/kbn_unified_doc_viewer.mdx +++ b/api_docs/kbn_unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-doc-viewer title: "@kbn/unified-doc-viewer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-doc-viewer plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-doc-viewer'] --- import kbnUnifiedDocViewerObj from './kbn_unified_doc_viewer.devdocs.json'; diff --git a/api_docs/kbn_unified_field_list.mdx b/api_docs/kbn_unified_field_list.mdx index 15511689dce59..8e623c59e0cb2 100644 --- a/api_docs/kbn_unified_field_list.mdx +++ b/api_docs/kbn_unified_field_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-field-list title: "@kbn/unified-field-list" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-field-list plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-field-list'] --- import kbnUnifiedFieldListObj from './kbn_unified_field_list.devdocs.json'; diff --git a/api_docs/kbn_unsaved_changes_badge.mdx b/api_docs/kbn_unsaved_changes_badge.mdx index cc98e7bcf8abd..3b972ab857c62 100644 --- a/api_docs/kbn_unsaved_changes_badge.mdx +++ b/api_docs/kbn_unsaved_changes_badge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unsaved-changes-badge title: "@kbn/unsaved-changes-badge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unsaved-changes-badge plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-badge'] --- import kbnUnsavedChangesBadgeObj from './kbn_unsaved_changes_badge.devdocs.json'; diff --git a/api_docs/kbn_unsaved_changes_prompt.mdx b/api_docs/kbn_unsaved_changes_prompt.mdx index 58f68d5fe539a..37261c438128b 100644 --- a/api_docs/kbn_unsaved_changes_prompt.mdx +++ b/api_docs/kbn_unsaved_changes_prompt.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unsaved-changes-prompt title: "@kbn/unsaved-changes-prompt" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unsaved-changes-prompt plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unsaved-changes-prompt'] --- import kbnUnsavedChangesPromptObj from './kbn_unsaved_changes_prompt.devdocs.json'; diff --git a/api_docs/kbn_use_tracked_promise.mdx b/api_docs/kbn_use_tracked_promise.mdx index 0accc62d598bd..8cfce65fb7109 100644 --- a/api_docs/kbn_use_tracked_promise.mdx +++ b/api_docs/kbn_use_tracked_promise.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-use-tracked-promise title: "@kbn/use-tracked-promise" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/use-tracked-promise plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/use-tracked-promise'] --- import kbnUseTrackedPromiseObj from './kbn_use_tracked_promise.devdocs.json'; diff --git a/api_docs/kbn_user_profile_components.mdx b/api_docs/kbn_user_profile_components.mdx index c9074c9340112..3f92630853f19 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: 2024-09-23 +date: 2024-09-24 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 18de608035626..e532a0cdf5588 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: 2024-09-23 +date: 2024-09-24 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 ea4d16e397320..5431588ae8151 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: 2024-09-23 +date: 2024-09-24 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 d85908c75994d..1ba43881b28d1 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] --- import kbnUtilsObj from './kbn_utils.devdocs.json'; diff --git a/api_docs/kbn_visualization_ui_components.mdx b/api_docs/kbn_visualization_ui_components.mdx index 60e4fa629510e..cc92b32f4c6d0 100644 --- a/api_docs/kbn_visualization_ui_components.mdx +++ b/api_docs/kbn_visualization_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-ui-components title: "@kbn/visualization-ui-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-ui-components plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-ui-components'] --- import kbnVisualizationUiComponentsObj from './kbn_visualization_ui_components.devdocs.json'; diff --git a/api_docs/kbn_visualization_utils.mdx b/api_docs/kbn_visualization_utils.mdx index 71d386525023e..ab2dc6300b4a6 100644 --- a/api_docs/kbn_visualization_utils.mdx +++ b/api_docs/kbn_visualization_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-utils title: "@kbn/visualization-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-utils plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-utils'] --- import kbnVisualizationUtilsObj from './kbn_visualization_utils.devdocs.json'; diff --git a/api_docs/kbn_xstate_utils.mdx b/api_docs/kbn_xstate_utils.mdx index b3cf6d985e582..1a9d80fb17f18 100644 --- a/api_docs/kbn_xstate_utils.mdx +++ b/api_docs/kbn_xstate_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-xstate-utils title: "@kbn/xstate-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/xstate-utils plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/xstate-utils'] --- import kbnXstateUtilsObj from './kbn_xstate_utils.devdocs.json'; diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx index 07d23c127a61d..692fc734f27a6 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator'] --- import kbnYarnLockValidatorObj from './kbn_yarn_lock_validator.devdocs.json'; diff --git a/api_docs/kbn_zod.mdx b/api_docs/kbn_zod.mdx index a77c60d4644f3..1f52f35b1887d 100644 --- a/api_docs/kbn_zod.mdx +++ b/api_docs/kbn_zod.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-zod title: "@kbn/zod" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/zod plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/zod'] --- import kbnZodObj from './kbn_zod.devdocs.json'; diff --git a/api_docs/kbn_zod_helpers.mdx b/api_docs/kbn_zod_helpers.mdx index c76a867b5ee30..0a75ebc8a95a9 100644 --- a/api_docs/kbn_zod_helpers.mdx +++ b/api_docs/kbn_zod_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-zod-helpers title: "@kbn/zod-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/zod-helpers plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/zod-helpers'] --- import kbnZodHelpersObj from './kbn_zod_helpers.devdocs.json'; diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx index 17f937cf9f3e2..8115fde79c2f4 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: 2024-09-23 +date: 2024-09-24 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 437428377c8b5..91b15b1ff23d1 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: 2024-09-23 +date: 2024-09-24 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 f3e1d6c1412da..d715d4ff0659c 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: 2024-09-23 +date: 2024-09-24 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 c458665807d59..9955e02f300a9 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: 2024-09-23 +date: 2024-09-24 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 8fba5488d8c70..38870466b00e5 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: 2024-09-23 +date: 2024-09-24 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 be600342673f0..0d4507e5076ce 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: 2024-09-23 +date: 2024-09-24 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 62f4e10570268..5ad10161d721e 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: 2024-09-23 +date: 2024-09-24 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 730f2b64ea891..e3320a1eff45a 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] --- import licensingObj from './licensing.devdocs.json'; diff --git a/api_docs/links.mdx b/api_docs/links.mdx index b1c144fb68c21..c6d78046dcd72 100644 --- a/api_docs/links.mdx +++ b/api_docs/links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/links title: "links" image: https://source.unsplash.com/400x175/?github description: API docs for the links plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'links'] --- import linksObj from './links.devdocs.json'; diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index 29908ca7177d6..3f459b0583b1a 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/logs_data_access.mdx b/api_docs/logs_data_access.mdx index 005b3e40d53f5..91c4953a3770b 100644 --- a/api_docs/logs_data_access.mdx +++ b/api_docs/logs_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsDataAccess title: "logsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the logsDataAccess plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsDataAccess'] --- import logsDataAccessObj from './logs_data_access.devdocs.json'; diff --git a/api_docs/logs_explorer.mdx b/api_docs/logs_explorer.mdx index 8b3b74dd89d24..65f91303edbae 100644 --- a/api_docs/logs_explorer.mdx +++ b/api_docs/logs_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsExplorer title: "logsExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the logsExplorer plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsExplorer'] --- import logsExplorerObj from './logs_explorer.devdocs.json'; diff --git a/api_docs/logs_shared.mdx b/api_docs/logs_shared.mdx index 395b4c14ec7da..bf68abf46b74a 100644 --- a/api_docs/logs_shared.mdx +++ b/api_docs/logs_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsShared title: "logsShared" image: https://source.unsplash.com/400x175/?github description: API docs for the logsShared plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsShared'] --- import logsSharedObj from './logs_shared.devdocs.json'; diff --git a/api_docs/management.mdx b/api_docs/management.mdx index 97df0a3060425..8b0bf4c843d5a 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: 2024-09-23 +date: 2024-09-24 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 090a1c847410d..7d1769c0a287a 100644 --- a/api_docs/maps.devdocs.json +++ b/api_docs/maps.devdocs.json @@ -3056,7 +3056,7 @@ "MapExtent", " | undefined; mapSettings?: Partial<", "MapSettings", - "> | undefined; hiddenLayers?: string[] | undefined; hideFilterActions?: boolean | undefined; timeRange?: ", + "> | undefined; hiddenLayers?: string[] | undefined; timeRange?: ", { "pluginId": "@kbn/es-query", "scope": "common", @@ -3064,9 +3064,7 @@ "section": "def-common.TimeRange", "text": "TimeRange" }, - " | undefined; filterByMapExtent?: boolean | undefined; isMovementSynchronized?: boolean | undefined; isSharable?: boolean | undefined; tooltipRenderer?: ", - "RenderToolTipContent", - " | undefined; }" + " | undefined; filterByMapExtent?: boolean | undefined; isMovementSynchronized?: boolean | undefined; }" ], "path": "x-pack/plugins/maps/public/react_embeddable/types.ts", "deprecated": false, diff --git a/api_docs/maps.mdx b/api_docs/maps.mdx index d40e59fac52b3..20c561931fcaf 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'maps'] --- import mapsObj from './maps.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 | |-------------------|-----------|------------------------|-----------------| -| 209 | 0 | 205 | 28 | +| 209 | 0 | 205 | 27 | ## Client diff --git a/api_docs/maps_ems.mdx b/api_docs/maps_ems.mdx index 0a4468b6d80ac..8c3ac773cbdbd 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] --- import mapsEmsObj from './maps_ems.devdocs.json'; diff --git a/api_docs/metrics_data_access.mdx b/api_docs/metrics_data_access.mdx index e9645d3a5ecb9..d19763b5d879e 100644 --- a/api_docs/metrics_data_access.mdx +++ b/api_docs/metrics_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/metricsDataAccess title: "metricsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the metricsDataAccess plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'metricsDataAccess'] --- import metricsDataAccessObj from './metrics_data_access.devdocs.json'; diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index 2f72e76e742ba..6c597239c50b0 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] --- import mlObj from './ml.devdocs.json'; diff --git a/api_docs/mock_idp_plugin.mdx b/api_docs/mock_idp_plugin.mdx index c8b06dc79ee7e..7f4db87fd8eda 100644 --- a/api_docs/mock_idp_plugin.mdx +++ b/api_docs/mock_idp_plugin.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mockIdpPlugin title: "mockIdpPlugin" image: https://source.unsplash.com/400x175/?github description: API docs for the mockIdpPlugin plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mockIdpPlugin'] --- import mockIdpPluginObj from './mock_idp_plugin.devdocs.json'; diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx index 52498e3021eb4..cb982019c23ca 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: 2024-09-23 +date: 2024-09-24 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 b452d7a4f165c..30fa639288f65 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: 2024-09-23 +date: 2024-09-24 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 dbd826c7ebb41..488ba5f5ddb83 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: 2024-09-23 +date: 2024-09-24 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 9473bb748ee3d..cc08cf42a8501 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] --- import newsfeedObj from './newsfeed.devdocs.json'; diff --git a/api_docs/no_data_page.mdx b/api_docs/no_data_page.mdx index fedbed7c1793e..ea1b009621607 100644 --- a/api_docs/no_data_page.mdx +++ b/api_docs/no_data_page.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/noDataPage title: "noDataPage" image: https://source.unsplash.com/400x175/?github description: API docs for the noDataPage plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'noDataPage'] --- import noDataPageObj from './no_data_page.devdocs.json'; diff --git a/api_docs/notifications.mdx b/api_docs/notifications.mdx index 400ea784baa30..cb03c4d12d0cb 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: 2024-09-23 +date: 2024-09-24 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 e62ffba52ccab..f0c544c7902b2 100644 --- a/api_docs/observability.devdocs.json +++ b/api_docs/observability.devdocs.json @@ -11147,7 +11147,7 @@ "label": "value", "description": [], "signature": [ - "false" + "true" ], "path": "x-pack/plugins/observability_solution/observability/server/ui_settings.ts", "deprecated": false, @@ -11161,7 +11161,7 @@ "label": "requiresPageReload", "description": [], "signature": [ - "false" + "true" ], "path": "x-pack/plugins/observability_solution/observability/server/ui_settings.ts", "deprecated": false, diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index 6ca920895ba28..6bb639652fd99 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index f79e798207057..7a0de639d488f 100644 --- a/api_docs/observability_a_i_assistant.mdx +++ b/api_docs/observability_a_i_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistant title: "observabilityAIAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistant plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistant'] --- import observabilityAIAssistantObj from './observability_a_i_assistant.devdocs.json'; diff --git a/api_docs/observability_a_i_assistant_app.mdx b/api_docs/observability_a_i_assistant_app.mdx index 16fc7cd5c797e..7ef03c23fe943 100644 --- a/api_docs/observability_a_i_assistant_app.mdx +++ b/api_docs/observability_a_i_assistant_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistantApp title: "observabilityAIAssistantApp" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistantApp plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistantApp'] --- import observabilityAIAssistantAppObj from './observability_a_i_assistant_app.devdocs.json'; diff --git a/api_docs/observability_ai_assistant_management.mdx b/api_docs/observability_ai_assistant_management.mdx index 954eddd6cdae7..15c699b1e40b6 100644 --- a/api_docs/observability_ai_assistant_management.mdx +++ b/api_docs/observability_ai_assistant_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAiAssistantManagement title: "observabilityAiAssistantManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAiAssistantManagement plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAiAssistantManagement'] --- import observabilityAiAssistantManagementObj from './observability_ai_assistant_management.devdocs.json'; diff --git a/api_docs/observability_logs_explorer.mdx b/api_docs/observability_logs_explorer.mdx index c59c54939a458..c717df2241ce5 100644 --- a/api_docs/observability_logs_explorer.mdx +++ b/api_docs/observability_logs_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityLogsExplorer title: "observabilityLogsExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityLogsExplorer plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityLogsExplorer'] --- import observabilityLogsExplorerObj from './observability_logs_explorer.devdocs.json'; diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx index 39caf81cfa8d3..cd3fabde862c2 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityOnboarding'] --- import observabilityOnboardingObj from './observability_onboarding.devdocs.json'; diff --git a/api_docs/observability_shared.devdocs.json b/api_docs/observability_shared.devdocs.json index 3f8a9696ceff3..5f36898d96148 100644 --- a/api_docs/observability_shared.devdocs.json +++ b/api_docs/observability_shared.devdocs.json @@ -6189,6 +6189,18 @@ } ], "enums": [ + { + "parentPluginId": "observabilityShared", + "id": "def-common.IndexLifecyclePhaseSelectOption", + "type": "Enum", + "tags": [], + "label": "IndexLifecyclePhaseSelectOption", + "description": [], + "path": "x-pack/plugins/observability_solution/observability_shared/common/ilm_types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "observabilityShared", "id": "def-common.ObservabilityTriggerId", @@ -6545,6 +6557,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "observabilityShared", + "id": "def-common.DataTier", + "type": "Type", + "tags": [], + "label": "DataTier", + "description": [], + "signature": [ + "\"data_hot\" | \"data_warm\" | \"data_cold\" | \"data_frozen\"" + ], + "path": "x-pack/plugins/observability_solution/observability_shared/common/ilm_types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "observabilityShared", "id": "def-common.DESTINATION_ADDRESS", @@ -8613,6 +8640,22 @@ "initialIsOpen": false } ], - "objects": [] + "objects": [ + { + "parentPluginId": "observabilityShared", + "id": "def-common.indexLifeCyclePhaseToDataTier", + "type": "Object", + "tags": [], + "label": "indexLifeCyclePhaseToDataTier", + "description": [], + "signature": [ + "{ readonly hot: \"data_hot\"; readonly warm: \"data_warm\"; readonly cold: \"data_cold\"; readonly frozen: \"data_frozen\"; }" + ], + "path": "x-pack/plugins/observability_solution/observability_shared/common/ilm_types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ] } } \ No newline at end of file diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx index 46b3b22e43bbe..71f55cfc48717 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityShared'] --- import observabilitySharedObj from './observability_shared.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/observability-ui](https://github.com/orgs/elastic/teams/observ | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 474 | 1 | 469 | 19 | +| 477 | 1 | 472 | 19 | ## Client @@ -42,6 +42,9 @@ Contact [@elastic/observability-ui](https://github.com/orgs/elastic/teams/observ ## Common +### Objects + + ### Functions diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index 793481f8788f1..53827ac912275 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] --- import osqueryObj from './osquery.devdocs.json'; diff --git a/api_docs/painless_lab.mdx b/api_docs/painless_lab.mdx index 754356556a777..643a6c895f4c3 100644 --- a/api_docs/painless_lab.mdx +++ b/api_docs/painless_lab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/painlessLab title: "painlessLab" image: https://source.unsplash.com/400x175/?github description: API docs for the painlessLab plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'painlessLab'] --- import painlessLabObj from './painless_lab.devdocs.json'; diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index a26787722b3fe..89cfd961c4d40 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -21,7 +21,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 53179 | 245 | 39881 | 1963 | +| 53198 | 245 | 39900 | 1966 | ## Plugin Directory @@ -32,8 +32,8 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 4 | 0 | 4 | 1 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | AIOps plugin maintained by ML team. | 74 | 0 | 9 | 2 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 875 | 1 | 843 | 52 | -| | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | The user interface for Elastic APM | 29 | 0 | 29 | 119 | -| | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 93 | 0 | 93 | 1 | +| | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | The user interface for Elastic APM | 29 | 0 | 29 | 118 | +| | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | - | 93 | 0 | 93 | 3 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 9 | 0 | 9 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Considering using bfetch capabilities when fetching large amounts of data. This services supports batching HTTP requests and streaming responses back. | 83 | 1 | 73 | 2 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds Canvas application to Kibana | 9 | 0 | 8 | 3 | @@ -53,7 +53,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | crossClusterReplication | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-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 | 271 | 0 | 252 | 1 | -| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds the Dashboard app to Kibana | 128 | 0 | 123 | 13 | +| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds the Dashboard app to Kibana | 128 | 0 | 123 | 15 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 54 | 0 | 51 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. | 3209 | 31 | 2594 | 24 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 5 | 0 | 5 | 0 | @@ -141,7 +141,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | Exposes the shared components and APIs to access and visualize logs. | 310 | 0 | 281 | 32 | | logstash | [@elastic/logstash](https://github.com/orgs/elastic/teams/logstash) | - | 0 | 0 | 0 | 0 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 44 | 0 | 44 | 7 | -| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 209 | 0 | 205 | 28 | +| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 209 | 0 | 205 | 27 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 60 | 0 | 60 | 0 | | | [@elastic/obs-knowledge-team](https://github.com/orgs/elastic/teams/obs-knowledge-team) | Exposes utilities for accessing metrics data | 137 | 8 | 137 | 5 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | This plugin provides access to the machine learning features provided by Elastic. | 154 | 3 | 67 | 102 | @@ -158,7 +158,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 2 | 0 | 2 | 0 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | This plugin exposes and registers observability log consumption features. | 19 | 0 | 19 | 1 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 23 | 0 | 23 | 0 | -| | [@elastic/observability-ui](https://github.com/orgs/elastic/teams/observability-ui) | - | 474 | 1 | 469 | 19 | +| | [@elastic/observability-ui](https://github.com/orgs/elastic/teams/observability-ui) | - | 477 | 1 | 472 | 19 | | | [@elastic/security-defend-workflows](https://github.com/orgs/elastic/teams/security-defend-workflows) | - | 23 | 0 | 23 | 7 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-management) | - | 2 | 0 | 2 | 0 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds a standardized Presentation panel which allows any forward ref component to interface with various Kibana systems. | 11 | 0 | 11 | 4 | @@ -197,7 +197,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Adds URL Service and sharing capabilities to Kibana | 121 | 0 | 60 | 12 | | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 59 | 0 | 59 | 1 | | | [@elastic/kibana-management](https://github.com/orgs/elastic/teams/kibana-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. | 262 | 0 | 67 | 0 | +| | [@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. | 266 | 0 | 71 | 1 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 25 | 0 | 25 | 3 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 10 | 0 | 10 | 0 | | synthetics | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | This plugin visualizes data from Synthetics and Heartbeat, and integrates with other Observability solutions. | 0 | 0 | 0 | 1 | @@ -432,7 +432,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 128 | 0 | 94 | 44 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 12 | 0 | 12 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 562 | 1 | 134 | 4 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 71 | 0 | 70 | 5 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 73 | 0 | 72 | 5 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 14 | 0 | 14 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 36 | 0 | 6 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 10 | 0 | 3 | 0 | @@ -518,6 +518,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 27 | 0 | 27 | 1 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 2 | 0 | 1 | 0 | | | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 177 | 1 | 139 | 20 | +| | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 29 | 0 | 12 | 0 | | | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 73 | 0 | 69 | 0 | | | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 199 | 0 | 187 | 12 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 40 | 0 | 40 | 0 | @@ -555,7 +556,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 41 | 2 | 35 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 9 | 0 | 7 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 108 | 0 | 107 | 0 | -| | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 11 | 0 | 7 | 0 | +| | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 11 | 0 | 7 | 0 | | | [@elastic/obs-ux-infra_services-team](https://github.com/orgs/elastic/teams/obs-ux-infra_services-team) | - | 193 | 0 | 190 | 6 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 172 | 0 | 172 | 1 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 28 | 0 | 2 | 2 | @@ -669,7 +670,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 35 | 0 | 25 | 0 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 7 | 0 | 7 | 0 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 118 | 0 | 59 | 0 | -| | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 58 | 0 | 31 | 0 | +| | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 66 | 0 | 39 | 0 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 275 | 1 | 154 | 0 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 75 | 0 | 74 | 0 | | | [@elastic/security-threat-hunting-investigations](https://github.com/orgs/elastic/teams/security-threat-hunting-investigations) | - | 59 | 0 | 38 | 5 | @@ -678,7 +679,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 54 | 0 | 49 | 0 | | | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 30 | 0 | 24 | 0 | | | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 2 | 0 | 0 | 0 | -| | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 47 | 0 | 12 | 0 | +| | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | - | 48 | 0 | 13 | 0 | | | [@elastic/security-detection-engine](https://github.com/orgs/elastic/teams/security-detection-engine) | - | 56 | 1 | 41 | 1 | | | [@elastic/security-threat-hunting-investigations](https://github.com/orgs/elastic/teams/security-threat-hunting-investigations) | - | 92 | 0 | 70 | 6 | | | [@elastic/security-threat-hunting-explore](https://github.com/orgs/elastic/teams/security-threat-hunting-explore) | - | 341 | 1 | 337 | 32 | @@ -759,11 +760,10 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 32 | 2 | 32 | 0 | | | [@elastic/obs-ux-management-team](https://github.com/orgs/elastic/teams/obs-ux-management-team) | - | 19 | 0 | 19 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 7 | 0 | 5 | 1 | -| | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 315 | 4 | 267 | 14 | +| | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 316 | 4 | 268 | 14 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 37 | 1 | 19 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 131 | 3 | 98 | 2 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 2 | 0 | 1 | 0 | -| | [@elastic/kibana-esql](https://github.com/orgs/elastic/teams/kibana-esql) | - | 29 | 0 | 12 | 0 | | | [@elastic/obs-ux-logs-team](https://github.com/orgs/elastic/teams/obs-ux-logs-team) | - | 8 | 0 | 8 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 74 | 0 | 55 | 0 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 15 | 0 | 15 | 0 | diff --git a/api_docs/presentation_panel.mdx b/api_docs/presentation_panel.mdx index 25dd271be08e0..9ab21a8e027e0 100644 --- a/api_docs/presentation_panel.mdx +++ b/api_docs/presentation_panel.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationPanel title: "presentationPanel" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationPanel plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationPanel'] --- import presentationPanelObj from './presentation_panel.devdocs.json'; diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index e957b448a3cdc..4bbf4bbde54c4 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: 2024-09-23 +date: 2024-09-24 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 b97212faa6938..045adacc7541e 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profiling'] --- import profilingObj from './profiling.devdocs.json'; diff --git a/api_docs/profiling_data_access.mdx b/api_docs/profiling_data_access.mdx index 69e88b72cbd17..78f2a4e088858 100644 --- a/api_docs/profiling_data_access.mdx +++ b/api_docs/profiling_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profilingDataAccess title: "profilingDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the profilingDataAccess plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profilingDataAccess'] --- import profilingDataAccessObj from './profiling_data_access.devdocs.json'; diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx index 08f49f79c6635..08cd2b840341c 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: 2024-09-23 +date: 2024-09-24 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 bc7d06f99d3ba..c72b0bdd67f44 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: 2024-09-23 +date: 2024-09-24 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 9bc85d037cd9d..01341b5d76f4f 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: 2024-09-23 +date: 2024-09-24 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 e4c485f91ea13..3fb34ea3b875b 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: 2024-09-23 +date: 2024-09-24 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 19d03aa4ca963..5765976b9fd42 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: 2024-09-23 +date: 2024-09-24 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 09e318b3a648c..4d1c8c216e988 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: 2024-09-23 +date: 2024-09-24 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 f31b19553c1aa..73e10c37310ba 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: 2024-09-23 +date: 2024-09-24 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 65b10728be4db..58b5d20e9615a 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: 2024-09-23 +date: 2024-09-24 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 a695b0307aeb9..965fba9d98f08 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: 2024-09-23 +date: 2024-09-24 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 efbc92ee83aee..b54f1b031d3d9 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: 2024-09-23 +date: 2024-09-24 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 30b6412e07490..80199e04ee11a 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: 2024-09-23 +date: 2024-09-24 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 83b1568ddd63f..5deb4b4b894c3 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: 2024-09-23 +date: 2024-09-24 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 37394a6a64db9..2c93b05582612 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] --- import screenshottingObj from './screenshotting.devdocs.json'; diff --git a/api_docs/search_assistant.mdx b/api_docs/search_assistant.mdx index 3ca251b7c0df3..e4333c93d5971 100644 --- a/api_docs/search_assistant.mdx +++ b/api_docs/search_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchAssistant title: "searchAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the searchAssistant plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchAssistant'] --- import searchAssistantObj from './search_assistant.devdocs.json'; diff --git a/api_docs/search_connectors.mdx b/api_docs/search_connectors.mdx index 440505ea855ec..bbe0952cdd6fa 100644 --- a/api_docs/search_connectors.mdx +++ b/api_docs/search_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchConnectors title: "searchConnectors" image: https://source.unsplash.com/400x175/?github description: API docs for the searchConnectors plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchConnectors'] --- import searchConnectorsObj from './search_connectors.devdocs.json'; diff --git a/api_docs/search_homepage.mdx b/api_docs/search_homepage.mdx index c9b3d047e0778..02c3374f9708a 100644 --- a/api_docs/search_homepage.mdx +++ b/api_docs/search_homepage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchHomepage title: "searchHomepage" image: https://source.unsplash.com/400x175/?github description: API docs for the searchHomepage plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchHomepage'] --- import searchHomepageObj from './search_homepage.devdocs.json'; diff --git a/api_docs/search_indices.mdx b/api_docs/search_indices.mdx index acd87ac4e0d3d..8546d6f919d54 100644 --- a/api_docs/search_indices.mdx +++ b/api_docs/search_indices.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchIndices title: "searchIndices" image: https://source.unsplash.com/400x175/?github description: API docs for the searchIndices plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchIndices'] --- import searchIndicesObj from './search_indices.devdocs.json'; diff --git a/api_docs/search_inference_endpoints.mdx b/api_docs/search_inference_endpoints.mdx index 82520afbe5577..1ec1b7b025ae7 100644 --- a/api_docs/search_inference_endpoints.mdx +++ b/api_docs/search_inference_endpoints.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchInferenceEndpoints title: "searchInferenceEndpoints" image: https://source.unsplash.com/400x175/?github description: API docs for the searchInferenceEndpoints plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchInferenceEndpoints'] --- import searchInferenceEndpointsObj from './search_inference_endpoints.devdocs.json'; diff --git a/api_docs/search_notebooks.mdx b/api_docs/search_notebooks.mdx index 5435f7a4f0a6d..17d336716026e 100644 --- a/api_docs/search_notebooks.mdx +++ b/api_docs/search_notebooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchNotebooks title: "searchNotebooks" image: https://source.unsplash.com/400x175/?github description: API docs for the searchNotebooks plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchNotebooks'] --- import searchNotebooksObj from './search_notebooks.devdocs.json'; diff --git a/api_docs/search_playground.mdx b/api_docs/search_playground.mdx index e308621bfbb2d..6653c80214ca2 100644 --- a/api_docs/search_playground.mdx +++ b/api_docs/search_playground.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/searchPlayground title: "searchPlayground" image: https://source.unsplash.com/400x175/?github description: API docs for the searchPlayground plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'searchPlayground'] --- import searchPlaygroundObj from './search_playground.devdocs.json'; diff --git a/api_docs/security.mdx b/api_docs/security.mdx index 025444c46d86d..4685e83fa0d7e 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: 2024-09-23 +date: 2024-09-24 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 7e88952aedb10..717a132356fff 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.devdocs.json'; diff --git a/api_docs/security_solution_ess.mdx b/api_docs/security_solution_ess.mdx index acf6df88eecd4..24d8098aee4cf 100644 --- a/api_docs/security_solution_ess.mdx +++ b/api_docs/security_solution_ess.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionEss title: "securitySolutionEss" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionEss plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionEss'] --- import securitySolutionEssObj from './security_solution_ess.devdocs.json'; diff --git a/api_docs/security_solution_serverless.mdx b/api_docs/security_solution_serverless.mdx index 7f89d9bbbea79..4a58da62cc5c7 100644 --- a/api_docs/security_solution_serverless.mdx +++ b/api_docs/security_solution_serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionServerless title: "securitySolutionServerless" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionServerless plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionServerless'] --- import securitySolutionServerlessObj from './security_solution_serverless.devdocs.json'; diff --git a/api_docs/serverless.mdx b/api_docs/serverless.mdx index 6bd064b11f2e9..0695558e34a31 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: 2024-09-23 +date: 2024-09-24 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 75b78d6919403..857578411770d 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: 2024-09-23 +date: 2024-09-24 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 a81bdfb064957..455be849015b8 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessSearch'] --- import serverlessSearchObj from './serverless_search.devdocs.json'; diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index fc4ea3738486c..0826e6f2f4a24 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: 2024-09-23 +date: 2024-09-24 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 cea50918cd223..9a70e561cd0d4 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] --- import shareObj from './share.devdocs.json'; diff --git a/api_docs/slo.mdx b/api_docs/slo.mdx index 61db3de922873..96d2223ddcba5 100644 --- a/api_docs/slo.mdx +++ b/api_docs/slo.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/slo title: "slo" image: https://source.unsplash.com/400x175/?github description: API docs for the slo plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'slo'] --- import sloObj from './slo.devdocs.json'; diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index 4f75d10d318a8..0d0a05cc4e897 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'snapshotRestore'] --- import snapshotRestoreObj from './snapshot_restore.devdocs.json'; diff --git a/api_docs/spaces.devdocs.json b/api_docs/spaces.devdocs.json index c21f0b6a20fc3..0673f18fb64fe 100644 --- a/api_docs/spaces.devdocs.json +++ b/api_docs/spaces.devdocs.json @@ -727,6 +727,80 @@ "trackAdoption": false, "children": [], "returnComment": [] + }, + { + "parentPluginId": "spaces", + "id": "def-public.SpacesManager.getContentForSpace", + "type": "Function", + "tags": [], + "label": "getContentForSpace", + "description": [], + "signature": [ + "(id: string) => Promise<{ summary: ", + "SpaceContentTypeSummaryItem", + "[]; total: number; }>" + ], + "path": "x-pack/plugins/spaces/public/spaces_manager/spaces_manager.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "spaces", + "id": "def-public.SpacesManager.getContentForSpace.$1", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/plugins/spaces/public/spaces_manager/spaces_manager.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "spaces", + "id": "def-public.SpacesManager.getRolesForSpace", + "type": "Function", + "tags": [], + "label": "getRolesForSpace", + "description": [], + "signature": [ + "(id: string) => Promise<", + { + "pluginId": "@kbn/security-plugin-types-common", + "scope": "common", + "docId": "kibKbnSecurityPluginTypesCommonPluginApi", + "section": "def-common.Role", + "text": "Role" + }, + "[]>" + ], + "path": "x-pack/plugins/spaces/public/spaces_manager/spaces_manager.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "spaces", + "id": "def-public.SpacesManager.getRolesForSpace.$1", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "string" + ], + "path": "x-pack/plugins/spaces/public/spaces_manager/spaces_manager.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] } ], "initialIsOpen": false diff --git a/api_docs/spaces.mdx b/api_docs/spaces.mdx index e878688b719db..70ead5f3b833f 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'spaces'] --- import spacesObj from './spaces.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana- | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 262 | 0 | 67 | 0 | +| 266 | 0 | 71 | 1 | ## Client diff --git a/api_docs/stack_alerts.mdx b/api_docs/stack_alerts.mdx index e06c7713ef821..2140e37a68820 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: 2024-09-23 +date: 2024-09-24 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 a4b0b1d830fde..57d0a5a0d74a5 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: 2024-09-23 +date: 2024-09-24 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 e096a9a005dcb..6ddaa52c1ce05 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: 2024-09-23 +date: 2024-09-24 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 b7a85bb64fbe2..4a15cef55f2cb 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: 2024-09-23 +date: 2024-09-24 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 25b1ff709bedf..32028007ca760 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: 2024-09-23 +date: 2024-09-24 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 199d608420efd..ace87d4dadaec 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: 2024-09-23 +date: 2024-09-24 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 815a6b8974690..609f2b7e2b726 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: 2024-09-23 +date: 2024-09-24 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 de406fb22c6d9..f83532a645c82 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: 2024-09-23 +date: 2024-09-24 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 d4bbc4707ce05..99e287d3b1f39 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: 2024-09-23 +date: 2024-09-24 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 39147e5378e60..7084c865b2d67 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: 2024-09-23 +date: 2024-09-24 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 083bda21eb2d1..5c71137bf8696 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: 2024-09-23 +date: 2024-09-24 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 2e6b20381c07c..3aef52fce2fe5 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: 2024-09-23 +date: 2024-09-24 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 1ca86ba226eaa..2ca20f7e1680b 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] --- import uiActionsEnhancedObj from './ui_actions_enhanced.devdocs.json'; diff --git a/api_docs/unified_doc_viewer.mdx b/api_docs/unified_doc_viewer.mdx index 482e7e5576d75..3c996ba3669ca 100644 --- a/api_docs/unified_doc_viewer.mdx +++ b/api_docs/unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedDocViewer title: "unifiedDocViewer" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedDocViewer plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedDocViewer'] --- import unifiedDocViewerObj from './unified_doc_viewer.devdocs.json'; diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx index 4361ece3e61c3..47b0ab84ef44a 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: 2024-09-23 +date: 2024-09-24 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 b7b31034f335a..8d971c9e50d14 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: 2024-09-23 +date: 2024-09-24 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 27cca2576d67c..51f5997bc8e35 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch.autocomplete'] --- import unifiedSearchAutocompleteObj from './unified_search_autocomplete.devdocs.json'; diff --git a/api_docs/uptime.mdx b/api_docs/uptime.mdx index c71cf9136aad6..c927deed68801 100644 --- a/api_docs/uptime.mdx +++ b/api_docs/uptime.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uptime title: "uptime" image: https://source.unsplash.com/400x175/?github description: API docs for the uptime plugin -date: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uptime'] --- import uptimeObj from './uptime.devdocs.json'; diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx index c45c4af4b5fd9..a1d86a3fd37f6 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: 2024-09-23 +date: 2024-09-24 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 73d9fd481c4bb..ded53ae43138c 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: 2024-09-23 +date: 2024-09-24 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 426722344bb39..4243d4cbb624b 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: 2024-09-23 +date: 2024-09-24 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 8e21a32e0d1fe..4b763abfcec94 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: 2024-09-23 +date: 2024-09-24 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 4e681895a92be..404a812eeec34 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: 2024-09-23 +date: 2024-09-24 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 7f3c0cafd870a..edbf1b1d37d1a 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: 2024-09-23 +date: 2024-09-24 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 b223a85dcb514..3ecab43a3c2b3 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: 2024-09-23 +date: 2024-09-24 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 92ca2c666f06d..b5ee70e6351a4 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: 2024-09-23 +date: 2024-09-24 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 adad07c2041a7..820e7277c2be6 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: 2024-09-23 +date: 2024-09-24 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 6015e51eb77fb..f68ff2ff846ee 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: 2024-09-23 +date: 2024-09-24 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 c1a79ce86e11b..0ebe5329d9077 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: 2024-09-23 +date: 2024-09-24 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 596e91ecb0594..9c4cf371dbaf9 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: 2024-09-23 +date: 2024-09-24 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 108c46cbc03b0..0722c0217b7bc 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] --- import visTypeXyObj from './vis_type_xy.devdocs.json'; diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index fc9c4d760ced3..ceb60da9b26bb 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: 2024-09-23 +date: 2024-09-24 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; From 04a4942fc7950829e98b505145aff3a2663c8dfc Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Tue, 24 Sep 2024 07:57:28 +0200 Subject: [PATCH 22/41] [ES|QL] Expands the height of the history and document sections (#193453) ## Summary Allows to expand the history / inline docs container. ![meow](https://github.com/user-attachments/assets/dadbb583-83e0-43cf-8354-a945a4fcd4fc) ### 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 - [ ] 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)) - [ ] 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) --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Ryan Keairns --- .../src/editor_footer/index.tsx | 18 ++- .../src/editor_footer/query_history.tsx | 9 +- .../kbn-esql-editor/src/esql_editor.styles.ts | 8 +- packages/kbn-esql-editor/src/esql_editor.tsx | 131 +++++++++++------- packages/kbn-esql-editor/src/helpers.ts | 69 +++++++++ .../kbn-esql-editor/src/resizable_button.tsx | 6 +- .../src/components/as_inline/index.test.tsx | 4 +- .../src/components/as_inline/index.tsx | 7 +- .../components/as_popover/popover_content.tsx | 2 +- .../{as_popover => shared}/documentation.scss | 0 .../shared/documentation_content.tsx | 12 +- 11 files changed, 191 insertions(+), 75 deletions(-) rename packages/kbn-language-documentation/src/components/{as_popover => shared}/documentation.scss (100%) diff --git a/packages/kbn-esql-editor/src/editor_footer/index.tsx b/packages/kbn-esql-editor/src/editor_footer/index.tsx index 389fd264d2513..d898d2c52c9c7 100644 --- a/packages/kbn-esql-editor/src/editor_footer/index.tsx +++ b/packages/kbn-esql-editor/src/editor_footer/index.tsx @@ -50,7 +50,11 @@ interface EditorFooterProps { updateQuery: (qs: string) => void; isHistoryOpen: boolean; setIsHistoryOpen: (status: boolean) => void; + isLanguageComponentOpen: boolean; + setIsLanguageComponentOpen: (status: boolean) => void; measuredContainerWidth: number; + resizableContainerButton?: JSX.Element; + resizableContainerHeight: number; hideRunQueryText?: boolean; editorIsInline?: boolean; isSpaceReduced?: boolean; @@ -73,8 +77,12 @@ export const EditorFooter = memo(function EditorFooter({ editorIsInline, isSpaceReduced, hideTimeFilterInfo, + resizableContainerButton, + resizableContainerHeight, isHistoryOpen, setIsHistoryOpen, + isLanguageComponentOpen, + setIsLanguageComponentOpen, hideQueryHistory, isInCompactMode, displayDocumentationAsFlyout, @@ -84,7 +92,6 @@ export const EditorFooter = memo(function EditorFooter({ const kibana = useKibana(); const { docLinks } = kibana.services; const [isErrorPopoverOpen, setIsErrorPopoverOpen] = useState(false); - const [isLanguageComponentOpen, setIsLanguageComponentOpen] = useState(false); const [isWarningPopoverOpen, setIsWarningPopoverOpen] = useState(false); const onUpdateAndSubmit = useCallback( @@ -104,12 +111,12 @@ export const EditorFooter = memo(function EditorFooter({ const toggleHistoryComponent = useCallback(() => { setIsHistoryOpen(!isHistoryOpen); setIsLanguageComponentOpen(false); - }, [isHistoryOpen, setIsHistoryOpen]); + }, [isHistoryOpen, setIsHistoryOpen, setIsLanguageComponentOpen]); const toggleLanguageComponent = useCallback(async () => { setIsLanguageComponentOpen(!isLanguageComponentOpen); setIsHistoryOpen(false); - }, [isLanguageComponentOpen, setIsHistoryOpen]); + }, [isLanguageComponentOpen, setIsHistoryOpen, setIsLanguageComponentOpen]); const limit = useMemo(() => getLimitFromESQLQuery(code), [code]); @@ -307,15 +314,16 @@ export const EditorFooter = memo(function EditorFooter({ containerCSS={styles.historyContainer} onUpdateAndSubmit={onUpdateAndSubmit} containerWidth={measuredContainerWidth} - isInCompactMode={isInCompactMode} + height={resizableContainerHeight} /> )} {isLanguageComponentOpen && editorIsInline && ( - + )} + {resizableContainerButton} ); }); diff --git a/packages/kbn-esql-editor/src/editor_footer/query_history.tsx b/packages/kbn-esql-editor/src/editor_footer/query_history.tsx index 18593d4856e4e..864306737e9ca 100644 --- a/packages/kbn-esql-editor/src/editor_footer/query_history.tsx +++ b/packages/kbn-esql-editor/src/editor_footer/query_history.tsx @@ -28,9 +28,6 @@ import { css, Interpolation, Theme } from '@emotion/react'; import { type QueryHistoryItem, getHistoryItems } from '../history_local_storage'; import { getReducedSpaceStyling, swapArrayElements } from './query_history_helpers'; -const CONTAINER_MAX_HEIGHT_EXPANDED = 190; -const CONTAINER_MAX_HEIGHT_COMPACT = 250; - export function QueryHistoryAction({ toggleHistory, isHistoryOpen, @@ -206,12 +203,12 @@ export function QueryHistory({ containerCSS, containerWidth, onUpdateAndSubmit, - isInCompactMode, + height, }: { containerCSS: Interpolation; containerWidth: number; onUpdateAndSubmit: (qs: string) => void; - isInCompactMode?: boolean; + height: number; }) { const theme = useEuiTheme(); const scrollBarStyles = euiScrollBarStyles(theme); @@ -309,7 +306,7 @@ export function QueryHistory({ } border-bottom-left-radius: ${euiTheme.border.radius.medium}; border-top-left-radius: ${euiTheme.border.radius.medium}; - max-height: ${isInCompactMode ? CONTAINER_MAX_HEIGHT_COMPACT : CONTAINER_MAX_HEIGHT_EXPANDED}px; + max-height: ${height}px; overflow-y: auto; ${scrollBarStyles} ${extraStyling} diff --git a/packages/kbn-esql-editor/src/esql_editor.styles.ts b/packages/kbn-esql-editor/src/esql_editor.styles.ts index 7af40ea75e35c..430e7ada03799 100644 --- a/packages/kbn-esql-editor/src/esql_editor.styles.ts +++ b/packages/kbn-esql-editor/src/esql_editor.styles.ts @@ -13,6 +13,10 @@ export const EDITOR_INITIAL_HEIGHT = 80; export const EDITOR_INITIAL_HEIGHT_INLINE_EDITING = 140; export const EDITOR_MIN_HEIGHT = 40; export const EDITOR_MAX_HEIGHT = 400; +// resizeable container initial height +// the resizable container is the container that holds the history component or the inline docs +// they are never open simultaneously +export const RESIZABLE_CONTAINER_INITIAL_HEIGHT = 190; export const esqlEditorStyles = ( euiTheme: EuiThemeComputed, @@ -23,7 +27,9 @@ export const esqlEditorStyles = ( editorIsInline: boolean, hasOutline: boolean ) => { - const bottomContainerBorderColor = hasErrors ? euiTheme.colors.danger : euiTheme.colors.primary; + const bottomContainerBorderColor = hasErrors + ? euiTheme.colors.danger + : euiTheme.colors.lightestShade; return { editorContainer: { diff --git a/packages/kbn-esql-editor/src/esql_editor.tsx b/packages/kbn-esql-editor/src/esql_editor.tsx index 337c0133e7d20..b4d169f278a0e 100644 --- a/packages/kbn-esql-editor/src/esql_editor.tsx +++ b/packages/kbn-esql-editor/src/esql_editor.tsx @@ -40,6 +40,8 @@ import { parseErrors, parseWarning, useDebounceWithOptions, + onKeyDownResizeHandler, + onMouseDownResizeHandler, type MonacoMessage, } from './helpers'; import { addQueriesToCache } from './history_local_storage'; @@ -47,17 +49,13 @@ import { ResizableButton } from './resizable_button'; import { EDITOR_INITIAL_HEIGHT, EDITOR_INITIAL_HEIGHT_INLINE_EDITING, - EDITOR_MAX_HEIGHT, - EDITOR_MIN_HEIGHT, + RESIZABLE_CONTAINER_INITIAL_HEIGHT, esqlEditorStyles, } from './esql_editor.styles'; import type { ESQLEditorProps, ESQLEditorDeps } from './types'; import './overwrite.scss'; -const KEYCODE_ARROW_UP = 38; -const KEYCODE_ARROW_DOWN = 40; - // for editor width smaller than this value we want to start hiding some text const BREAKPOINT_WIDTH = 540; @@ -101,6 +99,11 @@ export const ESQLEditor = memo(function ESQLEditor({ const [editorHeight, setEditorHeight] = useState( editorIsInline ? EDITOR_INITIAL_HEIGHT_INLINE_EDITING : EDITOR_INITIAL_HEIGHT ); + // the resizable container is the container that holds the history component or the inline docs + // they are never open simultaneously + const [resizableContainerHeight, setResizableContainerHeight] = useState( + RESIZABLE_CONTAINER_INITIAL_HEIGHT + ); const [popoverPosition, setPopoverPosition] = useState<{ top?: number; left?: number }>({}); const [timePickerDate, setTimePickerDate] = useState(moment()); const [measuredEditorWidth, setMeasuredEditorWidth] = useState(0); @@ -108,6 +111,7 @@ export const ESQLEditor = memo(function ESQLEditor({ const isSpaceReduced = Boolean(editorIsInline) && measuredEditorWidth < BREAKPOINT_WIDTH; const [isHistoryOpen, setIsHistoryOpen] = useState(false); + const [isLanguageComponentOpen, setIsLanguageComponentOpen] = useState(false); const [isCodeEditorExpandedFocused, setIsCodeEditorExpandedFocused] = useState(false); const [isQueryLoading, setIsQueryLoading] = useState(true); const [abortController, setAbortController] = useState(new AbortController()); @@ -129,7 +133,6 @@ export const ESQLEditor = memo(function ESQLEditor({ warnings: [], }); const hideHistoryComponent = hideQueryHistory; - const onQueryUpdate = useCallback( (value: string) => { onTextLangQueryChange({ esql: value } as AggregateQuery); @@ -248,52 +251,57 @@ export const ESQLEditor = memo(function ESQLEditor({ const editor1 = useRef(); const containerRef = useRef(null); - // When the editor is on full size mode, the user can resize the height of the editor. - const onMouseDownResizeHandler = useCallback< - React.ComponentProps['onMouseDownResizeHandler'] - >( - (mouseDownEvent) => { - function isMouseEvent(e: React.TouchEvent | React.MouseEvent): e is React.MouseEvent { - return e && 'pageY' in e; - } - const startSize = editorHeight; - const startPosition = isMouseEvent(mouseDownEvent) - ? mouseDownEvent?.pageY - : mouseDownEvent?.touches[0].pageY; - - function onMouseMove(mouseMoveEvent: MouseEvent) { - const height = startSize - startPosition + mouseMoveEvent.pageY; - const validatedHeight = Math.min(Math.max(height, EDITOR_MIN_HEIGHT), EDITOR_MAX_HEIGHT); - setEditorHeight(validatedHeight); - } - function onMouseUp() { - document.body.removeEventListener('mousemove', onMouseMove); - } - - document.body.addEventListener('mousemove', onMouseMove); - document.body.addEventListener('mouseup', onMouseUp, { once: true }); + const onMouseDownResize = useCallback( + ( + mouseDownEvent, + firstPanelHeight, + setFirstPanelHeight, + secondPanelHeight, + setSecondPanelHeight + ) => { + onMouseDownResizeHandler( + mouseDownEvent, + firstPanelHeight, + setFirstPanelHeight, + secondPanelHeight, + setSecondPanelHeight + ); }, - [editorHeight] + [] ); - const onKeyDownResizeHandler = useCallback< - React.ComponentProps['onKeyDownResizeHandler'] - >( - (keyDownEvent) => { - let height = editorHeight; - if ( - keyDownEvent.keyCode === KEYCODE_ARROW_UP || - keyDownEvent.keyCode === KEYCODE_ARROW_DOWN - ) { - const step = keyDownEvent.keyCode === KEYCODE_ARROW_UP ? -10 : 10; - height = height + step; - const validatedHeight = Math.min(Math.max(height, EDITOR_MIN_HEIGHT), EDITOR_MAX_HEIGHT); - setEditorHeight(validatedHeight); - } + const onKeyDownResize = useCallback( + ( + keyDownEvent, + firstPanelHeight, + setFirstPanelHeight, + secondPanelHeight, + setSecondPanelHeight + ) => { + onKeyDownResizeHandler( + keyDownEvent, + firstPanelHeight, + setFirstPanelHeight, + secondPanelHeight, + setSecondPanelHeight + ); }, - [editorHeight] + [] ); + const resizableContainerButton = useMemo(() => { + return ( + + onMouseDownResize(mouseDownEvent, editorHeight, setEditorHeight, undefined, undefined) + } + onKeyDownResizeHandler={(keyDownEvent) => + onKeyDownResize(keyDownEvent, editorHeight, setEditorHeight, undefined, undefined) + } + /> + ); + }, [onMouseDownResize, editorHeight, onKeyDownResize]); + const onEditorFocus = useCallback(() => { setIsCodeEditorExpandedFocused(true); showSuggestionsIfEmptyQuery(); @@ -718,6 +726,28 @@ export const ESQLEditor = memo(function ESQLEditor({ + {(isHistoryOpen || (isLanguageComponentOpen && editorIsInline)) && ( + { + onMouseDownResize( + mouseDownEvent, + editorHeight, + setEditorHeight, + resizableContainerHeight, + setResizableContainerHeight + ); + }} + onKeyDownResizeHandler={(keyDownEvent) => + onKeyDownResize( + keyDownEvent, + editorHeight, + setEditorHeight, + resizableContainerHeight, + setResizableContainerHeight + ) + } + /> + )} - {createPortal( Object.keys(popoverPosition).length !== 0 && popoverPosition.constructor === Object && (
| React.TouchEvent, + height: number, + setHeight: (height: number) => void, + secondPanelHeight?: number, + setSecondPanelHeight?: (height: number) => void +) => { + function isMouseEvent(e: React.TouchEvent | React.MouseEvent): e is React.MouseEvent { + return e && 'pageY' in e; + } + + const startSize = height; + const startPosition = isMouseEvent(mouseDownEvent) + ? mouseDownEvent?.pageY + : mouseDownEvent?.touches[0].pageY; + + function onMouseMove(mouseMoveEvent: MouseEvent) { + const h = startSize - startPosition + mouseMoveEvent.pageY; + const firstPanelHeightValidated = Math.min(Math.max(h, EDITOR_MIN_HEIGHT), EDITOR_MAX_HEIGHT); + setHeight(firstPanelHeightValidated); + if (setSecondPanelHeight && secondPanelHeight) { + const maxHeight = height + secondPanelHeight; + const secondPanelHeightValidated = Math.min( + Math.max(maxHeight - firstPanelHeightValidated, RESIZABLE_CONTAINER_INITIAL_HEIGHT), + maxHeight + ); + setSecondPanelHeight?.(secondPanelHeightValidated); + } + } + function onMouseUp() { + document.body.removeEventListener('mousemove', onMouseMove); + } + + document.body.addEventListener('mousemove', onMouseMove); + document.body.addEventListener('mouseup', onMouseUp, { once: true }); +}; + +export const onKeyDownResizeHandler = ( + keyDownEvent: React.KeyboardEvent, + height: number, + setHeight: (height: number) => void, + secondPanelHeight?: number, + setSecondPanelHeight?: (height: number) => void +) => { + let h = height; + if (keyDownEvent.keyCode === KEYCODE_ARROW_UP || keyDownEvent.keyCode === KEYCODE_ARROW_DOWN) { + const step = keyDownEvent.keyCode === KEYCODE_ARROW_UP ? -10 : 10; + h = h + step; + const firstPanelHeightValidated = Math.min(Math.max(h, EDITOR_MIN_HEIGHT), EDITOR_MAX_HEIGHT); + setHeight(firstPanelHeightValidated); + if (setSecondPanelHeight && secondPanelHeight) { + const maxHeight = height + secondPanelHeight; + const secondPanelHeightValidated = Math.min( + Math.max(maxHeight - firstPanelHeightValidated, RESIZABLE_CONTAINER_INITIAL_HEIGHT), + maxHeight + ); + setSecondPanelHeight?.(secondPanelHeightValidated); + } + } +}; diff --git a/packages/kbn-esql-editor/src/resizable_button.tsx b/packages/kbn-esql-editor/src/resizable_button.tsx index 6217526de7018..12c6cb23a530a 100644 --- a/packages/kbn-esql-editor/src/resizable_button.tsx +++ b/packages/kbn-esql-editor/src/resizable_button.tsx @@ -14,7 +14,6 @@ import { css } from '@emotion/react'; export function ResizableButton({ onMouseDownResizeHandler, onKeyDownResizeHandler, - editorIsInline, }: { onMouseDownResizeHandler: ( mouseDownEvent: React.MouseEvent | React.TouchEvent @@ -30,10 +29,7 @@ export function ResizableButton({ onTouchStart={onMouseDownResizeHandler} indicator="border" css={css` - position: ${editorIsInline ? 'relative' : 'absolute'}; - bottom: 0; - left: 0; - right: 0; + position: relative; `} /> ); diff --git a/packages/kbn-language-documentation/src/components/as_inline/index.test.tsx b/packages/kbn-language-documentation/src/components/as_inline/index.test.tsx index 4ba873614f9b2..355017bff65d7 100644 --- a/packages/kbn-language-documentation/src/components/as_inline/index.test.tsx +++ b/packages/kbn-language-documentation/src/components/as_inline/index.test.tsx @@ -61,7 +61,9 @@ jest.mock('../../sections', () => { describe('###Documentation flyout component', () => { const renderInlineComponent = (searchInDescription = false) => { - return render(); + return render( + + ); }; it('has a header element for navigation through the sections', () => { renderInlineComponent(); diff --git a/packages/kbn-language-documentation/src/components/as_inline/index.tsx b/packages/kbn-language-documentation/src/components/as_inline/index.tsx index dcc860aa70db2..81ffef285d17d 100644 --- a/packages/kbn-language-documentation/src/components/as_inline/index.tsx +++ b/packages/kbn-language-documentation/src/components/as_inline/index.tsx @@ -15,12 +15,11 @@ import type { LanguageDocumentationSections } from '../../types'; import { getESQLDocsSections } from '../../sections'; interface DocumentationInlineProps { + height: number; searchInDescription?: boolean; } -const MAX_HEIGHT = 250; - -function DocumentationInline({ searchInDescription }: DocumentationInlineProps) { +function DocumentationInline({ searchInDescription, height }: DocumentationInlineProps) { const theme = useEuiTheme(); const [documentationSections, setDocumentationSections] = useState(); @@ -56,7 +55,7 @@ function DocumentationInline({ searchInDescription }: DocumentationInlineProps)
; @@ -29,7 +31,12 @@ function DocumentationContent({ }: DocumentationContentProps) { return ( <> - + {!searchText && (
{sections?.initialSection}
@@ -46,6 +54,7 @@ function DocumentationContent({ return (
{ if (el) { scrollTargets.current[helpGroup.label] = el; @@ -59,6 +68,7 @@ function DocumentationContent({ {filteredGroups?.[index].options.map((helpItem) => { return (
{ if (el) { From 80f938e174b1e6efce784bd3e44d477b2b512c3a Mon Sep 17 00:00:00 2001 From: Nathan L Smith Date: Tue, 24 Sep 2024 01:29:46 -0500 Subject: [PATCH 23/41] Auto-focus ES|QL editor on mount (#193800) ## Summary Currently, when the page loads, in order to start interacting with the ES|QL editor using keyboard navigation, you must: * Tab to the "Skip to main content" link * Follow that link * Tab through the tab and toolbar elements until you get to the editor * Press END or CTRL-E or down-down-down-down, depending on what's in the editor text box * Type my query This change auto-focuses the editor and moves the cursor to the end when the editor is mounted. The [ARIA Authoring Practices Guide (APG) for Developing a Keyboard Interface](https://www.w3.org/WAI/ARIA/apg/practices/keyboard-interface/) says: > * Do not set initial focus when the page loads except in cases where: > ** The page offers a single, primary function that nearly all users employ immediately after page load. > ** Any given user is likely to use the page often. When using ES|QL in discover you almost always want to initially focus on the query, look at the results, and further refine the query. ### Checklist - [x] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) --- packages/kbn-esql-editor/src/esql_editor.tsx | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/packages/kbn-esql-editor/src/esql_editor.tsx b/packages/kbn-esql-editor/src/esql_editor.tsx index b4d169f278a0e..244abba93a5f9 100644 --- a/packages/kbn-esql-editor/src/esql_editor.tsx +++ b/packages/kbn-esql-editor/src/esql_editor.tsx @@ -719,6 +719,10 @@ export const ESQLEditor = memo(function ESQLEditor({ }); editor.onDidChangeModelContent(showSuggestionsIfEmptyQuery); + + // Auto-focus the editor and move the cursor to the end. + editor.focus(); + editor.setPosition({ column: Infinity, lineNumber: Infinity }); }} />
From caad89426c0e790a54cfb6055f09decc3fd9733b Mon Sep 17 00:00:00 2001 From: Jan Monschke Date: Tue, 24 Sep 2024 08:49:44 +0200 Subject: [PATCH 24/41] [Threat Hunting Investigations] Use OpenAPI types in more timeline routes (#189977) ## Summary Fixes: https://github.com/elastic/security-team/issues/10133 Migrates some timeline routes to use the newly generated OpenAPI types. The changes mostly affect pinned event and note routes to keep the changes small. Routes that actually accept and return timeline objects will come in a next step. ### 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 --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Elastic Machine --- .../output/kibana.serverless.staging.yaml | 135 +++++++++++------- oas_docs/output/kibana.staging.yaml | 135 +++++++++++------- .../common/api/quickstart_client.gen.ts | 7 +- .../clean_draft_timelines_route.ts | 14 -- .../delete_note/delete_note_route.gen.ts | 8 +- .../delete_note/delete_note_route.schema.yaml | 1 + .../timeline/delete_note/delete_note_route.ts | 14 -- .../delete_timelines_route.ts | 16 --- .../export_timelines_route.ts | 17 --- .../timeline/get_notes/get_notes_route.gen.ts | 17 ++- .../get_notes/get_notes_route.schema.yaml | 21 ++- .../api/timeline/get_notes/get_notes_route.ts | 19 --- .../import_timelines_route.ts | 2 +- .../common/api/timeline/index.ts | 9 +- .../common/api/timeline/model/api.ts | 57 ++------ .../api/timeline/model/components.gen.ts | 31 +++- .../api/timeline/model/components.schema.yaml | 44 +++++- .../persist_favorite_route.ts | 18 --- .../persist_note/persist_note_route.gen.ts | 13 +- .../persist_note_route.schema.yaml | 22 +-- .../persist_note/persist_note_route.ts | 40 ------ .../pinned_events/pinned_events_route.gen.ts | 19 ++- .../pinned_events_route.schema.yaml | 27 ++-- .../pinned_events/pinned_events_route.ts | 30 +--- .../common/api/timeline/routes.ts | 42 ++++++ ...imeline_api_2023_10_31.bundled.schema.yaml | 129 +++++++++++------ ...imeline_api_2023_10_31.bundled.schema.yaml | 129 +++++++++++------ .../public/timelines/containers/api.ts | 12 +- .../timelines/containers/pinned_event/api.ts | 15 +- .../store/middlewares/timeline_favorite.ts | 4 +- .../middlewares/timeline_pinned_event.ts | 11 +- .../clean_draft_timelines/index.ts | 9 +- .../lib/timeline/routes/notes/delete_note.ts | 42 +++--- .../timeline/routes/notes/get_notes.test.ts | 4 +- .../lib/timeline/routes/notes/get_notes.ts | 17 +-- .../lib/timeline/routes/notes/persist_note.ts | 12 +- .../pinned_events/persist_pinned_event.ts | 16 ++- .../timelines/delete_timelines/index.ts | 12 +- .../timelines/export_timelines/index.test.ts | 8 +- .../timelines/export_timelines/index.ts | 10 +- .../timelines/persist_favorite/index.ts | 22 +-- .../saved_object/notes/saved_object.ts | 7 +- .../saved_object/pinned_events/index.ts | 12 +- .../timeline/saved_object/timelines/index.ts | 4 +- .../pinned_events.ts | 2 +- 45 files changed, 675 insertions(+), 560 deletions(-) delete mode 100644 x-pack/plugins/security_solution/common/api/timeline/clean_draft_timelines/clean_draft_timelines_route.ts delete mode 100644 x-pack/plugins/security_solution/common/api/timeline/delete_note/delete_note_route.ts delete mode 100644 x-pack/plugins/security_solution/common/api/timeline/delete_timelines/delete_timelines_route.ts delete mode 100644 x-pack/plugins/security_solution/common/api/timeline/export_timelines/export_timelines_route.ts delete mode 100644 x-pack/plugins/security_solution/common/api/timeline/get_notes/get_notes_route.ts delete mode 100644 x-pack/plugins/security_solution/common/api/timeline/persist_favorite/persist_favorite_route.ts delete mode 100644 x-pack/plugins/security_solution/common/api/timeline/persist_note/persist_note_route.ts create mode 100644 x-pack/plugins/security_solution/common/api/timeline/routes.ts diff --git a/oas_docs/output/kibana.serverless.staging.yaml b/oas_docs/output/kibana.serverless.staging.yaml index 15790040e6a46..df157c25154d0 100644 --- a/oas_docs/output/kibana.serverless.staging.yaml +++ b/oas_docs/output/kibana.serverless.staging.yaml @@ -15090,7 +15090,8 @@ paths: type: string required: - noteId - - type: object + - nullable: true + type: object properties: noteIds: items: @@ -15121,19 +15122,18 @@ paths: parameters: - in: query name: documentIds - required: true schema: $ref: '#/components/schemas/Security_Solution_Timeline_API_DocumentIds' - in: query name: page schema: nullable: true - type: number + type: string - in: query name: perPage schema: nullable: true - type: number + type: string - in: query name: search schema: @@ -15156,6 +15156,13 @@ paths: type: string responses: '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + oneOf: + - $ref: >- + #/components/schemas/Security_Solution_Timeline_API_GetNotesResult + - type: object description: Indicates the requested notes were returned. summary: Get notes tags: @@ -15205,19 +15212,8 @@ paths: type: object properties: persistNote: - type: object - properties: - code: - type: number - message: - type: string - note: - $ref: >- - #/components/schemas/Security_Solution_Timeline_API_Note - required: - - code - - message - - note + $ref: >- + #/components/schemas/Security_Solution_Timeline_API_ResponseNote required: - persistNote required: @@ -15589,15 +15585,8 @@ paths: type: object properties: persistPinnedEventOnTimeline: - allOf: - - $ref: >- - #/components/schemas/Security_Solution_Timeline_API_PinnedEvent - - type: object - properties: - code: - type: number - message: - type: string + $ref: >- + #/components/schemas/Security_Solution_Timeline_API_PersistPinnedEventResponse required: - persistPinnedEventOnTimeline required: @@ -32400,8 +32389,28 @@ components: nullable: true type: string timelineId: + type: string + updated: + nullable: true + type: number + updatedBy: + nullable: true + type: string + required: + - timelineId + Security_Solution_Timeline_API_BarePinnedEvent: + type: object + properties: + created: + nullable: true + type: number + createdBy: nullable: true type: string + eventId: + type: string + timelineId: + type: string updated: nullable: true type: number @@ -32409,6 +32418,7 @@ components: nullable: true type: string required: + - eventId - timelineId Security_Solution_Timeline_API_ColumnHeaderResult: type: object @@ -32584,6 +32594,18 @@ components: type: string script: type: string + Security_Solution_Timeline_API_GetNotesResult: + type: object + properties: + notes: + items: + $ref: '#/components/schemas/Security_Solution_Timeline_API_Note' + type: array + totalCount: + type: number + required: + - totalCount + - notes Security_Solution_Timeline_API_ImportTimelineResult: type: object properties: @@ -32644,34 +32666,38 @@ components: type: string version: type: string + required: + - noteId + - version + Security_Solution_Timeline_API_PersistPinnedEventResponse: + oneOf: + - allOf: + - $ref: '#/components/schemas/Security_Solution_Timeline_API_PinnedEvent' + - $ref: >- + #/components/schemas/Security_Solution_Timeline_API_PinnedEventBaseResponseBody + - nullable: true + type: object Security_Solution_Timeline_API_PinnedEvent: + allOf: + - $ref: '#/components/schemas/Security_Solution_Timeline_API_BarePinnedEvent' + - type: object + properties: + pinnedEventId: + type: string + version: + type: string + required: + - pinnedEventId + - version + Security_Solution_Timeline_API_PinnedEventBaseResponseBody: type: object properties: - created: - nullable: true - type: number - createdBy: - nullable: true - type: string - eventId: - type: string - pinnedEventId: - type: string - timelineId: - type: string - updated: - nullable: true + code: type: number - updatedBy: - nullable: true - type: string - version: + message: type: string required: - - eventId - - pinnedEventId - - timelineId - - version + - code Security_Solution_Timeline_API_QueryMatchResult: type: object properties: @@ -32716,6 +32742,19 @@ components: type: object readable: type: boolean + Security_Solution_Timeline_API_ResponseNote: + type: object + properties: + code: + type: number + message: + type: string + note: + $ref: '#/components/schemas/Security_Solution_Timeline_API_Note' + required: + - code + - message + - note Security_Solution_Timeline_API_RowRendererId: enum: - alert diff --git a/oas_docs/output/kibana.staging.yaml b/oas_docs/output/kibana.staging.yaml index c2b530c0af263..eccfac7277dce 100644 --- a/oas_docs/output/kibana.staging.yaml +++ b/oas_docs/output/kibana.staging.yaml @@ -18539,7 +18539,8 @@ paths: type: string required: - noteId - - type: object + - nullable: true + type: object properties: noteIds: items: @@ -18570,19 +18571,18 @@ paths: parameters: - in: query name: documentIds - required: true schema: $ref: '#/components/schemas/Security_Solution_Timeline_API_DocumentIds' - in: query name: page schema: nullable: true - type: number + type: string - in: query name: perPage schema: nullable: true - type: number + type: string - in: query name: search schema: @@ -18605,6 +18605,13 @@ paths: type: string responses: '200': + content: + application/json; Elastic-Api-Version=2023-10-31: + schema: + oneOf: + - $ref: >- + #/components/schemas/Security_Solution_Timeline_API_GetNotesResult + - type: object description: Indicates the requested notes were returned. summary: Get notes tags: @@ -18654,19 +18661,8 @@ paths: type: object properties: persistNote: - type: object - properties: - code: - type: number - message: - type: string - note: - $ref: >- - #/components/schemas/Security_Solution_Timeline_API_Note - required: - - code - - message - - note + $ref: >- + #/components/schemas/Security_Solution_Timeline_API_ResponseNote required: - persistNote required: @@ -19038,15 +19034,8 @@ paths: type: object properties: persistPinnedEventOnTimeline: - allOf: - - $ref: >- - #/components/schemas/Security_Solution_Timeline_API_PinnedEvent - - type: object - properties: - code: - type: number - message: - type: string + $ref: >- + #/components/schemas/Security_Solution_Timeline_API_PersistPinnedEventResponse required: - persistPinnedEventOnTimeline required: @@ -40429,8 +40418,28 @@ components: nullable: true type: string timelineId: + type: string + updated: + nullable: true + type: number + updatedBy: + nullable: true + type: string + required: + - timelineId + Security_Solution_Timeline_API_BarePinnedEvent: + type: object + properties: + created: + nullable: true + type: number + createdBy: nullable: true type: string + eventId: + type: string + timelineId: + type: string updated: nullable: true type: number @@ -40438,6 +40447,7 @@ components: nullable: true type: string required: + - eventId - timelineId Security_Solution_Timeline_API_ColumnHeaderResult: type: object @@ -40613,6 +40623,18 @@ components: type: string script: type: string + Security_Solution_Timeline_API_GetNotesResult: + type: object + properties: + notes: + items: + $ref: '#/components/schemas/Security_Solution_Timeline_API_Note' + type: array + totalCount: + type: number + required: + - totalCount + - notes Security_Solution_Timeline_API_ImportTimelineResult: type: object properties: @@ -40673,34 +40695,38 @@ components: type: string version: type: string + required: + - noteId + - version + Security_Solution_Timeline_API_PersistPinnedEventResponse: + oneOf: + - allOf: + - $ref: '#/components/schemas/Security_Solution_Timeline_API_PinnedEvent' + - $ref: >- + #/components/schemas/Security_Solution_Timeline_API_PinnedEventBaseResponseBody + - nullable: true + type: object Security_Solution_Timeline_API_PinnedEvent: + allOf: + - $ref: '#/components/schemas/Security_Solution_Timeline_API_BarePinnedEvent' + - type: object + properties: + pinnedEventId: + type: string + version: + type: string + required: + - pinnedEventId + - version + Security_Solution_Timeline_API_PinnedEventBaseResponseBody: type: object properties: - created: - nullable: true - type: number - createdBy: - nullable: true - type: string - eventId: - type: string - pinnedEventId: - type: string - timelineId: - type: string - updated: - nullable: true + code: type: number - updatedBy: - nullable: true - type: string - version: + message: type: string required: - - eventId - - pinnedEventId - - timelineId - - version + - code Security_Solution_Timeline_API_QueryMatchResult: type: object properties: @@ -40745,6 +40771,19 @@ components: type: object readable: type: boolean + Security_Solution_Timeline_API_ResponseNote: + type: object + properties: + code: + type: number + message: + type: string + note: + $ref: '#/components/schemas/Security_Solution_Timeline_API_Note' + required: + - code + - message + - note Security_Solution_Timeline_API_RowRendererId: enum: - alert diff --git a/x-pack/plugins/security_solution/common/api/quickstart_client.gen.ts b/x-pack/plugins/security_solution/common/api/quickstart_client.gen.ts index 0e4b7456547cc..d404e055476ef 100644 --- a/x-pack/plugins/security_solution/common/api/quickstart_client.gen.ts +++ b/x-pack/plugins/security_solution/common/api/quickstart_client.gen.ts @@ -315,7 +315,10 @@ import type { GetDraftTimelinesRequestQueryInput, GetDraftTimelinesResponse, } from './timeline/get_draft_timelines/get_draft_timelines_route.gen'; -import type { GetNotesRequestQueryInput } from './timeline/get_notes/get_notes_route.gen'; +import type { + GetNotesRequestQueryInput, + GetNotesResponse, +} from './timeline/get_notes/get_notes_route.gen'; import type { GetTimelineRequestQueryInput, GetTimelineResponse, @@ -1254,7 +1257,7 @@ finalize it. async getNotes(props: GetNotesProps) { this.log.info(`${new Date().toISOString()} Calling API GetNotes`); return this.kbnClient - .request({ + .request({ path: '/api/note', headers: { [ELASTIC_HTTP_VERSION_HEADER]: '2023-10-31', diff --git a/x-pack/plugins/security_solution/common/api/timeline/clean_draft_timelines/clean_draft_timelines_route.ts b/x-pack/plugins/security_solution/common/api/timeline/clean_draft_timelines/clean_draft_timelines_route.ts deleted file mode 100644 index fd967824370ea..0000000000000 --- a/x-pack/plugins/security_solution/common/api/timeline/clean_draft_timelines/clean_draft_timelines_route.ts +++ /dev/null @@ -1,14 +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 rt from 'io-ts'; - -import { TimelineTypeLiteralRt } from '../model/api'; - -export const cleanDraftTimelineSchema = rt.type({ - timelineType: TimelineTypeLiteralRt, -}); diff --git a/x-pack/plugins/security_solution/common/api/timeline/delete_note/delete_note_route.gen.ts b/x-pack/plugins/security_solution/common/api/timeline/delete_note/delete_note_route.gen.ts index fc06d819ab39a..d98455c1fdb59 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/delete_note/delete_note_route.gen.ts +++ b/x-pack/plugins/security_solution/common/api/timeline/delete_note/delete_note_route.gen.ts @@ -23,9 +23,11 @@ export const DeleteNoteRequestBody = z.union([ noteId: z.string(), }) .nullable(), - z.object({ - noteIds: z.array(z.string()).nullable(), - }), + z + .object({ + noteIds: z.array(z.string()).nullable(), + }) + .nullable(), ]); export type DeleteNoteRequestBodyInput = z.input; diff --git a/x-pack/plugins/security_solution/common/api/timeline/delete_note/delete_note_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/delete_note/delete_note_route.schema.yaml index 02a75d4e0ac77..380029bff8070 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/delete_note/delete_note_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/delete_note/delete_note_route.schema.yaml @@ -34,6 +34,7 @@ paths: type: string - type: object required: [noteIds] + nullable: true properties: noteIds: type: array diff --git a/x-pack/plugins/security_solution/common/api/timeline/delete_note/delete_note_route.ts b/x-pack/plugins/security_solution/common/api/timeline/delete_note/delete_note_route.ts deleted file mode 100644 index 717440fa0717a..0000000000000 --- a/x-pack/plugins/security_solution/common/api/timeline/delete_note/delete_note_route.ts +++ /dev/null @@ -1,14 +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 runtimeTypes from 'io-ts'; -import { unionWithNullType } from '../../../utility_types'; - -export const deleteNoteSchema = runtimeTypes.partial({ - noteId: unionWithNullType(runtimeTypes.string), - noteIds: unionWithNullType(runtimeTypes.array(runtimeTypes.string)), -}); diff --git a/x-pack/plugins/security_solution/common/api/timeline/delete_timelines/delete_timelines_route.ts b/x-pack/plugins/security_solution/common/api/timeline/delete_timelines/delete_timelines_route.ts deleted file mode 100644 index c6b8f1baf6974..0000000000000 --- a/x-pack/plugins/security_solution/common/api/timeline/delete_timelines/delete_timelines_route.ts +++ /dev/null @@ -1,16 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import * as rt from 'io-ts'; - -const searchId = rt.partial({ searchIds: rt.array(rt.string) }); - -const baseDeleteTimelinesSchema = rt.type({ - savedObjectIds: rt.array(rt.string), -}); - -export const deleteTimelinesSchema = rt.intersection([baseDeleteTimelinesSchema, searchId]); diff --git a/x-pack/plugins/security_solution/common/api/timeline/export_timelines/export_timelines_route.ts b/x-pack/plugins/security_solution/common/api/timeline/export_timelines/export_timelines_route.ts deleted file mode 100644 index cc391a47e0b9e..0000000000000 --- a/x-pack/plugins/security_solution/common/api/timeline/export_timelines/export_timelines_route.ts +++ /dev/null @@ -1,17 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import * as rt from 'io-ts'; -import { unionWithNullType } from '../../../utility_types'; - -export const exportTimelinesQuerySchema = rt.type({ - file_name: rt.string, -}); - -export const exportTimelinesRequestBodySchema = rt.partial({ - ids: unionWithNullType(rt.array(rt.string)), -}); diff --git a/x-pack/plugins/security_solution/common/api/timeline/get_notes/get_notes_route.gen.ts b/x-pack/plugins/security_solution/common/api/timeline/get_notes/get_notes_route.gen.ts index b20b713bc3ed3..5851b95d4d606 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/get_notes/get_notes_route.gen.ts +++ b/x-pack/plugins/security_solution/common/api/timeline/get_notes/get_notes_route.gen.ts @@ -16,17 +16,28 @@ import { z } from '@kbn/zod'; +import { Note } from '../model/components.gen'; + export type DocumentIds = z.infer; export const DocumentIds = z.union([z.array(z.string()), z.string()]); +export type GetNotesResult = z.infer; +export const GetNotesResult = z.object({ + totalCount: z.number(), + notes: z.array(Note), +}); + export type GetNotesRequestQuery = z.infer; export const GetNotesRequestQuery = z.object({ - documentIds: DocumentIds, - page: z.coerce.number().optional(), - perPage: z.coerce.number().optional(), + documentIds: DocumentIds.optional(), + page: z.string().nullable().optional(), + perPage: z.string().nullable().optional(), search: z.string().nullable().optional(), sortField: z.string().nullable().optional(), sortOrder: z.string().nullable().optional(), filter: z.string().nullable().optional(), }); export type GetNotesRequestQueryInput = z.input; + +export type GetNotesResponse = z.infer; +export const GetNotesResponse = z.union([GetNotesResult, z.object({})]); diff --git a/x-pack/plugins/security_solution/common/api/timeline/get_notes/get_notes_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/get_notes/get_notes_route.schema.yaml index 19b5d2074d18e..5942fd76c5d51 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/get_notes/get_notes_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/get_notes/get_notes_route.schema.yaml @@ -22,18 +22,17 @@ paths: parameters: - name: documentIds in: query - required: true schema: $ref: '#/components/schemas/DocumentIds' - name: page in: query schema: - type: number + type: string nullable: true - name: perPage in: query schema: - type: number + type: string nullable: true - name: search in: query @@ -58,6 +57,12 @@ paths: responses: '200': description: Indicates the requested notes were returned. + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/GetNotesResult' + - type: object components: schemas: @@ -67,3 +72,13 @@ components: items: type: string - type: string + GetNotesResult: + type: object + required: [totalCount, notes] + properties: + totalCount: + type: number + notes: + type: array + items: + $ref: '../model/components.schema.yaml#/components/schemas/Note' diff --git a/x-pack/plugins/security_solution/common/api/timeline/get_notes/get_notes_route.ts b/x-pack/plugins/security_solution/common/api/timeline/get_notes/get_notes_route.ts deleted file mode 100644 index 219632fc522e9..0000000000000 --- a/x-pack/plugins/security_solution/common/api/timeline/get_notes/get_notes_route.ts +++ /dev/null @@ -1,19 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ - -import * as runtimeTypes from 'io-ts'; -import { unionWithNullType } from '../../../utility_types'; - -export const getNotesSchema = runtimeTypes.partial({ - documentIds: runtimeTypes.union([runtimeTypes.array(runtimeTypes.string), runtimeTypes.string]), - page: unionWithNullType(runtimeTypes.string), - perPage: unionWithNullType(runtimeTypes.string), - search: unionWithNullType(runtimeTypes.string), - sortField: unionWithNullType(runtimeTypes.string), - sortOrder: unionWithNullType(runtimeTypes.string), - filter: unionWithNullType(runtimeTypes.string), -}); diff --git a/x-pack/plugins/security_solution/common/api/timeline/import_timelines/import_timelines_route.ts b/x-pack/plugins/security_solution/common/api/timeline/import_timelines/import_timelines_route.ts index ecd40bab9476b..2ad6f3f8c7333 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/import_timelines/import_timelines_route.ts +++ b/x-pack/plugins/security_solution/common/api/timeline/import_timelines/import_timelines_route.ts @@ -10,7 +10,7 @@ import * as rt from 'io-ts'; import { BareNoteSchema, SavedTimelineRuntimeType } from '../model/api'; import { unionWithNullType } from '../../../utility_types'; -import { pinnedEventIds } from '../pinned_events/pinned_events_route'; +const pinnedEventIds = unionWithNullType(rt.array(rt.string)); export const eventNotes = unionWithNullType(rt.array(BareNoteSchema)); export const globalNotes = unionWithNullType(rt.array(BareNoteSchema)); diff --git a/x-pack/plugins/security_solution/common/api/timeline/index.ts b/x-pack/plugins/security_solution/common/api/timeline/index.ts index c2901b96417db..806c0c8539d97 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/index.ts +++ b/x-pack/plugins/security_solution/common/api/timeline/index.ts @@ -6,19 +6,14 @@ */ export * from './model/api'; -export * from './clean_draft_timelines/clean_draft_timelines_route'; +export * from './routes'; + export * from './get_draft_timelines/get_draft_timelines_route'; export * from './create_timelines/create_timelines_route'; -export * from './delete_note/delete_note_route'; -export * from './delete_timelines/delete_timelines_route'; -export * from './export_timelines/export_timelines_route'; export * from './get_timeline/get_timeline_route'; export * from './get_timelines/get_timelines_route'; export * from './import_timelines/import_timelines_route'; export * from './patch_timelines/patch_timelines_schema'; -export * from './persist_favorite/persist_favorite_route'; -export * from './persist_note/persist_note_route'; export * from './pinned_events/pinned_events_route'; export * from './install_prepackaged_timelines/install_prepackaged_timelines'; export * from './copy_timeline/copy_timeline_route'; -export * from './get_notes/get_notes_route'; diff --git a/x-pack/plugins/security_solution/common/api/timeline/model/api.ts b/x-pack/plugins/security_solution/common/api/timeline/model/api.ts index 1e40484505d1b..ff6707b700626 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/model/api.ts +++ b/x-pack/plugins/security_solution/common/api/timeline/model/api.ts @@ -12,12 +12,17 @@ import { stringEnum, unionWithNullType } from '../../../utility_types'; import type { Maybe } from '../../../search_strategy'; import { Direction } from '../../../search_strategy'; -import type { PinnedEvent } from '../pinned_events/pinned_events_route'; import { PinnedEventRuntimeType } from '../pinned_events/pinned_events_route'; import { ErrorSchema } from './error_schema'; import type { DataProviderType } from './components.gen'; import { + BareNote, + BarePinnedEvent, DataProviderTypeEnum, + FavoriteTimelineResponse, + type FavoriteTimelineResult, + type Note, + PinnedEvent, RowRendererId, RowRendererIdEnum, SortFieldTimeline, @@ -31,8 +36,13 @@ import { } from './components.gen'; export { + BareNote, + BarePinnedEvent, DataProviderType, DataProviderTypeEnum, + FavoriteTimelineResponse, + Note, + PinnedEvent, RowRendererId, RowRendererIdEnum, SortFieldTimeline, @@ -45,6 +55,8 @@ export { TimelineTypeEnum, }; +export type BarePinnedEventWithoutExternalRefs = Omit; + /** * Outcome is a property of the saved object resolve api * will tell us info about the rule after 8.0 migrations @@ -83,24 +95,12 @@ export const BareNoteSchema = runtimeTypes.intersection([ }), ]); -export type BareNote = runtimeTypes.TypeOf; - /** * This type represents a note type stored in a saved object that does not include any fields that reference * other saved objects. */ export type BareNoteWithoutExternalRefs = Omit; -export const BareNoteWithoutExternalRefsSchema = runtimeTypes.partial({ - timelineId: unionWithNullType(runtimeTypes.string), - eventId: unionWithNullType(runtimeTypes.string), - note: unionWithNullType(runtimeTypes.string), - created: unionWithNullType(runtimeTypes.number), - createdBy: unionWithNullType(runtimeTypes.string), - updated: unionWithNullType(runtimeTypes.number), - updatedBy: unionWithNullType(runtimeTypes.string), -}); - export const NoteRuntimeType = runtimeTypes.intersection([ BareNoteSchema, runtimeTypes.type({ @@ -109,16 +109,6 @@ export const NoteRuntimeType = runtimeTypes.intersection([ }), ]); -export type Note = runtimeTypes.TypeOf; - -export interface ResponseNote { - code?: Maybe; - - message?: Maybe; - - note: Note; -} - /* * ColumnHeader Types */ @@ -489,27 +479,6 @@ export const importTimelineResultSchema = runtimeTypes.exact( export type ImportTimelineResultSchema = runtimeTypes.TypeOf; -const favoriteTimelineResult = runtimeTypes.partial({ - fullName: unionWithNullType(runtimeTypes.string), - userName: unionWithNullType(runtimeTypes.string), - favoriteDate: unionWithNullType(runtimeTypes.number), -}); - -export type FavoriteTimelineResult = runtimeTypes.TypeOf; - -export const responseFavoriteTimeline = runtimeTypes.partial({ - savedObjectId: runtimeTypes.string, - version: runtimeTypes.string, - code: unionWithNullType(runtimeTypes.number), - message: unionWithNullType(runtimeTypes.string), - templateTimelineId: unionWithNullType(runtimeTypes.string), - templateTimelineVersion: unionWithNullType(runtimeTypes.number), - timelineType: unionWithNullType(TimelineTypeLiteralRt), - favorite: unionWithNullType(runtimeTypes.array(favoriteTimelineResult)), -}); - -export type ResponseFavoriteTimeline = runtimeTypes.TypeOf; - export const pageInfoTimeline = runtimeTypes.type({ pageIndex: runtimeTypes.number, pageSize: runtimeTypes.number, diff --git a/x-pack/plugins/security_solution/common/api/timeline/model/components.gen.ts b/x-pack/plugins/security_solution/common/api/timeline/model/components.gen.ts index 392699b711ecf..990b19d6f3bab 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/model/components.gen.ts +++ b/x-pack/plugins/security_solution/common/api/timeline/model/components.gen.ts @@ -217,7 +217,7 @@ export type BareNote = z.infer; export const BareNote = z.object({ eventId: z.string().nullable().optional(), note: z.string().nullable().optional(), - timelineId: z.string().nullable(), + timelineId: z.string(), created: z.number().nullable().optional(), createdBy: z.string().nullable().optional(), updated: z.number().nullable().optional(), @@ -227,23 +227,29 @@ export const BareNote = z.object({ export type Note = z.infer; export const Note = BareNote.merge( z.object({ - noteId: z.string().optional(), - version: z.string().optional(), + noteId: z.string(), + version: z.string(), }) ); -export type PinnedEvent = z.infer; -export const PinnedEvent = z.object({ - pinnedEventId: z.string(), +export type BarePinnedEvent = z.infer; +export const BarePinnedEvent = z.object({ eventId: z.string(), timelineId: z.string(), created: z.number().nullable().optional(), createdBy: z.string().nullable().optional(), updated: z.number().nullable().optional(), updatedBy: z.string().nullable().optional(), - version: z.string(), }); +export type PinnedEvent = z.infer; +export const PinnedEvent = BarePinnedEvent.merge( + z.object({ + pinnedEventId: z.string(), + version: z.string(), + }) +); + export type TimelineResponse = z.infer; export const TimelineResponse = SavedTimeline.merge( z.object({ @@ -269,6 +275,17 @@ export const FavoriteTimelineResponse = z.object({ favorite: z.array(FavoriteTimelineResult).optional(), }); +export type BareNoteWithoutExternalRefs = z.infer; +export const BareNoteWithoutExternalRefs = z.object({ + eventId: z.string().nullable().optional(), + note: z.string().nullable().optional(), + timelineId: z.string().nullable().optional(), + created: z.number().nullable().optional(), + createdBy: z.string().nullable().optional(), + updated: z.number().nullable().optional(), + updatedBy: z.string().nullable().optional(), +}); + export type GlobalNote = z.infer; export const GlobalNote = z.object({ noteId: z.string().optional(), diff --git a/x-pack/plugins/security_solution/common/api/timeline/model/components.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/model/components.schema.yaml index d5d4af4cb1e24..c8ba2e6019f16 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/model/components.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/model/components.schema.yaml @@ -305,6 +305,30 @@ components: nullable: true queryMatch: $ref: '#/components/schemas/QueryMatchResult' + BareNoteWithoutExternalRefs: + type: object + properties: + eventId: + type: string + nullable: true + note: + type: string + nullable: true + timelineId: + type: string + nullable: true + created: + type: number + nullable: true + createdBy: + type: string + nullable: true + updated: + type: number + nullable: true + updatedBy: + type: string + nullable: true BareNote: type: object required: [timelineId] @@ -317,7 +341,6 @@ components: nullable: true timelineId: type: string - nullable: true created: type: number nullable: true @@ -334,6 +357,7 @@ components: allOf: - $ref: '#/components/schemas/BareNote' - type: object + required: [noteId, version] properties: noteId: type: string @@ -451,12 +475,10 @@ components: serializedQuery: type: string nullable: true - PinnedEvent: + BarePinnedEvent: type: object - required: [eventId, pinnedEventId, timelineId, version] + required: [eventId, timelineId] properties: - pinnedEventId: - type: string eventId: type: string timelineId: @@ -473,8 +495,16 @@ components: updatedBy: type: string nullable: true - version: - type: string + PinnedEvent: + allOf: + - $ref: '#/components/schemas/BarePinnedEvent' + - type: object + required: [pinnedEventId, version] + properties: + pinnedEventId: + type: string + version: + type: string Sort: oneOf: - $ref: '#/components/schemas/SortObject' diff --git a/x-pack/plugins/security_solution/common/api/timeline/persist_favorite/persist_favorite_route.ts b/x-pack/plugins/security_solution/common/api/timeline/persist_favorite/persist_favorite_route.ts deleted file mode 100644 index 0f4adff41c910..0000000000000 --- a/x-pack/plugins/security_solution/common/api/timeline/persist_favorite/persist_favorite_route.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 * as rt from 'io-ts'; - -import { TimelineTypeLiteralRt } from '../model/api'; -import { unionWithNullType } from '../../../utility_types'; - -export const persistFavoriteSchema = rt.type({ - timelineId: unionWithNullType(rt.string), - templateTimelineId: unionWithNullType(rt.string), - templateTimelineVersion: unionWithNullType(rt.number), - timelineType: unionWithNullType(TimelineTypeLiteralRt), -}); diff --git a/x-pack/plugins/security_solution/common/api/timeline/persist_note/persist_note_route.gen.ts b/x-pack/plugins/security_solution/common/api/timeline/persist_note/persist_note_route.gen.ts index 002c8df84e86a..36def713d4994 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/persist_note/persist_note_route.gen.ts +++ b/x-pack/plugins/security_solution/common/api/timeline/persist_note/persist_note_route.gen.ts @@ -18,6 +18,13 @@ import { z } from '@kbn/zod'; import { BareNote, Note } from '../model/components.gen'; +export type ResponseNote = z.infer; +export const ResponseNote = z.object({ + code: z.number(), + message: z.string(), + note: Note, +}); + export type PersistNoteRouteRequestBody = z.infer; export const PersistNoteRouteRequestBody = z.object({ note: BareNote, @@ -33,10 +40,6 @@ export type PersistNoteRouteRequestBodyInput = z.input; export const PersistNoteRouteResponse = z.object({ data: z.object({ - persistNote: z.object({ - code: z.number(), - message: z.string(), - note: Note, - }), + persistNote: ResponseNote, }), }); diff --git a/x-pack/plugins/security_solution/common/api/timeline/persist_note/persist_note_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/persist_note/persist_note_route.schema.yaml index 41ae12c974d6f..4ca14d2b15b13 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/persist_note/persist_note_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/persist_note/persist_note_route.schema.yaml @@ -65,12 +65,16 @@ paths: required: [persistNote] properties: persistNote: - type: object - required: [code, message, note] - properties: - code: - type: number - message: - type: string - note: - $ref: '../model/components.schema.yaml#/components/schemas/Note' + $ref: '#/components/schemas/ResponseNote' +components: + schemas: + ResponseNote: + type: object + required: [code, message, note] + properties: + code: + type: number + message: + type: string + note: + $ref: '../model/components.schema.yaml#/components/schemas/Note' diff --git a/x-pack/plugins/security_solution/common/api/timeline/persist_note/persist_note_route.ts b/x-pack/plugins/security_solution/common/api/timeline/persist_note/persist_note_route.ts deleted file mode 100644 index e6f8b9cc94fd3..0000000000000 --- a/x-pack/plugins/security_solution/common/api/timeline/persist_note/persist_note_route.ts +++ /dev/null @@ -1,40 +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 runtimeTypes from 'io-ts'; -import { unionWithNullType } from '../../../utility_types'; -import { BareNoteSchema, BareNoteWithoutExternalRefsSchema } from '../model/api'; - -export const persistNoteWithRefSchema = runtimeTypes.intersection([ - runtimeTypes.type({ - note: BareNoteSchema, - }), - runtimeTypes.partial({ - overrideOwner: unionWithNullType(runtimeTypes.boolean), - noteId: unionWithNullType(runtimeTypes.string), - version: unionWithNullType(runtimeTypes.string), - }), -]); - -export const persistNoteWithoutRefSchema = runtimeTypes.intersection([ - runtimeTypes.type({ - note: BareNoteWithoutExternalRefsSchema, - }), - runtimeTypes.partial({ - overrideOwner: unionWithNullType(runtimeTypes.boolean), - noteId: unionWithNullType(runtimeTypes.string), - version: unionWithNullType(runtimeTypes.string), - eventIngested: unionWithNullType(runtimeTypes.string), - eventTimestamp: unionWithNullType(runtimeTypes.string), - eventDataView: unionWithNullType(runtimeTypes.string), - }), -]); - -export const persistNoteSchema = runtimeTypes.union([ - persistNoteWithRefSchema, - persistNoteWithoutRefSchema, -]); diff --git a/x-pack/plugins/security_solution/common/api/timeline/pinned_events/pinned_events_route.gen.ts b/x-pack/plugins/security_solution/common/api/timeline/pinned_events/pinned_events_route.gen.ts index 905e2740d32f2..6fd628e5a258e 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/pinned_events/pinned_events_route.gen.ts +++ b/x-pack/plugins/security_solution/common/api/timeline/pinned_events/pinned_events_route.gen.ts @@ -18,6 +18,18 @@ import { z } from '@kbn/zod'; import { PinnedEvent } from '../model/components.gen'; +export type PinnedEventBaseResponseBody = z.infer; +export const PinnedEventBaseResponseBody = z.object({ + code: z.number(), + message: z.string().optional(), +}); + +export type PersistPinnedEventResponse = z.infer; +export const PersistPinnedEventResponse = z.union([ + PinnedEvent.merge(PinnedEventBaseResponseBody), + z.object({}).nullable(), +]); + export type PersistPinnedEventRouteRequestBody = z.infer; export const PersistPinnedEventRouteRequestBody = z.object({ eventId: z.string(), @@ -31,11 +43,6 @@ export type PersistPinnedEventRouteRequestBodyInput = z.input< export type PersistPinnedEventRouteResponse = z.infer; export const PersistPinnedEventRouteResponse = z.object({ data: z.object({ - persistPinnedEventOnTimeline: PinnedEvent.merge( - z.object({ - code: z.number().optional(), - message: z.string().optional(), - }) - ), + persistPinnedEventOnTimeline: PersistPinnedEventResponse, }), }); diff --git a/x-pack/plugins/security_solution/common/api/timeline/pinned_events/pinned_events_route.schema.yaml b/x-pack/plugins/security_solution/common/api/timeline/pinned_events/pinned_events_route.schema.yaml index de6ff200257c4..4ef83ebe04183 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/pinned_events/pinned_events_route.schema.yaml +++ b/x-pack/plugins/security_solution/common/api/timeline/pinned_events/pinned_events_route.schema.yaml @@ -52,11 +52,22 @@ paths: required: [persistPinnedEventOnTimeline] properties: persistPinnedEventOnTimeline: - allOf: - - $ref: '../model/components.schema.yaml#/components/schemas/PinnedEvent' - - type: object - properties: - code: - type: number - message: - type: string + $ref: '#/components/schemas/PersistPinnedEventResponse' + +components: + schemas: + PersistPinnedEventResponse: + oneOf: + - allOf: + - $ref: '../model/components.schema.yaml#/components/schemas/PinnedEvent' + - $ref: '#/components/schemas/PinnedEventBaseResponseBody' + - type: object + nullable: true + PinnedEventBaseResponseBody: + type: object + required: [code] + properties: + code: + type: number + message: + type: string diff --git a/x-pack/plugins/security_solution/common/api/timeline/pinned_events/pinned_events_route.ts b/x-pack/plugins/security_solution/common/api/timeline/pinned_events/pinned_events_route.ts index 369cc6cc57089..31c3233e9b8ca 100644 --- a/x-pack/plugins/security_solution/common/api/timeline/pinned_events/pinned_events_route.ts +++ b/x-pack/plugins/security_solution/common/api/timeline/pinned_events/pinned_events_route.ts @@ -5,26 +5,14 @@ * 2.0. */ -/* eslint-disable @typescript-eslint/no-empty-interface */ - import * as runtimeTypes from 'io-ts'; import { unionWithNullType } from '../../../utility_types'; -export const pinnedEventIds = unionWithNullType(runtimeTypes.array(runtimeTypes.string)); -export const persistPinnedEventSchema = runtimeTypes.intersection([ - runtimeTypes.type({ - eventId: runtimeTypes.string, - timelineId: runtimeTypes.string, - }), - runtimeTypes.partial({ - pinnedEventId: unionWithNullType(runtimeTypes.string), - }), -]); - /* - * Note Types + * Pinned Event Types + * TODO: remove these when the timeline types are moved to zod */ -export const BarePinnedEventType = runtimeTypes.intersection([ +const BarePinnedEventType = runtimeTypes.intersection([ runtimeTypes.type({ timelineId: runtimeTypes.string, eventId: runtimeTypes.string, @@ -37,14 +25,6 @@ export const BarePinnedEventType = runtimeTypes.intersection([ }), ]); -export interface BarePinnedEvent extends runtimeTypes.TypeOf {} - -/** - * This type represents a pinned event type stored in a saved object that does not include any fields that reference - * other saved objects. - */ -export type BarePinnedEventWithoutExternalRefs = Omit; - export const PinnedEventRuntimeType = runtimeTypes.intersection([ runtimeTypes.type({ pinnedEventId: runtimeTypes.string, @@ -52,7 +32,3 @@ export const PinnedEventRuntimeType = runtimeTypes.intersection([ }), BarePinnedEventType, ]); - -export interface PinnedEvent extends runtimeTypes.TypeOf {} - -export type PinnedEventResponse = PinnedEvent & { code: number; message?: string }; diff --git a/x-pack/plugins/security_solution/common/api/timeline/routes.ts b/x-pack/plugins/security_solution/common/api/timeline/routes.ts new file mode 100644 index 0000000000000..9d3aec839a5c1 --- /dev/null +++ b/x-pack/plugins/security_solution/common/api/timeline/routes.ts @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { + DeleteTimelinesRequestBody, + DeleteTimelinesResponse, +} from './delete_timelines/delete_timelines_route.gen'; + +export { + PersistNoteRouteRequestBody, + PersistNoteRouteResponse, + ResponseNote, +} from './persist_note/persist_note_route.gen'; +export { DeleteNoteRequestBody, DeleteNoteResponse } from './delete_note/delete_note_route.gen'; + +export { CleanDraftTimelinesRequestBody } from './clean_draft_timelines/clean_draft_timelines_route.gen'; + +export { + ExportTimelinesRequestQuery, + ExportTimelinesRequestBody, +} from './export_timelines/export_timelines_route.gen'; + +export { + PersistFavoriteRouteResponse, + PersistFavoriteRouteRequestBody, +} from './persist_favorite/persist_favorite_route.gen'; + +export { + PersistPinnedEventRouteRequestBody, + PersistPinnedEventResponse, + PersistPinnedEventRouteResponse, +} from './pinned_events/pinned_events_route.gen'; + +export { + GetNotesRequestQuery, + GetNotesResponse, + GetNotesResult, +} from './get_notes/get_notes_route.gen'; diff --git a/x-pack/plugins/security_solution/docs/openapi/ess/security_solution_timeline_api_2023_10_31.bundled.schema.yaml b/x-pack/plugins/security_solution/docs/openapi/ess/security_solution_timeline_api_2023_10_31.bundled.schema.yaml index 5d55fac18c402..b7b63316b421a 100644 --- a/x-pack/plugins/security_solution/docs/openapi/ess/security_solution_timeline_api_2023_10_31.bundled.schema.yaml +++ b/x-pack/plugins/security_solution/docs/openapi/ess/security_solution_timeline_api_2023_10_31.bundled.schema.yaml @@ -29,7 +29,8 @@ paths: type: string required: - noteId - - type: object + - nullable: true + type: object properties: noteIds: items: @@ -60,19 +61,18 @@ paths: parameters: - in: query name: documentIds - required: true schema: $ref: '#/components/schemas/DocumentIds' - in: query name: page schema: nullable: true - type: number + type: string - in: query name: perPage schema: nullable: true - type: number + type: string - in: query name: search schema: @@ -95,6 +95,12 @@ paths: type: string responses: '200': + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/GetNotesResult' + - type: object description: Indicates the requested notes were returned. summary: Get notes tags: @@ -144,18 +150,7 @@ paths: type: object properties: persistNote: - type: object - properties: - code: - type: number - message: - type: string - note: - $ref: '#/components/schemas/Note' - required: - - code - - message - - note + $ref: '#/components/schemas/ResponseNote' required: - persistNote required: @@ -198,14 +193,7 @@ paths: type: object properties: persistPinnedEventOnTimeline: - allOf: - - $ref: '#/components/schemas/PinnedEvent' - - type: object - properties: - code: - type: number - message: - type: string + $ref: '#/components/schemas/PersistPinnedEventResponse' required: - persistPinnedEventOnTimeline required: @@ -1002,8 +990,28 @@ components: nullable: true type: string timelineId: + type: string + updated: + nullable: true + type: number + updatedBy: + nullable: true + type: string + required: + - timelineId + BarePinnedEvent: + type: object + properties: + created: + nullable: true + type: number + createdBy: nullable: true type: string + eventId: + type: string + timelineId: + type: string updated: nullable: true type: number @@ -1011,6 +1019,7 @@ components: nullable: true type: string required: + - eventId - timelineId ColumnHeaderResult: type: object @@ -1184,6 +1193,18 @@ components: type: string script: type: string + GetNotesResult: + type: object + properties: + notes: + items: + $ref: '#/components/schemas/Note' + type: array + totalCount: + type: number + required: + - totalCount + - notes ImportTimelineResult: type: object properties: @@ -1244,34 +1265,37 @@ components: type: string version: type: string + required: + - noteId + - version + PersistPinnedEventResponse: + oneOf: + - allOf: + - $ref: '#/components/schemas/PinnedEvent' + - $ref: '#/components/schemas/PinnedEventBaseResponseBody' + - nullable: true + type: object PinnedEvent: + allOf: + - $ref: '#/components/schemas/BarePinnedEvent' + - type: object + properties: + pinnedEventId: + type: string + version: + type: string + required: + - pinnedEventId + - version + PinnedEventBaseResponseBody: type: object properties: - created: - nullable: true - type: number - createdBy: - nullable: true - type: string - eventId: - type: string - pinnedEventId: - type: string - timelineId: - type: string - updated: - nullable: true + code: type: number - updatedBy: - nullable: true - type: string - version: + message: type: string required: - - eventId - - pinnedEventId - - timelineId - - version + - code QueryMatchResult: type: object properties: @@ -1316,6 +1340,19 @@ components: type: object readable: type: boolean + ResponseNote: + type: object + properties: + code: + type: number + message: + type: string + note: + $ref: '#/components/schemas/Note' + required: + - code + - message + - note RowRendererId: enum: - alert diff --git a/x-pack/plugins/security_solution/docs/openapi/serverless/security_solution_timeline_api_2023_10_31.bundled.schema.yaml b/x-pack/plugins/security_solution/docs/openapi/serverless/security_solution_timeline_api_2023_10_31.bundled.schema.yaml index d8536c1703ed7..ec37c6fe5bf3f 100644 --- a/x-pack/plugins/security_solution/docs/openapi/serverless/security_solution_timeline_api_2023_10_31.bundled.schema.yaml +++ b/x-pack/plugins/security_solution/docs/openapi/serverless/security_solution_timeline_api_2023_10_31.bundled.schema.yaml @@ -29,7 +29,8 @@ paths: type: string required: - noteId - - type: object + - nullable: true + type: object properties: noteIds: items: @@ -60,19 +61,18 @@ paths: parameters: - in: query name: documentIds - required: true schema: $ref: '#/components/schemas/DocumentIds' - in: query name: page schema: nullable: true - type: number + type: string - in: query name: perPage schema: nullable: true - type: number + type: string - in: query name: search schema: @@ -95,6 +95,12 @@ paths: type: string responses: '200': + content: + application/json: + schema: + oneOf: + - $ref: '#/components/schemas/GetNotesResult' + - type: object description: Indicates the requested notes were returned. summary: Get notes tags: @@ -144,18 +150,7 @@ paths: type: object properties: persistNote: - type: object - properties: - code: - type: number - message: - type: string - note: - $ref: '#/components/schemas/Note' - required: - - code - - message - - note + $ref: '#/components/schemas/ResponseNote' required: - persistNote required: @@ -198,14 +193,7 @@ paths: type: object properties: persistPinnedEventOnTimeline: - allOf: - - $ref: '#/components/schemas/PinnedEvent' - - type: object - properties: - code: - type: number - message: - type: string + $ref: '#/components/schemas/PersistPinnedEventResponse' required: - persistPinnedEventOnTimeline required: @@ -1002,8 +990,28 @@ components: nullable: true type: string timelineId: + type: string + updated: + nullable: true + type: number + updatedBy: + nullable: true + type: string + required: + - timelineId + BarePinnedEvent: + type: object + properties: + created: + nullable: true + type: number + createdBy: nullable: true type: string + eventId: + type: string + timelineId: + type: string updated: nullable: true type: number @@ -1011,6 +1019,7 @@ components: nullable: true type: string required: + - eventId - timelineId ColumnHeaderResult: type: object @@ -1184,6 +1193,18 @@ components: type: string script: type: string + GetNotesResult: + type: object + properties: + notes: + items: + $ref: '#/components/schemas/Note' + type: array + totalCount: + type: number + required: + - totalCount + - notes ImportTimelineResult: type: object properties: @@ -1244,34 +1265,37 @@ components: type: string version: type: string + required: + - noteId + - version + PersistPinnedEventResponse: + oneOf: + - allOf: + - $ref: '#/components/schemas/PinnedEvent' + - $ref: '#/components/schemas/PinnedEventBaseResponseBody' + - nullable: true + type: object PinnedEvent: + allOf: + - $ref: '#/components/schemas/BarePinnedEvent' + - type: object + properties: + pinnedEventId: + type: string + version: + type: string + required: + - pinnedEventId + - version + PinnedEventBaseResponseBody: type: object properties: - created: - nullable: true - type: number - createdBy: - nullable: true - type: string - eventId: - type: string - pinnedEventId: - type: string - timelineId: - type: string - updated: - nullable: true + code: type: number - updatedBy: - nullable: true - type: string - version: + message: type: string required: - - eventId - - pinnedEventId - - timelineId - - version + - code QueryMatchResult: type: object properties: @@ -1316,6 +1340,19 @@ components: type: object readable: type: boolean + ResponseNote: + type: object + properties: + code: + type: number + message: + type: string + note: + $ref: '#/components/schemas/Note' + required: + - code + - message + - note RowRendererId: enum: - alert diff --git a/x-pack/plugins/security_solution/public/timelines/containers/api.ts b/x-pack/plugins/security_solution/public/timelines/containers/api.ts index a6e1f448f5191..155d95c5acef2 100644 --- a/x-pack/plugins/security_solution/public/timelines/containers/api.ts +++ b/x-pack/plugins/security_solution/public/timelines/containers/api.ts @@ -17,7 +17,6 @@ import type { TimelineResponse, TimelineErrorResponse, ImportTimelineResultSchema, - ResponseFavoriteTimeline, AllTimelinesResponse, SingleTimelineResponse, SingleTimelineResolveResponse, @@ -29,7 +28,7 @@ import { TimelineErrorResponseType, importTimelineResultSchema, allTimelinesResponse, - responseFavoriteTimeline, + PersistFavoriteRouteResponse, SingleTimelineResponseType, type TimelineType, TimelineTypeEnum, @@ -105,11 +104,8 @@ const decodePrepackedTimelineResponse = (respTimeline?: ImportTimelineResultSche fold(throwErrors(createToasterPlainError), identity) ); -const decodeResponseFavoriteTimeline = (respTimeline?: ResponseFavoriteTimeline) => - pipe( - responseFavoriteTimeline.decode(respTimeline), - fold(throwErrors(createToasterPlainError), identity) - ); +const decodeResponseFavoriteTimeline = (respTimeline?: PersistFavoriteRouteResponse) => + PersistFavoriteRouteResponse.parse(respTimeline); const postTimeline = async ({ timeline, @@ -469,7 +465,7 @@ export const persistFavorite = async ({ return Promise.reject(new Error(`Failed to stringify query: ${JSON.stringify(err)}`)); } - const response = await KibanaServices.get().http.patch( + const response = await KibanaServices.get().http.patch( TIMELINE_FAVORITE_URL, { method: 'PATCH', diff --git a/x-pack/plugins/security_solution/public/timelines/containers/pinned_event/api.ts b/x-pack/plugins/security_solution/public/timelines/containers/pinned_event/api.ts index 8eb149f0f43fb..7df7fb7c62b62 100644 --- a/x-pack/plugins/security_solution/public/timelines/containers/pinned_event/api.ts +++ b/x-pack/plugins/security_solution/public/timelines/containers/pinned_event/api.ts @@ -5,7 +5,7 @@ * 2.0. */ import { PINNED_EVENT_URL } from '../../../../common/constants'; -import type { PinnedEvent } from '../../../../common/api/timeline'; +import type { PersistPinnedEventRouteResponse } from '../../../../common/api/timeline'; import { KibanaServices } from '../../../common/lib/kibana'; export const persistPinnedEvent = async ({ @@ -23,10 +23,13 @@ export const persistPinnedEvent = async ({ } catch (err) { return Promise.reject(new Error(`Failed to stringify query: ${JSON.stringify(err)}`)); } - const response = await KibanaServices.get().http.patch(PINNED_EVENT_URL, { - method: 'PATCH', - body: requestBody, - version: '2023-10-31', - }); + const response = await KibanaServices.get().http.patch( + PINNED_EVENT_URL, + { + method: 'PATCH', + body: requestBody, + version: '2023-10-31', + } + ); return response; }; diff --git a/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_favorite.ts b/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_favorite.ts index 17fd55ee194c1..bf4854e60666b 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_favorite.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_favorite.ts @@ -17,7 +17,7 @@ import { startTimelineSaving, showCallOutUnauthorizedMsg, } from '../actions'; -import type { ResponseFavoriteTimeline } from '../../../../common/api/timeline'; +import type { FavoriteTimelineResponse } from '../../../../common/api/timeline'; import { TimelineTypeEnum } from '../../../../common/api/timeline'; import { persistFavorite } from '../../containers/api'; import { selectTimelineById } from '../selectors'; @@ -49,7 +49,7 @@ export const favoriteTimelineMiddleware: (kibana: CoreStart) => Middleware<{}, S timelineType: timeline.timelineType ?? TimelineTypeEnum.default, }); - const response: ResponseFavoriteTimeline = get('data.persistFavorite', result); + const response: FavoriteTimelineResponse = get('data.persistFavorite', result); if (response.code === 403) { store.dispatch(showCallOutUnauthorizedMsg()); diff --git a/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_pinned_event.ts b/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_pinned_event.ts index c26c458042dad..8461ed3c2fc17 100644 --- a/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_pinned_event.ts +++ b/x-pack/plugins/security_solution/public/timelines/store/middlewares/timeline_pinned_event.ts @@ -5,14 +5,13 @@ * 2.0. */ -import { get, omit } from 'lodash/fp'; +import { omit } from 'lodash/fp'; import type { Action, Middleware } from 'redux'; import type { CoreStart } from '@kbn/core/public'; import type { State } from '../../../common/store/types'; import { selectTimelineById } from '../selectors'; import * as i18n from '../../pages/translations'; -import type { PinnedEventResponse } from '../../../../common/api/timeline'; import { pinEvent, endTimelineSaving, @@ -65,17 +64,17 @@ export const addPinnedEventToTimelineMiddleware: (kibana: CoreStart) => Middlewa timelineId: timeline.savedObjectId, }); - const response: PinnedEventResponse = get('data.persistPinnedEventOnTimeline', result); - if (response && response.code === 403) { + const response = result.data.persistPinnedEventOnTimeline; + if (response && 'code' in response && response.code === 403) { store.dispatch(showCallOutUnauthorizedMsg()); } refreshTimelines(store.getState()); const currentTimeline = selectTimelineById(store.getState(), action.payload.id); - // The response is null in case we unpinned an event. + // The response is null or empty in case we unpinned an event. // In that case we want to remove the locally pinned event. - if (!response) { + if (!response || !('code' in response)) { return store.dispatch( updateTimeline({ id: action.payload.id, diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/draft_timelines/clean_draft_timelines/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/draft_timelines/clean_draft_timelines/index.ts index f8b9ad8392982..387720b4a3b4f 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/draft_timelines/clean_draft_timelines/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/draft_timelines/clean_draft_timelines/index.ts @@ -7,13 +7,13 @@ import { v4 as uuidv4 } from 'uuid'; import { transformError } from '@kbn/securitysolution-es-utils'; +import { buildRouteValidationWithZod } from '@kbn/zod-helpers'; import type { SecuritySolutionPluginRouter } from '../../../../../types'; import type { ConfigType } from '../../../../..'; import { buildSiemResponse } from '../../../../detection_engine/routes/utils'; import { TIMELINE_DRAFT_URL } from '../../../../../../common/constants'; import { buildFrameworkRequest } from '../../../utils/common'; -import { buildRouteValidationWithExcess } from '../../../../../utils/build_validation/route_validation'; import { getDraftTimeline, resetTimeline, @@ -21,7 +21,10 @@ import { persistTimeline, } from '../../../saved_object/timelines'; import { draftTimelineDefaults } from '../../../utils/default_timeline'; -import { cleanDraftTimelineSchema, TimelineTypeEnum } from '../../../../../../common/api/timeline'; +import { + CleanDraftTimelinesRequestBody, + TimelineTypeEnum, +} from '../../../../../../common/api/timeline'; export const cleanDraftTimelinesRoute = (router: SecuritySolutionPluginRouter, _: ConfigType) => { router.versioned @@ -35,7 +38,7 @@ export const cleanDraftTimelinesRoute = (router: SecuritySolutionPluginRouter, _ .addVersion( { validate: { - request: { body: buildRouteValidationWithExcess(cleanDraftTimelineSchema) }, + request: { body: buildRouteValidationWithZod(CleanDraftTimelinesRequestBody) }, }, version: '2023-10-31', }, diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/delete_note.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/delete_note.ts index 318d8950bc619..92be926453403 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/delete_note.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/delete_note.ts @@ -6,17 +6,17 @@ */ import { transformError } from '@kbn/securitysolution-es-utils'; +import { buildRouteValidationWithZod } from '@kbn/zod-helpers'; import type { SecuritySolutionPluginRouter } from '../../../../types'; import { NOTE_URL } from '../../../../../common/constants'; -import { buildRouteValidationWithExcess } from '../../../../utils/build_validation/route_validation'; import type { ConfigType } from '../../../..'; import { buildSiemResponse } from '../../../detection_engine/routes/utils'; import { buildFrameworkRequest } from '../../utils/common'; -import { deleteNoteSchema } from '../../../../../common/api/timeline'; +import { DeleteNoteRequestBody, type DeleteNoteResponse } from '../../../../../common/api/timeline'; import { deleteNote } from '../../saved_object/notes'; export const deleteNoteRoute = (router: SecuritySolutionPluginRouter, config: ConfigType) => { @@ -31,7 +31,7 @@ export const deleteNoteRoute = (router: SecuritySolutionPluginRouter, config: Co .addVersion( { validate: { - request: { body: buildRouteValidationWithExcess(deleteNoteSchema) }, + request: { body: buildRouteValidationWithZod(DeleteNoteRequestBody) }, }, version: '2023-10-31', }, @@ -40,27 +40,25 @@ export const deleteNoteRoute = (router: SecuritySolutionPluginRouter, config: Co try { const frameworkRequest = await buildFrameworkRequest(context, request); - const noteId = request.body?.noteId ?? ''; - const noteIds = request.body?.noteIds ?? null; - if (noteIds != null) { - await deleteNote({ - request: frameworkRequest, - noteIds, - }); + if (!request.body) { + throw new Error('Missing request body'); + } + let noteIds: string[] = []; + if ('noteId' in request.body) { + noteIds = [request.body.noteId]; + } else if ('noteIds' in request.body && Array.isArray(request.body.noteIds)) { + noteIds = request.body.noteIds; + } - return response.ok({ - body: { data: {} }, - }); - } else { - await deleteNote({ - request: frameworkRequest, - noteIds: [noteId], - }); + await deleteNote({ + request: frameworkRequest, + noteIds, + }); - return response.ok({ - body: { data: {} }, - }); - } + const body: DeleteNoteResponse = { data: {} }; + return response.ok({ + body, + }); } catch (err) { const error = transformError(err); return siemResponse.error({ diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/get_notes.test.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/get_notes.test.ts index db62235ea592f..30ae41c1da820 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/get_notes.test.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/get_notes.test.ts @@ -13,10 +13,10 @@ import { requestMock, } from '../../../detection_engine/routes/__mocks__'; import { NOTE_URL } from '../../../../../common/constants'; -import type { getNotesSchema } from '../../../../../common/api/timeline'; +import type { GetNotesRequestQuery } from '../../../../../common/api/timeline'; import { mockGetCurrentUser } from '../../__mocks__/import_timelines'; -const getAllNotesRequest = (query?: typeof getNotesSchema) => +const getAllNotesRequest = (query?: GetNotesRequestQuery) => requestMock.create({ method: 'get', path: NOTE_URL, diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/get_notes.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/get_notes.ts index 8e8a88a4a6aa9..9cc8435d6aae0 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/get_notes.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/get_notes.ts @@ -7,6 +7,7 @@ import { transformError } from '@kbn/securitysolution-es-utils'; import type { SortOrder } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import { buildRouteValidationWithZod } from '@kbn/zod-helpers'; import type { SecuritySolutionPluginRouter } from '../../../../types'; import { NOTE_URL } from '../../../../../common/constants'; @@ -14,10 +15,9 @@ import type { ConfigType } from '../../../..'; import { buildSiemResponse } from '../../../detection_engine/routes/utils'; import { buildFrameworkRequest } from '../../utils/common'; -import { getNotesSchema } from '../../../../../common/api/timeline'; -import { buildRouteValidationWithExcess } from '../../../../utils/build_validation/route_validation'; import { getAllSavedNote, MAX_UNASSOCIATED_NOTES } from '../../saved_object/notes'; import { noteSavedObjectType } from '../../saved_object_mappings/notes'; +import { GetNotesRequestQuery, type GetNotesResponse } from '../../../../../common/api/timeline'; export const getNotesRoute = (router: SecuritySolutionPluginRouter, _: ConfigType) => { router.versioned @@ -31,7 +31,7 @@ export const getNotesRoute = (router: SecuritySolutionPluginRouter, _: ConfigTyp .addVersion( { validate: { - request: { query: buildRouteValidationWithExcess(getNotesSchema) }, + request: { query: buildRouteValidationWithZod(GetNotesRequestQuery) }, }, version: '2023-10-31', }, @@ -50,8 +50,8 @@ export const getNotesRoute = (router: SecuritySolutionPluginRouter, _: ConfigTyp perPage: MAX_UNASSOCIATED_NOTES, }; const res = await getAllSavedNote(frameworkRequest, options); - - return response.ok({ body: res ?? {} }); + const body: GetNotesResponse = res ?? {}; + return response.ok({ body }); } else { const options = { type: noteSavedObjectType, @@ -60,8 +60,8 @@ export const getNotesRoute = (router: SecuritySolutionPluginRouter, _: ConfigTyp perPage: MAX_UNASSOCIATED_NOTES, }; const res = await getAllSavedNote(frameworkRequest, options); - - return response.ok({ body: res ?? {} }); + const body: GetNotesResponse = res ?? {}; + return response.ok({ body }); } } else { const perPage = queryParams?.perPage ? parseInt(queryParams.perPage, 10) : 10; @@ -80,7 +80,8 @@ export const getNotesRoute = (router: SecuritySolutionPluginRouter, _: ConfigTyp filter, }; const res = await getAllSavedNote(frameworkRequest, options); - return response.ok({ body: res ?? {} }); + const body: GetNotesResponse = res ?? {}; + return response.ok({ body }); } } catch (err) { const error = transformError(err); diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/persist_note.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/persist_note.ts index 1bd91306a7419..7ee0dc886a787 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/persist_note.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/notes/persist_note.ts @@ -6,17 +6,20 @@ */ import { transformError } from '@kbn/securitysolution-es-utils'; +import { buildRouteValidationWithZod } from '@kbn/zod-helpers'; import type { SecuritySolutionPluginRouter } from '../../../../types'; import { NOTE_URL } from '../../../../../common/constants'; -import { buildRouteValidation } from '../../../../utils/build_validation/route_validation'; import type { ConfigType } from '../../../..'; import { buildSiemResponse } from '../../../detection_engine/routes/utils'; import { buildFrameworkRequest } from '../../utils/common'; -import { persistNoteWithoutRefSchema } from '../../../../../common/api/timeline'; +import { + PersistNoteRouteRequestBody, + type PersistNoteRouteResponse, +} from '../../../../../common/api/timeline'; import { persistNote } from '../../saved_object/notes'; export const persistNoteRoute = (router: SecuritySolutionPluginRouter, _: ConfigType) => { @@ -31,7 +34,7 @@ export const persistNoteRoute = (router: SecuritySolutionPluginRouter, _: Config .addVersion( { validate: { - request: { body: buildRouteValidation(persistNoteWithoutRefSchema) }, + request: { body: buildRouteValidationWithZod(PersistNoteRouteRequestBody) }, }, version: '2023-10-31', }, @@ -49,9 +52,10 @@ export const persistNoteRoute = (router: SecuritySolutionPluginRouter, _: Config note, overrideOwner: true, }); + const body: PersistNoteRouteResponse = { data: { persistNote: res } }; return response.ok({ - body: { data: { persistNote: res } }, + body, }); } catch (err) { const error = transformError(err); diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/pinned_events/persist_pinned_event.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/pinned_events/persist_pinned_event.ts index a5739c49a34ea..c1e245cda40fb 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/pinned_events/persist_pinned_event.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/pinned_events/persist_pinned_event.ts @@ -6,17 +6,21 @@ */ import { transformError } from '@kbn/securitysolution-es-utils'; +import { buildRouteValidationWithZod } from '@kbn/zod-helpers'; + import type { SecuritySolutionPluginRouter } from '../../../../types'; import { PINNED_EVENT_URL } from '../../../../../common/constants'; -import { buildRouteValidationWithExcess } from '../../../../utils/build_validation/route_validation'; import type { ConfigType } from '../../../..'; import { buildSiemResponse } from '../../../detection_engine/routes/utils'; import { buildFrameworkRequest } from '../../utils/common'; -import { persistPinnedEventSchema } from '../../../../../common/api/timeline'; +import { + type PersistPinnedEventRouteResponse, + PersistPinnedEventRouteRequestBody, +} from '../../../../../common/api/timeline'; import { persistPinnedEventOnTimeline } from '../../saved_object/pinned_events'; export const persistPinnedEventRoute = ( @@ -34,7 +38,7 @@ export const persistPinnedEventRoute = ( .addVersion( { validate: { - request: { body: buildRouteValidationWithExcess(persistPinnedEventSchema) }, + request: { body: buildRouteValidationWithZod(PersistPinnedEventRouteRequestBody) }, }, version: '2023-10-31', }, @@ -54,8 +58,12 @@ export const persistPinnedEventRoute = ( timelineId ); + const body: PersistPinnedEventRouteResponse = { + data: { persistPinnedEventOnTimeline: res }, + }; + return response.ok({ - body: { data: { persistPinnedEventOnTimeline: res } }, + body, }); } catch (err) { const error = transformError(err); diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/delete_timelines/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/delete_timelines/index.ts index 7f6339ee25929..a11b16c96fb1f 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/delete_timelines/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/delete_timelines/index.ts @@ -6,9 +6,12 @@ */ import { transformError } from '@kbn/securitysolution-es-utils'; -import { buildRouteValidationWithExcess } from '../../../../../utils/build_validation/route_validation'; +import { buildRouteValidationWithZod } from '@kbn/zod-helpers'; import type { ConfigType } from '../../../../..'; -import { deleteTimelinesSchema } from '../../../../../../common/api/timeline'; +import { + DeleteTimelinesRequestBody, + type DeleteTimelinesResponse, +} from '../../../../../../common/api/timeline'; import type { SecuritySolutionPluginRouter } from '../../../../../types'; import { TIMELINE_URL } from '../../../../../../common/constants'; import { buildSiemResponse } from '../../../../detection_engine/routes/utils'; @@ -29,7 +32,7 @@ export const deleteTimelinesRoute = (router: SecuritySolutionPluginRouter, confi { version: '2023-10-31', validate: { - request: { body: buildRouteValidationWithExcess(deleteTimelinesSchema) }, + request: { body: buildRouteValidationWithZod(DeleteTimelinesRequestBody) }, }, }, async (context, request, response) => { @@ -40,7 +43,8 @@ export const deleteTimelinesRoute = (router: SecuritySolutionPluginRouter, confi const { savedObjectIds, searchIds } = request.body; await deleteTimeline(frameworkRequest, savedObjectIds, searchIds); - return response.ok({ body: { data: { deleteTimeline: true } } }); + const body: DeleteTimelinesResponse = { data: { deleteTimeline: true } }; + return response.ok({ body }); } catch (err) { const error = transformError(err); return siemResponse.error({ diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/export_timelines/index.test.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/export_timelines/index.test.ts index 13b6e0f68fefc..ade95ba75c837 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/export_timelines/index.test.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/export_timelines/index.test.ts @@ -93,9 +93,7 @@ describe('export timelines', () => { }); const result = server.validate(request); - expect(result.badRequest.mock.calls[0][0]).toEqual( - 'Invalid value {"id":"someId"}, excess properties: ["id"]' - ); + expect(result.badRequest.mock.calls[0][0]).toEqual('file_name: Required'); }); test('return validation error for request params', async () => { @@ -107,9 +105,7 @@ describe('export timelines', () => { }); const result = server.validate(request); - expect(result.badRequest.mock.calls[0][0]).toEqual( - 'Invalid value "someId" supplied to "ids"' - ); + expect(result.badRequest.mock.calls[0][0]).toEqual('ids: Expected array, received string'); }); }); }); diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/export_timelines/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/export_timelines/index.ts index 7af6b7be0cdd0..163b212840423 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/export_timelines/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/export_timelines/index.ts @@ -6,16 +6,16 @@ */ import { transformError } from '@kbn/securitysolution-es-utils'; +import { buildRouteValidationWithZod } from '@kbn/zod-helpers'; import { TIMELINE_EXPORT_URL } from '../../../../../../common/constants'; import type { SecuritySolutionPluginRouter } from '../../../../../types'; import type { ConfigType } from '../../../../../config'; import { buildSiemResponse } from '../../../../detection_engine/routes/utils'; import { - exportTimelinesQuerySchema, - exportTimelinesRequestBodySchema, + ExportTimelinesRequestQuery, + ExportTimelinesRequestBody, } from '../../../../../../common/api/timeline'; -import { buildRouteValidationWithExcess } from '../../../../../utils/build_validation/route_validation'; import { buildFrameworkRequest } from '../../../utils/common'; import { getExportTimelineByObjectIds } from './helpers'; @@ -35,8 +35,8 @@ export const exportTimelinesRoute = (router: SecuritySolutionPluginRouter, confi { validate: { request: { - query: buildRouteValidationWithExcess(exportTimelinesQuerySchema), - body: buildRouteValidationWithExcess(exportTimelinesRequestBodySchema), + query: buildRouteValidationWithZod(ExportTimelinesRequestQuery), + body: buildRouteValidationWithZod(ExportTimelinesRequestBody), }, }, version: '2023-10-31', diff --git a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/persist_favorite/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/persist_favorite/index.ts index f53acf25803a8..b8416b9ffe7bc 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/persist_favorite/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/routes/timelines/persist_favorite/index.ts @@ -6,18 +6,22 @@ */ import { transformError } from '@kbn/securitysolution-es-utils'; +import { buildRouteValidationWithZod } from '@kbn/zod-helpers'; import type { SecuritySolutionPluginRouter } from '../../../../../types'; import { TIMELINE_FAVORITE_URL } from '../../../../../../common/constants'; -import { buildRouteValidationWithExcess } from '../../../../../utils/build_validation/route_validation'; import type { ConfigType } from '../../../../..'; import { buildSiemResponse } from '../../../../detection_engine/routes/utils'; import { buildFrameworkRequest } from '../../../utils/common'; import { persistFavorite } from '../../../saved_object/timelines'; -import { TimelineTypeEnum, persistFavoriteSchema } from '../../../../../../common/api/timeline'; +import { + type PersistFavoriteRouteResponse, + PersistFavoriteRouteRequestBody, + TimelineTypeEnum, +} from '../../../../../../common/api/timeline'; export const persistFavoriteRoute = (router: SecuritySolutionPluginRouter, _: ConfigType) => { router.versioned @@ -32,7 +36,7 @@ export const persistFavoriteRoute = (router: SecuritySolutionPluginRouter, _: Co { version: '2023-10-31', validate: { - request: { body: buildRouteValidationWithExcess(persistFavoriteSchema) }, + request: { body: buildRouteValidationWithZod(PersistFavoriteRouteRequestBody) }, }, }, async (context, request, response) => { @@ -51,12 +55,14 @@ export const persistFavoriteRoute = (router: SecuritySolutionPluginRouter, _: Co timelineType || TimelineTypeEnum.default ); - return response.ok({ - body: { - data: { - persistFavorite: timeline, - }, + const body: PersistFavoriteRouteResponse = { + data: { + persistFavorite: timeline, }, + }; + + return response.ok({ + body, }); } catch (err) { const error = transformError(err); diff --git a/x-pack/plugins/security_solution/server/lib/timeline/saved_object/notes/saved_object.ts b/x-pack/plugins/security_solution/server/lib/timeline/saved_object/notes/saved_object.ts index ff277a4bea9e0..300903f8b22ee 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/saved_object/notes/saved_object.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/saved_object/notes/saved_object.ts @@ -22,6 +22,7 @@ import type { BareNote, BareNoteWithoutExternalRefs, ResponseNote, + GetNotesResult, } from '../../../../../common/api/timeline'; import { SavedObjectNoteRuntimeType } from '../../../../../common/types/timeline/note/saved_object'; import type { SavedObjectNoteWithoutExternalRefs } from '../../../../../common/types/timeline/note/saved_object'; @@ -133,7 +134,7 @@ export const createNote = async ({ noteId: string | null; note: BareNote | BareNoteWithoutExternalRefs; overrideOwner?: boolean; -}) => { +}): Promise => { const savedObjectsClient = (await request.context.core).savedObjects.client; const userInfo = request.user; @@ -201,7 +202,7 @@ export const updateNote = async ({ noteId: string; note: BareNote | BareNoteWithoutExternalRefs; overrideOwner?: boolean; -}) => { +}): Promise => { const savedObjectsClient = (await request.context.core).savedObjects.client; const userInfo = request.user; @@ -261,7 +262,7 @@ const getSavedNote = async (request: FrameworkRequest, NoteId: string) => { export const getAllSavedNote = async ( request: FrameworkRequest, options: SavedObjectsFindOptions -) => { +): Promise => { const savedObjectsClient = (await request.context.core).savedObjects.client; const savedObjects = await savedObjectsClient.find(options); diff --git a/x-pack/plugins/security_solution/server/lib/timeline/saved_object/pinned_events/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/saved_object/pinned_events/index.ts index 4cb37fd6d6d89..5181a099ae7fb 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/saved_object/pinned_events/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/saved_object/pinned_events/index.ts @@ -17,8 +17,7 @@ import { UNAUTHENTICATED_USER } from '../../../../../common/constants'; import type { BarePinnedEvent, PinnedEvent, - PinnedEventResponse, - BarePinnedEventWithoutExternalRefs, + PersistPinnedEventResponse, } from '../../../../../common/api/timeline'; import { SavedObjectPinnedEventRuntimeType } from '../../../../../common/types/timeline/pinned_event/saved_object'; import type { SavedObjectPinnedEventWithoutExternalRefs } from '../../../../../common/types/timeline/pinned_event/saved_object'; @@ -77,7 +76,7 @@ export const persistPinnedEventOnTimeline = async ( pinnedEventId: string | null, // pinned event saved object id eventId: string, timelineId: string -): Promise => { +): Promise => { try { if (pinnedEventId != null) { // Delete Pinned Event on Timeline @@ -111,9 +110,6 @@ export const persistPinnedEventOnTimeline = async ( code: 403, message: err.message, pinnedEventId: eventId, - timelineId: '', - version: '', - eventId: '', } : null; } @@ -140,7 +136,7 @@ const createPinnedEvent = async ({ request: FrameworkRequest; eventId: string; timelineId: string; -}): Promise => { +}): Promise => { const savedObjectsClient = (await request.context.core).savedObjects.client; const savedPinnedEvent: BarePinnedEvent = { @@ -151,7 +147,7 @@ const createPinnedEvent = async ({ const pinnedEventWithCreator = pickSavedPinnedEvent(null, savedPinnedEvent, request.user); const { transformedFields: migratedAttributes, references } = - pinnedEventFieldsMigrator.extractFieldsToReferences({ + pinnedEventFieldsMigrator.extractFieldsToReferences>({ data: pinnedEventWithCreator, }); diff --git a/x-pack/plugins/security_solution/server/lib/timeline/saved_object/timelines/index.ts b/x-pack/plugins/security_solution/server/lib/timeline/saved_object/timelines/index.ts index 71d61c22ab33c..08eeda3d8ab56 100644 --- a/x-pack/plugins/security_solution/server/lib/timeline/saved_object/timelines/index.ts +++ b/x-pack/plugins/security_solution/server/lib/timeline/saved_object/timelines/index.ts @@ -23,7 +23,7 @@ import type { ExportTimelineNotFoundError, PageInfoTimeline, ResponseTimelines, - ResponseFavoriteTimeline, + FavoriteTimelineResponse, ResponseTimeline, SortTimeline, TimelineResult, @@ -312,7 +312,7 @@ export const persistFavorite = async ( templateTimelineId: string | null, templateTimelineVersion: number | null, timelineType: TimelineType -): Promise => { +): Promise => { const userName = request.user?.username ?? UNAUTHENTICATED_USER; const fullName = request.user?.full_name ?? ''; try { diff --git a/x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/trial_license_complete_tier/pinned_events.ts b/x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/trial_license_complete_tier/pinned_events.ts index 9273a5d6c6a5e..9506e7345a00e 100644 --- a/x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/trial_license_complete_tier/pinned_events.ts +++ b/x-pack/test/security_solution_api_integration/test_suites/investigation/saved_objects/trial_license_complete_tier/pinned_events.ts @@ -39,7 +39,7 @@ export default function ({ getService }: FtrProviderContext) { }); describe('Unpinned an event', () => { - it('return null', async () => { + it('returns null', async () => { const response = await supertest .patch('/api/pinned_event') .set('elastic-api-version', '2023-10-31') From b78b6337970b2e7332266cd0e181e14d26c3ed45 Mon Sep 17 00:00:00 2001 From: Nikita Indik Date: Tue, 24 Sep 2024 10:04:38 +0200 Subject: [PATCH 25/41] [Security Solution] ThreeWayDiff UI: Add remaining field components for `FieldReadOnly` (#193261) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit **Partially addresses: https://github.com/elastic/kibana/issues/171520** **Is a follow-up PR to: https://github.com/elastic/kibana/pull/192342** This is the 3rd of the 3 PRs for `FieldReadOnly`. - The 1st [PR](https://github.com/elastic/kibana/pull/191499) added the `FieldReadOnly` and a bunch of field components. - The 2nd [PR](https://github.com/elastic/kibana/pull/192342) moved away from using `DiffableAllFields` type in favour of `DiffableRule` and split the large `FieldReadOnly` component into smaller ones for readability. - This (3rd) PR adds the remaining field components. ## Summary This PR adds field components for `FieldReadOnly`. Field components display a read-only view of a particular `DiffableRule` field, similar to how fields are shown on the Rule Details page. `FieldReadOnly` and field components will be displayed in the right side of the new Diff tab of the Upgrade flyout (see it on the [Miro board](https://miro.com/app/board/uXjVK0gqjjQ=/?moveToWidget=3458764594148126123&cot=14)). They will let the user see how an upgraded version of a rule will look like in a user-friendly way. ### Running `FinalReadOnly` and its field components are not yet integrated into the flyout, but you can view components in Storybook. 1. Run Storybook: `yarn storybook security_solution` 2. Go to `http://localhost:9001` in browser. Scherm­afbeelding 2024-09-03 om 13 05 11 --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Maxim Palenov --- .../rule_details/json_diff/json_diff.test.tsx | 2 +- .../rule_details/rule_about_section.tsx | 20 ++--- .../rule_details/rule_definition_section.tsx | 18 ++--- .../rule_details/rule_schedule_section.tsx | 25 ++++-- .../common_rule_field_readonly.tsx | 50 ++++++++---- .../custom_query_rule_field_readonly.tsx | 14 +++- .../eql_rule_field_readonly.tsx | 27 ++++++- .../esql_rule_field_readonly.tsx | 14 +++- .../alert_suppression.stories.tsx | 44 ++++++++++ .../alert_suppression/alert_suppression.tsx | 81 +++++++++++++++++++ .../anomaly_threshold.stories.tsx | 35 ++++++++ .../anomaly_threshold/anomaly_threshold.tsx | 29 +++++++ .../fields/author/author.stories.tsx | 34 ++++++++ .../final_readonly/fields/author/author.tsx | 29 +++++++ .../building_block/building_block.stories.tsx | 36 +++++++++ .../fields/building_block/building_block.tsx | 24 ++++++ .../data_source/data_source.stories.tsx | 6 +- .../fields/eql_query/eql_query.stories.tsx | 8 +- .../event_category_override.stories.tsx | 37 +++++++++ .../event_category_override.tsx | 42 ++++++++++ .../false_positives.stories.tsx | 37 +++++++++ .../false_positives/false_positives.tsx | 29 +++++++ .../history_window_start.stories.tsx | 37 +++++++++ .../history_window_start.tsx | 31 +++++++ .../investigation_fields.stories.tsx | 39 +++++++++ .../investigation_fields.tsx | 37 +++++++++ .../fields/kql_query/kql_query.stories.tsx | 14 ++-- .../fields/license/license.stories.tsx | 34 ++++++++ .../final_readonly/fields/license/license.tsx | 29 +++++++ .../max_signals/max_signals.stories.tsx | 34 ++++++++ .../fields/max_signals/max_signals.tsx | 29 +++++++ .../new_terms_fields.stories.tsx | 35 ++++++++ .../new_terms_fields/new_terms_fields.tsx | 29 +++++++ .../fields/note/note.stories.tsx | 34 ++++++++ .../final_readonly/fields/note/note.tsx | 37 +++++++++ .../fields/note/translations.ts | 15 ++++ .../fields/references/references.stories.tsx | 38 +++++++++ .../fields/references/references.tsx | 29 +++++++ .../fields/risk_score/risk_score.stories.tsx | 34 ++++++++ .../fields/risk_score/risk_score.tsx | 29 +++++++ .../rule_name_override.stories.tsx | 39 +++++++++ .../rule_name_override/rule_name_override.tsx | 33 ++++++++ .../rule_schedule/rule_schedule.stories.tsx | 37 +++++++++ .../fields/rule_schedule/rule_schedule.tsx | 38 +++++++++ .../fields/setup/setup.stories.tsx | 35 ++++++++ .../final_readonly/fields/setup/setup.tsx | 37 +++++++++ .../fields/severity/severity.stories.tsx | 34 ++++++++ .../fields/severity/severity.tsx | 29 +++++++ .../threat_language.stories.tsx | 34 ++++++++ .../threat_language/threat_language.tsx | 33 ++++++++ .../threat_query/threat_query.stories.tsx | 8 +- .../fields/threshold/threshold.stories.tsx | 38 +++++++++ .../fields/threshold/threshold.tsx | 29 +++++++ .../tiebreaker_field.stories.tsx | 35 ++++++++ .../tiebreaker_field/tiebreaker_field.tsx | 40 +++++++++ .../timeline_template.stories.tsx | 38 +++++++++ .../timeline_template/timeline_template.tsx | 33 ++++++++ .../timestamp_field.stories.tsx | 34 ++++++++ .../timestamp_field/timestamp_field.tsx | 40 +++++++++ .../timestamp_override.stories.tsx | 40 +++++++++ .../timestamp_override/timestamp_override.tsx | 33 ++++++++ .../fields/type/type.stories.tsx | 34 ++++++++ .../final_readonly/fields/type/type.tsx | 29 +++++++ .../machine_learning_rule_field_readonly.tsx | 17 +++- .../new_terms_rule_field_readonly.tsx | 22 ++++- .../saved_query_rule_field_readonly.tsx | 14 +++- .../final_readonly/storybook/mocks.ts | 48 +++++++++++ .../three_way_diff_storybook_providers.tsx | 19 ++++- .../threat_match_rule_field_readonly.tsx | 17 +++- .../threshold_rule_field_readonly.tsx | 17 +++- .../pages/detection_engine/rules/helpers.tsx | 28 ++++--- 71 files changed, 2079 insertions(+), 88 deletions(-) create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/alert_suppression/alert_suppression.stories.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/alert_suppression/alert_suppression.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/anomaly_threshold/anomaly_threshold.stories.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/anomaly_threshold/anomaly_threshold.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/author/author.stories.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/author/author.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/building_block/building_block.stories.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/building_block/building_block.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/event_category_override/event_category_override.stories.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/event_category_override/event_category_override.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/false_positives/false_positives.stories.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/false_positives/false_positives.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/history_window_start/history_window_start.stories.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/history_window_start/history_window_start.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/investigation_fields/investigation_fields.stories.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/investigation_fields/investigation_fields.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/license/license.stories.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/license/license.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/max_signals/max_signals.stories.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/max_signals/max_signals.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/new_terms_fields/new_terms_fields.stories.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/new_terms_fields/new_terms_fields.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/note/note.stories.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/note/note.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/note/translations.ts create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/references/references.stories.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/references/references.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/risk_score/risk_score.stories.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/risk_score/risk_score.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/rule_name_override/rule_name_override.stories.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/rule_name_override/rule_name_override.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/rule_schedule/rule_schedule.stories.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/rule_schedule/rule_schedule.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/setup/setup.stories.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/setup/setup.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/severity/severity.stories.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/severity/severity.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/threat_language/threat_language.stories.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/threat_language/threat_language.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/threshold/threshold.stories.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/threshold/threshold.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/tiebreaker_field/tiebreaker_field.stories.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/tiebreaker_field/tiebreaker_field.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/timeline_template/timeline_template.stories.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/timeline_template/timeline_template.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/timestamp_field/timestamp_field.stories.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/timestamp_field/timestamp_field.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/timestamp_override/timestamp_override.stories.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/timestamp_override/timestamp_override.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/type/type.stories.tsx create mode 100644 x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/three_way_diff/final_readonly/fields/type/type.tsx diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/json_diff/json_diff.test.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/json_diff/json_diff.test.tsx index 8e9c465d265b8..2a769e4be87d4 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/json_diff/json_diff.test.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/json_diff/json_diff.test.tsx @@ -19,7 +19,7 @@ import { COLORS } from './constants'; /* Finds an element with a text content that exactly matches the passed argument. - Handly because React Testing Library's doesn't provide an easy way to search by + Handy because React Testing Library's doesn't provide an easy way to search by text if the text is split into multiple DOM elements. */ function findChildByTextContent(parent: Element, textContent: string): HTMLElement { diff --git a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_about_section.tsx b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_about_section.tsx index 1d2e93df8e7f7..396811892610b 100644 --- a/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_about_section.tsx +++ b/x-pack/plugins/security_solution/public/detection_engine/rule_management/components/rule_details/rule_about_section.tsx @@ -72,11 +72,11 @@ interface AuthorProps { author: string[]; } -const Author = ({ author }: AuthorProps) => ( +export const Author = ({ author }: AuthorProps) => ( ); -const BuildingBlock = () => ( +export const BuildingBlock = () => ( {i18n.BUILDING_BLOCK_FIELD_DESCRIPTION} @@ -124,7 +124,7 @@ interface RiskScoreProps { riskScore: number; } -const RiskScore = ({ riskScore }: RiskScoreProps) => ( +export const RiskScore = ({ riskScore }: RiskScoreProps) => ( {riskScore} @@ -157,7 +157,7 @@ interface ReferencesProps { references: string[]; } -const References = ({ references }: ReferencesProps) => ( +export const References = ({ references }: ReferencesProps) => (