diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index fa2a580b4ae83..2667ec4adf24d 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -314,6 +314,7 @@ src/plugins/dev_tools @elastic/platform-deployment-management packages/kbn-dev-utils @elastic/kibana-operations examples/developer_examples @elastic/appex-sharedux x-pack/plugins/discover_enhanced @elastic/kibana-data-discovery +examples/discover_extender @elastic/kibana-data-discovery src/plugins/discover @elastic/kibana-data-discovery packages/kbn-doc-links @elastic/kibana-docs packages/kbn-docs-utils @elastic/kibana-operations diff --git a/.github/ISSUE_TEMPLATE/v8_breaking_change.md b/.github/ISSUE_TEMPLATE/v8_breaking_change.md deleted file mode 100644 index 8ef570947dd41..0000000000000 --- a/.github/ISSUE_TEMPLATE/v8_breaking_change.md +++ /dev/null @@ -1,60 +0,0 @@ ---- -name: 8.0 Breaking change -about: Breaking changes from 7.x -> 8.0 -title: "[Breaking change]" -labels: Feature:Upgrade Assistant, Breaking Change -assignees: '' - ---- - - - -## Change description - -**Which release will ship the breaking change?** - -8.0 - -**Is this a Kibana or Elasticsearch breaking change?** - - - -**Describe the change. How will it manifest to users?** - -**How many users will be affected?** - - - - -**Are there any edge cases?** - -**[For Kibana deprecations] Can the change be registered with the [Kibana deprecation service](https://github.com/elastic/kibana/blob/main/docs/development/core/server/kibana-plugin-core-server.deprecationsservicesetup.md)?** - - - - - -**[For Elasticsearch deprecations] Can the Upgrade Assistant make the migration easier for users? Please explain the proposed solution in as much detail as possible.** - - - - -## Test Data - - - -## Cross links - - \ No newline at end of file diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index ff9cb9862e0b6..cf17b62d272f4 100644 --- a/api_docs/actions.mdx +++ b/api_docs/actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/actions title: "actions" image: https://source.unsplash.com/400x175/?github description: API docs for the actions plugin -date: 2023-05-07 +date: 2023-05-09 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 4e4ed223b6388..cebfed3dea4f1 100644 --- a/api_docs/advanced_settings.mdx +++ b/api_docs/advanced_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/advancedSettings title: "advancedSettings" image: https://source.unsplash.com/400x175/?github description: API docs for the advancedSettings plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index 272fd61537d4c..01dcd0b54c9af 100644 --- a/api_docs/aiops.mdx +++ b/api_docs/aiops.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/aiops title: "aiops" image: https://source.unsplash.com/400x175/?github description: API docs for the aiops plugin -date: 2023-05-07 +date: 2023-05-09 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 e054a213dc44a..164b30c906dd9 100644 --- a/api_docs/alerting.mdx +++ b/api_docs/alerting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/alerting title: "alerting" image: https://source.unsplash.com/400x175/?github description: API docs for the alerting plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] --- import alertingObj from './alerting.devdocs.json'; diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index faccc12da0f5a..6b1a991b073ee 100644 --- a/api_docs/apm.mdx +++ b/api_docs/apm.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apm title: "apm" image: https://source.unsplash.com/400x175/?github description: API docs for the apm plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] --- import apmObj from './apm.devdocs.json'; diff --git a/api_docs/asset_manager.mdx b/api_docs/asset_manager.mdx index 35bc93cb3d5a3..10d0bee009c43 100644 --- a/api_docs/asset_manager.mdx +++ b/api_docs/asset_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/assetManager title: "assetManager" image: https://source.unsplash.com/400x175/?github description: API docs for the assetManager plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'assetManager'] --- import assetManagerObj from './asset_manager.devdocs.json'; diff --git a/api_docs/banners.mdx b/api_docs/banners.mdx index 1b7079a6f82eb..b64b86d2fa11b 100644 --- a/api_docs/banners.mdx +++ b/api_docs/banners.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/banners title: "banners" image: https://source.unsplash.com/400x175/?github description: API docs for the banners plugin -date: 2023-05-07 +date: 2023-05-09 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 82947be5b71ba..0e3d989164017 100644 --- a/api_docs/bfetch.mdx +++ b/api_docs/bfetch.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/bfetch title: "bfetch" image: https://source.unsplash.com/400x175/?github description: API docs for the bfetch plugin -date: 2023-05-07 +date: 2023-05-09 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 7bf979eedf05e..e718cfe09f39a 100644 --- a/api_docs/canvas.mdx +++ b/api_docs/canvas.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/canvas title: "canvas" image: https://source.unsplash.com/400x175/?github description: API docs for the canvas plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'canvas'] --- import canvasObj from './canvas.devdocs.json'; diff --git a/api_docs/cases.devdocs.json b/api_docs/cases.devdocs.json index 8829145b060e4..34b95ae1946e8 100644 --- a/api_docs/cases.devdocs.json +++ b/api_docs/cases.devdocs.json @@ -904,23 +904,15 @@ "section": "def-common.CasesFindResponseUI", "text": "CasesFindResponseUI" }, - ">; getCasesStatus: (query: { from?: string | undefined; to?: string | undefined; owner?: string | string[] | undefined; }, signal?: AbortSignal | undefined) => Promise<{ countOpenCases: number; countInProgressCases: number; countClosedCases: number; }>; getCasesMetrics: (query: { features: string[]; } & { from?: string | undefined; to?: string | undefined; owner?: string | string[] | undefined; }, signal?: AbortSignal | undefined) => Promise<{ mttr?: number | null | undefined; }>; bulkGet: (params: ", + ">; getCasesStatus: (query: { from?: string | undefined; to?: string | undefined; owner?: string | string[] | undefined; }, signal?: AbortSignal | undefined) => Promise<{ countOpenCases: number; countInProgressCases: number; countClosedCases: number; }>; getCasesMetrics: (query: { features: string[]; } & { from?: string | undefined; to?: string | undefined; owner?: string | string[] | undefined; }, signal?: AbortSignal | undefined) => Promise<{ mttr?: number | null | undefined; }>; bulkGet: (params: { ids: string[]; }, signal?: AbortSignal | undefined) => Promise<{ cases: { id: string; description: string; title: string; owner: string; version: string; totalComments: number; status: ", { - "pluginId": "cases", - "scope": "common", - "docId": "kibCasesPluginApi", - "section": "def-common.CasesBulkGetRequestCertainFields", - "text": "CasesBulkGetRequestCertainFields" - }, - ", signal?: AbortSignal | undefined) => Promise<", - { - "pluginId": "cases", + "pluginId": "@kbn/cases-components", "scope": "common", - "docId": "kibCasesPluginApi", - "section": "def-common.CasesBulkGetResponseCertainFields", - "text": "CasesBulkGetResponseCertainFields" + "docId": "kibKbnCasesComponentsPluginApi", + "section": "def-common.CaseStatuses", + "text": "CaseStatuses" }, - ">; }; }" + "; created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }; }[]; errors: { error: string; message: string; status: number | undefined; caseId: string; }[]; }>; }; }" ], "path": "x-pack/plugins/cases/public/types.ts", "deprecated": false, @@ -2009,13 +2001,13 @@ }, { "parentPluginId": "cases", - "id": "def-common.CasesBulkGetRequestCertainFields", + "id": "def-common.CasesBulkGetRequest", "type": "Type", "tags": [], - "label": "CasesBulkGetRequestCertainFields", + "label": "CasesBulkGetRequest", "description": [], "signature": [ - "Omit<{ ids: string[]; } & { fields?: string | string[] | undefined; }, \"fields\"> & { fields?: Field[] | undefined; }" + "{ ids: string[]; }" ], "path": "x-pack/plugins/cases/common/api/cases/case.ts", "deprecated": false, @@ -2024,125 +2016,13 @@ }, { "parentPluginId": "cases", - "id": "def-common.CasesBulkGetResponseCertainFields", + "id": "def-common.CasesBulkGetResponse", "type": "Type", "tags": [], - "label": "CasesBulkGetResponseCertainFields", + "label": "CasesBulkGetResponse", "description": [], "signature": [ - "Omit<{ cases: ({ description: string; status: ", - { - "pluginId": "@kbn/cases-components", - "scope": "common", - "docId": "kibKbnCasesComponentsPluginApi", - "section": "def-common.CaseStatuses", - "text": "CaseStatuses" - }, - "; tags: string[]; title: string; connector: { id: string; } & (({ type: ", - "ConnectorTypes", - ".casesWebhook; fields: null; } & { name: string; }) | ({ type: ", - "ConnectorTypes", - ".jira; fields: { issueType: string | null; priority: string | null; parent: string | null; } | null; } & { name: string; }) | ({ type: ", - "ConnectorTypes", - ".none; fields: null; } & { name: string; }) | ({ type: ", - "ConnectorTypes", - ".resilient; fields: { incidentTypes: string[] | null; severityCode: string | null; } | null; } & { name: string; }) | ({ type: ", - "ConnectorTypes", - ".serviceNowITSM; fields: { impact: string | null; severity: string | null; urgency: string | null; category: string | null; subcategory: string | null; } | null; } & { name: string; }) | ({ type: ", - "ConnectorTypes", - ".serviceNowSIR; fields: { category: string | null; destIp: boolean | null; malwareHash: boolean | null; malwareUrl: boolean | null; priority: string | null; sourceIp: boolean | null; subcategory: string | null; } | null; } & { name: string; }) | ({ type: ", - "ConnectorTypes", - ".swimlane; fields: { caseId: string | null; } | null; } & { name: string; })); settings: { syncAlerts: boolean; }; owner: string; severity: ", - "CaseSeverity", - "; assignees: { uid: string; }[]; } & { duration: number | null; closed_at: string | null; closed_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }; external_service: ({ connector_id: string; } & { connector_name: string; external_id: string; external_title: string; external_url: string; pushed_at: string; pushed_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }; }) | null; updated_at: string | null; updated_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; } & { id: string; totalComment: number; totalAlerts: number; version: string; } & { comments?: ((({ comment: string; type: ", - { - "pluginId": "cases", - "scope": "common", - "docId": "kibCasesPluginApi", - "section": "def-common.CommentType", - "text": "CommentType" - }, - ".user; owner: string; } & { created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }; owner: string; pushed_at: string | null; pushed_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; updated_at: string | null; updated_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; }) | ({ type: ", - { - "pluginId": "cases", - "scope": "common", - "docId": "kibCasesPluginApi", - "section": "def-common.CommentType", - "text": "CommentType" - }, - ".alert; alertId: string | string[]; index: string | string[]; rule: { id: string | null; name: string | null; }; owner: string; } & { created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }; owner: string; pushed_at: string | null; pushed_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; updated_at: string | null; updated_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; }) | ({ type: ", - { - "pluginId": "cases", - "scope": "common", - "docId": "kibCasesPluginApi", - "section": "def-common.CommentType", - "text": "CommentType" - }, - ".actions; comment: string; actions: { targets: { hostname: string; endpointId: string; }[]; type: string; }; owner: string; } & { created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }; owner: string; pushed_at: string | null; pushed_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; updated_at: string | null; updated_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; }) | (({ externalReferenceId: string; externalReferenceStorage: { type: ", - { - "pluginId": "cases", - "scope": "common", - "docId": "kibCasesPluginApi", - "section": "def-common.ExternalReferenceStorageType", - "text": "ExternalReferenceStorageType" - }, - ".elasticSearchDoc; }; externalReferenceAttachmentTypeId: string; externalReferenceMetadata: { [x: string]: ", - { - "pluginId": "@kbn/utility-types", - "scope": "common", - "docId": "kibKbnUtilityTypesPluginApi", - "section": "def-common.JsonValue", - "text": "JsonValue" - }, - "; } | null; type: ", - { - "pluginId": "cases", - "scope": "common", - "docId": "kibCasesPluginApi", - "section": "def-common.CommentType", - "text": "CommentType" - }, - ".externalReference; owner: string; } | { externalReferenceId: string; externalReferenceStorage: { type: ", - { - "pluginId": "cases", - "scope": "common", - "docId": "kibCasesPluginApi", - "section": "def-common.ExternalReferenceStorageType", - "text": "ExternalReferenceStorageType" - }, - ".savedObject; soType: string; }; externalReferenceAttachmentTypeId: string; externalReferenceMetadata: { [x: string]: ", - { - "pluginId": "@kbn/utility-types", - "scope": "common", - "docId": "kibKbnUtilityTypesPluginApi", - "section": "def-common.JsonValue", - "text": "JsonValue" - }, - "; } | null; type: ", - { - "pluginId": "cases", - "scope": "common", - "docId": "kibCasesPluginApi", - "section": "def-common.CommentType", - "text": "CommentType" - }, - ".externalReference; owner: string; }) & { created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }; owner: string; pushed_at: string | null; pushed_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; updated_at: string | null; updated_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; }) | ({ type: ", - { - "pluginId": "cases", - "scope": "common", - "docId": "kibCasesPluginApi", - "section": "def-common.CommentType", - "text": "CommentType" - }, - ".persistableState; owner: string; persistableStateAttachmentTypeId: string; persistableStateAttachmentState: { [x: string]: ", - { - "pluginId": "@kbn/utility-types", - "scope": "common", - "docId": "kibKbnUtilityTypesPluginApi", - "section": "def-common.JsonValue", - "text": "JsonValue" - }, - "; }; } & { created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }; owner: string; pushed_at: string | null; pushed_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; updated_at: string | null; updated_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; })) & { id: string; version: string; })[] | undefined; })[]; errors: { error: string; message: string; status: number | undefined; caseId: string; }[]; }, \"cases\"> & { cases: Pick<{ description: string; status: ", + "{ cases: { id: string; description: string; title: string; owner: string; version: string; totalComments: number; status: ", { "pluginId": "@kbn/cases-components", "scope": "common", @@ -2150,111 +2030,7 @@ "section": "def-common.CaseStatuses", "text": "CaseStatuses" }, - "; tags: string[]; title: string; connector: { id: string; } & (({ type: ", - "ConnectorTypes", - ".casesWebhook; fields: null; } & { name: string; }) | ({ type: ", - "ConnectorTypes", - ".jira; fields: { issueType: string | null; priority: string | null; parent: string | null; } | null; } & { name: string; }) | ({ type: ", - "ConnectorTypes", - ".none; fields: null; } & { name: string; }) | ({ type: ", - "ConnectorTypes", - ".resilient; fields: { incidentTypes: string[] | null; severityCode: string | null; } | null; } & { name: string; }) | ({ type: ", - "ConnectorTypes", - ".serviceNowITSM; fields: { impact: string | null; severity: string | null; urgency: string | null; category: string | null; subcategory: string | null; } | null; } & { name: string; }) | ({ type: ", - "ConnectorTypes", - ".serviceNowSIR; fields: { category: string | null; destIp: boolean | null; malwareHash: boolean | null; malwareUrl: boolean | null; priority: string | null; sourceIp: boolean | null; subcategory: string | null; } | null; } & { name: string; }) | ({ type: ", - "ConnectorTypes", - ".swimlane; fields: { caseId: string | null; } | null; } & { name: string; })); settings: { syncAlerts: boolean; }; owner: string; severity: ", - "CaseSeverity", - "; assignees: { uid: string; }[]; } & { duration: number | null; closed_at: string | null; closed_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }; external_service: ({ connector_id: string; } & { connector_name: string; external_id: string; external_title: string; external_url: string; pushed_at: string; pushed_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }; }) | null; updated_at: string | null; updated_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; } & { id: string; totalComment: number; totalAlerts: number; version: string; } & { comments?: ((({ comment: string; type: ", - { - "pluginId": "cases", - "scope": "common", - "docId": "kibCasesPluginApi", - "section": "def-common.CommentType", - "text": "CommentType" - }, - ".user; owner: string; } & { created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }; owner: string; pushed_at: string | null; pushed_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; updated_at: string | null; updated_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; }) | ({ type: ", - { - "pluginId": "cases", - "scope": "common", - "docId": "kibCasesPluginApi", - "section": "def-common.CommentType", - "text": "CommentType" - }, - ".alert; alertId: string | string[]; index: string | string[]; rule: { id: string | null; name: string | null; }; owner: string; } & { created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }; owner: string; pushed_at: string | null; pushed_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; updated_at: string | null; updated_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; }) | ({ type: ", - { - "pluginId": "cases", - "scope": "common", - "docId": "kibCasesPluginApi", - "section": "def-common.CommentType", - "text": "CommentType" - }, - ".actions; comment: string; actions: { targets: { hostname: string; endpointId: string; }[]; type: string; }; owner: string; } & { created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }; owner: string; pushed_at: string | null; pushed_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; updated_at: string | null; updated_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; }) | (({ externalReferenceId: string; externalReferenceStorage: { type: ", - { - "pluginId": "cases", - "scope": "common", - "docId": "kibCasesPluginApi", - "section": "def-common.ExternalReferenceStorageType", - "text": "ExternalReferenceStorageType" - }, - ".elasticSearchDoc; }; externalReferenceAttachmentTypeId: string; externalReferenceMetadata: { [x: string]: ", - { - "pluginId": "@kbn/utility-types", - "scope": "common", - "docId": "kibKbnUtilityTypesPluginApi", - "section": "def-common.JsonValue", - "text": "JsonValue" - }, - "; } | null; type: ", - { - "pluginId": "cases", - "scope": "common", - "docId": "kibCasesPluginApi", - "section": "def-common.CommentType", - "text": "CommentType" - }, - ".externalReference; owner: string; } | { externalReferenceId: string; externalReferenceStorage: { type: ", - { - "pluginId": "cases", - "scope": "common", - "docId": "kibCasesPluginApi", - "section": "def-common.ExternalReferenceStorageType", - "text": "ExternalReferenceStorageType" - }, - ".savedObject; soType: string; }; externalReferenceAttachmentTypeId: string; externalReferenceMetadata: { [x: string]: ", - { - "pluginId": "@kbn/utility-types", - "scope": "common", - "docId": "kibKbnUtilityTypesPluginApi", - "section": "def-common.JsonValue", - "text": "JsonValue" - }, - "; } | null; type: ", - { - "pluginId": "cases", - "scope": "common", - "docId": "kibCasesPluginApi", - "section": "def-common.CommentType", - "text": "CommentType" - }, - ".externalReference; owner: string; }) & { created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }; owner: string; pushed_at: string | null; pushed_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; updated_at: string | null; updated_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; }) | ({ type: ", - { - "pluginId": "cases", - "scope": "common", - "docId": "kibCasesPluginApi", - "section": "def-common.CommentType", - "text": "CommentType" - }, - ".persistableState; owner: string; persistableStateAttachmentTypeId: string; persistableStateAttachmentState: { [x: string]: ", - { - "pluginId": "@kbn/utility-types", - "scope": "common", - "docId": "kibKbnUtilityTypesPluginApi", - "section": "def-common.JsonValue", - "text": "JsonValue" - }, - "; }; } & { created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }; owner: string; pushed_at: string | null; pushed_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; updated_at: string | null; updated_by: ({ email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }) | null; })) & { id: string; version: string; })[] | undefined; }, \"id\" | \"version\" | \"owner\" | Field>[]; }" + "; created_at: string; created_by: { email: string | null | undefined; full_name: string | null | undefined; username: string | null | undefined; } & { profile_uid?: string | undefined; }; }[]; errors: { error: string; message: string; status: number | undefined; caseId: string; }[]; }" ], "path": "x-pack/plugins/cases/common/api/cases/case.ts", "deprecated": false, diff --git a/api_docs/cases.mdx b/api_docs/cases.mdx index a112bc0380e37..2775b1024164b 100644 --- a/api_docs/cases.mdx +++ b/api_docs/cases.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cases title: "cases" image: https://source.unsplash.com/400x175/?github description: API docs for the cases plugin -date: 2023-05-07 +date: 2023-05-09 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 b96c6c745f4ce..eb62dd88d1698 100644 --- a/api_docs/charts.mdx +++ b/api_docs/charts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/charts title: "charts" image: https://source.unsplash.com/400x175/?github description: API docs for the charts plugin -date: 2023-05-07 +date: 2023-05-09 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 713ccfd0576bc..ac59bd8f45efd 100644 --- a/api_docs/cloud.mdx +++ b/api_docs/cloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloud title: "cloud" image: https://source.unsplash.com/400x175/?github description: API docs for the cloud plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] --- import cloudObj from './cloud.devdocs.json'; diff --git a/api_docs/cloud_chat.mdx b/api_docs/cloud_chat.mdx index 566d0de5e64f7..8e705b56719cf 100644 --- a/api_docs/cloud_chat.mdx +++ b/api_docs/cloud_chat.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudChat title: "cloudChat" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudChat plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudChat'] --- import cloudChatObj from './cloud_chat.devdocs.json'; diff --git a/api_docs/cloud_data_migration.mdx b/api_docs/cloud_data_migration.mdx index d24b67ed41ba5..875823fe1e748 100644 --- a/api_docs/cloud_data_migration.mdx +++ b/api_docs/cloud_data_migration.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDataMigration title: "cloudDataMigration" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDataMigration plugin -date: 2023-05-07 +date: 2023-05-09 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 35cb8b5d71bf2..e283be03c055c 100644 --- a/api_docs/cloud_defend.mdx +++ b/api_docs/cloud_defend.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudDefend title: "cloudDefend" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudDefend plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudDefend'] --- import cloudDefendObj from './cloud_defend.devdocs.json'; diff --git a/api_docs/cloud_experiments.mdx b/api_docs/cloud_experiments.mdx index 6a3624c70c1a9..819253507471e 100644 --- a/api_docs/cloud_experiments.mdx +++ b/api_docs/cloud_experiments.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudExperiments title: "cloudExperiments" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudExperiments plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudExperiments'] --- import cloudExperimentsObj from './cloud_experiments.devdocs.json'; diff --git a/api_docs/cloud_security_posture.mdx b/api_docs/cloud_security_posture.mdx index bd6a6e3997787..4aee4a4267ef4 100644 --- a/api_docs/cloud_security_posture.mdx +++ b/api_docs/cloud_security_posture.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudSecurityPosture title: "cloudSecurityPosture" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudSecurityPosture plugin -date: 2023-05-07 +date: 2023-05-09 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 ebbb9b17e3c67..f888aa38cbd60 100644 --- a/api_docs/console.mdx +++ b/api_docs/console.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/console title: "console" image: https://source.unsplash.com/400x175/?github description: API docs for the console plugin -date: 2023-05-07 +date: 2023-05-09 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 55106ff8bb61e..30bfca4e47a0c 100644 --- a/api_docs/content_management.mdx +++ b/api_docs/content_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/contentManagement title: "contentManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the contentManagement plugin -date: 2023-05-07 +date: 2023-05-09 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 7dc060d1661c7..d75a1846bf022 100644 --- a/api_docs/controls.mdx +++ b/api_docs/controls.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/controls title: "controls" image: https://source.unsplash.com/400x175/?github description: API docs for the controls plugin -date: 2023-05-07 +date: 2023-05-09 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 748787f8ed854..8515e2bbc7b19 100644 --- a/api_docs/custom_integrations.mdx +++ b/api_docs/custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/customIntegrations title: "customIntegrations" image: https://source.unsplash.com/400x175/?github description: API docs for the customIntegrations plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'customIntegrations'] --- import customIntegrationsObj from './custom_integrations.devdocs.json'; diff --git a/api_docs/dashboard.mdx b/api_docs/dashboard.mdx index 1caad88d5eca6..7afe9dd1b3f6a 100644 --- a/api_docs/dashboard.mdx +++ b/api_docs/dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboard title: "dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboard plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboard'] --- import dashboardObj from './dashboard.devdocs.json'; diff --git a/api_docs/dashboard_enhanced.mdx b/api_docs/dashboard_enhanced.mdx index 6345177cd7557..e75ca3498c939 100644 --- a/api_docs/dashboard_enhanced.mdx +++ b/api_docs/dashboard_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dashboardEnhanced title: "dashboardEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the dashboardEnhanced plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboardEnhanced'] --- import dashboardEnhancedObj from './dashboard_enhanced.devdocs.json'; diff --git a/api_docs/data.devdocs.json b/api_docs/data.devdocs.json index 951415735955e..fcf6eb705fbb5 100644 --- a/api_docs/data.devdocs.json +++ b/api_docs/data.devdocs.json @@ -11075,19 +11075,39 @@ }, { "plugin": "synthetics", - "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/api.ts" + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/global_params/actions.ts" }, { "plugin": "synthetics", - "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/api.ts" + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/global_params/actions.ts" }, { "plugin": "synthetics", - "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/effects.ts" + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/global_params/api.ts" }, { "plugin": "synthetics", - "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/effects.ts" + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/global_params/api.ts" + }, + { + "plugin": "synthetics", + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/global_params/api.ts" + }, + { + "plugin": "synthetics", + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/global_params/index.ts" + }, + { + "plugin": "synthetics", + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/global_params/index.ts" + }, + { + "plugin": "synthetics", + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/api.ts" + }, + { + "plugin": "synthetics", + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/api.ts" }, { "plugin": "synthetics", @@ -11095,19 +11115,19 @@ }, { "plugin": "synthetics", - "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/index.ts" + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/effects.ts" }, { "plugin": "synthetics", - "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/index.ts" + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/effects.ts" }, { "plugin": "synthetics", - "path": "x-pack/plugins/synthetics/public/apps/synthetics/components/settings/hooks/use_params_list.ts" + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/index.ts" }, { "plugin": "synthetics", - "path": "x-pack/plugins/synthetics/public/apps/synthetics/components/settings/hooks/use_params_list.ts" + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/index.ts" }, { "plugin": "cases", @@ -28840,19 +28860,39 @@ }, { "plugin": "synthetics", - "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/api.ts" + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/global_params/actions.ts" }, { "plugin": "synthetics", - "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/api.ts" + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/global_params/actions.ts" }, { "plugin": "synthetics", - "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/effects.ts" + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/global_params/api.ts" }, { "plugin": "synthetics", - "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/effects.ts" + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/global_params/api.ts" + }, + { + "plugin": "synthetics", + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/global_params/api.ts" + }, + { + "plugin": "synthetics", + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/global_params/index.ts" + }, + { + "plugin": "synthetics", + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/global_params/index.ts" + }, + { + "plugin": "synthetics", + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/api.ts" + }, + { + "plugin": "synthetics", + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/api.ts" }, { "plugin": "synthetics", @@ -28860,19 +28900,19 @@ }, { "plugin": "synthetics", - "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/index.ts" + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/effects.ts" }, { "plugin": "synthetics", - "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/index.ts" + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/effects.ts" }, { "plugin": "synthetics", - "path": "x-pack/plugins/synthetics/public/apps/synthetics/components/settings/hooks/use_params_list.ts" + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/index.ts" }, { "plugin": "synthetics", - "path": "x-pack/plugins/synthetics/public/apps/synthetics/components/settings/hooks/use_params_list.ts" + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/index.ts" }, { "plugin": "cases", diff --git a/api_docs/data.mdx b/api_docs/data.mdx index bffa0a33c5c35..5f0593a0700a8 100644 --- a/api_docs/data.mdx +++ b/api_docs/data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data title: "data" image: https://source.unsplash.com/400x175/?github description: API docs for the data plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index 8ad88c68c2caf..06e72dce113a9 100644 --- a/api_docs/data_query.mdx +++ b/api_docs/data_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-query title: "data.query" image: https://source.unsplash.com/400x175/?github description: API docs for the data.query plugin -date: 2023-05-07 +date: 2023-05-09 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 76c453f505942..b0ab3e390b851 100644 --- a/api_docs/data_search.mdx +++ b/api_docs/data_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/data-search title: "data.search" image: https://source.unsplash.com/400x175/?github description: API docs for the data.search plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index 328367e2856ff..9521856f86f08 100644 --- a/api_docs/data_view_editor.mdx +++ b/api_docs/data_view_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewEditor title: "dataViewEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewEditor plugin -date: 2023-05-07 +date: 2023-05-09 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 5c25100ba1d3e..008e1c40a3e09 100644 --- a/api_docs/data_view_field_editor.mdx +++ b/api_docs/data_view_field_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewFieldEditor title: "dataViewFieldEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewFieldEditor plugin -date: 2023-05-07 +date: 2023-05-09 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 a766d403d2b13..3c5aa3c987ea1 100644 --- a/api_docs/data_view_management.mdx +++ b/api_docs/data_view_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViewManagement title: "dataViewManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViewManagement plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewManagement'] --- import dataViewManagementObj from './data_view_management.devdocs.json'; diff --git a/api_docs/data_views.devdocs.json b/api_docs/data_views.devdocs.json index e56a73cebd5f0..727a9dc84eb5a 100644 --- a/api_docs/data_views.devdocs.json +++ b/api_docs/data_views.devdocs.json @@ -7714,7 +7714,7 @@ "section": "def-common.SavedObjectsCreateOptions", "text": "SavedObjectsCreateOptions" }, - ") => Promise<", + " & { initialNamespaces?: string[] | undefined; }) => Promise<", { "pluginId": "@kbn/core-saved-objects-common", "scope": "common", @@ -7771,7 +7771,7 @@ { "parentPluginId": "dataViews", "id": "def-public.SavedObjectsClientCommon.create.$3", - "type": "Object", + "type": "CompoundType", "tags": [], "label": "options", "description": [ @@ -7784,7 +7784,8 @@ "docId": "kibKbnCoreSavedObjectsApiBrowserPluginApi", "section": "def-common.SavedObjectsCreateOptions", "text": "SavedObjectsCreateOptions" - } + }, + " & { initialNamespaces?: string[] | undefined; }" ], "path": "src/plugins/data_views/common/types.ts", "deprecated": false, @@ -13741,7 +13742,7 @@ "section": "def-common.SavedObjectsCreateOptions", "text": "SavedObjectsCreateOptions" }, - ") => Promise<", + " & { initialNamespaces?: string[] | undefined; }) => Promise<", { "pluginId": "@kbn/core-saved-objects-common", "scope": "common", @@ -13798,7 +13799,7 @@ { "parentPluginId": "dataViews", "id": "def-server.SavedObjectsClientCommon.create.$3", - "type": "Object", + "type": "CompoundType", "tags": [], "label": "options", "description": [ @@ -13811,7 +13812,8 @@ "docId": "kibKbnCoreSavedObjectsApiBrowserPluginApi", "section": "def-common.SavedObjectsCreateOptions", "text": "SavedObjectsCreateOptions" - } + }, + " & { initialNamespaces?: string[] | undefined; }" ], "path": "src/plugins/data_views/common/types.ts", "deprecated": false, @@ -24439,7 +24441,7 @@ "section": "def-common.SavedObjectsCreateOptions", "text": "SavedObjectsCreateOptions" }, - ") => Promise<", + " & { initialNamespaces?: string[] | undefined; }) => Promise<", { "pluginId": "@kbn/core-saved-objects-common", "scope": "common", @@ -24496,7 +24498,7 @@ { "parentPluginId": "dataViews", "id": "def-common.SavedObjectsClientCommon.create.$3", - "type": "Object", + "type": "CompoundType", "tags": [], "label": "options", "description": [ @@ -24509,7 +24511,8 @@ "docId": "kibKbnCoreSavedObjectsApiBrowserPluginApi", "section": "def-common.SavedObjectsCreateOptions", "text": "SavedObjectsCreateOptions" - } + }, + " & { initialNamespaces?: string[] | undefined; }" ], "path": "src/plugins/data_views/common/types.ts", "deprecated": false, @@ -26399,19 +26402,39 @@ }, { "plugin": "synthetics", - "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/api.ts" + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/global_params/actions.ts" }, { "plugin": "synthetics", - "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/api.ts" + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/global_params/actions.ts" }, { "plugin": "synthetics", - "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/effects.ts" + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/global_params/api.ts" }, { "plugin": "synthetics", - "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/effects.ts" + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/global_params/api.ts" + }, + { + "plugin": "synthetics", + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/global_params/api.ts" + }, + { + "plugin": "synthetics", + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/global_params/index.ts" + }, + { + "plugin": "synthetics", + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/global_params/index.ts" + }, + { + "plugin": "synthetics", + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/api.ts" + }, + { + "plugin": "synthetics", + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/api.ts" }, { "plugin": "synthetics", @@ -26419,19 +26442,19 @@ }, { "plugin": "synthetics", - "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/index.ts" + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/effects.ts" }, { "plugin": "synthetics", - "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/index.ts" + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/effects.ts" }, { "plugin": "synthetics", - "path": "x-pack/plugins/synthetics/public/apps/synthetics/components/settings/hooks/use_params_list.ts" + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/index.ts" }, { "plugin": "synthetics", - "path": "x-pack/plugins/synthetics/public/apps/synthetics/components/settings/hooks/use_params_list.ts" + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/index.ts" }, { "plugin": "cases", diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index fc82818e98749..2675fab3b4e00 100644 --- a/api_docs/data_views.mdx +++ b/api_docs/data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataViews title: "dataViews" image: https://source.unsplash.com/400x175/?github description: API docs for the dataViews plugin -date: 2023-05-07 +date: 2023-05-09 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 3976e1fe6a086..0e85e7b45fcdf 100644 --- a/api_docs/data_visualizer.mdx +++ b/api_docs/data_visualizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/dataVisualizer title: "dataVisualizer" image: https://source.unsplash.com/400x175/?github description: API docs for the dataVisualizer plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] --- import dataVisualizerObj from './data_visualizer.devdocs.json'; diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index 19196ab7341bd..9475ce31bfca6 100644 --- a/api_docs/deprecations_by_api.mdx +++ b/api_docs/deprecations_by_api.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByApi slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-api title: Deprecated API usage by API description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -41,6 +41,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | @kbn/core-saved-objects-migration-server-internal, actions, dataViews, data, alerting, lens, cases, savedObjectsTagging, savedSearch, canvas, graph, lists, maps, securitySolution, dashboard, visualizations, @kbn/core-test-helpers-so-type-serializer | - | | | discover | - | | | data, discover, imageEmbeddable, embeddable | - | +| | @kbn/core-saved-objects-browser-mocks, dataViews, savedSearch, dashboard, graph, discover, @kbn/core-saved-objects-browser-internal | - | | | advancedSettings, discover | - | | | @kbn/core-saved-objects-common, @kbn/core-saved-objects-api-browser, @kbn/core-saved-objects-browser-internal, @kbn/core-saved-objects-api-server, @kbn/core, home, dataViews, savedObjectsTagging, fleet, canvas, osquery, synthetics, savedObjects, @kbn/core-saved-objects-browser-mocks, @kbn/core-saved-objects-import-export-server-internal, savedObjectsTaggingOss, lists, securitySolution, upgradeAssistant, savedObjectsManagement, cases, @kbn/core-ui-settings-server-internal, dashboard | - | | | @kbn/core-saved-objects-common, @kbn/core-saved-objects-api-browser, @kbn/core-saved-objects-browser-internal, @kbn/core-saved-objects-api-server, @kbn/core, home, dataViews, savedObjectsTagging, fleet, canvas, osquery, synthetics, savedObjects, @kbn/core-saved-objects-browser-mocks, @kbn/core-saved-objects-import-export-server-internal, savedObjectsTaggingOss, lists, securitySolution, upgradeAssistant, savedObjectsManagement, cases, @kbn/core-ui-settings-server-internal, data | - | @@ -69,7 +70,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | @kbn/core-saved-objects-browser-internal, @kbn/core-saved-objects-browser-mocks, dataViews, savedObjects, visualizations, dashboard, graph | - | | | @kbn/core-saved-objects-browser-mocks, synthetics, @kbn/core-saved-objects-browser-internal | - | | | @kbn/core-saved-objects-browser-mocks, dashboard, savedObjects, @kbn/core-saved-objects-browser-internal | - | -| | @kbn/core-saved-objects-browser-mocks, dataViews, savedSearch, dashboard, graph, @kbn/core-saved-objects-browser-internal | - | | | @kbn/core-saved-objects-browser-mocks, fleet, synthetics, @kbn/core-saved-objects-browser-internal | - | | | @kbn/core-saved-objects-browser-internal, @kbn/core-saved-objects-browser-mocks, dataViews, savedSearch, savedObjects | - | | | @kbn/core-saved-objects-browser-mocks, @kbn/core-saved-objects-browser-internal | - | @@ -133,7 +133,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | @kbn/core-plugins-server-internal | - | | | @kbn/core-saved-objects-api-server-internal | - | | | security, licenseManagement, ml, apm, crossClusterReplication, logstash, painlessLab, searchprofiler, watcher, profiling | 8.8.0 | -| | spaces, security, actions, alerting, ml, remoteClusters, graph, indexLifecycleManagement, mapsEms, painlessLab, rollup, searchprofiler, securitySolution, snapshotRestore, transform, upgradeAssistant | 8.8.0 | +| | spaces, security, actions, alerting, ml, remoteClusters, graph, indexLifecycleManagement, mapsEms, osquery, painlessLab, rollup, searchprofiler, securitySolution, snapshotRestore, transform, upgradeAssistant | 8.8.0 | | | spaces, security, alerting | 8.8.0 | | | embeddable, presentationUtil, dashboard, discover, graph | 8.8.0 | | | apm, security, securitySolution | 8.8.0 | diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 77bb37fab3036..74c40ec07f0de 100644 --- a/api_docs/deprecations_by_plugin.mdx +++ b/api_docs/deprecations_by_plugin.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsByPlugin slug: /kibana-dev-docs/api-meta/deprecated-api-list-by-plugin title: Deprecated API usage by plugin description: A list of deprecated APIs, which plugins are still referencing them, and when they need to be removed by. -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -606,7 +606,8 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [use_text_based_query_language.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/main/hooks/use_text_based_query_language.ts#:~:text=title) | - | | | [on_save_search.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/main/components/top_nav/on_save_search.tsx#:~:text=SavedObjectSaveModal), [on_save_search.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/main/components/top_nav/on_save_search.tsx#:~:text=SavedObjectSaveModal) | 8.8.0 | | | [saved_search_embeddable.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/embeddable/saved_search_embeddable.tsx#:~:text=executeTriggerActions), [search_embeddable_factory.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/embeddable/search_embeddable_factory.ts#:~:text=executeTriggerActions), [plugin.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/plugin.tsx#:~:text=executeTriggerActions) | - | -| | [search_embeddable_factory.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/embeddable/search_embeddable_factory.ts#:~:text=savedObjects), [persist_saved_search.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/main/utils/persist_saved_search.ts#:~:text=savedObjects), [use_discover_state.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/main/hooks/use_discover_state.ts#:~:text=savedObjects), [discover_main_route.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/main/discover_main_route.tsx#:~:text=savedObjects), [discover_main_route.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/main/discover_main_route.tsx#:~:text=savedObjects) | - | +| | [discover_saved_search_container.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/main/services/discover_saved_search_container.ts#:~:text=savedObjects), [discover_saved_search_container.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/main/services/discover_saved_search_container.ts#:~:text=savedObjects), [search_embeddable_factory.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/embeddable/search_embeddable_factory.ts#:~:text=savedObjects), [discover_saved_search_container.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/main/services/discover_saved_search_container.test.ts#:~:text=savedObjects), [discover_state.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/main/services/discover_state.test.ts#:~:text=savedObjects) | - | +| | [discover_saved_search_container.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/main/services/discover_saved_search_container.test.ts#:~:text=resolve), [discover_state.test.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/public/application/main/services/discover_state.test.ts#:~:text=resolve) | - | | | [ui_settings.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/server/ui_settings.ts#:~:text=metric), [ui_settings.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/server/ui_settings.ts#:~:text=metric), [ui_settings.ts](https://github.com/elastic/kibana/tree/main/src/plugins/discover/server/ui_settings.ts#:~:text=metric) | - | @@ -987,6 +988,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/packs/types.ts#:~:text=SavedObject), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/packs/types.ts#:~:text=SavedObject), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/routes/saved_queries/list/index.tsx#:~:text=SavedObject), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/routes/saved_queries/list/index.tsx#:~:text=SavedObject), [use_assets_status.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/assets/use_assets_status.ts#:~:text=SavedObject), [use_assets_status.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/assets/use_assets_status.ts#:~:text=SavedObject), [use_assets_status.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/assets/use_assets_status.ts#:~:text=SavedObject), [use_assets_status.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/assets/use_assets_status.ts#:~:text=SavedObject), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/packs/types.ts#:~:text=SavedObject), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/packs/types.ts#:~:text=SavedObject)+ 14 more | - | | | [pack_queries_status_table.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/packs/pack_queries_status_table.tsx#:~:text=indexPatternId), [view_results_in_discover.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/discover/view_results_in_discover.tsx#:~:text=indexPatternId), [use_discover_link.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/common/hooks/use_discover_link.tsx#:~:text=indexPatternId) | - | | | [empty_state.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/components/empty_state.tsx#:~:text=KibanaPageTemplate), [empty_state.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/components/empty_state.tsx#:~:text=KibanaPageTemplate) | - | +| | [create_action_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/server/handlers/action/create_action_service.ts#:~:text=license%24) | 8.8.0 | | | [use_saved_queries.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/saved_queries/use_saved_queries.ts#:~:text=SavedObjectsFindResponse), [use_saved_queries.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/saved_queries/use_saved_queries.ts#:~:text=SavedObjectsFindResponse), [use_packs.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/packs/use_packs.ts#:~:text=SavedObjectsFindResponse), [use_packs.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/public/packs/use_packs.ts#:~:text=SavedObjectsFindResponse) | - | @@ -1234,8 +1236,8 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [monitor_detail_flyout.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/monitor_detail_flyout.tsx#:~:text=SavedObject), [monitor_detail_flyout.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/monitor_detail_flyout.tsx#:~:text=SavedObject), [api.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/state/overview/api.ts#:~:text=SavedObject), [api.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/state/overview/api.ts#:~:text=SavedObject), [api.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_details/api.ts#:~:text=SavedObject), [api.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_details/api.ts#:~:text=SavedObject), [api.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/api.ts#:~:text=SavedObject), [api.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/api.ts#:~:text=SavedObject), [effects.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/effects.ts#:~:text=SavedObject), [effects.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/effects.ts#:~:text=SavedObject)+ 5 more | - | -| | [monitor_detail_flyout.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/monitor_detail_flyout.tsx#:~:text=SavedObject), [monitor_detail_flyout.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/monitor_detail_flyout.tsx#:~:text=SavedObject), [api.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/state/overview/api.ts#:~:text=SavedObject), [api.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/state/overview/api.ts#:~:text=SavedObject), [api.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_details/api.ts#:~:text=SavedObject), [api.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_details/api.ts#:~:text=SavedObject), [api.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/api.ts#:~:text=SavedObject), [api.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/api.ts#:~:text=SavedObject), [effects.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/effects.ts#:~:text=SavedObject), [effects.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/effects.ts#:~:text=SavedObject)+ 35 more | - | +| | [monitor_detail_flyout.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/monitor_detail_flyout.tsx#:~:text=SavedObject), [monitor_detail_flyout.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/monitor_detail_flyout.tsx#:~:text=SavedObject), [api.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/state/overview/api.ts#:~:text=SavedObject), [api.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/state/overview/api.ts#:~:text=SavedObject), [api.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_details/api.ts#:~:text=SavedObject), [api.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_details/api.ts#:~:text=SavedObject), [actions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/state/global_params/actions.ts#:~:text=SavedObject), [actions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/state/global_params/actions.ts#:~:text=SavedObject), [api.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/state/global_params/api.ts#:~:text=SavedObject), [api.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/state/global_params/api.ts#:~:text=SavedObject)+ 10 more | - | +| | [monitor_detail_flyout.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/monitor_detail_flyout.tsx#:~:text=SavedObject), [monitor_detail_flyout.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/monitor_detail_flyout.tsx#:~:text=SavedObject), [api.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/state/overview/api.ts#:~:text=SavedObject), [api.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/state/overview/api.ts#:~:text=SavedObject), [api.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_details/api.ts#:~:text=SavedObject), [api.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_details/api.ts#:~:text=SavedObject), [actions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/state/global_params/actions.ts#:~:text=SavedObject), [actions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/state/global_params/actions.ts#:~:text=SavedObject), [api.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/state/global_params/api.ts#:~:text=SavedObject), [api.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/apps/synthetics/state/global_params/api.ts#:~:text=SavedObject)+ 50 more | - | | | [filter_group.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/legacy_uptime/components/overview/filter_group/filter_group.tsx#:~:text=title), [filters_expression_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/legacy_uptime/components/overview/alerts/monitor_expressions/filters_expression_select.tsx#:~:text=title), [filter_group.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/legacy_uptime/components/overview/filter_group/filter_group.tsx#:~:text=title), [filters_expression_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/legacy_uptime/components/overview/alerts/monitor_expressions/filters_expression_select.tsx#:~:text=title) | - | | | [filter_group.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/legacy_uptime/components/overview/filter_group/filter_group.tsx#:~:text=title), [filters_expression_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/legacy_uptime/components/overview/alerts/monitor_expressions/filters_expression_select.tsx#:~:text=title), [filter_group.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/legacy_uptime/components/overview/filter_group/filter_group.tsx#:~:text=title), [filters_expression_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/legacy_uptime/components/overview/alerts/monitor_expressions/filters_expression_select.tsx#:~:text=title) | - | | | [filter_group.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/legacy_uptime/components/overview/filter_group/filter_group.tsx#:~:text=title), [filters_expression_select.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/synthetics/public/legacy_uptime/components/overview/alerts/monitor_expressions/filters_expression_select.tsx#:~:text=title) | - | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 0e5faaecb066e..4cc3c902fcf8c 100644 --- a/api_docs/deprecations_by_team.mdx +++ b/api_docs/deprecations_by_team.mdx @@ -7,7 +7,7 @@ id: kibDevDocsDeprecationsDueByTeam slug: /kibana-dev-docs/api-meta/deprecations-due-by-team title: Deprecated APIs due to be removed, by team description: Lists the teams that are referencing deprecated APIs with a remove by date. -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -166,6 +166,14 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ +## @elastic/security-defend-workflows + +| Plugin | Deprecated API | Reference location(s) | Remove By | +| --------|-------|-----------|-----------| +| osquery | | [create_action_service.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/osquery/server/handlers/action/create_action_service.ts#:~:text=license%24) | 8.8.0 | + + + ## @elastic/security-solution | Plugin | Deprecated API | Reference location(s) | Remove By | diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 668b2fff5ef0e..0f4393b4c8262 100644 --- a/api_docs/dev_tools.mdx +++ b/api_docs/dev_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/devTools title: "devTools" image: https://source.unsplash.com/400x175/?github description: API docs for the devTools plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'devTools'] --- import devToolsObj from './dev_tools.devdocs.json'; diff --git a/api_docs/discover.devdocs.json b/api_docs/discover.devdocs.json index 696fa2dfe83c5..cf7b122573fa0 100644 --- a/api_docs/discover.devdocs.json +++ b/api_docs/discover.devdocs.json @@ -9,7 +9,9 @@ "type": "Function", "tags": [], "label": "getSavedSearch", - "description": [], + "description": [ + "\nReturns a persisted or a new saved search" + ], "signature": [ "(savedSearchId: string | undefined, dependencies: GetSavedSearchDependencies) => Promise<", { @@ -31,7 +33,9 @@ "type": "string", "tags": [], "label": "savedSearchId", - "description": [], + "description": [ + "- when undefined a new saved search is returned" + ], "signature": [ "string | undefined" ], diff --git a/api_docs/discover.mdx b/api_docs/discover.mdx index 9966ab7e66ecd..84c0eabc51717 100644 --- a/api_docs/discover.mdx +++ b/api_docs/discover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discover title: "discover" image: https://source.unsplash.com/400x175/?github description: API docs for the discover plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discover'] --- import discoverObj from './discover.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 96 | 0 | 77 | 7 | +| 96 | 0 | 75 | 7 | ## Client diff --git a/api_docs/discover_enhanced.mdx b/api_docs/discover_enhanced.mdx index 5316cfa5b7372..6a83ac45c6394 100644 --- a/api_docs/discover_enhanced.mdx +++ b/api_docs/discover_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/discoverEnhanced title: "discoverEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the discoverEnhanced plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discoverEnhanced'] --- import discoverEnhancedObj from './discover_enhanced.devdocs.json'; diff --git a/api_docs/ecs_data_quality_dashboard.mdx b/api_docs/ecs_data_quality_dashboard.mdx index 7be0a4219c1c1..55fe7e6efd707 100644 --- a/api_docs/ecs_data_quality_dashboard.mdx +++ b/api_docs/ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ecsDataQualityDashboard title: "ecsDataQualityDashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the ecsDataQualityDashboard plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ecsDataQualityDashboard'] --- import ecsDataQualityDashboardObj from './ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index 99ecbddcf4b34..43f1f340095d8 100644 --- a/api_docs/embeddable.mdx +++ b/api_docs/embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddable title: "embeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddable plugin -date: 2023-05-07 +date: 2023-05-09 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 37665856e639d..84a176e4327a5 100644 --- a/api_docs/embeddable_enhanced.mdx +++ b/api_docs/embeddable_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/embeddableEnhanced title: "embeddableEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the embeddableEnhanced plugin -date: 2023-05-07 +date: 2023-05-09 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 81e2429f651b4..318ffeaea50db 100644 --- a/api_docs/encrypted_saved_objects.mdx +++ b/api_docs/encrypted_saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/encryptedSavedObjects title: "encryptedSavedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the encryptedSavedObjects plugin -date: 2023-05-07 +date: 2023-05-09 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 a68a3b12d473a..bc1f084dae25e 100644 --- a/api_docs/enterprise_search.mdx +++ b/api_docs/enterprise_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/enterpriseSearch title: "enterpriseSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the enterpriseSearch plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] --- import enterpriseSearchObj from './enterprise_search.devdocs.json'; diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index 9d363382a4d04..c59e989680d10 100644 --- a/api_docs/es_ui_shared.mdx +++ b/api_docs/es_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/esUiShared title: "esUiShared" image: https://source.unsplash.com/400x175/?github description: API docs for the esUiShared plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] --- import esUiSharedObj from './es_ui_shared.devdocs.json'; diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index f730b498c27a1..8fd674a4a8c5e 100644 --- a/api_docs/event_annotation.mdx +++ b/api_docs/event_annotation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotation title: "eventAnnotation" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotation plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] --- import eventAnnotationObj from './event_annotation.devdocs.json'; diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index 566d130b6dba5..b4f33aa285797 100644 --- a/api_docs/event_log.mdx +++ b/api_docs/event_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventLog title: "eventLog" image: https://source.unsplash.com/400x175/?github description: API docs for the eventLog plugin -date: 2023-05-07 +date: 2023-05-09 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 e9d01181d2a57..c4571f54fe14a 100644 --- a/api_docs/exploratory_view.mdx +++ b/api_docs/exploratory_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/exploratoryView title: "exploratoryView" image: https://source.unsplash.com/400x175/?github description: API docs for the exploratoryView plugin -date: 2023-05-07 +date: 2023-05-09 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 9bc378e624689..95e04054b8209 100644 --- a/api_docs/expression_error.mdx +++ b/api_docs/expression_error.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionError title: "expressionError" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionError plugin -date: 2023-05-07 +date: 2023-05-09 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 9bb5f9e82b19e..c7702fa6d8573 100644 --- a/api_docs/expression_gauge.mdx +++ b/api_docs/expression_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionGauge title: "expressionGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionGauge plugin -date: 2023-05-07 +date: 2023-05-09 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 883d1d3d8fbd2..d1708f8af0b48 100644 --- a/api_docs/expression_heatmap.mdx +++ b/api_docs/expression_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionHeatmap title: "expressionHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionHeatmap plugin -date: 2023-05-07 +date: 2023-05-09 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 f296351583f65..3c03aa05624b2 100644 --- a/api_docs/expression_image.mdx +++ b/api_docs/expression_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionImage title: "expressionImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionImage plugin -date: 2023-05-07 +date: 2023-05-09 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 ac86b8cc8d6e9..12aa3be869fa7 100644 --- a/api_docs/expression_legacy_metric_vis.mdx +++ b/api_docs/expression_legacy_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionLegacyMetricVis title: "expressionLegacyMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionLegacyMetricVis plugin -date: 2023-05-07 +date: 2023-05-09 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 5c2a5e38d0bb7..972e4b8dd8775 100644 --- a/api_docs/expression_metric.mdx +++ b/api_docs/expression_metric.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetric title: "expressionMetric" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetric plugin -date: 2023-05-07 +date: 2023-05-09 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 cf7e54df282a6..f7c5ba1981ef1 100644 --- a/api_docs/expression_metric_vis.mdx +++ b/api_docs/expression_metric_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionMetricVis title: "expressionMetricVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionMetricVis plugin -date: 2023-05-07 +date: 2023-05-09 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 7ce5c90979728..57ca5c56b8556 100644 --- a/api_docs/expression_partition_vis.mdx +++ b/api_docs/expression_partition_vis.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionPartitionVis title: "expressionPartitionVis" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionPartitionVis plugin -date: 2023-05-07 +date: 2023-05-09 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 3233c76e257ad..18d72daf41c24 100644 --- a/api_docs/expression_repeat_image.mdx +++ b/api_docs/expression_repeat_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRepeatImage title: "expressionRepeatImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRepeatImage plugin -date: 2023-05-07 +date: 2023-05-09 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 f8303b3ce91f6..9aa0144b56fdb 100644 --- a/api_docs/expression_reveal_image.mdx +++ b/api_docs/expression_reveal_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionRevealImage title: "expressionRevealImage" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionRevealImage plugin -date: 2023-05-07 +date: 2023-05-09 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 8b1d6b6bb9e57..1517890c72287 100644 --- a/api_docs/expression_shape.mdx +++ b/api_docs/expression_shape.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionShape title: "expressionShape" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionShape plugin -date: 2023-05-07 +date: 2023-05-09 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 939c7c8e0d9a5..c43afaffadfd6 100644 --- a/api_docs/expression_tagcloud.mdx +++ b/api_docs/expression_tagcloud.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionTagcloud title: "expressionTagcloud" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionTagcloud plugin -date: 2023-05-07 +date: 2023-05-09 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 419263c08a916..2f46ef20c762b 100644 --- a/api_docs/expression_x_y.mdx +++ b/api_docs/expression_x_y.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressionXY title: "expressionXY" image: https://source.unsplash.com/400x175/?github description: API docs for the expressionXY plugin -date: 2023-05-07 +date: 2023-05-09 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 6220bba7336aa..3c0fc2860c2d7 100644 --- a/api_docs/expressions.mdx +++ b/api_docs/expressions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/expressions title: "expressions" image: https://source.unsplash.com/400x175/?github description: API docs for the expressions plugin -date: 2023-05-07 +date: 2023-05-09 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 a557954a666e0..27b738a858198 100644 --- a/api_docs/features.mdx +++ b/api_docs/features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/features title: "features" image: https://source.unsplash.com/400x175/?github description: API docs for the features plugin -date: 2023-05-07 +date: 2023-05-09 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 16a0f0d4c8439..4cba701585c6d 100644 --- a/api_docs/field_formats.mdx +++ b/api_docs/field_formats.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fieldFormats title: "fieldFormats" image: https://source.unsplash.com/400x175/?github description: API docs for the fieldFormats plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] --- import fieldFormatsObj from './field_formats.devdocs.json'; diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index 3a72270d60918..00c35285ff76d 100644 --- a/api_docs/file_upload.mdx +++ b/api_docs/file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fileUpload title: "fileUpload" image: https://source.unsplash.com/400x175/?github description: API docs for the fileUpload plugin -date: 2023-05-07 +date: 2023-05-09 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 457430bc3c375..2cbaf1f851d56 100644 --- a/api_docs/files.mdx +++ b/api_docs/files.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/files title: "files" image: https://source.unsplash.com/400x175/?github description: API docs for the files plugin -date: 2023-05-07 +date: 2023-05-09 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 73da0fbdedc6e..b301bd419e883 100644 --- a/api_docs/files_management.mdx +++ b/api_docs/files_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/filesManagement title: "filesManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the filesManagement plugin -date: 2023-05-07 +date: 2023-05-09 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 4af17ce6008be..05f3163e88a1b 100644 --- a/api_docs/fleet.mdx +++ b/api_docs/fleet.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/fleet title: "fleet" image: https://source.unsplash.com/400x175/?github description: API docs for the fleet plugin -date: 2023-05-07 +date: 2023-05-09 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 bb0ff4849f94f..d9d9d6bf71895 100644 --- a/api_docs/global_search.mdx +++ b/api_docs/global_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/globalSearch title: "globalSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the globalSearch plugin -date: 2023-05-07 +date: 2023-05-09 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 d23f847732869..92123e124d12d 100644 --- a/api_docs/guided_onboarding.mdx +++ b/api_docs/guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/guidedOnboarding title: "guidedOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the guidedOnboarding plugin -date: 2023-05-07 +date: 2023-05-09 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 3d690c0e68e9f..73d09cf8e6bab 100644 --- a/api_docs/home.mdx +++ b/api_docs/home.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/home title: "home" image: https://source.unsplash.com/400x175/?github description: API docs for the home plugin -date: 2023-05-07 +date: 2023-05-09 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 057fd0184c363..52551ccad96c5 100644 --- a/api_docs/image_embeddable.mdx +++ b/api_docs/image_embeddable.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/imageEmbeddable title: "imageEmbeddable" image: https://source.unsplash.com/400x175/?github description: API docs for the imageEmbeddable plugin -date: 2023-05-07 +date: 2023-05-09 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 b94d95d3c264c..4aa53cd928493 100644 --- a/api_docs/index_lifecycle_management.mdx +++ b/api_docs/index_lifecycle_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexLifecycleManagement title: "indexLifecycleManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexLifecycleManagement plugin -date: 2023-05-07 +date: 2023-05-09 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 ce19286d93df0..fce5fab252de5 100644 --- a/api_docs/index_management.mdx +++ b/api_docs/index_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/indexManagement title: "indexManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the indexManagement plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] --- import indexManagementObj from './index_management.devdocs.json'; diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index c3385575e09c0..a7680fef4b0f5 100644 --- a/api_docs/infra.mdx +++ b/api_docs/infra.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/infra title: "infra" image: https://source.unsplash.com/400x175/?github description: API docs for the infra plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] --- import infraObj from './infra.devdocs.json'; diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index 4a4ec21a4a69c..a6e1b5314c645 100644 --- a/api_docs/inspector.mdx +++ b/api_docs/inspector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/inspector title: "inspector" image: https://source.unsplash.com/400x175/?github description: API docs for the inspector plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] --- import inspectorObj from './inspector.devdocs.json'; diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx index 6a4940c68b1ef..7a194c077b9b3 100644 --- a/api_docs/interactive_setup.mdx +++ b/api_docs/interactive_setup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/interactiveSetup title: "interactiveSetup" image: https://source.unsplash.com/400x175/?github description: API docs for the interactiveSetup plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] --- import interactiveSetupObj from './interactive_setup.devdocs.json'; diff --git a/api_docs/kbn_ace.mdx b/api_docs/kbn_ace.mdx index 1f8c24f63334d..f6fceceae43a5 100644 --- a/api_docs/kbn_ace.mdx +++ b/api_docs/kbn_ace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ace title: "@kbn/ace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ace plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] --- import kbnAceObj from './kbn_ace.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index 65eba196dc939..7bb7e3e742283 100644 --- a/api_docs/kbn_aiops_components.mdx +++ b/api_docs/kbn_aiops_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-components title: "@kbn/aiops-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-components plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components'] --- import kbnAiopsComponentsObj from './kbn_aiops_components.devdocs.json'; diff --git a/api_docs/kbn_aiops_utils.mdx b/api_docs/kbn_aiops_utils.mdx index 4722aba40cd4a..1b633b6db3a71 100644 --- a/api_docs/kbn_aiops_utils.mdx +++ b/api_docs/kbn_aiops_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-aiops-utils title: "@kbn/aiops-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/aiops-utils plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-utils'] --- import kbnAiopsUtilsObj from './kbn_aiops_utils.devdocs.json'; diff --git a/api_docs/kbn_alerting_state_types.mdx b/api_docs/kbn_alerting_state_types.mdx index 886e61c547f5d..53a1c471d30bb 100644 --- a/api_docs/kbn_alerting_state_types.mdx +++ b/api_docs/kbn_alerting_state_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-state-types title: "@kbn/alerting-state-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-state-types plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-state-types'] --- import kbnAlertingStateTypesObj from './kbn_alerting_state_types.devdocs.json'; diff --git a/api_docs/kbn_alerts.mdx b/api_docs/kbn_alerts.mdx index 71a26ed1c49c2..94c073983718a 100644 --- a/api_docs/kbn_alerts.mdx +++ b/api_docs/kbn_alerts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts title: "@kbn/alerts" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts'] --- import kbnAlertsObj from './kbn_alerts.devdocs.json'; diff --git a/api_docs/kbn_alerts_as_data_utils.mdx b/api_docs/kbn_alerts_as_data_utils.mdx index 514d6a12f704e..877b8601aa243 100644 --- a/api_docs/kbn_alerts_as_data_utils.mdx +++ b/api_docs/kbn_alerts_as_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-as-data-utils title: "@kbn/alerts-as-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-as-data-utils plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerts-as-data-utils'] --- import kbnAlertsAsDataUtilsObj from './kbn_alerts_as_data_utils.devdocs.json'; diff --git a/api_docs/kbn_alerts_ui_shared.mdx b/api_docs/kbn_alerts_ui_shared.mdx index cd11e37f365e5..514e98854ddf8 100644 --- a/api_docs/kbn_alerts_ui_shared.mdx +++ b/api_docs/kbn_alerts_ui_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerts-ui-shared title: "@kbn/alerts-ui-shared" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerts-ui-shared plugin -date: 2023-05-07 +date: 2023-05-09 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 fecf59e7f7e14..36ae4d7a7e2c3 100644 --- a/api_docs/kbn_analytics.mdx +++ b/api_docs/kbn_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics title: "@kbn/analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_client.mdx b/api_docs/kbn_analytics_client.mdx index ebd2f88739a4f..5ddf0ecc0aaa4 100644 --- a/api_docs/kbn_analytics_client.mdx +++ b/api_docs/kbn_analytics_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-client title: "@kbn/analytics-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-client plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-client'] --- import kbnAnalyticsClientObj from './kbn_analytics_client.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx index f922d28b9d05e..9a775575d7c09 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-browser title: "@kbn/analytics-shippers-elastic-v3-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-browser plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-browser'] --- import kbnAnalyticsShippersElasticV3BrowserObj from './kbn_analytics_shippers_elastic_v3_browser.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx index 45cdbb83b51dc..5516c9434f6f9 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-common title: "@kbn/analytics-shippers-elastic-v3-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-common plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-common'] --- import kbnAnalyticsShippersElasticV3CommonObj from './kbn_analytics_shippers_elastic_v3_common.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx index 81cc70f57ef3e..73af67e311779 100644 --- a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx +++ b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-elastic-v3-server title: "@kbn/analytics-shippers-elastic-v3-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-elastic-v3-server plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-server'] --- import kbnAnalyticsShippersElasticV3ServerObj from './kbn_analytics_shippers_elastic_v3_server.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_fullstory.mdx b/api_docs/kbn_analytics_shippers_fullstory.mdx index d465b152f0d0b..7a5fb183bef2f 100644 --- a/api_docs/kbn_analytics_shippers_fullstory.mdx +++ b/api_docs/kbn_analytics_shippers_fullstory.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-fullstory title: "@kbn/analytics-shippers-fullstory" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-fullstory plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-fullstory'] --- import kbnAnalyticsShippersFullstoryObj from './kbn_analytics_shippers_fullstory.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_gainsight.mdx b/api_docs/kbn_analytics_shippers_gainsight.mdx index ae94029f87eba..30ebcb00e2371 100644 --- a/api_docs/kbn_analytics_shippers_gainsight.mdx +++ b/api_docs/kbn_analytics_shippers_gainsight.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-analytics-shippers-gainsight title: "@kbn/analytics-shippers-gainsight" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/analytics-shippers-gainsight plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-gainsight'] --- import kbnAnalyticsShippersGainsightObj from './kbn_analytics_shippers_gainsight.devdocs.json'; diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index caacce801f4c9..2b02a3928069d 100644 --- a/api_docs/kbn_apm_config_loader.mdx +++ b/api_docs/kbn_apm_config_loader.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-config-loader title: "@kbn/apm-config-loader" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-config-loader plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-config-loader'] --- import kbnApmConfigLoaderObj from './kbn_apm_config_loader.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace.mdx b/api_docs/kbn_apm_synthtrace.mdx index e92754fcc428a..a8d3bd1d74688 100644 --- a/api_docs/kbn_apm_synthtrace.mdx +++ b/api_docs/kbn_apm_synthtrace.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace title: "@kbn/apm-synthtrace" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace plugin -date: 2023-05-07 +date: 2023-05-09 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 342c52fbe8a3f..4a12cbbac7b06 100644 --- a/api_docs/kbn_apm_synthtrace_client.mdx +++ b/api_docs/kbn_apm_synthtrace_client.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-synthtrace-client title: "@kbn/apm-synthtrace-client" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-synthtrace-client plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace-client'] --- import kbnApmSynthtraceClientObj from './kbn_apm_synthtrace_client.devdocs.json'; diff --git a/api_docs/kbn_apm_utils.mdx b/api_docs/kbn_apm_utils.mdx index ec9ba2eaef8ae..8a3d9284c4773 100644 --- a/api_docs/kbn_apm_utils.mdx +++ b/api_docs/kbn_apm_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-apm-utils title: "@kbn/apm-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/apm-utils plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils'] --- import kbnApmUtilsObj from './kbn_apm_utils.devdocs.json'; diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx index 26fc64d57574f..8a2d16528e7bf 100644 --- a/api_docs/kbn_axe_config.mdx +++ b/api_docs/kbn_axe_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-axe-config title: "@kbn/axe-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/axe-config plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config'] --- import kbnAxeConfigObj from './kbn_axe_config.devdocs.json'; diff --git a/api_docs/kbn_cases_components.mdx b/api_docs/kbn_cases_components.mdx index 70e48c585cd7e..e97616fc73ebc 100644 --- a/api_docs/kbn_cases_components.mdx +++ b/api_docs/kbn_cases_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cases-components title: "@kbn/cases-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cases-components plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cases-components'] --- import kbnCasesComponentsObj from './kbn_cases_components.devdocs.json'; diff --git a/api_docs/kbn_cell_actions.mdx b/api_docs/kbn_cell_actions.mdx index b0f8ca31ca11b..dc86d687309ed 100644 --- a/api_docs/kbn_cell_actions.mdx +++ b/api_docs/kbn_cell_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cell-actions title: "@kbn/cell-actions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cell-actions plugin -date: 2023-05-07 +date: 2023-05-09 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 a2b4ad25ab1cf..18a935d2d7aad 100644 --- a/api_docs/kbn_chart_expressions_common.mdx +++ b/api_docs/kbn_chart_expressions_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-expressions-common title: "@kbn/chart-expressions-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-expressions-common plugin -date: 2023-05-07 +date: 2023-05-09 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 665af27436352..fb8583627e970 100644 --- a/api_docs/kbn_chart_icons.mdx +++ b/api_docs/kbn_chart_icons.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-chart-icons title: "@kbn/chart-icons" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/chart-icons plugin -date: 2023-05-07 +date: 2023-05-09 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 89475e206ef3a..fcccde48a575a 100644 --- a/api_docs/kbn_ci_stats_core.mdx +++ b/api_docs/kbn_ci_stats_core.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-core title: "@kbn/ci-stats-core" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-core plugin -date: 2023-05-07 +date: 2023-05-09 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 3e7f161f1da56..2a7ecae08e9c4 100644 --- a/api_docs/kbn_ci_stats_performance_metrics.mdx +++ b/api_docs/kbn_ci_stats_performance_metrics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-performance-metrics title: "@kbn/ci-stats-performance-metrics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-performance-metrics plugin -date: 2023-05-07 +date: 2023-05-09 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 e1f6b97397de8..b9e155e2dc7de 100644 --- a/api_docs/kbn_ci_stats_reporter.mdx +++ b/api_docs/kbn_ci_stats_reporter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ci-stats-reporter title: "@kbn/ci-stats-reporter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ci-stats-reporter plugin -date: 2023-05-07 +date: 2023-05-09 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 461c090552af1..c5cd5a99b5a04 100644 --- a/api_docs/kbn_cli_dev_mode.mdx +++ b/api_docs/kbn_cli_dev_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cli-dev-mode title: "@kbn/cli-dev-mode" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cli-dev-mode plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] --- import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json'; diff --git a/api_docs/kbn_code_editor.mdx b/api_docs/kbn_code_editor.mdx index 193562592747d..1bc64507c3a1b 100644 --- a/api_docs/kbn_code_editor.mdx +++ b/api_docs/kbn_code_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor title: "@kbn/code-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor'] --- import kbnCodeEditorObj from './kbn_code_editor.devdocs.json'; diff --git a/api_docs/kbn_code_editor_mocks.mdx b/api_docs/kbn_code_editor_mocks.mdx index ac48ccda6db3c..744b12adeda4f 100644 --- a/api_docs/kbn_code_editor_mocks.mdx +++ b/api_docs/kbn_code_editor_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-code-editor-mocks title: "@kbn/code-editor-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/code-editor-mocks plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/code-editor-mocks'] --- import kbnCodeEditorMocksObj from './kbn_code_editor_mocks.devdocs.json'; diff --git a/api_docs/kbn_coloring.mdx b/api_docs/kbn_coloring.mdx index 6995378642c28..29bce418c133e 100644 --- a/api_docs/kbn_coloring.mdx +++ b/api_docs/kbn_coloring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-coloring title: "@kbn/coloring" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/coloring plugin -date: 2023-05-07 +date: 2023-05-09 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 841169ceabe84..fbac32e14e648 100644 --- a/api_docs/kbn_config.mdx +++ b/api_docs/kbn_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config title: "@kbn/config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config plugin -date: 2023-05-07 +date: 2023-05-09 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 0ca126ac25b33..ff4544554f7b7 100644 --- a/api_docs/kbn_config_mocks.mdx +++ b/api_docs/kbn_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-mocks title: "@kbn/config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 a77e87f1f5d86..3414d97db0c08 100644 --- a/api_docs/kbn_config_schema.mdx +++ b/api_docs/kbn_config_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-config-schema title: "@kbn/config-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/config-schema plugin -date: 2023-05-07 +date: 2023-05-09 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 f1dd3300ecd25..a21ded1b2429f 100644 --- a/api_docs/kbn_content_management_content_editor.mdx +++ b/api_docs/kbn_content_management_content_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-content-editor title: "@kbn/content-management-content-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-content-editor plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-editor'] --- import kbnContentManagementContentEditorObj from './kbn_content_management_content_editor.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list.mdx b/api_docs/kbn_content_management_table_list.mdx index 9cc26826d4bf8..9e3eaa130a321 100644 --- a/api_docs/kbn_content_management_table_list.mdx +++ b/api_docs/kbn_content_management_table_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list title: "@kbn/content-management-table-list" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list'] --- import kbnContentManagementTableListObj from './kbn_content_management_table_list.devdocs.json'; diff --git a/api_docs/kbn_content_management_utils.mdx b/api_docs/kbn_content_management_utils.mdx index a66688a7ed512..0061d60b6f7de 100644 --- a/api_docs/kbn_content_management_utils.mdx +++ b/api_docs/kbn_content_management_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-utils title: "@kbn/content-management-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-utils plugin -date: 2023-05-07 +date: 2023-05-09 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 787eb30aec32c..f045115296649 100644 --- a/api_docs/kbn_core_analytics_browser.mdx +++ b/api_docs/kbn_core_analytics_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser title: "@kbn/core-analytics-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser plugin -date: 2023-05-07 +date: 2023-05-09 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 244d683929b0b..ee15d71697872 100644 --- a/api_docs/kbn_core_analytics_browser_internal.mdx +++ b/api_docs/kbn_core_analytics_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-internal title: "@kbn/core-analytics-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-internal plugin -date: 2023-05-07 +date: 2023-05-09 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 d07c4c88c98d7..504273fbaac17 100644 --- a/api_docs/kbn_core_analytics_browser_mocks.mdx +++ b/api_docs/kbn_core_analytics_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-browser-mocks title: "@kbn/core-analytics-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-browser-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 c633da34cd280..ee63470fbe6cb 100644 --- a/api_docs/kbn_core_analytics_server.mdx +++ b/api_docs/kbn_core_analytics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server title: "@kbn/core-analytics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server plugin -date: 2023-05-07 +date: 2023-05-09 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 ee95e67f91e31..03442adc63af4 100644 --- a/api_docs/kbn_core_analytics_server_internal.mdx +++ b/api_docs/kbn_core_analytics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-internal title: "@kbn/core-analytics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-internal plugin -date: 2023-05-07 +date: 2023-05-09 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 b1e1d4d8a83ae..7e70c10d4344d 100644 --- a/api_docs/kbn_core_analytics_server_mocks.mdx +++ b/api_docs/kbn_core_analytics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-analytics-server-mocks title: "@kbn/core-analytics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-analytics-server-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 8229ec1ea935e..76827da5599cf 100644 --- a/api_docs/kbn_core_application_browser.mdx +++ b/api_docs/kbn_core_application_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser title: "@kbn/core-application-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser plugin -date: 2023-05-07 +date: 2023-05-09 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 f6e3a88bc07fe..97a7c0eae52b0 100644 --- a/api_docs/kbn_core_application_browser_internal.mdx +++ b/api_docs/kbn_core_application_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-internal title: "@kbn/core-application-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-internal plugin -date: 2023-05-07 +date: 2023-05-09 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 ad750d73d9dd5..5825378203a4d 100644 --- a/api_docs/kbn_core_application_browser_mocks.mdx +++ b/api_docs/kbn_core_application_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-browser-mocks title: "@kbn/core-application-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-browser-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 7e03d9e7d10d1..d09c0371ca10b 100644 --- a/api_docs/kbn_core_application_common.mdx +++ b/api_docs/kbn_core_application_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-application-common title: "@kbn/core-application-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-application-common plugin -date: 2023-05-07 +date: 2023-05-09 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 0da3f9afa0c19..93b05f843441a 100644 --- a/api_docs/kbn_core_apps_browser_internal.mdx +++ b/api_docs/kbn_core_apps_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-internal title: "@kbn/core-apps-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-internal plugin -date: 2023-05-07 +date: 2023-05-09 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 cf4a7b9b97122..613c39edd19f3 100644 --- a/api_docs/kbn_core_apps_browser_mocks.mdx +++ b/api_docs/kbn_core_apps_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-browser-mocks title: "@kbn/core-apps-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-browser-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 47de39fd7671f..4c283d08a4a90 100644 --- a/api_docs/kbn_core_apps_server_internal.mdx +++ b/api_docs/kbn_core_apps_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-apps-server-internal title: "@kbn/core-apps-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-apps-server-internal plugin -date: 2023-05-07 +date: 2023-05-09 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 623995659526b..66a31efb18b7a 100644 --- a/api_docs/kbn_core_base_browser_mocks.mdx +++ b/api_docs/kbn_core_base_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-browser-mocks title: "@kbn/core-base-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-browser-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 024b4ee8753ae..81fd3e99d0e68 100644 --- a/api_docs/kbn_core_base_common.mdx +++ b/api_docs/kbn_core_base_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-common title: "@kbn/core-base-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-common plugin -date: 2023-05-07 +date: 2023-05-09 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 4aa3516722fbc..175bad2d6a7d6 100644 --- a/api_docs/kbn_core_base_server_internal.mdx +++ b/api_docs/kbn_core_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-internal title: "@kbn/core-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-internal plugin -date: 2023-05-07 +date: 2023-05-09 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 95a8c52d50e35..944039e854c6c 100644 --- a/api_docs/kbn_core_base_server_mocks.mdx +++ b/api_docs/kbn_core_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-base-server-mocks title: "@kbn/core-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-base-server-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 f77c849a0fce7..b9ac69b0745a3 100644 --- a/api_docs/kbn_core_capabilities_browser_mocks.mdx +++ b/api_docs/kbn_core_capabilities_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-browser-mocks title: "@kbn/core-capabilities-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-browser-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 b6ee77050ccf6..8e52ad778f85e 100644 --- a/api_docs/kbn_core_capabilities_common.mdx +++ b/api_docs/kbn_core_capabilities_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-common title: "@kbn/core-capabilities-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-common plugin -date: 2023-05-07 +date: 2023-05-09 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 e9c999d298e34..cba159692e4ad 100644 --- a/api_docs/kbn_core_capabilities_server.mdx +++ b/api_docs/kbn_core_capabilities_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server title: "@kbn/core-capabilities-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server plugin -date: 2023-05-07 +date: 2023-05-09 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 9284359e3c7e6..1b14722b77bb3 100644 --- a/api_docs/kbn_core_capabilities_server_mocks.mdx +++ b/api_docs/kbn_core_capabilities_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-capabilities-server-mocks title: "@kbn/core-capabilities-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-capabilities-server-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 9861c65c6943f..2696b280ff3db 100644 --- a/api_docs/kbn_core_chrome_browser.mdx +++ b/api_docs/kbn_core_chrome_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser title: "@kbn/core-chrome-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser plugin -date: 2023-05-07 +date: 2023-05-09 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 103a84c552026..1146d15cfb4ab 100644 --- a/api_docs/kbn_core_chrome_browser_mocks.mdx +++ b/api_docs/kbn_core_chrome_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-chrome-browser-mocks title: "@kbn/core-chrome-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-chrome-browser-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 9d23674ff02ce..10442eda00723 100644 --- a/api_docs/kbn_core_config_server_internal.mdx +++ b/api_docs/kbn_core_config_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-config-server-internal title: "@kbn/core-config-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-config-server-internal plugin -date: 2023-05-07 +date: 2023-05-09 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 0d95d3d3bcc0d..90de4befa71fd 100644 --- a/api_docs/kbn_core_custom_branding_browser.mdx +++ b/api_docs/kbn_core_custom_branding_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser title: "@kbn/core-custom-branding-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser plugin -date: 2023-05-07 +date: 2023-05-09 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 effc620649f29..ffc13632e7450 100644 --- a/api_docs/kbn_core_custom_branding_browser_internal.mdx +++ b/api_docs/kbn_core_custom_branding_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-internal title: "@kbn/core-custom-branding-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-internal plugin -date: 2023-05-07 +date: 2023-05-09 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 588f63c62943c..d52d41d1f3353 100644 --- a/api_docs/kbn_core_custom_branding_browser_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-browser-mocks title: "@kbn/core-custom-branding-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-browser-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 b66aed80ea14a..ba3dde2691ac6 100644 --- a/api_docs/kbn_core_custom_branding_common.mdx +++ b/api_docs/kbn_core_custom_branding_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-common title: "@kbn/core-custom-branding-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-common plugin -date: 2023-05-07 +date: 2023-05-09 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 9538c254588d1..0571b654bb736 100644 --- a/api_docs/kbn_core_custom_branding_server.mdx +++ b/api_docs/kbn_core_custom_branding_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server title: "@kbn/core-custom-branding-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server plugin -date: 2023-05-07 +date: 2023-05-09 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 a61545c03e92c..b93e7be7774c7 100644 --- a/api_docs/kbn_core_custom_branding_server_internal.mdx +++ b/api_docs/kbn_core_custom_branding_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-internal title: "@kbn/core-custom-branding-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-internal plugin -date: 2023-05-07 +date: 2023-05-09 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 70030c5a3edb0..e6295113acb96 100644 --- a/api_docs/kbn_core_custom_branding_server_mocks.mdx +++ b/api_docs/kbn_core_custom_branding_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-custom-branding-server-mocks title: "@kbn/core-custom-branding-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-custom-branding-server-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 7b259d6ade3a6..95e44ddae664e 100644 --- a/api_docs/kbn_core_deprecations_browser.mdx +++ b/api_docs/kbn_core_deprecations_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser title: "@kbn/core-deprecations-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser plugin -date: 2023-05-07 +date: 2023-05-09 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 06c4f089642b4..6a870615d6f05 100644 --- a/api_docs/kbn_core_deprecations_browser_internal.mdx +++ b/api_docs/kbn_core_deprecations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-internal title: "@kbn/core-deprecations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-internal plugin -date: 2023-05-07 +date: 2023-05-09 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 98417f3aaafd9..d5371210ec893 100644 --- a/api_docs/kbn_core_deprecations_browser_mocks.mdx +++ b/api_docs/kbn_core_deprecations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-browser-mocks title: "@kbn/core-deprecations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-browser-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 e04af7487641f..589689e49abd7 100644 --- a/api_docs/kbn_core_deprecations_common.mdx +++ b/api_docs/kbn_core_deprecations_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-common title: "@kbn/core-deprecations-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-common plugin -date: 2023-05-07 +date: 2023-05-09 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 bb1499cc7c126..0d8e4bf345178 100644 --- a/api_docs/kbn_core_deprecations_server.mdx +++ b/api_docs/kbn_core_deprecations_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server title: "@kbn/core-deprecations-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server plugin -date: 2023-05-07 +date: 2023-05-09 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 c65ca4a2c5218..71d7f515687cd 100644 --- a/api_docs/kbn_core_deprecations_server_internal.mdx +++ b/api_docs/kbn_core_deprecations_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-internal title: "@kbn/core-deprecations-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-internal plugin -date: 2023-05-07 +date: 2023-05-09 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 a0ba525c9623a..72f9277c2ed2f 100644 --- a/api_docs/kbn_core_deprecations_server_mocks.mdx +++ b/api_docs/kbn_core_deprecations_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-deprecations-server-mocks title: "@kbn/core-deprecations-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-deprecations-server-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 13fd6780d62b2..edd441e35dffa 100644 --- a/api_docs/kbn_core_doc_links_browser.mdx +++ b/api_docs/kbn_core_doc_links_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser title: "@kbn/core-doc-links-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser plugin -date: 2023-05-07 +date: 2023-05-09 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 976836b66096c..46058dbfdf0d1 100644 --- a/api_docs/kbn_core_doc_links_browser_mocks.mdx +++ b/api_docs/kbn_core_doc_links_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-browser-mocks title: "@kbn/core-doc-links-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-browser-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 ea9ee9c1d2799..c962897ecef71 100644 --- a/api_docs/kbn_core_doc_links_server.mdx +++ b/api_docs/kbn_core_doc_links_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server title: "@kbn/core-doc-links-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server plugin -date: 2023-05-07 +date: 2023-05-09 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 a268c716d6f9f..beb47e8e391ec 100644 --- a/api_docs/kbn_core_doc_links_server_mocks.mdx +++ b/api_docs/kbn_core_doc_links_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-doc-links-server-mocks title: "@kbn/core-doc-links-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-doc-links-server-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 4fb15d2a4bdf0..ac3c3bb4f1210 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-internal title: "@kbn/core-elasticsearch-client-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-internal plugin -date: 2023-05-07 +date: 2023-05-09 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 61b192756d9a2..b3bb78aaa2ea4 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-client-server-mocks title: "@kbn/core-elasticsearch-client-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-client-server-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 be6bc3bd852ac..4427b0840aec2 100644 --- a/api_docs/kbn_core_elasticsearch_server.mdx +++ b/api_docs/kbn_core_elasticsearch_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server title: "@kbn/core-elasticsearch-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server plugin -date: 2023-05-07 +date: 2023-05-09 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 51a90d5e2e5c4..a97209fec23df 100644 --- a/api_docs/kbn_core_elasticsearch_server_internal.mdx +++ b/api_docs/kbn_core_elasticsearch_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-internal title: "@kbn/core-elasticsearch-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-internal plugin -date: 2023-05-07 +date: 2023-05-09 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 e06c9592d7aa5..1358bbb338a6c 100644 --- a/api_docs/kbn_core_elasticsearch_server_mocks.mdx +++ b/api_docs/kbn_core_elasticsearch_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-elasticsearch-server-mocks title: "@kbn/core-elasticsearch-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-elasticsearch-server-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 9bde6165db5a2..95d62285e5fb3 100644 --- a/api_docs/kbn_core_environment_server_internal.mdx +++ b/api_docs/kbn_core_environment_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-internal title: "@kbn/core-environment-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-internal plugin -date: 2023-05-07 +date: 2023-05-09 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 6996cf3620e56..6dd4fad8953c0 100644 --- a/api_docs/kbn_core_environment_server_mocks.mdx +++ b/api_docs/kbn_core_environment_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-environment-server-mocks title: "@kbn/core-environment-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-environment-server-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 f503f4302e3c4..f5814a1b98ba4 100644 --- a/api_docs/kbn_core_execution_context_browser.mdx +++ b/api_docs/kbn_core_execution_context_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser title: "@kbn/core-execution-context-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser plugin -date: 2023-05-07 +date: 2023-05-09 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 7989d390a5b16..e4bbb5c72b231 100644 --- a/api_docs/kbn_core_execution_context_browser_internal.mdx +++ b/api_docs/kbn_core_execution_context_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-internal title: "@kbn/core-execution-context-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-internal plugin -date: 2023-05-07 +date: 2023-05-09 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 f043a247b440b..b8b1e70cefd77 100644 --- a/api_docs/kbn_core_execution_context_browser_mocks.mdx +++ b/api_docs/kbn_core_execution_context_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-browser-mocks title: "@kbn/core-execution-context-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-browser-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 0c03418d9662e..8809fa6df2bdd 100644 --- a/api_docs/kbn_core_execution_context_common.mdx +++ b/api_docs/kbn_core_execution_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-common title: "@kbn/core-execution-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-common plugin -date: 2023-05-07 +date: 2023-05-09 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 162f9246796a2..28bf5aea8e5fc 100644 --- a/api_docs/kbn_core_execution_context_server.mdx +++ b/api_docs/kbn_core_execution_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server title: "@kbn/core-execution-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server plugin -date: 2023-05-07 +date: 2023-05-09 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 3fdd7e33294e1..69052a06b10f7 100644 --- a/api_docs/kbn_core_execution_context_server_internal.mdx +++ b/api_docs/kbn_core_execution_context_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-internal title: "@kbn/core-execution-context-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-internal plugin -date: 2023-05-07 +date: 2023-05-09 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 3a0b5dbc64e33..07c8e44ffa3f2 100644 --- a/api_docs/kbn_core_execution_context_server_mocks.mdx +++ b/api_docs/kbn_core_execution_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-execution-context-server-mocks title: "@kbn/core-execution-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-execution-context-server-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 7eb1d47b46b2f..afc41d97d0ed4 100644 --- a/api_docs/kbn_core_fatal_errors_browser.mdx +++ b/api_docs/kbn_core_fatal_errors_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser title: "@kbn/core-fatal-errors-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser plugin -date: 2023-05-07 +date: 2023-05-09 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 d6da56af8f5fc..0b8b2f08f03cb 100644 --- a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx +++ b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-fatal-errors-browser-mocks title: "@kbn/core-fatal-errors-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-fatal-errors-browser-mocks plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser-mocks'] --- import kbnCoreFatalErrorsBrowserMocksObj from './kbn_core_fatal_errors_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser.mdx b/api_docs/kbn_core_http_browser.mdx index af8bf1dc2b484..3c04935f8137a 100644 --- a/api_docs/kbn_core_http_browser.mdx +++ b/api_docs/kbn_core_http_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser title: "@kbn/core-http-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser plugin -date: 2023-05-07 +date: 2023-05-09 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 4c740a79bc939..f0ff9857c1891 100644 --- a/api_docs/kbn_core_http_browser_internal.mdx +++ b/api_docs/kbn_core_http_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-internal title: "@kbn/core-http-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-internal plugin -date: 2023-05-07 +date: 2023-05-09 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 74733305d0432..01bb06fc28542 100644 --- a/api_docs/kbn_core_http_browser_mocks.mdx +++ b/api_docs/kbn_core_http_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-browser-mocks title: "@kbn/core-http-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-browser-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 d35813f5d97cd..b8eeb07634bbe 100644 --- a/api_docs/kbn_core_http_common.mdx +++ b/api_docs/kbn_core_http_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-common title: "@kbn/core-http-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-common plugin -date: 2023-05-07 +date: 2023-05-09 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 f919439911028..c881b3e63bede 100644 --- a/api_docs/kbn_core_http_context_server_mocks.mdx +++ b/api_docs/kbn_core_http_context_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-context-server-mocks title: "@kbn/core-http-context-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-context-server-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 5fef5f7ad8aed..23855066931a3 100644 --- a/api_docs/kbn_core_http_request_handler_context_server.mdx +++ b/api_docs/kbn_core_http_request_handler_context_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-request-handler-context-server title: "@kbn/core-http-request-handler-context-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-request-handler-context-server plugin -date: 2023-05-07 +date: 2023-05-09 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 a583a130bcc0b..da26835ce1623 100644 --- a/api_docs/kbn_core_http_resources_server.mdx +++ b/api_docs/kbn_core_http_resources_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server title: "@kbn/core-http-resources-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server plugin -date: 2023-05-07 +date: 2023-05-09 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 7d697ba73552e..c43b94818b832 100644 --- a/api_docs/kbn_core_http_resources_server_internal.mdx +++ b/api_docs/kbn_core_http_resources_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-internal title: "@kbn/core-http-resources-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-internal plugin -date: 2023-05-07 +date: 2023-05-09 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 31e3bf8502ee4..a9df8af53b5cb 100644 --- a/api_docs/kbn_core_http_resources_server_mocks.mdx +++ b/api_docs/kbn_core_http_resources_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-resources-server-mocks title: "@kbn/core-http-resources-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-resources-server-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 2247c8cfbab80..626e5903c49d6 100644 --- a/api_docs/kbn_core_http_router_server_internal.mdx +++ b/api_docs/kbn_core_http_router_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-internal title: "@kbn/core-http-router-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-internal plugin -date: 2023-05-07 +date: 2023-05-09 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 30a15b0a999d4..b8b0f41611632 100644 --- a/api_docs/kbn_core_http_router_server_mocks.mdx +++ b/api_docs/kbn_core_http_router_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-router-server-mocks title: "@kbn/core-http-router-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-router-server-mocks plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-mocks'] --- import kbnCoreHttpRouterServerMocksObj from './kbn_core_http_router_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_server.devdocs.json b/api_docs/kbn_core_http_server.devdocs.json index 16eafe8893add..c2cb299143bbe 100644 --- a/api_docs/kbn_core_http_server.devdocs.json +++ b/api_docs/kbn_core_http_server.devdocs.json @@ -120,7 +120,7 @@ "section": "def-common.AddVersionOpts", "text": "AddVersionOpts" }, - "" + "" ], "path": "packages/core/http/core-http-server/src/versioning/types.ts", "deprecated": false, @@ -7117,7 +7117,7 @@ "\nAdd a new version of this route" ], "signature": [ - "

(options: ", + "

(options: ", { "pluginId": "@kbn/core-http-server", "scope": "common", @@ -7125,7 +7125,7 @@ "section": "def-common.AddVersionOpts", "text": "AddVersionOpts" }, - ", handler: (context: Ctx, request: ", + ", handler: (context: Ctx, request: ", { "pluginId": "@kbn/core-http-server", "scope": "common", @@ -7157,7 +7157,7 @@ "section": "def-common.IKibanaResponse", "text": "IKibanaResponse" }, - ">) => ", + ">) => ", { "pluginId": "@kbn/core-http-server", "scope": "common", @@ -7186,7 +7186,7 @@ "section": "def-common.AddVersionOpts", "text": "AddVersionOpts" }, - "" + "" ], "path": "packages/core/http/core-http-server/src/versioning/types.ts", "deprecated": false, @@ -7235,7 +7235,7 @@ "section": "def-common.IKibanaResponse", "text": "IKibanaResponse" }, - ">" + ">" ], "path": "packages/core/http/core-http-server/src/versioning/types.ts", "deprecated": false, diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index 7ec42a38ea494..9cd5f5f55b35b 100644 --- a/api_docs/kbn_core_http_server.mdx +++ b/api_docs/kbn_core_http_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server title: "@kbn/core-http-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server plugin -date: 2023-05-07 +date: 2023-05-09 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 c68737cc28790..5d2cb70dff9d5 100644 --- a/api_docs/kbn_core_http_server_internal.mdx +++ b/api_docs/kbn_core_http_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-internal title: "@kbn/core-http-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-internal plugin -date: 2023-05-07 +date: 2023-05-09 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 d9a230e837a95..4dcc3e0c31441 100644 --- a/api_docs/kbn_core_http_server_mocks.mdx +++ b/api_docs/kbn_core_http_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-http-server-mocks title: "@kbn/core-http-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-http-server-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 1be660ce32de9..3a1c44baad8ab 100644 --- a/api_docs/kbn_core_i18n_browser.mdx +++ b/api_docs/kbn_core_i18n_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser title: "@kbn/core-i18n-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser plugin -date: 2023-05-07 +date: 2023-05-09 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 00c3289e4f60d..4ef0f5f39597a 100644 --- a/api_docs/kbn_core_i18n_browser_mocks.mdx +++ b/api_docs/kbn_core_i18n_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-browser-mocks title: "@kbn/core-i18n-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-browser-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 31d81f497fd22..fe837b5e2f813 100644 --- a/api_docs/kbn_core_i18n_server.mdx +++ b/api_docs/kbn_core_i18n_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server title: "@kbn/core-i18n-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server plugin -date: 2023-05-07 +date: 2023-05-09 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 56a8659b0ee7c..efd1af78d487c 100644 --- a/api_docs/kbn_core_i18n_server_internal.mdx +++ b/api_docs/kbn_core_i18n_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-internal title: "@kbn/core-i18n-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-internal plugin -date: 2023-05-07 +date: 2023-05-09 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 fda30ce94563e..ee79d94d1888c 100644 --- a/api_docs/kbn_core_i18n_server_mocks.mdx +++ b/api_docs/kbn_core_i18n_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-i18n-server-mocks title: "@kbn/core-i18n-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-i18n-server-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 b10212ddfb043..259532ed75844 100644 --- a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx +++ b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-injected-metadata-browser-mocks title: "@kbn/core-injected-metadata-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-injected-metadata-browser-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 3a3ef4f49d777..a170488e65627 100644 --- a/api_docs/kbn_core_integrations_browser_internal.mdx +++ b/api_docs/kbn_core_integrations_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-internal title: "@kbn/core-integrations-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-internal plugin -date: 2023-05-07 +date: 2023-05-09 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 a40a3b79c2fa8..09244c1795b04 100644 --- a/api_docs/kbn_core_integrations_browser_mocks.mdx +++ b/api_docs/kbn_core_integrations_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-integrations-browser-mocks title: "@kbn/core-integrations-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-integrations-browser-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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.devdocs.json b/api_docs/kbn_core_lifecycle_browser.devdocs.json index 6db4db92ea115..358b78acc41de 100644 --- a/api_docs/kbn_core_lifecycle_browser.devdocs.json +++ b/api_docs/kbn_core_lifecycle_browser.devdocs.json @@ -627,23 +627,15 @@ }, { "plugin": "discover", - "path": "src/plugins/discover/public/embeddable/search_embeddable_factory.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/main/utils/persist_saved_search.ts" - }, - { - "plugin": "discover", - "path": "src/plugins/discover/public/application/main/hooks/use_discover_state.ts" + "path": "src/plugins/discover/public/application/main/services/discover_saved_search_container.ts" }, { "plugin": "discover", - "path": "src/plugins/discover/public/application/main/discover_main_route.tsx" + "path": "src/plugins/discover/public/application/main/services/discover_saved_search_container.ts" }, { "plugin": "discover", - "path": "src/plugins/discover/public/application/main/discover_main_route.tsx" + "path": "src/plugins/discover/public/embeddable/search_embeddable_factory.ts" }, { "plugin": "fileUpload", @@ -713,6 +705,14 @@ "plugin": "transform", "path": "x-pack/plugins/transform/public/app/mount_management_section.ts" }, + { + "plugin": "discover", + "path": "src/plugins/discover/public/application/main/services/discover_saved_search_container.test.ts" + }, + { + "plugin": "discover", + "path": "src/plugins/discover/public/application/main/services/discover_state.test.ts" + }, { "plugin": "@kbn/core-plugins-browser-internal", "path": "packages/core/plugins/core-plugins-browser-internal/src/plugins_service.test.ts" diff --git a/api_docs/kbn_core_lifecycle_browser.mdx b/api_docs/kbn_core_lifecycle_browser.mdx index 9e7c44f6effa2..dd2f29945f4ad 100644 --- a/api_docs/kbn_core_lifecycle_browser.mdx +++ b/api_docs/kbn_core_lifecycle_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser title: "@kbn/core-lifecycle-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser plugin -date: 2023-05-07 +date: 2023-05-09 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 b9186b56a64ff..4eebd4fd8212d 100644 --- a/api_docs/kbn_core_lifecycle_browser_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-browser-mocks title: "@kbn/core-lifecycle-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-browser-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 299f14c4dae4a..6c5ccbd6e006f 100644 --- a/api_docs/kbn_core_lifecycle_server.mdx +++ b/api_docs/kbn_core_lifecycle_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server title: "@kbn/core-lifecycle-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server plugin -date: 2023-05-07 +date: 2023-05-09 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 d7cb70056ac5a..e98513ba57eba 100644 --- a/api_docs/kbn_core_lifecycle_server_mocks.mdx +++ b/api_docs/kbn_core_lifecycle_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-lifecycle-server-mocks title: "@kbn/core-lifecycle-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-lifecycle-server-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 110992fa1d131..6a3a36c0b4f40 100644 --- a/api_docs/kbn_core_logging_browser_mocks.mdx +++ b/api_docs/kbn_core_logging_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-browser-mocks title: "@kbn/core-logging-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-browser-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 9ad934ce2eee9..4025082e21abf 100644 --- a/api_docs/kbn_core_logging_common_internal.mdx +++ b/api_docs/kbn_core_logging_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-common-internal title: "@kbn/core-logging-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-common-internal plugin -date: 2023-05-07 +date: 2023-05-09 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 b68f86930cd8e..bdf134c3b2ba0 100644 --- a/api_docs/kbn_core_logging_server.mdx +++ b/api_docs/kbn_core_logging_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server title: "@kbn/core-logging-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server plugin -date: 2023-05-07 +date: 2023-05-09 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 fe02d245a27f1..fdfcae4b1b4ad 100644 --- a/api_docs/kbn_core_logging_server_internal.mdx +++ b/api_docs/kbn_core_logging_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-internal title: "@kbn/core-logging-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-internal plugin -date: 2023-05-07 +date: 2023-05-09 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 7874890989973..4bb42847b77ab 100644 --- a/api_docs/kbn_core_logging_server_mocks.mdx +++ b/api_docs/kbn_core_logging_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-logging-server-mocks title: "@kbn/core-logging-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-logging-server-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 b1ebd877b4ea7..0cb3373999ead 100644 --- a/api_docs/kbn_core_metrics_collectors_server_internal.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-internal title: "@kbn/core-metrics-collectors-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-internal plugin -date: 2023-05-07 +date: 2023-05-09 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 b328003311a09..53e550590715e 100644 --- a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-collectors-server-mocks title: "@kbn/core-metrics-collectors-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-collectors-server-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 6861657f18442..8561953e9b7a6 100644 --- a/api_docs/kbn_core_metrics_server.mdx +++ b/api_docs/kbn_core_metrics_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server title: "@kbn/core-metrics-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server plugin -date: 2023-05-07 +date: 2023-05-09 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 37c40c874f1d6..4a6c37316eb96 100644 --- a/api_docs/kbn_core_metrics_server_internal.mdx +++ b/api_docs/kbn_core_metrics_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-internal title: "@kbn/core-metrics-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-internal plugin -date: 2023-05-07 +date: 2023-05-09 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 f4d975ab1f83b..be092f911ccff 100644 --- a/api_docs/kbn_core_metrics_server_mocks.mdx +++ b/api_docs/kbn_core_metrics_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-metrics-server-mocks title: "@kbn/core-metrics-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-metrics-server-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 d12a59a1c82f6..565a6c3c59816 100644 --- a/api_docs/kbn_core_mount_utils_browser.mdx +++ b/api_docs/kbn_core_mount_utils_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-mount-utils-browser title: "@kbn/core-mount-utils-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-mount-utils-browser plugin -date: 2023-05-07 +date: 2023-05-09 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 3ed95bb1ace98..d70fccc3919df 100644 --- a/api_docs/kbn_core_node_server.mdx +++ b/api_docs/kbn_core_node_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server title: "@kbn/core-node-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server plugin -date: 2023-05-07 +date: 2023-05-09 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 d593243bfb0e4..77da46ec1c951 100644 --- a/api_docs/kbn_core_node_server_internal.mdx +++ b/api_docs/kbn_core_node_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-internal title: "@kbn/core-node-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-internal plugin -date: 2023-05-07 +date: 2023-05-09 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 5d96693eb6783..e286062752bf5 100644 --- a/api_docs/kbn_core_node_server_mocks.mdx +++ b/api_docs/kbn_core_node_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-node-server-mocks title: "@kbn/core-node-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-node-server-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 e245a285c4e6a..b150d1f91b004 100644 --- a/api_docs/kbn_core_notifications_browser.mdx +++ b/api_docs/kbn_core_notifications_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser title: "@kbn/core-notifications-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser plugin -date: 2023-05-07 +date: 2023-05-09 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 0f65117561d6a..4ec34cd106e67 100644 --- a/api_docs/kbn_core_notifications_browser_internal.mdx +++ b/api_docs/kbn_core_notifications_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-internal title: "@kbn/core-notifications-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-internal plugin -date: 2023-05-07 +date: 2023-05-09 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 e9bfe64829978..fe3979d70d455 100644 --- a/api_docs/kbn_core_notifications_browser_mocks.mdx +++ b/api_docs/kbn_core_notifications_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-notifications-browser-mocks title: "@kbn/core-notifications-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-notifications-browser-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 0c8add0443090..9d9fa88b0a8a0 100644 --- a/api_docs/kbn_core_overlays_browser.mdx +++ b/api_docs/kbn_core_overlays_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser title: "@kbn/core-overlays-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser plugin -date: 2023-05-07 +date: 2023-05-09 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 63a6209d2a3e8..fe398744b24f2 100644 --- a/api_docs/kbn_core_overlays_browser_internal.mdx +++ b/api_docs/kbn_core_overlays_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-internal title: "@kbn/core-overlays-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-internal plugin -date: 2023-05-07 +date: 2023-05-09 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 6c22c6a00f163..b7444b6c3c14c 100644 --- a/api_docs/kbn_core_overlays_browser_mocks.mdx +++ b/api_docs/kbn_core_overlays_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-overlays-browser-mocks title: "@kbn/core-overlays-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-overlays-browser-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 07659135ddb76..0f338d538cc7c 100644 --- a/api_docs/kbn_core_plugins_browser.mdx +++ b/api_docs/kbn_core_plugins_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser title: "@kbn/core-plugins-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser plugin -date: 2023-05-07 +date: 2023-05-09 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 ee4990c22604a..2f9c83ba990a8 100644 --- a/api_docs/kbn_core_plugins_browser_mocks.mdx +++ b/api_docs/kbn_core_plugins_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-browser-mocks title: "@kbn/core-plugins-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-browser-mocks plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser-mocks'] --- import kbnCorePluginsBrowserMocksObj from './kbn_core_plugins_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server.mdx b/api_docs/kbn_core_plugins_server.mdx index fb6416837af54..d939b9edc5a0c 100644 --- a/api_docs/kbn_core_plugins_server.mdx +++ b/api_docs/kbn_core_plugins_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server title: "@kbn/core-plugins-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server plugin -date: 2023-05-07 +date: 2023-05-09 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 da2188b6668c3..002b0b5a9b62f 100644 --- a/api_docs/kbn_core_plugins_server_mocks.mdx +++ b/api_docs/kbn_core_plugins_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-plugins-server-mocks title: "@kbn/core-plugins-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-plugins-server-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 ea4a3712a4504..b4fd18015684f 100644 --- a/api_docs/kbn_core_preboot_server.mdx +++ b/api_docs/kbn_core_preboot_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server title: "@kbn/core-preboot-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server plugin -date: 2023-05-07 +date: 2023-05-09 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 c765bb7f09369..ab70dfb432574 100644 --- a/api_docs/kbn_core_preboot_server_mocks.mdx +++ b/api_docs/kbn_core_preboot_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-preboot-server-mocks title: "@kbn/core-preboot-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-preboot-server-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 d778d31c2e1df..009d282d26887 100644 --- a/api_docs/kbn_core_rendering_browser_mocks.mdx +++ b/api_docs/kbn_core_rendering_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-browser-mocks title: "@kbn/core-rendering-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-browser-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 69aa91290e723..277050bad8020 100644 --- a/api_docs/kbn_core_rendering_server_internal.mdx +++ b/api_docs/kbn_core_rendering_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-internal title: "@kbn/core-rendering-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-internal plugin -date: 2023-05-07 +date: 2023-05-09 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 294bf9e106daa..4c8de67b15410 100644 --- a/api_docs/kbn_core_rendering_server_mocks.mdx +++ b/api_docs/kbn_core_rendering_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-rendering-server-mocks title: "@kbn/core-rendering-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-rendering-server-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 3ac9fe5165f6c..476606fd4688f 100644 --- a/api_docs/kbn_core_root_server_internal.mdx +++ b/api_docs/kbn_core_root_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-root-server-internal title: "@kbn/core-root-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-root-server-internal plugin -date: 2023-05-07 +date: 2023-05-09 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.devdocs.json b/api_docs/kbn_core_saved_objects_api_browser.devdocs.json index 2bce458f1c7cf..f3c09f5ab7ffb 100644 --- a/api_docs/kbn_core_saved_objects_api_browser.devdocs.json +++ b/api_docs/kbn_core_saved_objects_api_browser.devdocs.json @@ -2412,6 +2412,14 @@ "plugin": "savedSearch", "path": "src/plugins/saved_search/public/services/saved_searches/get_saved_searches.test.ts" }, + { + "plugin": "discover", + "path": "src/plugins/discover/public/application/main/services/discover_saved_search_container.test.ts" + }, + { + "plugin": "discover", + "path": "src/plugins/discover/public/application/main/services/discover_state.test.ts" + }, { "plugin": "@kbn/core-saved-objects-browser-internal", "path": "packages/core/saved-objects/core-saved-objects-browser-internal/src/saved_objects_client.ts" diff --git a/api_docs/kbn_core_saved_objects_api_browser.mdx b/api_docs/kbn_core_saved_objects_api_browser.mdx index 4e1c4a23cad0f..931f91a5c3435 100644 --- a/api_docs/kbn_core_saved_objects_api_browser.mdx +++ b/api_docs/kbn_core_saved_objects_api_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-browser title: "@kbn/core-saved-objects-api-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-browser plugin -date: 2023-05-07 +date: 2023-05-09 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 f7324ccc134a4..127ece6eae509 100644 --- a/api_docs/kbn_core_saved_objects_api_server.mdx +++ b/api_docs/kbn_core_saved_objects_api_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server title: "@kbn/core-saved-objects-api-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server'] --- import kbnCoreSavedObjectsApiServerObj from './kbn_core_saved_objects_api_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server_internal.mdx b/api_docs/kbn_core_saved_objects_api_server_internal.mdx index c0bdfb1d8d036..43e61802f3143 100644 --- a/api_docs/kbn_core_saved_objects_api_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_api_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server-internal title: "@kbn/core-saved-objects-api-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server-internal plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server-internal'] --- import kbnCoreSavedObjectsApiServerInternalObj from './kbn_core_saved_objects_api_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx index 1b25d8d8c29c6..a36d4d0def8b6 100644 --- a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-api-server-mocks title: "@kbn/core-saved-objects-api-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-api-server-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 a35cd0b91b03b..5cefb5d372340 100644 --- a/api_docs/kbn_core_saved_objects_base_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-internal title: "@kbn/core-saved-objects-base-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-internal plugin -date: 2023-05-07 +date: 2023-05-09 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 c91c293d3b23c..20bccf69e7b56 100644 --- a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-base-server-mocks title: "@kbn/core-saved-objects-base-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-base-server-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 1298630578312..b7bbdd2501a60 100644 --- a/api_docs/kbn_core_saved_objects_browser.mdx +++ b/api_docs/kbn_core_saved_objects_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser title: "@kbn/core-saved-objects-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser plugin -date: 2023-05-07 +date: 2023-05-09 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 8338fe06d8139..4c8123db4692d 100644 --- a/api_docs/kbn_core_saved_objects_browser_internal.mdx +++ b/api_docs/kbn_core_saved_objects_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-internal title: "@kbn/core-saved-objects-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-internal plugin -date: 2023-05-07 +date: 2023-05-09 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 9ca8b0f20d6eb..b36ae29ace8bf 100644 --- a/api_docs/kbn_core_saved_objects_browser_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-browser-mocks title: "@kbn/core-saved-objects-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-browser-mocks plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-mocks'] --- import kbnCoreSavedObjectsBrowserMocksObj from './kbn_core_saved_objects_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_common.devdocs.json b/api_docs/kbn_core_saved_objects_common.devdocs.json index a112271f9a015..8d4aeca6a1507 100644 --- a/api_docs/kbn_core_saved_objects_common.devdocs.json +++ b/api_docs/kbn_core_saved_objects_common.devdocs.json @@ -1699,19 +1699,39 @@ }, { "plugin": "synthetics", - "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/api.ts" + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/global_params/actions.ts" }, { "plugin": "synthetics", - "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/api.ts" + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/global_params/actions.ts" }, { "plugin": "synthetics", - "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/effects.ts" + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/global_params/api.ts" }, { "plugin": "synthetics", - "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/effects.ts" + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/global_params/api.ts" + }, + { + "plugin": "synthetics", + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/global_params/api.ts" + }, + { + "plugin": "synthetics", + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/global_params/index.ts" + }, + { + "plugin": "synthetics", + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/global_params/index.ts" + }, + { + "plugin": "synthetics", + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/api.ts" + }, + { + "plugin": "synthetics", + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/api.ts" }, { "plugin": "synthetics", @@ -1719,19 +1739,19 @@ }, { "plugin": "synthetics", - "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/index.ts" + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/effects.ts" }, { "plugin": "synthetics", - "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/index.ts" + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/effects.ts" }, { "plugin": "synthetics", - "path": "x-pack/plugins/synthetics/public/apps/synthetics/components/settings/hooks/use_params_list.ts" + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/index.ts" }, { "plugin": "synthetics", - "path": "x-pack/plugins/synthetics/public/apps/synthetics/components/settings/hooks/use_params_list.ts" + "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/index.ts" }, { "plugin": "cases", diff --git a/api_docs/kbn_core_saved_objects_common.mdx b/api_docs/kbn_core_saved_objects_common.mdx index 8da07e8d6b7ab..c71924edb94f2 100644 --- a/api_docs/kbn_core_saved_objects_common.mdx +++ b/api_docs/kbn_core_saved_objects_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-common title: "@kbn/core-saved-objects-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-common plugin -date: 2023-05-07 +date: 2023-05-09 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 c57c5374bacf1..4ba35962404f5 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-internal title: "@kbn/core-saved-objects-import-export-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-internal plugin -date: 2023-05-07 +date: 2023-05-09 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 197ad5773a5f5..ca6a1d538dc7c 100644 --- a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-import-export-server-mocks title: "@kbn/core-saved-objects-import-export-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-import-export-server-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 10809e6109f30..3bb0bad578536 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-internal title: "@kbn/core-saved-objects-migration-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-internal plugin -date: 2023-05-07 +date: 2023-05-09 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 f31cb2a5ca823..fcb62fd0841a6 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-migration-server-mocks title: "@kbn/core-saved-objects-migration-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-migration-server-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 5e73d47ea1849..9e601c9d89f38 100644 --- a/api_docs/kbn_core_saved_objects_server.mdx +++ b/api_docs/kbn_core_saved_objects_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server title: "@kbn/core-saved-objects-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server'] --- import kbnCoreSavedObjectsServerObj from './kbn_core_saved_objects_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_internal.mdx b/api_docs/kbn_core_saved_objects_server_internal.mdx index a7309a81c6bde..072b0b8e8cc20 100644 --- a/api_docs/kbn_core_saved_objects_server_internal.mdx +++ b/api_docs/kbn_core_saved_objects_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-internal title: "@kbn/core-saved-objects-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-internal plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-internal'] --- import kbnCoreSavedObjectsServerInternalObj from './kbn_core_saved_objects_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_mocks.mdx b/api_docs/kbn_core_saved_objects_server_mocks.mdx index cf77c6be7f50a..c7e4423ab9a64 100644 --- a/api_docs/kbn_core_saved_objects_server_mocks.mdx +++ b/api_docs/kbn_core_saved_objects_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-server-mocks title: "@kbn/core-saved-objects-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-server-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 59a97b3f35eae..72cbea01076f1 100644 --- a/api_docs/kbn_core_saved_objects_utils_server.mdx +++ b/api_docs/kbn_core_saved_objects_utils_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-saved-objects-utils-server title: "@kbn/core-saved-objects-utils-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-saved-objects-utils-server plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-utils-server'] --- import kbnCoreSavedObjectsUtilsServerObj from './kbn_core_saved_objects_utils_server.devdocs.json'; diff --git a/api_docs/kbn_core_status_common.mdx b/api_docs/kbn_core_status_common.mdx index 8b25666564751..cd6fb32611660 100644 --- a/api_docs/kbn_core_status_common.mdx +++ b/api_docs/kbn_core_status_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common title: "@kbn/core-status-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common plugin -date: 2023-05-07 +date: 2023-05-09 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 ffb6a9d0e2830..aacf28546e3b2 100644 --- a/api_docs/kbn_core_status_common_internal.mdx +++ b/api_docs/kbn_core_status_common_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-common-internal title: "@kbn/core-status-common-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-common-internal plugin -date: 2023-05-07 +date: 2023-05-09 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 514aa3f559e21..dd54d5b0a479f 100644 --- a/api_docs/kbn_core_status_server.mdx +++ b/api_docs/kbn_core_status_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server title: "@kbn/core-status-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server plugin -date: 2023-05-07 +date: 2023-05-09 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 f905733b8d570..c080e54bf15f8 100644 --- a/api_docs/kbn_core_status_server_internal.mdx +++ b/api_docs/kbn_core_status_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-internal title: "@kbn/core-status-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-internal plugin -date: 2023-05-07 +date: 2023-05-09 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 f11345670fa1f..dae59c2912888 100644 --- a/api_docs/kbn_core_status_server_mocks.mdx +++ b/api_docs/kbn_core_status_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-status-server-mocks title: "@kbn/core-status-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-status-server-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 256e664e63c69..acb2df6370212 100644 --- a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx +++ b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-deprecations-getters title: "@kbn/core-test-helpers-deprecations-getters" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-deprecations-getters plugin -date: 2023-05-07 +date: 2023-05-09 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 0a3b27f105ef5..e31e3819ce3e1 100644 --- a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx +++ b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-http-setup-browser title: "@kbn/core-test-helpers-http-setup-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-http-setup-browser plugin -date: 2023-05-07 +date: 2023-05-09 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.devdocs.json b/api_docs/kbn_core_test_helpers_kbn_server.devdocs.json index 2dbf01c6a6480..abfa1ee5e5563 100644 --- a/api_docs/kbn_core_test_helpers_kbn_server.devdocs.json +++ b/api_docs/kbn_core_test_helpers_kbn_server.devdocs.json @@ -636,7 +636,7 @@ "label": "startKibana", "description": [], "signature": [ - "() => Promise<", + "(abortSignal?: AbortSignal | undefined) => Promise<", { "pluginId": "@kbn/core-test-helpers-kbn-server", "scope": "common", @@ -649,7 +649,23 @@ "path": "packages/core/test-helpers/core-test-helpers-kbn-server/src/create_root.ts", "deprecated": false, "trackAdoption": false, - "children": [], + "children": [ + { + "parentPluginId": "@kbn/core-test-helpers-kbn-server", + "id": "def-common.TestUtils.startKibana.$1", + "type": "Object", + "tags": [], + "label": "abortSignal", + "description": [], + "signature": [ + "AbortSignal | undefined" + ], + "path": "packages/core/test-helpers/core-test-helpers-kbn-server/src/create_root.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + } + ], "returnComment": [] } ], diff --git a/api_docs/kbn_core_test_helpers_kbn_server.mdx b/api_docs/kbn_core_test_helpers_kbn_server.mdx index 4d4e86d70b00a..7170aadd7c471 100644 --- a/api_docs/kbn_core_test_helpers_kbn_server.mdx +++ b/api_docs/kbn_core_test_helpers_kbn_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-kbn-server title: "@kbn/core-test-helpers-kbn-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-kbn-server plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-kbn-server'] --- import kbnCoreTestHelpersKbnServerObj from './kbn_core_test_helpers_kbn_server.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 54 | 1 | 48 | 0 | +| 55 | 1 | 49 | 0 | ## Common 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 084d8a8b39462..aa7f85797a876 100644 --- a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx +++ b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-so-type-serializer title: "@kbn/core-test-helpers-so-type-serializer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-so-type-serializer plugin -date: 2023-05-07 +date: 2023-05-09 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 95be43a1a86fc..5358e3436a80c 100644 --- a/api_docs/kbn_core_test_helpers_test_utils.mdx +++ b/api_docs/kbn_core_test_helpers_test_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-test-helpers-test-utils title: "@kbn/core-test-helpers-test-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-test-helpers-test-utils plugin -date: 2023-05-07 +date: 2023-05-09 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 8f68fee8605bd..3b3022c2d3551 100644 --- a/api_docs/kbn_core_theme_browser.mdx +++ b/api_docs/kbn_core_theme_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser title: "@kbn/core-theme-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser'] --- import kbnCoreThemeBrowserObj from './kbn_core_theme_browser.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser_internal.mdx b/api_docs/kbn_core_theme_browser_internal.mdx index 2d33459708171..19c2b60a25c00 100644 --- a/api_docs/kbn_core_theme_browser_internal.mdx +++ b/api_docs/kbn_core_theme_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-internal title: "@kbn/core-theme-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser-internal plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-internal'] --- import kbnCoreThemeBrowserInternalObj from './kbn_core_theme_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser_mocks.mdx b/api_docs/kbn_core_theme_browser_mocks.mdx index 212fd67090572..9d288015afce0 100644 --- a/api_docs/kbn_core_theme_browser_mocks.mdx +++ b/api_docs/kbn_core_theme_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-theme-browser-mocks title: "@kbn/core-theme-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-theme-browser-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 1147a70885a8d..3f9b323945616 100644 --- a/api_docs/kbn_core_ui_settings_browser.mdx +++ b/api_docs/kbn_core_ui_settings_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser title: "@kbn/core-ui-settings-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser plugin -date: 2023-05-07 +date: 2023-05-09 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 c3e0235c9e9d7..4d36be8945409 100644 --- a/api_docs/kbn_core_ui_settings_browser_internal.mdx +++ b/api_docs/kbn_core_ui_settings_browser_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-internal title: "@kbn/core-ui-settings-browser-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-internal plugin -date: 2023-05-07 +date: 2023-05-09 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 89df3b4f7a6ec..f97f6ec85deb5 100644 --- a/api_docs/kbn_core_ui_settings_browser_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_browser_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-browser-mocks title: "@kbn/core-ui-settings-browser-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-browser-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 2a427deea54b4..daeec44c0bfb0 100644 --- a/api_docs/kbn_core_ui_settings_common.mdx +++ b/api_docs/kbn_core_ui_settings_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-common title: "@kbn/core-ui-settings-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-common plugin -date: 2023-05-07 +date: 2023-05-09 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 d7f7fa1d52b74..4b9284fdcf814 100644 --- a/api_docs/kbn_core_ui_settings_server.mdx +++ b/api_docs/kbn_core_ui_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server title: "@kbn/core-ui-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server plugin -date: 2023-05-07 +date: 2023-05-09 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 fb4875f26b7d0..61ddffb3e9b8a 100644 --- a/api_docs/kbn_core_ui_settings_server_internal.mdx +++ b/api_docs/kbn_core_ui_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-internal title: "@kbn/core-ui-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-internal plugin -date: 2023-05-07 +date: 2023-05-09 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 553d31f2313e1..430182b79defc 100644 --- a/api_docs/kbn_core_ui_settings_server_mocks.mdx +++ b/api_docs/kbn_core_ui_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-ui-settings-server-mocks title: "@kbn/core-ui-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-ui-settings-server-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 203b2ac851b84..8301af87e2789 100644 --- a/api_docs/kbn_core_usage_data_server.mdx +++ b/api_docs/kbn_core_usage_data_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server title: "@kbn/core-usage-data-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server plugin -date: 2023-05-07 +date: 2023-05-09 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 3a178c6cab7ad..fb617be017326 100644 --- a/api_docs/kbn_core_usage_data_server_internal.mdx +++ b/api_docs/kbn_core_usage_data_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-internal title: "@kbn/core-usage-data-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-internal plugin -date: 2023-05-07 +date: 2023-05-09 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 d7fe7054296a3..5ad20fb70320f 100644 --- a/api_docs/kbn_core_usage_data_server_mocks.mdx +++ b/api_docs/kbn_core_usage_data_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-usage-data-server-mocks title: "@kbn/core-usage-data-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-usage-data-server-mocks plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-mocks'] --- import kbnCoreUsageDataServerMocksObj from './kbn_core_usage_data_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server.mdx b/api_docs/kbn_core_user_settings_server.mdx index 662b32e004020..629ada1ceafc6 100644 --- a/api_docs/kbn_core_user_settings_server.mdx +++ b/api_docs/kbn_core_user_settings_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server title: "@kbn/core-user-settings-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server'] --- import kbnCoreUserSettingsServerObj from './kbn_core_user_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server_internal.mdx b/api_docs/kbn_core_user_settings_server_internal.mdx index 9ccebf40fa667..5e5dac98b1f38 100644 --- a/api_docs/kbn_core_user_settings_server_internal.mdx +++ b/api_docs/kbn_core_user_settings_server_internal.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-internal title: "@kbn/core-user-settings-server-internal" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-internal plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-user-settings-server-internal'] --- import kbnCoreUserSettingsServerInternalObj from './kbn_core_user_settings_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server_mocks.mdx b/api_docs/kbn_core_user_settings_server_mocks.mdx index b0a3f1fb019a6..f7d994aa01d91 100644 --- a/api_docs/kbn_core_user_settings_server_mocks.mdx +++ b/api_docs/kbn_core_user_settings_server_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-core-user-settings-server-mocks title: "@kbn/core-user-settings-server-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/core-user-settings-server-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 be243a5596594..07d4d56c0d803 100644 --- a/api_docs/kbn_crypto.mdx +++ b/api_docs/kbn_crypto.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto title: "@kbn/crypto" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto plugin -date: 2023-05-07 +date: 2023-05-09 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 1aff54e76f76f..4a7999b215b7e 100644 --- a/api_docs/kbn_crypto_browser.mdx +++ b/api_docs/kbn_crypto_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-crypto-browser title: "@kbn/crypto-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/crypto-browser plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_cypress_config.mdx b/api_docs/kbn_cypress_config.mdx index 2f899ff4f9c19..f4a7dc51d98e0 100644 --- a/api_docs/kbn_cypress_config.mdx +++ b/api_docs/kbn_cypress_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-cypress-config title: "@kbn/cypress-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/cypress-config plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cypress-config'] --- import kbnCypressConfigObj from './kbn_cypress_config.devdocs.json'; diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index 497331d0aab2f..34c68654a21bd 100644 --- a/api_docs/kbn_datemath.mdx +++ b/api_docs/kbn_datemath.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-datemath title: "@kbn/datemath" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/datemath plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] --- import kbnDatemathObj from './kbn_datemath.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index 1dccb62784a75..06f59a220b541 100644 --- a/api_docs/kbn_dev_cli_errors.mdx +++ b/api_docs/kbn_dev_cli_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-errors title: "@kbn/dev-cli-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-errors plugin -date: 2023-05-07 +date: 2023-05-09 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 776dc89f92df2..3d8f36825264d 100644 --- a/api_docs/kbn_dev_cli_runner.mdx +++ b/api_docs/kbn_dev_cli_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-cli-runner title: "@kbn/dev-cli-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-cli-runner plugin -date: 2023-05-07 +date: 2023-05-09 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 3cb5539590b8e..cd8a03754d778 100644 --- a/api_docs/kbn_dev_proc_runner.mdx +++ b/api_docs/kbn_dev_proc_runner.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-proc-runner title: "@kbn/dev-proc-runner" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-proc-runner plugin -date: 2023-05-07 +date: 2023-05-09 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 d3988896996e9..0781f27a3b0c6 100644 --- a/api_docs/kbn_dev_utils.mdx +++ b/api_docs/kbn_dev_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dev-utils title: "@kbn/dev-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dev-utils plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.devdocs.json b/api_docs/kbn_doc_links.devdocs.json index 8b1429069a59d..4bba39544d57e 100644 --- a/api_docs/kbn_doc_links.devdocs.json +++ b/api_docs/kbn_doc_links.devdocs.json @@ -929,6 +929,20 @@ "path": "packages/kbn-doc-links/src/types.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/doc-links", + "id": "def-common.DocLinks.synthetics", + "type": "Object", + "tags": [], + "label": "synthetics", + "description": [], + "signature": [ + "{ readonly featureRoles: string; }" + ], + "path": "packages/kbn-doc-links/src/types.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index 6b837a19de62d..b57a64e34a3bf 100644 --- a/api_docs/kbn_doc_links.mdx +++ b/api_docs/kbn_doc_links.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-doc-links title: "@kbn/doc-links" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/doc-links plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/doc-links'] --- import kbnDocLinksObj from './kbn_doc_links.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-docs](https://github.com/orgs/elastic/teams/kibana-docs | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 68 | 0 | 68 | 2 | +| 69 | 0 | 69 | 2 | ## Common diff --git a/api_docs/kbn_docs_utils.mdx b/api_docs/kbn_docs_utils.mdx index c79db6b937fb8..cc53d14ae84d9 100644 --- a/api_docs/kbn_docs_utils.mdx +++ b/api_docs/kbn_docs_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-docs-utils title: "@kbn/docs-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/docs-utils plugin -date: 2023-05-07 +date: 2023-05-09 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 89764ee0c4f3a..3a13b113b150a 100644 --- a/api_docs/kbn_dom_drag_drop.mdx +++ b/api_docs/kbn_dom_drag_drop.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-dom-drag-drop title: "@kbn/dom-drag-drop" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/dom-drag-drop plugin -date: 2023-05-07 +date: 2023-05-09 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 a973b7dc53020..ebe88c46ce3fb 100644 --- a/api_docs/kbn_ebt_tools.mdx +++ b/api_docs/kbn_ebt_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ebt-tools title: "@kbn/ebt-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ebt-tools plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ebt-tools'] --- import kbnEbtToolsObj from './kbn_ebt_tools.devdocs.json'; diff --git a/api_docs/kbn_ecs.mdx b/api_docs/kbn_ecs.mdx index f09497f175c42..3ab40de103ae6 100644 --- a/api_docs/kbn_ecs.mdx +++ b/api_docs/kbn_ecs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs title: "@kbn/ecs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ecs plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs'] --- import kbnEcsObj from './kbn_ecs.devdocs.json'; diff --git a/api_docs/kbn_ecs_data_quality_dashboard.mdx b/api_docs/kbn_ecs_data_quality_dashboard.mdx index 410df0a1abdb7..85559f7657155 100644 --- a/api_docs/kbn_ecs_data_quality_dashboard.mdx +++ b/api_docs/kbn_ecs_data_quality_dashboard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ecs-data-quality-dashboard title: "@kbn/ecs-data-quality-dashboard" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ecs-data-quality-dashboard plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs-data-quality-dashboard'] --- import kbnEcsDataQualityDashboardObj from './kbn_ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index 906f0737539e0..99aadd3ad1d94 100644 --- a/api_docs/kbn_es.mdx +++ b/api_docs/kbn_es.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es title: "@kbn/es" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es plugin -date: 2023-05-07 +date: 2023-05-09 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 28ec66e54de58..820e92283c5a7 100644 --- a/api_docs/kbn_es_archiver.mdx +++ b/api_docs/kbn_es_archiver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-archiver title: "@kbn/es-archiver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-archiver plugin -date: 2023-05-07 +date: 2023-05-09 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 24dc9889dc84a..8a5d82e97acaf 100644 --- a/api_docs/kbn_es_errors.mdx +++ b/api_docs/kbn_es_errors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-errors title: "@kbn/es-errors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-errors plugin -date: 2023-05-07 +date: 2023-05-09 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 0aa269ade0b0b..8e0444fcf97b9 100644 --- a/api_docs/kbn_es_query.mdx +++ b/api_docs/kbn_es_query.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-query title: "@kbn/es-query" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-query plugin -date: 2023-05-07 +date: 2023-05-09 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 e2a39519029db..7cd6f17dbbdd7 100644 --- a/api_docs/kbn_es_types.mdx +++ b/api_docs/kbn_es_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-es-types title: "@kbn/es-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/es-types plugin -date: 2023-05-07 +date: 2023-05-09 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 e92ac0a17686d..1a1239fab90ee 100644 --- a/api_docs/kbn_eslint_plugin_imports.mdx +++ b/api_docs/kbn_eslint_plugin_imports.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-eslint-plugin-imports title: "@kbn/eslint-plugin-imports" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/eslint-plugin-imports plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] --- import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json'; diff --git a/api_docs/kbn_expandable_flyout.mdx b/api_docs/kbn_expandable_flyout.mdx index 3e572a3779092..5d77a74acdd9b 100644 --- a/api_docs/kbn_expandable_flyout.mdx +++ b/api_docs/kbn_expandable_flyout.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-expandable-flyout title: "@kbn/expandable-flyout" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/expandable-flyout plugin -date: 2023-05-07 +date: 2023-05-09 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 9384211751121..4e31ffc62b454 100644 --- a/api_docs/kbn_field_types.mdx +++ b/api_docs/kbn_field_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-field-types title: "@kbn/field-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/field-types plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] --- import kbnFieldTypesObj from './kbn_field_types.devdocs.json'; diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx index 119d12e8c2519..5dbf585f6550b 100644 --- a/api_docs/kbn_find_used_node_modules.mdx +++ b/api_docs/kbn_find_used_node_modules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-find-used-node-modules title: "@kbn/find-used-node-modules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/find-used-node-modules plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/find-used-node-modules'] --- import kbnFindUsedNodeModulesObj from './kbn_find_used_node_modules.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_services.mdx b/api_docs/kbn_ftr_common_functional_services.mdx index c8c33f36010f0..c45852c2b5ca5 100644 --- a/api_docs/kbn_ftr_common_functional_services.mdx +++ b/api_docs/kbn_ftr_common_functional_services.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ftr-common-functional-services title: "@kbn/ftr-common-functional-services" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ftr-common-functional-services plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-services'] --- import kbnFtrCommonFunctionalServicesObj from './kbn_ftr_common_functional_services.devdocs.json'; diff --git a/api_docs/kbn_generate.mdx b/api_docs/kbn_generate.mdx index fa01a4af009d7..78c52a2dfb7f8 100644 --- a/api_docs/kbn_generate.mdx +++ b/api_docs/kbn_generate.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate title: "@kbn/generate" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate'] --- import kbnGenerateObj from './kbn_generate.devdocs.json'; diff --git a/api_docs/kbn_generate_csv.mdx b/api_docs/kbn_generate_csv.mdx index f17bc597f7bfd..99b72012b437a 100644 --- a/api_docs/kbn_generate_csv.mdx +++ b/api_docs/kbn_generate_csv.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-csv title: "@kbn/generate-csv" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-csv plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv'] --- import kbnGenerateCsvObj from './kbn_generate_csv.devdocs.json'; diff --git a/api_docs/kbn_generate_csv_types.mdx b/api_docs/kbn_generate_csv_types.mdx index 554a518043c00..4083ebbcc3452 100644 --- a/api_docs/kbn_generate_csv_types.mdx +++ b/api_docs/kbn_generate_csv_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-csv-types title: "@kbn/generate-csv-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-csv-types plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-csv-types'] --- import kbnGenerateCsvTypesObj from './kbn_generate_csv_types.devdocs.json'; diff --git a/api_docs/kbn_guided_onboarding.mdx b/api_docs/kbn_guided_onboarding.mdx index cc788d3dce7a3..988026e343e4d 100644 --- a/api_docs/kbn_guided_onboarding.mdx +++ b/api_docs/kbn_guided_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-guided-onboarding title: "@kbn/guided-onboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/guided-onboarding plugin -date: 2023-05-07 +date: 2023-05-09 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 b92550dcff2d3..47f3eb8c4d4fa 100644 --- a/api_docs/kbn_handlebars.mdx +++ b/api_docs/kbn_handlebars.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-handlebars title: "@kbn/handlebars" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/handlebars plugin -date: 2023-05-07 +date: 2023-05-09 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 8fba93c99ad10..19c988302fb68 100644 --- a/api_docs/kbn_hapi_mocks.mdx +++ b/api_docs/kbn_hapi_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-hapi-mocks title: "@kbn/hapi-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/hapi-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 34a5399beb6fb..68e52918c5750 100644 --- a/api_docs/kbn_health_gateway_server.mdx +++ b/api_docs/kbn_health_gateway_server.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-health-gateway-server title: "@kbn/health-gateway-server" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/health-gateway-server plugin -date: 2023-05-07 +date: 2023-05-09 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 1247ec88d81b1..c482eba337360 100644 --- a/api_docs/kbn_home_sample_data_card.mdx +++ b/api_docs/kbn_home_sample_data_card.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-card title: "@kbn/home-sample-data-card" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-card plugin -date: 2023-05-07 +date: 2023-05-09 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 90cf68fc34102..87d487c55c4e9 100644 --- a/api_docs/kbn_home_sample_data_tab.mdx +++ b/api_docs/kbn_home_sample_data_tab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-home-sample-data-tab title: "@kbn/home-sample-data-tab" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/home-sample-data-tab plugin -date: 2023-05-07 +date: 2023-05-09 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 b9b54ff5d891e..10a68f1e6664f 100644 --- a/api_docs/kbn_i18n.mdx +++ b/api_docs/kbn_i18n.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n title: "@kbn/i18n" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n plugin -date: 2023-05-07 +date: 2023-05-09 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 4d0f35fa2fed4..ed54c6ddb5e61 100644 --- a/api_docs/kbn_i18n_react.mdx +++ b/api_docs/kbn_i18n_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-i18n-react title: "@kbn/i18n-react" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/i18n-react plugin -date: 2023-05-07 +date: 2023-05-09 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 c5236a60823d4..3e4923e6675d6 100644 --- a/api_docs/kbn_import_resolver.mdx +++ b/api_docs/kbn_import_resolver.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-import-resolver title: "@kbn/import-resolver" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/import-resolver plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx index f6fec72ca6c5c..c7420d7cc9938 100644 --- a/api_docs/kbn_interpreter.mdx +++ b/api_docs/kbn_interpreter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-interpreter title: "@kbn/interpreter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/interpreter plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/interpreter'] --- import kbnInterpreterObj from './kbn_interpreter.devdocs.json'; diff --git a/api_docs/kbn_io_ts_utils.mdx b/api_docs/kbn_io_ts_utils.mdx index 4563e91976c0f..80fcbe9eac06e 100644 --- a/api_docs/kbn_io_ts_utils.mdx +++ b/api_docs/kbn_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-io-ts-utils title: "@kbn/io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/io-ts-utils plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/io-ts-utils'] --- import kbnIoTsUtilsObj from './kbn_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_jest_serializers.mdx b/api_docs/kbn_jest_serializers.mdx index 0f569c7e4b781..84971b7413e9c 100644 --- a/api_docs/kbn_jest_serializers.mdx +++ b/api_docs/kbn_jest_serializers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-jest-serializers title: "@kbn/jest-serializers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/jest-serializers plugin -date: 2023-05-07 +date: 2023-05-09 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 ed185325f7d70..c503a347cf7da 100644 --- a/api_docs/kbn_journeys.mdx +++ b/api_docs/kbn_journeys.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-journeys title: "@kbn/journeys" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/journeys plugin -date: 2023-05-07 +date: 2023-05-09 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 3dea9198460e9..31bc0b626961d 100644 --- a/api_docs/kbn_json_ast.mdx +++ b/api_docs/kbn_json_ast.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-json-ast title: "@kbn/json-ast" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/json-ast plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/json-ast'] --- import kbnJsonAstObj from './kbn_json_ast.devdocs.json'; diff --git a/api_docs/kbn_kibana_manifest_schema.mdx b/api_docs/kbn_kibana_manifest_schema.mdx index 8e92869659352..a72f4b0c31d8c 100644 --- a/api_docs/kbn_kibana_manifest_schema.mdx +++ b/api_docs/kbn_kibana_manifest_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-kibana-manifest-schema title: "@kbn/kibana-manifest-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/kibana-manifest-schema plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/kibana-manifest-schema'] --- import kbnKibanaManifestSchemaObj from './kbn_kibana_manifest_schema.devdocs.json'; diff --git a/api_docs/kbn_language_documentation_popover.mdx b/api_docs/kbn_language_documentation_popover.mdx index 1dff4192540fb..e5d64b7b69653 100644 --- a/api_docs/kbn_language_documentation_popover.mdx +++ b/api_docs/kbn_language_documentation_popover.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-language-documentation-popover title: "@kbn/language-documentation-popover" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/language-documentation-popover plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/language-documentation-popover'] --- import kbnLanguageDocumentationPopoverObj from './kbn_language_documentation_popover.devdocs.json'; diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index ee841659574df..7a5a33f4cc73e 100644 --- a/api_docs/kbn_logging.mdx +++ b/api_docs/kbn_logging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging title: "@kbn/logging" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging plugin -date: 2023-05-07 +date: 2023-05-09 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 bb672082d14a2..6e28f1258d38d 100644 --- a/api_docs/kbn_logging_mocks.mdx +++ b/api_docs/kbn_logging_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-logging-mocks title: "@kbn/logging-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/logging-mocks plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks'] --- import kbnLoggingMocksObj from './kbn_logging_mocks.devdocs.json'; diff --git a/api_docs/kbn_managed_vscode_config.mdx b/api_docs/kbn_managed_vscode_config.mdx index 148b99fab3dc5..cb6e4ca0fdb7f 100644 --- a/api_docs/kbn_managed_vscode_config.mdx +++ b/api_docs/kbn_managed_vscode_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-managed-vscode-config title: "@kbn/managed-vscode-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/managed-vscode-config plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-vscode-config'] --- import kbnManagedVscodeConfigObj from './kbn_managed_vscode_config.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index 352b8ac112670..bd9ae3f67b2f0 100644 --- a/api_docs/kbn_mapbox_gl.mdx +++ b/api_docs/kbn_mapbox_gl.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-mapbox-gl title: "@kbn/mapbox-gl" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/mapbox-gl plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl'] --- import kbnMapboxGlObj from './kbn_mapbox_gl.devdocs.json'; diff --git a/api_docs/kbn_ml_agg_utils.mdx b/api_docs/kbn_ml_agg_utils.mdx index b428552cafca0..fa91824641b7e 100644 --- a/api_docs/kbn_ml_agg_utils.mdx +++ b/api_docs/kbn_ml_agg_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-agg-utils title: "@kbn/ml-agg-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-agg-utils plugin -date: 2023-05-07 +date: 2023-05-09 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 0eb9c7ede7aba..b421843e20cfc 100644 --- a/api_docs/kbn_ml_anomaly_utils.mdx +++ b/api_docs/kbn_ml_anomaly_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-anomaly-utils title: "@kbn/ml-anomaly-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-anomaly-utils plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-anomaly-utils'] --- import kbnMlAnomalyUtilsObj from './kbn_ml_anomaly_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_date_picker.mdx b/api_docs/kbn_ml_date_picker.mdx index 067156f34c86f..066e0780fd24b 100644 --- a/api_docs/kbn_ml_date_picker.mdx +++ b/api_docs/kbn_ml_date_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-picker title: "@kbn/ml-date-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-picker plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-picker'] --- import kbnMlDatePickerObj from './kbn_ml_date_picker.devdocs.json'; diff --git a/api_docs/kbn_ml_error_utils.mdx b/api_docs/kbn_ml_error_utils.mdx index ae639211eb025..d0da5e179dc07 100644 --- a/api_docs/kbn_ml_error_utils.mdx +++ b/api_docs/kbn_ml_error_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-error-utils title: "@kbn/ml-error-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-error-utils plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-error-utils'] --- import kbnMlErrorUtilsObj from './kbn_ml_error_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_is_defined.mdx b/api_docs/kbn_ml_is_defined.mdx index fc9901dc7f7f6..b855d32e3a6a7 100644 --- a/api_docs/kbn_ml_is_defined.mdx +++ b/api_docs/kbn_ml_is_defined.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-defined title: "@kbn/ml-is-defined" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-defined plugin -date: 2023-05-07 +date: 2023-05-09 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 75333a0955b97..99cf51a9c9c6f 100644 --- a/api_docs/kbn_ml_is_populated_object.mdx +++ b/api_docs/kbn_ml_is_populated_object.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-is-populated-object title: "@kbn/ml-is-populated-object" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-is-populated-object plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-populated-object'] --- import kbnMlIsPopulatedObjectObj from './kbn_ml_is_populated_object.devdocs.json'; diff --git a/api_docs/kbn_ml_local_storage.mdx b/api_docs/kbn_ml_local_storage.mdx index b95add310c5bf..9277a25cc1d60 100644 --- a/api_docs/kbn_ml_local_storage.mdx +++ b/api_docs/kbn_ml_local_storage.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-local-storage title: "@kbn/ml-local-storage" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-local-storage plugin -date: 2023-05-07 +date: 2023-05-09 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 59fb9f92eb568..db4836436aa93 100644 --- a/api_docs/kbn_ml_nested_property.mdx +++ b/api_docs/kbn_ml_nested_property.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-nested-property title: "@kbn/ml-nested-property" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-nested-property plugin -date: 2023-05-07 +date: 2023-05-09 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 a9d14a18479b8..55798cf8e287f 100644 --- a/api_docs/kbn_ml_number_utils.mdx +++ b/api_docs/kbn_ml_number_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-number-utils title: "@kbn/ml-number-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-number-utils plugin -date: 2023-05-07 +date: 2023-05-09 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 552a18290b02b..de58f58ff9e1d 100644 --- a/api_docs/kbn_ml_query_utils.mdx +++ b/api_docs/kbn_ml_query_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-query-utils title: "@kbn/ml-query-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-query-utils plugin -date: 2023-05-07 +date: 2023-05-09 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 7ec331e1232db..dd09e3904f0be 100644 --- a/api_docs/kbn_ml_random_sampler_utils.mdx +++ b/api_docs/kbn_ml_random_sampler_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-random-sampler-utils title: "@kbn/ml-random-sampler-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-random-sampler-utils plugin -date: 2023-05-07 +date: 2023-05-09 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 8124c253e12a6..b3ea67ce1442d 100644 --- a/api_docs/kbn_ml_route_utils.mdx +++ b/api_docs/kbn_ml_route_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-route-utils title: "@kbn/ml-route-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-route-utils plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-route-utils'] --- import kbnMlRouteUtilsObj from './kbn_ml_route_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx index b83570ce66202..0e79c5651930e 100644 --- a/api_docs/kbn_ml_string_hash.mdx +++ b/api_docs/kbn_ml_string_hash.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-string-hash title: "@kbn/ml-string-hash" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-string-hash plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-string-hash'] --- import kbnMlStringHashObj from './kbn_ml_string_hash.devdocs.json'; diff --git a/api_docs/kbn_ml_trained_models_utils.mdx b/api_docs/kbn_ml_trained_models_utils.mdx index 7182e411a7b03..5d2c3a21a0ddf 100644 --- a/api_docs/kbn_ml_trained_models_utils.mdx +++ b/api_docs/kbn_ml_trained_models_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-trained-models-utils title: "@kbn/ml-trained-models-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-trained-models-utils plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-trained-models-utils'] --- import kbnMlTrainedModelsUtilsObj from './kbn_ml_trained_models_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_url_state.mdx b/api_docs/kbn_ml_url_state.mdx index 3a0483363a1a4..70efc11a99473 100644 --- a/api_docs/kbn_ml_url_state.mdx +++ b/api_docs/kbn_ml_url_state.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-url-state title: "@kbn/ml-url-state" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-url-state plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-url-state'] --- import kbnMlUrlStateObj from './kbn_ml_url_state.devdocs.json'; diff --git a/api_docs/kbn_monaco.mdx b/api_docs/kbn_monaco.mdx index b01530b7f94fd..361bb4452a6f9 100644 --- a/api_docs/kbn_monaco.mdx +++ b/api_docs/kbn_monaco.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-monaco title: "@kbn/monaco" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/monaco plugin -date: 2023-05-07 +date: 2023-05-09 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 db71c463ee32f..b8ac710e82188 100644 --- a/api_docs/kbn_object_versioning.mdx +++ b/api_docs/kbn_object_versioning.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-object-versioning title: "@kbn/object-versioning" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/object-versioning plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/object-versioning'] --- import kbnObjectVersioningObj from './kbn_object_versioning.devdocs.json'; diff --git a/api_docs/kbn_observability_alert_details.mdx b/api_docs/kbn_observability_alert_details.mdx index 1608a792749e9..a4fa551e69976 100644 --- a/api_docs/kbn_observability_alert_details.mdx +++ b/api_docs/kbn_observability_alert_details.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-observability-alert-details title: "@kbn/observability-alert-details" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/observability-alert-details plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alert-details'] --- import kbnObservabilityAlertDetailsObj from './kbn_observability_alert_details.devdocs.json'; diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index 2200af2570574..0e3074a113a17 100644 --- a/api_docs/kbn_optimizer.mdx +++ b/api_docs/kbn_optimizer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer title: "@kbn/optimizer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer plugin -date: 2023-05-07 +date: 2023-05-09 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 b85fa82f0a0ab..287f6f2352caa 100644 --- a/api_docs/kbn_optimizer_webpack_helpers.mdx +++ b/api_docs/kbn_optimizer_webpack_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-optimizer-webpack-helpers title: "@kbn/optimizer-webpack-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/optimizer-webpack-helpers plugin -date: 2023-05-07 +date: 2023-05-09 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 4e3b8bab95c5d..1cec446b577a6 100644 --- a/api_docs/kbn_osquery_io_ts_types.mdx +++ b/api_docs/kbn_osquery_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-osquery-io-ts-types title: "@kbn/osquery-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/osquery-io-ts-types plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/osquery-io-ts-types'] --- import kbnOsqueryIoTsTypesObj from './kbn_osquery_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index 5a73fcb2ba960..e44538db33f30 100644 --- a/api_docs/kbn_performance_testing_dataset_extractor.mdx +++ b/api_docs/kbn_performance_testing_dataset_extractor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-performance-testing-dataset-extractor title: "@kbn/performance-testing-dataset-extractor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/performance-testing-dataset-extractor plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/performance-testing-dataset-extractor'] --- import kbnPerformanceTestingDatasetExtractorObj from './kbn_performance_testing_dataset_extractor.devdocs.json'; diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx index 0999880b9357e..67a0a8083b058 100644 --- a/api_docs/kbn_plugin_generator.mdx +++ b/api_docs/kbn_plugin_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-generator title: "@kbn/plugin-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-generator plugin -date: 2023-05-07 +date: 2023-05-09 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 ad93ce65a276a..942b000df0a42 100644 --- a/api_docs/kbn_plugin_helpers.mdx +++ b/api_docs/kbn_plugin_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-plugin-helpers title: "@kbn/plugin-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/plugin-helpers plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_random_sampling.mdx b/api_docs/kbn_random_sampling.mdx index c55e5ebca1801..538c849490946 100644 --- a/api_docs/kbn_random_sampling.mdx +++ b/api_docs/kbn_random_sampling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-random-sampling title: "@kbn/random-sampling" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/random-sampling plugin -date: 2023-05-07 +date: 2023-05-09 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 481b790d0cf2f..12d492147b587 100644 --- a/api_docs/kbn_react_field.mdx +++ b/api_docs/kbn_react_field.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-field title: "@kbn/react-field" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-field plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_repo_file_maps.mdx b/api_docs/kbn_repo_file_maps.mdx index ef801b2eabc61..23908dfa28eab 100644 --- a/api_docs/kbn_repo_file_maps.mdx +++ b/api_docs/kbn_repo_file_maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-file-maps title: "@kbn/repo-file-maps" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-file-maps plugin -date: 2023-05-07 +date: 2023-05-09 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 c9276070053e4..7e6073e2230e1 100644 --- a/api_docs/kbn_repo_linter.mdx +++ b/api_docs/kbn_repo_linter.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-linter title: "@kbn/repo-linter" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-linter plugin -date: 2023-05-07 +date: 2023-05-09 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 c4a7a8f796055..58e3358105bef 100644 --- a/api_docs/kbn_repo_path.mdx +++ b/api_docs/kbn_repo_path.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-path title: "@kbn/repo-path" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-path plugin -date: 2023-05-07 +date: 2023-05-09 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 6cf8023612c09..be10b1206e8ca 100644 --- a/api_docs/kbn_repo_source_classifier.mdx +++ b/api_docs/kbn_repo_source_classifier.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-repo-source-classifier title: "@kbn/repo-source-classifier" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/repo-source-classifier plugin -date: 2023-05-07 +date: 2023-05-09 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 f3a7e01a167c5..2b07fb561f973 100644 --- a/api_docs/kbn_reporting_common.mdx +++ b/api_docs/kbn_reporting_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-reporting-common title: "@kbn/reporting-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/reporting-common plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/reporting-common'] --- import kbnReportingCommonObj from './kbn_reporting_common.devdocs.json'; diff --git a/api_docs/kbn_rison.mdx b/api_docs/kbn_rison.mdx index 8f0e4e2ae0d95..107b633e08596 100644 --- a/api_docs/kbn_rison.mdx +++ b/api_docs/kbn_rison.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rison title: "@kbn/rison" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rison plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index f7ecc8c840253..851e94bd87861 100644 --- a/api_docs/kbn_rule_data_utils.mdx +++ b/api_docs/kbn_rule_data_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rule-data-utils title: "@kbn/rule-data-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rule-data-utils plugin -date: 2023-05-07 +date: 2023-05-09 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 d259084238454..530f2dc6d9f00 100644 --- a/api_docs/kbn_saved_objects_settings.mdx +++ b/api_docs/kbn_saved_objects_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-saved-objects-settings title: "@kbn/saved-objects-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/saved-objects-settings plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/saved-objects-settings'] --- import kbnSavedObjectsSettingsObj from './kbn_saved_objects_settings.devdocs.json'; diff --git a/api_docs/kbn_security_solution_side_nav.mdx b/api_docs/kbn_security_solution_side_nav.mdx index c9bf331a35ac8..1590b4a324133 100644 --- a/api_docs/kbn_security_solution_side_nav.mdx +++ b/api_docs/kbn_security_solution_side_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-side-nav title: "@kbn/security-solution-side-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-side-nav plugin -date: 2023-05-07 +date: 2023-05-09 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 9e7966a1f327b..40daf73d52c59 100644 --- a/api_docs/kbn_security_solution_storybook_config.mdx +++ b/api_docs/kbn_security_solution_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-storybook-config title: "@kbn/security-solution-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-storybook-config plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-storybook-config'] --- import kbnSecuritySolutionStorybookConfigObj from './kbn_security_solution_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_autocomplete.mdx b/api_docs/kbn_securitysolution_autocomplete.mdx index 2062780d73052..db7ab4fffc185 100644 --- a/api_docs/kbn_securitysolution_autocomplete.mdx +++ b/api_docs/kbn_securitysolution_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-autocomplete title: "@kbn/securitysolution-autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-autocomplete plugin -date: 2023-05-07 +date: 2023-05-09 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 6ef0af2e73766..db04d625a3824 100644 --- a/api_docs/kbn_securitysolution_data_table.mdx +++ b/api_docs/kbn_securitysolution_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-data-table title: "@kbn/securitysolution-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-data-table plugin -date: 2023-05-07 +date: 2023-05-09 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 29e7e20b3550e..8bbe523e22f8f 100644 --- a/api_docs/kbn_securitysolution_ecs.mdx +++ b/api_docs/kbn_securitysolution_ecs.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-ecs title: "@kbn/securitysolution-ecs" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-ecs plugin -date: 2023-05-07 +date: 2023-05-09 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 f79dff45dae33..33da1eac0008a 100644 --- a/api_docs/kbn_securitysolution_es_utils.mdx +++ b/api_docs/kbn_securitysolution_es_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-es-utils title: "@kbn/securitysolution-es-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-es-utils plugin -date: 2023-05-07 +date: 2023-05-09 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 e0d3347dcf55a..f5329b05e986e 100644 --- a/api_docs/kbn_securitysolution_exception_list_components.mdx +++ b/api_docs/kbn_securitysolution_exception_list_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-exception-list-components title: "@kbn/securitysolution-exception-list-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-exception-list-components plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-exception-list-components'] --- import kbnSecuritysolutionExceptionListComponentsObj from './kbn_securitysolution_exception_list_components.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_grouping.mdx b/api_docs/kbn_securitysolution_grouping.mdx index fa9a1ddf758fa..8240600ce4e06 100644 --- a/api_docs/kbn_securitysolution_grouping.mdx +++ b/api_docs/kbn_securitysolution_grouping.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-grouping title: "@kbn/securitysolution-grouping" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-grouping plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-grouping'] --- import kbnSecuritysolutionGroupingObj from './kbn_securitysolution_grouping.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_hook_utils.mdx b/api_docs/kbn_securitysolution_hook_utils.mdx index 0ce43c34f1a7e..095239797c777 100644 --- a/api_docs/kbn_securitysolution_hook_utils.mdx +++ b/api_docs/kbn_securitysolution_hook_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-hook-utils title: "@kbn/securitysolution-hook-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-hook-utils plugin -date: 2023-05-07 +date: 2023-05-09 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 bfdc8bfe47ba4..cbbd85dc5eb08 100644 --- a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-alerting-types title: "@kbn/securitysolution-io-ts-alerting-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-alerting-types plugin -date: 2023-05-07 +date: 2023-05-09 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 f62f221439ab0..7426faec3690f 100644 --- a/api_docs/kbn_securitysolution_io_ts_list_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_list_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-list-types title: "@kbn/securitysolution-io-ts-list-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-list-types plugin -date: 2023-05-07 +date: 2023-05-09 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 d280b1957b676..d15f7c69cc82e 100644 --- a/api_docs/kbn_securitysolution_io_ts_types.mdx +++ b/api_docs/kbn_securitysolution_io_ts_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-types title: "@kbn/securitysolution-io-ts-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-types plugin -date: 2023-05-07 +date: 2023-05-09 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 7ffbb2251ca9f..160ba3c0cb7c0 100644 --- a/api_docs/kbn_securitysolution_io_ts_utils.mdx +++ b/api_docs/kbn_securitysolution_io_ts_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-io-ts-utils title: "@kbn/securitysolution-io-ts-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-io-ts-utils plugin -date: 2023-05-07 +date: 2023-05-09 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 4aa88d803255f..cca631d76fcf2 100644 --- a/api_docs/kbn_securitysolution_list_api.mdx +++ b/api_docs/kbn_securitysolution_list_api.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-api title: "@kbn/securitysolution-list-api" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-api plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-api'] --- import kbnSecuritysolutionListApiObj from './kbn_securitysolution_list_api.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_constants.mdx b/api_docs/kbn_securitysolution_list_constants.mdx index a10d6b57145a2..ba6f33a64484b 100644 --- a/api_docs/kbn_securitysolution_list_constants.mdx +++ b/api_docs/kbn_securitysolution_list_constants.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-constants title: "@kbn/securitysolution-list-constants" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-constants plugin -date: 2023-05-07 +date: 2023-05-09 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 22f756477855b..d3ada0c636a17 100644 --- a/api_docs/kbn_securitysolution_list_hooks.mdx +++ b/api_docs/kbn_securitysolution_list_hooks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-hooks title: "@kbn/securitysolution-list-hooks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-hooks plugin -date: 2023-05-07 +date: 2023-05-09 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 741e42609c39a..bc1552eba3518 100644 --- a/api_docs/kbn_securitysolution_list_utils.mdx +++ b/api_docs/kbn_securitysolution_list_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-list-utils title: "@kbn/securitysolution-list-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-list-utils plugin -date: 2023-05-07 +date: 2023-05-09 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 fe86e9b091892..180940063e056 100644 --- a/api_docs/kbn_securitysolution_rules.mdx +++ b/api_docs/kbn_securitysolution_rules.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-rules title: "@kbn/securitysolution-rules" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-rules plugin -date: 2023-05-07 +date: 2023-05-09 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 35f792cae9506..949f3a24e168c 100644 --- a/api_docs/kbn_securitysolution_t_grid.mdx +++ b/api_docs/kbn_securitysolution_t_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-t-grid title: "@kbn/securitysolution-t-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-t-grid plugin -date: 2023-05-07 +date: 2023-05-09 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 37a550c5b5af4..0b70190849018 100644 --- a/api_docs/kbn_securitysolution_utils.mdx +++ b/api_docs/kbn_securitysolution_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-securitysolution-utils title: "@kbn/securitysolution-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/securitysolution-utils plugin -date: 2023-05-07 +date: 2023-05-09 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 8f484a655efc6..09391c33e456e 100644 --- a/api_docs/kbn_server_http_tools.mdx +++ b/api_docs/kbn_server_http_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-http-tools title: "@kbn/server-http-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-http-tools plugin -date: 2023-05-07 +date: 2023-05-09 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 ebffa49138453..a741ff5711751 100644 --- a/api_docs/kbn_server_route_repository.mdx +++ b/api_docs/kbn_server_route_repository.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-server-route-repository title: "@kbn/server-route-repository" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/server-route-repository plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_serverless_project_switcher.mdx b/api_docs/kbn_serverless_project_switcher.mdx index 1a42ef80fb0de..58387a1272315 100644 --- a/api_docs/kbn_serverless_project_switcher.mdx +++ b/api_docs/kbn_serverless_project_switcher.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-project-switcher title: "@kbn/serverless-project-switcher" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-project-switcher plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-project-switcher'] --- import kbnServerlessProjectSwitcherObj from './kbn_serverless_project_switcher.devdocs.json'; diff --git a/api_docs/kbn_serverless_storybook_config.mdx b/api_docs/kbn_serverless_storybook_config.mdx index 5eacd9b0a82f6..288a7df3f7f59 100644 --- a/api_docs/kbn_serverless_storybook_config.mdx +++ b/api_docs/kbn_serverless_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-storybook-config title: "@kbn/serverless-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-storybook-config plugin -date: 2023-05-07 +date: 2023-05-09 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 b17255137db88..cdfe30db63aaa 100644 --- a/api_docs/kbn_shared_svg.mdx +++ b/api_docs/kbn_shared_svg.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-svg title: "@kbn/shared-svg" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-svg plugin -date: 2023-05-07 +date: 2023-05-09 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 a57196c14281b..7949ae21735a4 100644 --- a/api_docs/kbn_shared_ux_avatar_solution.mdx +++ b/api_docs/kbn_shared_ux_avatar_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-solution title: "@kbn/shared-ux-avatar-solution" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-avatar-solution plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-solution'] --- import kbnSharedUxAvatarSolutionObj from './kbn_shared_ux_avatar_solution.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx b/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx index 9ebebf364f044..a9eced1cca923 100644 --- a/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx +++ b/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-avatar-user-profile-components title: "@kbn/shared-ux-avatar-user-profile-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-avatar-user-profile-components plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-user-profile-components'] --- import kbnSharedUxAvatarUserProfileComponentsObj from './kbn_shared_ux_avatar_user_profile_components.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx index 17fbc06b566f6..ad8d7f58c7f8a 100644 --- a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx +++ b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen title: "@kbn/shared-ux-button-exit-full-screen" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-exit-full-screen plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen'] --- import kbnSharedUxButtonExitFullScreenObj from './kbn_shared_ux_button_exit_full_screen.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx index 1e7944531d452..b8b2abbfb348e 100644 --- a/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx +++ b/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-exit-full-screen-mocks title: "@kbn/shared-ux-button-exit-full-screen-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-exit-full-screen-mocks plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen-mocks'] --- import kbnSharedUxButtonExitFullScreenMocksObj from './kbn_shared_ux_button_exit_full_screen_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index be7b573c54aa3..65068b94e83b2 100644 --- a/api_docs/kbn_shared_ux_button_toolbar.mdx +++ b/api_docs/kbn_shared_ux_button_toolbar.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-button-toolbar title: "@kbn/shared-ux-button-toolbar" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-button-toolbar plugin -date: 2023-05-07 +date: 2023-05-09 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 d2919745be9f7..fda7e361b86af 100644 --- a/api_docs/kbn_shared_ux_card_no_data.mdx +++ b/api_docs/kbn_shared_ux_card_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data title: "@kbn/shared-ux-card-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data plugin -date: 2023-05-07 +date: 2023-05-09 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 1787030b03df3..fbe40af454cfa 100644 --- a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-card-no-data-mocks title: "@kbn/shared-ux-card-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-card-no-data-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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.devdocs.json b/api_docs/kbn_shared_ux_chrome_navigation.devdocs.json index dd64a48110a40..931df887806eb 100644 --- a/api_docs/kbn_shared_ux_chrome_navigation.devdocs.json +++ b/api_docs/kbn_shared_ux_chrome_navigation.devdocs.json @@ -27,7 +27,7 @@ "label": "Navigation", "description": [], "signature": [ - "({ platformConfig, navigationTree, homeHref, linkToCloud, activeNavItemId: activeNavItemIdProps, }: Props) => JSX.Element" + "({ platformConfig, navigationTree, homeHref, linkToCloud, activeNavItemId: activeNavItemIdProps, ...props }: Props) => JSX.Element" ], "path": "packages/shared-ux/chrome/navigation/src/ui/navigation.tsx", "deprecated": false, @@ -38,7 +38,7 @@ "id": "def-common.Navigation.$1", "type": "Object", "tags": [], - "label": "{\n platformConfig,\n navigationTree,\n homeHref,\n linkToCloud,\n activeNavItemId: activeNavItemIdProps,\n}", + "label": "{\n platformConfig,\n navigationTree,\n homeHref,\n linkToCloud,\n activeNavItemId: activeNavItemIdProps,\n ...props\n}", "description": [], "signature": [ "Props" @@ -226,6 +226,45 @@ "path": "packages/shared-ux/chrome/navigation/types/index.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/shared-ux-chrome-navigation", + "id": "def-common.ChromeNavigation.recentlyAccessedFilter", + "type": "Function", + "tags": [], + "label": "recentlyAccessedFilter", + "description": [ + "\nFilter function to allow consumer to remove items from the recently accessed section" + ], + "signature": [ + "((items: ", + "RecentItem", + "[]) => ", + "RecentItem", + "[]) | undefined" + ], + "path": "packages/shared-ux/chrome/navigation/types/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/shared-ux-chrome-navigation", + "id": "def-common.ChromeNavigation.recentlyAccessedFilter.$1", + "type": "Array", + "tags": [], + "label": "items", + "description": [], + "signature": [ + "RecentItem", + "[]" + ], + "path": "packages/shared-ux/chrome/navigation/types/index.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] } ], "initialIsOpen": false @@ -486,11 +525,32 @@ }, { "parentPluginId": "@kbn/shared-ux-chrome-navigation", - "id": "def-common.NavigationServices.loadingCount", - "type": "number", + "id": "def-common.NavigationServices.loadingCount$", + "type": "Object", + "tags": [], + "label": "loadingCount$", + "description": [], + "signature": [ + "Observable", + "" + ], + "path": "packages/shared-ux/chrome/navigation/types/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/shared-ux-chrome-navigation", + "id": "def-common.NavigationServices.recentlyAccessed$", + "type": "Object", "tags": [], - "label": "loadingCount", + "label": "recentlyAccessed$", "description": [], + "signature": [ + "Observable", + "<", + "RecentItem", + "[]>" + ], "path": "packages/shared-ux/chrome/navigation/types/index.ts", "deprecated": false, "trackAdoption": false diff --git a/api_docs/kbn_shared_ux_chrome_navigation.mdx b/api_docs/kbn_shared_ux_chrome_navigation.mdx index cbe4aee50e5ca..317b402d693d9 100644 --- a/api_docs/kbn_shared_ux_chrome_navigation.mdx +++ b/api_docs/kbn_shared_ux_chrome_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-chrome-navigation title: "@kbn/shared-ux-chrome-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-chrome-navigation plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-chrome-navigation'] --- import kbnSharedUxChromeNavigationObj from './kbn_shared_ux_chrome_navigation.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sh | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 31 | 0 | 15 | 2 | +| 34 | 0 | 17 | 3 | ## Common diff --git a/api_docs/kbn_shared_ux_file_context.mdx b/api_docs/kbn_shared_ux_file_context.mdx index b1e4ea5ca2a3a..d737a71ff780d 100644 --- a/api_docs/kbn_shared_ux_file_context.mdx +++ b/api_docs/kbn_shared_ux_file_context.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-context title: "@kbn/shared-ux-file-context" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-context plugin -date: 2023-05-07 +date: 2023-05-09 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 e02b1bb8104b2..adb49aebd37c5 100644 --- a/api_docs/kbn_shared_ux_file_image.mdx +++ b/api_docs/kbn_shared_ux_file_image.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image title: "@kbn/shared-ux-file-image" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image plugin -date: 2023-05-07 +date: 2023-05-09 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 ad00bb6e0b1df..bbf69da03e9fa 100644 --- a/api_docs/kbn_shared_ux_file_image_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_image_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-image-mocks title: "@kbn/shared-ux-file-image-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-image-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 c190183731438..daffc2769bdfa 100644 --- a/api_docs/kbn_shared_ux_file_mocks.mdx +++ b/api_docs/kbn_shared_ux_file_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-mocks title: "@kbn/shared-ux-file-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 ffe2cf025a939..5c258465b40aa 100644 --- a/api_docs/kbn_shared_ux_file_picker.mdx +++ b/api_docs/kbn_shared_ux_file_picker.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-picker title: "@kbn/shared-ux-file-picker" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-picker plugin -date: 2023-05-07 +date: 2023-05-09 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 cb5e706f945c7..85fc71bdb6307 100644 --- a/api_docs/kbn_shared_ux_file_types.mdx +++ b/api_docs/kbn_shared_ux_file_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-types title: "@kbn/shared-ux-file-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-types plugin -date: 2023-05-07 +date: 2023-05-09 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 38a9d2338a910..52df21beaa7f9 100644 --- a/api_docs/kbn_shared_ux_file_upload.mdx +++ b/api_docs/kbn_shared_ux_file_upload.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-upload title: "@kbn/shared-ux-file-upload" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-upload plugin -date: 2023-05-07 +date: 2023-05-09 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 aed2c1e0da3a9..30bafa89efbdc 100644 --- a/api_docs/kbn_shared_ux_file_util.mdx +++ b/api_docs/kbn_shared_ux_file_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-file-util title: "@kbn/shared-ux-file-util" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-file-util plugin -date: 2023-05-07 +date: 2023-05-09 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 27daa3a2abf4c..e94f624d5769b 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app title: "@kbn/shared-ux-link-redirect-app" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app plugin -date: 2023-05-07 +date: 2023-05-09 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 41c2676d8ebd1..cfc2dc179efb7 100644 --- a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx +++ b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-link-redirect-app-mocks title: "@kbn/shared-ux-link-redirect-app-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-link-redirect-app-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 f8a0af95f5375..311c43e3b7ab3 100644 --- a/api_docs/kbn_shared_ux_markdown.mdx +++ b/api_docs/kbn_shared_ux_markdown.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown title: "@kbn/shared-ux-markdown" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown plugin -date: 2023-05-07 +date: 2023-05-09 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 397a59329cad9..d332b50e2f540 100644 --- a/api_docs/kbn_shared_ux_markdown_mocks.mdx +++ b/api_docs/kbn_shared_ux_markdown_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-markdown-mocks title: "@kbn/shared-ux-markdown-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-markdown-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 4b9cf766a08bc..94541ecd39f14 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data title: "@kbn/shared-ux-page-analytics-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data plugin -date: 2023-05-07 +date: 2023-05-09 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 a7664b580acf7..0f0918f0f5cd1 100644 --- a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-analytics-no-data-mocks title: "@kbn/shared-ux-page-analytics-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-analytics-no-data-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 5fc059b5f9467..7c59acf57ba20 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data title: "@kbn/shared-ux-page-kibana-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data plugin -date: 2023-05-07 +date: 2023-05-09 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 bdad9f26332f6..289c12b109e28 100644 --- a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-no-data-mocks title: "@kbn/shared-ux-page-kibana-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-no-data-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 c55ec200f8899..b85d4bc755bec 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template title: "@kbn/shared-ux-page-kibana-template" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template plugin -date: 2023-05-07 +date: 2023-05-09 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 07283d1e905c7..c563bacd4e858 100644 --- a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-kibana-template-mocks title: "@kbn/shared-ux-page-kibana-template-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-kibana-template-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 158cf83a64522..6cfcc5ac66c43 100644 --- a/api_docs/kbn_shared_ux_page_no_data.mdx +++ b/api_docs/kbn_shared_ux_page_no_data.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data title: "@kbn/shared-ux-page-no-data" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data plugin -date: 2023-05-07 +date: 2023-05-09 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 7caa9f0f25452..8676af6c76f75 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config title: "@kbn/shared-ux-page-no-data-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config plugin -date: 2023-05-07 +date: 2023-05-09 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 b0b96167cc56a..ec03083b3e98b 100644 --- a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-config-mocks title: "@kbn/shared-ux-page-no-data-config-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-config-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 e28bd8ca19215..3deb41aeb18fa 100644 --- a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx +++ b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-no-data-mocks title: "@kbn/shared-ux-page-no-data-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-no-data-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 bf66c63104ac6..3b9b13e4bc3cc 100644 --- a/api_docs/kbn_shared_ux_page_solution_nav.mdx +++ b/api_docs/kbn_shared_ux_page_solution_nav.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-page-solution-nav title: "@kbn/shared-ux-page-solution-nav" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-page-solution-nav plugin -date: 2023-05-07 +date: 2023-05-09 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 2d48b7572fdea..ca6aeaeb0e92c 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views title: "@kbn/shared-ux-prompt-no-data-views" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views plugin -date: 2023-05-07 +date: 2023-05-09 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 09e193317d30f..9187d13e894dd 100644 --- a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx +++ b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-no-data-views-mocks title: "@kbn/shared-ux-prompt-no-data-views-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-no-data-views-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 ce8c14e6705b7..c31745749f545 100644 --- a/api_docs/kbn_shared_ux_prompt_not_found.mdx +++ b/api_docs/kbn_shared_ux_prompt_not_found.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-prompt-not-found title: "@kbn/shared-ux-prompt-not-found" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-prompt-not-found plugin -date: 2023-05-07 +date: 2023-05-09 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 0456bee00aaab..e0c04556b3a35 100644 --- a/api_docs/kbn_shared_ux_router.mdx +++ b/api_docs/kbn_shared_ux_router.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router title: "@kbn/shared-ux-router" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router plugin -date: 2023-05-07 +date: 2023-05-09 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 75272de56ac5c..9a056194c46c6 100644 --- a/api_docs/kbn_shared_ux_router_mocks.mdx +++ b/api_docs/kbn_shared_ux_router_mocks.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-router-mocks title: "@kbn/shared-ux-router-mocks" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-router-mocks plugin -date: 2023-05-07 +date: 2023-05-09 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 51598af60ac3a..3a33199383ea4 100644 --- a/api_docs/kbn_shared_ux_storybook_config.mdx +++ b/api_docs/kbn_shared_ux_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-config title: "@kbn/shared-ux-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-config plugin -date: 2023-05-07 +date: 2023-05-09 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 c8fc37898dfbc..24ef90833b5a9 100644 --- a/api_docs/kbn_shared_ux_storybook_mock.mdx +++ b/api_docs/kbn_shared_ux_storybook_mock.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-storybook-mock title: "@kbn/shared-ux-storybook-mock" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-storybook-mock plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-mock'] --- import kbnSharedUxStorybookMockObj from './kbn_shared_ux_storybook_mock.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index 4eb4e745a3473..79eff2e251917 100644 --- a/api_docs/kbn_shared_ux_utility.mdx +++ b/api_docs/kbn_shared_ux_utility.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-utility title: "@kbn/shared-ux-utility" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-utility plugin -date: 2023-05-07 +date: 2023-05-09 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 a70c4b5d7a732..c03158880de2a 100644 --- a/api_docs/kbn_slo_schema.mdx +++ b/api_docs/kbn_slo_schema.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-slo-schema title: "@kbn/slo-schema" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/slo-schema plugin -date: 2023-05-07 +date: 2023-05-09 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 208d50cea463b..a959d9237f4ec 100644 --- a/api_docs/kbn_some_dev_log.mdx +++ b/api_docs/kbn_some_dev_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-some-dev-log title: "@kbn/some-dev-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/some-dev-log plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log'] --- import kbnSomeDevLogObj from './kbn_some_dev_log.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index 24df7c62c8a4e..a213257155096 100644 --- a/api_docs/kbn_std.mdx +++ b/api_docs/kbn_std.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-std title: "@kbn/std" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/std plugin -date: 2023-05-07 +date: 2023-05-09 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 3de8cc0bba77e..d4c2185363098 100644 --- a/api_docs/kbn_stdio_dev_helpers.mdx +++ b/api_docs/kbn_stdio_dev_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-stdio-dev-helpers title: "@kbn/stdio-dev-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/stdio-dev-helpers plugin -date: 2023-05-07 +date: 2023-05-09 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 e27d9997a006a..0eb75f1a54a24 100644 --- a/api_docs/kbn_storybook.mdx +++ b/api_docs/kbn_storybook.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-storybook title: "@kbn/storybook" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/storybook plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] --- import kbnStorybookObj from './kbn_storybook.devdocs.json'; diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index fca7b89d94a55..97c81d09dcbe7 100644 --- a/api_docs/kbn_telemetry_tools.mdx +++ b/api_docs/kbn_telemetry_tools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-telemetry-tools title: "@kbn/telemetry-tools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/telemetry-tools plugin -date: 2023-05-07 +date: 2023-05-09 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 8d7a4ec939bd3..97e0d85ebd000 100644 --- a/api_docs/kbn_test.devdocs.json +++ b/api_docs/kbn_test.devdocs.json @@ -2844,7 +2844,7 @@ "tags": [], "label": "dataArchive", "description": [ - "\nPath to data archive snapshot to run Elasticsearch with.\nTo prepare the the snapshot:\n- run Elasticsearch server\n- index necessary data\n- stop Elasticsearch server\n- go to Elasticsearch folder: cd .es/${ELASTICSEARCH_VERSION}\n- archive data folder: zip -r my_archive.zip data" + "\nPath to data archive snapshot to run Elasticsearch with.\nTo prepare the snapshot:\n- run Elasticsearch server\n- index necessary data\n- stop Elasticsearch server\n- go to Elasticsearch folder: cd .es/${ELASTICSEARCH_VERSION}\n- archive data folder: zip -r my_archive.zip data" ], "signature": [ "string | undefined" diff --git a/api_docs/kbn_test.mdx b/api_docs/kbn_test.mdx index 0657acf4decd9..9e90591102aba 100644 --- a/api_docs/kbn_test.mdx +++ b/api_docs/kbn_test.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test title: "@kbn/test" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] --- import kbnTestObj from './kbn_test.devdocs.json'; diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index 97f4123c42f06..921b3c6e45719 100644 --- a/api_docs/kbn_test_jest_helpers.mdx +++ b/api_docs/kbn_test_jest_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-jest-helpers title: "@kbn/test-jest-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-jest-helpers plugin -date: 2023-05-07 +date: 2023-05-09 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 b428e002d4f38..25b9fddf0c6b1 100644 --- a/api_docs/kbn_test_subj_selector.mdx +++ b/api_docs/kbn_test_subj_selector.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-test-subj-selector title: "@kbn/test-subj-selector" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/test-subj-selector plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index c4c5804f522f4..79db007fdd858 100644 --- a/api_docs/kbn_tooling_log.mdx +++ b/api_docs/kbn_tooling_log.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-tooling-log title: "@kbn/tooling-log" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/tooling-log plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/tooling-log'] --- import kbnToolingLogObj from './kbn_tooling_log.devdocs.json'; diff --git a/api_docs/kbn_ts_projects.mdx b/api_docs/kbn_ts_projects.mdx index c5b676a23772a..3c6ebb2aa0b9a 100644 --- a/api_docs/kbn_ts_projects.mdx +++ b/api_docs/kbn_ts_projects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ts-projects title: "@kbn/ts-projects" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ts-projects plugin -date: 2023-05-07 +date: 2023-05-09 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 58603f8af5378..bebafa5e243e3 100644 --- a/api_docs/kbn_typed_react_router_config.mdx +++ b/api_docs/kbn_typed_react_router_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-typed-react-router-config title: "@kbn/typed-react-router-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/typed-react-router-config plugin -date: 2023-05-07 +date: 2023-05-09 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 0edf57214b073..4df7944622a77 100644 --- a/api_docs/kbn_ui_actions_browser.mdx +++ b/api_docs/kbn_ui_actions_browser.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-actions-browser title: "@kbn/ui-actions-browser" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-actions-browser plugin -date: 2023-05-07 +date: 2023-05-09 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 ec038514694bb..7f5b4eba4e198 100644 --- a/api_docs/kbn_ui_shared_deps_src.mdx +++ b/api_docs/kbn_ui_shared_deps_src.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-shared-deps-src title: "@kbn/ui-shared-deps-src" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-shared-deps-src plugin -date: 2023-05-07 +date: 2023-05-09 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 7698de3b4ba0a..deb4968abd642 100644 --- a/api_docs/kbn_ui_theme.mdx +++ b/api_docs/kbn_ui_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ui-theme title: "@kbn/ui-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ui-theme plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] --- import kbnUiThemeObj from './kbn_ui_theme.devdocs.json'; diff --git a/api_docs/kbn_url_state.mdx b/api_docs/kbn_url_state.mdx index 354800e963fcb..e74c0ace36e18 100644 --- a/api_docs/kbn_url_state.mdx +++ b/api_docs/kbn_url_state.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-url-state title: "@kbn/url-state" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/url-state plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/url-state'] --- import kbnUrlStateObj from './kbn_url_state.devdocs.json'; diff --git a/api_docs/kbn_user_profile_components.mdx b/api_docs/kbn_user_profile_components.mdx index 3277c7a2d8c7f..3d501a235fa21 100644 --- a/api_docs/kbn_user_profile_components.mdx +++ b/api_docs/kbn_user_profile_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-user-profile-components title: "@kbn/user-profile-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/user-profile-components plugin -date: 2023-05-07 +date: 2023-05-09 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 0dc688a52b6ed..41f6e8b1dd4b0 100644 --- a/api_docs/kbn_utility_types.mdx +++ b/api_docs/kbn_utility_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types title: "@kbn/utility-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types plugin -date: 2023-05-07 +date: 2023-05-09 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 403975945e245..4da4e085c7544 100644 --- a/api_docs/kbn_utility_types_jest.mdx +++ b/api_docs/kbn_utility_types_jest.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utility-types-jest title: "@kbn/utility-types-jest" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utility-types-jest plugin -date: 2023-05-07 +date: 2023-05-09 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 7959b1633e241..442bfc701a115 100644 --- a/api_docs/kbn_utils.mdx +++ b/api_docs/kbn_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-utils title: "@kbn/utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/utils plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] --- import kbnUtilsObj from './kbn_utils.devdocs.json'; diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx index 8eb18e2e299b2..3102418e808c4 100644 --- a/api_docs/kbn_yarn_lock_validator.mdx +++ b/api_docs/kbn_yarn_lock_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-yarn-lock-validator title: "@kbn/yarn-lock-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/yarn-lock-validator plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator'] --- import kbnYarnLockValidatorObj from './kbn_yarn_lock_validator.devdocs.json'; diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx index 4102a137156e0..6d379e05d7e63 100644 --- a/api_docs/kibana_overview.mdx +++ b/api_docs/kibana_overview.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaOverview title: "kibanaOverview" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaOverview plugin -date: 2023-05-07 +date: 2023-05-09 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 f543e15cf3f24..2740cb0c32b7a 100644 --- a/api_docs/kibana_react.mdx +++ b/api_docs/kibana_react.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaReact title: "kibanaReact" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaReact plugin -date: 2023-05-07 +date: 2023-05-09 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 2fee45c9f0ed3..4b178c9d247b2 100644 --- a/api_docs/kibana_utils.mdx +++ b/api_docs/kibana_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kibanaUtils title: "kibanaUtils" image: https://source.unsplash.com/400x175/?github description: API docs for the kibanaUtils plugin -date: 2023-05-07 +date: 2023-05-09 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 dee9e5f4de9b2..a59d516755138 100644 --- a/api_docs/kubernetes_security.mdx +++ b/api_docs/kubernetes_security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kubernetesSecurity title: "kubernetesSecurity" image: https://source.unsplash.com/400x175/?github description: API docs for the kubernetesSecurity plugin -date: 2023-05-07 +date: 2023-05-09 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 f04723857001a..220fb8ef462a4 100644 --- a/api_docs/lens.mdx +++ b/api_docs/lens.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lens title: "lens" image: https://source.unsplash.com/400x175/?github description: API docs for the lens plugin -date: 2023-05-07 +date: 2023-05-09 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 162130d0c2787..a782912a73502 100644 --- a/api_docs/license_api_guard.mdx +++ b/api_docs/license_api_guard.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseApiGuard title: "licenseApiGuard" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseApiGuard plugin -date: 2023-05-07 +date: 2023-05-09 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 48beb3e0ec3d5..e00e7f25080cd 100644 --- a/api_docs/license_management.mdx +++ b/api_docs/license_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licenseManagement title: "licenseManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the licenseManagement plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseManagement'] --- import licenseManagementObj from './license_management.devdocs.json'; diff --git a/api_docs/licensing.devdocs.json b/api_docs/licensing.devdocs.json index 7c6a18a6c2d30..dc25b70ac2167 100644 --- a/api_docs/licensing.devdocs.json +++ b/api_docs/licensing.devdocs.json @@ -2162,6 +2162,10 @@ "plugin": "mapsEms", "path": "src/plugins/maps_ems/server/index.ts" }, + { + "plugin": "osquery", + "path": "x-pack/plugins/osquery/server/handlers/action/create_action_service.ts" + }, { "plugin": "painlessLab", "path": "x-pack/plugins/painless_lab/server/services/license.ts" diff --git a/api_docs/licensing.mdx b/api_docs/licensing.mdx index e5add4390cb8a..e074bbf7013b8 100644 --- a/api_docs/licensing.mdx +++ b/api_docs/licensing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/licensing title: "licensing" image: https://source.unsplash.com/400x175/?github description: API docs for the licensing plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] --- import licensingObj from './licensing.devdocs.json'; diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index d17a40ef0185e..3303dd6d75949 100644 --- a/api_docs/lists.mdx +++ b/api_docs/lists.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/lists title: "lists" image: https://source.unsplash.com/400x175/?github description: API docs for the lists plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/management.mdx b/api_docs/management.mdx index 73a4d33761a19..eb10f3d218565 100644 --- a/api_docs/management.mdx +++ b/api_docs/management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/management title: "management" image: https://source.unsplash.com/400x175/?github description: API docs for the management plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'management'] --- import managementObj from './management.devdocs.json'; diff --git a/api_docs/maps.mdx b/api_docs/maps.mdx index 6dbd22c5ead40..1b15653c69fe1 100644 --- a/api_docs/maps.mdx +++ b/api_docs/maps.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/maps title: "maps" image: https://source.unsplash.com/400x175/?github description: API docs for the maps plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'maps'] --- import mapsObj from './maps.devdocs.json'; diff --git a/api_docs/maps_ems.mdx b/api_docs/maps_ems.mdx index 0734ff0a7aee3..666cc9d89a812 100644 --- a/api_docs/maps_ems.mdx +++ b/api_docs/maps_ems.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/mapsEms title: "mapsEms" image: https://source.unsplash.com/400x175/?github description: API docs for the mapsEms plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] --- import mapsEmsObj from './maps_ems.devdocs.json'; diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index 6490b01e16082..17aa30ed38a1a 100644 --- a/api_docs/ml.mdx +++ b/api_docs/ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ml title: "ml" image: https://source.unsplash.com/400x175/?github description: API docs for the ml plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] --- import mlObj from './ml.devdocs.json'; diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx index c8a78a87ee562..ba26e140b7bfa 100644 --- a/api_docs/monitoring.mdx +++ b/api_docs/monitoring.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoring title: "monitoring" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoring plugin -date: 2023-05-07 +date: 2023-05-09 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 d8c801613b1b3..417ce6ccca404 100644 --- a/api_docs/monitoring_collection.mdx +++ b/api_docs/monitoring_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/monitoringCollection title: "monitoringCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the monitoringCollection plugin -date: 2023-05-07 +date: 2023-05-09 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 fcafeb21935a6..bdf2eb4c21df1 100644 --- a/api_docs/navigation.mdx +++ b/api_docs/navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/navigation title: "navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the navigation plugin -date: 2023-05-07 +date: 2023-05-09 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 dfbd1b4c0f06c..70693b50d38db 100644 --- a/api_docs/newsfeed.mdx +++ b/api_docs/newsfeed.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/newsfeed title: "newsfeed" image: https://source.unsplash.com/400x175/?github description: API docs for the newsfeed plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] --- import newsfeedObj from './newsfeed.devdocs.json'; diff --git a/api_docs/notifications.mdx b/api_docs/notifications.mdx index 28e124b9496c2..2910ebd0c1e55 100644 --- a/api_docs/notifications.mdx +++ b/api_docs/notifications.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/notifications title: "notifications" image: https://source.unsplash.com/400x175/?github description: API docs for the notifications plugin -date: 2023-05-07 +date: 2023-05-09 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 8b7936686f0ac..dd0479df3afce 100644 --- a/api_docs/observability.devdocs.json +++ b/api_docs/observability.devdocs.json @@ -5377,6 +5377,26 @@ }, "<", "RulesLocatorParams", + ">; ruleDetailsLocator: ", + { + "pluginId": "share", + "scope": "common", + "docId": "kibSharePluginApi", + "section": "def-common.LocatorPublic", + "text": "LocatorPublic" + }, + "<", + "RuleDetailsLocatorParams", + ">; sloDetailsLocator: ", + { + "pluginId": "share", + "scope": "common", + "docId": "kibSharePluginApi", + "section": "def-common.LocatorPublic", + "text": "LocatorPublic" + }, + "<", + "SloDetailsLocatorParams", ">; }" ], "path": "x-pack/plugins/observability/public/plugin.ts", @@ -13363,6 +13383,21 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "observability", + "id": "def-common.sloDetailsLocatorID", + "type": "string", + "tags": [], + "label": "sloDetailsLocatorID", + "description": [], + "signature": [ + "\"SLO_DETAILS_LOCATOR\"" + ], + "path": "x-pack/plugins/observability/common/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "observability", "id": "def-common.sloFeatureId", diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index 9a0afd29a1538..c89210cd8f22b 100644 --- a/api_docs/observability.mdx +++ b/api_docs/observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observability title: "observability" image: https://source.unsplash.com/400x175/?github description: API docs for the observability plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/actionable-observability](https://github.com/orgs/elastic/team | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 558 | 43 | 552 | 25 | +| 559 | 43 | 553 | 27 | ## Client diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx index f7420d96e2eb1..05bb49f09b5f7 100644 --- a/api_docs/observability_onboarding.mdx +++ b/api_docs/observability_onboarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityOnboarding title: "observabilityOnboarding" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityOnboarding plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityOnboarding'] --- import observabilityOnboardingObj from './observability_onboarding.devdocs.json'; diff --git a/api_docs/observability_shared.mdx b/api_docs/observability_shared.mdx index e056f6d5fb147..59ac80df0fa7c 100644 --- a/api_docs/observability_shared.mdx +++ b/api_docs/observability_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityShared title: "observabilityShared" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityShared plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityShared'] --- import observabilitySharedObj from './observability_shared.devdocs.json'; diff --git a/api_docs/osquery.devdocs.json b/api_docs/osquery.devdocs.json index 0e9918902a5b4..413fba697781f 100644 --- a/api_docs/osquery.devdocs.json +++ b/api_docs/osquery.devdocs.json @@ -262,50 +262,19 @@ "children": [ { "parentPluginId": "osquery", - "id": "def-server.OsqueryPluginSetup.osqueryCreateAction", - "type": "Function", + "id": "def-server.OsqueryPluginSetup.createActionService", + "type": "Object", "tags": [], - "label": "osqueryCreateAction", + "label": "createActionService", "description": [], "signature": [ - "(payload: { agent_ids?: string[] | undefined; agent_all?: boolean | undefined; agent_platforms?: string[] | undefined; agent_policy_ids?: string[] | undefined; query?: string | undefined; queries?: { id: string; query: string; ecs_mapping: { [x: string]: { field?: string | undefined; value?: string | string[] | undefined; }; } | undefined; version: string | undefined; platform: string | undefined; removed: boolean | undefined; snapshot: boolean | undefined; }[] | undefined; saved_query_id?: string | undefined; ecs_mapping?: { [x: string]: { field?: string | undefined; value?: string | string[] | undefined; }; } | undefined; pack_id?: string | undefined; alert_ids?: string[] | undefined; case_ids?: string[] | undefined; event_ids?: string[] | undefined; metadata?: object | undefined; }, alertData?: OutputOf> | undefined) => void" + "{ create: (params: { agent_ids?: string[] | undefined; agent_all?: boolean | undefined; agent_platforms?: string[] | undefined; agent_policy_ids?: string[] | undefined; query?: string | undefined; queries?: { id: string; query: string; ecs_mapping: { [x: string]: { field?: string | undefined; value?: string | string[] | undefined; }; } | undefined; version: string | undefined; platform: string | undefined; removed: boolean | undefined; snapshot: boolean | undefined; }[] | undefined; saved_query_id?: string | undefined; ecs_mapping?: { [x: string]: { field?: string | undefined; value?: string | string[] | undefined; }; } | undefined; pack_id?: string | undefined; alert_ids?: string[] | undefined; case_ids?: string[] | undefined; event_ids?: string[] | undefined; metadata?: object | undefined; }, alertData?: OutputOf> | undefined) => Promise<{ response: { action_id: string; '@timestamp': string; expiration: string; type: string; input_type: string; alert_ids: string[] | undefined; event_ids: string[] | undefined; case_ids: string[] | undefined; agent_ids: string[] | undefined; agent_all: boolean | undefined; agent_platforms: string[] | undefined; agent_policy_ids: string[] | undefined; agents: string[]; user_id: string | undefined; metadata: object | undefined; pack_id: string | undefined; pack_name: string | undefined; pack_prebuilt: boolean | undefined; queries: ", + "Dictionary", + "[]; }; fleetActionsCount: number; }>; stop: () => void; }" ], "path": "x-pack/plugins/osquery/server/types.ts", "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "osquery", - "id": "def-server.OsqueryPluginSetup.osqueryCreateAction.$1", - "type": "Object", - "tags": [], - "label": "payload", - "description": [], - "signature": [ - "{ agent_ids?: string[] | undefined; agent_all?: boolean | undefined; agent_platforms?: string[] | undefined; agent_policy_ids?: string[] | undefined; query?: string | undefined; queries?: { id: string; query: string; ecs_mapping: { [x: string]: { field?: string | undefined; value?: string | string[] | undefined; }; } | undefined; version: string | undefined; platform: string | undefined; removed: boolean | undefined; snapshot: boolean | undefined; }[] | undefined; saved_query_id?: string | undefined; ecs_mapping?: { [x: string]: { field?: string | undefined; value?: string | string[] | undefined; }; } | undefined; pack_id?: string | undefined; alert_ids?: string[] | undefined; case_ids?: string[] | undefined; event_ids?: string[] | undefined; metadata?: object | undefined; }" - ], - "path": "x-pack/plugins/osquery/server/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "osquery", - "id": "def-server.OsqueryPluginSetup.osqueryCreateAction.$2", - "type": "Object", - "tags": [], - "label": "alertData", - "description": [], - "signature": [ - "OutputOf> | undefined" - ], - "path": "x-pack/plugins/osquery/server/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": false - } - ], - "returnComment": [] + "trackAdoption": false } ], "lifecycle": "setup", diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index 78f731aaf6081..cc55411d18b33 100644 --- a/api_docs/osquery.mdx +++ b/api_docs/osquery.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/osquery title: "osquery" image: https://source.unsplash.com/400x175/?github description: API docs for the osquery plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] --- import osqueryObj from './osquery.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/security-defend-workflows](https://github.com/orgs/elastic/tea | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 24 | 0 | 24 | 6 | +| 22 | 0 | 22 | 6 | ## Client diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index 1d3866e098ecd..6d2066c238ab3 100644 --- a/api_docs/plugin_directory.mdx +++ b/api_docs/plugin_directory.mdx @@ -7,7 +7,7 @@ id: kibDevDocsPluginDirectory slug: /kibana-dev-docs/api-meta/plugin-api-directory title: Directory description: Directory of public APIs available through plugins or packages. -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -21,7 +21,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 69703 | 523 | 60070 | 1351 | +| 69704 | 523 | 60065 | 1355 | ## Plugin Directory @@ -62,7 +62,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | 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. | 1029 | 0 | 245 | 2 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | The Data Visualizer tools help you understand your data, by analyzing the metrics and fields in a log file or an existing Elasticsearch index. | 28 | 3 | 24 | 0 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 10 | 0 | 8 | 2 | -| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin contains the Discover application and the saved search embeddable. | 96 | 0 | 77 | 7 | +| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin contains the Discover application and the saved search embeddable. | 96 | 0 | 75 | 7 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 37 | 0 | 35 | 2 | | | [@elastic/security-threat-hunting-investigations](https://github.com/orgs/elastic/teams/security-threat-hunting-investigations) | APIs used to assess the quality of data in Elasticsearch indexes | 2 | 0 | 0 | 0 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds embeddables service to Kibana | 546 | 11 | 444 | 4 | @@ -129,33 +129,33 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 34 | 0 | 34 | 2 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 17 | 0 | 17 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 1 | -| | [@elastic/actionable-observability](https://github.com/orgs/elastic/teams/actionable-observability) | - | 558 | 43 | 552 | 25 | +| | [@elastic/actionable-observability](https://github.com/orgs/elastic/teams/actionable-observability) | - | 559 | 43 | 553 | 27 | | | [@elastic/apm-ui](https://github.com/orgs/elastic/teams/apm-ui) | - | 7 | 0 | 7 | 0 | | | [@elastic/actionable-observability](https://github.com/orgs/elastic/teams/actionable-observability) | - | 143 | 0 | 143 | 5 | -| | [@elastic/security-defend-workflows](https://github.com/orgs/elastic/teams/security-defend-workflows) | - | 24 | 0 | 24 | 6 | +| | [@elastic/security-defend-workflows](https://github.com/orgs/elastic/teams/security-defend-workflows) | - | 22 | 0 | 22 | 6 | | painlessLab | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 0 | 0 | 0 | 0 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | The Presentation Utility Plugin is a set of common, shared components and toolkits for solutions within the Presentation space, (e.g. Dashboards, Canvas). | 218 | 8 | 164 | 11 | | | [@elastic/profiling-ui](https://github.com/orgs/elastic/teams/profiling-ui) | - | 15 | 2 | 15 | 0 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 4 | 0 | 4 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Reporting Services enables applications to feature reports that the user can automate with Watcher and download later. | 36 | 0 | 16 | 0 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 21 | 0 | 21 | 0 | -| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 263 | 0 | 234 | 14 | +| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 258 | 0 | 229 | 14 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 24 | 0 | 19 | 2 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 127 | 2 | 116 | 4 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 44 | 0 | 44 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 154 | 0 | 140 | 2 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 79 | 0 | 73 | 3 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 100 | 0 | 52 | 1 | -| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin contains the definition and helper methods around saved searches, used by discover and visualizations. | 55 | 0 | 55 | 2 | +| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin contains the definition and helper methods around saved searches, used by discover and visualizations. | 58 | 0 | 55 | 2 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 32 | 0 | 13 | 0 | | | [@elastic/kibana-reporting-services](https://github.com/orgs/elastic/teams/kibana-reporting-services) | Kibana Screenshotting Plugin | 27 | 0 | 8 | 5 | | searchprofiler | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 0 | 0 | 0 | 0 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides authentication and authorization features, and exposes functionality to understand the capabilities of the currently authenticated user. | 283 | 0 | 94 | 1 | | | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | - | 123 | 0 | 82 | 27 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | The core Serverless plugin, providing APIs to Serverless Project plugins. | 7 | 0 | 6 | 0 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | The core Serverless plugin, providing APIs to Serverless Project plugins. | 9 | 0 | 8 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Serverless customizations for observability. | 6 | 0 | 6 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Serverless customizations for search. | 6 | 0 | 6 | 0 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Serverless customizations for security. | 6 | 0 | 6 | 0 | +| | [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) | Serverless customizations for security. | 6 | 0 | 6 | 0 | | | [@elastic/sec-cloudnative-integrations](https://github.com/orgs/elastic/teams/sec-cloudnative-integrations) | - | 7 | 0 | 7 | 1 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Adds URL Service and sharing capabilities to Kibana | 118 | 0 | 59 | 10 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 22 | 1 | 22 | 1 | @@ -172,10 +172,10 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/security-threat-hunting-investigations](https://github.com/orgs/elastic/teams/security-threat-hunting-investigations) | - | 257 | 1 | 214 | 20 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | This plugin provides access to the transforms features provided by Elastic. Transforms enable you to convert existing Elasticsearch indices into summarized indices, which provide opportunities for new insights and analytics. | 4 | 0 | 4 | 1 | | translations | [@elastic/kibana-localization](https://github.com/orgs/elastic/teams/kibana-localization) | - | 0 | 0 | 0 | 0 | -| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 551 | 11 | 522 | 49 | +| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 550 | 11 | 521 | 49 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Adds UI Actions service to Kibana | 144 | 2 | 102 | 9 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Extends UI Actions plugin with more functionality | 206 | 0 | 140 | 9 | -| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Contains functionality for the field list which can be integrated into apps | 295 | 0 | 269 | 7 | +| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Contains functionality for the field list which can be integrated into apps | 293 | 0 | 267 | 8 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | The `unifiedHistogram` plugin provides UI components to create a layout including a resizable histogram and a main display. | 52 | 0 | 23 | 2 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Contains all the key functionality of Kibana's unified search experience.Contains all the key functionality of Kibana's unified search experience. | 137 | 2 | 100 | 20 | | upgradeAssistant | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 0 | 0 | 0 | 0 | @@ -379,7 +379,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 4 | 0 | 4 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 11 | 0 | 11 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 5 | 0 | 5 | 0 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 54 | 1 | 48 | 0 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 55 | 1 | 49 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 15 | 0 | 14 | 1 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 9 | 0 | 9 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 6 | 0 | 4 | 0 | @@ -406,7 +406,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 101 | 0 | 85 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 15 | 0 | 9 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 27 | 2 | 24 | 0 | -| | [@elastic/kibana-docs](https://github.com/orgs/elastic/teams/kibana-docs) | - | 68 | 0 | 68 | 2 | +| | [@elastic/kibana-docs](https://github.com/orgs/elastic/teams/kibana-docs) | - | 69 | 0 | 69 | 2 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 1 | 0 | 1 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 52 | 0 | 34 | 4 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 19 | 0 | 11 | 0 | @@ -511,7 +511,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 27 | 0 | 10 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 10 | 0 | 4 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 32 | 0 | 28 | 0 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 31 | 0 | 15 | 2 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 34 | 0 | 17 | 3 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 5 | 0 | 4 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 3 | 0 | 2 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 0 | diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index 5bd5cdf99a18f..6655189b27ab5 100644 --- a/api_docs/presentation_util.mdx +++ b/api_docs/presentation_util.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/presentationUtil title: "presentationUtil" image: https://source.unsplash.com/400x175/?github description: API docs for the presentationUtil plugin -date: 2023-05-07 +date: 2023-05-09 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 5400666cf2d09..93dff72b31561 100644 --- a/api_docs/profiling.mdx +++ b/api_docs/profiling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profiling title: "profiling" image: https://source.unsplash.com/400x175/?github description: API docs for the profiling plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profiling'] --- import profilingObj from './profiling.devdocs.json'; diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx index 74eb6f7c5e187..fb3eb015a17ad 100644 --- a/api_docs/remote_clusters.mdx +++ b/api_docs/remote_clusters.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/remoteClusters title: "remoteClusters" image: https://source.unsplash.com/400x175/?github description: API docs for the remoteClusters plugin -date: 2023-05-07 +date: 2023-05-09 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 d35eb4f571a19..ceb54a669519f 100644 --- a/api_docs/reporting.mdx +++ b/api_docs/reporting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/reporting title: "reporting" image: https://source.unsplash.com/400x175/?github description: API docs for the reporting plugin -date: 2023-05-07 +date: 2023-05-09 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 4f5b74363a1a2..f0694470f24b5 100644 --- a/api_docs/rollup.mdx +++ b/api_docs/rollup.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/rollup title: "rollup" image: https://source.unsplash.com/400x175/?github description: API docs for the rollup plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'rollup'] --- import rollupObj from './rollup.devdocs.json'; diff --git a/api_docs/rule_registry.devdocs.json b/api_docs/rule_registry.devdocs.json index b780af049a936..8cf82218f7833 100644 --- a/api_docs/rule_registry.devdocs.json +++ b/api_docs/rule_registry.devdocs.json @@ -617,83 +617,6 @@ } ], "returnComment": [] - }, - { - "parentPluginId": "ruleRegistry", - "id": "def-server.AlertsClient.getBrowserFields", - "type": "Function", - "tags": [], - "label": "getBrowserFields", - "description": [], - "signature": [ - "({ indices, metaFields, allowNoIndex, }: { indices: string[]; metaFields: string[]; allowNoIndex: boolean; }) => Promise<", - { - "pluginId": "ruleRegistry", - "scope": "common", - "docId": "kibRuleRegistryPluginApi", - "section": "def-common.BrowserFields", - "text": "BrowserFields" - }, - ">" - ], - "path": "x-pack/plugins/rule_registry/server/alert_data_client/alerts_client.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "ruleRegistry", - "id": "def-server.AlertsClient.getBrowserFields.$1", - "type": "Object", - "tags": [], - "label": "{\n indices,\n metaFields,\n allowNoIndex,\n }", - "description": [], - "path": "x-pack/plugins/rule_registry/server/alert_data_client/alerts_client.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "ruleRegistry", - "id": "def-server.AlertsClient.getBrowserFields.$1.indices", - "type": "Array", - "tags": [], - "label": "indices", - "description": [], - "signature": [ - "string[]" - ], - "path": "x-pack/plugins/rule_registry/server/alert_data_client/alerts_client.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "ruleRegistry", - "id": "def-server.AlertsClient.getBrowserFields.$1.metaFields", - "type": "Array", - "tags": [], - "label": "metaFields", - "description": [], - "signature": [ - "string[]" - ], - "path": "x-pack/plugins/rule_registry/server/alert_data_client/alerts_client.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "ruleRegistry", - "id": "def-server.AlertsClient.getBrowserFields.$1.allowNoIndex", - "type": "boolean", - "tags": [], - "label": "allowNoIndex", - "description": [], - "path": "x-pack/plugins/rule_registry/server/alert_data_client/alerts_client.ts", - "deprecated": false, - "trackAdoption": false - } - ] - } - ], - "returnComment": [] } ], "initialIsOpen": false @@ -4808,7 +4731,7 @@ "label": "fields", "description": [], "signature": [ - "{ readonly [x: string]: Partial<", + "{ [x: string]: Partial<", { "pluginId": "ruleRegistry", "scope": "common", @@ -5117,6 +5040,8 @@ "section": "def-common.RuleRegistrySearchRequestPagination", "text": "RuleRegistrySearchRequestPagination" }, + " | undefined; runtimeMappings?: ", + "MappingRuntimeFields", " | undefined; }" ], "path": "x-pack/plugins/rule_registry/common/search_strategy/index.ts", diff --git a/api_docs/rule_registry.mdx b/api_docs/rule_registry.mdx index a060a345ca3f9..f74d6a08e70e2 100644 --- a/api_docs/rule_registry.mdx +++ b/api_docs/rule_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ruleRegistry title: "ruleRegistry" image: https://source.unsplash.com/400x175/?github description: API docs for the ruleRegistry plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ruleRegistry'] --- import ruleRegistryObj from './rule_registry.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-o | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 263 | 0 | 234 | 14 | +| 258 | 0 | 229 | 14 | ## Server diff --git a/api_docs/runtime_fields.mdx b/api_docs/runtime_fields.mdx index d62e5b91a9791..4e07729dade54 100644 --- a/api_docs/runtime_fields.mdx +++ b/api_docs/runtime_fields.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/runtimeFields title: "runtimeFields" image: https://source.unsplash.com/400x175/?github description: API docs for the runtimeFields plugin -date: 2023-05-07 +date: 2023-05-09 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 a824cb2897ef5..6024950d563cb 100644 --- a/api_docs/saved_objects.mdx +++ b/api_docs/saved_objects.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjects title: "savedObjects" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjects plugin -date: 2023-05-07 +date: 2023-05-09 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 43e4bfb17667c..c293d9d1ee243 100644 --- a/api_docs/saved_objects_finder.mdx +++ b/api_docs/saved_objects_finder.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsFinder title: "savedObjectsFinder" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsFinder plugin -date: 2023-05-07 +date: 2023-05-09 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 09b10100f5617..ba91fc1d4d49a 100644 --- a/api_docs/saved_objects_management.mdx +++ b/api_docs/saved_objects_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsManagement title: "savedObjectsManagement" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsManagement plugin -date: 2023-05-07 +date: 2023-05-09 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 d01d9f0eb4b4a..622f76d7304ff 100644 --- a/api_docs/saved_objects_tagging.mdx +++ b/api_docs/saved_objects_tagging.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTagging title: "savedObjectsTagging" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTagging plugin -date: 2023-05-07 +date: 2023-05-09 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 5830b1026b7d3..0e9d04de79994 100644 --- a/api_docs/saved_objects_tagging_oss.mdx +++ b/api_docs/saved_objects_tagging_oss.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedObjectsTaggingOss title: "savedObjectsTaggingOss" image: https://source.unsplash.com/400x175/?github description: API docs for the savedObjectsTaggingOss plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTaggingOss'] --- import savedObjectsTaggingOssObj from './saved_objects_tagging_oss.devdocs.json'; diff --git a/api_docs/saved_search.devdocs.json b/api_docs/saved_search.devdocs.json index e70e50a945a94..bcb9a7ef8404b 100644 --- a/api_docs/saved_search.devdocs.json +++ b/api_docs/saved_search.devdocs.json @@ -3,13 +3,83 @@ "client": { "classes": [], "functions": [ + { + "parentPluginId": "savedSearch", + "id": "def-public.getNewSavedSearch", + "type": "Function", + "tags": [], + "label": "getNewSavedSearch", + "description": [ + "\n\nReturns a new saved search\nUsed when e.g. Discover is opened without a saved search id" + ], + "signature": [ + "({ search, }: { search: ", + { + "pluginId": "data", + "scope": "public", + "docId": "kibDataSearchPluginApi", + "section": "def-public.ISearchStart", + "text": "ISearchStart" + }, + "; }) => ", + { + "pluginId": "savedSearch", + "scope": "public", + "docId": "kibSavedSearchPluginApi", + "section": "def-public.SavedSearch", + "text": "SavedSearch" + } + ], + "path": "src/plugins/saved_search/public/services/saved_searches/get_saved_searches.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "savedSearch", + "id": "def-public.getNewSavedSearch.$1", + "type": "Object", + "tags": [], + "label": "{\n search,\n}", + "description": [], + "path": "src/plugins/saved_search/public/services/saved_searches/get_saved_searches.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "savedSearch", + "id": "def-public.getNewSavedSearch.$1.search", + "type": "Object", + "tags": [], + "label": "search", + "description": [], + "signature": [ + { + "pluginId": "data", + "scope": "public", + "docId": "kibDataSearchPluginApi", + "section": "def-public.ISearchStart", + "text": "ISearchStart" + } + ], + "path": "src/plugins/saved_search/public/services/saved_searches/get_saved_searches.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, { "parentPluginId": "savedSearch", "id": "def-public.getSavedSearch", "type": "Function", "tags": [], "label": "getSavedSearch", - "description": [], + "description": [ + "\nReturns a persisted or a new saved search" + ], "signature": [ "(savedSearchId: string | undefined, dependencies: GetSavedSearchDependencies) => Promise<", { @@ -31,7 +101,9 @@ "type": "string", "tags": [], "label": "savedSearchId", - "description": [], + "description": [ + "- when undefined a new saved search is returned" + ], "signature": [ "string | undefined" ], diff --git a/api_docs/saved_search.mdx b/api_docs/saved_search.mdx index ba7080b89dce1..121b6b6087798 100644 --- a/api_docs/saved_search.mdx +++ b/api_docs/saved_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/savedSearch title: "savedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the savedSearch plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedSearch'] --- import savedSearchObj from './saved_search.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 55 | 0 | 55 | 2 | +| 58 | 0 | 55 | 2 | ## Client diff --git a/api_docs/screenshot_mode.mdx b/api_docs/screenshot_mode.mdx index e6e3a00b640cc..0f8a0ac329192 100644 --- a/api_docs/screenshot_mode.mdx +++ b/api_docs/screenshot_mode.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotMode title: "screenshotMode" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotMode plugin -date: 2023-05-07 +date: 2023-05-09 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 dbacb96586e58..0b63dc8f92c6d 100644 --- a/api_docs/screenshotting.mdx +++ b/api_docs/screenshotting.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/screenshotting title: "screenshotting" image: https://source.unsplash.com/400x175/?github description: API docs for the screenshotting plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] --- import screenshottingObj from './screenshotting.devdocs.json'; diff --git a/api_docs/security.mdx b/api_docs/security.mdx index 75e4699d5df9f..13b511060e297 100644 --- a/api_docs/security.mdx +++ b/api_docs/security.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/security title: "security" image: https://source.unsplash.com/400x175/?github description: API docs for the security plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; diff --git a/api_docs/security_solution.devdocs.json b/api_docs/security_solution.devdocs.json index 05f9a8ddb8eb8..009207179303b 100644 --- a/api_docs/security_solution.devdocs.json +++ b/api_docs/security_solution.devdocs.json @@ -1362,12 +1362,13 @@ "children": [ { "parentPluginId": "securitySolution", - "id": "def-public.PluginStart.navLinks$", - "type": "Object", + "id": "def-public.PluginStart.getNavLinks$", + "type": "Function", "tags": [], - "label": "navLinks$", + "label": "getNavLinks$", "description": [], "signature": [ + "() => ", "Observable", "<", "NavigationLink", @@ -1375,7 +1376,9 @@ ], "path": "x-pack/plugins/security_solution/public/types.ts", "deprecated": false, - "trackAdoption": false + "trackAdoption": false, + "children": [], + "returnComment": [] }, { "parentPluginId": "securitySolution", diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index 7cc755117ee7e..36a76b7fbfc66 100644 --- a/api_docs/security_solution.mdx +++ b/api_docs/security_solution.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolution title: "securitySolution" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolution plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.devdocs.json'; diff --git a/api_docs/serverless.devdocs.json b/api_docs/serverless.devdocs.json index 4f9ed4e252309..71e1b254cf003 100644 --- a/api_docs/serverless.devdocs.json +++ b/api_docs/serverless.devdocs.json @@ -31,7 +31,54 @@ "path": "x-pack/plugins/serverless/public/types.ts", "deprecated": false, "trackAdoption": false, - "children": [], + "children": [ + { + "parentPluginId": "serverless", + "id": "def-public.ServerlessPluginStart.setSideNavComponent", + "type": "Function", + "tags": [], + "label": "setSideNavComponent", + "description": [], + "signature": [ + "(navigation: ", + { + "pluginId": "@kbn/core-chrome-browser", + "scope": "common", + "docId": "kibKbnCoreChromeBrowserPluginApi", + "section": "def-common.SideNavComponent", + "text": "SideNavComponent" + }, + ") => void" + ], + "path": "x-pack/plugins/serverless/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "serverless", + "id": "def-public.ServerlessPluginStart.setSideNavComponent.$1", + "type": "CompoundType", + "tags": [], + "label": "navigation", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-chrome-browser", + "scope": "common", + "docId": "kibKbnCoreChromeBrowserPluginApi", + "section": "def-common.SideNavComponent", + "text": "SideNavComponent" + } + ], + "path": "x-pack/plugins/serverless/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + } + ], "lifecycle": "start", "initialIsOpen": true } diff --git a/api_docs/serverless.mdx b/api_docs/serverless.mdx index e868dcb82a90a..cf20b9317b58b 100644 --- a/api_docs/serverless.mdx +++ b/api_docs/serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverless title: "serverless" image: https://source.unsplash.com/400x175/?github description: API docs for the serverless plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverless'] --- import serverlessObj from './serverless.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sh | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 7 | 0 | 6 | 0 | +| 9 | 0 | 8 | 0 | ## Client diff --git a/api_docs/serverless_observability.mdx b/api_docs/serverless_observability.mdx index e55b85257299e..984a72b4bd474 100644 --- a/api_docs/serverless_observability.mdx +++ b/api_docs/serverless_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessObservability title: "serverlessObservability" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessObservability plugin -date: 2023-05-07 +date: 2023-05-09 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 5144b043ff1a6..5bd590cbca776 100644 --- a/api_docs/serverless_search.mdx +++ b/api_docs/serverless_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessSearch title: "serverlessSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessSearch plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessSearch'] --- import serverlessSearchObj from './serverless_search.devdocs.json'; diff --git a/api_docs/serverless_security.mdx b/api_docs/serverless_security.mdx index 349d31ac5a986..225888e42e359 100644 --- a/api_docs/serverless_security.mdx +++ b/api_docs/serverless_security.mdx @@ -8,14 +8,14 @@ slug: /kibana-dev-docs/api/serverlessSecurity title: "serverlessSecurity" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessSecurity plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessSecurity'] --- import serverlessSecurityObj from './serverless_security.devdocs.json'; Serverless customizations for security. -Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) for questions regarding this plugin. +Contact [@elastic/security-solution](https://github.com/orgs/elastic/teams/security-solution) for questions regarding this plugin. **Code health stats** diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index 35c9c5789c275..ee17868c3812c 100644 --- a/api_docs/session_view.mdx +++ b/api_docs/session_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/sessionView title: "sessionView" image: https://source.unsplash.com/400x175/?github description: API docs for the sessionView plugin -date: 2023-05-07 +date: 2023-05-09 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 4bee86c772ac4..2f8cce90411b6 100644 --- a/api_docs/share.mdx +++ b/api_docs/share.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/share title: "share" image: https://source.unsplash.com/400x175/?github description: API docs for the share plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] --- import shareObj from './share.devdocs.json'; diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index dec2a3946aaa9..72c054ee7ae36 100644 --- a/api_docs/snapshot_restore.mdx +++ b/api_docs/snapshot_restore.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/snapshotRestore title: "snapshotRestore" image: https://source.unsplash.com/400x175/?github description: API docs for the snapshotRestore plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'snapshotRestore'] --- import snapshotRestoreObj from './snapshot_restore.devdocs.json'; diff --git a/api_docs/spaces.mdx b/api_docs/spaces.mdx index 473fc9965d9a7..bb90e99c34c04 100644 --- a/api_docs/spaces.mdx +++ b/api_docs/spaces.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/spaces title: "spaces" image: https://source.unsplash.com/400x175/?github description: API docs for the spaces plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'spaces'] --- import spacesObj from './spaces.devdocs.json'; diff --git a/api_docs/stack_alerts.mdx b/api_docs/stack_alerts.mdx index 96f5f8da2afbf..26bda31ab7d8c 100644 --- a/api_docs/stack_alerts.mdx +++ b/api_docs/stack_alerts.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackAlerts title: "stackAlerts" image: https://source.unsplash.com/400x175/?github description: API docs for the stackAlerts plugin -date: 2023-05-07 +date: 2023-05-09 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 4db7aa7a26d13..a47270dbf3141 100644 --- a/api_docs/stack_connectors.mdx +++ b/api_docs/stack_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/stackConnectors title: "stackConnectors" image: https://source.unsplash.com/400x175/?github description: API docs for the stackConnectors plugin -date: 2023-05-07 +date: 2023-05-09 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 4de5cd8e8fa7c..82c9a575acd03 100644 --- a/api_docs/task_manager.mdx +++ b/api_docs/task_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/taskManager title: "taskManager" image: https://source.unsplash.com/400x175/?github description: API docs for the taskManager plugin -date: 2023-05-07 +date: 2023-05-09 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 f82cac45813a4..92800475e3cbe 100644 --- a/api_docs/telemetry.mdx +++ b/api_docs/telemetry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetry title: "telemetry" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetry plugin -date: 2023-05-07 +date: 2023-05-09 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 303c5edf25e08..fa39f65672bba 100644 --- a/api_docs/telemetry_collection_manager.mdx +++ b/api_docs/telemetry_collection_manager.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionManager title: "telemetryCollectionManager" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionManager plugin -date: 2023-05-07 +date: 2023-05-09 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 baa4ec6e0a84e..29ac92e7e4a96 100644 --- a/api_docs/telemetry_collection_xpack.mdx +++ b/api_docs/telemetry_collection_xpack.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryCollectionXpack title: "telemetryCollectionXpack" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryCollectionXpack plugin -date: 2023-05-07 +date: 2023-05-09 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 faf6dea904470..284691a3f91d4 100644 --- a/api_docs/telemetry_management_section.mdx +++ b/api_docs/telemetry_management_section.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/telemetryManagementSection title: "telemetryManagementSection" image: https://source.unsplash.com/400x175/?github description: API docs for the telemetryManagementSection plugin -date: 2023-05-07 +date: 2023-05-09 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 f508dd1a9c6fd..0bf74e48535a3 100644 --- a/api_docs/threat_intelligence.mdx +++ b/api_docs/threat_intelligence.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/threatIntelligence title: "threatIntelligence" image: https://source.unsplash.com/400x175/?github description: API docs for the threatIntelligence plugin -date: 2023-05-07 +date: 2023-05-09 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 ba2bec6fefd46..c5fbcaae60e04 100644 --- a/api_docs/timelines.mdx +++ b/api_docs/timelines.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/timelines title: "timelines" image: https://source.unsplash.com/400x175/?github description: API docs for the timelines plugin -date: 2023-05-07 +date: 2023-05-09 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 f60b4f7db99fb..84dfe2d43b5e0 100644 --- a/api_docs/transform.mdx +++ b/api_docs/transform.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/transform title: "transform" image: https://source.unsplash.com/400x175/?github description: API docs for the transform plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'transform'] --- import transformObj from './transform.devdocs.json'; diff --git a/api_docs/triggers_actions_ui.devdocs.json b/api_docs/triggers_actions_ui.devdocs.json index 268a508829116..61047f5bb50c1 100644 --- a/api_docs/triggers_actions_ui.devdocs.json +++ b/api_docs/triggers_actions_ui.devdocs.json @@ -4401,20 +4401,6 @@ "path": "x-pack/plugins/triggers_actions_ui/public/types.ts", "deprecated": false, "trackAdoption": false - }, - { - "parentPluginId": "triggersActionsUi", - "id": "def-public.RuleTableItem.activeSnoozes", - "type": "Array", - "tags": [], - "label": "activeSnoozes", - "description": [], - "signature": [ - "string[] | undefined" - ], - "path": "x-pack/plugins/triggers_actions_ui/public/types.ts", - "deprecated": false, - "trackAdoption": false } ], "initialIsOpen": false @@ -7848,7 +7834,7 @@ { "parentPluginId": "triggersActionsUi", "id": "def-public.TriggersAndActionsUIPublicPluginStart.getRulesListNotifyBadge.$1", - "type": "Object", + "type": "CompoundType", "tags": [], "label": "props", "description": [], diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx index 5d22b2ca98a3e..2b6b98d01fe7e 100644 --- a/api_docs/triggers_actions_ui.mdx +++ b/api_docs/triggers_actions_ui.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/triggersActionsUi title: "triggersActionsUi" image: https://source.unsplash.com/400x175/?github description: API docs for the triggersActionsUi plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'triggersActionsUi'] --- import triggersActionsUiObj from './triggers_actions_ui.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-o | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 551 | 11 | 522 | 49 | +| 550 | 11 | 521 | 49 | ## Client diff --git a/api_docs/ui_actions.mdx b/api_docs/ui_actions.mdx index 3705aaf4c78f1..22d25a567cc70 100644 --- a/api_docs/ui_actions.mdx +++ b/api_docs/ui_actions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActions title: "uiActions" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActions plugin -date: 2023-05-07 +date: 2023-05-09 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 cb256c9fb9abf..728eebfcf969a 100644 --- a/api_docs/ui_actions_enhanced.mdx +++ b/api_docs/ui_actions_enhanced.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uiActionsEnhanced title: "uiActionsEnhanced" image: https://source.unsplash.com/400x175/?github description: API docs for the uiActionsEnhanced plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] --- import uiActionsEnhancedObj from './ui_actions_enhanced.devdocs.json'; diff --git a/api_docs/unified_field_list.devdocs.json b/api_docs/unified_field_list.devdocs.json index b6337f09e6eba..f592e3401ae0e 100644 --- a/api_docs/unified_field_list.devdocs.json +++ b/api_docs/unified_field_list.devdocs.json @@ -3770,6 +3770,21 @@ "path": "src/plugins/unified_field_list/common/types/stats.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "unifiedFieldList", + "id": "def-public.FieldStatsResponse.numberSummary", + "type": "Object", + "tags": [], + "label": "numberSummary", + "description": [], + "signature": [ + "NumberSummary", + " | undefined" + ], + "path": "src/plugins/unified_field_list/common/types/stats.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -3991,6 +4006,21 @@ "path": "src/plugins/unified_field_list/public/components/field_stats/field_stats.tsx", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "unifiedFieldList", + "id": "def-public.FieldStatsState.numberSummary", + "type": "Object", + "tags": [], + "label": "numberSummary", + "description": [], + "signature": [ + "NumberSummary", + " | undefined" + ], + "path": "src/plugins/unified_field_list/public/components/field_stats/field_stats.tsx", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -4799,10 +4829,10 @@ }, { "parentPluginId": "unifiedFieldList", - "id": "def-public.NumberStatsResult", + "id": "def-public.NumberSummary", "type": "Interface", "tags": [], - "label": "NumberStatsResult", + "label": "NumberSummary", "description": [], "path": "src/plugins/unified_field_list/common/types/stats.ts", "deprecated": false, @@ -4810,25 +4840,13 @@ "children": [ { "parentPluginId": "unifiedFieldList", - "id": "def-public.NumberStatsResult.count", - "type": "number", - "tags": [], - "label": "count", - "description": [], - "path": "src/plugins/unified_field_list/common/types/stats.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "unifiedFieldList", - "id": "def-public.NumberStatsResult.histogram", - "type": "Object", + "id": "def-public.NumberSummary.minValue", + "type": "CompoundType", "tags": [], - "label": "histogram", + "label": "minValue", "description": [], "signature": [ - "BucketedAggregation", - "" + "number | null" ], "path": "src/plugins/unified_field_list/common/types/stats.ts", "deprecated": false, @@ -4836,14 +4854,13 @@ }, { "parentPluginId": "unifiedFieldList", - "id": "def-public.NumberStatsResult.topValues", - "type": "Object", + "id": "def-public.NumberSummary.maxValue", + "type": "CompoundType", "tags": [], - "label": "topValues", + "label": "maxValue", "description": [], "signature": [ - "BucketedAggregation", - "" + "number | null" ], "path": "src/plugins/unified_field_list/common/types/stats.ts", "deprecated": false, @@ -4982,46 +4999,6 @@ ], "initialIsOpen": false }, - { - "parentPluginId": "unifiedFieldList", - "id": "def-public.TopValuesResult", - "type": "Interface", - "tags": [], - "label": "TopValuesResult", - "description": [], - "path": "src/plugins/unified_field_list/common/types/stats.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "unifiedFieldList", - "id": "def-public.TopValuesResult.count", - "type": "number", - "tags": [], - "label": "count", - "description": [], - "path": "src/plugins/unified_field_list/common/types/stats.ts", - "deprecated": false, - "trackAdoption": false - }, - { - "parentPluginId": "unifiedFieldList", - "id": "def-public.TopValuesResult.topValues", - "type": "Object", - "tags": [], - "label": "topValues", - "description": [], - "signature": [ - "BucketedAggregation", - "" - ], - "path": "src/plugins/unified_field_list/common/types/stats.ts", - "deprecated": false, - "trackAdoption": false - } - ], - "initialIsOpen": false - }, { "parentPluginId": "unifiedFieldList", "id": "def-public.VisualizeInformation", diff --git a/api_docs/unified_field_list.mdx b/api_docs/unified_field_list.mdx index bd09491ce8755..4c5007bcacf8a 100644 --- a/api_docs/unified_field_list.mdx +++ b/api_docs/unified_field_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedFieldList title: "unifiedFieldList" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedFieldList plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedFieldList'] --- import unifiedFieldListObj from './unified_field_list.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 295 | 0 | 269 | 7 | +| 293 | 0 | 267 | 8 | ## Client diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx index d64af8a1e3641..90b3ff0597ef9 100644 --- a/api_docs/unified_histogram.mdx +++ b/api_docs/unified_histogram.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedHistogram title: "unifiedHistogram" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedHistogram plugin -date: 2023-05-07 +date: 2023-05-09 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 8a398d89880d2..88c0270b95514 100644 --- a/api_docs/unified_search.mdx +++ b/api_docs/unified_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch title: "unifiedSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch plugin -date: 2023-05-07 +date: 2023-05-09 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 a9b577186dbf9..6983636caf80b 100644 --- a/api_docs/unified_search_autocomplete.mdx +++ b/api_docs/unified_search_autocomplete.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedSearch-autocomplete title: "unifiedSearch.autocomplete" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedSearch.autocomplete plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch.autocomplete'] --- import unifiedSearchAutocompleteObj from './unified_search_autocomplete.devdocs.json'; diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx index 311cd642e0475..38f68bf6ebe43 100644 --- a/api_docs/url_forwarding.mdx +++ b/api_docs/url_forwarding.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/urlForwarding title: "urlForwarding" image: https://source.unsplash.com/400x175/?github description: API docs for the urlForwarding plugin -date: 2023-05-07 +date: 2023-05-09 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 c0018a43dadf3..a101a8ccd574b 100644 --- a/api_docs/usage_collection.mdx +++ b/api_docs/usage_collection.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/usageCollection title: "usageCollection" image: https://source.unsplash.com/400x175/?github description: API docs for the usageCollection plugin -date: 2023-05-07 +date: 2023-05-09 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 f3e6f127592fe..8aec2583aa4d6 100644 --- a/api_docs/ux.mdx +++ b/api_docs/ux.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/ux title: "ux" image: https://source.unsplash.com/400x175/?github description: API docs for the ux plugin -date: 2023-05-07 +date: 2023-05-09 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 dc18fa47f0339..094ec6c64e50f 100644 --- a/api_docs/vis_default_editor.mdx +++ b/api_docs/vis_default_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visDefaultEditor title: "visDefaultEditor" image: https://source.unsplash.com/400x175/?github description: API docs for the visDefaultEditor plugin -date: 2023-05-07 +date: 2023-05-09 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 51bac28729ef4..51e49391cdf5f 100644 --- a/api_docs/vis_type_gauge.mdx +++ b/api_docs/vis_type_gauge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeGauge title: "visTypeGauge" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeGauge plugin -date: 2023-05-07 +date: 2023-05-09 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 0685a74ec84b2..27ddfb9b5f744 100644 --- a/api_docs/vis_type_heatmap.mdx +++ b/api_docs/vis_type_heatmap.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeHeatmap title: "visTypeHeatmap" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeHeatmap plugin -date: 2023-05-07 +date: 2023-05-09 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 dc7a72f84d7f4..6adcc50fc68da 100644 --- a/api_docs/vis_type_pie.mdx +++ b/api_docs/vis_type_pie.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypePie title: "visTypePie" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypePie plugin -date: 2023-05-07 +date: 2023-05-09 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 1233c0e07fed6..653a178031391 100644 --- a/api_docs/vis_type_table.mdx +++ b/api_docs/vis_type_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTable title: "visTypeTable" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTable plugin -date: 2023-05-07 +date: 2023-05-09 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 0a53735c4c70a..6605f6f1b3384 100644 --- a/api_docs/vis_type_timelion.mdx +++ b/api_docs/vis_type_timelion.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimelion title: "visTypeTimelion" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimelion plugin -date: 2023-05-07 +date: 2023-05-09 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 5fd8c74d9931d..3a6144d1a0144 100644 --- a/api_docs/vis_type_timeseries.mdx +++ b/api_docs/vis_type_timeseries.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeTimeseries title: "visTypeTimeseries" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeTimeseries plugin -date: 2023-05-07 +date: 2023-05-09 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 8d791d58f3384..14593ddedd813 100644 --- a/api_docs/vis_type_vega.mdx +++ b/api_docs/vis_type_vega.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVega title: "visTypeVega" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVega plugin -date: 2023-05-07 +date: 2023-05-09 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 5defc6f0ad22a..d33220758da17 100644 --- a/api_docs/vis_type_vislib.mdx +++ b/api_docs/vis_type_vislib.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeVislib title: "visTypeVislib" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeVislib plugin -date: 2023-05-07 +date: 2023-05-09 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 944ff20076bef..0466efab284df 100644 --- a/api_docs/vis_type_xy.mdx +++ b/api_docs/vis_type_xy.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visTypeXy title: "visTypeXy" image: https://source.unsplash.com/400x175/?github description: API docs for the visTypeXy plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] --- import visTypeXyObj from './vis_type_xy.devdocs.json'; diff --git a/api_docs/visualization_ui_components.mdx b/api_docs/visualization_ui_components.mdx index 04ac4ccd8bfbe..0b86823e14909 100644 --- a/api_docs/visualization_ui_components.mdx +++ b/api_docs/visualization_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visualizationUiComponents title: "visualizationUiComponents" image: https://source.unsplash.com/400x175/?github description: API docs for the visualizationUiComponents plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizationUiComponents'] --- import visualizationUiComponentsObj from './visualization_ui_components.devdocs.json'; diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index 93ac8a01fb12e..46cb572c2948b 100644 --- a/api_docs/visualizations.mdx +++ b/api_docs/visualizations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/visualizations title: "visualizations" image: https://source.unsplash.com/400x175/?github description: API docs for the visualizations plugin -date: 2023-05-07 +date: 2023-05-09 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; diff --git a/config/serverless.yml b/config/serverless.yml index a5177de771688..ab99048418269 100644 --- a/config/serverless.yml +++ b/config/serverless.yml @@ -17,3 +17,7 @@ xpack.license_management.enabled: false # Other disabled plugins #xpack.canvas.enabled: false #only disabable in dev-mode xpack.reporting.enabled: false + +# Telemetry enabled by default and not disableable via UI +telemetry.optIn: true +telemetry.allowChangingOptInStatus: false diff --git a/dev_docs/tutorials/performance/running_performance_journey_in_cloud.mdx b/dev_docs/tutorials/performance/running_performance_journey_in_cloud.mdx new file mode 100644 index 0000000000000..3f8b373afad39 --- /dev/null +++ b/dev_docs/tutorials/performance/running_performance_journey_in_cloud.mdx @@ -0,0 +1,93 @@ +--- +id: kibDevTutorialRunningPerformanceJourneyInCloud +slug: /kibana-dev-docs/tutorial/performance/running_performance_journey_in_cloud +title: Running Performance Journey In Cloud +summary: Learn how to run performance journey against Cloud cluster +date: 2023-05-04 +tags: ['kibana', 'onboarding', 'setup', 'performance', 'development', 'telemetry'] +--- + +## Overview +As a way to better understand user experience with Kibana in cloud, we support running performance journeys against +Cloud deployments. +The process takes a few steps: +- Create a cloud deployment +- Re-configure deployment with APM enabled and reporting metrics to the monitoring cluster +- Create a user with `superuser` role to run tests with +- Checkout the branch that matches your cloud deployment version +- Run the performance journey + +### Re-configure deployment for Kibana and Elasticsearch +We use [kibana-ops-e2e-perf](https://kibana-ops-e2e-perf.kb.us-central1.gcp.cloud.es.io/) cluster to monitor performance testing. + +If you would like to report APM metrics to this cluster, copy `SECRET_TOKEN` and `SERVER_URL` values from [packages/kbn-journeys/journey/journey_apm_config.ts](https://github.com/elastic/kibana/blob/60c82765779419d356a131e212682b69b035804b/packages/kbn-journeys/journey/journey_apm_config.ts#L10-L11) + +#### Change Elasticsearch configuration +In the ESS Admin Console, find your deployment and navigate to `Security` page. Click `Add Settings` under `Elasticsearch keystore` and add new entry: + +``` +Setting name: tracing.apm.secret_token +Secret: +``` + +Navigate to `Advanced Edit` page and change `Deployment Configuration` by adding the following JSON object to `resources.elasticsearch.plan.elasticsearch`: + +``` +"user_settings_override_json": { + "tracing.apm.enabled": "true", + "tracing.apm.environment": "development", + "tracing.apm.agent.service_name": "elasticsearch", + "tracing.apm.agent.server_url": "", + "tracing.apm.agent.metrics_interval": "120s", + "tracing.apm.agent.transaction_sample_rate": "1" +} +``` + +Save changes and make sure cluster is restarted successfully. + +#### Change Kibana configuration +Navigate to `Advanced Edit` page and change `Deployment Configuration` by adding the following JSON object to `resources.kibana.plan.kibana`: + +``` +"user_settings_override_json": { + "elastic.apm.active": true, + "elastic.apm.breakdownMetrics": false, + "elastic.apm.captureBody": "all", + "elastic.apm.captureRequestHeaders": "true", + "elastic.apm.captureSpanStackTraces": false, + "elastic.apm.centralConfig": false, + "elastic.apm.contextPropagationOnly": "false", + "elastic.apm.environment": "development", + "elastic.apm.globalLabels.deploymentId": "", + "elastic.apm.globalLabels.journeyName": "", + "elastic.apm.longFieldMaxLength": "300000", + "elastic.apm.metricsInterval": "120s", + "elastic.apm.propagateTracestate": true, + "elastic.apm.sanitizeFieldNames": "password,passwd,pwd,secret,*key,*token*,*session*,*credit*,*card*,*auth*,set-cookie,pw,pass,connect.sid", + "elastic.apm.secretToken": "", + "elastic.apm.serverUrl": "", + "elastic.apm.transactionSampleRate": 1 +} +``` + +Note: DEPLOYMENT_ID and YOUR_JOURNEY_NAME values are optional labels to find the APM traces for your run. + +Save changes and make sure cluster is restarted successfully. + +### Run the journey +Make sure you have created user with `superuser` role and the Kibana repo branch is matching your deployment version. +Set env variables to run FTR against your cloud deployment: + +``` +export TEST_KIBANA_URL=https://:@ +export TEST_ES_URL=https://:@: +export TEST_CLOUD=1 +``` + +Run your journey with the command: + +``` +node scripts/functional_test_runner.js --config x-pack/performance/journeys/$YOUR_JOURNEY_NAME.ts` +``` + + diff --git a/docs/api-generated/connectors/connector-apis-passthru.asciidoc b/docs/api-generated/connectors/connector-apis-passthru.asciidoc index 5bd4a4bc44f45..631e30982c86a 100644 --- a/docs/api-generated/connectors/connector-apis-passthru.asciidoc +++ b/docs/api-generated/connectors/connector-apis-passthru.asciidoc @@ -19,6 +19,7 @@ Any modifications made to this file will be overwritten.

Connectors

  • post /s/{spaceId}/api/actions/connector
  • +
  • post /s/{spaceId}/api/actions/connector/{connectorId}
  • delete /s/{spaceId}/api/actions/connector/{connectorId}
  • get /s/{spaceId}/api/actions/connector/{connectorId}
  • get /s/{spaceId}/api/actions/connector_types
  • @@ -73,6 +74,74 @@ Any modifications made to this file will be overwritten. +

    Return type

    + + + + +

    Example data

    +
    Content-Type: application/json
    +
    null
    + +

    Produces

    + This API call produces the following media types according to the Accept request header; + the media type will be conveyed by the Content-Type response header. +
      +
    • application/json
    • +
    + +

    Responses

    +

    200

    + Indicates a successful call. + connector_response_properties +

    401

    + Authorization information is missing or invalid. + Unauthorized_response + +
    +
    +
    + Up +
    post /s/{spaceId}/api/actions/connector/{connectorId}
    +
    Creates a connector. (createConnectorId)
    +
    You must have all privileges for the Actions and Connectors feature in the Management section of the Kibana feature privileges.
    + +

    Path parameters

    +
    +
    spaceId (required)
    + +
    Path Parameter — An identifier for the space. If /s/ and the identifier are omitted from the path, the default space is used. default: null
    connectorId (required)
    + +
    Path Parameter — A UUID v1 or v4 identifier for the connector. If you omit this parameter, an identifier is randomly generated. default: null
    +
    + +

    Consumes

    + This API call consumes the following media types via the Content-Type request header: +
      +
    • application/json
    • +
    + +

    Request body

    +
    +
    Create_connector_request_body_properties Create_connector_request_body_properties (required)
    + +
    Body Parameter
    + +
    + +

    Request headers

    +
    +
    kbn-xsrf (required)
    + +
    Header Parameter — Cross-site request forgery protection default: null
    + +
    + + +

    Return type

    connector_response_properties @@ -970,7 +1039,8 @@ Any modifications made to this file will be overwritten.
  • create_connector_request_servicenow - Create ServiceNow ITSM connector request
  • create_connector_request_servicenow_itom - Create ServiceNow ITOM connector request
  • create_connector_request_servicenow_sir - Create ServiceNow SecOps connector request
  • -
  • create_connector_request_slack - Create Slack connector request
  • +
  • create_connector_request_slack_api - Create Slack connector request
  • +
  • create_connector_request_slack_webhook - Create Slack connector request
  • create_connector_request_swimlane - Create Swimlane connector request
  • create_connector_request_teams - Create Microsoft Teams connector request
  • create_connector_request_tines - Create Tines connector request
  • @@ -1016,9 +1086,8 @@ Any modifications made to this file will be overwritten.
  • secrets_properties_opsgenie - Connector secrets properties for an Opsgenie connector
  • secrets_properties_resilient - Connector secrets properties for IBM Resilient connector
  • secrets_properties_servicenow - Connector secrets properties for ServiceNow ITOM, ServiceNow ITSM, and ServiceNow SecOps connectors
  • -
  • secrets_properties_slack - Connector secrets properties for a Slack connector
  • -
  • secrets_properties_slack_oneOf -
  • -
  • secrets_properties_slack_oneOf_1 -
  • +
  • secrets_properties_slack_api - Connector secrets properties for a Web API Slack connector
  • +
  • secrets_properties_slack_webhook - Connector secrets properties for a Webhook Slack connector
  • secrets_properties_swimlane - Connector secrets properties for a Swimlane connector
  • updateConnector_400_response -
  • update_connector_request_cases_webhook - Update Webhook - Case Managment connector request
  • @@ -1029,7 +1098,8 @@ Any modifications made to this file will be overwritten.
  • update_connector_request_serverlog - Update server log connector request
  • update_connector_request_servicenow - Update ServiceNow ITSM connector or ServiceNow SecOps request
  • update_connector_request_servicenow_itom - Create ServiceNow ITOM connector request
  • -
  • update_connector_request_slack - Update Slack connector request
  • +
  • update_connector_request_slack_api - Update Slack connector request
  • +
  • update_connector_request_slack_webhook - Update Slack connector request
  • update_connector_request_swimlane - Update Swimlane connector request
  • @@ -1785,14 +1855,25 @@ Any modifications made to this file will be overwritten.
    -

    create_connector_request_slack - Create Slack connector request Up

    +

    create_connector_request_slack_api - Create Slack connector request Up

    +
    The Slack connector uses Slack Incoming Webhooks.
    +
    +
    connector_type_id
    String The type of connector.
    +
    Enum:
    +
    .slack_api
    +
    name
    String The display name for the connector.
    +
    secrets
    +
    +
    +
    +

    create_connector_request_slack_webhook - Create Slack connector request Up

    The Slack connector uses Slack Incoming Webhooks.
    connector_type_id
    String The type of connector.
    Enum:
    .slack
    name
    String The display name for the connector.
    -
    secrets
    +
    secrets
    @@ -2240,25 +2321,17 @@ Any modifications made to this file will be overwritten.
    -

    secrets_properties_slack - Connector secrets properties for a Slack connector Up

    +

    secrets_properties_slack_api - Connector secrets properties for a Web API Slack connector Up

    Defines secrets for connectors when type is .slack.
    -
    token
    String The Slack bot user OAuth token.
    -
    webhookUrl
    String The Slack webhook url.
    +
    token
    String Slack bot user OAuth token.
    -

    secrets_properties_slack_oneOf - Up

    -
    -
    -
    token
    String The Slack bot user OAuth token.
    -
    -
    -
    -

    secrets_properties_slack_oneOf_1 - Up

    -
    +

    secrets_properties_slack_webhook - Connector secrets properties for a Webhook Slack connector Up

    +
    Defines secrets for connectors when type is .slack.
    -
    webhookUrl
    String The Slack webhook url.
    +
    webhookUrl
    String Slack webhook url.
    @@ -2347,14 +2420,19 @@ Any modifications made to this file will be overwritten.
    +
    diff --git a/docs/developer/architecture/core/configuration-service.asciidoc b/docs/developer/architecture/core/configuration-service.asciidoc index b78414486e3c3..1cf9a17a43878 100644 --- a/docs/developer/architecture/core/configuration-service.asciidoc +++ b/docs/developer/architecture/core/configuration-service.asciidoc @@ -147,3 +147,64 @@ export const config: PluginConfigDescriptor = { ], }; ---- +[[validating-your-configuration-based-on-context-references]] +=== Validating your configuration based on context references +Some features require special configuration when running in different modes (dev/prod/dist, or even serverless). For purpose, core injects the following _references_ in the validation's context: + +[cols="^1,^1,3"] +|=== +|Context Reference |Potential values |Description + +|`dev` +|`true`\|`false` +|Is Kibana running in Dev mode? + +|`prod` +|`true`\|`false` +|Is Kibana running in Production mode (running from binary)? + +|`dist` +|`true`\|`false` +|Is Kibana running from a distributable build (not running from source)? + +|`serverless` +|`true`\|`false` +|Is Kibana running in Serverless offering? + +|`version` +|`8.9.0` +|The current version of Kibana + +|`buildNum` +|`12345` +|The build number + +|`branch` +|`main` +|The current branch running + +|`buildSha` +|`12345` +|The build SHA (typically refers to the last commit's SHA) + +|=== + +To use any of the references listed above in a config validation schema, they can be accessed via `schema.contextRef('{CONTEXT_REFERENCE}')`: + +[source,js] +---- +export const config = { + schema: schema.object({ + // Enabled by default in Dev mode + enabled: schema.boolean({ defaultValue: schema.contextRef('dev') }), + + // Setting only allowed in the Serverless offering + plansForWorldPeace: schema.conditional( + schema.contextRef('serverless'), + true, + schema.string({ defaultValue: 'Free hugs' }), + schema.never() + ), + }), +}; +---- diff --git a/examples/discover_extender/kibana.jsonc b/examples/discover_extender/kibana.jsonc new file mode 100644 index 0000000000000..9a6acb70cd519 --- /dev/null +++ b/examples/discover_extender/kibana.jsonc @@ -0,0 +1,11 @@ +{ + "type": "plugin", + "id": "@kbn/discover-extender-plugin", + "owner": "@elastic/kibana-data-discovery", + "plugin": { + "id": "discoverExtender", + "server": false, + "browser": true, + "requiredPlugins": ["discover"] + } +} diff --git a/examples/discover_extender/public/index.ts b/examples/discover_extender/public/index.ts new file mode 100644 index 0000000000000..d164b53cae9d0 --- /dev/null +++ b/examples/discover_extender/public/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 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { DiscoverExtenderPlugin } from './plugin'; + +export function plugin() { + return new DiscoverExtenderPlugin(); +} diff --git a/examples/discover_extender/public/more_menu_cell.tsx b/examples/discover_extender/public/more_menu_cell.tsx new file mode 100644 index 0000000000000..e497adc53f18d --- /dev/null +++ b/examples/discover_extender/public/more_menu_cell.tsx @@ -0,0 +1,63 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { + EuiButtonIcon, + EuiContextMenu, + EuiDataGridCellValueElementProps, + EuiPopover, +} from '@elastic/eui'; +import React, { useEffect, useState } from 'react'; + +export const MoreMenuCell = ({ setCellProps }: EuiDataGridCellValueElementProps) => { + const [isPopoverOpen, setIsPopoverOpen] = useState(false); + const togglePopover = () => setIsPopoverOpen((open) => !open); + const closePopover = () => setIsPopoverOpen(false); + + useEffect(() => { + setCellProps({ + style: { + padding: 0, + }, + }); + }, [setCellProps]); + + return ( + } + isOpen={isPopoverOpen} + anchorPosition="rightCenter" + panelPaddingSize="none" + closePopover={closePopover} + > + alert('Show host details clicked'), + }, + { + name: 'Create rule', + onClick: () => alert('Create rule clicked'), + }, + { + name: 'Create SLO', + onClick: () => alert('Create SLO clicked'), + }, + ], + }, + ]} + /> + + ); +}; diff --git a/examples/discover_extender/public/plugin.tsx b/examples/discover_extender/public/plugin.tsx new file mode 100644 index 0000000000000..9cd01e43c8dbb --- /dev/null +++ b/examples/discover_extender/public/plugin.tsx @@ -0,0 +1,248 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { + EuiButton, + EuiContextMenu, + EuiPopover, + EuiScreenReaderOnly, + EuiWrappingPopover, +} from '@elastic/eui'; +import type { CoreStart, Plugin, SimpleSavedObject } from '@kbn/core/public'; +import type { DiscoverStart } from '@kbn/discover-plugin/public'; +import React, { useEffect, useState } from 'react'; +import ReactDOM from 'react-dom'; +import useObservable from 'react-use/lib/useObservable'; + +export interface DiscoverExtenderStartPlugins { + discover: DiscoverStart; +} + +export class DiscoverExtenderPlugin implements Plugin { + setup() {} + + start(core: CoreStart, plugins: DiscoverExtenderStartPlugins) { + const { discover } = plugins; + + discover.customize('default', ({ customizations }) => { + customizations.set({ + id: 'top_nav', + defaultMenu: { + options: { order: 100 }, + new: { order: 200 }, + open: { order: 300 }, + share: { order: 400 }, + alerts: { order: 500 }, + inspect: { order: 600 }, + save: { order: 800 }, + }, + getMenuItems: () => [ + { + data: { + id: 'logsExplorer', + label: 'Logs explorer', + iconType: 'logsApp', + run: () => { + discover.locator?.navigate({ profile: 'extender' }); + }, + }, + order: 700, + }, + ], + }); + + return () => { + // eslint-disable-next-line no-console + console.log('Cleaning up Document explorer customizations'); + }; + }); + + let isOptionsOpen = false; + const optionsContainer = document.createElement('div'); + const closeOptionsPopover = () => { + ReactDOM.unmountComponentAtNode(optionsContainer); + document.body.removeChild(optionsContainer); + isOptionsOpen = false; + }; + + discover.customize('extender', async ({ customizations, stateContainer }) => { + customizations.set({ + id: 'top_nav', + defaultMenu: { + options: { disabled: true }, + new: { disabled: true }, + open: { disabled: true }, + share: { order: 200 }, + alerts: { disabled: true }, + inspect: { disabled: true }, + save: { order: 400 }, + }, + getMenuItems: () => [ + { + data: { + id: 'options', + label: 'Options', + iconType: 'arrowDown', + iconSide: 'right', + run: (anchorElement: HTMLElement) => { + if (isOptionsOpen) { + closeOptionsPopover(); + return; + } + + isOptionsOpen = true; + document.body.appendChild(optionsContainer); + + const element = ( + + alert('Create new clicked'), + }, + { + name: 'Make a copy', + icon: 'copy', + onClick: () => alert('Make a copy clicked'), + }, + { + name: 'Manage saved searches', + icon: 'gear', + onClick: () => alert('Manage saved searches clicked'), + }, + ], + }, + ]} + /> + + ); + + ReactDOM.render(element, optionsContainer); + }, + }, + order: 100, + }, + { + data: { + id: 'documentExplorer', + label: 'Document explorer', + iconType: 'discoverApp', + run: () => { + discover.locator?.navigate({}); + }, + }, + order: 300, + }, + ], + }); + + customizations.set({ + id: 'search_bar', + CustomDataViewPicker: () => { + const [isPopoverOpen, setIsPopoverOpen] = useState(false); + const togglePopover = () => setIsPopoverOpen((open) => !open); + const closePopover = () => setIsPopoverOpen(false); + const [savedSearches, setSavedSearches] = useState([]); + + useEffect(() => { + core.savedObjects.client.find({ type: 'search' }).then((response) => { + setSavedSearches(response.savedObjects); + }); + }, []); + + const currentSavedSearch = useObservable( + stateContainer.savedSearchState.getCurrent$(), + stateContainer.savedSearchState.getState() + ); + + return ( + + {currentSavedSearch.title ?? 'None selected'} + + } + isOpen={isPopoverOpen} + panelPaddingSize="none" + closePopover={closePopover} + > + ({ + name: savedSearch.get('title'), + onClick: () => stateContainer.actions.onOpenSavedSearch(savedSearch.id), + icon: savedSearch.id === currentSavedSearch.id ? 'check' : 'empty', + })), + }, + ]} + /> + + ); + }, + }); + + customizations.set({ + id: 'field_popover', + CustomBottomButton: () => ( + alert('Categorize flyout opened')} + > + Categorize + + ), + }); + + const { MoreMenuCell } = await import('./more_menu_cell'); + + customizations.set({ + id: 'data_grid', + defaultLeadingControlColumns: { + select: { disabled: true }, + }, + getLeadingControlColumns: () => [ + { + id: 'moreMenu', + width: 24, + headerCellRender: () => ( + + More menu + + ), + rowCellRender: MoreMenuCell, + }, + ], + }); + + return () => { + // eslint-disable-next-line no-console + console.log('Cleaning up Logs explorer customizations'); + }; + }); + } +} diff --git a/examples/discover_extender/tsconfig.json b/examples/discover_extender/tsconfig.json new file mode 100644 index 0000000000000..e5dce4f00c56e --- /dev/null +++ b/examples/discover_extender/tsconfig.json @@ -0,0 +1,12 @@ +{ + "extends": "../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types" + }, + "include": ["common/**/*", "public/**/*", "server/**/*", "../../typings/**/*"], + "kbn_references": [ + "@kbn/core", + "@kbn/discover-plugin", + ], + "exclude": ["target/**/*"] +} diff --git a/package.json b/package.json index 391b8d31127ed..d3f22573247a7 100644 --- a/package.json +++ b/package.json @@ -354,6 +354,7 @@ "@kbn/dev-tools-plugin": "link:src/plugins/dev_tools", "@kbn/developer-examples-plugin": "link:examples/developer_examples", "@kbn/discover-enhanced-plugin": "link:x-pack/plugins/discover_enhanced", + "@kbn/discover-extender-plugin": "link:examples/discover_extender", "@kbn/discover-plugin": "link:src/plugins/discover", "@kbn/doc-links": "link:packages/kbn-doc-links", "@kbn/dom-drag-drop": "link:packages/kbn-dom-drag-drop", @@ -788,7 +789,7 @@ "deepmerge": "^4.2.2", "del": "^6.1.0", "elastic-apm-http-client": "^11.0.1", - "elastic-apm-node": "^3.44.1", + "elastic-apm-node": "^3.45.0", "email-addresses": "^5.0.0", "execa": "^4.0.2", "expiry-js": "0.1.7", @@ -880,7 +881,7 @@ "prop-types": "^15.8.1", "proxy-from-env": "1.0.0", "puid": "1.0.7", - "puppeteer": "19.7.2", + "puppeteer": "20.1.0", "query-string": "^6.13.2", "rbush": "^3.0.1", "re-resizable": "^6.1.1", @@ -1342,7 +1343,7 @@ "backport": "^8.9.7", "callsites": "^3.1.0", "chance": "1.0.18", - "chromedriver": "^112.0.0", + "chromedriver": "^113.0.0", "clean-webpack-plugin": "^3.0.0", "compression-webpack-plugin": "^4.0.0", "copy-webpack-plugin": "^6.0.2", diff --git a/packages/core/chrome/core-chrome-browser-internal/src/ui/project/navigation.tsx b/packages/core/chrome/core-chrome-browser-internal/src/ui/project/navigation.tsx index 445a80cca586d..649318a26d15e 100644 --- a/packages/core/chrome/core-chrome-browser-internal/src/ui/project/navigation.tsx +++ b/packages/core/chrome/core-chrome-browser-internal/src/ui/project/navigation.tsx @@ -54,6 +54,7 @@ export const ProjectNavigation: React.FC = ({ children }) => { isDocked={true} size={isOpen ? SIZE_OPEN : SIZE_CLOSED} hideCloseButton={false} + ownFocus={false} button={ = {}; private readonly client: RepositoryEsClient; private readonly _encryptionExtension?: ISavedObjectsEncryptionExtension; private readonly _securityExtension?: ISavedObjectsSecurityExtension; @@ -403,7 +404,7 @@ export class SavedObjectsRepository implements ISavedObjectsRepository { * migration to fail, but it's the best we can do without devising a way to run validations * inside the migration algorithm itself. */ - this.validateObjectAttributes(type, migrated as SavedObjectSanitizedDoc); + this.validateObjectForCreate(type, migrated as SavedObjectSanitizedDoc); const raw = this._serializer.savedObjectToRaw(migrated as SavedObjectSanitizedDoc); @@ -629,7 +630,7 @@ export class SavedObjectsRepository implements ISavedObjectsRepository { * inside the migration algorithm itself. */ try { - this.validateObjectAttributes(object.type, migrated); + this.validateObjectForCreate(object.type, migrated); } catch (error) { return { tag: 'Left', @@ -2757,25 +2758,31 @@ export class SavedObjectsRepository implements ISavedObjectsRepository { } /** Validate a migrated doc against the registered saved object type's schema. */ - private validateObjectAttributes(type: string, doc: SavedObjectSanitizedDoc) { - const savedObjectType = this._registry.getType(type); - if (!savedObjectType?.schemas) { + private validateObjectForCreate(type: string, doc: SavedObjectSanitizedDoc) { + if (!this._registry.getType(type)) { return; } - - const validator = new SavedObjectsTypeValidator({ - logger: this._logger.get('type-validator'), - type, - validationMap: savedObjectType.schemas, - }); - + const validator = this.getTypeValidator(type); try { - validator.validate(this._migrator.kibanaVersion, doc); + validator.validate(doc, this._migrator.kibanaVersion); } catch (error) { throw SavedObjectsErrorHelpers.createBadRequestError(error.message); } } + private getTypeValidator(type: string): SavedObjectsTypeValidator { + if (!this.typeValidatorMap[type]) { + const savedObjectType = this._registry.getType(type); + this.typeValidatorMap[type] = new SavedObjectsTypeValidator({ + logger: this._logger.get('type-validator'), + type, + validationMap: savedObjectType!.schemas ?? {}, + defaultVersion: this._migrator.kibanaVersion, + }); + } + return this.typeValidatorMap[type]!; + } + /** This is used when objects are created. */ private validateOriginId(type: string, objectOrOptions: { originId?: string }) { if ( diff --git a/packages/core/saved-objects/core-saved-objects-base-server-internal/src/validation/schema.ts b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/validation/schema.ts index 009bf2d89cf46..6c9a61c5003db 100644 --- a/packages/core/saved-objects/core-saved-objects-base-server-internal/src/validation/schema.ts +++ b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/validation/schema.ts @@ -19,33 +19,40 @@ type SavedObjectSanitizedDocSchema = { [K in keyof Required]: Type; }; +const baseSchema = schema.object({ + id: schema.string(), + type: schema.string(), + references: schema.arrayOf( + schema.object({ + name: schema.string(), + type: schema.string(), + id: schema.string(), + }), + { defaultValue: [] } + ), + namespace: schema.maybe(schema.string()), + namespaces: schema.maybe(schema.arrayOf(schema.string())), + migrationVersion: schema.maybe(schema.recordOf(schema.string(), schema.string())), + coreMigrationVersion: schema.maybe(schema.string()), + typeMigrationVersion: schema.maybe(schema.string()), + updated_at: schema.maybe(schema.string()), + created_at: schema.maybe(schema.string()), + version: schema.maybe(schema.string()), + originId: schema.maybe(schema.string()), + managed: schema.maybe(schema.boolean()), + attributes: schema.maybe(schema.any()), +}); + /** * Takes a {@link SavedObjectsValidationSpec} and returns a full schema representing * a {@link SavedObjectSanitizedDoc}, with the spec applied to the object's `attributes`. * * @internal */ -export const createSavedObjectSanitizedDocSchema = (attributesSchema: SavedObjectsValidationSpec) => - schema.object({ +export const createSavedObjectSanitizedDocSchema = ( + attributesSchema: SavedObjectsValidationSpec +) => { + return baseSchema.extends({ attributes: attributesSchema, - id: schema.string(), - type: schema.string(), - references: schema.arrayOf( - schema.object({ - name: schema.string(), - type: schema.string(), - id: schema.string(), - }), - { defaultValue: [] } - ), - namespace: schema.maybe(schema.string()), - namespaces: schema.maybe(schema.arrayOf(schema.string())), - migrationVersion: schema.maybe(schema.recordOf(schema.string(), schema.string())), - coreMigrationVersion: schema.maybe(schema.string()), - typeMigrationVersion: schema.maybe(schema.string()), - updated_at: schema.maybe(schema.string()), - created_at: schema.maybe(schema.string()), - version: schema.maybe(schema.string()), - originId: schema.maybe(schema.string()), - managed: schema.maybe(schema.boolean()), }); +}; diff --git a/packages/core/saved-objects/core-saved-objects-base-server-internal/src/validation/validator.test.ts b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/validation/validator.test.ts index 96bc93be54c1a..e552aee1c8976 100644 --- a/packages/core/saved-objects/core-saved-objects-base-server-internal/src/validation/validator.test.ts +++ b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/validation/validator.test.ts @@ -10,79 +10,162 @@ import { schema } from '@kbn/config-schema'; import { loggerMock, type MockedLogger } from '@kbn/logging-mocks'; import type { SavedObjectSanitizedDoc, + SavedObjectsValidationSpec, SavedObjectsValidationMap, } from '@kbn/core-saved-objects-server'; import { SavedObjectsTypeValidator } from './validator'; +const defaultVersion = '3.3.0'; +const type = 'my-type'; + describe('Saved Objects type validator', () => { let validator: SavedObjectsTypeValidator; let logger: MockedLogger; + let validationMap: SavedObjectsValidationMap; - const type = 'my-type'; - const validationMap: SavedObjectsValidationMap = { - '1.0.0': schema.object({ - foo: schema.string(), - }), - }; - - const createMockObject = (attributes: Record): SavedObjectSanitizedDoc => ({ - attributes, + const createMockObject = (parts: Partial): SavedObjectSanitizedDoc => ({ + type, id: 'test-id', references: [], - type, + attributes: {}, + ...parts, }); beforeEach(() => { logger = loggerMock.create(); - validator = new SavedObjectsTypeValidator({ logger, type, validationMap }); }); afterEach(() => { - jest.clearAllMocks(); + jest.resetAllMocks(); }); - it('should do nothing if no matching validation could be found', () => { - const data = createMockObject({ foo: false }); - expect(validator.validate('3.0.0', data)).toBeUndefined(); - expect(logger.debug).not.toHaveBeenCalled(); - }); + describe('validation behavior', () => { + beforeEach(() => { + validationMap = { + '1.0.0': schema.object({ + foo: schema.string(), + }), + }; + validator = new SavedObjectsTypeValidator({ logger, type, validationMap, defaultVersion }); + }); - it('should log when a validation fails', () => { - const data = createMockObject({ foo: false }); - expect(() => validator.validate('1.0.0', data)).toThrowError(); - expect(logger.warn).toHaveBeenCalledTimes(1); - }); + it('should log when a validation fails', () => { + const data = createMockObject({ attributes: { foo: false } }); + expect(() => validator.validate(data, '1.0.0')).toThrowError(); + expect(logger.warn).toHaveBeenCalledTimes(1); + }); - it('should work when given valid values', () => { - const data = createMockObject({ foo: 'hi' }); - expect(() => validator.validate('1.0.0', data)).not.toThrowError(); - }); + it('should work when given valid values', () => { + const data = createMockObject({ attributes: { foo: 'hi' } }); + expect(() => validator.validate(data, '1.0.0')).not.toThrowError(); + }); - it('should throw an error when given invalid values', () => { - const data = createMockObject({ foo: false }); - expect(() => validator.validate('1.0.0', data)).toThrowErrorMatchingInlineSnapshot( - `"[attributes.foo]: expected value of type [string] but got [boolean]"` - ); - }); + it('should throw an error when given invalid values', () => { + const data = createMockObject({ attributes: { foo: false } }); + expect(() => validator.validate(data, '1.0.0')).toThrowErrorMatchingInlineSnapshot( + `"[attributes.foo]: expected value of type [string] but got [boolean]"` + ); + }); - it('should throw an error if fields other than attributes are malformed', () => { - const data = createMockObject({ foo: 'hi' }); - // @ts-expect-error Intentionally malformed object - data.updated_at = false; - expect(() => validator.validate('1.0.0', data)).toThrowErrorMatchingInlineSnapshot( - `"[updated_at]: expected value of type [string] but got [boolean]"` - ); + it('should throw an error if fields other than attributes are malformed', () => { + const data = createMockObject({ attributes: { foo: 'hi' } }); + // @ts-expect-error Intentionally malformed object + data.updated_at = false; + expect(() => validator.validate(data, '1.0.0')).toThrowErrorMatchingInlineSnapshot( + `"[updated_at]: expected value of type [string] but got [boolean]"` + ); + }); + + it('works when the validation map is a function', () => { + const fnValidationMap: () => SavedObjectsValidationMap = () => validationMap; + validator = new SavedObjectsTypeValidator({ + logger, + type, + validationMap: fnValidationMap, + defaultVersion, + }); + + const data = createMockObject({ attributes: { foo: 'hi' } }); + expect(() => validator.validate(data, '1.0.0')).not.toThrowError(); + }); }); - it('works when the validation map is a function', () => { - const fnValidationMap: () => SavedObjectsValidationMap = () => validationMap; - validator = new SavedObjectsTypeValidator({ - logger, - type, - validationMap: fnValidationMap, + describe('schema selection', () => { + beforeEach(() => { + validationMap = { + '2.0.0': createStubSpec(), + '2.7.0': createStubSpec(), + '3.0.0': createStubSpec(), + '3.5.0': createStubSpec(), + '4.0.0': createStubSpec(), + '4.3.0': createStubSpec(), + }; + validator = new SavedObjectsTypeValidator({ logger, type, validationMap, defaultVersion }); }); - const data = createMockObject({ foo: 'hi' }); - expect(() => validator.validate('1.0.0', data)).not.toThrowError(); + const createStubSpec = (): jest.Mocked => { + const stub = schema.object({}, { unknowns: 'allow', defaultValue: {} }); + jest.spyOn(stub as any, 'getSchema'); + return stub as jest.Mocked; + }; + + const getCalledVersion = () => { + for (const [version, validation] of Object.entries(validationMap)) { + if (((validation as any).getSchema as jest.MockedFn).mock.calls.length > 0) { + return version; + } + } + return undefined; + }; + + it('should use the correct schema when specifying the version', () => { + let data = createMockObject({ typeMigrationVersion: '2.2.0' }); + validator.validate(data, '3.2.0'); + expect(getCalledVersion()).toEqual('3.0.0'); + + jest.clearAllMocks(); + + data = createMockObject({ typeMigrationVersion: '3.5.0' }); + validator.validate(data, '4.5.0'); + expect(getCalledVersion()).toEqual('4.3.0'); + }); + + it('should use the correct schema for documents with typeMigrationVersion', () => { + let data = createMockObject({ typeMigrationVersion: '3.2.0' }); + validator.validate(data); + expect(getCalledVersion()).toEqual('3.0.0'); + + jest.clearAllMocks(); + + data = createMockObject({ typeMigrationVersion: '3.5.0' }); + validator.validate(data); + expect(getCalledVersion()).toEqual('3.5.0'); + }); + + it('should use the correct schema for documents with migrationVersion', () => { + let data = createMockObject({ + migrationVersion: { + [type]: '4.6.0', + }, + }); + validator.validate(data); + expect(getCalledVersion()).toEqual('4.3.0'); + + jest.clearAllMocks(); + + data = createMockObject({ + migrationVersion: { + [type]: '4.0.0', + }, + }); + validator.validate(data); + expect(getCalledVersion()).toEqual('4.0.0'); + }); + + it('should use the correct schema for documents without a version specified', () => { + const data = createMockObject({}); + validator.validate(data); + expect(getCalledVersion()).toEqual('3.0.0'); + }); }); }); diff --git a/packages/core/saved-objects/core-saved-objects-base-server-internal/src/validation/validator.ts b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/validation/validator.ts index 13cff1621512a..e028c16f9bd2f 100644 --- a/packages/core/saved-objects/core-saved-objects-base-server-internal/src/validation/validator.ts +++ b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/validation/validator.ts @@ -6,6 +6,7 @@ * Side Public License, v 1. */ +import Semver from 'semver'; import type { Logger } from '@kbn/logging'; import type { SavedObjectsValidationMap, @@ -22,36 +23,61 @@ import { createSavedObjectSanitizedDocSchema } from './schema'; export class SavedObjectsTypeValidator { private readonly log: Logger; private readonly type: string; + private readonly defaultVersion: string; private readonly validationMap: SavedObjectsValidationMap; + private readonly orderedVersions: string[]; constructor({ logger, type, validationMap, + defaultVersion, }: { logger: Logger; type: string; validationMap: SavedObjectsValidationMap | (() => SavedObjectsValidationMap); + defaultVersion: string; }) { this.log = logger; this.type = type; + this.defaultVersion = defaultVersion; this.validationMap = typeof validationMap === 'function' ? validationMap() : validationMap; + this.orderedVersions = Object.keys(this.validationMap).sort(Semver.compare); } - public validate(objectVersion: string, data: SavedObjectSanitizedDoc): void { - const validationRule = this.validationMap[objectVersion]; - if (!validationRule) { - return; // no matching validation rule could be found; proceed without validating + public validate(document: SavedObjectSanitizedDoc, version?: string): void { + const docVersion = + version ?? + document.typeMigrationVersion ?? + document.migrationVersion?.[document.type] ?? + this.defaultVersion; + const schemaVersion = previousVersionWithSchema(this.orderedVersions, docVersion); + if (!schemaVersion || !this.validationMap[schemaVersion]) { + return; } + const validationRule = this.validationMap[schemaVersion]; try { const validationSchema = createSavedObjectSanitizedDocSchema(validationRule); - validationSchema.validate(data); + validationSchema.validate(document); } catch (e) { this.log.warn( - `Error validating object of type [${this.type}] against version [${objectVersion}]` + `Error validating object of type [${this.type}] against version [${docVersion}]` ); throw e; } } } + +const previousVersionWithSchema = ( + orderedVersions: string[], + targetVersion: string +): string | undefined => { + for (let i = orderedVersions.length - 1; i >= 0; i--) { + const currentVersion = orderedVersions[i]; + if (Semver.lte(currentVersion, targetVersion)) { + return currentVersion; + } + } + return undefined; +}; diff --git a/packages/core/test-helpers/core-test-helpers-kbn-server/src/create_root.ts b/packages/core/test-helpers/core-test-helpers-kbn-server/src/create_root.ts index a013a47193e36..4910c2aa6c74f 100644 --- a/packages/core/test-helpers/core-test-helpers-kbn-server/src/create_root.ts +++ b/packages/core/test-helpers/core-test-helpers-kbn-server/src/create_root.ts @@ -197,7 +197,7 @@ export interface TestKibanaUtils { export interface TestUtils { startES: () => Promise; - startKibana: () => Promise; + startKibana: (abortSignal?: AbortSignal) => Promise; } /** @@ -261,7 +261,7 @@ export function createTestServers({ // Add time for KBN and adding users adjustTimeout(es.getStartTimeout() + 100000); - const kbnSettings = settings.kbn ?? {}; + const { cliArgs = {}, customKibanaVersion, ...kbnSettings } = settings.kbn ?? {}; return { startES: async () => { @@ -284,8 +284,10 @@ export function createTestServers({ password: kibanaServerTestUser.password, }; }, - startKibana: async () => { - const root = createRootWithCorePlugins(kbnSettings); + startKibana: async (abortSignal?: AbortSignal) => { + const root = createRootWithCorePlugins(kbnSettings, cliArgs, customKibanaVersion); + + abortSignal?.addEventListener('abort', async () => await root.shutdown()); await root.preboot(); const coreSetup = await root.setup(); diff --git a/packages/kbn-cell-actions/src/components/cell_action_item.tsx b/packages/kbn-cell-actions/src/components/cell_action_item.tsx index b002afb35d83f..8b1419b20531b 100644 --- a/packages/kbn-cell-actions/src/components/cell_action_item.tsx +++ b/packages/kbn-cell-actions/src/components/cell_action_item.tsx @@ -15,19 +15,24 @@ export const ActionItem = ({ action, actionContext, showTooltip, + onClick, }: { action: CellAction; actionContext: CellActionExecutionContext; showTooltip: boolean; + onClick?: () => void; }) => { const actionProps = useMemo( () => ({ iconType: action.getIconType(actionContext) as IconType, - onClick: () => action.execute(actionContext), + onClick: () => { + action.execute(actionContext); + if (onClick) onClick(); + }, 'data-test-subj': `actionItem-${action.id}`, 'aria-label': action.getDisplayName(actionContext), }), - [action, actionContext] + [action, actionContext, onClick] ); if (!actionProps.iconType) return null; diff --git a/packages/kbn-cell-actions/src/components/hover_actions_popover.tsx b/packages/kbn-cell-actions/src/components/hover_actions_popover.tsx index dd087aa755307..0487c27b06e52 100644 --- a/packages/kbn-cell-actions/src/components/hover_actions_popover.tsx +++ b/packages/kbn-cell-actions/src/components/hover_actions_popover.tsx @@ -149,6 +149,7 @@ export const HoverActionsPopover: React.FC = ({ action={action} actionContext={actionContext} showTooltip={showActionTooltips} + onClick={closePopover} /> ))} {extraActions.length > 0 && ( diff --git a/packages/kbn-config/src/config_service.ts b/packages/kbn-config/src/config_service.ts index 7db717d8fb8ba..b9ef887e1002c 100644 --- a/packages/kbn-config/src/config_service.ts +++ b/packages/kbn-config/src/config_service.ts @@ -241,6 +241,7 @@ export class ConfigService { { dev: this.env.mode.dev, prod: this.env.mode.prod, + serverless: this.env.cliArgs.serverless === true, ...this.env.packageInfo, }, `config validation of [${namespace}]` diff --git a/packages/kbn-doc-links/src/get_doc_links.ts b/packages/kbn-doc-links/src/get_doc_links.ts index 9184fab1f0657..892b400e7c888 100644 --- a/packages/kbn-doc-links/src/get_doc_links.ts +++ b/packages/kbn-doc-links/src/get_doc_links.ts @@ -126,7 +126,7 @@ export const getDocLinks = ({ kibanaBranch }: GetDocLinkOptions): DocLinks => { apiKeys: `${KIBANA_DOCS}api-keys.html`, behavioralAnalytics: `${ENTERPRISE_SEARCH_DOCS}analytics-overview.html`, behavioralAnalyticsEvents: `${ENTERPRISE_SEARCH_DOCS}analytics-events.html`, - buildConnector: `{$ENTERPRISE_SEARCH_DOCS}build-connector.html`, + buildConnector: `${ENTERPRISE_SEARCH_DOCS}build-connector.html`, bulkApi: `${ELASTICSEARCH_DOCS}docs-bulk.html`, configuration: `${ENTERPRISE_SEARCH_DOCS}configuration.html`, connectors: `${ENTERPRISE_SEARCH_DOCS}connectors.html`, @@ -507,7 +507,8 @@ export const getDocLinks = ({ kibanaBranch }: GetDocLinkOptions): DocLinks => { serviceNowAction: `${KIBANA_DOCS}servicenow-action-type.html#configuring-servicenow`, serviceNowSIRAction: `${KIBANA_DOCS}servicenow-sir-action-type.html`, setupPrerequisites: `${KIBANA_DOCS}alerting-setup.html#alerting-prerequisites`, - slackAction: `${KIBANA_DOCS}slack-action-type.html#configuring-slack`, + slackAction: `${KIBANA_DOCS}slack-action-type.html#configuring-slack-webhook`, + slackApiAction: `${KIBANA_DOCS}slack-action-type.html#configuring-slack-web-api`, teamsAction: `${KIBANA_DOCS}teams-action-type.html#configuring-teams`, connectors: `${KIBANA_DOCS}action-types.html`, }, @@ -740,5 +741,8 @@ export const getDocLinks = ({ kibanaBranch }: GetDocLinkOptions): DocLinks => { appSearch: `${SEARCH_UI_DOCS}tutorials/app-search`, elasticsearch: `${SEARCH_UI_DOCS}tutorials/elasticsearch`, }, + synthetics: { + featureRoles: `${ELASTIC_WEBSITE_URL}guide/en/observability/${DOC_LINK_VERSION}/synthetics-feature-roles.html`, + }, }); }; diff --git a/packages/kbn-doc-links/src/types.ts b/packages/kbn-doc-links/src/types.ts index 38f0829ac3516..b89e4e91a82a8 100644 --- a/packages/kbn-doc-links/src/types.ts +++ b/packages/kbn-doc-links/src/types.ts @@ -388,6 +388,7 @@ export interface DocLinks { serviceNowSIRAction: string; setupPrerequisites: string; slackAction: string; + slackApiAction: string; teamsAction: string; connectors: string; }>; @@ -509,4 +510,7 @@ export interface DocLinks { readonly appSearch: string; readonly elasticsearch: string; }; + readonly synthetics: { + readonly featureRoles: string; + }; } diff --git a/packages/kbn-journeys/journey/journey.ts b/packages/kbn-journeys/journey/journey.ts index 7bc14e6bebe14..e6778dc0fc088 100644 --- a/packages/kbn-journeys/journey/journey.ts +++ b/packages/kbn-journeys/journey/journey.ts @@ -35,6 +35,7 @@ export interface BaseStepCtx { kibanaServer: KibanaServer; es: Es; retry: RetryService; + auth: Auth; } export type AnyStep = Step<{}>; diff --git a/packages/kbn-journeys/journey/journey_ftr_harness.ts b/packages/kbn-journeys/journey/journey_ftr_harness.ts index 12590f05c44d6..bf5af70f3d698 100644 --- a/packages/kbn-journeys/journey/journey_ftr_harness.ts +++ b/packages/kbn-journeys/journey/journey_ftr_harness.ts @@ -99,10 +99,11 @@ export class JourneyFtrHarness { private async setupBrowserAndPage() { const browser = await this.getBrowserInstance(); - this.context = await browser.newContext({ bypassCSP: true }); + const browserContextArgs = this.auth.isCloud() ? {} : { bypassCSP: true }; + this.context = await browser.newContext(browserContextArgs); if (this.journeyConfig.shouldAutoLogin()) { - const cookie = await this.auth.login({ username: 'elastic', password: 'changeme' }); + const cookie = await this.auth.login(); await this.context.addCookies([cookie]); } @@ -373,6 +374,7 @@ export class JourneyFtrHarness { kibanaServer: this.kibanaServer, es: this.es, retry: this.retry, + auth: this.auth, }); return this.#_ctx; diff --git a/packages/kbn-journeys/services/auth.ts b/packages/kbn-journeys/services/auth.ts index b8c68a9fbb09c..e0f89d184e462 100644 --- a/packages/kbn-journeys/services/auth.ts +++ b/packages/kbn-journeys/services/auth.ts @@ -29,7 +29,7 @@ export class Auth { private readonly kibanaServer: KibanaServer ) {} - public async login({ username, password }: Credentials) { + public async login(credentials?: Credentials) { const baseUrl = new URL( Url.format({ protocol: this.config.get('servers.kibana.protocol'), @@ -37,9 +37,10 @@ export class Auth { port: this.config.get('servers.kibana.port'), }) ); - const loginUrl = new URL('/internal/security/login', baseUrl); - const provider = baseUrl.hostname === 'localhost' ? 'basic' : 'cloud-basic'; + const provider = this.isCloud() ? 'cloud-basic' : 'basic'; + + const version = await this.kibanaServer.version.get(); this.log.info('fetching auth cookie from', loginUrl.href); const authResponse = await axios.request({ @@ -49,11 +50,11 @@ export class Auth { providerType: 'basic', providerName: provider, currentURL: new URL('/login?next=%2F', baseUrl).href, - params: { username, password }, + params: credentials ?? { username: this.getUsername(), password: this.getPassword() }, }, headers: { 'content-type': 'application/json', - 'kbn-version': await this.kibanaServer.version.get(), + 'kbn-version': version, 'sec-fetch-mode': 'cors', 'sec-fetch-site': 'same-origin', }, @@ -61,6 +62,12 @@ export class Auth { maxRedirects: 0, }); + if (authResponse.status !== 200) { + throw new Error( + `Kibana auth failed: code: ${authResponse.status}, message: ${authResponse.statusText}` + ); + } + const cookie = extractCookieValue(authResponse); if (cookie) { this.log.info('captured auth cookie'); @@ -82,4 +89,16 @@ export class Auth { url: baseUrl.href, }; } + + public getUsername() { + return this.config.get('servers.kibana.username'); + } + + public getPassword() { + return this.config.get('servers.kibana.password'); + } + + public isCloud() { + return this.config.get('servers.kibana.hostname') !== 'localhost'; + } } diff --git a/packages/kbn-optimizer/limits.yml b/packages/kbn-optimizer/limits.yml index 895920d372ed4..aa57c432af51b 100644 --- a/packages/kbn-optimizer/limits.yml +++ b/packages/kbn-optimizer/limits.yml @@ -117,7 +117,7 @@ pageLoadAssetSize: securitySolution: 66738 serverless: 16573 serverlessObservability: 16582 - serverlessSearch: 20555 + serverlessSearch: 22555 serverlessSecurity: 41807 sessionView: 77750 share: 71239 diff --git a/packages/kbn-securitysolution-grouping/src/components/group_selector/index.tsx b/packages/kbn-securitysolution-grouping/src/components/group_selector/index.tsx index a2a876da97992..3fa82f7f8af20 100644 --- a/packages/kbn-securitysolution-grouping/src/components/group_selector/index.tsx +++ b/packages/kbn-securitysolution-grouping/src/components/group_selector/index.tsx @@ -10,7 +10,7 @@ import type { EuiContextMenuPanelDescriptor, EuiContextMenuPanelItemDescriptor, } from '@elastic/eui'; -import { EuiBetaBadge, EuiFlexGroup, EuiFlexItem, EuiPopover } from '@elastic/eui'; +import { EuiPopover } from '@elastic/eui'; import React, { useCallback, useMemo, useState } from 'react'; import type { FieldSpec } from '@kbn/data-views-plugin/common'; import { CustomFieldPanel } from './custom_field_panel'; @@ -47,26 +47,7 @@ const GroupSelectorComponent = ({ () => [ { id: 'firstPanel', - title: ( - - - {i18n.SELECT_FIELD(maxGroupingLevels)} - - - - - - ), + title: i18n.SELECT_FIELD(maxGroupingLevels), items: [ { 'data-test-subj': 'panel-none', diff --git a/packages/kbn-securitysolution-grouping/src/components/translations.ts b/packages/kbn-securitysolution-grouping/src/components/translations.ts index 2209d61d1b34f..c2e0f13e325a5 100644 --- a/packages/kbn-securitysolution-grouping/src/components/translations.ts +++ b/packages/kbn-securitysolution-grouping/src/components/translations.ts @@ -18,15 +18,6 @@ export const TAKE_ACTION = i18n.translate('grouping.additionalActions.takeAction defaultMessage: 'Take actions', }); -export const BETA = i18n.translate('grouping.betaLabel', { - defaultMessage: 'Beta', -}); - -export const BETA_TOOL_TIP = i18n.translate('grouping.betaToolTip', { - defaultMessage: - 'Grouping may show only a subset of alerts while in beta. To see all alerts, use the list view by selecting "None"', -}); - export const GROUP_BY = i18n.translate('grouping.alerts.label', { defaultMessage: 'Group alerts by', }); diff --git a/packages/kbn-test/src/es/test_es_cluster.ts b/packages/kbn-test/src/es/test_es_cluster.ts index af7ccc69052e9..9b2a3b8010be2 100644 --- a/packages/kbn-test/src/es/test_es_cluster.ts +++ b/packages/kbn-test/src/es/test_es_cluster.ts @@ -56,7 +56,7 @@ export interface CreateTestEsClusterOptions { clusterName?: string; /** * Path to data archive snapshot to run Elasticsearch with. - * To prepare the the snapshot: + * To prepare the snapshot: * - run Elasticsearch server * - index necessary data * - stop Elasticsearch server diff --git a/packages/shared-ux/chrome/navigation/mocks/src/jest.ts b/packages/shared-ux/chrome/navigation/mocks/src/jest.ts index 1f8356195eadd..27c40f5b52efa 100644 --- a/packages/shared-ux/chrome/navigation/mocks/src/jest.ts +++ b/packages/shared-ux/chrome/navigation/mocks/src/jest.ts @@ -6,16 +6,19 @@ * Side Public License, v 1. */ +import { BehaviorSubject } from 'rxjs'; import { NavigationServices, ChromeNavigationNodeViewModel } from '../../types'; export const getServicesMock = (): NavigationServices => { const navigateToUrl = jest.fn().mockResolvedValue(undefined); const basePath = { prepend: jest.fn((path: string) => `/base${path}`) }; - const loadingCount = 0; + const loadingCount$ = new BehaviorSubject(0); + const recentlyAccessed$ = new BehaviorSubject([]); return { basePath, - loadingCount, + loadingCount$, + recentlyAccessed$, navIsOpen: true, navigateToUrl, }; diff --git a/packages/shared-ux/chrome/navigation/mocks/src/storybook.ts b/packages/shared-ux/chrome/navigation/mocks/src/storybook.ts index d269f5ca56ae5..889a374544429 100644 --- a/packages/shared-ux/chrome/navigation/mocks/src/storybook.ts +++ b/packages/shared-ux/chrome/navigation/mocks/src/storybook.ts @@ -8,12 +8,19 @@ import { AbstractStorybookMock } from '@kbn/shared-ux-storybook-mock'; import { action } from '@storybook/addon-actions'; +import { BehaviorSubject } from 'rxjs'; import { ChromeNavigationViewModel, NavigationServices } from '../../types'; type Arguments = ChromeNavigationViewModel & NavigationServices; export type Params = Pick< Arguments, - 'activeNavItemId' | 'loadingCount' | 'navIsOpen' | 'platformConfig' | 'navigationTree' + | 'activeNavItemId' + | 'loadingCount$' + | 'navIsOpen' + | 'navigationTree' + | 'platformConfig' + | 'recentlyAccessed$' + | 'recentlyAccessedFilter' >; export class StorybookMock extends AbstractStorybookMock< @@ -27,17 +34,11 @@ export class StorybookMock extends AbstractStorybookMock< control: 'boolean', defaultValue: true, }, - loadingCount: { - control: 'number', - defaultValue: 0, - }, }; dependencies = []; getServices(params: Params): NavigationServices { - const { navIsOpen } = params; - const navAction = action('Navigate to'); const navigateToUrl = (url: string) => { navAction(url); @@ -48,7 +49,8 @@ export class StorybookMock extends AbstractStorybookMock< ...params, basePath: { prepend: (suffix: string) => `/basepath${suffix}` }, navigateToUrl, - navIsOpen, + loadingCount$: params.loadingCount$ ?? new BehaviorSubject(0), + recentlyAccessed$: params.recentlyAccessed$ ?? new BehaviorSubject([]), }; } @@ -57,6 +59,7 @@ export class StorybookMock extends AbstractStorybookMock< ...params, homeHref: '#', linkToCloud: 'projects', + recentlyAccessedFilter: params.recentlyAccessedFilter, }; } } diff --git a/packages/shared-ux/chrome/navigation/src/model/create_side_nav.ts b/packages/shared-ux/chrome/navigation/src/model/create_side_nav.ts index eafc3862a51c9..a4c26a675989f 100644 --- a/packages/shared-ux/chrome/navigation/src/model/create_side_nav.ts +++ b/packages/shared-ux/chrome/navigation/src/model/create_side_nav.ts @@ -12,8 +12,8 @@ import type { ChromeNavigationNodeViewModel, PlatformSectionConfig } from '../.. * Navigation node parser. It filers out the nodes disabled through config and * sets the `path` of each of the nodes. * - * @param items Navigation nodes - * @param platformConfig Configuration with flags to disable nodes in the navigation tree + * @param navItems Navigation nodes + * @param platformSectionConfig Configuration with flags to disable nodes in the navigation tree * * @returns The navigation tree filtered */ diff --git a/packages/shared-ux/chrome/navigation/src/model/index.ts b/packages/shared-ux/chrome/navigation/src/model/index.ts index 8e8d94e995019..db3e5a29951ac 100644 --- a/packages/shared-ux/chrome/navigation/src/model/index.ts +++ b/packages/shared-ux/chrome/navigation/src/model/index.ts @@ -21,7 +21,6 @@ export interface NavigationModelDeps { * @public */ export enum Platform { - Recents = 'recents', Analytics = 'analytics', MachineLearning = 'ml', DevTools = 'devTools', diff --git a/packages/shared-ux/chrome/navigation/src/services.tsx b/packages/shared-ux/chrome/navigation/src/services.tsx index 8235963c18681..0b6202591bb53 100644 --- a/packages/shared-ux/chrome/navigation/src/services.tsx +++ b/packages/shared-ux/chrome/navigation/src/services.tsx @@ -7,7 +7,6 @@ */ import React, { FC, useContext } from 'react'; -import useObservable from 'react-use/lib/useObservable'; import { NavigationKibanaDependencies, NavigationServices } from '../types'; const Context = React.createContext(null); @@ -27,15 +26,14 @@ export const NavigationKibanaProvider: FC = ({ ...dependencies }) => { const { core } = dependencies; - const { http } = core; + const { chrome, http } = core; const { basePath } = http; const { navigateToUrl } = core.application; - const loadingCount = useObservable(http.getLoadingCount$(), 0); - const value: NavigationServices = { basePath, - loadingCount, + loadingCount$: http.getLoadingCount$(), + recentlyAccessed$: chrome.recentlyAccessed.get$(), navigateToUrl, navIsOpen: true, }; diff --git a/packages/shared-ux/chrome/navigation/src/ui/i18n_strings.ts b/packages/shared-ux/chrome/navigation/src/ui/i18n_strings.ts index 9f6f3fbadca30..c268e7a42de10 100644 --- a/packages/shared-ux/chrome/navigation/src/ui/i18n_strings.ts +++ b/packages/shared-ux/chrome/navigation/src/ui/i18n_strings.ts @@ -27,4 +27,10 @@ export const getI18nStrings = () => ({ defaultMessage: 'My deployments', } ), + recentlyAccessed: i18n.translate( + 'sharedUXPackages.chrome.sideNavigation.recentlyAccessed.title', + { + defaultMessage: 'Recent', + } + ), }); diff --git a/packages/shared-ux/chrome/navigation/src/ui/navigation.stories.tsx b/packages/shared-ux/chrome/navigation/src/ui/navigation.stories.tsx index 9652d83597119..b666f4d409869 100644 --- a/packages/shared-ux/chrome/navigation/src/ui/navigation.stories.tsx +++ b/packages/shared-ux/chrome/navigation/src/ui/navigation.stories.tsx @@ -13,9 +13,10 @@ import { EuiPopover, EuiThemeProvider, } from '@elastic/eui'; +import { css } from '@emotion/react'; import { ComponentMeta, ComponentStory } from '@storybook/react'; import React, { useCallback, useState } from 'react'; -import { css } from '@emotion/react'; +import { BehaviorSubject } from 'rxjs'; import { getSolutionPropertiesMock, NavigationStorybookMock } from '../../mocks'; import mdx from '../../README.mdx'; import { ChromeNavigationViewModel, NavigationServices } from '../../types'; @@ -132,11 +133,25 @@ ReducedPlatformLinks.argTypes = storybookMock.getArgumentTypes(); export const WithRequestsLoading: ComponentStory = Template.bind({}); WithRequestsLoading.args = { activeNavItemId: 'example_project.root.get_started', - loadingCount: 1, + loadingCount$: new BehaviorSubject(1), navigationTree: [getSolutionPropertiesMock()], }; WithRequestsLoading.argTypes = storybookMock.getArgumentTypes(); +export const WithRecentlyAccessed: ComponentStory = Template.bind({}); +WithRecentlyAccessed.args = { + activeNavItemId: 'example_project.root.get_started', + loadingCount$: new BehaviorSubject(0), + recentlyAccessed$: new BehaviorSubject([ + { label: 'This is an example', link: '/app/example/39859', id: '39850' }, + { label: 'This is not an example', link: '/app/non-example/39458', id: '39458' }, // NOTE: this will be filtered out + ]), + recentlyAccessedFilter: (items) => + items.filter((item) => item.link.indexOf('/app/example') === 0), + navigationTree: [getSolutionPropertiesMock()], +}; +WithRecentlyAccessed.argTypes = storybookMock.getArgumentTypes(); + export const CustomElements: ComponentStory = Template.bind({}); CustomElements.args = { activeNavItemId: 'example_project.custom', diff --git a/packages/shared-ux/chrome/navigation/src/ui/navigation.test.tsx b/packages/shared-ux/chrome/navigation/src/ui/navigation.test.tsx index 653b66887054b..4a39a4e651d7a 100644 --- a/packages/shared-ux/chrome/navigation/src/ui/navigation.test.tsx +++ b/packages/shared-ux/chrome/navigation/src/ui/navigation.test.tsx @@ -8,8 +8,9 @@ import { render } from '@testing-library/react'; import React from 'react'; +import { BehaviorSubject } from 'rxjs'; import { getServicesMock } from '../../mocks/src/jest'; -import { PlatformConfigSet, ChromeNavigationNodeViewModel } from '../../types'; +import { ChromeNavigationNodeViewModel, PlatformConfigSet } from '../../types'; import { Platform } from '../model'; import { NavigationProvider } from '../services'; import { Navigation } from './navigation'; @@ -27,7 +28,7 @@ describe('', () => { }); test('renders the header logo and top-level navigation buckets', async () => { - const { findByTestId, findByText } = render( + const { findByTestId, findByText, queryByTestId } = render( ', () => { expect(await findByTestId('nav-bucket-ml')).toBeVisible(); expect(await findByTestId('nav-bucket-devTools')).toBeVisible(); expect(await findByTestId('nav-bucket-management')).toBeVisible(); + + expect(queryByTestId('nav-bucket-recentlyAccessed')).not.toBeInTheDocument(); }); test('includes link to deployments', async () => { @@ -122,7 +125,7 @@ describe('', () => { }); test('shows loading state', async () => { - services.loadingCount = 5; + services.loadingCount$ = new BehaviorSubject(5); const { findByTestId } = render( @@ -136,4 +139,43 @@ describe('', () => { expect(await findByTestId('nav-header-loading-spinner')).toBeVisible(); }); + + describe('recent items', () => { + const recentlyAccessed = [ + { id: 'dashboard:234', label: 'Recently Accessed Test Item', link: '/app/dashboard/234' }, + ]; + + test('shows recent items', async () => { + services.recentlyAccessed$ = new BehaviorSubject(recentlyAccessed); + + const { findByTestId } = render( + + + + ); + + expect(await findByTestId('nav-bucket-recentlyAccessed')).toBeVisible(); + }); + + test('shows no recent items container when items are filtered', async () => { + services.recentlyAccessed$ = new BehaviorSubject(recentlyAccessed); + + const { queryByTestId } = render( + + []} + /> + + ); + + expect(queryByTestId('nav-bucket-recentlyAccessed')).not.toBeInTheDocument(); + }); + }); }); diff --git a/packages/shared-ux/chrome/navigation/src/ui/navigation.tsx b/packages/shared-ux/chrome/navigation/src/ui/navigation.tsx index ed58e9f57c4e5..776fe07297e64 100644 --- a/packages/shared-ux/chrome/navigation/src/ui/navigation.tsx +++ b/packages/shared-ux/chrome/navigation/src/ui/navigation.tsx @@ -13,16 +13,20 @@ import { EuiHeaderLogo, EuiLink, EuiLoadingSpinner, + EuiSideNav, + EuiSideNavItemType, EuiSpacer, useEuiTheme, } from '@elastic/eui'; import React from 'react'; -import { getI18nStrings } from './i18n_strings'; +import useObservable from 'react-use/lib/useObservable'; import type { ChromeNavigationViewModel } from '../../types'; import { NavigationModel } from '../model'; import { useNavigation } from '../services'; +import { navigationStyles as styles } from '../styles'; import { ElasticMark } from './elastic_mark'; import './header_logo.scss'; +import { getI18nStrings } from './i18n_strings'; import { NavigationBucket, type Props as NavigationBucketProps } from './navigation_bucket'; interface Props extends ChromeNavigationViewModel { @@ -38,8 +42,9 @@ export const Navigation = ({ homeHref, linkToCloud, activeNavItemId: activeNavItemIdProps, + ...props }: Props) => { - const { loadingCount, activeNavItemId, basePath, navIsOpen, navigateToUrl } = useNavigation(); + const { activeNavItemId } = useNavigation(); const { euiTheme } = useEuiTheme(); const activeNav = activeNavItemId ?? activeNavItemIdProps; @@ -52,6 +57,8 @@ export const Navigation = ({ const strings = getI18nStrings(); const NavHeader = () => { + const { basePath, navIsOpen, navigateToUrl, loadingCount$ } = useNavigation(); + const loadingCount = useObservable(loadingCount$, 0); const homeUrl = basePath.prepend(homeHref); const navigateHome = (event: React.MouseEvent) => { event.preventDefault(); @@ -111,6 +118,45 @@ export const Navigation = ({ } }; + const RecentlyAccessed = () => { + const { recentlyAccessed$ } = useNavigation(); + const recentlyAccessed = useObservable(recentlyAccessed$, []); + + // consumer may filter objects from recent that are not applicable to the project + let filteredRecent = recentlyAccessed; + if (props.recentlyAccessedFilter) { + filteredRecent = props.recentlyAccessedFilter(recentlyAccessed); + } + + if (filteredRecent.length > 0) { + const navItems: Array> = [ + { + name: '', // no list header title + id: 'recents_root', + items: filteredRecent.map(({ id, label, link }) => ({ + id, + name: label, + href: link, + })), + }, + ]; + + return ( + + + + ); + } + + return null; + }; + // higher-order-component to keep the common props DRY const NavigationBucketHoc = (outerProps: Omit) => ( @@ -125,6 +171,8 @@ export const Navigation = ({ + + {solutions.map((navTree, idx) => { return ; })} diff --git a/packages/shared-ux/chrome/navigation/types/index.ts b/packages/shared-ux/chrome/navigation/types/index.ts index f58c9dc6836d1..a4ba5c42c39b8 100644 --- a/packages/shared-ux/chrome/navigation/types/index.ts +++ b/packages/shared-ux/chrome/navigation/types/index.ts @@ -17,7 +17,8 @@ import type { BasePathService, NavigateToUrlFn, RecentItem } from './internal'; export interface NavigationServices { activeNavItemId?: string; basePath: BasePathService; - loadingCount: number; + loadingCount$: Observable; + recentlyAccessed$: Observable; navIsOpen: boolean; navigateToUrl: NavigateToUrlFn; } @@ -111,6 +112,10 @@ export interface ChromeNavigation { * above. */ platformConfig?: Partial; + /** + * Filter function to allow consumer to remove items from the recently accessed section + */ + recentlyAccessedFilter?: (items: RecentItem[]) => RecentItem[]; } /** @@ -119,7 +124,7 @@ export interface ChromeNavigation { * @internal */ export interface ChromeNavigationViewModel - extends Pick { + extends Pick { /** * Target for the logo icon */ diff --git a/scripts/archive_migration_functions.sh b/scripts/archive_migration_functions.sh index 36c7f61abdba1..ae51d0cb41b31 100755 --- a/scripts/archive_migration_functions.sh +++ b/scripts/archive_migration_functions.sh @@ -19,12 +19,11 @@ standard_list="url,index-pattern,query,graph-workspace,tag,visualization,canvas-element,canvas-workpad,dashboard,search,lens,map,cases,uptime-dynamic-settings,osquery-saved-query,osquery-pack,infrastructure-ui-source,metrics-explorer-view,inventory-view,infrastructure-monitoring-log-view,apm-indices" -orig_archive="x-pack/test/functional/es_archives/security_solution/timelines/7.15.0_space" -new_archive="x-pack/test/functional/fixtures/kbn_archiver/security_solution/timelines/7.15.0_space" +orig_archive="test/functional/fixtures/es_archiver/saved_objects_management/hidden_saved_objects" +new_archive="x-pack/test/functional/fixtures/kbn_archiver/saved_objects_management/hidden_saved_objects" +testFiles=("test/plugin_functional/test_suites/saved_objects_management/scroll_count.ts") -testFiles=("x-pack/test/api_integration/apis/security_solution/timeline_migrations.ts") - -test_config="x-pack/test/api_integration/config.ts" +test_config="test/plugin_functional/config.ts" list_stragglers() { @@ -387,13 +386,27 @@ load_kbn() { local space=${1:-default} local archive=${2:-${new_archive}} + set -x + node scripts/kbn_archiver.js --config "$test_config" load "$archive" --space "$space" + set +x +} + +load_kbn_list() { + local space=${1:-default} + local archive=${2:-${new_archive}} + local newArchives=("${:-${archive}}") + for x in "${newArchives[@]}"; do - set -x - node scripts/kbn_archiver.js --config "$test_config" load "$x" --space "$space" - set +x + load_kbn default "${x}" done } +print_so_types() { + set -x + node scripts/saved_objs_info.js --esUrl http://elastic:changeme@localhost:9220 + set +x +} + load_created_kbn_archive() { set -x node scripts/kbn_archiver.js --config "$test_config" load "$new_archive" diff --git a/src/core/server/integration_tests/elasticsearch/client.test.ts b/src/core/server/integration_tests/elasticsearch/client.test.ts index 7497ee3059163..ad5fd62d402c5 100644 --- a/src/core/server/integration_tests/elasticsearch/client.test.ts +++ b/src/core/server/integration_tests/elasticsearch/client.test.ts @@ -68,7 +68,6 @@ function createFakeElasticsearchServer() { return server; } -// FLAKY: https://github.com/elastic/kibana/issues/129754 describe('fake elasticsearch', () => { let esServer: http.Server; let kibanaServer: Root; diff --git a/src/core/server/integration_tests/elasticsearch/version_compatibility.test.ts b/src/core/server/integration_tests/elasticsearch/version_compatibility.test.ts new file mode 100644 index 0000000000000..4b1a384671b3a --- /dev/null +++ b/src/core/server/integration_tests/elasticsearch/version_compatibility.test.ts @@ -0,0 +1,135 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { + createTestServers, + type TestElasticsearchUtils, + type TestKibanaUtils, +} from '@kbn/core-test-helpers-kbn-server'; +import { esTestConfig } from '@kbn/test'; +import { firstValueFrom, Subject } from 'rxjs'; +import { CliArgs } from '@kbn/config'; +import Semver from 'semver'; + +function nextMinor() { + return Semver.inc(esTestConfig.getVersion(), 'minor') || '10.0.0'; +} + +function previousMinor() { + const [major, minor] = esTestConfig + .getVersion() + .split('.') + .map((s) => parseInt(s, 10)); + // We should be fine for now. When we jump to the next major, we'll need to handle that. + return `${major}.${minor - 1}.0`; +} + +describe('Version Compatibility', () => { + let esServer: TestElasticsearchUtils | undefined; + let kibanaServer: TestKibanaUtils | undefined; + let abortController: AbortController | undefined; + let consoleSpy: jest.SpyInstance; + + beforeEach(() => { + consoleSpy = jest.spyOn(console, 'log'); + }); + + afterEach(async () => { + consoleSpy.mockRestore(); + if (kibanaServer) { + await kibanaServer.stop(); + } else { + abortController?.abort(); + } + if (esServer) { + await esServer.stop(); + } + kibanaServer = undefined; + abortController = undefined; + esServer = undefined; + }); + + const startServers = async ({ + cliArgs, + customKibanaVersion, + ignoreVersionMismatch, + }: { + cliArgs?: Partial; + customKibanaVersion?: string; + ignoreVersionMismatch?: boolean; + } = {}) => { + const { startES, startKibana } = createTestServers({ + adjustTimeout: jest.setTimeout, + settings: { + kbn: { + cliArgs, + customKibanaVersion, + elasticsearch: { + ignoreVersionMismatch, + }, + }, + }, + }); + + esServer = await startES(); + abortController = new AbortController(); + kibanaServer = await startKibana(abortController.signal); + }; + + it('should start when versions match', async () => { + await expect(startServers({})).resolves.toBeUndefined(); + }); + + it('should start when ES is next minor', async () => { + await expect(startServers({ customKibanaVersion: previousMinor() })).resolves.toBeUndefined(); + }); + + it('should flag the incompatibility on version mismatch (ES is previous minor)', async () => { + const found$ = new Subject(); + consoleSpy.mockImplementation((str) => { + if (str.includes('is incompatible')) { + found$.next(); + } + }); + await Promise.race([ + firstValueFrom(found$), + startServers({ customKibanaVersion: nextMinor() }).then(() => { + throw new Error( + 'Kibana completed the bootstrap without finding the incompatibility message' + ); + }), + new Promise((resolve, reject) => + setTimeout(() => reject(new Error('Test timedout')), 5 * 60 * 1000) + ), + ]).finally(() => found$.complete()); + }); + + it('should ignore the version mismatch when option is set', async () => { + await expect( + startServers({ + customKibanaVersion: nextMinor(), + cliArgs: { dev: true }, + ignoreVersionMismatch: true, + }) + ).resolves.toBeUndefined(); + }); + + it('should not allow the option when not in dev mode', async () => { + await expect( + startServers({ customKibanaVersion: nextMinor(), ignoreVersionMismatch: true }) + ).rejects.toThrowErrorMatchingInlineSnapshot( + `"[config validation of [elasticsearch].ignoreVersionMismatch]: \\"ignoreVersionMismatch\\" can only be set to true in development mode"` + ); + }); + + it('should ignore version mismatch when running on serverless mode and complete startup', async () => { + await expect( + startServers({ customKibanaVersion: nextMinor(), cliArgs: { serverless: true } }) + ).resolves.toBeUndefined(); + }); +}); diff --git a/src/core/server/integration_tests/saved_objects/migrations/group3/actions/actions.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group3/actions/actions.test.ts index d25ea511afd52..228f1beeea1bb 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group3/actions/actions.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group3/actions/actions.test.ts @@ -706,9 +706,7 @@ describe('migration actions', () => { // Reindex doesn't return any errors on it's own, so we have to test // together with waitForReindexTask - // - // FAILING ES PROMOTION: https://github.com/elastic/kibana/issues/156903 - describe.skip('reindex & waitForReindexTask', () => { + describe('reindex & waitForReindexTask', () => { it('resolves right when reindex succeeds without reindex script', async () => { const res = (await reindex({ client, @@ -1098,9 +1096,7 @@ describe('migration actions', () => { _tag: 'Left', left: { error: expect.any(errors.ResponseError), - message: expect.stringContaining( - '[timeout_exception] Timed out waiting for completion of task' - ), + message: expect.stringContaining('[timeout_exception]'), type: 'wait_for_task_completion_timeout', }, }); @@ -1348,8 +1344,7 @@ describe('migration actions', () => { }); }); - // FAILED ES PROMOTION: https://github.com/elastic/kibana/issues/156904 - describe.skip('waitForPickupUpdatedMappingsTask', () => { + describe('waitForPickupUpdatedMappingsTask', () => { it('rejects if there are failures', async () => { const res = (await pickupUpdatedMappings( client, @@ -1400,9 +1395,7 @@ describe('migration actions', () => { _tag: 'Left', left: { error: expect.any(errors.ResponseError), - message: expect.stringContaining( - '[timeout_exception] Timed out waiting for completion of task' - ), + message: expect.stringContaining('[timeout_exception]'), type: 'wait_for_task_completion_timeout', }, }); diff --git a/src/dev/build/tasks/install_chromium.js b/src/dev/build/tasks/install_chromium.ts similarity index 89% rename from src/dev/build/tasks/install_chromium.js rename to src/dev/build/tasks/install_chromium.ts index 23e7ba6b5998c..968f9f5b474a3 100644 --- a/src/dev/build/tasks/install_chromium.js +++ b/src/dev/build/tasks/install_chromium.ts @@ -6,9 +6,11 @@ * Side Public License, v 1. */ +import type { Logger } from '@kbn/core/server'; import { install, paths } from '@kbn/screenshotting-plugin/server/utils'; +import type { Task } from '../lib'; -export const InstallChromium = { +export const InstallChromium: Task = { description: 'Installing Chromium', async run(config, log, build) { @@ -43,7 +45,7 @@ export const InstallChromium = { platform, 'node_modules/@kbn/screenshotting-plugin/chromium' ); - await install(logger, pkg, path); + await install(logger as unknown as Logger, pkg, path); } }, }; diff --git a/src/dev/chromium_version.ts b/src/dev/chromium_version/index.ts similarity index 57% rename from src/dev/chromium_version.ts rename to src/dev/chromium_version/index.ts index 22e5bfdc2b94b..a02f600daad76 100644 --- a/src/dev/chromium_version.ts +++ b/src/dev/chromium_version/index.ts @@ -7,30 +7,31 @@ */ import { run } from '@kbn/dev-cli-runner'; -import { ToolingLog } from '@kbn/tooling-log'; import { REPO_ROOT } from '@kbn/repo-info'; +import { ToolingLog } from '@kbn/tooling-log'; import chalk from 'chalk'; -import cheerio from 'cheerio'; import fs from 'fs'; import fetch from 'node-fetch'; import path from 'path'; - -type PuppeteerRelease = string; -type ChromiumRevision = string; -type ChromiumCommit = string; - -// We forked the Puppeteer node module for Kibana, -// So we need to translate OUR version to the official Puppeteer Release -const forkCompatibilityMap: Record = { - '5.4.1-patch.1': '5.4.1', -}; +import { + type ChromeVersion, + type ChromiumCommit, + type ChromiumDashVersionType, + ChromiumDashVersionSchema, + forkCompatibilityMap, + PuppeteerPackageSchema, + type PuppeteerPackageType, + type PuppeteerRelease, +} from './util'; async function getPuppeteerRelease(log: ToolingLog): Promise { // open node_modules/puppeteer/package.json - const puppeteerPackageJson = JSON.parse( + const { version }: PuppeteerPackageType = JSON.parse( fs.readFileSync(path.resolve(REPO_ROOT, 'node_modules', 'puppeteer', 'package.json'), 'utf8') ); - const { version } = puppeteerPackageJson; + + PuppeteerPackageSchema.validate({ version }); + if (version == null) { throw new Error( 'Could not get the Puppeteer version! Check node_modules/puppteer/package.json' @@ -42,10 +43,10 @@ async function getPuppeteerRelease(log: ToolingLog): Promise { return puppeteerRelease; } -async function getChromiumRevision( +async function getChromeVersion( kibanaPuppeteerVersion: PuppeteerRelease, log: ToolingLog -): Promise { +): Promise { const url = `https://raw.githubusercontent.com/puppeteer/puppeteer/puppeteer-v${kibanaPuppeteerVersion}/packages/puppeteer-core/src/revisions.ts`; let body: string; try { @@ -57,58 +58,51 @@ async function getChromiumRevision( throw new Error(`Could not fetch ${url}. Check the URL in a browser and try again.`); } - let revision: ChromiumRevision | undefined; + let version: ChromeVersion | undefined; const lines = body.split('\n'); let cursor = lines.length; while (--cursor >= 0) { - // look for the line of code matching ` chromium: '0123456',` - const test = lines[cursor].match(/^\s+chromium: '(\S+)',$/); + // look for the line of code matching ` chrome: '113.0.5672.63',` + const test = lines[cursor].match(/^\s+chrome: '(\S+)',$/); if (test != null) { - log.debug(`Parsed revision from source text: \`${lines[cursor]}\``); - [, revision] = test; + log.debug(`Parsed Chrome version from source text: \`${lines[cursor]}\``); + [, version] = test; break; } } - if (revision == null) { + if (version == null) { throw new Error( - `Could not find a Chromium revision listed in Puppeteer source! Check ${url} in a browser` + `Could not find a Chrome version listed in Puppeteer source! Check ${url} in a browser` ); } - log.info(`Found Chromium revision ${revision} from Puppeteer ${kibanaPuppeteerVersion}`); - return revision; + log.info(`Found Chrome version ${version} from Puppeteer ${kibanaPuppeteerVersion}`); + return version; } -async function getChromiumCommit( - revision: ChromiumRevision, - log: ToolingLog -): Promise { - const url = `https://crrev.com/${revision}`; +async function getChromiumCommit(version: ChromeVersion, log: ToolingLog): Promise { + const url = `https://chromiumdash.appspot.com/fetch_version?version=${version}`; log.info(`Fetching ${url}`); - const pageText = await fetch(url); - const $ = cheerio.load(await pageText.text()); - - // get the commit from the page title - let commit: ChromiumCommit | null = null; - const matches = $('title') - .text() - .match(/\S{40}/); - if (matches != null) { - log.debug(`Parsed commit hash from page title: \`${$('title').text()}\``); - [commit] = matches; - } + const fetchResponse = await fetch(url); + const chromeJson: ChromiumDashVersionType = await fetchResponse.json(); + + const { + chromium_main_branch_position: revision, + hashes: { chromium: commit }, + } = chromeJson; + + ChromiumDashVersionSchema.validate({ + chromium_main_branch_position: revision, + hashes: { chromium: commit }, + }); if (commit == null) { throw new Error(`Could not find a Chromium commit! Check ${url} in a browser.`); } - const baseUrl = 'https://commondatastorage.googleapis.com/chromium-browser-snapshots'; - - log.info(`Found Chromium commit ${commit} from revision ${revision}.`); - log.info(`Mac x64 download: ${baseUrl}/Mac/${revision}/chrome-mac.zip`); - log.info(`Mac ARM download: ${baseUrl}/Mac_Arm/${revision}/chrome-mac.zip`); - log.info(`Windows x64 download: ${baseUrl}/Win/${revision}/chrome-win.zip`); + log.info(`Found Chromium revision ${revision} from version ${version}.`); + log.info(`Found Chromium commit ${commit} from revision ${revision}.`); return commit; } @@ -127,8 +121,8 @@ run( puppeteerVersion = await getPuppeteerRelease(log); } - const chromiumRevision = await getChromiumRevision(puppeteerVersion, log); - await getChromiumCommit(chromiumRevision, log); + const chromeVersion = await getChromeVersion(puppeteerVersion, log); + await getChromiumCommit(chromeVersion, log); } catch (err) { log.error(err); } diff --git a/src/dev/chromium_version/util.ts b/src/dev/chromium_version/util.ts new file mode 100644 index 0000000000000..83cf5abff2465 --- /dev/null +++ b/src/dev/chromium_version/util.ts @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { schema, TypeOf } from '@kbn/config-schema'; + +export type PuppeteerRelease = string; +export type ChromeVersion = string; +export type ChromiumCommit = string; + +export type PuppeteerPackageType = TypeOf; +export type ChromiumDashVersionType = TypeOf; + +export const PuppeteerPackageSchema = schema.object({ + version: schema.string(), +}); + +export const ChromiumDashVersionSchema = schema.object({ + chromium_main_branch_position: schema.number(), + hashes: schema.object({ + chromium: schema.string({ minLength: 40, maxLength: 40 }), + }), +}); + +// We forked the Puppeteer node module for Kibana, +// So we need to translate OUR version to the official Puppeteer Release +export const forkCompatibilityMap: Record = { + '5.4.1-patch.1': '5.4.1', +}; diff --git a/src/dev/tsconfig.json b/src/dev/tsconfig.json index b4fb983d63e52..73d4dfab3b73b 100644 --- a/src/dev/tsconfig.json +++ b/src/dev/tsconfig.json @@ -39,5 +39,6 @@ "@kbn/get-repo-files", "@kbn/import-locator", "@kbn/journeys", + "@kbn/config-schema", ] } diff --git a/src/plugins/data_views/common/data_views/data_views.ts b/src/plugins/data_views/common/data_views/data_views.ts index 864c4ec2df3b3..df1a115b83923 100644 --- a/src/plugins/data_views/common/data_views/data_views.ts +++ b/src/plugins/data_views/common/data_views/data_views.ts @@ -1011,6 +1011,7 @@ export class DataViewsService { body, { id: dataView.id, + initialNamespaces: dataView.namespaces.length > 0 ? dataView.namespaces : undefined, } )) as SavedObject; diff --git a/src/plugins/data_views/common/types.ts b/src/plugins/data_views/common/types.ts index 4e2d308692afe..d44f8fd34df47 100644 --- a/src/plugins/data_views/common/types.ts +++ b/src/plugins/data_views/common/types.ts @@ -296,7 +296,7 @@ export interface SavedObjectsClientCommon { create: ( type: string, attributes: DataViewAttributes, - options: SavedObjectsCreateOptions + options: SavedObjectsCreateOptions & { initialNamespaces?: string[] } ) => Promise; /** * Delete a saved object by id diff --git a/src/plugins/data_views/server/rest_api_routes/create_data_view.ts b/src/plugins/data_views/server/rest_api_routes/create_data_view.ts index 00897c364e085..58bc36ed1c869 100644 --- a/src/plugins/data_views/server/rest_api_routes/create_data_view.ts +++ b/src/plugins/data_views/server/rest_api_routes/create_data_view.ts @@ -70,6 +70,7 @@ const dataViewSpecSchema = schema.object({ allowNoIndex: schema.maybe(schema.boolean()), runtimeFieldMap: schema.maybe(schema.recordOf(schema.string(), runtimeFieldSchema)), name: schema.maybe(schema.string()), + namespaces: schema.maybe(schema.arrayOf(schema.string())), }); const registerCreateDataViewRouteFactory = @@ -124,7 +125,10 @@ const registerCreateDataViewRouteFactory = 'content-type': 'application/json', }, body: { - [serviceKey]: dataView.toSpec(), + [serviceKey]: { + ...dataView.toSpec(), + namespaces: dataView.namespaces, + }, }, }); }) diff --git a/src/plugins/discover/common/locator.ts b/src/plugins/discover/common/locator.ts index 77e501dbe40df..48dba685d5fca 100644 --- a/src/plugins/discover/common/locator.ts +++ b/src/plugins/discover/common/locator.ts @@ -99,6 +99,10 @@ export interface DiscoverAppLocatorParams extends SerializableRecord { * Used when navigating to particular alert results */ isAlertResults?: boolean; + /** + * The Discover profile to use + */ + profile?: string; } export type DiscoverAppLocator = LocatorPublic; @@ -141,6 +145,7 @@ export class DiscoverAppLocatorDefinition implements LocatorDefinition('_g', queryState, { useHash }, path); - path = this.deps.setStateToKbnUrl('_a', appState, { useHash }, path); + let path = '#/'; + + if (profile) { + path = `${path}p/${profile}/`; + } + + path = `${path}${savedSearchPath}`; + + if (Object.keys(queryState).length) { + path = this.deps.setStateToKbnUrl( + '_g', + queryState, + { useHash }, + path + ); + } + + if (Object.keys(appState).length) { + path = this.deps.setStateToKbnUrl('_a', appState, { useHash }, path); + } if (searchSessionId) { path = `${path}&searchSessionId=${searchSessionId}`; diff --git a/src/plugins/discover/public/__mocks__/data_view_complex.ts b/src/plugins/discover/public/__mocks__/data_view_complex.ts index a90e858b00a3e..6953c044391ae 100644 --- a/src/plugins/discover/public/__mocks__/data_view_complex.ts +++ b/src/plugins/discover/public/__mocks__/data_view_complex.ts @@ -417,3 +417,12 @@ export const dataViewComplexMock = buildDataViewMock({ fields, timeFieldName: 'data', }); + +export const dataViewAdHoc = { + ...buildDataViewMock({ + name: 'data-view-ad-hoc', + fields, + timeFieldName: 'time', + }), + isPersisted: () => false, +} as DataView; diff --git a/src/plugins/discover/public/__mocks__/data_views.ts b/src/plugins/discover/public/__mocks__/data_views.ts index 7b599318917a0..a9e5a880e9196 100644 --- a/src/plugins/discover/public/__mocks__/data_views.ts +++ b/src/plugins/discover/public/__mocks__/data_views.ts @@ -11,27 +11,34 @@ import { dataViewMock } from './data_view'; import { dataViewComplexMock } from './data_view_complex'; import { dataViewWithTimefieldMock } from './data_view_with_timefield'; +export const dataViewMockList = [dataViewMock, dataViewComplexMock, dataViewWithTimefieldMock]; + export function createDiscoverDataViewsMock() { return { getCache: async () => { return [dataViewMock]; }, get: async (id: string) => { - if (id === 'the-data-view-id') { - return Promise.resolve(dataViewMock); - } else if (id === 'invalid-data-view-id') { - return Promise.reject('Invald'); + if (id === 'invalid-data-view-id') { + return Promise.reject('Invalid'); + } + const dataView = dataViewMockList.find((dv) => dv.id === id); + if (dataView) { + return Promise.resolve(dataView); + } else { + return Promise.reject(`DataView ${id} not found`); } }, getDefaultDataView: jest.fn(() => dataViewMock), updateSavedObject: jest.fn(), getIdsWithTitle: jest.fn(() => { - return Promise.resolve([dataViewMock, dataViewComplexMock, dataViewWithTimefieldMock]); + return Promise.resolve(dataViewMockList); }), createFilter: jest.fn(), create: jest.fn(), clearInstanceCache: jest.fn(), getFieldsForIndexPattern: jest.fn((dataView) => dataView.fields), + refreshFields: jest.fn(), } as unknown as jest.Mocked; } diff --git a/src/plugins/discover/public/__mocks__/discover_state.mock.ts b/src/plugins/discover/public/__mocks__/discover_state.mock.ts index 7155dd33ac5c0..3e0a36de1d595 100644 --- a/src/plugins/discover/public/__mocks__/discover_state.mock.ts +++ b/src/plugins/discover/public/__mocks__/discover_state.mock.ts @@ -9,13 +9,24 @@ import { createBrowserHistory } from 'history'; import { getDiscoverStateContainer } from '../application/main/services/discover_state'; import { savedSearchMockWithTimeField, savedSearchMock } from './saved_search'; import { discoverServiceMock } from './services'; +import { SavedSearch } from '@kbn/saved-search-plugin/public'; -export function getDiscoverStateMock({ isTimeBased = true }) { +export function getDiscoverStateMock({ + isTimeBased = true, + savedSearch, +}: { + isTimeBased?: boolean; + savedSearch?: SavedSearch; +}) { const history = createBrowserHistory(); history.push('/'); - return getDiscoverStateContainer({ - savedSearch: isTimeBased ? savedSearchMockWithTimeField : savedSearchMock, + const container = getDiscoverStateContainer({ services: discoverServiceMock, history, }); + container.savedSearchState.set( + savedSearch ? savedSearch : isTimeBased ? savedSearchMockWithTimeField : savedSearchMock + ); + + return container; } diff --git a/src/plugins/discover/public/__mocks__/saved_search.ts b/src/plugins/discover/public/__mocks__/saved_search.ts index de97a31d65632..c18c320063240 100644 --- a/src/plugins/discover/public/__mocks__/saved_search.ts +++ b/src/plugins/discover/public/__mocks__/saved_search.ts @@ -10,9 +10,11 @@ import { SavedSearch } from '@kbn/saved-search-plugin/public'; import { createSearchSourceMock } from '@kbn/data-plugin/public/mocks'; import { dataViewMock } from './data_view'; import { dataViewWithTimefieldMock } from './data_view_with_timefield'; +import { dataViewAdHoc } from './data_view_complex'; export const savedSearchMock = { id: 'the-saved-search-id', + title: 'A saved search', searchSource: createSearchSourceMock({ index: dataViewMock }), } as unknown as SavedSearch; @@ -21,6 +23,10 @@ export const savedSearchMockWithTimeField = { searchSource: createSearchSourceMock({ index: dataViewWithTimefieldMock }), } as unknown as SavedSearch; +export const savedSearchMockWithTimeFieldNew = { + searchSource: createSearchSourceMock({ index: dataViewWithTimefieldMock }), +} as unknown as SavedSearch; + export const savedSearchMockWithSQL = { id: 'the-saved-search-id-sql', searchSource: createSearchSourceMock({ @@ -28,3 +34,8 @@ export const savedSearchMockWithSQL = { query: { sql: 'SELECT * FROM "the-saved-search-id-sql"' }, }), } as unknown as SavedSearch; + +export const savedSearchAdHoc = { + id: 'the-saved-search-with-ad-hoc', + searchSource: createSearchSourceMock({ index: dataViewAdHoc }), +} as unknown as SavedSearch; diff --git a/src/plugins/discover/public/__mocks__/services.ts b/src/plugins/discover/public/__mocks__/services.ts index b87c8aa32f910..3da63b5c553c7 100644 --- a/src/plugins/discover/public/__mocks__/services.ts +++ b/src/plugins/discover/public/__mocks__/services.ts @@ -20,14 +20,22 @@ import { SAMPLE_ROWS_PER_PAGE_SETTING, SORT_DEFAULT_ORDER_SETTING, HIDE_ANNOUNCEMENTS, + SEARCH_ON_PAGE_LOAD_SETTING, } from '../../common'; -import { UI_SETTINGS, calculateBounds } from '@kbn/data-plugin/public'; +import { + UI_SETTINGS, + calculateBounds, + SearchSource, + IKibanaSearchResponse, +} from '@kbn/data-plugin/public'; import { TopNavMenu } from '@kbn/navigation-plugin/public'; import { FORMATS_UI_SETTINGS } from '@kbn/field-formats-plugin/common'; import { chartPluginMock } from '@kbn/charts-plugin/public/mocks'; import { fieldFormatsMock } from '@kbn/field-formats-plugin/common/mocks'; import { LocalStorageMock } from './local_storage_mock'; import { createDiscoverDataViewsMock } from './data_views'; +import { SearchSourceDependencies } from '@kbn/data-plugin/common'; +import { SearchResponse } from '@elastic/elasticsearch/lib/api/types'; export function createDiscoverServicesMock(): DiscoverServices { const dataPlugin = dataPluginMock.createStartContract(); @@ -65,6 +73,23 @@ export function createDiscoverServicesMock(): DiscoverServices { }, }) ) as unknown as typeof expressionsPlugin.run; + dataPlugin.search.searchSource.createEmpty = jest.fn(() => { + const deps = { + getConfig: jest.fn(), + } as unknown as SearchSourceDependencies; + const searchSource = new SearchSource({}, deps); + searchSource.fetch$ = jest.fn().mockReturnValue(of({ rawResponse: { hits: { total: 2 } } })); + searchSource.createChild = jest.fn((options = {}) => { + const childSearchSource = new SearchSource({}, deps); + childSearchSource.setParent(searchSource, options); + childSearchSource.fetch$ = () => + of({ rawResponse: { hits: { hits: [] } } } as unknown as IKibanaSearchResponse< + SearchResponse + >); + return childSearchSource; + }); + return searchSource; + }); return { core: coreMock.createStart(), @@ -118,6 +143,8 @@ export function createDiscoverServicesMock(): DiscoverServices { return 50; } else if (key === HIDE_ANNOUNCEMENTS) { return false; + } else if (key === SEARCH_ON_PAGE_LOAD_SETTING) { + return true; } }), isDefault: (key: string) => { @@ -157,7 +184,12 @@ export function createDiscoverServicesMock(): DiscoverServices { addSuccess: jest.fn(), }, expressions: expressionsPlugin, - savedObjectsTagging: {}, + savedObjectsTagging: { + ui: { + getTagIdsFromReferences: jest.fn().mockResolvedValue([]), + updateTagsReferences: jest.fn(), + }, + }, dataViews: dataPlugin.dataViews, timefilter: dataPlugin.query.timefilter.timefilter, lens: { diff --git a/src/plugins/discover/public/application/context/context_app.tsx b/src/plugins/discover/public/application/context/context_app.tsx index 4686eadc50646..910663638b79a 100644 --- a/src/plugins/discover/public/application/context/context_app.tsx +++ b/src/plugins/discover/public/application/context/context_app.tsx @@ -69,14 +69,14 @@ export const ContextApp = ({ dataView, anchorId, referrer }: ContextAppProps) => useEffect(() => { services.chrome.setBreadcrumbs([ - ...getRootBreadcrumbs(referrer), + ...getRootBreadcrumbs({ breadcrumb: referrer, services }), { text: i18n.translate('discover.context.breadcrumb', { defaultMessage: 'Surrounding documents', }), }, ]); - }, [locator, referrer, services.chrome]); + }, [locator, referrer, services]); useExecutionContext(core.executionContext, { type: 'application', diff --git a/src/plugins/discover/public/application/context/services/locator.ts b/src/plugins/discover/public/application/context/services/locator.ts index 29bb01e1af58a..1e2b8b7a7b746 100644 --- a/src/plugins/discover/public/application/context/services/locator.ts +++ b/src/plugins/discover/public/application/context/services/locator.ts @@ -20,6 +20,7 @@ export interface DiscoverContextAppLocatorParams extends SerializableRecord { columns?: string[]; filters?: Filter[]; referrer: string; // discover main view url + profile?: string; } export type DiscoverContextAppLocator = LocatorPublic; @@ -62,9 +63,21 @@ export class DiscoverContextAppLocatorDefinition dataViewId = index; } - let path = `#/context/${dataViewId}/${rowId}`; - path = setStateToKbnUrl('_g', queryState, { useHash }, path); - path = setStateToKbnUrl('_a', appState, { useHash }, path); + let path = '#/'; + + if (params.profile) { + path = `${path}p/${params.profile}/`; + } + + path = `${path}context/${dataViewId}/${rowId}`; + + if (Object.keys(queryState).length) { + path = setStateToKbnUrl('_g', queryState, { useHash }, path); + } + + if (Object.keys(appState).length) { + path = setStateToKbnUrl('_a', appState, { useHash }, path); + } return { app: 'discover', diff --git a/src/plugins/discover/public/application/discover_router.test.tsx b/src/plugins/discover/public/application/discover_router.test.tsx index e9fd30b3e1aea..51416eb5c728c 100644 --- a/src/plugins/discover/public/application/discover_router.test.tsx +++ b/src/plugins/discover/public/application/discover_router.test.tsx @@ -11,7 +11,7 @@ import { RouteProps } from 'react-router-dom'; import { Route } from '@kbn/shared-ux-router'; import { createSearchSessionMock } from '../__mocks__/search_session'; import { discoverServiceMock as mockDiscoverServices } from '../__mocks__/services'; -import { discoverRouter } from './discover_router'; +import { DiscoverRouter } from './discover_router'; import { DiscoverMainRoute } from './main'; import { SingleDocRoute } from './doc'; import { ContextAppRoute } from './context'; @@ -24,7 +24,7 @@ describe('Discover router', () => { }; beforeAll(() => { const { history } = createSearchSessionMock(); - const component = shallow(discoverRouter(mockDiscoverServices, history, props.isDev)); + const component = shallow(DiscoverRouter(mockDiscoverServices, history, props.isDev)); component.find(Route).forEach((route) => { const routeProps = route.props() as RouteProps; const path = routeProps.path; diff --git a/src/plugins/discover/public/application/discover_router.tsx b/src/plugins/discover/public/application/discover_router.tsx index d2e03758e5c39..8fafbed030937 100644 --- a/src/plugins/discover/public/application/discover_router.tsx +++ b/src/plugins/discover/public/application/discover_router.tsx @@ -6,9 +6,9 @@ * Side Public License, v 1. */ -import { Redirect, Router, Switch } from 'react-router-dom'; +import { Redirect, Router, Switch, useParams } from 'react-router-dom'; import { Route } from '@kbn/shared-ux-router'; -import React from 'react'; +import React, { useCallback, useMemo } from 'react'; import { History } from 'history'; import { EuiErrorBoundary } from '@elastic/eui'; import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; @@ -18,36 +18,108 @@ import { DiscoverMainRoute } from './main'; import { NotFoundRoute } from './not_found'; import { DiscoverServices } from '../build_services'; import { ViewAlertRoute } from './view_alert'; +import type { CustomizationCallback } from '../customizations/types'; +import type { DiscoverProfileRegistry } from '../customizations/profile_registry'; -export const discoverRouter = (services: DiscoverServices, history: History, isDev: boolean) => ( - - - - - - - - ( - - )} +interface DiscoverRoutesProps { + prefix?: string; + customizationCallbacks: CustomizationCallback[]; + isDev: boolean; +} + +const DiscoverRoutes = ({ prefix, ...mainRouteProps }: DiscoverRoutesProps) => { + const prefixPath = useCallback( + (path: string) => (prefix ? `${prefix}/${path}` : `/${path}`), + [prefix] + ); + + return ( + + + + + ( + - - - - - - - - - - - - - - - - - -); + )} + /> + + + + + + + + + + + + + + + ); +}; + +interface CustomDiscoverRoutesProps { + profileRegistry: DiscoverProfileRegistry; + isDev: boolean; +} + +const CustomDiscoverRoutes = ({ profileRegistry, ...props }: CustomDiscoverRoutesProps) => { + const { profile } = useParams<{ profile: string }>(); + const customizationCallbacks = useMemo( + () => profileRegistry.get(profile)?.customizationCallbacks, + [profile, profileRegistry] + ); + + if (customizationCallbacks) { + return ( + + ); + } + + return ; +}; + +export interface DiscoverRouterProps { + services: DiscoverServices; + profileRegistry: DiscoverProfileRegistry; + history: History; + isDev: boolean; +} + +export const DiscoverRouter = ({ + services, + history, + profileRegistry, + ...routeProps +}: DiscoverRouterProps) => { + const customizationCallbacks = useMemo( + () => profileRegistry.get('default')?.customizationCallbacks ?? [], + [profileRegistry] + ); + + return ( + + + + + + + + + + + + + + + ); +}; diff --git a/src/plugins/discover/public/application/doc/components/doc.tsx b/src/plugins/discover/public/application/doc/components/doc.tsx index 9bfea00a92fc2..2fd56bcc6f7f4 100644 --- a/src/plugins/discover/public/application/doc/components/doc.tsx +++ b/src/plugins/discover/public/application/doc/components/doc.tsx @@ -43,7 +43,8 @@ export interface DocProps { export function Doc(props: DocProps) { const { dataView } = props; const [reqState, hit] = useEsDocSearch(props); - const { locator, chrome, docLinks } = useDiscoverServices(); + const services = useDiscoverServices(); + const { locator, chrome, docLinks } = services; const indexExistsLink = docLinks.links.apis.indexExists; const singleDocTitle = useRef(null); @@ -53,10 +54,10 @@ export function Doc(props: DocProps) { useEffect(() => { chrome.setBreadcrumbs([ - ...getRootBreadcrumbs(props.referrer), + ...getRootBreadcrumbs({ breadcrumb: props.referrer, services }), { text: `${props.index}#${props.id}` }, ]); - }, [chrome, props.referrer, props.index, props.id, dataView, locator]); + }, [chrome, props.referrer, props.index, props.id, dataView, locator, services]); return ( diff --git a/src/plugins/discover/public/application/doc/locator.ts b/src/plugins/discover/public/application/doc/locator.ts index f3ee0c2942070..35f2bd52a6c25 100644 --- a/src/plugins/discover/public/application/doc/locator.ts +++ b/src/plugins/discover/public/application/doc/locator.ts @@ -17,6 +17,7 @@ export interface DiscoverSingleDocLocatorParams extends SerializableRecord { rowId: string; rowIndex: string; referrer: string; // discover main view url + profile?: string; } export type DiscoverSingleDocLocator = LocatorPublic; @@ -45,7 +46,13 @@ export class DiscoverSingleDocLocatorDefinition dataViewId = index; } - const path = `#/doc/${dataViewId}/${rowIndex}?id=${rowId}`; + let path = '#/'; + + if (params.profile) { + path = `${path}p/${params.profile}/`; + } + + path = `${path}doc/${dataViewId}/${rowIndex}?id=${rowId}`; return { app: 'discover', diff --git a/src/plugins/discover/public/application/index.tsx b/src/plugins/discover/public/application/index.tsx index 5ae2ed76923b5..b8a24be2b2fcc 100644 --- a/src/plugins/discover/public/application/index.tsx +++ b/src/plugins/discover/public/application/index.tsx @@ -5,12 +5,22 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ + +import React from 'react'; import { i18n } from '@kbn/i18n'; import { toMountPoint, wrapWithTheme } from '@kbn/kibana-react-plugin/public'; -import { discoverRouter } from './discover_router'; +import { DiscoverRouter } from './discover_router'; import { DiscoverServices } from '../build_services'; +import type { DiscoverProfileRegistry } from '../customizations/profile_registry'; + +export interface RenderAppProps { + element: HTMLElement; + services: DiscoverServices; + profileRegistry: DiscoverProfileRegistry; + isDev: boolean; +} -export const renderApp = (element: HTMLElement, services: DiscoverServices, isDev: boolean) => { +export const renderApp = ({ element, services, profileRegistry, isDev }: RenderAppProps) => { const { history: getHistory, capabilities, chrome, data, core } = services; const history = getHistory(); @@ -26,7 +36,15 @@ export const renderApp = (element: HTMLElement, services: DiscoverServices, isDe }); } const unmount = toMountPoint( - wrapWithTheme(discoverRouter(services, history, isDev), core.theme.theme$) + wrapWithTheme( + , + core.theme.theme$ + ) )(element); return () => { diff --git a/src/plugins/discover/public/application/main/components/field_stats_table/field_stats_tab.tsx b/src/plugins/discover/public/application/main/components/field_stats_table/field_stats_tab.tsx index 87dcbb2297c4f..9ac42f7ad863d 100644 --- a/src/plugins/discover/public/application/main/components/field_stats_table/field_stats_tab.tsx +++ b/src/plugins/discover/public/application/main/components/field_stats_table/field_stats_tab.tsx @@ -8,6 +8,7 @@ import React from 'react'; import { useQuerySubscriber } from '@kbn/unified-field-list-plugin/public'; +import { useSavedSearch } from '../../services/discover_state_provider'; import { FieldStatisticsTable, type FieldStatisticsTableProps } from './field_stats_table'; import { useDiscoverServices } from '../../../../hooks/use_discover_services'; @@ -17,10 +18,12 @@ export const FieldStatisticsTab: React.FC diff --git a/src/plugins/discover/public/application/main/components/layout/__stories__/discover_layout.stories.tsx b/src/plugins/discover/public/application/main/components/layout/__stories__/discover_layout.stories.tsx index 27214f34d8a23..80db81bb4228b 100644 --- a/src/plugins/discover/public/application/main/components/layout/__stories__/discover_layout.stories.tsx +++ b/src/plugins/discover/public/application/main/components/layout/__stories__/discover_layout.stories.tsx @@ -14,9 +14,8 @@ import { DiscoverAppState } from '../../../services/discover_app_state_container import { getDataViewMock } from '../../../../../__mocks__/__storybook_mocks__/get_data_view_mock'; import { withDiscoverServices } from '../../../../../__mocks__/__storybook_mocks__/with_discover_services'; import { getDocumentsLayoutProps, getPlainRecordLayoutProps } from './get_layout_props'; -import { DiscoverLayout } from '../discover_layout'; +import { DiscoverLayout, DiscoverLayoutProps } from '../discover_layout'; import { setHeaderActionMenuMounter } from '../../../../../kibana_services'; -import { DiscoverLayoutProps } from '../types'; setHeaderActionMenuMounter(() => void 0); diff --git a/src/plugins/discover/public/application/main/components/layout/__stories__/get_layout_props.ts b/src/plugins/discover/public/application/main/components/layout/__stories__/get_layout_props.ts index 1082a5b127397..e63829c9bd098 100644 --- a/src/plugins/discover/public/application/main/components/layout/__stories__/get_layout_props.ts +++ b/src/plugins/discover/public/application/main/components/layout/__stories__/get_layout_props.ts @@ -23,7 +23,7 @@ import { import { buildDataTableRecordList } from '../../../../../utils/build_data_record'; import { esHits } from '../../../../../__mocks__/es_hits'; import { SavedSearch } from '../../../../..'; -import { DiscoverLayoutProps } from '../types'; +import { DiscoverLayoutProps } from '../discover_layout'; import { DiscoverStateContainer, getDiscoverStateContainer, @@ -84,7 +84,6 @@ const getCommonProps = () => { const savedSearchMock = {} as unknown as SavedSearch; return { inspectorAdapters: { requests: new RequestAdapter() }, - navigateTo: action('navigate to somewhere nice'), onChangeDataView: action('change the data view'), onUpdateQuery: action('update the query'), resetSavedSearch: action('reset the saved search the query'), diff --git a/src/plugins/discover/public/application/main/components/layout/discover_documents.test.tsx b/src/plugins/discover/public/application/main/components/layout/discover_documents.test.tsx index f366d37d8d7bb..1360a49676895 100644 --- a/src/plugins/discover/public/application/main/components/layout/discover_documents.test.tsx +++ b/src/plugins/discover/public/application/main/components/layout/discover_documents.test.tsx @@ -11,7 +11,6 @@ import { BehaviorSubject } from 'rxjs'; import { mountWithIntl } from '@kbn/test-jest-helpers'; import { setHeaderActionMenuMounter } from '../../../../kibana_services'; import { esHits } from '../../../../__mocks__/es_hits'; -import { savedSearchMock } from '../../../../__mocks__/saved_search'; import { DataDocuments$ } from '../../services/discover_data_state_container'; import { discoverServiceMock } from '../../../../__mocks__/services'; import { FetchStatus } from '../../../types'; @@ -41,15 +40,9 @@ function mountComponent(fetchStatus: FetchStatus, hits: EsHitRecord[]) { stateContainer.dataState.data$.documents$ = documents$; const props = { - expandedDoc: undefined, dataView: dataViewMock, onAddFilter: jest.fn(), - savedSearch: savedSearchMock, - searchSource: savedSearchMock.searchSource, - setExpandedDoc: jest.fn(), - state: { columns: [] }, stateContainer, - navigateTo: jest.fn(), onFieldEdited: jest.fn(), }; diff --git a/src/plugins/discover/public/application/main/components/layout/discover_documents.tsx b/src/plugins/discover/public/application/main/components/layout/discover_documents.tsx index 77d6e36715dd7..895a499d94f27 100644 --- a/src/plugins/discover/public/application/main/components/layout/discover_documents.tsx +++ b/src/plugins/discover/public/application/main/components/layout/discover_documents.tsx @@ -17,8 +17,7 @@ import { import { FormattedMessage } from '@kbn/i18n-react'; import { css } from '@emotion/react'; import { DataView } from '@kbn/data-views-plugin/public'; -import { SavedSearch, SortOrder } from '@kbn/saved-search-plugin/public'; -import { DataTableRecord } from '../../../../types'; +import { SortOrder } from '@kbn/saved-search-plugin/public'; import { useInternalStateSelector } from '../../services/discover_internal_state_container'; import { useAppStateSelector } from '../../services/discover_app_state_container'; import { useDiscoverServices } from '../../../../hooks/use_discover_services'; @@ -40,9 +39,12 @@ import { DocTableInfinite } from '../../../../components/doc_table/doc_table_inf import { DocumentExplorerCallout } from '../document_explorer_callout'; import { DocumentExplorerUpdateCallout } from '../document_explorer_callout/document_explorer_update_callout'; import { DiscoverTourProvider } from '../../../../components/discover_tour'; +import { DataTableRecord } from '../../../../types'; import { getRawRecordType } from '../../utils/get_raw_record_type'; import { DiscoverGridFlyout } from '../../../../components/discover_grid/discover_grid_flyout'; import { DocViewer } from '../../../../services/doc_views/components/doc_viewer'; +import { useSavedSearchInitial } from '../../services/discover_state_provider'; +import { useDiscoverCustomization } from '../../../../customizations/customization_provider'; const containerStyles = css` position: relative; @@ -73,19 +75,17 @@ export const onResize = ( function DiscoverDocumentsComponent({ dataView, onAddFilter, - savedSearch, stateContainer, onFieldEdited, }: { dataView: DataView; - navigateTo: (url: string) => void; onAddFilter?: DocViewFilterFn; - savedSearch: SavedSearch; stateContainer: DiscoverStateContainer; onFieldEdited?: () => void; }) { const services = useDiscoverServices(); const documents$ = stateContainer.dataState.data$.documents$; + const savedSearch = useSavedSearchInitial(); const { dataViews, capabilities, uiSettings } = services; const [query, sort, rowHeight, rowsPerPage, grid, columns, index] = useAppStateSelector( (state) => { @@ -179,6 +179,21 @@ function DiscoverDocumentsComponent({ [isPlainRecord, uiSettings, dataView.timeFieldName] ); + const dataGridCustomization = useDiscoverCustomization('data_grid'); + const defaultControlColumns = dataGridCustomization?.defaultLeadingControlColumns; + + const controlColumnIds = useMemo(() => { + const ids: string[] = []; + if (!defaultControlColumns?.expand?.disabled) ids.push('openDetails'); + if (!defaultControlColumns?.select?.disabled) ids.push('select'); + return ids; + }, [defaultControlColumns?.expand?.disabled, defaultControlColumns?.select?.disabled]); + + const customControlColumns = useMemo( + () => dataGridCustomization?.getLeadingControlColumns?.(), + [dataGridCustomization] + ); + if (isDataViewLoading || (isEmptyDataResult && isDataLoading)) { return (
    @@ -258,6 +273,8 @@ function DiscoverDocumentsComponent({ onFieldEdited={onFieldEdited} savedSearchId={savedSearch.id} DocumentView={DiscoverGridFlyout} + controlColumnIds={controlColumnIds} + customControlColumns={customControlColumns} services={services} />
    diff --git a/src/plugins/discover/public/application/main/components/layout/discover_histogram_layout.test.tsx b/src/plugins/discover/public/application/main/components/layout/discover_histogram_layout.test.tsx index 2547011242081..beb09b473d2c5 100644 --- a/src/plugins/discover/public/application/main/components/layout/discover_histogram_layout.test.tsx +++ b/src/plugins/discover/public/application/main/components/layout/discover_histogram_layout.test.tsx @@ -28,7 +28,6 @@ import { SavedSearch, VIEW_MODE } from '@kbn/saved-search-plugin/public'; import { CoreTheme } from '@kbn/core/public'; import { Storage } from '@kbn/kibana-utils-plugin/public'; import { createSearchSessionMock } from '../../../../__mocks__/search_session'; -import { RequestAdapter } from '@kbn/inspector-plugin/public'; import { searchSourceInstanceMock } from '@kbn/data-plugin/common/search/search_source/mocks'; import { getSessionServiceMock } from '@kbn/data-plugin/public/search/session/mocks'; import { ResetSearchButton } from './reset_search_button'; @@ -36,8 +35,8 @@ import { getDiscoverStateMock } from '../../../../__mocks__/discover_state.mock' import { DiscoverMainProvider } from '../../services/discover_state_provider'; import { act } from 'react-dom/test-utils'; -function getStateContainer() { - const stateContainer = getDiscoverStateMock({ isTimeBased: true }); +function getStateContainer(savedSearch?: SavedSearch) { + const stateContainer = getDiscoverStateMock({ isTimeBased: true, savedSearch }); stateContainer.appState.update({ interval: 'auto', @@ -51,14 +50,12 @@ const mountComponent = async ({ isPlainRecord = false, storage, savedSearch = savedSearchMock, - resetSavedSearch = jest.fn(), searchSessionId = '123', }: { isPlainRecord?: boolean; isTimeBased?: boolean; storage?: Storage; savedSearch?: SavedSearch; - resetSavedSearch?(): void; searchSessionId?: string | null; } = {}) => { let services = discoverServiceMock; @@ -112,22 +109,19 @@ const mountComponent = async ({ session.getSession$.mockReturnValue(new BehaviorSubject(searchSessionId ?? undefined)); - const stateContainer = getStateContainer(); + const stateContainer = getStateContainer(savedSearch); stateContainer.dataState.data$ = savedSearchData$; + stateContainer.actions.undoSavedSearchChanges = jest.fn(); const props: DiscoverHistogramLayoutProps = { isPlainRecord, dataView: dataViewMock, - navigateTo: jest.fn(), - savedSearch, stateContainer, onFieldEdited: jest.fn(), columns: [], viewMode: VIEW_MODE.DOCUMENT_LEVEL, onAddFilter: jest.fn(), - resetSavedSearch, resizeRef: { current: null }, - inspectorAdapters: { requests: new RequestAdapter() }, }; stateContainer.searchSessionManager = createSearchSessionMock(session).searchSessionManager; @@ -147,45 +141,45 @@ const mountComponent = async ({ await act(() => new Promise((resolve) => setTimeout(resolve, 0))); component.update(); - return component; + return { component, stateContainer }; }; describe('Discover histogram layout component', () => { describe('render', () => { it('should render null if there is no search session', async () => { - const component = await mountComponent({ searchSessionId: null }); + const { component } = await mountComponent({ searchSessionId: null }); expect(component.isEmptyRender()).toBe(true); }); it('should not render null if there is a search session', async () => { - const component = await mountComponent(); + const { component } = await mountComponent(); expect(component.isEmptyRender()).toBe(false); }); it('should not render null if there is no search session, but isPlainRecord is true', async () => { - const component = await mountComponent({ isPlainRecord: true }); + const { component } = await mountComponent({ isPlainRecord: true }); expect(component.isEmptyRender()).toBe(false); }); }); describe('reset search button', () => { it('renders the button when there is a saved search', async () => { - const component = await mountComponent(); + const { component } = await mountComponent(); expect(component.find(ResetSearchButton).exists()).toBe(true); }); it('does not render the button when there is no saved search', async () => { - const component = await mountComponent({ + const { component } = await mountComponent({ savedSearch: { ...savedSearchMock, id: undefined }, }); expect(component.find(ResetSearchButton).exists()).toBe(false); }); it('should call resetSavedSearch when clicked', async () => { - const resetSavedSearch = jest.fn(); - const component = await mountComponent({ resetSavedSearch }); + const { component, stateContainer } = await mountComponent(); + expect(component.find(ResetSearchButton).exists()).toBe(true); component.find(ResetSearchButton).find('button').simulate('click'); - expect(resetSavedSearch).toHaveBeenCalled(); + expect(stateContainer.actions.undoSavedSearchChanges).toHaveBeenCalled(); }); }); }); diff --git a/src/plugins/discover/public/application/main/components/layout/discover_histogram_layout.tsx b/src/plugins/discover/public/application/main/components/layout/discover_histogram_layout.tsx index 8a7592a92050d..cd6bfd6ab8b75 100644 --- a/src/plugins/discover/public/application/main/components/layout/discover_histogram_layout.tsx +++ b/src/plugins/discover/public/application/main/components/layout/discover_histogram_layout.tsx @@ -10,16 +10,14 @@ import React, { RefObject } from 'react'; import { UnifiedHistogramContainer } from '@kbn/unified-histogram-plugin/public'; import { css } from '@emotion/react'; import useObservable from 'react-use/lib/useObservable'; +import { useSavedSearchInitial } from '../../services/discover_state_provider'; import { useDiscoverHistogram } from './use_discover_histogram'; -import type { InspectorAdapters } from '../../hooks/use_inspector'; import { type DiscoverMainContentProps, DiscoverMainContent } from './discover_main_content'; import { ResetSearchButton } from './reset_search_button'; import { useAppStateSelector } from '../../services/discover_app_state_container'; export interface DiscoverHistogramLayoutProps extends DiscoverMainContentProps { - resetSavedSearch: () => void; resizeRef: RefObject; - inspectorAdapters: InspectorAdapters; } const histogramLayoutCss = css` @@ -29,18 +27,17 @@ const histogramLayoutCss = css` export const DiscoverHistogramLayout = ({ isPlainRecord, dataView, - resetSavedSearch, - savedSearch, stateContainer, resizeRef, - inspectorAdapters, ...mainContentProps }: DiscoverHistogramLayoutProps) => { + const { dataState } = stateContainer; + const savedSearch = useSavedSearchInitial(); const searchSessionId = useObservable(stateContainer.searchSessionManager.searchSessionId$); const hideChart = useAppStateSelector((state) => state.hideChart); const unifiedHistogramProps = useDiscoverHistogram({ stateContainer, - inspectorAdapters, + inspectorAdapters: dataState.inspectorAdapters, hideChart, isPlainRecord, }); @@ -56,10 +53,12 @@ export const DiscoverHistogramLayout = ({ {...unifiedHistogramProps} dataView={dataView} searchSessionId={searchSessionId} - requestAdapter={inspectorAdapters.requests} + requestAdapter={dataState.inspectorAdapters.requests} resizeRef={resizeRef} appendHitsCounter={ - savedSearch?.id ? : undefined + savedSearch.id ? ( + + ) : undefined } css={histogramLayoutCss} > @@ -67,7 +66,6 @@ export const DiscoverHistogramLayout = ({ {...mainContentProps} stateContainer={stateContainer} dataView={dataView} - savedSearch={savedSearch} isPlainRecord={isPlainRecord} // The documents grid doesn't rerender when the chart visibility changes // which causes it to render blank space, so we need to force a rerender diff --git a/src/plugins/discover/public/application/main/components/layout/discover_layout.test.tsx b/src/plugins/discover/public/application/main/components/layout/discover_layout.test.tsx index 5027fc4cfe67a..ccb70df16b88f 100644 --- a/src/plugins/discover/public/application/main/components/layout/discover_layout.test.tsx +++ b/src/plugins/discover/public/application/main/components/layout/discover_layout.test.tsx @@ -123,7 +123,6 @@ async function mountComponent( stateContainer, setExpandedDoc: jest.fn(), persistDataView: jest.fn(), - updateAdHocDataViewId: jest.fn(), updateDataViewList: jest.fn(), }; stateContainer.searchSessionManager = createSearchSessionMock(session).searchSessionManager; diff --git a/src/plugins/discover/public/application/main/components/layout/discover_layout.tsx b/src/plugins/discover/public/application/main/components/layout/discover_layout.tsx index 1dab027ca81fd..fcb157122f858 100644 --- a/src/plugins/discover/public/application/main/components/layout/discover_layout.tsx +++ b/src/plugins/discover/public/application/main/components/layout/discover_layout.tsx @@ -23,6 +23,8 @@ import classNames from 'classnames'; import { generateFilters } from '@kbn/data-plugin/public'; import { DragContext } from '@kbn/dom-drag-drop'; import { DataView, DataViewField, DataViewType } from '@kbn/data-views-plugin/public'; +import { useSavedSearchInitial } from '../../services/discover_state_provider'; +import { DiscoverStateContainer } from '../../services/discover_state'; import { VIEW_MODE } from '../../../../../common/constants'; import { useInternalStateSelector } from '../../services/discover_internal_state_container'; import { useAppStateSelector } from '../../services/discover_app_state_container'; @@ -31,7 +33,6 @@ import { useDiscoverServices } from '../../../../hooks/use_discover_services'; import { DiscoverNoResults } from '../no_results'; import { LoadingSpinner } from '../loading_spinner/loading_spinner'; import { DiscoverSidebarResponsive } from '../sidebar'; -import { DiscoverLayoutProps } from './types'; import { SEARCH_FIELDS_FROM_SOURCE, SHOW_FIELD_STATISTICS } from '../../../../../common'; import { popularizeField } from '../../../../utils/popularize_field'; import { DiscoverTopNav } from '../top_nav/discover_topnav'; @@ -55,19 +56,12 @@ export const SIDEBAR_CLOSED_KEY = 'discover:sidebarClosed'; const SidebarMemoized = React.memo(DiscoverSidebarResponsive); const TopNavMemoized = React.memo(DiscoverTopNav); -export function DiscoverLayout({ - inspectorAdapters, - navigateTo, - onChangeDataView, - onUpdateQuery, - resetSavedSearch, - savedSearch, - searchSource, - stateContainer, - persistDataView, - updateAdHocDataViewId, - updateDataViewList, -}: DiscoverLayoutProps) { +export interface DiscoverLayoutProps { + stateContainer: DiscoverStateContainer; + persistDataView: (dataView: DataView) => Promise; +} + +export function DiscoverLayout({ stateContainer, persistDataView }: DiscoverLayoutProps) { const { trackUiMetric, capabilities, @@ -93,6 +87,7 @@ export function DiscoverLayout({ }); const dataView = useInternalStateSelector((state) => state.dataView!); const dataState: DataMainMsg = useDataState(main$); + const savedSearch = useSavedSearchInitial(); const fetchCounter = useRef(0); @@ -123,8 +118,6 @@ export function DiscoverLayout({ const onOpenInspector = useInspector({ inspector, stateContainer, - inspectorAdapters, - savedSearch, }); const { @@ -161,11 +154,11 @@ export function DiscoverLayout({ onRemoveColumn(removedFieldName); } if (!dataView.isPersisted()) { - await updateAdHocDataViewId(dataView); + await stateContainer.actions.updateAdHocDataViewId(); } stateContainer.dataState.refetch$.next('reset'); }, - [dataView, stateContainer, updateAdHocDataViewId, currentColumns, onRemoveColumn] + [dataView, stateContainer, currentColumns, onRemoveColumn] ); const onDisableFilters = useCallback(() => { @@ -181,19 +174,6 @@ export function DiscoverLayout({ }, [isSidebarClosed, storage]); const contentCentered = resultState === 'uninitialized' || resultState === 'none'; - const onDataViewCreated = useCallback( - async (nextDataView: DataView) => { - if (!nextDataView.isPersisted()) { - stateContainer.actions.appendAdHocDataViews(nextDataView); - } else { - await stateContainer.actions.loadDataViewList(); - } - if (nextDataView.id) { - onChangeDataView(nextDataView.id); - } - }, - [onChangeDataView, stateContainer] - ); const savedSearchTitle = useRef(null); useEffect(() => { @@ -235,11 +215,7 @@ export function DiscoverLayout({ } if (resultState === 'uninitialized') { - return ( - stateContainer.dataState.refetch$.next(undefined)} - /> - ); + return stateContainer.dataState.fetch()} />; } return ( @@ -247,16 +223,12 @@ export function DiscoverLayout({ {resultState === 'loading' && } @@ -266,16 +238,12 @@ export function DiscoverLayout({ currentColumns, data, dataView, - inspectorAdapters, isPlainRecord, isTimeBased, - navigateTo, onAddFilter, onDisableFilters, onFieldEdited, - resetSavedSearch, resultState, - savedSearch, stateContainer, viewMode, onDropFieldToTable, @@ -304,21 +272,13 @@ export function DiscoverLayout({ diff --git a/src/plugins/discover/public/application/main/components/layout/discover_main_content.test.tsx b/src/plugins/discover/public/application/main/components/layout/discover_main_content.test.tsx index b85580e75b7c1..5ab1a6e4d6e3b 100644 --- a/src/plugins/discover/public/application/main/components/layout/discover_main_content.test.tsx +++ b/src/plugins/discover/public/application/main/components/layout/discover_main_content.test.tsx @@ -11,7 +11,6 @@ import { BehaviorSubject, of } from 'rxjs'; import { mountWithIntl } from '@kbn/test-jest-helpers'; import { esHits } from '../../../../__mocks__/es_hits'; import { dataViewMock } from '../../../../__mocks__/data_view'; -import { savedSearchMock } from '../../../../__mocks__/saved_search'; import { AvailableFields$, DataDocuments$, @@ -39,7 +38,6 @@ const mountComponent = ({ isPlainRecord = false, viewMode = VIEW_MODE.DOCUMENT_LEVEL, storage, - savedSearch = savedSearchMock, }: { hideChart?: boolean; isPlainRecord?: boolean; @@ -99,8 +97,6 @@ const mountComponent = ({ const props: DiscoverMainContentProps = { isPlainRecord, dataView: dataViewMock, - navigateTo: jest.fn(), - savedSearch, stateContainer, onFieldEdited: jest.fn(), columns: [], diff --git a/src/plugins/discover/public/application/main/components/layout/discover_main_content.tsx b/src/plugins/discover/public/application/main/components/layout/discover_main_content.tsx index d8f8c5463dbab..655ff5cbbb04f 100644 --- a/src/plugins/discover/public/application/main/components/layout/discover_main_content.tsx +++ b/src/plugins/discover/public/application/main/components/layout/discover_main_content.tsx @@ -7,7 +7,6 @@ */ import { EuiFlexGroup, EuiFlexItem, EuiHorizontalRule } from '@elastic/eui'; -import { SavedSearch } from '@kbn/saved-search-plugin/public'; import { DragDrop, type DropType, DropOverlayWrapper } from '@kbn/dom-drag-drop'; import React, { useCallback } from 'react'; import { DataView } from '@kbn/data-views-plugin/common'; @@ -39,9 +38,7 @@ const DROP_PROPS = { export interface DiscoverMainContentProps { dataView: DataView; - savedSearch: SavedSearch; isPlainRecord: boolean; - navigateTo: (url: string) => void; stateContainer: DiscoverStateContainer; viewMode: VIEW_MODE; onAddFilter: DocViewFilterFn | undefined; @@ -53,13 +50,11 @@ export interface DiscoverMainContentProps { export const DiscoverMainContent = ({ dataView, isPlainRecord, - navigateTo, viewMode, onAddFilter, onFieldEdited, columns, stateContainer, - savedSearch, onDropFieldToTable, }: DiscoverMainContentProps) => { const { trackUiMetric } = useDiscoverServices(); @@ -121,15 +116,12 @@ export const DiscoverMainContent = ({ {viewMode === VIEW_MODE.DOCUMENT_LEVEL ? ( ) : ( void; - onChangeDataView: (id: string) => void; - onUpdateQuery: ( - payload: { dateRange: TimeRange; query?: Query | AggregateQuery }, - isUpdate?: boolean - ) => void; - resetSavedSearch: () => void; - savedSearch: SavedSearch; - searchSource: ISearchSource; - stateContainer: DiscoverStateContainer; - persistDataView: (dataView: DataView) => Promise; - updateAdHocDataViewId: (dataView: DataView) => Promise; - updateDataViewList: (newAdHocDataViews: DataView[]) => void; -} diff --git a/src/plugins/discover/public/application/main/components/top_nav/discover_topnav.test.tsx b/src/plugins/discover/public/application/main/components/top_nav/discover_topnav.test.tsx index 85c7e381588ea..122476b815310 100644 --- a/src/plugins/discover/public/application/main/components/top_nav/discover_topnav.test.tsx +++ b/src/plugins/discover/public/application/main/components/top_nav/discover_topnav.test.tsx @@ -9,10 +9,8 @@ import React from 'react'; import { mountWithIntl } from '@kbn/test-jest-helpers'; import { dataViewMock } from '../../../../__mocks__/data_view'; -import { savedSearchMock } from '../../../../__mocks__/saved_search'; import { DiscoverTopNav, DiscoverTopNavProps } from './discover_topnav'; import { TopNavMenu, TopNavMenuData } from '@kbn/navigation-plugin/public'; -import { ISearchSource } from '@kbn/data-plugin/public'; import { Query } from '@kbn/es-query'; import { setHeaderActionMenuMounter } from '../../../../kibana_services'; import { discoverServiceMock } from '../../../../__mocks__/services'; @@ -35,21 +33,14 @@ function getProps(savePermissions = true): DiscoverTopNavProps { return { stateContainer, - savedSearch: savedSearchMock, navigateTo: jest.fn(), query: {} as Query, savedQuery: '', updateQuery: jest.fn(), onOpenInspector: jest.fn(), - searchSource: {} as ISearchSource, - resetSavedSearch: () => {}, onFieldEdited: jest.fn(), - onChangeDataView: jest.fn(), isPlainRecord: false, persistDataView: jest.fn(), - updateAdHocDataViewId: jest.fn(), - updateDataViewList: jest.fn(), - onDataViewCreated: jest.fn(), }; } diff --git a/src/plugins/discover/public/application/main/components/top_nav/discover_topnav.tsx b/src/plugins/discover/public/application/main/components/top_nav/discover_topnav.tsx index bf4b608a3c017..b7607d565b461 100644 --- a/src/plugins/discover/public/application/main/components/top_nav/discover_topnav.tsx +++ b/src/plugins/discover/public/application/main/components/top_nav/discover_topnav.tsx @@ -6,23 +6,20 @@ * Side Public License, v 1. */ import React, { useCallback, useEffect, useMemo, useRef } from 'react'; -import { useHistory } from 'react-router-dom'; import type { Query, TimeRange, AggregateQuery } from '@kbn/es-query'; import { DataViewType, type DataView } from '@kbn/data-views-plugin/public'; import type { DataViewPickerProps } from '@kbn/unified-search-plugin/public'; +import { useSavedSearchInitial } from '../../services/discover_state_provider'; import { useInternalStateSelector } from '../../services/discover_internal_state_container'; import { ENABLE_SQL } from '../../../../../common'; import { useDiscoverServices } from '../../../../hooks/use_discover_services'; -import { DiscoverLayoutProps } from '../layout/types'; import { getTopNavLinks } from './get_top_nav_links'; import { getHeaderActionMenuMounter } from '../../../../kibana_services'; import { DiscoverStateContainer } from '../../services/discover_state'; import { onSaveSearch } from './on_save_search'; +import { useDiscoverCustomization } from '../../../../customizations/customization_provider'; -export type DiscoverTopNavProps = Pick< - DiscoverLayoutProps, - 'navigateTo' | 'savedSearch' | 'searchSource' -> & { +export interface DiscoverTopNavProps { onOpenInspector: () => void; query?: Query | AggregateQuery; savedQuery?: string; @@ -31,16 +28,11 @@ export type DiscoverTopNavProps = Pick< isUpdate?: boolean ) => void; stateContainer: DiscoverStateContainer; - resetSavedSearch: () => void; - onChangeDataView: (dataView: string) => void; - onDataViewCreated: (dataView: DataView) => void; isPlainRecord: boolean; textBasedLanguageModeErrors?: Error; onFieldEdited: () => Promise; persistDataView: (dataView: DataView) => Promise; - updateAdHocDataViewId: (dataView: DataView) => Promise; - updateDataViewList: (newAdHocDataViews: DataView[]) => void; -}; +} export const DiscoverTopNav = ({ onOpenInspector, @@ -48,23 +40,15 @@ export const DiscoverTopNav = ({ savedQuery, stateContainer, updateQuery, - searchSource, - navigateTo, - savedSearch, - resetSavedSearch, - onChangeDataView, - onDataViewCreated, isPlainRecord, textBasedLanguageModeErrors, onFieldEdited, persistDataView, - updateAdHocDataViewId, - updateDataViewList, }: DiscoverTopNavProps) => { - const history = useHistory(); const adHocDataViews = useInternalStateSelector((state) => state.adHocDataViews); const dataView = useInternalStateSelector((state) => state.dataView!); const savedDataViews = useInternalStateSelector((state) => state.savedDataViews); + const savedSearch = useSavedSearchInitial(); const showDatePicker = useMemo( () => dataView.isTimeBased() && dataView.type !== DataViewType.ROLLUP, [dataView] @@ -80,17 +64,6 @@ export const DiscoverTopNav = ({ const { AggregateQueryTopNavMenu } = navigation.ui; - const onOpenSavedSearch = useCallback( - (newSavedSearchId: string) => { - if (savedSearch.id && savedSearch.id === newSavedSearchId) { - resetSavedSearch(); - } else { - history.push(`/view/${encodeURIComponent(newSavedSearchId)}`); - } - }, - [history, resetSavedSearch, savedSearch.id] - ); - useEffect(() => { return () => { // Make sure to close the editors when unmounting @@ -131,57 +104,33 @@ export const DiscoverTopNav = ({ const createNewDataView = useCallback(() => { closeDataViewEditor.current = dataViewEditor.openEditor({ - onSave: onDataViewCreated, + onSave: stateContainer.actions.onDataViewCreated, allowAdHocDataView: true, }); - }, [dataViewEditor, onDataViewCreated]); - - const onCreateDefaultAdHocDataView = useCallback( - async (pattern: string) => { - const newDataView = await dataViews.create({ - title: pattern, - }); - if (newDataView.fields.getByName('@timestamp')?.type === 'date') { - newDataView.timeFieldName = '@timestamp'; - } - - stateContainer.actions.appendAdHocDataViews(newDataView); - onChangeDataView(newDataView.id!); - }, - [dataViews, onChangeDataView, stateContainer.actions] - ); + }, [dataViewEditor, stateContainer]); + const topNavCustomization = useDiscoverCustomization('top_nav'); const topNavMenu = useMemo( () => getTopNavLinks({ dataView, - navigateTo, - savedSearch, services, state: stateContainer, onOpenInspector, - searchSource, - onOpenSavedSearch, isPlainRecord, adHocDataViews, - updateDataViewList, persistDataView, - updateAdHocDataViewId, + topNavCustomization, }), [ + adHocDataViews, dataView, - navigateTo, - savedSearch, - services, - stateContainer, - onOpenInspector, - searchSource, - onOpenSavedSearch, isPlainRecord, - adHocDataViews, + onOpenInspector, persistDataView, - updateAdHocDataViewId, - updateDataViewList, + services, + stateContainer, + topNavCustomization, ] ); @@ -192,7 +141,7 @@ export const DiscoverTopNav = ({ dataViews.clearInstanceCache(editedDataView.id); stateContainer.actions.setDataView(await dataViews.create(editedDataView.toSpec(), true)); } else { - await updateAdHocDataViewId(editedDataView); + await stateContainer.actions.updateAdHocDataViewId(); } stateContainer.actions.loadDataViewList(); stateContainer.dataState.fetch(); @@ -228,8 +177,8 @@ export const DiscoverTopNav = ({ currentDataViewId: dataView?.id, onAddField: addField, onDataViewCreated: createNewDataView, - onCreateDefaultAdHocDataView, - onChangeDataView, + onCreateDefaultAdHocDataView: stateContainer.actions.onCreateDefaultAdHocDataView, + onChangeDataView: stateContainer.actions.onChangeDataView, textBasedLanguages: supportedTextBasedLanguages as DataViewPickerProps['textBasedLanguages'], adHocDataViews, savedDataViews, @@ -239,19 +188,18 @@ export const DiscoverTopNav = ({ const onTextBasedSavedAndExit = useCallback( ({ onSave, onCancel }) => { onSaveSearch({ - savedSearch, + savedSearch: stateContainer.savedSearchState.getState(), services, - dataView, - navigateTo, state: stateContainer, onClose: onCancel, onSaveCb: onSave, - updateAdHocDataViewId, }); }, - [dataView, navigateTo, savedSearch, services, stateContainer, updateAdHocDataViewId] + [services, stateContainer] ); + const searchBarCustomization = useDiscoverCustomization('search_bar'); + return ( + ) : undefined + } + dataViewPickerComponentProps={ + searchBarCustomization?.CustomDataViewPicker ? undefined : dataViewPickerProps + } displayStyle="detached" textBasedLanguageModeErrors={ textBasedLanguageModeErrors ? [textBasedLanguageModeErrors] : undefined diff --git a/src/plugins/discover/public/application/main/components/top_nav/get_top_nav_links.test.ts b/src/plugins/discover/public/application/main/components/top_nav/get_top_nav_links.test.ts index fcd52f1563acf..ba56d565ca1c4 100644 --- a/src/plugins/discover/public/application/main/components/top_nav/get_top_nav_links.test.ts +++ b/src/plugins/discover/public/application/main/components/top_nav/get_top_nav_links.test.ts @@ -6,10 +6,8 @@ * Side Public License, v 1. */ -import { ISearchSource } from '@kbn/data-plugin/public'; import { getTopNavLinks } from './get_top_nav_links'; import { dataViewMock } from '../../../../__mocks__/data_view'; -import { savedSearchMock } from '../../../../__mocks__/saved_search'; import { DiscoverServices } from '../../../../build_services'; import { DiscoverStateContainer } from '../../services/discover_state'; @@ -31,16 +29,11 @@ test('getTopNavLinks result', () => { dataView: dataViewMock, navigateTo: jest.fn(), onOpenInspector: jest.fn(), - savedSearch: savedSearchMock, services, state, - searchSource: {} as ISearchSource, - onOpenSavedSearch: () => {}, isPlainRecord: false, persistDataView: jest.fn(), - updateDataViewList: jest.fn(), adHocDataViews: [], - updateAdHocDataViewId: jest.fn(), }); expect(topNavLinks).toMatchInlineSnapshot(` Array [ @@ -97,16 +90,11 @@ test('getTopNavLinks result for sql mode', () => { dataView: dataViewMock, navigateTo: jest.fn(), onOpenInspector: jest.fn(), - savedSearch: savedSearchMock, services, state, - searchSource: {} as ISearchSource, - onOpenSavedSearch: () => {}, isPlainRecord: true, persistDataView: jest.fn(), - updateDataViewList: jest.fn(), adHocDataViews: [], - updateAdHocDataViewId: jest.fn(), }); expect(topNavLinks).toMatchInlineSnapshot(` Array [ diff --git a/src/plugins/discover/public/application/main/components/top_nav/get_top_nav_links.tsx b/src/plugins/discover/public/application/main/components/top_nav/get_top_nav_links.tsx index 3707e83697fb5..4b6b215216bc8 100644 --- a/src/plugins/discover/public/application/main/components/top_nav/get_top_nav_links.tsx +++ b/src/plugins/discover/public/application/main/components/top_nav/get_top_nav_links.tsx @@ -7,11 +7,9 @@ */ import { i18n } from '@kbn/i18n'; -import type { ISearchSource } from '@kbn/data-plugin/public'; import type { DataView } from '@kbn/data-views-plugin/public'; import { unhashUrl } from '@kbn/kibana-utils-plugin/public'; import type { TopNavMenuData } from '@kbn/navigation-plugin/public'; -import { SavedSearch } from '@kbn/saved-search-plugin/public'; import { showOpenSearchPanel } from './show_open_search_panel'; import { getSharingData, showPublicUrlSwitch } from '../../../../utils/get_sharing_data'; import { DiscoverServices } from '../../../../build_services'; @@ -19,38 +17,29 @@ import { onSaveSearch } from './on_save_search'; import { DiscoverStateContainer } from '../../services/discover_state'; import { openOptionsPopover } from './open_options_popover'; import { openAlertsPopover } from './open_alerts_popover'; +import type { TopNavCustomization } from '../../../../customizations'; /** * Helper function to build the top nav links */ export const getTopNavLinks = ({ dataView, - navigateTo, - savedSearch, services, state, onOpenInspector, - searchSource, - onOpenSavedSearch, isPlainRecord, persistDataView, adHocDataViews, - updateDataViewList, - updateAdHocDataViewId, + topNavCustomization, }: { dataView: DataView; - navigateTo: (url: string) => void; - savedSearch: SavedSearch; services: DiscoverServices; state: DiscoverStateContainer; onOpenInspector: () => void; - searchSource: ISearchSource; - onOpenSavedSearch: (id: string) => void; isPlainRecord: boolean; adHocDataViews: DataView[]; - updateDataViewList: (dataView: DataView[]) => void; persistDataView: (dataView: DataView) => Promise; - updateAdHocDataViewId: (dataView: DataView) => Promise; + topNavCustomization: TopNavCustomization | undefined; }): TopNavMenuData[] => { const options = { id: 'options', @@ -83,11 +72,9 @@ export const getTopNavLinks = ({ I18nContext: services.core.i18n.Context, theme$: services.core.theme.theme$, anchorElement, - searchSource: savedSearch.searchSource, services, + stateContainer: state, adHocDataViews, - updateDataViewList, - savedQueryId: state.appState.getState().savedQuery, }); }, testId: 'discoverAlertsButton', @@ -101,7 +88,7 @@ export const getTopNavLinks = ({ description: i18n.translate('discover.localMenu.newSearchDescription', { defaultMessage: 'New Search', }), - run: () => navigateTo('/'), + run: () => services.locator.navigate({}), testId: 'discoverNewButton', }; @@ -118,12 +105,9 @@ export const getTopNavLinks = ({ emphasize: true, run: (anchorElement: HTMLElement) => { onSaveSearch({ - savedSearch, + savedSearch: state.savedSearchState.getState(), services, - dataView, - navigateTo, state, - updateAdHocDataViewId, onClose: () => { anchorElement?.focus(); }, @@ -142,7 +126,7 @@ export const getTopNavLinks = ({ testId: 'discoverOpenButton', run: () => showOpenSearchPanel({ - onOpenSavedSearch, + onOpenSavedSearch: state.actions.onOpenSavedSearch, I18nContext: services.core.i18n.Context, theme$: services.core.theme.theme$, services, @@ -170,11 +154,11 @@ export const getTopNavLinks = ({ return; } } + const savedSearch = state.savedSearchState.getState(); const sharingData = await getSharingData( - searchSource, + savedSearch.searchSource, state.appState.getState(), - services, - isPlainRecord + services ); services.share.toggleShareContextMenu({ @@ -216,17 +200,41 @@ export const getTopNavLinks = ({ }, }; - return [ - ...(services.capabilities.advancedSettings.save ? [options] : []), - newSearch, - openSearch, - shareSearch, - ...(services.triggersActionsUi && + const defaultMenu = topNavCustomization?.defaultMenu; + const entries = topNavCustomization?.getMenuItems?.() ?? []; + + if (services.capabilities.advancedSettings.save && !defaultMenu?.options?.disabled) { + entries.push({ data: options, order: defaultMenu?.options?.order ?? 100 }); + } + + if (!defaultMenu?.new?.disabled) { + entries.push({ data: newSearch, order: defaultMenu?.new?.order ?? 200 }); + } + + if (!defaultMenu?.open?.disabled) { + entries.push({ data: openSearch, order: defaultMenu?.open?.order ?? 300 }); + } + + if (!defaultMenu?.share?.disabled) { + entries.push({ data: shareSearch, order: defaultMenu?.share?.order ?? 400 }); + } + + if ( + services.triggersActionsUi && services.capabilities.management?.insightsAndAlerting?.triggersActions && - !isPlainRecord - ? [alerts] - : []), - inspectSearch, - ...(services.capabilities.discover.save ? [saveSearch] : []), - ]; + !isPlainRecord && + !defaultMenu?.alerts?.disabled + ) { + entries.push({ data: alerts, order: defaultMenu?.alerts?.order ?? 500 }); + } + + if (!defaultMenu?.inspect?.disabled) { + entries.push({ data: inspectSearch, order: defaultMenu?.inspect?.order ?? 600 }); + } + + if (services.capabilities.discover.save && !defaultMenu?.save?.disabled) { + entries.push({ data: saveSearch, order: defaultMenu?.save?.order ?? 700 }); + } + + return entries.sort((a, b) => a.order - b.order).map((entry) => entry.data); }; diff --git a/src/plugins/discover/public/application/main/components/top_nav/on_save_search.test.tsx b/src/plugins/discover/public/application/main/components/top_nav/on_save_search.test.tsx index a7efab7d984a9..5c4df5f492249 100644 --- a/src/plugins/discover/public/application/main/components/top_nav/on_save_search.test.tsx +++ b/src/plugins/discover/public/application/main/components/top_nav/on_save_search.test.tsx @@ -8,54 +8,77 @@ import * as savedObjectsPlugin from '@kbn/saved-objects-plugin/public'; jest.mock('@kbn/saved-objects-plugin/public'); -jest.mock('../../utils/persist_saved_search', () => ({ - persistSavedSearch: jest.fn(() => ({ id: 'the-saved-search-id' })), -})); -import { onSaveSearch } from './on_save_search'; +import type { DataView } from '@kbn/data-views-plugin/common'; import { dataViewMock } from '../../../../__mocks__/data_view'; +import { dataViewWithTimefieldMock } from '../../../../__mocks__/data_view_with_timefield'; +import { onSaveSearch } from './on_save_search'; import { savedSearchMock } from '../../../../__mocks__/saved_search'; import { getDiscoverStateContainer } from '../../services/discover_state'; import { ReactElement } from 'react'; import { discoverServiceMock } from '../../../../__mocks__/services'; -import * as persistSavedSearchUtils from '../../utils/persist_saved_search'; import { SavedSearch } from '@kbn/saved-search-plugin/public'; import { createBrowserHistory } from 'history'; -function getStateContainer() { +function getStateContainer({ dataView }: { dataView?: DataView } = {}) { const savedSearch = savedSearchMock; const history = createBrowserHistory(); const stateContainer = getDiscoverStateContainer({ - savedSearch, services: discoverServiceMock, history, }); + stateContainer.savedSearchState.set(savedSearch); stateContainer.appState.getState = jest.fn(() => ({ rowsPerPage: 250, })); + if (dataView) { + stateContainer.internalState.transitions.setDataView(dataView); + } return stateContainer; } describe('onSaveSearch', () => { it('should call showSaveModal', async () => { await onSaveSearch({ - dataView: dataViewMock, navigateTo: jest.fn(), savedSearch: savedSearchMock, services: discoverServiceMock, state: getStateContainer(), - updateAdHocDataViewId: jest.fn(), }); expect(savedObjectsPlugin.showSaveModal).toHaveBeenCalled(); }); + it('should consider whether a data view is time based', async () => { + let saveModal: ReactElement | undefined; + jest.spyOn(savedObjectsPlugin, 'showSaveModal').mockImplementation((modal) => { + saveModal = modal; + }); + + await onSaveSearch({ + navigateTo: jest.fn(), + savedSearch: savedSearchMock, + services: discoverServiceMock, + state: getStateContainer({ dataView: dataViewMock }), + }); + + expect(saveModal?.props.isTimeBased).toBe(false); + + await onSaveSearch({ + navigateTo: jest.fn(), + savedSearch: savedSearchMock, + services: discoverServiceMock, + state: getStateContainer({ dataView: dataViewWithTimefieldMock }), + }); + + expect(saveModal?.props.isTimeBased).toBe(true); + }); + it('should pass tags to the save modal', async () => { let saveModal: ReactElement | undefined; jest.spyOn(savedObjectsPlugin, 'showSaveModal').mockImplementationOnce((modal) => { saveModal = modal; }); await onSaveSearch({ - dataView: dataViewMock, navigateTo: jest.fn(), savedSearch: { ...savedSearchMock, @@ -63,7 +86,6 @@ describe('onSaveSearch', () => { }, services: discoverServiceMock, state: getStateContainer(), - updateAdHocDataViewId: jest.fn(), }); expect(saveModal?.props.tags).toEqual(['tag1', 'tag2']); }); @@ -77,21 +99,19 @@ describe('onSaveSearch', () => { ...savedSearchMock, tags: ['tag1', 'tag2'], }; + const state = getStateContainer(); await onSaveSearch({ - dataView: dataViewMock, navigateTo: jest.fn(), savedSearch, services: discoverServiceMock, - state: getStateContainer(), - updateAdHocDataViewId: jest.fn(), + state, }); expect(savedSearch.tags).toEqual(['tag1', 'tag2']); - jest - .spyOn(persistSavedSearchUtils, 'persistSavedSearch') - .mockImplementationOnce((newSavedSearch, _) => { - savedSearch = newSavedSearch; - return Promise.resolve({ id: newSavedSearch.id }); - }); + + state.savedSearchState.persist = jest.fn().mockImplementationOnce((newSavedSearch, _) => { + savedSearch = newSavedSearch; + return Promise.resolve(newSavedSearch.id); + }); saveModal?.props.onSave({ newTitle: savedSearch.title, newCopyOnSave: false, @@ -113,24 +133,21 @@ describe('onSaveSearch', () => { ...savedSearchMock, tags: ['tag1', 'tag2'], }; + const state = getStateContainer(); await onSaveSearch({ - dataView: dataViewMock, navigateTo: jest.fn(), savedSearch, services: { ...serviceMock, savedObjectsTagging: undefined, }, - state: getStateContainer(), - updateAdHocDataViewId: jest.fn(), + state, }); expect(savedSearch.tags).toEqual(['tag1', 'tag2']); - jest - .spyOn(persistSavedSearchUtils, 'persistSavedSearch') - .mockImplementationOnce((newSavedSearch, _) => { - savedSearch = newSavedSearch; - return Promise.resolve({ id: newSavedSearch.id }); - }); + state.savedSearchState.persist = jest.fn().mockImplementationOnce((newSavedSearch, _) => { + savedSearch = newSavedSearch; + return Promise.resolve(newSavedSearch.id); + }); saveModal?.props.onSave({ newTitle: savedSearch.title, newCopyOnSave: false, diff --git a/src/plugins/discover/public/application/main/components/top_nav/on_save_search.tsx b/src/plugins/discover/public/application/main/components/top_nav/on_save_search.tsx index 4d88e48b8adf5..47a81b1c32447 100644 --- a/src/plugins/discover/public/application/main/components/top_nav/on_save_search.tsx +++ b/src/plugins/discover/public/application/main/components/top_nav/on_save_search.tsx @@ -11,25 +11,18 @@ import { i18n } from '@kbn/i18n'; import { EuiFormRow, EuiSwitch } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { SavedObjectSaveModal, showSaveModal, OnSaveProps } from '@kbn/saved-objects-plugin/public'; -import { DataView } from '@kbn/data-views-plugin/public'; import { SavedSearch, SaveSavedSearchOptions } from '@kbn/saved-search-plugin/public'; import { DiscoverServices } from '../../../../build_services'; import { DiscoverStateContainer } from '../../services/discover_state'; -import { setBreadcrumbsTitle } from '../../../../utils/breadcrumbs'; -import { persistSavedSearch } from '../../utils/persist_saved_search'; import { DOC_TABLE_LEGACY } from '../../../../../common'; async function saveDataSource({ - dataView, - navigateTo, savedSearch, saveOptions, services, state, navigateOrReloadSavedSearch, }: { - dataView: DataView; - navigateTo: (url: string) => void; savedSearch: SavedSearch; saveOptions: SaveSavedSearchOptions; services: DiscoverServices; @@ -50,19 +43,10 @@ async function saveDataSource({ }); if (navigateOrReloadSavedSearch) { if (id !== prevSavedSearchId) { - navigateTo(`/view/${encodeURIComponent(id)}`); + services.locator.navigate({ savedSearchId: id }); } else { // Update defaults so that "reload saved query" functions correctly - state.appState.resetWithSavedSearch(savedSearch); - services.chrome.docTitle.change(savedSearch.title!); - - setBreadcrumbsTitle( - { - ...savedSearch, - id: prevSavedSearchId ?? id, - }, - services.chrome - ); + state.actions.undoSavedSearchChanges(); } } } @@ -79,36 +63,33 @@ async function saveDataSource({ text: error.message, }); } - return persistSavedSearch(savedSearch, { - dataView, - onError, - onSuccess, - saveOptions, - services, - state: state.appState.getState(), - }); + + try { + const response = await state.savedSearchState.persist(savedSearch, saveOptions); + if (response?.id) { + onSuccess(response.id!); + } + return response; + } catch (error) { + onError(error); + } } export async function onSaveSearch({ - dataView, - navigateTo, savedSearch, services, state, onClose, onSaveCb, - updateAdHocDataViewId, }: { - dataView: DataView; - navigateTo: (path: string) => void; savedSearch: SavedSearch; services: DiscoverServices; state: DiscoverStateContainer; - updateAdHocDataViewId: (dataView: DataView) => Promise; onClose?: () => void; onSaveCb?: () => void; }) { const { uiSettings, savedObjectsTagging } = services; + const dataView = state.internalState.getState().dataView; const onSave = async ({ newTitle, newCopyOnSave, @@ -146,21 +127,20 @@ export async function onSaveSearch({ isTitleDuplicateConfirmed, }; - const updatedDataView = - !dataView.isPersisted() && newCopyOnSave ? await updateAdHocDataViewId(dataView) : dataView; + if (newCopyOnSave) { + await state.actions.updateAdHocDataViewId(); + } const navigateOrReloadSavedSearch = !Boolean(onSaveCb); const response = await saveDataSource({ - dataView: updatedDataView, saveOptions, services, - navigateTo, savedSearch, state, navigateOrReloadSavedSearch, }); // If the save wasn't successful, put the original values back. - if (!response.id || response.error) { + if (!response) { savedSearch.title = currentTitle; savedSearch.timeRestore = currentTimeRestore; savedSearch.rowsPerPage = currentRowsPerPage; @@ -177,6 +157,7 @@ export async function onSaveSearch({ const saveModal = ( void; onClose: () => void; }> = ({ + isTimeBased, services, title, description, @@ -210,7 +193,9 @@ const SaveSearchObjectModal: React.FC<{ onClose, }) => { const { savedObjectsTagging } = services; - const [timeRestore, setTimeRestore] = useState(savedTimeRestore || false); + const [timeRestore, setTimeRestore] = useState( + (isTimeBased && savedTimeRestore) || false + ); const [currentTags, setCurrentTags] = useState(tags); const onModalSave = (params: OnSaveProps) => { @@ -230,7 +215,7 @@ const SaveSearchObjectModal: React.FC<{ /> ) : undefined; - const timeSwitch = ( + const timeSwitch = isTimeBased ? ( - ); + ) : null; const options = tagSelector ? ( <> diff --git a/src/plugins/discover/public/application/main/components/top_nav/open_alerts_popover.test.tsx b/src/plugins/discover/public/application/main/components/top_nav/open_alerts_popover.test.tsx index 7412dfe599cbe..7a434a4673fa1 100644 --- a/src/plugins/discover/public/application/main/components/top_nav/open_alerts_popover.test.tsx +++ b/src/plugins/discover/public/application/main/components/top_nav/open_alerts_popover.test.tsx @@ -9,30 +9,31 @@ import React, { ReactNode } from 'react'; import { mountWithIntl } from '@kbn/test-jest-helpers'; import { findTestSubject } from '@elastic/eui/lib/test'; -import { createSearchSourceMock } from '@kbn/data-plugin/public/mocks'; import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; import { AlertsPopover } from './open_alerts_popover'; import { discoverServiceMock } from '../../../../__mocks__/services'; import { dataViewWithTimefieldMock } from '../../../../__mocks__/data_view_with_timefield'; import { dataViewMock } from '../../../../__mocks__/data_view'; +import { getDiscoverStateMock } from '../../../../__mocks__/discover_state.mock'; const Context = ({ children }: { children: ReactNode }) => <>{children}; -const mount = (dataView = dataViewMock) => - mountWithIntl( +const mount = (dataView = dataViewMock) => { + const stateContainer = getDiscoverStateMock({ isTimeBased: true }); + stateContainer.actions.setDataView(dataView); + return mountWithIntl( ); +}; describe('OpenAlertsPopover', () => { it('should render with the create search threshold rule button disabled if the data view has no time field', () => { diff --git a/src/plugins/discover/public/application/main/components/top_nav/open_alerts_popover.tsx b/src/plugins/discover/public/application/main/components/top_nav/open_alerts_popover.tsx index 05eac2fb933b5..f722bc5558bee 100644 --- a/src/plugins/discover/public/application/main/components/top_nav/open_alerts_popover.tsx +++ b/src/plugins/discover/public/application/main/components/top_nav/open_alerts_popover.tsx @@ -12,10 +12,10 @@ import type { Observable } from 'rxjs'; import type { CoreTheme, I18nStart } from '@kbn/core/public'; import { EuiWrappingPopover, EuiContextMenu } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; -import type { DataView, ISearchSource } from '@kbn/data-plugin/common'; +import type { DataView } from '@kbn/data-plugin/common'; import { KibanaContextProvider, KibanaThemeProvider } from '@kbn/kibana-react-plugin/public'; +import { DiscoverStateContainer } from '../../services/discover_state'; import { DiscoverServices } from '../../../../build_services'; -import { updateSearchSource } from '../../utils/update_search_source'; const container = document.createElement('div'); let isOpen = false; @@ -25,12 +25,11 @@ const ALERT_TYPE_ID = '.es-query'; interface AlertsPopoverProps { onClose: () => void; anchorElement: HTMLElement; - searchSource: ISearchSource; + stateContainer: DiscoverStateContainer; savedQueryId?: string; adHocDataViews: DataView[]; I18nContext: I18nStart['Context']; services: DiscoverServices; - updateDataViewList: (dataViews: DataView[]) => void; } interface EsQueryAlertMetaData { @@ -39,15 +38,13 @@ interface EsQueryAlertMetaData { } export function AlertsPopover({ - searchSource, anchorElement, - savedQueryId, adHocDataViews, services, + stateContainer, onClose: originalOnClose, - updateDataViewList, }: AlertsPopoverProps) { - const dataView = searchSource.getField('index')!; + const dataView = stateContainer.internalState.getState().dataView; const { triggersActionsUi } = services; const [alertFlyoutVisible, setAlertFlyoutVisibility] = useState(false); const onClose = useCallback(() => { @@ -59,20 +56,15 @@ export function AlertsPopover({ * Provides the default parameters used to initialize the new rule */ const getParams = useCallback(() => { - const nextSearchSource = searchSource.createCopy(); - updateSearchSource(nextSearchSource, true, { - dataView: searchSource.getField('index')!, - services, - sort: [], - useNewFieldsApi: true, - }); - + const savedQueryId = stateContainer.appState.getState().savedQuery; return { searchType: 'searchSource', - searchConfiguration: nextSearchSource.getSerializedFields(), + searchConfiguration: stateContainer.savedSearchState + .getState() + .searchSource.getSerializedFields(), savedQueryId, }; - }, [savedQueryId, searchSource, services]); + }, [stateContainer]); const discoverMetadata: EsQueryAlertMetaData = useMemo( () => ({ @@ -87,8 +79,9 @@ export function AlertsPopover({ return; } - const onFinishFlyoutInteraction = (metadata: EsQueryAlertMetaData) => { - updateDataViewList(metadata.adHocDataViewList); + const onFinishFlyoutInteraction = async (metadata: EsQueryAlertMetaData) => { + await stateContainer.actions.loadDataViewList(); + stateContainer.internalState.transitions.setAdHocDataViews(metadata.adHocDataViewList); }; return triggersActionsUi?.getAddRuleFlyout({ @@ -105,16 +98,9 @@ export function AlertsPopover({ ruleTypeId: ALERT_TYPE_ID, initialValues: { params: getParams() }, }); - }, [ - alertFlyoutVisible, - triggersActionsUi, - discoverMetadata, - getParams, - updateDataViewList, - onClose, - ]); - - const hasTimeFieldName = dataView.timeFieldName; + }, [alertFlyoutVisible, triggersActionsUi, discoverMetadata, getParams, onClose, stateContainer]); + + const hasTimeFieldName = Boolean(dataView?.timeFieldName); const panels = [ { id: 'mainPanel', @@ -180,20 +166,16 @@ export function openAlertsPopover({ I18nContext, theme$, anchorElement, - searchSource, + stateContainer, services, adHocDataViews, - savedQueryId, - updateDataViewList, }: { I18nContext: I18nStart['Context']; theme$: Observable; anchorElement: HTMLElement; - searchSource: ISearchSource; + stateContainer: DiscoverStateContainer; services: DiscoverServices; adHocDataViews: DataView[]; - savedQueryId?: string; - updateDataViewList: (dataViews: DataView[]) => void; }) { if (isOpen) { closeAlertsPopover(); @@ -210,12 +192,10 @@ export function openAlertsPopover({ diff --git a/src/plugins/discover/public/application/main/discover_main_app.test.tsx b/src/plugins/discover/public/application/main/discover_main_app.test.tsx index f3cc7f9cee43d..5f28befee9301 100644 --- a/src/plugins/discover/public/application/main/discover_main_app.test.tsx +++ b/src/plugins/discover/public/application/main/discover_main_app.test.tsx @@ -12,7 +12,6 @@ import { DataViewListItem } from '@kbn/data-views-plugin/public'; import { dataViewMock } from '../../__mocks__/data_view'; import { DiscoverMainApp } from './discover_main_app'; import { DiscoverTopNav } from './components/top_nav/discover_topnav'; -import { savedSearchMock } from '../../__mocks__/saved_search'; import { setHeaderActionMenuMounter, setUrlTracker } from '../../kibana_services'; import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; import { discoverServiceMock } from '../../__mocks__/services'; @@ -36,9 +35,9 @@ describe('DiscoverMainApp', () => { }) as unknown as DataViewListItem[]; const stateContainer = getDiscoverStateMock({ isTimeBased: true }); stateContainer.actions.setDataView(dataViewMock); + stateContainer.internalState.transitions.setSavedDataViews(dataViewList); const props = { - dataViewList, - savedSearch: savedSearchMock, + stateContainer, }; const history = createMemoryHistory({ initialEntries: ['/'], @@ -60,7 +59,6 @@ describe('DiscoverMainApp', () => { await component.update(); expect(component.find(DiscoverTopNav).exists()).toBe(true); - expect(component.find(DiscoverTopNav).prop('savedSearch')).toEqual(savedSearchMock); }); }); }); diff --git a/src/plugins/discover/public/application/main/discover_main_app.tsx b/src/plugins/discover/public/application/main/discover_main_app.tsx index 047cca9f33d57..a2d40a7c2e2c0 100644 --- a/src/plugins/discover/public/application/main/discover_main_app.tsx +++ b/src/plugins/discover/public/application/main/discover_main_app.tsx @@ -5,119 +5,92 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ -import React, { useCallback, useEffect } from 'react'; + +import React, { useEffect } from 'react'; import { RootDragDropProvider } from '@kbn/dom-drag-drop'; -import { useHistory } from 'react-router-dom'; -import { SavedSearch } from '@kbn/saved-search-plugin/public'; -import { DataViewListItem } from '@kbn/data-views-plugin/public'; +import { useUrlTracking } from './hooks/use_url_tracking'; +import { useSearchSession } from './hooks/use_search_session'; +import { DiscoverStateContainer } from './services/discover_state'; import { DiscoverLayout } from './components/layout'; import { setBreadcrumbsTitle } from '../../utils/breadcrumbs'; import { addHelpMenuToAppChrome } from '../../components/help_menu/help_menu_util'; -import { useDiscoverState } from './hooks/use_discover_state'; -import { useUrl } from './hooks/use_url'; import { useDiscoverServices } from '../../hooks/use_discover_services'; import { useSavedSearchAliasMatchRedirect } from '../../hooks/saved_search_alias_match_redirect'; -import { DiscoverMainProvider } from './services/discover_state_provider'; +import { useSavedSearchInitial } from './services/discover_state_provider'; +import { useAdHocDataViews } from './hooks/use_adhoc_data_views'; +import { useTextBasedQueryLanguage } from './hooks/use_text_based_query_language'; const DiscoverLayoutMemoized = React.memo(DiscoverLayout); export interface DiscoverMainProps { /** - * List of available data views - */ - dataViewList: DataViewListItem[]; - /** - * Current instance of SavedSearch + * Central state container */ - savedSearch: SavedSearch; + stateContainer: DiscoverStateContainer; } export function DiscoverMainApp(props: DiscoverMainProps) { - const { savedSearch, dataViewList } = props; + const { stateContainer } = props; + const savedSearch = useSavedSearchInitial(); const services = useDiscoverServices(); const { chrome, docLinks, data, spaces, history } = services; - const usedHistory = useHistory(); - const navigateTo = useCallback( - (path: string) => { - usedHistory.push(path); - }, - [usedHistory] - ); + + useUrlTracking(stateContainer.savedSearchState); + + /** + * Search session logic + */ + useSearchSession({ services, stateContainer }); /** - * State related logic + * Adhoc data views functionality */ - const { - inspectorAdapters, - onChangeDataView, - onUpdateQuery, - persistDataView, - updateAdHocDataViewId, - resetSavedSearch, - searchSource, + const { persistDataView } = useAdHocDataViews({ stateContainer, - updateDataViewList, - } = useDiscoverState({ services, - history: usedHistory, - savedSearch, }); /** - * Url / Routing logic + * State changes (data view, columns), when a text base query result is returned + */ + useTextBasedQueryLanguage({ + dataViews: services.dataViews, + stateContainer, + }); + /** + * Start state syncing and fetch data if necessary */ - useUrl({ history: usedHistory, resetSavedSearch }); + useEffect(() => { + const unsubscribe = stateContainer.actions.initializeAndSync(); + stateContainer.actions.fetchData(true); + return () => unsubscribe(); + }, [stateContainer]); /** - * SavedSearch depended initializing + * SavedSearch dependend initializing */ useEffect(() => { const pageTitleSuffix = savedSearch.id && savedSearch.title ? `: ${savedSearch.title}` : ''; chrome.docTitle.change(`Discover${pageTitleSuffix}`); - setBreadcrumbsTitle(savedSearch, chrome); - return () => { - data.search.session.clear(); - }; - }, [savedSearch, chrome, data]); + setBreadcrumbsTitle({ title: savedSearch.title, services }); + }, [savedSearch.id, savedSearch.title, chrome, data, services]); - /** - * Initializing syncing with state and help menu - */ useEffect(() => { addHelpMenuToAppChrome(chrome, docLinks); - }, [stateContainer, chrome, docLinks]); + }, [chrome, docLinks]); - /** - * Set initial data view list - * Can be removed once the state container work was completed - */ useEffect(() => { - stateContainer.internalState.transitions.setSavedDataViews(dataViewList); - }, [stateContainer, dataViewList]); - - const resetCurrentSavedSearch = useCallback(() => { - resetSavedSearch(savedSearch.id); - }, [resetSavedSearch, savedSearch]); + return () => { + // clear session when navigating away from discover main + data.search.session.clear(); + }; + }, [data.search.session]); useSavedSearchAliasMatchRedirect({ savedSearch, spaces, history }); return ( - - - - - + + + ); } diff --git a/src/plugins/discover/public/application/main/discover_main_route.test.tsx b/src/plugins/discover/public/application/main/discover_main_route.test.tsx index ae3034896c268..b9ff72ec3baae 100644 --- a/src/plugins/discover/public/application/main/discover_main_route.test.tsx +++ b/src/plugins/discover/public/application/main/discover_main_route.test.tsx @@ -13,12 +13,7 @@ import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; import { discoverServiceMock } from '../../__mocks__/services'; import { DiscoverMainRoute } from './discover_main_route'; import { MemoryRouter } from 'react-router-dom'; -import { dataViewMock } from '../../__mocks__/data_view'; -import { SavedObject } from '@kbn/core/public'; -import { DataViewSavedObjectAttrs } from '@kbn/data-views-plugin/common'; import { DiscoverMainApp } from './discover_main_app'; -import { SearchSource } from '@kbn/data-plugin/common'; -import { searchSourceInstanceMock } from '@kbn/data-plugin/common/search/search_source/mocks'; import { findTestSubject } from '@elastic/eui/lib/test'; import { scopedHistoryMock } from '@kbn/core/public/mocks'; jest.mock('./discover_main_app', () => { @@ -80,27 +75,11 @@ const mountComponent = (hasESData = true, hasUserDataView = true) => { }; function getServicesMock(hasESData = true, hasUserDataView = true) { const dataViewsMock = discoverServiceMock.data.dataViews; - dataViewsMock.getCache = jest.fn(() => { - return Promise.resolve([dataViewMock as unknown as SavedObject]); - }); - dataViewsMock.get = jest.fn(() => Promise.resolve(dataViewMock)); - dataViewsMock.getDefaultDataView = jest.fn(() => Promise.resolve(dataViewMock)); dataViewsMock.hasData = { hasESData: jest.fn(() => Promise.resolve(hasESData)), hasUserDataView: jest.fn(() => Promise.resolve(hasUserDataView)), hasDataView: jest.fn(() => Promise.resolve(true)), }; - dataViewsMock.refreshFields = jest.fn(); - - discoverServiceMock.data.search.searchSource.createEmpty = jest.fn(() => { - const fields: Record = {}; - const empty = { - ...searchSourceInstanceMock, - setField: (key: string, value: unknown) => (fields[key] = value), - getField: (key: string) => fields[key], - }; - return empty as unknown as SearchSource; - }); return discoverServiceMock; } diff --git a/src/plugins/discover/public/application/main/discover_main_route.tsx b/src/plugins/discover/public/application/main/discover_main_route.tsx index 54e90c01b24f3..492cbc9ba745d 100644 --- a/src/plugins/discover/public/application/main/discover_main_route.tsx +++ b/src/plugins/discover/public/application/main/discover_main_route.tsx @@ -7,32 +7,32 @@ */ import React, { useEffect, useState, memo, useCallback, useMemo } from 'react'; import { useParams, useHistory } from 'react-router-dom'; -import { DataViewListItem } from '@kbn/data-plugin/public'; -import { isOfAggregateQueryType } from '@kbn/es-query'; -import { DataViewSavedObjectConflictError, type DataView } from '@kbn/data-views-plugin/public'; -import { redirectWhenMissing } from '@kbn/kibana-utils-plugin/public'; +import type { DataView } from '@kbn/data-views-plugin/public'; +import { redirectWhenMissing, SavedObjectNotFound } from '@kbn/kibana-utils-plugin/public'; import { useExecutionContext } from '@kbn/kibana-react-plugin/public'; import { AnalyticsNoDataPageKibanaProvider, AnalyticsNoDataPage, } from '@kbn/shared-ux-page-analytics-no-data'; -import { - SavedSearch, - getSavedSearch, - getSavedSearchFullPathUrl, -} from '@kbn/saved-search-plugin/public'; +import { getSavedSearchFullPathUrl } from '@kbn/saved-search-plugin/public'; import useObservable from 'react-use/lib/useObservable'; +import { useUrl } from './hooks/use_url'; +import { useSingleton } from './hooks/use_singleton'; import { MainHistoryLocationState } from '../../../common/locator'; -import { getDiscoverStateContainer } from './services/discover_state'; -import { loadDataView, resolveDataView } from './utils/resolve_data_view'; +import { DiscoverStateContainer, getDiscoverStateContainer } from './services/discover_state'; import { DiscoverMainApp } from './discover_main_app'; import { getRootBreadcrumbs, getSavedSearchBreadcrumbs } from '../../utils/breadcrumbs'; import { LoadingIndicator } from '../../components/common/loading_indicator'; import { DiscoverError } from '../../components/common/error_alert'; import { useDiscoverServices } from '../../hooks/use_discover_services'; import { getScopedHistory, getUrlTracker } from '../../kibana_services'; -import { restoreStateFromSavedSearch } from '../../services/saved_searches/restore_from_saved_search'; import { useAlertResultsToast } from './hooks/use_alert_results_toast'; +import { DiscoverMainProvider } from './services/discover_state_provider'; +import { + DiscoverCustomizationProvider, + useDiscoverCustomizationService, +} from '../../customizations/customization_provider'; +import type { CustomizationCallback } from '../../customizations/types'; const DiscoverMainAppMemoized = memo(DiscoverMainApp); @@ -40,32 +40,39 @@ interface DiscoverLandingParams { id: string; } -interface Props { +export interface MainRouteProps { + customizationCallbacks: CustomizationCallback[]; isDev: boolean; } -export function DiscoverMainRoute(props: Props) { +export function DiscoverMainRoute({ customizationCallbacks, isDev }: MainRouteProps) { const history = useHistory(); const services = useDiscoverServices(); - const { isDev } = props; const { core, chrome, - uiSettings: config, data, toastNotifications, http: { basePath }, dataViewEditor, } = services; + const { id: savedSearchId } = useParams(); + const stateContainer = useSingleton(() => + getDiscoverStateContainer({ + history, + services, + }) + ); + const customizationService = useDiscoverCustomizationService({ + customizationCallbacks, + stateContainer, + }); const [error, setError] = useState(); const [loading, setLoading] = useState(true); - const [savedSearch, setSavedSearch] = useState(); - const [dataViewList, setDataViewList] = useState([]); const [hasESData, setHasESData] = useState(false); const [hasUserDataView, setHasUserDataView] = useState(false); const [showNoDataPage, setShowNoDataPage] = useState(false); const hasCustomBranding = useObservable(core.customBranding.hasCustomBranding$, false); - const { id } = useParams(); /** * Get location state of scoped history only on initial load @@ -83,118 +90,77 @@ export function DiscoverMainRoute(props: Props) { useExecutionContext(core.executionContext, { type: 'application', page: 'app', - id: id || 'new', + id: savedSearchId || 'new', }); - const loadDefaultOrCurrentDataView = useCallback( - async (nextSavedSearch: SavedSearch) => { - try { - const hasUserDataViewValue = await data.dataViews.hasData - .hasUserDataView() - .catch(() => false); - const hasESDataValue = - isDev || (await data.dataViews.hasData.hasESData().catch(() => false)); - setHasUserDataView(hasUserDataViewValue); - setHasESData(hasESDataValue); + const checkData = useCallback(async () => { + try { + const hasUserDataViewValue = await data.dataViews.hasData + .hasUserDataView() + .catch(() => false); + const hasESDataValue = isDev || (await data.dataViews.hasData.hasESData().catch(() => false)); + setHasUserDataView(hasUserDataViewValue); + setHasESData(hasESDataValue); - if (!hasUserDataViewValue) { - setShowNoDataPage(true); - return; - } - - let defaultDataView: DataView | null = null; - try { - defaultDataView = await data.dataViews.getDefaultDataView({ displayErrors: false }); - } catch (e) { - // - } - - if (!defaultDataView) { - setShowNoDataPage(true); - return; - } - - const { appState } = getDiscoverStateContainer({ - history, - savedSearch: nextSavedSearch, - services, - }); - const { index, query } = appState.getState(); - const ip = await loadDataView( - data.dataViews, - config, - index, - historyLocationState?.dataViewSpec - ); - - const ipList = ip.list; - const isTextBasedQuery = query && isOfAggregateQueryType(query); - const dataViewData = resolveDataView( - ip, - nextSavedSearch.searchSource, - toastNotifications, - isTextBasedQuery - ); - setDataViewList(ipList); + if (!hasUserDataViewValue) { + setShowNoDataPage(true); + return false; + } - return dataViewData; + let defaultDataView: DataView | null = null; + try { + defaultDataView = await data.dataViews.getDefaultDataView({ displayErrors: false }); } catch (e) { - setError(e); + // } - }, - [ - config, - data.dataViews, - history, - isDev, - historyLocationState?.dataViewSpec, - toastNotifications, - services, - ] - ); + + if (!defaultDataView) { + setShowNoDataPage(true); + return false; + } + return true; + } catch (e) { + setError(e); + return false; + } + }, [data.dataViews, isDev]); const loadSavedSearch = useCallback( async (nextDataView?: DataView) => { + setLoading(true); + if (!nextDataView && !(await checkData())) { + setLoading(false); + return; + } try { - setLoading(true); - const currentSavedSearch = await getSavedSearch(id, { - search: services.data.search, - savedObjectsClient: core.savedObjects.client, - spaces: services.spaces, - savedObjectsTagging: services.savedObjectsTagging, - }); - - const currentDataView = nextDataView - ? nextDataView - : await loadDefaultOrCurrentDataView(currentSavedSearch); - - if (!currentDataView) { - return; - } - - if (!currentSavedSearch.searchSource.getField('index')) { - currentSavedSearch.searchSource.setField('index', currentDataView); - } - - restoreStateFromSavedSearch({ - savedSearch: currentSavedSearch, - timefilter: services.timefilter, + await stateContainer.actions.loadDataViewList(); + // reset appState in case a saved search with id is loaded and the url is empty + // so the saved search is loaded in a clean state + // else it might be updated by the previous app state + const useAppState = !stateContainer.appState.isEmptyURL(); + const currentSavedSearch = await stateContainer.actions.loadSavedSearch({ + savedSearchId, + dataView: nextDataView, + dataViewSpec: historyLocationState?.dataViewSpec, + useAppState, }); - - setSavedSearch(currentSavedSearch); - - if (currentSavedSearch.id) { + if (currentSavedSearch?.id) { chrome.recentlyAccessed.add( getSavedSearchFullPathUrl(currentSavedSearch.id), currentSavedSearch.title ?? '', currentSavedSearch.id ); } + + chrome.setBreadcrumbs( + currentSavedSearch && currentSavedSearch.title + ? getSavedSearchBreadcrumbs({ id: currentSavedSearch.title, services }) + : getRootBreadcrumbs({ services }) + ); + setLoading(false); } catch (e) { - if (e instanceof DataViewSavedObjectConflictError) { - setError(e); - } else { + if (e instanceof SavedObjectNotFound) { redirectWhenMissing({ history, navigateToApp: core.application.navigateToApp, @@ -203,7 +169,7 @@ export function DiscoverMainRoute(props: Props) { search: '/', 'index-pattern': { app: 'management', - path: `kibana/objects/savedSearches/${id}`, + path: `kibana/objects/savedSearches/${savedSearchId}`, }, }, toastNotifications, @@ -212,21 +178,21 @@ export function DiscoverMainRoute(props: Props) { }, theme: core.theme, })(e); + } else { + setError(e); } } }, [ - id, - services.data, - services.spaces, - services.timefilter, - services.savedObjectsTagging, - core.savedObjects.client, + checkData, + stateContainer, + savedSearchId, + historyLocationState?.dataViewSpec, + chrome, + services, + history, core.application.navigateToApp, core.theme, - loadDefaultOrCurrentDataView, - chrome.recentlyAccessed, - history, basePath, toastNotifications, ] @@ -244,17 +210,22 @@ export function DiscoverMainRoute(props: Props) { [loadSavedSearch] ); + // primary fetch: on initial search + triggered when id changes useEffect(() => { - loadSavedSearch(); - }, [loadSavedSearch]); + // restore the previously selected data view for a new state + loadSavedSearch(!savedSearchId ? stateContainer.internalState.getState().dataView : undefined); + }, [loadSavedSearch, savedSearchId, stateContainer]); - useEffect(() => { - chrome.setBreadcrumbs( - savedSearch && savedSearch.title - ? getSavedSearchBreadcrumbs(savedSearch.title) - : getRootBreadcrumbs() - ); - }, [chrome, savedSearch]); + // secondary fetch: in case URL is set to `/`, used to reset to 'new' state, keeping the current data view + useUrl({ + history, + savedSearchId, + onNewUrl: () => { + // restore the previously selected data view for a new state + const dataView = stateContainer.internalState.getState().dataView; + loadSavedSearch(dataView); + }, + }); if (showNoDataPage) { const analyticsServices = { @@ -284,9 +255,15 @@ export function DiscoverMainRoute(props: Props) { return ; } - if (loading || !savedSearch) { + if (loading || !customizationService) { return ; } - return ; + return ( + + + + + + ); } diff --git a/src/plugins/discover/public/application/main/hooks/use_adhoc_data_views.test.tsx b/src/plugins/discover/public/application/main/hooks/use_adhoc_data_views.test.tsx index 770373f74825f..09c5c9f1d2d31 100644 --- a/src/plugins/discover/public/application/main/hooks/use_adhoc_data_views.test.tsx +++ b/src/plugins/discover/public/application/main/hooks/use_adhoc_data_views.test.tsx @@ -7,16 +7,15 @@ */ import React from 'react'; -import { createSearchSourceMock } from '@kbn/data-plugin/public/mocks'; import type { DataView } from '@kbn/data-views-plugin/public'; -import { act, renderHook } from '@testing-library/react-hooks'; -import { discoverServiceMock as mockDiscoverServices } from '../../../__mocks__/services'; +import { renderHook } from '@testing-library/react-hooks'; import { useAdHocDataViews } from './use_adhoc_data_views'; import * as persistencePromptModule from '../../../hooks/use_confirm_persistence_prompt'; import { urlTrackerMock } from '../../../__mocks__/url_tracker.mock'; import { setUrlTracker } from '../../../kibana_services'; import { getDiscoverStateMock } from '../../../__mocks__/discover_state.mock'; import { DiscoverMainProvider } from '../services/discover_state_provider'; +import { discoverServiceMock } from '../../../__mocks__/services'; jest.mock('../../../hooks/use_confirm_persistence_prompt', () => { const createdDataView = { @@ -65,27 +64,21 @@ const mockDataView = { isPersisted: () => false, getName: () => 'mock-data-view', toSpec: () => ({}), + isTimeBased: () => true, } as DataView; -const savedSearchMock = { - id: 'some-id', - searchSource: createSearchSourceMock({ index: mockDataView }), -}; - describe('useAdHocDataViews', () => { it('should save data view with new id and update saved search', async () => { - const stateContainer = getDiscoverStateMock({ isTimeBased: true }); + const stateContainer = getDiscoverStateMock({ + isTimeBased: true, + }); + stateContainer.actions.setDataView(mockDataView); const hook = renderHook( () => useAdHocDataViews({ - dataView: mockDataView, - savedSearch: savedSearchMock, stateContainer, - setUrlTracking: jest.fn(), - dataViews: mockDiscoverServices.dataViews, - filterManager: mockDiscoverServices.filterManager, - toastNotifications: mockDiscoverServices.toastNotifications, + services: discoverServiceMock, }), { wrapper: ({ children }: { children: React.ReactElement }) => ( @@ -101,38 +94,4 @@ describe('useAdHocDataViews', () => { expect(updateSavedSearchCall[0].dataView.id).toEqual('updated-mock-id'); expect(savedDataView!.id).toEqual('updated-mock-id'); }); - - it('should update id of adhoc data view correctly', async () => { - const dataViewsCreateMock = mockDiscoverServices.dataViews.create as jest.Mock; - dataViewsCreateMock.mockImplementation(() => ({ - ...mockDataView, - id: 'updated-mock-id', - })); - const stateContainer = getDiscoverStateMock({ isTimeBased: true }); - const hook = renderHook( - () => - useAdHocDataViews({ - dataView: mockDataView, - savedSearch: savedSearchMock, - stateContainer: getDiscoverStateMock({ isTimeBased: true }), - setUrlTracking: jest.fn(), - dataViews: mockDiscoverServices.dataViews, - filterManager: mockDiscoverServices.filterManager, - toastNotifications: mockDiscoverServices.toastNotifications, - }), - { - wrapper: ({ children }: { children: React.ReactElement }) => ( - {children} - ), - } - ); - - let updatedDataView: DataView; - await act(async () => { - updatedDataView = await hook.result.current.updateAdHocDataViewId(mockDataView); - }); - - expect(mockDiscoverServices.dataViews.clearInstanceCache).toHaveBeenCalledWith(mockDataView.id); - expect(updatedDataView!.id).toEqual('updated-mock-id'); - }); }); diff --git a/src/plugins/discover/public/application/main/hooks/use_adhoc_data_views.ts b/src/plugins/discover/public/application/main/hooks/use_adhoc_data_views.ts index 31e96f01a2b74..646861efdf255 100644 --- a/src/plugins/discover/public/application/main/hooks/use_adhoc_data_views.ts +++ b/src/plugins/discover/public/application/main/hooks/use_adhoc_data_views.ts @@ -7,80 +7,51 @@ */ import { useCallback, useEffect } from 'react'; -import { v4 as uuidv4 } from 'uuid'; -import type { DataView, DataViewsContract } from '@kbn/data-views-plugin/public'; -import { SavedSearch } from '@kbn/saved-search-plugin/public'; -import type { FilterManager } from '@kbn/data-plugin/public'; -import type { ToastsStart } from '@kbn/core-notifications-browser'; import { METRIC_TYPE } from '@kbn/analytics'; +import { DiscoverServices } from '../../../build_services'; +import { useSavedSearch } from '../services/discover_state_provider'; +import { isTextBasedQuery } from '../utils/is_text_based_query'; +import { useAppStateSelector } from '../services/discover_app_state_container'; +import { useInternalStateSelector } from '../services/discover_internal_state_container'; import { ADHOC_DATA_VIEW_RENDER_EVENT } from '../../../constants'; import { useConfirmPersistencePrompt } from '../../../hooks/use_confirm_persistence_prompt'; import { DiscoverStateContainer } from '../services/discover_state'; import { useFiltersValidation } from './use_filters_validation'; -import { updateFiltersReferences } from '../utils/update_filter_references'; export const useAdHocDataViews = ({ - dataView, - savedSearch, stateContainer, - setUrlTracking, - filterManager, - dataViews, - toastNotifications, - trackUiMetric, - isTextBasedMode, + services, }: { - dataView: DataView; - savedSearch: SavedSearch; stateContainer: DiscoverStateContainer; - setUrlTracking: (dataView: DataView) => void; - dataViews: DataViewsContract; - filterManager: FilterManager; - toastNotifications: ToastsStart; - trackUiMetric?: (metricType: string, eventName: string | string[], count?: number) => void; - isTextBasedMode?: boolean; + services: DiscoverServices; }) => { + const query = useAppStateSelector((state) => state.query); + const dataView = useInternalStateSelector((state) => state.dataView); + const savedSearch = useSavedSearch(); + const isTextBasedMode = isTextBasedQuery(query); + const { filterManager, toastNotifications } = services; + useEffect(() => { - if (!dataView.isPersisted()) { - trackUiMetric?.(METRIC_TYPE.COUNT, ADHOC_DATA_VIEW_RENDER_EVENT); + if (dataView && !dataView.isPersisted()) { + services.trackUiMetric?.(METRIC_TYPE.COUNT, ADHOC_DATA_VIEW_RENDER_EVENT); } - }, [dataView, isTextBasedMode, trackUiMetric]); + }, [dataView, isTextBasedMode, services]); /** * Takes care of checking data view id references in filters */ useFiltersValidation({ savedSearch, filterManager, toastNotifications }); - /** - * When saving a saved search with an ad hoc data view, a new id needs to be generated for the data view - * This is to prevent duplicate ids messing with our system - */ - const updateAdHocDataViewId = useCallback( - async (prevDataView: DataView) => { - const newDataView = await dataViews.create({ ...prevDataView.toSpec(), id: uuidv4() }); - dataViews.clearInstanceCache(prevDataView.id); - - updateFiltersReferences(prevDataView, newDataView); - - stateContainer.actions.replaceAdHocDataViewWithId(prevDataView.id!, newDataView); - await stateContainer.appState.update({ index: newDataView.id }, true); - - setUrlTracking(newDataView); - return newDataView; - }, - [dataViews, setUrlTracking, stateContainer] - ); - const { openConfirmSavePrompt, updateSavedSearch } = useConfirmPersistencePrompt(stateContainer); const persistDataView = useCallback(async () => { - const currentDataView = savedSearch.searchSource.getField('index')!; + const currentDataView = stateContainer.internalState.getState().dataView; if (!currentDataView || currentDataView.isPersisted()) { return currentDataView; } const createdDataView = await openConfirmSavePrompt(currentDataView); if (!createdDataView) { - return currentDataView; // persistance cancelled + return; // persistance cancelled } if (savedSearch.id) { @@ -90,7 +61,7 @@ export const useAdHocDataViews = ({ } return createdDataView; - }, [stateContainer, openConfirmSavePrompt, savedSearch, updateSavedSearch]); + }, [stateContainer, openConfirmSavePrompt, updateSavedSearch, savedSearch]); - return { persistDataView, updateAdHocDataViewId }; + return { persistDataView }; }; diff --git a/src/plugins/discover/public/application/main/hooks/use_discover_state.test.tsx b/src/plugins/discover/public/application/main/hooks/use_discover_state.test.tsx deleted file mode 100644 index c590722d98bac..0000000000000 --- a/src/plugins/discover/public/application/main/hooks/use_discover_state.test.tsx +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ -import React from 'react'; -import { renderHook } from '@testing-library/react-hooks'; -import { SearchSource } from '@kbn/data-plugin/public'; -import { createSearchSessionMock } from '../../../__mocks__/search_session'; -import { discoverServiceMock } from '../../../__mocks__/services'; -import { savedSearchMock } from '../../../__mocks__/saved_search'; -import { useDiscoverState } from './use_discover_state'; -import { setUrlTracker } from '../../../kibana_services'; -import { urlTrackerMock } from '../../../__mocks__/url_tracker.mock'; -import { DiscoverMainProvider } from '../services/discover_state_provider'; -import { getDiscoverStateMock } from '../../../__mocks__/discover_state.mock'; -setUrlTracker(urlTrackerMock); - -describe('test useDiscoverState', () => { - test('return is valid', async () => { - const { history } = createSearchSessionMock(); - const stateContainer = getDiscoverStateMock({ isTimeBased: true }); - - const { result } = renderHook( - () => { - return useDiscoverState({ - services: discoverServiceMock, - history, - savedSearch: savedSearchMock, - }); - }, - { - wrapper: ({ children }: { children: React.ReactElement }) => ( - {children} - ), - } - ); - expect(result.current.stateContainer).toBeInstanceOf(Object); - expect(result.current.searchSource).toBeInstanceOf(SearchSource); - }); -}); diff --git a/src/plugins/discover/public/application/main/hooks/use_discover_state.ts b/src/plugins/discover/public/application/main/hooks/use_discover_state.ts deleted file mode 100644 index 00d30e74fadbc..0000000000000 --- a/src/plugins/discover/public/application/main/hooks/use_discover_state.ts +++ /dev/null @@ -1,228 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ -import { useMemo, useEffect, useState, useCallback } from 'react'; -import { History } from 'history'; -import { isOfAggregateQueryType } from '@kbn/es-query'; -import { type DataView, DataViewType } from '@kbn/data-views-plugin/public'; -import { SavedSearch, getSavedSearch } from '@kbn/saved-search-plugin/public'; -import { buildStateSubscribe } from './utils/build_state_subscribe'; -import { changeDataView } from './utils/change_data_view'; -import { useSearchSession } from './use_search_session'; -import { FetchStatus } from '../../types'; -import { useTextBasedQueryLanguage } from './use_text_based_query_language'; -import { useUrlTracking } from './use_url_tracking'; -import { getDiscoverStateContainer } from '../services/discover_state'; -import { getStateDefaults } from '../utils/get_state_defaults'; -import { DiscoverServices } from '../../../build_services'; -import { restoreStateFromSavedSearch } from '../../../services/saved_searches/restore_from_saved_search'; -import { useAdHocDataViews } from './use_adhoc_data_views'; - -export function useDiscoverState({ - services, - history, - savedSearch, -}: { - services: DiscoverServices; - savedSearch: SavedSearch; - history: History; -}) { - const { data, filterManager, dataViews, toastNotifications, trackUiMetric } = services; - - const dataView = savedSearch.searchSource.getField('index')!; - - const searchSource = useMemo(() => { - savedSearch.searchSource.setField('index', dataView); - return savedSearch.searchSource.createChild(); - }, [savedSearch, dataView]); - - const stateContainer = useMemo(() => { - const container = getDiscoverStateContainer({ - history, - savedSearch, - services, - }); - const nextDataView = savedSearch.searchSource.getField('index')!; - container.actions.setDataView(nextDataView); - if (!nextDataView.isPersisted()) { - container.actions.appendAdHocDataViews(nextDataView); - } - return container; - }, [history, savedSearch, services]); - - const { setUrlTracking } = useUrlTracking(savedSearch, dataView); - - const { appState, searchSessionManager } = stateContainer; - - const [state, setState] = useState(appState.getState()); - - /** - * Search session logic - */ - useSearchSession({ services, stateContainer, savedSearch }); - - /** - * Adhoc data views functionality - */ - const isTextBasedMode = state?.query && isOfAggregateQueryType(state?.query); - const { persistDataView, updateAdHocDataViewId } = useAdHocDataViews({ - dataView, - dataViews, - stateContainer, - savedSearch, - setUrlTracking, - filterManager, - toastNotifications, - trackUiMetric, - isTextBasedMode, - }); - - /** - * Updates data views selector state - */ - const updateDataViewList = useCallback( - async (newAdHocDataViews: DataView[]) => { - await stateContainer.actions.loadDataViewList(); - stateContainer.actions.setAdHocDataViews(newAdHocDataViews); - }, - [stateContainer.actions] - ); - - /** - * Data fetching logic - */ - const { data$, refetch$, reset, inspectorAdapters, initialFetchStatus } = - stateContainer.dataState; - /** - * State changes (data view, columns), when a text base query result is returned - */ - useTextBasedQueryLanguage({ - documents$: data$.documents$, - dataViews, - stateContainer, - savedSearch, - }); - - /** - * Reset to display loading spinner when savedSearch is changing - */ - useEffect(() => reset(), [savedSearch.id, reset]); - - /** - * Sync URL state with local app state on saved search load - * or dataView / savedSearch switch - */ - useEffect(() => { - const stopSync = stateContainer.actions.initializeAndSync(dataView, filterManager, data); - setState(stateContainer.appState.getState()); - - return () => stopSync(); - }, [stateContainer, filterManager, data, dataView]); - - /** - * Data store subscribing to trigger fetching - */ - useEffect(() => { - const stopSync = stateContainer.dataState.subscribe(); - return () => stopSync(); - }, [stateContainer]); - - /** - * Track state changes that should trigger a fetch - */ - useEffect(() => { - const unsubscribe = appState.subscribe( - buildStateSubscribe({ stateContainer, savedSearch, setState }) - ); - return () => unsubscribe(); - }, [appState, savedSearch, services, stateContainer]); - - /** - * Function triggered when user changes data view in the sidebar - */ - const onChangeDataView = useCallback( - async (id: string) => { - await changeDataView(id, { services, discoverState: stateContainer, setUrlTracking }); - stateContainer.internalState.transitions.setExpandedDoc(undefined); - }, - [services, setUrlTracking, stateContainer] - ); - - /** - * function to revert any changes to a given saved search - */ - const resetSavedSearch = useCallback( - async (id?: string) => { - const newSavedSearch = await getSavedSearch(id, { - search: services.data.search, - savedObjectsClient: services.core.savedObjects.client, - spaces: services.spaces, - savedObjectsTagging: services.savedObjectsTagging, - }); - - const newDataView = newSavedSearch.searchSource.getField('index') || dataView; - newSavedSearch.searchSource.setField('index', newDataView); - const newAppState = getStateDefaults({ - savedSearch: newSavedSearch, - services, - }); - - restoreStateFromSavedSearch({ - savedSearch: newSavedSearch, - timefilter: services.timefilter, - }); - - await stateContainer.appState.update(newAppState, true); - setState(newAppState); - }, - [services, dataView, stateContainer] - ); - - /** - * Function triggered when the user changes the query in the search bar - */ - const onUpdateQuery = useCallback( - (_payload, isUpdate?: boolean) => { - if (isUpdate === false) { - searchSessionManager.removeSearchSessionIdFromURL({ replace: false }); - refetch$.next(undefined); - } - }, - [refetch$, searchSessionManager] - ); - - /** - * Trigger data fetching on dataView or savedSearch changes - */ - useEffect(() => { - if (dataView && initialFetchStatus === FetchStatus.LOADING) { - refetch$.next(undefined); - } - }, [initialFetchStatus, refetch$, dataView, savedSearch.id]); - - /** - * We need to make sure the auto refresh interval is disabled for - * non-time series data or rollups since we don't show the date picker - */ - useEffect(() => { - if (dataView && (!dataView.isTimeBased() || dataView.type === DataViewType.ROLLUP)) { - stateContainer.actions.pauseAutoRefreshInterval(); - } - }, [dataView, stateContainer]); - - return { - inspectorAdapters, - resetSavedSearch, - onChangeDataView, - onUpdateQuery, - searchSource, - stateContainer, - persistDataView, - updateAdHocDataViewId, - updateDataViewList, - }; -} diff --git a/src/plugins/discover/public/application/main/hooks/use_inspector.test.ts b/src/plugins/discover/public/application/main/hooks/use_inspector.test.ts index 7f30ef8c51b47..57e94aa7a0db1 100644 --- a/src/plugins/discover/public/application/main/hooks/use_inspector.test.ts +++ b/src/plugins/discover/public/application/main/hooks/use_inspector.test.ts @@ -8,7 +8,6 @@ import { act, renderHook } from '@testing-library/react-hooks'; import { discoverServiceMock } from '../../../__mocks__/services'; -import { savedSearchMock } from '../../../__mocks__/saved_search'; import { useInspector } from './use_inspector'; import { Adapters, RequestAdapter } from '@kbn/inspector-plugin/common'; import { OverlayRef } from '@kbn/core/public'; @@ -29,15 +28,14 @@ describe('test useInspector', () => { stateContainer.internalState.transitions.setExpandedDoc({} as unknown as DataTableRecord); const { result } = renderHook(() => { return useInspector({ - inspectorAdapters: { requests, lensRequests }, - savedSearch: savedSearchMock, - inspector: discoverServiceMock.inspector, stateContainer, + inspector: discoverServiceMock.inspector, }); }); await act(async () => { result.current(); }); + expect(discoverServiceMock.inspector.open).toHaveBeenCalled(); expect(adapters?.requests).toBeInstanceOf(AggregateRequestAdapter); expect(adapters?.requests?.getRequests()).toEqual([ diff --git a/src/plugins/discover/public/application/main/hooks/use_inspector.ts b/src/plugins/discover/public/application/main/hooks/use_inspector.ts index 2d4179801faa0..45120d524144f 100644 --- a/src/plugins/discover/public/application/main/hooks/use_inspector.ts +++ b/src/plugins/discover/public/application/main/hooks/use_inspector.ts @@ -12,7 +12,6 @@ import { RequestAdapter, Start as InspectorPublicPluginStart, } from '@kbn/inspector-plugin/public'; -import { SavedSearch } from '@kbn/saved-search-plugin/public'; import { DiscoverStateContainer } from '../services/discover_state'; import { AggregateRequestAdapter } from '../utils/aggregate_request_adapter'; @@ -24,11 +23,7 @@ export interface InspectorAdapters { export function useInspector({ inspector, stateContainer, - inspectorAdapters, - savedSearch, }: { - inspectorAdapters: InspectorAdapters; - savedSearch: SavedSearch; inspector: InspectorPublicPluginStart; stateContainer: DiscoverStateContainer; }) { @@ -37,6 +32,7 @@ export function useInspector({ const onOpenInspector = useCallback(() => { // prevent overlapping stateContainer.internalState.transitions.setExpandedDoc(undefined); + const inspectorAdapters = stateContainer.dataState.inspectorAdapters; const requestAdapters = inspectorAdapters.lensRequests ? [inspectorAdapters.requests, inspectorAdapters.lensRequests] @@ -44,17 +40,11 @@ export function useInspector({ const session = inspector.open( { requests: new AggregateRequestAdapter(requestAdapters) }, - { title: savedSearch.title } + { title: stateContainer.savedSearchState.getTitle() } ); setInspectorSession(session); - }, [ - stateContainer, - inspectorAdapters.lensRequests, - inspectorAdapters.requests, - inspector, - savedSearch.title, - ]); + }, [stateContainer, inspector]); useEffect(() => { return () => { diff --git a/src/plugins/discover/public/application/main/hooks/use_saved_search_messages.ts b/src/plugins/discover/public/application/main/hooks/use_saved_search_messages.ts index 7be14ca9c802e..060b12053c870 100644 --- a/src/plugins/discover/public/application/main/hooks/use_saved_search_messages.ts +++ b/src/plugins/discover/public/application/main/hooks/use_saved_search_messages.ts @@ -15,6 +15,7 @@ import type { DataTotalHits$, SavedSearchData, } from '../services/discover_data_state_container'; +import { RecordRawType } from '../services/discover_data_state_container'; /** * Sends COMPLETE message to the main$ observable with the information * that no documents have been found, allowing Discover to show a no @@ -86,8 +87,11 @@ export function sendErrorMsg(data$: DataMain$ | DataDocuments$ | DataTotalHits$, * Sends a RESET message to all data subjects * Needed when data view is switched or a new runtime field is added */ -export function sendResetMsg(data: SavedSearchData, initialFetchStatus: FetchStatus) { - const recordRawType = data.main$.getValue().recordRawType; +export function sendResetMsg( + data: SavedSearchData, + initialFetchStatus: FetchStatus, + recordRawType: RecordRawType +) { data.main$.next({ fetchStatus: initialFetchStatus, foundDocuments: undefined, diff --git a/src/plugins/discover/public/application/main/hooks/use_search_session.test.ts b/src/plugins/discover/public/application/main/hooks/use_search_session.test.ts index 4f483a3e01c31..0e2606c063f75 100644 --- a/src/plugins/discover/public/application/main/hooks/use_search_session.test.ts +++ b/src/plugins/discover/public/application/main/hooks/use_search_session.test.ts @@ -8,18 +8,14 @@ import { useSearchSession } from './use_search_session'; import { renderHook } from '@testing-library/react-hooks'; -import { createSearchSessionMock } from '../../../__mocks__/search_session'; import { discoverServiceMock } from '../../../__mocks__/services'; import { savedSearchMock } from '../../../__mocks__/saved_search'; -import { getDiscoverStateContainer } from '../services/discover_state'; +import { getDiscoverStateMock } from '../../../__mocks__/discover_state.mock'; describe('test useSearchSession', () => { test('getting the next session id', async () => { - const { history } = createSearchSessionMock(); - const stateContainer = getDiscoverStateContainer({ + const stateContainer = getDiscoverStateMock({ savedSearch: savedSearchMock, - history, - services: discoverServiceMock, }); const nextId = 'id'; @@ -29,7 +25,6 @@ describe('test useSearchSession', () => { return useSearchSession({ services: discoverServiceMock, stateContainer, - savedSearch: savedSearchMock, }); }); expect(stateContainer.searchSessionManager.getNextSearchSessionId()).toBe('id'); diff --git a/src/plugins/discover/public/application/main/hooks/use_search_session.ts b/src/plugins/discover/public/application/main/hooks/use_search_session.ts index 8dadbd9015f1e..dc08eb7fe0b4c 100644 --- a/src/plugins/discover/public/application/main/hooks/use_search_session.ts +++ b/src/plugins/discover/public/application/main/hooks/use_search_session.ts @@ -7,7 +7,6 @@ */ import { useEffect } from 'react'; import { noSearchSessionStorageCapabilityMessage } from '@kbn/data-plugin/public'; -import { SavedSearch } from '@kbn/saved-search-plugin/public'; import { createSearchSessionRestorationDataProvider, DiscoverStateContainer, @@ -17,11 +16,9 @@ import { DiscoverServices } from '../../../build_services'; export function useSearchSession({ services, stateContainer, - savedSearch, }: { services: DiscoverServices; stateContainer: DiscoverStateContainer; - savedSearch: SavedSearch; }) { const { data, capabilities } = services; @@ -30,7 +27,7 @@ export function useSearchSession({ createSearchSessionRestorationDataProvider({ appStateContainer: stateContainer.appState, data, - getSavedSearch: () => savedSearch, + getSavedSearch: () => stateContainer.savedSearchState.getState(), }), { isDisabled: () => @@ -42,5 +39,5 @@ export function useSearchSession({ }, } ); - }, [capabilities.discover.storeSearchSession, data, savedSearch, stateContainer.appState]); + }, [capabilities.discover.storeSearchSession, data, stateContainer]); } diff --git a/src/plugins/discover/public/application/main/hooks/use_test_based_query_language.test.ts b/src/plugins/discover/public/application/main/hooks/use_test_based_query_language.test.tsx similarity index 79% rename from src/plugins/discover/public/application/main/hooks/use_test_based_query_language.test.ts rename to src/plugins/discover/public/application/main/hooks/use_test_based_query_language.test.tsx index d512477d9f53e..edf69444ac5e3 100644 --- a/src/plugins/discover/public/application/main/hooks/use_test_based_query_language.test.ts +++ b/src/plugins/discover/public/application/main/hooks/use_test_based_query_language.test.tsx @@ -5,23 +5,24 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ - +import React from 'react'; import { renderHook } from '@testing-library/react-hooks'; import { waitFor } from '@testing-library/react'; import { DataViewsContract } from '@kbn/data-plugin/public'; import { discoverServiceMock } from '../../../__mocks__/services'; import { useTextBasedQueryLanguage } from './use_text_based_query_language'; -import { BehaviorSubject } from 'rxjs'; import { FetchStatus } from '../../types'; -import { DataDocuments$, RecordRawType } from '../services/discover_data_state_container'; -import { DiscoverAppState } from '../services/discover_app_state_container'; +import { RecordRawType } from '../services/discover_data_state_container'; import { DataTableRecord } from '../../../types'; import { AggregateQuery, Query } from '@kbn/es-query'; import { dataViewMock } from '../../../__mocks__/data_view'; import { DataViewListItem } from '@kbn/data-views-plugin/common'; import { savedSearchMock } from '../../../__mocks__/saved_search'; import { getDiscoverStateMock } from '../../../__mocks__/discover_state.mock'; -import { VIEW_MODE } from '@kbn/saved-search-plugin/common'; +import { DiscoverMainProvider } from '../services/discover_state_provider'; +import { DiscoverAppState } from '../services/discover_app_state_container'; +import { DiscoverStateContainer } from '../services/discover_state'; +import { VIEW_MODE } from '@kbn/saved-search-plugin/public'; function getHookProps( query: AggregateQuery | Query | undefined, @@ -39,11 +40,9 @@ function getHookProps( fetchStatus: FetchStatus.LOADING, query, }; - - const documents$ = new BehaviorSubject(msgLoading) as DataDocuments$; + stateContainer.dataState.data$.documents$.next(msgLoading); return { - documents$, dataViews: dataViewsService ?? discoverServiceMock.dataViews, stateContainer, savedSearch: savedSearchMock, @@ -64,19 +63,49 @@ const msgComplete = { query, }; +const getDataViewsService = () => { + const dataViewsCreateMock = discoverServiceMock.dataViews.create as jest.Mock; + dataViewsCreateMock.mockImplementation(() => ({ + ...dataViewMock, + })); + return { + ...discoverServiceMock.dataViews, + create: dataViewsCreateMock, + }; +}; + +const getHookContext = (stateContainer: DiscoverStateContainer) => { + return ({ children }: { children: JSX.Element }) => ( + {children} + ); +}; +const renderHookWithContext = ( + useDataViewsService: boolean = false, + appState?: DiscoverAppState +) => { + const props = getHookProps(query, useDataViewsService ? getDataViewsService() : undefined); + if (appState) { + props.stateContainer.appState.getState = jest.fn(() => { + return appState; + }); + } + + renderHook(() => useTextBasedQueryLanguage(props), { + wrapper: getHookContext(props.stateContainer), + }); + return props; +}; + describe('useTextBasedQueryLanguage', () => { test('a text based query should change state when loading and finished', async () => { - const props = getHookProps(query); - const { documents$, replaceUrlState } = props; - - renderHook(() => useTextBasedQueryLanguage(props)); + const { replaceUrlState, stateContainer } = renderHookWithContext(false); await waitFor(() => expect(replaceUrlState).toHaveBeenCalledTimes(1)); expect(replaceUrlState).toHaveBeenCalledWith({ index: 'the-data-view-id' }); replaceUrlState.mockReset(); - documents$.next(msgComplete); + stateContainer.dataState.data$.documents$.next(msgComplete); await waitFor(() => expect(replaceUrlState).toHaveBeenCalledTimes(1)); await waitFor(() => { @@ -87,12 +116,9 @@ describe('useTextBasedQueryLanguage', () => { }); }); test('should change viewMode to DOCUMENT_LEVEL if it was AGGREGATED_LEVEL', async () => { - const props = getHookProps(query, undefined, { + const { replaceUrlState } = renderHookWithContext(false, { viewMode: VIEW_MODE.AGGREGATED_LEVEL, }); - const { replaceUrlState } = props; - - renderHook(() => useTextBasedQueryLanguage(props)); await waitFor(() => expect(replaceUrlState).toHaveBeenCalledTimes(1)); expect(replaceUrlState).toHaveBeenCalledWith({ @@ -101,12 +127,9 @@ describe('useTextBasedQueryLanguage', () => { }); }); test('changing a text based query with different result columns should change state when loading and finished', async () => { - const props = getHookProps(query); - const { documents$, replaceUrlState } = props; - - renderHook(() => useTextBasedQueryLanguage(props)); - - documents$.next(msgComplete); + const { replaceUrlState, stateContainer } = renderHookWithContext(false); + const documents$ = stateContainer.dataState.data$.documents$; + stateContainer.dataState.data$.documents$.next(msgComplete); await waitFor(() => expect(replaceUrlState).toHaveBeenCalledTimes(2)); replaceUrlState.mockReset(); @@ -132,10 +155,9 @@ describe('useTextBasedQueryLanguage', () => { }); }); test('only changing a text based query with same result columns should not change columns', async () => { - const props = getHookProps(query); - const { documents$, replaceUrlState } = props; + const { replaceUrlState, stateContainer } = renderHookWithContext(false); - renderHook(() => useTextBasedQueryLanguage(props)); + const documents$ = stateContainer.dataState.data$.documents$; documents$.next(msgComplete); await waitFor(() => expect(replaceUrlState).toHaveBeenCalledTimes(2)); @@ -176,10 +198,8 @@ describe('useTextBasedQueryLanguage', () => { }); }); test('if its not a text based query coming along, it should be ignored', async () => { - const props = getHookProps(query); - const { documents$, replaceUrlState } = props; - - renderHook(() => useTextBasedQueryLanguage(props)); + const { replaceUrlState, stateContainer } = renderHookWithContext(false); + const documents$ = stateContainer.dataState.data$.documents$; documents$.next(msgComplete); await waitFor(() => expect(replaceUrlState).toHaveBeenCalledTimes(2)); @@ -219,13 +239,12 @@ describe('useTextBasedQueryLanguage', () => { }); test('it should not overwrite existing state columns on initial fetch', async () => { - const props = getHookProps(query); - props.stateContainer.appState.getState = jest.fn(() => { - return { columns: ['field1'], index: 'the-data-view-id' }; + const { replaceUrlState, stateContainer } = renderHookWithContext(false, { + columns: ['field1'], + index: 'the-data-view-id', }); - const { documents$, replaceUrlState } = props; + const documents$ = stateContainer.dataState.data$.documents$; - renderHook(() => useTextBasedQueryLanguage(props)); documents$.next({ recordRawType: RecordRawType.PLAIN, fetchStatus: FetchStatus.COMPLETE, @@ -258,13 +277,12 @@ describe('useTextBasedQueryLanguage', () => { }); test('it should not overwrite state column when successfully fetching after an error fetch', async () => { - const props = getHookProps(query); - props.stateContainer.appState.getState = jest.fn(() => { - return { columns: [], index: 'the-data-view-id' }; + const { replaceUrlState, stateContainer } = renderHookWithContext(false, { + columns: [], + index: 'the-data-view-id', }); - const { documents$, replaceUrlState } = props; + const documents$ = stateContainer.dataState.data$.documents$; - renderHook(() => useTextBasedQueryLanguage(props)); documents$.next({ recordRawType: RecordRawType.PLAIN, fetchStatus: FetchStatus.LOADING, @@ -284,7 +302,7 @@ describe('useTextBasedQueryLanguage', () => { query: { sql: 'SELECT * from the-data-view-title WHERE field1=2' }, }); await waitFor(() => expect(replaceUrlState).toHaveBeenCalledTimes(1)); - props.stateContainer.appState.getState = jest.fn(() => { + stateContainer.appState.getState = jest.fn(() => { return { columns: ['field1', 'field2'], index: 'the-data-view-id' }; }); replaceUrlState.mockReset(); @@ -335,9 +353,10 @@ describe('useTextBasedQueryLanguage', () => { create: dataViewsCreateMock, }; const props = getHookProps(query, dataViewsService); - const { documents$, replaceUrlState } = props; + const { stateContainer, replaceUrlState } = props; + const documents$ = stateContainer.dataState.data$.documents$; - renderHook(() => useTextBasedQueryLanguage(props)); + renderHook(() => useTextBasedQueryLanguage(props), { wrapper: getHookContext(stateContainer) }); documents$.next(msgComplete); await waitFor(() => expect(replaceUrlState).toHaveBeenCalledTimes(2)); diff --git a/src/plugins/discover/public/application/main/hooks/use_text_based_query_language.ts b/src/plugins/discover/public/application/main/hooks/use_text_based_query_language.ts index ff40121274858..b82b749d2acba 100644 --- a/src/plugins/discover/public/application/main/hooks/use_text_based_query_language.ts +++ b/src/plugins/discover/public/application/main/hooks/use_text_based_query_language.ts @@ -14,9 +14,9 @@ import { } from '@kbn/es-query'; import { useCallback, useEffect, useRef } from 'react'; import type { DataViewsContract } from '@kbn/data-views-plugin/public'; -import { SavedSearch, VIEW_MODE } from '@kbn/saved-search-plugin/public'; +import { VIEW_MODE } from '@kbn/saved-search-plugin/public'; +import { useSavedSearchInitial } from '../services/discover_state_provider'; import type { DiscoverStateContainer } from '../services/discover_state'; -import type { DataDocuments$ } from '../services/discover_data_state_container'; import { getValidViewMode } from '../utils/get_valid_view_mode'; import { FetchStatus } from '../../types'; @@ -27,20 +27,17 @@ const MAX_NUM_OF_COLUMNS = 50; * If necessary this is setting displayed columns and selected data view */ export function useTextBasedQueryLanguage({ - documents$, dataViews, stateContainer, - savedSearch, }: { - documents$: DataDocuments$; stateContainer: DiscoverStateContainer; dataViews: DataViewsContract; - savedSearch: SavedSearch; }) { const prev = useRef<{ query: AggregateQuery | Query | undefined; columns: string[] }>({ columns: [], query: undefined, }); + const savedSearch = useSavedSearchInitial(); const cleanup = useCallback(() => { if (prev.current.query) { @@ -53,7 +50,7 @@ export function useTextBasedQueryLanguage({ }, []); useEffect(() => { - const subscription = documents$.subscribe(async (next) => { + const subscription = stateContainer.dataState.data$.documents$.subscribe(async (next) => { const { query, recordRawType } = next; if (!query || next.fetchStatus === FetchStatus.ERROR) { return; @@ -131,5 +128,5 @@ export function useTextBasedQueryLanguage({ cleanup(); subscription.unsubscribe(); }; - }, [documents$, dataViews, stateContainer, savedSearch, cleanup]); + }, [dataViews, stateContainer, savedSearch, cleanup]); } diff --git a/src/plugins/discover/public/application/main/hooks/use_url.test.ts b/src/plugins/discover/public/application/main/hooks/use_url.test.ts index 9d8191f3581e4..a9cc1bc838fe9 100644 --- a/src/plugins/discover/public/application/main/hooks/use_url.test.ts +++ b/src/plugins/discover/public/application/main/hooks/use_url.test.ts @@ -8,20 +8,39 @@ import { renderHook } from '@testing-library/react-hooks'; import { createSearchSessionMock } from '../../../__mocks__/search_session'; import { useUrl } from './use_url'; +import { + savedSearchMockWithTimeField, + savedSearchMockWithTimeFieldNew, +} from '../../../__mocks__/saved_search'; +import { SavedSearch } from '@kbn/saved-search-plugin/public'; -describe('test useUrl', () => { - test('resetSavedSearch is triggered once path it changed to /', () => { - const { history } = createSearchSessionMock(); - history.push('/view'); - const props = { - history, - resetSavedSearch: jest.fn(), - }; - renderHook(() => useUrl(props)); - history.push('/new'); - expect(props.resetSavedSearch).toHaveBeenCalledTimes(0); +function prepareTest(savedSearch: SavedSearch, path: string) { + const { history } = createSearchSessionMock(); + const onNewUrl = jest.fn(); - history.push('/'); - expect(props.resetSavedSearch).toHaveBeenCalledTimes(1); + renderHook(() => + useUrl({ + history, + savedSearchId: savedSearch.id, + onNewUrl, + }) + ); + history.push(path); + return { load: onNewUrl }; +} +describe('test useUrl when the url is changed to /', () => { + test('loadSavedSearch is not triggered when the url is e.g. /new', () => { + // the switch to loading the new saved search is taken care in the main route + const { load } = prepareTest(savedSearchMockWithTimeFieldNew, '/new'); + expect(load).toHaveBeenCalledTimes(0); + }); + test('loadSavedSearch is not triggered when a persisted saved search is pre-selected', () => { + // the switch to loading the new saved search is taken care in the main route + const { load } = prepareTest(savedSearchMockWithTimeField, '/'); + expect(load).toHaveBeenCalledTimes(0); + }); + test('loadSavedSearch is triggered when a new saved search is pre-selected ', () => { + const { load } = prepareTest(savedSearchMockWithTimeFieldNew, '/'); + expect(load).toHaveBeenCalledTimes(1); }); }); diff --git a/src/plugins/discover/public/application/main/hooks/use_url.ts b/src/plugins/discover/public/application/main/hooks/use_url.ts index bc5554c35b36f..f08850f1e79d8 100644 --- a/src/plugins/discover/public/application/main/hooks/use_url.ts +++ b/src/plugins/discover/public/application/main/hooks/use_url.ts @@ -5,14 +5,19 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ + import { useEffect } from 'react'; import { History } from 'history'; +import { matchPath } from 'react-router-dom'; + export function useUrl({ history, - resetSavedSearch, + savedSearchId, + onNewUrl, }: { history: History; - resetSavedSearch: (val?: string) => void; + savedSearchId: string | undefined; + onNewUrl: () => void; }) { /** * Url / Routing logic @@ -22,10 +27,12 @@ export function useUrl({ // which could be set through pressing "New" button in top nav or go to "Discover" plugin from the sidebar // to reload the page in a right way const unlistenHistoryBasePath = history.listen(({ pathname, search, hash }) => { - if (!search && !hash && pathname === '/') { - resetSavedSearch(); + const isProfileRoot = Boolean(matchPath(pathname, { path: '/p/:profile', exact: true })); + + if ((pathname === '/' || isProfileRoot) && !search && !hash && !savedSearchId) { + onNewUrl(); } }); return () => unlistenHistoryBasePath(); - }, [history, resetSavedSearch]); + }, [history, savedSearchId, onNewUrl]); } diff --git a/src/plugins/discover/public/application/main/hooks/use_url_tracking.ts b/src/plugins/discover/public/application/main/hooks/use_url_tracking.ts index 4bed6f846d234..138ca8ce011da 100644 --- a/src/plugins/discover/public/application/main/hooks/use_url_tracking.ts +++ b/src/plugins/discover/public/application/main/hooks/use_url_tracking.ts @@ -5,26 +5,26 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ -import { useCallback, useEffect } from 'react'; -import { DataView } from '@kbn/data-views-plugin/common'; -import { SavedSearch } from '@kbn/saved-search-plugin/public'; +import { useEffect } from 'react'; +import { DiscoverSavedSearchContainer } from '../services/discover_saved_search_container'; import { getUrlTracker } from '../../../kibana_services'; /** * Enable/disable kbn url tracking (That's the URL used when selecting Discover in the side menu) */ -export function useUrlTracking(savedSearch: SavedSearch, dataView: DataView) { - const setUrlTracking = useCallback( - (actualDataView: DataView) => { - const trackingEnabled = Boolean(actualDataView.isPersisted() || savedSearch.id); - getUrlTracker().setTrackingEnabled(trackingEnabled); - }, - [savedSearch] - ); - +export function useUrlTracking(savedSearchContainer: DiscoverSavedSearchContainer) { useEffect(() => { - setUrlTracking(dataView); - }, [dataView, savedSearch.id, setUrlTracking]); + const subscription = savedSearchContainer.getCurrent$().subscribe((savedSearch) => { + const dataView = savedSearch.searchSource.getField('index'); + if (!dataView) { + return; + } + const trackingEnabled = Boolean(dataView.isPersisted() || savedSearch.id); + getUrlTracker().setTrackingEnabled(trackingEnabled); + }); - return { setUrlTracking }; + return () => { + subscription.unsubscribe(); + }; + }, [savedSearchContainer]); } diff --git a/src/plugins/discover/public/application/main/hooks/utils/build_state_subscribe.test.ts b/src/plugins/discover/public/application/main/hooks/utils/build_state_subscribe.test.ts index 2ea8275dea013..19c1e06e64b7d 100644 --- a/src/plugins/discover/public/application/main/hooks/utils/build_state_subscribe.test.ts +++ b/src/plugins/discover/public/application/main/hooks/utils/build_state_subscribe.test.ts @@ -5,130 +5,88 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ -import { createBrowserHistory } from 'history'; import { buildStateSubscribe } from './build_state_subscribe'; import { savedSearchMock } from '../../../../__mocks__/saved_search'; import { FetchStatus } from '../../../types'; -import { getDiscoverStateContainer } from '../../services/discover_state'; -import { discoverServiceMock } from '../../../../__mocks__/services'; import { dataViewComplexMock } from '../../../../__mocks__/data_view_complex'; +import { getDiscoverStateMock } from '../../../../__mocks__/discover_state.mock'; +import { discoverServiceMock } from '../../../../__mocks__/services'; describe('buildStateSubscribe', () => { const savedSearch = savedSearchMock; - const history = createBrowserHistory(); - const stateContainer = getDiscoverStateContainer({ - savedSearch, - services: discoverServiceMock, - history, - }); + const stateContainer = getDiscoverStateMock({ savedSearch }); stateContainer.dataState.refetch$.next = jest.fn(); stateContainer.dataState.reset = jest.fn(); stateContainer.actions.setDataView = jest.fn(); - stateContainer.actions.loadAndResolveDataView = jest.fn(() => - Promise.resolve({ fallback: false, dataView: dataViewComplexMock }) - ); - const setState = jest.fn(); + const getSubscribeFn = () => { + return buildStateSubscribe({ + appState: stateContainer.appState, + savedSearchState: stateContainer.savedSearchState, + dataState: stateContainer.dataState, + internalState: stateContainer.internalState, + services: discoverServiceMock, + setDataView: stateContainer.actions.setDataView, + }); + }; beforeEach(() => { jest.clearAllMocks(); }); - it('should set the data view if the index has changed, but no refetch should be triggered', async () => { - await buildStateSubscribe({ - stateContainer, - savedSearch, - setState, - })({ index: dataViewComplexMock.id }); + it('should set the data view if the index has changed, and refetch should be triggered', async () => { + await getSubscribeFn()({ index: dataViewComplexMock.id }); expect(stateContainer.actions.setDataView).toHaveBeenCalledWith(dataViewComplexMock); expect(stateContainer.dataState.reset).toHaveBeenCalled(); - expect(stateContainer.dataState.refetch$.next).not.toHaveBeenCalled(); - expect(setState).toHaveBeenCalled(); + expect(stateContainer.dataState.refetch$.next).toHaveBeenCalled(); }); it('should not call refetch$ if nothing changes', async () => { - await buildStateSubscribe({ - stateContainer, - savedSearch, - setState, - })(stateContainer.appState.getState()); + await getSubscribeFn()(stateContainer.appState.getState()); expect(stateContainer.dataState.refetch$.next).toHaveBeenCalled(); - expect(setState).toHaveBeenCalled(); }); it('should call refetch$ if the chart is hidden', async () => { - await buildStateSubscribe({ - stateContainer, - savedSearch, - setState, - })({ hideChart: true }); + await getSubscribeFn()({ hideChart: true }); expect(stateContainer.dataState.refetch$.next).toHaveBeenCalled(); - expect(setState).toHaveBeenCalled(); }); it('should call refetch$ if the chart interval has changed', async () => { - await buildStateSubscribe({ - stateContainer, - savedSearch, - setState, - })({ interval: 's' }); + await getSubscribeFn()({ interval: 's' }); expect(stateContainer.dataState.refetch$.next).toHaveBeenCalled(); - expect(setState).toHaveBeenCalled(); }); it('should call refetch$ if breakdownField has changed', async () => { - await buildStateSubscribe({ - stateContainer, - savedSearch, - setState, - })({ breakdownField: '💣' }); + await getSubscribeFn()({ breakdownField: '💣' }); expect(stateContainer.dataState.refetch$.next).toHaveBeenCalled(); - expect(setState).toHaveBeenCalled(); }); it('should call refetch$ if sort has changed', async () => { - await buildStateSubscribe({ - stateContainer, - savedSearch, - setState, - })({ sort: [['field', 'test']] }); + await getSubscribeFn()({ sort: [['field', 'test']] }); expect(stateContainer.dataState.refetch$.next).toHaveBeenCalled(); - expect(setState).toHaveBeenCalled(); }); it('should not execute setState function if initialFetchStatus is UNINITIALIZED', async () => { - const stateSubscribeFn = await buildStateSubscribe({ - stateContainer, - savedSearch, - setState, - }); - stateContainer.dataState.initialFetchStatus = FetchStatus.UNINITIALIZED; + const stateSubscribeFn = getSubscribeFn(); + stateContainer.dataState.getInitialFetchStatus = jest.fn(() => FetchStatus.UNINITIALIZED); await stateSubscribeFn({ index: dataViewComplexMock.id }); expect(stateContainer.dataState.reset).toHaveBeenCalled(); - expect(setState).not.toHaveBeenCalled(); }); it('should not execute setState twice if the identical data view change is propagated twice', async () => { - const stateSubscribeFn = await buildStateSubscribe({ - stateContainer, - savedSearch, - setState, - }); - await stateSubscribeFn({ index: dataViewComplexMock.id }); + await getSubscribeFn()({ index: dataViewComplexMock.id }); - expect(setState).toBeCalledTimes(0); expect(stateContainer.dataState.reset).toBeCalledTimes(1); stateContainer.appState.getPrevious = jest.fn(() => ({ index: dataViewComplexMock.id })); - await stateSubscribeFn({ index: dataViewComplexMock.id }); - expect(setState).toBeCalledTimes(0); + await getSubscribeFn()({ index: dataViewComplexMock.id }); expect(stateContainer.dataState.reset).toBeCalledTimes(1); }); }); diff --git a/src/plugins/discover/public/application/main/hooks/utils/build_state_subscribe.ts b/src/plugins/discover/public/application/main/hooks/utils/build_state_subscribe.ts index ebe8e22935382..1799e5146c803 100644 --- a/src/plugins/discover/public/application/main/hooks/utils/build_state_subscribe.ts +++ b/src/plugins/discover/public/application/main/hooks/utils/build_state_subscribe.ts @@ -5,39 +5,51 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ -import { SavedSearch } from '@kbn/saved-search-plugin/public'; import { isEqual } from 'lodash'; -import { DiscoverStateContainer } from '../../services/discover_state'; -import { DiscoverAppState, isEqualState } from '../../services/discover_app_state_container'; +import type { DiscoverInternalStateContainer } from '../../services/discover_internal_state_container'; +import type { DiscoverServices } from '../../../../build_services'; +import type { DiscoverSavedSearchContainer } from '../../services/discover_saved_search_container'; +import type { DiscoverDataStateContainer } from '../../services/discover_data_state_container'; +import type { DiscoverStateContainer } from '../../services/discover_state'; +import { + DiscoverAppState, + DiscoverAppStateContainer, + isEqualState, +} from '../../services/discover_app_state_container'; import { addLog } from '../../../../utils/add_log'; import { FetchStatus } from '../../../types'; +import { loadAndResolveDataView } from '../../utils/resolve_data_view'; /** * Builds a subscribe function for the AppStateContainer, that is executed when the AppState changes in URL * or programmatically. It's main purpose is to detect which changes should trigger a refetch of the data. * @param stateContainer - * @param savedSearch - * @param setState */ export const buildStateSubscribe = ({ - stateContainer, - savedSearch, - setState, + appState, + dataState, + internalState, + savedSearchState, + services, + setDataView, }: { - stateContainer: DiscoverStateContainer; - savedSearch: SavedSearch; - setState: (state: DiscoverAppState) => void; + appState: DiscoverAppStateContainer; + dataState: DiscoverDataStateContainer; + internalState: DiscoverInternalStateContainer; + savedSearchState: DiscoverSavedSearchContainer; + services: DiscoverServices; + setDataView: DiscoverStateContainer['actions']['setDataView']; }) => async (nextState: DiscoverAppState) => { - const prevState = stateContainer.appState.getPrevious(); + const prevState = appState.getPrevious(); + const savedSearch = savedSearchState.getState(); if (isEqualState(prevState, nextState)) { - addLog('[appstate] subscribe update ignored due to no changes'); + addLog('[appstate] subscribe update ignored due to no changes', { prevState, nextState }); return; } addLog('[appstate] subscribe triggered', nextState); - const { hideChart, interval, breakdownField, sort, index } = - stateContainer.appState.getPrevious(); + const { hideChart, interval, breakdownField, sort, index } = appState.getPrevious(); // Cast to boolean to avoid false positives when comparing // undefined and false, which would trigger a refetch const chartDisplayChanged = Boolean(nextState.hideChart) !== Boolean(hideChart); @@ -45,26 +57,29 @@ export const buildStateSubscribe = const breakdownFieldChanged = nextState.breakdownField !== breakdownField; const docTableSortChanged = !isEqual(nextState.sort, sort); const dataViewChanged = !isEqual(nextState.index, index); + let savedSearchDataView; // NOTE: this is also called when navigating from discover app to context app if (nextState.index && dataViewChanged) { - const { dataView: nextDataView, fallback } = - await stateContainer.actions.loadAndResolveDataView(nextState.index, savedSearch); + const { dataView: nextDataView, fallback } = await loadAndResolveDataView( + { id: nextState.index, savedSearch }, + { internalStateContainer: internalState, services } + ); // If the requested data view is not found, don't try to load it, // and instead reset the app state to the fallback data view if (fallback) { - stateContainer.appState.update({ index: nextDataView.id }, true); + appState.update({ index: nextDataView.id }, true); return; } savedSearch.searchSource.setField('index', nextDataView); - stateContainer.dataState.reset(); - stateContainer.actions.setDataView(nextDataView); + dataState.reset(savedSearch); + setDataView(nextDataView); + savedSearchDataView = nextDataView; } - if ( - dataViewChanged && - stateContainer.dataState.initialFetchStatus === FetchStatus.UNINITIALIZED - ) { + savedSearchState.update({ nextDataView: savedSearchDataView, nextState }); + + if (dataViewChanged && dataState.getInitialFetchStatus() === FetchStatus.UNINITIALIZED) { // stop execution if given data view has changed, and it's not configured to initially start a search in Discover return; } @@ -73,11 +88,10 @@ export const buildStateSubscribe = chartDisplayChanged || chartIntervalChanged || breakdownFieldChanged || - docTableSortChanged + docTableSortChanged || + dataViewChanged ) { addLog('[appstate] subscribe triggers data fetching'); - stateContainer.dataState.refetch$.next(undefined); + dataState.fetch(); } - - setState(nextState); }; diff --git a/src/plugins/discover/public/application/main/hooks/utils/change_data_view.test.ts b/src/plugins/discover/public/application/main/hooks/utils/change_data_view.test.ts index 04afdac829f97..37a503716af0e 100644 --- a/src/plugins/discover/public/application/main/hooks/utils/change_data_view.test.ts +++ b/src/plugins/discover/public/application/main/hooks/utils/change_data_view.test.ts @@ -8,32 +8,29 @@ import { changeDataView } from './change_data_view'; import { savedSearchMock } from '../../../../__mocks__/saved_search'; -import { createBrowserHistory } from 'history'; -import { getDiscoverStateContainer } from '../../services/discover_state'; import { discoverServiceMock } from '../../../../__mocks__/services'; import type { DataView } from '@kbn/data-views-plugin/common'; import { dataViewComplexMock } from '../../../../__mocks__/data_view_complex'; +import { getDiscoverStateMock } from '../../../../__mocks__/discover_state.mock'; const setupTestParams = (dataView: DataView | undefined) => { const savedSearch = savedSearchMock; const services = discoverServiceMock; - const history = createBrowserHistory(); - const discoverState = getDiscoverStateContainer({ + + const discoverState = getDiscoverStateMock({ savedSearch, - services: discoverServiceMock, - history, }); discoverState.internalState.transitions.setDataView(savedSearch.searchSource.getField('index')!); services.dataViews.get = jest.fn(() => Promise.resolve(dataView as DataView)); discoverState.appState.update = jest.fn(); - return { services, discoverState, setUrlTracking: jest.fn() }; + return { services, appState: discoverState.appState, internalState: discoverState.internalState }; }; describe('changeDataView', () => { it('should set the right app state when a valid data view to switch to is given', async () => { const params = setupTestParams(dataViewComplexMock as DataView); await changeDataView('data-view-with-various-field-types', params); - expect(params.discoverState.appState.update).toHaveBeenCalledWith({ + expect(params.appState.update).toHaveBeenCalledWith({ columns: ['default_column'], index: 'data-view-with-various-field-types-id', sort: [['data', 'desc']], @@ -43,6 +40,6 @@ describe('changeDataView', () => { it('should not set the app state when an invalid data view to switch to is given', async () => { const params = setupTestParams(undefined); await changeDataView('data-view-with-various-field-types', params); - expect(params.discoverState.appState.update).not.toHaveBeenCalled(); + expect(params.appState.update).not.toHaveBeenCalled(); }); }); diff --git a/src/plugins/discover/public/application/main/hooks/utils/change_data_view.ts b/src/plugins/discover/public/application/main/hooks/utils/change_data_view.ts index c53e0ec9da617..0912758b74663 100644 --- a/src/plugins/discover/public/application/main/hooks/utils/change_data_view.ts +++ b/src/plugins/discover/public/application/main/hooks/utils/change_data_view.ts @@ -8,39 +8,36 @@ import { SortOrder } from '@kbn/saved-search-plugin/public'; import { DataView } from '@kbn/data-views-plugin/common'; +import { DiscoverInternalStateContainer } from '../../services/discover_internal_state_container'; +import { DiscoverAppStateContainer } from '../../services/discover_app_state_container'; import { addLog } from '../../../../utils/add_log'; import { DiscoverServices } from '../../../../build_services'; -import { DiscoverStateContainer } from '../../services/discover_state'; import { getDataViewAppState } from '../../utils/get_switch_data_view_app_state'; import { MODIFY_COLUMNS_ON_SWITCH, SORT_DEFAULT_ORDER_SETTING } from '../../../../../common'; /** * Function executed when switching data view in the UI - * @param id - * @param services - * @param discoverState - * @param setUrlTracking */ export async function changeDataView( - id: string, + id: string | DataView, { services, - discoverState, - setUrlTracking, + internalState, + appState, }: { services: DiscoverServices; - discoverState: DiscoverStateContainer; - setUrlTracking: (dataView: DataView) => void; + internalState: DiscoverInternalStateContainer; + appState: DiscoverAppStateContainer; } ) { addLog('[ui] changeDataView', { id }); const { dataViews, uiSettings } = services; - const dataView = discoverState.internalState.getState().dataView; - const state = discoverState.appState.getState(); + const dataView = internalState.getState().dataView; + const state = appState.getState(); let nextDataView: DataView | null = null; try { - nextDataView = await dataViews.get(id, false); + nextDataView = typeof id === 'string' ? await dataViews.get(id, false) : id; } catch (e) { // } @@ -56,7 +53,9 @@ export async function changeDataView( state.query ); - setUrlTracking(nextDataView); - discoverState.appState.update(nextAppState); + appState.update(nextAppState); + if (internalState.getState().expandedDoc) { + internalState.transitions.setExpandedDoc(undefined); + } } } diff --git a/src/plugins/discover/public/application/main/services/discover_app_state_container.ts b/src/plugins/discover/public/application/main/services/discover_app_state_container.ts index eb552ea023f9b..ba189bec26a1b 100644 --- a/src/plugins/discover/public/application/main/services/discover_app_state_container.ts +++ b/src/plugins/discover/public/application/main/services/discover_app_state_container.ts @@ -21,11 +21,10 @@ import { } from '@kbn/es-query'; import { SavedSearch, VIEW_MODE } from '@kbn/saved-search-plugin/public'; import { IKbnUrlStateStorage, ISyncStateRef, syncState } from '@kbn/kibana-utils-plugin/public'; -import { cloneDeep, isEqual } from 'lodash'; +import { isEqual } from 'lodash'; import { connectToQueryState, syncGlobalQueryStateWithUrl } from '@kbn/data-plugin/public'; import { DiscoverServices } from '../../../build_services'; import { addLog } from '../../../utils/add_log'; -import { getValidFilters } from '../../../utils/get_valid_filters'; import { cleanupUrlState } from '../utils/cleanup_url_state'; import { getStateDefaults } from '../utils/get_state_defaults'; import { handleSourceColumnState } from '../../../utils/state_helpers'; @@ -33,6 +32,10 @@ import { DiscoverGridSettings } from '../../../components/discover_grid/types'; export const APP_STATE_URL_KEY = '_a'; export interface DiscoverAppStateContainer extends ReduxLikeStateContainer { + /** + * Returns if the current URL is empty + */ + isEmptyURL: () => boolean; /** * Returns the previous state, used for diffing e.g. if fetching new data is necessary */ @@ -52,11 +55,6 @@ export interface DiscoverAppStateContainer extends ReduxLikeStateContainer void; - /** - * Resets the state by the given saved search - * @param savedSearch - */ - resetWithSavedSearch: (savedSearch: SavedSearch) => void; /** * Resets the current state to the initial state */ @@ -180,7 +178,7 @@ export const getDiscoverAppStateContainer = ({ }; const startAppStateUrlSync = () => { - addLog('[appState] startAppStateUrlSync'); + addLog('[appState] start syncing state with URL'); return syncState({ storageKey: APP_STATE_URL_KEY, stateContainer: enhancedAppContainer, @@ -189,24 +187,17 @@ export const getDiscoverAppStateContainer = ({ }; const initializeAndSync = (currentSavedSearch: SavedSearch) => { - addLog('[appState] initializeAndSync', currentSavedSearch); - const dataView = currentSavedSearch.searchSource.getField('index')!; - if (appStateContainer.getState().index !== dataView.id) { + addLog('[appState] initialize state and sync with URL', currentSavedSearch); + const { data } = services; + const dataView = currentSavedSearch.searchSource.getField('index'); + + if (appStateContainer.getState().index !== dataView?.id) { // used data view is different from the given by url/state which is invalid - setState(appStateContainer, { index: dataView.id }); + setState(appStateContainer, { index: dataView?.id }); } - // sync initial app filters from state to filterManager - const filters = appStateContainer.getState().filters || []; - if (filters) { - services.filterManager.setAppFilters(cloneDeep(filters)); - } - const query = appStateContainer.getState().query; - if (query) { - services.data.query.queryString.setQuery(query); - } - + // syncs `_a` portion of url with query services const stopSyncingQueryAppStateWithStateContainer = connectToQueryState( - services.data.query, + data.query, appStateContainer, { filters: FilterStateStore.APP_STATE, @@ -216,23 +207,13 @@ export const getDiscoverAppStateContainer = ({ // syncs `_g` portion of url with query services const { stop: stopSyncingGlobalStateWithUrl } = syncGlobalQueryStateWithUrl( - services.data.query, + data.query, stateStorage ); - // some filters may not be valid for this context, so update - // the filter manager with a modified list of valid filters - const currentFilters = services.filterManager.getFilters(); - const validFilters = getValidFilters(dataView, currentFilters); - if (!isEqual(currentFilters, validFilters)) { - services.filterManager.setFilters(validFilters); - } - const { start, stop } = startAppStateUrlSync(); - - replaceUrlState({}).then(() => { - start(); - }); + // current state need to be pushed to url + replaceUrlState({}).then(() => start()); return () => { stopSyncingQueryAppStateWithStateContainer(); @@ -241,12 +222,6 @@ export const getDiscoverAppStateContainer = ({ }; }; - const resetWithSavedSearch = (nextSavedSearch: SavedSearch) => { - addLog('[appState] reset to saved search', { nextSavedSearch }); - const nextAppState = getInitialState(stateStorage, nextSavedSearch, services); - appStateContainer.set(nextAppState); - }; - const update = (newPartial: DiscoverAppState, replace = false) => { addLog('[appState] update', { newPartial, replace }); if (replace) { @@ -257,14 +232,19 @@ export const getDiscoverAppStateContainer = ({ } }; + const isEmptyURL = () => { + const urlValue = stateStorage.get(APP_STATE_URL_KEY); + return urlValue === undefined || urlValue === null; + }; + const getPrevious = () => previousState; return { ...enhancedAppContainer, + isEmptyURL, getPrevious, hasChanged, initAndSync: initializeAndSync, - resetWithSavedSearch, resetInitialState, replaceUrlState, syncState: startAppStateUrlSync, @@ -281,21 +261,23 @@ export interface AppStateUrl extends Omit { export const GLOBAL_STATE_URL_KEY = '_g'; -function getInitialState( - stateStorage: IKbnUrlStateStorage, +export function getInitialState( + stateStorage: IKbnUrlStateStorage | undefined, savedSearch: SavedSearch, services: DiscoverServices ) { - const appStateFromUrl = cleanupUrlState(stateStorage.get(APP_STATE_URL_KEY) as AppStateUrl); + const stateStorageURL = stateStorage?.get(APP_STATE_URL_KEY) as AppStateUrl; const defaultAppState = getStateDefaults({ savedSearch, services, }); return handleSourceColumnState( - { - ...defaultAppState, - ...appStateFromUrl, - }, + stateStorageURL === null + ? defaultAppState + : { + ...defaultAppState, + ...cleanupUrlState(stateStorageURL), + }, services.uiSettings ); } diff --git a/src/plugins/discover/public/application/main/services/discover_data_state_container.test.ts b/src/plugins/discover/public/application/main/services/discover_data_state_container.test.ts index fcdce1b76a1a0..ccb3f4d39a877 100644 --- a/src/plugins/discover/public/application/main/services/discover_data_state_container.test.ts +++ b/src/plugins/discover/public/application/main/services/discover_data_state_container.test.ts @@ -9,12 +9,10 @@ import { Subject } from 'rxjs'; import { waitFor } from '@testing-library/react'; import { discoverServiceMock } from '../../../__mocks__/services'; import { savedSearchMockWithSQL } from '../../../__mocks__/saved_search'; -import { getDiscoverStateContainer } from './discover_state'; import { FetchStatus } from '../../types'; import { setUrlTracker } from '../../../kibana_services'; import { urlTrackerMock } from '../../../__mocks__/url_tracker.mock'; import { RecordRawType } from './discover_data_state_container'; -import { createBrowserHistory } from 'history'; import { getDiscoverStateMock } from '../../../__mocks__/discover_state.mock'; setUrlTracker(urlTrackerMock); @@ -70,21 +68,19 @@ describe('test getDataStateContainer', () => { await waitFor(() => { expect(dataState.data$.main$.value.fetchStatus).toBe(FetchStatus.COMPLETE); }); - dataState.reset(); + dataState.reset(stateContainer.savedSearchState.getState()); await waitFor(() => { expect(dataState.data$.main$.value.fetchStatus).toBe(FetchStatus.LOADING); }); - unsubscribe(); }); test('useSavedSearch returns plain record raw type', async () => { - const history = createBrowserHistory(); - const stateContainer = getDiscoverStateContainer({ + const stateContainer = getDiscoverStateMock({ savedSearch: savedSearchMockWithSQL, - services: discoverServiceMock, - history, }); + stateContainer.savedSearchState.load = jest.fn().mockResolvedValue(savedSearchMockWithSQL); + await stateContainer.actions.loadSavedSearch({ savedSearchId: savedSearchMockWithSQL.id }); expect(stateContainer.dataState.data$.main$.getValue().recordRawType).toBe(RecordRawType.PLAIN); }); diff --git a/src/plugins/discover/public/application/main/services/discover_data_state_container.ts b/src/plugins/discover/public/application/main/services/discover_data_state_container.ts index 7bac15b6a5808..07e1f089bcd13 100644 --- a/src/plugins/discover/public/application/main/services/discover_data_state_container.ts +++ b/src/plugins/discover/public/application/main/services/discover_data_state_container.ts @@ -12,7 +12,6 @@ import { RequestAdapter } from '@kbn/inspector-plugin/common'; import { SavedSearch } from '@kbn/saved-search-plugin/public'; import { AggregateQuery, Query } from '@kbn/es-query'; import type { SearchResponse } from '@elastic/elasticsearch/lib/api/types'; -import { ReduxLikeStateContainer } from '@kbn/kibana-utils-plugin/common'; import { getRawRecordType } from '../utils/get_raw_record_type'; import { DiscoverAppState } from './discover_app_state_container'; import { DiscoverServices } from '../../../build_services'; @@ -108,17 +107,17 @@ export interface DiscoverDataStateContainer { /** * resetting all data observable to initial state */ - reset: () => void; + reset: (savedSearch: SavedSearch) => void; /** * Available Inspector Adaptor allowing to get details about recent requests to ES */ - inspectorAdapters: { requests: RequestAdapter }; + inspectorAdapters: { requests: RequestAdapter; lensRequests?: RequestAdapter }; /** - * Initial fetch status + * Return the initial fetch status * UNINITIALIZED: data is not fetched initially, without user triggering it * LOADING: data is fetched initially (when Discover is rendered, or data views are switched) */ - initialFetchStatus: FetchStatus; + getInitialFetchStatus: () => FetchStatus; } /** * Container responsible for fetching of data in Discover Main @@ -130,13 +129,11 @@ export function getDataStateContainer({ searchSessionManager, getAppState, getSavedSearch, - appStateContainer, }: { services: DiscoverServices; searchSessionManager: DiscoverSearchSessionManager; getAppState: () => DiscoverAppState; getSavedSearch: () => SavedSearch; - appStateContainer: ReduxLikeStateContainer; }): DiscoverDataStateContainer { const { data, uiSettings, toastNotifications } = services; const { timefilter } = data.query.timefilter; @@ -149,20 +146,20 @@ export function getDataStateContainer({ * to be processed correctly */ const refetch$ = new Subject(); - const shouldSearchOnPageLoad = - uiSettings.get(SEARCH_ON_PAGE_LOAD_SETTING) || - getSavedSearch().id !== undefined || - !timefilter.getRefreshInterval().pause || - searchSessionManager.hasSearchSessionIdInURL(); - const initialFetchStatus = shouldSearchOnPageLoad - ? FetchStatus.LOADING - : FetchStatus.UNINITIALIZED; + const getInitialFetchStatus = () => { + const shouldSearchOnPageLoad = + uiSettings.get(SEARCH_ON_PAGE_LOAD_SETTING) || + getSavedSearch().id !== undefined || + !timefilter.getRefreshInterval().pause || + searchSessionManager.hasSearchSessionIdInURL(); + return shouldSearchOnPageLoad ? FetchStatus.LOADING : FetchStatus.UNINITIALIZED; + }; /** * The observables the UI (aka React component) subscribes to get notified about * the changes in the data fetching process (high level: fetching started, data was received) */ - const initialState = { fetchStatus: initialFetchStatus, recordRawType }; + const initialState = { fetchStatus: getInitialFetchStatus(), recordRawType }; const dataSubjects: SavedSearchData = { main$: new BehaviorSubject(initialState), documents$: new BehaviorSubject(initialState), @@ -202,14 +199,13 @@ export function getDataStateContainer({ abortController = new AbortController(); const prevAutoRefreshDone = autoRefreshDone; - await fetchAll(dataSubjects, getSavedSearch().searchSource, reset, { + await fetchAll(dataSubjects, reset, { abortController, - data, - initialFetchStatus, + initialFetchStatus: getInitialFetchStatus(), inspectorAdapters, searchSessionId, services, - appStateContainer, + getAppState, savedSearch: getSavedSearch(), useNewFieldsApi: !uiSettings.get(SEARCH_FIELDS_FROM_SOURCE), }); @@ -239,7 +235,10 @@ export function getDataStateContainer({ return refetch$; }; - const reset = () => sendResetMsg(dataSubjects, initialFetchStatus); + const reset = (savedSearch: SavedSearch) => { + const recordType = getRawRecordType(savedSearch.searchSource.getField('query')); + sendResetMsg(dataSubjects, getInitialFetchStatus(), recordType); + }; return { fetch: fetchQuery, @@ -249,6 +248,6 @@ export function getDataStateContainer({ subscribe, reset, inspectorAdapters, - initialFetchStatus, + getInitialFetchStatus, }; } diff --git a/src/plugins/discover/public/application/main/services/discover_saved_search_container.test.ts b/src/plugins/discover/public/application/main/services/discover_saved_search_container.test.ts new file mode 100644 index 0000000000000..fea276a4e1c86 --- /dev/null +++ b/src/plugins/discover/public/application/main/services/discover_saved_search_container.test.ts @@ -0,0 +1,254 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { SavedObjectSaveOpts } from '@kbn/saved-objects-plugin/public'; + +const mockSaveSavedSearch = jest.fn().mockResolvedValue('123'); +jest.mock('@kbn/saved-search-plugin/public', () => { + const actualPlugin = jest.requireActual('@kbn/saved-search-plugin/public'); + return { + ...actualPlugin, + saveSavedSearch: (val: SavedSearch, opts?: SavedObjectSaveOpts) => + mockSaveSavedSearch(val, opts), + }; +}); +import { getSavedSearchContainer, isEqualSavedSearch } from './discover_saved_search_container'; +import type { SavedSearch } from '@kbn/saved-search-plugin/public'; +import { discoverServiceMock } from '../../../__mocks__/services'; +import { savedSearchMock, savedSearchMockWithTimeField } from '../../../__mocks__/saved_search'; +import { dataViewMock } from '../../../__mocks__/data_view'; +import { dataViewComplexMock } from '../../../__mocks__/data_view_complex'; + +describe('DiscoverSavedSearchContainer', () => { + const savedSearch = savedSearchMock; + const services = discoverServiceMock; + + describe('getTitle', () => { + it('returns undefined for new saved searches', () => { + const container = getSavedSearchContainer({ services }); + expect(container.getTitle()).toBe(undefined); + }); + + it('returns the title of a persisted saved searches', () => { + const container = getSavedSearchContainer({ services }); + container.set(savedSearch); + expect(container.getTitle()).toBe(savedSearch.title); + }); + }); + + describe('set', () => { + it('should update the current and initial state of the saved search', () => { + const container = getSavedSearchContainer({ services }); + const newSavedSearch: SavedSearch = { ...savedSearch, title: 'New title' }; + const result = container.set(newSavedSearch); + + expect(result).toBe(newSavedSearch); + expect(container.getState()).toBe(newSavedSearch); + const initialSavedSearch = container.getInitial$().getValue(); + const currentSavedSearch = container.getCurrent$().getValue(); + + expect(isEqualSavedSearch(initialSavedSearch, currentSavedSearch)).toBeTruthy(); + }); + + it('should reset hasChanged$ to false', () => { + const container = getSavedSearchContainer({ services }); + const newSavedSearch: SavedSearch = { ...savedSearch, title: 'New title' }; + + container.set(newSavedSearch); + expect(container.getHasChanged$().getValue()).toBe(false); + }); + }); + + describe('new', () => { + it('should create a new saved search', async () => { + const container = getSavedSearchContainer({ services }); + const result = await container.new(dataViewMock); + + expect(result.title).toBeUndefined(); + expect(result.id).toBeUndefined(); + const savedSearchState = container.getState(); + expect(savedSearchState.id).not.toEqual(savedSearch.id); + expect(savedSearchState.searchSource.getField('index')).toEqual( + savedSearch.searchSource.getField('index') + ); + }); + + it('should create a new saved search with provided DataView', async () => { + const container = getSavedSearchContainer({ services }); + const result = await container.new(dataViewMock); + expect(result.title).toBeUndefined(); + expect(result.id).toBeUndefined(); + expect(result.searchSource.getField('index')).toBe(dataViewMock); + expect(container.getHasChanged$().getValue()).toBe(false); + }); + }); + + describe('load', () => { + discoverServiceMock.data.search.searchSource.create = jest + .fn() + .mockReturnValue(savedSearchMock.searchSource); + discoverServiceMock.core.savedObjects.client.resolve = jest.fn().mockReturnValue({ + saved_object: { + attributes: { + kibanaSavedObjectMeta: { + searchSourceJSON: + '{"query":{"query":"","language":"kuery"},"filter":[],"indexRefName":"kibanaSavedObjectMeta.searchSourceJSON.index"}', + }, + title: 'The saved search that will save the world', + sort: [], + columns: ['test123'], + description: 'description', + hideChart: false, + }, + id: 'the-saved-search-id', + type: 'search', + references: [ + { + name: 'kibanaSavedObjectMeta.searchSourceJSON.index', + id: 'the-data-view-id', + type: 'index-pattern', + }, + ], + namespaces: ['default'], + }, + outcome: 'exactMatch', + }); + + it('loads a saved search', async () => { + const savedSearchContainer = getSavedSearchContainer({ + services: discoverServiceMock, + }); + await savedSearchContainer.load('the-saved-search-id'); + expect(savedSearchContainer.getInitial$().getValue().id).toEqual('the-saved-search-id'); + expect(savedSearchContainer.getCurrent$().getValue().id).toEqual('the-saved-search-id'); + expect(savedSearchContainer.getHasChanged$().getValue()).toEqual(false); + }); + }); + + describe('persist', () => { + const saveOptions = { confirmOverwrite: false }; + + it('calls saveSavedSearch with the given saved search and save options', async () => { + const savedSearchContainer = getSavedSearchContainer({ + services: discoverServiceMock, + }); + const savedSearchToPersist = { + ...savedSearchMockWithTimeField, + title: 'My updated saved search', + }; + + await savedSearchContainer.persist(savedSearchToPersist, saveOptions); + expect(mockSaveSavedSearch).toHaveBeenCalledWith(savedSearchToPersist, saveOptions); + }); + + it('sets the initial and current saved search to the persisted saved search', async () => { + const title = 'My updated saved search'; + const persistedSavedSearch = { + ...savedSearch, + title, + }; + const savedSearchContainer = getSavedSearchContainer({ + services: discoverServiceMock, + }); + + const result = await savedSearchContainer.persist(persistedSavedSearch, saveOptions); + expect(savedSearchContainer.getInitial$().getValue().title).toBe(title); + expect(savedSearchContainer.getCurrent$().getValue().title).toBe(title); + expect(result).toEqual({ id: '123' }); + }); + + it('emits false to the hasChanged$ BehaviorSubject', async () => { + const savedSearchContainer = getSavedSearchContainer({ + services: discoverServiceMock, + }); + const savedSearchToPersist = { + ...savedSearchMockWithTimeField, + title: 'My updated saved search', + }; + + await savedSearchContainer.persist(savedSearchToPersist, saveOptions); + expect(savedSearchContainer.getHasChanged$().getValue()).toBe(false); + }); + + it('takes care of persisting timeRestore correctly ', async () => { + discoverServiceMock.timefilter.getTime = jest.fn(() => ({ from: 'now-15m', to: 'now' })); + discoverServiceMock.timefilter.getRefreshInterval = jest.fn(() => ({ + value: 0, + pause: true, + })); + const savedSearchContainer = getSavedSearchContainer({ + services: discoverServiceMock, + }); + const savedSearchToPersist = { + ...savedSearchMockWithTimeField, + title: 'My updated saved search', + timeRestore: true, + }; + await savedSearchContainer.persist(savedSearchToPersist, saveOptions); + expect(discoverServiceMock.timefilter.getTime).toHaveBeenCalled(); + expect(discoverServiceMock.timefilter.getRefreshInterval).toHaveBeenCalled(); + expect(savedSearchToPersist.timeRange).toEqual({ from: 'now-15m', to: 'now' }); + expect(savedSearchToPersist.refreshInterval).toEqual({ + value: 0, + pause: true, + }); + }); + + it('Error thrown on persistence layer bubbling up, no changes to the initial saved search ', async () => { + mockSaveSavedSearch.mockImplementation(() => { + throw new Error('oh-noes'); + }); + + const savedSearchContainer = getSavedSearchContainer({ + services: discoverServiceMock, + }); + savedSearchContainer.set(savedSearch); + savedSearchContainer.update({ nextState: { hideChart: true } }); + expect(savedSearchContainer.getHasChanged$().getValue()).toBe(true); + try { + await savedSearchContainer.persist(savedSearch, saveOptions); + } catch (e) { + // intentional error + } + expect(savedSearchContainer.getHasChanged$().getValue()).toBe(true); + expect(savedSearchContainer.getInitial$().getValue().title).not.toBe( + 'My updated saved search' + ); + }); + }); + + describe('update', () => { + it('updates a saved search by app state providing hideChart', async () => { + const savedSearchContainer = getSavedSearchContainer({ + services: discoverServiceMock, + }); + savedSearchContainer.set(savedSearch); + const updated = await savedSearchContainer.update({ nextState: { hideChart: true } }); + expect(savedSearchContainer.getHasChanged$().getValue()).toBe(true); + savedSearchContainer.set(updated); + expect(savedSearchContainer.getHasChanged$().getValue()).toBe(false); + await savedSearchContainer.update({ nextState: { hideChart: false } }); + expect(savedSearchContainer.getHasChanged$().getValue()).toBe(true); + await savedSearchContainer.update({ nextState: { hideChart: true } }); + expect(savedSearchContainer.getHasChanged$().getValue()).toBe(false); + }); + it('updates a saved search by data view', async () => { + const savedSearchContainer = getSavedSearchContainer({ + services: discoverServiceMock, + }); + const updated = await savedSearchContainer.update({ nextDataView: dataViewMock }); + expect(savedSearchContainer.getHasChanged$().getValue()).toBe(true); + savedSearchContainer.set(updated); + expect(savedSearchContainer.getHasChanged$().getValue()).toBe(false); + await savedSearchContainer.update({ nextDataView: dataViewComplexMock }); + expect(savedSearchContainer.getHasChanged$().getValue()).toBe(true); + await savedSearchContainer.update({ nextDataView: dataViewMock }); + expect(savedSearchContainer.getHasChanged$().getValue()).toBe(false); + }); + }); +}); diff --git a/src/plugins/discover/public/application/main/services/discover_saved_search_container.ts b/src/plugins/discover/public/application/main/services/discover_saved_search_container.ts new file mode 100644 index 0000000000000..21bb8f626605c --- /dev/null +++ b/src/plugins/discover/public/application/main/services/discover_saved_search_container.ts @@ -0,0 +1,268 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { + getNewSavedSearch, + getSavedSearch, + SavedSearch, + saveSavedSearch, +} from '@kbn/saved-search-plugin/public'; +import { BehaviorSubject } from 'rxjs'; +import type { DataView } from '@kbn/data-views-plugin/common'; +import { SavedObjectSaveOpts } from '@kbn/saved-objects-plugin/public'; +import { isEqual } from 'lodash'; +import { restoreStateFromSavedSearch } from '../../../services/saved_searches/restore_from_saved_search'; +import { updateSavedSearch } from '../utils/update_saved_search'; +import { addLog } from '../../../utils/add_log'; +import { handleSourceColumnState } from '../../../utils/state_helpers'; +import { DiscoverAppState } from './discover_app_state_container'; +import { DiscoverServices } from '../../../build_services'; +import { getStateDefaults } from '../utils/get_state_defaults'; + +export interface UpdateParams { + /** + * The next data view to be used + */ + nextDataView?: DataView | undefined; + /** + * The next AppState that should be used for updating the saved search + */ + nextState?: DiscoverAppState | undefined; + /** + * use filter and query services to update the saved search + */ + useFilterAndQueryServices?: boolean; +} + +/** + * Container for the saved search state, allowing to load, update and persist the saved search + * Can also be used to track changes to the saved search + * It centralizes functionality that was spread across the Discover main codebase + * There are 2 hooks to access the state of the saved search in React components: + * - useSavedSearch for the current state, that's updated on every relevant state change + * - useSavedSearchInitial for the persisted or initial state, just updated when the saved search is peristed or loaded + */ +export interface DiscoverSavedSearchContainer { + /** + * Get an BehaviorSubject which contains the current state of the current saved search + * All modifications are applied to this state + */ + getCurrent$: () => BehaviorSubject; + /** + * Get the id of the current saved search + */ + getId: () => string | undefined; + /** + * Get an BehaviorSubject which contains the initial state of the current saved search + * This is set when a saved search is loaded or a new saved search is initialized + */ + getInitial$: () => BehaviorSubject; + /** + * Get the title of the current saved search + */ + getTitle: () => string | undefined; + /** + * Get an BehaviorSubject containing the state if there have been changes to the initial state of the saved search + * Can be used to track if the saved search has been modified and displayed in the UI + */ + getHasChanged$: () => BehaviorSubject; + /** + * Get the current state of the saved search + */ + getState: () => SavedSearch; + /** + * Load a saved search by the given id + * Resets the initial and current state of the saved search + * @param id + * @param dataView + */ + load: (id: string, dataView?: DataView) => Promise; + /** + * Initialize a new saved search + * Resets the initial and current state of the saved search + * @param dataView + */ + new: (dataView?: DataView) => Promise; + /** + * Persist the given saved search + * Resets the initial and current state of the saved search + */ + persist: ( + savedSearch: SavedSearch, + saveOptions?: SavedObjectSaveOpts + ) => Promise<{ id: string | undefined } | undefined>; + /** + * Set the persisted & current state of the saved search + * Happens when a saved search is loaded or a new one is created + * @param savedSearch + */ + set: (savedSearch: SavedSearch) => SavedSearch; + /** + * Updates the current state of the saved search + * @param params + */ + update: (params: UpdateParams) => SavedSearch; +} + +export function getSavedSearchContainer({ + services, +}: { + services: DiscoverServices; +}): DiscoverSavedSearchContainer { + const initialSavedSearch = getNewSavedSearch(services.data); + const savedSearchInitial$ = new BehaviorSubject(initialSavedSearch); + const savedSearchCurrent$ = new BehaviorSubject(copySavedSearch(initialSavedSearch)); + const hasChanged$ = new BehaviorSubject(false); + const set = (savedSearch: SavedSearch) => { + addLog('[savedSearch] set', savedSearch); + hasChanged$.next(false); + savedSearchCurrent$.next(savedSearch); + savedSearchInitial$.next(copySavedSearch(savedSearch)); + return savedSearch; + }; + const getState = () => savedSearchCurrent$.getValue(); + const getInitial$ = () => savedSearchInitial$; + const getCurrent$ = () => savedSearchCurrent$; + const getHasChanged$ = () => hasChanged$; + const getTitle = () => savedSearchCurrent$.getValue().title; + const getId = () => savedSearchCurrent$.getValue().id; + + const newSavedSearch = async (nextDataView: DataView | undefined) => { + addLog('[savedSearch] new', { nextDataView }); + const dataView = nextDataView ?? getState().searchSource.getField('index'); + const nextSavedSearch = await getNewSavedSearch(services.data); + nextSavedSearch.searchSource.setField('index', dataView); + const newAppState = getDefaultAppState(nextSavedSearch, services); + const nextSavedSearchToSet = updateSavedSearch({ + savedSearch: { ...nextSavedSearch }, + dataView, + state: newAppState, + services, + }); + return set(nextSavedSearchToSet); + }; + + const persist = async (nextSavedSearch: SavedSearch, saveOptions?: SavedObjectSaveOpts) => { + addLog('[savedSearch] persist', { nextSavedSearch, saveOptions }); + updateSavedSearch({ savedSearch: nextSavedSearch, services }, true); + + const id = await saveSavedSearch( + nextSavedSearch, + saveOptions || {}, + services.core.savedObjects.client, + services.savedObjectsTagging + ); + + if (id) { + set(nextSavedSearch); + } + return { id }; + }; + const update = ({ nextDataView, nextState, useFilterAndQueryServices }: UpdateParams) => { + addLog('[savedSearch] update', { nextDataView, nextState }); + + const previousSavedSearch = getState(); + const dataView = nextDataView + ? nextDataView + : previousSavedSearch.searchSource.getField('index')!; + + const nextSavedSearch = updateSavedSearch( + { + savedSearch: { ...previousSavedSearch }, + dataView, + state: nextState || {}, + services, + }, + useFilterAndQueryServices + ); + + const hasChanged = !isEqualSavedSearch(savedSearchInitial$.getValue(), nextSavedSearch); + hasChanged$.next(hasChanged); + savedSearchCurrent$.next(nextSavedSearch); + + addLog('[savedSearch] update done', nextSavedSearch); + return nextSavedSearch; + }; + + const load = async (id: string, dataView: DataView | undefined): Promise => { + addLog('[savedSearch] load', { id, dataView }); + const loadedSavedSearch = await getSavedSearch(id, { + search: services.data.search, + savedObjectsClient: services.core.savedObjects.client, + spaces: services.spaces, + savedObjectsTagging: services.savedObjectsTagging, + }); + if (!loadedSavedSearch.searchSource.getField('index') && dataView) { + loadedSavedSearch.searchSource.setField('index', dataView); + } + restoreStateFromSavedSearch({ + savedSearch: loadedSavedSearch, + timefilter: services.timefilter, + }); + return set(loadedSavedSearch); + }; + + return { + getCurrent$, + getHasChanged$, + getId, + getInitial$, + getState, + getTitle, + load, + new: newSavedSearch, + persist, + set, + update, + }; +} + +/** + * Copies a saved search object, due to the stateful nature of searchSource it has to be copied with a dedicated function + * @param savedSearch + */ +export function copySavedSearch(savedSearch: SavedSearch): SavedSearch { + return { + ...savedSearch, + ...{ searchSource: savedSearch.searchSource.createCopy() }, + }; +} + +export function getDefaultAppState(savedSearch: SavedSearch, services: DiscoverServices) { + return handleSourceColumnState( + getStateDefaults({ + savedSearch, + services, + }), + services.uiSettings + ); +} + +export function isEqualSavedSearch(savedSearchPrev: SavedSearch, savedSearchNext: SavedSearch) { + const { searchSource: prevSearchSource, ...prevSavedSearch } = savedSearchPrev; + const { searchSource: nextSearchSource, ...nextSavedSearchWithoutSearchSource } = savedSearchNext; + + const keys = new Set([ + ...Object.keys(prevSavedSearch), + ...Object.keys(nextSavedSearchWithoutSearchSource), + ]); + const savedSearchDiff = [...keys].filter((key: string) => { + // @ts-expect-error + return !isEqual(prevSavedSearch[key], nextSavedSearchWithoutSearchSource[key]); + }); + + const searchSourceDiff = + !isEqual(prevSearchSource.getField('filter'), nextSearchSource.getField('filter')) || + !isEqual(prevSearchSource.getField('query'), nextSearchSource.getField('query')) || + !isEqual(prevSearchSource.getField('index'), nextSearchSource.getField('index')); + const hasChanged = Boolean(savedSearchDiff.length || searchSourceDiff); + if (hasChanged) { + addLog('[savedSearch] difference between initial and changed version', searchSourceDiff); + } + return !hasChanged; +} diff --git a/src/plugins/discover/public/application/main/services/discover_search_session.ts b/src/plugins/discover/public/application/main/services/discover_search_session.ts index 0cbaf74159a80..c6c64ed89c10a 100644 --- a/src/plugins/discover/public/application/main/services/discover_search_session.ts +++ b/src/plugins/discover/public/application/main/services/discover_search_session.ts @@ -67,7 +67,6 @@ export class DiscoverSearchSessionManager { this.deps.session.restore(searchSessionIdFromURL); } } - return searchSessionIdFromURL ?? this.deps.session.start(); } diff --git a/src/plugins/discover/public/application/main/services/discover_state.test.ts b/src/plugins/discover/public/application/main/services/discover_state.test.ts index c2efd78b24c8f..ec0db6bdc290d 100644 --- a/src/plugins/discover/public/application/main/services/discover_state.test.ts +++ b/src/plugins/discover/public/application/main/services/discover_state.test.ts @@ -14,32 +14,69 @@ import { import { createBrowserHistory, History } from 'history'; import { dataPluginMock } from '@kbn/data-plugin/public/mocks'; import type { SavedSearch, SortOrder } from '@kbn/saved-search-plugin/public'; -import { savedSearchMock, savedSearchMockWithTimeField } from '../../../__mocks__/saved_search'; +import { + savedSearchAdHoc, + savedSearchMock, + savedSearchMockWithTimeField, + savedSearchMockWithTimeFieldNew, +} from '../../../__mocks__/saved_search'; import { discoverServiceMock } from '../../../__mocks__/services'; import { dataViewMock } from '../../../__mocks__/data_view'; -import { dataViewComplexMock } from '../../../__mocks__/data_view_complex'; import { DiscoverAppStateContainer } from './discover_app_state_container'; +import { waitFor } from '@testing-library/react'; +import { FetchStatus } from '../../types'; +import { dataViewAdHoc, dataViewComplexMock } from '../../../__mocks__/data_view_complex'; +import { copySavedSearch } from './discover_saved_search_container'; -let history: History; -let state: DiscoverStateContainer; -const getCurrentUrl = () => history.createHref(history.location); const startSync = (appState: DiscoverAppStateContainer) => { const { start, stop } = appState.syncState(); start(); return stop; }; +async function getState(url: string, savedSearch?: SavedSearch) { + const nextHistory = createBrowserHistory(); + nextHistory.push(url); + const nextState = getDiscoverStateContainer({ + services: discoverServiceMock, + history: nextHistory, + }); + jest.spyOn(nextState.dataState, 'fetch'); + await nextState.actions.loadDataViewList(); + if (savedSearch) { + nextState.savedSearchState.load = jest.fn(() => { + nextState.savedSearchState.set(copySavedSearch(savedSearch)); + return Promise.resolve(savedSearch); + }); + } else { + nextState.savedSearchState.load = jest.fn(() => { + nextState.savedSearchState.set(copySavedSearch(savedSearchMockWithTimeFieldNew)); + return Promise.resolve(savedSearchMockWithTimeFieldNew); + }); + } + + const getCurrentUrl = () => nextHistory.createHref(nextHistory.location); + return { + history: nextHistory, + state: nextState, + getCurrentUrl, + }; +} + describe('Test discover state', () => { let stopSync = () => {}; + let history: History; + let state: DiscoverStateContainer; + const getCurrentUrl = () => history.createHref(history.location); beforeEach(async () => { history = createBrowserHistory(); history.push('/'); state = getDiscoverStateContainer({ - savedSearch: savedSearchMock, services: discoverServiceMock, history, }); + state.savedSearchState.set(savedSearchMock); await state.appState.update({}, true); stopSync = startSync(state.appState); }); @@ -88,65 +125,38 @@ describe('Test discover state', () => { test('pauseAutoRefreshInterval sets refreshInterval.pause to true', async () => { history.push('/#?_g=(refreshInterval:(pause:!f,value:5000))'); expect(getCurrentUrl()).toBe('/#?_g=(refreshInterval:(pause:!f,value:5000))'); - await state.actions.pauseAutoRefreshInterval(); + await state.actions.setDataView(dataViewMock); expect(getCurrentUrl()).toBe('/#?_g=(refreshInterval:(pause:!t,value:5000))'); }); }); describe('Test discover initial state sort handling', () => { test('Non-empty sort in URL should not be overwritten by saved search sort', async () => { - history = createBrowserHistory(); - history.push('/#?_a=(sort:!(!(order_date,desc)))'); + const savedSearch = { + ...savedSearchMockWithTimeField, + ...{ sort: [['bytes', 'desc']] }, + } as SavedSearch; - state = getDiscoverStateContainer({ - savedSearch: { ...savedSearchMock, ...{ sort: [['bytes', 'desc']] } }, - services: discoverServiceMock, - history, - }); - await state.appState.update({}, true); - const stopSync = startSync(state.appState); - expect(state.appState.getState().sort).toEqual([['order_date', 'desc']]); - stopSync(); + const { state } = await getState('/#?_a=(sort:!(!(timestamp,desc)))', savedSearch); + const unsubscribe = state.actions.initializeAndSync(); + expect(state.appState.getState().sort).toEqual([['timestamp', 'desc']]); + unsubscribe(); }); - test('Empty sort in URL should use saved search sort for state', async () => { - history = createBrowserHistory(); - history.push('/#?_a=(sort:!())'); + test('Empty URL should use saved search sort for state', async () => { const nextSavedSearch = { ...savedSearchMock, ...{ sort: [['bytes', 'desc']] as SortOrder[] } }; - state = getDiscoverStateContainer({ - savedSearch: nextSavedSearch, - services: discoverServiceMock, - history, - }); - await state.appState.update({}, true); - const stopSync = startSync(state.appState); + const { state } = await getState('/', nextSavedSearch); + await state.actions.loadSavedSearch({ savedSearchId: savedSearchMock.id }); + const unsubscribe = state.actions.initializeAndSync(); expect(state.appState.getState().sort).toEqual([['bytes', 'desc']]); - stopSync(); - }); - test('Empty sort in URL and saved search should sort by timestamp', async () => { - history = createBrowserHistory(); - history.push('/#?_a=(sort:!())'); - state = getDiscoverStateContainer({ - savedSearch: savedSearchMockWithTimeField, - services: discoverServiceMock, - history, - }); - await state.appState.update({}, true); - const stopSync = startSync(state.appState); - expect(state.appState.getState().sort).toEqual([['timestamp', 'desc']]); - stopSync(); + unsubscribe(); }); }); describe('Test discover state with legacy migration', () => { test('migration of legacy query ', async () => { - history = createBrowserHistory(); - history.push( - "/#?_a=(query:(query_string:(analyze_wildcard:!t,query:'type:nice%20name:%22yeah%22')))" + const { state } = await getState( + "/#?_a=(query:(query_string:(analyze_wildcard:!t,query:'type:nice%20name:%22yeah%22')))", + savedSearchMockWithTimeFieldNew ); - state = getDiscoverStateContainer({ - savedSearch: savedSearchMock, - services: discoverServiceMock, - history, - }); expect(state.appState.getState().query).toMatchInlineSnapshot(` Object { "language": "lucene", @@ -163,7 +173,7 @@ describe('Test discover state with legacy migration', () => { describe('createSearchSessionRestorationDataProvider', () => { let mockSavedSearch: SavedSearch = {} as unknown as SavedSearch; - history = createBrowserHistory(); + const history = createBrowserHistory(); const mockDataPlugin = dataPluginMock.createStartContract(); const searchSessionInfoProvider = createSearchSessionRestorationDataProvider({ data: mockDataPlugin, @@ -225,35 +235,454 @@ describe('createSearchSessionRestorationDataProvider', () => { }); }); }); +}); - describe('actions', () => { - beforeEach(async () => { - history = createBrowserHistory(); - state = getDiscoverStateContainer({ - services: discoverServiceMock, - history, - savedSearch: savedSearchMock, - }); +describe('actions', () => { + beforeEach(async () => { + discoverServiceMock.data.query.timefilter.timefilter.getTime = jest.fn(() => { + return { from: 'now-15d', to: 'now' }; + }); + discoverServiceMock.data.search.searchSource.create = jest + .fn() + .mockReturnValue(savedSearchMock.searchSource); + discoverServiceMock.core.savedObjects.client.resolve = jest.fn().mockReturnValue({ + saved_object: { + attributes: { + kibanaSavedObjectMeta: { + searchSourceJSON: + '{"query":{"query":"","language":"kuery"},"filter":[],"indexRefName":"kibanaSavedObjectMeta.searchSourceJSON.index"}', + }, + title: 'The saved search that will save the world', + sort: [], + columns: ['test123'], + description: 'description', + hideChart: false, + }, + id: 'the-saved-search-id', + type: 'search', + references: [ + { + name: 'kibanaSavedObjectMeta.searchSourceJSON.index', + id: 'the-data-view-id', + type: 'index-pattern', + }, + ], + namespaces: ['default'], + }, + outcome: 'exactMatch', }); + }); + + afterEach(() => { + jest.clearAllMocks(); + }); - test('setDataView', async () => { - state.actions.setDataView(dataViewMock); - expect(state.internalState.getState().dataView).toBe(dataViewMock); + test('setDataView', async () => { + const { state } = await getState(''); + state.actions.setDataView(dataViewMock); + expect(state.internalState.getState().dataView).toBe(dataViewMock); + }); + + test('fetchData', async () => { + const { state } = await getState('/'); + const dataState = state.dataState; + await state.actions.loadDataViewList(); + expect(dataState.data$.main$.value.fetchStatus).toBe(FetchStatus.LOADING); + await state.actions.loadSavedSearch(); + const unsubscribe = state.actions.initializeAndSync(); + state.actions.fetchData(); + await waitFor(() => { + expect(dataState.data$.documents$.value.fetchStatus).toBe(FetchStatus.COMPLETE); }); + unsubscribe(); - test('appendAdHocDataViews', async () => { - state.actions.appendAdHocDataViews(dataViewMock); - expect(state.internalState.getState().adHocDataViews).toEqual([dataViewMock]); + expect(dataState.data$.totalHits$.value.result).toBe(0); + expect(dataState.data$.documents$.value.result).toEqual([]); + }); + test('loadDataViewList', async () => { + const { state } = await getState(''); + expect(state.internalState.getState().savedDataViews.length).toBe(3); + }); + test('loadSavedSearch with no id given an empty URL', async () => { + const { state, getCurrentUrl } = await getState(''); + await state.actions.loadDataViewList(); + const newSavedSearch = await state.actions.loadSavedSearch(); + expect(newSavedSearch?.id).toBeUndefined(); + const unsubscribe = state.actions.initializeAndSync(); + state.kbnUrlStateStorage.kbnUrlControls.flush(); + expect(getCurrentUrl()).toMatchInlineSnapshot( + `"/#?_g=(refreshInterval:(pause:!t,value:1000),time:(from:now-15d,to:now))&_a=(columns:!(default_column),index:the-data-view-id,interval:auto,sort:!())"` + ); + expect(state.savedSearchState.getHasChanged$().getValue()).toBe(false); + const { searchSource, ...savedSearch } = state.savedSearchState.getState(); + expect(savedSearch).toMatchInlineSnapshot(` + Object { + "columns": Array [ + "default_column", + ], + "refreshInterval": undefined, + "sort": Array [], + "timeRange": undefined, + "usesAdHocDataView": false, + } + `); + expect(searchSource.getField('index')?.id).toEqual('the-data-view-id'); + unsubscribe(); + }); + + test('loadNewSavedSearch given an empty URL using loadSavedSearch', async () => { + const { state, getCurrentUrl } = await getState('/'); + + const newSavedSearch = await state.actions.loadSavedSearch(); + expect(newSavedSearch?.id).toBeUndefined(); + const unsubscribe = state.actions.initializeAndSync(); + state.kbnUrlStateStorage.kbnUrlControls.flush(); + expect(getCurrentUrl()).toMatchInlineSnapshot( + `"/#?_g=(refreshInterval:(pause:!t,value:1000),time:(from:now-15d,to:now))&_a=(columns:!(default_column),index:the-data-view-id,interval:auto,sort:!())"` + ); + expect(state.savedSearchState.getHasChanged$().getValue()).toBe(false); + unsubscribe(); + }); + test('loadNewSavedSearch with URL changing interval state', async () => { + const { state, getCurrentUrl } = await getState( + '/#?_a=(interval:month,columns:!(bytes))&_g=()' + ); + const newSavedSearch = await state.actions.loadSavedSearch({ useAppState: true }); + expect(newSavedSearch?.id).toBeUndefined(); + const unsubscribe = state.actions.initializeAndSync(); + state.kbnUrlStateStorage.kbnUrlControls.flush(); + expect(getCurrentUrl()).toMatchInlineSnapshot( + `"/#?_a=(columns:!(bytes),index:the-data-view-id,interval:month,sort:!())&_g=()"` + ); + expect(state.savedSearchState.getHasChanged$().getValue()).toBe(true); + unsubscribe(); + }); + test('loadSavedSearch with no id, given URL changes state', async () => { + const { state, getCurrentUrl } = await getState( + '/#?_a=(interval:month,columns:!(bytes))&_g=()' + ); + const newSavedSearch = await state.actions.loadSavedSearch({ useAppState: true }); + expect(newSavedSearch?.id).toBeUndefined(); + const unsubscribe = state.actions.initializeAndSync(); + state.kbnUrlStateStorage.kbnUrlControls.flush(); + expect(getCurrentUrl()).toMatchInlineSnapshot( + `"/#?_a=(columns:!(bytes),index:the-data-view-id,interval:month,sort:!())&_g=()"` + ); + expect(state.savedSearchState.getHasChanged$().getValue()).toBe(true); + unsubscribe(); + }); + test('loadSavedSearch given an empty URL, no state changes', async () => { + const { state, getCurrentUrl } = await getState('/', savedSearchMock); + const newSavedSearch = await state.actions.loadSavedSearch({ + savedSearchId: 'the-saved-search-id', }); - test('removeAdHocDataViewById', async () => { - state.actions.appendAdHocDataViews(dataViewMock); - state.actions.removeAdHocDataViewById(dataViewMock.id!); - expect(state.internalState.getState().adHocDataViews).toEqual([]); + const unsubscribe = state.actions.initializeAndSync(); + state.kbnUrlStateStorage.kbnUrlControls.flush(); + expect(newSavedSearch?.id).toBe('the-saved-search-id'); + expect(getCurrentUrl()).toMatchInlineSnapshot( + `"/#?_g=(refreshInterval:(pause:!t,value:1000),time:(from:now-15d,to:now))&_a=(columns:!(default_column),index:the-data-view-id,interval:auto,sort:!())"` + ); + expect(state.savedSearchState.getHasChanged$().getValue()).toBe(false); + unsubscribe(); + }); + test('loadSavedSearch given a URL with different interval and columns modifying the state', async () => { + const url = '/#?_a=(interval:month,columns:!(message))&_g=()'; + const { state, getCurrentUrl } = await getState(url, savedSearchMock); + await state.actions.loadSavedSearch({ savedSearchId: savedSearchMock.id, useAppState: true }); + const unsubscribe = state.actions.initializeAndSync(); + state.kbnUrlStateStorage.kbnUrlControls.flush(); + expect(getCurrentUrl()).toMatchInlineSnapshot( + `"/#?_a=(columns:!(message),index:the-data-view-id,interval:month,sort:!())&_g=()"` + ); + expect(state.savedSearchState.getHasChanged$().getValue()).toBe(true); + unsubscribe(); + }); + + test('loadSavedSearch ignoring hideChart in URL', async () => { + const url = '/#?_a=(hideChart:true,columns:!(message))&_g=()'; + const { state } = await getState(url, savedSearchMock); + await state.actions.loadSavedSearch(); + expect(state.savedSearchState.getState().hideChart).toBe(undefined); + expect(state.appState.getState().hideChart).toBe(undefined); + }); + + test('loadSavedSearch without id ignoring invalid index in URL, adding a warning toast', async () => { + const url = '/#?_a=(index:abc)&_g=()'; + const { state } = await getState(url, savedSearchMock); + await state.actions.loadSavedSearch({ useAppState: true }); + expect(state.savedSearchState.getState().searchSource.getField('index')?.id).toBe( + 'the-data-view-id' + ); + expect(discoverServiceMock.toastNotifications.addWarning).toHaveBeenCalledWith( + expect.objectContaining({ + 'data-test-subj': 'dscDataViewNotFoundShowDefaultWarning', + }) + ); + }); + + test('loadSavedSearch without id containing sql, adding no warning toast with an invalid index', async () => { + const url = "/#?_a=(index:abcde,query:(sql:'Select * from test'))&_g=()"; + const { state } = await getState(url, savedSearchMock); + await state.actions.loadSavedSearch({ useAppState: true }); + expect(discoverServiceMock.toastNotifications.addWarning).not.toHaveBeenCalled(); + }); + + test('loadSavedSearch with id ignoring invalid index in URL, adding a warning toast', async () => { + const url = '/#?_a=(index:abc)&_g=()'; + const { state } = await getState(url, savedSearchMock); + await state.actions.loadSavedSearch({ useAppState: true, savedSearchId: savedSearchMock.id }); + expect(state.savedSearchState.getState().searchSource.getField('index')?.id).toBe( + 'the-data-view-id' + ); + expect(discoverServiceMock.toastNotifications.addWarning).toHaveBeenCalledWith( + expect.objectContaining({ + 'data-test-subj': 'dscDataViewNotFoundShowSavedWarning', + }) + ); + }); + + test('loadSavedSearch data view handling', async () => { + const { state } = await getState('/', savedSearchMock); + await state.actions.loadSavedSearch({ savedSearchId: savedSearchMock.id }); + expect(state.savedSearchState.getState().searchSource.getField('index')?.id).toBe( + 'the-data-view-id' + ); + expect(state.savedSearchState.getHasChanged$().getValue()).toBe(false); + + state.savedSearchState.load = jest.fn().mockReturnValue(savedSearchMockWithTimeField); + // unsetting the previous index else this is considered as update to the persisted saved search + state.appState.set({ index: undefined }); + await state.actions.loadSavedSearch({ savedSearchId: 'the-saved-search-id-with-timefield' }); + expect(state.savedSearchState.getState().searchSource.getField('index')?.id).toBe( + 'index-pattern-with-timefield-id' + ); + expect(state.savedSearchState.getHasChanged$().getValue()).toBe(false); + + // switch back to the previous savedSearch, but not cleaning up appState index, so it's considered as update to the persisted saved search + await state.actions.loadSavedSearch({ savedSearchId: savedSearchMock.id, useAppState: true }); + expect(state.savedSearchState.getState().searchSource.getField('index')?.id).toBe( + 'index-pattern-with-timefield-id' + ); + expect(state.savedSearchState.getHasChanged$().getValue()).toBe(true); + }); + test('loadSavedSearch generating a new saved search, updated by ad-hoc data view', async () => { + const { state } = await getState('/'); + const dataViewSpecMock = { + id: 'mock-id', + title: 'mock-title', + timeFieldName: 'mock-time-field-name', + }; + const dataViewsCreateMock = discoverServiceMock.dataViews.create as jest.Mock; + dataViewsCreateMock.mockImplementation(() => ({ + ...dataViewMock, + ...dataViewSpecMock, + isPersisted: () => false, + })); + await state.actions.loadSavedSearch({ dataViewSpec: dataViewSpecMock }); + expect(state.savedSearchState.getInitial$().getValue().id).toEqual(undefined); + expect(state.savedSearchState.getCurrent$().getValue().id).toEqual(undefined); + expect( + state.savedSearchState.getInitial$().getValue().searchSource?.getField('index')?.id + ).toEqual(dataViewSpecMock.id); + expect( + state.savedSearchState.getCurrent$().getValue().searchSource?.getField('index')?.id + ).toEqual(dataViewSpecMock.id); + expect(state.savedSearchState.getHasChanged$().getValue()).toEqual(false); + expect(state.internalState.getState().adHocDataViews.length).toBe(1); + }); + + test('loadSavedSearch resetting query & filters of data service', async () => { + const { state } = await getState('/', savedSearchMock); + await state.actions.loadSavedSearch({ savedSearchId: savedSearchMock.id }); + expect(discoverServiceMock.data.query.queryString.clearQuery).toHaveBeenCalled(); + expect(discoverServiceMock.data.query.filterManager.setAppFilters).toHaveBeenCalledWith([]); + }); + + test('loadSavedSearch setting query & filters of data service if query and filters are persisted', async () => { + const savedSearchWithQueryAndFilters = copySavedSearch(savedSearchMock); + const query = { query: "foo: 'bar'", language: 'kql' }; + const filters = [{ meta: { index: 'the-data-view-id' }, query: { match_all: {} } }]; + savedSearchWithQueryAndFilters.searchSource.setField('query', query); + savedSearchWithQueryAndFilters.searchSource.setField('filter', filters); + const { state } = await getState('/', savedSearchWithQueryAndFilters); + await state.actions.loadSavedSearch({ savedSearchId: savedSearchMock.id }); + expect(discoverServiceMock.data.query.queryString.setQuery).toHaveBeenCalledWith(query); + expect(discoverServiceMock.data.query.filterManager.setAppFilters).toHaveBeenCalledWith( + filters + ); + }); + + test('loadSavedSearch with ad-hoc data view being added to internal state adHocDataViews', async () => { + const savedSearchAdHocCopy = copySavedSearch(savedSearchAdHoc); + const adHocDataViewId = savedSearchAdHoc.searchSource.getField('index')!.id; + const { state } = await getState('/', savedSearchAdHocCopy); + await state.actions.loadSavedSearch({ savedSearchId: savedSearchAdHoc.id }); + expect(state.appState.getState().index).toBe(adHocDataViewId); + expect(state.internalState.getState().adHocDataViews[0].id).toBe(adHocDataViewId); + }); + + test('onChangeDataView', async () => { + const { state, getCurrentUrl } = await getState('/', savedSearchMock); + await state.actions.loadSavedSearch({ savedSearchId: savedSearchMock.id }); + expect(state.savedSearchState.getState().searchSource.getField('index')!.id).toBe( + dataViewMock.id + ); + const unsubscribe = state.actions.initializeAndSync(); + state.kbnUrlStateStorage.kbnUrlControls.flush(); + expect(getCurrentUrl()).toMatchInlineSnapshot( + `"/#?_g=(refreshInterval:(pause:!t,value:1000),time:(from:now-15d,to:now))&_a=(columns:!(default_column),index:the-data-view-id,interval:auto,sort:!())"` + ); + await state.actions.onChangeDataView(dataViewComplexMock.id!); + await waitFor(() => { + expect(state.internalState.getState().dataView?.id).toBe(dataViewComplexMock.id); + }); + expect(state.appState.get().index).toBe(dataViewComplexMock.id); + expect(state.savedSearchState.getState().searchSource.getField('index')!.id).toBe( + dataViewComplexMock.id + ); + unsubscribe(); + }); + test('onDataViewCreated - persisted data view', async () => { + const { state } = await getState('/', savedSearchMock); + await state.actions.loadSavedSearch({ savedSearchId: savedSearchMock.id }); + const unsubscribe = state.actions.initializeAndSync(); + await state.actions.onDataViewCreated(dataViewComplexMock); + await waitFor(() => { + expect(state.internalState.getState().dataView?.id).toBe(dataViewComplexMock.id); }); - test('replaceAdHocDataViewWithId', async () => { - state.actions.appendAdHocDataViews(dataViewMock); - state.actions.replaceAdHocDataViewWithId(dataViewMock.id!, dataViewComplexMock); - expect(state.internalState.getState().adHocDataViews).toEqual([dataViewComplexMock]); + expect(state.appState.get().index).toBe(dataViewComplexMock.id); + expect(state.savedSearchState.getState().searchSource.getField('index')!.id).toBe( + dataViewComplexMock.id + ); + unsubscribe(); + }); + test('onDataViewCreated - ad-hoc data view', async () => { + const { state } = await getState('/', savedSearchMock); + await state.actions.loadSavedSearch({ savedSearchId: savedSearchMock.id }); + const unsubscribe = state.actions.initializeAndSync(); + await state.actions.onDataViewCreated(dataViewAdHoc); + await waitFor(() => { + expect(state.internalState.getState().dataView?.id).toBe(dataViewAdHoc.id); + }); + expect(state.appState.get().index).toBe(dataViewAdHoc.id); + expect(state.savedSearchState.getState().searchSource.getField('index')!.id).toBe( + dataViewAdHoc.id + ); + unsubscribe(); + }); + test('onDataViewEdited - persisted data view', async () => { + const { state } = await getState('/', savedSearchMock); + await state.actions.loadSavedSearch({ savedSearchId: savedSearchMock.id }); + const selectedDataView = state.internalState.getState().dataView; + await waitFor(() => { + expect(selectedDataView).toBe(dataViewMock); + }); + const unsubscribe = state.actions.initializeAndSync(); + await state.actions.onDataViewEdited(dataViewMock); + + await waitFor(() => { + expect(state.internalState.getState().dataView).not.toBe(selectedDataView); + }); + unsubscribe(); + }); + test('onDataViewEdited - ad-hoc data view', async () => { + const { state } = await getState('/', savedSearchMock); + const unsubscribe = state.actions.initializeAndSync(); + await state.actions.onDataViewCreated(dataViewAdHoc); + const previousId = dataViewAdHoc.id; + await state.actions.onDataViewEdited(dataViewAdHoc); + await waitFor(() => { + expect(state.internalState.getState().dataView?.id).not.toBe(previousId); + }); + unsubscribe(); + }); + + test('onOpenSavedSearch - same target id', async () => { + const { state } = await getState('/', savedSearchMock); + const unsubscribe = state.actions.initializeAndSync(); + await state.actions.loadSavedSearch({ savedSearchId: savedSearchMock.id }); + await state.savedSearchState.update({ nextState: { hideChart: true } }); + expect(state.savedSearchState.getState().hideChart).toBe(true); + await state.actions.onOpenSavedSearch(savedSearchMock.id!); + expect(state.savedSearchState.getState().hideChart).toBe(undefined); + unsubscribe(); + }); + + test('onOpenSavedSearch - cleanup of previous filter', async () => { + const { state } = await getState( + "/#?_g=(filters:!(),refreshInterval:(pause:!t,value:60000),time:(from:now-15m,to:now))&_a=(columns:!(customer_first_name),filters:!(('$state':(store:appState),meta:(alias:!n,disabled:!f,index:ff959d40-b880-11e8-a6d9-e546fe2bba5f,key:customer_first_name,negate:!f,params:(query:Mary),type:phrase),query:(match_phrase:(customer_first_name:Mary)))),hideChart:!f,index:ff959d40-b880-11e8-a6d9-e546fe2bba5f,interval:auto,query:(language:kuery,query:''),sort:!())", + savedSearchMock + ); + await state.actions.loadSavedSearch({ savedSearchId: savedSearchMock.id, useAppState: true }); + expect(state.appState.get().filters).toHaveLength(1); + await state.actions.loadSavedSearch({ useAppState: false }); + expect(state.appState.get().filters).toHaveLength(0); + }); + + test('onCreateDefaultAdHocDataView', async () => { + discoverServiceMock.dataViews.create = jest.fn().mockReturnValue({ + ...dataViewMock, + isPersisted: () => false, + id: 'ad-hoc-id', + title: 'test', + }); + const { state } = await getState('/', savedSearchMock); + await state.actions.loadSavedSearch({ savedSearchId: savedSearchMock.id }); + const unsubscribe = state.actions.initializeAndSync(); + await state.actions.onCreateDefaultAdHocDataView('ad-hoc-test'); + expect(state.appState.getState().index).toBe('ad-hoc-id'); + expect(state.internalState.getState().adHocDataViews[0].id).toBe('ad-hoc-id'); + unsubscribe(); + }); + test('undoSavedSearchChanges - when changing data views', async () => { + const { state, getCurrentUrl } = await getState('/', savedSearchMock); + // Load a given persisted saved search + await state.actions.loadSavedSearch({ savedSearchId: savedSearchMock.id }); + const unsubscribe = state.actions.initializeAndSync(); + state.kbnUrlStateStorage.kbnUrlControls.flush(); + const initialUrlState = + '/#?_g=(refreshInterval:(pause:!t,value:1000),time:(from:now-15d,to:now))&_a=(columns:!(default_column),index:the-data-view-id,interval:auto,sort:!())'; + expect(getCurrentUrl()).toBe(initialUrlState); + expect(state.internalState.getState().dataView?.id).toBe(dataViewMock.id!); + + // Change the data view, this should change the URL and trigger a fetch + await state.actions.onChangeDataView(dataViewComplexMock.id!); + state.kbnUrlStateStorage.kbnUrlControls.flush(); + expect(getCurrentUrl()).toMatchInlineSnapshot( + `"/#?_g=(refreshInterval:(pause:!t,value:1000),time:(from:now-15d,to:now))&_a=(columns:!(default_column),index:data-view-with-various-field-types-id,interval:auto,sort:!(!(data,desc)))"` + ); + await waitFor(() => { + expect(state.dataState.fetch).toHaveBeenCalledTimes(1); + }); + expect(state.internalState.getState().dataView?.id).toBe(dataViewComplexMock.id!); + + // Undo all changes to the saved search, this should trigger a fetch, again + await state.actions.undoSavedSearchChanges(); + state.kbnUrlStateStorage.kbnUrlControls.flush(); + expect(getCurrentUrl()).toBe(initialUrlState); + await waitFor(() => { + expect(state.dataState.fetch).toHaveBeenCalledTimes(2); + }); + expect(state.internalState.getState().dataView?.id).toBe(dataViewMock.id!); + + unsubscribe(); + }); + + test('undoSavedSearchChanges with timeRestore', async () => { + const { state } = await getState('/', { + ...savedSearchMockWithTimeField, + timeRestore: true, + refreshInterval: { pause: false, value: 1000 }, + timeRange: { from: 'now-15d', to: 'now-10d' }, }); + const setTime = jest.fn(); + const setRefreshInterval = jest.fn(); + discoverServiceMock.data.query.timefilter.timefilter.setTime = setTime; + discoverServiceMock.data.query.timefilter.timefilter.setRefreshInterval = setRefreshInterval; + await state.actions.loadSavedSearch({ savedSearchId: savedSearchMock.id }); + await state.actions.undoSavedSearchChanges(); + expect(setTime).toHaveBeenCalledTimes(1); + expect(setTime).toHaveBeenCalledWith({ from: 'now-15d', to: 'now-10d' }); + expect(setRefreshInterval).toHaveBeenCalledWith({ pause: false, value: 1000 }); }); }); diff --git a/src/plugins/discover/public/application/main/services/discover_state.ts b/src/plugins/discover/public/application/main/services/discover_state.ts index c283f09a48966..be4a93917de06 100644 --- a/src/plugins/discover/public/application/main/services/discover_state.ts +++ b/src/plugins/discover/public/application/main/services/discover_state.ts @@ -16,13 +16,21 @@ import { } from '@kbn/kibana-utils-plugin/public'; import { DataPublicPluginStart, - FilterManager, QueryState, SearchSessionInfoProvider, } from '@kbn/data-plugin/public'; -import { DataView } from '@kbn/data-views-plugin/public'; -import { SavedSearch } from '@kbn/saved-search-plugin/public'; -import { loadDataView, resolveDataView } from '../utils/resolve_data_view'; +import { DataView, DataViewSpec, DataViewType } from '@kbn/data-views-plugin/public'; +import type { SavedSearch } from '@kbn/saved-search-plugin/public'; +import { v4 as uuidv4 } from 'uuid'; +import { merge } from 'rxjs'; +import { AggregateQuery, Query, TimeRange } from '@kbn/es-query'; +import { loadSavedSearch as loadSavedSearchFn } from './load_saved_search'; +import { restoreStateFromSavedSearch } from '../../../services/saved_searches/restore_from_saved_search'; +import { FetchStatus } from '../../types'; +import { changeDataView } from '../hooks/utils/change_data_view'; +import { buildStateSubscribe } from '../hooks/utils/build_state_subscribe'; +import { addLog } from '../../../utils/add_log'; +import { getUrlTracker } from '../../../kibana_services'; import { DiscoverDataStateContainer, getDataStateContainer } from './discover_data_state_container'; import { DiscoverSearchSessionManager } from './discover_search_session'; import { DISCOVER_APP_LOCATOR, DiscoverAppLocatorParams } from '../../../../common'; @@ -37,6 +45,12 @@ import { getInternalStateContainer, } from './discover_internal_state_container'; import { DiscoverServices } from '../../../build_services'; +import { + getDefaultAppState, + getSavedSearchContainer, + DiscoverSavedSearchContainer, +} from './discover_saved_search_container'; +import { updateFiltersReferences } from '../utils/update_filter_references'; interface DiscoverStateContainerParams { /** * Browser history @@ -45,89 +59,135 @@ interface DiscoverStateContainerParams { /** * The current savedSearch */ - savedSearch: SavedSearch; + savedSearch?: string | SavedSearch; /** * core ui settings service */ services: DiscoverServices; } -export interface DiscoverStateContainer { +export interface LoadParams { /** - * kbnUrlStateStorage + * the id of the saved search to load, if undefined, a new saved search will be created */ - kbnUrlStateStorage: IKbnUrlStateStorage; + savedSearchId?: string; + /** + * the data view to use, if undefined, the saved search's data view will be used + */ + dataView?: DataView; + /** + * the data view spec to use, if undefined, the saved search's data view will be used + */ + dataViewSpec?: DataViewSpec; + /** + * determines if AppState should be used to update the saved search + * URL is overwriting savedSearch params in this case + */ + useAppState?: boolean; +} + +export interface DiscoverStateContainer { /** * App state, the _a part of the URL */ appState: DiscoverAppStateContainer; /** - * Internal state that's used at several places in the UI + * Data fetching related state + **/ + dataState: DiscoverDataStateContainer; + /** + * Internal shared state that's used at several places in the UI */ internalState: DiscoverInternalStateContainer; + /** + * kbnUrlStateStorage - it keeps the state in sync with the URL + */ + kbnUrlStateStorage: IKbnUrlStateStorage; + /** + * State of saved search, the saved object of Discover + */ + savedSearchState: DiscoverSavedSearchContainer; /** * Service for handling search sessions */ searchSessionManager: DiscoverSearchSessionManager; /** - * Data fetching related state - **/ - dataState: DiscoverDataStateContainer; - /** - * functions executed by UI + * Complex functions to update multiple containers from UI */ actions: { /** - * Pause the auto refresh interval without pushing an entry to history + * Triggers fetching of new data from Elasticsearch + * If initial is true, when SEARCH_ON_PAGE_LOAD_SETTING is set to false and it's a new saved search no fetch is triggered + * @param initial */ - pauseAutoRefreshInterval: () => Promise; - /** - * Set the currently selected data view - */ - setDataView: (dataView: DataView) => void; + fetchData: (initial?: boolean) => void; /** - * Load the data view of the given id - * A fallback data view is returned, given there's no match - * This is usually the default data view - * @param dataViewId - * @param savedSearch + * Initializing state containers and start subscribing to changes triggering e.g. data fetching */ - loadAndResolveDataView: ( - dataViewId: string, - savedSearch: SavedSearch - ) => Promise<{ fallback: boolean; dataView: DataView }>; + initializeAndSync: () => () => void; /** * Load current list of data views, add them to internal state */ loadDataViewList: () => Promise; /** - * Set new adhoc data view list + * Load a saved search by id or create a new one that's not persisted yet + * @param LoadParams - optional parameters to load a saved search */ - setAdHocDataViews: (dataViews: DataView[]) => void; + loadSavedSearch: (param?: LoadParams) => Promise; /** - * Append a given ad-hoc data views to the list of ad-hoc data view + * Create and select a temporary/adhoc data view by a given index pattern + * Used by the Data View Picker + * @param pattern */ - appendAdHocDataViews: (dataViews: DataView | DataView[]) => void; + onCreateDefaultAdHocDataView: (pattern: string) => Promise; /** - * Remove the ad-hoc data view of the given id from the list of ad-hoc data view - * @param id + * Triggered when a new data view is created + * @param dataView + */ + onDataViewCreated: (dataView: DataView) => Promise; + /** + * Triggered when a new data view is edited + * @param dataView + */ + onDataViewEdited: (dataView: DataView) => Promise; + /** + * Triggered when a saved search is opened in the savedObject finder + * @param savedSearchId + */ + onOpenSavedSearch: (savedSearchId: string) => void; + /** + * Triggered when the unified search bar query is updated + * @param payload + * @param isUpdate + */ + onUpdateQuery: ( + payload: { dateRange: TimeRange; query?: Query | AggregateQuery }, + isUpdate?: boolean + ) => void; + /** + * Triggered when the user selects a different data view in the data view picker + * @param id - id of the data view */ - removeAdHocDataViewById: (id: string) => void; + onChangeDataView: (id: string) => Promise; /** - * Replace the data view of the given id with the given data view - * Used when the spec of a data view changed to prevent duplicates - * @param id + * Triggered when an ad-hoc data view is persisted to allow sharing links and CSV + * @param dataView + */ + persistAdHocDataView: (dataView: DataView) => Promise; + /** + * Set the currently selected data view * @param dataView */ - replaceAdHocDataViewWithId: (id: string, dataView: DataView) => void; + setDataView: (dataView: DataView) => void; + /** + * Undo changes made to the saved search, e.g. when the user triggers the "Reset search" button + */ + undoSavedSearchChanges: () => void; /** - * Initialize state with filters and query, start state syncing + * When saving a saved search with an ad hoc data view, a new id needs to be generated for the data view + * This is to prevent duplicate ids messing with our system */ - initializeAndSync: ( - dataView: DataView, - filterManager: FilterManager, - data: DataPublicPluginStart - ) => () => void; + updateAdHocDataViewId: () => void; }; } @@ -137,11 +197,13 @@ export interface DiscoverStateContainer { */ export function getDiscoverStateContainer({ history, - savedSearch, services, }: DiscoverStateContainerParams): DiscoverStateContainer { const storeInSessionStorage = services.uiSettings.get('state:storeInSessionStorage'); const toasts = services.core.notifications.toasts; + /** + * state storage for state in the URL + */ const stateStorage = createKbnUrlStateStorage({ useHash: storeInSessionStorage, history, @@ -156,78 +218,259 @@ export function getDiscoverStateContainer({ session: services.data.search.session, }); /** - * App State Container, synced with URL + * Saved Search State Container, the persisted saved object of Discover */ - const appStateContainer = getDiscoverAppStateContainer({ stateStorage, savedSearch, services }); + const savedSearchContainer = getSavedSearchContainer({ + services, + }); + /** + * App State Container, synced with the _a part URL + */ + const appStateContainer = getDiscoverAppStateContainer({ + stateStorage, + savedSearch: savedSearchContainer.getState(), + services, + }); + /** + * Internal State Container, state that's not persisted and not part of the URL + */ const internalStateContainer = getInternalStateContainer(); - const pauseAutoRefreshInterval = async () => { - const state = stateStorage.get(GLOBAL_STATE_URL_KEY); - if (state?.refreshInterval && !state.refreshInterval.pause) { - await stateStorage.set( - GLOBAL_STATE_URL_KEY, - { ...state, refreshInterval: { ...state?.refreshInterval, pause: true } }, - { replace: true } - ); - } - }; - const dataStateContainer = getDataStateContainer({ services, searchSessionManager, getAppState: appStateContainer.getState, - getSavedSearch: () => { - // Simulating the behavior of the removed hook to always create a clean searchSource child that - // we then use to add query, filters, etc., will be removed soon. - return { ...savedSearch, searchSource: savedSearch.searchSource.createChild() }; - }, - appStateContainer, + getSavedSearch: savedSearchContainer.getState, }); + + const pauseAutoRefreshInterval = async (dataView: DataView) => { + if (dataView && (!dataView.isTimeBased() || dataView.type === DataViewType.ROLLUP)) { + const state = stateStorage.get(GLOBAL_STATE_URL_KEY); + if (state?.refreshInterval && !state.refreshInterval.pause) { + await stateStorage.set( + GLOBAL_STATE_URL_KEY, + { ...state, refreshInterval: { ...state?.refreshInterval, pause: true } }, + { replace: true } + ); + } + } + }; + const setDataView = (dataView: DataView) => { internalStateContainer.transitions.setDataView(dataView); + pauseAutoRefreshInterval(dataView); + savedSearchContainer.getState().searchSource.setField('index', dataView); }; - const setAdHocDataViews = (dataViews: DataView[]) => - internalStateContainer.transitions.setAdHocDataViews(dataViews); - const appendAdHocDataViews = (dataViews: DataView | DataView[]) => - internalStateContainer.transitions.appendAdHocDataViews(dataViews); - const replaceAdHocDataViewWithId = (id: string, dataView: DataView) => - internalStateContainer.transitions.replaceAdHocDataViewWithId(id, dataView); - const removeAdHocDataViewById = (id: string) => - internalStateContainer.transitions.removeAdHocDataViewById(id); const loadDataViewList = async () => { const dataViewList = await services.dataViews.getIdsWithTitle(true); internalStateContainer.transitions.setSavedDataViews(dataViewList); }; - const loadAndResolveDataView = async (id: string, actualSavedSearch: SavedSearch) => { - const nextDataViewData = await loadDataView(services.dataViews, services.uiSettings, id); - const nextDataView = resolveDataView( - nextDataViewData, - actualSavedSearch.searchSource, - services.toastNotifications + /** + * When saving a saved search with an ad hoc data view, a new id needs to be generated for the data view + * This is to prevent duplicate ids messing with our system + */ + const updateAdHocDataViewId = async () => { + const prevDataView = internalStateContainer.getState().dataView; + if (!prevDataView || prevDataView.isPersisted()) return; + const newDataView = await services.dataViews.create({ ...prevDataView.toSpec(), id: uuidv4() }); + services.dataViews.clearInstanceCache(prevDataView.id); + + updateFiltersReferences(prevDataView, newDataView); + + internalStateContainer.transitions.replaceAdHocDataViewWithId(prevDataView.id!, newDataView); + await appStateContainer.replaceUrlState({ index: newDataView.id }); + const trackingEnabled = Boolean(newDataView.isPersisted() || savedSearchContainer.getId()); + getUrlTracker().setTrackingEnabled(trackingEnabled); + + return newDataView; + }; + + const onOpenSavedSearch = async (newSavedSearchId: string) => { + addLog('[discoverState] onOpenSavedSearch', newSavedSearchId); + const currentSavedSearch = savedSearchContainer.getState(); + if (currentSavedSearch.id && currentSavedSearch.id === newSavedSearchId) { + addLog('[discoverState] undo changes since saved search did not change'); + await undoSavedSearchChanges(); + } else { + addLog('[discoverState] onOpenSavedSearch open view URL'); + services.locator.navigate({ + savedSearchId: newSavedSearchId, + }); + } + }; + + const onDataViewCreated = async (nextDataView: DataView) => { + if (!nextDataView.isPersisted()) { + internalStateContainer.transitions.appendAdHocDataViews(nextDataView); + } else { + await loadDataViewList(); + } + if (nextDataView.id) { + await onChangeDataView(nextDataView); + } + }; + + const onDataViewEdited = async (editedDataView: DataView) => { + if (editedDataView.isPersisted()) { + // Clear the current data view from the cache and create a new instance + // of it, ensuring we have a new object reference to trigger a re-render + services.dataViews.clearInstanceCache(editedDataView.id); + setDataView(await services.dataViews.create(editedDataView.toSpec(), true)); + } else { + await updateAdHocDataViewId(); + } + loadDataViewList(); + fetchData(); + }; + + const persistAdHocDataView = async (adHocDataView: DataView) => { + const persistedDataView = await services.dataViews.createAndSave({ + ...adHocDataView.toSpec(), + id: uuidv4(), + }); + services.dataViews.clearInstanceCache(adHocDataView.id); + updateFiltersReferences(adHocDataView, persistedDataView); + internalStateContainer.transitions.removeAdHocDataViewById(adHocDataView.id!); + await appStateContainer.update({ index: persistedDataView.id }, true); + return persistedDataView; + }; + + const loadSavedSearch = async (params?: LoadParams): Promise => { + return loadSavedSearchFn(params ?? {}, { + appStateContainer, + dataStateContainer, + internalStateContainer, + savedSearchContainer, + services, + setDataView, + }); + }; + + /** + * state containers initializing and subscribing to changes triggering e.g. data fetching + */ + const initializeAndSync = () => { + // initialize app state container, syncing with _g and _a part of the URL + const appStateInitAndSyncUnsubscribe = appStateContainer.initAndSync( + savedSearchContainer.getState() ); - return { fallback: !nextDataViewData.stateValFound, dataView: nextDataView }; + // subscribing to state changes of appStateContainer, triggering data fetching + const appStateUnsubscribe = appStateContainer.subscribe( + buildStateSubscribe({ + appState: appStateContainer, + savedSearchState: savedSearchContainer, + dataState: dataStateContainer, + internalState: internalStateContainer, + services, + setDataView, + }) + ); + // start subscribing to dataStateContainer, triggering data fetching + const unsubscribeData = dataStateContainer.subscribe(); + + // updates saved search when query or filters change, triggers data fetching + const filterUnsubscribe = merge( + services.data.query.queryString.getUpdates$(), + services.filterManager.getFetches$() + ).subscribe(async () => { + await savedSearchContainer.update({ + nextDataView: internalStateContainer.getState().dataView, + nextState: appStateContainer.getState(), + useFilterAndQueryServices: true, + }); + fetchData(); + }); + + return () => { + unsubscribeData(); + appStateUnsubscribe(); + appStateInitAndSyncUnsubscribe(); + filterUnsubscribe.unsubscribe(); + }; + }; + + const onCreateDefaultAdHocDataView = async (pattern: string) => { + const newDataView = await services.dataViews.create({ + title: pattern, + }); + if (newDataView.fields.getByName('@timestamp')?.type === 'date') { + newDataView.timeFieldName = '@timestamp'; + } + internalStateContainer.transitions.appendAdHocDataViews(newDataView); + + await onChangeDataView(newDataView); + }; + /** + * Triggered when a user submits a query in the search bar + */ + const onUpdateQuery = ( + payload: { dateRange: TimeRange; query?: Query | AggregateQuery }, + isUpdate?: boolean + ) => { + if (isUpdate === false) { + // remove the search session if the given query is not just updated + searchSessionManager.removeSearchSessionIdFromURL({ replace: false }); + dataStateContainer.fetch(); + } + }; + + /** + * Function e.g. triggered when user changes data view in the sidebar + */ + const onChangeDataView = async (id: string | DataView) => { + await changeDataView(id, { + services, + internalState: internalStateContainer, + appState: appStateContainer, + }); + }; + /** + * Undo all changes to the current saved search + */ + const undoSavedSearchChanges = async () => { + addLog('undoSavedSearchChanges'); + const nextSavedSearch = savedSearchContainer.getInitial$().getValue(); + await savedSearchContainer.set(nextSavedSearch); + restoreStateFromSavedSearch({ + savedSearch: nextSavedSearch, + timefilter: services.timefilter, + }); + const newAppState = getDefaultAppState(nextSavedSearch, services); + await appStateContainer.replaceUrlState(newAppState); + return nextSavedSearch; + }; + const fetchData = (initial: boolean = false) => { + addLog('fetchData', { initial }); + if (!initial || dataStateContainer.getInitialFetchStatus() === FetchStatus.LOADING) { + dataStateContainer.fetch(); + } }; - const initializeAndSync = () => appStateContainer.initAndSync(savedSearch); return { kbnUrlStateStorage: stateStorage, appState: appStateContainer, internalState: internalStateContainer, dataState: dataStateContainer, + savedSearchState: savedSearchContainer, searchSessionManager, actions: { - pauseAutoRefreshInterval, - setDataView, - loadAndResolveDataView, - loadDataViewList, - setAdHocDataViews, - appendAdHocDataViews, - replaceAdHocDataViewWithId, - removeAdHocDataViewById, initializeAndSync, + fetchData, + loadDataViewList, + loadSavedSearch, + onChangeDataView, + onCreateDefaultAdHocDataView, + onDataViewCreated, + onDataViewEdited, + onOpenSavedSearch, + onUpdateQuery, + persistAdHocDataView, + setDataView, + undoSavedSearchChanges, + updateAdHocDataViewId, }, }; } diff --git a/src/plugins/discover/public/application/main/services/discover_state_provider.tsx b/src/plugins/discover/public/application/main/services/discover_state_provider.tsx index 8cfdc45207ec7..70044385a1338 100644 --- a/src/plugins/discover/public/application/main/services/discover_state_provider.tsx +++ b/src/plugins/discover/public/application/main/services/discover_state_provider.tsx @@ -6,19 +6,42 @@ * Side Public License, v 1. */ -import React from 'react'; +import React, { useContext } from 'react'; +import useObservable from 'react-use/lib/useObservable'; +import { SavedSearch } from '@kbn/saved-search-plugin/public'; import { InternalStateProvider } from './discover_internal_state_container'; import { DiscoverAppStateProvider } from './discover_app_state_container'; import { DiscoverStateContainer } from './discover_state'; function createStateHelpers() { const context = React.createContext(null); + const useContainer = () => useContext(context); + const useSavedSearch = () => { + const container = useContainer(); + return useObservable( + container!.savedSearchState.getCurrent$(), + container!.savedSearchState.getCurrent$().getValue() + ); + }; + const useSavedSearchInitial = () => { + const container = useContainer(); + return useObservable( + container!.savedSearchState.getInitial$(), + container!.savedSearchState.getInitial$().getValue() + ); + }; return { Provider: context.Provider, + useSavedSearch, + useSavedSearchInitial, }; } -export const { Provider: DiscoverStateProvider } = createStateHelpers(); +export const { + Provider: DiscoverStateProvider, + useSavedSearchInitial, + useSavedSearch, +} = createStateHelpers(); export const DiscoverMainProvider = ({ value, diff --git a/src/plugins/discover/public/application/main/services/load_saved_search.ts b/src/plugins/discover/public/application/main/services/load_saved_search.ts new file mode 100644 index 0000000000000..5bae488754322 --- /dev/null +++ b/src/plugins/discover/public/application/main/services/load_saved_search.ts @@ -0,0 +1,165 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ +import type { SavedSearch } from '@kbn/saved-search-plugin/public'; +import { cloneDeep, isEqual } from 'lodash'; +import { isTextBasedQuery } from '../utils/is_text_based_query'; +import { loadAndResolveDataView } from '../utils/resolve_data_view'; +import { DiscoverInternalStateContainer } from './discover_internal_state_container'; +import { DiscoverDataStateContainer } from './discover_data_state_container'; +import { cleanupUrlState } from '../utils/cleanup_url_state'; +import { getValidFilters } from '../../../utils/get_valid_filters'; +import { DiscoverStateContainer, LoadParams } from './discover_state'; +import { addLog } from '../../../utils/add_log'; +import { DiscoverSavedSearchContainer } from './discover_saved_search_container'; +import { + DiscoverAppState, + DiscoverAppStateContainer, + getInitialState, +} from './discover_app_state_container'; +import { DiscoverServices } from '../../../build_services'; + +interface LoadSavedSearchDeps { + appStateContainer: DiscoverAppStateContainer; + dataStateContainer: DiscoverDataStateContainer; + internalStateContainer: DiscoverInternalStateContainer; + savedSearchContainer: DiscoverSavedSearchContainer; + services: DiscoverServices; + setDataView: DiscoverStateContainer['actions']['setDataView']; +} + +/** + * Loading persisted saved searches or existing ones and updating services accordingly + * @param params + * @param deps + */ +export const loadSavedSearch = async ( + params: LoadParams, + deps: LoadSavedSearchDeps +): Promise => { + addLog('[discoverState] loadSavedSearch'); + const { savedSearchId, useAppState } = params ?? {}; + const { appStateContainer, internalStateContainer, savedSearchContainer, services } = deps; + const appState = useAppState ? appStateContainer.getState() : undefined; + + // Loading the saved search or creating a new one + let nextSavedSearch = savedSearchId + ? await savedSearchContainer.load(savedSearchId) + : await savedSearchContainer.new( + await getStateDataView(params, { services, appState, internalStateContainer }) + ); + + // Cleaning up the previous state + services.filterManager.setAppFilters([]); + services.data.query.queryString.clearQuery(); + if (!useAppState) { + appStateContainer.set({}); + } + + // Update saved search by a given app state (in URL) + if (appState) { + if (savedSearchId && appState.index) { + // This is for the case appState is overwriting the loaded saved search data view + const savedSearchDataViewId = nextSavedSearch.searchSource.getField('index')?.id; + const stateDataView = await getStateDataView(params, { + services, + appState, + internalStateContainer, + savedSearch: nextSavedSearch, + }); + const dataViewDifferentToAppState = stateDataView.id !== savedSearchDataViewId; + if (stateDataView && (dataViewDifferentToAppState || !savedSearchDataViewId)) { + nextSavedSearch.searchSource.setField('index', stateDataView); + } + } + nextSavedSearch = savedSearchContainer.update({ + nextDataView: nextSavedSearch.searchSource.getField('index'), + nextState: appState, + }); + } + + // Update app state container with the next state derived from the next saved search + const nextAppState = getInitialState(undefined, nextSavedSearch, services); + appStateContainer.set( + appState ? { ...nextAppState, ...cleanupUrlState({ ...appState }) } : nextAppState + ); + + // Update all other services and state containers by the next saved search + updateBySavedSearch(nextSavedSearch, deps); + return nextSavedSearch; +}; + +/** + * Update services and state containers based on the given saved search + * @param savedSearch + * @param deps + */ +function updateBySavedSearch(savedSearch: SavedSearch, deps: LoadSavedSearchDeps) { + const { dataStateContainer, internalStateContainer, services, setDataView } = deps; + const savedSearchDataView = savedSearch.searchSource.getField('index')!; + + setDataView(savedSearchDataView); + if (!savedSearchDataView.isPersisted()) { + internalStateContainer.transitions.appendAdHocDataViews(savedSearchDataView); + } + + // Finally notify dataStateContainer, data.query and filterManager about new derived state + dataStateContainer.reset(savedSearch); + // set data service filters + const filters = savedSearch.searchSource.getField('filter'); + if (Array.isArray(filters) && filters.length) { + services.data.query.filterManager.setAppFilters(cloneDeep(filters)); + } + // some filters may not be valid for this context, so update + // the filter manager with a modified list of valid filters + const currentFilters = services.filterManager.getFilters(); + const validFilters = getValidFilters(savedSearchDataView, currentFilters); + if (!isEqual(currentFilters, validFilters)) { + services.filterManager.setFilters(validFilters); + } + // set data service query + const query = savedSearch.searchSource.getField('query'); + if (query) { + services.data.query.queryString.setQuery(query); + } +} + +// Get the data view to actually use. There are several conditions to consider which data view is used +// 1. If a data view is passed in, use that +// 2. If an appState with index set is passed in, use the data view from that +// 3. If a saved search is passed in, use the data view from that +// And provide a fallback data view if 2. or 3. don't exist, were deleted or invalid +const getStateDataView = async ( + params: LoadParams, + { + savedSearch, + appState, + services, + internalStateContainer, + }: { + savedSearch?: SavedSearch; + appState?: DiscoverAppState; + services: DiscoverServices; + internalStateContainer: DiscoverInternalStateContainer; + } +) => { + const { dataView, dataViewSpec } = params ?? {}; + if (dataView) { + return dataView; + } + + const result = await loadAndResolveDataView( + { + id: appState?.index, + dataViewSpec, + savedSearch, + isTextBasedQuery: isTextBasedQuery(appState?.query), + }, + { services, internalStateContainer } + ); + return result.dataView; +}; diff --git a/src/plugins/discover/public/application/main/utils/fetch_all.test.ts b/src/plugins/discover/public/application/main/utils/fetch_all.test.ts index 25e45f9470502..3d64177571ee1 100644 --- a/src/plugins/discover/public/application/main/utils/fetch_all.test.ts +++ b/src/plugins/discover/public/application/main/utils/fetch_all.test.ts @@ -11,7 +11,6 @@ import { reduce } from 'rxjs/operators'; import { SearchSource } from '@kbn/data-plugin/public'; import { RequestAdapter } from '@kbn/inspector-plugin/common'; import { savedSearchMock } from '../../../__mocks__/saved_search'; -import { ReduxLikeStateContainer } from '@kbn/kibana-utils-plugin/common'; import { discoverServiceMock } from '../../../__mocks__/services'; import { fetchAll } from './fetch_all'; import { @@ -26,8 +25,6 @@ import { fetchDocuments } from './fetch_documents'; import { fetchSql } from './fetch_sql'; import { buildDataTableRecord } from '../../../utils/build_data_record'; import { dataViewMock } from '../../../__mocks__/data_view'; -import { DiscoverAppState } from '../services/discover_app_state_container'; - jest.mock('./fetch_documents', () => ({ fetchDocuments: jest.fn().mockResolvedValue([]), })); @@ -54,7 +51,7 @@ const waitForNextTick = () => new Promise((resolve) => setTimeout(resolve, 0)); describe('test fetchAll', () => { let subjects: SavedSearchData; - let deps: Parameters[3]; + let deps: Parameters[2]; let searchSource: SearchSource; beforeEach(() => { subjects = { @@ -65,22 +62,21 @@ describe('test fetchAll', () => { fetchStatus: FetchStatus.UNINITIALIZED, }), }; + searchSource = savedSearchMock.searchSource.createChild(); + deps = { - appStateContainer: { - getState: () => { - return { interval: 'auto' }; - }, - } as ReduxLikeStateContainer, abortController: new AbortController(), - data: discoverServiceMock.data, inspectorAdapters: { requests: new RequestAdapter() }, + getAppState: () => ({}), searchSessionId: '123', initialFetchStatus: FetchStatus.UNINITIALIZED, useNewFieldsApi: true, - savedSearch: savedSearchMock, + savedSearch: { + ...savedSearchMock, + searchSource, + }, services: discoverServiceMock, }; - searchSource = savedSearchMock.searchSource.createChild(); mockFetchDocuments.mockReset().mockResolvedValue({ records: [] }); mockFetchSQL.mockReset().mockResolvedValue({ records: [] }); @@ -91,7 +87,7 @@ describe('test fetchAll', () => { subjects.main$.subscribe((value) => stateArr.push(value.fetchStatus)); - fetchAll(subjects, searchSource, false, deps); + fetchAll(subjects, false, deps); await waitForNextTick(); expect(stateArr).toEqual([ @@ -109,7 +105,7 @@ describe('test fetchAll', () => { ]; const documents = hits.map((hit) => buildDataTableRecord(hit, dataViewMock)); mockFetchDocuments.mockResolvedValue({ records: documents }); - fetchAll(subjects, searchSource, false, deps); + fetchAll(subjects, false, deps); await waitForNextTick(); expect(await collect()).toEqual([ { fetchStatus: FetchStatus.UNINITIALIZED }, @@ -136,7 +132,7 @@ describe('test fetchAll', () => { fetchStatus: FetchStatus.LOADING, recordRawType: RecordRawType.DOCUMENT, }); - fetchAll(subjects, searchSource, false, deps); + fetchAll(subjects, false, deps); await waitForNextTick(); subjects.totalHits$.next({ fetchStatus: FetchStatus.COMPLETE, @@ -159,7 +155,7 @@ describe('test fetchAll', () => { fetchStatus: FetchStatus.LOADING, recordRawType: RecordRawType.DOCUMENT, }); - fetchAll(subjects, searchSource, false, deps); + fetchAll(subjects, false, deps); await waitForNextTick(); subjects.totalHits$.next({ fetchStatus: FetchStatus.COMPLETE, @@ -186,7 +182,7 @@ describe('test fetchAll', () => { fetchStatus: FetchStatus.LOADING, recordRawType: RecordRawType.DOCUMENT, }); - fetchAll(subjects, searchSource, false, deps); + fetchAll(subjects, false, deps); await waitForNextTick(); subjects.totalHits$.next({ fetchStatus: FetchStatus.ERROR, @@ -221,7 +217,7 @@ describe('test fetchAll', () => { fetchStatus: FetchStatus.LOADING, recordRawType: RecordRawType.DOCUMENT, }); - fetchAll(subjects, searchSource, false, deps); + fetchAll(subjects, false, deps); await waitForNextTick(); subjects.totalHits$.next({ fetchStatus: FetchStatus.COMPLETE, @@ -254,21 +250,16 @@ describe('test fetchAll', () => { }); const query = { sql: 'SELECT * from foo' }; deps = { - appStateContainer: { - getState: () => { - return { interval: 'auto', query }; - }, - } as unknown as ReduxLikeStateContainer, abortController: new AbortController(), - data: discoverServiceMock.data, inspectorAdapters: { requests: new RequestAdapter() }, searchSessionId: '123', initialFetchStatus: FetchStatus.UNINITIALIZED, useNewFieldsApi: true, savedSearch: savedSearchMock, services: discoverServiceMock, + getAppState: () => ({ query }), }; - fetchAll(subjects, searchSource, false, deps); + fetchAll(subjects, false, deps); await waitForNextTick(); expect(await collect()).toEqual([ diff --git a/src/plugins/discover/public/application/main/utils/fetch_all.ts b/src/plugins/discover/public/application/main/utils/fetch_all.ts index 6ca474eb2dd41..f69399ab1d2bf 100644 --- a/src/plugins/discover/public/application/main/utils/fetch_all.ts +++ b/src/plugins/discover/public/application/main/utils/fetch_all.ts @@ -5,12 +5,11 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ -import { DataPublicPluginStart, ISearchSource } from '@kbn/data-plugin/public'; import { Adapters } from '@kbn/inspector-plugin/common'; -import { ReduxLikeStateContainer } from '@kbn/kibana-utils-plugin/common'; import type { SavedSearch, SortOrder } from '@kbn/saved-search-plugin/public'; import { BehaviorSubject, filter, firstValueFrom, map, merge, scan } from 'rxjs'; import { DiscoverAppState } from '../services/discover_app_state_container'; +import { updateVolatileSearchSource } from './update_search_source'; import { getRawRecordType } from './get_raw_record_type'; import { checkHitCount, @@ -20,7 +19,6 @@ import { sendLoadingMsg, sendResetMsg, } from '../hooks/use_saved_search_messages'; -import { updateSearchSource } from './update_search_source'; import { fetchDocuments } from './fetch_documents'; import { FetchStatus } from '../../types'; import { DataMsg, RecordRawType, SavedSearchData } from '../services/discover_data_state_container'; @@ -29,8 +27,7 @@ import { fetchSql } from './fetch_sql'; export interface FetchDeps { abortController: AbortController; - appStateContainer: ReduxLikeStateContainer; - data: DataPublicPluginStart; + getAppState: () => DiscoverAppState; initialFetchStatus: FetchStatus; inspectorAdapters: Adapters; savedSearch: SavedSearch; @@ -48,35 +45,28 @@ export interface FetchDeps { */ export function fetchAll( dataSubjects: SavedSearchData, - searchSource: ISearchSource, reset = false, fetchDeps: FetchDeps ): Promise { - const { - initialFetchStatus, - appStateContainer, - services, - useNewFieldsApi, - data, - inspectorAdapters, - } = fetchDeps; + const { initialFetchStatus, getAppState, services, inspectorAdapters, savedSearch } = fetchDeps; + const { data } = services; + const searchSource = savedSearch.searchSource.createChild(); try { const dataView = searchSource.getField('index')!; + const query = getAppState().query; + const recordRawType = getRawRecordType(query); if (reset) { - sendResetMsg(dataSubjects, initialFetchStatus); + sendResetMsg(dataSubjects, initialFetchStatus, recordRawType); } - const { sort, query } = appStateContainer.getState(); - const recordRawType = getRawRecordType(query); const useSql = recordRawType === RecordRawType.PLAIN; if (recordRawType === RecordRawType.DOCUMENT) { // Update the base searchSource, base for all child fetches - updateSearchSource(searchSource, false, { + updateVolatileSearchSource(searchSource, { dataView, services, - sort: sort as SortOrder[], - useNewFieldsApi, + sort: getAppState().sort as SortOrder[], }); } @@ -89,7 +79,7 @@ export function fetchAll( const response = useSql && query ? fetchSql(query, dataView, data, services.expressions, inspectorAdapters) - : fetchDocuments(searchSource.createCopy(), fetchDeps); + : fetchDocuments(searchSource, fetchDeps); // Handle results of the individual queries and forward the results to the corresponding dataSubjects response diff --git a/src/plugins/discover/public/application/main/utils/get_fetch_observable.ts b/src/plugins/discover/public/application/main/utils/get_fetch_observable.ts index 71490f05ac6ce..e19b17dad0489 100644 --- a/src/plugins/discover/public/application/main/utils/get_fetch_observable.ts +++ b/src/plugins/discover/public/application/main/utils/get_fetch_observable.ts @@ -35,10 +35,8 @@ export function getFetch$({ searchSource: ISearchSource; }) { const { timefilter } = data.query.timefilter; - const { filterManager } = data.query; return merge( refetch$, - filterManager.getFetches$(), timefilter.getFetch$(), timefilter.getAutoRefreshFetch$().pipe( tap((done) => { diff --git a/src/plugins/discover/public/application/main/utils/persist_saved_search.ts b/src/plugins/discover/public/application/main/utils/persist_saved_search.ts deleted file mode 100644 index ec26ad7d5880c..0000000000000 --- a/src/plugins/discover/public/application/main/utils/persist_saved_search.ts +++ /dev/null @@ -1,107 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 and the Server Side Public License, v 1; you may not use this file except - * in compliance with, at your election, the Elastic License 2.0 or the Server - * Side Public License, v 1. - */ -import { isOfAggregateQueryType } from '@kbn/es-query'; -import { DataView } from '@kbn/data-views-plugin/public'; -import { SavedObjectSaveOpts } from '@kbn/saved-objects-plugin/public'; -import { SavedSearch, SortOrder, saveSavedSearch } from '@kbn/saved-search-plugin/public'; -import { DiscoverAppState } from '../services/discover_app_state_container'; -import { updateSearchSource } from './update_search_source'; -import { DiscoverServices } from '../../../build_services'; -/** - * Helper function to update and persist the given savedSearch - */ -export async function persistSavedSearch( - savedSearch: SavedSearch, - { - dataView, - onError, - onSuccess, - services, - saveOptions, - state, - }: { - dataView: DataView; - onError: (error: Error, savedSearch: SavedSearch) => void; - onSuccess: (id: string) => void; - saveOptions: SavedObjectSaveOpts; - services: DiscoverServices; - state: DiscoverAppState; - } -) { - updateSearchSource(savedSearch.searchSource, true, { - dataView, - services, - sort: state.sort as SortOrder[], - useNewFieldsApi: false, - }); - - savedSearch.columns = state.columns || []; - savedSearch.sort = (state.sort as SortOrder[]) || []; - if (state.grid) { - savedSearch.grid = state.grid; - } - if (typeof state.hideChart !== 'undefined') { - savedSearch.hideChart = state.hideChart; - } - if (typeof state.rowHeight !== 'undefined') { - savedSearch.rowHeight = state.rowHeight; - } - - if (state.viewMode) { - savedSearch.viewMode = state.viewMode; - } - - if (typeof state.breakdownField !== 'undefined') { - savedSearch.breakdownField = state.breakdownField; - } else if (savedSearch.breakdownField) { - savedSearch.breakdownField = ''; - } - - if (state.hideAggregatedPreview) { - savedSearch.hideAggregatedPreview = state.hideAggregatedPreview; - } - - // add a flag here to identify text based language queries - // these should be filtered out from the visualize editor - const isTextBasedQuery = state.query && isOfAggregateQueryType(state.query); - if (savedSearch.isTextBasedQuery || isTextBasedQuery) { - savedSearch.isTextBasedQuery = isTextBasedQuery; - } - - savedSearch.usesAdHocDataView = !dataView.isPersisted(); - - const { from, to } = services.timefilter.getTime(); - const refreshInterval = services.timefilter.getRefreshInterval(); - savedSearch.timeRange = - savedSearch.timeRestore || savedSearch.timeRange - ? { - from, - to, - } - : undefined; - savedSearch.refreshInterval = - savedSearch.timeRestore || savedSearch.refreshInterval - ? { value: refreshInterval.value, pause: refreshInterval.pause } - : undefined; - - try { - const id = await saveSavedSearch( - savedSearch, - saveOptions, - services.core.savedObjects.client, - services.savedObjectsTagging - ); - if (id) { - onSuccess(id); - } - return { id }; - } catch (saveError) { - onError(saveError, savedSearch); - return { error: saveError }; - } -} diff --git a/src/plugins/discover/public/application/main/utils/resolve_data_view.test.ts b/src/plugins/discover/public/application/main/utils/resolve_data_view.test.ts index f3db91d5ce40b..10e1780d233b8 100644 --- a/src/plugins/discover/public/application/main/utils/resolve_data_view.test.ts +++ b/src/plugins/discover/public/application/main/utils/resolve_data_view.test.ts @@ -7,23 +7,30 @@ */ import { loadDataView } from './resolve_data_view'; -import { dataViewsMock } from '../../../__mocks__/data_views'; import { dataViewMock } from '../../../__mocks__/data_view'; -import { configMock } from '../../../__mocks__/config'; +import { discoverServiceMock as services } from '../../../__mocks__/services'; describe('Resolve data view tests', () => { test('returns valid data for an existing data view', async () => { - const dataViewId = 'the-data-view-id'; - const result = await loadDataView(dataViewsMock, configMock, dataViewId); + const id = 'the-data-view-id'; + const result = await loadDataView({ + id, + services, + dataViewList: [], + }); expect(result.loaded).toEqual(dataViewMock); + expect(result.stateVal).toEqual(id); expect(result.stateValFound).toEqual(true); - expect(result.stateVal).toEqual(dataViewId); }); test('returns fallback data for an invalid data view', async () => { - const dataViewId = 'invalid-id'; - const result = await loadDataView(dataViewsMock, configMock, dataViewId); + const id = 'invalid-id'; + const result = await loadDataView({ + id, + services, + dataViewList: [], + }); expect(result.loaded).toEqual(dataViewMock); expect(result.stateValFound).toBe(false); - expect(result.stateVal).toBe(dataViewId); + expect(result.stateVal).toBe(id); }); }); diff --git a/src/plugins/discover/public/application/main/utils/resolve_data_view.ts b/src/plugins/discover/public/application/main/utils/resolve_data_view.ts index 2584d9b7c8279..7a7884e6295ad 100644 --- a/src/plugins/discover/public/application/main/utils/resolve_data_view.ts +++ b/src/plugins/discover/public/application/main/utils/resolve_data_view.ts @@ -7,14 +7,11 @@ */ import { i18n } from '@kbn/i18n'; -import type { - DataView, - DataViewListItem, - DataViewsContract, - DataViewSpec, -} from '@kbn/data-views-plugin/public'; -import type { ISearchSource } from '@kbn/data-plugin/public'; -import type { IUiSettingsClient, ToastsStart } from '@kbn/core/public'; +import type { DataView, DataViewListItem, DataViewSpec } from '@kbn/data-views-plugin/public'; +import type { ToastsStart } from '@kbn/core/public'; +import { SavedSearch } from '@kbn/saved-search-plugin/public'; +import { DiscoverInternalStateContainer } from '../services/discover_internal_state_container'; +import { DiscoverServices } from '../../../build_services'; interface DataViewData { /** * List of existing data views @@ -37,13 +34,19 @@ interface DataViewData { /** * Function to load the given data view by id, providing a fallback if it doesn't exist */ -export async function loadDataView( - dataViews: DataViewsContract, - config: IUiSettingsClient, - id?: string, - dataViewSpec?: DataViewSpec -): Promise { - const dataViewList = await dataViews.getIdsWithTitle(); +export async function loadDataView({ + id, + dataViewSpec, + services, + dataViewList, +}: { + id?: string; + dataViewSpec?: DataViewSpec; + services: DiscoverServices; + dataViewList: DataViewListItem[]; +}): Promise { + const { dataViews } = services; + let fetchId: string | undefined = id; /** @@ -97,25 +100,26 @@ export async function loadDataView( // we can be certain that the data view exists due to an earlier hasData check loaded: fetchedDataView || defaultDataView!, stateVal: fetchId, - stateValFound: !!fetchId && !!fetchedDataView, + stateValFound: Boolean(fetchId) && Boolean(fetchedDataView), }; } /** - * Function used in the discover controller to message the user about the state of the current - * data view + * Check if the given data view is valid, provide a fallback if it doesn't exist + * And message the user in this case with toast notifications */ export function resolveDataView( ip: DataViewData, - searchSource: ISearchSource, + savedSearch: SavedSearch | undefined, toastNotifications: ToastsStart, isTextBasedQuery?: boolean ) { const { loaded: loadedDataView, stateVal, stateValFound } = ip; - const ownDataView = searchSource.getOwnField('index'); + const ownDataView = savedSearch?.searchSource.getField('index'); if (ownDataView && !stateVal) { + // the given saved search has its own data view, and no data view was specified in the URL return ownDataView; } @@ -128,6 +132,7 @@ export function resolveDataView( }); if (ownDataView) { + // the given data view in the URL was not found, but the saved search has its own data view toastNotifications.addWarning({ title: warningTitle, text: i18n.translate('discover.showingSavedDataViewWarningDescription', { @@ -159,3 +164,39 @@ export function resolveDataView( return loadedDataView; } + +export const loadAndResolveDataView = async ( + { + id, + dataViewSpec, + savedSearch, + isTextBasedQuery, + }: { + id?: string; + dataViewSpec?: DataViewSpec; + savedSearch?: SavedSearch; + isTextBasedQuery?: boolean; + }, + { + internalStateContainer, + services, + }: { internalStateContainer: DiscoverInternalStateContainer; services: DiscoverServices } +) => { + const { adHocDataViews, savedDataViews } = internalStateContainer.getState(); + const adHocDataView = adHocDataViews.find((dataView) => dataView.id === id); + if (adHocDataView) return { fallback: false, dataView: adHocDataView }; + + const nextDataViewData = await loadDataView({ + services, + id, + dataViewSpec, + dataViewList: savedDataViews, + }); + const nextDataView = resolveDataView( + nextDataViewData, + savedSearch, + services.toastNotifications, + isTextBasedQuery + ); + return { fallback: !nextDataViewData.stateValFound, dataView: nextDataView }; +}; diff --git a/src/plugins/discover/public/application/main/utils/update_saved_search.ts b/src/plugins/discover/public/application/main/utils/update_saved_search.ts new file mode 100644 index 0000000000000..733bf5ed2a0b8 --- /dev/null +++ b/src/plugins/discover/public/application/main/utils/update_saved_search.ts @@ -0,0 +1,101 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ +import { SavedSearch, SortOrder } from '@kbn/saved-search-plugin/public'; +import { DataView } from '@kbn/data-views-plugin/common'; +import { cloneDeep } from 'lodash'; +import { isTextBasedQuery } from './is_text_based_query'; +import { DiscoverAppState } from '../services/discover_app_state_container'; +import { DiscoverServices } from '../../../build_services'; + +/** + * Updates the saved search with a given data view & Appstate + * Is executed on every change of those, for making sure the saved search is + * up to date before fetching data and persisting or sharing + * @param savedSearch + * @param dataView + * @param state + * @param services + * @param useFilterAndQueryServices - when true data services are being used for updating filter + query + */ +export function updateSavedSearch( + { + savedSearch, + dataView, + state, + services, + }: { + savedSearch: SavedSearch; + dataView?: DataView; + state?: DiscoverAppState; + services: DiscoverServices; + }, + useFilterAndQueryServices: boolean = false +) { + if (dataView) { + savedSearch.searchSource.setField('index', dataView); + savedSearch.usesAdHocDataView = !dataView.isPersisted(); + } + if (useFilterAndQueryServices) { + savedSearch.searchSource + .setField('query', services.data.query.queryString.getQuery()) + .setField('filter', services.data.query.filterManager.getFilters()); + } else if (state) { + savedSearch.searchSource + .setField('query', state.query ?? undefined) + .setField('filter', state.filters ? cloneDeep(state.filters) : []); + } + if (state) { + savedSearch.columns = state.columns || []; + savedSearch.sort = (state.sort as SortOrder[]) || []; + if (state.grid) { + savedSearch.grid = state.grid; + } + if (typeof state.hideChart !== 'undefined') { + savedSearch.hideChart = state.hideChart; + } + if (typeof state.rowHeight !== 'undefined') { + savedSearch.rowHeight = state.rowHeight; + } + + if (state.viewMode) { + savedSearch.viewMode = state.viewMode; + } + + if (typeof state.breakdownField !== 'undefined') { + savedSearch.breakdownField = state.breakdownField; + } else if (savedSearch.breakdownField) { + savedSearch.breakdownField = ''; + } + + if (state.hideAggregatedPreview) { + savedSearch.hideAggregatedPreview = state.hideAggregatedPreview; + } + + // add a flag here to identify text based language queries + // these should be filtered out from the visualize editor + const isTextBasedQueryResult = isTextBasedQuery(state.query); + if (savedSearch.isTextBasedQuery || isTextBasedQueryResult) { + savedSearch.isTextBasedQuery = isTextBasedQueryResult; + } + } + + const { from, to } = services.timefilter.getTime(); + const refreshInterval = services.timefilter.getRefreshInterval(); + savedSearch.timeRange = + savedSearch.timeRestore || savedSearch.timeRange + ? { + from, + to, + } + : undefined; + savedSearch.refreshInterval = + savedSearch.timeRestore || savedSearch.refreshInterval + ? { value: refreshInterval.value, pause: refreshInterval.pause } + : undefined; + return savedSearch; +} diff --git a/src/plugins/discover/public/application/main/utils/update_search_source.test.ts b/src/plugins/discover/public/application/main/utils/update_search_source.test.ts index 5ab1dd962652f..cc09732161890 100644 --- a/src/plugins/discover/public/application/main/utils/update_search_source.test.ts +++ b/src/plugins/discover/public/application/main/utils/update_search_source.test.ts @@ -6,55 +6,51 @@ * Side Public License, v 1. */ -import { updateSearchSource } from './update_search_source'; +import { updateVolatileSearchSource } from './update_search_source'; import { createSearchSourceMock } from '@kbn/data-plugin/common/search/search_source/mocks'; import { dataViewMock } from '../../../__mocks__/data_view'; import type { SortOrder } from '@kbn/saved-search-plugin/public'; import { discoverServiceMock } from '../../../__mocks__/services'; +import { IUiSettingsClient } from '@kbn/core-ui-settings-browser'; -describe('updateSearchSource', () => { +const getUiSettingsMock = (value: boolean) => { + return { + get: jest.fn(() => value), + } as unknown as IUiSettingsClient; +}; + +describe('updateVolatileSearchSource', () => { test('updates a given search source', async () => { - const persistentSearchSourceMock = createSearchSourceMock({}); - const volatileSearchSourceMock = createSearchSourceMock({}); - volatileSearchSourceMock.setParent(persistentSearchSourceMock); - updateSearchSource(volatileSearchSourceMock, false, { + const searchSource = createSearchSourceMock({}); + discoverServiceMock.uiSettings = getUiSettingsMock(true); + updateVolatileSearchSource(searchSource, { dataView: dataViewMock, services: discoverServiceMock, sort: [] as SortOrder[], - useNewFieldsApi: false, }); - expect(persistentSearchSourceMock.getField('index')).toEqual(dataViewMock); - expect(volatileSearchSourceMock.getField('fields')).toBe(undefined); + expect(searchSource.getField('fields')).toBe(undefined); }); test('updates a given search source with the usage of the new fields api', async () => { - const persistentSearchSourceMock = createSearchSourceMock({}); - const volatileSearchSourceMock = createSearchSourceMock({}); - volatileSearchSourceMock.setParent(persistentSearchSourceMock); - updateSearchSource(volatileSearchSourceMock, false, { + const searchSource = createSearchSourceMock({}); + discoverServiceMock.uiSettings = getUiSettingsMock(false); + updateVolatileSearchSource(searchSource, { dataView: dataViewMock, services: discoverServiceMock, sort: [] as SortOrder[], - useNewFieldsApi: true, }); - expect(persistentSearchSourceMock.getField('index')).toEqual(dataViewMock); - expect(volatileSearchSourceMock.getField('fields')).toEqual([ - { field: '*', include_unmapped: 'true' }, - ]); - expect(volatileSearchSourceMock.getField('fieldsFromSource')).toBe(undefined); + expect(searchSource.getField('fields')).toEqual([{ field: '*', include_unmapped: 'true' }]); + expect(searchSource.getField('fieldsFromSource')).toBe(undefined); }); test('updates a given search source when showUnmappedFields option is set to true', async () => { - const persistentSearchSourceMock = createSearchSourceMock({}); const volatileSearchSourceMock = createSearchSourceMock({}); - volatileSearchSourceMock.setParent(persistentSearchSourceMock); - updateSearchSource(volatileSearchSourceMock, false, { + discoverServiceMock.uiSettings = getUiSettingsMock(false); + updateVolatileSearchSource(volatileSearchSourceMock, { dataView: dataViewMock, services: discoverServiceMock, sort: [] as SortOrder[], - useNewFieldsApi: true, }); - expect(persistentSearchSourceMock.getField('index')).toEqual(dataViewMock); expect(volatileSearchSourceMock.getField('fields')).toEqual([ { field: '*', include_unmapped: 'true' }, ]); @@ -62,16 +58,13 @@ describe('updateSearchSource', () => { }); test('does not explicitly request fieldsFromSource when not using fields API', async () => { - const persistentSearchSourceMock = createSearchSourceMock({}); const volatileSearchSourceMock = createSearchSourceMock({}); - volatileSearchSourceMock.setParent(persistentSearchSourceMock); - updateSearchSource(volatileSearchSourceMock, false, { + discoverServiceMock.uiSettings = getUiSettingsMock(true); + updateVolatileSearchSource(volatileSearchSourceMock, { dataView: dataViewMock, services: discoverServiceMock, sort: [] as SortOrder[], - useNewFieldsApi: false, }); - expect(persistentSearchSourceMock.getField('index')).toEqual(dataViewMock); expect(volatileSearchSourceMock.getField('fields')).toEqual(undefined); expect(volatileSearchSourceMock.getField('fieldsFromSource')).toBe(undefined); }); diff --git a/src/plugins/discover/public/application/main/utils/update_search_source.ts b/src/plugins/discover/public/application/main/utils/update_search_source.ts index 4966a66cf9687..4152b57a34a0f 100644 --- a/src/plugins/discover/public/application/main/utils/update_search_source.ts +++ b/src/plugins/discover/public/application/main/utils/update_search_source.ts @@ -9,58 +9,47 @@ import { ISearchSource } from '@kbn/data-plugin/public'; import { DataViewType, DataView } from '@kbn/data-views-plugin/public'; import type { SortOrder } from '@kbn/saved-search-plugin/public'; -import { SORT_DEFAULT_ORDER_SETTING } from '../../../../common'; +import { SEARCH_FIELDS_FROM_SOURCE, SORT_DEFAULT_ORDER_SETTING } from '../../../../common'; import { DiscoverServices } from '../../../build_services'; import { getSortForSearchSource } from '../../../utils/sorting'; /** * Helper function to update the given searchSource before fetching/sharing/persisting */ -export function updateSearchSource( +export function updateVolatileSearchSource( searchSource: ISearchSource, - persist = true, { dataView, services, sort, - useNewFieldsApi, }: { dataView: DataView; services: DiscoverServices; - sort: SortOrder[]; - useNewFieldsApi: boolean; + sort?: SortOrder[]; } ) { const { uiSettings, data } = services; - const parentSearchSource = persist ? searchSource : searchSource.getParent()!; - - parentSearchSource - .setField('index', dataView) - .setField('query', data.query.queryString.getQuery() || null) - .setField('filter', data.query.filterManager.getFilters()); - - if (!persist) { - const usedSort = getSortForSearchSource( - sort, - dataView, - uiSettings.get(SORT_DEFAULT_ORDER_SETTING) - ); - searchSource.setField('trackTotalHits', true).setField('sort', usedSort); - - if (dataView.type !== DataViewType.ROLLUP) { - // Set the date range filter fields from timeFilter using the absolute format. Search sessions requires that it be converted from a relative range - searchSource.setField('filter', data.query.timefilter.timefilter.createFilter(dataView)); - } + const usedSort = getSortForSearchSource( + sort, + dataView, + uiSettings.get(SORT_DEFAULT_ORDER_SETTING) + ); + const useNewFieldsApi = !uiSettings.get(SEARCH_FIELDS_FROM_SOURCE); + searchSource.setField('trackTotalHits', true).setField('sort', usedSort); + + if (dataView.type !== DataViewType.ROLLUP) { + // Set the date range filter fields from timeFilter using the absolute format. Search sessions requires that it be converted from a relative range + searchSource.setField('filter', data.query.timefilter.timefilter.createFilter(dataView)); + } - if (useNewFieldsApi) { - searchSource.removeField('fieldsFromSource'); - const fields: Record = { field: '*' }; + if (useNewFieldsApi) { + searchSource.removeField('fieldsFromSource'); + const fields: Record = { field: '*' }; - fields.include_unmapped = 'true'; + fields.include_unmapped = 'true'; - searchSource.setField('fields', [fields]); - } else { - searchSource.removeField('fields'); - } + searchSource.setField('fields', [fields]); + } else { + searchSource.removeField('fields'); } } diff --git a/src/plugins/discover/public/application/view_alert/view_alert_route.tsx b/src/plugins/discover/public/application/view_alert/view_alert_route.tsx index 84e65e8d672d6..48b7144b9115d 100644 --- a/src/plugins/discover/public/application/view_alert/view_alert_route.tsx +++ b/src/plugins/discover/public/application/view_alert/view_alert_route.tsx @@ -13,8 +13,6 @@ import { useDiscoverServices } from '../../hooks/use_discover_services'; import { displayPossibleDocsDiffInfoAlert } from '../main/hooks/use_alert_results_toast'; import { getAlertUtils, QueryParams } from './view_alert_utils'; -const DISCOVER_MAIN_ROUTE = '/'; - type NonNullableEntry = { [K in keyof T]: NonNullable }; const isActualAlert = (queryParams: QueryParams): queryParams is NonNullableEntry => { @@ -58,7 +56,7 @@ export function ViewAlertRoute() { locator.navigate(state); }; - const navigateToDiscoverRoot = () => history.push(DISCOVER_MAIN_ROUTE); + const navigateToDiscoverRoot = () => locator.navigate({}); fetchAlert(id) .then(fetchSearchSource) diff --git a/src/plugins/discover/public/components/common/error_alert.tsx b/src/plugins/discover/public/components/common/error_alert.tsx index 43b9ca6a31272..27eceb7e5ea53 100644 --- a/src/plugins/discover/public/components/common/error_alert.tsx +++ b/src/plugins/discover/public/components/common/error_alert.tsx @@ -10,13 +10,13 @@ import React from 'react'; import { EuiButton, EuiEmptyPrompt } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; -import { useHistory } from 'react-router-dom'; +import { useDiscoverServices } from '../../hooks/use_discover_services'; export const DiscoverError = ({ error }: { error: Error }) => { - const history = useHistory(); + const { locator } = useDiscoverServices(); const goToMain = () => { - history.push('/'); + locator.navigate({}); }; return ( diff --git a/src/plugins/discover/public/components/discover_grid/discover_grid.tsx b/src/plugins/discover/public/components/discover_grid/discover_grid.tsx index 35c51ab4c996c..23585d56857b3 100644 --- a/src/plugins/discover/public/components/discover_grid/discover_grid.tsx +++ b/src/plugins/discover/public/components/discover_grid/discover_grid.tsx @@ -20,6 +20,7 @@ import { EuiLoadingSpinner, EuiIcon, EuiDataGridRefProps, + EuiDataGridControlColumn, } from '@elastic/eui'; import type { DataView } from '@kbn/data-views-plugin/public'; import type { SortOrder } from '@kbn/saved-search-plugin/public'; @@ -27,6 +28,7 @@ import { Filter } from '@kbn/es-query'; import { FieldFormatsStart } from '@kbn/field-formats-plugin/public'; import { ToastsStart, IUiSettingsClient, HttpStart } from '@kbn/core/public'; import { DataViewFieldEditorStart } from '@kbn/data-view-field-editor-plugin/public'; +import { css } from '@emotion/react'; import { DocViewFilterFn } from '../../services/doc_views/doc_views_types'; import { getSchemaDetectors } from './discover_grid_schema'; import { DiscoverGridFlyout } from './discover_grid_flyout'; @@ -51,6 +53,7 @@ import type { DataTableRecord, ValueToStringConverter } from '../../types'; import { useRowHeightsOptions } from '../../hooks/use_row_heights_options'; import { convertValueToString } from '../../utils/convert_value_to_string'; import { getRowsPerPageOptions, getDefaultRowsPerPage } from '../../utils/rows_per_page'; +import { createCustomControlColumn } from './discover_grid_custom_control_column'; interface SortObj { id: string; @@ -159,6 +162,10 @@ export interface DiscoverGridProps { * List of used control columns (available: 'openDetails', 'select') */ controlColumnIds?: string[]; + /** + * Customize the displayed control columns + */ + customControlColumns?: EuiDataGridControlColumn[]; /** * Row height from state */ @@ -238,6 +245,7 @@ export const DiscoverGrid = ({ isSortEnabled = true, isPaginationEnabled = true, controlColumnIds = CONTROL_COLUMN_IDS_DEFAULT, + customControlColumns, className, rowHeightState, onUpdateRowHeight, @@ -477,8 +485,26 @@ export const DiscoverGrid = ({ const lead = useMemo( () => - getLeadControlColumns(canSetExpandedDoc).filter(({ id }) => controlColumnIds.includes(id)), - [controlColumnIds, canSetExpandedDoc] + getLeadControlColumns(canSetExpandedDoc) + .filter(({ id }) => controlColumnIds.includes(id)) + .concat((customControlColumns ?? []).map(createCustomControlColumn)), + [canSetExpandedDoc, customControlColumns, controlColumnIds] + ); + + const leadControlColumnsCss = useMemo( + () => + lead.map( + (_, index) => css` + .euiDataGridHeaderCell--controlColumn:nth-child(${index + 1}) { + ${index === lead.length - 1 ? '' : 'border-right: none;'} + } + + .euiDataGridRowCell--controlColumn:nth-child(${index + 1}) { + ${index === lead.length - 1 ? '' : 'border-right: none;'} + } + ` + ), + [lead] ); const additionalControls = useMemo( @@ -613,6 +639,7 @@ export const DiscoverGrid = ({ toolbarVisibility={toolbarVisibility} rowHeightsOptions={rowHeightsOptions} gridStyle={GRID_STYLE} + css={leadControlColumnsCss} />
    {showDisclaimer && ( diff --git a/src/plugins/discover/public/components/discover_grid/discover_grid_columns.tsx b/src/plugins/discover/public/components/discover_grid/discover_grid_columns.tsx index 6e4c0ec619e2b..779a30965f7dd 100644 --- a/src/plugins/discover/public/components/discover_grid/discover_grid_columns.tsx +++ b/src/plugins/discover/public/components/discover_grid/discover_grid_columns.tsx @@ -8,7 +8,13 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; -import { EuiDataGridColumn, EuiIcon, EuiScreenReaderOnly, EuiToolTip } from '@elastic/eui'; +import { + EuiDataGridColumn, + EuiDataGridControlColumn, + EuiIcon, + EuiScreenReaderOnly, + EuiToolTip, +} from '@elastic/eui'; import type { DataView } from '@kbn/data-views-plugin/public'; import { ToastsStart, IUiSettingsClient } from '@kbn/core/public'; import { DocViewFilterFn } from '../../services/doc_views/doc_views_types'; @@ -52,7 +58,7 @@ const select = { ), }; -export function getLeadControlColumns(canSetExpandedDoc: boolean) { +export function getLeadControlColumns(canSetExpandedDoc: boolean): EuiDataGridControlColumn[] { if (!canSetExpandedDoc) { return [select]; } diff --git a/src/plugins/discover/public/components/discover_grid/discover_grid_custom_control_column.tsx b/src/plugins/discover/public/components/discover_grid/discover_grid_custom_control_column.tsx new file mode 100644 index 0000000000000..642234b7c2fb4 --- /dev/null +++ b/src/plugins/discover/public/components/discover_grid/discover_grid_custom_control_column.tsx @@ -0,0 +1,79 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { + EuiDataGridCellValueElementProps, + EuiDataGridControlColumn, + EuiDataGridSetCellProps, +} from '@elastic/eui'; +import React, { + JSXElementConstructor, + useCallback, + useContext, + useEffect, + useMemo, + useRef, +} from 'react'; +import { euiDarkVars as themeDark, euiLightVars as themeLight } from '@kbn/ui-theme'; +import { merge } from 'lodash'; +import { DiscoverGridContext } from './discover_grid_context'; + +const wrapRowCellRenderer = (rowCellRender: EuiDataGridControlColumn['rowCellRender']) => { + // React is more permissible than the TS types indicate + const CellElement = rowCellRender as JSXElementConstructor; + + return ({ + rowIndex, + setCellProps: originalSetCellProps, + ...props + }: EuiDataGridCellValueElementProps) => { + const { expanded, rows, isDarkMode } = useContext(DiscoverGridContext); + const doc = useMemo(() => rows[rowIndex], [rows, rowIndex]); + const wrapperCellProps = useRef({}); + const customCellProps = useRef({}); + + const updateCellProps = useCallback(() => { + originalSetCellProps(merge({}, customCellProps.current, wrapperCellProps.current)); + }, [originalSetCellProps]); + + const setCellProps = useCallback( + (cellProps: EuiDataGridSetCellProps) => { + customCellProps.current = cellProps; + updateCellProps(); + }, + [updateCellProps] + ); + + useEffect(() => { + if (expanded && doc && expanded.id === doc.id) { + wrapperCellProps.current = { + style: { + backgroundColor: isDarkMode + ? themeDark.euiColorHighlight + : themeLight.euiColorHighlight, + }, + }; + } else { + wrapperCellProps.current = {}; + } + + updateCellProps(); + }, [doc, expanded, isDarkMode, updateCellProps]); + + return ; + }; +}; + +export const createCustomControlColumn = ( + column: EuiDataGridControlColumn +): EuiDataGridControlColumn => { + return { + ...column, + rowCellRender: wrapRowCellRenderer(column.rowCellRender), + }; +}; diff --git a/src/plugins/discover/public/customizations/customization_provider.ts b/src/plugins/discover/public/customizations/customization_provider.ts new file mode 100644 index 0000000000000..95c21daa5f9b8 --- /dev/null +++ b/src/plugins/discover/public/customizations/customization_provider.ts @@ -0,0 +1,63 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { createContext, useContext, useState } from 'react'; +import useObservable from 'react-use/lib/useObservable'; +import { isFunction } from 'lodash'; +import useEffectOnce from 'react-use/lib/useEffectOnce'; +import { + createCustomizationService, + DiscoverCustomizationId, + DiscoverCustomizationService, +} from '.'; +import type { DiscoverStateContainer } from '../application/main/services/discover_state'; +import type { CustomizationCallback } from './types'; + +const customizationContext = createContext( + createCustomizationService() +); + +export const DiscoverCustomizationProvider = customizationContext.Provider; + +export const useDiscoverCustomizationService = ({ + customizationCallbacks, + stateContainer, +}: { + customizationCallbacks: CustomizationCallback[]; + stateContainer: DiscoverStateContainer; +}) => { + const [customizationService, setCustomizationService] = useState(); + + useEffectOnce(() => { + const customizations = createCustomizationService(); + const callbacks = customizationCallbacks.map((callback) => + Promise.resolve(callback({ customizations, stateContainer })) + ); + const initialize = () => Promise.all(callbacks).then((result) => result.filter(isFunction)); + + initialize().then(() => { + setCustomizationService(customizations); + }); + + return () => { + initialize().then((cleanups) => { + cleanups.forEach((cleanup) => cleanup()); + }); + }; + }); + + return customizationService; +}; + +export const useDiscoverCustomization$ = ( + id: TCustomizationId +) => useContext(customizationContext).get$(id); + +export const useDiscoverCustomization = ( + id: TCustomizationId +) => useObservable(useDiscoverCustomization$(id)); diff --git a/src/plugins/discover/public/customizations/customization_service.ts b/src/plugins/discover/public/customizations/customization_service.ts new file mode 100644 index 0000000000000..729eb070589cc --- /dev/null +++ b/src/plugins/discover/public/customizations/customization_service.ts @@ -0,0 +1,82 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { filter, map, Observable, startWith, Subject } from 'rxjs'; +import type { + DataGridCustomization, + FieldPopoverCustomization, + SearchBarCustomization, + TopNavCustomization, +} from './customization_types'; + +export type DiscoverCustomization = + | DataGridCustomization + | FieldPopoverCustomization + | SearchBarCustomization + | TopNavCustomization; + +export type DiscoverCustomizationId = DiscoverCustomization['id']; + +export interface DiscoverCustomizationService { + set: (customization: DiscoverCustomization) => void; + get$: ( + id: TCustomizationId + ) => Observable | undefined>; + enable: (id: DiscoverCustomizationId) => void; + disable: (id: DiscoverCustomizationId) => void; +} + +interface CustomizationEntry { + customization: DiscoverCustomization; + enabled: boolean; +} + +export const createCustomizationService = (): DiscoverCustomizationService => { + const update$ = new Subject(); + const customizations = new Map(); + + return { + set: (customization) => { + const entry = customizations.get(customization.id); + customizations.set(customization.id, { + customization, + enabled: entry?.enabled ?? true, + }); + update$.next(customization.id); + }, + + get$: (id: TCustomizationId) => { + return update$.pipe( + startWith(id), + filter((currentId) => currentId === id), + map(() => { + const entry = customizations.get(id); + if (entry && entry.enabled) { + return entry.customization as Extract; + } + }) + ); + }, + + enable: (id) => { + const entry = customizations.get(id); + if (entry && !entry.enabled) { + entry.enabled = true; + update$.next(entry.customization.id); + } + }, + + disable: (id) => { + const entry = customizations.get(id); + if (entry && entry.enabled) { + entry.enabled = false; + update$.next(entry.customization.id); + } + }, + }; +}; diff --git a/src/plugins/discover/public/customizations/customization_types/data_grid_customization.ts b/src/plugins/discover/public/customizations/customization_types/data_grid_customization.ts new file mode 100644 index 0000000000000..a86be9fae142d --- /dev/null +++ b/src/plugins/discover/public/customizations/customization_types/data_grid_customization.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 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { EuiDataGridControlColumn } from '@elastic/eui'; + +export interface DefaultLeadingControlColumn { + disabled?: boolean; +} + +export interface DefaultLeadingControlColumns { + expand?: DefaultLeadingControlColumn; + select?: DefaultLeadingControlColumn; +} + +export interface DataGridCustomization { + id: 'data_grid'; + defaultLeadingControlColumns?: DefaultLeadingControlColumns; + getLeadingControlColumns?: () => EuiDataGridControlColumn[]; +} diff --git a/src/plugins/discover/public/customizations/customization_types/field_popover_customization.ts b/src/plugins/discover/public/customizations/customization_types/field_popover_customization.ts new file mode 100644 index 0000000000000..fd65e2e120dac --- /dev/null +++ b/src/plugins/discover/public/customizations/customization_types/field_popover_customization.ts @@ -0,0 +1,15 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { ComponentType } from 'react'; + +export interface FieldPopoverCustomization { + id: 'field_popover'; + disableDefaultBottomButton?: boolean; + CustomBottomButton?: ComponentType; +} diff --git a/src/plugins/discover/public/customizations/customization_types/index.ts b/src/plugins/discover/public/customizations/customization_types/index.ts new file mode 100644 index 0000000000000..470344842c311 --- /dev/null +++ b/src/plugins/discover/public/customizations/customization_types/index.ts @@ -0,0 +1,12 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export * from './data_grid_customization'; +export * from './field_popover_customization'; +export * from './search_bar_customization'; +export * from './top_nav_customization'; diff --git a/src/plugins/discover/public/customizations/customization_types/search_bar_customization.ts b/src/plugins/discover/public/customizations/customization_types/search_bar_customization.ts new file mode 100644 index 0000000000000..8117781a95c93 --- /dev/null +++ b/src/plugins/discover/public/customizations/customization_types/search_bar_customization.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 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { ComponentType } from 'react'; + +export interface SearchBarCustomization { + id: 'search_bar'; + CustomDataViewPicker?: ComponentType; +} diff --git a/src/plugins/discover/public/customizations/customization_types/top_nav_customization.ts b/src/plugins/discover/public/customizations/customization_types/top_nav_customization.ts new file mode 100644 index 0000000000000..45288c6a248fb --- /dev/null +++ b/src/plugins/discover/public/customizations/customization_types/top_nav_customization.ts @@ -0,0 +1,35 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { TopNavMenuData } from '@kbn/navigation-plugin/public'; + +export interface TopNavDefaultMenuItem { + disabled?: boolean; + order?: number; +} + +export interface TopNavDefaultMenu { + options?: TopNavDefaultMenuItem; + new?: TopNavDefaultMenuItem; + open?: TopNavDefaultMenuItem; + share?: TopNavDefaultMenuItem; + alerts?: TopNavDefaultMenuItem; + inspect?: TopNavDefaultMenuItem; + save?: TopNavDefaultMenuItem; +} + +export interface TopNavMenuItem { + data: TopNavMenuData; + order: number; +} + +export interface TopNavCustomization { + id: 'top_nav'; + defaultMenu?: TopNavDefaultMenu; + getMenuItems?: () => TopNavMenuItem[]; +} diff --git a/src/plugins/discover/public/customizations/index.ts b/src/plugins/discover/public/customizations/index.ts new file mode 100644 index 0000000000000..78f922c3a5eac --- /dev/null +++ b/src/plugins/discover/public/customizations/index.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export * from './customization_types'; +export * from './customization_service'; diff --git a/src/plugins/discover/public/customizations/profile_aware_locator.ts b/src/plugins/discover/public/customizations/profile_aware_locator.ts new file mode 100644 index 0000000000000..cad6bd8eee56a --- /dev/null +++ b/src/plugins/discover/public/customizations/profile_aware_locator.ts @@ -0,0 +1,92 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { SavedObjectReference } from '@kbn/core-saved-objects-api-server'; +import type { + MigrateFunctionsObject, + GetMigrationFunctionObjectFn, +} from '@kbn/kibana-utils-plugin/common'; +import type { + LocatorGetUrlParams, + FormatSearchParamsOptions, + LocatorNavigationParams, +} from '@kbn/share-plugin/common/url_service'; +import type { LocatorPublic } from '@kbn/share-plugin/public'; +import type { DependencyList } from 'react'; +import { matchPath } from 'react-router-dom'; +import { getHistory } from '../kibana_services'; + +export class ProfileAwareLocator implements LocatorPublic { + id: string; + migrations: MigrateFunctionsObject | GetMigrationFunctionObjectFn; + + constructor(private readonly locator: LocatorPublic) { + this.id = locator.id; + this.migrations = locator.migrations; + } + + private injectProfile(params: T) { + if (params.profile) { + return params; + } + + const history = getHistory(); + const match = matchPath<{ profile: string }>(history.location.pathname, { + path: '/p/:profile', + }); + + if (match?.params.profile) { + params = { + ...params, + profile: match.params.profile, + }; + } + + return params; + } + + getLocation(params: T) { + return this.locator.getLocation(this.injectProfile(params)); + } + + getUrl(params: T, getUrlParams?: LocatorGetUrlParams) { + return this.locator.getUrl(this.injectProfile(params), getUrlParams); + } + + getRedirectUrl(params: T, options?: FormatSearchParamsOptions) { + return this.locator.getRedirectUrl(this.injectProfile(params), options); + } + + navigate(params: T, navigationParams?: LocatorNavigationParams) { + return this.locator.navigate(this.injectProfile(params), navigationParams); + } + + navigateSync(params: T, navigationParams?: LocatorNavigationParams) { + return this.locator.navigateSync(this.injectProfile(params), navigationParams); + } + + useUrl( + params: T, + getUrlParams?: LocatorGetUrlParams | undefined, + deps?: DependencyList | undefined + ) { + return this.locator.useUrl(this.injectProfile(params), getUrlParams, deps); + } + + telemetry(state: T, stats: Record) { + return this.locator.telemetry(this.injectProfile(state), stats); + } + + inject(state: T, references: SavedObjectReference[]) { + return this.locator.inject(this.injectProfile(state), references); + } + + extract(state: T) { + return this.locator.extract(this.injectProfile(state)); + } +} diff --git a/src/plugins/discover/public/customizations/profile_registry.ts b/src/plugins/discover/public/customizations/profile_registry.ts new file mode 100644 index 0000000000000..236cd991f08b1 --- /dev/null +++ b/src/plugins/discover/public/customizations/profile_registry.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 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { CustomizationCallback } from './types'; + +export interface DiscoverProfile { + name: string; + customizationCallbacks: CustomizationCallback[]; +} + +export interface DiscoverProfileRegistry { + get(name: string): DiscoverProfile | undefined; + set(profile: DiscoverProfile): void; +} + +export const createProfileRegistry = (): DiscoverProfileRegistry => { + const profiles = new Map(); + + return { + get: (name) => profiles.get(name.toLowerCase()), + set: (profile) => profiles.set(profile.name.toLowerCase(), profile), + }; +}; diff --git a/src/plugins/discover/public/customizations/types.ts b/src/plugins/discover/public/customizations/types.ts new file mode 100644 index 0000000000000..7c7088306f585 --- /dev/null +++ b/src/plugins/discover/public/customizations/types.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import type { DiscoverStateContainer } from '../application/main/services/discover_state'; +import type { DiscoverCustomizationService } from './customization_service'; + +export interface CustomizationCallbackContext { + customizations: DiscoverCustomizationService; + stateContainer: DiscoverStateContainer; +} + +export type CustomizationCallback = ( + options: CustomizationCallbackContext +) => void | (() => void) | Promise void)>; diff --git a/src/plugins/discover/public/hooks/use_confirm_persistence_prompt.ts b/src/plugins/discover/public/hooks/use_confirm_persistence_prompt.ts index d5ea19c4316b3..17aeb5bbeea37 100644 --- a/src/plugins/discover/public/hooks/use_confirm_persistence_prompt.ts +++ b/src/plugins/discover/public/hooks/use_confirm_persistence_prompt.ts @@ -7,15 +7,12 @@ */ import { useCallback } from 'react'; -import { v4 as uuidv4 } from 'uuid'; import { i18n } from '@kbn/i18n'; import type { DataView } from '@kbn/data-views-plugin/public'; import { SavedSearch } from '@kbn/saved-search-plugin/public'; import { useDiscoverServices } from './use_discover_services'; import { showConfirmPanel } from './show_confirm_panel'; -import { persistSavedSearch } from '../application/main/utils/persist_saved_search'; import { DiscoverStateContainer } from '../application/main/services/discover_state'; -import { updateFiltersReferences } from '../application/main/utils/update_filter_references'; export const useConfirmPersistencePrompt = (stateContainer: DiscoverStateContainer) => { const services = useDiscoverServices(); @@ -23,16 +20,7 @@ export const useConfirmPersistencePrompt = (stateContainer: DiscoverStateContain const persistDataView: (adHocDataView: DataView) => Promise = useCallback( async (adHocDataView) => { try { - const persistedDataView = await services.dataViews.createAndSave({ - ...adHocDataView.toSpec(), - id: uuidv4(), - }); - services.dataViews.clearInstanceCache(adHocDataView.id); - - updateFiltersReferences(adHocDataView, persistedDataView); - - stateContainer.actions.removeAdHocDataViewById(adHocDataView.id!); - await stateContainer.appState.update({ index: persistedDataView.id }, true); + const persistedDataView = await stateContainer.actions.persistAdHocDataView(adHocDataView); const message = i18n.translate('discover.dataViewPersist.message', { defaultMessage: "Saved '{dataViewName}'", @@ -50,7 +38,7 @@ export const useConfirmPersistencePrompt = (stateContainer: DiscoverStateContain throw new Error(error); } }, - [services.dataViews, services.toastNotifications, stateContainer] + [services.toastNotifications, stateContainer] ); const openConfirmSavePrompt: (dataView: DataView) => Promise = useCallback( @@ -99,17 +87,15 @@ export const useConfirmPersistencePrompt = (stateContainer: DiscoverStateContain ); const updateSavedSearch = useCallback( - ({ savedSearch, dataView, state }) => { - return persistSavedSearch(savedSearch, { - dataView, - onSuccess: () => onUpdateSuccess(savedSearch), - onError: (error) => onUpdateError(error, savedSearch), - state, - saveOptions: {}, - services, - }); + async ({ savedSearch }) => { + try { + await stateContainer.savedSearchState.persist(savedSearch); + onUpdateSuccess(savedSearch); + } catch (e) { + onUpdateError(e, savedSearch); + } }, - [onUpdateError, onUpdateSuccess, services] + [onUpdateError, onUpdateSuccess, stateContainer.savedSearchState] ); return { openConfirmSavePrompt, updateSavedSearch }; diff --git a/src/plugins/discover/public/plugin.tsx b/src/plugins/discover/public/plugin.tsx index 1d106309641a3..f114578c8f4de 100644 --- a/src/plugins/discover/public/plugin.tsx +++ b/src/plugins/discover/public/plugin.tsx @@ -71,6 +71,9 @@ import { DiscoverSingleDocLocatorDefinition, } from './application/doc/locator'; import { DiscoverAppLocator, DiscoverAppLocatorDefinition } from '../common'; +import type { CustomizationCallback } from './customizations/types'; +import { createProfileRegistry } from './customizations/profile_registry'; +import { ProfileAwareLocator } from './customizations/profile_aware_locator'; const DocViewerLegacyTable = React.lazy( () => import('./services/doc_views/components/doc_viewer_table/legacy') @@ -155,6 +158,7 @@ export interface DiscoverStart { * ``` */ readonly locator: undefined | DiscoverAppLocator; + readonly customize: (profileName: string, callback: CustomizationCallback) => void; } /** @@ -209,25 +213,34 @@ export class DiscoverPlugin private appStateUpdater = new BehaviorSubject(() => ({})); private docViewsRegistry: DocViewsRegistry | null = null; private stopUrlTracking: (() => void) | undefined = undefined; + private profileRegistry = createProfileRegistry(); private locator?: DiscoverAppLocator; + private profileAwareLocator?: DiscoverAppLocator; private contextLocator?: DiscoverContextAppLocator; private singleDocLocator?: DiscoverSingleDocLocator; setup(core: CoreSetup, plugins: DiscoverSetupPlugins) { const baseUrl = core.http.basePath.prepend('/app/discover'); const isDev = this.initializerContext.env.mode.dev; + if (plugins.share) { const useHash = core.uiSettings.get('state:storeInSessionStorage'); + + // Create locators for external use without profile-awareness this.locator = plugins.share.url.locators.create( new DiscoverAppLocatorDefinition({ useHash, setStateToKbnUrl }) ); - - this.contextLocator = plugins.share.url.locators.create( + const contextLocator = plugins.share.url.locators.create( new DiscoverContextAppLocatorDefinition({ useHash }) ); - this.singleDocLocator = plugins.share.url.locators.create( + const singleDocLocator = plugins.share.url.locators.create( new DiscoverSingleDocLocatorDefinition() ); + + // Create profile-aware locators for internal use + this.profileAwareLocator = new ProfileAwareLocator(this.locator); + this.contextLocator = new ProfileAwareLocator(contextLocator); + this.singleDocLocator = new ProfileAwareLocator(singleDocLocator); } this.docViewsRegistry = new DocViewsRegistry(); @@ -318,7 +331,7 @@ export class DiscoverPlugin coreStart, discoverStartPlugins, this.initializerContext, - this.locator!, + this.profileAwareLocator!, this.contextLocator!, this.singleDocLocator! ); @@ -330,7 +343,12 @@ export class DiscoverPlugin // FIXME: Temporarily hide overflow-y in Discover app when Field Stats table is shown // due to EUI bug https://github.com/elastic/eui/pull/5152 params.element.classList.add('dscAppWrapper'); - const unmount = renderApp(params.element, services, isDev); + const unmount = renderApp({ + element: params.element, + services, + profileRegistry: this.profileRegistry, + isDev, + }); return () => { unlistenParentHistory(); unmount(); @@ -391,6 +409,14 @@ export class DiscoverPlugin return { locator: this.locator, + customize: (profileName: string, callback: CustomizationCallback) => { + const profile = this.profileRegistry.get(profileName) ?? { + name: profileName, + customizationCallbacks: [], + }; + profile.customizationCallbacks.push(callback); + this.profileRegistry.set(profile); + }, }; } diff --git a/src/plugins/discover/public/services/saved_searches/restore_from_saved_search.test.ts b/src/plugins/discover/public/services/saved_searches/restore_from_saved_search.test.ts index 355f80b78b2ac..45c9645706583 100644 --- a/src/plugins/discover/public/services/saved_searches/restore_from_saved_search.test.ts +++ b/src/plugins/discover/public/services/saved_searches/restore_from_saved_search.test.ts @@ -8,7 +8,7 @@ import type { TimefilterContract } from '@kbn/data-plugin/public'; import type { TimeRange, RefreshInterval } from '@kbn/data-plugin/common'; -import type { SavedSearch } from '@kbn/saved-search-plugin/public'; +import { savedSearchMock, savedSearchMockWithTimeField } from '../../__mocks__/saved_search'; import { restoreStateFromSavedSearch } from './restore_from_saved_search'; describe('discover restore state from saved search', () => { @@ -31,7 +31,7 @@ describe('discover restore state from saved search', () => { test('should not update timefilter if attributes are not set', async () => { restoreStateFromSavedSearch({ - savedSearch: {} as SavedSearch, + savedSearch: savedSearchMockWithTimeField, timefilter: timefilterMock, }); @@ -42,10 +42,11 @@ describe('discover restore state from saved search', () => { test('should not update timefilter if timeRestore is disabled', async () => { restoreStateFromSavedSearch({ savedSearch: { + ...savedSearchMockWithTimeField, timeRestore: false, timeRange, refreshInterval, - } as SavedSearch, + }, timefilter: timefilterMock, }); @@ -56,10 +57,11 @@ describe('discover restore state from saved search', () => { test('should update timefilter if timeRestore is enabled', async () => { restoreStateFromSavedSearch({ savedSearch: { + ...savedSearchMockWithTimeField, timeRestore: true, timeRange, refreshInterval, - } as SavedSearch, + }, timefilter: timefilterMock, }); @@ -67,11 +69,27 @@ describe('discover restore state from saved search', () => { expect(timefilterMock.setRefreshInterval).toHaveBeenCalledWith(refreshInterval); }); + test('should not update if data view is not time based', async () => { + restoreStateFromSavedSearch({ + savedSearch: { + ...savedSearchMock, + timeRestore: true, + timeRange, + refreshInterval, + }, + timefilter: timefilterMock, + }); + + expect(timefilterMock.setTime).not.toHaveBeenCalled(); + expect(timefilterMock.setRefreshInterval).not.toHaveBeenCalled(); + }); + test('should not update timefilter if attributes are missing', async () => { restoreStateFromSavedSearch({ savedSearch: { + ...savedSearchMockWithTimeField, timeRestore: true, - } as SavedSearch, + }, timefilter: timefilterMock, }); @@ -82,6 +100,7 @@ describe('discover restore state from saved search', () => { test('should not update timefilter if attributes are invalid', async () => { restoreStateFromSavedSearch({ savedSearch: { + ...savedSearchMockWithTimeField, timeRestore: true, timeRange: { from: 'test', @@ -91,7 +110,7 @@ describe('discover restore state from saved search', () => { pause: false, value: -500, }, - } as SavedSearch, + }, timefilter: timefilterMock, }); diff --git a/src/plugins/discover/public/services/saved_searches/restore_from_saved_search.ts b/src/plugins/discover/public/services/saved_searches/restore_from_saved_search.ts index 550c36408977b..c36c99cf5866d 100644 --- a/src/plugins/discover/public/services/saved_searches/restore_from_saved_search.ts +++ b/src/plugins/discover/public/services/saved_searches/restore_from_saved_search.ts @@ -21,6 +21,12 @@ export const restoreStateFromSavedSearch = ({ return; } + const isTimeBased = savedSearch.searchSource.getField('index')?.isTimeBased(); + + if (!isTimeBased) { + return; + } + if (savedSearch.timeRestore && savedSearch.timeRange && isTimeRangeValid(savedSearch.timeRange)) { timefilter.setTime(savedSearch.timeRange); } diff --git a/src/plugins/discover/public/utils/add_log.ts b/src/plugins/discover/public/utils/add_log.ts index fd2de53ab4e61..7b14f7f69b452 100644 --- a/src/plugins/discover/public/utils/add_log.ts +++ b/src/plugins/discover/public/utils/add_log.ts @@ -14,8 +14,15 @@ export const addLog = (message: string, payload?: unknown) => { // @ts-expect-error - if (window?.ELASTIC_DISCOVER_LOGGER) { - // eslint-disable-next-line no-console - console.log(`[Discover] ${message}`, payload); + const logger = window?.ELASTIC_DISCOVER_LOGGER; + + if (logger) { + if (logger === 'debug') { + // eslint-disable-next-line no-console + console.log(`[Discover] ${message}`, payload); + } else { + // eslint-disable-next-line no-console + console.log(`[Discover] ${message}`); + } } }; diff --git a/src/plugins/discover/public/utils/breadcrumbs.ts b/src/plugins/discover/public/utils/breadcrumbs.ts index ca968b43fdb2a..b93330e68de7f 100644 --- a/src/plugins/discover/public/utils/breadcrumbs.ts +++ b/src/plugins/discover/public/utils/breadcrumbs.ts @@ -6,24 +6,44 @@ * Side Public License, v 1. */ -import { ChromeStart } from '@kbn/core/public'; import { i18n } from '@kbn/i18n'; -import { SavedSearch } from '@kbn/saved-search-plugin/public'; +import { matchPath } from 'react-router-dom'; +import type { DiscoverServices } from '../build_services'; -export function getRootBreadcrumbs(breadcrumb?: string) { +const getRootPath = ({ history }: DiscoverServices) => { + const match = matchPath<{ profile?: string }>(history().location.pathname, { + path: '/p/:profile', + }); + + return match ? `#/p/${match.params.profile}/` : '#/'; +}; + +export function getRootBreadcrumbs({ + breadcrumb, + services, +}: { + breadcrumb?: string; + services: DiscoverServices; +}) { return [ { text: i18n.translate('discover.rootBreadcrumb', { defaultMessage: 'Discover', }), - href: breadcrumb || '#/', + href: breadcrumb || getRootPath(services), }, ]; } -export function getSavedSearchBreadcrumbs(id: string) { +export function getSavedSearchBreadcrumbs({ + id, + services, +}: { + id: string; + services: DiscoverServices; +}) { return [ - ...getRootBreadcrumbs(), + ...getRootBreadcrumbs({ services }), { text: id, }, @@ -34,21 +54,27 @@ export function getSavedSearchBreadcrumbs(id: string) { * Helper function to set the Discover's breadcrumb * if there's an active savedSearch, its title is appended */ -export function setBreadcrumbsTitle(savedSearch: SavedSearch, chrome: ChromeStart) { +export function setBreadcrumbsTitle({ + title, + services, +}: { + title: string | undefined; + services: DiscoverServices; +}) { const discoverBreadcrumbsTitle = i18n.translate('discover.discoverBreadcrumbTitle', { defaultMessage: 'Discover', }); - if (savedSearch.id && savedSearch.title) { - chrome.setBreadcrumbs([ + if (title) { + services.chrome.setBreadcrumbs([ { text: discoverBreadcrumbsTitle, - href: '#/', + href: getRootPath(services), }, - { text: savedSearch.title }, + { text: title }, ]); } else { - chrome.setBreadcrumbs([ + services.chrome.setBreadcrumbs([ { text: discoverBreadcrumbsTitle, }, diff --git a/src/plugins/discover/tsconfig.json b/src/plugins/discover/tsconfig.json index 1f9beedd297ac..29b29b2a436b0 100644 --- a/src/plugins/discover/tsconfig.json +++ b/src/plugins/discover/tsconfig.json @@ -48,11 +48,11 @@ "@kbn/ui-theme", "@kbn/react-field", "@kbn/monaco", - "@kbn/core-notifications-browser", "@kbn/config-schema", "@kbn/storybook", "@kbn/shared-ux-router", "@kbn/dom-drag-drop", + "@kbn/core-saved-objects-api-server", ], "exclude": [ "target/**/*", diff --git a/src/plugins/files/server/mocks.ts b/src/plugins/files/server/mocks.ts index 4da690b99240e..2edf314923464 100644 --- a/src/plugins/files/server/mocks.ts +++ b/src/plugins/files/server/mocks.ts @@ -9,6 +9,7 @@ import { KibanaRequest } from '@kbn/core/server'; import { DeeplyMockedKeys } from '@kbn/utility-types-jest'; import * as stream from 'stream'; +import { clone } from 'lodash'; import { File } from '../common'; import { FileClient, FileServiceFactory, FileServiceStart, FilesSetup } from '.'; @@ -56,7 +57,9 @@ export const createFileMock = (): DeeplyMockedKeys => { share: jest.fn(), listShares: jest.fn(), unshare: jest.fn(), - toJSON: jest.fn(), + toJSON: jest.fn(() => { + return clone(fileMock.data); + }), }; fileMock.update.mockResolvedValue(fileMock); diff --git a/src/plugins/kibana_usage_collection/server/collectors/management/schema.ts b/src/plugins/kibana_usage_collection/server/collectors/management/schema.ts index 6f66f70530d39..ee43c0b003cb1 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/management/schema.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/management/schema.ts @@ -410,6 +410,10 @@ export const stackManagementSchema: MakeSchemaFrom = { type: 'text', _meta: { description: 'Non-default value of setting.' }, }, + 'observability:syntheticsThrottlingEnabled': { + type: 'boolean', + _meta: { description: 'Non-default value of setting.' }, + }, 'observability:enableInspectEsQueries': { type: 'boolean', _meta: { description: 'Non-default value of setting.' }, diff --git a/src/plugins/kibana_usage_collection/server/collectors/management/types.ts b/src/plugins/kibana_usage_collection/server/collectors/management/types.ts index 27244be1b2efd..5d8946b5aeb60 100644 --- a/src/plugins/kibana_usage_collection/server/collectors/management/types.ts +++ b/src/plugins/kibana_usage_collection/server/collectors/management/types.ts @@ -141,6 +141,7 @@ export interface UsageStats { hideAnnouncements: boolean; isDefaultIndexMigrated: boolean; 'metrics:allowCheckingForFailedShards': boolean; + 'observability:syntheticsThrottlingEnabled': boolean; 'observability:apmLabsButton': boolean; 'observability:enableAwsLambdaMetrics': boolean; 'observability:apmProgressiveLoading': string; diff --git a/src/plugins/saved_search/public/index.ts b/src/plugins/saved_search/public/index.ts index 506e90825209a..4857b0fd153cf 100644 --- a/src/plugins/saved_search/public/index.ts +++ b/src/plugins/saved_search/public/index.ts @@ -15,6 +15,7 @@ export { getSavedSearchUrlConflictMessage, throwErrorOnSavedSearchUrlConflict, saveSavedSearch, + getNewSavedSearch, } from './services/saved_searches'; export { VIEW_MODE } from '../common'; diff --git a/src/plugins/saved_search/public/services/saved_searches/get_saved_searches.ts b/src/plugins/saved_search/public/services/saved_searches/get_saved_searches.ts index 0cae15e729209..d90bbed57e2f5 100644 --- a/src/plugins/saved_search/public/services/saved_searches/get_saved_searches.ts +++ b/src/plugins/saved_search/public/services/saved_searches/get_saved_searches.ts @@ -24,14 +24,6 @@ interface GetSavedSearchDependencies { savedObjectsTagging?: SavedObjectsTaggingApi; } -const getEmptySavedSearch = ({ - search, -}: { - search: DataPublicPluginStart['search']; -}): SavedSearch => ({ - searchSource: search.searchSource.createEmpty(), -}); - const findSavedSearch = async ( savedSearchId: string, { search, savedObjectsClient, spaces, savedObjectsTagging }: GetSavedSearchDependencies @@ -82,11 +74,29 @@ const findSavedSearch = async ( }; /** @public **/ + +/** + * Returns a new saved search + * Used when e.g. Discover is opened without a saved search id + * @param search + */ +export const getNewSavedSearch = ({ + search, +}: { + search: DataPublicPluginStart['search']; +}): SavedSearch => ({ + searchSource: search.searchSource.createEmpty(), +}); +/** + * Returns a persisted or a new saved search + * @param savedSearchId - when undefined a new saved search is returned + * @param dependencies + */ export const getSavedSearch = async ( savedSearchId: string | undefined, dependencies: GetSavedSearchDependencies ) => { return savedSearchId ? findSavedSearch(savedSearchId, dependencies) - : getEmptySavedSearch(dependencies); + : getNewSavedSearch(dependencies); }; diff --git a/src/plugins/saved_search/public/services/saved_searches/index.ts b/src/plugins/saved_search/public/services/saved_searches/index.ts index 3aa4120e19e78..53f486e79bb15 100644 --- a/src/plugins/saved_search/public/services/saved_searches/index.ts +++ b/src/plugins/saved_search/public/services/saved_searches/index.ts @@ -6,7 +6,7 @@ * Side Public License, v 1. */ -export { getSavedSearch } from './get_saved_searches'; +export { getSavedSearch, getNewSavedSearch } from './get_saved_searches'; export { getSavedSearchUrl, getSavedSearchFullPathUrl, diff --git a/src/plugins/telemetry/schema/oss_plugins.json b/src/plugins/telemetry/schema/oss_plugins.json index a72cdc0274110..27e4f1c22c04a 100644 --- a/src/plugins/telemetry/schema/oss_plugins.json +++ b/src/plugins/telemetry/schema/oss_plugins.json @@ -9142,6 +9142,12 @@ "description": "Non-default value of setting." } }, + "observability:syntheticsThrottlingEnabled": { + "type": "boolean", + "_meta": { + "description": "Non-default value of setting." + } + }, "observability:maxSuggestions": { "type": "integer", "_meta": { diff --git a/src/plugins/unified_field_list/common/types/index.ts b/src/plugins/unified_field_list/common/types/index.ts index 78dbc548406c0..63714567d6e8d 100755 --- a/src/plugins/unified_field_list/common/types/index.ts +++ b/src/plugins/unified_field_list/common/types/index.ts @@ -6,9 +6,4 @@ * Side Public License, v 1. */ -export type { - FieldStatsResponse, - NumberStatsResult, - TopValuesResult, - BucketedAggregation, -} from './stats'; +export type { FieldStatsResponse, BucketedAggregation, NumberSummary } from './stats'; diff --git a/src/plugins/unified_field_list/common/types/stats.ts b/src/plugins/unified_field_list/common/types/stats.ts index 71d75db1aaaa3..56853e0965135 100644 --- a/src/plugins/unified_field_list/common/types/stats.ts +++ b/src/plugins/unified_field_list/common/types/stats.ts @@ -13,15 +13,9 @@ export interface BucketedAggregation { }>; } -export interface NumberStatsResult { - count: number; - histogram: BucketedAggregation; - topValues: BucketedAggregation; -} - -export interface TopValuesResult { - count: number; - topValues: BucketedAggregation; +export interface NumberSummary { + minValue: number | null; + maxValue: number | null; } export interface FieldStatsResponse { @@ -35,4 +29,5 @@ export interface FieldStatsResponse { // Histogram and values are based on distinct values, not based on documents histogram?: BucketedAggregation; topValues?: BucketedAggregation; + numberSummary?: NumberSummary; } diff --git a/src/plugins/unified_field_list/common/utils/field_stats_utils.test.ts b/src/plugins/unified_field_list/common/utils/field_stats_utils.test.ts index 1135f028f1702..9f868b4c6b60a 100644 --- a/src/plugins/unified_field_list/common/utils/field_stats_utils.test.ts +++ b/src/plugins/unified_field_list/common/utils/field_stats_utils.test.ts @@ -6,7 +6,65 @@ * Side Public License, v 1. */ -import { buildSearchParams } from './field_stats_utils'; +import { createStubDataView } from '@kbn/data-views-plugin/common/data_view.stub'; +import { buildSearchParams, fetchAndCalculateFieldStats } from './field_stats_utils'; + +const dataView = createStubDataView({ + spec: { + id: 'test', + title: 'test', + fields: { + bytes: { + name: 'bytes', + type: 'number', + esTypes: ['long'], + aggregatable: true, + searchable: true, + count: 10, + readFromDocValues: true, + scripted: false, + isMapped: true, + }, + bytes_counter: { + timeSeriesMetric: 'counter', + name: 'bytes_counter', + type: 'number', + esTypes: ['long'], + aggregatable: true, + searchable: true, + count: 10, + readFromDocValues: true, + scripted: false, + isMapped: true, + }, + 'extension.keyword': { + name: 'extension.keyword', + type: 'string', + esTypes: ['keyword'], + aggregatable: true, + searchable: true, + count: 0, + readFromDocValues: true, + scripted: false, + subType: { + multi: { + parent: 'extension', + }, + }, + isMapped: true, + }, + _id: { + name: '_id', + type: 'string', + esTypes: ['_id'], + aggregatable: false, + searchable: true, + readFromDocValues: true, + isMapped: true, + }, + }, + }, +}); describe('fieldStatsUtils', function () { describe('buildSearchParams()', () => { @@ -150,4 +208,460 @@ describe('fieldStatsUtils', function () { ).toMatchSnapshot(); }); }); + + describe('fetchAndCalculateFieldStats()', () => { + it('should provide data to render a number summary for some number fields (time series metric counter)', async () => { + const searchMock = jest.fn(async () => ({ + took: 1, + timed_out: false, + _shards: { + total: 1, + successful: 1, + skipped: 0, + failed: 0, + }, + hits: { + total: 6460, + max_score: null, + hits: [], + }, + aggregations: { + sample: { + doc_count: 5000, + min_max_summary: { + doc_count: 5000, + min: { + value: 29674, + }, + max: { + value: 36821994, + }, + }, + }, + }, + })); + + const result = await fetchAndCalculateFieldStats({ + searchHandler: searchMock, + dataView, + field: dataView.getFieldByName('bytes_counter')!, + fromDate: '2022-12-05T23:00:00.000Z', + toDate: '2023-01-05T09:33:05.359Z', + }); + + expect(result).toMatchInlineSnapshot(` + Object { + "numberSummary": Object { + "maxValue": 36821994, + "minValue": 29674, + }, + "sampledDocuments": 5000, + "sampledValues": 5000, + "totalDocuments": 6460, + } + `); + + expect(searchMock).toHaveBeenCalledWith({ + aggs: { + sample: { + sampler: { shard_size: 5000 }, + aggs: { + min_max_summary: { + filter: { exists: { field: 'bytes_counter' } }, + aggs: { + min: { min: { field: 'bytes_counter' } }, + max: { max: { field: 'bytes_counter' } }, + }, + }, + }, + }, + }, + }); + }); + + it('should provide data for rendering top values and value distribution for a number field', async () => { + const searchMock = jest.fn(async ({ aggs }) => + aggs?.sample?.aggs?.histo + ? { + took: 1, + timed_out: false, + _shards: { + total: 10, + successful: 10, + skipped: 0, + failed: 0, + }, + hits: { + total: 2, + max_score: null, + hits: [], + }, + aggregations: { + sample: { + doc_count: 2, + histo: { + buckets: [ + { + key: 1620, + doc_count: 1, + }, + { + key: 1944, + doc_count: 0, + }, + { + key: 2268, + doc_count: 0, + }, + { + key: 2592, + doc_count: 0, + }, + { + key: 2916, + doc_count: 0, + }, + { + key: 3240, + doc_count: 0, + }, + { + key: 3564, + doc_count: 0, + }, + { + key: 3888, + doc_count: 0, + }, + { + key: 4212, + doc_count: 0, + }, + { + key: 4536, + doc_count: 0, + }, + { + key: 4860, + doc_count: 1, + }, + ], + }, + }, + }, + } + : { + took: 2, + timed_out: false, + _shards: { + total: 10, + successful: 10, + skipped: 0, + failed: 0, + }, + hits: { + total: 2, + max_score: null, + hits: [], + }, + aggregations: { + sample: { + doc_count: 2, + top_values: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 1880, + doc_count: 1, + }, + { + key: 5115, + doc_count: 1, + }, + ], + }, + min_value: { + value: 1880, + }, + sample_count: { + value: 2, + }, + max_value: { + value: 5115, + }, + }, + }, + } + ); + + const result = await fetchAndCalculateFieldStats({ + searchHandler: searchMock, + dataView, + field: dataView.getFieldByName('bytes')!, + fromDate: '2022-12-05T23:00:00.000Z', + toDate: '2023-01-05T09:33:05.359Z', + }); + + expect(result).toMatchInlineSnapshot(` + Object { + "histogram": Object { + "buckets": Array [ + Object { + "count": 1, + "key": 1620, + }, + Object { + "count": 0, + "key": 1944, + }, + Object { + "count": 0, + "key": 2268, + }, + Object { + "count": 0, + "key": 2592, + }, + Object { + "count": 0, + "key": 2916, + }, + Object { + "count": 0, + "key": 3240, + }, + Object { + "count": 0, + "key": 3564, + }, + Object { + "count": 0, + "key": 3888, + }, + Object { + "count": 0, + "key": 4212, + }, + Object { + "count": 0, + "key": 4536, + }, + Object { + "count": 1, + "key": 4860, + }, + ], + }, + "sampledDocuments": 2, + "sampledValues": 2, + "topValues": Object { + "buckets": Array [ + Object { + "count": 1, + "key": 1880, + }, + Object { + "count": 1, + "key": 5115, + }, + ], + }, + "totalDocuments": 2, + } + `); + + expect(searchMock).toHaveBeenNthCalledWith(1, { + aggs: { + sample: { + sampler: { shard_size: 5000 }, + aggs: { + min_value: { min: { field: 'bytes' } }, + max_value: { max: { field: 'bytes' } }, + sample_count: { value_count: { field: 'bytes' } }, + top_values: { terms: { field: 'bytes', size: 10 } }, + }, + }, + }, + }); + + expect(searchMock).toHaveBeenNthCalledWith(2, { + aggs: { + sample: { + sampler: { shard_size: 5000 }, + aggs: { histo: { histogram: { field: 'bytes', interval: 324 } } }, + }, + }, + }); + }); + + it('should provide data for string top values', async () => { + const searchMock = jest.fn(async () => ({ + took: 3, + timed_out: false, + _shards: { + total: 10, + successful: 10, + skipped: 0, + failed: 0, + }, + hits: { + total: 75026, + max_score: null, + hits: [], + }, + aggregations: { + sample: { + doc_count: 50000, + top_values: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'jpg', + doc_count: 32039, + }, + { + key: 'css', + doc_count: 8155, + }, + { + key: 'png', + doc_count: 4823, + }, + { + key: 'gif', + doc_count: 3317, + }, + { + key: 'php', + doc_count: 1666, + }, + ], + }, + sample_count: { + value: 50000, + }, + }, + }, + })); + + const result = await fetchAndCalculateFieldStats({ + searchHandler: searchMock, + dataView, + field: dataView.getFieldByName('extension.keyword')!, + fromDate: '2022-12-05T23:00:00.000Z', + toDate: '2023-01-05T09:33:05.359Z', + }); + + expect(result).toMatchInlineSnapshot(` + Object { + "sampledDocuments": 50000, + "sampledValues": 50000, + "topValues": Object { + "buckets": Array [ + Object { + "count": 32039, + "key": "jpg", + }, + Object { + "count": 8155, + "key": "css", + }, + Object { + "count": 4823, + "key": "png", + }, + Object { + "count": 3317, + "key": "gif", + }, + Object { + "count": 1666, + "key": "php", + }, + ], + }, + "totalDocuments": 75026, + } + `); + + expect(searchMock).toHaveBeenCalledWith({ + aggs: { + sample: { + sampler: { shard_size: 5000 }, + aggs: { + sample_count: { value_count: { field: 'extension.keyword' } }, + top_values: { terms: { field: 'extension.keyword', size: 10, shard_size: 25 } }, + }, + }, + }, + }); + }); + + it('should provide examples for a non-aggregatable field', async () => { + const searchMock = jest.fn(async () => ({ + took: 2, + timed_out: false, + _shards: { + total: 10, + successful: 10, + skipped: 0, + failed: 0, + }, + hits: { + total: 2, + max_score: 0, + hits: [ + { + _index: 'logstash-0', + _id: 'py8MyIcBz-pNi9QsLMYl', + _score: 0, + fields: { + _id: ['py8MyIcBz-pNi9QsLMYl'], + }, + }, + { + _index: 'logstash-0', + _id: '_S8MyIcBz-pNi9QsIoj5', + _score: 0, + fields: { + _id: ['_S8MyIcBz-pNi9QsIoj5'], + }, + }, + ], + }, + })); + + const result = await fetchAndCalculateFieldStats({ + searchHandler: searchMock, + dataView, + field: dataView.getFieldByName('_id')!, + fromDate: '2022-12-05T23:00:00.000Z', + toDate: '2023-01-05T09:33:05.359Z', + }); + + expect(result).toMatchInlineSnapshot(` + Object { + "sampledDocuments": 2, + "sampledValues": 2, + "topValues": Object { + "buckets": Array [ + Object { + "count": 1, + "key": "_S8MyIcBz-pNi9QsIoj5", + }, + Object { + "count": 1, + "key": "py8MyIcBz-pNi9QsLMYl", + }, + ], + }, + "totalDocuments": 2, + } + `); + + expect(searchMock).toHaveBeenCalledWith({ size: 100, fields: [{ field: '_id' }] }); + }); + }); }); diff --git a/src/plugins/unified_field_list/common/utils/field_stats_utils.ts b/src/plugins/unified_field_list/common/utils/field_stats_utils.ts index aae9dcaa03692..e9cd750cd034d 100644 --- a/src/plugins/unified_field_list/common/utils/field_stats_utils.ts +++ b/src/plugins/unified_field_list/common/utils/field_stats_utils.ts @@ -127,6 +127,10 @@ export async function fetchAndCalculateFieldStats({ return await getNumberHistogram(searchHandler, field, false); } + if (canProvideNumberSummaryForField(field)) { + return await getNumberSummary(searchHandler, field); + } + if (field.type === 'number') { return await getNumberHistogram(searchHandler, field); } @@ -145,8 +149,7 @@ function canProvideAggregatedStatsForField(field: DataViewField): boolean { field.type === 'geo_point' || field.type === 'geo_shape' || field.type === 'murmur3' || - field.type === 'attachment' || - field.timeSeriesMetric === 'counter' + field.type === 'attachment' ); } @@ -156,6 +159,53 @@ export function canProvideStatsForField(field: DataViewField): boolean { ); } +export function canProvideNumberSummaryForField(field: DataViewField): boolean { + return field.timeSeriesMetric === 'counter'; +} + +export async function getNumberSummary( + aggSearchWithBody: SearchHandler, + field: DataViewField +): Promise> { + // similar to `getNumericFieldsStatsRequest` from Data Visualizer + const searchWithAggs = { + sample: { + sampler: { shard_size: SHARD_SIZE }, + aggs: { + min_max_summary: { + filter: { exists: { field: field.name } }, + aggs: { + min: { + min: { field: field.name }, + }, + max: { + max: { field: field.name }, + }, + }, + }, + }, + }, + }; + + const summaryResult = (await aggSearchWithBody({ + aggs: searchWithAggs, + })) as ESSearchResponse; + + const minValue = summaryResult.aggregations!.sample.min_max_summary.min.value; + const maxValue = summaryResult.aggregations!.sample.min_max_summary.max.value; + const sampledDocuments = summaryResult.aggregations!.sample.doc_count; + + return { + totalDocuments: getHitsTotal(summaryResult), + sampledDocuments, + sampledValues: sampledDocuments, + numberSummary: { + minValue, + maxValue, + }, + }; +} + export async function getNumberHistogram( aggSearchWithBody: SearchHandler, field: DataViewField, diff --git a/src/plugins/unified_field_list/public/components/field_stats/field_number_summary.test.tsx b/src/plugins/unified_field_list/public/components/field_stats/field_number_summary.test.tsx new file mode 100644 index 0000000000000..97a85e2a3394c --- /dev/null +++ b/src/plugins/unified_field_list/public/components/field_stats/field_number_summary.test.tsx @@ -0,0 +1,64 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React from 'react'; +import { createStubDataView } from '@kbn/data-views-plugin/common/data_views/data_view.stub'; +import { mountWithIntl } from '@kbn/test-jest-helpers'; +import { FieldNumberSummary } from './field_number_summary'; + +const dataView = createStubDataView({ + spec: { + id: 'test', + title: 'test', + fields: { + bytes_counter: { + timeSeriesMetric: 'counter', + name: 'bytes_counter', + type: 'number', + esTypes: ['long'], + aggregatable: true, + searchable: true, + count: 10, + readFromDocValues: true, + scripted: false, + isMapped: true, + }, + }, + }, +}); + +describe('UnifiedFieldList ', () => { + it('should render min and max correctly', async () => { + const wrapper = mountWithIntl( + + ); + + expect(wrapper.text()).toBe('min45max12345'); + }); + + it('should not fail if data is invalid', async () => { + const wrapper = mountWithIntl( + + ); + + expect(wrapper.isEmptyRender()).toBe(true); + }); +}); diff --git a/src/plugins/unified_field_list/public/components/field_stats/field_number_summary.tsx b/src/plugins/unified_field_list/public/components/field_stats/field_number_summary.tsx new file mode 100755 index 0000000000000..8ccea18eecdba --- /dev/null +++ b/src/plugins/unified_field_list/public/components/field_stats/field_number_summary.tsx @@ -0,0 +1,106 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React, { ReactNode } from 'react'; +import { + EuiBasicTable, + HorizontalAlignment, + LEFT_ALIGNMENT, + RIGHT_ALIGNMENT, + euiScreenReaderOnly, +} from '@elastic/eui'; +import { DataView, DataViewField } from '@kbn/data-plugin/common'; +import { i18n } from '@kbn/i18n'; +import { css } from '@emotion/react'; +import type { NumberSummary } from '../../../common/types'; + +interface SummaryTableItem { + key: string; + label: ReactNode; + value: string; +} + +export interface FieldNumberSummaryProps { + dataView: DataView; + field: DataViewField; + numberSummary?: NumberSummary; + 'data-test-subj': string; +} + +export const FieldNumberSummary: React.FC = ({ + dataView, + field, + numberSummary, + 'data-test-subj': dataTestSubject, +}) => { + if (!numberSummary || !isNumberSummaryValid(numberSummary)) { + return null; + } + + const formatter = dataView.getFormatterForField(field); + + const summaryTableItems: SummaryTableItem[] = [ + { + key: 'min', + label: i18n.translate('unifiedFieldList.fieldStats.numberSummary.minLabel', { + defaultMessage: 'min', + }), + value: formatter.convert(numberSummary.minValue, 'text'), + }, + { + key: 'max', + label: i18n.translate('unifiedFieldList.fieldStats.numberSummary.maxLabel', { + defaultMessage: 'max', + }), + value: formatter.convert(numberSummary.maxValue, 'text'), + }, + ]; + const summaryTableColumns = [ + { + field: 'label', + name: '', + align: LEFT_ALIGNMENT as HorizontalAlignment, + }, + { + field: 'value', + name: '', + render: (v: string) => {v}, + align: RIGHT_ALIGNMENT as HorizontalAlignment, + }, + ]; + + const summaryTableTitle = i18n.translate( + 'unifiedFieldList.fieldStats.numberSummary.summaryTableTitle', + { + defaultMessage: 'Summary', + } + ); + + return ( + + compressed + items={summaryTableItems} + columns={summaryTableColumns} + tableCaption={summaryTableTitle} + data-test-subj={`${dataTestSubject}-numberSummary`} + responsive={false} + css={css` + & .euiTableHeaderCell { + ${euiScreenReaderOnly()} + } + & .euiTableRowCell { + border-top: none; + } + `} + /> + ); +}; + +export function isNumberSummaryValid(numberSummary?: NumberSummary): boolean { + return typeof numberSummary?.minValue === 'number' && typeof numberSummary?.maxValue === 'number'; +} diff --git a/src/plugins/unified_field_list/public/components/field_stats/field_stats.test.tsx b/src/plugins/unified_field_list/public/components/field_stats/field_stats.test.tsx index dc0fefabb0d98..40a0d52e6cd13 100644 --- a/src/plugins/unified_field_list/public/components/field_stats/field_stats.test.tsx +++ b/src/plugins/unified_field_list/public/components/field_stats/field_stats.test.tsx @@ -99,6 +99,18 @@ describe('UnifiedFieldList ', () => { aggregatable: true, searchable: true, }, + { + name: 'bytes_counter', + timeSeriesMetric: 'counter', + type: 'number', + esTypes: ['long'], + aggregatable: true, + searchable: true, + count: 10, + readFromDocValues: true, + scripted: false, + isMapped: true, + }, ], getFormatterForField: jest.fn(() => ({ convert: jest.fn((s: unknown) => JSON.stringify(s)), @@ -754,4 +766,66 @@ describe('UnifiedFieldList ', () => { expect(wrapper.find(EuiProgress)).toHaveLength(2); expect(wrapper.find(EuiProgress).first().props()).toHaveProperty('color', 'accent'); }); + + it('should render a number summary for some fields (time series metric counter)', async () => { + let resolveFunction: (arg: unknown) => void; + + (loadFieldStats as jest.Mock).mockImplementation(() => { + return new Promise((resolve) => { + resolveFunction = resolve; + }); + }); + + const field = dataView.fields.find((f) => f.name === 'bytes_counter')!; + + const wrapper = await mountComponent( + + ); + + expect(loadFieldStats).toHaveBeenCalledWith({ + abortController: new AbortController(), + services: { data: mockedServices.data }, + dataView, + fromDate: 'now-1h', + toDate: 'now', + dslQuery: { + bool: { + must: [], + filter: [], + should: [], + must_not: [], + }, + }, + field, + }); + + expect(wrapper.find(EuiLoadingSpinner)).toHaveLength(1); + + await act(async () => { + resolveFunction!({ + numberSummary: { + maxValue: 36821994, + minValue: 29674, + }, + sampledDocuments: 5000, + sampledValues: 5000, + totalDocuments: 6460, + }); + }); + + await wrapper.update(); + + expect(wrapper.find(EuiLoadingSpinner)).toHaveLength(0); + + expect(loadFieldStats).toHaveBeenCalledTimes(1); + + expect(wrapper.text()).toBe('Summarymin29674max36821994Calculated from 5000 sample records.'); + }); }); diff --git a/src/plugins/unified_field_list/public/components/field_stats/field_stats.tsx b/src/plugins/unified_field_list/public/components/field_stats/field_stats.tsx index 028ceddc080c9..7589db074f016 100755 --- a/src/plugins/unified_field_list/public/components/field_stats/field_stats.tsx +++ b/src/plugins/unified_field_list/public/components/field_stats/field_stats.tsx @@ -36,8 +36,11 @@ import { i18n } from '@kbn/i18n'; import { buildEsQuery, Query, Filter, AggregateQuery } from '@kbn/es-query'; import { showExamplesForField } from '../../../common/utils/field_examples_calculator'; import { OverrideFieldTopValueBarCallback } from './field_top_values_bucket'; -import type { BucketedAggregation } from '../../../common/types'; -import { canProvideStatsForField } from '../../../common/utils/field_stats_utils'; +import type { BucketedAggregation, NumberSummary } from '../../../common/types'; +import { + canProvideStatsForField, + canProvideNumberSummaryForField, +} from '../../../common/utils/field_stats_utils'; import { loadFieldStats } from '../../services/field_stats'; import type { AddFieldFilterHandler } from '../../types'; import { @@ -47,6 +50,7 @@ import { getDefaultColor, } from './field_top_values'; import { FieldSummaryMessage } from './field_summary_message'; +import { FieldNumberSummary, isNumberSummaryValid } from './field_number_summary'; import { ErrorBoundary } from '../error_boundary'; export interface FieldStatsState { @@ -56,6 +60,7 @@ export interface FieldStatsState { sampledValues?: number; histogram?: BucketedAggregation; topValues?: BucketedAggregation; + numberSummary?: NumberSummary; } export interface FieldStatsServices { @@ -202,6 +207,7 @@ const FieldStatsComponent: React.FC = ({ sampledValues: results.sampledValues, histogram: results.histogram, topValues: results.topValues, + numberSummary: results.numberSummary, })); } catch (e) { setState((s) => ({ ...s, isLoading: false })); @@ -236,8 +242,15 @@ const FieldStatsComponent: React.FC = ({ : chartTheme; }, [chartTheme, color]); - const { isLoading, histogram, topValues, sampledValues, sampledDocuments, totalDocuments } = - state; + const { + isLoading, + histogram, + topValues, + numberSummary, + sampledValues, + sampledDocuments, + totalDocuments, + } = state; let histogramDefault = !!state.histogram; const fromDateParsed = DateMath.parse(fromDate); @@ -346,6 +359,27 @@ const FieldStatsComponent: React.FC = ({ : messageNoAnalysis; } + if (canProvideNumberSummaryForField(field) && isNumberSummaryValid(numberSummary)) { + title = ( + +
    + {i18n.translate('unifiedFieldList.fieldStats.numberSummary.summaryTableTitle', { + defaultMessage: 'Summary', + })} +
    +
    + ); + + return combineWithTitleAndFooter( + + ); + } + if ( (!histogram || histogram.buckets.length === 0) && (!topValues || topValues.buckets.length === 0) diff --git a/src/plugins/unified_field_list/public/index.ts b/src/plugins/unified_field_list/public/index.ts index be3591a80cd15..28ef9dd38c9da 100755 --- a/src/plugins/unified_field_list/public/index.ts +++ b/src/plugins/unified_field_list/public/index.ts @@ -7,12 +7,7 @@ */ import { UnifiedFieldListPlugin } from './plugin'; -export type { - FieldStatsResponse, - BucketedAggregation, - NumberStatsResult, - TopValuesResult, -} from '../common/types'; +export type { FieldStatsResponse, BucketedAggregation, NumberSummary } from '../common/types'; export { FieldList, type FieldListProps } from './components/field_list'; export { FieldListGrouped, type FieldListGroupedProps } from './components/field_list_grouped'; export { FieldListFilters, type FieldListFiltersProps } from './components/field_list_filters'; diff --git a/src/plugins/unified_search/public/query_string_input/query_bar_top_row.tsx b/src/plugins/unified_search/public/query_string_input/query_bar_top_row.tsx index aecd588673e09..59d5c4290d0d0 100644 --- a/src/plugins/unified_search/public/query_string_input/query_bar_top_row.tsx +++ b/src/plugins/unified_search/public/query_string_input/query_bar_top_row.tsx @@ -8,7 +8,7 @@ import dateMath from '@kbn/datemath'; import classNames from 'classnames'; -import React, { useCallback, useEffect, useMemo, useRef, useState } from 'react'; +import React, { ReactNode, useCallback, useEffect, useMemo, useRef, useState } from 'react'; import deepEqual from 'fast-deep-equal'; import useObservable from 'react-use/lib/useObservable'; import type { Filter, TimeRange, Query, AggregateQuery } from '@kbn/es-query'; @@ -71,6 +71,7 @@ const SuperDatePicker = React.memo( // @internal export interface QueryBarTopRowProps { customSubmitButton?: any; + customDataViewPicker?: ReactNode; dataTestSubj?: string; dateRangeFrom?: string; dateRangeTo?: string; @@ -478,6 +479,7 @@ export const QueryBarTopRow = React.memo( } function renderDataViewsPicker() { + if (props.customDataViewPicker) return props.customDataViewPicker; if (!props.dataViewPickerComponentProps) return; let textBasedLanguage; if (Boolean(isQueryLangSelected)) { 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 0b645c208b06f..ef17093a23ce6 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 @@ -843,7 +843,7 @@ export default class QueryStringInputUI extends PureComponent ) : null} {this.props.isClearable && !this.props.isDisabled && this.props.query.query ? ( -
    +