diff --git a/.buildkite/ftr_configs.yml b/.buildkite/ftr_configs.yml index 1c466c001cb97..6c0ee435b5e20 100644 --- a/.buildkite/ftr_configs.yml +++ b/.buildkite/ftr_configs.yml @@ -252,6 +252,9 @@ enabled: - x-pack/test/functional/apps/lens/group1/config.ts - x-pack/test/functional/apps/lens/group2/config.ts - x-pack/test/functional/apps/lens/group3/config.ts + - x-pack/test/functional/apps/lens/group4/config.ts + - x-pack/test/functional/apps/lens/group5/config.ts + - x-pack/test/functional/apps/lens/group6/config.ts - x-pack/test/functional/apps/lens/open_in_lens/tsvb/config.ts - x-pack/test/functional/apps/lens/open_in_lens/agg_based/config.ts - x-pack/test/functional/apps/lens/open_in_lens/dashboard/config.ts diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 11f3e7850764a..7437653a92e5b 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -574,7 +574,9 @@ packages/kbn-securitysolution-utils @elastic/security-solution-platform packages/kbn-server-http-tools @elastic/kibana-core packages/kbn-server-route-repository @elastic/apm-ui x-pack/plugins/serverless @elastic/appex-sharedux +x-pack/plugins/serverless_observability @elastic/appex-sharedux packages/serverless/project_switcher @elastic/appex-sharedux +x-pack/plugins/serverless_search @elastic/appex-sharedux packages/serverless/storybook/config @elastic/appex-sharedux packages/serverless/types @elastic/appex-sharedux test/plugin_functional/plugins/session_notifications @elastic/kibana-core @@ -592,6 +594,7 @@ packages/shared-ux/button_toolbar @elastic/appex-sharedux packages/shared-ux/card/no_data/impl @elastic/appex-sharedux packages/shared-ux/card/no_data/mocks @elastic/appex-sharedux packages/shared-ux/card/no_data/types @elastic/appex-sharedux +packages/shared-ux/chrome/navigation @elastic/appex-sharedux packages/shared-ux/file/context @elastic/appex-sharedux packages/shared-ux/file/image/impl @elastic/appex-sharedux packages/shared-ux/file/image/mocks @elastic/appex-sharedux @@ -718,6 +721,7 @@ src/plugins/vis_types/timeseries @elastic/kibana-visualizations src/plugins/vis_types/vega @elastic/kibana-visualizations src/plugins/vis_types/vislib @elastic/kibana-visualizations src/plugins/vis_types/xy @elastic/kibana-visualizations +src/plugins/visualization_ui_components @elastic/kibana-visualizations src/plugins/visualizations @elastic/kibana-visualizations x-pack/plugins/watcher @elastic/platform-deployment-management packages/kbn-web-worker-stub @elastic/kibana-operations diff --git a/.i18nrc.json b/.i18nrc.json index c2bf494c68c06..0b87f43d7da41 100644 --- a/.i18nrc.json +++ b/.i18nrc.json @@ -108,6 +108,7 @@ "visTypeVislib": "src/plugins/vis_types/vislib", "visTypeXy": "src/plugins/vis_types/xy", "visualizations": "src/plugins/visualizations", + "visualizationUiComponents": "src/plugins/visualization_ui_components", "unifiedSearch": "src/plugins/unified_search", "unifiedFieldList": "src/plugins/unified_field_list", "unifiedHistogram": "src/plugins/unified_histogram" diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index dbcd1f9a10016..08827e0ac1585 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'actions'] --- import actionsObj from './actions.devdocs.json'; diff --git a/api_docs/advanced_settings.mdx b/api_docs/advanced_settings.mdx index 4dd43a658e288..9622ec3877ea2 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'advancedSettings'] --- import advancedSettingsObj from './advanced_settings.devdocs.json'; diff --git a/api_docs/aiops.mdx b/api_docs/aiops.mdx index e27256d455ef0..396d6cc944b80 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'aiops'] --- import aiopsObj from './aiops.devdocs.json'; diff --git a/api_docs/alerting.devdocs.json b/api_docs/alerting.devdocs.json index 81ad124973bc6..95608c57e6880 100644 --- a/api_docs/alerting.devdocs.json +++ b/api_docs/alerting.devdocs.json @@ -9264,7 +9264,7 @@ "label": "ENABLE_MAINTENANCE_WINDOWS", "description": [], "signature": [ - "false" + "true" ], "path": "x-pack/plugins/alerting/common/index.ts", "deprecated": false, diff --git a/api_docs/alerting.mdx b/api_docs/alerting.mdx index 69d65bbb76286..ffc008a32f522 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'alerting'] --- import alertingObj from './alerting.devdocs.json'; diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index c6b91320b229a..63e457f2dfe39 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-04-27 +date: 2023-05-01 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 b2887f3000977..dd84d161c8b0c 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-04-27 +date: 2023-05-01 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 b59502d972345..df68a81d411c1 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'banners'] --- import bannersObj from './banners.devdocs.json'; diff --git a/api_docs/bfetch.mdx b/api_docs/bfetch.mdx index 89adeb6b44e60..8a6224b443e67 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'bfetch'] --- import bfetchObj from './bfetch.devdocs.json'; diff --git a/api_docs/canvas.mdx b/api_docs/canvas.mdx index a19734b3c2ccb..3cac7ff1e375a 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-04-27 +date: 2023-05-01 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 ce453c5849ecf..54ab796b77a85 100644 --- a/api_docs/cases.devdocs.json +++ b/api_docs/cases.devdocs.json @@ -582,8 +582,8 @@ "pluginId": "cases", "scope": "common", "docId": "kibCasesPluginApi", - "section": "def-common.Case", - "text": "Case" + "section": "def-common.CaseUI", + "text": "CaseUI" }, " | undefined) => void) | undefined; onClose?: (() => void) | undefined; }" ], @@ -660,8 +660,8 @@ "pluginId": "cases", "scope": "common", "docId": "kibCasesPluginApi", - "section": "def-common.Case", - "text": "Case" + "section": "def-common.CaseUI", + "text": "CaseUI" }, ", createAttachments: (args: ", "PostComment", @@ -670,8 +670,8 @@ "pluginId": "cases", "scope": "common", "docId": "kibCasesPluginApi", - "section": "def-common.Case", - "text": "Case" + "section": "def-common.CaseUI", + "text": "CaseUI" }, ") => void) | undefined; attachments?: ", { @@ -897,7 +897,13 @@ " | undefined; severity?: ", "CaseSeverity", " | undefined; assignees?: string | string[] | undefined; reporters?: string | string[] | undefined; defaultSearchOperator?: \"AND\" | \"OR\" | undefined; fields?: string | string[] | undefined; from?: string | undefined; page?: number | undefined; perPage?: number | undefined; search?: string | undefined; searchFields?: string | string[] | undefined; rootSearchFields?: string[] | undefined; sortField?: string | undefined; sortOrder?: \"asc\" | \"desc\" | undefined; to?: string | undefined; owner?: string | string[] | undefined; }, signal?: AbortSignal | undefined) => Promise<", - "Cases", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.CasesUI", + "text": "CasesUI" + }, ">; 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: ", { "pluginId": "cases", @@ -1023,8 +1029,8 @@ "pluginId": "cases", "scope": "common", "docId": "kibCasesPluginApi", - "section": "def-common.Case", - "text": "Case" + "section": "def-common.CaseUI", + "text": "CaseUI" }, " | undefined; }) => ", { @@ -1738,7 +1744,7 @@ "label": "Case", "description": [], "signature": [ - "Omit<{ description: string; status: ", + "{ description: string; status: ", { "pluginId": "@kbn/cases-components", "scope": "common", @@ -1746,23 +1752,23 @@ "section": "def-common.CaseStatuses", "text": "CaseStatuses" }, - "; tags: string[]; title: string; connector: { id: string; type: ", + "; tags: string[]; title: string; connector: { id: string; } & (({ type: ", "ConnectorTypes", - ".casesWebhook; fields: null; name: string; } | { id: string; type: ", + ".casesWebhook; fields: null; } & { name: string; }) | ({ type: ", "ConnectorTypes", - ".jira; fields: { issueType: string | null; priority: string | null; parent: string | null; } | null; name: string; } | { id: string; type: ", + ".jira; fields: { issueType: string | null; priority: string | null; parent: string | null; } | null; } & { name: string; }) | ({ type: ", "ConnectorTypes", - ".none; fields: null; name: string; } | { id: string; type: ", + ".none; fields: null; } & { name: string; }) | ({ type: ", "ConnectorTypes", - ".resilient; fields: { incidentTypes: string[] | null; severityCode: string | null; } | null; name: string; } | { id: string; type: ", + ".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; } | { id: string; type: ", + ".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; } | { id: string; type: ", + ".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: ", + ".swimlane; fields: { caseId: string | null; } | null; } & { name: string; })); settings: { syncAlerts: boolean; }; owner: string; severity: ", "CaseSeverity", - "; assignees: { uid: string; }[]; duration: number | null; closedAt: string | null; closedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; createdAt: string; createdBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; }; externalService: { connectorId: string; connectorName: string; externalId: string; externalTitle: string; externalUrl: string; pushedAt: string; pushedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; }; } | null; updatedAt: string | null; updatedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; id: string; totalComment: number; totalAlerts: number; version: string; comments?: ({ comment: string; type: ", + "; 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", @@ -1770,7 +1776,7 @@ "section": "def-common.CommentType", "text": "CommentType" }, - ".user; owner: string; createdAt: string; createdBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; }; pushedAt: string | null; pushedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; updatedAt: string | null; updatedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; id: string; version: string; } | { type: ", + ".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", @@ -1778,7 +1784,7 @@ "section": "def-common.CommentType", "text": "CommentType" }, - ".alert; alertId: string | string[]; index: string | string[]; rule: { id: string | null; name: string | null; }; owner: string; createdAt: string; createdBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; }; pushedAt: string | null; pushedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; updatedAt: string | null; updatedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; id: string; version: string; } | { type: ", + ".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", @@ -1786,7 +1792,7 @@ "section": "def-common.CommentType", "text": "CommentType" }, - ".actions; comment: string; actions: { targets: { hostname: string; endpointId: string; }[]; type: string; }; owner: string; createdAt: string; createdBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; }; pushedAt: string | null; pushedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; updatedAt: string | null; updatedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; id: string; version: string; } | { externalReferenceId: string; externalReferenceStorage: { type: ", + ".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", @@ -1794,7 +1800,15 @@ "section": "def-common.ExternalReferenceStorageType", "text": "ExternalReferenceStorageType" }, - ".elasticSearchDoc; }; externalReferenceAttachmentTypeId: string; externalReferenceMetadata: { [x: string]: string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | any | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | any | null; } | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | null; type: ", + ".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", @@ -1802,7 +1816,7 @@ "section": "def-common.CommentType", "text": "CommentType" }, - ".externalReference; owner: string; createdAt: string; createdBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; }; pushedAt: string | null; pushedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; updatedAt: string | null; updatedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; id: string; version: string; } | { externalReferenceId: string; externalReferenceStorage: { type: ", + ".externalReference; owner: string; } | { externalReferenceId: string; externalReferenceStorage: { type: ", { "pluginId": "cases", "scope": "common", @@ -1810,7 +1824,15 @@ "section": "def-common.ExternalReferenceStorageType", "text": "ExternalReferenceStorageType" }, - ".savedObject; soType: string; }; externalReferenceAttachmentTypeId: string; externalReferenceMetadata: { [x: string]: string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | any | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | any | null; } | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | null; type: ", + ".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", @@ -1818,7 +1840,7 @@ "section": "def-common.CommentType", "text": "CommentType" }, - ".externalReference; owner: string; createdAt: string; createdBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; }; pushedAt: string | null; pushedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; updatedAt: string | null; updatedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; id: string; version: string; } | { type: ", + ".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", @@ -1826,24 +1848,30 @@ "section": "def-common.CommentType", "text": "CommentType" }, - ".persistableState; owner: string; persistableStateAttachmentTypeId: string; persistableStateAttachmentState: { [x: string]: string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | any | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | any | null; } | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; }; createdAt: string; createdBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; }; pushedAt: string | null; pushedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; updatedAt: string | null; updatedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; id: string; version: string; })[] | undefined; }, \"comments\"> & { comments: ", - "Comment", - "[]; }" + ".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; }" ], - "path": "x-pack/plugins/cases/common/ui/types.ts", + "path": "x-pack/plugins/cases/common/api/cases/case.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false }, { "parentPluginId": "cases", - "id": "def-common.CaseResponse", + "id": "def-common.Cases", "type": "Type", "tags": [], - "label": "CaseResponse", + "label": "Cases", "description": [], "signature": [ - "{ description: string; status: ", + "({ description: string; status: ", { "pluginId": "@kbn/cases-components", "scope": "common", @@ -1955,7 +1983,7 @@ "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; }" + "; }; } & { 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; })[]" ], "path": "x-pack/plugins/cases/common/api/cases/case.ts", "deprecated": false, @@ -2250,6 +2278,222 @@ "trackAdoption": false, "initialIsOpen": false }, + { + "parentPluginId": "cases", + "id": "def-common.CasesUI", + "type": "Type", + "tags": [], + "label": "CasesUI", + "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; } | { id: string; type: ", + "ConnectorTypes", + ".jira; fields: { issueType: string | null; priority: string | null; parent: string | null; } | null; name: string; } | { id: string; type: ", + "ConnectorTypes", + ".none; fields: null; name: string; } | { id: string; type: ", + "ConnectorTypes", + ".resilient; fields: { incidentTypes: string[] | null; severityCode: string | null; } | null; name: string; } | { id: string; type: ", + "ConnectorTypes", + ".serviceNowITSM; fields: { impact: string | null; severity: string | null; urgency: string | null; category: string | null; subcategory: string | null; } | null; name: string; } | { id: 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; } | { id: string; type: ", + "ConnectorTypes", + ".swimlane; fields: { caseId: string | null; } | null; name: string; }; settings: { syncAlerts: boolean; }; owner: string; severity: ", + "CaseSeverity", + "; assignees: { uid: string; }[]; duration: number | null; closedAt: string | null; closedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; createdAt: string; createdBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; }; externalService: { connectorId: string; connectorName: string; externalId: string; externalTitle: string; externalUrl: string; pushedAt: string; pushedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; }; } | null; updatedAt: string | null; updatedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: 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; createdAt: string; createdBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; }; pushedAt: string | null; pushedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; updatedAt: string | null; updatedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; id: string; version: string; } | { 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; createdAt: string; createdBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; }; pushedAt: string | null; pushedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; updatedAt: string | null; updatedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; id: string; version: string; } | { 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; createdAt: string; createdBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; }; pushedAt: string | null; pushedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; updatedAt: string | null; updatedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; id: string; version: string; } | { externalReferenceId: string; externalReferenceStorage: { type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ExternalReferenceStorageType", + "text": "ExternalReferenceStorageType" + }, + ".elasticSearchDoc; }; externalReferenceAttachmentTypeId: string; externalReferenceMetadata: { [x: string]: string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | any | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | any | null; } | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | null; type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.CommentType", + "text": "CommentType" + }, + ".externalReference; owner: string; createdAt: string; createdBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; }; pushedAt: string | null; pushedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; updatedAt: string | null; updatedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; id: string; version: 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]: string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | any | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | any | null; } | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | null; type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.CommentType", + "text": "CommentType" + }, + ".externalReference; owner: string; createdAt: string; createdBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; }; pushedAt: string | null; pushedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; updatedAt: string | null; updatedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; id: string; version: string; } | { type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.CommentType", + "text": "CommentType" + }, + ".persistableState; owner: string; persistableStateAttachmentTypeId: string; persistableStateAttachmentState: { [x: string]: string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | any | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | any | null; } | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; }; createdAt: string; createdBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; }; pushedAt: string | null; pushedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; updatedAt: string | null; updatedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; id: string; version: string; })[] | undefined; }[]; page: number; perPage: number; total: number; countOpenCases: number; countInProgressCases: number; countClosedCases: number; }, \"cases\"> & { cases: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.CaseUI", + "text": "CaseUI" + }, + "[]; }" + ], + "path": "x-pack/plugins/cases/common/ui/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "cases", + "id": "def-common.CaseUI", + "type": "Type", + "tags": [], + "label": "CaseUI", + "description": [], + "signature": [ + "Omit<{ 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; } | { id: string; type: ", + "ConnectorTypes", + ".jira; fields: { issueType: string | null; priority: string | null; parent: string | null; } | null; name: string; } | { id: string; type: ", + "ConnectorTypes", + ".none; fields: null; name: string; } | { id: string; type: ", + "ConnectorTypes", + ".resilient; fields: { incidentTypes: string[] | null; severityCode: string | null; } | null; name: string; } | { id: string; type: ", + "ConnectorTypes", + ".serviceNowITSM; fields: { impact: string | null; severity: string | null; urgency: string | null; category: string | null; subcategory: string | null; } | null; name: string; } | { id: 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; } | { id: string; type: ", + "ConnectorTypes", + ".swimlane; fields: { caseId: string | null; } | null; name: string; }; settings: { syncAlerts: boolean; }; owner: string; severity: ", + "CaseSeverity", + "; assignees: { uid: string; }[]; duration: number | null; closedAt: string | null; closedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; createdAt: string; createdBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; }; externalService: { connectorId: string; connectorName: string; externalId: string; externalTitle: string; externalUrl: string; pushedAt: string; pushedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; }; } | null; updatedAt: string | null; updatedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: 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; createdAt: string; createdBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; }; pushedAt: string | null; pushedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; updatedAt: string | null; updatedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; id: string; version: string; } | { 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; createdAt: string; createdBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; }; pushedAt: string | null; pushedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; updatedAt: string | null; updatedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; id: string; version: string; } | { 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; createdAt: string; createdBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; }; pushedAt: string | null; pushedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; updatedAt: string | null; updatedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; id: string; version: string; } | { externalReferenceId: string; externalReferenceStorage: { type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.ExternalReferenceStorageType", + "text": "ExternalReferenceStorageType" + }, + ".elasticSearchDoc; }; externalReferenceAttachmentTypeId: string; externalReferenceMetadata: { [x: string]: string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | any | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | any | null; } | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | null; type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.CommentType", + "text": "CommentType" + }, + ".externalReference; owner: string; createdAt: string; createdBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; }; pushedAt: string | null; pushedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; updatedAt: string | null; updatedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; id: string; version: 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]: string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | any | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | any | null; } | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | null; type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.CommentType", + "text": "CommentType" + }, + ".externalReference; owner: string; createdAt: string; createdBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; }; pushedAt: string | null; pushedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; updatedAt: string | null; updatedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; id: string; version: string; } | { type: ", + { + "pluginId": "cases", + "scope": "common", + "docId": "kibCasesPluginApi", + "section": "def-common.CommentType", + "text": "CommentType" + }, + ".persistableState; owner: string; persistableStateAttachmentTypeId: string; persistableStateAttachmentState: { [x: string]: string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | (string | number | boolean | any | any | null)[] | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | (string | number | boolean | any | any | null)[] | null; } | (string | number | boolean | { [x: string]: string | number | boolean | any | any | null; } | any | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null)[] | null; }; createdAt: string; createdBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; }; pushedAt: string | null; pushedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; updatedAt: string | null; updatedBy: { email: string | null | undefined; fullName: string | null | undefined; username: string | null | undefined; profileUid?: string | undefined; } | null; id: string; version: string; })[] | undefined; }, \"comments\"> & { comments: ", + "Comment", + "[]; }" + ], + "path": "x-pack/plugins/cases/common/ui/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, { "parentPluginId": "cases", "id": "def-common.CaseViewRefreshPropInterface", diff --git a/api_docs/cases.mdx b/api_docs/cases.mdx index f409545f7a3d3..7cf997ae852e6 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cases'] --- import casesObj from './cases.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 | |-------------------|-----------|------------------------|-----------------| -| 96 | 0 | 79 | 32 | +| 98 | 0 | 81 | 31 | ## Client diff --git a/api_docs/charts.mdx b/api_docs/charts.mdx index cef44631e30bc..2a55f6cfdcef5 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'charts'] --- import chartsObj from './charts.devdocs.json'; diff --git a/api_docs/cloud.mdx b/api_docs/cloud.mdx index f05ac0528e0fb..05c898c61528b 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloud'] --- import cloudObj from './cloud.devdocs.json'; diff --git a/api_docs/cloud_chat.mdx b/api_docs/cloud_chat.mdx index e22689eab2661..9415e83c92c33 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-04-27 +date: 2023-05-01 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 72b66e52694c0..bb2de45a81fa3 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-04-27 +date: 2023-05-01 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 2711b22ac63c3..7a336a802bd73 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-04-27 +date: 2023-05-01 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 c6b55847fba89..2669bb3b48482 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudExperiments'] --- import cloudExperimentsObj from './cloud_experiments.devdocs.json'; diff --git a/api_docs/cloud_security_posture.mdx b/api_docs/cloud_security_posture.mdx index eea136ac0be26..5f7a4423dd938 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudSecurityPosture'] --- import cloudSecurityPostureObj from './cloud_security_posture.devdocs.json'; diff --git a/api_docs/console.mdx b/api_docs/console.mdx index 2f1713473db5e..38a8f9acbbbe4 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-04-27 +date: 2023-05-01 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 e2d954e78933d..1ab50273fb521 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-04-27 +date: 2023-05-01 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 a6259f7af00aa..306320078297e 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] --- import controlsObj from './controls.devdocs.json'; diff --git a/api_docs/custom_integrations.devdocs.json b/api_docs/custom_integrations.devdocs.json index 4a147dae08693..893c689e75f98 100644 --- a/api_docs/custom_integrations.devdocs.json +++ b/api_docs/custom_integrations.devdocs.json @@ -1026,6 +1026,41 @@ "deprecated": false, "trackAdoption": false, "children": [ + { + "parentPluginId": "customIntegrations", + "id": "def-common.INTEGRATION_CATEGORY_DISPLAY.advanced_analytics_ueba", + "type": "Object", + "tags": [], + "label": "advanced_analytics_ueba", + "description": [], + "path": "src/plugins/custom_integrations/common/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "customIntegrations", + "id": "def-common.INTEGRATION_CATEGORY_DISPLAY.advanced_analytics_ueba.title", + "type": "string", + "tags": [], + "label": "title", + "description": [], + "path": "src/plugins/custom_integrations/common/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "customIntegrations", + "id": "def-common.INTEGRATION_CATEGORY_DISPLAY.advanced_analytics_ueba.parent_id", + "type": "string", + "tags": [], + "label": "parent_id", + "description": [], + "path": "src/plugins/custom_integrations/common/index.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, { "parentPluginId": "customIntegrations", "id": "def-common.INTEGRATION_CATEGORY_DISPLAY.analytics_engine", diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index 2f69930fc6cf9..fcd03f880e0a6 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'customIntegrations'] --- import customIntegrationsObj from './custom_integrations.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) for questi | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 271 | 0 | 252 | 1 | +| 274 | 0 | 255 | 1 | ## Client diff --git a/api_docs/dashboard.mdx b/api_docs/dashboard.mdx index a57919677671b..7145c1f96a34a 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dashboard'] --- import dashboardObj from './dashboard.devdocs.json'; diff --git a/api_docs/dashboard_enhanced.mdx b/api_docs/dashboard_enhanced.mdx index d68d5d997a885..ae6791d641a67 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-04-27 +date: 2023-05-01 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 b4085d0c76a68..071b77bfe57ed 100644 --- a/api_docs/data.devdocs.json +++ b/api_docs/data.devdocs.json @@ -10965,22 +10965,6 @@ "plugin": "savedObjectsTagging", "path": "x-pack/plugins/saved_objects_tagging/public/utils.ts" }, - { - "plugin": "cases", - "path": "x-pack/plugins/cases/server/services/so_references.ts" - }, - { - "plugin": "cases", - "path": "x-pack/plugins/cases/server/services/so_references.ts" - }, - { - "plugin": "cases", - "path": "x-pack/plugins/cases/server/services/so_references.ts" - }, - { - "plugin": "cases", - "path": "x-pack/plugins/cases/server/services/so_references.ts" - }, { "plugin": "lists", "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.mock.ts" @@ -11089,18 +11073,6 @@ "plugin": "savedObjectsManagement", "path": "src/plugins/saved_objects_management/server/lib/find_relationships.test.ts" }, - { - "plugin": "cases", - "path": "x-pack/plugins/cases/server/services/user_actions/operations/find.ts" - }, - { - "plugin": "cases", - "path": "x-pack/plugins/cases/server/services/user_actions/operations/find.ts" - }, - { - "plugin": "cases", - "path": "x-pack/plugins/cases/server/services/user_actions/operations/find.ts" - }, { "plugin": "synthetics", "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/api.ts" @@ -13525,6 +13497,10 @@ "plugin": "@kbn/es-query", "path": "packages/kbn-es-query/src/es_query/types.ts" }, + { + "plugin": "visualizationUiComponents", + "path": "src/plugins/visualization_ui_components/public/components/query_input/filter_query_input.tsx" + }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/public/common/containers/source/index.tsx" @@ -13753,10 +13729,6 @@ "plugin": "controls", "path": "src/plugins/controls/public/services/options_list/options_list_service.ts" }, - { - "plugin": "lens", - "path": "x-pack/plugins/lens/public/data_views_service/loader.ts" - }, { "plugin": "unifiedFieldList", "path": "src/plugins/unified_field_list/public/services/field_stats/load_field_stats.ts" @@ -13773,6 +13745,10 @@ "plugin": "unifiedFieldList", "path": "src/plugins/unified_field_list/public/hooks/use_existing_fields.ts" }, + { + "plugin": "lens", + "path": "x-pack/plugins/lens/public/data_views_service/loader.ts" + }, { "plugin": "lens", "path": "x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx" @@ -18231,27 +18207,7 @@ "TransportRequestOptions", " | undefined): Promise<", "CountResponse", - ">; }; exists: { (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithOutMeta", - " | undefined): Promise; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithMeta", - " | undefined): Promise<", - "TransportResult", - ">; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined): Promise; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", + ">; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", "default", "; child: (opts: ", "ClientOptions", @@ -18429,7 +18385,27 @@ "default", "; eql: ", "default", - "; existsSource: { (this: That, params: ", + "; exists: { (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; existsSource: { (this: That, params: ", "ExistsSourceRequest", " | ", "ExistsSourceRequest", @@ -21123,6 +21099,10 @@ "plugin": "@kbn/es-query", "path": "packages/kbn-es-query/src/es_query/types.ts" }, + { + "plugin": "visualizationUiComponents", + "path": "src/plugins/visualization_ui_components/public/components/query_input/filter_query_input.tsx" + }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/public/common/containers/source/index.tsx" @@ -21351,10 +21331,6 @@ "plugin": "controls", "path": "src/plugins/controls/public/services/options_list/options_list_service.ts" }, - { - "plugin": "lens", - "path": "x-pack/plugins/lens/public/data_views_service/loader.ts" - }, { "plugin": "unifiedFieldList", "path": "src/plugins/unified_field_list/public/services/field_stats/load_field_stats.ts" @@ -21371,6 +21347,10 @@ "plugin": "unifiedFieldList", "path": "src/plugins/unified_field_list/public/hooks/use_existing_fields.ts" }, + { + "plugin": "lens", + "path": "x-pack/plugins/lens/public/data_views_service/loader.ts" + }, { "plugin": "lens", "path": "x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx" @@ -26144,7 +26124,7 @@ "\nCreate a function that will escape CSV values like \"=\", \"@\" and \"+\" with a\n\"'\". This will also place CSV values in \"\" if contain non-alphanumeric chars.\n\nFor example:\n\nGiven: =1+1\nReturns: \"'=1+1\"\n\nSee OWASP: https://www.owasp.org/index.php/CSV_Injection." ], "signature": [ - "(quoteValues: boolean, escapeFormulas: boolean) => (val: RawValue) => string" + "({\n separator,\n quoteValues,\n escapeFormulaValues,\n}: { separator: string; quoteValues: boolean; escapeFormulaValues: boolean; }) => (val: RawValue) => string" ], "path": "src/plugins/data/common/exports/escape_value.ts", "deprecated": false, @@ -26153,32 +26133,48 @@ { "parentPluginId": "data", "id": "def-common.createEscapeValue.$1", - "type": "boolean", - "tags": [], - "label": "quoteValues", - "description": [], - "signature": [ - "boolean" - ], - "path": "src/plugins/data/common/exports/escape_value.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "data", - "id": "def-common.createEscapeValue.$2", - "type": "boolean", + "type": "Object", "tags": [], - "label": "escapeFormulas", + "label": "{\n separator,\n quoteValues,\n escapeFormulaValues,\n}", "description": [], - "signature": [ - "boolean" - ], "path": "src/plugins/data/common/exports/escape_value.ts", "deprecated": false, "trackAdoption": false, - "isRequired": true + "children": [ + { + "parentPluginId": "data", + "id": "def-common.createEscapeValue.$1.separator", + "type": "string", + "tags": [], + "label": "separator", + "description": [], + "path": "src/plugins/data/common/exports/escape_value.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "data", + "id": "def-common.createEscapeValue.$1.quoteValues", + "type": "boolean", + "tags": [], + "label": "quoteValues", + "description": [], + "path": "src/plugins/data/common/exports/escape_value.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "data", + "id": "def-common.createEscapeValue.$1.escapeFormulaValues", + "type": "boolean", + "tags": [], + "label": "escapeFormulaValues", + "description": [], + "path": "src/plugins/data/common/exports/escape_value.ts", + "deprecated": false, + "trackAdoption": false + } + ] } ], "returnComment": [], @@ -28726,22 +28722,6 @@ "plugin": "savedObjectsTagging", "path": "x-pack/plugins/saved_objects_tagging/public/utils.ts" }, - { - "plugin": "cases", - "path": "x-pack/plugins/cases/server/services/so_references.ts" - }, - { - "plugin": "cases", - "path": "x-pack/plugins/cases/server/services/so_references.ts" - }, - { - "plugin": "cases", - "path": "x-pack/plugins/cases/server/services/so_references.ts" - }, - { - "plugin": "cases", - "path": "x-pack/plugins/cases/server/services/so_references.ts" - }, { "plugin": "lists", "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.mock.ts" @@ -28850,18 +28830,6 @@ "plugin": "savedObjectsManagement", "path": "src/plugins/saved_objects_management/server/lib/find_relationships.test.ts" }, - { - "plugin": "cases", - "path": "x-pack/plugins/cases/server/services/user_actions/operations/find.ts" - }, - { - "plugin": "cases", - "path": "x-pack/plugins/cases/server/services/user_actions/operations/find.ts" - }, - { - "plugin": "cases", - "path": "x-pack/plugins/cases/server/services/user_actions/operations/find.ts" - }, { "plugin": "synthetics", "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/api.ts" diff --git a/api_docs/data.mdx b/api_docs/data.mdx index 33fab650e970a..f9ff84179cdc4 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3271 | 119 | 2577 | 27 | +| 3273 | 119 | 2579 | 27 | ## Client diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index c808d9b040e57..5cf36ed355143 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.query'] --- import dataQueryObj from './data_query.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3271 | 119 | 2577 | 27 | +| 3273 | 119 | 2579 | 27 | ## Client diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx index c1a4858ac82e9..fb84cbb293d05 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 3271 | 119 | 2577 | 27 | +| 3273 | 119 | 2579 | 27 | ## Client diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index 8d7c5bf1e056a..293a9bcb53097 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewEditor'] --- import dataViewEditorObj from './data_view_editor.devdocs.json'; diff --git a/api_docs/data_view_field_editor.mdx b/api_docs/data_view_field_editor.mdx index 7982005da1d13..83a9e4bfff833 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewFieldEditor'] --- import dataViewFieldEditorObj from './data_view_field_editor.devdocs.json'; diff --git a/api_docs/data_view_management.mdx b/api_docs/data_view_management.mdx index 6719f70a9ee16..5dea071716f3a 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-04-27 +date: 2023-05-01 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 3d6c008d357ae..aead3861dd5cf 100644 --- a/api_docs/data_views.devdocs.json +++ b/api_docs/data_views.devdocs.json @@ -67,6 +67,10 @@ "plugin": "@kbn/es-query", "path": "packages/kbn-es-query/src/es_query/types.ts" }, + { + "plugin": "visualizationUiComponents", + "path": "src/plugins/visualization_ui_components/public/components/query_input/filter_query_input.tsx" + }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/public/common/containers/source/index.tsx" @@ -311,10 +315,6 @@ "plugin": "controls", "path": "src/plugins/controls/public/services/options_list/options_list_service.ts" }, - { - "plugin": "lens", - "path": "x-pack/plugins/lens/public/data_views_service/loader.ts" - }, { "plugin": "unifiedFieldList", "path": "src/plugins/unified_field_list/public/services/field_stats/load_field_stats.ts" @@ -331,6 +331,10 @@ "plugin": "unifiedFieldList", "path": "src/plugins/unified_field_list/public/hooks/use_existing_fields.ts" }, + { + "plugin": "lens", + "path": "x-pack/plugins/lens/public/data_views_service/loader.ts" + }, { "plugin": "lens", "path": "x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx" @@ -8292,6 +8296,10 @@ "plugin": "@kbn/es-query", "path": "packages/kbn-es-query/src/es_query/types.ts" }, + { + "plugin": "visualizationUiComponents", + "path": "src/plugins/visualization_ui_components/public/components/query_input/filter_query_input.tsx" + }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/public/common/containers/source/index.tsx" @@ -8536,10 +8544,6 @@ "plugin": "controls", "path": "src/plugins/controls/public/services/options_list/options_list_service.ts" }, - { - "plugin": "lens", - "path": "x-pack/plugins/lens/public/data_views_service/loader.ts" - }, { "plugin": "unifiedFieldList", "path": "src/plugins/unified_field_list/public/services/field_stats/load_field_stats.ts" @@ -8556,6 +8560,10 @@ "plugin": "unifiedFieldList", "path": "src/plugins/unified_field_list/public/hooks/use_existing_fields.ts" }, + { + "plugin": "lens", + "path": "x-pack/plugins/lens/public/data_views_service/loader.ts" + }, { "plugin": "lens", "path": "x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx" @@ -14425,27 +14433,7 @@ "TransportRequestOptions", " | undefined): Promise<", "CountResponse", - ">; }; exists: { (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithOutMeta", - " | undefined): Promise; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithMeta", - " | undefined): Promise<", - "TransportResult", - ">; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined): Promise; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", + ">; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", "default", "; child: (opts: ", "ClientOptions", @@ -14623,7 +14611,27 @@ "default", "; eql: ", "default", - "; existsSource: { (this: That, params: ", + "; exists: { (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; existsSource: { (this: That, params: ", "ExistsSourceRequest", " | ", "ExistsSourceRequest", @@ -15574,6 +15582,10 @@ "plugin": "@kbn/es-query", "path": "packages/kbn-es-query/src/es_query/types.ts" }, + { + "plugin": "visualizationUiComponents", + "path": "src/plugins/visualization_ui_components/public/components/query_input/filter_query_input.tsx" + }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/public/common/containers/source/index.tsx" @@ -15818,10 +15830,6 @@ "plugin": "controls", "path": "src/plugins/controls/public/services/options_list/options_list_service.ts" }, - { - "plugin": "lens", - "path": "x-pack/plugins/lens/public/data_views_service/loader.ts" - }, { "plugin": "unifiedFieldList", "path": "src/plugins/unified_field_list/public/services/field_stats/load_field_stats.ts" @@ -15838,6 +15846,10 @@ "plugin": "unifiedFieldList", "path": "src/plugins/unified_field_list/public/hooks/use_existing_fields.ts" }, + { + "plugin": "lens", + "path": "x-pack/plugins/lens/public/data_views_service/loader.ts" + }, { "plugin": "lens", "path": "x-pack/plugins/lens/public/app_plugin/lens_top_nav.tsx" @@ -26237,22 +26249,6 @@ "plugin": "savedObjectsTagging", "path": "x-pack/plugins/saved_objects_tagging/public/utils.ts" }, - { - "plugin": "cases", - "path": "x-pack/plugins/cases/server/services/so_references.ts" - }, - { - "plugin": "cases", - "path": "x-pack/plugins/cases/server/services/so_references.ts" - }, - { - "plugin": "cases", - "path": "x-pack/plugins/cases/server/services/so_references.ts" - }, - { - "plugin": "cases", - "path": "x-pack/plugins/cases/server/services/so_references.ts" - }, { "plugin": "lists", "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.mock.ts" @@ -26389,18 +26385,6 @@ "plugin": "data", "path": "src/plugins/data/server/search/saved_objects/search_session_migration.test.ts" }, - { - "plugin": "cases", - "path": "x-pack/plugins/cases/server/services/user_actions/operations/find.ts" - }, - { - "plugin": "cases", - "path": "x-pack/plugins/cases/server/services/user_actions/operations/find.ts" - }, - { - "plugin": "cases", - "path": "x-pack/plugins/cases/server/services/user_actions/operations/find.ts" - }, { "plugin": "synthetics", "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/api.ts" diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index 278417afb1594..f056eea80de25 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViews'] --- import dataViewsObj from './data_views.devdocs.json'; diff --git a/api_docs/data_visualizer.mdx b/api_docs/data_visualizer.mdx index c5b357e1df77a..3b4415170650e 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataVisualizer'] --- import dataVisualizerObj from './data_visualizer.devdocs.json'; diff --git a/api_docs/deprecations_by_api.mdx b/api_docs/deprecations_by_api.mdx index 10a69469470fd..3d870dfa7e6cb 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -17,9 +17,9 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Referencing plugin(s) | Remove By | | ---------------|-----------|-----------| | | ml, stackAlerts | - | -| | @kbn/es-query, securitySolution, timelines, lists, threatIntelligence, dataViews, savedObjectsManagement, unifiedSearch, controls, lens, unifiedFieldList, triggersActionsUi, aiops, ml, infra, visTypeTimeseries, apm, exploratoryView, dataVisualizer, fleet, canvas, enterpriseSearch, graph, stackAlerts, synthetics, transform, upgradeAssistant, ux, maps, dataViewManagement, inputControlVis, visDefaultEditor, presentationUtil, visTypeTimelion, visTypeVega, discover, data | - | -| | @kbn/es-query, securitySolution, timelines, lists, threatIntelligence, dataViews, savedObjectsManagement, unifiedSearch, controls, lens, unifiedFieldList, triggersActionsUi, aiops, ml, infra, visTypeTimeseries, apm, exploratoryView, dataVisualizer, fleet, canvas, enterpriseSearch, graph, stackAlerts, synthetics, transform, upgradeAssistant, ux, maps, dataViewManagement, inputControlVis, visDefaultEditor, presentationUtil, visTypeTimelion, visTypeVega, discover, data | - | -| | @kbn/es-query, securitySolution, timelines, lists, threatIntelligence, data, savedObjectsManagement, unifiedSearch, controls, lens, unifiedFieldList, triggersActionsUi, aiops, ml, infra, visTypeTimeseries, apm, exploratoryView, dataVisualizer, fleet, canvas, enterpriseSearch, graph, stackAlerts, synthetics, transform, upgradeAssistant, ux, maps, dataViewManagement, inputControlVis, visDefaultEditor, presentationUtil, visTypeTimelion, visTypeVega, discover | - | +| | @kbn/es-query, visualizationUiComponents, securitySolution, timelines, lists, threatIntelligence, dataViews, savedObjectsManagement, unifiedSearch, controls, unifiedFieldList, lens, triggersActionsUi, aiops, ml, infra, visTypeTimeseries, apm, exploratoryView, dataVisualizer, fleet, canvas, enterpriseSearch, graph, stackAlerts, synthetics, transform, upgradeAssistant, ux, maps, dataViewManagement, inputControlVis, visDefaultEditor, presentationUtil, visTypeTimelion, visTypeVega, discover, data | - | +| | @kbn/es-query, visualizationUiComponents, securitySolution, timelines, lists, threatIntelligence, dataViews, savedObjectsManagement, unifiedSearch, controls, unifiedFieldList, lens, triggersActionsUi, aiops, ml, infra, visTypeTimeseries, apm, exploratoryView, dataVisualizer, fleet, canvas, enterpriseSearch, graph, stackAlerts, synthetics, transform, upgradeAssistant, ux, maps, dataViewManagement, inputControlVis, visDefaultEditor, presentationUtil, visTypeTimelion, visTypeVega, discover, data | - | +| | @kbn/es-query, visualizationUiComponents, securitySolution, timelines, lists, threatIntelligence, data, savedObjectsManagement, unifiedSearch, controls, unifiedFieldList, lens, triggersActionsUi, aiops, ml, infra, visTypeTimeseries, apm, exploratoryView, dataVisualizer, fleet, canvas, enterpriseSearch, graph, stackAlerts, synthetics, transform, upgradeAssistant, ux, maps, dataViewManagement, inputControlVis, visDefaultEditor, presentationUtil, visTypeTimelion, visTypeVega, discover | - | | | home, data, esUiShared, spaces, savedObjectsManagement, exploratoryView, fleet, observability, ml, apm, indexLifecycleManagement, observabilityOnboarding, synthetics, upgradeAssistant, ux, kibanaOverview | - | | | encryptedSavedObjects, actions, data, ml, logstash, securitySolution, cloudChat | - | | | actions, ml, savedObjectsTagging, enterpriseSearch | - | @@ -42,8 +42,8 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | discover | - | | | data, discover, imageEmbeddable, embeddable | - | | | 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, cases, lists, securitySolution, upgradeAssistant, savedObjectsManagement, @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, cases, lists, securitySolution, upgradeAssistant, savedObjectsManagement, @kbn/core-ui-settings-server-internal, data | - | +| | @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 | - | | | securitySolution | - | | | securitySolution | - | | | @kbn/securitysolution-data-table, securitySolution | - | diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index f3767ec8e73b0..22bbff3dfcc65 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -418,10 +418,10 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [so_references.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/so_references.ts#:~:text=SavedObject), [so_references.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/so_references.ts#:~:text=SavedObject), [so_references.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/so_references.ts#:~:text=SavedObject), [so_references.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/so_references.ts#:~:text=SavedObject), [find.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/user_actions/operations/find.ts#:~:text=SavedObject), [find.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/user_actions/operations/find.ts#:~:text=SavedObject), [find.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/user_actions/operations/find.ts#:~:text=SavedObject), [test_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/user_actions/test_utils.ts#:~:text=SavedObject), [test_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/user_actions/test_utils.ts#:~:text=SavedObject), [test_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/user_actions/test_utils.ts#:~:text=SavedObject)+ 8 more | - | -| | [so_references.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/so_references.ts#:~:text=SavedObject), [so_references.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/so_references.ts#:~:text=SavedObject), [so_references.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/so_references.ts#:~:text=SavedObject), [so_references.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/so_references.ts#:~:text=SavedObject), [find.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/user_actions/operations/find.ts#:~:text=SavedObject), [find.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/user_actions/operations/find.ts#:~:text=SavedObject), [find.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/user_actions/operations/find.ts#:~:text=SavedObject), [test_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/user_actions/test_utils.ts#:~:text=SavedObject), [test_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/user_actions/test_utils.ts#:~:text=SavedObject), [test_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/user_actions/test_utils.ts#:~:text=SavedObject)+ 44 more | - | +| | [test_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/user_actions/test_utils.ts#:~:text=SavedObject), [test_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/user_actions/test_utils.ts#:~:text=SavedObject), [test_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/user_actions/test_utils.ts#:~:text=SavedObject), [test_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/user_actions/test_utils.ts#:~:text=SavedObject), [test_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/user_actions/test_utils.ts#:~:text=SavedObject), [test_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/user_actions/test_utils.ts#:~:text=SavedObject), [test_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/user_actions/test_utils.ts#:~:text=SavedObject), [test_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/user_actions/test_utils.ts#:~:text=SavedObject), [test_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/user_actions/test_utils.ts#:~:text=SavedObject), [test_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/user_actions/test_utils.ts#:~:text=SavedObject)+ 1 more | - | +| | [test_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/user_actions/test_utils.ts#:~:text=SavedObject), [test_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/user_actions/test_utils.ts#:~:text=SavedObject), [test_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/user_actions/test_utils.ts#:~:text=SavedObject), [test_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/user_actions/test_utils.ts#:~:text=SavedObject), [test_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/user_actions/test_utils.ts#:~:text=SavedObject), [test_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/user_actions/test_utils.ts#:~:text=SavedObject), [test_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/user_actions/test_utils.ts#:~:text=SavedObject), [test_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/user_actions/test_utils.ts#:~:text=SavedObject), [test_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/user_actions/test_utils.ts#:~:text=SavedObject), [test_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/user_actions/test_utils.ts#:~:text=SavedObject)+ 23 more | - | | | [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/common/ui/types.ts#:~:text=ResolvedSimpleSavedObject), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/common/ui/types.ts#:~:text=ResolvedSimpleSavedObject), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/common/ui/types.ts#:~:text=ResolvedSimpleSavedObject), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/common/ui/types.ts#:~:text=ResolvedSimpleSavedObject) | - | -| | [so_references.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/attachment_framework/so_references.ts#:~:text=SavedObjectReference), [so_references.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/attachment_framework/so_references.ts#:~:text=SavedObjectReference), [so_references.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/attachment_framework/so_references.ts#:~:text=SavedObjectReference), [so_references.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/attachment_framework/so_references.ts#:~:text=SavedObjectReference), [so_references.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/so_references.ts#:~:text=SavedObjectReference), [so_references.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/so_references.ts#:~:text=SavedObjectReference), [so_references.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/so_references.ts#:~:text=SavedObjectReference), [test_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/user_actions/test_utils.ts#:~:text=SavedObjectReference), [test_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/user_actions/test_utils.ts#:~:text=SavedObjectReference) | - | +| | [so_references.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/attachment_framework/so_references.ts#:~:text=SavedObjectReference), [so_references.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/attachment_framework/so_references.ts#:~:text=SavedObjectReference), [so_references.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/attachment_framework/so_references.ts#:~:text=SavedObjectReference), [so_references.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/attachment_framework/so_references.ts#:~:text=SavedObjectReference), [test_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/user_actions/test_utils.ts#:~:text=SavedObjectReference), [test_utils.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/services/user_actions/test_utils.ts#:~:text=SavedObjectReference) | - | | | [cases.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/saved_object_types/cases.ts#:~:text=convertToMultiNamespaceTypeVersion), [configure.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/saved_object_types/configure.ts#:~:text=convertToMultiNamespaceTypeVersion), [comments.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/saved_object_types/comments.ts#:~:text=convertToMultiNamespaceTypeVersion), [user_actions.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/saved_object_types/user_actions.ts#:~:text=convertToMultiNamespaceTypeVersion), [connector_mappings.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/cases/server/saved_object_types/connector_mappings.ts#:~:text=convertToMultiNamespaceTypeVersion) | - | @@ -1185,11 +1185,11 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ | | [request_context_factory.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/request_context_factory.ts#:~:text=authc), [route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_preview/api/preview_rules/route.ts#:~:text=authc), [create_signals_migration_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/create_signals_migration_route.ts#:~:text=authc), [delete_signals_migration_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/delete_signals_migration_route.ts#:~:text=authc), [finalize_signals_migration_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/finalize_signals_migration_route.ts#:~:text=authc), [open_close_signals_route.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/routes/signals/open_close_signals_route.ts#:~:text=authc), [common.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/timeline/utils/common.ts#:~:text=authc) | - | | | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts#:~:text=BeatFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/search_strategy/endpoint_fields/index.ts#:~:text=BeatFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/search_strategy/endpoint_fields/index.ts#:~:text=BeatFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/search_strategy/endpoint_fields/index.ts#:~:text=BeatFields) | - | | | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts#:~:text=BrowserField), [helpers.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/drag_and_drop/helpers.ts#:~:text=BrowserField), [helpers.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/drag_and_drop/helpers.ts#:~:text=BrowserField), [helpers.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/drag_and_drop/helpers.ts#:~:text=BrowserField), [helpers.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/drag_and_drop/helpers.ts#:~:text=BrowserField), [columns.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/event_details/columns.tsx#:~:text=BrowserField), [columns.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/event_details/columns.tsx#:~:text=BrowserField), [enrichment_summary.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/enrichment_summary.tsx#:~:text=BrowserField), [enrichment_summary.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/enrichment_summary.tsx#:~:text=BrowserField), [use_data_view.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/containers/source/use_data_view.tsx#:~:text=BrowserField)+ 34 more | - | -| | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/types/header_actions/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/types/header_actions/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/types/header_actions/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/types/timeline/cells/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/types/timeline/cells/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/lib/kuery/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/lib/kuery/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/lib/kuery/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/lib/kuery/index.ts#:~:text=BrowserFields)+ 96 more | - | +| | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/types/header_actions/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/types/header_actions/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/types/header_actions/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/types/timeline/cells/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/types/timeline/cells/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/lib/kuery/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/lib/kuery/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/lib/kuery/index.ts#:~:text=BrowserFields), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/lib/kuery/index.ts#:~:text=BrowserFields)+ 97 more | - | | | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts#:~:text=IndexFieldsStrategyRequest), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/search_strategy/endpoint_fields/index.ts#:~:text=IndexFieldsStrategyRequest), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/search_strategy/endpoint_fields/index.ts#:~:text=IndexFieldsStrategyRequest), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/search_strategy/endpoint_fields/index.ts#:~:text=IndexFieldsStrategyRequest), [middleware.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts#:~:text=IndexFieldsStrategyRequest), [middleware.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts#:~:text=IndexFieldsStrategyRequest) | - | | | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/common/search_strategy/index_fields/index.ts#:~:text=IndexFieldsStrategyResponse), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/search_strategy/endpoint_fields/index.ts#:~:text=IndexFieldsStrategyResponse), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/search_strategy/endpoint_fields/index.ts#:~:text=IndexFieldsStrategyResponse), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/search_strategy/endpoint_fields/index.ts#:~:text=IndexFieldsStrategyResponse), [middleware.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts#:~:text=IndexFieldsStrategyResponse), [middleware.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/management/pages/endpoint_hosts/store/middleware.ts#:~:text=IndexFieldsStrategyResponse) | - | -| | [use_dashboard_button_href.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/hooks/use_dashboard_button_href.ts#:~:text=savedObjects), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/index.tsx#:~:text=savedObjects) | - | -| | [use_dashboard_button_href.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/hooks/use_dashboard_button_href.ts#:~:text=find), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/index.tsx#:~:text=find), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/index.tsx#:~:text=find) | - | +| | [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/index.tsx#:~:text=savedObjects) | - | +| | [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/index.tsx#:~:text=find), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/index.tsx#:~:text=find) | - | | | [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/hooks/types.ts#:~:text=SimpleSavedObject), [types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/public/common/hooks/types.ts#:~:text=SimpleSavedObject) | - | | | [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion), [host_risk_score_dashboards.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/risk_score/prebuilt_saved_objects/saved_object/host_risk_score_dashboards.ts#:~:text=migrationVersion)+ 34 more | - | | | [legacy_types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/rule_actions/legacy_types.ts#:~:text=SavedObjectAttributes), [legacy_types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/rule_actions/legacy_types.ts#:~:text=SavedObjectAttributes), [legacy_migrations.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/rule_actions/legacy_migrations.ts#:~:text=SavedObjectAttributes), [legacy_migrations.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/rule_actions/legacy_migrations.ts#:~:text=SavedObjectAttributes), [legacy_types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/rule_actions/legacy_types.ts#:~:text=SavedObjectAttributes), [legacy_types.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/rule_actions/legacy_types.ts#:~:text=SavedObjectAttributes), [legacy_migrations.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/rule_actions/legacy_migrations.ts#:~:text=SavedObjectAttributes), [legacy_migrations.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/security_solution/server/lib/detection_engine/rule_actions_legacy/logic/rule_actions/legacy_migrations.ts#:~:text=SavedObjectAttributes) | - | @@ -1432,6 +1432,16 @@ migrates to using the Kibana Privilege model: https://github.com/elastic/kibana/ +## visualizationUiComponents + +| Deprecated API | Reference location(s) | Remove By | +| ---------------|-----------|-----------| +| | [filter_query_input.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/visualization_ui_components/public/components/query_input/filter_query_input.tsx#:~:text=title), [filter_query_input.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/visualization_ui_components/public/components/query_input/filter_query_input.tsx#:~:text=title) | - | +| | [filter_query_input.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/visualization_ui_components/public/components/query_input/filter_query_input.tsx#:~:text=title), [filter_query_input.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/visualization_ui_components/public/components/query_input/filter_query_input.tsx#:~:text=title) | - | +| | [filter_query_input.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/visualization_ui_components/public/components/query_input/filter_query_input.tsx#:~:text=title) | - | + + + ## visualizations | Deprecated API | Reference location(s) | Remove By | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 681aab6749780..72e09cc913dd6 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index 977adf7bd33ef..bd62a88e608af 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-04-27 +date: 2023-05-01 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 c1d7997a50235..696fa2dfe83c5 100644 --- a/api_docs/discover.devdocs.json +++ b/api_docs/discover.devdocs.json @@ -1846,21 +1846,6 @@ "trackAdoption": false, "initialIsOpen": false }, - { - "parentPluginId": "discover", - "id": "def-common.SHOW_LEGACY_FIELD_TOP_VALUES", - "type": "string", - "tags": [], - "label": "SHOW_LEGACY_FIELD_TOP_VALUES", - "description": [], - "signature": [ - "\"discover:showLegacyFieldTopValues\"" - ], - "path": "src/plugins/discover/common/index.ts", - "deprecated": false, - "trackAdoption": false, - "initialIsOpen": false - }, { "parentPluginId": "discover", "id": "def-common.SHOW_MULTIFIELDS", diff --git a/api_docs/discover.mdx b/api_docs/discover.mdx index 8719508bd1d2a..0d35959c5f5cd 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-04-27 +date: 2023-05-01 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 | |-------------------|-----------|------------------------|-----------------| -| 97 | 0 | 78 | 7 | +| 96 | 0 | 77 | 7 | ## Client diff --git a/api_docs/discover_enhanced.mdx b/api_docs/discover_enhanced.mdx index 81c24601eaac2..23ccea0df2d42 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-04-27 +date: 2023-05-01 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 dbc881a9bba3f..243e38a648f26 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-04-27 +date: 2023-05-01 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 732ce00d8af52..eb9f522250526 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddable'] --- import embeddableObj from './embeddable.devdocs.json'; diff --git a/api_docs/embeddable_enhanced.mdx b/api_docs/embeddable_enhanced.mdx index 7c74e202508f2..08a6670a4cf78 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddableEnhanced'] --- import embeddableEnhancedObj from './embeddable_enhanced.devdocs.json'; diff --git a/api_docs/encrypted_saved_objects.mdx b/api_docs/encrypted_saved_objects.mdx index 43949f5330e83..3dfb4040c994c 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'encryptedSavedObjects'] --- import encryptedSavedObjectsObj from './encrypted_saved_objects.devdocs.json'; diff --git a/api_docs/enterprise_search.devdocs.json b/api_docs/enterprise_search.devdocs.json index d4385c5fee8e3..f32dcd8b9b046 100644 --- a/api_docs/enterprise_search.devdocs.json +++ b/api_docs/enterprise_search.devdocs.json @@ -6,7 +6,23 @@ "interfaces": [], "enums": [], "misc": [], - "objects": [] + "objects": [], + "start": { + "parentPluginId": "enterpriseSearch", + "id": "def-public.EnterpriseSearchPublicStart", + "type": "Type", + "tags": [], + "label": "EnterpriseSearchPublicStart", + "description": [], + "signature": [ + "void" + ], + "path": "x-pack/plugins/enterprise_search/public/plugin.ts", + "deprecated": false, + "trackAdoption": false, + "lifecycle": "start", + "initialIsOpen": true + } }, "server": { "classes": [], diff --git a/api_docs/enterprise_search.mdx b/api_docs/enterprise_search.mdx index f268bd6da5485..7d7c742215019 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] --- import enterpriseSearchObj from './enterprise_search.devdocs.json'; @@ -21,7 +21,12 @@ Contact [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/te | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 7 | 0 | 7 | 0 | +| 9 | 0 | 9 | 0 | + +## Client + +### Start + ## Server diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index fa279e5ea2ad4..49d9b61a7ed99 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'esUiShared'] --- import esUiSharedObj from './es_ui_shared.devdocs.json'; diff --git a/api_docs/event_annotation.mdx b/api_docs/event_annotation.mdx index e97b5c52fed5a..3af46fb83185e 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] --- import eventAnnotationObj from './event_annotation.devdocs.json'; diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index c48951ff20684..744aec2a5ef9f 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-04-27 +date: 2023-05-01 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 31fa07d7f2d66..cd5b47ffcbfce 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-04-27 +date: 2023-05-01 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 16a576517daf6..eee1ebc37fed4 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionError'] --- import expressionErrorObj from './expression_error.devdocs.json'; diff --git a/api_docs/expression_gauge.mdx b/api_docs/expression_gauge.mdx index 380aa33b810ba..0a58b89bed092 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionGauge'] --- import expressionGaugeObj from './expression_gauge.devdocs.json'; diff --git a/api_docs/expression_heatmap.mdx b/api_docs/expression_heatmap.mdx index 5bb979dbeef1e..54077721e8649 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionHeatmap'] --- import expressionHeatmapObj from './expression_heatmap.devdocs.json'; diff --git a/api_docs/expression_image.mdx b/api_docs/expression_image.mdx index 518ec7d4291bc..0eed614c7c74f 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionImage'] --- import expressionImageObj from './expression_image.devdocs.json'; diff --git a/api_docs/expression_legacy_metric_vis.mdx b/api_docs/expression_legacy_metric_vis.mdx index 5cd83632a8aac..1cfc03262bee8 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionLegacyMetricVis'] --- import expressionLegacyMetricVisObj from './expression_legacy_metric_vis.devdocs.json'; diff --git a/api_docs/expression_metric.mdx b/api_docs/expression_metric.mdx index c29d56325df94..904ff4d229851 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionMetric'] --- import expressionMetricObj from './expression_metric.devdocs.json'; diff --git a/api_docs/expression_metric_vis.mdx b/api_docs/expression_metric_vis.mdx index 64bbb1a7c614e..c0a2440268bd4 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-04-27 +date: 2023-05-01 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 aa801b9269c5e..f4d86266d8f36 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-04-27 +date: 2023-05-01 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 abbb118a71203..e582c192654b7 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRepeatImage'] --- import expressionRepeatImageObj from './expression_repeat_image.devdocs.json'; diff --git a/api_docs/expression_reveal_image.mdx b/api_docs/expression_reveal_image.mdx index 901ca1522582e..95ee379672c42 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionRevealImage'] --- import expressionRevealImageObj from './expression_reveal_image.devdocs.json'; diff --git a/api_docs/expression_shape.mdx b/api_docs/expression_shape.mdx index 9d2da8e5dcd27..3e71274bb727f 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionShape'] --- import expressionShapeObj from './expression_shape.devdocs.json'; diff --git a/api_docs/expression_tagcloud.mdx b/api_docs/expression_tagcloud.mdx index 205a7cd094613..dcb9ccf95e812 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionTagcloud'] --- import expressionTagcloudObj from './expression_tagcloud.devdocs.json'; diff --git a/api_docs/expression_x_y.mdx b/api_docs/expression_x_y.mdx index 12def441a89ad..c03aa93ea7f8c 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressionXY'] --- import expressionXYObj from './expression_x_y.devdocs.json'; diff --git a/api_docs/expressions.mdx b/api_docs/expressions.mdx index b8baf0b54b6ca..6829a7e4ce8c2 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'expressions'] --- import expressionsObj from './expressions.devdocs.json'; diff --git a/api_docs/features.mdx b/api_docs/features.mdx index dbb5b25ebc5de..3341cf036b90b 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'features'] --- import featuresObj from './features.devdocs.json'; diff --git a/api_docs/field_formats.mdx b/api_docs/field_formats.mdx index b4df16c1dd524..f4de9676a60fa 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fieldFormats'] --- import fieldFormatsObj from './field_formats.devdocs.json'; diff --git a/api_docs/file_upload.mdx b/api_docs/file_upload.mdx index 00ec5a1274c4e..2c5cbff1fa7db 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fileUpload'] --- import fileUploadObj from './file_upload.devdocs.json'; diff --git a/api_docs/files.devdocs.json b/api_docs/files.devdocs.json index cf918647a230a..7646d8eb348ba 100644 --- a/api_docs/files.devdocs.json +++ b/api_docs/files.devdocs.json @@ -964,27 +964,7 @@ "TransportRequestOptions", " | undefined): Promise<", "CountResponse", - ">; }; exists: { (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithOutMeta", - " | undefined): Promise; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithMeta", - " | undefined): Promise<", - "TransportResult", - ">; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined): Promise; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", + ">; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", "default", "; child: (opts: ", "ClientOptions", @@ -1162,7 +1142,27 @@ "default", "; eql: ", "default", - "; existsSource: { (this: That, params: ", + "; exists: { (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; existsSource: { (this: That, params: ", "ExistsSourceRequest", " | ", "ExistsSourceRequest", @@ -2977,6 +2977,135 @@ ], "returnComment": [] }, + { + "parentPluginId": "files", + "id": "def-server.FileMetadataClient.bulkGet", + "type": "Function", + "tags": [], + "label": "bulkGet", + "description": [ + "\nBulk get file metadata\n" + ], + "signature": [ + "{ (arg: { ids: string[]; throwIfNotFound?: true | undefined; }): Promise<", + { + "pluginId": "files", + "scope": "server", + "docId": "kibFilesPluginApi", + "section": "def-server.FileDescriptor", + "text": "FileDescriptor" + }, + "[]>; (arg: ", + "BulkGetArg", + " | { ids: string[]; throwIfNotFound: false; }): Promise<(", + { + "pluginId": "files", + "scope": "server", + "docId": "kibFilesPluginApi", + "section": "def-server.FileDescriptor", + "text": "FileDescriptor" + }, + " | null)[]>; }" + ], + "path": "src/plugins/files/server/file_client/file_metadata_client/file_metadata_client.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "files", + "id": "def-server.FileMetadataClient.bulkGet.$1", + "type": "Object", + "tags": [], + "label": "arg", + "description": [], + "path": "src/plugins/files/server/file_client/file_metadata_client/file_metadata_client.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "files", + "id": "def-server.FileMetadataClient.bulkGet.$1.ids", + "type": "Array", + "tags": [], + "label": "ids", + "description": [], + "signature": [ + "string[]" + ], + "path": "src/plugins/files/server/file_client/file_metadata_client/file_metadata_client.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "files", + "id": "def-server.FileMetadataClient.bulkGet.$1.throwIfNotFound", + "type": "boolean", + "tags": [], + "label": "throwIfNotFound", + "description": [], + "signature": [ + "true | undefined" + ], + "path": "src/plugins/files/server/file_client/file_metadata_client/file_metadata_client.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [] + }, + { + "parentPluginId": "files", + "id": "def-server.FileMetadataClient.bulkGet", + "type": "Function", + "tags": [], + "label": "bulkGet", + "description": [], + "signature": [ + "{ (arg: { ids: string[]; throwIfNotFound?: true | undefined; }): Promise<", + { + "pluginId": "files", + "scope": "server", + "docId": "kibFilesPluginApi", + "section": "def-server.FileDescriptor", + "text": "FileDescriptor" + }, + "[]>; (arg: ", + "BulkGetArg", + " | { ids: string[]; throwIfNotFound: false; }): Promise<(", + { + "pluginId": "files", + "scope": "server", + "docId": "kibFilesPluginApi", + "section": "def-server.FileDescriptor", + "text": "FileDescriptor" + }, + " | null)[]>; }" + ], + "path": "src/plugins/files/server/file_client/file_metadata_client/file_metadata_client.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "files", + "id": "def-server.FileMetadataClient.bulkGet.$1", + "type": "CompoundType", + "tags": [], + "label": "arg", + "description": [], + "signature": [ + "BulkGetArg", + " | { ids: string[]; throwIfNotFound: false; }" + ], + "path": "src/plugins/files/server/file_client/file_metadata_client/file_metadata_client.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, { "parentPluginId": "files", "id": "def-server.FileMetadataClient.update", @@ -3575,6 +3704,468 @@ ], "returnComment": [] }, + { + "parentPluginId": "files", + "id": "def-server.FileServiceStart.bulkGetById", + "type": "Function", + "tags": [], + "label": "bulkGetById", + "description": [ + "\nBulk get files by IDs. Will throw if any of the files fail to load (set `throwIfNotFound` to `false` to not throw and return `null` instead)\n" + ], + "signature": [ + "{ (args: Pick<", + "BulkGetByIdArgs", + ", \"ids\"> & { throwIfNotFound?: true | undefined; }): Promise<", + { + "pluginId": "files", + "scope": "common", + "docId": "kibFilesPluginApi", + "section": "def-common.File", + "text": "File" + }, + "[]>; (args: Pick<", + "BulkGetByIdArgs", + ", \"ids\"> & { throwIfNotFound?: true | undefined; format: \"map\"; }): Promise<{ [id: string]: ", + { + "pluginId": "files", + "scope": "common", + "docId": "kibFilesPluginApi", + "section": "def-common.File", + "text": "File" + }, + "; }>; (args: Pick<", + "BulkGetByIdArgs", + ", \"ids\"> & { throwIfNotFound: false; }): Promise<(", + { + "pluginId": "files", + "scope": "common", + "docId": "kibFilesPluginApi", + "section": "def-common.File", + "text": "File" + }, + " | null)[]>; (args: Pick<", + "BulkGetByIdArgs", + ", \"ids\"> & { throwIfNotFound: false; format: \"map\"; }): Promise<{ [id: string]: ", + { + "pluginId": "files", + "scope": "common", + "docId": "kibFilesPluginApi", + "section": "def-common.File", + "text": "File" + }, + " | null; }>; (args: ", + "BulkGetByIdArgs", + "): Promise<(", + { + "pluginId": "files", + "scope": "common", + "docId": "kibFilesPluginApi", + "section": "def-common.File", + "text": "File" + }, + " | { [id: string]: ", + { + "pluginId": "files", + "scope": "common", + "docId": "kibFilesPluginApi", + "section": "def-common.File", + "text": "File" + }, + " | null; })[]>; }" + ], + "path": "src/plugins/files/server/file_service/file_service.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "files", + "id": "def-server.FileServiceStart.bulkGetById.$1", + "type": "CompoundType", + "tags": [], + "label": "args", + "description": [ + "- bulk get files by IDs args" + ], + "signature": [ + "Pick<", + "BulkGetByIdArgs", + ", \"ids\"> & { throwIfNotFound?: true | undefined; }" + ], + "path": "src/plugins/files/server/file_service/file_service.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "files", + "id": "def-server.FileServiceStart.bulkGetById", + "type": "Function", + "tags": [], + "label": "bulkGetById", + "description": [], + "signature": [ + "{ (args: Pick<", + "BulkGetByIdArgs", + ", \"ids\"> & { throwIfNotFound?: true | undefined; }): Promise<", + { + "pluginId": "files", + "scope": "common", + "docId": "kibFilesPluginApi", + "section": "def-common.File", + "text": "File" + }, + "[]>; (args: Pick<", + "BulkGetByIdArgs", + ", \"ids\"> & { throwIfNotFound?: true | undefined; format: \"map\"; }): Promise<{ [id: string]: ", + { + "pluginId": "files", + "scope": "common", + "docId": "kibFilesPluginApi", + "section": "def-common.File", + "text": "File" + }, + "; }>; (args: Pick<", + "BulkGetByIdArgs", + ", \"ids\"> & { throwIfNotFound: false; }): Promise<(", + { + "pluginId": "files", + "scope": "common", + "docId": "kibFilesPluginApi", + "section": "def-common.File", + "text": "File" + }, + " | null)[]>; (args: Pick<", + "BulkGetByIdArgs", + ", \"ids\"> & { throwIfNotFound: false; format: \"map\"; }): Promise<{ [id: string]: ", + { + "pluginId": "files", + "scope": "common", + "docId": "kibFilesPluginApi", + "section": "def-common.File", + "text": "File" + }, + " | null; }>; (args: ", + "BulkGetByIdArgs", + "): Promise<(", + { + "pluginId": "files", + "scope": "common", + "docId": "kibFilesPluginApi", + "section": "def-common.File", + "text": "File" + }, + " | { [id: string]: ", + { + "pluginId": "files", + "scope": "common", + "docId": "kibFilesPluginApi", + "section": "def-common.File", + "text": "File" + }, + " | null; })[]>; }" + ], + "path": "src/plugins/files/server/file_service/file_service.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "files", + "id": "def-server.FileServiceStart.bulkGetById.$1", + "type": "CompoundType", + "tags": [], + "label": "args", + "description": [], + "signature": [ + "Pick<", + "BulkGetByIdArgs", + ", \"ids\"> & { throwIfNotFound?: true | undefined; format: \"map\"; }" + ], + "path": "src/plugins/files/server/file_service/file_service.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "files", + "id": "def-server.FileServiceStart.bulkGetById", + "type": "Function", + "tags": [], + "label": "bulkGetById", + "description": [], + "signature": [ + "{ (args: Pick<", + "BulkGetByIdArgs", + ", \"ids\"> & { throwIfNotFound?: true | undefined; }): Promise<", + { + "pluginId": "files", + "scope": "common", + "docId": "kibFilesPluginApi", + "section": "def-common.File", + "text": "File" + }, + "[]>; (args: Pick<", + "BulkGetByIdArgs", + ", \"ids\"> & { throwIfNotFound?: true | undefined; format: \"map\"; }): Promise<{ [id: string]: ", + { + "pluginId": "files", + "scope": "common", + "docId": "kibFilesPluginApi", + "section": "def-common.File", + "text": "File" + }, + "; }>; (args: Pick<", + "BulkGetByIdArgs", + ", \"ids\"> & { throwIfNotFound: false; }): Promise<(", + { + "pluginId": "files", + "scope": "common", + "docId": "kibFilesPluginApi", + "section": "def-common.File", + "text": "File" + }, + " | null)[]>; (args: Pick<", + "BulkGetByIdArgs", + ", \"ids\"> & { throwIfNotFound: false; format: \"map\"; }): Promise<{ [id: string]: ", + { + "pluginId": "files", + "scope": "common", + "docId": "kibFilesPluginApi", + "section": "def-common.File", + "text": "File" + }, + " | null; }>; (args: ", + "BulkGetByIdArgs", + "): Promise<(", + { + "pluginId": "files", + "scope": "common", + "docId": "kibFilesPluginApi", + "section": "def-common.File", + "text": "File" + }, + " | { [id: string]: ", + { + "pluginId": "files", + "scope": "common", + "docId": "kibFilesPluginApi", + "section": "def-common.File", + "text": "File" + }, + " | null; })[]>; }" + ], + "path": "src/plugins/files/server/file_service/file_service.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "files", + "id": "def-server.FileServiceStart.bulkGetById.$1", + "type": "CompoundType", + "tags": [], + "label": "args", + "description": [], + "signature": [ + "Pick<", + "BulkGetByIdArgs", + ", \"ids\"> & { throwIfNotFound: false; }" + ], + "path": "src/plugins/files/server/file_service/file_service.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "files", + "id": "def-server.FileServiceStart.bulkGetById", + "type": "Function", + "tags": [], + "label": "bulkGetById", + "description": [], + "signature": [ + "{ (args: Pick<", + "BulkGetByIdArgs", + ", \"ids\"> & { throwIfNotFound?: true | undefined; }): Promise<", + { + "pluginId": "files", + "scope": "common", + "docId": "kibFilesPluginApi", + "section": "def-common.File", + "text": "File" + }, + "[]>; (args: Pick<", + "BulkGetByIdArgs", + ", \"ids\"> & { throwIfNotFound?: true | undefined; format: \"map\"; }): Promise<{ [id: string]: ", + { + "pluginId": "files", + "scope": "common", + "docId": "kibFilesPluginApi", + "section": "def-common.File", + "text": "File" + }, + "; }>; (args: Pick<", + "BulkGetByIdArgs", + ", \"ids\"> & { throwIfNotFound: false; }): Promise<(", + { + "pluginId": "files", + "scope": "common", + "docId": "kibFilesPluginApi", + "section": "def-common.File", + "text": "File" + }, + " | null)[]>; (args: Pick<", + "BulkGetByIdArgs", + ", \"ids\"> & { throwIfNotFound: false; format: \"map\"; }): Promise<{ [id: string]: ", + { + "pluginId": "files", + "scope": "common", + "docId": "kibFilesPluginApi", + "section": "def-common.File", + "text": "File" + }, + " | null; }>; (args: ", + "BulkGetByIdArgs", + "): Promise<(", + { + "pluginId": "files", + "scope": "common", + "docId": "kibFilesPluginApi", + "section": "def-common.File", + "text": "File" + }, + " | { [id: string]: ", + { + "pluginId": "files", + "scope": "common", + "docId": "kibFilesPluginApi", + "section": "def-common.File", + "text": "File" + }, + " | null; })[]>; }" + ], + "path": "src/plugins/files/server/file_service/file_service.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "files", + "id": "def-server.FileServiceStart.bulkGetById.$1", + "type": "CompoundType", + "tags": [], + "label": "args", + "description": [], + "signature": [ + "Pick<", + "BulkGetByIdArgs", + ", \"ids\"> & { throwIfNotFound: false; format: \"map\"; }" + ], + "path": "src/plugins/files/server/file_service/file_service.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "files", + "id": "def-server.FileServiceStart.bulkGetById", + "type": "Function", + "tags": [], + "label": "bulkGetById", + "description": [], + "signature": [ + "{ (args: Pick<", + "BulkGetByIdArgs", + ", \"ids\"> & { throwIfNotFound?: true | undefined; }): Promise<", + { + "pluginId": "files", + "scope": "common", + "docId": "kibFilesPluginApi", + "section": "def-common.File", + "text": "File" + }, + "[]>; (args: Pick<", + "BulkGetByIdArgs", + ", \"ids\"> & { throwIfNotFound?: true | undefined; format: \"map\"; }): Promise<{ [id: string]: ", + { + "pluginId": "files", + "scope": "common", + "docId": "kibFilesPluginApi", + "section": "def-common.File", + "text": "File" + }, + "; }>; (args: Pick<", + "BulkGetByIdArgs", + ", \"ids\"> & { throwIfNotFound: false; }): Promise<(", + { + "pluginId": "files", + "scope": "common", + "docId": "kibFilesPluginApi", + "section": "def-common.File", + "text": "File" + }, + " | null)[]>; (args: Pick<", + "BulkGetByIdArgs", + ", \"ids\"> & { throwIfNotFound: false; format: \"map\"; }): Promise<{ [id: string]: ", + { + "pluginId": "files", + "scope": "common", + "docId": "kibFilesPluginApi", + "section": "def-common.File", + "text": "File" + }, + " | null; }>; (args: ", + "BulkGetByIdArgs", + "): Promise<(", + { + "pluginId": "files", + "scope": "common", + "docId": "kibFilesPluginApi", + "section": "def-common.File", + "text": "File" + }, + " | { [id: string]: ", + { + "pluginId": "files", + "scope": "common", + "docId": "kibFilesPluginApi", + "section": "def-common.File", + "text": "File" + }, + " | null; })[]>; }" + ], + "path": "src/plugins/files/server/file_service/file_service.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "files", + "id": "def-server.FileServiceStart.bulkGetById.$1", + "type": "Object", + "tags": [], + "label": "args", + "description": [], + "signature": [ + "BulkGetByIdArgs" + ], + "path": "src/plugins/files/server/file_service/file_service.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, { "parentPluginId": "files", "id": "def-server.FileServiceStart.find", diff --git a/api_docs/files.mdx b/api_docs/files.mdx index d291c4e115cb0..1f761eb073c7b 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'files'] --- import filesObj from './files.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 | |-------------------|-----------|------------------------|-----------------| -| 219 | 0 | 10 | 6 | +| 235 | 0 | 23 | 8 | ## Client diff --git a/api_docs/files_management.mdx b/api_docs/files_management.mdx index dfaa7570dd97e..169ba85c146f2 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.devdocs.json b/api_docs/fleet.devdocs.json index 9d82cf6eeff9c..4c4cd9325e98f 100644 --- a/api_docs/fleet.devdocs.json +++ b/api_docs/fleet.devdocs.json @@ -5766,7 +5766,7 @@ "label": "rotateKeyPair", "description": [], "signature": [ - "() => Promise" + "() => Promise" ], "path": "x-pack/plugins/fleet/server/services/security/message_signing_service.ts", "deprecated": false, @@ -9445,27 +9445,7 @@ "TransportRequestOptions", " | undefined): Promise<", "CountResponse", - ">; }; exists: { (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithOutMeta", - " | undefined): Promise; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithMeta", - " | undefined): Promise<", - "TransportResult", - ">; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined): Promise; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", + ">; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", "default", "; child: (opts: ", "ClientOptions", @@ -9643,7 +9623,27 @@ "default", "; eql: ", "default", - "; existsSource: { (this: That, params: ", + "; exists: { (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; existsSource: { (this: That, params: ", "ExistsSourceRequest", " | ", "ExistsSourceRequest", @@ -10780,27 +10780,7 @@ "TransportRequestOptions", " | undefined): Promise<", "CountResponse", - ">; }; exists: { (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithOutMeta", - " | undefined): Promise; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithMeta", - " | undefined): Promise<", - "TransportResult", - ">; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined): Promise; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", + ">; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", "default", "; child: (opts: ", "ClientOptions", @@ -10978,7 +10958,27 @@ "default", "; eql: ", "default", - "; existsSource: { (this: That, params: ", + "; exists: { (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; existsSource: { (this: That, params: ", "ExistsSourceRequest", " | ", "ExistsSourceRequest", @@ -12128,27 +12128,7 @@ "TransportRequestOptions", " | undefined): Promise<", "CountResponse", - ">; }; exists: { (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithOutMeta", - " | undefined): Promise; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithMeta", - " | undefined): Promise<", - "TransportResult", - ">; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined): Promise; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", + ">; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", "default", "; child: (opts: ", "ClientOptions", @@ -12326,7 +12306,27 @@ "default", "; eql: ", "default", - "; existsSource: { (this: That, params: ", + "; exists: { (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; existsSource: { (this: That, params: ", "ExistsSourceRequest", " | ", "ExistsSourceRequest", @@ -13473,27 +13473,7 @@ "TransportRequestOptions", " | undefined): Promise<", "CountResponse", - ">; }; exists: { (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithOutMeta", - " | undefined): Promise; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithMeta", - " | undefined): Promise<", - "TransportResult", - ">; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined): Promise; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", + ">; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", "default", "; child: (opts: ", "ClientOptions", @@ -13671,7 +13651,27 @@ "default", "; eql: ", "default", - "; existsSource: { (this: That, params: ", + "; exists: { (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; existsSource: { (this: That, params: ", "ExistsSourceRequest", " | ", "ExistsSourceRequest", @@ -14821,27 +14821,7 @@ "TransportRequestOptions", " | undefined): Promise<", "CountResponse", - ">; }; exists: { (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithOutMeta", - " | undefined): Promise; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithMeta", - " | undefined): Promise<", - "TransportResult", - ">; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined): Promise; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", + ">; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", "default", "; child: (opts: ", "ClientOptions", @@ -15019,7 +14999,27 @@ "default", "; eql: ", "default", - "; existsSource: { (this: That, params: ", + "; exists: { (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; existsSource: { (this: That, params: ", "ExistsSourceRequest", " | ", "ExistsSourceRequest", @@ -23707,7 +23707,7 @@ "label": "PackageSpecCategory", "description": [], "signature": [ - "\"connector\" | \"security\" | \"monitoring\" | \"observability\" | \"infrastructure\" | \"cloud\" | \"custom\" | \"enterprise_search\" | \"analytics_engine\" | \"application_observability\" | \"app_search\" | \"auditd\" | \"authentication\" | \"aws\" | \"azure\" | \"big_data\" | \"cdn_security\" | \"config_management\" | \"connector_client\" | \"connector_package\" | \"containers\" | \"content_source\" | \"crawler\" | \"credential_management\" | \"crm\" | \"custom_logs\" | \"database_security\" | \"datastore\" | \"dns_security\" | \"edr_xdr\" | \"elasticsearch_sdk\" | \"elastic_stack\" | \"email_security\" | \"firewall_security\" | \"google_cloud\" | \"iam\" | \"ids_ips\" | \"java_observability\" | \"kubernetes\" | \"language_client\" | \"languages\" | \"load_balancer\" | \"message_queue\" | \"native_search\" | \"network\" | \"network_security\" | \"notification\" | \"os_system\" | \"process_manager\" | \"productivity\" | \"productivity_security\" | \"proxy_security\" | \"sdk_search\" | \"stream_processing\" | \"support\" | \"threat_intel\" | \"ticketing\" | \"version_control\" | \"virtualization\" | \"vpn_security\" | \"vulnerability_management\" | \"web\" | \"web_application_firewall\" | \"websphere\" | \"workplace_search\"" + "\"connector\" | \"security\" | \"monitoring\" | \"observability\" | \"infrastructure\" | \"cloud\" | \"custom\" | \"enterprise_search\" | \"advanced_analytics_ueba\" | \"analytics_engine\" | \"application_observability\" | \"app_search\" | \"auditd\" | \"authentication\" | \"aws\" | \"azure\" | \"big_data\" | \"cdn_security\" | \"config_management\" | \"connector_client\" | \"connector_package\" | \"containers\" | \"content_source\" | \"crawler\" | \"credential_management\" | \"crm\" | \"custom_logs\" | \"database_security\" | \"datastore\" | \"dns_security\" | \"edr_xdr\" | \"elasticsearch_sdk\" | \"elastic_stack\" | \"email_security\" | \"firewall_security\" | \"google_cloud\" | \"iam\" | \"ids_ips\" | \"java_observability\" | \"kubernetes\" | \"language_client\" | \"languages\" | \"load_balancer\" | \"message_queue\" | \"native_search\" | \"network\" | \"network_security\" | \"notification\" | \"os_system\" | \"process_manager\" | \"productivity\" | \"productivity_security\" | \"proxy_security\" | \"sdk_search\" | \"stream_processing\" | \"support\" | \"threat_intel\" | \"ticketing\" | \"version_control\" | \"virtualization\" | \"vpn_security\" | \"vulnerability_management\" | \"web\" | \"web_application_firewall\" | \"websphere\" | \"workplace_search\"" ], "path": "x-pack/plugins/fleet/common/types/models/package_spec.ts", "deprecated": false, diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index c559193207594..903bdab15ef81 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fleet'] --- import fleetObj from './fleet.devdocs.json'; diff --git a/api_docs/global_search.mdx b/api_docs/global_search.mdx index 1cf05676b2183..9fe14d95c09c7 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'globalSearch'] --- import globalSearchObj from './global_search.devdocs.json'; diff --git a/api_docs/guided_onboarding.mdx b/api_docs/guided_onboarding.mdx index 3d290e02c4d73..06ccb090ff09b 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'guidedOnboarding'] --- import guidedOnboardingObj from './guided_onboarding.devdocs.json'; diff --git a/api_docs/home.mdx b/api_docs/home.mdx index 3be6fa2b089cc..1b5f0a5905620 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-04-27 +date: 2023-05-01 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 2be31eca02858..d12b368f26063 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-04-27 +date: 2023-05-01 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 8ec055093d677..553db85f0274d 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexLifecycleManagement'] --- import indexLifecycleManagementObj from './index_lifecycle_management.devdocs.json'; diff --git a/api_docs/index_management.mdx b/api_docs/index_management.mdx index 517615e32f821..4d2c52199133e 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] --- import indexManagementObj from './index_management.devdocs.json'; diff --git a/api_docs/infra.devdocs.json b/api_docs/infra.devdocs.json index 679788fc86bdd..767658d05117b 100644 --- a/api_docs/infra.devdocs.json +++ b/api_docs/infra.devdocs.json @@ -351,6 +351,20 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "infra", + "id": "def-public.InfraClientStartExports.metricsExplorerViews", + "type": "Object", + "tags": [], + "label": "metricsExplorerViews", + "description": [], + "signature": [ + "MetricsExplorerViewsServiceStart" + ], + "path": "x-pack/plugins/infra/public/types.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "infra", "id": "def-public.InfraClientStartExports.telemetry", diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index c83a3ed4466a8..8a7dadb0a3b2c 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] --- import infraObj from './infra.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/infra-monitoring-ui](https://github.com/orgs/elastic/teams/inf | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 47 | 0 | 44 | 12 | +| 48 | 0 | 45 | 13 | ## Client diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index 9e8dcefa943af..3df07bce85fc5 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'inspector'] --- import inspectorObj from './inspector.devdocs.json'; diff --git a/api_docs/interactive_setup.mdx b/api_docs/interactive_setup.mdx index ec876749f96f7..42bafa99ec26f 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'interactiveSetup'] --- import interactiveSetupObj from './interactive_setup.devdocs.json'; diff --git a/api_docs/kbn_ace.mdx b/api_docs/kbn_ace.mdx index 45851df2e5d7e..850eee1d8ca55 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] --- import kbnAceObj from './kbn_ace.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index 9f9d6f20e18f9..32827645d9968 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components'] --- import kbnAiopsComponentsObj from './kbn_aiops_components.devdocs.json'; diff --git a/api_docs/kbn_aiops_utils.mdx b/api_docs/kbn_aiops_utils.mdx index 76069a8096fbd..b07c5888c1aab 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-04-27 +date: 2023-05-01 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 a4602f67ef9f1..9030a1aa29418 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-04-27 +date: 2023-05-01 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 0e432269925e3..32486b05482bd 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-04-27 +date: 2023-05-01 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 e9952c200af59..86e8489aae5e2 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-04-27 +date: 2023-05-01 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 8d75bdef86843..317f8d8aa5666 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-04-27 +date: 2023-05-01 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 5b34db622f937..8d52e9c026f6c 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_client.mdx b/api_docs/kbn_analytics_client.mdx index 125c8ed10ff97..c67ff489b5501 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-client'] --- import kbnAnalyticsClientObj from './kbn_analytics_client.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_browser.mdx index b3636b5c004fe..4956d65135d21 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-browser'] --- import kbnAnalyticsShippersElasticV3BrowserObj from './kbn_analytics_shippers_elastic_v3_browser.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_common.mdx index d28a95a58747c..637456111e3e7 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-common'] --- import kbnAnalyticsShippersElasticV3CommonObj from './kbn_analytics_shippers_elastic_v3_common.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx b/api_docs/kbn_analytics_shippers_elastic_v3_server.mdx index ceb1cd9840427..1d4e2790d0c59 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-elastic-v3-server'] --- import kbnAnalyticsShippersElasticV3ServerObj from './kbn_analytics_shippers_elastic_v3_server.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_fullstory.mdx b/api_docs/kbn_analytics_shippers_fullstory.mdx index 6945006d36a33..e969f7b0af441 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-fullstory'] --- import kbnAnalyticsShippersFullstoryObj from './kbn_analytics_shippers_fullstory.devdocs.json'; diff --git a/api_docs/kbn_analytics_shippers_gainsight.mdx b/api_docs/kbn_analytics_shippers_gainsight.mdx index 486ecc9763ff0..d953dd07755d0 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics-shippers-gainsight'] --- import kbnAnalyticsShippersGainsightObj from './kbn_analytics_shippers_gainsight.devdocs.json'; diff --git a/api_docs/kbn_apm_config_loader.mdx b/api_docs/kbn_apm_config_loader.mdx index 74e31145a438e..948d6a58e273a 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-config-loader'] --- import kbnApmConfigLoaderObj from './kbn_apm_config_loader.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace.mdx b/api_docs/kbn_apm_synthtrace.mdx index c607330ae9f1f..9639c2f9c2ff3 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-04-27 +date: 2023-05-01 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.devdocs.json b/api_docs/kbn_apm_synthtrace_client.devdocs.json index 3b600525e3325..47d4c1f343f46 100644 --- a/api_docs/kbn_apm_synthtrace_client.devdocs.json +++ b/api_docs/kbn_apm_synthtrace_client.devdocs.json @@ -851,7 +851,7 @@ "label": "appMetrics", "description": [], "signature": [ - "(metrics: Partial<{ 'system.process.memory.size': number; 'system.memory.actual.free': number; 'system.memory.total': number; 'system.cpu.total.norm.pct': number; 'system.process.memory.rss.bytes': number; 'system.process.cpu.total.norm.pct': number; 'jvm.memory.heap.used': number; 'jvm.memory.non_heap.used': number; 'jvm.thread.count': number; 'faas.billed_duration': number; 'faas.timeout': number; 'faas.coldstart_duration': number; 'faas.duration': number; 'application.launch.time': number; }>) => ", + "(metrics: Partial<{ 'system.process.memory.size': number; 'system.memory.actual.free': number; 'system.memory.total': number; 'system.process.cgroup.memory.mem.limit.bytes': number; 'system.process.cgroup.memory.mem.usage.bytes': number; 'system.cpu.total.norm.pct': number; 'system.process.memory.rss.bytes': number; 'system.process.cpu.total.norm.pct': number; 'jvm.memory.heap.used': number; 'jvm.memory.non_heap.used': number; 'jvm.thread.count': number; 'faas.billed_duration': number; 'faas.timeout': number; 'faas.coldstart_duration': number; 'faas.duration': number; 'application.launch.time': number; }>) => ", "Metricset", "<", { @@ -875,7 +875,7 @@ "label": "metrics", "description": [], "signature": [ - "Partial<{ 'system.process.memory.size': number; 'system.memory.actual.free': number; 'system.memory.total': number; 'system.cpu.total.norm.pct': number; 'system.process.memory.rss.bytes': number; 'system.process.cpu.total.norm.pct': number; 'jvm.memory.heap.used': number; 'jvm.memory.non_heap.used': number; 'jvm.thread.count': number; 'faas.billed_duration': number; 'faas.timeout': number; 'faas.coldstart_duration': number; 'faas.duration': number; 'application.launch.time': number; }>" + "Partial<{ 'system.process.memory.size': number; 'system.memory.actual.free': number; 'system.memory.total': number; 'system.process.cgroup.memory.mem.limit.bytes': number; 'system.process.cgroup.memory.mem.usage.bytes': number; 'system.cpu.total.norm.pct': number; 'system.process.memory.rss.bytes': number; 'system.process.cpu.total.norm.pct': number; 'jvm.memory.heap.used': number; 'jvm.memory.non_heap.used': number; 'jvm.thread.count': number; 'faas.billed_duration': number; 'faas.timeout': number; 'faas.coldstart_duration': number; 'faas.duration': number; 'application.launch.time': number; }>" ], "path": "packages/kbn-apm-synthtrace-client/src/lib/apm/instance.ts", "deprecated": false, @@ -1292,7 +1292,7 @@ "label": "appMetrics", "description": [], "signature": [ - "(metrics: Partial<{ 'system.process.memory.size': number; 'system.memory.actual.free': number; 'system.memory.total': number; 'system.cpu.total.norm.pct': number; 'system.process.memory.rss.bytes': number; 'system.process.cpu.total.norm.pct': number; 'jvm.memory.heap.used': number; 'jvm.memory.non_heap.used': number; 'jvm.thread.count': number; 'faas.billed_duration': number; 'faas.timeout': number; 'faas.coldstart_duration': number; 'faas.duration': number; 'application.launch.time': number; }>) => ", + "(metrics: Partial<{ 'system.process.memory.size': number; 'system.memory.actual.free': number; 'system.memory.total': number; 'system.process.cgroup.memory.mem.limit.bytes': number; 'system.process.cgroup.memory.mem.usage.bytes': number; 'system.cpu.total.norm.pct': number; 'system.process.memory.rss.bytes': number; 'system.process.cpu.total.norm.pct': number; 'jvm.memory.heap.used': number; 'jvm.memory.non_heap.used': number; 'jvm.thread.count': number; 'faas.billed_duration': number; 'faas.timeout': number; 'faas.coldstart_duration': number; 'faas.duration': number; 'application.launch.time': number; }>) => ", "Metricset", "<", { @@ -1316,7 +1316,7 @@ "label": "metrics", "description": [], "signature": [ - "Partial<{ 'system.process.memory.size': number; 'system.memory.actual.free': number; 'system.memory.total': number; 'system.cpu.total.norm.pct': number; 'system.process.memory.rss.bytes': number; 'system.process.cpu.total.norm.pct': number; 'jvm.memory.heap.used': number; 'jvm.memory.non_heap.used': number; 'jvm.thread.count': number; 'faas.billed_duration': number; 'faas.timeout': number; 'faas.coldstart_duration': number; 'faas.duration': number; 'application.launch.time': number; }>" + "Partial<{ 'system.process.memory.size': number; 'system.memory.actual.free': number; 'system.memory.total': number; 'system.process.cgroup.memory.mem.limit.bytes': number; 'system.process.cgroup.memory.mem.usage.bytes': number; 'system.cpu.total.norm.pct': number; 'system.process.memory.rss.bytes': number; 'system.process.cpu.total.norm.pct': number; 'jvm.memory.heap.used': number; 'jvm.memory.non_heap.used': number; 'jvm.thread.count': number; 'faas.billed_duration': number; 'faas.timeout': number; 'faas.coldstart_duration': number; 'faas.duration': number; 'application.launch.time': number; }>" ], "path": "packages/kbn-apm-synthtrace-client/src/lib/apm/mobile_device.ts", "deprecated": false, @@ -2439,7 +2439,7 @@ "GeoLocation", "; 'client.geo.region_iso_code': string; 'client.geo.region_name': string; 'client.ip': string; 'cloud.account.id': string; 'cloud.account.name': string; 'cloud.availability_zone': string; 'cloud.machine.type': string; 'cloud.project.id': string; 'cloud.project.name': string; 'cloud.provider': string; 'cloud.region': string; 'cloud.service.name': string; 'container.id': string; 'destination.address': string; 'destination.port': number; 'device.id': string; 'device.manufacturer': string; 'device.model.identifier': string; 'device.model.name': string; 'ecs.version': string; 'error.exception': ", "ApmException", - "[]; 'error.grouping_key': string; 'error.grouping_name': string; 'error.id': string; 'error.type': string; 'event.ingested': number; 'event.name': string; 'event.outcome': string; 'event.outcome_numeric': number | { sum: number; value_count: number; }; 'faas.coldstart': boolean; 'faas.execution': string; 'faas.id': string; 'faas.name': string; 'faas.trigger.type': string; 'faas.version': string; 'host.architecture': string; 'host.hostname': string; 'host.name': string; 'host.os.full': string; 'host.os.name': string; 'host.os.platform': string; 'host.os.type': string; 'host.os.version': string; 'http.request.method': string; 'http.response.status_code': number; 'kubernetes.pod.name': string; 'kubernetes.pod.uid': string; 'labels.name': string; 'labels.telemetry_auto_version': string; 'metricset.name': string; 'network.carrier.icc': string; 'network.carrier.mcc': string; 'network.carrier.mnc': string; 'network.carrier.name': string; 'network.connection.subtype': string; 'network.connection.type': string; 'observer.type': string; 'observer.version_major': number; 'observer.version': string; 'parent.id': string; 'processor.event': string; 'processor.name': string; 'session.id': string; 'trace.id': string; 'transaction.aggregation.overflow_count': number; 'transaction.duration.us': number; 'transaction.id': string; 'transaction.name': string; 'transaction.type': string; 'transaction.duration.histogram': { values: number[]; counts: number[]; }; 'transaction.result': string; 'transaction.sampled': boolean; 'service.environment': string; 'service.framework.name': string; 'service.framework.version': string; 'service.language.name': string; 'service.language.version': string; 'service.name': string; 'service.node.name': string; 'service.runtime.name': string; 'service.runtime.version': string; 'service.target.name': string; 'service.target.type': string; 'service.version': string; 'span.action': string; 'span.destination.service.resource': string; 'span.destination.service.response_time.count': number; 'span.destination.service.response_time.sum.us': number; 'span.duration.us': number; 'span.id': string; 'span.name': string; 'span.self_time.count': number; 'span.self_time.sum.us': number; 'span.subtype': string; 'span.type': string; 'span.links': { trace: { id: string; }; span: { id: string; }; }[]; 'url.original': string; }> & Partial<{ 'system.process.memory.size': number; 'system.memory.actual.free': number; 'system.memory.total': number; 'system.cpu.total.norm.pct': number; 'system.process.memory.rss.bytes': number; 'system.process.cpu.total.norm.pct': number; 'jvm.memory.heap.used': number; 'jvm.memory.non_heap.used': number; 'jvm.thread.count': number; 'faas.billed_duration': number; 'faas.timeout': number; 'faas.coldstart_duration': number; 'faas.duration': number; 'application.launch.time': number; }> & Partial<{ 'metricset.interval': string; 'transaction.duration.summary': string; }>" + "[]; 'error.grouping_key': string; 'error.grouping_name': string; 'error.id': string; 'error.type': string; 'event.ingested': number; 'event.name': string; 'event.outcome': string; 'event.outcome_numeric': number | { sum: number; value_count: number; }; 'faas.coldstart': boolean; 'faas.execution': string; 'faas.id': string; 'faas.name': string; 'faas.trigger.type': string; 'faas.version': string; 'host.architecture': string; 'host.hostname': string; 'host.name': string; 'host.os.full': string; 'host.os.name': string; 'host.os.platform': string; 'host.os.type': string; 'host.os.version': string; 'http.request.method': string; 'http.response.status_code': number; 'kubernetes.pod.name': string; 'kubernetes.pod.uid': string; 'labels.name': string; 'labels.telemetry_auto_version': string; 'metricset.name': string; 'network.carrier.icc': string; 'network.carrier.mcc': string; 'network.carrier.mnc': string; 'network.carrier.name': string; 'network.connection.subtype': string; 'network.connection.type': string; 'observer.type': string; 'observer.version_major': number; 'observer.version': string; 'parent.id': string; 'processor.event': string; 'processor.name': string; 'session.id': string; 'trace.id': string; 'transaction.aggregation.overflow_count': number; 'transaction.duration.us': number; 'transaction.id': string; 'transaction.name': string; 'transaction.type': string; 'transaction.duration.histogram': { values: number[]; counts: number[]; }; 'transaction.result': string; 'transaction.sampled': boolean; 'service.environment': string; 'service.framework.name': string; 'service.framework.version': string; 'service.language.name': string; 'service.language.version': string; 'service.name': string; 'service.node.name': string; 'service.runtime.name': string; 'service.runtime.version': string; 'service.target.name': string; 'service.target.type': string; 'service.version': string; 'span.action': string; 'span.destination.service.resource': string; 'span.destination.service.response_time.count': number; 'span.destination.service.response_time.sum.us': number; 'span.duration.us': number; 'span.id': string; 'span.name': string; 'span.self_time.count': number; 'span.self_time.sum.us': number; 'span.subtype': string; 'span.type': string; 'span.links': { trace: { id: string; }; span: { id: string; }; }[]; 'url.original': string; }> & Partial<{ 'system.process.memory.size': number; 'system.memory.actual.free': number; 'system.memory.total': number; 'system.process.cgroup.memory.mem.limit.bytes': number; 'system.process.cgroup.memory.mem.usage.bytes': number; 'system.cpu.total.norm.pct': number; 'system.process.memory.rss.bytes': number; 'system.process.cpu.total.norm.pct': number; 'jvm.memory.heap.used': number; 'jvm.memory.non_heap.used': number; 'jvm.thread.count': number; 'faas.billed_duration': number; 'faas.timeout': number; 'faas.coldstart_duration': number; 'faas.duration': number; 'application.launch.time': number; }> & Partial<{ 'metricset.interval': string; 'transaction.duration.summary': string; }>" ], "path": "packages/kbn-apm-synthtrace-client/src/lib/apm/apm_fields.ts", "deprecated": false, diff --git a/api_docs/kbn_apm_synthtrace_client.mdx b/api_docs/kbn_apm_synthtrace_client.mdx index 50a3c23d8cd68..e6411a7e5b45d 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-04-27 +date: 2023-05-01 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 2e0932a72224f..bcf2949889d0d 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-utils'] --- import kbnApmUtilsObj from './kbn_apm_utils.devdocs.json'; diff --git a/api_docs/kbn_axe_config.mdx b/api_docs/kbn_axe_config.mdx index ffdf3e2b4cef6..04a9566de1044 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/axe-config'] --- import kbnAxeConfigObj from './kbn_axe_config.devdocs.json'; diff --git a/api_docs/kbn_cases_components.mdx b/api_docs/kbn_cases_components.mdx index 924488c4b926d..e8ba6ebb2acff 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-04-27 +date: 2023-05-01 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 43db77f47675c..d16aee087ea95 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-04-27 +date: 2023-05-01 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 9825b6f79ddb7..1abaa4dde1034 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-04-27 +date: 2023-05-01 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 72b7dc5f3b47f..adf1eb30b7424 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/chart-icons'] --- import kbnChartIconsObj from './kbn_chart_icons.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_core.mdx b/api_docs/kbn_ci_stats_core.mdx index a49b85c43e5b2..d7cd282c2be0f 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-core'] --- import kbnCiStatsCoreObj from './kbn_ci_stats_core.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_performance_metrics.mdx b/api_docs/kbn_ci_stats_performance_metrics.mdx index 4d43d0e7bc512..68c482eaa8997 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-performance-metrics'] --- import kbnCiStatsPerformanceMetricsObj from './kbn_ci_stats_performance_metrics.devdocs.json'; diff --git a/api_docs/kbn_ci_stats_reporter.mdx b/api_docs/kbn_ci_stats_reporter.mdx index 3ddecb33fdd26..861c8edacfc22 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ci-stats-reporter'] --- import kbnCiStatsReporterObj from './kbn_ci_stats_reporter.devdocs.json'; diff --git a/api_docs/kbn_cli_dev_mode.mdx b/api_docs/kbn_cli_dev_mode.mdx index 4d5d71c9332ab..7be40fe052622 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cli-dev-mode'] --- import kbnCliDevModeObj from './kbn_cli_dev_mode.devdocs.json'; diff --git a/api_docs/kbn_code_editor.mdx b/api_docs/kbn_code_editor.mdx index e53e9b11b60da..c133f1359a5c6 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-04-27 +date: 2023-05-01 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 83b0565260072..b19190f71abde 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-04-27 +date: 2023-05-01 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 c80ad83d1c4e2..6eec1973f1c02 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/coloring'] --- import kbnColoringObj from './kbn_coloring.devdocs.json'; diff --git a/api_docs/kbn_config.mdx b/api_docs/kbn_config.mdx index bba27794268b6..ecfe6240e154e 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config'] --- import kbnConfigObj from './kbn_config.devdocs.json'; diff --git a/api_docs/kbn_config_mocks.mdx b/api_docs/kbn_config_mocks.mdx index afa3194e9ca4b..d84306ec7dede 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-mocks'] --- import kbnConfigMocksObj from './kbn_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_config_schema.mdx b/api_docs/kbn_config_schema.mdx index 47cefe839a26f..cb1912aade0c0 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/config-schema'] --- import kbnConfigSchemaObj from './kbn_config_schema.devdocs.json'; diff --git a/api_docs/kbn_content_management_content_editor.mdx b/api_docs/kbn_content_management_content_editor.mdx index 4f449fb0d84cd..b1015397c236d 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-04-27 +date: 2023-05-01 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 9fc12cbcf1670..caa55b6e783b1 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list'] --- import kbnContentManagementTableListObj from './kbn_content_management_table_list.devdocs.json'; diff --git a/api_docs/kbn_content_management_utils.devdocs.json b/api_docs/kbn_content_management_utils.devdocs.json index 9f1ddd3e9ad60..6c6c13efb2b09 100644 --- a/api_docs/kbn_content_management_utils.devdocs.json +++ b/api_docs/kbn_content_management_utils.devdocs.json @@ -18,7 +18,304 @@ }, "common": { "classes": [], - "functions": [], + "functions": [ + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.createResultSchema", + "type": "Function", + "tags": [], + "label": "createResultSchema", + "description": [], + "signature": [ + "(soSchema: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ObjectType", + "text": "ObjectType" + }, + ") => ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ObjectType", + "text": "ObjectType" + }, + "<{ item: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ObjectType", + "text": "ObjectType" + }, + "; }>" + ], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.createResultSchema.$1", + "type": "Object", + "tags": [], + "label": "soSchema", + "description": [], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ObjectType", + "text": "ObjectType" + }, + "" + ], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.objectTypeToGetResultSchema", + "type": "Function", + "tags": [], + "label": "objectTypeToGetResultSchema", + "description": [], + "signature": [ + "(soSchema: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ObjectType", + "text": "ObjectType" + }, + ") => ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ObjectType", + "text": "ObjectType" + }, + "<{ item: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ObjectType", + "text": "ObjectType" + }, + "; meta: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ObjectType", + "text": "ObjectType" + }, + "<{ outcome: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "<\"conflict\" | \"exactMatch\" | \"aliasMatch\">; aliasTargetId: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "; aliasPurpose: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "<\"savedObjectConversion\" | \"savedObjectImport\" | undefined>; }>; }>" + ], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.objectTypeToGetResultSchema.$1", + "type": "Object", + "tags": [], + "label": "soSchema", + "description": [], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ObjectType", + "text": "ObjectType" + }, + "" + ], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.savedObjectSchema", + "type": "Function", + "tags": [], + "label": "savedObjectSchema", + "description": [], + "signature": [ + "(attributesSchema: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ObjectType", + "text": "ObjectType" + }, + ") => ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ObjectType", + "text": "ObjectType" + }, + "<{ id: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "; type: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "; version: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "; createdAt: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "; updatedAt: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "; error: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "; statusCode: number; }> | undefined>; attributes: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ObjectType", + "text": "ObjectType" + }, + "; references: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "[]>; namespaces: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "; originId: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "; }>" + ], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.savedObjectSchema.$1", + "type": "Object", + "tags": [], + "label": "attributesSchema", + "description": [], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ObjectType", + "text": "ObjectType" + }, + "" + ], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], "interfaces": [ { "parentPluginId": "@kbn/content-management-utils", @@ -42,7 +339,7 @@ }, "" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -65,7 +362,7 @@ }, "" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -97,7 +394,7 @@ }, "[] | undefined; }" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -113,7 +410,7 @@ "signature": [ "CreateOptions" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -129,7 +426,7 @@ "signature": [ "UpdateOptions" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -145,7 +442,7 @@ "signature": [ "SearchOptions" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -168,7 +465,7 @@ }, "" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -192,7 +489,7 @@ }, "; meta: { outcome: \"conflict\" | \"exactMatch\" | \"aliasMatch\"; aliasTargetId?: string | undefined; aliasPurpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; }; }" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -215,7 +512,7 @@ }, "" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -239,7 +536,7 @@ }, "; }" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -262,7 +559,7 @@ }, "" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -286,7 +583,7 @@ }, "[]; pagination: { total: number; cursor?: string | undefined; }; }" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -309,7 +606,7 @@ }, "" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -325,7 +622,7 @@ "signature": [ "{ item: PartialItem; }" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -348,7 +645,7 @@ }, "" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -370,7 +667,7 @@ "text": "DeleteResult" } ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false } @@ -384,7 +681,7 @@ "tags": [], "label": "Reference", "description": [], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -395,7 +692,7 @@ "tags": [], "label": "type", "description": [], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -406,7 +703,7 @@ "tags": [], "label": "id", "description": [], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -417,7 +714,7 @@ "tags": [], "label": "name", "description": [], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false } @@ -433,7 +730,7 @@ "description": [ "Saved Object create options - Pick and Omit to customize" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -449,7 +746,7 @@ "signature": [ "string | undefined" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -465,7 +762,7 @@ "signature": [ "boolean | undefined" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -481,7 +778,7 @@ "signature": [ "string | undefined" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -504,7 +801,7 @@ }, "[] | undefined" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -520,7 +817,7 @@ "signature": [ "boolean | undefined" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -536,7 +833,7 @@ "signature": [ "string[] | undefined" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false } @@ -552,7 +849,7 @@ "description": [ "Saved Object search options - Pick and Omit to customize" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -568,7 +865,7 @@ "signature": [ "number | undefined" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -584,7 +881,7 @@ "signature": [ "number | undefined" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -600,7 +897,7 @@ "signature": [ "string | undefined" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -617,7 +914,7 @@ "SortOrder", " | undefined" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -633,7 +930,7 @@ "signature": [ "string[] | undefined" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -649,7 +946,7 @@ "signature": [ "string | undefined" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -665,7 +962,7 @@ "signature": [ "string[] | undefined" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -682,7 +979,7 @@ "SortResults", " | undefined" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -698,7 +995,7 @@ "signature": [ "string[] | undefined" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -729,7 +1026,7 @@ }, "[] | undefined" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -745,7 +1042,7 @@ "signature": [ "\"AND\" | \"OR\" | undefined" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -776,7 +1073,7 @@ }, "[] | undefined" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -792,7 +1089,7 @@ "signature": [ "\"AND\" | \"OR\" | undefined" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -808,7 +1105,7 @@ "signature": [ "\"AND\" | \"OR\" | undefined" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -824,7 +1121,7 @@ "signature": [ "any" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -844,7 +1141,7 @@ "AggregationsAggregationContainer", "> | undefined" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -860,7 +1157,7 @@ "signature": [ "string[] | undefined" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -883,7 +1180,7 @@ }, " | undefined" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false } @@ -909,7 +1206,7 @@ }, "" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -932,7 +1229,7 @@ }, "[] | undefined" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -946,7 +1243,7 @@ "signature": [ "string | undefined" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -969,7 +1266,7 @@ }, " | undefined" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -985,7 +1282,7 @@ "signature": [ "Attributes | undefined" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -1001,7 +1298,7 @@ "signature": [ "number | undefined" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false } @@ -1027,7 +1324,7 @@ }, "" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false, "children": [ @@ -1038,7 +1335,7 @@ "tags": [], "label": "id", "description": [], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -1049,7 +1346,7 @@ "tags": [], "label": "type", "description": [], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -1063,7 +1360,7 @@ "signature": [ "string | undefined" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -1077,7 +1374,7 @@ "signature": [ "string | undefined" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -1091,7 +1388,7 @@ "signature": [ "string | undefined" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -1105,7 +1402,7 @@ "signature": [ "{ error: string; message: string; statusCode: number; metadata?: Record | undefined; } | undefined" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -1119,7 +1416,7 @@ "signature": [ "Attributes" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -1140,7 +1437,7 @@ }, "[]" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -1154,7 +1451,7 @@ "signature": [ "string[] | undefined" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false }, @@ -1168,7 +1465,7 @@ "signature": [ "string | undefined" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false } @@ -1190,12 +1487,821 @@ "signature": [ "{ item: T; meta: { outcome: \"conflict\" | \"exactMatch\" | \"aliasMatch\"; aliasTargetId?: string | undefined; aliasPurpose?: \"savedObjectConversion\" | \"savedObjectImport\" | undefined; }; }" ], - "path": "packages/kbn-content-management-utils/types.ts", + "path": "packages/kbn-content-management-utils/src/types.ts", "deprecated": false, "trackAdoption": false, "initialIsOpen": false } ], - "objects": [] + "objects": [ + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.apiError", + "type": "Object", + "tags": [], + "label": "apiError", + "description": [], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ObjectType", + "text": "ObjectType" + }, + "<{ error: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "; message: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "; statusCode: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "; metadata: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ObjectType", + "text": "ObjectType" + }, + "<{}>; }>" + ], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.createOptionsSchemas", + "type": "Object", + "tags": [], + "label": "createOptionsSchemas", + "description": [], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.createOptionsSchemas.id", + "type": "Object", + "tags": [], + "label": "id", + "description": [], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "" + ], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.createOptionsSchemas.references", + "type": "Object", + "tags": [], + "label": "references", + "description": [], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "[] | undefined>" + ], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.createOptionsSchemas.overwrite", + "type": "Object", + "tags": [], + "label": "overwrite", + "description": [], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "" + ], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.createOptionsSchemas.version", + "type": "Object", + "tags": [], + "label": "version", + "description": [], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "" + ], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.createOptionsSchemas.refresh", + "type": "Object", + "tags": [], + "label": "refresh", + "description": [], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "" + ], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.createOptionsSchemas.initialNamespaces", + "type": "Object", + "tags": [], + "label": "initialNamespaces", + "description": [], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "" + ], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.referenceSchema", + "type": "Object", + "tags": [], + "label": "referenceSchema", + "description": [], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ObjectType", + "text": "ObjectType" + }, + "<{ name: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "; type: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "; id: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "; }>" + ], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.referencesSchema", + "type": "Object", + "tags": [], + "label": "referencesSchema", + "description": [], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "[]>" + ], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.schemaAndOr", + "type": "Object", + "tags": [], + "label": "schemaAndOr", + "description": [], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "<\"AND\" | \"OR\">" + ], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.searchOptionsSchemas", + "type": "Object", + "tags": [], + "label": "searchOptionsSchemas", + "description": [], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.searchOptionsSchemas.page", + "type": "Object", + "tags": [], + "label": "page", + "description": [], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "" + ], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.searchOptionsSchemas.perPage", + "type": "Object", + "tags": [], + "label": "perPage", + "description": [], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "" + ], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.searchOptionsSchemas.sortField", + "type": "Object", + "tags": [], + "label": "sortField", + "description": [], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "" + ], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.searchOptionsSchemas.sortOrder", + "type": "Object", + "tags": [], + "label": "sortOrder", + "description": [], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "<\"asc\" | \"desc\" | undefined>" + ], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.searchOptionsSchemas.fields", + "type": "Object", + "tags": [], + "label": "fields", + "description": [], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "" + ], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.searchOptionsSchemas.search", + "type": "Object", + "tags": [], + "label": "search", + "description": [], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "" + ], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.searchOptionsSchemas.searchFields", + "type": "Object", + "tags": [], + "label": "searchFields", + "description": [], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "" + ], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.searchOptionsSchemas.rootSearchFields", + "type": "Object", + "tags": [], + "label": "rootSearchFields", + "description": [], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "" + ], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.searchOptionsSchemas.hasReference", + "type": "Object", + "tags": [], + "label": "hasReference", + "description": [], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + " | Readonly<{ name?: string | undefined; } & { type: string; id: string; }>[] | undefined>" + ], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.searchOptionsSchemas.hasReferenceOperator", + "type": "Object", + "tags": [], + "label": "hasReferenceOperator", + "description": [], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "<\"AND\" | \"OR\" | undefined>" + ], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.searchOptionsSchemas.hasNoReference", + "type": "Object", + "tags": [], + "label": "hasNoReference", + "description": [], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + " | Readonly<{ name?: string | undefined; } & { type: string; id: string; }>[] | undefined>" + ], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.searchOptionsSchemas.hasNoReferenceOperator", + "type": "Object", + "tags": [], + "label": "hasNoReferenceOperator", + "description": [], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "<\"AND\" | \"OR\" | undefined>" + ], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.searchOptionsSchemas.defaultSearchOperator", + "type": "Object", + "tags": [], + "label": "defaultSearchOperator", + "description": [], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "<\"AND\" | \"OR\" | undefined>" + ], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.searchOptionsSchemas.namespaces", + "type": "Object", + "tags": [], + "label": "namespaces", + "description": [], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "" + ], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.searchOptionsSchemas.type", + "type": "Object", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "" + ], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.searchOptionsSchemas.filter", + "type": "Object", + "tags": [], + "label": "filter", + "description": [], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "" + ], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.searchOptionsSchemas.pit", + "type": "Object", + "tags": [], + "label": "pit", + "description": [], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + " | undefined>" + ], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.updateOptionsSchema", + "type": "Object", + "tags": [], + "label": "updateOptionsSchema", + "description": [], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.updateOptionsSchema.references", + "type": "Object", + "tags": [], + "label": "references", + "description": [], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "[] | undefined>" + ], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.updateOptionsSchema.version", + "type": "Object", + "tags": [], + "label": "version", + "description": [], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "" + ], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.updateOptionsSchema.refresh", + "type": "Object", + "tags": [], + "label": "refresh", + "description": [], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "" + ], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.updateOptionsSchema.upsert", + "type": "Function", + "tags": [], + "label": "upsert", + "description": [], + "signature": [ + "(attributesSchema: ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ObjectType", + "text": "ObjectType" + }, + ") => ", + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "; statusCode: number; }> | undefined; namespaces?: string[] | undefined; createdAt?: string | undefined; updatedAt?: string | undefined; version?: string | undefined; originId?: string | undefined; } & { type: string; id: string; references: Readonly<{ name?: string | undefined; } & { type: string; id: string; }>[]; attributes: Readonly<{ [x: string]: any; } & {}>; }> | undefined>" + ], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.updateOptionsSchema.upsert.$1", + "type": "Object", + "tags": [], + "label": "attributesSchema", + "description": [], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.ObjectType", + "text": "ObjectType" + }, + "" + ], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "@kbn/content-management-utils", + "id": "def-common.updateOptionsSchema.retryOnConflict", + "type": "Object", + "tags": [], + "label": "retryOnConflict", + "description": [], + "signature": [ + { + "pluginId": "@kbn/config-schema", + "scope": "common", + "docId": "kibKbnConfigSchemaPluginApi", + "section": "def-common.Type", + "text": "Type" + }, + "" + ], + "path": "packages/kbn-content-management-utils/src/schema.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ] } } \ No newline at end of file diff --git a/api_docs/kbn_content_management_utils.mdx b/api_docs/kbn_content_management_utils.mdx index 56f852c540d83..27efbc2376606 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-utils'] --- import kbnContentManagementUtilsObj from './kbn_content_management_utils.devdocs.json'; @@ -21,10 +21,16 @@ Contact [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 64 | 1 | 15 | 0 | +| 106 | 1 | 57 | 0 | ## Common +### Objects + + +### Functions + + ### Interfaces diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index 90c0a3da1063c..762243acbe3d2 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser'] --- import kbnCoreAnalyticsBrowserObj from './kbn_core_analytics_browser.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_internal.mdx b/api_docs/kbn_core_analytics_browser_internal.mdx index d8b4ef78021c8..b0301bd42e871 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-internal'] --- import kbnCoreAnalyticsBrowserInternalObj from './kbn_core_analytics_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser_mocks.mdx b/api_docs/kbn_core_analytics_browser_mocks.mdx index f97182bfe1032..1013ce86a5aa6 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-browser-mocks'] --- import kbnCoreAnalyticsBrowserMocksObj from './kbn_core_analytics_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server.mdx b/api_docs/kbn_core_analytics_server.mdx index d1fb67e67aa3c..345aa051a3018 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server'] --- import kbnCoreAnalyticsServerObj from './kbn_core_analytics_server.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_internal.mdx b/api_docs/kbn_core_analytics_server_internal.mdx index e476550f67f9c..8ec6b7503994e 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-internal'] --- import kbnCoreAnalyticsServerInternalObj from './kbn_core_analytics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_server_mocks.mdx b/api_docs/kbn_core_analytics_server_mocks.mdx index 15a5b71ad48be..d085671f06ee3 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-analytics-server-mocks'] --- import kbnCoreAnalyticsServerMocksObj from './kbn_core_analytics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser.mdx b/api_docs/kbn_core_application_browser.mdx index fdbf515d52f2e..d74f4511805f9 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser'] --- import kbnCoreApplicationBrowserObj from './kbn_core_application_browser.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_internal.mdx b/api_docs/kbn_core_application_browser_internal.mdx index 8136d6f0eef71..3496153f75aa5 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-internal'] --- import kbnCoreApplicationBrowserInternalObj from './kbn_core_application_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_application_browser_mocks.mdx b/api_docs/kbn_core_application_browser_mocks.mdx index f150ce894cae0..268c255db1c95 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-browser-mocks'] --- import kbnCoreApplicationBrowserMocksObj from './kbn_core_application_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_application_common.mdx b/api_docs/kbn_core_application_common.mdx index 4fc6e59b49ae4..bbca5fc04afc6 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-application-common'] --- import kbnCoreApplicationCommonObj from './kbn_core_application_common.devdocs.json'; diff --git a/api_docs/kbn_core_apps_browser_internal.mdx b/api_docs/kbn_core_apps_browser_internal.mdx index 9620c7088c902..6d735a58097f6 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-internal'] --- import kbnCoreAppsBrowserInternalObj from './kbn_core_apps_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_apps_browser_mocks.mdx b/api_docs/kbn_core_apps_browser_mocks.mdx index 36ccacc4ea3e0..16ee29e5939d9 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-browser-mocks'] --- import kbnCoreAppsBrowserMocksObj from './kbn_core_apps_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_apps_server_internal.mdx b/api_docs/kbn_core_apps_server_internal.mdx index 5bd0eb09d4f9b..a38553bfa9f8a 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-apps-server-internal'] --- import kbnCoreAppsServerInternalObj from './kbn_core_apps_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_browser_mocks.mdx b/api_docs/kbn_core_base_browser_mocks.mdx index 9820634802dbe..decd8324dd64f 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-browser-mocks'] --- import kbnCoreBaseBrowserMocksObj from './kbn_core_base_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_base_common.mdx b/api_docs/kbn_core_base_common.mdx index 69f28f56306c6..ebd549fd1c9ee 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-common'] --- import kbnCoreBaseCommonObj from './kbn_core_base_common.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_internal.mdx b/api_docs/kbn_core_base_server_internal.mdx index 53250812bd806..803050163f9d4 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-internal'] --- import kbnCoreBaseServerInternalObj from './kbn_core_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_base_server_mocks.mdx b/api_docs/kbn_core_base_server_mocks.mdx index 908b45a3f4958..750886300b191 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-base-server-mocks'] --- import kbnCoreBaseServerMocksObj from './kbn_core_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_browser_mocks.mdx b/api_docs/kbn_core_capabilities_browser_mocks.mdx index 52242df008c52..2154f9df5ef6c 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-browser-mocks'] --- import kbnCoreCapabilitiesBrowserMocksObj from './kbn_core_capabilities_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_common.mdx b/api_docs/kbn_core_capabilities_common.mdx index ef72625e6a1a6..190c924fad870 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-common'] --- import kbnCoreCapabilitiesCommonObj from './kbn_core_capabilities_common.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server.mdx b/api_docs/kbn_core_capabilities_server.mdx index 033096ac78e76..e0b612986b308 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server'] --- import kbnCoreCapabilitiesServerObj from './kbn_core_capabilities_server.devdocs.json'; diff --git a/api_docs/kbn_core_capabilities_server_mocks.mdx b/api_docs/kbn_core_capabilities_server_mocks.mdx index cddf2e19cfb75..7ea5942709ace 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-capabilities-server-mocks'] --- import kbnCoreCapabilitiesServerMocksObj from './kbn_core_capabilities_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser.mdx b/api_docs/kbn_core_chrome_browser.mdx index 2218e9d400295..f10eff15596cd 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser'] --- import kbnCoreChromeBrowserObj from './kbn_core_chrome_browser.devdocs.json'; diff --git a/api_docs/kbn_core_chrome_browser_mocks.mdx b/api_docs/kbn_core_chrome_browser_mocks.mdx index d079e5ac82db9..15081c3a4fdd8 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-chrome-browser-mocks'] --- import kbnCoreChromeBrowserMocksObj from './kbn_core_chrome_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_config_server_internal.mdx b/api_docs/kbn_core_config_server_internal.mdx index 45ead2eb3ab9c..c72bf44c42851 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-config-server-internal'] --- import kbnCoreConfigServerInternalObj from './kbn_core_config_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_custom_branding_browser.mdx b/api_docs/kbn_core_custom_branding_browser.mdx index 1e1173d6d6116..9ffc9d8638277 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-04-27 +date: 2023-05-01 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 2fc88fe446b7b..6442531239c71 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-04-27 +date: 2023-05-01 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 dbb95b2a73844..7946f5848e67d 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-04-27 +date: 2023-05-01 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 0756554c9a2cd..56939ba405e92 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-04-27 +date: 2023-05-01 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 605e8a961ea89..ba2992cbe6b41 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-04-27 +date: 2023-05-01 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 d9e5c130dbb15..5636030f3def8 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-04-27 +date: 2023-05-01 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 759afc4831342..a583bce71ae52 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-04-27 +date: 2023-05-01 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 f0865f4004829..cae50194f89de 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser'] --- import kbnCoreDeprecationsBrowserObj from './kbn_core_deprecations_browser.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_internal.mdx b/api_docs/kbn_core_deprecations_browser_internal.mdx index 81573da2698d1..88d4af82f3f0f 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-internal'] --- import kbnCoreDeprecationsBrowserInternalObj from './kbn_core_deprecations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_browser_mocks.mdx b/api_docs/kbn_core_deprecations_browser_mocks.mdx index 8523162c47d7d..cd078c9b53731 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-browser-mocks'] --- import kbnCoreDeprecationsBrowserMocksObj from './kbn_core_deprecations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_common.mdx b/api_docs/kbn_core_deprecations_common.mdx index 2a070784bff8f..7fe42b4308462 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-common'] --- import kbnCoreDeprecationsCommonObj from './kbn_core_deprecations_common.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server.mdx b/api_docs/kbn_core_deprecations_server.mdx index 9811666668c70..24b0210c0d1dc 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server'] --- import kbnCoreDeprecationsServerObj from './kbn_core_deprecations_server.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_internal.mdx b/api_docs/kbn_core_deprecations_server_internal.mdx index a26d41412afcc..a35d3009c2a57 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-internal'] --- import kbnCoreDeprecationsServerInternalObj from './kbn_core_deprecations_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_deprecations_server_mocks.mdx b/api_docs/kbn_core_deprecations_server_mocks.mdx index 916653e28910e..3cc3661019edc 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-deprecations-server-mocks'] --- import kbnCoreDeprecationsServerMocksObj from './kbn_core_deprecations_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser.mdx b/api_docs/kbn_core_doc_links_browser.mdx index 625b679e7c34b..8f42667298bf0 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser'] --- import kbnCoreDocLinksBrowserObj from './kbn_core_doc_links_browser.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_browser_mocks.mdx b/api_docs/kbn_core_doc_links_browser_mocks.mdx index 6b6197de918ff..ee211860eb5f5 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-browser-mocks'] --- import kbnCoreDocLinksBrowserMocksObj from './kbn_core_doc_links_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server.mdx b/api_docs/kbn_core_doc_links_server.mdx index d1d0c8b6ff3cb..0f0b5a4ea303b 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server'] --- import kbnCoreDocLinksServerObj from './kbn_core_doc_links_server.devdocs.json'; diff --git a/api_docs/kbn_core_doc_links_server_mocks.mdx b/api_docs/kbn_core_doc_links_server_mocks.mdx index 02d893ce7fc3f..2880f0f935cc3 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-doc-links-server-mocks'] --- import kbnCoreDocLinksServerMocksObj from './kbn_core_doc_links_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_internal.mdx b/api_docs/kbn_core_elasticsearch_client_server_internal.mdx index 48e26133f228b..1753f4a3d0a0e 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-internal'] --- import kbnCoreElasticsearchClientServerInternalObj from './kbn_core_elasticsearch_client_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_mocks.devdocs.json b/api_docs/kbn_core_elasticsearch_client_server_mocks.devdocs.json index b36b07569b7da..7cc1932e0cc51 100644 --- a/api_docs/kbn_core_elasticsearch_client_server_mocks.devdocs.json +++ b/api_docs/kbn_core_elasticsearch_client_server_mocks.devdocs.json @@ -397,20 +397,6 @@ "CountRequest", " | undefined, options?: ", "TransportRequestOptions", - " | undefined]>; exists: ", - { - "pluginId": "@kbn/core-elasticsearch-client-server-mocks", - "scope": "common", - "docId": "kibKbnCoreElasticsearchClientServerMocksPluginApi", - "section": "def-common.ClientApiMockInstance", - "text": "ClientApiMockInstance" - }, - ", [params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptions", " | undefined]>; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", { "pluginId": "@kbn/core-elasticsearch-client-server-mocks", @@ -609,7 +595,21 @@ }, "<", "default", - ">; existsSource: ", + ">; exists: ", + { + "pluginId": "@kbn/core-elasticsearch-client-server-mocks", + "scope": "common", + "docId": "kibKbnCoreElasticsearchClientServerMocksPluginApi", + "section": "def-common.ClientApiMockInstance", + "text": "ClientApiMockInstance" + }, + ", [params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined]>; existsSource: ", { "pluginId": "@kbn/core-elasticsearch-client-server-mocks", "scope": "common", @@ -1504,20 +1504,6 @@ "CountRequest", " | undefined, options?: ", "TransportRequestOptions", - " | undefined]>; exists: ", - { - "pluginId": "@kbn/core-elasticsearch-client-server-mocks", - "scope": "common", - "docId": "kibKbnCoreElasticsearchClientServerMocksPluginApi", - "section": "def-common.ClientApiMockInstance", - "text": "ClientApiMockInstance" - }, - ", [params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptions", " | undefined]>; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", { "pluginId": "@kbn/core-elasticsearch-client-server-mocks", @@ -1716,7 +1702,21 @@ }, "<", "default", - ">; existsSource: ", + ">; exists: ", + { + "pluginId": "@kbn/core-elasticsearch-client-server-mocks", + "scope": "common", + "docId": "kibKbnCoreElasticsearchClientServerMocksPluginApi", + "section": "def-common.ClientApiMockInstance", + "text": "ClientApiMockInstance" + }, + ", [params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined]>; existsSource: ", { "pluginId": "@kbn/core-elasticsearch-client-server-mocks", "scope": "common", @@ -2565,20 +2565,6 @@ "CountRequest", " | undefined, options?: ", "TransportRequestOptions", - " | undefined]>; exists: ", - { - "pluginId": "@kbn/core-elasticsearch-client-server-mocks", - "scope": "common", - "docId": "kibKbnCoreElasticsearchClientServerMocksPluginApi", - "section": "def-common.ClientApiMockInstance", - "text": "ClientApiMockInstance" - }, - ", [params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptions", " | undefined]>; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", { "pluginId": "@kbn/core-elasticsearch-client-server-mocks", @@ -2777,7 +2763,21 @@ }, "<", "default", - ">; existsSource: ", + ">; exists: ", + { + "pluginId": "@kbn/core-elasticsearch-client-server-mocks", + "scope": "common", + "docId": "kibKbnCoreElasticsearchClientServerMocksPluginApi", + "section": "def-common.ClientApiMockInstance", + "text": "ClientApiMockInstance" + }, + ", [params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined]>; existsSource: ", { "pluginId": "@kbn/core-elasticsearch-client-server-mocks", "scope": "common", @@ -3717,20 +3717,6 @@ "CountRequest", " | undefined, options?: ", "TransportRequestOptions", - " | undefined]>; exists: ", - { - "pluginId": "@kbn/core-elasticsearch-client-server-mocks", - "scope": "common", - "docId": "kibKbnCoreElasticsearchClientServerMocksPluginApi", - "section": "def-common.ClientApiMockInstance", - "text": "ClientApiMockInstance" - }, - ", [params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptions", " | undefined]>; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", { "pluginId": "@kbn/core-elasticsearch-client-server-mocks", @@ -3929,7 +3915,21 @@ }, "<", "default", - ">; existsSource: ", + ">; exists: ", + { + "pluginId": "@kbn/core-elasticsearch-client-server-mocks", + "scope": "common", + "docId": "kibKbnCoreElasticsearchClientServerMocksPluginApi", + "section": "def-common.ClientApiMockInstance", + "text": "ClientApiMockInstance" + }, + ", [params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined]>; existsSource: ", { "pluginId": "@kbn/core-elasticsearch-client-server-mocks", "scope": "common", diff --git a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx index df7fc1e1d26f9..231b407e8b42a 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-mocks'] --- import kbnCoreElasticsearchClientServerMocksObj from './kbn_core_elasticsearch_client_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server.devdocs.json b/api_docs/kbn_core_elasticsearch_server.devdocs.json index ee492a19564d3..0840316d37b04 100644 --- a/api_docs/kbn_core_elasticsearch_server.devdocs.json +++ b/api_docs/kbn_core_elasticsearch_server.devdocs.json @@ -974,7 +974,7 @@ "Headers used for authentication against Elasticsearch" ], "signature": [ - "{ date?: string | string[] | undefined; range?: string | string[] | undefined; warning?: string | string[] | undefined; location?: string | string[] | undefined; from?: string | string[] | undefined; etag?: string | string[] | undefined; accept?: string | string[] | undefined; \"accept-language\"?: string | string[] | undefined; \"accept-patch\"?: string | string[] | undefined; \"accept-ranges\"?: string | string[] | undefined; \"access-control-allow-credentials\"?: string | string[] | undefined; \"access-control-allow-headers\"?: string | string[] | undefined; \"access-control-allow-methods\"?: string | string[] | undefined; \"access-control-allow-origin\"?: string | string[] | undefined; \"access-control-expose-headers\"?: string | string[] | undefined; \"access-control-max-age\"?: string | string[] | undefined; \"access-control-request-headers\"?: string | string[] | undefined; \"access-control-request-method\"?: string | string[] | undefined; age?: string | string[] | undefined; allow?: string | string[] | undefined; \"alt-svc\"?: string | string[] | undefined; authorization?: string | string[] | undefined; \"cache-control\"?: string | string[] | undefined; connection?: string | string[] | undefined; \"content-disposition\"?: string | string[] | undefined; \"content-encoding\"?: string | string[] | undefined; \"content-language\"?: string | string[] | undefined; \"content-length\"?: string | string[] | undefined; \"content-location\"?: string | string[] | undefined; \"content-range\"?: string | string[] | undefined; \"content-type\"?: string | string[] | undefined; cookie?: string | string[] | undefined; expect?: string | string[] | undefined; expires?: string | string[] | undefined; forwarded?: string | string[] | undefined; host?: string | string[] | undefined; \"if-match\"?: string | string[] | undefined; \"if-modified-since\"?: string | string[] | undefined; \"if-none-match\"?: string | string[] | undefined; \"if-unmodified-since\"?: string | string[] | undefined; \"last-modified\"?: string | string[] | undefined; origin?: string | string[] | undefined; pragma?: string | string[] | undefined; \"proxy-authenticate\"?: string | string[] | undefined; \"proxy-authorization\"?: string | string[] | undefined; \"public-key-pins\"?: string | string[] | undefined; referer?: string | string[] | undefined; \"retry-after\"?: string | string[] | undefined; \"sec-websocket-accept\"?: string | string[] | undefined; \"sec-websocket-extensions\"?: string | string[] | undefined; \"sec-websocket-key\"?: string | string[] | undefined; \"sec-websocket-protocol\"?: string | string[] | undefined; \"sec-websocket-version\"?: string | string[] | undefined; \"set-cookie\"?: string | string[] | undefined; \"strict-transport-security\"?: string | string[] | undefined; tk?: string | string[] | undefined; trailer?: string | string[] | undefined; \"transfer-encoding\"?: string | string[] | undefined; upgrade?: string | string[] | undefined; \"user-agent\"?: string | string[] | undefined; vary?: string | string[] | undefined; via?: string | string[] | undefined; \"www-authenticate\"?: string | string[] | undefined; } & { [header: string]: string | string[] | undefined; }" + "{ date?: string | string[] | undefined; warning?: string | string[] | undefined; location?: string | string[] | undefined; from?: string | string[] | undefined; etag?: string | string[] | undefined; accept?: string | string[] | undefined; \"accept-language\"?: string | string[] | undefined; \"accept-patch\"?: string | string[] | undefined; \"accept-ranges\"?: string | string[] | undefined; \"access-control-allow-credentials\"?: string | string[] | undefined; \"access-control-allow-headers\"?: string | string[] | undefined; \"access-control-allow-methods\"?: string | string[] | undefined; \"access-control-allow-origin\"?: string | string[] | undefined; \"access-control-expose-headers\"?: string | string[] | undefined; \"access-control-max-age\"?: string | string[] | undefined; \"access-control-request-headers\"?: string | string[] | undefined; \"access-control-request-method\"?: string | string[] | undefined; age?: string | string[] | undefined; allow?: string | string[] | undefined; \"alt-svc\"?: string | string[] | undefined; authorization?: string | string[] | undefined; \"cache-control\"?: string | string[] | undefined; connection?: string | string[] | undefined; \"content-disposition\"?: string | string[] | undefined; \"content-encoding\"?: string | string[] | undefined; \"content-language\"?: string | string[] | undefined; \"content-length\"?: string | string[] | undefined; \"content-location\"?: string | string[] | undefined; \"content-range\"?: string | string[] | undefined; \"content-type\"?: string | string[] | undefined; cookie?: string | string[] | undefined; expect?: string | string[] | undefined; expires?: string | string[] | undefined; forwarded?: string | string[] | undefined; host?: string | string[] | undefined; \"if-match\"?: string | string[] | undefined; \"if-modified-since\"?: string | string[] | undefined; \"if-none-match\"?: string | string[] | undefined; \"if-unmodified-since\"?: string | string[] | undefined; \"last-modified\"?: string | string[] | undefined; origin?: string | string[] | undefined; pragma?: string | string[] | undefined; \"proxy-authenticate\"?: string | string[] | undefined; \"proxy-authorization\"?: string | string[] | undefined; \"public-key-pins\"?: string | string[] | undefined; range?: string | string[] | undefined; referer?: string | string[] | undefined; \"retry-after\"?: string | string[] | undefined; \"sec-websocket-accept\"?: string | string[] | undefined; \"sec-websocket-extensions\"?: string | string[] | undefined; \"sec-websocket-key\"?: string | string[] | undefined; \"sec-websocket-protocol\"?: string | string[] | undefined; \"sec-websocket-version\"?: string | string[] | undefined; \"set-cookie\"?: string | string[] | undefined; \"strict-transport-security\"?: string | string[] | undefined; tk?: string | string[] | undefined; trailer?: string | string[] | undefined; \"transfer-encoding\"?: string | string[] | undefined; upgrade?: string | string[] | undefined; \"user-agent\"?: string | string[] | undefined; vary?: string | string[] | undefined; via?: string | string[] | undefined; \"www-authenticate\"?: string | string[] | undefined; } & { [header: string]: string | string[] | undefined; }" ], "path": "packages/core/elasticsearch/core-elasticsearch-server/src/client/scopeable_request.ts", "deprecated": false, @@ -1174,27 +1174,7 @@ "TransportRequestOptions", " | undefined): Promise<", "CountResponse", - ">; }; exists: { (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithOutMeta", - " | undefined): Promise; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithMeta", - " | undefined): Promise<", - "TransportResult", - ">; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined): Promise; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", + ">; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", "default", "; child: (opts: ", "ClientOptions", @@ -1372,7 +1352,27 @@ "default", "; eql: ", "default", - "; existsSource: { (this: That, params: ", + "; exists: { (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; existsSource: { (this: That, params: ", "ExistsSourceRequest", " | ", "ExistsSourceRequest", @@ -2840,27 +2840,7 @@ "TransportRequestOptions", " | undefined): Promise<", "CountResponse", - ">; }; exists: { (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithOutMeta", - " | undefined): Promise; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithMeta", - " | undefined): Promise<", - "TransportResult", - ">; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined): Promise; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", + ">; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", "default", "; child: (opts: ", "ClientOptions", @@ -3038,7 +3018,27 @@ "default", "; eql: ", "default", - "; existsSource: { (this: That, params: ", + "; exists: { (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; existsSource: { (this: That, params: ", "ExistsSourceRequest", " | ", "ExistsSourceRequest", @@ -4042,27 +4042,7 @@ "TransportRequestOptions", " | undefined): Promise<", "CountResponse", - ">; }; exists: { (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithOutMeta", - " | undefined): Promise; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithMeta", - " | undefined): Promise<", - "TransportResult", - ">; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined): Promise; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", + ">; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", "default", "; child: (opts: ", "ClientOptions", @@ -4240,7 +4220,27 @@ "default", "; eql: ", "default", - "; existsSource: { (this: That, params: ", + "; exists: { (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; existsSource: { (this: That, params: ", "ExistsSourceRequest", " | ", "ExistsSourceRequest", @@ -5497,27 +5497,7 @@ "TransportRequestOptions", " | undefined): Promise<", "CountResponse", - ">; }; exists: { (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithOutMeta", - " | undefined): Promise; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithMeta", - " | undefined): Promise<", - "TransportResult", - ">; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined): Promise; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", + ">; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", "default", "; child: (opts: ", "ClientOptions", @@ -5695,7 +5675,27 @@ "default", "; eql: ", "default", - "; existsSource: { (this: That, params: ", + "; exists: { (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; existsSource: { (this: That, params: ", "ExistsSourceRequest", " | ", "ExistsSourceRequest", diff --git a/api_docs/kbn_core_elasticsearch_server.mdx b/api_docs/kbn_core_elasticsearch_server.mdx index 804495ccbf1c1..7d0300d8066e0 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server'] --- import kbnCoreElasticsearchServerObj from './kbn_core_elasticsearch_server.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_internal.devdocs.json b/api_docs/kbn_core_elasticsearch_server_internal.devdocs.json index 96c31bba82765..9ebc07db2ec22 100644 --- a/api_docs/kbn_core_elasticsearch_server_internal.devdocs.json +++ b/api_docs/kbn_core_elasticsearch_server_internal.devdocs.json @@ -228,27 +228,7 @@ "TransportRequestOptions", " | undefined): Promise<", "CountResponse", - ">; }; exists: { (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithOutMeta", - " | undefined): Promise; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithMeta", - " | undefined): Promise<", - "TransportResult", - ">; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined): Promise; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", + ">; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", "default", "; child: (opts: ", "ClientOptions", @@ -426,7 +406,27 @@ "default", "; eql: ", "default", - "; existsSource: { (this: That, params: ", + "; exists: { (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; existsSource: { (this: That, params: ", "ExistsSourceRequest", " | ", "ExistsSourceRequest", @@ -1858,27 +1858,7 @@ "TransportRequestOptions", " | undefined): Promise<", "CountResponse", - ">; }; exists: { (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithOutMeta", - " | undefined): Promise; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithMeta", - " | undefined): Promise<", - "TransportResult", - ">; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined): Promise; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", + ">; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", "default", "; child: (opts: ", "ClientOptions", @@ -2056,7 +2036,27 @@ "default", "; eql: ", "default", - "; existsSource: { (this: That, params: ", + "; exists: { (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; existsSource: { (this: That, params: ", "ExistsSourceRequest", " | ", "ExistsSourceRequest", diff --git a/api_docs/kbn_core_elasticsearch_server_internal.mdx b/api_docs/kbn_core_elasticsearch_server_internal.mdx index 74258538ff9e1..d386855762787 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-internal'] --- import kbnCoreElasticsearchServerInternalObj from './kbn_core_elasticsearch_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_server_mocks.mdx index 3bc56e95f081f..0c2ef2fc5c171 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server-mocks'] --- import kbnCoreElasticsearchServerMocksObj from './kbn_core_elasticsearch_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_internal.mdx b/api_docs/kbn_core_environment_server_internal.mdx index 49e5db0bd7b56..56f6cb0497374 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-internal'] --- import kbnCoreEnvironmentServerInternalObj from './kbn_core_environment_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_environment_server_mocks.mdx b/api_docs/kbn_core_environment_server_mocks.mdx index baf877b08ecf7..1858d37ed7ade 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-environment-server-mocks'] --- import kbnCoreEnvironmentServerMocksObj from './kbn_core_environment_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser.mdx b/api_docs/kbn_core_execution_context_browser.mdx index a1c30edc5ff46..20d404cd9aaac 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser'] --- import kbnCoreExecutionContextBrowserObj from './kbn_core_execution_context_browser.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_internal.mdx b/api_docs/kbn_core_execution_context_browser_internal.mdx index 6c7703e4a4b6e..1ab3c499fa256 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-internal'] --- import kbnCoreExecutionContextBrowserInternalObj from './kbn_core_execution_context_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_browser_mocks.mdx b/api_docs/kbn_core_execution_context_browser_mocks.mdx index cd15dd6255b83..e095e850ff763 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-browser-mocks'] --- import kbnCoreExecutionContextBrowserMocksObj from './kbn_core_execution_context_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_common.mdx b/api_docs/kbn_core_execution_context_common.mdx index 71a9d8bbf4470..5bda9cd26bb00 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-common'] --- import kbnCoreExecutionContextCommonObj from './kbn_core_execution_context_common.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server.mdx b/api_docs/kbn_core_execution_context_server.mdx index 87637a3c30c97..98e8da657fe8b 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server'] --- import kbnCoreExecutionContextServerObj from './kbn_core_execution_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_internal.mdx b/api_docs/kbn_core_execution_context_server_internal.mdx index 8a712a2a5d15c..95fb2a3153fdf 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-internal'] --- import kbnCoreExecutionContextServerInternalObj from './kbn_core_execution_context_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_execution_context_server_mocks.mdx b/api_docs/kbn_core_execution_context_server_mocks.mdx index b0b61230cb7b6..acf3e5f3c8c32 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-execution-context-server-mocks'] --- import kbnCoreExecutionContextServerMocksObj from './kbn_core_execution_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser.mdx b/api_docs/kbn_core_fatal_errors_browser.mdx index c517b4468a481..5524c5641e7fb 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser'] --- import kbnCoreFatalErrorsBrowserObj from './kbn_core_fatal_errors_browser.devdocs.json'; diff --git a/api_docs/kbn_core_fatal_errors_browser_mocks.mdx b/api_docs/kbn_core_fatal_errors_browser_mocks.mdx index 909eb7eb6e1d8..bba38d68cd63d 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-fatal-errors-browser-mocks'] --- import kbnCoreFatalErrorsBrowserMocksObj from './kbn_core_fatal_errors_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser.mdx b/api_docs/kbn_core_http_browser.mdx index 4e63e73eb6229..8e3bee868bef9 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser'] --- import kbnCoreHttpBrowserObj from './kbn_core_http_browser.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_internal.mdx b/api_docs/kbn_core_http_browser_internal.mdx index 66586c0b23061..fd2b7f5817f1b 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-internal'] --- import kbnCoreHttpBrowserInternalObj from './kbn_core_http_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_browser_mocks.mdx b/api_docs/kbn_core_http_browser_mocks.mdx index ba622573d7094..a5eb68ff7d3ce 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-browser-mocks'] --- import kbnCoreHttpBrowserMocksObj from './kbn_core_http_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_common.mdx b/api_docs/kbn_core_http_common.mdx index fb60f3e84497b..d9accbd5fda7a 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-common'] --- import kbnCoreHttpCommonObj from './kbn_core_http_common.devdocs.json'; diff --git a/api_docs/kbn_core_http_context_server_mocks.mdx b/api_docs/kbn_core_http_context_server_mocks.mdx index 71187db72c56f..004af5b279076 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-context-server-mocks'] --- import kbnCoreHttpContextServerMocksObj from './kbn_core_http_context_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_request_handler_context_server.mdx b/api_docs/kbn_core_http_request_handler_context_server.mdx index b5de6010fe42f..74246e6ad2bf1 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-request-handler-context-server'] --- import kbnCoreHttpRequestHandlerContextServerObj from './kbn_core_http_request_handler_context_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server.mdx b/api_docs/kbn_core_http_resources_server.mdx index 08a0d3945eec0..f5eff63e2d524 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server'] --- import kbnCoreHttpResourcesServerObj from './kbn_core_http_resources_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_internal.mdx b/api_docs/kbn_core_http_resources_server_internal.mdx index 5544bb851ed3e..fbd96b900f714 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-internal'] --- import kbnCoreHttpResourcesServerInternalObj from './kbn_core_http_resources_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_resources_server_mocks.mdx b/api_docs/kbn_core_http_resources_server_mocks.mdx index 8a3da9918cfc2..b9d44a1254371 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-resources-server-mocks'] --- import kbnCoreHttpResourcesServerMocksObj from './kbn_core_http_resources_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_internal.mdx b/api_docs/kbn_core_http_router_server_internal.mdx index 26235f12fc1f4..61e6288d273b5 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-internal'] --- import kbnCoreHttpRouterServerInternalObj from './kbn_core_http_router_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_router_server_mocks.mdx b/api_docs/kbn_core_http_router_server_mocks.mdx index 3fa33775c6449..2e98f0d9f454b 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-router-server-mocks'] --- import kbnCoreHttpRouterServerMocksObj from './kbn_core_http_router_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_http_server.devdocs.json b/api_docs/kbn_core_http_server.devdocs.json index f9faf5a74ef10..3ef6e53b436a5 100644 --- a/api_docs/kbn_core_http_server.devdocs.json +++ b/api_docs/kbn_core_http_server.devdocs.json @@ -746,7 +746,7 @@ "The headers associated with the request." ], "signature": [ - "{ date?: string | string[] | undefined; range?: string | string[] | undefined; warning?: string | string[] | undefined; location?: string | string[] | undefined; from?: string | string[] | undefined; etag?: string | string[] | undefined; accept?: string | string[] | undefined; \"accept-language\"?: string | string[] | undefined; \"accept-patch\"?: string | string[] | undefined; \"accept-ranges\"?: string | string[] | undefined; \"access-control-allow-credentials\"?: string | string[] | undefined; \"access-control-allow-headers\"?: string | string[] | undefined; \"access-control-allow-methods\"?: string | string[] | undefined; \"access-control-allow-origin\"?: string | string[] | undefined; \"access-control-expose-headers\"?: string | string[] | undefined; \"access-control-max-age\"?: string | string[] | undefined; \"access-control-request-headers\"?: string | string[] | undefined; \"access-control-request-method\"?: string | string[] | undefined; age?: string | string[] | undefined; allow?: string | string[] | undefined; \"alt-svc\"?: string | string[] | undefined; authorization?: string | string[] | undefined; \"cache-control\"?: string | string[] | undefined; connection?: string | string[] | undefined; \"content-disposition\"?: string | string[] | undefined; \"content-encoding\"?: string | string[] | undefined; \"content-language\"?: string | string[] | undefined; \"content-length\"?: string | string[] | undefined; \"content-location\"?: string | string[] | undefined; \"content-range\"?: string | string[] | undefined; \"content-type\"?: string | string[] | undefined; cookie?: string | string[] | undefined; expect?: string | string[] | undefined; expires?: string | string[] | undefined; forwarded?: string | string[] | undefined; host?: string | string[] | undefined; \"if-match\"?: string | string[] | undefined; \"if-modified-since\"?: string | string[] | undefined; \"if-none-match\"?: string | string[] | undefined; \"if-unmodified-since\"?: string | string[] | undefined; \"last-modified\"?: string | string[] | undefined; origin?: string | string[] | undefined; pragma?: string | string[] | undefined; \"proxy-authenticate\"?: string | string[] | undefined; \"proxy-authorization\"?: string | string[] | undefined; \"public-key-pins\"?: string | string[] | undefined; referer?: string | string[] | undefined; \"retry-after\"?: string | string[] | undefined; \"sec-websocket-accept\"?: string | string[] | undefined; \"sec-websocket-extensions\"?: string | string[] | undefined; \"sec-websocket-key\"?: string | string[] | undefined; \"sec-websocket-protocol\"?: string | string[] | undefined; \"sec-websocket-version\"?: string | string[] | undefined; \"set-cookie\"?: string | string[] | undefined; \"strict-transport-security\"?: string | string[] | undefined; tk?: string | string[] | undefined; trailer?: string | string[] | undefined; \"transfer-encoding\"?: string | string[] | undefined; upgrade?: string | string[] | undefined; \"user-agent\"?: string | string[] | undefined; vary?: string | string[] | undefined; via?: string | string[] | undefined; \"www-authenticate\"?: string | string[] | undefined; } & { [header: string]: string | string[] | undefined; }" + "{ date?: string | string[] | undefined; warning?: string | string[] | undefined; location?: string | string[] | undefined; from?: string | string[] | undefined; etag?: string | string[] | undefined; accept?: string | string[] | undefined; \"accept-language\"?: string | string[] | undefined; \"accept-patch\"?: string | string[] | undefined; \"accept-ranges\"?: string | string[] | undefined; \"access-control-allow-credentials\"?: string | string[] | undefined; \"access-control-allow-headers\"?: string | string[] | undefined; \"access-control-allow-methods\"?: string | string[] | undefined; \"access-control-allow-origin\"?: string | string[] | undefined; \"access-control-expose-headers\"?: string | string[] | undefined; \"access-control-max-age\"?: string | string[] | undefined; \"access-control-request-headers\"?: string | string[] | undefined; \"access-control-request-method\"?: string | string[] | undefined; age?: string | string[] | undefined; allow?: string | string[] | undefined; \"alt-svc\"?: string | string[] | undefined; authorization?: string | string[] | undefined; \"cache-control\"?: string | string[] | undefined; connection?: string | string[] | undefined; \"content-disposition\"?: string | string[] | undefined; \"content-encoding\"?: string | string[] | undefined; \"content-language\"?: string | string[] | undefined; \"content-length\"?: string | string[] | undefined; \"content-location\"?: string | string[] | undefined; \"content-range\"?: string | string[] | undefined; \"content-type\"?: string | string[] | undefined; cookie?: string | string[] | undefined; expect?: string | string[] | undefined; expires?: string | string[] | undefined; forwarded?: string | string[] | undefined; host?: string | string[] | undefined; \"if-match\"?: string | string[] | undefined; \"if-modified-since\"?: string | string[] | undefined; \"if-none-match\"?: string | string[] | undefined; \"if-unmodified-since\"?: string | string[] | undefined; \"last-modified\"?: string | string[] | undefined; origin?: string | string[] | undefined; pragma?: string | string[] | undefined; \"proxy-authenticate\"?: string | string[] | undefined; \"proxy-authorization\"?: string | string[] | undefined; \"public-key-pins\"?: string | string[] | undefined; range?: string | string[] | undefined; referer?: string | string[] | undefined; \"retry-after\"?: string | string[] | undefined; \"sec-websocket-accept\"?: string | string[] | undefined; \"sec-websocket-extensions\"?: string | string[] | undefined; \"sec-websocket-key\"?: string | string[] | undefined; \"sec-websocket-protocol\"?: string | string[] | undefined; \"sec-websocket-version\"?: string | string[] | undefined; \"set-cookie\"?: string | string[] | undefined; \"strict-transport-security\"?: string | string[] | undefined; tk?: string | string[] | undefined; trailer?: string | string[] | undefined; \"transfer-encoding\"?: string | string[] | undefined; upgrade?: string | string[] | undefined; \"user-agent\"?: string | string[] | undefined; vary?: string | string[] | undefined; via?: string | string[] | undefined; \"www-authenticate\"?: string | string[] | undefined; } & { [header: string]: string | string[] | undefined; }" ], "path": "packages/core/http/core-http-server/src/router/raw_request.ts", "deprecated": false, @@ -4699,7 +4699,7 @@ "\nReadonly copy of incoming request headers." ], "signature": [ - "{ date?: string | string[] | undefined; range?: string | string[] | undefined; warning?: string | string[] | undefined; location?: string | string[] | undefined; from?: string | string[] | undefined; etag?: string | string[] | undefined; accept?: string | string[] | undefined; \"accept-language\"?: string | string[] | undefined; \"accept-patch\"?: string | string[] | undefined; \"accept-ranges\"?: string | string[] | undefined; \"access-control-allow-credentials\"?: string | string[] | undefined; \"access-control-allow-headers\"?: string | string[] | undefined; \"access-control-allow-methods\"?: string | string[] | undefined; \"access-control-allow-origin\"?: string | string[] | undefined; \"access-control-expose-headers\"?: string | string[] | undefined; \"access-control-max-age\"?: string | string[] | undefined; \"access-control-request-headers\"?: string | string[] | undefined; \"access-control-request-method\"?: string | string[] | undefined; age?: string | string[] | undefined; allow?: string | string[] | undefined; \"alt-svc\"?: string | string[] | undefined; authorization?: string | string[] | undefined; \"cache-control\"?: string | string[] | undefined; connection?: string | string[] | undefined; \"content-disposition\"?: string | string[] | undefined; \"content-encoding\"?: string | string[] | undefined; \"content-language\"?: string | string[] | undefined; \"content-length\"?: string | string[] | undefined; \"content-location\"?: string | string[] | undefined; \"content-range\"?: string | string[] | undefined; \"content-type\"?: string | string[] | undefined; cookie?: string | string[] | undefined; expect?: string | string[] | undefined; expires?: string | string[] | undefined; forwarded?: string | string[] | undefined; host?: string | string[] | undefined; \"if-match\"?: string | string[] | undefined; \"if-modified-since\"?: string | string[] | undefined; \"if-none-match\"?: string | string[] | undefined; \"if-unmodified-since\"?: string | string[] | undefined; \"last-modified\"?: string | string[] | undefined; origin?: string | string[] | undefined; pragma?: string | string[] | undefined; \"proxy-authenticate\"?: string | string[] | undefined; \"proxy-authorization\"?: string | string[] | undefined; \"public-key-pins\"?: string | string[] | undefined; referer?: string | string[] | undefined; \"retry-after\"?: string | string[] | undefined; \"sec-websocket-accept\"?: string | string[] | undefined; \"sec-websocket-extensions\"?: string | string[] | undefined; \"sec-websocket-key\"?: string | string[] | undefined; \"sec-websocket-protocol\"?: string | string[] | undefined; \"sec-websocket-version\"?: string | string[] | undefined; \"set-cookie\"?: string | string[] | undefined; \"strict-transport-security\"?: string | string[] | undefined; tk?: string | string[] | undefined; trailer?: string | string[] | undefined; \"transfer-encoding\"?: string | string[] | undefined; upgrade?: string | string[] | undefined; \"user-agent\"?: string | string[] | undefined; vary?: string | string[] | undefined; via?: string | string[] | undefined; \"www-authenticate\"?: string | string[] | undefined; } & { [header: string]: string | string[] | undefined; }" + "{ date?: string | string[] | undefined; warning?: string | string[] | undefined; location?: string | string[] | undefined; from?: string | string[] | undefined; etag?: string | string[] | undefined; accept?: string | string[] | undefined; \"accept-language\"?: string | string[] | undefined; \"accept-patch\"?: string | string[] | undefined; \"accept-ranges\"?: string | string[] | undefined; \"access-control-allow-credentials\"?: string | string[] | undefined; \"access-control-allow-headers\"?: string | string[] | undefined; \"access-control-allow-methods\"?: string | string[] | undefined; \"access-control-allow-origin\"?: string | string[] | undefined; \"access-control-expose-headers\"?: string | string[] | undefined; \"access-control-max-age\"?: string | string[] | undefined; \"access-control-request-headers\"?: string | string[] | undefined; \"access-control-request-method\"?: string | string[] | undefined; age?: string | string[] | undefined; allow?: string | string[] | undefined; \"alt-svc\"?: string | string[] | undefined; authorization?: string | string[] | undefined; \"cache-control\"?: string | string[] | undefined; connection?: string | string[] | undefined; \"content-disposition\"?: string | string[] | undefined; \"content-encoding\"?: string | string[] | undefined; \"content-language\"?: string | string[] | undefined; \"content-length\"?: string | string[] | undefined; \"content-location\"?: string | string[] | undefined; \"content-range\"?: string | string[] | undefined; \"content-type\"?: string | string[] | undefined; cookie?: string | string[] | undefined; expect?: string | string[] | undefined; expires?: string | string[] | undefined; forwarded?: string | string[] | undefined; host?: string | string[] | undefined; \"if-match\"?: string | string[] | undefined; \"if-modified-since\"?: string | string[] | undefined; \"if-none-match\"?: string | string[] | undefined; \"if-unmodified-since\"?: string | string[] | undefined; \"last-modified\"?: string | string[] | undefined; origin?: string | string[] | undefined; pragma?: string | string[] | undefined; \"proxy-authenticate\"?: string | string[] | undefined; \"proxy-authorization\"?: string | string[] | undefined; \"public-key-pins\"?: string | string[] | undefined; range?: string | string[] | undefined; referer?: string | string[] | undefined; \"retry-after\"?: string | string[] | undefined; \"sec-websocket-accept\"?: string | string[] | undefined; \"sec-websocket-extensions\"?: string | string[] | undefined; \"sec-websocket-key\"?: string | string[] | undefined; \"sec-websocket-protocol\"?: string | string[] | undefined; \"sec-websocket-version\"?: string | string[] | undefined; \"set-cookie\"?: string | string[] | undefined; \"strict-transport-security\"?: string | string[] | undefined; tk?: string | string[] | undefined; trailer?: string | string[] | undefined; \"transfer-encoding\"?: string | string[] | undefined; upgrade?: string | string[] | undefined; \"user-agent\"?: string | string[] | undefined; vary?: string | string[] | undefined; via?: string | string[] | undefined; \"www-authenticate\"?: string | string[] | undefined; } & { [header: string]: string | string[] | undefined; }" ], "path": "packages/core/http/core-http-server/src/router/request.ts", "deprecated": false, @@ -8206,7 +8206,7 @@ "\nHttp request headers to read." ], "signature": [ - "{ date?: string | string[] | undefined; range?: string | string[] | undefined; warning?: string | string[] | undefined; location?: string | string[] | undefined; from?: string | string[] | undefined; etag?: string | string[] | undefined; accept?: string | string[] | undefined; \"accept-language\"?: string | string[] | undefined; \"accept-patch\"?: string | string[] | undefined; \"accept-ranges\"?: string | string[] | undefined; \"access-control-allow-credentials\"?: string | string[] | undefined; \"access-control-allow-headers\"?: string | string[] | undefined; \"access-control-allow-methods\"?: string | string[] | undefined; \"access-control-allow-origin\"?: string | string[] | undefined; \"access-control-expose-headers\"?: string | string[] | undefined; \"access-control-max-age\"?: string | string[] | undefined; \"access-control-request-headers\"?: string | string[] | undefined; \"access-control-request-method\"?: string | string[] | undefined; age?: string | string[] | undefined; allow?: string | string[] | undefined; \"alt-svc\"?: string | string[] | undefined; authorization?: string | string[] | undefined; \"cache-control\"?: string | string[] | undefined; connection?: string | string[] | undefined; \"content-disposition\"?: string | string[] | undefined; \"content-encoding\"?: string | string[] | undefined; \"content-language\"?: string | string[] | undefined; \"content-length\"?: string | string[] | undefined; \"content-location\"?: string | string[] | undefined; \"content-range\"?: string | string[] | undefined; \"content-type\"?: string | string[] | undefined; cookie?: string | string[] | undefined; expect?: string | string[] | undefined; expires?: string | string[] | undefined; forwarded?: string | string[] | undefined; host?: string | string[] | undefined; \"if-match\"?: string | string[] | undefined; \"if-modified-since\"?: string | string[] | undefined; \"if-none-match\"?: string | string[] | undefined; \"if-unmodified-since\"?: string | string[] | undefined; \"last-modified\"?: string | string[] | undefined; origin?: string | string[] | undefined; pragma?: string | string[] | undefined; \"proxy-authenticate\"?: string | string[] | undefined; \"proxy-authorization\"?: string | string[] | undefined; \"public-key-pins\"?: string | string[] | undefined; referer?: string | string[] | undefined; \"retry-after\"?: string | string[] | undefined; \"sec-websocket-accept\"?: string | string[] | undefined; \"sec-websocket-extensions\"?: string | string[] | undefined; \"sec-websocket-key\"?: string | string[] | undefined; \"sec-websocket-protocol\"?: string | string[] | undefined; \"sec-websocket-version\"?: string | string[] | undefined; \"set-cookie\"?: string | string[] | undefined; \"strict-transport-security\"?: string | string[] | undefined; tk?: string | string[] | undefined; trailer?: string | string[] | undefined; \"transfer-encoding\"?: string | string[] | undefined; upgrade?: string | string[] | undefined; \"user-agent\"?: string | string[] | undefined; vary?: string | string[] | undefined; via?: string | string[] | undefined; \"www-authenticate\"?: string | string[] | undefined; } & { [header: string]: string | string[] | undefined; }" + "{ date?: string | string[] | undefined; warning?: string | string[] | undefined; location?: string | string[] | undefined; from?: string | string[] | undefined; etag?: string | string[] | undefined; accept?: string | string[] | undefined; \"accept-language\"?: string | string[] | undefined; \"accept-patch\"?: string | string[] | undefined; \"accept-ranges\"?: string | string[] | undefined; \"access-control-allow-credentials\"?: string | string[] | undefined; \"access-control-allow-headers\"?: string | string[] | undefined; \"access-control-allow-methods\"?: string | string[] | undefined; \"access-control-allow-origin\"?: string | string[] | undefined; \"access-control-expose-headers\"?: string | string[] | undefined; \"access-control-max-age\"?: string | string[] | undefined; \"access-control-request-headers\"?: string | string[] | undefined; \"access-control-request-method\"?: string | string[] | undefined; age?: string | string[] | undefined; allow?: string | string[] | undefined; \"alt-svc\"?: string | string[] | undefined; authorization?: string | string[] | undefined; \"cache-control\"?: string | string[] | undefined; connection?: string | string[] | undefined; \"content-disposition\"?: string | string[] | undefined; \"content-encoding\"?: string | string[] | undefined; \"content-language\"?: string | string[] | undefined; \"content-length\"?: string | string[] | undefined; \"content-location\"?: string | string[] | undefined; \"content-range\"?: string | string[] | undefined; \"content-type\"?: string | string[] | undefined; cookie?: string | string[] | undefined; expect?: string | string[] | undefined; expires?: string | string[] | undefined; forwarded?: string | string[] | undefined; host?: string | string[] | undefined; \"if-match\"?: string | string[] | undefined; \"if-modified-since\"?: string | string[] | undefined; \"if-none-match\"?: string | string[] | undefined; \"if-unmodified-since\"?: string | string[] | undefined; \"last-modified\"?: string | string[] | undefined; origin?: string | string[] | undefined; pragma?: string | string[] | undefined; \"proxy-authenticate\"?: string | string[] | undefined; \"proxy-authorization\"?: string | string[] | undefined; \"public-key-pins\"?: string | string[] | undefined; range?: string | string[] | undefined; referer?: string | string[] | undefined; \"retry-after\"?: string | string[] | undefined; \"sec-websocket-accept\"?: string | string[] | undefined; \"sec-websocket-extensions\"?: string | string[] | undefined; \"sec-websocket-key\"?: string | string[] | undefined; \"sec-websocket-protocol\"?: string | string[] | undefined; \"sec-websocket-version\"?: string | string[] | undefined; \"set-cookie\"?: string | string[] | undefined; \"strict-transport-security\"?: string | string[] | undefined; tk?: string | string[] | undefined; trailer?: string | string[] | undefined; \"transfer-encoding\"?: string | string[] | undefined; upgrade?: string | string[] | undefined; \"user-agent\"?: string | string[] | undefined; vary?: string | string[] | undefined; via?: string | string[] | undefined; \"www-authenticate\"?: string | string[] | undefined; } & { [header: string]: string | string[] | undefined; }" ], "path": "packages/core/http/core-http-server/src/router/headers.ts", "deprecated": false, @@ -8512,7 +8512,7 @@ "\nSet of well-known HTTP headers." ], "signature": [ - "\"date\" | \"range\" | \"warning\" | \"location\" | \"from\" | \"etag\" | \"accept\" | \"accept-language\" | \"accept-patch\" | \"accept-ranges\" | \"access-control-allow-credentials\" | \"access-control-allow-headers\" | \"access-control-allow-methods\" | \"access-control-allow-origin\" | \"access-control-expose-headers\" | \"access-control-max-age\" | \"access-control-request-headers\" | \"access-control-request-method\" | \"age\" | \"allow\" | \"alt-svc\" | \"authorization\" | \"cache-control\" | \"connection\" | \"content-disposition\" | \"content-encoding\" | \"content-language\" | \"content-length\" | \"content-location\" | \"content-range\" | \"content-type\" | \"cookie\" | \"expect\" | \"expires\" | \"forwarded\" | \"host\" | \"if-match\" | \"if-modified-since\" | \"if-none-match\" | \"if-unmodified-since\" | \"last-modified\" | \"origin\" | \"pragma\" | \"proxy-authenticate\" | \"proxy-authorization\" | \"public-key-pins\" | \"referer\" | \"retry-after\" | \"sec-websocket-accept\" | \"sec-websocket-extensions\" | \"sec-websocket-key\" | \"sec-websocket-protocol\" | \"sec-websocket-version\" | \"set-cookie\" | \"strict-transport-security\" | \"tk\" | \"trailer\" | \"transfer-encoding\" | \"upgrade\" | \"user-agent\" | \"vary\" | \"via\" | \"www-authenticate\"" + "\"date\" | \"warning\" | \"location\" | \"from\" | \"etag\" | \"accept\" | \"accept-language\" | \"accept-patch\" | \"accept-ranges\" | \"access-control-allow-credentials\" | \"access-control-allow-headers\" | \"access-control-allow-methods\" | \"access-control-allow-origin\" | \"access-control-expose-headers\" | \"access-control-max-age\" | \"access-control-request-headers\" | \"access-control-request-method\" | \"age\" | \"allow\" | \"alt-svc\" | \"authorization\" | \"cache-control\" | \"connection\" | \"content-disposition\" | \"content-encoding\" | \"content-language\" | \"content-length\" | \"content-location\" | \"content-range\" | \"content-type\" | \"cookie\" | \"expect\" | \"expires\" | \"forwarded\" | \"host\" | \"if-match\" | \"if-modified-since\" | \"if-none-match\" | \"if-unmodified-since\" | \"last-modified\" | \"origin\" | \"pragma\" | \"proxy-authenticate\" | \"proxy-authorization\" | \"public-key-pins\" | \"range\" | \"referer\" | \"retry-after\" | \"sec-websocket-accept\" | \"sec-websocket-extensions\" | \"sec-websocket-key\" | \"sec-websocket-protocol\" | \"sec-websocket-version\" | \"set-cookie\" | \"strict-transport-security\" | \"tk\" | \"trailer\" | \"transfer-encoding\" | \"upgrade\" | \"user-agent\" | \"vary\" | \"via\" | \"www-authenticate\"" ], "path": "packages/core/http/core-http-server/src/router/headers.ts", "deprecated": false, @@ -9618,7 +9618,7 @@ "\nHttp response headers to set." ], "signature": [ - "Record | Record<\"date\" | \"range\" | \"warning\" | \"location\" | \"from\" | \"etag\" | \"accept\" | \"accept-language\" | \"accept-patch\" | \"accept-ranges\" | \"access-control-allow-credentials\" | \"access-control-allow-headers\" | \"access-control-allow-methods\" | \"access-control-allow-origin\" | \"access-control-expose-headers\" | \"access-control-max-age\" | \"access-control-request-headers\" | \"access-control-request-method\" | \"age\" | \"allow\" | \"alt-svc\" | \"authorization\" | \"cache-control\" | \"connection\" | \"content-disposition\" | \"content-encoding\" | \"content-language\" | \"content-length\" | \"content-location\" | \"content-range\" | \"content-type\" | \"cookie\" | \"expect\" | \"expires\" | \"forwarded\" | \"host\" | \"if-match\" | \"if-modified-since\" | \"if-none-match\" | \"if-unmodified-since\" | \"last-modified\" | \"origin\" | \"pragma\" | \"proxy-authenticate\" | \"proxy-authorization\" | \"public-key-pins\" | \"referer\" | \"retry-after\" | \"sec-websocket-accept\" | \"sec-websocket-extensions\" | \"sec-websocket-key\" | \"sec-websocket-protocol\" | \"sec-websocket-version\" | \"set-cookie\" | \"strict-transport-security\" | \"tk\" | \"trailer\" | \"transfer-encoding\" | \"upgrade\" | \"user-agent\" | \"vary\" | \"via\" | \"www-authenticate\", string | string[]>" + "Record | Record<\"date\" | \"warning\" | \"location\" | \"from\" | \"etag\" | \"accept\" | \"accept-language\" | \"accept-patch\" | \"accept-ranges\" | \"access-control-allow-credentials\" | \"access-control-allow-headers\" | \"access-control-allow-methods\" | \"access-control-allow-origin\" | \"access-control-expose-headers\" | \"access-control-max-age\" | \"access-control-request-headers\" | \"access-control-request-method\" | \"age\" | \"allow\" | \"alt-svc\" | \"authorization\" | \"cache-control\" | \"connection\" | \"content-disposition\" | \"content-encoding\" | \"content-language\" | \"content-length\" | \"content-location\" | \"content-range\" | \"content-type\" | \"cookie\" | \"expect\" | \"expires\" | \"forwarded\" | \"host\" | \"if-match\" | \"if-modified-since\" | \"if-none-match\" | \"if-unmodified-since\" | \"last-modified\" | \"origin\" | \"pragma\" | \"proxy-authenticate\" | \"proxy-authorization\" | \"public-key-pins\" | \"range\" | \"referer\" | \"retry-after\" | \"sec-websocket-accept\" | \"sec-websocket-extensions\" | \"sec-websocket-key\" | \"sec-websocket-protocol\" | \"sec-websocket-version\" | \"set-cookie\" | \"strict-transport-security\" | \"tk\" | \"trailer\" | \"transfer-encoding\" | \"upgrade\" | \"user-agent\" | \"vary\" | \"via\" | \"www-authenticate\", string | string[]>" ], "path": "packages/core/http/core-http-server/src/router/headers.ts", "deprecated": false, diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index f3c4793310333..481a232faffeb 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server'] --- import kbnCoreHttpServerObj from './kbn_core_http_server.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_internal.mdx b/api_docs/kbn_core_http_server_internal.mdx index 0897cbf070493..849674f060360 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-internal'] --- import kbnCoreHttpServerInternalObj from './kbn_core_http_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_http_server_mocks.mdx b/api_docs/kbn_core_http_server_mocks.mdx index 1fed1ae674e8c..5c9b6dc347596 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-http-server-mocks'] --- import kbnCoreHttpServerMocksObj from './kbn_core_http_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser.mdx b/api_docs/kbn_core_i18n_browser.mdx index ccbc486656fcc..16717005b5bb2 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser'] --- import kbnCoreI18nBrowserObj from './kbn_core_i18n_browser.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_browser_mocks.mdx b/api_docs/kbn_core_i18n_browser_mocks.mdx index 6145c9e5c5faf..2331710fff5f6 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-browser-mocks'] --- import kbnCoreI18nBrowserMocksObj from './kbn_core_i18n_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server.mdx b/api_docs/kbn_core_i18n_server.mdx index 1d299f2ed7674..0128385e094b7 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server'] --- import kbnCoreI18nServerObj from './kbn_core_i18n_server.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_internal.mdx b/api_docs/kbn_core_i18n_server_internal.mdx index c5081ad8b16c9..45a0c4d3e2c8e 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-internal'] --- import kbnCoreI18nServerInternalObj from './kbn_core_i18n_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_i18n_server_mocks.mdx b/api_docs/kbn_core_i18n_server_mocks.mdx index 128163b5ece76..435a98c75a307 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-i18n-server-mocks'] --- import kbnCoreI18nServerMocksObj from './kbn_core_i18n_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_injected_metadata_browser_mocks.mdx b/api_docs/kbn_core_injected_metadata_browser_mocks.mdx index dc31f19091d10..fc60b8413d783 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-injected-metadata-browser-mocks'] --- import kbnCoreInjectedMetadataBrowserMocksObj from './kbn_core_injected_metadata_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_internal.mdx b/api_docs/kbn_core_integrations_browser_internal.mdx index 5af05c050db79..c24cef245d5ed 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-internal'] --- import kbnCoreIntegrationsBrowserInternalObj from './kbn_core_integrations_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_integrations_browser_mocks.mdx b/api_docs/kbn_core_integrations_browser_mocks.mdx index 012b767b464d5..dcb6c0adb2e81 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-integrations-browser-mocks'] --- import kbnCoreIntegrationsBrowserMocksObj from './kbn_core_integrations_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_browser.devdocs.json b/api_docs/kbn_core_lifecycle_browser.devdocs.json index 385975f4c6e4c..e2c28606cea12 100644 --- a/api_docs/kbn_core_lifecycle_browser.devdocs.json +++ b/api_docs/kbn_core_lifecycle_browser.devdocs.json @@ -813,10 +813,6 @@ "plugin": "cloudSecurityPosture", "path": "x-pack/plugins/cloud_security_posture/public/pages/rules/use_csp_rules.ts" }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/common/hooks/use_dashboard_button_href.ts" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/index.tsx" diff --git a/api_docs/kbn_core_lifecycle_browser.mdx b/api_docs/kbn_core_lifecycle_browser.mdx index 4e8644902e0b2..999772d9ae977 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser'] --- import kbnCoreLifecycleBrowserObj from './kbn_core_lifecycle_browser.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_browser_mocks.mdx b/api_docs/kbn_core_lifecycle_browser_mocks.mdx index 2f482cfc4525a..2a5512fbcdc91 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-browser-mocks'] --- import kbnCoreLifecycleBrowserMocksObj from './kbn_core_lifecycle_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server.mdx b/api_docs/kbn_core_lifecycle_server.mdx index b901eb448edf5..10bdf3429ae66 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server'] --- import kbnCoreLifecycleServerObj from './kbn_core_lifecycle_server.devdocs.json'; diff --git a/api_docs/kbn_core_lifecycle_server_mocks.mdx b/api_docs/kbn_core_lifecycle_server_mocks.mdx index 46cb8c8c142ef..b171338a3301c 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-lifecycle-server-mocks'] --- import kbnCoreLifecycleServerMocksObj from './kbn_core_lifecycle_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_browser_mocks.mdx b/api_docs/kbn_core_logging_browser_mocks.mdx index 54e47f0686bbf..f31bc3adf079e 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-browser-mocks'] --- import kbnCoreLoggingBrowserMocksObj from './kbn_core_logging_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_logging_common_internal.mdx b/api_docs/kbn_core_logging_common_internal.mdx index ae738e7e9e542..db54bddd07cf2 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-common-internal'] --- import kbnCoreLoggingCommonInternalObj from './kbn_core_logging_common_internal.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server.mdx b/api_docs/kbn_core_logging_server.mdx index 1d7b270aad656..f1a322676520b 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server'] --- import kbnCoreLoggingServerObj from './kbn_core_logging_server.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_internal.mdx b/api_docs/kbn_core_logging_server_internal.mdx index c2fbf4bbc276c..8b3f5cfed970d 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-internal'] --- import kbnCoreLoggingServerInternalObj from './kbn_core_logging_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_logging_server_mocks.mdx b/api_docs/kbn_core_logging_server_mocks.mdx index 599f5e3b031e8..f67f0808ba9a2 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-logging-server-mocks'] --- import kbnCoreLoggingServerMocksObj from './kbn_core_logging_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_internal.mdx b/api_docs/kbn_core_metrics_collectors_server_internal.mdx index bb7cd86e84467..52a652ca08b44 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-internal'] --- import kbnCoreMetricsCollectorsServerInternalObj from './kbn_core_metrics_collectors_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_collectors_server_mocks.mdx b/api_docs/kbn_core_metrics_collectors_server_mocks.mdx index e79a5c7fa8711..3e0fdac5423d5 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-collectors-server-mocks'] --- import kbnCoreMetricsCollectorsServerMocksObj from './kbn_core_metrics_collectors_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server.mdx b/api_docs/kbn_core_metrics_server.mdx index 7c640e418fa9a..d39927cc757ab 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server'] --- import kbnCoreMetricsServerObj from './kbn_core_metrics_server.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_internal.mdx b/api_docs/kbn_core_metrics_server_internal.mdx index 58900261bec4d..85bbf0fe160bf 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-internal'] --- import kbnCoreMetricsServerInternalObj from './kbn_core_metrics_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_metrics_server_mocks.mdx b/api_docs/kbn_core_metrics_server_mocks.mdx index d723894e14b81..e85c40bc1e988 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-metrics-server-mocks'] --- import kbnCoreMetricsServerMocksObj from './kbn_core_metrics_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_mount_utils_browser.mdx b/api_docs/kbn_core_mount_utils_browser.mdx index 8d8f912d711a2..924e89b417c9f 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-mount-utils-browser'] --- import kbnCoreMountUtilsBrowserObj from './kbn_core_mount_utils_browser.devdocs.json'; diff --git a/api_docs/kbn_core_node_server.mdx b/api_docs/kbn_core_node_server.mdx index 04389acb29084..723b3c3828eb2 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server'] --- import kbnCoreNodeServerObj from './kbn_core_node_server.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_internal.mdx b/api_docs/kbn_core_node_server_internal.mdx index 8f7f88924d01b..06e3471e94355 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-internal'] --- import kbnCoreNodeServerInternalObj from './kbn_core_node_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_node_server_mocks.mdx b/api_docs/kbn_core_node_server_mocks.mdx index 8e9dc4ff5e863..c59c40968ede7 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-node-server-mocks'] --- import kbnCoreNodeServerMocksObj from './kbn_core_node_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser.mdx b/api_docs/kbn_core_notifications_browser.mdx index 790406d777088..2c0af594edb5c 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser'] --- import kbnCoreNotificationsBrowserObj from './kbn_core_notifications_browser.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_internal.mdx b/api_docs/kbn_core_notifications_browser_internal.mdx index fe0f2d771334f..802bb50f259a4 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-internal'] --- import kbnCoreNotificationsBrowserInternalObj from './kbn_core_notifications_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_notifications_browser_mocks.mdx b/api_docs/kbn_core_notifications_browser_mocks.mdx index aa55a000889e4..7479e341ceca6 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-notifications-browser-mocks'] --- import kbnCoreNotificationsBrowserMocksObj from './kbn_core_notifications_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser.mdx b/api_docs/kbn_core_overlays_browser.mdx index e3076ea5778da..abb88aa49e838 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser'] --- import kbnCoreOverlaysBrowserObj from './kbn_core_overlays_browser.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_internal.mdx b/api_docs/kbn_core_overlays_browser_internal.mdx index 7f5549dd1924c..43c2ace058f29 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-internal'] --- import kbnCoreOverlaysBrowserInternalObj from './kbn_core_overlays_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_overlays_browser_mocks.mdx b/api_docs/kbn_core_overlays_browser_mocks.mdx index 7744eb52d4576..696fa5d036804 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-overlays-browser-mocks'] --- import kbnCoreOverlaysBrowserMocksObj from './kbn_core_overlays_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_browser.mdx b/api_docs/kbn_core_plugins_browser.mdx index e778a3a56e53f..2d1e1f749e462 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser'] --- import kbnCorePluginsBrowserObj from './kbn_core_plugins_browser.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_browser_mocks.mdx b/api_docs/kbn_core_plugins_browser_mocks.mdx index 53be8a4dc346a..04e44f220c479 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-browser-mocks'] --- import kbnCorePluginsBrowserMocksObj from './kbn_core_plugins_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server.mdx b/api_docs/kbn_core_plugins_server.mdx index b5ec9f4ec5c47..7604b3aa8bff1 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server'] --- import kbnCorePluginsServerObj from './kbn_core_plugins_server.devdocs.json'; diff --git a/api_docs/kbn_core_plugins_server_mocks.mdx b/api_docs/kbn_core_plugins_server_mocks.mdx index 0b47258bfe7a5..f758eed760318 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-plugins-server-mocks'] --- import kbnCorePluginsServerMocksObj from './kbn_core_plugins_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server.mdx b/api_docs/kbn_core_preboot_server.mdx index 72a96fd3bf652..02c665e73fbff 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server'] --- import kbnCorePrebootServerObj from './kbn_core_preboot_server.devdocs.json'; diff --git a/api_docs/kbn_core_preboot_server_mocks.mdx b/api_docs/kbn_core_preboot_server_mocks.mdx index 8f35320df7a07..f20799a8e3f66 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-preboot-server-mocks'] --- import kbnCorePrebootServerMocksObj from './kbn_core_preboot_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_browser_mocks.mdx b/api_docs/kbn_core_rendering_browser_mocks.mdx index 962a9c15789e6..26e09ece409c2 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-browser-mocks'] --- import kbnCoreRenderingBrowserMocksObj from './kbn_core_rendering_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_internal.mdx b/api_docs/kbn_core_rendering_server_internal.mdx index b0d53a3695c30..16e4a6ef477ba 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-internal'] --- import kbnCoreRenderingServerInternalObj from './kbn_core_rendering_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_rendering_server_mocks.mdx b/api_docs/kbn_core_rendering_server_mocks.mdx index e0ce21e79a9ac..3a50087f9503e 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-rendering-server-mocks'] --- import kbnCoreRenderingServerMocksObj from './kbn_core_rendering_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_root_server_internal.mdx b/api_docs/kbn_core_root_server_internal.mdx index fc8de3573cf9c..30d2f6c419b9f 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-root-server-internal'] --- import kbnCoreRootServerInternalObj from './kbn_core_root_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_browser.devdocs.json b/api_docs/kbn_core_saved_objects_api_browser.devdocs.json index f104ac919f51e..6c706458d0382 100644 --- a/api_docs/kbn_core_saved_objects_api_browser.devdocs.json +++ b/api_docs/kbn_core_saved_objects_api_browser.devdocs.json @@ -2195,10 +2195,6 @@ "plugin": "graph", "path": "x-pack/plugins/graph/public/helpers/saved_workspace_utils.ts" }, - { - "plugin": "securitySolution", - "path": "x-pack/plugins/security_solution/public/common/hooks/use_dashboard_button_href.ts" - }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/public/overview/containers/overview_cti_links/index.tsx" diff --git a/api_docs/kbn_core_saved_objects_api_browser.mdx b/api_docs/kbn_core_saved_objects_api_browser.mdx index a3b665350a6a2..2291a6beb845f 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-browser'] --- import kbnCoreSavedObjectsApiBrowserObj from './kbn_core_saved_objects_api_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server.mdx b/api_docs/kbn_core_saved_objects_api_server.mdx index 29cecd3cf0bfa..a4634f4670e0f 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server'] --- import kbnCoreSavedObjectsApiServerObj from './kbn_core_saved_objects_api_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server_internal.mdx b/api_docs/kbn_core_saved_objects_api_server_internal.mdx index 70526f1bd1989..0628b5343d2a3 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server-internal'] --- import kbnCoreSavedObjectsApiServerInternalObj from './kbn_core_saved_objects_api_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx index 55016d9f9cd66..0ca3d8811b477 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server-mocks'] --- import kbnCoreSavedObjectsApiServerMocksObj from './kbn_core_saved_objects_api_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_internal.mdx b/api_docs/kbn_core_saved_objects_base_server_internal.mdx index c86307074439d..06a35b0cfaba6 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-internal'] --- import kbnCoreSavedObjectsBaseServerInternalObj from './kbn_core_saved_objects_base_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_base_server_mocks.mdx b/api_docs/kbn_core_saved_objects_base_server_mocks.mdx index 06ffbdf813987..4f5a76c842159 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-base-server-mocks'] --- import kbnCoreSavedObjectsBaseServerMocksObj from './kbn_core_saved_objects_base_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser.mdx b/api_docs/kbn_core_saved_objects_browser.mdx index c802600494ad7..61adeaf744579 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser'] --- import kbnCoreSavedObjectsBrowserObj from './kbn_core_saved_objects_browser.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_internal.mdx b/api_docs/kbn_core_saved_objects_browser_internal.mdx index b30d6e2bc4850..675fe9496fb18 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-internal'] --- import kbnCoreSavedObjectsBrowserInternalObj from './kbn_core_saved_objects_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_browser_mocks.mdx b/api_docs/kbn_core_saved_objects_browser_mocks.mdx index d8bf8266bd2b2..dbcfbe18b4392 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-mocks'] --- import kbnCoreSavedObjectsBrowserMocksObj from './kbn_core_saved_objects_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_common.devdocs.json b/api_docs/kbn_core_saved_objects_common.devdocs.json index 9b9113df93f0a..9edb57cdae668 100644 --- a/api_docs/kbn_core_saved_objects_common.devdocs.json +++ b/api_docs/kbn_core_saved_objects_common.devdocs.json @@ -361,6 +361,20 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/core-saved-objects-common", + "id": "def-common.SavedObjectsImportFailure.managed", + "type": "CompoundType", + "tags": [], + "label": "managed", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "packages/core/saved-objects/core-saved-objects-common/src/saved_objects_imports.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/core-saved-objects-common", "id": "def-common.SavedObjectsImportFailure.error", @@ -821,6 +835,22 @@ "path": "packages/core/saved-objects/core-saved-objects-common/src/saved_objects_imports.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-common", + "id": "def-common.SavedObjectsImportSuccess.managed", + "type": "CompoundType", + "tags": [], + "label": "managed", + "description": [ + "\nFlag indicating if a saved object is managed by Kibana (default=false)\n\nThis can be leveraged by applications to e.g. prevent edits to a managed\nsaved object. Instead, users can be guided to create a copy first and\nmake their edits to the copy." + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/core/saved-objects/core-saved-objects-common/src/saved_objects_imports.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -1523,22 +1553,6 @@ "plugin": "savedObjectsTagging", "path": "x-pack/plugins/saved_objects_tagging/public/utils.ts" }, - { - "plugin": "cases", - "path": "x-pack/plugins/cases/server/services/so_references.ts" - }, - { - "plugin": "cases", - "path": "x-pack/plugins/cases/server/services/so_references.ts" - }, - { - "plugin": "cases", - "path": "x-pack/plugins/cases/server/services/so_references.ts" - }, - { - "plugin": "cases", - "path": "x-pack/plugins/cases/server/services/so_references.ts" - }, { "plugin": "lists", "path": "x-pack/plugins/lists/server/services/exception_lists/exception_list_client.mock.ts" @@ -1683,18 +1697,6 @@ "plugin": "data", "path": "src/plugins/data/server/search/saved_objects/search_session_migration.test.ts" }, - { - "plugin": "cases", - "path": "x-pack/plugins/cases/server/services/user_actions/operations/find.ts" - }, - { - "plugin": "cases", - "path": "x-pack/plugins/cases/server/services/user_actions/operations/find.ts" - }, - { - "plugin": "cases", - "path": "x-pack/plugins/cases/server/services/user_actions/operations/find.ts" - }, { "plugin": "synthetics", "path": "x-pack/plugins/synthetics/public/apps/synthetics/state/monitor_list/api.ts" @@ -3036,18 +3038,6 @@ "plugin": "cases", "path": "x-pack/plugins/cases/server/attachment_framework/so_references.ts" }, - { - "plugin": "cases", - "path": "x-pack/plugins/cases/server/services/so_references.ts" - }, - { - "plugin": "cases", - "path": "x-pack/plugins/cases/server/services/so_references.ts" - }, - { - "plugin": "cases", - "path": "x-pack/plugins/cases/server/services/so_references.ts" - }, { "plugin": "maps", "path": "x-pack/plugins/maps/common/migrations/references.ts" diff --git a/api_docs/kbn_core_saved_objects_common.mdx b/api_docs/kbn_core_saved_objects_common.mdx index a563ea1524eda..ee199de705902 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-common'] --- import kbnCoreSavedObjectsCommonObj from './kbn_core_saved_objects_common.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 71 | 0 | 39 | 0 | +| 73 | 0 | 40 | 0 | ## Common 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 3cf92d703c764..1620ee3461c16 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-internal'] --- import kbnCoreSavedObjectsImportExportServerInternalObj from './kbn_core_saved_objects_import_export_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx b/api_docs/kbn_core_saved_objects_import_export_server_mocks.mdx index deb06a6eacf71..a1b5d56cb1bb9 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-mocks'] --- import kbnCoreSavedObjectsImportExportServerMocksObj from './kbn_core_saved_objects_import_export_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_internal.devdocs.json b/api_docs/kbn_core_saved_objects_migration_server_internal.devdocs.json index d9b7b598d7b01..2ec6e2008b1f4 100644 --- a/api_docs/kbn_core_saved_objects_migration_server_internal.devdocs.json +++ b/api_docs/kbn_core_saved_objects_migration_server_internal.devdocs.json @@ -2454,27 +2454,7 @@ "TransportRequestOptions", " | undefined): Promise<", "CountResponse", - ">; }; exists: { (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithOutMeta", - " | undefined): Promise; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithMeta", - " | undefined): Promise<", - "TransportResult", - ">; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined): Promise; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", + ">; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", "default", "; child: (opts: ", "ClientOptions", @@ -2652,7 +2632,27 @@ "default", "; eql: ", "default", - "; existsSource: { (this: That, params: ", + "; exists: { (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; existsSource: { (this: That, params: ", "ExistsSourceRequest", " | ", "ExistsSourceRequest", 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 9a60e5aced65f..297318b8ff8fd 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-internal'] --- import kbnCoreSavedObjectsMigrationServerInternalObj from './kbn_core_saved_objects_migration_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx b/api_docs/kbn_core_saved_objects_migration_server_mocks.mdx index 90156f9bed2ee..9fef11e3992ae 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-mocks'] --- import kbnCoreSavedObjectsMigrationServerMocksObj from './kbn_core_saved_objects_migration_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server.devdocs.json b/api_docs/kbn_core_saved_objects_server.devdocs.json index db878f71855c7..900706780d56c 100644 --- a/api_docs/kbn_core_saved_objects_server.devdocs.json +++ b/api_docs/kbn_core_saved_objects_server.devdocs.json @@ -7570,6 +7570,22 @@ "path": "packages/core/saved-objects/core-saved-objects-server/src/import.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-server", + "id": "def-common.SavedObjectsImportOptions.managed", + "type": "CompoundType", + "tags": [], + "label": "managed", + "description": [ + "\nIf true, will import as a managed object, else will import as not managed.\n\nThis can be leveraged by applications to e.g. prevent edits to a managed\nsaved object. Instead, users can be guided to create a copy first and\nmake their edits to the copy." + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/core/saved-objects/core-saved-objects-server/src/import.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false @@ -8776,6 +8792,22 @@ "path": "packages/core/saved-objects/core-saved-objects-server/src/import.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/core-saved-objects-server", + "id": "def-common.SavedObjectsResolveImportErrorsOptions.managed", + "type": "CompoundType", + "tags": [], + "label": "managed", + "description": [ + "\nIf true, will import as a managed object, else will import as not managed.\n\nThis can be leveraged by applications to e.g. prevent edits to a managed\nsaved object. Instead, users can be guided to create a copy first and\nmake their edits to the copy." + ], + "signature": [ + "boolean | undefined" + ], + "path": "packages/core/saved-objects/core-saved-objects-server/src/import.ts", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/kbn_core_saved_objects_server.mdx b/api_docs/kbn_core_saved_objects_server.mdx index 4fd36961074b2..900842d10f1e5 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server'] --- import kbnCoreSavedObjectsServerObj from './kbn_core_saved_objects_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 | |-------------------|-----------|------------------------|-----------------| -| 510 | 1 | 106 | 4 | +| 512 | 1 | 106 | 4 | ## Common diff --git a/api_docs/kbn_core_saved_objects_server_internal.mdx b/api_docs/kbn_core_saved_objects_server_internal.mdx index 0aff49259eba8..17d9c7d37962a 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-internal'] --- import kbnCoreSavedObjectsServerInternalObj from './kbn_core_saved_objects_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_mocks.mdx b/api_docs/kbn_core_saved_objects_server_mocks.mdx index 0d384775948b3..d20888060333e 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server-mocks'] --- import kbnCoreSavedObjectsServerMocksObj from './kbn_core_saved_objects_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_utils_server.mdx b/api_docs/kbn_core_saved_objects_utils_server.mdx index 512702bd0cc25..cebc0844364ef 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-utils-server'] --- import kbnCoreSavedObjectsUtilsServerObj from './kbn_core_saved_objects_utils_server.devdocs.json'; diff --git a/api_docs/kbn_core_status_common.mdx b/api_docs/kbn_core_status_common.mdx index 8482b3b1b3865..b32733c59936e 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common'] --- import kbnCoreStatusCommonObj from './kbn_core_status_common.devdocs.json'; diff --git a/api_docs/kbn_core_status_common_internal.mdx b/api_docs/kbn_core_status_common_internal.mdx index 9459057d37cd0..60c6140d689db 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-common-internal'] --- import kbnCoreStatusCommonInternalObj from './kbn_core_status_common_internal.devdocs.json'; diff --git a/api_docs/kbn_core_status_server.mdx b/api_docs/kbn_core_status_server.mdx index 9c1c532c833bc..6c7100e3ef119 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server'] --- import kbnCoreStatusServerObj from './kbn_core_status_server.devdocs.json'; diff --git a/api_docs/kbn_core_status_server_internal.mdx b/api_docs/kbn_core_status_server_internal.mdx index f8dc4561cee6c..a65d1e19a7564 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-internal'] --- import kbnCoreStatusServerInternalObj from './kbn_core_status_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_status_server_mocks.mdx b/api_docs/kbn_core_status_server_mocks.mdx index 988af311b482d..618a8d2c75e36 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-status-server-mocks'] --- import kbnCoreStatusServerMocksObj from './kbn_core_status_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_deprecations_getters.mdx b/api_docs/kbn_core_test_helpers_deprecations_getters.mdx index 06e60f7d57c8a..99612193384ee 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-deprecations-getters'] --- import kbnCoreTestHelpersDeprecationsGettersObj from './kbn_core_test_helpers_deprecations_getters.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_http_setup_browser.mdx b/api_docs/kbn_core_test_helpers_http_setup_browser.mdx index d7079ea720648..25a2932d83f6b 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-http-setup-browser'] --- import kbnCoreTestHelpersHttpSetupBrowserObj from './kbn_core_test_helpers_http_setup_browser.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_kbn_server.mdx b/api_docs/kbn_core_test_helpers_kbn_server.mdx index bc5d7eb7c539f..cb80dd0fd1862 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-kbn-server'] --- import kbnCoreTestHelpersKbnServerObj from './kbn_core_test_helpers_kbn_server.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_so_type_serializer.mdx b/api_docs/kbn_core_test_helpers_so_type_serializer.mdx index bccc9a500f96e..e2a6e8ef3271e 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-so-type-serializer'] --- import kbnCoreTestHelpersSoTypeSerializerObj from './kbn_core_test_helpers_so_type_serializer.devdocs.json'; diff --git a/api_docs/kbn_core_test_helpers_test_utils.mdx b/api_docs/kbn_core_test_helpers_test_utils.mdx index 71fd222bbdbe7..28d231bc48d80 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-test-helpers-test-utils'] --- import kbnCoreTestHelpersTestUtilsObj from './kbn_core_test_helpers_test_utils.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser.mdx b/api_docs/kbn_core_theme_browser.mdx index dba24e5303d39..ed371296357e9 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser'] --- import kbnCoreThemeBrowserObj from './kbn_core_theme_browser.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser_internal.mdx b/api_docs/kbn_core_theme_browser_internal.mdx index e832bad309f63..d9dbd24402983 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-internal'] --- import kbnCoreThemeBrowserInternalObj from './kbn_core_theme_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser_mocks.mdx b/api_docs/kbn_core_theme_browser_mocks.mdx index 7c68b48c12d8a..0888f3604592c 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser-mocks'] --- import kbnCoreThemeBrowserMocksObj from './kbn_core_theme_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser.mdx b/api_docs/kbn_core_ui_settings_browser.mdx index 63bab8c956e9b..5003ca40f6a94 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser'] --- import kbnCoreUiSettingsBrowserObj from './kbn_core_ui_settings_browser.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_internal.mdx b/api_docs/kbn_core_ui_settings_browser_internal.mdx index a2d492393524a..0fc17e665a38c 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-internal'] --- import kbnCoreUiSettingsBrowserInternalObj from './kbn_core_ui_settings_browser_internal.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_browser_mocks.mdx b/api_docs/kbn_core_ui_settings_browser_mocks.mdx index cb5ee668fccf0..45f618ab66822 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-browser-mocks'] --- import kbnCoreUiSettingsBrowserMocksObj from './kbn_core_ui_settings_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_common.mdx b/api_docs/kbn_core_ui_settings_common.mdx index a32a908687cca..470d9f220a475 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-common'] --- import kbnCoreUiSettingsCommonObj from './kbn_core_ui_settings_common.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server.mdx b/api_docs/kbn_core_ui_settings_server.mdx index 25ab1078e6aed..2cf6adfdece02 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server'] --- import kbnCoreUiSettingsServerObj from './kbn_core_ui_settings_server.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server_internal.mdx b/api_docs/kbn_core_ui_settings_server_internal.mdx index 2c4a4ebc2c353..8b71766891ebc 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-internal'] --- import kbnCoreUiSettingsServerInternalObj from './kbn_core_ui_settings_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_ui_settings_server_mocks.mdx b/api_docs/kbn_core_ui_settings_server_mocks.mdx index 9d9994ddda689..c8ef1f336dcdb 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-ui-settings-server-mocks'] --- import kbnCoreUiSettingsServerMocksObj from './kbn_core_ui_settings_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server.mdx b/api_docs/kbn_core_usage_data_server.mdx index efb34fe257e4a..11afe8832b4ad 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server'] --- import kbnCoreUsageDataServerObj from './kbn_core_usage_data_server.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server_internal.mdx b/api_docs/kbn_core_usage_data_server_internal.mdx index 17e4ae265f2a0..c5037f1245d46 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-internal'] --- import kbnCoreUsageDataServerInternalObj from './kbn_core_usage_data_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_usage_data_server_mocks.mdx b/api_docs/kbn_core_usage_data_server_mocks.mdx index 713bcd6a74eef..9c001295a571b 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-usage-data-server-mocks'] --- import kbnCoreUsageDataServerMocksObj from './kbn_core_usage_data_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_user_settings_server.mdx b/api_docs/kbn_core_user_settings_server.mdx index e30b106305a9f..6dd5b16fb8001 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-04-27 +date: 2023-05-01 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 d521e7d08ce0b..b8d8f3139253d 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-04-27 +date: 2023-05-01 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 ef990ed9dc59b..1281b5a979abc 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-04-27 +date: 2023-05-01 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 5914643af5bb9..e7a62195766da 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto'] --- import kbnCryptoObj from './kbn_crypto.devdocs.json'; diff --git a/api_docs/kbn_crypto_browser.mdx b/api_docs/kbn_crypto_browser.mdx index e88de155ed6ce..9e53fd2736b80 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-04-27 +date: 2023-05-01 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 4fa6f2621a9f7..2ab525a1e4b13 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-04-27 +date: 2023-05-01 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 b265209255e1b..84a4ea21afffb 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] --- import kbnDatemathObj from './kbn_datemath.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index 6f4dcf7c497c3..28076ffe2afd4 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-errors'] --- import kbnDevCliErrorsObj from './kbn_dev_cli_errors.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_runner.mdx b/api_docs/kbn_dev_cli_runner.mdx index 4d4afd51ef0e2..a45d3aa2884e3 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-cli-runner'] --- import kbnDevCliRunnerObj from './kbn_dev_cli_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_proc_runner.mdx b/api_docs/kbn_dev_proc_runner.mdx index 9ee8ce793c7cb..98d781875cd4e 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-proc-runner'] --- import kbnDevProcRunnerObj from './kbn_dev_proc_runner.devdocs.json'; diff --git a/api_docs/kbn_dev_utils.mdx b/api_docs/kbn_dev_utils.mdx index 4e5245d0f6ddf..045af9df087b5 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.devdocs.json b/api_docs/kbn_doc_links.devdocs.json index 496205404ca2d..efa47417fc793 100644 --- a/api_docs/kbn_doc_links.devdocs.json +++ b/api_docs/kbn_doc_links.devdocs.json @@ -300,7 +300,7 @@ "label": "enterpriseSearch", "description": [], "signature": [ - "{ readonly apiKeys: string; readonly behavioralAnalytics: string; readonly behavioralAnalyticsEvents: string; readonly bulkApi: string; readonly configuration: string; readonly connectors: string; readonly connectorsAzureBlobStorage: string; readonly connectorsGoogleCloudStorage: string; readonly connectorsMicrosoftSQL: string; readonly connectorsMongoDB: string; readonly connectorsMySQL: string; readonly connectorsNetworkDrive: string; readonly connectorsOracle: string; readonly connectorsPostgreSQL: string; readonly connectorsS3: string; readonly connectorsWorkplaceSearch: string; readonly crawlerExtractionRules: string; readonly crawlerManaging: string; readonly crawlerOverview: string; readonly deployTrainedModels: string; readonly documentLevelSecurity: string; readonly elser: string; readonly engines: string; readonly ingestionApis: string; readonly ingestPipelines: string; readonly languageAnalyzers: string; readonly languageClients: string; readonly licenseManagement: string; readonly machineLearningStart: string; readonly mailService: string; readonly mlDocumentEnrichment: string; readonly start: string; readonly syncRules: string; readonly troubleshootSetup: string; readonly usersAccess: string; }" + "{ readonly apiKeys: string; readonly behavioralAnalytics: string; readonly behavioralAnalyticsEvents: string; readonly buildConnector: string; readonly bulkApi: string; readonly configuration: string; readonly connectors: string; readonly connectorsAzureBlobStorage: string; readonly connectorsGoogleCloudStorage: string; readonly connectorsMicrosoftSQL: string; readonly connectorsMongoDB: string; readonly connectorsMySQL: string; readonly connectorsNetworkDrive: string; readonly connectorsOracle: string; readonly connectorsPostgreSQL: string; readonly connectorsS3: string; readonly connectorsWorkplaceSearch: string; readonly crawlerExtractionRules: string; readonly crawlerManaging: string; readonly crawlerOverview: string; readonly deployTrainedModels: string; readonly documentLevelSecurity: string; readonly elser: string; readonly engines: string; readonly ingestionApis: string; readonly ingestPipelines: string; readonly languageAnalyzers: string; readonly languageClients: string; readonly licenseManagement: string; readonly machineLearningStart: string; readonly mailService: string; readonly mlDocumentEnrichment: string; readonly start: string; readonly syncRules: string; readonly troubleshootSetup: string; readonly usersAccess: string; }" ], "path": "packages/kbn-doc-links/src/types.ts", "deprecated": false, diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index 9259f8c14dd1d..f73bee9723adb 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/doc-links'] --- import kbnDocLinksObj from './kbn_doc_links.devdocs.json'; diff --git a/api_docs/kbn_docs_utils.mdx b/api_docs/kbn_docs_utils.mdx index 74528d613da82..1909337a75e5a 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-04-27 +date: 2023-05-01 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 c2dcf776825b1..0b8016434d9ce 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-04-27 +date: 2023-05-01 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 31cec61a5b926..7aad654c55deb 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-04-27 +date: 2023-05-01 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 c87334df626fb..bb8800274e4b8 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-04-27 +date: 2023-05-01 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 f100981f85de5..50f990176cca8 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-04-27 +date: 2023-05-01 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 357732bf29f75..0897e823bf232 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es'] --- import kbnEsObj from './kbn_es.devdocs.json'; diff --git a/api_docs/kbn_es_archiver.mdx b/api_docs/kbn_es_archiver.mdx index d6329b1c1c40d..2864c591eb6ef 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-archiver'] --- import kbnEsArchiverObj from './kbn_es_archiver.devdocs.json'; diff --git a/api_docs/kbn_es_errors.mdx b/api_docs/kbn_es_errors.mdx index 1e06c5d6303d2..16edd0341b418 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-errors'] --- import kbnEsErrorsObj from './kbn_es_errors.devdocs.json'; diff --git a/api_docs/kbn_es_query.devdocs.json b/api_docs/kbn_es_query.devdocs.json index 02a3068d88627..907f96c6e99dd 100644 --- a/api_docs/kbn_es_query.devdocs.json +++ b/api_docs/kbn_es_query.devdocs.json @@ -5328,7 +5328,7 @@ "label": "function", "description": [], "signature": [ - "\"nested\" | \"is\" | \"and\" | \"or\" | \"not\" | \"range\" | \"exists\"" + "\"nested\" | \"is\" | \"exists\" | \"range\" | \"and\" | \"or\" | \"not\"" ], "path": "packages/kbn-es-query/src/kuery/node_types/types.ts", "deprecated": false, @@ -6425,8 +6425,8 @@ "pluginId": "@kbn/es-query", "scope": "common", "docId": "kibKbnEsQueryPluginApi", - "section": "def-common.FunctionTypeBuildNode", - "text": "FunctionTypeBuildNode" + "section": "def-common.KueryNode", + "text": "KueryNode" } ], "path": "packages/kbn-es-query/src/kuery/node_types/node_builder.ts", @@ -6594,8 +6594,8 @@ "pluginId": "@kbn/es-query", "scope": "common", "docId": "kibKbnEsQueryPluginApi", - "section": "def-common.FunctionTypeBuildNode", - "text": "FunctionTypeBuildNode" + "section": "def-common.KueryNode", + "text": "KueryNode" } ], "path": "packages/kbn-es-query/src/kuery/node_types/node_builder.ts", diff --git a/api_docs/kbn_es_query.mdx b/api_docs/kbn_es_query.mdx index b8d355922dd2d..626621267fb29 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-query'] --- import kbnEsQueryObj from './kbn_es_query.devdocs.json'; diff --git a/api_docs/kbn_es_types.mdx b/api_docs/kbn_es_types.mdx index 395dd6b5c51e0..bd3f96cc3304e 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-types'] --- import kbnEsTypesObj from './kbn_es_types.devdocs.json'; diff --git a/api_docs/kbn_eslint_plugin_imports.mdx b/api_docs/kbn_eslint_plugin_imports.mdx index 2d4de7f8999f9..98d27c92f938c 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] --- import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json'; diff --git a/api_docs/kbn_expandable_flyout.mdx b/api_docs/kbn_expandable_flyout.mdx index 2382e4b08ed54..c4cc097501895 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-04-27 +date: 2023-05-01 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 101502ea0f43e..db3092650c30e 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/field-types'] --- import kbnFieldTypesObj from './kbn_field_types.devdocs.json'; diff --git a/api_docs/kbn_find_used_node_modules.mdx b/api_docs/kbn_find_used_node_modules.mdx index 3dab0b2fd6db8..5030eeeee33ed 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/find-used-node-modules'] --- import kbnFindUsedNodeModulesObj from './kbn_find_used_node_modules.devdocs.json'; diff --git a/api_docs/kbn_ftr_common_functional_services.mdx b/api_docs/kbn_ftr_common_functional_services.mdx index 6c43e30c92d8b..dac694c1e7705 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ftr-common-functional-services'] --- import kbnFtrCommonFunctionalServicesObj from './kbn_ftr_common_functional_services.devdocs.json'; diff --git a/api_docs/kbn_generate.mdx b/api_docs/kbn_generate.mdx index 5c4a85299c1bd..875d9db62bc9b 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-04-27 +date: 2023-05-01 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 d6f2c89e6bb1a..9c4469e717cc6 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-04-27 +date: 2023-05-01 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 2fee067ad8c17..2fdec8571bbc2 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-04-27 +date: 2023-05-01 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 07deba68e13bd..51dbf0f21149a 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/guided-onboarding'] --- import kbnGuidedOnboardingObj from './kbn_guided_onboarding.devdocs.json'; diff --git a/api_docs/kbn_handlebars.mdx b/api_docs/kbn_handlebars.mdx index c820a4821bac2..51cf2a1d331a1 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/handlebars'] --- import kbnHandlebarsObj from './kbn_handlebars.devdocs.json'; diff --git a/api_docs/kbn_hapi_mocks.mdx b/api_docs/kbn_hapi_mocks.mdx index 0ac09fdb05254..84cf8b36407e6 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/hapi-mocks'] --- import kbnHapiMocksObj from './kbn_hapi_mocks.devdocs.json'; diff --git a/api_docs/kbn_health_gateway_server.mdx b/api_docs/kbn_health_gateway_server.mdx index f683d4a7aa831..6412180239e02 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/health-gateway-server'] --- import kbnHealthGatewayServerObj from './kbn_health_gateway_server.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_card.mdx b/api_docs/kbn_home_sample_data_card.mdx index 34a1c3d1992eb..fd1c22a048272 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-card'] --- import kbnHomeSampleDataCardObj from './kbn_home_sample_data_card.devdocs.json'; diff --git a/api_docs/kbn_home_sample_data_tab.mdx b/api_docs/kbn_home_sample_data_tab.mdx index 9aaf7459be167..aa921415dfa3a 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/home-sample-data-tab'] --- import kbnHomeSampleDataTabObj from './kbn_home_sample_data_tab.devdocs.json'; diff --git a/api_docs/kbn_i18n.mdx b/api_docs/kbn_i18n.mdx index d00d936014d1e..e79f37e5d6524 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n'] --- import kbnI18nObj from './kbn_i18n.devdocs.json'; diff --git a/api_docs/kbn_i18n_react.mdx b/api_docs/kbn_i18n_react.mdx index 55fdd69f8bbdf..c7b06d08126b5 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/i18n-react'] --- import kbnI18nReactObj from './kbn_i18n_react.devdocs.json'; diff --git a/api_docs/kbn_import_resolver.mdx b/api_docs/kbn_import_resolver.mdx index 9e481364f4742..b335c2b0a70cf 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx index 920949385b430..640da5007c9c7 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-04-27 +date: 2023-05-01 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 bbd5bc89098a5..ffe74d51ef568 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-04-27 +date: 2023-05-01 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 fdbb096a99ffe..0894c898a02fe 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/jest-serializers'] --- import kbnJestSerializersObj from './kbn_jest_serializers.devdocs.json'; diff --git a/api_docs/kbn_journeys.mdx b/api_docs/kbn_journeys.mdx index dee3adcbd598c..085ea9e0386ae 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-04-27 +date: 2023-05-01 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 ac8c10fd75439..6a769ab541774 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-04-27 +date: 2023-05-01 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 35f81141ef298..fd1eca699551a 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/kibana-manifest-schema'] --- import kbnKibanaManifestSchemaObj from './kbn_kibana_manifest_schema.devdocs.json'; diff --git a/api_docs/kbn_language_documentation_popover.mdx b/api_docs/kbn_language_documentation_popover.mdx index b064ac1d06372..a67354094a641 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/language-documentation-popover'] --- import kbnLanguageDocumentationPopoverObj from './kbn_language_documentation_popover.devdocs.json'; diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index 73b77ab09688b..8a13aaf4105b8 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging'] --- import kbnLoggingObj from './kbn_logging.devdocs.json'; diff --git a/api_docs/kbn_logging_mocks.mdx b/api_docs/kbn_logging_mocks.mdx index 66ae59998813e..61951fa061477 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/logging-mocks'] --- import kbnLoggingMocksObj from './kbn_logging_mocks.devdocs.json'; diff --git a/api_docs/kbn_managed_vscode_config.mdx b/api_docs/kbn_managed_vscode_config.mdx index a6c778a077373..8e5381240c10a 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-vscode-config'] --- import kbnManagedVscodeConfigObj from './kbn_managed_vscode_config.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index 34739252d713f..076ff48566d9a 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl'] --- import kbnMapboxGlObj from './kbn_mapbox_gl.devdocs.json'; diff --git a/api_docs/kbn_ml_agg_utils.mdx b/api_docs/kbn_ml_agg_utils.mdx index 9e03cc8672084..78e67bdb40e15 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-agg-utils'] --- import kbnMlAggUtilsObj from './kbn_ml_agg_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_date_picker.mdx b/api_docs/kbn_ml_date_picker.mdx index eb8cce8679e52..5710f0edb17f5 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-04-27 +date: 2023-05-01 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 ae3903918ee8f..9baa1f131f6d6 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-04-27 +date: 2023-05-01 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 ca48207bb0ba6..acd084e5f4389 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-04-27 +date: 2023-05-01 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 9e0d723af5baf..51c2a1680ffcf 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-populated-object'] --- import kbnMlIsPopulatedObjectObj from './kbn_ml_is_populated_object.devdocs.json'; diff --git a/api_docs/kbn_ml_local_storage.mdx b/api_docs/kbn_ml_local_storage.mdx index 3cab853d922c8..27f8801b114c4 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-04-27 +date: 2023-05-01 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 9b12a9b00cf93..a704daac3da84 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-04-27 +date: 2023-05-01 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 b8ed4ea9caa8a..a0c4c4142ef8b 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-04-27 +date: 2023-05-01 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 36cc36a333ee9..7762df4c4986c 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-04-27 +date: 2023-05-01 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 c43e61a590e7b..2daf938c9df56 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-04-27 +date: 2023-05-01 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 4e8e4320b225a..66e59913fd77b 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-04-27 +date: 2023-05-01 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 aa780ee9924e1..f463c586284d2 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-string-hash'] --- import kbnMlStringHashObj from './kbn_ml_string_hash.devdocs.json'; diff --git a/api_docs/kbn_ml_trained_models_utils.mdx b/api_docs/kbn_ml_trained_models_utils.mdx index a4ac124f1af30..096e77d286bd2 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-04-27 +date: 2023-05-01 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 b742eccf846c8..78418bf2ac72c 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-04-27 +date: 2023-05-01 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 8517956aaaa7a..ddc2ae22b834c 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-04-27 +date: 2023-05-01 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 a9871e61c9a0f..8497a04460d2c 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-04-27 +date: 2023-05-01 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 9ef7805529af6..8a473749e1850 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-04-27 +date: 2023-05-01 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 a8b14322c8466..07ff8e415a1ee 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer'] --- import kbnOptimizerObj from './kbn_optimizer.devdocs.json'; diff --git a/api_docs/kbn_optimizer_webpack_helpers.mdx b/api_docs/kbn_optimizer_webpack_helpers.mdx index 35ca967c901be..f372ca5e8cc0a 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/optimizer-webpack-helpers'] --- import kbnOptimizerWebpackHelpersObj from './kbn_optimizer_webpack_helpers.devdocs.json'; diff --git a/api_docs/kbn_osquery_io_ts_types.mdx b/api_docs/kbn_osquery_io_ts_types.mdx index 9a6b68fb9cdbf..b06e167aa962b 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/osquery-io-ts-types'] --- import kbnOsqueryIoTsTypesObj from './kbn_osquery_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_performance_testing_dataset_extractor.mdx b/api_docs/kbn_performance_testing_dataset_extractor.mdx index 394f13fef0cf7..0646b6735b7ce 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/performance-testing-dataset-extractor'] --- import kbnPerformanceTestingDatasetExtractorObj from './kbn_performance_testing_dataset_extractor.devdocs.json'; diff --git a/api_docs/kbn_plugin_generator.mdx b/api_docs/kbn_plugin_generator.mdx index b2bc090e92c0d..cf58618edf5d2 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-generator'] --- import kbnPluginGeneratorObj from './kbn_plugin_generator.devdocs.json'; diff --git a/api_docs/kbn_plugin_helpers.mdx b/api_docs/kbn_plugin_helpers.mdx index f07b34f2e0d6f..40dedafad6ed3 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_react_field.mdx b/api_docs/kbn_react_field.mdx index a9dbbc7577290..6bbc43a77e838 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-04-27 +date: 2023-05-01 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 557b6db6f39b3..7fefe00b37244 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-04-27 +date: 2023-05-01 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 eaa603cae4b8d..d950b69cc17e6 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-04-27 +date: 2023-05-01 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 61978f5fed9f1..7ff024766ebc1 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-04-27 +date: 2023-05-01 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 85bde41daf6ee..4afa19a2747e5 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/repo-source-classifier'] --- import kbnRepoSourceClassifierObj from './kbn_repo_source_classifier.devdocs.json'; diff --git a/api_docs/kbn_reporting_common.mdx b/api_docs/kbn_reporting_common.mdx index deb4c20f85ae6..cc3a931eaf9e8 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-04-27 +date: 2023-05-01 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 f8cf766287711..b3b2971a80043 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-04-27 +date: 2023-05-01 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 aa93038ca0337..7f6a7edee9b28 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rule-data-utils'] --- import kbnRuleDataUtilsObj from './kbn_rule_data_utils.devdocs.json'; diff --git a/api_docs/kbn_saved_objects_settings.mdx b/api_docs/kbn_saved_objects_settings.mdx index 82c4fceebacc2..049371c6fd4ea 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-04-27 +date: 2023-05-01 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 f3ef1ed7a3ff9..9df628cb4a197 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-04-27 +date: 2023-05-01 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 25c1ba025965f..54744e1090c81 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-04-27 +date: 2023-05-01 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 e77c0f0284f10..04cd5a5e161ef 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-04-27 +date: 2023-05-01 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 248e50836fa19..869473723067e 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-04-27 +date: 2023-05-01 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 00db730ac8986..40f70a4fc9bfb 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-04-27 +date: 2023-05-01 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.devdocs.json b/api_docs/kbn_securitysolution_es_utils.devdocs.json index 360332ea75d2d..422e9ce6d4d24 100644 --- a/api_docs/kbn_securitysolution_es_utils.devdocs.json +++ b/api_docs/kbn_securitysolution_es_utils.devdocs.json @@ -652,27 +652,7 @@ "TransportRequestOptions", " | undefined): Promise<", "CountResponse", - ">; }; exists: { (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithOutMeta", - " | undefined): Promise; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithMeta", - " | undefined): Promise<", - "TransportResult", - ">; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined): Promise; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", + ">; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", "default", "; asyncSearch: ", "default", @@ -846,7 +826,27 @@ "default", "; eql: ", "default", - "; existsSource: { (this: That, params: ", + "; exists: { (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; existsSource: { (this: That, params: ", "ExistsSourceRequest", " | ", "ExistsSourceRequest", @@ -1896,27 +1896,7 @@ "TransportRequestOptions", " | undefined): Promise<", "CountResponse", - ">; }; exists: { (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithOutMeta", - " | undefined): Promise; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithMeta", - " | undefined): Promise<", - "TransportResult", - ">; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined): Promise; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", + ">; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", "default", "; asyncSearch: ", "default", @@ -2090,7 +2070,27 @@ "default", "; eql: ", "default", - "; existsSource: { (this: That, params: ", + "; exists: { (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; existsSource: { (this: That, params: ", "ExistsSourceRequest", " | ", "ExistsSourceRequest", diff --git a/api_docs/kbn_securitysolution_es_utils.mdx b/api_docs/kbn_securitysolution_es_utils.mdx index 7a360852024f5..3f70ac1f2f726 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-es-utils'] --- import kbnSecuritysolutionEsUtilsObj from './kbn_securitysolution_es_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_exception_list_components.mdx b/api_docs/kbn_securitysolution_exception_list_components.mdx index 30a58aa737812..4b2b758b68bcf 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-exception-list-components'] --- import kbnSecuritysolutionExceptionListComponentsObj from './kbn_securitysolution_exception_list_components.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_grouping.devdocs.json b/api_docs/kbn_securitysolution_grouping.devdocs.json index d3c5052958e2d..51ab649407413 100644 --- a/api_docs/kbn_securitysolution_grouping.devdocs.json +++ b/api_docs/kbn_securitysolution_grouping.devdocs.json @@ -29,7 +29,7 @@ "\nComposes grouping query and aggregations" ], "signature": [ - "({ additionalFilters, from, groupByFields, rootAggregations, runtimeMappings, size, pageNumber, sort, statsAggregations, to, }: ", + "({ additionalFilters, from, groupByField, pageNumber, rootAggregations, runtimeMappings, selectedGroupEsTypes, size, sort, statsAggregations, to, }: ", "GroupingQueryArgs", ") => ", "GroupingQuery" @@ -43,7 +43,7 @@ "id": "def-common.getGroupingQuery.$1", "type": "Object", "tags": [], - "label": "{\n additionalFilters = [],\n from,\n groupByFields,\n rootAggregations,\n runtimeMappings,\n size = DEFAULT_GROUP_BY_FIELD_SIZE,\n pageNumber,\n sort,\n statsAggregations,\n to,\n}", + "label": "{\n additionalFilters = [],\n from,\n groupByField,\n pageNumber,\n rootAggregations,\n runtimeMappings,\n selectedGroupEsTypes,\n size = DEFAULT_GROUP_BY_FIELD_SIZE,\n sort,\n statsAggregations,\n to,\n}", "description": [], "signature": [ "GroupingQueryArgs" diff --git a/api_docs/kbn_securitysolution_grouping.mdx b/api_docs/kbn_securitysolution_grouping.mdx index 542a1b3100eaa..0f16098add9b0 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-04-27 +date: 2023-05-01 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 a0675084691f8..2464ded710ff0 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-hook-utils'] --- import kbnSecuritysolutionHookUtilsObj from './kbn_securitysolution_hook_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx b/api_docs/kbn_securitysolution_io_ts_alerting_types.mdx index 1026fb24e3956..a339032cf35b2 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-alerting-types'] --- import kbnSecuritysolutionIoTsAlertingTypesObj from './kbn_securitysolution_io_ts_alerting_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_list_types.mdx b/api_docs/kbn_securitysolution_io_ts_list_types.mdx index 8e66ad414f36f..c1a880d57ac25 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-list-types'] --- import kbnSecuritysolutionIoTsListTypesObj from './kbn_securitysolution_io_ts_list_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_types.mdx b/api_docs/kbn_securitysolution_io_ts_types.mdx index f9480bb1c2d95..2cecea59ba742 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-types'] --- import kbnSecuritysolutionIoTsTypesObj from './kbn_securitysolution_io_ts_types.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_io_ts_utils.mdx b/api_docs/kbn_securitysolution_io_ts_utils.mdx index 6c78081d9a61e..dbc75d7a5fc5e 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-io-ts-utils'] --- import kbnSecuritysolutionIoTsUtilsObj from './kbn_securitysolution_io_ts_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_api.mdx b/api_docs/kbn_securitysolution_list_api.mdx index e53ba3f5d0ceb..688729a532f61 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-api'] --- import kbnSecuritysolutionListApiObj from './kbn_securitysolution_list_api.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_constants.mdx b/api_docs/kbn_securitysolution_list_constants.mdx index 650735cf29a34..47754da21d6b2 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-constants'] --- import kbnSecuritysolutionListConstantsObj from './kbn_securitysolution_list_constants.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_hooks.mdx b/api_docs/kbn_securitysolution_list_hooks.mdx index a9adb40036705..b46eefc5c7b76 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-hooks'] --- import kbnSecuritysolutionListHooksObj from './kbn_securitysolution_list_hooks.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_list_utils.mdx b/api_docs/kbn_securitysolution_list_utils.mdx index 51d6bddbee7a0..9e3570ea10180 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-list-utils'] --- import kbnSecuritysolutionListUtilsObj from './kbn_securitysolution_list_utils.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_rules.mdx b/api_docs/kbn_securitysolution_rules.mdx index a5ceffbc37345..5eaeb7b86bb65 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-rules'] --- import kbnSecuritysolutionRulesObj from './kbn_securitysolution_rules.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_t_grid.mdx b/api_docs/kbn_securitysolution_t_grid.mdx index 192f2a88d64ba..319ebd22e64e4 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-t-grid'] --- import kbnSecuritysolutionTGridObj from './kbn_securitysolution_t_grid.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_utils.mdx b/api_docs/kbn_securitysolution_utils.mdx index 842273336e463..11c04b56a6169 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-utils'] --- import kbnSecuritysolutionUtilsObj from './kbn_securitysolution_utils.devdocs.json'; diff --git a/api_docs/kbn_server_http_tools.mdx b/api_docs/kbn_server_http_tools.mdx index 5afef6be541cd..8ac6374619091 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-http-tools'] --- import kbnServerHttpToolsObj from './kbn_server_http_tools.devdocs.json'; diff --git a/api_docs/kbn_server_route_repository.mdx b/api_docs/kbn_server_route_repository.mdx index 5163561ddde7a..63be7272cbf7e 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/server-route-repository'] --- import kbnServerRouteRepositoryObj from './kbn_server_route_repository.devdocs.json'; diff --git a/api_docs/kbn_serverless_project_switcher.mdx b/api_docs/kbn_serverless_project_switcher.mdx index 5149449fabf87..95344c96b1854 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-04-27 +date: 2023-05-01 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 3bd55feb6a4b9..af74a9866cfa2 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-04-27 +date: 2023-05-01 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 e20765aabfcf0..4de6cc72333a7 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-svg'] --- import kbnSharedSvgObj from './kbn_shared_svg.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_avatar_solution.mdx b/api_docs/kbn_shared_ux_avatar_solution.mdx index 8797ddbc4d499..00764ee4d746f 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-solution'] --- import kbnSharedUxAvatarSolutionObj from './kbn_shared_ux_avatar_solution.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx b/api_docs/kbn_shared_ux_avatar_user_profile_components.mdx index e7a9fbffabf86..e7618d404a893 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-avatar-user-profile-components'] --- import kbnSharedUxAvatarUserProfileComponentsObj from './kbn_shared_ux_avatar_user_profile_components.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen.mdx index 1e1ed6cf90add..a59ddef569b52 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen'] --- import kbnSharedUxButtonExitFullScreenObj from './kbn_shared_ux_button_exit_full_screen.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx b/api_docs/kbn_shared_ux_button_exit_full_screen_mocks.mdx index b8b4ad1198354..7a27fa946f35b 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-exit-full-screen-mocks'] --- import kbnSharedUxButtonExitFullScreenMocksObj from './kbn_shared_ux_button_exit_full_screen_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_button_toolbar.mdx b/api_docs/kbn_shared_ux_button_toolbar.mdx index f0403d588a7c6..cf7f6d2bb1095 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-button-toolbar'] --- import kbnSharedUxButtonToolbarObj from './kbn_shared_ux_button_toolbar.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_card_no_data.mdx b/api_docs/kbn_shared_ux_card_no_data.mdx index 66a1dc75d018c..17b5c373339f1 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data'] --- import kbnSharedUxCardNoDataObj from './kbn_shared_ux_card_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_card_no_data_mocks.mdx b/api_docs/kbn_shared_ux_card_no_data_mocks.mdx index 91a243ee73b84..9aa0eafc54d6f 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data-mocks'] --- import kbnSharedUxCardNoDataMocksObj from './kbn_shared_ux_card_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_chrome_navigation.devdocs.json b/api_docs/kbn_shared_ux_chrome_navigation.devdocs.json new file mode 100644 index 0000000000000..6a03c7eecaf98 --- /dev/null +++ b/api_docs/kbn_shared_ux_chrome_navigation.devdocs.json @@ -0,0 +1,413 @@ +{ + "id": "@kbn/shared-ux-chrome-navigation", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [ + { + "parentPluginId": "@kbn/shared-ux-chrome-navigation", + "id": "def-common.Navigation", + "type": "Function", + "tags": [], + "label": "Navigation", + "description": [], + "signature": [ + "(props: ", + { + "pluginId": "@kbn/shared-ux-chrome-navigation", + "scope": "common", + "docId": "kibKbnSharedUxChromeNavigationPluginApi", + "section": "def-common.NavigationProps", + "text": "NavigationProps" + }, + ") => JSX.Element" + ], + "path": "packages/shared-ux/chrome/navigation/src/ui/navigation.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/shared-ux-chrome-navigation", + "id": "def-common.Navigation.$1", + "type": "Object", + "tags": [], + "label": "props", + "description": [], + "signature": [ + { + "pluginId": "@kbn/shared-ux-chrome-navigation", + "scope": "common", + "docId": "kibKbnSharedUxChromeNavigationPluginApi", + "section": "def-common.NavigationProps", + "text": "NavigationProps" + } + ], + "path": "packages/shared-ux/chrome/navigation/src/ui/navigation.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/shared-ux-chrome-navigation", + "id": "def-common.NavigationKibanaProvider", + "type": "Function", + "tags": [], + "label": "NavigationKibanaProvider", + "description": [ + "\nKibana-specific Provider that maps dependencies to services." + ], + "signature": [ + "({ children, ...dependencies }: React.PropsWithChildren<", + "NavigationKibanaDependencies", + ">) => JSX.Element" + ], + "path": "packages/shared-ux/chrome/navigation/src/services.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/shared-ux-chrome-navigation", + "id": "def-common.NavigationKibanaProvider.$1", + "type": "CompoundType", + "tags": [], + "label": "{\n children,\n ...dependencies\n}", + "description": [], + "signature": [ + "React.PropsWithChildren<", + "NavigationKibanaDependencies", + ">" + ], + "path": "packages/shared-ux/chrome/navigation/src/services.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/shared-ux-chrome-navigation", + "id": "def-common.NavigationProvider", + "type": "Function", + "tags": [], + "label": "NavigationProvider", + "description": [ + "\nA Context Provider that provides services to the component and its dependencies." + ], + "signature": [ + "({ children, ...services }: React.PropsWithChildren<", + { + "pluginId": "@kbn/shared-ux-chrome-navigation", + "scope": "common", + "docId": "kibKbnSharedUxChromeNavigationPluginApi", + "section": "def-common.NavigationServices", + "text": "NavigationServices" + }, + ">) => JSX.Element" + ], + "path": "packages/shared-ux/chrome/navigation/src/services.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/shared-ux-chrome-navigation", + "id": "def-common.NavigationProvider.$1", + "type": "CompoundType", + "tags": [], + "label": "{ children, ...services }", + "description": [], + "signature": [ + "React.PropsWithChildren<", + { + "pluginId": "@kbn/shared-ux-chrome-navigation", + "scope": "common", + "docId": "kibKbnSharedUxChromeNavigationPluginApi", + "section": "def-common.NavigationServices", + "text": "NavigationServices" + }, + ">" + ], + "path": "packages/shared-ux/chrome/navigation/src/services.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [ + { + "parentPluginId": "@kbn/shared-ux-chrome-navigation", + "id": "def-common.NavigationProps", + "type": "Interface", + "tags": [], + "label": "NavigationProps", + "description": [ + "\nProps for the `Navigation` component." + ], + "path": "packages/shared-ux/chrome/navigation/types/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/shared-ux-chrome-navigation", + "id": "def-common.NavigationProps.activeNavItemId", + "type": "string", + "tags": [], + "label": "activeNavItemId", + "description": [ + "\nID of sections to initially open\nPath to the nav item is given with hierarchy expressed in dotted notation.\nExample: `my_project.settings.index_management`" + ], + "signature": [ + "string | undefined" + ], + "path": "packages/shared-ux/chrome/navigation/types/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/shared-ux-chrome-navigation", + "id": "def-common.NavigationProps.solutions", + "type": "Array", + "tags": [], + "label": "solutions", + "description": [ + "\nConfiguration for Solutions' section(s)" + ], + "signature": [ + "SolutionProperties", + "[]" + ], + "path": "packages/shared-ux/chrome/navigation/types/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/shared-ux-chrome-navigation", + "id": "def-common.NavigationProps.platformConfig", + "type": "Object", + "tags": [], + "label": "platformConfig", + "description": [ + "\nControls over how Platform nav sections appear" + ], + "signature": [ + "Partial<", + "PlatformConfigSet", + "> | undefined" + ], + "path": "packages/shared-ux/chrome/navigation/types/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/shared-ux-chrome-navigation", + "id": "def-common.NavigationProps.homeHref", + "type": "string", + "tags": [], + "label": "homeHref", + "description": [ + "\nTarget for the logo icon" + ], + "path": "packages/shared-ux/chrome/navigation/types/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/shared-ux-chrome-navigation", + "id": "def-common.NavigationProps.linkToCloud", + "type": "CompoundType", + "tags": [], + "label": "linkToCloud", + "description": [ + "\nControl of the link that takes the user to their projects or deployments" + ], + "signature": [ + "\"projects\" | \"deployments\" | undefined" + ], + "path": "packages/shared-ux/chrome/navigation/types/index.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/shared-ux-chrome-navigation", + "id": "def-common.NavigationServices", + "type": "Interface", + "tags": [], + "label": "NavigationServices", + "description": [ + "\nA list of services that are consumed by this component." + ], + "path": "packages/shared-ux/chrome/navigation/types/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/shared-ux-chrome-navigation", + "id": "def-common.NavigationServices.activeNavItemId", + "type": "string", + "tags": [], + "label": "activeNavItemId", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "packages/shared-ux/chrome/navigation/types/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/shared-ux-chrome-navigation", + "id": "def-common.NavigationServices.basePath", + "type": "Object", + "tags": [], + "label": "basePath", + "description": [], + "signature": [ + "{ prepend: (url: string) => string; }" + ], + "path": "packages/shared-ux/chrome/navigation/types/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/shared-ux-chrome-navigation", + "id": "def-common.NavigationServices.loadingCount", + "type": "number", + "tags": [], + "label": "loadingCount", + "description": [], + "path": "packages/shared-ux/chrome/navigation/types/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/shared-ux-chrome-navigation", + "id": "def-common.NavigationServices.navIsOpen", + "type": "boolean", + "tags": [], + "label": "navIsOpen", + "description": [], + "path": "packages/shared-ux/chrome/navigation/types/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/shared-ux-chrome-navigation", + "id": "def-common.NavigationServices.navigateToUrl", + "type": "Function", + "tags": [], + "label": "navigateToUrl", + "description": [], + "signature": [ + "(url: string, options?: ", + { + "pluginId": "@kbn/core-application-browser", + "scope": "common", + "docId": "kibKbnCoreApplicationBrowserPluginApi", + "section": "def-common.NavigateToUrlOptions", + "text": "NavigateToUrlOptions" + }, + " | undefined) => Promise" + ], + "path": "packages/shared-ux/chrome/navigation/types/index.ts", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "@kbn/shared-ux-chrome-navigation", + "id": "def-common.NavigationServices.navigateToUrl.$1", + "type": "string", + "tags": [], + "label": "url", + "description": [], + "path": "packages/core/application/core-application-browser/src/contracts.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "@kbn/shared-ux-chrome-navigation", + "id": "def-common.NavigationServices.navigateToUrl.$2", + "type": "Object", + "tags": [], + "label": "options", + "description": [], + "signature": [ + { + "pluginId": "@kbn/core-application-browser", + "scope": "common", + "docId": "kibKbnCoreApplicationBrowserPluginApi", + "section": "def-common.NavigateToUrlOptions", + "text": "NavigateToUrlOptions" + }, + " | undefined" + ], + "path": "packages/core/application/core-application-browser/src/contracts.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "initialIsOpen": false + } + ], + "enums": [], + "misc": [ + { + "parentPluginId": "@kbn/shared-ux-chrome-navigation", + "id": "def-common.NavItemProps", + "type": "Type", + "tags": [], + "label": "NavItemProps", + "description": [ + "\nProps for the `NavItem` component representing the content of a navigational item with optional children." + ], + "signature": [ + "Pick<", + "EuiSideNavItemType", + ", \"id\" | \"name\"> & { items?: ", + { + "pluginId": "@kbn/shared-ux-chrome-navigation", + "scope": "common", + "docId": "kibKbnSharedUxChromeNavigationPluginApi", + "section": "def-common.NavItemProps", + "text": "NavItemProps" + }, + "[] | undefined; href?: string | undefined; }" + ], + "path": "packages/shared-ux/chrome/navigation/types/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_shared_ux_chrome_navigation.mdx b/api_docs/kbn_shared_ux_chrome_navigation.mdx new file mode 100644 index 0000000000000..6c9ddb77cccb9 --- /dev/null +++ b/api_docs/kbn_shared_ux_chrome_navigation.mdx @@ -0,0 +1,36 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibKbnSharedUxChromeNavigationPluginApi +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-01 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-chrome-navigation'] +--- +import kbnSharedUxChromeNavigationObj from './kbn_shared_ux_chrome_navigation.devdocs.json'; + + + +Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 21 | 0 | 11 | 3 | + +## Common + +### Functions + + +### Interfaces + + +### Consts, variables and types + + diff --git a/api_docs/kbn_shared_ux_file_context.mdx b/api_docs/kbn_shared_ux_file_context.mdx index d30d845b08a29..9acee4050ed52 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-04-27 +date: 2023-05-01 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 0f46adec2a9d2..d94094365199d 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image'] --- import kbnSharedUxFileImageObj from './kbn_shared_ux_file_image.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_image_mocks.mdx b/api_docs/kbn_shared_ux_file_image_mocks.mdx index 2c952f5f59305..79a1bedab45ba 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-file-image-mocks'] --- import kbnSharedUxFileImageMocksObj from './kbn_shared_ux_file_image_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_mocks.mdx b/api_docs/kbn_shared_ux_file_mocks.mdx index 83fffb6caee73..cae34bb49ff58 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-04-27 +date: 2023-05-01 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 2f48cacf53c4e..06ceb9bbcf472 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-04-27 +date: 2023-05-01 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 d85b386c3c919..5ed22b5307510 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-04-27 +date: 2023-05-01 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 ce8cd67be00c7..ffa935447949e 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-04-27 +date: 2023-05-01 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 6c710ea50ff52..216cc3573eac0 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-04-27 +date: 2023-05-01 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 986734f31d4e3..8b704ccbcc3bc 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app'] --- import kbnSharedUxLinkRedirectAppObj from './kbn_shared_ux_link_redirect_app.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx b/api_docs/kbn_shared_ux_link_redirect_app_mocks.mdx index 828c558ebe9b9..a0fe2aed7e533 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-link-redirect-app-mocks'] --- import kbnSharedUxLinkRedirectAppMocksObj from './kbn_shared_ux_link_redirect_app_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown.mdx b/api_docs/kbn_shared_ux_markdown.mdx index ea57a84fb2745..77181f4ec6dac 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown'] --- import kbnSharedUxMarkdownObj from './kbn_shared_ux_markdown.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_markdown_mocks.mdx b/api_docs/kbn_shared_ux_markdown_mocks.mdx index 7cb1aa1b0a0c6..5c00a15eb5a3a 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-markdown-mocks'] --- import kbnSharedUxMarkdownMocksObj from './kbn_shared_ux_markdown_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data.mdx index 7b7273a118674..7cb6d6df036d1 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data'] --- import kbnSharedUxPageAnalyticsNoDataObj from './kbn_shared_ux_page_analytics_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_analytics_no_data_mocks.mdx index 3484280d1d2de..c2737edaf8442 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-analytics-no-data-mocks'] --- import kbnSharedUxPageAnalyticsNoDataMocksObj from './kbn_shared_ux_page_analytics_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data.mdx index e00dcbe751401..01e331f81c753 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data'] --- import kbnSharedUxPageKibanaNoDataObj from './kbn_shared_ux_page_kibana_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_no_data_mocks.mdx index 424fe7ffb701b..371b97e372d41 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-no-data-mocks'] --- import kbnSharedUxPageKibanaNoDataMocksObj from './kbn_shared_ux_page_kibana_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template.mdx b/api_docs/kbn_shared_ux_page_kibana_template.mdx index f73780685b1a6..ce6e25545bd1c 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template'] --- import kbnSharedUxPageKibanaTemplateObj from './kbn_shared_ux_page_kibana_template.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx b/api_docs/kbn_shared_ux_page_kibana_template_mocks.mdx index 099611175d63c..c5b6526277c99 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-kibana-template-mocks'] --- import kbnSharedUxPageKibanaTemplateMocksObj from './kbn_shared_ux_page_kibana_template_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data.mdx b/api_docs/kbn_shared_ux_page_no_data.mdx index 02b905ff1a6d2..bbd59ca5b5d73 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data'] --- import kbnSharedUxPageNoDataObj from './kbn_shared_ux_page_no_data.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config.mdx b/api_docs/kbn_shared_ux_page_no_data_config.mdx index 8fda0b291edce..41a9829a533a2 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config'] --- import kbnSharedUxPageNoDataConfigObj from './kbn_shared_ux_page_no_data_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_config_mocks.mdx index 535cd3147120f..7c35a0649af64 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-config-mocks'] --- import kbnSharedUxPageNoDataConfigMocksObj from './kbn_shared_ux_page_no_data_config_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_no_data_mocks.mdx b/api_docs/kbn_shared_ux_page_no_data_mocks.mdx index 32d03b3ac9b3d..e412b37a9a38a 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-no-data-mocks'] --- import kbnSharedUxPageNoDataMocksObj from './kbn_shared_ux_page_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_page_solution_nav.mdx b/api_docs/kbn_shared_ux_page_solution_nav.mdx index 36eaa387bc2de..c99e6e7ae02ad 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-page-solution-nav'] --- import kbnSharedUxPageSolutionNavObj from './kbn_shared_ux_page_solution_nav.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views.mdx index 9402a6e2233d5..ac29f3ad88580 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views'] --- import kbnSharedUxPromptNoDataViewsObj from './kbn_shared_ux_prompt_no_data_views.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx b/api_docs/kbn_shared_ux_prompt_no_data_views_mocks.mdx index 98920b4a643b1..c33d761fdbbc6 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-prompt-no-data-views-mocks'] --- import kbnSharedUxPromptNoDataViewsMocksObj from './kbn_shared_ux_prompt_no_data_views_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_prompt_not_found.mdx b/api_docs/kbn_shared_ux_prompt_not_found.mdx index e7fec9693e2ce..327a0861d3def 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-04-27 +date: 2023-05-01 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 a6b72ffdd1bea..11c80e130a428 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router'] --- import kbnSharedUxRouterObj from './kbn_shared_ux_router.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_router_mocks.mdx b/api_docs/kbn_shared_ux_router_mocks.mdx index a4562955d9236..dbcab339fdf4d 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-router-mocks'] --- import kbnSharedUxRouterMocksObj from './kbn_shared_ux_router_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_config.mdx b/api_docs/kbn_shared_ux_storybook_config.mdx index 33c152d499466..1fdadb1f51dc9 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-config'] --- import kbnSharedUxStorybookConfigObj from './kbn_shared_ux_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_storybook_mock.mdx b/api_docs/kbn_shared_ux_storybook_mock.mdx index c26481e970348..963a9828ad7b7 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-storybook-mock'] --- import kbnSharedUxStorybookMockObj from './kbn_shared_ux_storybook_mock.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_utility.mdx b/api_docs/kbn_shared_ux_utility.mdx index 3b7b6b9a1b6aa..7ef3f5978f256 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-utility'] --- import kbnSharedUxUtilityObj from './kbn_shared_ux_utility.devdocs.json'; diff --git a/api_docs/kbn_slo_schema.mdx b/api_docs/kbn_slo_schema.mdx index b13428ef90dc1..4c8d421791a5b 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-04-27 +date: 2023-05-01 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 a100aff3a626f..73c859a011414 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/some-dev-log'] --- import kbnSomeDevLogObj from './kbn_some_dev_log.devdocs.json'; diff --git a/api_docs/kbn_std.mdx b/api_docs/kbn_std.mdx index d48c83da423a0..eaab301bf100b 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/std'] --- import kbnStdObj from './kbn_std.devdocs.json'; diff --git a/api_docs/kbn_stdio_dev_helpers.mdx b/api_docs/kbn_stdio_dev_helpers.mdx index d020f53a8b5ce..4d428760367f1 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/stdio-dev-helpers'] --- import kbnStdioDevHelpersObj from './kbn_stdio_dev_helpers.devdocs.json'; diff --git a/api_docs/kbn_storybook.mdx b/api_docs/kbn_storybook.mdx index 07f9f3086df7d..e6b20d6baf06c 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] --- import kbnStorybookObj from './kbn_storybook.devdocs.json'; diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index 86e7ad6d15c6b..6c09694272a58 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/telemetry-tools'] --- import kbnTelemetryToolsObj from './kbn_telemetry_tools.devdocs.json'; diff --git a/api_docs/kbn_test.mdx b/api_docs/kbn_test.mdx index aa1a187d203aa..19f3ea03d22b9 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test'] --- import kbnTestObj from './kbn_test.devdocs.json'; diff --git a/api_docs/kbn_test_jest_helpers.mdx b/api_docs/kbn_test_jest_helpers.mdx index da5ec02b30f60..430fc90770edc 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-jest-helpers'] --- import kbnTestJestHelpersObj from './kbn_test_jest_helpers.devdocs.json'; diff --git a/api_docs/kbn_test_subj_selector.mdx b/api_docs/kbn_test_subj_selector.mdx index 0f2acce4b6fe0..14a5f2d2a70ae 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index 46d6d562e5acb..7afd5923ff137 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-04-27 +date: 2023-05-01 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 e011d5fa4aed2..d74aa64b2a9fe 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-04-27 +date: 2023-05-01 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 c6ec66f3487ad..4f7ca2ce60393 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/typed-react-router-config'] --- import kbnTypedReactRouterConfigObj from './kbn_typed_react_router_config.devdocs.json'; diff --git a/api_docs/kbn_ui_actions_browser.mdx b/api_docs/kbn_ui_actions_browser.mdx index a5d7e66a380a4..159a36f6c550b 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-04-27 +date: 2023-05-01 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 83e84dd3754c8..f48de62522f13 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-shared-deps-src'] --- import kbnUiSharedDepsSrcObj from './kbn_ui_shared_deps_src.devdocs.json'; diff --git a/api_docs/kbn_ui_theme.mdx b/api_docs/kbn_ui_theme.mdx index 3860f9d826329..b4ca804310eee 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-04-27 +date: 2023-05-01 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 4b9e1dd246289..fcf754b9ec9b6 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-04-27 +date: 2023-05-01 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 4f65a2f438ca8..52632f5fa3661 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/user-profile-components'] --- import kbnUserProfileComponentsObj from './kbn_user_profile_components.devdocs.json'; diff --git a/api_docs/kbn_utility_types.mdx b/api_docs/kbn_utility_types.mdx index 5e4919dd16064..95671428b0780 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types'] --- import kbnUtilityTypesObj from './kbn_utility_types.devdocs.json'; diff --git a/api_docs/kbn_utility_types_jest.mdx b/api_docs/kbn_utility_types_jest.mdx index aef94718c4074..9dbcae54c5664 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utility-types-jest'] --- import kbnUtilityTypesJestObj from './kbn_utility_types_jest.devdocs.json'; diff --git a/api_docs/kbn_utils.mdx b/api_docs/kbn_utils.mdx index 07b1eb02f5fd8..bcfe38b3f670e 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] --- import kbnUtilsObj from './kbn_utils.devdocs.json'; diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx index dddee1a05874a..121cd43926fb9 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/yarn-lock-validator'] --- import kbnYarnLockValidatorObj from './kbn_yarn_lock_validator.devdocs.json'; diff --git a/api_docs/kibana_overview.mdx b/api_docs/kibana_overview.mdx index 9928e1e161c7c..eb4ae18815452 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview'] --- import kibanaOverviewObj from './kibana_overview.devdocs.json'; diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index 46f823f01b2c1..642de97465331 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaReact'] --- import kibanaReactObj from './kibana_react.devdocs.json'; diff --git a/api_docs/kibana_utils.mdx b/api_docs/kibana_utils.mdx index a6de3b75fbd2c..67d9e28d2f40c 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaUtils'] --- import kibanaUtilsObj from './kibana_utils.devdocs.json'; diff --git a/api_docs/kubernetes_security.mdx b/api_docs/kubernetes_security.mdx index 3f3e27597cca8..4b60620fc6bd0 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-04-27 +date: 2023-05-01 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 d656ca23a7220..4e11f3addf051 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-04-27 +date: 2023-05-01 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 fddd740bdb8db..80b5f53f7caf9 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseApiGuard'] --- import licenseApiGuardObj from './license_api_guard.devdocs.json'; diff --git a/api_docs/license_management.mdx b/api_docs/license_management.mdx index 444de7367a8f9..98f6f502d73dc 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licenseManagement'] --- import licenseManagementObj from './license_management.devdocs.json'; diff --git a/api_docs/licensing.mdx b/api_docs/licensing.mdx index 61d7f90a7a571..f65493e07319f 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] --- import licensingObj from './licensing.devdocs.json'; diff --git a/api_docs/lists.devdocs.json b/api_docs/lists.devdocs.json index a5d1cf263468f..3475f58d0d237 100644 --- a/api_docs/lists.devdocs.json +++ b/api_docs/lists.devdocs.json @@ -4253,27 +4253,7 @@ "TransportRequestOptions", " | undefined): Promise<", "CountResponse", - ">; }; exists: { (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithOutMeta", - " | undefined): Promise; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithMeta", - " | undefined): Promise<", - "TransportResult", - ">; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined): Promise; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", + ">; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", "default", "; child: (opts: ", "ClientOptions", @@ -4451,7 +4431,27 @@ "default", "; eql: ", "default", - "; existsSource: { (this: That, params: ", + "; exists: { (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; existsSource: { (this: That, params: ", "ExistsSourceRequest", " | ", "ExistsSourceRequest", diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index 584562d09b4f7..c8458ff7e1136 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/management.mdx b/api_docs/management.mdx index 4d0c20d371087..5fe072e5650ed 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-04-27 +date: 2023-05-01 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 887eb79fdf90b..fcaa5a1b6df2d 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-04-27 +date: 2023-05-01 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 40b4df3df656b..32fe06d1b34a1 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] --- import mapsEmsObj from './maps_ems.devdocs.json'; diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index 6869752efc349..1a9e4a6ddbf19 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ml'] --- import mlObj from './ml.devdocs.json'; diff --git a/api_docs/monitoring.mdx b/api_docs/monitoring.mdx index 698eb1d218eec..76f7c28a60eb1 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoring'] --- import monitoringObj from './monitoring.devdocs.json'; diff --git a/api_docs/monitoring_collection.mdx b/api_docs/monitoring_collection.mdx index 182c16c901f3a..e675c73ac25af 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'monitoringCollection'] --- import monitoringCollectionObj from './monitoring_collection.devdocs.json'; diff --git a/api_docs/navigation.mdx b/api_docs/navigation.mdx index 894018d6851bf..010e85b6c8c21 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'navigation'] --- import navigationObj from './navigation.devdocs.json'; diff --git a/api_docs/newsfeed.mdx b/api_docs/newsfeed.mdx index dfb07d4c51d99..379179e9cbdee 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] --- import newsfeedObj from './newsfeed.devdocs.json'; diff --git a/api_docs/notifications.mdx b/api_docs/notifications.mdx index 220404c1ab3a8..6906cae6c4818 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'notifications'] --- import notificationsObj from './notifications.devdocs.json'; diff --git a/api_docs/observability.devdocs.json b/api_docs/observability.devdocs.json index 73041b8266e5d..87867cdc7bb3e 100644 --- a/api_docs/observability.devdocs.json +++ b/api_docs/observability.devdocs.json @@ -5771,27 +5771,7 @@ "TransportRequestOptions", " | undefined): Promise<", "CountResponse", - ">; }; exists: { (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithOutMeta", - " | undefined): Promise; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithMeta", - " | undefined): Promise<", - "TransportResult", - ">; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined): Promise; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", + ">; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", "default", "; child: (opts: ", "ClientOptions", @@ -5969,7 +5949,27 @@ "default", "; eql: ", "default", - "; existsSource: { (this: That, params: ", + "; exists: { (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; existsSource: { (this: That, params: ", "ExistsSourceRequest", " | ", "ExistsSourceRequest", @@ -7056,27 +7056,7 @@ "TransportRequestOptions", " | undefined): Promise<", "CountResponse", - ">; }; exists: { (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithOutMeta", - " | undefined): Promise; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithMeta", - " | undefined): Promise<", - "TransportResult", - ">; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined): Promise; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", + ">; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", "default", "; child: (opts: ", "ClientOptions", @@ -7254,7 +7234,27 @@ "default", "; eql: ", "default", - "; existsSource: { (this: That, params: ", + "; exists: { (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; existsSource: { (this: That, params: ", "ExistsSourceRequest", " | ", "ExistsSourceRequest", diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index de1e0716ccfa7..07b00ad814062 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx index 0be173da90e72..61df169fd444a 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-04-27 +date: 2023-05-01 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 aa0b5395743b0..9dbdea5b6d4de 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityShared'] --- import observabilitySharedObj from './observability_shared.devdocs.json'; diff --git a/api_docs/osquery.mdx b/api_docs/osquery.mdx index 61602bf02ecf6..27e00142e92e4 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] --- import osqueryObj from './osquery.devdocs.json'; diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index 883632de45d5b..adeeaa054fe98 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -15,13 +15,13 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Count | Plugins or Packages with a
public API | Number of teams | |--------------|----------|------------------------| -| 606 | 501 | 37 | +| 610 | 504 | 37 | ### Public API health stats | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 69328 | 526 | 59787 | 1340 | +| 69550 | 526 | 59988 | 1349 | ## Plugin Directory @@ -36,7 +36,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 9 | 0 | 9 | 0 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Considering using bfetch capabilities when fetching large amounts of data. This services supports batching HTTP requests and streaming responses back. | 91 | 1 | 75 | 2 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds Canvas application to Kibana | 9 | 0 | 8 | 3 | -| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | The Case management system in Kibana | 96 | 0 | 79 | 32 | +| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | The Case management system in Kibana | 98 | 0 | 81 | 31 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 271 | 16 | 256 | 10 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 41 | 0 | 11 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | Chat available on Elastic Cloud deployments for quicker assistance. | 1 | 0 | 0 | 0 | @@ -52,23 +52,23 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | The Controls Plugin contains embeddable components intended to create a simple query interface for end users, and a powerful editing suite that allows dashboard authors to build controls | 301 | 0 | 294 | 13 | | crossClusterReplication | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 0 | 0 | 0 | 0 | | customBranding | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Enables customization of Kibana | 0 | 0 | 0 | 0 | -| | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | Add custom data integrations so they can be displayed in the Fleet integrations app | 271 | 0 | 252 | 1 | +| | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | Add custom data integrations so they can be displayed in the Fleet integrations app | 274 | 0 | 255 | 1 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds the Dashboard app to Kibana | 130 | 0 | 125 | 7 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 54 | 0 | 51 | 0 | -| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. | 3271 | 119 | 2577 | 27 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Data services are useful for searching and querying data from Elasticsearch. Helpful utilities include: a re-usable react query bar, KQL autocomplete, async search, Data Views (Index Patterns) and field formatters. | 3273 | 119 | 2579 | 27 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | This plugin provides the ability to create data views via a modal flyout inside Kibana apps | 16 | 0 | 7 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Reusable data view field editor across Kibana | 72 | 0 | 33 | 0 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Data view management app | 2 | 0 | 2 | 0 | | | [@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. | 97 | 0 | 78 | 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 | 77 | 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 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Extends embeddable plugin with more functionality | 14 | 0 | 14 | 0 | | | [@elastic/kibana-security](https://github.com/orgs/elastic/teams/kibana-security) | This plugin provides encryption and decryption utilities for saved objects containing sensitive information. | 51 | 0 | 44 | 0 | -| | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | Adds dashboards for discovering and managing Enterprise Search products. | 7 | 0 | 7 | 0 | +| | [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/teams/enterprise-search-frontend) | Adds dashboards for discovering and managing Enterprise Search products. | 9 | 0 | 9 | 0 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 114 | 3 | 110 | 5 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | The Event Annotation service contains expressions for event annotations | 172 | 30 | 172 | 3 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 116 | 0 | 116 | 11 | @@ -90,7 +90,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 235 | 0 | 99 | 2 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Index pattern fields and ambiguous values formatters | 288 | 26 | 249 | 3 | | | [@elastic/kibana-gis](https://github.com/orgs/elastic/teams/kibana-gis) | The file upload plugin contains components and services for uploading a file, analyzing its data, and then importing the data into an Elasticsearch index. Supported file types include CSV, TSV, newline-delimited JSON and GeoJSON. | 62 | 0 | 62 | 2 | -| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | File upload, download, sharing, and serving over HTTP implementation in Kibana. | 219 | 0 | 10 | 6 | +| | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | File upload, download, sharing, and serving over HTTP implementation in Kibana. | 235 | 0 | 23 | 8 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Simple UI for managing files in Kibana | 2 | 1 | 2 | 0 | | | [@elastic/fleet](https://github.com/orgs/elastic/teams/fleet) | - | 1110 | 3 | 1005 | 28 | | ftrApis | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 0 | 0 | 0 | 0 | @@ -104,7 +104,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | Image embeddable | 3 | 0 | 3 | 1 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 4 | 0 | 4 | 0 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 177 | 0 | 172 | 3 | -| | [@elastic/infra-monitoring-ui](https://github.com/orgs/elastic/teams/infra-monitoring-ui) | This plugin visualizes data from Filebeat and Metricbeat, and integrates with other Observability solutions | 47 | 0 | 44 | 12 | +| | [@elastic/infra-monitoring-ui](https://github.com/orgs/elastic/teams/infra-monitoring-ui) | This plugin visualizes data from Filebeat and Metricbeat, and integrates with other Observability solutions | 48 | 0 | 45 | 13 | | ingestPipelines | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 0 | 0 | 0 | 0 | | inputControlVis | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds Input Control visualization to Kibana | 0 | 0 | 0 | 0 | | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | - | 123 | 2 | 96 | 4 | @@ -153,6 +153,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@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) | - | 117 | 0 | 76 | 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) | Serverless customizations for search. | 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 | @@ -193,6 +194,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Registers the vega visualization. Is the elastic version of vega and vega-lite libraries. | 2 | 0 | 2 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Contains the vislib visualizations. These are the classical area/line/bar, gauge/goal and heatmap charts. We want to replace them with elastic-charts. | 1 | 0 | 1 | 0 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Contains the new xy-axis chart using the elastic-charts library, which will eventually replace the vislib xy-axis charts including bar, area, and line. | 52 | 0 | 50 | 5 | +| | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | - | 124 | 0 | 119 | 4 | | | [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) | Contains the shared architecture among all the legacy visualizations, e.g. the visualization type registry or the visualization embeddable. | 800 | 12 | 770 | 18 | | watcher | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 0 | 0 | 0 | 0 | @@ -235,7 +237,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 129 | 3 | 127 | 17 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 6 | 0 | 4 | 4 | | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 21 | 0 | 14 | 5 | -| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 64 | 1 | 15 | 0 | +| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 106 | 1 | 57 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 4 | 0 | 0 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 7 | 0 | 7 | 1 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 4 | 0 | 4 | 0 | @@ -359,12 +361,12 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 2 | 0 | 1 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 6 | 0 | 6 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 7 | 0 | 7 | 0 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 71 | 0 | 39 | 0 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 73 | 0 | 40 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 25 | 0 | 23 | 0 | | | [@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) | - | 122 | 0 | 87 | 46 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 12 | 0 | 12 | 0 | -| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 510 | 1 | 106 | 4 | +| | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 512 | 1 | 106 | 4 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 69 | 0 | 69 | 4 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 14 | 0 | 14 | 0 | | | [@elastic/kibana-core](https://github.com/orgs/elastic/teams/kibana-core) | - | 30 | 0 | 6 | 0 | @@ -505,6 +507,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) | - | 21 | 0 | 11 | 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 2b6396b06331d..54b635f8eeaff 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationUtil'] --- import presentationUtilObj from './presentation_util.devdocs.json'; diff --git a/api_docs/profiling.mdx b/api_docs/profiling.mdx index 7006f4b542da7..752506986f992 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profiling'] --- import profilingObj from './profiling.devdocs.json'; diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx index 69fbc2e31a614..d907af3ec5623 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'remoteClusters'] --- import remoteClustersObj from './remote_clusters.devdocs.json'; diff --git a/api_docs/reporting.mdx b/api_docs/reporting.mdx index ba4cdd9ab4c96..170811d947e11 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'reporting'] --- import reportingObj from './reporting.devdocs.json'; diff --git a/api_docs/rollup.mdx b/api_docs/rollup.mdx index 69372889d4bd0..dd5cf133437cb 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'rollup'] --- import rollupObj from './rollup.devdocs.json'; diff --git a/api_docs/rule_registry.mdx b/api_docs/rule_registry.mdx index 48dc094b5b50d..0e7d1db5e232e 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ruleRegistry'] --- import ruleRegistryObj from './rule_registry.devdocs.json'; diff --git a/api_docs/runtime_fields.mdx b/api_docs/runtime_fields.mdx index 57694b8f48018..7cd431076c790 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'runtimeFields'] --- import runtimeFieldsObj from './runtime_fields.devdocs.json'; diff --git a/api_docs/saved_objects.mdx b/api_docs/saved_objects.mdx index 4f198ba60896b..d01f96731d1e7 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjects'] --- import savedObjectsObj from './saved_objects.devdocs.json'; diff --git a/api_docs/saved_objects_finder.mdx b/api_docs/saved_objects_finder.mdx index 252364e139c95..96772a710eb30 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsFinder'] --- import savedObjectsFinderObj from './saved_objects_finder.devdocs.json'; diff --git a/api_docs/saved_objects_management.devdocs.json b/api_docs/saved_objects_management.devdocs.json index 5e33f4d84a296..18bcb79ec2a96 100644 --- a/api_docs/saved_objects_management.devdocs.json +++ b/api_docs/saved_objects_management.devdocs.json @@ -532,7 +532,7 @@ "label": "obj", "description": [], "signature": [ - "{ type: string; id: string; meta: { title?: string | undefined; icon?: string | undefined; }; overwrite?: boolean | undefined; }" + "{ type: string; id: string; meta: { title?: string | undefined; icon?: string | undefined; }; managed?: boolean | undefined; overwrite?: boolean | undefined; }" ], "path": "src/plugins/saved_objects_management/public/lib/process_import_response.ts", "deprecated": false, diff --git a/api_docs/saved_objects_management.mdx b/api_docs/saved_objects_management.mdx index a15a343637d47..2a2fcee3d7630 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsManagement'] --- import savedObjectsManagementObj from './saved_objects_management.devdocs.json'; diff --git a/api_docs/saved_objects_tagging.mdx b/api_docs/saved_objects_tagging.mdx index 73ed3e1ec7a94..5c6bee0dceae0 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTagging'] --- import savedObjectsTaggingObj from './saved_objects_tagging.devdocs.json'; diff --git a/api_docs/saved_objects_tagging_oss.mdx b/api_docs/saved_objects_tagging_oss.mdx index adaa424839840..9ec8f360b2361 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsTaggingOss'] --- import savedObjectsTaggingOssObj from './saved_objects_tagging_oss.devdocs.json'; diff --git a/api_docs/saved_search.mdx b/api_docs/saved_search.mdx index 87b52eb6417a5..9a6469372b840 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedSearch'] --- import savedSearchObj from './saved_search.devdocs.json'; diff --git a/api_docs/screenshot_mode.mdx b/api_docs/screenshot_mode.mdx index 88102b6e2f0fe..ede524684687c 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotMode'] --- import screenshotModeObj from './screenshot_mode.devdocs.json'; diff --git a/api_docs/screenshotting.mdx b/api_docs/screenshotting.mdx index d60d11b94c3bc..114722a58f020 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'screenshotting'] --- import screenshottingObj from './screenshotting.devdocs.json'; diff --git a/api_docs/security.mdx b/api_docs/security.mdx index c7f3fe3cfa129..886656e3bd3a7 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'security'] --- import securityObj from './security.devdocs.json'; diff --git a/api_docs/security_solution.mdx b/api_docs/security_solution.mdx index 191c989efceee..363ba0127ea76 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.devdocs.json'; diff --git a/api_docs/serverless.mdx b/api_docs/serverless.mdx index 69b31bf765193..a58b94c164d9b 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverless'] --- import serverlessObj from './serverless.devdocs.json'; diff --git a/api_docs/serverless_search.devdocs.json b/api_docs/serverless_search.devdocs.json new file mode 100644 index 0000000000000..0dda44c3607af --- /dev/null +++ b/api_docs/serverless_search.devdocs.json @@ -0,0 +1,114 @@ +{ + "id": "serverlessSearch", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [], + "setup": { + "parentPluginId": "serverlessSearch", + "id": "def-public.ServerlessSearchPluginSetup", + "type": "Interface", + "tags": [], + "label": "ServerlessSearchPluginSetup", + "description": [], + "path": "x-pack/plugins/serverless_search/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "lifecycle": "setup", + "initialIsOpen": true + }, + "start": { + "parentPluginId": "serverlessSearch", + "id": "def-public.ServerlessSearchPluginStart", + "type": "Interface", + "tags": [], + "label": "ServerlessSearchPluginStart", + "description": [], + "path": "x-pack/plugins/serverless_search/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "lifecycle": "start", + "initialIsOpen": true + } + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [], + "setup": { + "parentPluginId": "serverlessSearch", + "id": "def-server.ServerlessSearchPluginSetup", + "type": "Interface", + "tags": [], + "label": "ServerlessSearchPluginSetup", + "description": [], + "path": "x-pack/plugins/serverless_search/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "lifecycle": "setup", + "initialIsOpen": true + }, + "start": { + "parentPluginId": "serverlessSearch", + "id": "def-server.ServerlessSearchPluginStart", + "type": "Interface", + "tags": [], + "label": "ServerlessSearchPluginStart", + "description": [], + "path": "x-pack/plugins/serverless_search/server/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "lifecycle": "start", + "initialIsOpen": true + } + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [ + { + "parentPluginId": "serverlessSearch", + "id": "def-common.PLUGIN_ID", + "type": "string", + "tags": [], + "label": "PLUGIN_ID", + "description": [], + "signature": [ + "\"serverlessSearch\"" + ], + "path": "x-pack/plugins/serverless_search/common/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "serverlessSearch", + "id": "def-common.PLUGIN_NAME", + "type": "string", + "tags": [], + "label": "PLUGIN_NAME", + "description": [], + "signature": [ + "\"serverlessSearch\"" + ], + "path": "x-pack/plugins/serverless_search/common/index.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/serverless_search.mdx b/api_docs/serverless_search.mdx new file mode 100644 index 0000000000000..03dd654fce868 --- /dev/null +++ b/api_docs/serverless_search.mdx @@ -0,0 +1,46 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibServerlessSearchPluginApi +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-01 +tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessSearch'] +--- +import serverlessSearchObj from './serverless_search.devdocs.json'; + +Serverless customizations for search. + +Contact [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 6 | 0 | 6 | 0 | + +## Client + +### Setup + + +### Start + + +## Server + +### Setup + + +### Start + + +## Common + +### Consts, variables and types + + diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index 3a6116597f3a0..810c9a8dd6520 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'sessionView'] --- import sessionViewObj from './session_view.devdocs.json'; diff --git a/api_docs/share.mdx b/api_docs/share.mdx index d3a04ae12366d..b5c75d1d592f8 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'share'] --- import shareObj from './share.devdocs.json'; diff --git a/api_docs/snapshot_restore.mdx b/api_docs/snapshot_restore.mdx index ed472c418e1a8..c26d4364f3e83 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'snapshotRestore'] --- import snapshotRestoreObj from './snapshot_restore.devdocs.json'; diff --git a/api_docs/spaces.mdx b/api_docs/spaces.mdx index 6a73e47b1e2e9..a8c10ccc11710 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'spaces'] --- import spacesObj from './spaces.devdocs.json'; diff --git a/api_docs/stack_alerts.mdx b/api_docs/stack_alerts.mdx index ed7e7d080f1d4..23f886791ac84 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackAlerts'] --- import stackAlertsObj from './stack_alerts.devdocs.json'; diff --git a/api_docs/stack_connectors.mdx b/api_docs/stack_connectors.mdx index 218d201b660a5..9f6abfd2f562f 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'stackConnectors'] --- import stackConnectorsObj from './stack_connectors.devdocs.json'; diff --git a/api_docs/task_manager.mdx b/api_docs/task_manager.mdx index e5865130c4776..1845114e48233 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'taskManager'] --- import taskManagerObj from './task_manager.devdocs.json'; diff --git a/api_docs/telemetry.mdx b/api_docs/telemetry.mdx index a213a3af8305d..ee62c90dc3835 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetry'] --- import telemetryObj from './telemetry.devdocs.json'; diff --git a/api_docs/telemetry_collection_manager.devdocs.json b/api_docs/telemetry_collection_manager.devdocs.json index 0cc262ea12f13..7556db94efa9e 100644 --- a/api_docs/telemetry_collection_manager.devdocs.json +++ b/api_docs/telemetry_collection_manager.devdocs.json @@ -244,27 +244,7 @@ "TransportRequestOptions", " | undefined): Promise<", "CountResponse", - ">; }; exists: { (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithOutMeta", - " | undefined): Promise; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithMeta", - " | undefined): Promise<", - "TransportResult", - ">; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined): Promise; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", + ">; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", "default", "; child: (opts: ", "ClientOptions", @@ -442,7 +422,27 @@ "default", "; eql: ", "default", - "; existsSource: { (this: That, params: ", + "; exists: { (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; existsSource: { (this: That, params: ", "ExistsSourceRequest", " | ", "ExistsSourceRequest", diff --git a/api_docs/telemetry_collection_manager.mdx b/api_docs/telemetry_collection_manager.mdx index 28c654ba36193..91e89188b524b 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionManager'] --- import telemetryCollectionManagerObj from './telemetry_collection_manager.devdocs.json'; diff --git a/api_docs/telemetry_collection_xpack.mdx b/api_docs/telemetry_collection_xpack.mdx index a79bdb42519ba..50e156a374e20 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryCollectionXpack'] --- import telemetryCollectionXpackObj from './telemetry_collection_xpack.devdocs.json'; diff --git a/api_docs/telemetry_management_section.mdx b/api_docs/telemetry_management_section.mdx index 983bf84a16215..06825e2222371 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index b18cf3b2b5341..c0ff29990df8d 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'threatIntelligence'] --- import threatIntelligenceObj from './threat_intelligence.devdocs.json'; diff --git a/api_docs/timelines.devdocs.json b/api_docs/timelines.devdocs.json index e4d3828ddeef0..9726c2e691410 100644 --- a/api_docs/timelines.devdocs.json +++ b/api_docs/timelines.devdocs.json @@ -4327,6 +4327,10 @@ "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/public/common/lib/kuery/index.ts" }, + { + "plugin": "securitySolution", + "path": "x-pack/plugins/security_solution/public/common/lib/kuery/index.ts" + }, { "plugin": "securitySolution", "path": "x-pack/plugins/security_solution/public/common/components/drag_and_drop/helpers.ts" diff --git a/api_docs/timelines.mdx b/api_docs/timelines.mdx index 2e69c632ffc66..2f425dcd8c47f 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'timelines'] --- import timelinesObj from './timelines.devdocs.json'; diff --git a/api_docs/transform.mdx b/api_docs/transform.mdx index fc32b21d58ede..a4f5601204273 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-04-27 +date: 2023-05-01 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 e5228f222fd15..268a508829116 100644 --- a/api_docs/triggers_actions_ui.devdocs.json +++ b/api_docs/triggers_actions_ui.devdocs.json @@ -5870,7 +5870,9 @@ "EuiDataGridToolBarAdditionalControlsOptions", " | undefined; showInspectButton?: boolean | undefined; toolbarVisibility?: ", "EuiDataGridToolBarVisibilityOptions", - " | undefined; } & Partial boolean) | undefined; } & Partial>" ], diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx index 2be185fee6d5a..41caa68d6c583 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'triggersActionsUi'] --- import triggersActionsUiObj from './triggers_actions_ui.devdocs.json'; diff --git a/api_docs/ui_actions.mdx b/api_docs/ui_actions.mdx index f117e0cbf7d60..fdb672f2ecca3 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActions'] --- import uiActionsObj from './ui_actions.devdocs.json'; diff --git a/api_docs/ui_actions_enhanced.mdx b/api_docs/ui_actions_enhanced.mdx index bb79914c3eda2..ab38c683aa770 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-04-27 +date: 2023-05-01 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 c07ccbf4416d2..b6337f09e6eba 100644 --- a/api_docs/unified_field_list.devdocs.json +++ b/api_docs/unified_field_list.devdocs.json @@ -361,7 +361,7 @@ "section": "def-public.FieldPopoverFooterProps", "text": "FieldPopoverFooterProps" }, - ">) => JSX.Element | null" + ">) => JSX.Element" ], "path": "src/plugins/unified_field_list/public/components/field_popover/field_popover_footer.tsx", "deprecated": false, diff --git a/api_docs/unified_field_list.mdx b/api_docs/unified_field_list.mdx index d8f2a8deb70a4..38aa851ab2035 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedFieldList'] --- import unifiedFieldListObj from './unified_field_list.devdocs.json'; diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx index d291087a46522..610c20e51aead 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedHistogram'] --- import unifiedHistogramObj from './unified_histogram.devdocs.json'; diff --git a/api_docs/unified_search.mdx b/api_docs/unified_search.mdx index 0e4eb30a87f09..8263fb2bb0dec 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch'] --- import unifiedSearchObj from './unified_search.devdocs.json'; diff --git a/api_docs/unified_search_autocomplete.mdx b/api_docs/unified_search_autocomplete.mdx index 3b85c9cf9e2ea..a6473b15bc3b9 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch.autocomplete'] --- import unifiedSearchAutocompleteObj from './unified_search_autocomplete.devdocs.json'; diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx index a63a95f30dbb6..d18b68be04b81 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'urlForwarding'] --- import urlForwardingObj from './url_forwarding.devdocs.json'; diff --git a/api_docs/usage_collection.devdocs.json b/api_docs/usage_collection.devdocs.json index 0f4c06857c3b8..83239792457c0 100644 --- a/api_docs/usage_collection.devdocs.json +++ b/api_docs/usage_collection.devdocs.json @@ -513,27 +513,7 @@ "TransportRequestOptions", " | undefined): Promise<", "CountResponse", - ">; }; exists: { (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithOutMeta", - " | undefined): Promise; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptionsWithMeta", - " | undefined): Promise<", - "TransportResult", - ">; (this: That, params: ", - "ExistsRequest", - " | ", - "ExistsRequest", - ", options?: ", - "TransportRequestOptions", - " | undefined): Promise; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", + ">; }; [kAsyncSearch]: symbol | null; [kAutoscaling]: symbol | null; [kCat]: symbol | null; [kCcr]: symbol | null; [kCluster]: symbol | null; [kDanglingIndices]: symbol | null; [kEnrich]: symbol | null; [kEql]: symbol | null; [kFeatures]: symbol | null; [kFleet]: symbol | null; [kGraph]: symbol | null; [kIlm]: symbol | null; [kIndices]: symbol | null; [kIngest]: symbol | null; [kLicense]: symbol | null; [kLogstash]: symbol | null; [kMigration]: symbol | null; [kMl]: symbol | null; [kMonitoring]: symbol | null; [kNodes]: symbol | null; [kRollup]: symbol | null; [kSearchableSnapshots]: symbol | null; [kSecurity]: symbol | null; [kShutdown]: symbol | null; [kSlm]: symbol | null; [kSnapshot]: symbol | null; [kSql]: symbol | null; [kSsl]: symbol | null; [kTasks]: symbol | null; [kTextStructure]: symbol | null; [kTransform]: symbol | null; [kWatcher]: symbol | null; [kXpack]: symbol | null; transport: ", "default", "; child: (opts: ", "ClientOptions", @@ -711,7 +691,27 @@ "default", "; eql: ", "default", - "; existsSource: { (this: That, params: ", + "; exists: { (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithOutMeta", + " | undefined): Promise; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptionsWithMeta", + " | undefined): Promise<", + "TransportResult", + ">; (this: That, params: ", + "ExistsRequest", + " | ", + "ExistsRequest", + ", options?: ", + "TransportRequestOptions", + " | undefined): Promise; }; existsSource: { (this: That, params: ", "ExistsSourceRequest", " | ", "ExistsSourceRequest", diff --git a/api_docs/usage_collection.mdx b/api_docs/usage_collection.mdx index cdd492ce334bb..88fe982e60e75 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'usageCollection'] --- import usageCollectionObj from './usage_collection.devdocs.json'; diff --git a/api_docs/ux.mdx b/api_docs/ux.mdx index bc247134a86ad..96f57b3056c28 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ux'] --- import uxObj from './ux.devdocs.json'; diff --git a/api_docs/vis_default_editor.mdx b/api_docs/vis_default_editor.mdx index a6e83cc1abcc9..0aad9b18df868 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visDefaultEditor'] --- import visDefaultEditorObj from './vis_default_editor.devdocs.json'; diff --git a/api_docs/vis_type_gauge.mdx b/api_docs/vis_type_gauge.mdx index 88312cf7645d6..aa3953e2c3a5a 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeGauge'] --- import visTypeGaugeObj from './vis_type_gauge.devdocs.json'; diff --git a/api_docs/vis_type_heatmap.mdx b/api_docs/vis_type_heatmap.mdx index a9c4786d09fbd..0b966786a2656 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeHeatmap'] --- import visTypeHeatmapObj from './vis_type_heatmap.devdocs.json'; diff --git a/api_docs/vis_type_pie.mdx b/api_docs/vis_type_pie.mdx index b12590d79925d..c95a58629a131 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypePie'] --- import visTypePieObj from './vis_type_pie.devdocs.json'; diff --git a/api_docs/vis_type_table.mdx b/api_docs/vis_type_table.mdx index 97b172360d220..f24c7e54df520 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTable'] --- import visTypeTableObj from './vis_type_table.devdocs.json'; diff --git a/api_docs/vis_type_timelion.mdx b/api_docs/vis_type_timelion.mdx index 77e153dce6d31..d067ad4a383f5 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimelion'] --- import visTypeTimelionObj from './vis_type_timelion.devdocs.json'; diff --git a/api_docs/vis_type_timeseries.mdx b/api_docs/vis_type_timeseries.mdx index 09456773083e7..d39f9088ed2cc 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeTimeseries'] --- import visTypeTimeseriesObj from './vis_type_timeseries.devdocs.json'; diff --git a/api_docs/vis_type_vega.mdx b/api_docs/vis_type_vega.mdx index 0752971706bc2..ba994f82c9b2c 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVega'] --- import visTypeVegaObj from './vis_type_vega.devdocs.json'; diff --git a/api_docs/vis_type_vislib.mdx b/api_docs/vis_type_vislib.mdx index b80e05eec9477..fad80b28f780a 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeVislib'] --- import visTypeVislibObj from './vis_type_vislib.devdocs.json'; diff --git a/api_docs/vis_type_xy.mdx b/api_docs/vis_type_xy.mdx index 5268b7aa8ef22..e29026dfb0538 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] --- import visTypeXyObj from './vis_type_xy.devdocs.json'; diff --git a/api_docs/visualization_ui_components.devdocs.json b/api_docs/visualization_ui_components.devdocs.json new file mode 100644 index 0000000000000..aa98a976edc24 --- /dev/null +++ b/api_docs/visualization_ui_components.devdocs.json @@ -0,0 +1,2112 @@ +{ + "id": "visualizationUiComponents", + "client": { + "classes": [], + "functions": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.chroma", + "type": "Function", + "tags": [], + "label": "chroma", + "description": [ + "\nChroma.js is a tiny library for all kinds of color conversions and color scales." + ], + "signature": [ + "ChromaStatic" + ], + "path": "node_modules/@types/chroma-js/index.d.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.chroma", + "type": "Function", + "tags": [], + "label": "chroma", + "description": [], + "signature": [ + "ChromaStatic" + ], + "path": "node_modules/@types/chroma-js/index.d.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.ColorPicker", + "type": "Function", + "tags": [], + "label": "ColorPicker", + "description": [], + "signature": [ + "({ label, disableHelpTooltip, disabled, setConfig, defaultColor, overwriteColor, showAlpha, }: { overwriteColor?: string | null | undefined; defaultColor?: string | null | undefined; setConfig: (config: { color?: string | undefined; }) => void; label?: string | undefined; disableHelpTooltip?: boolean | undefined; disabled?: boolean | undefined; showAlpha?: boolean | undefined; }) => JSX.Element" + ], + "path": "src/plugins/visualization_ui_components/public/components/color_picker.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.ColorPicker.$1", + "type": "Object", + "tags": [], + "label": "{\n label,\n disableHelpTooltip,\n disabled,\n setConfig,\n defaultColor,\n overwriteColor,\n showAlpha,\n}", + "description": [], + "path": "src/plugins/visualization_ui_components/public/components/color_picker.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.ColorPicker.$1.overwriteColor", + "type": "CompoundType", + "tags": [], + "label": "overwriteColor", + "description": [], + "signature": [ + "string | null | undefined" + ], + "path": "src/plugins/visualization_ui_components/public/components/color_picker.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.ColorPicker.$1.defaultColor", + "type": "CompoundType", + "tags": [], + "label": "defaultColor", + "description": [], + "signature": [ + "string | null | undefined" + ], + "path": "src/plugins/visualization_ui_components/public/components/color_picker.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.ColorPicker.$1.setConfig", + "type": "Function", + "tags": [], + "label": "setConfig", + "description": [], + "signature": [ + "(config: { color?: string | undefined; }) => void" + ], + "path": "src/plugins/visualization_ui_components/public/components/color_picker.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.ColorPicker.$1.setConfig.$1", + "type": "Object", + "tags": [], + "label": "config", + "description": [], + "path": "src/plugins/visualization_ui_components/public/components/color_picker.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.ColorPicker.$1.setConfig.$1.color", + "type": "string", + "tags": [], + "label": "color", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/visualization_ui_components/public/components/color_picker.tsx", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [] + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.ColorPicker.$1.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/visualization_ui_components/public/components/color_picker.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.ColorPicker.$1.disableHelpTooltip", + "type": "CompoundType", + "tags": [], + "label": "disableHelpTooltip", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "src/plugins/visualization_ui_components/public/components/color_picker.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.ColorPicker.$1.disabled", + "type": "CompoundType", + "tags": [], + "label": "disabled", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "src/plugins/visualization_ui_components/public/components/color_picker.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.ColorPicker.$1.showAlpha", + "type": "CompoundType", + "tags": [], + "label": "showAlpha", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "src/plugins/visualization_ui_components/public/components/color_picker.tsx", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.DebouncedInput", + "type": "Function", + "tags": [], + "label": "DebouncedInput", + "description": [ + "\nWhen testing this component, mock the \"debounce\" function in lodash (see this module test for an example)" + ], + "signature": [ + "(props: Props) => JSX.Element" + ], + "path": "src/plugins/visualization_ui_components/public/components/debounced_input.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.DebouncedInput.$1", + "type": "CompoundType", + "tags": [], + "label": "props", + "description": [], + "signature": [ + "Props" + ], + "path": "src/plugins/visualization_ui_components/public/components/debounced_input.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.DimensionButton", + "type": "Function", + "tags": [], + "label": "DimensionButton", + "description": [], + "signature": [ + "({\n groupLabel,\n children,\n onClick,\n onRemoveClick,\n accessorConfig,\n label,\n message,\n ...otherProps // from Drag&Drop integration\n}: { className?: string | undefined; groupLabel: string; children: React.ReactElement>; onClick: (id: string) => void; onRemoveClick: (id: string) => void; accessorConfig: ", + { + "pluginId": "visualizationUiComponents", + "scope": "public", + "docId": "kibVisualizationUiComponentsPluginApi", + "section": "def-public.AccessorConfig", + "text": "AccessorConfig" + }, + "; label: string; message?: ", + "Message", + " | undefined; }) => JSX.Element" + ], + "path": "src/plugins/visualization_ui_components/public/components/dimension_buttons/dimension_button.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.DimensionButton.$1", + "type": "Object", + "tags": [], + "label": "{\n groupLabel,\n children,\n onClick,\n onRemoveClick,\n accessorConfig,\n label,\n message,\n ...otherProps // from Drag&Drop integration\n}", + "description": [], + "path": "src/plugins/visualization_ui_components/public/components/dimension_buttons/dimension_button.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.DimensionButton.$1.className", + "type": "string", + "tags": [], + "label": "className", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/visualization_ui_components/public/components/dimension_buttons/dimension_button.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.DimensionButton.$1.groupLabel", + "type": "string", + "tags": [], + "label": "groupLabel", + "description": [], + "path": "src/plugins/visualization_ui_components/public/components/dimension_buttons/dimension_button.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.DimensionButton.$1.children", + "type": "Object", + "tags": [], + "label": "children", + "description": [], + "signature": [ + "React.ReactElement>" + ], + "path": "src/plugins/visualization_ui_components/public/components/dimension_buttons/dimension_button.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.DimensionButton.$1.onClick", + "type": "Function", + "tags": [], + "label": "onClick", + "description": [], + "signature": [ + "(id: string) => void" + ], + "path": "src/plugins/visualization_ui_components/public/components/dimension_buttons/dimension_button.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.DimensionButton.$1.onClick.$1", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "string" + ], + "path": "src/plugins/visualization_ui_components/public/components/dimension_buttons/dimension_button.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.DimensionButton.$1.onRemoveClick", + "type": "Function", + "tags": [], + "label": "onRemoveClick", + "description": [], + "signature": [ + "(id: string) => void" + ], + "path": "src/plugins/visualization_ui_components/public/components/dimension_buttons/dimension_button.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.DimensionButton.$1.onRemoveClick.$1", + "type": "string", + "tags": [], + "label": "id", + "description": [], + "signature": [ + "string" + ], + "path": "src/plugins/visualization_ui_components/public/components/dimension_buttons/dimension_button.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.DimensionButton.$1.accessorConfig", + "type": "Object", + "tags": [], + "label": "accessorConfig", + "description": [], + "signature": [ + { + "pluginId": "visualizationUiComponents", + "scope": "public", + "docId": "kibVisualizationUiComponentsPluginApi", + "section": "def-public.AccessorConfig", + "text": "AccessorConfig" + } + ], + "path": "src/plugins/visualization_ui_components/public/components/dimension_buttons/dimension_button.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.DimensionButton.$1.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "path": "src/plugins/visualization_ui_components/public/components/dimension_buttons/dimension_button.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.DimensionButton.$1.message", + "type": "Object", + "tags": [], + "label": "message", + "description": [], + "signature": [ + "Message", + " | undefined" + ], + "path": "src/plugins/visualization_ui_components/public/components/dimension_buttons/dimension_button.tsx", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.DimensionEditorSection", + "type": "Function", + "tags": [], + "label": "DimensionEditorSection", + "description": [], + "signature": [ + "({ children, title, }: { title?: string | undefined; children?: React.ReactNode | React.ReactNode[]; }) => JSX.Element" + ], + "path": "src/plugins/visualization_ui_components/public/components/dimension_editor_section.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.DimensionEditorSection.$1", + "type": "Object", + "tags": [], + "label": "{\n children,\n title,\n}", + "description": [], + "path": "src/plugins/visualization_ui_components/public/components/dimension_editor_section.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.DimensionEditorSection.$1.title", + "type": "string", + "tags": [], + "label": "title", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/visualization_ui_components/public/components/dimension_editor_section.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.DimensionEditorSection.$1.children", + "type": "CompoundType", + "tags": [], + "label": "children", + "description": [], + "signature": [ + "React.ReactNode | React.ReactNode[]" + ], + "path": "src/plugins/visualization_ui_components/public/components/dimension_editor_section.tsx", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.DragDropBuckets", + "type": "Function", + "tags": [], + "label": "DragDropBuckets", + "description": [], + "signature": [ + "({\n items,\n onDragStart,\n onDragEnd,\n droppableId,\n children,\n bgColor,\n}: { items: T[]; droppableId: string; children: React.ReactElement>[]; onDragStart?: (() => void) | undefined; onDragEnd?: ((items: T[]) => void) | undefined; bgColor?: \"warning\" | \"success\" | \"subdued\" | \"primary\" | \"accent\" | \"danger\" | \"transparent\" | \"plain\" | undefined; }) => JSX.Element" + ], + "path": "src/plugins/visualization_ui_components/public/components/drag_drop_bucket/buckets.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.DragDropBuckets.$1", + "type": "Object", + "tags": [], + "label": "{\n items,\n onDragStart,\n onDragEnd,\n droppableId,\n children,\n bgColor,\n}", + "description": [], + "path": "src/plugins/visualization_ui_components/public/components/drag_drop_bucket/buckets.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.DragDropBuckets.$1.items", + "type": "Array", + "tags": [], + "label": "items", + "description": [], + "signature": [ + "T[]" + ], + "path": "src/plugins/visualization_ui_components/public/components/drag_drop_bucket/buckets.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.DragDropBuckets.$1.droppableId", + "type": "string", + "tags": [], + "label": "droppableId", + "description": [], + "path": "src/plugins/visualization_ui_components/public/components/drag_drop_bucket/buckets.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.DragDropBuckets.$1.children", + "type": "Array", + "tags": [], + "label": "children", + "description": [], + "signature": [ + "React.ReactElement>[]" + ], + "path": "src/plugins/visualization_ui_components/public/components/drag_drop_bucket/buckets.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.DragDropBuckets.$1.onDragStart", + "type": "Function", + "tags": [], + "label": "onDragStart", + "description": [], + "signature": [ + "(() => void) | undefined" + ], + "path": "src/plugins/visualization_ui_components/public/components/drag_drop_bucket/buckets.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.DragDropBuckets.$1.onDragEnd", + "type": "Function", + "tags": [], + "label": "onDragEnd", + "description": [], + "signature": [ + "((items: T[]) => void) | undefined" + ], + "path": "src/plugins/visualization_ui_components/public/components/drag_drop_bucket/buckets.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.DragDropBuckets.$1.onDragEnd.$1", + "type": "Array", + "tags": [], + "label": "items", + "description": [], + "signature": [ + "T[]" + ], + "path": "src/plugins/visualization_ui_components/public/components/drag_drop_bucket/buckets.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.DragDropBuckets.$1.bgColor", + "type": "CompoundType", + "tags": [], + "label": "bgColor", + "description": [], + "signature": [ + "\"warning\" | \"success\" | \"subdued\" | \"primary\" | \"accent\" | \"danger\" | \"transparent\" | \"plain\" | undefined" + ], + "path": "src/plugins/visualization_ui_components/public/components/drag_drop_bucket/buckets.tsx", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.DraggableBucketContainer", + "type": "Function", + "tags": [], + "label": "DraggableBucketContainer", + "description": [], + "signature": [ + "({ id, children, isInsidePanel, Container, ...bucketContainerProps }: ", + "Assign", + ", { id: string; children: React.ReactNode; isInsidePanel?: boolean | undefined; Container?: React.FunctionComponent<", + "BucketContainerProps", + "> | undefined; }, ", + "Diff", + ", { id: string; children: React.ReactNode; isInsidePanel?: boolean | undefined; Container?: React.FunctionComponent<", + "BucketContainerProps", + "> | undefined; }> & ", + "Intersection", + "<{ id: string; children: React.ReactNode; isInsidePanel?: boolean | undefined; Container?: React.FunctionComponent<", + "BucketContainerProps", + "> | undefined; }, Omit<", + "BucketContainerProps", + ", \"draggableProvided\">> & ", + "Diff", + "<{ id: string; children: React.ReactNode; isInsidePanel?: boolean | undefined; Container?: React.FunctionComponent<", + "BucketContainerProps", + "> | undefined; }, Omit<", + "BucketContainerProps", + ", \"draggableProvided\">>>) => JSX.Element" + ], + "path": "src/plugins/visualization_ui_components/public/components/drag_drop_bucket/buckets.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.DraggableBucketContainer.$1", + "type": "Object", + "tags": [], + "label": "{\n id,\n children,\n isInsidePanel,\n Container = DefaultBucketContainer,\n ...bucketContainerProps\n}", + "description": [], + "signature": [ + "Assign", + ", { id: string; children: React.ReactNode; isInsidePanel?: boolean | undefined; Container?: React.FunctionComponent<", + "BucketContainerProps", + "> | undefined; }, ", + "Diff", + ", { id: string; children: React.ReactNode; isInsidePanel?: boolean | undefined; Container?: React.FunctionComponent<", + "BucketContainerProps", + "> | undefined; }> & ", + "Intersection", + "<{ id: string; children: React.ReactNode; isInsidePanel?: boolean | undefined; Container?: React.FunctionComponent<", + "BucketContainerProps", + "> | undefined; }, Omit<", + "BucketContainerProps", + ", \"draggableProvided\">> & ", + "Diff", + "<{ id: string; children: React.ReactNode; isInsidePanel?: boolean | undefined; Container?: React.FunctionComponent<", + "BucketContainerProps", + "> | undefined; }, Omit<", + "BucketContainerProps", + ", \"draggableProvided\">>>" + ], + "path": "src/plugins/visualization_ui_components/public/components/drag_drop_bucket/buckets.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.FieldPicker", + "type": "Function", + "tags": [], + "label": "FieldPicker", + "description": [], + "signature": [ + "({\n selectedOptions,\n options,\n onChoose,\n onDelete,\n fieldIsInvalid,\n ['data-test-subj']: dataTestSub,\n ...rest\n}: ", + "FieldPickerProps", + ") => JSX.Element" + ], + "path": "src/plugins/visualization_ui_components/public/components/field_picker/field_picker.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.FieldPicker.$1", + "type": "Object", + "tags": [], + "label": "{\n selectedOptions,\n options,\n onChoose,\n onDelete,\n fieldIsInvalid,\n ['data-test-subj']: dataTestSub,\n ...rest\n}", + "description": [], + "signature": [ + "FieldPickerProps", + "" + ], + "path": "src/plugins/visualization_ui_components/public/components/field_picker/field_picker.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.FieldsBucketContainer", + "type": "Function", + "tags": [], + "label": "FieldsBucketContainer", + "description": [], + "signature": [ + "({ idx, onRemoveClick, removeTitle, children, draggableProvided, isNotRemovable, isNotDraggable, isDragging, \"data-test-subj\": dataTestSubj, }: ", + "BucketContainerProps", + ") => JSX.Element" + ], + "path": "src/plugins/visualization_ui_components/public/components/drag_drop_bucket/fields_bucket_container.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.FieldsBucketContainer.$1", + "type": "Object", + "tags": [], + "label": "{\n idx,\n onRemoveClick,\n removeTitle,\n children,\n draggableProvided,\n isNotRemovable,\n isNotDraggable,\n isDragging,\n 'data-test-subj': dataTestSubj = 'lns-fieldsBucketContainer',\n}", + "description": [], + "signature": [ + "BucketContainerProps" + ], + "path": "src/plugins/visualization_ui_components/public/components/drag_drop_bucket/fields_bucket_container.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.FilterQueryInput", + "type": "Function", + "tags": [], + "label": "FilterQueryInput", + "description": [], + "signature": [ + "({\n inputFilter,\n onChange,\n dataView,\n helpMessage,\n label = filterByLabel,\n initiallyOpen,\n ['data-test-subj']: dataTestSubj,\n queryInputServices,\n appName,\n}: { inputFilter: ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Query", + "text": "Query" + }, + " | undefined; onChange: (query: ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Query", + "text": "Query" + }, + ") => void; dataView: ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.DataViewBase", + "text": "DataViewBase" + }, + "; helpMessage?: string | null | undefined; label?: string | undefined; initiallyOpen?: boolean | undefined; \"data-test-subj\"?: string | undefined; queryInputServices: ", + "QueryInputServices", + "; appName: string; }) => JSX.Element" + ], + "path": "src/plugins/visualization_ui_components/public/components/query_input/filter_query_input.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.FilterQueryInput.$1", + "type": "Object", + "tags": [], + "label": "{\n inputFilter,\n onChange,\n dataView,\n helpMessage,\n label = filterByLabel,\n initiallyOpen,\n ['data-test-subj']: dataTestSubj,\n queryInputServices,\n appName,\n}", + "description": [], + "path": "src/plugins/visualization_ui_components/public/components/query_input/filter_query_input.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.FilterQueryInput.$1.inputFilter", + "type": "Object", + "tags": [], + "label": "inputFilter", + "description": [], + "signature": [ + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Query", + "text": "Query" + }, + " | undefined" + ], + "path": "src/plugins/visualization_ui_components/public/components/query_input/filter_query_input.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.FilterQueryInput.$1.onChange", + "type": "Function", + "tags": [], + "label": "onChange", + "description": [], + "signature": [ + "(query: ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Query", + "text": "Query" + }, + ") => void" + ], + "path": "src/plugins/visualization_ui_components/public/components/query_input/filter_query_input.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.FilterQueryInput.$1.onChange.$1", + "type": "Object", + "tags": [], + "label": "query", + "description": [], + "signature": [ + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Query", + "text": "Query" + } + ], + "path": "src/plugins/visualization_ui_components/public/components/query_input/filter_query_input.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.FilterQueryInput.$1.dataView", + "type": "Object", + "tags": [], + "label": "dataView", + "description": [], + "signature": [ + "{ fields: ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.DataViewFieldBase", + "text": "DataViewFieldBase" + }, + "[]; id?: string | undefined; title: string; }" + ], + "path": "src/plugins/visualization_ui_components/public/components/query_input/filter_query_input.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.FilterQueryInput.$1.helpMessage", + "type": "CompoundType", + "tags": [], + "label": "helpMessage", + "description": [], + "signature": [ + "string | null | undefined" + ], + "path": "src/plugins/visualization_ui_components/public/components/query_input/filter_query_input.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.FilterQueryInput.$1.label", + "type": "string", + "tags": [], + "label": "label", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/visualization_ui_components/public/components/query_input/filter_query_input.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.FilterQueryInput.$1.initiallyOpen", + "type": "CompoundType", + "tags": [], + "label": "initiallyOpen", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "src/plugins/visualization_ui_components/public/components/query_input/filter_query_input.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.FilterQueryInput.$1.datatestsubj", + "type": "string", + "tags": [], + "label": "['data-test-subj']", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/visualization_ui_components/public/components/query_input/filter_query_input.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.FilterQueryInput.$1.queryInputServices", + "type": "Object", + "tags": [], + "label": "queryInputServices", + "description": [], + "signature": [ + "QueryInputServices" + ], + "path": "src/plugins/visualization_ui_components/public/components/query_input/filter_query_input.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.FilterQueryInput.$1.appName", + "type": "string", + "tags": [], + "label": "appName", + "description": [], + "path": "src/plugins/visualization_ui_components/public/components/query_input/filter_query_input.tsx", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.IconSelect", + "type": "Function", + "tags": [], + "label": "IconSelect", + "description": [], + "signature": [ + "({\n value,\n onChange,\n customIconSet,\n defaultIcon = 'empty',\n}: { value?: Icon | undefined; onChange: (newIcon: Icon) => void; customIconSet: ", + { + "pluginId": "visualizationUiComponents", + "scope": "public", + "docId": "kibVisualizationUiComponentsPluginApi", + "section": "def-public.IconSet", + "text": "IconSet" + }, + "; defaultIcon?: string | undefined; }) => JSX.Element" + ], + "path": "src/plugins/visualization_ui_components/public/components/icon_select.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.IconSelect.$1", + "type": "Object", + "tags": [], + "label": "{\n value,\n onChange,\n customIconSet,\n defaultIcon = 'empty',\n}", + "description": [], + "path": "src/plugins/visualization_ui_components/public/components/icon_select.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.IconSelect.$1.value", + "type": "Uncategorized", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "Icon | undefined" + ], + "path": "src/plugins/visualization_ui_components/public/components/icon_select.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.IconSelect.$1.onChange", + "type": "Function", + "tags": [], + "label": "onChange", + "description": [], + "signature": [ + "(newIcon: Icon) => void" + ], + "path": "src/plugins/visualization_ui_components/public/components/icon_select.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.IconSelect.$1.onChange.$1", + "type": "Uncategorized", + "tags": [], + "label": "newIcon", + "description": [], + "signature": [ + "Icon" + ], + "path": "src/plugins/visualization_ui_components/public/components/icon_select.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.IconSelect.$1.customIconSet", + "type": "Array", + "tags": [], + "label": "customIconSet", + "description": [], + "signature": [ + "{ value: Icon; label: string; icon?: ", + "IconType", + " | Icon | undefined; shouldRotate?: boolean | undefined; canFill?: boolean | undefined; }[]" + ], + "path": "src/plugins/visualization_ui_components/public/components/icon_select.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.IconSelect.$1.defaultIcon", + "type": "string", + "tags": [], + "label": "defaultIcon", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/visualization_ui_components/public/components/icon_select.tsx", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.IconSelectSetting", + "type": "Function", + "tags": [], + "label": "IconSelectSetting", + "description": [], + "signature": [ + "({\n currentIcon,\n setIcon,\n customIconSet,\n defaultIcon = 'empty',\n}: { currentIcon?: Icon | undefined; setIcon: (icon: Icon) => void; customIconSet: ", + { + "pluginId": "visualizationUiComponents", + "scope": "public", + "docId": "kibVisualizationUiComponentsPluginApi", + "section": "def-public.IconSet", + "text": "IconSet" + }, + "; defaultIcon?: string | undefined; }) => JSX.Element" + ], + "path": "src/plugins/visualization_ui_components/public/components/icon_select.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.IconSelectSetting.$1", + "type": "Object", + "tags": [], + "label": "{\n currentIcon,\n setIcon,\n customIconSet,\n defaultIcon = 'empty',\n}", + "description": [], + "path": "src/plugins/visualization_ui_components/public/components/icon_select.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.IconSelectSetting.$1.currentIcon", + "type": "Uncategorized", + "tags": [], + "label": "currentIcon", + "description": [], + "signature": [ + "Icon | undefined" + ], + "path": "src/plugins/visualization_ui_components/public/components/icon_select.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.IconSelectSetting.$1.setIcon", + "type": "Function", + "tags": [], + "label": "setIcon", + "description": [], + "signature": [ + "(icon: Icon) => void" + ], + "path": "src/plugins/visualization_ui_components/public/components/icon_select.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.IconSelectSetting.$1.setIcon.$1", + "type": "Uncategorized", + "tags": [], + "label": "icon", + "description": [], + "signature": [ + "Icon" + ], + "path": "src/plugins/visualization_ui_components/public/components/icon_select.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.IconSelectSetting.$1.customIconSet", + "type": "Array", + "tags": [], + "label": "customIconSet", + "description": [], + "signature": [ + "{ value: Icon; label: string; icon?: ", + "IconType", + " | Icon | undefined; shouldRotate?: boolean | undefined; canFill?: boolean | undefined; }[]" + ], + "path": "src/plugins/visualization_ui_components/public/components/icon_select.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.IconSelectSetting.$1.defaultIcon", + "type": "string", + "tags": [], + "label": "defaultIcon", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/visualization_ui_components/public/components/icon_select.tsx", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.isQueryValid", + "type": "Function", + "tags": [], + "label": "isQueryValid", + "description": [], + "signature": [ + "(input: ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Query", + "text": "Query" + }, + ", dataView: ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.DataViewBase", + "text": "DataViewBase" + }, + ") => boolean" + ], + "path": "src/plugins/visualization_ui_components/public/components/query_input/helpers.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.isQueryValid.$1", + "type": "Object", + "tags": [], + "label": "input", + "description": [], + "signature": [ + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Query", + "text": "Query" + } + ], + "path": "src/plugins/visualization_ui_components/public/components/query_input/helpers.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.isQueryValid.$2", + "type": "Object", + "tags": [], + "label": "dataView", + "description": [], + "signature": [ + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.DataViewBase", + "text": "DataViewBase" + } + ], + "path": "src/plugins/visualization_ui_components/public/components/query_input/helpers.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.NameInput", + "type": "Function", + "tags": [], + "label": "NameInput", + "description": [], + "signature": [ + "({ value, onChange, defaultValue, }: { value: string; onChange: (value: string) => void; defaultValue?: string | undefined; }) => JSX.Element" + ], + "path": "src/plugins/visualization_ui_components/public/components/name_input.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.NameInput.$1", + "type": "Object", + "tags": [], + "label": "{\n value,\n onChange,\n defaultValue,\n}", + "description": [], + "path": "src/plugins/visualization_ui_components/public/components/name_input.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.NameInput.$1.value", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "path": "src/plugins/visualization_ui_components/public/components/name_input.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.NameInput.$1.onChange", + "type": "Function", + "tags": [], + "label": "onChange", + "description": [], + "signature": [ + "(value: string) => void" + ], + "path": "src/plugins/visualization_ui_components/public/components/name_input.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.NameInput.$1.onChange.$1", + "type": "string", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "string" + ], + "path": "src/plugins/visualization_ui_components/public/components/name_input.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.NameInput.$1.defaultValue", + "type": "string", + "tags": [], + "label": "defaultValue", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/visualization_ui_components/public/components/name_input.tsx", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.NewBucketButton", + "type": "Function", + "tags": [], + "label": "NewBucketButton", + "description": [], + "signature": [ + "({ label, onClick, isDisabled, className, \"data-test-subj\": dataTestSubj, }: NewBucketButtonProps) => JSX.Element" + ], + "path": "src/plugins/visualization_ui_components/public/components/drag_drop_bucket/new_bucket_button.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.NewBucketButton.$1", + "type": "Object", + "tags": [], + "label": "{\n label,\n onClick,\n isDisabled,\n className,\n 'data-test-subj': dataTestSubj = 'lns-newBucket-add',\n}", + "description": [], + "signature": [ + "NewBucketButtonProps" + ], + "path": "src/plugins/visualization_ui_components/public/components/drag_drop_bucket/new_bucket_button.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.QueryInput", + "type": "Function", + "tags": [], + "label": "QueryInput", + "description": [], + "signature": [ + "({ value, onChange, dataView, isInvalid, onSubmit, disableAutoFocus, [\"data-test-subj\"]: dataTestSubj, placeholder, appName, services: { data, uiSettings, http, notifications, docLinks, storage, unifiedSearch, dataViews }, }: { value: ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Query", + "text": "Query" + }, + "; onChange: (input: ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Query", + "text": "Query" + }, + ") => void; dataView: string | { type: \"id\" | \"title\"; value: string; }; isInvalid: boolean; onSubmit: () => void; disableAutoFocus?: boolean | undefined; 'data-test-subj'?: string | undefined; placeholder?: string | undefined; appName: string; services: ", + "QueryInputServices", + "; }) => JSX.Element" + ], + "path": "src/plugins/visualization_ui_components/public/components/query_input/query_input.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.QueryInput.$1", + "type": "Object", + "tags": [], + "label": "{\n value,\n onChange,\n dataView,\n isInvalid,\n onSubmit,\n disableAutoFocus,\n ['data-test-subj']: dataTestSubj,\n placeholder,\n appName,\n services: { data, uiSettings, http, notifications, docLinks, storage, unifiedSearch, dataViews },\n}", + "description": [], + "path": "src/plugins/visualization_ui_components/public/components/query_input/query_input.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.QueryInput.$1.value", + "type": "Object", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "{ query: string | { [key: string]: any; }; language: string; }" + ], + "path": "src/plugins/visualization_ui_components/public/components/query_input/query_input.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.QueryInput.$1.onChange", + "type": "Function", + "tags": [], + "label": "onChange", + "description": [], + "signature": [ + "(input: ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Query", + "text": "Query" + }, + ") => void" + ], + "path": "src/plugins/visualization_ui_components/public/components/query_input/query_input.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.QueryInput.$1.onChange.$1", + "type": "Object", + "tags": [], + "label": "input", + "description": [], + "signature": [ + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Query", + "text": "Query" + } + ], + "path": "src/plugins/visualization_ui_components/public/components/query_input/query_input.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.QueryInput.$1.dataView", + "type": "CompoundType", + "tags": [], + "label": "dataView", + "description": [], + "signature": [ + "string | { type: \"id\" | \"title\"; value: string; }" + ], + "path": "src/plugins/visualization_ui_components/public/components/query_input/query_input.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.QueryInput.$1.isInvalid", + "type": "boolean", + "tags": [], + "label": "isInvalid", + "description": [], + "path": "src/plugins/visualization_ui_components/public/components/query_input/query_input.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.QueryInput.$1.onSubmit", + "type": "Function", + "tags": [], + "label": "onSubmit", + "description": [], + "signature": [ + "() => void" + ], + "path": "src/plugins/visualization_ui_components/public/components/query_input/query_input.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.QueryInput.$1.disableAutoFocus", + "type": "CompoundType", + "tags": [], + "label": "disableAutoFocus", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "src/plugins/visualization_ui_components/public/components/query_input/query_input.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.QueryInput.$1.datatestsubj", + "type": "string", + "tags": [], + "label": "'data-test-subj'", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/visualization_ui_components/public/components/query_input/query_input.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.QueryInput.$1.placeholder", + "type": "string", + "tags": [], + "label": "placeholder", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/visualization_ui_components/public/components/query_input/query_input.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.QueryInput.$1.appName", + "type": "string", + "tags": [], + "label": "appName", + "description": [], + "path": "src/plugins/visualization_ui_components/public/components/query_input/query_input.tsx", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.QueryInput.$1.services", + "type": "Object", + "tags": [], + "label": "services", + "description": [], + "signature": [ + "QueryInputServices" + ], + "path": "src/plugins/visualization_ui_components/public/components/query_input/query_input.tsx", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.TooltipWrapper", + "type": "Function", + "tags": [], + "label": "TooltipWrapper", + "description": [], + "signature": [ + "({ children, condition, tooltipContent, ...tooltipProps }: React.PropsWithChildren) => JSX.Element" + ], + "path": "src/plugins/visualization_ui_components/public/components/tooltip_wrapper.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.TooltipWrapper.$1", + "type": "CompoundType", + "tags": [], + "label": "{\n children,\n condition,\n tooltipContent,\n ...tooltipProps\n}", + "description": [], + "signature": [ + "React.PropsWithChildren" + ], + "path": "src/plugins/visualization_ui_components/public/components/tooltip_wrapper.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.TruncatedLabel", + "type": "Function", + "tags": [], + "label": "TruncatedLabel", + "description": [], + "signature": [ + "React.NamedExoticComponent<{ label: string; search: string; width: number; font: string; }>" + ], + "path": "src/plugins/visualization_ui_components/public/components/field_picker/truncated_label.tsx", + "deprecated": false, + "trackAdoption": false, + "returnComment": [], + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.TruncatedLabel.$1", + "type": "Uncategorized", + "tags": [], + "label": "props", + "description": [], + "signature": [ + "P" + ], + "path": "node_modules/@types/react/index.d.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.useDebouncedValue", + "type": "Function", + "tags": [], + "label": "useDebouncedValue", + "description": [ + "\nDebounces value changes and updates inputValue on root state changes if no debounced changes\nare in flight because the user is currently modifying the value.\n\n* allowFalsyValue: update upstream with all falsy values but null or undefined\n\nWhen testing this function mock the \"debounce\" function in lodash (see this module test for an example)" + ], + "signature": [ + "({ onChange, value, defaultValue, }: { onChange: (val: T) => void; value: T; defaultValue?: T | undefined; }, { allowFalsyValue }?: { allowFalsyValue?: boolean | undefined; }) => { inputValue: T; handleInputChange: (val: T) => void; initialValue: T; }" + ], + "path": "src/plugins/visualization_ui_components/public/components/debounced_value.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.useDebouncedValue.$1", + "type": "Object", + "tags": [], + "label": "{\n onChange,\n value,\n defaultValue,\n }", + "description": [], + "path": "src/plugins/visualization_ui_components/public/components/debounced_value.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.useDebouncedValue.$1.onChange", + "type": "Function", + "tags": [], + "label": "onChange", + "description": [], + "signature": [ + "(val: T) => void" + ], + "path": "src/plugins/visualization_ui_components/public/components/debounced_value.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.useDebouncedValue.$1.onChange.$1", + "type": "Uncategorized", + "tags": [], + "label": "val", + "description": [], + "signature": [ + "T" + ], + "path": "src/plugins/visualization_ui_components/public/components/debounced_value.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.useDebouncedValue.$1.value", + "type": "Uncategorized", + "tags": [], + "label": "value", + "description": [], + "signature": [ + "T" + ], + "path": "src/plugins/visualization_ui_components/public/components/debounced_value.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.useDebouncedValue.$1.defaultValue", + "type": "Uncategorized", + "tags": [], + "label": "defaultValue", + "description": [], + "signature": [ + "T | undefined" + ], + "path": "src/plugins/visualization_ui_components/public/components/debounced_value.ts", + "deprecated": false, + "trackAdoption": false + } + ] + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.useDebouncedValue.$2", + "type": "Object", + "tags": [], + "label": "{ allowFalsyValue }", + "description": [], + "path": "src/plugins/visualization_ui_components/public/components/debounced_value.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.useDebouncedValue.$2.allowFalsyValue", + "type": "CompoundType", + "tags": [], + "label": "allowFalsyValue", + "description": [], + "signature": [ + "boolean | undefined" + ], + "path": "src/plugins/visualization_ui_components/public/components/debounced_value.ts", + "deprecated": false, + "trackAdoption": false + } + ] + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.validateQuery", + "type": "Function", + "tags": [], + "label": "validateQuery", + "description": [], + "signature": [ + "(input: ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Query", + "text": "Query" + }, + " | undefined, dataView: ", + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.DataViewBase", + "text": "DataViewBase" + }, + ") => { isValid: boolean; error: string | undefined; }" + ], + "path": "src/plugins/visualization_ui_components/public/components/query_input/helpers.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.validateQuery.$1", + "type": "Object", + "tags": [], + "label": "input", + "description": [], + "signature": [ + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.Query", + "text": "Query" + }, + " | undefined" + ], + "path": "src/plugins/visualization_ui_components/public/components/query_input/helpers.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.validateQuery.$2", + "type": "Object", + "tags": [], + "label": "dataView", + "description": [], + "signature": [ + { + "pluginId": "@kbn/es-query", + "scope": "common", + "docId": "kibKbnEsQueryPluginApi", + "section": "def-common.DataViewBase", + "text": "DataViewBase" + } + ], + "path": "src/plugins/visualization_ui_components/public/components/query_input/helpers.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.AccessorConfig", + "type": "Interface", + "tags": [], + "label": "AccessorConfig", + "description": [], + "path": "src/plugins/visualization_ui_components/public/components/dimension_buttons/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.AccessorConfig.columnId", + "type": "string", + "tags": [], + "label": "columnId", + "description": [], + "path": "src/plugins/visualization_ui_components/public/components/dimension_buttons/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.AccessorConfig.triggerIconType", + "type": "CompoundType", + "tags": [], + "label": "triggerIconType", + "description": [], + "signature": [ + "\"none\" | \"color\" | \"aggregate\" | \"disabled\" | \"custom\" | \"colorBy\" | \"invisible\" | undefined" + ], + "path": "src/plugins/visualization_ui_components/public/components/dimension_buttons/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.AccessorConfig.customIcon", + "type": "CompoundType", + "tags": [], + "label": "customIcon", + "description": [], + "signature": [ + "IconType", + " | undefined" + ], + "path": "src/plugins/visualization_ui_components/public/components/dimension_buttons/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.AccessorConfig.color", + "type": "string", + "tags": [], + "label": "color", + "description": [], + "signature": [ + "string | undefined" + ], + "path": "src/plugins/visualization_ui_components/public/components/dimension_buttons/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.AccessorConfig.palette", + "type": "CompoundType", + "tags": [], + "label": "palette", + "description": [], + "signature": [ + "string[] | { color: string; stop: number; }[] | undefined" + ], + "path": "src/plugins/visualization_ui_components/public/components/dimension_buttons/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.FieldOptionValue", + "type": "Interface", + "tags": [], + "label": "FieldOptionValue", + "description": [], + "path": "src/plugins/visualization_ui_components/public/components/field_picker/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.FieldOptionValue.type", + "type": "string", + "tags": [], + "label": "type", + "description": [], + "signature": [ + "\"field\"" + ], + "path": "src/plugins/visualization_ui_components/public/components/field_picker/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.FieldOptionValue.field", + "type": "string", + "tags": [], + "label": "field", + "description": [], + "path": "src/plugins/visualization_ui_components/public/components/field_picker/types.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.FieldOptionValue.dataType", + "type": "CompoundType", + "tags": [], + "label": "dataType", + "description": [], + "signature": [ + { + "pluginId": "visualizationUiComponents", + "scope": "public", + "docId": "kibVisualizationUiComponentsPluginApi", + "section": "def-public.DataType", + "text": "DataType" + }, + " | undefined" + ], + "path": "src/plugins/visualization_ui_components/public/components/field_picker/types.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], + "enums": [], + "misc": [ + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.DataType", + "type": "Type", + "tags": [], + "label": "DataType", + "description": [], + "signature": [ + "\"string\" | \"number\" | \"boolean\" | \"date\" | FieldOnlyDataType" + ], + "path": "src/plugins/visualization_ui_components/public/components/field_picker/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.FieldOption", + "type": "Type", + "tags": [], + "label": "FieldOption", + "description": [], + "signature": [ + "FieldValue & ", + "EuiComboBoxOptionOption", + "" + ], + "path": "src/plugins/visualization_ui_components/public/components/field_picker/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "visualizationUiComponents", + "id": "def-public.IconSet", + "type": "Type", + "tags": [], + "label": "IconSet", + "description": [], + "signature": [ + "{ value: T; label: string; icon?: ", + "IconType", + " | T | undefined; shouldRotate?: boolean | undefined; canFill?: boolean | undefined; }[]" + ], + "path": "src/plugins/visualization_ui_components/public/components/icon_select.tsx", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/visualization_ui_components.mdx b/api_docs/visualization_ui_components.mdx new file mode 100644 index 0000000000000..cff762d1d8ed9 --- /dev/null +++ b/api_docs/visualization_ui_components.mdx @@ -0,0 +1,36 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibVisualizationUiComponentsPluginApi +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-01 +tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizationUiComponents'] +--- +import visualizationUiComponentsObj from './visualization_ui_components.devdocs.json'; + + + +Contact [@elastic/kibana-visualizations](https://github.com/orgs/elastic/teams/kibana-visualizations) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 124 | 0 | 119 | 4 | + +## Client + +### Functions + + +### Interfaces + + +### Consts, variables and types + + diff --git a/api_docs/visualizations.devdocs.json b/api_docs/visualizations.devdocs.json index 0a85a5ed12f73..3c973d02d801c 100644 --- a/api_docs/visualizations.devdocs.json +++ b/api_docs/visualizations.devdocs.json @@ -14545,7 +14545,7 @@ "label": "Operation", "description": [], "signature": [ - "\"min\" | \"max\" | \"sum\" | \"median\" | \"count\" | \"range\" | \"filters\" | \"date_histogram\" | \"percentile\" | \"average\" | \"terms\" | \"cumulative_sum\" | \"moving_average\" | \"unique_count\" | \"standard_deviation\" | \"percentile_rank\" | \"last_value\" | \"counter_rate\" | \"differences\" | \"formula\" | \"static_value\" | \"normalize_by_unit\"" + "\"min\" | \"max\" | \"sum\" | \"median\" | \"count\" | \"filters\" | \"range\" | \"date_histogram\" | \"percentile\" | \"average\" | \"terms\" | \"cumulative_sum\" | \"moving_average\" | \"unique_count\" | \"standard_deviation\" | \"percentile_rank\" | \"last_value\" | \"counter_rate\" | \"differences\" | \"formula\" | \"static_value\" | \"normalize_by_unit\"" ], "path": "src/plugins/visualizations/common/convert_to_lens/types/operations.ts", "deprecated": false, @@ -14575,7 +14575,7 @@ "label": "OperationWithSourceField", "description": [], "signature": [ - "\"min\" | \"max\" | \"sum\" | \"median\" | \"count\" | \"range\" | \"filters\" | \"date_histogram\" | \"percentile\" | \"average\" | \"terms\" | \"unique_count\" | \"standard_deviation\" | \"percentile_rank\" | \"last_value\"" + "\"min\" | \"max\" | \"sum\" | \"median\" | \"count\" | \"filters\" | \"range\" | \"date_histogram\" | \"percentile\" | \"average\" | \"terms\" | \"unique_count\" | \"standard_deviation\" | \"percentile_rank\" | \"last_value\"" ], "path": "src/plugins/visualizations/common/convert_to_lens/types/operations.ts", "deprecated": false, diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index 1075faecd932e..265a9e3400b78 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-04-27 +date: 2023-05-01 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; diff --git a/config/serverless.es.yml b/config/serverless.es.yml index dfbff923489a0..c52efbccad0aa 100644 --- a/config/serverless.es.yml +++ b/config/serverless.es.yml @@ -1,2 +1,15 @@ +# Search Project Config + +## Disable APM and Uptime, enable Enterprise Search +xpack.apm.enabled: false +xpack.uptime.enabled: false +enterpriseSearch.enabled: true + +## Enable the Serverless Search plugin +xpack.serverless.search.enabled: true + +## Set the home route uiSettings.overrides.defaultRoute: /app/enterprise_search/content/search_indices + +## Set the dev project switcher current type xpack.serverless.plugin.developer.projectSwitcher.currentType: 'search' diff --git a/config/serverless.oblt.yml b/config/serverless.oblt.yml index dd62007fa0dfb..5b9bb95c22cce 100644 --- a/config/serverless.oblt.yml +++ b/config/serverless.oblt.yml @@ -1,3 +1,18 @@ -uiSettings.overrides.defaultRoute: /app/observability/overview +# Observability Project config + +## Disable plugins +enterpriseSearch.enabled: false +xpack.cloudSecurityPosture.enabled: false +xpack.securitySolution.enabled: false + +## Enable the Serverless Obsersability plugin +xpack.serverless.observability.enabled: true + +## Configure plugins xpack.infra.logs.app_target: discover + +## Set the home route +uiSettings.overrides.defaultRoute: /app/observability/overview + +## Set the dev project switch current type xpack.serverless.plugin.developer.projectSwitcher.currentType: 'observability' diff --git a/docs/developer/plugin-list.asciidoc b/docs/developer/plugin-list.asciidoc index 412a9e8b5569e..64b718e955f67 100644 --- a/docs/developer/plugin-list.asciidoc +++ b/docs/developer/plugin-list.asciidoc @@ -407,6 +407,10 @@ The plugin exposes the static DefaultEditorController class to consume. |WARNING: Missing README. +|{kib-repo}blob/{branch}/src/plugins/visualization_ui_components/README.md[visualizationUiComponents] +|A series of UI components pulled out of Lens to make them available outside Lens. + + |=== [discrete] @@ -710,6 +714,14 @@ Kibana. | +|{kib-repo}blob/{branch}/x-pack/plugins/serverless_observability/README.mdx[serverlessObservability] +|This plugin contains configuration and code used to create a Serverless Observability project. It leverages universal configuration and other APIs in the serverless plugin to configure Kibana. + + +|{kib-repo}blob/{branch}/x-pack/plugins/serverless_search/README.mdx[serverlessSearch] +|This plugin contains configuration and code used to create a Serverless Search project. It leverages universal configuration and other APIs in the serverless plugin to configure Kibana. + + |{kib-repo}blob/{branch}/x-pack/plugins/session_view/README.md[sessionView] |Session View is meant to provide a visualization into what is going on in a particular Linux environment where the agent is running. It looks likes a terminal emulator; however, it is a tool for introspecting process activity and understanding user and service behaviour in your Linux servers and infrastructure. It is a time-ordered series of process executions displayed in a tree over time. diff --git a/examples/search_examples/server/fibonacci_strategy.ts b/examples/search_examples/server/fibonacci_strategy.ts index 8317834dcbb3d..8a33872cdb7e7 100644 --- a/examples/search_examples/server/fibonacci_strategy.ts +++ b/examples/search_examples/server/fibonacci_strategy.ts @@ -8,6 +8,7 @@ import { v4 as uuidv4 } from 'uuid'; import { ISearchStrategy } from '@kbn/data-plugin/server'; +import { of } from 'rxjs'; import { FibonacciRequest, FibonacciResponse } from '../common/types'; export const fibonacciStrategyProvider = (): ISearchStrategy< @@ -40,10 +41,7 @@ export const fibonacciStrategyProvider = (): ISearchStrategy< const took = Date.now() - started; const values = sequence.slice(0, loaded); - // Usually we'd do something like "of()" but for some reason it breaks in tests with the error - // "You provided an invalid object where a stream was expected." which is why we have to cast - // down below as well - return [{ id, loaded, total, isRunning, isPartial, rawResponse: { took, values } }]; + return of({ id, loaded, total, isRunning, isPartial, rawResponse: { took, values } }); }, cancel: async (id: string) => { responseMap.delete(id); diff --git a/fleet_packages.json b/fleet_packages.json index 306338a1c9b34..2345a87a91cea 100644 --- a/fleet_packages.json +++ b/fleet_packages.json @@ -52,6 +52,6 @@ }, { "name": "security_detection_engine", - "version": "8.7.3" + "version": "8.8.1" } ] \ No newline at end of file diff --git a/package.json b/package.json index dd4ebd2e0fc43..2a8b15fc2ca4e 100644 --- a/package.json +++ b/package.json @@ -97,7 +97,7 @@ "@elastic/datemath": "5.0.3", "@elastic/elasticsearch": "npm:@elastic/elasticsearch-canary@8.6.0-canary.3", "@elastic/ems-client": "8.4.0", - "@elastic/eui": "77.1.1", + "@elastic/eui": "77.1.2", "@elastic/filesaver": "1.1.2", "@elastic/node-crypto": "1.2.1", "@elastic/numeral": "^2.5.1", @@ -575,7 +575,9 @@ "@kbn/server-http-tools": "link:packages/kbn-server-http-tools", "@kbn/server-route-repository": "link:packages/kbn-server-route-repository", "@kbn/serverless": "link:x-pack/plugins/serverless", + "@kbn/serverless-observability": "link:x-pack/plugins/serverless_observability", "@kbn/serverless-project-switcher": "link:packages/serverless/project_switcher", + "@kbn/serverless-search": "link:x-pack/plugins/serverless_search", "@kbn/serverless-types": "link:packages/serverless/types", "@kbn/session-notifications-plugin": "link:test/plugin_functional/plugins/session_notifications", "@kbn/session-view-plugin": "link:x-pack/plugins/session_view", @@ -592,6 +594,7 @@ "@kbn/shared-ux-card-no-data": "link:packages/shared-ux/card/no_data/impl", "@kbn/shared-ux-card-no-data-mocks": "link:packages/shared-ux/card/no_data/mocks", "@kbn/shared-ux-card-no-data-types": "link:packages/shared-ux/card/no_data/types", + "@kbn/shared-ux-chrome-navigation": "link:packages/shared-ux/chrome/navigation", "@kbn/shared-ux-file-context": "link:packages/shared-ux/file/context", "@kbn/shared-ux-file-image": "link:packages/shared-ux/file/image/impl", "@kbn/shared-ux-file-image-mocks": "link:packages/shared-ux/file/image/mocks", @@ -705,6 +708,7 @@ "@kbn/vis-type-vega-plugin": "link:src/plugins/vis_types/vega", "@kbn/vis-type-vislib-plugin": "link:src/plugins/vis_types/vislib", "@kbn/vis-type-xy-plugin": "link:src/plugins/vis_types/xy", + "@kbn/visualization-ui-components": "link:src/plugins/visualization_ui_components", "@kbn/visualizations-plugin": "link:src/plugins/visualizations", "@kbn/watcher-plugin": "link:x-pack/plugins/watcher", "@loaders.gl/core": "^2.3.1", @@ -735,7 +739,7 @@ "@turf/distance": "6.0.1", "@turf/helpers": "6.0.1", "@turf/length": "^6.0.2", - "@xstate/react": "^3.0.2", + "@xstate/react": "^3.2.1", "JSONStream": "1.3.5", "abort-controller": "^3.0.0", "adm-zip": "^0.5.9", @@ -958,7 +962,7 @@ "vinyl": "^2.2.0", "whatwg-fetch": "^3.0.0", "xml2js": "^0.4.22", - "xstate": "^4.35.2", + "xstate": "^4.37.1", "xterm": "^5.1.0", "yauzl": "^2.10.0", "yazl": "^2.5.1" diff --git a/packages/core/chrome/core-chrome-browser-internal/src/ui/header/__snapshots__/collapsible_nav.test.tsx.snap b/packages/core/chrome/core-chrome-browser-internal/src/ui/header/__snapshots__/collapsible_nav.test.tsx.snap index 38c5a7fdf4854..d32e7d27d6f16 100644 --- a/packages/core/chrome/core-chrome-browser-internal/src/ui/header/__snapshots__/collapsible_nav.test.tsx.snap +++ b/packages/core/chrome/core-chrome-browser-internal/src/ui/header/__snapshots__/collapsible_nav.test.tsx.snap @@ -216,7 +216,7 @@ Array [ class="euiHorizontalRule euiHorizontalRule--full emotion-euiHorizontalRule-full" />
} + className="kbnCollapsibleNav" data-test-subj="collapsibleNav" id="collapsibe-nav" isOpen={false} @@ -1048,6 +1049,7 @@ exports[`CollapsibleNav renders the default nav 2`] = ` } + className="kbnCollapsibleNav" data-test-subj="collapsibleNav" id="collapsibe-nav" isOpen={false} diff --git a/packages/core/chrome/core-chrome-browser-internal/src/ui/header/collapsible_nav.scss b/packages/core/chrome/core-chrome-browser-internal/src/ui/header/collapsible_nav.scss index 5f84863ad7309..a121ac4c02b25 100644 --- a/packages/core/chrome/core-chrome-browser-internal/src/ui/header/collapsible_nav.scss +++ b/packages/core/chrome/core-chrome-browser-internal/src/ui/header/collapsible_nav.scss @@ -1,9 +1,29 @@ +$screenHeightBreakpoint: $euiSize * 15; + +.kbnCollapsibleNav { + @media (max-height: $screenHeightBreakpoint) { + overflow-y: auto; + } +} + .kbnCollapsibleNav__recentsListGroup { @include euiYScroll; max-height: $euiSize * 10; margin-right: -$euiSizeS; } +.kbnCollapsibleNav__solutions { + @include euiYScroll; + + /** + * Allows the solutions nav group to be viewed on + * very small screen sizes and when the browser Zoom is high + */ + @media (max-height: $screenHeightBreakpoint) { + flex: 1 0 auto; + } +} + /** * 1. Increase the hit area of the link (anchor) * 2. Only show the text underline when hovering on the text/anchor portion diff --git a/packages/core/chrome/core-chrome-browser-internal/src/ui/header/collapsible_nav.tsx b/packages/core/chrome/core-chrome-browser-internal/src/ui/header/collapsible_nav.tsx index 2d9d88d9a461b..886ae8599c806 100644 --- a/packages/core/chrome/core-chrome-browser-internal/src/ui/header/collapsible_nav.tsx +++ b/packages/core/chrome/core-chrome-browser-internal/src/ui/header/collapsible_nav.tsx @@ -161,6 +161,7 @@ export function CollapsibleNav({ button={button} ownFocus={false} size={248} + className="kbnCollapsibleNav" > {customNavLink && ( <> @@ -280,7 +281,7 @@ export function CollapsibleNav({ - + {/* Kibana, Observability, Security, and Management sections */} {orderedCategories.map((categoryName) => { const category = categoryDictionary[categoryName]!; diff --git a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/internal_utils.ts b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/internal_utils.ts index afafd67fcab3a..1ffc5fcde62d8 100644 --- a/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/internal_utils.ts +++ b/packages/core/saved-objects/core-saved-objects-api-server-internal/src/lib/internal_utils.ts @@ -293,11 +293,5 @@ export function setManaged({ optionsManaged?: boolean; objectManaged?: boolean; }): boolean { - if (optionsManaged !== undefined) { - return optionsManaged; - } else if (optionsManaged === undefined && objectManaged !== undefined) { - return objectManaged; - } else { - return false; - } + return optionsManaged ?? objectManaged ?? false; } diff --git a/packages/core/saved-objects/core-saved-objects-base-server-internal/src/legacy_alias/types.ts b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/legacy_alias/types.ts index 9148b4e903c82..b0fc589e30c3d 100644 --- a/packages/core/saved-objects/core-saved-objects-base-server-internal/src/legacy_alias/types.ts +++ b/packages/core/saved-objects/core-saved-objects-base-server-internal/src/legacy_alias/types.ts @@ -59,4 +59,10 @@ export interface LegacyUrlAlias { * created because of saved object conversion, then we will display a toast telling the user that the object has a new URL. */ purpose?: 'savedObjectConversion' | 'savedObjectImport'; + /** + * Flag indicating if a saved object is managed by Kibana (default=false). + * Only used when upserting a saved object. If the saved object already + * exist this option has no effect. + */ + managed?: boolean; } diff --git a/packages/core/saved-objects/core-saved-objects-common/src/saved_objects_imports.ts b/packages/core/saved-objects/core-saved-objects-common/src/saved_objects_imports.ts index 7d6700ed3b47c..85d221c0c58af 100644 --- a/packages/core/saved-objects/core-saved-objects-common/src/saved_objects_imports.ts +++ b/packages/core/saved-objects/core-saved-objects-common/src/saved_objects_imports.ts @@ -91,6 +91,7 @@ export interface SavedObjectsImportFailure { * If `overwrite` is specified, an attempt was made to overwrite an existing object. */ overwrite?: boolean; + managed?: boolean; error: | SavedObjectsImportConflictError | SavedObjectsImportAmbiguousConflictError @@ -125,6 +126,14 @@ export interface SavedObjectsImportSuccess { * If `overwrite` is specified, this object overwrote an existing one (or will do so, in the case of a pending resolution). */ overwrite?: boolean; + /** + * Flag indicating if a saved object is managed by Kibana (default=false) + * + * This can be leveraged by applications to e.g. prevent edits to a managed + * saved object. Instead, users can be guided to create a copy first and + * make their edits to the copy. + */ + managed?: boolean; } /** diff --git a/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/import_saved_objects.test.ts b/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/import_saved_objects.test.ts index 66a010b548a4a..8e6576de34e01 100644 --- a/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/import_saved_objects.test.ts +++ b/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/import_saved_objects.test.ts @@ -80,10 +80,12 @@ describe('#importSavedObjectsFromStream', () => { management: { icon: `${type}-icon` }, } as any), importHooks = {}, + managed, }: { createNewCopies?: boolean; getTypeImpl?: (name: string) => any; importHooks?: Record; + managed?: boolean; } = {}): ImportSavedObjectsOptions => { readStream = new Readable(); savedObjectsClient = savedObjectsClientMock.create(); @@ -98,19 +100,23 @@ describe('#importSavedObjectsFromStream', () => { namespace, createNewCopies, importHooks, + managed, }; }; const createObject = ({ type = 'foo-type', title = 'some-title', - }: { type?: string; title?: string } = {}): SavedObject<{ + managed = undefined, // explicitly declare undefined so as not set to test against existing objects + }: { type?: string; title?: string; managed?: boolean } = {}): SavedObject<{ title: string; + managed?: boolean; }> => { return { type, id: uuidv4(), references: [], attributes: { title }, + managed, }; }; const createError = (): SavedObjectsImportFailure => { @@ -320,6 +326,55 @@ describe('#importSavedObjectsFromStream', () => { importStateMap, overwrite, namespace, + managed: options.managed, + }; + expect(mockCreateSavedObjects).toHaveBeenCalledWith(createSavedObjectsParams); + }); + + test('creates managed saved objects', async () => { + const options = setupOptions({ managed: true }); + const collectedObjects = [createObject({ managed: true })]; + const filteredObjects = [createObject({ managed: false })]; + const errors = [createError(), createError(), createError(), createError()]; + mockCollectSavedObjects.mockResolvedValue({ + errors: [errors[0]], + collectedObjects, + importStateMap: new Map([ + ['foo', {}], + ['bar', {}], + ['baz', { isOnlyReference: true }], + ]), + }); + mockCheckReferenceOrigins.mockResolvedValue({ + importStateMap: new Map([['baz', { isOnlyReference: true, destinationId: 'newId1' }]]), + }); + mockValidateReferences.mockResolvedValue([errors[1]]); + mockCheckConflicts.mockResolvedValue({ + errors: [errors[2]], + filteredObjects, + importStateMap: new Map([['foo', { destinationId: 'newId2' }]]), + pendingOverwrites: new Set(), + }); + mockCheckOriginConflicts.mockResolvedValue({ + errors: [errors[3]], + importStateMap: new Map([['bar', { destinationId: 'newId3' }]]), + pendingOverwrites: new Set(), + }); + + await importSavedObjectsFromStream(options); + const importStateMap = new Map([ + ['foo', { destinationId: 'newId2' }], + ['bar', { destinationId: 'newId3' }], + ['baz', { isOnlyReference: true, destinationId: 'newId1' }], + ]); + const createSavedObjectsParams = { + objects: collectedObjects, + accumulatedErrors: errors, + savedObjectsClient, + importStateMap, + overwrite, + namespace, + managed: options.managed, }; expect(mockCreateSavedObjects).toHaveBeenCalledWith(createSavedObjectsParams); }); @@ -383,6 +438,118 @@ describe('#importSavedObjectsFromStream', () => { expect(mockCreateSavedObjects).toHaveBeenCalledWith(createSavedObjectsParams); }); }); + + describe('managed option', () => { + test('if not provided, calls create without an override', async () => { + const options = setupOptions({ createNewCopies: true }); // weithout `managed` set + const collectedObjects = [ + createObject({ type: 'foo', managed: true }), + createObject({ type: 'bar', title: 'bar-title', managed: false }), + ]; + const errors = [createError(), createError()]; + mockCollectSavedObjects.mockResolvedValue({ + errors: [errors[0]], + collectedObjects, + importStateMap: new Map([ + ['foo', {}], + ['bar', { isOnlyReference: true }], + ]), + }); + mockCheckReferenceOrigins.mockResolvedValue({ + importStateMap: new Map([['bar', { isOnlyReference: true, destinationId: 'newId' }]]), + }); + mockValidateReferences.mockResolvedValue([errors[1]]); + mockRegenerateIds.mockReturnValue(new Map([['foo', { destinationId: `randomId1` }]])); + + await importSavedObjectsFromStream(options); + const importStateMap: ImportStateMap = new Map([ + ['foo', { destinationId: `randomId1` }], + ['bar', { isOnlyReference: true, destinationId: 'newId' }], + ]); + const createSavedObjectsParams = { + objects: collectedObjects, + accumulatedErrors: errors, + savedObjectsClient, + importStateMap, + overwrite, + namespace, + managed: undefined, + }; + expect(mockCreateSavedObjects).toHaveBeenCalledWith(createSavedObjectsParams); + }); // assert that the call to create will not override the object props. + + test('creates managed saved objects, overriding existing `managed` value', async () => { + const options = setupOptions({ createNewCopies: true, managed: true }); + const collectedObjects = [createObject({ managed: false })]; + const errors = [createError(), createError()]; + mockCollectSavedObjects.mockResolvedValue({ + errors: [errors[0]], + collectedObjects, + importStateMap: new Map([ + ['foo', {}], + ['bar', { isOnlyReference: true }], + ]), + }); + mockCheckReferenceOrigins.mockResolvedValue({ + importStateMap: new Map([['bar', { isOnlyReference: true, destinationId: 'newId' }]]), + }); + mockValidateReferences.mockResolvedValue([errors[1]]); + mockRegenerateIds.mockReturnValue(new Map([['foo', { destinationId: `randomId1` }]])); + + await importSavedObjectsFromStream(options); + // assert that the importStateMap is correctly composed of the results from the three modules + const importStateMap: ImportStateMap = new Map([ + ['foo', { destinationId: `randomId1` }], + ['bar', { isOnlyReference: true, destinationId: 'newId' }], + ]); + const createSavedObjectsParams = { + objects: collectedObjects, + accumulatedErrors: errors, + savedObjectsClient, + importStateMap, + overwrite, + namespace, + managed: true, + }; + expect(mockCreateSavedObjects).toHaveBeenCalledWith(createSavedObjectsParams); + }); + + test('creates and converts objects from managed to unmanaged', async () => { + const options = setupOptions({ createNewCopies: true, managed: false }); + const collectedObjects = [createObject({ managed: true })]; + const errors = [createError(), createError()]; + mockCollectSavedObjects.mockResolvedValue({ + errors: [errors[0]], + collectedObjects, + importStateMap: new Map([ + ['foo', {}], + ['bar', { isOnlyReference: true }], + ]), + }); + mockCheckReferenceOrigins.mockResolvedValue({ + importStateMap: new Map([['bar', { isOnlyReference: true, destinationId: 'newId' }]]), + }); + mockValidateReferences.mockResolvedValue([errors[1]]); + mockRegenerateIds.mockReturnValue(new Map([['foo', { destinationId: `randomId1` }]])); + + await importSavedObjectsFromStream(options); + // assert that the importStateMap is correctly composed of the results from the three modules + const importStateMap: ImportStateMap = new Map([ + ['foo', { destinationId: `randomId1` }], + ['bar', { isOnlyReference: true, destinationId: 'newId' }], + ]); + const createSavedObjectsParams = { + objects: collectedObjects, + accumulatedErrors: errors, + savedObjectsClient, + importStateMap, + overwrite, + namespace, + managed: false, + }; + expect(mockCreateSavedObjects).toHaveBeenCalledWith(createSavedObjectsParams); + }); + }); }); describe('results', () => { diff --git a/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/import_saved_objects.ts b/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/import_saved_objects.ts index 8650e082c4163..9d150386cee4d 100644 --- a/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/import_saved_objects.ts +++ b/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/import_saved_objects.ts @@ -54,6 +54,10 @@ export interface ImportSavedObjectsOptions { * different Kibana versions (e.g. generate legacy URL aliases for all imported objects that have to change IDs). */ compatibilityMode?: boolean; + /** + * If provided, Kibana will apply the given option to the `managed` property. + */ + managed?: boolean; } /** @@ -73,6 +77,7 @@ export async function importSavedObjectsFromStream({ namespace, refresh, compatibilityMode, + managed, }: ImportSavedObjectsOptions): Promise { let errorAccumulator: SavedObjectsImportFailure[] = []; const supportedTypes = typeRegistry.getImportableAndExportableTypes().map((type) => type.name); @@ -82,6 +87,7 @@ export async function importSavedObjectsFromStream({ readStream, objectLimit, supportedTypes, + managed, }); errorAccumulator = [...errorAccumulator, ...collectSavedObjectsResult.errors]; // Map of all IDs for objects that we are attempting to import, and any references that are not included in the read stream; @@ -154,12 +160,13 @@ export async function importSavedObjectsFromStream({ namespace, refresh, compatibilityMode, + managed, }; const createSavedObjectsResult = await createSavedObjects(createSavedObjectsParams); errorAccumulator = [...errorAccumulator, ...createSavedObjectsResult.errors]; const successResults = createSavedObjectsResult.createdObjects.map((createdObject) => { - const { type, id, destinationId, originId } = createdObject; + const { type, id, destinationId, originId, managed: createdObjectManaged } = createdObject; const getTitle = typeRegistry.getType(type)?.management?.getTitle; const meta = { title: getTitle ? getTitle(createdObject) : createdObject.attributes.title, @@ -170,6 +177,7 @@ export async function importSavedObjectsFromStream({ type, id, meta, + managed: createdObjectManaged ?? managed, ...(attemptedOverwrite && { overwrite: true }), ...(destinationId && { destinationId }), ...(destinationId && !originId && !createNewCopies && { createNewCopy: true }), diff --git a/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/lib/collect_saved_objects.test.ts b/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/lib/collect_saved_objects.test.ts index 73a1f9913a4de..b44ae1c48aa10 100644 --- a/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/lib/collect_saved_objects.test.ts +++ b/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/lib/collect_saved_objects.test.ts @@ -51,6 +51,13 @@ describe('collectSavedObjects()', () => { attributes: { title: 'my title 2' }, references: [{ type: 'c', id: '3', name: 'c3' }], }; + const obj3 = { + type: 'bz', + id: '33', + attributes: { title: 'my title z' }, + references: [{ type: 'b', id: '2', name: 'b2' }], + managed: true, + }; describe('module calls', () => { test('limit stream with empty input stream is called with null', async () => { @@ -63,14 +70,15 @@ describe('collectSavedObjects()', () => { }); test('limit stream with non-empty input stream is called with all objects', async () => { - const readStream = createReadStream(obj1, obj2); + const readStream = createReadStream(obj1, obj2, obj3); const supportedTypes = [obj2.type]; await collectSavedObjects({ readStream, supportedTypes, objectLimit }); expect(createLimitStream).toHaveBeenCalledWith(objectLimit); - expect(limitStreamPush).toHaveBeenCalledTimes(3); + expect(limitStreamPush).toHaveBeenCalledTimes(4); expect(limitStreamPush).toHaveBeenNthCalledWith(1, obj1); expect(limitStreamPush).toHaveBeenNthCalledWith(2, obj2); + expect(limitStreamPush).toHaveBeenNthCalledWith(3, obj3); expect(limitStreamPush).toHaveBeenLastCalledWith(null); }); @@ -82,13 +90,14 @@ describe('collectSavedObjects()', () => { }); test('get non-unique entries with non-empty input stream is called with all entries', async () => { - const readStream = createReadStream(obj1, obj2); + const readStream = createReadStream(obj1, obj2, obj3); const supportedTypes = [obj2.type]; await collectSavedObjects({ readStream, supportedTypes, objectLimit }); expect(getNonUniqueEntries).toHaveBeenCalledWith([ { type: obj1.type, id: obj1.id }, { type: obj2.type, id: obj2.id }, + { type: obj3.type, id: obj3.id }, ]); }); @@ -101,7 +110,7 @@ describe('collectSavedObjects()', () => { }); test('filter with non-empty input stream is called with all objects of supported types', async () => { - const readStream = createReadStream(obj1, obj2); + const readStream = createReadStream(obj1, obj2, obj3); const filter = jest.fn(); const supportedTypes = [obj2.type]; await collectSavedObjects({ readStream, supportedTypes, objectLimit, filter }); @@ -139,8 +148,8 @@ describe('collectSavedObjects()', () => { const result = await collectSavedObjects({ readStream, supportedTypes, objectLimit }); const collectedObjects = [ - { ...obj1, typeMigrationVersion: '' }, - { ...obj2, typeMigrationVersion: '' }, + { ...obj1, typeMigrationVersion: '', managed: false }, + { ...obj2, typeMigrationVersion: '', managed: false }, ]; const importStateMap = new Map([ [`a:1`, {}], // a:1 is included because it is present in the collected objects @@ -166,7 +175,7 @@ describe('collectSavedObjects()', () => { const supportedTypes = [obj1.type]; const result = await collectSavedObjects({ readStream, supportedTypes, objectLimit }); - const collectedObjects = [{ ...obj1, typeMigrationVersion: '' }]; + const collectedObjects = [{ ...obj1, typeMigrationVersion: '', managed: false }]; const importStateMap = new Map([ [`a:1`, {}], // a:1 is included because it is present in the collected objects [`b:2`, { isOnlyReference: true }], // b:2 was filtered out due to an unsupported type; b:2 is included because a:1 has a reference to b:2, but this is marked as `isOnlyReference` because b:2 is not present in the collected objects @@ -180,8 +189,8 @@ describe('collectSavedObjects()', () => { test('keeps the original migration versions', async () => { const collectedObjects = [ - { ...obj1, migrationVersion: { a: '1.0.0' } }, - { ...obj2, typeMigrationVersion: '2.0.0' }, + { ...obj1, migrationVersion: { a: '1.0.0' }, managed: false }, + { ...obj2, typeMigrationVersion: '2.0.0', managed: false }, ]; const readStream = createReadStream(...collectedObjects); @@ -218,9 +227,10 @@ describe('collectSavedObjects()', () => { supportedTypes, objectLimit, filter, + managed: false, }); - const collectedObjects = [{ ...obj2, typeMigrationVersion: '' }]; + const collectedObjects = [{ ...obj2, typeMigrationVersion: '', managed: false }]; const importStateMap = new Map([ // a:1 was filtered out due to an unsupported type; a:1 is not included because there are no other references to a:1 [`b:2`, {}], // b:2 is included because it is present in the collected objects diff --git a/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/lib/collect_saved_objects.ts b/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/lib/collect_saved_objects.ts index 92d8476759548..d5362e8cdc581 100644 --- a/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/lib/collect_saved_objects.ts +++ b/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/lib/collect_saved_objects.ts @@ -25,6 +25,7 @@ interface CollectSavedObjectsOptions { objectLimit: number; filter?: (obj: SavedObject) => boolean; supportedTypes: string[]; + managed?: boolean; } export async function collectSavedObjects({ @@ -32,6 +33,7 @@ export async function collectSavedObjects({ objectLimit, filter, supportedTypes, + managed, }: CollectSavedObjectsOptions) { const errors: SavedObjectsImportFailure[] = []; const entries: Array<{ type: string; id: string }> = []; @@ -68,6 +70,9 @@ export async function collectSavedObjects({ return { ...obj, ...(!obj.migrationVersion && !obj.typeMigrationVersion ? { typeMigrationVersion: '' } : {}), + // override any managed flag on an object with that given as an option otherwise set the default to avoid having to do that with a core migration transform + // this is a bulk operation, applied to all objects being imported + ...{ managed: managed ?? obj.managed ?? false }, }; }), createConcatStream([]), diff --git a/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/lib/create_saved_objects.test.ts b/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/lib/create_saved_objects.test.ts index 6938c251992f5..ac6831626f2f2 100644 --- a/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/lib/create_saved_objects.test.ts +++ b/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/lib/create_saved_objects.test.ts @@ -19,31 +19,53 @@ import { type CreateSavedObjectsParams = Parameters[0]; +interface CreateOptions { + type: string; + id: string; + originId?: string; + managed?: boolean; +} +/** Utility function to add default `managed` flag to objects that don't have one declared. */ +const addManagedDefault = (objs: SavedObject[]) => + objs.map((obj) => ({ ...obj, managed: obj.managed ?? false })); /** * Function to create a realistic-looking import object given a type, ID, and optional originId */ -const createObject = (type: string, id: string, originId?: string): SavedObject => ({ +const createObject = (createOptions: CreateOptions): SavedObject => { + const { type, id, originId, managed } = createOptions; + return { + type, + id, + attributes: {}, + references: [ + { name: 'name-1', type: 'other-type', id: 'other-id' }, // object that is not present + { name: 'name-2', type: MULTI_NS_TYPE, id: 'id-1' }, // object that is present, but does not have an importStateMap entry + { name: 'name-3', type: MULTI_NS_TYPE, id: 'id-3' }, // object that is present and has an importStateMap entry + ], + ...(originId && { originId }), + ...(managed && { managed }), + }; +}; + +const createOptionsFrom = (type: string, id: string, originId?: string, managed?: boolean) => ({ type, id, - attributes: {}, - references: [ - { name: 'name-1', type: 'other-type', id: 'other-id' }, // object that is not present - { name: 'name-2', type: MULTI_NS_TYPE, id: 'id-1' }, // object that is present, but does not have an importStateMap entry - { name: 'name-3', type: MULTI_NS_TYPE, id: 'id-3' }, // object that is present and has an importStateMap entry - ], - ...(originId && { originId }), + originId, + managed, }); const createLegacyUrlAliasObject = ( sourceId: string, targetId: string, targetType: string, - targetNamespace: string = 'default' + targetNamespace: string = 'default', + managed?: boolean ): SavedObject => ({ type: LEGACY_URL_ALIAS_TYPE, id: `${targetNamespace}:${targetType}:${sourceId}`, attributes: { sourceId, targetNamespace, targetType, targetId, purpose: 'savedObjectImport' }, references: [], + managed: managed ?? false, }); const MULTI_NS_TYPE = 'multi'; @@ -51,19 +73,19 @@ const OTHER_TYPE = 'other'; /** * Create a variety of different objects to exercise different import / result scenarios */ -const obj1 = createObject(MULTI_NS_TYPE, 'id-1', 'originId-a'); // -> success -const obj2 = createObject(MULTI_NS_TYPE, 'id-2', 'originId-b'); // -> conflict -const obj3 = createObject(MULTI_NS_TYPE, 'id-3', 'originId-c'); // -> conflict (with known importId and omitOriginId=true) -const obj4 = createObject(MULTI_NS_TYPE, 'id-4', 'originId-d'); // -> conflict (with known importId) -const obj5 = createObject(MULTI_NS_TYPE, 'id-5', 'originId-e'); // -> unresolvable conflict -const obj6 = createObject(MULTI_NS_TYPE, 'id-6'); // -> success -const obj7 = createObject(MULTI_NS_TYPE, 'id-7'); // -> conflict -const obj8 = createObject(MULTI_NS_TYPE, 'id-8'); // -> conflict (with known importId) -const obj9 = createObject(MULTI_NS_TYPE, 'id-9'); // -> unresolvable conflict -const obj10 = createObject(OTHER_TYPE, 'id-10', 'originId-f'); // -> success -const obj11 = createObject(OTHER_TYPE, 'id-11', 'originId-g'); // -> conflict -const obj12 = createObject(OTHER_TYPE, 'id-12'); // -> success -const obj13 = createObject(OTHER_TYPE, 'id-13'); // -> conflict +const obj1 = createObject(createOptionsFrom(MULTI_NS_TYPE, 'id-1', 'originId-a', true)); // -> success +const obj2 = createObject(createOptionsFrom(MULTI_NS_TYPE, 'id-2', 'originId-b')); // -> conflict +const obj3 = createObject(createOptionsFrom(MULTI_NS_TYPE, 'id-3', 'originId-c')); // -> conflict (with known importId and omitOriginId=true) +const obj4 = createObject(createOptionsFrom(MULTI_NS_TYPE, 'id-4', 'originId-d')); // -> conflict (with known importId) +const obj5 = createObject(createOptionsFrom(MULTI_NS_TYPE, 'id-5', 'originId-e')); // -> unresolvable conflict +const obj6 = createObject(createOptionsFrom(MULTI_NS_TYPE, 'id-6', undefined, true)); // -> success +const obj7 = createObject(createOptionsFrom(MULTI_NS_TYPE, 'id-7')); // -> conflict +const obj8 = createObject(createOptionsFrom(MULTI_NS_TYPE, 'id-8')); // -> conflict (with known importId) +const obj9 = createObject(createOptionsFrom(MULTI_NS_TYPE, 'id-9')); // -> unresolvable conflict +const obj10 = createObject(createOptionsFrom(OTHER_TYPE, 'id-10', 'originId-f')); // -> success +const obj11 = createObject(createOptionsFrom(OTHER_TYPE, 'id-11', 'originId-g')); // -> conflict +const obj12 = createObject(createOptionsFrom(OTHER_TYPE, 'id-12')); // -> success +const obj13 = createObject(createOptionsFrom(OTHER_TYPE, 'id-13')); // -> conflict // non-multi-namespace types shouldn't have origin IDs, but we include test cases to ensure it's handled gracefully // non-multi-namespace types by definition cannot result in an unresolvable conflict, so we don't include test cases for those const importId3 = 'id-foo'; @@ -71,7 +93,7 @@ const importId4 = 'id-bar'; const importId8 = 'id-baz'; const importStateMap = new Map([ [`${obj3.type}:${obj3.id}`, { destinationId: importId3, omitOriginId: true }], - [`${obj4.type}:${obj4.id}`, { destinationId: importId4 }], + [`${obj4.type}:${obj4.id}`, { destinationId: importId4, managed: true }], [`${obj8.type}:${obj8.id}`, { destinationId: importId8 }], ]); @@ -92,6 +114,7 @@ describe('#createSavedObjects', () => { namespace?: string; overwrite?: boolean; compatibilityMode?: boolean; + managed?: boolean; }): CreateSavedObjectsParams => { savedObjectsClient = savedObjectsClientMock.create(); bulkCreate = savedObjectsClient.bulkCreate; @@ -99,7 +122,7 @@ describe('#createSavedObjects', () => { }; const getExpectedBulkCreateArgsObjects = (objects: SavedObject[], retry?: boolean) => - objects.map(({ type, id, attributes, originId }) => ({ + objects.map(({ type, id, attributes, originId, managed }) => ({ type, id: retry ? `new-id-for-${id}` : id, // if this was a retry, we regenerated the id -- this is mocked below attributes, @@ -110,13 +133,19 @@ describe('#createSavedObjects', () => { ], // if the import object had an originId, and/or if we regenerated the id, expect an originId to be included in the create args ...((originId || retry) && { originId: originId || id }), + ...(managed && { managed }), })); const expectBulkCreateArgs = { objects: (n: number, objects: SavedObject[], retry?: boolean) => { const expectedObjects = getExpectedBulkCreateArgsObjects(objects, retry); const expectedOptions = expect.any(Object); - expect(bulkCreate).toHaveBeenNthCalledWith(n, expectedObjects, expectedOptions); + const expectedObjectsWithManagedDefault = addManagedDefault(expectedObjects); + expect(bulkCreate).toHaveBeenNthCalledWith( + n, + expectedObjectsWithManagedDefault, + expectedOptions + ); }, legacyUrlAliases: (n: number, expectedAliasObjects: SavedObject[]) => { const expectedOptions = expect.any(Object); @@ -131,14 +160,16 @@ describe('#createSavedObjects', () => { const getResultMock = { success: ( - { type, id, attributes, references, originId }: SavedObject, - { namespace }: CreateSavedObjectsParams + { type, id, attributes, references, originId, managed: objectManaged }: SavedObject, + { namespace, managed }: CreateSavedObjectsParams ): SavedObject => ({ type, id, attributes, references, ...(originId && { originId }), + ...((managed && { managed }) ?? + (objectManaged && { managed: objectManaged }) ?? { managed: false }), version: 'some-version', updated_at: 'some-date', namespaces: [namespace ?? 'default'], @@ -253,7 +284,7 @@ describe('#createSavedObjects', () => { } }); - test('calls bulkCreate when unresolvable errors or no errors are present', async () => { + test('calls bulkCreate when unresolvable errors or no errors are present with docs that have managed set', async () => { for (const error of unresolvableErrors) { const options = setupParams({ objects: objs, accumulatedErrors: [error] }); setupMockResults(options); @@ -269,6 +300,7 @@ describe('#createSavedObjects', () => { test('when in compatibility mode, calls bulkCreate for legacy URL aliases when unresolvable errors or no errors are present', async () => { for (const error of unresolvableErrors) { + // options are ok, they return objects as declared const options = setupParams({ objects: objs, accumulatedErrors: [error], @@ -288,8 +320,8 @@ describe('#createSavedObjects', () => { }); }); - it('filters out version from objects before create', async () => { - const options = setupParams({ objects: [{ ...obj1, version: 'foo' }] }); + it('filters out version from objects before create and accepts managed', async () => { + const options = setupParams({ objects: [{ ...obj1, version: 'foo' }] }); // here optionsManaged is undefined bulkCreate.mockResolvedValue({ saved_objects: [getResultMock.success(obj1, options)] }); await createSavedObjects(options); @@ -299,8 +331,15 @@ describe('#createSavedObjects', () => { const testBulkCreateObjects = async ({ namespace, compatibilityMode, - }: { namespace?: string; compatibilityMode?: boolean } = {}) => { - const options = setupParams({ objects: objs, namespace, compatibilityMode }); + managed, + }: { namespace?: string; compatibilityMode?: boolean; managed?: boolean } = {}) => { + const objsWithMissingManaged = addManagedDefault(objs); + const options = setupParams({ + objects: objsWithMissingManaged, + namespace, + compatibilityMode, + managed, + }); setupMockResults(options); await createSavedObjects(options); @@ -310,7 +349,8 @@ describe('#createSavedObjects', () => { const x4 = { ...obj4, id: importId4 }; // this import object already has an originId const x8 = { ...obj8, id: importId8, originId: obj8.id }; // this import object doesn't have an originId, so it is set before create const argObjs = [obj1, obj2, x3, x4, obj5, obj6, obj7, x8, obj9, obj10, obj11, obj12, obj13]; - expectBulkCreateArgs.objects(1, argObjs); + const argObjsWithMissingManaged = addManagedDefault(argObjs); + expectBulkCreateArgs.objects(1, argObjsWithMissingManaged); if (compatibilityMode) { // Rewrite namespace in the legacy URL alias. diff --git a/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/lib/create_saved_objects.ts b/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/lib/create_saved_objects.ts index a8de0bfc92750..9f0f98484d594 100644 --- a/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/lib/create_saved_objects.ts +++ b/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/lib/create_saved_objects.ts @@ -30,6 +30,14 @@ export interface CreateSavedObjectsParams { * different Kibana versions (e.g. generate legacy URL aliases for all imported objects that have to change IDs). */ compatibilityMode?: boolean; + /** + * If true, create the object as managed. + * + * This can be leveraged by applications to e.g. prevent edits to a managed + * saved object. Instead, users can be guided to create a copy first and + * make their edits to the copy. + */ + managed?: boolean; } export interface CreateSavedObjectsResult { @@ -50,6 +58,7 @@ export const createSavedObjects = async ({ overwrite, refresh, compatibilityMode, + managed, }: CreateSavedObjectsParams): Promise> => { // filter out any objects that resulted in errors const errorSet = accumulatedErrors.reduce( @@ -96,7 +105,12 @@ export const createSavedObjects = async ({ ...(!importStateValue.omitOriginId && { originId: originId ?? object.id }), }; } - return { ...object, ...(references && { references }), ...(originId && { originId }) }; + return { + ...object, + ...(references && { references }), + ...(originId && { originId }), + ...{ managed: managed ?? object.managed ?? false }, + }; }); const resolvableErrors = ['conflict', 'ambiguous_conflict', 'missing_references']; @@ -150,6 +164,7 @@ export const createSavedObjects = async ({ targetId: result.id, purpose: 'savedObjectImport', }, + ...{ managed: managed ?? false }, // we can safey create each doc with the given managed flag, even if it's set as the default, bulkCreate would "override" this otherwise. }); } } @@ -165,7 +180,6 @@ export const createSavedObjects = async ({ }) ).saved_objects : []; - return { createdObjects: remappedResults.filter((obj) => !obj.error), errors: extractErrors(remappedResults, objects, legacyUrlAliasResults, legacyUrlAliases), diff --git a/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/lib/extract_errors.test.ts b/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/lib/extract_errors.test.ts index 26499dcefaf88..5340139fe1ca0 100644 --- a/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/lib/extract_errors.test.ts +++ b/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/lib/extract_errors.test.ts @@ -31,6 +31,7 @@ describe('extractErrors()', () => { type: 'dashboard', attributes: { title: 'My Dashboard 1' }, references: [], + managed: false, }, { id: '2', @@ -38,6 +39,7 @@ describe('extractErrors()', () => { attributes: { title: 'My Dashboard 2' }, references: [], error: SavedObjectsErrorHelpers.createConflictError('dashboard', '2').output.payload, + managed: false, }, { id: '3', @@ -45,6 +47,7 @@ describe('extractErrors()', () => { attributes: { title: 'My Dashboard 3' }, references: [], error: SavedObjectsErrorHelpers.createBadRequestError().output.payload, + managed: false, }, { id: '4', @@ -53,6 +56,7 @@ describe('extractErrors()', () => { references: [], error: SavedObjectsErrorHelpers.createConflictError('dashboard', '4').output.payload, destinationId: 'foo', + managed: false, }, ]; const result = extractErrors(savedObjects, savedObjects, [], new Map()); @@ -63,6 +67,7 @@ describe('extractErrors()', () => { "type": "conflict", }, "id": "2", + "managed": false, "meta": Object { "title": "My Dashboard 2", }, @@ -76,6 +81,7 @@ describe('extractErrors()', () => { "type": "unknown", }, "id": "3", + "managed": false, "meta": Object { "title": "My Dashboard 3", }, @@ -87,6 +93,7 @@ describe('extractErrors()', () => { "type": "conflict", }, "id": "4", + "managed": false, "meta": Object { "title": "My Dashboard 4", }, @@ -104,6 +111,7 @@ describe('extractErrors()', () => { attributes: { title: 'My Dashboard 1' }, references: [], destinationId: 'one', + managed: false, }, { id: '2', @@ -111,6 +119,7 @@ describe('extractErrors()', () => { attributes: { title: 'My Dashboard 2' }, references: [], error: SavedObjectsErrorHelpers.createConflictError('dashboard', '2').output.payload, + managed: false, }, { id: '3', @@ -118,6 +127,7 @@ describe('extractErrors()', () => { attributes: { title: 'My Dashboard 3' }, references: [], destinationId: 'three', + managed: false, }, ]; @@ -135,6 +145,7 @@ describe('extractErrors()', () => { purpose: 'savedObjectImport', }, references: [], + managed: false, }, ], [ @@ -150,6 +161,7 @@ describe('extractErrors()', () => { purpose: 'savedObjectImport', }, references: [], + managed: false, }, ], ]); @@ -176,6 +188,7 @@ describe('extractErrors()', () => { "type": "conflict", }, "id": "2", + "managed": false, "meta": Object { "title": "My Dashboard 2", }, @@ -189,6 +202,7 @@ describe('extractErrors()', () => { "type": "unknown", }, "id": "default:dashboard:3", + "managed": false, "meta": Object { "title": "Legacy URL alias (3 -> three)", }, diff --git a/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/lib/extract_errors.ts b/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/lib/extract_errors.ts index 1f9ee579f39d5..0dad94a37df93 100644 --- a/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/lib/extract_errors.ts +++ b/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/lib/extract_errors.ts @@ -38,6 +38,7 @@ export function extractErrors( type: 'conflict', ...(destinationId && { destinationId }), }, + managed: savedObject.managed, }); continue; } @@ -49,6 +50,7 @@ export function extractErrors( ...savedObject.error, type: 'unknown', }, + managed: savedObject.managed, }); } } @@ -70,6 +72,7 @@ export function extractErrors( ...legacyUrlAliasResult.error, type: 'unknown', }, + managed: legacyUrlAlias.managed, }); } } diff --git a/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/resolve_import_errors.test.ts b/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/resolve_import_errors.test.ts index ded3cb788eb9a..5b2a145b54dd6 100644 --- a/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/resolve_import_errors.test.ts +++ b/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/resolve_import_errors.test.ts @@ -92,12 +92,14 @@ describe('#importSavedObjectsFromStream', () => { management: { icon: `${type}-icon` }, } as any), importHooks = {}, + managed, }: { retries?: SavedObjectsImportRetry[]; createNewCopies?: boolean; compatibilityMode?: boolean; getTypeImpl?: (name: string) => any; importHooks?: Record; + managed?: boolean; } = {}): ResolveSavedObjectsImportErrorsOptions => { readStream = new Readable(); savedObjectsClient = savedObjectsClientMock.create(); @@ -115,6 +117,7 @@ describe('#importSavedObjectsFromStream', () => { namespace, createNewCopies, compatibilityMode, + managed, }; }; @@ -128,7 +131,8 @@ describe('#importSavedObjectsFromStream', () => { }; const createObject = ( references?: SavedObjectReference[], - { type = 'foo-type', title = 'some-title' }: { type?: string; title?: string } = {} + { type = 'foo-type', title = 'some-title' }: { type?: string; title?: string } = {}, + managed?: boolean ): SavedObject<{ title: string; }> => { @@ -137,6 +141,7 @@ describe('#importSavedObjectsFromStream', () => { id: uuidv4(), references: references || [], attributes: { title }, + managed: managed ?? false, // apply the default that real createSavedObjects applies }; }; const createError = (): SavedObjectsImportFailure => { @@ -590,6 +595,62 @@ describe('#importSavedObjectsFromStream', () => { }); }); }); + describe('with managed option', () => { + test('applies managed option to overwritten objects if specified', async () => { + const objectCreated = createObject(); + const objectsToOverwrite = [{ ...objectCreated, managed: true }]; + const objectsToNotOverwrite = [createObject()]; + mockSplitOverwrites.mockReturnValue({ objectsToOverwrite, objectsToNotOverwrite }); + mockCreateSavedObjects.mockResolvedValueOnce({ + errors: [createError()], // this error will NOT be passed to the second `mockCreateSavedObjects` call + createdObjects: [], + }); + + await resolveSavedObjectsImportErrors(setupOptions({ managed: true })); + const partialCreateSavedObjectsParams = { + accumulatedErrors: [], + savedObjectsClient, + importStateMap: new Map(), + namespace, + managed: true, + }; + expect(mockCreateSavedObjects).toHaveBeenNthCalledWith(1, { + ...partialCreateSavedObjectsParams, + objects: objectsToOverwrite, + overwrite: true, + }); + expect(mockCreateSavedObjects).toHaveBeenNthCalledWith(2, { + ...partialCreateSavedObjectsParams, + objects: objectsToNotOverwrite, + }); + }); + test('if not specified, sets a default for objects that do not have managed specified', async () => { + const objectsToNotOverwrite = [{ ...createObject(), managed: false }]; + const objectsToOverwrite = [createObject()]; + mockSplitOverwrites.mockReturnValue({ objectsToOverwrite, objectsToNotOverwrite }); + mockCreateSavedObjects.mockResolvedValueOnce({ + errors: [createError()], // this error will NOT be passed to the second `mockCreateSavedObjects` call + createdObjects: [], + }); + + await resolveSavedObjectsImportErrors(setupOptions()); + const partialCreateSavedObjectsParams = { + accumulatedErrors: [], + savedObjectsClient, + importStateMap: new Map(), + namespace, + }; + expect(mockCreateSavedObjects).toHaveBeenNthCalledWith(1, { + ...partialCreateSavedObjectsParams, + objects: objectsToOverwrite, + overwrite: true, + }); + expect(mockCreateSavedObjects).toHaveBeenNthCalledWith(2, { + ...partialCreateSavedObjectsParams, + objects: objectsToNotOverwrite, + }); + }); + }); }); describe('results', () => { @@ -664,12 +725,14 @@ describe('#importSavedObjectsFromStream', () => { id: obj1.id, meta: { title: obj1.attributes.title, icon: `${obj1.type}-icon` }, overwrite: true, + managed: false, }, { type: obj2.type, id: obj2.id, meta: { title: obj2.attributes.title, icon: `${obj2.type}-icon` }, destinationId: obj2.destinationId, + managed: false, }, { type: obj3.type, @@ -677,6 +740,7 @@ describe('#importSavedObjectsFromStream', () => { meta: { title: obj3.attributes.title, icon: `${obj3.type}-icon` }, destinationId: obj3.destinationId, createNewCopy: true, + managed: false, }, ]; const errors = [ @@ -727,12 +791,14 @@ describe('#importSavedObjectsFromStream', () => { id: obj1.id, overwrite: true, meta: { title: 'getTitle-foo', icon: `${obj1.type}-icon` }, + managed: false, }, { type: obj2.type, id: obj2.id, overwrite: true, meta: { title: 'bar-title', icon: `${obj2.type}-icon` }, + managed: false, }, ]; @@ -771,5 +837,120 @@ describe('#importSavedObjectsFromStream', () => { warnings: [], }); }); + + test('does not apply a default for `managed` when not specified', async () => { + const obj1 = createObject([], { type: 'foo' }, true); + const obj2 = createObject([], { type: 'bar', title: 'bar-title' }); + + const options = setupOptions({ + getTypeImpl: (type) => { + if (type === 'foo') { + return { + management: { getTitle: () => 'getTitle-foo', icon: `${type}-icon` }, + }; + } + return { + management: { icon: `${type}-icon` }, + }; + }, + }); + mockCheckConflicts.mockResolvedValue({ + errors: [], + filteredObjects: [], + importStateMap: new Map(), + pendingOverwrites: new Set(), + }); + mockCreateSavedObjects + .mockResolvedValueOnce({ + errors: [], + createdObjects: [obj1, { ...obj2, managed: false }], + }) // default applied in createSavedObjects + .mockResolvedValueOnce({ errors: [], createdObjects: [] }); + + const result = await resolveSavedObjectsImportErrors(options); + // successResults only includes the imported object's type, id, and destinationId (if a new one was generated) + const successResults = [ + { + type: obj1.type, + id: obj1.id, + overwrite: true, + meta: { title: 'getTitle-foo', icon: `${obj1.type}-icon` }, + managed: true, + }, + { + type: obj2.type, + id: obj2.id, + overwrite: true, + meta: { title: 'bar-title', icon: `${obj2.type}-icon` }, + managed: false, + }, + ]; + + expect(result).toEqual({ + success: true, + successCount: 2, + successResults, + warnings: [], + }); + }); // assert that the documents being imported retain their prop or have the default applied + test('applies `managed` to objects', async () => { + const obj1 = createObject([], { type: 'foo' }, true); + const obj2 = createObject([], { type: 'bar', title: 'bar-title' }); + + const options = setupOptions({ + getTypeImpl: (type) => { + if (type === 'foo') { + return { + management: { getTitle: () => 'getTitle-foo', icon: `${type}-icon` }, + }; + } + return { + management: { icon: `${type}-icon` }, + }; + }, + managed: true, + }); + mockCheckConflicts.mockResolvedValue({ + errors: [], + filteredObjects: [], + importStateMap: new Map(), + pendingOverwrites: new Set(), + }); + mockCreateSavedObjects + .mockResolvedValueOnce({ + errors: [], + createdObjects: [ + { ...obj1, managed: true }, + { ...obj2, managed: true }, + ], + }) // default applied in createSavedObjects + .mockResolvedValueOnce({ errors: [], createdObjects: [] }); + + const result = await resolveSavedObjectsImportErrors(options); + // successResults only includes the imported object's type, id, and destinationId (if a new one was generated) + const successResults = [ + { + type: obj1.type, + id: obj1.id, + overwrite: true, + meta: { title: 'getTitle-foo', icon: `${obj1.type}-icon` }, + managed: true, + }, + { + type: obj2.type, + id: obj2.id, + overwrite: true, + meta: { title: 'bar-title', icon: `${obj2.type}-icon` }, + managed: true, + }, + ]; + + expect(result).toEqual({ + success: true, + successCount: 2, + successResults, + warnings: [], + }); + }); // assert that the documents being imported retain their prop or have the default applied }); }); diff --git a/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/resolve_import_errors.ts b/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/resolve_import_errors.ts index 8abacbeb310a4..ade85f02988c5 100644 --- a/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/resolve_import_errors.ts +++ b/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/resolve_import_errors.ts @@ -60,6 +60,10 @@ export interface ResolveSavedObjectsImportErrorsOptions { * different Kibana versions (e.g. generate legacy URL aliases for all imported objects that have to change IDs). */ compatibilityMode?: boolean; + /** If true, will create objects as managed. + * This property allows plugin authors to implement read-only UI's + */ + managed?: boolean; } /** @@ -78,6 +82,7 @@ export async function resolveSavedObjectsImportErrors({ namespace, createNewCopies, compatibilityMode, + managed, }: ResolveSavedObjectsImportErrorsOptions): Promise { // throw a BadRequest error if we see invalid retries validateRetries(retries); @@ -93,6 +98,7 @@ export async function resolveSavedObjectsImportErrors({ objectLimit, filter, supportedTypes, + managed, }); // Map of all IDs for objects that we are attempting to import, and any references that are not included in the read stream; // each value is empty by default @@ -112,6 +118,7 @@ export async function resolveSavedObjectsImportErrors({ // Replace references for (const savedObject of collectSavedObjectsResult.collectedObjects) { + // collectedObjects already have managed flag set const refMap = retriesReferencesMap.get(`${savedObject.type}:${savedObject.id}`); if (!refMap) { continue; @@ -205,13 +212,14 @@ export async function resolveSavedObjectsImportErrors({ overwrite?: boolean ) => { const createSavedObjectsParams = { - objects, + objects, // these objects only have a title, no other properties accumulatedErrors, savedObjectsClient, importStateMap, namespace, overwrite, compatibilityMode, + managed, }; const { createdObjects, errors: bulkCreateErrors } = await createSavedObjects( createSavedObjectsParams @@ -235,6 +243,7 @@ export async function resolveSavedObjectsImportErrors({ ...(overwrite && { overwrite }), ...(destinationId && { destinationId }), ...(destinationId && !originId && !createNewCopies && { createNewCopy: true }), + ...{ managed: createdObject.managed ?? managed ?? false }, // double sure that this already exists but doing a check just in case }; }), ]; diff --git a/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/saved_objects_importer.ts b/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/saved_objects_importer.ts index 0a2b39993cd59..2c87395c255cd 100644 --- a/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/saved_objects_importer.ts +++ b/packages/core/saved-objects/core-saved-objects-import-export-server-internal/src/import/saved_objects_importer.ts @@ -57,6 +57,7 @@ export class SavedObjectsImporter implements ISavedObjectsImporter { overwrite, refresh, compatibilityMode, + managed, }: SavedObjectsImportOptions): Promise { return importSavedObjectsFromStream({ readStream, @@ -69,6 +70,7 @@ export class SavedObjectsImporter implements ISavedObjectsImporter { savedObjectsClient: this.#savedObjectsClient, typeRegistry: this.#typeRegistry, importHooks: this.#importHooks, + managed, }); } @@ -78,6 +80,7 @@ export class SavedObjectsImporter implements ISavedObjectsImporter { compatibilityMode, namespace, retries, + managed, }: SavedObjectsResolveImportErrorsOptions): Promise { return resolveSavedObjectsImportErrors({ readStream, @@ -89,6 +92,7 @@ export class SavedObjectsImporter implements ISavedObjectsImporter { savedObjectsClient: this.#savedObjectsClient, typeRegistry: this.#typeRegistry, importHooks: this.#importHooks, + managed, }); } } diff --git a/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/legacy_import_export/lib/import_dashboards.test.ts b/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/legacy_import_export/lib/import_dashboards.test.ts index d6382efd673fa..156f9f42f792b 100644 --- a/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/legacy_import_export/lib/import_dashboards.test.ts +++ b/packages/core/saved-objects/core-saved-objects-server-internal/src/routes/legacy_import_export/lib/import_dashboards.test.ts @@ -31,11 +31,12 @@ describe('importDashboards(req)', () => { type: 'visualization', attributes: { visState: '{}' }, references: [], + managed: true, }, ]; }); - test('should call bulkCreate with each asset, filtering out any version if present', async () => { + test('should call bulkCreate with each asset, filtering out any version and managed if present', async () => { await importDashboards(savedObjectClient, importedObjects, { overwrite: false, exclude: [] }); expect(savedObjectClient.bulkCreate).toHaveBeenCalledTimes(1); diff --git a/packages/core/saved-objects/core-saved-objects-server/src/import.ts b/packages/core/saved-objects/core-saved-objects-server/src/import.ts index a10fcd4a237a9..90d33e9339c43 100644 --- a/packages/core/saved-objects/core-saved-objects-server/src/import.ts +++ b/packages/core/saved-objects/core-saved-objects-server/src/import.ts @@ -69,6 +69,14 @@ export interface SavedObjectsImportOptions { * different Kibana versions (e.g. generate legacy URL aliases for all imported objects that have to change IDs). */ compatibilityMode?: boolean; + /** + * If true, will import as a managed object, else will import as not managed. + * + * This can be leveraged by applications to e.g. prevent edits to a managed + * saved object. Instead, users can be guided to create a copy first and + * make their edits to the copy. + */ + managed?: boolean; } /** @@ -89,6 +97,14 @@ export interface SavedObjectsResolveImportErrorsOptions { * different Kibana versions (e.g. generate legacy URL aliases for all imported objects that have to change IDs). */ compatibilityMode?: boolean; + /** + * If true, will import as a managed object, else will import as not managed. + * + * This can be leveraged by applications to e.g. prevent edits to a managed + * saved object. Instead, users can be guided to create a copy first and + * make their edits to the copy. + */ + managed?: boolean; } export type CreatedObject = SavedObject & { destinationId?: string }; diff --git a/packages/kbn-check-mappings-update-cli/current_mappings.json b/packages/kbn-check-mappings-update-cli/current_mappings.json index 4bb503c3a2bfc..32b4ad91d1903 100644 --- a/packages/kbn-check-mappings-update-cli/current_mappings.json +++ b/packages/kbn-check-mappings-update-cli/current_mappings.json @@ -511,6 +511,10 @@ }, "FileKind": { "type": "keyword" + }, + "hash": { + "dynamic": false, + "properties": {} } } }, @@ -2728,10 +2732,6 @@ "dynamic": false, "properties": {} }, - "metrics-explorer-view": { - "dynamic": false, - "properties": {} - }, "inventory-view": { "dynamic": false, "properties": {} @@ -2744,6 +2744,10 @@ } } }, + "metrics-explorer-view": { + "dynamic": false, + "properties": {} + }, "upgrade-assistant-reindex-operation": { "dynamic": false, "properties": { diff --git a/packages/kbn-doc-links/src/get_doc_links.ts b/packages/kbn-doc-links/src/get_doc_links.ts index 29ac5472e37dd..89b3610e622b9 100644 --- a/packages/kbn-doc-links/src/get_doc_links.ts +++ b/packages/kbn-doc-links/src/get_doc_links.ts @@ -126,6 +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`, bulkApi: `${ELASTICSEARCH_DOCS}docs-bulk.html`, configuration: `${ENTERPRISE_SEARCH_DOCS}configuration.html`, connectors: `${ENTERPRISE_SEARCH_DOCS}connectors.html`, diff --git a/packages/kbn-doc-links/src/types.ts b/packages/kbn-doc-links/src/types.ts index efe5e95f238d0..5e2e8e7bf1304 100644 --- a/packages/kbn-doc-links/src/types.ts +++ b/packages/kbn-doc-links/src/types.ts @@ -111,6 +111,7 @@ export interface DocLinks { readonly apiKeys: string; readonly behavioralAnalytics: string; readonly behavioralAnalyticsEvents: string; + readonly buildConnector: string; readonly bulkApi: string; readonly configuration: string; readonly connectors: string; diff --git a/packages/kbn-es-query/src/kuery/node_types/node_builder.test.ts b/packages/kbn-es-query/src/kuery/node_types/node_builder.test.ts index 46e21245bf333..d414788afec1e 100644 --- a/packages/kbn-es-query/src/kuery/node_types/node_builder.test.ts +++ b/packages/kbn-es-query/src/kuery/node_types/node_builder.test.ts @@ -55,6 +55,25 @@ describe('nodeBuilder', () => { }); describe('and method', () => { + test('no clauses', () => { + const node = nodeBuilder.and([]); + const query = toElasticsearchQuery(node); + expect(node).toMatchInlineSnapshot(` + Object { + "arguments": Array [], + "function": "and", + "type": "function", + } + `); + expect(query).toMatchInlineSnapshot(` + Object { + "bool": Object { + "filter": Array [], + }, + } + `); + }); + test('single clause', () => { const nodes = [nodeBuilder.is('foo', 'bar')]; const query = toElasticsearchQuery(nodeBuilder.and(nodes)); @@ -166,6 +185,26 @@ describe('nodeBuilder', () => { }); describe('or method', () => { + test('no clauses', () => { + const node = nodeBuilder.or([]); + const query = toElasticsearchQuery(node); + expect(node).toMatchInlineSnapshot(` + Object { + "arguments": Array [], + "function": "or", + "type": "function", + } + `); + expect(query).toMatchInlineSnapshot(` + Object { + "bool": Object { + "minimum_should_match": 1, + "should": Array [], + }, + } + `); + }); + test('single clause', () => { const nodes = [nodeBuilder.is('foo', 'bar')]; const query = toElasticsearchQuery(nodeBuilder.or(nodes)); diff --git a/packages/kbn-es-query/src/kuery/node_types/node_builder.ts b/packages/kbn-es-query/src/kuery/node_types/node_builder.ts index 948985c965378..80fcd9607c7ab 100644 --- a/packages/kbn-es-query/src/kuery/node_types/node_builder.ts +++ b/packages/kbn-es-query/src/kuery/node_types/node_builder.ts @@ -10,23 +10,23 @@ import type { RangeFilterParams } from '../../filters'; import { KueryNode, nodeTypes } from '../types'; export const nodeBuilder = { - is: (fieldName: string, value: string | KueryNode) => { + is: (fieldName: string, value: string | KueryNode): KueryNode => { return nodeTypes.function.buildNodeWithArgumentNodes('is', [ nodeTypes.literal.buildNode(fieldName), typeof value === 'string' ? nodeTypes.literal.buildNode(value) : value, ]); }, or: (nodes: KueryNode[]): KueryNode => { - return nodes.length > 1 ? nodeTypes.function.buildNode('or', nodes) : nodes[0]; + return nodes.length === 1 ? nodes[0] : nodeTypes.function.buildNode('or', nodes); }, and: (nodes: KueryNode[]): KueryNode => { - return nodes.length > 1 ? nodeTypes.function.buildNode('and', nodes) : nodes[0]; + return nodes.length === 1 ? nodes[0] : nodeTypes.function.buildNode('and', nodes); }, range: ( fieldName: string, operator: keyof Pick, value: number | string - ) => { + ): KueryNode => { return nodeTypes.function.buildNodeWithArgumentNodes('range', [ nodeTypes.literal.buildNode(fieldName), operator, diff --git a/packages/kbn-generate-csv/src/get_export_settings.ts b/packages/kbn-generate-csv/src/get_export_settings.ts index d2e62f9281418..46d31afaf9e4f 100644 --- a/packages/kbn-generate-csv/src/get_export_settings.ts +++ b/packages/kbn-generate-csv/src/get_export_settings.ts @@ -64,7 +64,11 @@ export const getExportSettings = async ( ]); const escapeFormulaValues = config.escapeFormulaValues; - const escapeValue = createEscapeValue(quoteValues, escapeFormulaValues); + const escapeValue = createEscapeValue({ + separator, + quoteValues, + escapeFormulaValues, + }); const bom = config.useByteOrderMarkEncoding ? CSV_BOM_CHARS : ''; return { diff --git a/packages/kbn-optimizer/limits.yml b/packages/kbn-optimizer/limits.yml index af6396c11e063..85c8b6c888236 100644 --- a/packages/kbn-optimizer/limits.yml +++ b/packages/kbn-optimizer/limits.yml @@ -116,6 +116,8 @@ pageLoadAssetSize: security: 65433 securitySolution: 66738 serverless: 16573 + serverlessObservability: 16582 + serverlessSearch: 17548 sessionView: 77750 share: 71239 snapshotRestore: 79032 @@ -153,4 +155,5 @@ pageLoadAssetSize: visTypeVislib: 242838 visTypeXy: 46868 visualizations: 90000 + visualizationUiComponents: 76424 watcher: 43598 diff --git a/packages/kbn-securitysolution-grouping/src/components/accordion_panel/helpers.ts b/packages/kbn-securitysolution-grouping/src/components/accordion_panel/helpers.ts index 5529d5bf521c0..14d7c44daf1f1 100644 --- a/packages/kbn-securitysolution-grouping/src/components/accordion_panel/helpers.ts +++ b/packages/kbn-securitysolution-grouping/src/components/accordion_panel/helpers.ts @@ -30,3 +30,22 @@ export const createGroupFilter = (selectedGroup: string, query?: string) => }, ] : []; + +export const getNullGroupFilter = (selectedGroup: string) => [ + { + meta: { + disabled: false, + negate: true, + alias: null, + key: selectedGroup, + field: selectedGroup, + value: 'exists', + type: 'exists', + }, + query: { + exists: { + field: selectedGroup, + }, + }, + }, +]; diff --git a/packages/kbn-securitysolution-grouping/src/components/accordion_panel/index.tsx b/packages/kbn-securitysolution-grouping/src/components/accordion_panel/index.tsx index c1d55495cf785..f40fc79eb8c80 100644 --- a/packages/kbn-securitysolution-grouping/src/components/accordion_panel/index.tsx +++ b/packages/kbn-securitysolution-grouping/src/components/accordion_panel/index.tsx @@ -6,12 +6,12 @@ * Side Public License, v 1. */ -import { EuiAccordion, EuiFlexGroup, EuiFlexItem, EuiTitle } from '@elastic/eui'; +import { EuiAccordion, EuiFlexGroup, EuiFlexItem, EuiTitle, EuiIconTip } from '@elastic/eui'; import type { Filter } from '@kbn/es-query'; import React, { useCallback, useEffect, useMemo, useRef } from 'react'; import { firstNonNullValue } from '../../helpers'; import type { RawBucket } from '../types'; -import { createGroupFilter } from './helpers'; +import { createGroupFilter, getNullGroupFilter } from './helpers'; interface GroupPanelProps { customAccordionButtonClassName?: string; @@ -22,20 +22,35 @@ interface GroupPanelProps { groupPanelRenderer?: JSX.Element; groupingLevel?: number; isLoading: boolean; + isNullGroup?: boolean; + nullGroupMessage?: string; onGroupClose: () => void; onToggleGroup?: (isOpen: boolean, groupBucket: RawBucket) => void; renderChildComponent: (groupFilter: Filter[]) => React.ReactElement; selectedGroup: string; } -const DefaultGroupPanelRenderer = ({ title }: { title: string }) => ( +const DefaultGroupPanelRenderer = ({ + isNullGroup, + title, + nullGroupMessage, +}: { + isNullGroup: boolean; + title: string; + nullGroupMessage?: string; +}) => (
- +

{title}

+ {isNullGroup && nullGroupMessage && ( + + + + )}
); @@ -49,10 +64,12 @@ const GroupPanelComponent = ({ groupPanelRenderer, groupingLevel = 0, isLoading, + isNullGroup = false, onGroupClose, onToggleGroup, renderChildComponent, selectedGroup, + nullGroupMessage, }: GroupPanelProps) => { const lastForceState = useRef(forceState); useEffect(() => { @@ -68,8 +85,11 @@ const GroupPanelComponent = ({ const groupFieldValue = useMemo(() => firstNonNullValue(groupBucket.key), [groupBucket.key]); const groupFilters = useMemo( - () => createGroupFilter(selectedGroup, groupFieldValue), - [groupFieldValue, selectedGroup] + () => + isNullGroup + ? getNullGroupFilter(selectedGroup) + : createGroupFilter(selectedGroup, groupFieldValue), + [groupFieldValue, isNullGroup, selectedGroup] ); const onToggle = useCallback( @@ -86,7 +106,13 @@ const GroupPanelComponent = ({ buttonClassName={customAccordionButtonClassName} buttonContent={
- {groupPanelRenderer ?? } + {groupPanelRenderer ?? ( + + )}
} buttonElement="div" diff --git a/packages/kbn-securitysolution-grouping/src/components/grouping.mock.tsx b/packages/kbn-securitysolution-grouping/src/components/grouping.mock.tsx index 0647c14485fad..412644910db99 100644 --- a/packages/kbn-securitysolution-grouping/src/components/grouping.mock.tsx +++ b/packages/kbn-securitysolution-grouping/src/components/grouping.mock.tsx @@ -8,10 +8,8 @@ import React from 'react'; import { EuiContextMenuItem } from '@elastic/eui'; -export const rule1Name = 'Rule 1 name'; -const rule1Desc = 'Rule 1 description'; -export const rule2Name = 'Rule 2 name'; -const rule2Desc = 'Rule 2 description'; +export const host1Name = 'nice-host'; +export const host2Name = 'cool-host'; export const mockGroupingProps = { activePage: 0, @@ -24,13 +22,13 @@ export const mockGroupingProps = { sum_other_doc_count: 0, buckets: [ { - key: [rule1Name, rule1Desc], - key_as_string: `${rule1Name}|${rule1Desc}`, + key: [host1Name], + key_as_string: `${host1Name}`, doc_count: 1, hostsCountAggregation: { value: 1, }, - ruleTags: { + hostTags: { doc_count_error_upper_bound: 0, sum_other_doc_count: 0, buckets: [], @@ -56,13 +54,13 @@ export const mockGroupingProps = { }, }, { - key: [rule2Name, rule2Desc], - key_as_string: `${rule2Name}|${rule2Desc}`, + key: [host2Name], + key_as_string: `${host2Name}`, doc_count: 1, hostsCountAggregation: { value: 1, }, - ruleTags: { + hostTags: { doc_count_error_upper_bound: 0, sum_other_doc_count: 0, buckets: [], @@ -87,10 +85,43 @@ export const mockGroupingProps = { value: 1, }, }, + { + key: ['-'], + key_as_string: `-`, + isNullGroup: true, + doc_count: 11, + hostsCountAggregation: { + value: 11, + }, + hostTags: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [], + }, + alertsCount: { + value: 11, + }, + severitiesSubAggregation: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'low', + doc_count: 11, + }, + ], + }, + countSeveritySubAggregation: { + value: 11, + }, + usersCountAggregation: { + value: 11, + }, + }, ], }, unitsCount: { - value: 2, + value: 3, }, }, groupingId: 'test-grouping-id', @@ -98,7 +129,7 @@ export const mockGroupingProps = { itemsPerPage: 25, renderChildComponent: () =>

{'child component'}

, onGroupClose: () => {}, - selectedGroup: 'kibana.alert.rule.name', + selectedGroup: 'host.name', takeActionItems: () => [ {}}> {'Mark as acknowledged'} diff --git a/packages/kbn-securitysolution-grouping/src/components/grouping.stories.tsx b/packages/kbn-securitysolution-grouping/src/components/grouping.stories.tsx index b961402ee3a7c..ed08d8541d0e8 100644 --- a/packages/kbn-securitysolution-grouping/src/components/grouping.stories.tsx +++ b/packages/kbn-securitysolution-grouping/src/components/grouping.stories.tsx @@ -23,6 +23,6 @@ export default { }, }; -export const Emtpy: Story = () => { +export const Empty: Story = () => { return ; }; diff --git a/packages/kbn-securitysolution-grouping/src/components/grouping.test.tsx b/packages/kbn-securitysolution-grouping/src/components/grouping.test.tsx index 2376614ab444c..151b83e45cfd5 100644 --- a/packages/kbn-securitysolution-grouping/src/components/grouping.test.tsx +++ b/packages/kbn-securitysolution-grouping/src/components/grouping.test.tsx @@ -10,11 +10,11 @@ import { fireEvent, render, within } from '@testing-library/react'; import React from 'react'; import { I18nProvider } from '@kbn/i18n-react'; import { Grouping } from './grouping'; -import { createGroupFilter } from './accordion_panel/helpers'; +import { createGroupFilter, getNullGroupFilter } from './accordion_panel/helpers'; import { METRIC_TYPE } from '@kbn/analytics'; import { getTelemetryEvent } from '../telemetry/const'; -import { mockGroupingProps, rule1Name, rule2Name } from './grouping.mock'; +import { mockGroupingProps, host1Name, host2Name } from './grouping.mock'; const renderChildComponent = jest.fn(); const takeActionItems = jest.fn(); @@ -37,9 +37,9 @@ describe('grouping container', () => { ); - expect(getByTestId('unit-count').textContent).toBe('2 events'); - expect(getByTestId('group-count').textContent).toBe('2 groups'); - expect(getAllByTestId('grouping-accordion').length).toBe(2); + expect(getByTestId('unit-count').textContent).toBe('14 events'); + expect(getByTestId('group-count').textContent).toBe('3 groups'); + expect(getAllByTestId('grouping-accordion').length).toBe(3); expect(queryByTestId('empty-results-panel')).not.toBeInTheDocument(); }); @@ -79,12 +79,12 @@ describe('grouping container', () => { fireEvent.click(group1); expect(renderChildComponent).toHaveBeenNthCalledWith( 1, - createGroupFilter(testProps.selectedGroup, rule1Name) + createGroupFilter(testProps.selectedGroup, host1Name) ); fireEvent.click(group2); expect(renderChildComponent).toHaveBeenNthCalledWith( 2, - createGroupFilter(testProps.selectedGroup, rule2Name) + createGroupFilter(testProps.selectedGroup, host2Name) ); }); @@ -116,4 +116,24 @@ describe('grouping container', () => { }) ); }); + + it('Renders a null group and passes the correct filter to take actions and child component', () => { + takeActionItems.mockReturnValue([]); + const { getAllByTestId, getByTestId } = render( + + + + ); + expect(getByTestId('null-group-icon')).toBeInTheDocument(); + + let lastGroup = getAllByTestId('grouping-accordion').at(-1); + fireEvent.click(within(lastGroup!).getByTestId('take-action-button')); + + expect(takeActionItems).toHaveBeenCalledWith(getNullGroupFilter('host.name'), 2); + + lastGroup = getAllByTestId('grouping-accordion').at(-1); + fireEvent.click(within(lastGroup!).getByTestId('group-panel-toggle')); + + expect(renderChildComponent).toHaveBeenCalledWith(getNullGroupFilter('host.name')); + }); }); diff --git a/packages/kbn-securitysolution-grouping/src/components/grouping.tsx b/packages/kbn-securitysolution-grouping/src/components/grouping.tsx index 625beda320d04..8182d204f81dd 100644 --- a/packages/kbn-securitysolution-grouping/src/components/grouping.tsx +++ b/packages/kbn-securitysolution-grouping/src/components/grouping.tsx @@ -17,12 +17,12 @@ import type { Filter } from '@kbn/es-query'; import React, { useMemo, useState } from 'react'; import { METRIC_TYPE, UiCounterMetricType } from '@kbn/analytics'; import { defaultUnit, firstNonNullValue } from '../helpers'; -import { createGroupFilter } from './accordion_panel/helpers'; +import { createGroupFilter, getNullGroupFilter } from './accordion_panel/helpers'; import { GroupPanel } from './accordion_panel'; import { GroupStats } from './accordion_panel/group_stats'; import { EmptyGroupingComponent } from './empty_results_panel'; import { countCss, groupingContainerCss, groupingContainerCssLevel } from './styles'; -import { GROUPS_UNIT } from './translations'; +import { GROUPS_UNIT, NULL_GROUP } from './translations'; import type { GroupingAggregation, GroupPanelRenderer } from './types'; import { GroupStatsRenderer, OnGroupToggle } from './types'; import { getTelemetryEvent } from '../telemetry/const'; @@ -78,13 +78,20 @@ const GroupingComponent = ({ const [trigger, setTrigger] = useState>( {} ); + const [nullCount, setNullCount] = useState({ unit: 0, group: 0 }); - const unitCount = data?.unitsCount?.value ?? 0; + const unitCount = useMemo( + () => (data?.unitsCount?.value ?? 0) + nullCount.unit, + [data?.unitsCount?.value, nullCount.unit] + ); const unitCountText = useMemo(() => { return `${unitCount.toLocaleString()} ${unit && unit(unitCount)}`; }, [unitCount, unit]); - const groupCount = data?.groupsCount?.value ?? 0; + const groupCount = useMemo( + () => (data?.groupsCount?.value ?? 0) + nullCount.group, + [data?.groupsCount?.value, nullCount.group] + ); const groupCountText = useMemo( () => `${groupCount.toLocaleString()} ${GROUPS_UNIT(groupCount)}`, [groupCount] @@ -95,15 +102,28 @@ const GroupingComponent = ({ data?.groupByFields?.buckets?.map((groupBucket, groupNumber) => { const group = firstNonNullValue(groupBucket.key); const groupKey = `group-${groupNumber}-${group}`; + const isNullGroup = groupBucket.isNullGroup ?? false; + const nullGroupMessage = isNullGroup + ? NULL_GROUP(selectedGroup, unit(groupBucket.doc_count)) + : undefined; + if (isNullGroup) { + setNullCount({ unit: groupBucket.doc_count, group: 1 }); + } return ( ({ forceState={(trigger[groupKey] && trigger[groupKey].state) ?? 'closed'} groupBucket={groupBucket} groupPanelRenderer={ - groupPanelRenderer && groupPanelRenderer(selectedGroup, groupBucket) + groupPanelRenderer && + groupPanelRenderer(selectedGroup, groupBucket, nullGroupMessage) } isLoading={isLoading} onToggleGroup={(isOpen) => { @@ -157,8 +178,10 @@ const GroupingComponent = ({ takeActionItems, tracker, trigger, + unit, ] ); + const pageCount = useMemo( () => (groupCount ? Math.ceil(groupCount / itemsPerPage) : 1), [groupCount, itemsPerPage] diff --git a/packages/kbn-securitysolution-grouping/src/components/translations.ts b/packages/kbn-securitysolution-grouping/src/components/translations.ts index f2cb8a172dbdc..2209d61d1b34f 100644 --- a/packages/kbn-securitysolution-grouping/src/components/translations.ts +++ b/packages/kbn-securitysolution-grouping/src/components/translations.ts @@ -54,3 +54,10 @@ export const DEFAULT_UNIT = (totalCount: number) => values: { totalCount }, defaultMessage: `{totalCount, plural, =1 {event} other {events}}`, }); + +export const NULL_GROUP = (selectedGroup: string, unit: string) => + i18n.translate('grouping.nullGroup.title', { + values: { selectedGroup, unit }, + defaultMessage: + 'The selected group by field, {selectedGroup}, is missing a value for this group of {unit}.', + }); diff --git a/packages/kbn-securitysolution-grouping/src/components/types.ts b/packages/kbn-securitysolution-grouping/src/components/types.ts index cf5f55f5c27f3..3ed5cc43ff877 100644 --- a/packages/kbn-securitysolution-grouping/src/components/types.ts +++ b/packages/kbn-securitysolution-grouping/src/components/types.ts @@ -12,16 +12,19 @@ export interface GenericBuckets { key_as_string?: string; // contains, for example, formatted dates doc_count: number; } - export const NONE_GROUP_KEY = 'none'; export type RawBucket = GenericBuckets & T; +export interface GroupingBucket { + isNullGroup?: boolean; +} + /** Defines the shape of the aggregation returned by Elasticsearch */ // TODO: write developer docs for these fields export interface RootAggregation { groupByFields?: { - buckets?: Array>; + buckets?: Array & GroupingBucket>; }; groupsCount?: { value?: number | null; @@ -60,7 +63,8 @@ export type GroupStatsRenderer = ( export type GroupPanelRenderer = ( selectedGroup: string, - fieldBucket: RawBucket + fieldBucket: RawBucket, + nullGroupMessage?: string ) => JSX.Element | undefined; export type OnGroupToggle = (params: { diff --git a/packages/kbn-securitysolution-grouping/src/containers/query/helpers.ts b/packages/kbn-securitysolution-grouping/src/containers/query/helpers.ts new file mode 100644 index 0000000000000..0de0e66fe3df0 --- /dev/null +++ b/packages/kbn-securitysolution-grouping/src/containers/query/helpers.ts @@ -0,0 +1,37 @@ +/* + * Copyright 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 { ES_FIELD_TYPES } from '@kbn/field-types'; +/** + * Returns a tuple of values according to the `esType` param, these values are meant to be applied in the _missing_ + * property of the query aggregation of the grouping, to look up for missing values in the response buckets. + * These values do not need to be anything in particular, the only requirement is they have to be 2 different values that validate against the field type. + */ +export function getFieldTypeMissingValues(esType: string[]): [number, number] | [string, string] { + const knownType: ES_FIELD_TYPES = esType[0] as ES_FIELD_TYPES; + switch (knownType) { + case ES_FIELD_TYPES.BYTE: + case ES_FIELD_TYPES.DOUBLE: + case ES_FIELD_TYPES.INTEGER: + case ES_FIELD_TYPES.LONG: + case ES_FIELD_TYPES.FLOAT: + case ES_FIELD_TYPES.HALF_FLOAT: + case ES_FIELD_TYPES.SCALED_FLOAT: + case ES_FIELD_TYPES.SHORT: + case ES_FIELD_TYPES.UNSIGNED_LONG: + case ES_FIELD_TYPES.DATE: + case ES_FIELD_TYPES.DATE_NANOS: + return [0, 1]; + case ES_FIELD_TYPES.IP: + return ['0.0.0.0', '::']; + default: + return ['-', '--']; + } +} + +export const getEmptyValue = () => '—'; diff --git a/packages/kbn-securitysolution-grouping/src/containers/query/index.test.ts b/packages/kbn-securitysolution-grouping/src/containers/query/index.test.ts index c3f81c4071c58..c3ab014119db7 100644 --- a/packages/kbn-securitysolution-grouping/src/containers/query/index.test.ts +++ b/packages/kbn-securitysolution-grouping/src/containers/query/index.test.ts @@ -7,12 +7,13 @@ */ import type { GroupingQueryArgs } from './types'; -import { getGroupingQuery, MAX_QUERY_SIZE } from '.'; +import { getGroupingQuery, parseGroupingQuery } from '.'; +import { getEmptyValue } from './helpers'; const testProps: GroupingQueryArgs = { additionalFilters: [], from: '2022-12-28T15:35:32.871Z', - groupByFields: ['host.name'], + groupByField: 'host.name', statsAggregations: [ { alertsCount: { @@ -53,6 +54,7 @@ const testProps: GroupingQueryArgs = { pageNumber: 0, rootAggregations: [], runtimeMappings: {}, + selectedGroupEsTypes: ['keyword'], size: 25, to: '2023-02-23T06:59:59.999Z', }; @@ -60,12 +62,13 @@ describe('group selector', () => { beforeEach(() => { jest.clearAllMocks(); }); - it('Sets terms query when single stackBy field requested', () => { + it('Sets multi terms query with missing argument for 2 default values', () => { const result = getGroupingQuery(testProps); - expect(result.aggs.groupByFields.multi_terms).toBeUndefined(); - expect(result.aggs.groupByFields.terms).toEqual({ - field: 'host.name', - size: MAX_QUERY_SIZE, + result.aggs.groupByFields?.multi_terms?.terms.forEach((term, i) => { + expect(term).toEqual({ + field: 'host.name', + missing: i === 0 ? '-' : '--', + }); }); expect(result.aggs.groupByFields.aggs).toEqual({ bucket_truncate: { bucket_sort: { from: 0, size: 25 } }, @@ -79,7 +82,7 @@ describe('group selector', () => { expect(result.aggs.groupsNumber).toBeUndefined(); expect(result.query.bool.filter.length).toEqual(1); }); - it('Sets terms query when single stackBy field requested additionalAggregationsRoot', () => { + it('Sets additional rootAggregations', () => { const result = getGroupingQuery({ ...testProps, rootAggregations: [ @@ -105,17 +108,6 @@ describe('group selector', () => { }); expect(result.aggs.groupsNumber).toEqual({ cardinality: { field: 'host.name' } }); }); - it('Sets terms query when multiple stackBy fields requested', () => { - const result = getGroupingQuery({ - ...testProps, - groupByFields: ['kibana.alert.rule.name', 'kibana.alert.rule.description'], - }); - expect(result.aggs.groupByFields.terms).toBeUndefined(); - expect(result.aggs.groupByFields.multi_terms).toEqual({ - terms: [{ field: 'kibana.alert.rule.name' }, { field: 'kibana.alert.rule.description' }], - size: MAX_QUERY_SIZE, - }); - }); it('Additional filters get added to the query', () => { const result = getGroupingQuery({ ...testProps, @@ -144,4 +136,61 @@ describe('group selector', () => { }); expect(result.query.bool.filter.length).toEqual(2); }); + it('Uses 0/1 for number fields', () => { + const result = getGroupingQuery({ ...testProps, selectedGroupEsTypes: ['long'] }); + result.aggs.groupByFields?.multi_terms?.terms.forEach((term, i) => { + expect(term).toEqual({ + field: 'host.name', + missing: i === 0 ? 0 : 1, + }); + }); + }); + it('Uses 0.0.0.0/:: for ip fields', () => { + const result = getGroupingQuery({ ...testProps, selectedGroupEsTypes: ['ip'] }); + result.aggs.groupByFields?.multi_terms?.terms.forEach((term, i) => { + expect(term).toEqual({ + field: 'host.name', + missing: i === 0 ? '0.0.0.0' : '::', + }); + }); + }); + + it('parseGroupingQuery finds and flags the null group', () => { + const data = [ + { + key: ['20.80.64.28', '20.80.64.28'], + key_as_string: '20.80.64.28|20.80.64.28', + doc_count: 75, + }, + { + key: ['0.0.0.0', '0.0.0.0'], + key_as_string: '0.0.0.0|0.0.0.0', + doc_count: 75, + }, + { + key: ['0.0.0.0', '::'], + key_as_string: '0.0.0.0|::', + doc_count: 75, + }, + ]; + const result = parseGroupingQuery(data); + expect(result).toEqual([ + { + key: ['20.80.64.28'], + key_as_string: '20.80.64.28', + doc_count: 75, + }, + { + key: ['0.0.0.0'], + key_as_string: '0.0.0.0', + doc_count: 75, + }, + { + key: [getEmptyValue()], + key_as_string: getEmptyValue(), + isNullGroup: true, + doc_count: 75, + }, + ]); + }); }); diff --git a/packages/kbn-securitysolution-grouping/src/containers/query/index.ts b/packages/kbn-securitysolution-grouping/src/containers/query/index.ts index 23699c1ccf94a..e4440bc50e249 100644 --- a/packages/kbn-securitysolution-grouping/src/containers/query/index.ts +++ b/packages/kbn-securitysolution-grouping/src/containers/query/index.ts @@ -6,6 +6,9 @@ * Side Public License, v 1. */ +import { getEmptyValue, getFieldTypeMissingValues } from './helpers'; +import { GroupingBucket } from '../..'; +import { RawBucket } from '../../..'; import type { GroupingQueryArgs, GroupingQuery } from './types'; /** The maximum number of groups to render */ export const DEFAULT_GROUP_BY_FIELD_SIZE = 10; @@ -24,6 +27,7 @@ export const MAX_QUERY_SIZE = 10000; * @param rootAggregations Top level aggregations to get the groups number or overall groups metrics. * Array of {@link NamedAggregation} * @param runtimeMappings mappings of runtime fields [see runtimeMappings]{@link GroupingQueryArgs.runtimeMappings} + * @param selectedGroupEsTypes array of selected group types * @param size number of grouping results per page * @param sort add one or more sorts on specific fields * @param statsAggregations group level aggregations which correspond to {@link GroupStatsRenderer} configuration @@ -31,14 +35,16 @@ export const MAX_QUERY_SIZE = 10000; * * @returns query dsl {@link GroupingQuery} */ + export const getGroupingQuery = ({ additionalFilters = [], from, - groupByFields, + groupByField, + pageNumber, rootAggregations, runtimeMappings, + selectedGroupEsTypes, size = DEFAULT_GROUP_BY_FIELD_SIZE, - pageNumber, sort, statsAggregations, to, @@ -46,21 +52,25 @@ export const getGroupingQuery = ({ size: 0, aggs: { groupByFields: { - ...(groupByFields.length > 1 - ? { - multi_terms: { - terms: groupByFields.map((groupByField) => ({ - field: groupByField, - })), - size: MAX_QUERY_SIZE, - }, - } - : { - terms: { - field: groupByFields[0], - size: MAX_QUERY_SIZE, - }, - }), + multi_terms: { + terms: [ + // by looking up multiple missing values, we can ensure we're not overwriting an existing group with the default value + { + field: groupByField, + // the AggregationsMultiTermLookup type is wrong in the elasticsearch node package + // when this issues is resolved, we can remove these ts expect errors + // https://github.com/elastic/elasticsearch/issues/95628 + // @ts-expect-error + missing: getFieldTypeMissingValues(selectedGroupEsTypes)[0], + }, + { + field: groupByField, + // @ts-expect-error + missing: getFieldTypeMissingValues(selectedGroupEsTypes)[1], + }, + ], + size: MAX_QUERY_SIZE, + }, aggs: { bucket_truncate: { bucket_sort: { @@ -96,3 +106,32 @@ export const getGroupingQuery = ({ runtime_mappings: runtimeMappings, _source: false, }); + +/** + * Parses the grouping query response to add the isNullGroup + * flag to the buckets and to format the bucket keys + * @param buckets buckets returned from the grouping query + */ +export const parseGroupingQuery = ( + buckets: Array> +): Array & GroupingBucket> => + buckets.map((group) => { + if (!Array.isArray(group.key)) { + return group; + } + const emptyValue = getEmptyValue(); + // If the keys are different means that the `missing` values of the multi_terms aggregation have been applied, we use the default empty string. + // If the keys are equal means the `missing` values have not been applied, they are stored values. + return group.key[0] === group.key[1] + ? { + ...group, + key: [group.key[0]], + key_as_string: group.key[0], + } + : { + ...group, + key: [emptyValue], + key_as_string: emptyValue, + isNullGroup: true, + }; + }); diff --git a/packages/kbn-securitysolution-grouping/src/containers/query/types.ts b/packages/kbn-securitysolution-grouping/src/containers/query/types.ts index 5a8b2f822fb5c..4a370094d0d5c 100644 --- a/packages/kbn-securitysolution-grouping/src/containers/query/types.ts +++ b/packages/kbn-securitysolution-grouping/src/containers/query/types.ts @@ -23,11 +23,12 @@ export type NamedAggregation = Record; statsAggregations?: NamedAggregation[]; @@ -37,8 +38,7 @@ export interface GroupingQueryArgs { export interface MainAggregation extends NamedAggregation { groupByFields: { aggs: NamedAggregation; - multi_terms?: estypes.AggregationsAggregationContainer['multi_terms']; - terms?: estypes.AggregationsAggregationContainer['terms']; + multi_terms: estypes.AggregationsAggregationContainer['multi_terms']; }; } diff --git a/packages/kbn-securitysolution-grouping/tsconfig.json b/packages/kbn-securitysolution-grouping/tsconfig.json index 621ba68957cf1..efecb457f96de 100644 --- a/packages/kbn-securitysolution-grouping/tsconfig.json +++ b/packages/kbn-securitysolution-grouping/tsconfig.json @@ -25,6 +25,7 @@ "@kbn/kibana-react-plugin", "@kbn/shared-svg", "@kbn/ui-theme", - "@kbn/analytics" + "@kbn/analytics", + "@kbn/field-types" ] } diff --git a/packages/shared-ux/chrome/navigation/README.mdx b/packages/shared-ux/chrome/navigation/README.mdx new file mode 100644 index 0000000000000..c2e04ebbeb98f --- /dev/null +++ b/packages/shared-ux/chrome/navigation/README.mdx @@ -0,0 +1,26 @@ +--- +id: sharedUX/Chrome/Navigation +slug: /shared-ux/chrome/navigation +title: Kibana Chrome Navigation +description: Navigation container to render items for cross-app linking +tags: ['shared-ux', 'component', 'chrome', 'navigation'] +date: 2023-02-28 +--- + +## Description + +Empty package generated by @kbn/generate +@kbn/shared-ux-chrome-navigation +Navigation container to render items for cross-app linking + +## API + +| Export | Description | +|---|---| +| `NavigationProvider` | Provides contextual services to `Navigation`. | +| `NavigationKibanaProvider` | Maps Kibana dependencies to provide contextual services to `Navigation`. | +| `Navigation` | Uses a `Provider` to access contextual services and render the component. | + +## EUI Promotion Status + +This component is not currently considered for promotion to EUI. diff --git a/packages/shared-ux/chrome/navigation/index.ts b/packages/shared-ux/chrome/navigation/index.ts new file mode 100644 index 0000000000000..f6070a30a5836 --- /dev/null +++ b/packages/shared-ux/chrome/navigation/index.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export { NavigationKibanaProvider, NavigationProvider } from './src/services'; +export { Navigation } from './src/ui/navigation'; +export type { NavigationProps, NavigationServices, NavItemProps } from './types'; diff --git a/packages/shared-ux/chrome/navigation/jest.config.js b/packages/shared-ux/chrome/navigation/jest.config.js new file mode 100644 index 0000000000000..808dc82a089c2 --- /dev/null +++ b/packages/shared-ux/chrome/navigation/jest.config.js @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +module.exports = { + preset: '@kbn/test', + rootDir: '../../../..', + roots: ['/packages/shared-ux/chrome/navigation'], +}; diff --git a/packages/shared-ux/chrome/navigation/kibana.jsonc b/packages/shared-ux/chrome/navigation/kibana.jsonc new file mode 100644 index 0000000000000..74cd1ccea3252 --- /dev/null +++ b/packages/shared-ux/chrome/navigation/kibana.jsonc @@ -0,0 +1,5 @@ +{ + "type": "shared-common", + "id": "@kbn/shared-ux-chrome-navigation", + "owner": "@elastic/appex-sharedux" +} diff --git a/packages/shared-ux/chrome/navigation/mocks/index.ts b/packages/shared-ux/chrome/navigation/mocks/index.ts new file mode 100644 index 0000000000000..a72e07ce52132 --- /dev/null +++ b/packages/shared-ux/chrome/navigation/mocks/index.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { + getServicesMock as getNavigationServicesMock, + getSolutionPropertiesMock, +} from './src/jest'; +export { StorybookMock as NavigationStorybookMock } from './src/storybook'; +export type { Params as NavigationStorybookParams } from './src/storybook'; diff --git a/packages/shared-ux/chrome/navigation/mocks/src/jest.ts b/packages/shared-ux/chrome/navigation/mocks/src/jest.ts new file mode 100644 index 0000000000000..166dc73b6290c --- /dev/null +++ b/packages/shared-ux/chrome/navigation/mocks/src/jest.ts @@ -0,0 +1,72 @@ +/* + * Copyright 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 { NavigationServices, SolutionProperties } from '../../types'; + +export const getServicesMock = (): NavigationServices => { + const navigateToUrl = jest.fn().mockResolvedValue(undefined); + const basePath = { prepend: jest.fn((path: string) => `/base${path}`) }; + const loadingCount = 0; + + return { + basePath, + loadingCount, + navIsOpen: true, + navigateToUrl, + }; +}; + +export const getSolutionPropertiesMock = (): SolutionProperties => ({ + id: 'example_project', + icon: 'logoObservability', + name: 'Example project', + items: [ + { + id: 'root', + name: '', + items: [ + { + id: 'get_started', + name: 'Get started', + href: '/app/example_project/get_started', + }, + { + id: 'alerts', + name: 'Alerts', + href: '/app/example_project/alerts', + }, + { + id: 'cases', + name: 'Cases', + href: '/app/example_project/cases', + }, + ], + }, + { + id: 'example_settings', + name: 'Settings', + items: [ + { + id: 'logs', + name: 'Logs', + href: '/app/management/logs', + }, + { + id: 'signals', + name: 'Signals', + href: '/app/management/signals', + }, + { + id: 'tracing', + name: 'Tracing', + href: '/app/management/tracing', + }, + ], + }, + ], +}); diff --git a/packages/shared-ux/chrome/navigation/mocks/src/storybook.ts b/packages/shared-ux/chrome/navigation/mocks/src/storybook.ts new file mode 100644 index 0000000000000..27e27393dc5bb --- /dev/null +++ b/packages/shared-ux/chrome/navigation/mocks/src/storybook.ts @@ -0,0 +1,59 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { AbstractStorybookMock } from '@kbn/shared-ux-storybook-mock'; +import { action } from '@storybook/addon-actions'; +import { NavigationProps, NavigationServices } from '../../types'; + +type Arguments = NavigationProps & NavigationServices; +export type Params = Pick< + Arguments, + 'activeNavItemId' | 'loadingCount' | 'navIsOpen' | 'platformConfig' | 'solutions' +>; + +export class StorybookMock extends AbstractStorybookMock { + propArguments = {}; + + serviceArguments = { + navIsOpen: { + 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); + return Promise.resolve(); + }; + + return { + ...params, + basePath: { prepend: (suffix: string) => `/basepath${suffix}` }, + navigateToUrl, + navIsOpen, + }; + } + + getProps(params: Params): NavigationProps { + return { + ...params, + homeHref: '#', + linkToCloud: 'projects', + }; + } +} diff --git a/packages/shared-ux/chrome/navigation/package.json b/packages/shared-ux/chrome/navigation/package.json new file mode 100644 index 0000000000000..312c11c6f7c1e --- /dev/null +++ b/packages/shared-ux/chrome/navigation/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/shared-ux-chrome-navigation", + "private": true, + "version": "1.0.0", + "license": "SSPL-1.0 OR Elastic License 2.0" +} \ No newline at end of file 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 new file mode 100644 index 0000000000000..aac2fdf346ffc --- /dev/null +++ b/packages/shared-ux/chrome/navigation/src/model/create_side_nav.ts @@ -0,0 +1,77 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { EuiSideNavItemType } from '@elastic/eui'; +import type { NavigationModelDeps } from '.'; +import type { NavItemProps, PlatformSectionConfig } from '../../types'; + +type MyEuiSideNavItem = EuiSideNavItemType; +type OnClickFn = MyEuiSideNavItem['onClick']; + +/** + * Factory function to return a function that processes modeled nav items into EuiSideNavItemType + * The factory puts memoized function arguments in scope for iterations of the recursive item processing. + */ +export const createSideNavDataFactory = ( + deps: NavigationModelDeps, + activeNavItemId: string | undefined +) => { + const { basePath, navigateToUrl } = deps; + const createSideNavData = ( + parentIds: string | number = '', + navItems: NavItemProps[], + platformSectionConfig?: PlatformSectionConfig + ): Array> => + navItems.reduce((accum, item) => { + const { id, name, items: subNav, href } = item; + const config = platformSectionConfig?.properties?.[id]; + if (config?.enabled === false) { + // return accumulated set without the item that is not enabled + return accum; + } + + let onClick: OnClickFn | undefined; + + const fullId = [parentIds, id].filter(Boolean).join('.'); + + if (href) { + onClick = (event: React.MouseEvent) => { + event.preventDefault(); + navigateToUrl(basePath.prepend(href)); + }; + } + + let filteredSubNav: MyEuiSideNavItem[] | undefined; + if (subNav) { + // recursion + const nextConfig = platformSectionConfig?.properties?.[id]; + filteredSubNav = createSideNavData(fullId, subNav, nextConfig); + } + + let isSelected: boolean = false; + let subjId = fullId; + if (!subNav && fullId === activeNavItemId) { + // if there are no subnav items and ID is current, mark the item as selected + isSelected = true; + subjId += '-selected'; + } + + const next: MyEuiSideNavItem = { + id: fullId, + name, + isSelected, + onClick, + href, + items: filteredSubNav, + ['data-test-subj']: `nav-item-${subjId}`, + }; + return [...accum, next]; + }, []); + + return createSideNavData; +}; diff --git a/packages/shared-ux/chrome/navigation/src/model/index.ts b/packages/shared-ux/chrome/navigation/src/model/index.ts new file mode 100644 index 0000000000000..8e8d94e995019 --- /dev/null +++ b/packages/shared-ux/chrome/navigation/src/model/index.ts @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { BasePathService, NavigateToUrlFn } from '../../types/internal'; +import { analyticsItemSet } from './platform_nav/analytics'; +import { devtoolsItemSet } from './platform_nav/devtools'; +import { mlItemSet } from './platform_nav/machine_learning'; +import { managementItemSet } from './platform_nav/management'; + +export interface NavigationModelDeps { + basePath: BasePathService; + navigateToUrl: NavigateToUrlFn; +} + +/** + * @public + */ +export enum Platform { + Recents = 'recents', + Analytics = 'analytics', + MachineLearning = 'ml', + DevTools = 'devTools', + Management = 'management', +} + +/** + * @public + */ +export const navItemSet = { + [Platform.Analytics]: analyticsItemSet, + [Platform.MachineLearning]: mlItemSet, + [Platform.DevTools]: devtoolsItemSet, + [Platform.Management]: managementItemSet, +}; + +export { NavigationModel } from './model'; diff --git a/packages/shared-ux/chrome/navigation/src/model/model.ts b/packages/shared-ux/chrome/navigation/src/model/model.ts new file mode 100644 index 0000000000000..0d3e3266be780 --- /dev/null +++ b/packages/shared-ux/chrome/navigation/src/model/model.ts @@ -0,0 +1,107 @@ +/* + * Copyright 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 { EuiSideNavItemType } from '@elastic/eui'; +import type { NavigationModelDeps } from '.'; +import { navItemSet, Platform } from '.'; +import type { + NavigationBucketProps, + NavigationProps, + NavItemProps, + PlatformId, + PlatformSectionConfig, + SolutionProperties, +} from '../../types'; +import { createSideNavDataFactory } from './create_side_nav'; + +/** + * @internal + */ +export class NavigationModel { + private createSideNavData: ( + parentIds: string | number | undefined, + navItems: Array>, + config?: PlatformSectionConfig | undefined + ) => Array>; + + constructor( + deps: NavigationModelDeps, + private platformConfig: NavigationProps['platformConfig'] | undefined, + private solutions: SolutionProperties[], + activeNavItemId: string | undefined + ) { + this.createSideNavData = createSideNavDataFactory(deps, activeNavItemId); + } + + private convertToSideNavItems( + id: string, + items: NavItemProps[] | undefined, + platformConfig?: PlatformSectionConfig + ) { + return items ? this.createSideNavData(id, items, platformConfig) : undefined; + } + + public getPlatform(): Record { + return { + [Platform.Analytics]: { + id: Platform.Analytics, + icon: 'stats', + name: 'Data exploration', + items: this.convertToSideNavItems( + Platform.Analytics, + navItemSet[Platform.Analytics], + this.platformConfig?.[Platform.Analytics] + ), + }, + [Platform.MachineLearning]: { + id: Platform.MachineLearning, + icon: 'indexMapping', + name: 'Machine learning', + items: this.convertToSideNavItems( + Platform.MachineLearning, + navItemSet[Platform.MachineLearning], + this.platformConfig?.[Platform.MachineLearning] + ), + }, + [Platform.DevTools]: { + id: Platform.DevTools, + icon: 'editorCodeBlock', + name: 'Developer tools', + items: this.convertToSideNavItems( + Platform.DevTools, + navItemSet[Platform.DevTools], + this.platformConfig?.[Platform.DevTools] + ), + }, + [Platform.Management]: { + id: Platform.Management, + icon: 'gear', + name: 'Management', + items: this.convertToSideNavItems( + Platform.Management, + navItemSet[Platform.Management], + this.platformConfig?.[Platform.Management] + ), + }, + }; + } + + public getSolutions(): NavigationBucketProps[] { + // Allow multiple solutions' collapsible nav buckets side-by-side + return this.solutions.map((s) => ({ + id: s.id, + name: s.name, + icon: s.icon, + items: this.convertToSideNavItems(s.id, s.items), + })); + } + + public isEnabled(sectionId: PlatformId) { + return this.platformConfig?.[sectionId]?.enabled !== false; + } +} diff --git a/packages/shared-ux/chrome/navigation/src/model/platform_nav/analytics.ts b/packages/shared-ux/chrome/navigation/src/model/platform_nav/analytics.ts new file mode 100644 index 0000000000000..4e52e8c161bbd --- /dev/null +++ b/packages/shared-ux/chrome/navigation/src/model/platform_nav/analytics.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 { NavItemProps } from '../../../types'; + +export const analyticsItemSet: NavItemProps[] = [ + { + name: '', + id: 'root', + items: [ + { + name: 'Discover', + id: 'discover', + href: '/app/discover', + }, + { + name: 'Dashboard', + id: 'dashboard', + href: '/app/dashboards', + }, + { + name: 'Visualize Library', + id: 'visualize_library', + href: '/app/visualize', + }, + ], + }, +]; diff --git a/packages/shared-ux/chrome/navigation/src/model/platform_nav/devtools.ts b/packages/shared-ux/chrome/navigation/src/model/platform_nav/devtools.ts new file mode 100644 index 0000000000000..049a537c96cc6 --- /dev/null +++ b/packages/shared-ux/chrome/navigation/src/model/platform_nav/devtools.ts @@ -0,0 +1,38 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { NavItemProps } from '../../../types'; + +export const devtoolsItemSet: NavItemProps[] = [ + { + name: '', + id: 'root', + items: [ + { + name: 'Console', + id: 'console', + href: '/app/dev_tools#/console', + }, + { + name: 'Search profiler', + id: 'search_profiler', + href: '/app/dev_tools#/searchprofiler', + }, + { + name: 'Grok debugger', + id: 'grok_debugger', + href: '/app/dev_tools#/grokdebugger', + }, + { + name: 'Painless lab', + id: 'painless_lab', + href: '/app/dev_tools#/painless_lab', + }, + ], + }, +]; diff --git a/packages/shared-ux/chrome/navigation/src/model/platform_nav/machine_learning.ts b/packages/shared-ux/chrome/navigation/src/model/platform_nav/machine_learning.ts new file mode 100644 index 0000000000000..692bb704dca17 --- /dev/null +++ b/packages/shared-ux/chrome/navigation/src/model/platform_nav/machine_learning.ts @@ -0,0 +1,123 @@ +/* + * Copyright 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 { NavItemProps } from '../../../types'; + +export const mlItemSet: NavItemProps[] = [ + { + name: '', + id: 'root', + items: [ + { + name: 'Overview', + id: 'overview', + href: '/app/ml/overview', + }, + { + name: 'Notifications', + id: 'notifications', + href: '/app/ml/notifications', + }, + ], + }, + { + name: 'Anomaly detection', + id: 'anomaly_detection', + items: [ + { + name: 'Jobs', + id: 'jobs', + href: '/app/ml/jobs', + }, + { + name: 'Anomaly explorer', + id: 'explorer', + href: '/app/ml/explorer', + }, + { + name: 'Single metric viewer', + id: 'single_metric_viewer', + href: '/app/ml/timeseriesexplorer', + }, + { + name: 'Settings', + id: 'settings', + href: '/app/ml/settings', + }, + ], + }, + { + name: 'Data frame analytics', + id: 'data_frame_analytics', + items: [ + { + name: 'Jobs', + id: 'jobs', + href: '/app/ml/data_frame_analytics', + }, + { + name: 'Results explorer', + id: 'results_explorer', + href: '/app/ml/data_frame_analytics/exploration', + }, + { + name: 'Analytics map', + id: 'analytics_map', + href: '/app/ml/data_frame_analytics/map', + }, + ], + }, + { + name: 'Model management', + id: 'model_management', + items: [ + { + name: 'Trained models', + id: 'trained_models', + href: '/app/ml/trained_models', + }, + { + name: 'Nodes', + id: 'nodes', + href: '/app/ml/nodes', + }, + ], + }, + { + name: 'Data visualizer', + id: 'data_visualizer', + items: [ + { + name: 'File', + id: 'file', + href: '/app/ml/filedatavisualizer', + }, + { + name: 'Data view', + id: 'data_view', + href: '/app/ml/datavisualizer_index_select', + }, + ], + }, + { + name: 'AIOps labs', + id: 'aiops_labs', + items: [ + { + name: 'Explain log rate spikes', + id: 'explain_log_rate_spikes', + href: '/app/ml/aiops/explain_log_rate_spikes_index_select', + }, + { + name: 'Log pattern analysis', + id: 'log_pattern_analysis', + href: '/app/ml/aiops/log_categorization_index_select', + }, + ], + }, +]; diff --git a/packages/shared-ux/chrome/navigation/src/model/platform_nav/management.ts b/packages/shared-ux/chrome/navigation/src/model/platform_nav/management.ts new file mode 100644 index 0000000000000..c1b09258d1c3b --- /dev/null +++ b/packages/shared-ux/chrome/navigation/src/model/platform_nav/management.ts @@ -0,0 +1,210 @@ +/* + * Copyright 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 { NavItemProps } from '../../../types'; + +export const managementItemSet: NavItemProps[] = [ + { + name: '', + id: 'root', + items: [ + { + name: 'Stack monitoring', + id: 'stack_monitoring', + href: '/app/monitoring', + }, + ], + }, + { + name: 'Integration management', + id: 'integration_management', + items: [ + { + name: 'Integrations', + id: 'integrations', + href: '/app/integrations', + }, + { + name: 'Fleet', + id: 'fleet', + href: '/app/fleet', + }, + { + name: 'Osquery', + id: 'osquery', + href: '/app/osquery', + }, + ], + }, + { + name: 'Stack management', + id: 'stack_management', + items: [ + { + name: 'Ingest', + id: 'ingest', + items: [ + { + name: 'Ingest pipelines', + id: 'ingest_pipelines', + href: '/app/management/ingest/ingest_pipelines', + }, + { + name: 'Logstash pipelines', + id: 'logstash_pipelines', + href: '/app/management/ingest/pipelines', + }, + ], + }, + { + name: 'Data', + id: 'data', + items: [ + { + name: 'Index management', + id: 'index_management', + href: '/app/management/data/index_management', + }, + { + name: 'Index lifecycle policies', + id: 'index_lifecycle_policies', + href: '/app/management/data/index_lifecycle_management', + }, + { + name: 'Snapshot and restore', + id: 'snapshot_and_restore', + href: 'app/management/data/snapshot_restore', + }, + { + name: 'Rollup jobs', + id: 'rollup_jobs', + href: '/app/management/data/rollup_jobs', + }, + { + name: 'Transforms', + id: 'transforms', + href: '/app/management/data/transform', + }, + { + name: 'Cross-cluster replication', + id: 'cross_cluster_replication', + href: '/app/management/data/cross_cluster_replication', + }, + { + name: 'Remote clusters', + id: 'remote_clusters', + href: '/app/management/data/remote_clusters', + }, + ], + }, + { + name: 'Alerts and insights', + id: 'alerts_and_insights', + items: [ + { + name: 'Rules', + id: 'rules', + href: '/app/management/insightsAndAlerting/triggersActions/rules', + }, + { + name: 'Cases', + id: 'cases', + href: '/app/management/insightsAndAlerting/cases', + }, + { + name: 'Connectors', + id: 'connectors', + href: '/app/management/insightsAndAlerting/triggersActionsConnectors/connectors', + }, + { + name: 'Reporting', + id: 'reporting', + href: '/app/management/insightsAndAlerting/reporting', + }, + { + name: 'Machine learning', + id: 'machine_learning', + href: '/app/management/insightsAndAlerting/jobsListLink', + }, + { + name: 'Watcher', + id: 'watcher', + href: '/app/management/insightsAndAlerting/watcher', + }, + ], + }, + { + name: 'Security', + id: 'security', + items: [ + { + name: 'Users', + id: 'users', + href: '/app/management/security/users', + }, + { + name: 'Roles', + id: 'roles', + href: '/app/management/security/roles', + }, + { + name: 'Role mappings', + id: 'role_mappings', + href: '/app/management/security/role_mappings', + }, + { + name: 'API keys', + id: 'api_keys', + href: '/app/management/security/api_keys', + }, + ], + }, + { + name: 'Kibana', + id: 'kibana', + items: [ + { + name: 'Data view', + id: 'data_views', + href: '/app/management/kibana/dataViews', + }, + { + name: 'Saved objects', + id: 'saved_objects', + href: '/app/management/kibana/objects', + }, + { + name: 'Tags', + id: 'tags', + href: '/app/management/kibana/tags', + }, + { + name: 'Search sessions', + id: 'search_sessions', + href: '/app/management/kibana/search_sessions', + }, + { + name: 'Spaces', + id: 'spaces', + href: '/app/management/kibana/spaces', + }, + { + name: 'Advanced settings', + id: 'advanced_settings', + href: '/app/management/kibana/settings', + }, + ], + }, + { + name: 'Upgrade assistant', + id: 'upgrade_assistant', + href: '/app/management/stack/upgrade_assistant', + }, + ], + }, +]; diff --git a/packages/shared-ux/chrome/navigation/src/services.tsx b/packages/shared-ux/chrome/navigation/src/services.tsx new file mode 100644 index 0000000000000..8235963c18681 --- /dev/null +++ b/packages/shared-ux/chrome/navigation/src/services.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 React, { FC, useContext } from 'react'; +import useObservable from 'react-use/lib/useObservable'; +import { NavigationKibanaDependencies, NavigationServices } from '../types'; + +const Context = React.createContext(null); + +/** + * A Context Provider that provides services to the component and its dependencies. + */ +export const NavigationProvider: FC = ({ children, ...services }) => { + return {children}; +}; + +/** + * Kibana-specific Provider that maps dependencies to services. + */ +export const NavigationKibanaProvider: FC = ({ + children, + ...dependencies +}) => { + const { core } = dependencies; + const { http } = core; + const { basePath } = http; + const { navigateToUrl } = core.application; + + const loadingCount = useObservable(http.getLoadingCount$(), 0); + + const value: NavigationServices = { + basePath, + loadingCount, + navigateToUrl, + navIsOpen: true, + }; + + return ( + + {children} + + ); +}; + +/** + * React hook for accessing pre-wired services. + */ +export function useNavigation() { + const context = useContext(Context); + + if (!context) { + throw new Error( + 'Navigation Context is missing. Ensure your component or React root is wrapped with NavigationContext.' + ); + } + + return context; +} diff --git a/packages/shared-ux/chrome/navigation/src/styles.ts b/packages/shared-ux/chrome/navigation/src/styles.ts new file mode 100644 index 0000000000000..72db66e12f7bf --- /dev/null +++ b/packages/shared-ux/chrome/navigation/src/styles.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 { css } from '@emotion/react'; + +export const navigationStyles = { + euiSideNavItems: css` + padding-left: 45px; + `, +}; diff --git a/packages/shared-ux/chrome/navigation/src/ui/elastic_mark.tsx b/packages/shared-ux/chrome/navigation/src/ui/elastic_mark.tsx new file mode 100644 index 0000000000000..b538eb5d1756c --- /dev/null +++ b/packages/shared-ux/chrome/navigation/src/ui/elastic_mark.tsx @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React, { HTMLAttributes } from 'react'; + +export const ElasticMark = ({ ...props }: HTMLAttributes) => ( + + Elastic + + +); diff --git a/packages/shared-ux/chrome/navigation/src/ui/header_logo.scss b/packages/shared-ux/chrome/navigation/src/ui/header_logo.scss new file mode 100644 index 0000000000000..f75fd9cfa2466 --- /dev/null +++ b/packages/shared-ux/chrome/navigation/src/ui/header_logo.scss @@ -0,0 +1,4 @@ +.chrHeaderLogo__mark { + margin-left: $euiSizeS; + fill: $euiColorGhost; +} diff --git a/packages/shared-ux/chrome/navigation/src/ui/i18n_strings.ts b/packages/shared-ux/chrome/navigation/src/ui/i18n_strings.ts new file mode 100644 index 0000000000000..9f6f3fbadca30 --- /dev/null +++ b/packages/shared-ux/chrome/navigation/src/ui/i18n_strings.ts @@ -0,0 +1,30 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { i18n } from '@kbn/i18n'; + +export const getI18nStrings = () => ({ + headerLogoAriaLabel: i18n.translate( + 'sharedUXPackages.chrome.sideNavigation.headerLogo.ariaLabel', + { + defaultMessage: 'Go to home page', + } + ), + linkToCloudProjects: i18n.translate( + 'sharedUXPackages.chrome.sideNavigation.linkToCloud.projects', + { + defaultMessage: 'My projects', + } + ), + linkToCloudDeployments: i18n.translate( + 'sharedUXPackages.chrome.sideNavigation.linkToCloud.deployments', + { + defaultMessage: 'My deployments', + } + ), +}); diff --git a/packages/shared-ux/chrome/navigation/src/ui/navigation.stories.tsx b/packages/shared-ux/chrome/navigation/src/ui/navigation.stories.tsx new file mode 100644 index 0000000000000..20c0c2201acfb --- /dev/null +++ b/packages/shared-ux/chrome/navigation/src/ui/navigation.stories.tsx @@ -0,0 +1,167 @@ +/* + * Copyright 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 { + EuiButtonEmpty, + EuiButtonIcon, + EuiCollapsibleNav, + EuiPopover, + EuiThemeProvider, +} from '@elastic/eui'; +import { ComponentMeta, ComponentStory } from '@storybook/react'; +import React, { useCallback, useState } from 'react'; +import { css } from '@emotion/react'; +import { getSolutionPropertiesMock, NavigationStorybookMock } from '../../mocks'; +import mdx from '../../README.mdx'; +import { NavigationProps, NavigationServices } from '../../types'; +import { Platform } from '../model'; +import { NavigationProvider } from '../services'; +import { Navigation as Component } from './navigation'; + +const storybookMock = new NavigationStorybookMock(); + +const SIZE_OPEN = 248; +const SIZE_CLOSED = 40; + +const Template = (args: NavigationProps & NavigationServices) => { + const services = storybookMock.getServices(args); + const props = storybookMock.getProps(args); + + const [isOpen, setIsOpen] = useState(true); + + const toggleOpen = useCallback(() => { + setIsOpen(!isOpen); + }, [isOpen, setIsOpen]); + + const collabsibleNavCSS = css` + border-inline-end-width: 1, + display: flex, + flex-direction: row, + `; + + const CollapseButton = () => { + const buttonCSS = css` + margin-left: -32px; + position: fixed; + z-index: 1000; + `; + return ( + + + + ); + }; + + return ( + + } + > + {isOpen && ( + + + + )} + + + ); +}; + +export default { + title: 'Chrome/Navigation', + description: 'Navigation container to render items for cross-app linking', + parameters: { + docs: { + page: mdx, + }, + }, + component: Template, +} as ComponentMeta; + +export const SingleExpanded: ComponentStory = Template.bind({}); +SingleExpanded.args = { + activeNavItemId: 'example_project.root.get_started', + solutions: [getSolutionPropertiesMock()], +}; +SingleExpanded.argTypes = storybookMock.getArgumentTypes(); + +export const ReducedPlatformLinks: ComponentStory = Template.bind({}); +ReducedPlatformLinks.args = { + activeNavItemId: 'example_project.root.get_started', + platformConfig: { + [Platform.Analytics]: { enabled: false }, + [Platform.MachineLearning]: { enabled: false }, + [Platform.DevTools]: { enabled: false }, + [Platform.Management]: { + properties: { + root: { + enabled: false, // disables the un-named section that contains only "Stack Monitoring" + }, + integration_management: { + properties: { + integrations: { enabled: false }, // enable only osquery + fleet: { enabled: false }, // enable only osquery + }, + }, + stack_management: { + enabled: false, // disables the stack management section + }, + }, + }, + }, + solutions: [getSolutionPropertiesMock()], +}; +ReducedPlatformLinks.argTypes = storybookMock.getArgumentTypes(); + +export const WithRequestsLoading: ComponentStory = Template.bind({}); +WithRequestsLoading.args = { + activeNavItemId: 'example_project.root.get_started', + loadingCount: 1, + solutions: [getSolutionPropertiesMock()], +}; +WithRequestsLoading.argTypes = storybookMock.getArgumentTypes(); + +export const CustomElements: ComponentStory = Template.bind({}); +CustomElements.args = { + activeNavItemId: 'example_project.custom', + solutions: [ + { + ...getSolutionPropertiesMock(), + items: [ + { + name: ( + + Custom element + + } + isOpen={true} + anchorPosition="rightCenter" + > + Cool popover content + + ), + id: 'custom', + }, + ], + }, + ], +}; +CustomElements.argTypes = storybookMock.getArgumentTypes(); diff --git a/packages/shared-ux/chrome/navigation/src/ui/navigation.test.tsx b/packages/shared-ux/chrome/navigation/src/ui/navigation.test.tsx new file mode 100644 index 0000000000000..075925f05de6a --- /dev/null +++ b/packages/shared-ux/chrome/navigation/src/ui/navigation.test.tsx @@ -0,0 +1,127 @@ +/* + * Copyright 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 { render } from '@testing-library/react'; +import React from 'react'; +import { getServicesMock } from '../../mocks/src/jest'; +import { PlatformConfigSet, SolutionProperties } from '../../types'; +import { Platform } from '../model'; +import { NavigationProvider } from '../services'; +import { Navigation } from './navigation'; + +describe('', () => { + const services = getServicesMock(); + + const homeHref = '#'; + let platformSections: PlatformConfigSet | undefined; + let solutions: SolutionProperties[]; + + beforeEach(() => { + platformSections = { analytics: {}, ml: {}, devTools: {}, management: {} }; + solutions = [{ id: 'navigation_testing', name: 'Navigation testing', icon: 'gear' }]; + }); + + test('renders the header logo and top-level navigation buckets', async () => { + const { findByTestId, findByText } = render( + + + + ); + + expect(await findByText('Navigation testing')).toBeVisible(); + + expect(await findByTestId('nav-header-logo')).toBeVisible(); + expect(await findByTestId('nav-bucket-navigation_testing')).toBeVisible(); + expect(await findByTestId('nav-bucket-analytics')).toBeVisible(); + expect(await findByTestId('nav-bucket-ml')).toBeVisible(); + expect(await findByTestId('nav-bucket-devTools')).toBeVisible(); + expect(await findByTestId('nav-bucket-management')).toBeVisible(); + }); + + test('includes link to deployments', async () => { + const { findByText } = render( + + + + ); + + expect(await findByText('My deployments')).toBeVisible(); + }); + + test('platform links can be disabled', async () => { + platformSections = { + [Platform.Analytics]: { enabled: false }, + [Platform.MachineLearning]: { enabled: false }, + [Platform.DevTools]: { enabled: false }, + [Platform.Management]: { enabled: false }, + }; + + const { findByTestId, queryByTestId } = render( + + + + ); + + expect(await findByTestId('nav-header-logo')).toBeVisible(); + expect(queryByTestId('nav-bucket-analytics')).not.toBeInTheDocument(); + expect(queryByTestId('nav-bucket-ml')).not.toBeInTheDocument(); + expect(queryByTestId('nav-bucket-devTools')).not.toBeInTheDocument(); + expect(queryByTestId('nav-bucket-management')).not.toBeInTheDocument(); + }); + + test('sets the specified nav item to active', async () => { + solutions[0].items = [ + { + id: 'root', + name: '', + items: [ + { + id: 'city', + name: 'City', + }, + { + id: 'town', + name: 'Town', + }, + ], + }, + ]; + + const { findByTestId } = render( + + + + ); + + const label = await findByTestId('nav-item-navigation_testing.root.city-selected'); + expect(label).toHaveTextContent('City'); + expect(label).toBeVisible(); + }); + + test('shows loading state', async () => { + services.loadingCount = 5; + + const { findByTestId } = render( + + + + ); + + expect(await findByTestId('nav-header-loading-spinner')).toBeVisible(); + }); +}); diff --git a/packages/shared-ux/chrome/navigation/src/ui/navigation.tsx b/packages/shared-ux/chrome/navigation/src/ui/navigation.tsx new file mode 100644 index 0000000000000..60f3af10a6b54 --- /dev/null +++ b/packages/shared-ux/chrome/navigation/src/ui/navigation.tsx @@ -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 { + EuiCollapsibleNavGroup, + EuiFlexGroup, + EuiFlexItem, + EuiHeaderLogo, + EuiLink, + EuiLoadingSpinner, + EuiSpacer, + useEuiTheme, +} from '@elastic/eui'; +import React from 'react'; +import { getI18nStrings } from './i18n_strings'; +import { NavigationBucketProps, NavigationProps } from '../../types'; +import { NavigationModel } from '../model'; +import { useNavigation } from '../services'; +import { ElasticMark } from './elastic_mark'; +import './header_logo.scss'; +import { NavigationBucket } from './navigation_bucket'; + +export const Navigation = (props: NavigationProps) => { + const { loadingCount, activeNavItemId, ...services } = useNavigation(); + const { euiTheme } = useEuiTheme(); + + const activeNav = activeNavItemId ?? props.activeNavItemId; + + const nav = new NavigationModel(services, props.platformConfig, props.solutions, activeNav); + + const solutions = nav.getSolutions(); + const { analytics, ml, devTools, management } = nav.getPlatform(); + + const strings = getI18nStrings(); + + const NavHeader = () => { + const homeUrl = services.basePath.prepend(props.homeHref); + const navigateHome = (event: React.MouseEvent) => { + event.preventDefault(); + services.navigateToUrl(homeUrl); + }; + const logo = + loadingCount === 0 ? ( + + ) : ( + + + + ); + + return ( + <> + {logo} + {services.navIsOpen ? ( + + ) : null} + + ); + }; + + const LinkToCloud = () => { + switch (props.linkToCloud) { + case 'projects': + return ( + + + + ); + case 'deployments': + return ( + + + + ); + default: + return null; + } + }; + + // higher-order-component to keep the common props DRY + const NavigationBucketHoc = (outerProps: Omit) => ( + + ); + + return ( + + + + + + + + + {solutions.map((solutionBucket, idx) => { + return ; + })} + + {nav.isEnabled('analytics') ? : null} + {nav.isEnabled('ml') ? : null} + + + + + + + + {nav.isEnabled('devTools') ? : null} + {nav.isEnabled('management') ? : null} + + + ); +}; diff --git a/packages/shared-ux/chrome/navigation/src/ui/navigation_bucket.tsx b/packages/shared-ux/chrome/navigation/src/ui/navigation_bucket.tsx new file mode 100644 index 0000000000000..0b0d6b5b223ab --- /dev/null +++ b/packages/shared-ux/chrome/navigation/src/ui/navigation_bucket.tsx @@ -0,0 +1,42 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { EuiCollapsibleNavGroup, EuiIcon, EuiSideNav, EuiText } from '@elastic/eui'; +import React from 'react'; +import { NavigationBucketProps } from '../../types'; +import { useNavigation } from '../services'; +import { navigationStyles as styles } from '../styles'; + +export const NavigationBucket = (opts: NavigationBucketProps) => { + const { id, items, activeNavItemId, ...props } = opts; + const { navIsOpen } = useNavigation(); + + if (navIsOpen) { + return ( + + + + + + ); + } + + return ( +
+ +
+
+ ); +}; diff --git a/packages/shared-ux/chrome/navigation/tsconfig.json b/packages/shared-ux/chrome/navigation/tsconfig.json new file mode 100644 index 0000000000000..05fd9d0346421 --- /dev/null +++ b/packages/shared-ux/chrome/navigation/tsconfig.json @@ -0,0 +1,28 @@ +{ + "extends": "../../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + "types": [ + "jest", + "node", + "react", + "@emotion/react/types/css-prop", + "@testing-library/jest-dom", + "@testing-library/react", + "@kbn/ambient-ui-types" + ] + }, + "include": [ + "**/*.ts", + "**/*.tsx" + ], + "kbn_references": [ + "@kbn/core-application-browser", + "@kbn/core-http-browser", + "@kbn/shared-ux-storybook-mock", + "@kbn/i18n" + ], + "exclude": [ + "target/**/*" + ] +} diff --git a/packages/shared-ux/chrome/navigation/types/index.ts b/packages/shared-ux/chrome/navigation/types/index.ts new file mode 100644 index 0000000000000..bd7aaddcb67c6 --- /dev/null +++ b/packages/shared-ux/chrome/navigation/types/index.ts @@ -0,0 +1,132 @@ +/* + * Copyright 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 { EuiSideNavItemType, IconType } from '@elastic/eui'; +import { Observable } from 'rxjs'; +import { BasePathService, NavigateToUrlFn, RecentItem } from './internal'; + +/** + * A list of services that are consumed by this component. + * @public + */ +export interface NavigationServices { + activeNavItemId?: string; + basePath: BasePathService; + loadingCount: number; + navIsOpen: boolean; + navigateToUrl: NavigateToUrlFn; +} + +/** + * An interface containing a collection of Kibana dependencies required to + * render this component + * @public + */ +export interface NavigationKibanaDependencies { + core: { + application: { navigateToUrl: NavigateToUrlFn }; + chrome: { + recentlyAccessed: { get$: () => Observable }; + }; + http: { + basePath: BasePathService; + getLoadingCount$(): Observable; + }; + }; +} + +/** + * Props for the `NavItem` component representing the content of a navigational item with optional children. + * @public + */ +export type NavItemProps = Pick, 'id' | 'name'> & { + /** + * Nav Items + */ + items?: Array>; + /** + * Href for a link destination + * Example: /app/fleet + */ + href?: string; +}; + +/** + * @public + */ +export interface PlatformSectionConfig { + enabled?: boolean; + properties?: Record; +} + +/** + * @public + */ +export interface SolutionProperties { + /** + * Solutions' navigation items + */ + items?: NavItemProps[]; + /** + * Solutions' navigation collapsible nav ID + */ + id: string; + /** + * Name to show as title for Solutions' collapsible nav "bucket" + */ + name: React.ReactNode; + /** + * Solution logo, i.e. "logoObservability" + */ + icon: IconType; +} + +/** + * @public + */ +export type PlatformId = 'analytics' | 'ml' | 'devTools' | 'management'; + +/** + * Object that will allow parts of the platform-controlled nav to be hidden + * @public + */ +export type PlatformConfigSet = Record; + +/** + * Props for the `Navigation` component. + * @public + */ +export interface NavigationProps { + /** + * ID of sections to initially open + * Path to the nav item is given with hierarchy expressed in dotted notation. + * Example: `my_project.settings.index_management` + */ + activeNavItemId?: string; + /** + * Configuration for Solutions' section(s) + */ + solutions: SolutionProperties[]; + /** + * Controls over how Platform nav sections appear + */ + platformConfig?: Partial; + /** + * Target for the logo icon + */ + homeHref: string; + /** + * Control of the link that takes the user to their projects or deployments + */ + linkToCloud?: 'projects' | 'deployments'; +} + +export type NavigationBucketProps = (SolutionProperties & + Pick) & { + platformConfig?: PlatformSectionConfig; +}; diff --git a/packages/shared-ux/chrome/navigation/types/internal.ts b/packages/shared-ux/chrome/navigation/types/internal.ts new file mode 100644 index 0000000000000..6808c391073a9 --- /dev/null +++ b/packages/shared-ux/chrome/navigation/types/internal.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 { ApplicationStart } from '@kbn/core-application-browser'; +import type { IBasePath } from '@kbn/core-http-browser'; + +/** + * @internal + */ +export type SetActiveNavItemIdFn = (activeNavItemId: string) => void; + +/** + * @internal + */ +export interface RecentItem { + link: string; + label: string; + id: string; +} + +export type NavigateToUrlFn = ApplicationStart['navigateToUrl']; + +export type BasePathService = Pick; diff --git a/packages/shared-ux/file/types/index.ts b/packages/shared-ux/file/types/index.ts index 86b9e47fdab43..32dda0bd933a7 100644 --- a/packages/shared-ux/file/types/index.ts +++ b/packages/shared-ux/file/types/index.ts @@ -226,6 +226,10 @@ export interface FileJSON { * User data associated with this file */ user?: FileMetadata['user']; + /** + * File hash information + */ + hash?: BaseFileMetadata['hash']; } export interface FileKindBase { diff --git a/src/core/public/styles/_base.scss b/src/core/public/styles/_base.scss index 1e8e6c7411e4d..de138cdf402e6 100644 --- a/src/core/public/styles/_base.scss +++ b/src/core/public/styles/_base.scss @@ -34,12 +34,3 @@ .euiPageHeader--bottomBorder:not(.euiPageHeader--tabsAtBottom):not([class*='euiPageHeader--padding']) { padding-bottom: $euiSizeL; } - -// Kibana's body ignores the `margin-right !important` set by react-remove-scroll-bar -// (used by EUI's focus trap component & prevents page width jumps on full-screen overlays) -// due to the 100% width/min-width CSS set by Kibana in other places. To work around this, we -// grab the `--removed-body-scroll-bar-size` var added by the library & manually set `padding` -// TODO: Use `gapMode` instead once https://github.com/theKashey/react-focus-on/issues/65 is fixed -.kbnBody { - padding-right: var(--removed-body-scroll-bar-size, 0); -} diff --git a/src/core/server/integration_tests/saved_objects/migrations/group2/check_registered_types.test.ts b/src/core/server/integration_tests/saved_objects/migrations/group2/check_registered_types.test.ts index e98f7e319d5ac..93b3b73393a85 100644 --- a/src/core/server/integration_tests/saved_objects/migrations/group2/check_registered_types.test.ts +++ b/src/core/server/integration_tests/saved_objects/migrations/group2/check_registered_types.test.ts @@ -88,7 +88,7 @@ describe('checking migration metadata changes on all registered SO types', () => "event_loop_delays_daily": "ef49e7f15649b551b458c7ea170f3ed17f89abd0", "exception-list": "38181294f64fc406c15f20d85ca306c8a4feb3c0", "exception-list-agnostic": "d527ce9d12b134cb163150057b87529043a8ec77", - "file": "d12998f49bc82da596a9e6c8397999930187ec6a", + "file": "487a562dd895407307980cc4404ca08e87e8999d", "file-upload-usage-collection-telemetry": "c6fcb9a7efcf19b2bb66ca6e005bfee8961f6073", "fileShare": "f07d346acbb724eacf139a0fb781c38dc5280115", "fleet-fleet-server-host": "67180a54a689111fb46403c3603c9b3a329c698d", diff --git a/src/core/server/integration_tests/saved_objects/routes/import.test.ts b/src/core/server/integration_tests/saved_objects/routes/import.test.ts index 24116ff52267c..0a9ae5f164635 100644 --- a/src/core/server/integration_tests/saved_objects/routes/import.test.ts +++ b/src/core/server/integration_tests/saved_objects/routes/import.test.ts @@ -46,12 +46,14 @@ describe(`POST ${URL}`, () => { id: 'my-pattern', attributes: { title: 'my-pattern-*' }, references: [], + managed: false, }; const mockDashboard = { type: 'dashboard', id: 'my-dashboard', attributes: { title: 'Look at my dashboard' }, references: [], + managed: false, }; beforeEach(async () => { @@ -145,6 +147,7 @@ describe(`POST ${URL}`, () => { type: 'index-pattern', id: 'my-pattern', meta: { title: 'my-pattern-*', icon: 'index-pattern-icon' }, + managed: false, }, ], warnings: [], @@ -156,11 +159,49 @@ describe(`POST ${URL}`, () => { ); }); - it('imports an index pattern and dashboard, ignoring empty lines in the file', async () => { + it('returns the default for managed as part of the successResults', async () => { + savedObjectsClient.bulkCreate.mockResolvedValueOnce({ saved_objects: [mockIndexPattern] }); + + const result = await supertest(httpSetup.server.listener) + .post(URL) + .set('content-Type', 'multipart/form-data; boundary=EXAMPLE') + .send( + [ + '--EXAMPLE', + 'Content-Disposition: form-data; name="file"; filename="export.ndjson"', + 'Content-Type: application/ndjson', + '', + '{"type":"index-pattern","id":"my-pattern","attributes":{"title":"my-pattern-*"}}', + '--EXAMPLE--', + ].join('\r\n') + ) + .expect(200); + + expect(result.body).toEqual({ + success: true, + successCount: 1, + successResults: [ + { + type: 'index-pattern', + id: 'my-pattern', + meta: { title: 'my-pattern-*', icon: 'index-pattern-icon' }, + managed: false, + }, + ], + warnings: [], + }); + expect(savedObjectsClient.bulkCreate).toHaveBeenCalledTimes(1); // successResults objects were created because no resolvable errors are present + expect(savedObjectsClient.bulkCreate).toHaveBeenCalledWith( + [expect.objectContaining({ typeMigrationVersion: '', managed: false })], + expect.any(Object) // options + ); + }); + + it('imports an index pattern, dashboard and visualization, ignoring empty lines in the file', async () => { // NOTE: changes to this scenario should be reflected in the docs savedObjectsClient.bulkCreate.mockResolvedValueOnce({ - saved_objects: [mockIndexPattern, mockDashboard], + saved_objects: [mockIndexPattern, { ...mockDashboard, managed: false }], }); const result = await supertest(httpSetup.server.listener) @@ -190,11 +231,13 @@ describe(`POST ${URL}`, () => { type: mockIndexPattern.type, id: mockIndexPattern.id, meta: { title: mockIndexPattern.attributes.title, icon: 'index-pattern-icon' }, + managed: false, }, { type: mockDashboard.type, id: mockDashboard.id, meta: { title: mockDashboard.attributes.title, icon: 'dashboard-icon' }, + managed: false, }, ], warnings: [], @@ -235,6 +278,7 @@ describe(`POST ${URL}`, () => { type: mockDashboard.type, id: mockDashboard.id, meta: { title: mockDashboard.attributes.title, icon: 'dashboard-icon' }, + managed: false, }, ], errors: [ @@ -287,11 +331,13 @@ describe(`POST ${URL}`, () => { id: mockIndexPattern.id, meta: { title: mockIndexPattern.attributes.title, icon: 'index-pattern-icon' }, overwrite: true, + managed: false, }, { type: mockDashboard.type, id: mockDashboard.id, meta: { title: mockDashboard.attributes.title, icon: 'dashboard-icon' }, + managed: false, }, ], warnings: [], @@ -345,6 +391,7 @@ describe(`POST ${URL}`, () => { type: mockDashboard.type, id: mockDashboard.id, meta: { title: mockDashboard.attributes.title, icon: 'dashboard-icon' }, + managed: false, }, ], warnings: [], @@ -414,6 +461,7 @@ describe(`POST ${URL}`, () => { type: mockDashboard.type, id: mockDashboard.id, meta: { title: mockDashboard.attributes.title, icon: 'dashboard-icon' }, + managed: false, }, ], warnings: [], @@ -478,6 +526,7 @@ describe(`POST ${URL}`, () => { type: mockDashboard.type, id: mockDashboard.id, meta: { title: mockDashboard.attributes.title, icon: 'dashboard-icon' }, + managed: false, }, ], warnings: [], @@ -505,12 +554,14 @@ describe(`POST ${URL}`, () => { id: 'new-id-1', attributes: { title: 'Look at my visualization' }, references: [], + managed: false, }; const obj2 = { type: 'dashboard', id: 'new-id-2', attributes: { title: 'Look at my dashboard' }, references: [], + managed: false, }; savedObjectsClient.bulkCreate.mockResolvedValueOnce({ saved_objects: [obj1, obj2] }); @@ -539,12 +590,14 @@ describe(`POST ${URL}`, () => { id: 'my-vis', meta: { title: obj1.attributes.title, icon: 'visualization-icon' }, destinationId: obj1.id, + managed: false, }, { type: obj2.type, id: 'my-dashboard', meta: { title: obj2.attributes.title, icon: 'dashboard-icon' }, destinationId: obj2.id, + managed: false, }, ], warnings: [], @@ -556,11 +609,13 @@ describe(`POST ${URL}`, () => { type: 'visualization', id: 'new-id-1', references: [{ name: 'ref_0', type: 'index-pattern', id: 'my-pattern' }], + managed: false, }), expect.objectContaining({ type: 'dashboard', id: 'new-id-2', references: [{ name: 'ref_0', type: 'visualization', id: 'new-id-1' }], + managed: false, }), ], expect.any(Object) // options @@ -769,6 +824,7 @@ describe(`POST ${URL}`, () => { originId: 'my-vis', attributes: { title: 'Look at my visualization' }, references: [], + managed: false, }; const obj2 = { type: 'dashboard', @@ -776,6 +832,7 @@ describe(`POST ${URL}`, () => { originId: 'my-dashboard', attributes: { title: 'Look at my dashboard' }, references: [], + managed: false, }; savedObjectsClient.bulkCreate.mockResolvedValueOnce({ saved_objects: [ @@ -785,6 +842,7 @@ describe(`POST ${URL}`, () => { id: obj2.id, attributes: {}, references: [], + managed: false, error: { error: 'some-error', message: 'Why not?', statusCode: 503 }, }, ], @@ -830,6 +888,7 @@ describe(`POST ${URL}`, () => { id: obj1.originId, meta: { title: obj1.attributes.title, icon: 'visualization-icon' }, destinationId: obj1.id, + managed: false, }, ], errors: [ @@ -843,6 +902,7 @@ describe(`POST ${URL}`, () => { statusCode: 503, type: 'unknown', }, + managed: false, }, ], warnings: [], @@ -855,12 +915,14 @@ describe(`POST ${URL}`, () => { id: 'new-id-1', originId: 'my-vis', references: [{ name: 'ref_0', type: 'index-pattern', id: 'my-pattern' }], + managed: false, }), expect.objectContaining({ type: 'dashboard', id: 'new-id-2', originId: 'my-dashboard', references: [{ name: 'ref_0', type: 'visualization', id: 'new-id-1' }], + managed: false, }), ], expect.any(Object) // options @@ -905,7 +967,9 @@ describe(`POST ${URL}`, () => { attributes: { title: 'Look at my visualization' }, references: [], }; - savedObjectsClient.bulkCreate.mockResolvedValueOnce({ saved_objects: [obj1] }); + savedObjectsClient.bulkCreate.mockResolvedValueOnce({ + saved_objects: [{ ...obj1, managed: false }], + }); // Prepare mock results for the created legacy URL alias (for obj1 only). const legacyUrlAliasObj1 = { @@ -956,6 +1020,7 @@ describe(`POST ${URL}`, () => { id: obj1.originId, meta: { title: obj1.attributes.title, icon: 'visualization-icon' }, destinationId: obj1.id, + managed: false, }, ], errors: [ @@ -969,6 +1034,7 @@ describe(`POST ${URL}`, () => { type: 'unknown', }, meta: { title: 'Legacy URL alias (my-vis -> new-id-1)', icon: 'legacy-url-alias-icon' }, + managed: false, }, ], warnings: [], @@ -981,6 +1047,7 @@ describe(`POST ${URL}`, () => { id: 'new-id-1', originId: 'my-vis', references: [{ name: 'ref_0', type: 'index-pattern', id: 'my-pattern' }], + managed: false, }), ], expect.any(Object) // options diff --git a/src/core/server/integration_tests/saved_objects/routes/resolve_import_errors.test.ts b/src/core/server/integration_tests/saved_objects/routes/resolve_import_errors.test.ts index 2202735df957f..0e5af8e86be08 100644 --- a/src/core/server/integration_tests/saved_objects/routes/resolve_import_errors.test.ts +++ b/src/core/server/integration_tests/saved_objects/routes/resolve_import_errors.test.ts @@ -44,18 +44,21 @@ describe(`POST ${URL}`, () => { id: 'my-dashboard', attributes: { title: 'Look at my dashboard' }, references: [], + managed: false, }; const mockVisualization = { type: 'visualization', id: 'my-vis', attributes: { title: 'Look at my visualization' }, references: [{ name: 'ref_0', type: 'index-pattern', id: 'existing' }], + managed: false, }; const mockIndexPattern = { type: 'index-pattern', id: 'existing', attributes: {}, references: [], + managed: false, }; beforeEach(async () => { @@ -155,12 +158,13 @@ describe(`POST ${URL}`, () => { type, id, attributes: { title }, + managed, } = mockDashboard; const meta = { title, icon: 'dashboard-icon' }; expect(result.body).toEqual({ success: true, successCount: 1, - successResults: [{ type, id, meta }], + successResults: [{ type, id, meta, managed }], warnings: [], }); expect(savedObjectsClient.bulkCreate).toHaveBeenCalledTimes(1); // successResults objects were created because no resolvable errors are present @@ -193,17 +197,17 @@ describe(`POST ${URL}`, () => { ) .expect(200); - const { type, id, attributes } = mockDashboard; + const { type, id, attributes, managed } = mockDashboard; const meta = { title: attributes.title, icon: 'dashboard-icon' }; expect(result.body).toEqual({ success: true, successCount: 1, - successResults: [{ type, id, meta }], + successResults: [{ type, id, meta, managed }], warnings: [], }); expect(savedObjectsClient.bulkCreate).toHaveBeenCalledTimes(1); // successResults objects were created because no resolvable errors are present expect(savedObjectsClient.bulkCreate).toHaveBeenCalledWith( - [{ type, id, attributes, typeMigrationVersion: '' }], + [{ type, id, attributes, typeMigrationVersion: '', managed }], expect.objectContaining({ overwrite: undefined }) ); }); @@ -232,17 +236,17 @@ describe(`POST ${URL}`, () => { ) .expect(200); - const { type, id, attributes } = mockDashboard; + const { type, id, attributes, managed } = mockDashboard; const meta = { title: attributes.title, icon: 'dashboard-icon' }; expect(result.body).toEqual({ success: true, successCount: 1, - successResults: [{ type, id, meta, overwrite: true }], + successResults: [{ type, id, meta, overwrite: true, managed }], warnings: [], }); expect(savedObjectsClient.bulkCreate).toHaveBeenCalledTimes(1); // successResults objects were created because no resolvable errors are present expect(savedObjectsClient.bulkCreate).toHaveBeenCalledWith( - [{ type, id, attributes, typeMigrationVersion: '' }], + [{ type, id, attributes, typeMigrationVersion: '', managed }], expect.objectContaining({ overwrite: true }) ); }); @@ -271,7 +275,7 @@ describe(`POST ${URL}`, () => { ) .expect(200); - const { type, id, attributes, references } = mockVisualization; + const { type, id, attributes, references, managed } = mockVisualization; expect(result.body).toEqual({ success: true, successCount: 1, @@ -280,13 +284,14 @@ describe(`POST ${URL}`, () => { type: 'visualization', id: 'my-vis', meta: { title: 'Look at my visualization', icon: 'visualization-icon' }, + managed, }, ], warnings: [], }); expect(savedObjectsClient.bulkCreate).toHaveBeenCalledTimes(1); // successResults objects were created because no resolvable errors are present expect(savedObjectsClient.bulkCreate).toHaveBeenCalledWith( - [{ type, id, attributes, references, typeMigrationVersion: '' }], + [{ type, id, attributes, references, typeMigrationVersion: '', managed }], expect.objectContaining({ overwrite: undefined }) ); expect(savedObjectsClient.bulkGet).toHaveBeenCalledTimes(1); @@ -319,7 +324,7 @@ describe(`POST ${URL}`, () => { ) .expect(200); - const { type, id, attributes } = mockVisualization; + const { type, id, attributes, managed } = mockVisualization; const references = [{ name: 'ref_0', type: 'index-pattern', id: 'missing' }]; expect(result.body).toEqual({ success: true, @@ -329,13 +334,14 @@ describe(`POST ${URL}`, () => { type: 'visualization', id: 'my-vis', meta: { title: 'Look at my visualization', icon: 'visualization-icon' }, + managed, }, ], warnings: [], }); expect(savedObjectsClient.bulkCreate).toHaveBeenCalledTimes(1); // successResults objects were created because no resolvable errors are present expect(savedObjectsClient.bulkCreate).toHaveBeenCalledWith( - [{ type, id, attributes, references, typeMigrationVersion: '' }], + [{ type, id, attributes, references, typeMigrationVersion: '', managed }], expect.objectContaining({ overwrite: undefined }) ); expect(savedObjectsClient.bulkGet).not.toHaveBeenCalled(); @@ -351,12 +357,14 @@ describe(`POST ${URL}`, () => { id: 'new-id-1', attributes: { title: 'Look at my visualization' }, references: [], + managed: false, }; const obj2 = { type: 'dashboard', id: 'new-id-2', attributes: { title: 'Look at my dashboard' }, references: [], + managed: false, }; savedObjectsClient.bulkCreate.mockResolvedValueOnce({ saved_objects: [obj1, obj2] }); @@ -389,12 +397,14 @@ describe(`POST ${URL}`, () => { id: 'my-vis', meta: { title: obj1.attributes.title, icon: 'visualization-icon' }, destinationId: obj1.id, + managed: obj1.managed, }, { type: obj2.type, id: 'my-dashboard', meta: { title: obj2.attributes.title, icon: 'dashboard-icon' }, destinationId: obj2.id, + managed: obj2.managed, }, ], warnings: [], @@ -406,11 +416,13 @@ describe(`POST ${URL}`, () => { type: 'visualization', id: 'new-id-1', references: [{ name: 'ref_0', type: 'index-pattern', id: 'existing' }], + managed: false, }), expect.objectContaining({ type: 'dashboard', id: 'new-id-2', references: [{ name: 'ref_0', type: 'visualization', id: 'new-id-1' }], + managed: false, }), ], expect.any(Object) // options @@ -429,6 +441,7 @@ describe(`POST ${URL}`, () => { id: 'my-vis', attributes: { title: 'Look at my visualization' }, references: [], + managed: false, }; const obj2 = { type: 'dashboard', @@ -436,6 +449,7 @@ describe(`POST ${URL}`, () => { originId: 'my-dashboard', attributes: { title: 'Look at my dashboard' }, references: [], + managed: false, }; savedObjectsClient.bulkCreate.mockResolvedValueOnce({ saved_objects: [obj1, obj2] }); @@ -451,6 +465,7 @@ describe(`POST ${URL}`, () => { targetId: obj2.id, purpose: 'savedObjectImport', }, + managed: false, }; savedObjectsClient.bulkCreate.mockResolvedValueOnce({ saved_objects: [legacyUrlAliasObj2], @@ -484,12 +499,14 @@ describe(`POST ${URL}`, () => { type: obj1.type, id: 'my-vis', meta: { title: obj1.attributes.title, icon: 'visualization-icon' }, + managed: obj1.managed, }, { type: obj2.type, id: 'my-dashboard', meta: { title: obj2.attributes.title, icon: 'dashboard-icon' }, destinationId: obj2.id, + managed: obj2.managed, }, ], warnings: [], @@ -502,12 +519,14 @@ describe(`POST ${URL}`, () => { type: 'visualization', id: 'my-vis', references: [{ name: 'ref_0', type: 'index-pattern', id: 'existing' }], + managed: false, }), expect.objectContaining({ type: 'dashboard', id: 'new-id-2', originId: 'my-dashboard', references: [{ name: 'ref_0', type: 'visualization', id: 'my-vis' }], + managed: false, }), ], expect.any(Object) // options diff --git a/src/dev/license_checker/config.ts b/src/dev/license_checker/config.ts index 75a12b0884f8a..aefe4bbd7e8ed 100644 --- a/src/dev/license_checker/config.ts +++ b/src/dev/license_checker/config.ts @@ -85,6 +85,6 @@ export const LICENSE_OVERRIDES = { 'jsts@1.6.2': ['Eclipse Distribution License - v 1.0'], // cf. https://github.com/bjornharrtell/jsts '@mapbox/jsonlint-lines-primitives@2.0.2': ['MIT'], // license in readme https://github.com/tmcw/jsonlint '@elastic/ems-client@8.4.0': ['Elastic License 2.0'], - '@elastic/eui@77.1.1': ['SSPL-1.0 OR Elastic License 2.0'], + '@elastic/eui@77.1.2': ['SSPL-1.0 OR Elastic License 2.0'], 'language-subtag-registry@0.3.21': ['CC-BY-4.0'], // retired ODC‑By license https://github.com/mattcg/language-subtag-registry }; diff --git a/src/plugins/chart_expressions/expression_xy/public/types.ts b/src/plugins/chart_expressions/expression_xy/public/types.ts index 884562f1a358c..733dba9400bf2 100755 --- a/src/plugins/chart_expressions/expression_xy/public/types.ts +++ b/src/plugins/chart_expressions/expression_xy/public/types.ts @@ -118,13 +118,6 @@ export interface VisualizationType { showExperimentalBadge?: boolean; } -export interface AccessorConfig { - columnId: string; - triggerIcon?: 'color' | 'disabled' | 'colorBy' | 'none' | 'invisible'; - color?: string; - palette?: string[] | Array<{ color: string; stop: number }>; -} - export interface CellValueAction { id: string; iconType: string; diff --git a/src/plugins/custom_integrations/common/index.ts b/src/plugins/custom_integrations/common/index.ts index 1b6ec7a7bc44f..d1733c7d076ce 100755 --- a/src/plugins/custom_integrations/common/index.ts +++ b/src/plugins/custom_integrations/common/index.ts @@ -15,6 +15,7 @@ export const PLUGIN_NAME = 'customIntegrations'; export const INTEGRATION_CATEGORY_DISPLAY: { [key: string]: { title: string; parent_id?: string }; } = { + advanced_analytics_ueba: { title: 'Advanced Analytics (UEBA', parent_id: 'security' }, analytics_engine: { title: 'Analytics Engine', parent_id: 'observability' }, application_observability: { title: 'Application', parent_id: 'observability' }, app_search: { title: 'Application Search', parent_id: 'enterprise_search' }, diff --git a/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.test.ts b/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.test.ts index 947b062b3a551..529d91a284e4e 100644 --- a/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.test.ts +++ b/src/plugins/dashboard/public/dashboard_container/embeddable/create/create_dashboard.test.ts @@ -6,6 +6,8 @@ * Side Public License, v 1. */ +import { Observable } from 'rxjs'; + import { ContactCardEmbeddable, ContactCardEmbeddableFactory, @@ -26,7 +28,7 @@ import { createDashboard } from './create_dashboard'; import { getSampleDashboardPanel } from '../../../mocks'; import { pluginServices } from '../../../services/plugin_services'; import { DashboardCreationOptions } from '../dashboard_container_factory'; -import { Observable } from 'rxjs'; +import { DEFAULT_DASHBOARD_INPUT } from '../../../dashboard_constants'; const embeddableId = 'create-dat-dashboard'; @@ -54,18 +56,28 @@ test('throws error when provided validation function returns invalid', async () test('pulls state from dashboard saved object when given a saved object id', async () => { pluginServices.getServices().dashboardSavedObject.loadDashboardStateFromSavedObject = jest .fn() - .mockResolvedValue({ dashboardInput: { description: 'wow would you look at that? Wow.' } }); + .mockResolvedValue({ + dashboardInput: { + ...DEFAULT_DASHBOARD_INPUT, + description: `wow would you look at that? Wow.`, + }, + }); const dashboard = await createDashboard(embeddableId, {}, 0, 'wow-such-id'); expect( pluginServices.getServices().dashboardSavedObject.loadDashboardStateFromSavedObject ).toHaveBeenCalledWith({ id: 'wow-such-id' }); - expect(dashboard.getState().explicitInput.description).toBe('wow would you look at that? Wow.'); + expect(dashboard.getState().explicitInput.description).toBe(`wow would you look at that? Wow.`); }); test('pulls state from session storage which overrides state from saved object', async () => { pluginServices.getServices().dashboardSavedObject.loadDashboardStateFromSavedObject = jest .fn() - .mockResolvedValue({ dashboardInput: { description: 'wow this description is okay' } }); + .mockResolvedValue({ + dashboardInput: { + ...DEFAULT_DASHBOARD_INPUT, + description: 'wow this description is okay', + }, + }); pluginServices.getServices().dashboardSessionStorage.getState = jest .fn() .mockReturnValue({ description: 'wow this description marginally better' }); @@ -83,7 +95,12 @@ test('pulls state from session storage which overrides state from saved object', test('pulls state from creation options initial input which overrides all other state sources', async () => { pluginServices.getServices().dashboardSavedObject.loadDashboardStateFromSavedObject = jest .fn() - .mockResolvedValue({ dashboardInput: { description: 'wow this description is okay' } }); + .mockResolvedValue({ + dashboardInput: { + ...DEFAULT_DASHBOARD_INPUT, + description: 'wow this description is okay', + }, + }); pluginServices.getServices().dashboardSessionStorage.getState = jest .fn() .mockReturnValue({ description: 'wow this description marginally better' }); @@ -213,6 +230,7 @@ test('creates new embeddable with incoming embeddable if id does not match exist }, }, }); + // flush promises await new Promise((r) => setTimeout(r, 1)); expect(mockContactCardFactory.create).toHaveBeenCalledWith( diff --git a/src/plugins/data/common/exports/constants.ts b/src/plugins/data/common/exports/constants.ts index 9c256d4d3ea97..94b0cad9dc7fc 100644 --- a/src/plugins/data/common/exports/constants.ts +++ b/src/plugins/data/common/exports/constants.ts @@ -9,3 +9,5 @@ export const CSV_FORMULA_CHARS = ['=', '+', '-', '@']; export const nonAlphaNumRE = /[^a-zA-Z0-9]/; export const allDoubleQuoteRE = /"/g; +// this is a non-exhaustive list of delimiters that require to be quoted +export const commonQuotedDelimiters = new Set([',', ';', '\t', ' ', '|']); diff --git a/src/plugins/data/common/exports/escape_value.test.ts b/src/plugins/data/common/exports/escape_value.test.ts index 9463af644d417..08247e0cd98a9 100644 --- a/src/plugins/data/common/exports/escape_value.test.ts +++ b/src/plugins/data/common/exports/escape_value.test.ts @@ -13,7 +13,11 @@ describe('escapeValue', function () { describe('quoteValues is true', function () { let escapeValue: (val: string) => string; beforeEach(function () { - escapeValue = createEscapeValue(true, false); + escapeValue = createEscapeValue({ + separator: ',', + quoteValues: true, + escapeFormulaValues: false, + }); }); it('should escape value with spaces', function () { @@ -48,7 +52,11 @@ describe('escapeValue', function () { describe('quoteValues is false', function () { let escapeValue: (val: string) => string; beforeEach(function () { - escapeValue = createEscapeValue(false, false); + escapeValue = createEscapeValue({ + separator: ',', + quoteValues: false, + escapeFormulaValues: false, + }); }); it('should return the value unescaped', function () { @@ -57,11 +65,15 @@ describe('escapeValue', function () { }); }); - describe('escapeValues', () => { + describe('escapeFormulaValues', () => { describe('when true', () => { let escapeValue: (val: string) => string; beforeEach(function () { - escapeValue = createEscapeValue(true, true); + escapeValue = createEscapeValue({ + separator: ',', + quoteValues: true, + escapeFormulaValues: true, + }); }); ['@', '+', '-', '='].forEach((badChar) => { @@ -76,7 +88,11 @@ describe('escapeValue', function () { describe('when false', () => { let escapeValue: (val: string) => string; beforeEach(function () { - escapeValue = createEscapeValue(true, false); + escapeValue = createEscapeValue({ + separator: ',', + quoteValues: true, + escapeFormulaValues: false, + }); }); ['@', '+', '-', '='].forEach((badChar) => { @@ -86,4 +102,64 @@ describe('escapeValue', function () { }); }); }); + + describe('csvSeparator', () => { + it('should escape when text contains the separator char with quotes enabled', () => { + const escapeValue = createEscapeValue({ + separator: ';', + quoteValues: true, + escapeFormulaValues: false, + }); + expect(escapeValue('a;b')).to.be('"a;b"'); + }); + + it('should not escape when text contains the separator char if quotes are disabled', () => { + const escapeValue = createEscapeValue({ + separator: ';', + quoteValues: false, + escapeFormulaValues: false, + }); + expect(escapeValue('a;b')).to.be('a;b'); + }); + + it.each([', ', ' , ', ' ,'])( + 'should handle also delimiters that contains white spaces "%p"', + (separator) => { + const escapeValue = createEscapeValue({ + separator, + quoteValues: true, + escapeFormulaValues: false, + }); + const nonStringValue = { + toString() { + return `a${separator}b`; + }, + }; + expect(escapeValue(nonStringValue)).to.be(`"a${separator}b"`); + } + ); + + it('should handle also non-string values (array)', () => { + const escapeValue = createEscapeValue({ + separator: ',', + quoteValues: true, + escapeFormulaValues: true, + }); + expect(escapeValue(['a', 'b'])).to.be('"a,b"'); + }); + + it('should not quote non-string values, even if escapable, when separator is not in the quoted delimiters list', () => { + const escapeValue = createEscapeValue({ + separator: ':', + quoteValues: true, + escapeFormulaValues: true, + }); + const nonStringValue = { + toString() { + return 'a:b'; + }, + }; + expect(escapeValue(nonStringValue)).to.be('a:b'); + }); + }); }); diff --git a/src/plugins/data/common/exports/escape_value.ts b/src/plugins/data/common/exports/escape_value.ts index 393ce6043993a..0b036f2dae496 100644 --- a/src/plugins/data/common/exports/escape_value.ts +++ b/src/plugins/data/common/exports/escape_value.ts @@ -5,11 +5,18 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ -import { allDoubleQuoteRE, nonAlphaNumRE } from './constants'; +import { allDoubleQuoteRE, commonQuotedDelimiters, nonAlphaNumRE } from './constants'; import { cellHasFormulas } from './formula_checks'; type RawValue = string | object | null | undefined; +// string with the delimiter/separator already inside need to be wrapped in quotes +// i.e. string with delimiter char in it like free text or some number formatting (1143 => 1,143) +function shouldBeQuoted(value: string, delimiter: string) { + const trimmedSeparator = delimiter.trim(); + return value.includes(trimmedSeparator) && commonQuotedDelimiters.has(trimmedSeparator); +} + /** * Create a function that will escape CSV values like "=", "@" and "+" with a * "'". This will also place CSV values in "" if contain non-alphanumeric chars. @@ -21,17 +28,27 @@ type RawValue = string | object | null | undefined; * * See OWASP: https://www.owasp.org/index.php/CSV_Injection. */ -export function createEscapeValue( - quoteValues: boolean, - escapeFormulas: boolean -): (val: RawValue) => string { +export function createEscapeValue({ + separator, + quoteValues, + escapeFormulaValues, +}: { + separator: string; + quoteValues: boolean; + escapeFormulaValues: boolean; +}): (val: RawValue) => string { return function escapeValue(val: RawValue) { if (val && typeof val === 'string') { - const formulasEscaped = escapeFormulas && cellHasFormulas(val) ? "'" + val : val; - if (quoteValues && nonAlphaNumRE.test(formulasEscaped)) { - return `"${formulasEscaped.replace(allDoubleQuoteRE, '""')}"`; + const formulasEscaped = escapeFormulaValues && cellHasFormulas(val) ? "'" + val : val; + if (quoteValues) { + if (nonAlphaNumRE.test(formulasEscaped)) { + return `"${formulasEscaped.replace(allDoubleQuoteRE, '""')}"`; + } } } - return val == null ? '' : val.toString(); + // raw multi-terms are stringified as T1,T2,T3 so check if the final value contains the + // csv separator before returning (usually for raw values) + const stringVal = val == null ? '' : val.toString(); + return quoteValues && shouldBeQuoted(stringVal, separator) ? `"${stringVal}"` : stringVal; }; } diff --git a/src/plugins/data/common/exports/export_csv.test.ts b/src/plugins/data/common/exports/export_csv.test.ts index 7d4f1347c6cba..0c005b4bdee2e 100644 --- a/src/plugins/data/common/exports/export_csv.test.ts +++ b/src/plugins/data/common/exports/export_csv.test.ts @@ -84,4 +84,16 @@ describe('CSV exporter', () => { }) ).toMatch('columnOne\r\n"\'=1"\r\n'); }); + + test('should escape text with csvSeparator char in it', () => { + const datatable = getDataTable(); + datatable.rows[0].col1 = 'a,b'; + expect( + datatableToCSV(datatable, { + ...getDefaultOptions(), + escapeFormulaValues: true, + formatFactory: () => ({ convert: (v: unknown) => v } as FieldFormat), + }) + ).toMatch('columnOne\r\n"a,b"\r\n'); + }); }); diff --git a/src/plugins/data/common/exports/export_csv.tsx b/src/plugins/data/common/exports/export_csv.tsx index 94dd1b78d2737..fe7d35fe03e49 100644 --- a/src/plugins/data/common/exports/export_csv.tsx +++ b/src/plugins/data/common/exports/export_csv.tsx @@ -27,7 +27,11 @@ export function datatableToCSV( { columns, rows }: Datatable, { csvSeparator, quoteValues, formatFactory, raw, escapeFormulaValues }: CSVOptions ) { - const escapeValues = createEscapeValue(quoteValues, escapeFormulaValues); + const escapeValues = createEscapeValue({ + separator: csvSeparator, + quoteValues, + escapeFormulaValues, + }); // Build the header row by its names const header = columns.map((col) => escapeValues(col.name)); diff --git a/src/plugins/data/server/search/session/session_service.test.ts b/src/plugins/data/server/search/session/session_service.test.ts index 38a4f027765df..3f79049fa9666 100644 --- a/src/plugins/data/server/search/session/session_service.test.ts +++ b/src/plugins/data/server/search/session/session_service.test.ts @@ -575,7 +575,11 @@ describe('SearchSessionService', () => { const [[findOptions]] = savedObjectsClient.find.mock.calls; expect(findOptions).toMatchInlineSnapshot(` Object { - "filter": undefined, + "filter": Object { + "arguments": Array [], + "function": "and", + "type": "function", + }, "page": 0, "perPage": 5, "type": "search-session", diff --git a/src/plugins/data_views/server/routes/fields_for.test.ts b/src/plugins/data_views/server/routes/fields_for.test.ts new file mode 100644 index 0000000000000..57d1465f8a9ee --- /dev/null +++ b/src/plugins/data_views/server/routes/fields_for.test.ts @@ -0,0 +1,52 @@ +/* + * Copyright 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 { parseMetaFields } from './fields_for'; + +describe('_fields_for_wildcard', () => { + describe('parseMetaFields', () => { + it('should throw if receiving a string of comma-separated values', () => { + const value = '_source,_id'; + expect(() => parseMetaFields(value)).toThrowErrorMatchingInlineSnapshot( + `"metaFields should be an array of field names, a JSON-stringified array of field names, or a single field name"` + ); + }); + + it('should parse a stringified list of values', () => { + const value = JSON.stringify(['_source', '_id']); + const fields = parseMetaFields(value); + expect(fields).toMatchInlineSnapshot(` + Array [ + "_source", + "_id", + ] + `); + }); + + it('should wrap a single value in an array', () => { + const value = '_source'; + const fields = parseMetaFields(value); + expect(fields).toMatchInlineSnapshot(` + Array [ + "_source", + ] + `); + }); + + it('should return the array if already an array', () => { + const value = ['_source', '_id']; + const fields = parseMetaFields(value); + expect(fields).toMatchInlineSnapshot(` + Array [ + "_source", + "_id", + ] + `); + }); + }); +}); diff --git a/src/plugins/data_views/server/routes/fields_for.ts b/src/plugins/data_views/server/routes/fields_for.ts index 415077258966d..8719fd5ce7549 100644 --- a/src/plugins/data_views/server/routes/fields_for.ts +++ b/src/plugins/data_views/server/routes/fields_for.ts @@ -17,14 +17,24 @@ import { import { IndexPatternsFetcher } from '../fetcher'; import type { DataViewsServerPluginStart, DataViewsServerPluginStartDependencies } from '../types'; -const parseMetaFields = (metaFields: string | string[]) => { - let parsedFields: string[] = []; - if (typeof metaFields === 'string') { - parsedFields = JSON.parse(metaFields); - } else { - parsedFields = metaFields; +/** + * Accepts one of the following: + * 1. An array of field names + * 2. A JSON-stringified array of field names + * 3. A single field name (not comma-separated) + * @returns an array of field names + * @param metaFields + */ +export const parseMetaFields = (metaFields: string | string[]): string[] => { + if (Array.isArray(metaFields)) return metaFields; + try { + return JSON.parse(metaFields); + } catch (e) { + if (!metaFields.includes(',')) return [metaFields]; + throw new Error( + 'metaFields should be an array of field names, a JSON-stringified array of field names, or a single field name' + ); } - return parsedFields; }; const path = '/api/index_patterns/_fields_for_wildcard'; @@ -32,7 +42,7 @@ const path = '/api/index_patterns/_fields_for_wildcard'; type IBody = { index_filter?: estypes.QueryDslQueryContainer } | undefined; interface IQuery { pattern: string; - meta_fields: string[]; + meta_fields: string | string[]; type?: string; rollup_index?: string; allow_no_index?: boolean; diff --git a/src/plugins/discover/public/application/main/components/layout/use_discover_histogram.test.tsx b/src/plugins/discover/public/application/main/components/layout/use_discover_histogram.test.tsx index b90ec6673018b..d3dae1cf148dc 100644 --- a/src/plugins/discover/public/application/main/components/layout/use_discover_histogram.test.tsx +++ b/src/plugins/discover/public/application/main/components/layout/use_discover_histogram.test.tsx @@ -144,6 +144,7 @@ describe('useDiscoverHistogram', () => { beforeEach(() => { mockCheckHitCount.mockClear(); }); + it('should subscribe to state changes', async () => { const { hook } = await renderUseDiscoverHistogram(); const api = createMockUnifiedHistogramApi(); @@ -218,6 +219,7 @@ describe('useDiscoverHistogram', () => { act(() => { hook.result.current.ref(api); }); + stateContainer.appState.update({ hideChart: true, interval: '1m', breakdownField: 'test' }); expect(api.setTotalHits).toHaveBeenCalled(); expect(api.setChartHidden).toHaveBeenCalled(); expect(api.setTimeInterval).toHaveBeenCalled(); @@ -225,15 +227,15 @@ describe('useDiscoverHistogram', () => { expect(Object.keys(params ?? {})).toEqual([ 'totalHitsStatus', 'totalHitsResult', - 'chartHidden', - 'timeInterval', 'breakdownField', + 'timeInterval', + 'chartHidden', ]); }); it('should exclude totalHitsStatus and totalHitsResult from Unified Histogram state updates after the first load', async () => { const stateContainer = getStateContainer(); - const { hook, initialProps } = await renderUseDiscoverHistogram({ stateContainer }); + const { hook } = await renderUseDiscoverHistogram({ stateContainer }); const containerState = stateContainer.appState.getState(); const state = { timeInterval: containerState.interval, @@ -255,13 +257,14 @@ describe('useDiscoverHistogram', () => { act(() => { hook.result.current.ref(api); }); + stateContainer.appState.update({ hideChart: true }); expect(Object.keys(params ?? {})).toEqual([ 'totalHitsStatus', 'totalHitsResult', 'chartHidden', ]); params = {}; - hook.rerender({ ...initialProps, hideChart: true }); + stateContainer.appState.update({ hideChart: false }); act(() => { subject$.next({ ...state, diff --git a/src/plugins/discover/public/application/main/components/layout/use_discover_histogram.ts b/src/plugins/discover/public/application/main/components/layout/use_discover_histogram.ts index 50d3edefcd67c..329e4f1cefca3 100644 --- a/src/plugins/discover/public/application/main/components/layout/use_discover_histogram.ts +++ b/src/plugins/discover/public/application/main/components/layout/use_discover_histogram.ts @@ -14,10 +14,11 @@ import { } from '@kbn/unified-histogram-plugin/public'; import { isEqual } from 'lodash'; import { useCallback, useEffect, useRef, useMemo, useState } from 'react'; -import { distinctUntilChanged, filter, map, Observable } from 'rxjs'; +import { distinctUntilChanged, filter, map, Observable, pairwise, startWith } from 'rxjs'; import useObservable from 'react-use/lib/useObservable'; import type { Suggestion } from '@kbn/lens-plugin/public'; import useLatest from 'react-use/lib/useLatest'; +import type { RequestAdapter } from '@kbn/inspector-plugin/common'; import { useDiscoverServices } from '../../../../hooks/use_discover_services'; import { getUiActions } from '../../../../kibana_services'; import { FetchStatus } from '../../../types'; @@ -25,10 +26,10 @@ import { useDataState } from '../../hooks/use_data_state'; import type { InspectorAdapters } from '../../hooks/use_inspector'; import type { DataDocuments$ } from '../../services/discover_data_state_container'; import { checkHitCount, sendErrorTo } from '../../hooks/use_saved_search_messages'; -import { useAppStateSelector } from '../../services/discover_app_state_container'; import type { DiscoverStateContainer } from '../../services/discover_state'; import { addLog } from '../../../../utils/add_log'; import { useInternalStateSelector } from '../../services/discover_internal_state_container'; +import type { DiscoverAppState } from '../../services/discover_app_state_container'; export interface UseDiscoverHistogramProps { stateContainer: DiscoverStateContainer; @@ -80,25 +81,26 @@ export const useDiscoverHistogram = ({ */ useEffect(() => { - const subscription = createStateSyncObservable(unifiedHistogram?.state$)?.subscribe((state) => { - inspectorAdapters.lensRequests = state.lensRequestAdapter; - - const appState = stateContainer.appState.getState(); - const oldState = { - hideChart: appState.hideChart, - interval: appState.interval, - breakdownField: appState.breakdownField, - }; - const newState = { - hideChart: state.chartHidden, - interval: state.timeInterval, - breakdownField: state.breakdownField, - }; - - if (!isEqual(oldState, newState)) { - stateContainer.appState.update(newState); + const subscription = createUnifiedHistogramStateObservable(unifiedHistogram?.state$)?.subscribe( + (changes) => { + const { lensRequestAdapter, ...stateChanges } = changes; + const appState = stateContainer.appState.getState(); + const oldState = { + hideChart: appState.hideChart, + interval: appState.interval, + breakdownField: appState.breakdownField, + }; + const newState = { ...oldState, ...stateChanges }; + + if ('lensRequestAdapter' in changes) { + inspectorAdapters.lensRequests = lensRequestAdapter; + } + + if (!isEqual(oldState, newState)) { + stateContainer.appState.update(newState); + } } - }); + ); return () => { subscription?.unsubscribe(); @@ -132,24 +134,26 @@ export const useDiscoverHistogram = ({ */ useEffect(() => { - if (typeof hideChart === 'boolean') { - unifiedHistogram?.setChartHidden(hideChart); - } - }, [hideChart, unifiedHistogram]); - - const timeInterval = useAppStateSelector((state) => state.interval); + const subscription = createAppStateObservable(stateContainer.appState.state$).subscribe( + (changes) => { + if ('breakdownField' in changes) { + unifiedHistogram?.setBreakdownField(changes.breakdownField); + } - useEffect(() => { - if (timeInterval) { - unifiedHistogram?.setTimeInterval(timeInterval); - } - }, [timeInterval, unifiedHistogram]); + if ('timeInterval' in changes && changes.timeInterval) { + unifiedHistogram?.setTimeInterval(changes.timeInterval); + } - const breakdownField = useAppStateSelector((state) => state.breakdownField); + if ('chartHidden' in changes && typeof changes.chartHidden === 'boolean') { + unifiedHistogram?.setChartHidden(changes.chartHidden); + } + } + ); - useEffect(() => { - unifiedHistogram?.setBreakdownField(breakdownField); - }, [breakdownField, unifiedHistogram]); + return () => { + subscription?.unsubscribe(); + }; + }, [stateContainer.appState.state$, unifiedHistogram]); /** * Columns @@ -318,20 +322,70 @@ export const useDiscoverHistogram = ({ }; }; -const createStateSyncObservable = (state$?: Observable) => { +// Use pairwise to diff the previous and current state (starting with undefined to ensure +// pairwise triggers after a single emission), and return an object containing only the +// changed properties. By only including the changed properties, we avoid accidentally +// overwriting other state properties that may have been updated between the time this +// obersverable was triggered and the time the state changes are applied. +const createUnifiedHistogramStateObservable = (state$?: Observable) => { return state$?.pipe( - map(({ lensRequestAdapter, chartHidden, timeInterval, breakdownField }) => ({ - lensRequestAdapter, - chartHidden, - timeInterval, - breakdownField, - })), - distinctUntilChanged((prev, curr) => { - const { lensRequestAdapter: prevLensRequestAdapter, ...prevRest } = prev; - const { lensRequestAdapter: currLensRequestAdapter, ...currRest } = curr; + startWith(undefined), + pairwise(), + map(([prev, curr]) => { + const changes: Partial & { lensRequestAdapter?: RequestAdapter } = {}; + + if (!curr) { + return changes; + } + + if (prev?.lensRequestAdapter !== curr.lensRequestAdapter) { + changes.lensRequestAdapter = curr.lensRequestAdapter; + } + + if (prev?.chartHidden !== curr.chartHidden) { + changes.hideChart = curr.chartHidden; + } + + if (prev?.timeInterval !== curr.timeInterval) { + changes.interval = curr.timeInterval; + } + + if (prev?.breakdownField !== curr.breakdownField) { + changes.breakdownField = curr.breakdownField; + } + + return changes; + }), + filter((changes) => Object.keys(changes).length > 0) + ); +}; + +const createAppStateObservable = (state$: Observable) => { + return state$.pipe( + startWith(undefined), + pairwise(), + map(([prev, curr]) => { + const changes: Partial = {}; + + if (!curr) { + return changes; + } + + if (prev?.breakdownField !== curr.breakdownField) { + changes.breakdownField = curr.breakdownField; + } + + if (prev?.interval !== curr.interval) { + changes.timeInterval = curr.interval; + } + + if (prev?.hideChart !== curr.hideChart) { + changes.chartHidden = curr.hideChart; + } - return prevLensRequestAdapter === currLensRequestAdapter && isEqual(prevRest, currRest); - }) + return changes; + }), + filter((changes) => Object.keys(changes).length > 0) ); }; diff --git a/src/plugins/discover/public/utils/convert_value_to_string.ts b/src/plugins/discover/public/utils/convert_value_to_string.ts index f67abe8d53dc2..f310ba35bf1c0 100644 --- a/src/plugins/discover/public/utils/convert_value_to_string.ts +++ b/src/plugins/discover/public/utils/convert_value_to_string.ts @@ -17,6 +17,8 @@ interface ConvertedResult { withFormula: boolean; } +const separator = ','; + export const convertValueToString = ({ rowIndex, rows, @@ -77,7 +79,7 @@ export const convertValueToString = ({ return stringify(formattedValue, disableMultiline) || ''; }) - .join(', '); + .join(`${separator} `); return { formattedString: formatted, @@ -97,7 +99,11 @@ const stringify = (val: object | string, disableMultiline: boolean) => { return disableMultiline ? JSON.stringify(val) : JSON.stringify(val, null, 2); }; -const escapeValueFn = createEscapeValue(true, true); +const escapeValueFn = createEscapeValue({ + separator, + quoteValues: true, + escapeFormulaValues: true, +}); const escapeFormattedValue = (formattedValue: string): string => { return escapeValueFn(formattedValue); diff --git a/src/plugins/files/common/types.ts b/src/plugins/files/common/types.ts index c0cf5dacf687a..8b6059bdb5637 100644 --- a/src/plugins/files/common/types.ts +++ b/src/plugins/files/common/types.ts @@ -18,6 +18,7 @@ import type { FileKindBase, FileShareJSONWithToken, } from '@kbn/shared-ux-file-types'; +import type { UploadOptions } from '../server/blob_storage_service'; import type { ES_FIXED_SIZE_INDEX_BLOB_STORE } from './constants'; export type { @@ -179,7 +180,7 @@ export interface File { */ data: FileJSON; /** - * Update a file object's metadatathat can be updated. + * Update a file object's metadata that can be updated. * * @param attr - The of attributes to update. */ @@ -190,8 +191,13 @@ export interface File { * * @param content - The content to stream to storage. * @param abort$ - An observable that can be used to abort the upload at any time. + * @param options - additional options. */ - uploadContent(content: Readable, abort$?: Observable): Promise>; + uploadContent( + content: Readable, + abort$?: Observable, + options?: Partial> + ): Promise>; /** * Stream file content from storage. diff --git a/src/plugins/files/server/file/file.test.ts b/src/plugins/files/server/file/file.test.ts index b42a360682cf9..7fa062b85e2ec 100644 --- a/src/plugins/files/server/file/file.test.ts +++ b/src/plugins/files/server/file/file.test.ts @@ -14,11 +14,9 @@ import { loggingSystemMock, savedObjectsServiceMock, } from '@kbn/core/server/mocks'; -import { Readable } from 'stream'; +import { Readable, Transform } from 'stream'; import { promisify } from 'util'; -const setImmediate = promisify(global.setImmediate); - import { BlobStorageService } from '../blob_storage_service'; import { InternalFileService } from '../file_service/internal_file_service'; import { @@ -29,6 +27,10 @@ import { import { InternalFileShareService } from '../file_share_service'; import { FileMetadataClient } from '../file_client'; import { SavedObjectsFileMetadataClient } from '../file_client/file_metadata_client/adapters/saved_objects'; +import { File as IFile } from '../../common'; +import { createFileHashTransform } from '..'; + +const setImmediate = promisify(global.setImmediate); describe('File', () => { let esClient: ElasticsearchClient; @@ -110,4 +112,87 @@ describe('File', () => { expect(file.data.status).toBe('UPLOAD_ERROR'); expect(blobStoreSpy.calledOnce).toBe(true); }); + + describe('#uploadContent() method', () => { + let file: IFile; + let fileContent: Readable; + + beforeEach(async () => { + const fileSO = { attributes: { Status: 'AWAITING_UPLOAD' } }; + (soClient.create as jest.Mock).mockResolvedValue(fileSO); + (soClient.update as jest.Mock).mockResolvedValue(fileSO); + (soClient.get as jest.Mock).mockResolvedValue({ + attributes: { + created: '2023-04-27T19:57:19.640Z', + Updated: '2023-04-27T19:57:19.640Z', + name: 'test', + Status: 'DONE', + FileKind: fileKind, + hash: { + sha256: '9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08', + }, + }, + }); + + file = await fileService.createFile({ name: 'test', fileKind }); + fileContent = Readable.from(['test']); + }); + + it('should allow custom transforms to be used', async () => { + let used = 0; + const customTransform = new Transform({ + transform(chunk, _, next) { + used++; + next(null, chunk); + }, + }); + + let used2 = 0; + const customTransform2 = new Transform({ + transform(chunk, _, next) { + used2++; + next(null, chunk); + }, + }); + + await file.uploadContent(fileContent, undefined, { + transforms: [customTransform, customTransform2], + }); + + expect(used).toBeGreaterThan(0); + expect(used2).toBeGreaterThan(0); + expect(file.data).toEqual({ + created: expect.any(String), + updated: expect.any(String), + fileKind: 'fileKind', + size: 4, + status: 'READY', + }); + }); + + it('should generate and store file hash when FileHashTransform is used', async () => { + await file.uploadContent(fileContent, undefined, { + transforms: [createFileHashTransform()], + }); + + expect(file.toJSON()).toEqual({ + created: expect.any(String), + updated: expect.any(String), + fileKind: 'fileKind', + hash: { + sha256: '9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08', + }, + size: 4, + status: 'READY', + }); + }); + + it('should return file hash', async () => { + file = await fileService.getById({ id: '1' }); + + expect(file.data.hash).toEqual({ + sha256: '9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08', + }); + }); + }); }); diff --git a/src/plugins/files/server/file/file.ts b/src/plugins/files/server/file/file.ts index fd5a27fd1bfaa..eeec150cfc78c 100644 --- a/src/plugins/files/server/file/file.ts +++ b/src/plugins/files/server/file/file.ts @@ -19,6 +19,8 @@ import { Observable, lastValueFrom, } from 'rxjs'; +import { isFileHashTransform } from '../file_client/stream_transforms/file_hash_transform/file_hash_transform'; +import { UploadOptions } from '../blob_storage_service'; import type { FileShareJSON, FileShareJSONWithToken } from '../../common/types'; import type { File as IFile, UpdatableFileMetadata, FileJSON } from '../../common'; import { fileAttributesReducer, Action } from './file_attributes_reducer'; @@ -70,13 +72,17 @@ export class File implements IFile { return this; } - private upload(content: Readable): Observable<{ size: number }> { - return defer(() => this.fileClient.upload(this.metadata, content)); + private upload( + content: Readable, + options?: Partial> + ): Observable<{ size: number }> { + return defer(() => this.fileClient.upload(this.metadata, content, options)); } public async uploadContent( content: Readable, - abort$: Observable = NEVER + abort$: Observable = NEVER, + options?: Partial> ): Promise> { if (this.uploadInProgress()) { throw new UploadInProgressError('Upload already in progress.'); @@ -90,7 +96,7 @@ export class File implements IFile { from(this.updateFileState({ action: 'uploading' })).pipe( mergeMap(() => race( - this.upload(content), + this.upload(content, options), abort$.pipe( map(() => { throw new AbortedUploadError(`Aborted upload of ${this.id}!`); @@ -99,7 +105,28 @@ export class File implements IFile { ) ), mergeMap(({ size }) => { - return this.updateFileState({ action: 'uploaded', payload: { size } }); + const updatedStateAction: Action & { action: 'uploaded' } = { + action: 'uploaded', + payload: { size }, + }; + + if (options && options.transforms) { + options.transforms.some((transform) => { + if (isFileHashTransform(transform)) { + const fileHash = transform.getFileHash(); + + updatedStateAction.payload.hash = { + [fileHash.algorithm]: fileHash.value, + }; + + return true; + } + + return false; + }); + } + + return this.updateFileState(updatedStateAction); }), catchError(async (e) => { try { diff --git a/src/plugins/files/server/file/file_attributes_reducer.ts b/src/plugins/files/server/file/file_attributes_reducer.ts index 1a035c32e1243..1e8a71f05628d 100644 --- a/src/plugins/files/server/file/file_attributes_reducer.ts +++ b/src/plugins/files/server/file/file_attributes_reducer.ts @@ -6,6 +6,7 @@ * Side Public License, v 1. */ +import { FileHashObj } from '../saved_objects/file'; import { FileJSON, UpdatableFileMetadata } from '../../common'; export type Action = @@ -17,7 +18,10 @@ export type Action = action: 'uploading'; payload?: undefined; } - | { action: 'uploaded'; payload: { size: number } } + | { + action: 'uploaded'; + payload: { size: number; hash?: FileHashObj }; + } | { action: 'uploadError'; payload?: undefined } | { action: 'updateFile'; payload: Partial }; diff --git a/src/plugins/files/server/file/to_json.ts b/src/plugins/files/server/file/to_json.ts index 2d01655c3a4e0..68870e94ee67c 100644 --- a/src/plugins/files/server/file/to_json.ts +++ b/src/plugins/files/server/file/to_json.ts @@ -10,8 +10,20 @@ import { pickBy } from 'lodash'; import type { FileMetadata, FileJSON } from '../../common/types'; export function serializeJSON(attrs: Partial): Partial> { - const { name, mimeType, size, created, updated, fileKind, status, alt, extension, meta, user } = - attrs; + const { + name, + mimeType, + size, + created, + updated, + fileKind, + status, + alt, + extension, + meta, + user, + hash, + } = attrs; return pickBy( { name, @@ -25,6 +37,7 @@ export function serializeJSON(attrs: Partial): Partial v != null ); @@ -43,6 +56,7 @@ export function toJSON(id: string, attrs: FileMetadata): FileJSO Alt, extension, Meta, + hash, } = attrs; return pickBy>( { @@ -58,6 +72,7 @@ export function toJSON(id: string, attrs: FileMetadata): FileJSO meta: Meta, updated: Updated, fileKind: FileKind, + hash, }, (v) => v != null ) as FileJSON; diff --git a/src/plugins/files/server/file_client/file_client.ts b/src/plugins/files/server/file_client/file_client.ts index f08648aac107b..3bce97f6bcade 100644 --- a/src/plugins/files/server/file_client/file_client.ts +++ b/src/plugins/files/server/file_client/file_client.ts @@ -208,7 +208,7 @@ export class FileClientImpl implements FileClient { /** * Upload a blob - * @param id - The ID of the file content is associated with + * @param file - The file Record that the content is associated with * @param rs - The readable stream of the file content * @param options - Options for the upload */ diff --git a/src/plugins/files/server/file_client/stream_transforms/file_hash_transform/file_hash_transform.test.ts b/src/plugins/files/server/file_client/stream_transforms/file_hash_transform/file_hash_transform.test.ts new file mode 100644 index 0000000000000..6e25f06cb515e --- /dev/null +++ b/src/plugins/files/server/file_client/stream_transforms/file_hash_transform/file_hash_transform.test.ts @@ -0,0 +1,96 @@ +/* + * Copyright 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 { SupportedFileHashAlgorithm } from '../../../saved_objects/file'; +import { createFileHashTransform } from '../../..'; +import { File as IFile } from '../../../../common'; +import { Readable } from 'stream'; +import { + FileKindsRegistryImpl, + getFileKindsRegistry, + setFileKindsRegistry, +} from '../../../../common/file_kinds_registry'; +import { loggingSystemMock } from '@kbn/core-logging-server-mocks'; +import { elasticsearchServiceMock } from '@kbn/core-elasticsearch-server-mocks'; +import { savedObjectsServiceMock } from '@kbn/core-saved-objects-server-mocks'; +import { SavedObjectsFileMetadataClient } from '../..'; +import { BlobStorageService } from '../../../blob_storage_service'; +import { InternalFileShareService } from '../../../file_share_service'; +import { InternalFileService } from '../../../file_service/internal_file_service'; + +describe('When using the FileHashTransform', () => { + let file: IFile; + let fileContent: Readable; + + beforeAll(() => { + setFileKindsRegistry(new FileKindsRegistryImpl()); + getFileKindsRegistry().register({ http: {}, id: 'fileKind' }); + }); + + beforeEach(async () => { + const logger = loggingSystemMock.createLogger(); + const esClient = elasticsearchServiceMock.createInternalClient(); + const soClient = savedObjectsServiceMock.createStartContract().createInternalRepository(); + const fileMetadaClient = new SavedObjectsFileMetadataClient('test', soClient, logger); + const blobStorageService = new BlobStorageService(esClient, logger); + const fileShareService = new InternalFileShareService(soClient); + const fileService = new InternalFileService( + fileMetadaClient, + blobStorageService, + fileShareService, + undefined, + getFileKindsRegistry(), + logger + ); + const fileSO = { attributes: { Status: 'AWAITING_UPLOAD' } }; + + (soClient.create as jest.Mock).mockResolvedValue(fileSO); + (soClient.update as jest.Mock).mockResolvedValue(fileSO); + (soClient.get as jest.Mock).mockResolvedValue({ + attributes: { + created: '2023-04-27T19:57:19.640Z', + Updated: '2023-04-27T19:57:19.640Z', + name: 'test', + Status: 'DONE', + FileKind: 'fileKind', + hash: { + sha256: '9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08', + }, + }, + }); + + file = await fileService.createFile({ name: 'test', fileKind: 'fileKind' }); + fileContent = Readable.from(['test']); + }); + + it('should throw an error if `fileFileHash()` is called prior to processing ending', () => { + const fileHash = createFileHashTransform(); + + expect(() => fileHash.getFileHash()).toThrow('File hash generation not yet complete'); + }); + + it.each([ + ['md5', '098f6bcd4621d373cade4e832627b4f6'], + ['sha1', 'a94a8fe5ccb19ba61c4c0873d391e987982fbbd3'], + ['sha256', '9f86d081884c7d659a2feaa0c55ad015a3bf4f1b2b0b822cd15d6c15b0f00a08'], + [ + 'sha512', + 'ee26b0dd4af7e749aa1a8ee3c10ae9923f618980772e473f8819a5d4940e0db27ac185f8a0e1d5f84f88bc887fd67b143732c304cc5fa9ad8e6f57f50028a8ff', + ], + ] as Array<[SupportedFileHashAlgorithm, string]>)( + 'should generate file hash using algorithm: %s', + async (algorithm, expectedHash) => { + const fileHash = createFileHashTransform(algorithm); + await file.uploadContent(fileContent, undefined, { + transforms: [fileHash], + }); + + expect(fileHash.getFileHash()).toEqual({ algorithm, value: expectedHash }); + } + ); +}); diff --git a/src/plugins/files/server/file_client/stream_transforms/file_hash_transform/file_hash_transform.ts b/src/plugins/files/server/file_client/stream_transforms/file_hash_transform/file_hash_transform.ts new file mode 100644 index 0000000000000..36f01644499c6 --- /dev/null +++ b/src/plugins/files/server/file_client/stream_transforms/file_hash_transform/file_hash_transform.ts @@ -0,0 +1,70 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { Transform, type TransformCallback } from 'stream'; +import { createHash, type Hash } from 'crypto'; +import { SupportedFileHashAlgorithm } from '../../../saved_objects/file'; + +class FileHashTransform extends Transform { + private readonly hash: Hash; + private isFinished = false; + private hashValue: string | undefined = undefined; + + constructor(private readonly algorithm: SupportedFileHashAlgorithm = 'sha256') { + super(); + this.hash = createHash(this.algorithm); + + this.once('finish', () => { + this.isFinished = true; + }); + } + + _transform(chunk: Buffer, _: BufferEncoding, next: TransformCallback) { + if (!Buffer.isBuffer(chunk)) { + throw new Error(`Received a non-buffer chunk. All chunk must be buffers.`); + } + + if (chunk !== null) { + this.hash.update(chunk); + } + + next(null, chunk); + } + + public getFileHash(): { algorithm: SupportedFileHashAlgorithm; value: string } { + if (!this.isFinished) { + throw new Error('File hash generation not yet complete'); + } + + if (!this.hashValue) { + this.hashValue = this.hash.digest('hex'); + } + + return { + algorithm: this.algorithm, + value: this.hashValue, + }; + } +} + +/** + * Creates a `Transform` that will calculate a Hash based on the data provided by a Readable + * @param algorithm + */ +export const createFileHashTransform = ( + algorithm: SupportedFileHashAlgorithm = 'sha256' +): FileHashTransform => { + return new FileHashTransform(algorithm); +}; + +/** + * Type guard to check of a given Transform is a `FileHashTransform` + * @param transform + */ +export const isFileHashTransform = (transform: Transform): transform is FileHashTransform => { + return transform instanceof FileHashTransform; +}; diff --git a/src/plugins/files/server/file_client/stream_transforms/file_hash_transform/index.ts b/src/plugins/files/server/file_client/stream_transforms/file_hash_transform/index.ts new file mode 100644 index 0000000000000..0e6fb7858e40f --- /dev/null +++ b/src/plugins/files/server/file_client/stream_transforms/file_hash_transform/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export { createFileHashTransform } from './file_hash_transform'; diff --git a/src/plugins/files/server/index.ts b/src/plugins/files/server/index.ts index 5fb3a1e7f6c8e..181124fc27496 100755 --- a/src/plugins/files/server/index.ts +++ b/src/plugins/files/server/index.ts @@ -22,6 +22,8 @@ export type { } from './file_client'; export { createEsFileClient } from './file_client'; +export { createFileHashTransform } from './file_client/stream_transforms/file_hash_transform'; + export type { FilesSetup, FilesStart } from './types'; export type { FileShareServiceStart, diff --git a/src/plugins/files/server/saved_objects/file.ts b/src/plugins/files/server/saved_objects/file.ts index 9997b665682d8..f00946aadc05c 100644 --- a/src/plugins/files/server/saved_objects/file.ts +++ b/src/plugins/files/server/saved_objects/file.ts @@ -6,15 +6,22 @@ * Side Public License, v 1. */ -import { SavedObjectsType, SavedObjectsFieldMapping } from '@kbn/core/server'; -import { FILE_SO_TYPE } from '../../common'; +import { SavedObjectsFieldMapping, SavedObjectsType } from '@kbn/core/server'; import type { FileMetadata } from '../../common'; +import { BaseFileMetadata, FILE_SO_TYPE } from '../../common'; type Properties = Record< - keyof Omit, + keyof Omit, SavedObjectsFieldMapping >; +export type SupportedFileHashAlgorithm = keyof Pick< + Required['hash']>, + 'md5' | 'sha1' | 'sha256' | 'sha512' +>; + +export type FileHashObj = Partial>; + const properties: Properties = { created: { type: 'date', @@ -46,6 +53,10 @@ const properties: Properties = { FileKind: { type: 'keyword', }, + hash: { + dynamic: false, + properties: {}, + }, }; export const fileObjectType: SavedObjectsType = { diff --git a/src/plugins/files/tsconfig.json b/src/plugins/files/tsconfig.json index ffeed3f22d46a..12cdb22ef0f79 100644 --- a/src/plugins/files/tsconfig.json +++ b/src/plugins/files/tsconfig.json @@ -29,6 +29,8 @@ "@kbn/ecs", "@kbn/safer-lodash-set", "@kbn/logging-mocks", + "@kbn/core-elasticsearch-server-mocks", + "@kbn/core-saved-objects-server-mocks", ], "exclude": [ "target/**/*", diff --git a/src/plugins/unified_histogram/public/chart/chart.tsx b/src/plugins/unified_histogram/public/chart/chart.tsx index 3c959776df2a5..1e24de48f55d6 100644 --- a/src/plugins/unified_histogram/public/chart/chart.tsx +++ b/src/plugins/unified_histogram/public/chart/chart.tsx @@ -192,7 +192,7 @@ export function Chart({ chartToolButtonCss, } = useChartStyles(chartVisible); - const lensAttributes = useMemo( + const lensAttributesContext = useMemo( () => getLensAttributes({ title: chart?.title, @@ -218,7 +218,7 @@ export function Chart({ services, dataView, relativeTimeRange: originalRelativeTimeRange ?? relativeTimeRange, - lensAttributes, + lensAttributes: lensAttributesContext.attributes, }); return ( @@ -340,7 +340,7 @@ export function Chart({ chart={chart} getTimeRange={getTimeRange} refetch$={refetch$} - lensAttributes={lensAttributes} + lensAttributesContext={lensAttributesContext} isPlainRecord={isPlainRecord} disableTriggers={disableTriggers} disabledActions={disabledActions} diff --git a/src/plugins/unified_histogram/public/chart/histogram.test.tsx b/src/plugins/unified_histogram/public/chart/histogram.test.tsx index 4699c78edff81..314898daa88f3 100644 --- a/src/plugins/unified_histogram/public/chart/histogram.test.tsx +++ b/src/plugins/unified_histogram/public/chart/histogram.test.tsx @@ -66,7 +66,7 @@ function mountComponent() { to: '2020-05-14T11:20:13.590', }), refetch$, - lensAttributes: getMockLensAttributes(), + lensAttributesContext: getMockLensAttributes(), onTotalHitsChange: jest.fn(), onChartLoad: jest.fn(), }; @@ -91,7 +91,7 @@ describe('Histogram', () => { const originalProps = getLensProps({ searchSessionId: props.request.searchSessionId, getTimeRange: props.getTimeRange, - attributes: getMockLensAttributes(), + attributes: getMockLensAttributes().attributes, onLoad: lensProps.onLoad, }); expect(lensProps).toEqual(originalProps); diff --git a/src/plugins/unified_histogram/public/chart/histogram.tsx b/src/plugins/unified_histogram/public/chart/histogram.tsx index d3bb87a2c3f10..61320c627bb13 100644 --- a/src/plugins/unified_histogram/public/chart/histogram.tsx +++ b/src/plugins/unified_histogram/public/chart/histogram.tsx @@ -14,7 +14,7 @@ import type { DefaultInspectorAdapters } from '@kbn/expressions-plugin/common'; import type { IKibanaSearchResponse } from '@kbn/data-plugin/public'; import type { estypes } from '@elastic/elasticsearch'; import type { TimeRange } from '@kbn/es-query'; -import type { LensEmbeddableInput, TypedLensByValueInput } from '@kbn/lens-plugin/public'; +import type { LensEmbeddableInput } from '@kbn/lens-plugin/public'; import { RequestStatus } from '@kbn/inspector-plugin/public'; import type { Observable } from 'rxjs'; import { @@ -31,6 +31,7 @@ import { buildBucketInterval } from './utils/build_bucket_interval'; import { useTimeRange } from './hooks/use_time_range'; import { useStableCallback } from './hooks/use_stable_callback'; import { useLensProps } from './hooks/use_lens_props'; +import type { LensAttributesContext } from './utils/get_lens_attributes'; export interface HistogramProps { services: UnifiedHistogramServices; @@ -41,7 +42,7 @@ export interface HistogramProps { isPlainRecord?: boolean; getTimeRange: () => TimeRange; refetch$: Observable; - lensAttributes: TypedLensByValueInput['attributes']; + lensAttributesContext: LensAttributesContext; disableTriggers?: LensEmbeddableInput['disableTriggers']; disabledActions?: LensEmbeddableInput['disabledActions']; onTotalHitsChange?: (status: UnifiedHistogramFetchStatus, result?: number | Error) => void; @@ -59,7 +60,7 @@ export function Histogram({ isPlainRecord, getTimeRange, refetch$, - lensAttributes: attributes, + lensAttributesContext: attributesContext, disableTriggers, disabledActions, onTotalHitsChange, @@ -78,6 +79,8 @@ export function Histogram({ }); const chartRef = useRef(null); const { height: containerHeight, width: containerWidth } = useResizeObserver(chartRef.current); + const { attributes } = attributesContext; + useEffect(() => { if (attributes.visualizationType === 'lnsMetric') { const size = containerHeight < containerWidth ? containerHeight : containerWidth; @@ -131,11 +134,11 @@ export function Histogram({ } ); - const lensProps = useLensProps({ + const { lensProps, requestData } = useLensProps({ request, getTimeRange, refetch$, - attributes, + attributesContext, onLoad, }); @@ -172,6 +175,7 @@ export function Histogram({
diff --git a/src/plugins/unified_histogram/public/chart/hooks/use_lens_props.test.ts b/src/plugins/unified_histogram/public/chart/hooks/use_lens_props.test.ts index 8d13ec7eb8102..36b4e5c8f4e4d 100644 --- a/src/plugins/unified_histogram/public/chart/hooks/use_lens_props.test.ts +++ b/src/plugins/unified_histogram/public/chart/hooks/use_lens_props.test.ts @@ -20,7 +20,7 @@ describe('useLensProps', () => { const getTimeRange = jest.fn(); const refetch$ = new Subject(); const onLoad = jest.fn(); - const attributes = getLensAttributes({ + const attributesContext = getLensAttributes({ title: 'test', filters: [], query: { @@ -40,15 +40,15 @@ describe('useLensProps', () => { }, getTimeRange, refetch$, - attributes, + attributesContext, onLoad, }); }); - expect(lensProps.result.current).toEqual( + expect(lensProps.result.current.lensProps).toEqual( getLensProps({ searchSessionId: 'id', getTimeRange, - attributes, + attributes: attributesContext.attributes, onLoad, }) ); @@ -58,7 +58,7 @@ describe('useLensProps', () => { const getTimeRange = jest.fn(); const refetch$ = new Subject(); const onLoad = jest.fn(); - const attributes = getLensAttributes({ + const attributesContext = getLensAttributes({ title: 'test', filters: [], query: { @@ -78,15 +78,15 @@ describe('useLensProps', () => { }, getTimeRange, refetch$, - attributes, + attributesContext, onLoad, }); }); - expect(lensProps.result.current).toEqual( + expect(lensProps.result.current.lensProps).toEqual( getLensProps({ searchSessionId: 'id', getTimeRange, - attributes, + attributes: attributesContext.attributes, onLoad, }) ); @@ -103,7 +103,7 @@ describe('useLensProps', () => { }, getTimeRange, refetch$, - attributes: getLensAttributes({ + attributesContext: getLensAttributes({ title: 'test', filters: [], query: { diff --git a/src/plugins/unified_histogram/public/chart/hooks/use_lens_props.ts b/src/plugins/unified_histogram/public/chart/hooks/use_lens_props.ts index cea2f28521efd..29827a46dd705 100644 --- a/src/plugins/unified_histogram/public/chart/hooks/use_lens_props.ts +++ b/src/plugins/unified_histogram/public/chart/hooks/use_lens_props.ts @@ -13,41 +13,44 @@ import type { TypedLensByValueInput } from '@kbn/lens-plugin/public'; import { useCallback, useEffect, useState } from 'react'; import type { Observable } from 'rxjs'; import type { UnifiedHistogramInputMessage, UnifiedHistogramRequestContext } from '../../types'; +import type { LensAttributesContext } from '../utils/get_lens_attributes'; import { useStableCallback } from './use_stable_callback'; export const useLensProps = ({ request, getTimeRange, refetch$, - attributes, + attributesContext, onLoad, }: { request?: UnifiedHistogramRequestContext; getTimeRange: () => TimeRange; refetch$: Observable; - attributes: TypedLensByValueInput['attributes']; + attributesContext: LensAttributesContext; onLoad: (isLoading: boolean, adapters: Partial | undefined) => void; }) => { - const buildLensProps = useCallback( - () => - getLensProps({ + const buildLensProps = useCallback(() => { + const { attributes, requestData } = attributesContext; + return { + requestData: JSON.stringify(requestData), + lensProps: getLensProps({ searchSessionId: request?.searchSessionId, getTimeRange, attributes, onLoad, }), - [attributes, getTimeRange, onLoad, request?.searchSessionId] - ); + }; + }, [attributesContext, getTimeRange, onLoad, request?.searchSessionId]); - const [lensProps, setLensProps] = useState(buildLensProps()); - const updateLensProps = useStableCallback(() => setLensProps(buildLensProps())); + const [lensPropsContext, setLensPropsContext] = useState(buildLensProps()); + const updateLensPropsContext = useStableCallback(() => setLensPropsContext(buildLensProps())); useEffect(() => { - const subscription = refetch$.subscribe(updateLensProps); + const subscription = refetch$.subscribe(updateLensPropsContext); return () => subscription.unsubscribe(); - }, [refetch$, updateLensProps]); + }, [refetch$, updateLensPropsContext]); - return lensProps; + return lensPropsContext; }; export const getLensProps = ({ diff --git a/src/plugins/unified_histogram/public/chart/utils/get_lens_attributes.test.ts b/src/plugins/unified_histogram/public/chart/utils/get_lens_attributes.test.ts index 9bb8707e6d7c2..e95c5ad41d44a 100644 --- a/src/plugins/unified_histogram/public/chart/utils/get_lens_attributes.test.ts +++ b/src/plugins/unified_histogram/public/chart/utils/get_lens_attributes.test.ts @@ -57,134 +57,142 @@ describe('getLensAttributes', () => { }) ).toMatchInlineSnapshot(` Object { - "references": Array [ - Object { - "id": "index-pattern-with-timefield-id", - "name": "indexpattern-datasource-current-indexpattern", - "type": "index-pattern", - }, - Object { - "id": "index-pattern-with-timefield-id", - "name": "indexpattern-datasource-layer-unifiedHistogram", - "type": "index-pattern", - }, - ], - "state": Object { - "datasourceStates": Object { - "formBased": Object { - "layers": Object { - "unifiedHistogram": Object { - "columnOrder": Array [ - "date_column", - "count_column", - ], - "columns": Object { - "count_column": Object { - "dataType": "number", - "isBucketed": false, - "label": "Count of records", - "operationType": "count", - "params": Object { - "format": Object { - "id": "number", - "params": Object { - "decimals": 0, + "attributes": Object { + "references": Array [ + Object { + "id": "index-pattern-with-timefield-id", + "name": "indexpattern-datasource-current-indexpattern", + "type": "index-pattern", + }, + Object { + "id": "index-pattern-with-timefield-id", + "name": "indexpattern-datasource-layer-unifiedHistogram", + "type": "index-pattern", + }, + ], + "state": Object { + "datasourceStates": Object { + "formBased": Object { + "layers": Object { + "unifiedHistogram": Object { + "columnOrder": Array [ + "date_column", + "count_column", + ], + "columns": Object { + "count_column": Object { + "dataType": "number", + "isBucketed": false, + "label": "Count of records", + "operationType": "count", + "params": Object { + "format": Object { + "id": "number", + "params": Object { + "decimals": 0, + }, }, }, + "scale": "ratio", + "sourceField": "___records___", }, - "scale": "ratio", - "sourceField": "___records___", - }, - "date_column": Object { - "dataType": "date", - "isBucketed": true, - "label": "timestamp", - "operationType": "date_histogram", - "params": Object { - "interval": "auto", + "date_column": Object { + "dataType": "date", + "isBucketed": true, + "label": "timestamp", + "operationType": "date_histogram", + "params": Object { + "interval": "auto", + }, + "scale": "interval", + "sourceField": "timestamp", }, - "scale": "interval", - "sourceField": "timestamp", }, }, }, }, }, - }, - "filters": Array [ - Object { - "$state": Object { - "store": "appState", - }, - "meta": Object { - "alias": null, - "disabled": false, - "index": "index-pattern-with-timefield-id", - "key": "extension", - "negate": false, - "params": Object { - "query": "js", + "filters": Array [ + Object { + "$state": Object { + "store": "appState", }, - "type": "phrase", - }, - "query": Object { - "match": Object { - "extension": Object { + "meta": Object { + "alias": null, + "disabled": false, + "index": "index-pattern-with-timefield-id", + "key": "extension", + "negate": false, + "params": Object { "query": "js", - "type": "phrase", }, + "type": "phrase", }, - }, - }, - ], - "query": Object { - "language": "kuery", - "query": "extension : css", - }, - "visualization": Object { - "axisTitlesVisibilitySettings": Object { - "x": false, - "yLeft": false, - "yRight": false, - }, - "fittingFunction": "None", - "gridlinesVisibilitySettings": Object { - "x": true, - "yLeft": true, - "yRight": false, - }, - "layers": Array [ - Object { - "accessors": Array [ - "count_column", - ], - "layerId": "unifiedHistogram", - "layerType": "data", - "seriesType": "bar_stacked", - "xAccessor": "date_column", - "yConfig": Array [ - Object { - "forAccessor": "count_column", + "query": Object { + "match": Object { + "extension": Object { + "query": "js", + "type": "phrase", + }, }, - ], + }, }, ], - "legend": Object { - "isVisible": true, - "position": "right", + "query": Object { + "language": "kuery", + "query": "extension : css", }, - "preferredSeriesType": "bar_stacked", - "showCurrentTimeMarker": true, - "tickLabelsVisibilitySettings": Object { - "x": true, - "yLeft": true, - "yRight": false, + "visualization": Object { + "axisTitlesVisibilitySettings": Object { + "x": false, + "yLeft": false, + "yRight": false, + }, + "fittingFunction": "None", + "gridlinesVisibilitySettings": Object { + "x": true, + "yLeft": true, + "yRight": false, + }, + "layers": Array [ + Object { + "accessors": Array [ + "count_column", + ], + "layerId": "unifiedHistogram", + "layerType": "data", + "seriesType": "bar_stacked", + "xAccessor": "date_column", + "yConfig": Array [ + Object { + "forAccessor": "count_column", + }, + ], + }, + ], + "legend": Object { + "isVisible": true, + "position": "right", + }, + "preferredSeriesType": "bar_stacked", + "showCurrentTimeMarker": true, + "tickLabelsVisibilitySettings": Object { + "x": true, + "yLeft": true, + "yRight": false, + }, + "valueLabels": "hide", }, - "valueLabels": "hide", }, + "title": "test", + "visualizationType": "lnsXY", + }, + "requestData": Object { + "breakdownField": undefined, + "dataViewId": "index-pattern-with-timefield-id", + "timeField": "timestamp", + "timeInterval": "auto", }, - "title": "test", - "visualizationType": "lnsXY", } `); }); @@ -205,152 +213,160 @@ describe('getLensAttributes', () => { }) ).toMatchInlineSnapshot(` Object { - "references": Array [ - Object { - "id": "index-pattern-with-timefield-id", - "name": "indexpattern-datasource-current-indexpattern", - "type": "index-pattern", - }, - Object { - "id": "index-pattern-with-timefield-id", - "name": "indexpattern-datasource-layer-unifiedHistogram", - "type": "index-pattern", - }, - ], - "state": Object { - "datasourceStates": Object { - "formBased": Object { - "layers": Object { - "unifiedHistogram": Object { - "columnOrder": Array [ - "breakdown_column", - "date_column", - "count_column", - ], - "columns": Object { - "breakdown_column": Object { - "dataType": "string", - "isBucketed": true, - "label": "Top 3 values of extension", - "operationType": "terms", - "params": Object { - "missingBucket": false, - "orderBy": Object { - "columnId": "count_column", - "type": "column", - }, - "orderDirection": "desc", - "otherBucket": true, - "parentFormat": Object { - "id": "terms", + "attributes": Object { + "references": Array [ + Object { + "id": "index-pattern-with-timefield-id", + "name": "indexpattern-datasource-current-indexpattern", + "type": "index-pattern", + }, + Object { + "id": "index-pattern-with-timefield-id", + "name": "indexpattern-datasource-layer-unifiedHistogram", + "type": "index-pattern", + }, + ], + "state": Object { + "datasourceStates": Object { + "formBased": Object { + "layers": Object { + "unifiedHistogram": Object { + "columnOrder": Array [ + "breakdown_column", + "date_column", + "count_column", + ], + "columns": Object { + "breakdown_column": Object { + "dataType": "string", + "isBucketed": true, + "label": "Top 3 values of extension", + "operationType": "terms", + "params": Object { + "missingBucket": false, + "orderBy": Object { + "columnId": "count_column", + "type": "column", + }, + "orderDirection": "desc", + "otherBucket": true, + "parentFormat": Object { + "id": "terms", + }, + "size": 3, }, - "size": 3, + "scale": "ordinal", + "sourceField": "extension", }, - "scale": "ordinal", - "sourceField": "extension", - }, - "count_column": Object { - "dataType": "number", - "isBucketed": false, - "label": "Count of records", - "operationType": "count", - "params": Object { - "format": Object { - "id": "number", - "params": Object { - "decimals": 0, + "count_column": Object { + "dataType": "number", + "isBucketed": false, + "label": "Count of records", + "operationType": "count", + "params": Object { + "format": Object { + "id": "number", + "params": Object { + "decimals": 0, + }, }, }, + "scale": "ratio", + "sourceField": "___records___", }, - "scale": "ratio", - "sourceField": "___records___", - }, - "date_column": Object { - "dataType": "date", - "isBucketed": true, - "label": "timestamp", - "operationType": "date_histogram", - "params": Object { - "interval": "auto", + "date_column": Object { + "dataType": "date", + "isBucketed": true, + "label": "timestamp", + "operationType": "date_histogram", + "params": Object { + "interval": "auto", + }, + "scale": "interval", + "sourceField": "timestamp", }, - "scale": "interval", - "sourceField": "timestamp", }, }, }, }, }, - }, - "filters": Array [ - Object { - "$state": Object { - "store": "appState", - }, - "meta": Object { - "alias": null, - "disabled": false, - "index": "index-pattern-with-timefield-id", - "key": "extension", - "negate": false, - "params": Object { - "query": "js", + "filters": Array [ + Object { + "$state": Object { + "store": "appState", }, - "type": "phrase", - }, - "query": Object { - "match": Object { - "extension": Object { + "meta": Object { + "alias": null, + "disabled": false, + "index": "index-pattern-with-timefield-id", + "key": "extension", + "negate": false, + "params": Object { "query": "js", - "type": "phrase", + }, + "type": "phrase", + }, + "query": Object { + "match": Object { + "extension": Object { + "query": "js", + "type": "phrase", + }, }, }, - }, - }, - ], - "query": Object { - "language": "kuery", - "query": "extension : css", - }, - "visualization": Object { - "axisTitlesVisibilitySettings": Object { - "x": false, - "yLeft": false, - "yRight": false, - }, - "fittingFunction": "None", - "gridlinesVisibilitySettings": Object { - "x": true, - "yLeft": true, - "yRight": false, - }, - "layers": Array [ - Object { - "accessors": Array [ - "count_column", - ], - "layerId": "unifiedHistogram", - "layerType": "data", - "seriesType": "bar_stacked", - "splitAccessor": "breakdown_column", - "xAccessor": "date_column", }, ], - "legend": Object { - "isVisible": true, - "position": "right", + "query": Object { + "language": "kuery", + "query": "extension : css", }, - "preferredSeriesType": "bar_stacked", - "showCurrentTimeMarker": true, - "tickLabelsVisibilitySettings": Object { - "x": true, - "yLeft": true, - "yRight": false, + "visualization": Object { + "axisTitlesVisibilitySettings": Object { + "x": false, + "yLeft": false, + "yRight": false, + }, + "fittingFunction": "None", + "gridlinesVisibilitySettings": Object { + "x": true, + "yLeft": true, + "yRight": false, + }, + "layers": Array [ + Object { + "accessors": Array [ + "count_column", + ], + "layerId": "unifiedHistogram", + "layerType": "data", + "seriesType": "bar_stacked", + "splitAccessor": "breakdown_column", + "xAccessor": "date_column", + }, + ], + "legend": Object { + "isVisible": true, + "position": "right", + }, + "preferredSeriesType": "bar_stacked", + "showCurrentTimeMarker": true, + "tickLabelsVisibilitySettings": Object { + "x": true, + "yLeft": true, + "yRight": false, + }, + "valueLabels": "hide", }, - "valueLabels": "hide", }, + "title": "test", + "visualizationType": "lnsXY", + }, + "requestData": Object { + "breakdownField": "extension", + "dataViewId": "index-pattern-with-timefield-id", + "timeField": "timestamp", + "timeInterval": "auto", }, - "title": "test", - "visualizationType": "lnsXY", } `); }); @@ -371,134 +387,142 @@ describe('getLensAttributes', () => { }) ).toMatchInlineSnapshot(` Object { - "references": Array [ - Object { - "id": "index-pattern-with-timefield-id", - "name": "indexpattern-datasource-current-indexpattern", - "type": "index-pattern", - }, - Object { - "id": "index-pattern-with-timefield-id", - "name": "indexpattern-datasource-layer-unifiedHistogram", - "type": "index-pattern", - }, - ], - "state": Object { - "datasourceStates": Object { - "formBased": Object { - "layers": Object { - "unifiedHistogram": Object { - "columnOrder": Array [ - "date_column", - "count_column", - ], - "columns": Object { - "count_column": Object { - "dataType": "number", - "isBucketed": false, - "label": "Count of records", - "operationType": "count", - "params": Object { - "format": Object { - "id": "number", - "params": Object { - "decimals": 0, + "attributes": Object { + "references": Array [ + Object { + "id": "index-pattern-with-timefield-id", + "name": "indexpattern-datasource-current-indexpattern", + "type": "index-pattern", + }, + Object { + "id": "index-pattern-with-timefield-id", + "name": "indexpattern-datasource-layer-unifiedHistogram", + "type": "index-pattern", + }, + ], + "state": Object { + "datasourceStates": Object { + "formBased": Object { + "layers": Object { + "unifiedHistogram": Object { + "columnOrder": Array [ + "date_column", + "count_column", + ], + "columns": Object { + "count_column": Object { + "dataType": "number", + "isBucketed": false, + "label": "Count of records", + "operationType": "count", + "params": Object { + "format": Object { + "id": "number", + "params": Object { + "decimals": 0, + }, }, }, + "scale": "ratio", + "sourceField": "___records___", }, - "scale": "ratio", - "sourceField": "___records___", - }, - "date_column": Object { - "dataType": "date", - "isBucketed": true, - "label": "timestamp", - "operationType": "date_histogram", - "params": Object { - "interval": "auto", + "date_column": Object { + "dataType": "date", + "isBucketed": true, + "label": "timestamp", + "operationType": "date_histogram", + "params": Object { + "interval": "auto", + }, + "scale": "interval", + "sourceField": "timestamp", }, - "scale": "interval", - "sourceField": "timestamp", }, }, }, }, }, - }, - "filters": Array [ - Object { - "$state": Object { - "store": "appState", - }, - "meta": Object { - "alias": null, - "disabled": false, - "index": "index-pattern-with-timefield-id", - "key": "extension", - "negate": false, - "params": Object { - "query": "js", + "filters": Array [ + Object { + "$state": Object { + "store": "appState", }, - "type": "phrase", - }, - "query": Object { - "match": Object { - "extension": Object { + "meta": Object { + "alias": null, + "disabled": false, + "index": "index-pattern-with-timefield-id", + "key": "extension", + "negate": false, + "params": Object { "query": "js", - "type": "phrase", }, + "type": "phrase", }, - }, - }, - ], - "query": Object { - "language": "kuery", - "query": "extension : css", - }, - "visualization": Object { - "axisTitlesVisibilitySettings": Object { - "x": false, - "yLeft": false, - "yRight": false, - }, - "fittingFunction": "None", - "gridlinesVisibilitySettings": Object { - "x": true, - "yLeft": true, - "yRight": false, - }, - "layers": Array [ - Object { - "accessors": Array [ - "count_column", - ], - "layerId": "unifiedHistogram", - "layerType": "data", - "seriesType": "bar_stacked", - "xAccessor": "date_column", - "yConfig": Array [ - Object { - "forAccessor": "count_column", + "query": Object { + "match": Object { + "extension": Object { + "query": "js", + "type": "phrase", + }, }, - ], + }, }, ], - "legend": Object { - "isVisible": true, - "position": "right", + "query": Object { + "language": "kuery", + "query": "extension : css", }, - "preferredSeriesType": "bar_stacked", - "showCurrentTimeMarker": true, - "tickLabelsVisibilitySettings": Object { - "x": true, - "yLeft": true, - "yRight": false, + "visualization": Object { + "axisTitlesVisibilitySettings": Object { + "x": false, + "yLeft": false, + "yRight": false, + }, + "fittingFunction": "None", + "gridlinesVisibilitySettings": Object { + "x": true, + "yLeft": true, + "yRight": false, + }, + "layers": Array [ + Object { + "accessors": Array [ + "count_column", + ], + "layerId": "unifiedHistogram", + "layerType": "data", + "seriesType": "bar_stacked", + "xAccessor": "date_column", + "yConfig": Array [ + Object { + "forAccessor": "count_column", + }, + ], + }, + ], + "legend": Object { + "isVisible": true, + "position": "right", + }, + "preferredSeriesType": "bar_stacked", + "showCurrentTimeMarker": true, + "tickLabelsVisibilitySettings": Object { + "x": true, + "yLeft": true, + "yRight": false, + }, + "valueLabels": "hide", }, - "valueLabels": "hide", }, + "title": "test", + "visualizationType": "lnsXY", + }, + "requestData": Object { + "breakdownField": "scripted", + "dataViewId": "index-pattern-with-timefield-id", + "timeField": "timestamp", + "timeInterval": "auto", }, - "title": "test", - "visualizationType": "lnsXY", } `); }); @@ -516,194 +540,202 @@ describe('getLensAttributes', () => { }) ).toMatchInlineSnapshot(` Object { - "references": Array [ - Object { - "id": "index-pattern-with-timefield-id", - "name": "indexpattern-datasource-current-indexpattern", - "type": "index-pattern", - }, - Object { - "id": "index-pattern-with-timefield-id", - "name": "indexpattern-datasource-layer-unifiedHistogram", - "type": "index-pattern", - }, - ], - "state": Object { - "datasourceStates": Object { - "textBased": Object { - "fieldList": Array [], - "indexPatternRefs": Array [], - "initialContext": Object { - "contextualFields": Array [ - "Dest", - "AvgTicketPrice", - ], - "dataViewSpec": Object { - "allowNoIndex": false, - "fields": Object { - "AvgTicketPrice": Object { - "aggregatable": true, - "count": 0, - "esTypes": Array [ - "float", - ], - "format": Object { - "id": "number", - "params": Object { - "pattern": "$0,0.[00]", + "attributes": Object { + "references": Array [ + Object { + "id": "index-pattern-with-timefield-id", + "name": "indexpattern-datasource-current-indexpattern", + "type": "index-pattern", + }, + Object { + "id": "index-pattern-with-timefield-id", + "name": "indexpattern-datasource-layer-unifiedHistogram", + "type": "index-pattern", + }, + ], + "state": Object { + "datasourceStates": Object { + "textBased": Object { + "fieldList": Array [], + "indexPatternRefs": Array [], + "initialContext": Object { + "contextualFields": Array [ + "Dest", + "AvgTicketPrice", + ], + "dataViewSpec": Object { + "allowNoIndex": false, + "fields": Object { + "AvgTicketPrice": Object { + "aggregatable": true, + "count": 0, + "esTypes": Array [ + "float", + ], + "format": Object { + "id": "number", + "params": Object { + "pattern": "$0,0.[00]", + }, }, + "isMapped": true, + "name": "AvgTicketPrice", + "readFromDocValues": true, + "scripted": false, + "searchable": true, + "shortDotsEnable": false, + "type": "number", }, - "isMapped": true, - "name": "AvgTicketPrice", - "readFromDocValues": true, - "scripted": false, - "searchable": true, - "shortDotsEnable": false, - "type": "number", - }, - "Dest": Object { - "aggregatable": true, - "count": 0, - "esTypes": Array [ - "keyword", - ], - "format": Object { - "id": "string", + "Dest": Object { + "aggregatable": true, + "count": 0, + "esTypes": Array [ + "keyword", + ], + "format": Object { + "id": "string", + }, + "isMapped": true, + "name": "Dest", + "readFromDocValues": true, + "scripted": false, + "searchable": true, + "shortDotsEnable": false, + "type": "string", }, - "isMapped": true, - "name": "Dest", - "readFromDocValues": true, - "scripted": false, - "searchable": true, - "shortDotsEnable": false, - "type": "string", - }, - "timestamp": Object { - "aggregatable": true, - "count": 0, - "esTypes": Array [ - "date", - ], - "format": Object { - "id": "date", + "timestamp": Object { + "aggregatable": true, + "count": 0, + "esTypes": Array [ + "date", + ], + "format": Object { + "id": "date", + }, + "isMapped": true, + "name": "timestamp", + "readFromDocValues": true, + "scripted": false, + "searchable": true, + "shortDotsEnable": false, + "type": "date", }, - "isMapped": true, - "name": "timestamp", - "readFromDocValues": true, - "scripted": false, - "searchable": true, - "shortDotsEnable": false, - "type": "date", }, + "id": "d3d7af60-4c81-11e8-b3d7-01146121b73d", + "name": "Kibana Sample Data Flights", + "sourceFilters": Array [], + "timeFieldName": "timestamp", + "title": "kibana_sample_data_flights", + "version": "WzM1ODA3LDFd", + }, + "fieldName": "", + "query": Object { + "sql": "SELECT Dest, AvgTicketPrice FROM \\"kibana_sample_data_flights\\"", }, - "id": "d3d7af60-4c81-11e8-b3d7-01146121b73d", - "name": "Kibana Sample Data Flights", - "sourceFilters": Array [], - "timeFieldName": "timestamp", - "title": "kibana_sample_data_flights", - "version": "WzM1ODA3LDFd", - }, - "fieldName": "", - "query": Object { - "sql": "SELECT Dest, AvgTicketPrice FROM \\"kibana_sample_data_flights\\"", }, - }, - "layers": Object { - "46aa21fa-b747-4543-bf90-0b40007c546d": Object { - "allColumns": Array [ - Object { - "columnId": "81e332d6-ee37-42a8-a646-cea4fc75d2d3", - "fieldName": "Dest", - "meta": Object { - "type": "string", + "layers": Object { + "46aa21fa-b747-4543-bf90-0b40007c546d": Object { + "allColumns": Array [ + Object { + "columnId": "81e332d6-ee37-42a8-a646-cea4fc75d2d3", + "fieldName": "Dest", + "meta": Object { + "type": "string", + }, }, - }, - Object { - "columnId": "5b9b8b76-0836-4a12-b9c0-980c9900502f", - "fieldName": "AvgTicketPrice", - "meta": Object { - "type": "number", + Object { + "columnId": "5b9b8b76-0836-4a12-b9c0-980c9900502f", + "fieldName": "AvgTicketPrice", + "meta": Object { + "type": "number", + }, }, - }, - ], - "columns": Array [ - Object { - "columnId": "81e332d6-ee37-42a8-a646-cea4fc75d2d3", - "fieldName": "Dest", - "meta": Object { - "type": "string", + ], + "columns": Array [ + Object { + "columnId": "81e332d6-ee37-42a8-a646-cea4fc75d2d3", + "fieldName": "Dest", + "meta": Object { + "type": "string", + }, }, - }, - Object { - "columnId": "5b9b8b76-0836-4a12-b9c0-980c9900502f", - "fieldName": "AvgTicketPrice", - "meta": Object { - "type": "number", + Object { + "columnId": "5b9b8b76-0836-4a12-b9c0-980c9900502f", + "fieldName": "AvgTicketPrice", + "meta": Object { + "type": "number", + }, }, + ], + "index": "d3d7af60-4c81-11e8-b3d7-01146121b73d", + "query": Object { + "sql": "SELECT Dest, AvgTicketPrice FROM \\"kibana_sample_data_flights\\"", }, - ], - "index": "d3d7af60-4c81-11e8-b3d7-01146121b73d", - "query": Object { - "sql": "SELECT Dest, AvgTicketPrice FROM \\"kibana_sample_data_flights\\"", + "timeField": "timestamp", }, - "timeField": "timestamp", }, }, }, - }, - "filters": Array [ - Object { - "$state": Object { - "store": "appState", - }, - "meta": Object { - "alias": null, - "disabled": false, - "index": "index-pattern-with-timefield-id", - "key": "extension", - "negate": false, - "params": Object { - "query": "js", + "filters": Array [ + Object { + "$state": Object { + "store": "appState", }, - "type": "phrase", - }, - "query": Object { - "match": Object { - "extension": Object { + "meta": Object { + "alias": null, + "disabled": false, + "index": "index-pattern-with-timefield-id", + "key": "extension", + "negate": false, + "params": Object { "query": "js", - "type": "phrase", + }, + "type": "phrase", + }, + "query": Object { + "match": Object { + "extension": Object { + "query": "js", + "type": "phrase", + }, }, }, }, + ], + "query": Object { + "language": "kuery", + "query": "extension : css", }, - ], - "query": Object { - "language": "kuery", - "query": "extension : css", - }, - "visualization": Object { - "gridConfig": Object { - "isCellLabelVisible": false, - "isXAxisLabelVisible": true, - "isXAxisTitleVisible": false, - "isYAxisLabelVisible": true, - "isYAxisTitleVisible": false, - "type": "heatmap_grid", - }, - "layerId": "46aa21fa-b747-4543-bf90-0b40007c546d", - "layerType": "data", - "legend": Object { - "isVisible": true, - "position": "right", - "type": "heatmap_legend", + "visualization": Object { + "gridConfig": Object { + "isCellLabelVisible": false, + "isXAxisLabelVisible": true, + "isXAxisTitleVisible": false, + "isYAxisLabelVisible": true, + "isYAxisTitleVisible": false, + "type": "heatmap_grid", + }, + "layerId": "46aa21fa-b747-4543-bf90-0b40007c546d", + "layerType": "data", + "legend": Object { + "isVisible": true, + "position": "right", + "type": "heatmap_legend", + }, + "shape": "heatmap", + "valueAccessor": "5b9b8b76-0836-4a12-b9c0-980c9900502f", + "xAccessor": "81e332d6-ee37-42a8-a646-cea4fc75d2d3", }, - "shape": "heatmap", - "valueAccessor": "5b9b8b76-0836-4a12-b9c0-980c9900502f", - "xAccessor": "81e332d6-ee37-42a8-a646-cea4fc75d2d3", }, + "title": "test", + "visualizationType": "lnsHeatmap", + }, + "requestData": Object { + "breakdownField": undefined, + "dataViewId": "index-pattern-with-timefield-id", + "timeField": "timestamp", + "timeInterval": "auto", }, - "title": "test", - "visualizationType": "lnsHeatmap", } `); }); diff --git a/src/plugins/unified_histogram/public/chart/utils/get_lens_attributes.ts b/src/plugins/unified_histogram/public/chart/utils/get_lens_attributes.ts index 5f6b8214e5863..ecf67b80731fd 100644 --- a/src/plugins/unified_histogram/public/chart/utils/get_lens_attributes.ts +++ b/src/plugins/unified_histogram/public/chart/utils/get_lens_attributes.ts @@ -19,6 +19,18 @@ import type { } from '@kbn/lens-plugin/public'; import { fieldSupportsBreakdown } from './field_supports_breakdown'; +export interface LensRequestData { + dataViewId?: string; + timeField?: string; + timeInterval?: string; + breakdownField?: string; +} + +export interface LensAttributesContext { + attributes: TypedLensByValueInput['attributes']; + requestData: LensRequestData; +} + export const getLensAttributes = ({ title, filters, @@ -35,7 +47,7 @@ export const getLensAttributes = ({ timeInterval: string | undefined; breakdownField: DataViewField | undefined; suggestion: Suggestion | undefined; -}) => { +}): LensAttributesContext => { const showBreakdown = breakdownField && fieldSupportsBreakdown(breakdownField); let columnOrder = ['date_column', 'count_column']; @@ -169,8 +181,7 @@ export const getLensAttributes = ({ yRight: false, }, }; - - return { + const attributes = { title: title ?? i18n.translate('unifiedHistogram.lensTitle', { @@ -196,4 +207,14 @@ export const getLensAttributes = ({ }, visualizationType: suggestion ? suggestion.visualizationId : 'lnsXY', } as TypedLensByValueInput['attributes']; + + return { + attributes, + requestData: { + dataViewId: dataView.id, + timeField: dataView.timeFieldName, + timeInterval, + breakdownField: breakdownField?.name, + }, + }; }; diff --git a/src/plugins/visualization_ui_components/.i18nrc.json b/src/plugins/visualization_ui_components/.i18nrc.json new file mode 100755 index 0000000000000..8ec382bca5a93 --- /dev/null +++ b/src/plugins/visualization_ui_components/.i18nrc.json @@ -0,0 +1,6 @@ +{ + "prefix": "visualizationUiComponents", + "paths": { + "visualizationUiComponents": "." + } +} diff --git a/src/plugins/visualization_ui_components/README.md b/src/plugins/visualization_ui_components/README.md new file mode 100644 index 0000000000000..dc50b4ede1e20 --- /dev/null +++ b/src/plugins/visualization_ui_components/README.md @@ -0,0 +1,3 @@ +# @kbn/visualization-ui-components + +A series of UI components pulled out of Lens to make them available outside Lens. diff --git a/src/plugins/visualization_ui_components/jest.config.js b/src/plugins/visualization_ui_components/jest.config.js new file mode 100644 index 0000000000000..bd0b14b660033 --- /dev/null +++ b/src/plugins/visualization_ui_components/jest.config.js @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +module.exports = { + preset: '@kbn/test', + rootDir: '../../..', + roots: ['/src/plugins/visualization_ui_components'], + coverageDirectory: + '/target/kibana-coverage/jest/src/plugins/visualization_ui_components', + coverageReporters: ['text', 'html'], + collectCoverageFrom: [ + '/src/plugins/visualization_ui_components/{common,public,server}/**/*.{js,ts,tsx}', + ], + setupFiles: ['jest-canvas-mock'], +}; diff --git a/src/plugins/visualization_ui_components/kibana.jsonc b/src/plugins/visualization_ui_components/kibana.jsonc new file mode 100644 index 0000000000000..f7d42af513338 --- /dev/null +++ b/src/plugins/visualization_ui_components/kibana.jsonc @@ -0,0 +1,14 @@ +{ + "type": "plugin", + "id": "@kbn/visualization-ui-components", + "owner": "@elastic/kibana-visualizations", + "plugin": { + "id": "visualizationUiComponents", + "server": false, + "browser": true, + "requiredBundles": [ + "unifiedSearch", + "unifiedFieldList" + ] + } +} diff --git a/src/plugins/visualization_ui_components/package.json b/src/plugins/visualization_ui_components/package.json new file mode 100644 index 0000000000000..4df9dbe5d1ee0 --- /dev/null +++ b/src/plugins/visualization_ui_components/package.json @@ -0,0 +1,6 @@ +{ + "name": "@kbn/visualization-ui-components", + "private": true, + "version": "1.0.0", + "license": "SSPL-1.0 OR Elastic License 2.0" +} diff --git a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/color_picker.tsx b/src/plugins/visualization_ui_components/public/components/color_picker.tsx similarity index 87% rename from x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/color_picker.tsx rename to src/plugins/visualization_ui_components/public/components/color_picker.tsx index 22166ba85fc34..56ea66b1a7edb 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/color_picker.tsx +++ b/src/plugins/visualization_ui_components/public/components/color_picker.tsx @@ -1,8 +1,9 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. */ import React, { useEffect, useRef, useState } from 'react'; @@ -16,16 +17,16 @@ import { EuiIcon, euiPaletteColorBlind, } from '@elastic/eui'; -import { TooltipWrapper } from '../../../shared_components'; +import { TooltipWrapper } from './tooltip_wrapper'; const tooltipContent = { - auto: i18n.translate('xpack.lens.configPanel.color.tooltip.auto', { + auto: i18n.translate('visualizationUiComponents.colorPicker.tooltip.auto', { defaultMessage: 'Lens automatically picks colors for you unless you specify a custom color.', }), - custom: i18n.translate('xpack.lens.configPanel.color.tooltip.custom', { + custom: i18n.translate('visualizationUiComponents.colorPicker.tooltip.custom', { defaultMessage: 'Clear the custom color to return to “Auto” mode.', }), - disabled: i18n.translate('xpack.lens.configPanel.color.tooltip.disabled', { + disabled: i18n.translate('visualizationUiComponents.colorPicker.tooltip.disabled', { defaultMessage: 'You are unable to apply custom colors to individual series when the layer includes a "Break down by" field.', }), @@ -42,7 +43,7 @@ function isValidPonyfill(colorString: string) { } } -export function isValidColor(colorString?: string) { +function isValidColor(colorString?: string) { // chroma can handle also hex values with alpha channel/transparency // chroma accepts also hex without #, so test for it return ( @@ -107,7 +108,7 @@ export const ColorPicker = ({ const inputLabel = label ?? - i18n.translate('xpack.lens.xyChart.seriesColor.label', { + i18n.translate('visualizationUiComponents.colorPicker.seriesColor.label', { defaultMessage: 'Series color', }); @@ -122,7 +123,7 @@ export const ColorPicker = ({ disabled={disabled} placeholder={ defaultColor?.toUpperCase() || - i18n.translate('xpack.lens.xyChart.seriesColor.auto', { + i18n.translate('visualizationUiComponents.colorPicker.seriesColor.auto', { defaultMessage: 'Auto', }) } diff --git a/x-pack/plugins/lens/public/shared_components/debounced_input.test.tsx b/src/plugins/visualization_ui_components/public/components/debounced_input.test.tsx similarity index 91% rename from x-pack/plugins/lens/public/shared_components/debounced_input.test.tsx rename to src/plugins/visualization_ui_components/public/components/debounced_input.test.tsx index feab19d02c720..beec64618c45d 100644 --- a/x-pack/plugins/lens/public/shared_components/debounced_input.test.tsx +++ b/src/plugins/visualization_ui_components/public/components/debounced_input.test.tsx @@ -1,8 +1,9 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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'; diff --git a/x-pack/plugins/lens/public/shared_components/debounced_input.tsx b/src/plugins/visualization_ui_components/public/components/debounced_input.tsx similarity index 88% rename from x-pack/plugins/lens/public/shared_components/debounced_input.tsx rename to src/plugins/visualization_ui_components/public/components/debounced_input.tsx index cd309a2bb0bfd..e892cba9e8022 100644 --- a/x-pack/plugins/lens/public/shared_components/debounced_input.tsx +++ b/src/plugins/visualization_ui_components/public/components/debounced_input.tsx @@ -1,8 +1,9 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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'; diff --git a/x-pack/plugins/lens/public/shared_components/debounced_value.test.ts b/src/plugins/visualization_ui_components/public/components/debounced_value.test.ts similarity index 88% rename from x-pack/plugins/lens/public/shared_components/debounced_value.test.ts rename to src/plugins/visualization_ui_components/public/components/debounced_value.test.ts index e5dd747be51ff..ddff83ea66157 100644 --- a/x-pack/plugins/lens/public/shared_components/debounced_value.test.ts +++ b/src/plugins/visualization_ui_components/public/components/debounced_value.test.ts @@ -1,8 +1,9 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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 { act, renderHook } from '@testing-library/react-hooks'; diff --git a/x-pack/plugins/lens/public/shared_components/debounced_value.ts b/src/plugins/visualization_ui_components/public/components/debounced_value.ts similarity index 91% rename from x-pack/plugins/lens/public/shared_components/debounced_value.ts rename to src/plugins/visualization_ui_components/public/components/debounced_value.ts index 77848e678b135..2321ee72817f3 100644 --- a/x-pack/plugins/lens/public/shared_components/debounced_value.ts +++ b/src/plugins/visualization_ui_components/public/components/debounced_value.ts @@ -1,8 +1,9 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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 { useState, useMemo, useEffect, useRef } from 'react'; diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/buttons/dimension_button.tsx b/src/plugins/visualization_ui_components/public/components/dimension_buttons/dimension_button.tsx similarity index 71% rename from x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/buttons/dimension_button.tsx rename to src/plugins/visualization_ui_components/public/components/dimension_buttons/dimension_button.tsx index 71f7a2928bc41..2e75a1704d615 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/buttons/dimension_button.tsx +++ b/src/plugins/visualization_ui_components/public/components/dimension_buttons/dimension_button.tsx @@ -1,8 +1,9 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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'; @@ -10,18 +11,18 @@ import { EuiButtonIcon, EuiLink, EuiToolTip, EuiFlexGroup, EuiFlexItem } from '@ import { i18n } from '@kbn/i18n'; import { css } from '@emotion/react'; import { euiThemeVars } from '@kbn/ui-theme'; -import { DimensionButtonIcon } from '../dimension_button_icon'; -import { PaletteIndicator } from '../palette_indicator'; -import { VisualizationDimensionGroupConfig, AccessorConfig, UserMessage } from '../../../../types'; +import { DimensionButtonIcon } from './dimension_button_icon'; +import { PaletteIndicator } from './palette_indicator'; +import { AccessorConfig, Message } from './types'; const triggerLinkA11yText = (label: string) => - i18n.translate('xpack.lens.configure.editConfig', { + i18n.translate('visualizationUiComponents.dimensionButton.editConfig', { defaultMessage: 'Edit {label} configuration', values: { label }, }); export function DimensionButton({ - group, + groupLabel, children, onClick, onRemoveClick, @@ -31,22 +32,19 @@ export function DimensionButton({ ...otherProps // from Drag&Drop integration }: { className?: string; - group: VisualizationDimensionGroupConfig; + groupLabel: string; children: React.ReactElement; onClick: (id: string) => void; onRemoveClick: (id: string) => void; accessorConfig: AccessorConfig; label: string; - message: UserMessage | undefined; + message?: Message; }) { return (
- + - + {children} @@ -74,13 +72,13 @@ export function DimensionButton({ iconType="trash" size="xs" color="danger" - aria-label={i18n.translate('xpack.lens.indexPattern.removeColumnLabel', { + aria-label={i18n.translate('visualizationUiComponents.dimensionButton.removeColumnLabel', { defaultMessage: 'Remove configuration from "{groupLabel}"', - values: { groupLabel: group.groupLabel }, + values: { groupLabel }, })} - title={i18n.translate('xpack.lens.indexPattern.removeColumnLabel', { + title={i18n.translate('visualizationUiComponents.dimensionButton.removeColumnLabel', { defaultMessage: 'Remove configuration from "{groupLabel}"', - values: { groupLabel: group.groupLabel }, + values: { groupLabel }, })} onClick={() => onRemoveClick(accessorConfig.columnId)} css={css` diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/dimension_button_icon.tsx b/src/plugins/visualization_ui_components/public/components/dimension_buttons/dimension_button_icon.tsx similarity index 52% rename from x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/dimension_button_icon.tsx rename to src/plugins/visualization_ui_components/public/components/dimension_buttons/dimension_button_icon.tsx index 489e56c09055c..bcb3ddb1e44bb 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/dimension_button_icon.tsx +++ b/src/plugins/visualization_ui_components/public/components/dimension_buttons/dimension_button_icon.tsx @@ -1,15 +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; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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 { EuiFlexGroup, EuiFlexItem, EuiIcon } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { AccessorConfig, UserMessage } from '../../../types'; -import { IconError, IconWarning } from '../custom_icons'; +import type { AccessorConfig, Message } from './types'; const baseIconProps = { className: 'lnsLayerPanel__colorIndicator', @@ -22,12 +22,15 @@ const getIconFromAccessorConfig = (accessorConfig: AccessorConfig) => ( {...baseIconProps} color={accessorConfig.color} type="stopFilled" - aria-label={i18n.translate('xpack.lens.editorFrame.colorIndicatorLabel', { - defaultMessage: 'Color of this dimension: {hex}', - values: { - hex: accessorConfig.color, - }, - })} + aria-label={i18n.translate( + 'visualizationUiComponents.dimensionButtonIcon.colorIndicatorLabel', + { + defaultMessage: 'Color of this dimension: {hex}', + values: { + hex: accessorConfig.color, + }, + } + )} /> )} {accessorConfig.triggerIconType === 'disabled' && ( @@ -35,9 +38,12 @@ const getIconFromAccessorConfig = (accessorConfig: AccessorConfig) => ( {...baseIconProps} type="stopSlash" color="subdued" - aria-label={i18n.translate('xpack.lens.editorFrame.noColorIndicatorLabel', { - defaultMessage: 'This dimension does not have an individual color', - })} + aria-label={i18n.translate( + 'visualizationUiComponents.dimensionButtonIcon.noColorIndicatorLabel', + { + defaultMessage: 'This dimension does not have an individual color', + } + )} /> )} {accessorConfig.triggerIconType === 'invisible' && ( @@ -45,9 +51,12 @@ const getIconFromAccessorConfig = (accessorConfig: AccessorConfig) => ( {...baseIconProps} type="eyeClosed" color="subdued" - aria-label={i18n.translate('xpack.lens.editorFrame.invisibleIndicatorLabel', { - defaultMessage: 'This dimension is currently not visible in the chart', - })} + aria-label={i18n.translate( + 'visualizationUiComponents.dimensionButtonIcon.invisibleIndicatorLabel', + { + defaultMessage: 'This dimension is currently not visible in the chart', + } + )} /> )} {accessorConfig.triggerIconType === 'aggregate' && ( @@ -55,10 +64,13 @@ const getIconFromAccessorConfig = (accessorConfig: AccessorConfig) => ( {...baseIconProps} type="fold" color="subdued" - aria-label={i18n.translate('xpack.lens.editorFrame.aggregateIndicatorLabel', { - defaultMessage: - 'This dimension is not visible in the chart because all individual values are aggregated into a single value', - })} + aria-label={i18n.translate( + 'visualizationUiComponents.dimensionButtonIcon.aggregateIndicatorLabel', + { + defaultMessage: + 'This dimension is not visible in the chart because all individual values are aggregated into a single value', + } + )} /> )} {accessorConfig.triggerIconType === 'colorBy' && ( @@ -66,9 +78,12 @@ const getIconFromAccessorConfig = (accessorConfig: AccessorConfig) => ( {...baseIconProps} type="color" color="subdued" - aria-label={i18n.translate('xpack.lens.editorFrame.paletteColorIndicatorLabel', { - defaultMessage: 'This dimension is using a palette', - })} + aria-label={i18n.translate( + 'visualizationUiComponents.dimensionButtonIcon.paletteColorIndicatorLabel', + { + defaultMessage: 'This dimension is using a palette', + } + )} /> )} {accessorConfig.triggerIconType === 'custom' && accessorConfig.customIcon && ( @@ -76,9 +91,12 @@ const getIconFromAccessorConfig = (accessorConfig: AccessorConfig) => ( {...baseIconProps} type={accessorConfig.customIcon} color={accessorConfig.color} - aria-label={i18n.translate('xpack.lens.editorFrame.customIconIndicatorLabel', { - defaultMessage: 'This dimension is using a custom icon', - })} + aria-label={i18n.translate( + 'visualizationUiComponents.dimensionButtonIcon.customIconIndicatorLabel', + { + defaultMessage: 'This dimension is using a custom icon', + } + )} /> )} @@ -86,26 +104,23 @@ const getIconFromAccessorConfig = (accessorConfig: AccessorConfig) => ( export function DimensionButtonIcon({ accessorConfig, - message, + severity, children, }: { accessorConfig: AccessorConfig; - message: UserMessage | undefined; + severity?: Message['severity']; children: React.ReactChild; }) { let indicatorIcon = null; - if (message || accessorConfig.triggerIconType !== 'none') { + if (severity || accessorConfig.triggerIconType !== 'none') { indicatorIcon = ( <> {accessorConfig.triggerIconType !== 'none' && ( {getIconFromAccessorConfig(accessorConfig)} )} - {message && ( + {severity && ( - + )} diff --git a/src/plugins/visualization_ui_components/public/components/dimension_buttons/index.ts b/src/plugins/visualization_ui_components/public/components/dimension_buttons/index.ts new file mode 100644 index 0000000000000..54df2c7911488 --- /dev/null +++ b/src/plugins/visualization_ui_components/public/components/dimension_buttons/index.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export * from './dimension_button'; + +export type { AccessorConfig } from './types'; diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/palette_indicator.tsx b/src/plugins/visualization_ui_components/public/components/dimension_buttons/palette_indicator.tsx similarity index 73% rename from x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/palette_indicator.tsx rename to src/plugins/visualization_ui_components/public/components/dimension_buttons/palette_indicator.tsx index 21a44bceed788..5befa0ece26e1 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/palette_indicator.tsx +++ b/src/plugins/visualization_ui_components/public/components/dimension_buttons/palette_indicator.tsx @@ -1,13 +1,14 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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 { EuiColorPaletteDisplay } from '@elastic/eui'; -import { AccessorConfig } from '../../../types'; +import { AccessorConfig } from './types'; export function PaletteIndicator({ accessorConfig }: { accessorConfig: AccessorConfig }) { if (accessorConfig.triggerIconType !== 'colorBy' || !accessorConfig.palette) return null; diff --git a/src/plugins/visualization_ui_components/public/components/dimension_buttons/types.ts b/src/plugins/visualization_ui_components/public/components/dimension_buttons/types.ts new file mode 100644 index 0000000000000..80ba91115818a --- /dev/null +++ b/src/plugins/visualization_ui_components/public/components/dimension_buttons/types.ts @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { IconType } from '@elastic/eui'; + +export interface AccessorConfig { + columnId: string; + triggerIconType?: + | 'color' + | 'disabled' + | 'colorBy' + | 'none' + | 'invisible' + | 'aggregate' + | 'custom'; + customIcon?: IconType; + color?: string; + palette?: string[] | Array<{ color: string; stop: number }>; +} + +export interface Message { + severity: 'warning' | 'error' | 'info'; + content: React.ReactNode; +} diff --git a/x-pack/plugins/lens/public/shared_components/dimension_section.scss b/src/plugins/visualization_ui_components/public/components/dimension_editor_section.scss similarity index 99% rename from x-pack/plugins/lens/public/shared_components/dimension_section.scss rename to src/plugins/visualization_ui_components/public/components/dimension_editor_section.scss index 2057a976aa916..d5358ca90d378 100644 --- a/x-pack/plugins/lens/public/shared_components/dimension_section.scss +++ b/src/plugins/visualization_ui_components/public/components/dimension_editor_section.scss @@ -13,6 +13,7 @@ .lnsDimensionEditorSection__border { position: relative; + &:before { content: ''; position: absolute; @@ -25,4 +26,4 @@ .lnsDimensionEditorSection__heading { padding-bottom: 16px; -} +} \ No newline at end of file diff --git a/x-pack/plugins/lens/public/shared_components/dimension_section.tsx b/src/plugins/visualization_ui_components/public/components/dimension_editor_section.tsx similarity index 74% rename from x-pack/plugins/lens/public/shared_components/dimension_section.tsx rename to src/plugins/visualization_ui_components/public/components/dimension_editor_section.tsx index a0f0ca0054a0f..22b0d5f51401a 100644 --- a/x-pack/plugins/lens/public/shared_components/dimension_section.tsx +++ b/src/plugins/visualization_ui_components/public/components/dimension_editor_section.tsx @@ -1,12 +1,14 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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 { EuiTitle } from '@elastic/eui'; import React from 'react'; -import './dimension_section.scss'; +import './dimension_editor_section.scss'; export const DimensionEditorSection = ({ children, diff --git a/x-pack/plugins/lens/public/shared_components/drag_drop_bucket/buckets.test.tsx b/src/plugins/visualization_ui_components/public/components/drag_drop_bucket/buckets.test.tsx similarity index 91% rename from x-pack/plugins/lens/public/shared_components/drag_drop_bucket/buckets.test.tsx rename to src/plugins/visualization_ui_components/public/components/drag_drop_bucket/buckets.test.tsx index 9826049bb8433..c3c5b78f32c99 100644 --- a/x-pack/plugins/lens/public/shared_components/drag_drop_bucket/buckets.test.tsx +++ b/src/plugins/visualization_ui_components/public/components/drag_drop_bucket/buckets.test.tsx @@ -1,8 +1,9 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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'; @@ -17,7 +18,7 @@ jest.mock('@elastic/eui', () => { ...original, EuiDragDropContext: 'eui-drag-drop-context', EuiDroppable: 'eui-droppable', - EuiDraggable: (props: any) => props.children(), // eslint-disable-line @typescript-eslint/no-explicit-any + EuiDraggable: (props: any) => props.children(), }; }); diff --git a/x-pack/plugins/lens/public/shared_components/drag_drop_bucket/buckets.tsx b/src/plugins/visualization_ui_components/public/components/drag_drop_bucket/buckets.tsx similarity index 93% rename from x-pack/plugins/lens/public/shared_components/drag_drop_bucket/buckets.tsx rename to src/plugins/visualization_ui_components/public/components/drag_drop_bucket/buckets.tsx index 7d0893cdd54ee..b82f3ce7138c9 100644 --- a/x-pack/plugins/lens/public/shared_components/drag_drop_bucket/buckets.tsx +++ b/src/plugins/visualization_ui_components/public/components/drag_drop_bucket/buckets.tsx @@ -1,8 +1,9 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. */ import React, { useCallback, useState } from 'react'; diff --git a/x-pack/plugins/lens/public/shared_components/drag_drop_bucket/default_bucket_container.tsx b/src/plugins/visualization_ui_components/public/components/drag_drop_bucket/default_bucket_container.tsx similarity index 75% rename from x-pack/plugins/lens/public/shared_components/drag_drop_bucket/default_bucket_container.tsx rename to src/plugins/visualization_ui_components/public/components/drag_drop_bucket/default_bucket_container.tsx index e87a1f7c7f143..d73c46064a3ca 100644 --- a/x-pack/plugins/lens/public/shared_components/drag_drop_bucket/default_bucket_container.tsx +++ b/src/plugins/visualization_ui_components/public/components/drag_drop_bucket/default_bucket_container.tsx @@ -1,8 +1,9 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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'; @@ -15,8 +16,8 @@ import { EuiPanel, useEuiTheme, } from '@elastic/eui'; -import type { BucketContainerProps } from './types'; import { TooltipWrapper } from '../tooltip_wrapper'; +import type { BucketContainerProps } from './types'; export const DefaultBucketContainer = ({ idx, @@ -43,9 +44,12 @@ export const DefaultBucketContainer = ({ @@ -69,7 +76,7 @@ export const DefaultBucketContainer = ({ @@ -63,7 +70,7 @@ export const FieldsBucketContainer = ({ ({ compressed isClearable={false} data-test-subj={dataTestSub ?? 'indexPattern-dimension-field'} - placeholder={i18n.translate('xpack.lens.fieldPicker.fieldPlaceholder', { + placeholder={i18n.translate('visualizationUiComponents.fieldPicker.fieldPlaceholder', { defaultMessage: 'Select a field', })} options={styledOptions} diff --git a/src/plugins/visualization_ui_components/public/components/field_picker/index.ts b/src/plugins/visualization_ui_components/public/components/field_picker/index.ts new file mode 100644 index 0000000000000..96f53e2bfc74a --- /dev/null +++ b/src/plugins/visualization_ui_components/public/components/field_picker/index.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export { FieldPicker } from './field_picker'; +export { TruncatedLabel } from './truncated_label'; +export type { FieldOptionValue, FieldOption, DataType } from './types'; diff --git a/x-pack/plugins/lens/public/shared_components/field_picker/truncated_label.test.tsx b/src/plugins/visualization_ui_components/public/components/field_picker/truncated_label.test.tsx similarity index 93% rename from x-pack/plugins/lens/public/shared_components/field_picker/truncated_label.test.tsx rename to src/plugins/visualization_ui_components/public/components/field_picker/truncated_label.test.tsx index e26d33f4b9e8a..fb9b7581bbdc6 100644 --- a/x-pack/plugins/lens/public/shared_components/field_picker/truncated_label.test.tsx +++ b/src/plugins/visualization_ui_components/public/components/field_picker/truncated_label.test.tsx @@ -1,8 +1,9 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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'; diff --git a/x-pack/plugins/lens/public/shared_components/field_picker/truncated_label.tsx b/src/plugins/visualization_ui_components/public/components/field_picker/truncated_label.tsx similarity index 93% rename from x-pack/plugins/lens/public/shared_components/field_picker/truncated_label.tsx rename to src/plugins/visualization_ui_components/public/components/field_picker/truncated_label.tsx index 47b1313a74c4e..e4bcc6c193c7a 100644 --- a/x-pack/plugins/lens/public/shared_components/field_picker/truncated_label.tsx +++ b/src/plugins/visualization_ui_components/public/components/field_picker/truncated_label.tsx @@ -1,8 +1,9 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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, { useMemo } from 'react'; diff --git a/x-pack/plugins/lens/public/shared_components/field_picker/types.ts b/src/plugins/visualization_ui_components/public/components/field_picker/types.ts similarity index 59% rename from x-pack/plugins/lens/public/shared_components/field_picker/types.ts rename to src/plugins/visualization_ui_components/public/components/field_picker/types.ts index 4d607b47ef914..b5927fdab53f9 100644 --- a/x-pack/plugins/lens/public/shared_components/field_picker/types.ts +++ b/src/plugins/visualization_ui_components/public/components/field_picker/types.ts @@ -1,11 +1,23 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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 { EuiComboBoxOptionOption } from '@elastic/eui'; -import type { DataType } from '../../types'; + +type FieldOnlyDataType = + | 'document' + | 'ip' + | 'histogram' + | 'geo_point' + | 'geo_shape' + | 'counter' + | 'gauge' + | 'murmur3'; +export type DataType = 'string' | 'number' | 'date' | 'boolean' | FieldOnlyDataType; export interface FieldOptionValue { type: 'field'; diff --git a/x-pack/plugins/lens/public/shared_components/icon_select/icon_select.tsx b/src/plugins/visualization_ui_components/public/components/icon_select.tsx similarity index 62% rename from x-pack/plugins/lens/public/shared_components/icon_select/icon_select.tsx rename to src/plugins/visualization_ui_components/public/components/icon_select.tsx index 74eb23e3e8297..5b9d30c6cfb77 100644 --- a/x-pack/plugins/lens/public/shared_components/icon_select/icon_select.tsx +++ b/src/plugins/visualization_ui_components/public/components/icon_select.tsx @@ -1,13 +1,21 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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 { EuiComboBox, EuiFlexGroup, EuiFlexItem, EuiIcon, IconType } from '@elastic/eui'; -import { AvailableReferenceLineIcon } from '@kbn/expression-xy-plugin/common'; +import { + EuiComboBox, + EuiFlexGroup, + EuiFlexItem, + EuiFormRow, + EuiIcon, + IconType, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; export function hasIcon(icon: string | undefined): icon is string { return icon != null && icon !== 'empty'; @@ -33,7 +41,7 @@ const IconView = (props: { value?: string; label: string; icon?: IconType }) => ); }; -export function IconSelect({ +export function IconSelect({ value, onChange, customIconSet, @@ -74,3 +82,32 @@ export function IconSelect({ /> ); } + +export function IconSelectSetting({ + currentIcon, + setIcon, + customIconSet, + defaultIcon = 'empty', +}: { + currentIcon?: Icon; + setIcon: (icon: Icon) => void; + customIconSet: IconSet; + defaultIcon?: string; +}) { + return ( + + + + ); +} diff --git a/src/plugins/visualization_ui_components/public/components/index.ts b/src/plugins/visualization_ui_components/public/components/index.ts new file mode 100644 index 0000000000000..4de1805bc472a --- /dev/null +++ b/src/plugins/visualization_ui_components/public/components/index.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. + */ + +export * from './field_picker'; + +export * from './name_input'; + +export * from './debounced_input'; + +export * from './debounced_value'; + +export * from './tooltip_wrapper'; + +export * from './color_picker'; + +export * from './icon_select'; + +export * from './drag_drop_bucket'; + +export * from './query_input'; + +export * from './dimension_editor_section'; + +export * from './dimension_buttons'; + +export type { AccessorConfig } from './dimension_buttons'; + +export type { FieldOptionValue, FieldOption, DataType } from './field_picker'; + +export type { IconSet } from './icon_select'; diff --git a/x-pack/plugins/lens/public/shared_components/name_input.tsx b/src/plugins/visualization_ui_components/public/components/name_input.tsx similarity index 76% rename from x-pack/plugins/lens/public/shared_components/name_input.tsx rename to src/plugins/visualization_ui_components/public/components/name_input.tsx index e455caa199dd0..1a3f3e836e98d 100644 --- a/x-pack/plugins/lens/public/shared_components/name_input.tsx +++ b/src/plugins/visualization_ui_components/public/components/name_input.tsx @@ -1,8 +1,9 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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'; @@ -21,7 +22,7 @@ export const NameInput = ({ }) => { return ( void; - indexPattern: IndexPattern; + dataView: DataViewBase; helpMessage?: string | null; label?: string; initiallyOpen?: boolean; ['data-test-subj']?: string; + queryInputServices: QueryInputServices; + appName: string; }) { const [filterPopoverOpen, setFilterPopoverOpen] = useState(Boolean(initiallyOpen)); const { inputValue: queryInput, handleInputChange: setQueryInput } = useDebouncedValue({ @@ -57,10 +64,10 @@ export function FilterQueryInput({ setFilterPopoverOpen(false); }, []); - const { isValid: isInputFilterValid } = validateQuery(inputFilter, indexPattern); + const { isValid: isInputFilterValid } = validateQuery(inputFilter, dataView); const { isValid: isQueryInputValid, error: queryInputError } = validateQuery( queryInput, - indexPattern + dataView ); return ( @@ -108,14 +115,20 @@ export function FilterQueryInput({ setFilterPopoverOpen(!filterPopoverOpen); }} color={isInputFilterValid ? 'text' : 'danger'} - title={i18n.translate('xpack.lens.indexPattern.filterBy.clickToEdit', { - defaultMessage: 'Click to edit', - })} + title={i18n.translate( + 'visualizationUiComponents.filterQueryInput.clickToEdit', + { + defaultMessage: 'Click to edit', + } + )} > {inputFilter?.query || - i18n.translate('xpack.lens.indexPattern.filterBy.emptyFilterQuery', { - defaultMessage: '(empty)', - })} + i18n.translate( + 'visualizationUiComponents.filterQueryInput.emptyFilterQuery', + { + defaultMessage: '(empty)', + } + )} @@ -130,10 +143,10 @@ export function FilterQueryInput({ data-test-subj="indexPattern-filter-by-input" > {}} data-test-subj={dataTestSubj} + appName={appName} + services={queryInputServices} /> diff --git a/x-pack/plugins/lens/public/shared_components/query_input/helpers.ts b/src/plugins/visualization_ui_components/public/components/query_input/helpers.ts similarity index 51% rename from x-pack/plugins/lens/public/shared_components/query_input/helpers.ts rename to src/plugins/visualization_ui_components/public/components/query_input/helpers.ts index 1b598a10f6f50..82cca375715de 100644 --- a/x-pack/plugins/lens/public/shared_components/query_input/helpers.ts +++ b/src/plugins/visualization_ui_components/public/components/query_input/helpers.ts @@ -1,22 +1,22 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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 { Query } from '@kbn/es-query'; +import type { DataViewBase, Query } from '@kbn/es-query'; import { toElasticsearchQuery, fromKueryExpression, luceneStringToDsl } from '@kbn/es-query'; -import { IndexPattern } from '../../types'; -export const validateQuery = (input: Query | undefined, indexPattern: IndexPattern) => { +export const validateQuery = (input: Query | undefined, dataView: DataViewBase) => { let isValid = true; let error: string | undefined; try { if (input) { if (input.language === 'kuery') { - toElasticsearchQuery(fromKueryExpression(input.query), indexPattern); + toElasticsearchQuery(fromKueryExpression(input.query), dataView); } else { luceneStringToDsl(input.query); } @@ -29,5 +29,5 @@ export const validateQuery = (input: Query | undefined, indexPattern: IndexPatte return { isValid, error }; }; -export const isQueryValid = (input: Query, indexPattern: IndexPattern) => - validateQuery(input, indexPattern).isValid; +export const isQueryValid = (input: Query, dataView: DataViewBase) => + validateQuery(input, dataView).isValid; diff --git a/src/plugins/visualization_ui_components/public/components/query_input/index.ts b/src/plugins/visualization_ui_components/public/components/query_input/index.ts new file mode 100644 index 0000000000000..8104fd9af9726 --- /dev/null +++ b/src/plugins/visualization_ui_components/public/components/query_input/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 { QueryInput } from './query_input'; +export { FilterQueryInput } from './filter_query_input'; +export { validateQuery, isQueryValid } from './helpers'; +export type { QueryInputServices } from './query_input'; diff --git a/x-pack/plugins/lens/public/shared_components/query_input/query_input.tsx b/src/plugins/visualization_ui_components/public/components/query_input/query_input.tsx similarity index 54% rename from x-pack/plugins/lens/public/shared_components/query_input/query_input.tsx rename to src/plugins/visualization_ui_components/public/components/query_input/query_input.tsx index c5cbdebf20fff..4a6c4c4ecb3ba 100644 --- a/x-pack/plugins/lens/public/shared_components/query_input/query_input.tsx +++ b/src/plugins/visualization_ui_components/public/components/query_input/query_input.tsx @@ -1,8 +1,9 @@ /* * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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'; @@ -10,34 +11,51 @@ import { i18n } from '@kbn/i18n'; import { isEqual } from 'lodash'; import type { Query } from '@kbn/es-query'; import { QueryStringInput } from '@kbn/unified-search-plugin/public'; -import { useKibana } from '@kbn/kibana-react-plugin/public'; +import type { UnifiedSearchPublicPluginStart } from '@kbn/unified-search-plugin/public'; +import type { HttpStart } from '@kbn/core-http-browser'; +import type { IStorageWrapper } from '@kbn/kibana-utils-plugin/public'; +import type { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; +import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; +import type { IUiSettingsClient } from '@kbn/core-ui-settings-browser'; +import type { NotificationsStart } from '@kbn/core-notifications-browser'; +import type { DocLinksStart } from '@kbn/core-doc-links-browser'; import { useDebouncedValue } from '../debounced_value'; -import { LensAppServices } from '../../app_plugin/types'; + +export interface QueryInputServices { + http: HttpStart; + storage: IStorageWrapper; + dataViews: DataViewsPublicPluginStart; + data: DataPublicPluginStart; + uiSettings: IUiSettingsClient; + notifications: NotificationsStart; + unifiedSearch: UnifiedSearchPublicPluginStart; + docLinks: DocLinksStart; +} export const QueryInput = ({ value, onChange, - indexPattern, + dataView, isInvalid, onSubmit, disableAutoFocus, ['data-test-subj']: dataTestSubj, placeholder, + appName, + services: { data, uiSettings, http, notifications, docLinks, storage, unifiedSearch, dataViews }, }: { value: Query; onChange: (input: Query) => void; - indexPattern: string | { type: 'title' | 'id'; value: string }; + dataView: string | { type: 'title' | 'id'; value: string }; isInvalid: boolean; onSubmit: () => void; disableAutoFocus?: boolean; 'data-test-subj'?: string; placeholder?: string; + appName: string; + services: QueryInputServices; }) => { const { inputValue, handleInputChange } = useDebouncedValue({ value, onChange }); - const lensAppServices = useKibana().services; - - const { data, uiSettings, http, notifications, docLinks, storage, unifiedSearch, dataViews } = - lensAppServices; return ( { if (!isEqual(newQuery, inputValue)) { @@ -61,19 +79,17 @@ export const QueryInput = ({ placeholder={ placeholder ?? (inputValue.language === 'kuery' - ? i18n.translate('xpack.lens.indexPattern.filters.queryPlaceholderKql', { + ? i18n.translate('visualizationUiComponents.queryInput.queryPlaceholderKql', { defaultMessage: '{example}', values: { example: 'method : "GET" or status : "404"' }, }) - : i18n.translate('xpack.lens.indexPattern.filters.queryPlaceholderLucene', { + : i18n.translate('visualizationUiComponents.queryInput.queryPlaceholderLucene', { defaultMessage: '{example}', values: { example: 'method:GET OR status:404' }, })) } languageSwitcherPopoverAnchorPosition="rightDown" - appName={i18n.translate('xpack.lens.queryInput.appName', { - defaultMessage: 'Lens', - })} + appName={appName} deps={{ unifiedSearch, notifications, http, docLinks, uiSettings, data, storage, dataViews }} /> ); diff --git a/x-pack/plugins/lens/public/shared_components/tooltip_wrapper.tsx b/src/plugins/visualization_ui_components/public/components/tooltip_wrapper.tsx similarity index 73% rename from x-pack/plugins/lens/public/shared_components/tooltip_wrapper.tsx rename to src/plugins/visualization_ui_components/public/components/tooltip_wrapper.tsx index 5ab7800e05349..65605ac8e3a33 100644 --- a/x-pack/plugins/lens/public/shared_components/tooltip_wrapper.tsx +++ b/src/plugins/visualization_ui_components/public/components/tooltip_wrapper.tsx @@ -1,14 +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; you may not use this file except in compliance with the Elastic License - * 2.0. + * 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 { EuiToolTip, EuiToolTipProps } from '@elastic/eui'; -export type TooltipWrapperProps = Partial> & { +type TooltipWrapperProps = Partial> & { tooltipContent: string; /** When the condition is truthy, the tooltip will be shown */ condition: boolean; diff --git a/src/plugins/visualization_ui_components/public/index.ts b/src/plugins/visualization_ui_components/public/index.ts new file mode 100644 index 0000000000000..63a283ccf1dbe --- /dev/null +++ b/src/plugins/visualization_ui_components/public/index.ts @@ -0,0 +1,46 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 chroma from 'chroma-js'; +import { VisualizationUiComponentsPlugin } from './plugin'; + +export { chroma }; + +export { + FieldPicker, + TruncatedLabel, + NameInput, + DebouncedInput, + useDebouncedValue, + TooltipWrapper, + ColorPicker, + IconSelect, + IconSelectSetting, + NewBucketButton, + DragDropBuckets, + DraggableBucketContainer, + FieldsBucketContainer, + FilterQueryInput, + QueryInput, + validateQuery, + isQueryValid, + DimensionEditorSection, + DimensionButton, +} from './components'; + +export type { + DataType, + FieldOptionValue, + FieldOption, + IconSet, + AccessorConfig, +} from './components'; + +export function plugin() { + return new VisualizationUiComponentsPlugin(); +} diff --git a/src/plugins/visualization_ui_components/public/plugin.ts b/src/plugins/visualization_ui_components/public/plugin.ts new file mode 100755 index 0000000000000..1ed621a3cfdf5 --- /dev/null +++ b/src/plugins/visualization_ui_components/public/plugin.ts @@ -0,0 +1,26 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { Plugin } from '@kbn/core/public'; + +// This plugin should really be a package, but we have to currently have to put the components in a "public" +// directory to avoid violating the @kbn/imports/no_boundary_crossing rules. +// +// Moving the dependencies of this plugin (unified search, unified field list) to static packages will +// make it possible to convert this to a package as well. +export class VisualizationUiComponentsPlugin implements Plugin<{}, {}> { + public setup() { + return {}; + } + + public start() { + return {}; + } + + public stop() {} +} diff --git a/src/plugins/visualization_ui_components/tsconfig.json b/src/plugins/visualization_ui_components/tsconfig.json new file mode 100644 index 0000000000000..7a5784a9c6310 --- /dev/null +++ b/src/plugins/visualization_ui_components/tsconfig.json @@ -0,0 +1,32 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types", + }, + "include": [ + "../../typings/**/*", + "common/**/*", + "public/**/*", + "server/**/*", + ], + "kbn_references": [ + "@kbn/unified-field-list-plugin", + "@kbn/i18n", + "@kbn/unified-search-plugin", + "@kbn/utility-types", + "@kbn/es-query", + "@kbn/core-http-browser", + "@kbn/kibana-utils-plugin", + "@kbn/data-views-plugin", + "@kbn/data-plugin", + "@kbn/core-ui-settings-browser", + "@kbn/core-notifications-browser", + "@kbn/core-doc-links-browser", + "@kbn/core", + "@kbn/ui-theme" + ], + "exclude": [ + "target/**/*", + ] +} + diff --git a/test/analytics/tests/instrumented_events/from_the_browser/viewport_resize.ts b/test/analytics/tests/instrumented_events/from_the_browser/viewport_resize.ts index 8523b9f5603e7..845b3c68ec3ff 100644 --- a/test/analytics/tests/instrumented_events/from_the_browser/viewport_resize.ts +++ b/test/analytics/tests/instrumented_events/from_the_browser/viewport_resize.ts @@ -14,8 +14,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const browser = getService('browser'); const { common } = getPageObjects(['common']); - // Failing: See https://github.com/elastic/kibana/issues/155166 - describe.skip('Event "viewport_resize"', () => { + describe('Event "viewport_resize"', () => { beforeEach(async () => { // Navigating to `home` with the Welcome prompt because some runs were flaky // as we handle the Welcome screen only if the login prompt pops up. @@ -24,11 +23,16 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { }); it('should emit a "viewport_resize" event when the browser is resized', async () => { - const events = await ebtUIHelper.getEvents(1, { + let preResizeTs = new Date().toISOString(); + const events = await ebtUIHelper.getEvents(Infinity, { eventTypes: ['viewport_resize'], withTimeoutMs: 100, }); - expect(events.length).to.be(0); + if (events.length) { + const lastEvent = events.pop()!; + preResizeTs = lastEvent.timestamp; + } + // Resize the window await browser.setWindowSize(500, 500); const { height, width } = await browser.getWindowSize(); @@ -38,7 +42,10 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const actualInnerHeight = await browser.execute(() => window.innerHeight); expect(actualInnerHeight <= height).to.be(true); // The address bar takes some space when not running on HEADLESS - const [event] = await ebtUIHelper.getEvents(1, { eventTypes: ['viewport_resize'] }); + const [event] = await ebtUIHelper.getEvents(1, { + eventTypes: ['viewport_resize'], + fromTimestamp: preResizeTs, // Fetch the event after a known TS + }); expect(event.event_type).to.eql('viewport_resize'); expect(event.properties).to.eql({ viewport_width: 500, diff --git a/test/api_integration/apis/data_views/fields_for_wildcard_route/params.js b/test/api_integration/apis/data_views/fields_for_wildcard_route/params.js index b91c307cc1743..595d12f38c501 100644 --- a/test/api_integration/apis/data_views/fields_for_wildcard_route/params.js +++ b/test/api_integration/apis/data_views/fields_for_wildcard_route/params.js @@ -49,6 +49,15 @@ export default function ({ getService }) { }) .expect(200)); + it('accepts single meta_fields query param', () => + supertest + .get('/api/index_patterns/_fields_for_wildcard') + .query({ + pattern: '*', + meta_fields: ['_id'], + }) + .expect(200)); + it('rejects a comma-separated list of meta_fields', () => supertest .get('/api/index_patterns/_fields_for_wildcard') diff --git a/test/api_integration/apis/saved_objects/bulk_create.ts b/test/api_integration/apis/saved_objects/bulk_create.ts index b365df10f7d74..5119e43368cc5 100644 --- a/test/api_integration/apis/saved_objects/bulk_create.ts +++ b/test/api_integration/apis/saved_objects/bulk_create.ts @@ -75,7 +75,7 @@ export default function ({ getService }: FtrProviderContext) { }, coreMigrationVersion: '8.8.0', typeMigrationVersion: resp.body.saved_objects[1].typeMigrationVersion, - managed: resp.body.saved_objects[1].managed, + managed: false, references: [], namespaces: [SPACE_ID], }, diff --git a/test/api_integration/apis/saved_objects/bulk_get.ts b/test/api_integration/apis/saved_objects/bulk_get.ts index 6c97efd94d70a..c3adf21b6c55e 100644 --- a/test/api_integration/apis/saved_objects/bulk_get.ts +++ b/test/api_integration/apis/saved_objects/bulk_get.ts @@ -28,17 +28,42 @@ export default function ({ getService }: FtrProviderContext) { }, ]; + const BULK_REQUESTS_MANAGED = [ + { + type: 'visualization', + id: '3fdaa535-5baf-46bc-8265-705eda43b181', + }, + { + type: 'tag', + id: '0ed60f29-2021-4fd2-ba4e-943c61e2738c', + }, + { + type: 'tag', + id: '00ad6a46-6ac3-4f6c-892c-2f72c54a5e7d', + }, + { + type: 'dashboard', + id: '11fb046d-0e50-48a0-a410-a744b82cbffd', + }, + ]; + describe('_bulk_get', () => { before(async () => { await kibanaServer.importExport.load( 'test/api_integration/fixtures/kbn_archiver/saved_objects/basic.json' ); + await kibanaServer.importExport.load( + 'test/api_integration/fixtures/kbn_archiver/saved_objects/managed_basic.json' + ); }); after(async () => { await kibanaServer.importExport.unload( 'test/api_integration/fixtures/kbn_archiver/saved_objects/basic.json' ); + await kibanaServer.importExport.unload( + 'test/api_integration/fixtures/kbn_archiver/saved_objects/managed_basic.json' + ); }); it('should return 200 with individual responses', async () => @@ -115,5 +140,130 @@ export default function ({ getService }: FtrProviderContext) { expect(resp.body.saved_objects[0].migrationVersion).to.be.ok(); expect(resp.body.saved_objects[0].typeMigrationVersion).to.be.ok(); })); + + it('should return 200 with individual responses that include the managed property of each object', async () => + await supertest + .post(`/api/saved_objects/_bulk_get`) + .send(BULK_REQUESTS_MANAGED) + .expect(200) + .then((resp) => { + const mockDate = '2015-01-01T00:00:00.000Z'; + resp.body.saved_objects[0].updated_at = mockDate; + resp.body.saved_objects[1].updated_at = mockDate; + resp.body.saved_objects[2].updated_at = mockDate; + resp.body.saved_objects[3].updated_at = mockDate; + resp.body.saved_objects[0].created_at = mockDate; + resp.body.saved_objects[1].created_at = mockDate; + resp.body.saved_objects[2].created_at = mockDate; + resp.body.saved_objects[3].created_at = mockDate; + expect(resp.body.saved_objects.length).to.eql(4); + expect(resp.body).to.eql({ + saved_objects: [ + { + id: '3fdaa535-5baf-46bc-8265-705eda43b181', + type: 'visualization', + namespaces: ['default'], + migrationVersion: { + visualization: '8.5.0', + }, + coreMigrationVersion: '8.8.0', + typeMigrationVersion: '8.5.0', + updated_at: '2015-01-01T00:00:00.000Z', + created_at: '2015-01-01T00:00:00.000Z', + version: resp.body.saved_objects[0].version, + attributes: { + description: '', + kibanaSavedObjectMeta: { + searchSourceJSON: + resp.body.saved_objects[0].attributes.kibanaSavedObjectMeta.searchSourceJSON, + }, + title: 'Managed Count of requests', + uiStateJSON: '{"spy":{"mode":{"name":null,"fill":false}}}', + version: resp.body.saved_objects[0].attributes.version, + visState: resp.body.saved_objects[0].attributes.visState, + }, + references: [ + { + id: '91200a00-9efd-11e7-acb3-3dab96693fab', + name: 'kibanaSavedObjectMeta.searchSourceJSON.index', + type: 'index-pattern', + }, + ], + managed: true, + }, + { + id: '0ed60f29-2021-4fd2-ba4e-943c61e2738c', + type: 'tag', + updated_at: '2015-01-01T00:00:00.000Z', + created_at: '2015-01-01T00:00:00.000Z', + namespaces: ['default'], + migrationVersion: { + tag: '8.0.0', + }, + coreMigrationVersion: '8.8.0', + typeMigrationVersion: '8.0.0', + version: resp.body.saved_objects[1].version, + attributes: { color: '#E7664C', description: 'read-only', name: 'managed' }, + references: [], + managed: true, + }, + { + id: '00ad6a46-6ac3-4f6c-892c-2f72c54a5e7d', + type: 'tag', + namespaces: ['default'], + migrationVersion: { + tag: '8.0.0', + }, + coreMigrationVersion: '8.8.0', + typeMigrationVersion: '8.0.0', + updated_at: '2015-01-01T00:00:00.000Z', + created_at: '2015-01-01T00:00:00.000Z', + version: resp.body.saved_objects[2].version, + attributes: { color: '#173a58', description: 'Editable', name: 'unmanaged' }, + references: [], + managed: false, + }, + { + id: '11fb046d-0e50-48a0-a410-a744b82cbffd', + type: 'dashboard', + namespaces: ['default'], + migrationVersion: { + dashboard: '8.7.0', + }, + coreMigrationVersion: '8.8.0', + typeMigrationVersion: '8.7.0', + updated_at: '2015-01-01T00:00:00.000Z', + created_at: '2015-01-01T00:00:00.000Z', + version: resp.body.saved_objects[3].version, + attributes: { + description: '', + hits: 0, + kibanaSavedObjectMeta: + resp.body.saved_objects[3].attributes.kibanaSavedObjectMeta, + optionsJSON: '{"darkTheme":false}', + panelsJSON: resp.body.saved_objects[3].attributes.panelsJSON, + refreshInterval: resp.body.saved_objects[3].attributes.refreshInterval, + timeFrom: 'Wed Sep 16 2015 22:52:17 GMT-0700', + timeRestore: true, + timeTo: 'Fri Sep 18 2015 12:24:38 GMT-0700', + title: 'Managed Requests', + version: resp.body.saved_objects[3].attributes.version, + }, + references: [ + { + id: 'dd7caf20-9efd-11e7-acb3-3dab96693fab', + name: '1:panel_1', + type: 'visualization', + }, + ], + managed: true, + }, + ], + }); + expect(resp.body.saved_objects[0].managed).to.be.ok(); + expect(resp.body.saved_objects[1].managed).to.be.ok(); + expect(resp.body.saved_objects[2].managed).not.to.be.ok(); + expect(resp.body.saved_objects[3].managed).to.be.ok(); + })); }); } diff --git a/test/api_integration/apis/saved_objects/export.ts b/test/api_integration/apis/saved_objects/export.ts index ec7b82453ffce..0b22ec93c2b2c 100644 --- a/test/api_integration/apis/saved_objects/export.ts +++ b/test/api_integration/apis/saved_objects/export.ts @@ -26,7 +26,9 @@ export default function ({ getService }: FtrProviderContext) { ); }); - after(() => kibanaServer.spaces.delete(SPACE_ID)); + after(async () => { + await kibanaServer.spaces.delete(SPACE_ID); + }); describe('basic amount of saved objects', () => { it('should return objects in dependency order', async () => { @@ -578,5 +580,46 @@ export default function ({ getService }: FtrProviderContext) { .expect(200); }); }); + + describe('should retain the managed property value of exported saved objects', () => { + before(async () => { + await kibanaServer.importExport.unload( + 'test/api_integration/fixtures/kbn_archiver/saved_objects/basic.json', + { space: SPACE_ID } + ); + await kibanaServer.importExport.load( + 'test/api_integration/fixtures/kbn_archiver/saved_objects/managed_objects.json', + { space: SPACE_ID } + ); + }); + after(async () => { + await kibanaServer.importExport.unload( + 'test/api_integration/fixtures/kbn_archiver/saved_objects/managed_objects.json', + { space: SPACE_ID } + ); + }); + it('should retain all existing saved object properties', async () => { + // we're specifically asserting that the `managed` property isn't overwritten during export. + await supertest + .post(`/s/${SPACE_ID}/api/saved_objects/_export`) + .send({ + type: ['config', 'index-pattern'], + }) + .expect(200) + .then((resp) => { + const objects = ndjsonToObject(resp.text); + expect(objects).to.have.length(3); + expect(objects[0]).to.have.property('id', '6cda943f-a70e-43d4-b0cb-feb1b624cb62'); + expect(objects[0]).to.have.property('type', 'index-pattern'); + expect(objects[0]).to.have.property('managed', true); + expect(objects[1]).to.have.property('id', 'c1818992-bb2c-4a9a-b276-83ada7cce03e'); + expect(objects[1]).to.have.property('type', 'config'); + expect(objects[1]).to.have.property('managed', false); + expect(objects[2]).to.have.property('exportedCount', 2); + expect(objects[2]).to.have.property('missingRefCount', 0); + expect(objects[2].missingReferences).to.have.length(0); + }); + }); + }); }); } diff --git a/test/api_integration/apis/saved_objects/get.ts b/test/api_integration/apis/saved_objects/get.ts index a7b1f58c531f4..bf4ca7d240a89 100644 --- a/test/api_integration/apis/saved_objects/get.ts +++ b/test/api_integration/apis/saved_objects/get.ts @@ -18,11 +18,17 @@ export default function ({ getService }: FtrProviderContext) { await kibanaServer.importExport.load( 'test/api_integration/fixtures/kbn_archiver/saved_objects/basic.json' ); + await kibanaServer.importExport.load( + 'test/api_integration/fixtures/kbn_archiver/saved_objects/managed_basic.json' + ); }); after(async () => { await kibanaServer.importExport.unload( 'test/api_integration/fixtures/kbn_archiver/saved_objects/basic.json' ); + await kibanaServer.importExport.unload( + 'test/api_integration/fixtures/kbn_archiver/saved_objects/managed_basic.json' + ); }); it('should return 200', async () => @@ -60,8 +66,52 @@ export default function ({ getService }: FtrProviderContext) { }); expect(resp.body.migrationVersion).to.be.ok(); expect(resp.body.typeMigrationVersion).to.be.ok(); - expect(resp.body.managed).to.not.be.ok(); + expect(resp.body.managed).not.to.be.ok(); })); + it("should return an object's managed property", async () => { + await supertest + .get(`/api/saved_objects/dashboard/11fb046d-0e50-48a0-a410-a744b82cbffd`) + .expect(200) + .then((resp) => { + expect(resp.body).to.eql({ + id: '11fb046d-0e50-48a0-a410-a744b82cbffd', + type: 'dashboard', + namespaces: ['default'], + migrationVersion: { + dashboard: '8.7.0', + }, + coreMigrationVersion: '8.8.0', + typeMigrationVersion: '8.7.0', + updated_at: resp.body.updated_at, + created_at: resp.body.created_at, + version: resp.body.version, + attributes: { + description: '', + hits: 0, + kibanaSavedObjectMeta: resp.body.attributes.kibanaSavedObjectMeta, + optionsJSON: '{"darkTheme":false}', + panelsJSON: resp.body.attributes.panelsJSON, + refreshInterval: resp.body.attributes.refreshInterval, + timeFrom: resp.body.attributes.timeFrom, + timeRestore: true, + timeTo: resp.body.attributes.timeTo, + title: 'Managed Requests', + version: resp.body.attributes.version, + }, + references: [ + { + id: 'dd7caf20-9efd-11e7-acb3-3dab96693fab', + name: '1:panel_1', + type: 'visualization', + }, + ], + managed: true, + }); + expect(resp.body.migrationVersion).to.be.ok(); + expect(resp.body.typeMigrationVersion).to.be.ok(); + expect(resp.body.managed).to.be.ok(); + }); + }); describe('doc does not exist', () => { it('should return same generic error as when index does not exist', async () => diff --git a/test/api_integration/apis/saved_objects/import.ts b/test/api_integration/apis/saved_objects/import.ts index 0d9cfed365a00..507c692194f92 100644 --- a/test/api_integration/apis/saved_objects/import.ts +++ b/test/api_integration/apis/saved_objects/import.ts @@ -40,6 +40,42 @@ export default function ({ getService }: FtrProviderContext) { id: 'be3733a0-9efe-11e7-acb3-3dab96693fab', meta: { title: 'Requests', icon: 'dashboardApp' }, }; + const managedVis = { + id: '3fdaa535-5baf-46bc-8265-705eda43b181', + type: 'visualization', + meta: { + icon: 'visualizeApp', + title: 'Managed Count of requests', + }, + managed: true, + }; + const managedTag = { + id: '0ed60f29-2021-4fd2-ba4e-943c61e2738c', + type: 'tag', + meta: { + icon: 'tag', + title: 'managed', + }, + managed: true, + }; + const unmanagedTag = { + id: '00ad6a46-6ac3-4f6c-892c-2f72c54a5e7d', + type: 'tag', + meta: { + icon: 'tag', + title: 'unmanaged', + }, + managed: false, + }; + const managedDB = { + id: '11fb046d-0e50-48a0-a410-a744b82cbffd', + type: 'dashboard', + meta: { + icon: 'dashboardApp', + title: 'Managed Requests', + }, + managed: true, + }; describe('with basic data existing', () => { before(async () => { @@ -96,9 +132,9 @@ export default function ({ getService }: FtrProviderContext) { success: true, successCount: 3, successResults: [ - { ...indexPattern, overwrite: true }, - { ...visualization, overwrite: true }, - { ...dashboard, overwrite: true }, + { ...indexPattern, overwrite: true, managed: false }, + { ...visualization, overwrite: true, managed: false }, + { ...dashboard, overwrite: true, managed: false }, ], warnings: [], }); @@ -155,6 +191,7 @@ export default function ({ getService }: FtrProviderContext) { title: 'dashboard-b', }, type: 'dashboard', + managed: false, }, { id: 'dashboard-a', @@ -163,6 +200,7 @@ export default function ({ getService }: FtrProviderContext) { title: 'dashboard-a', }, type: 'dashboard', + managed: false, }, ], warnings: [], @@ -239,6 +277,74 @@ export default function ({ getService }: FtrProviderContext) { }); }); }); + + it('should retain existing saved object managed property', async () => { + const objectsToImport = [ + JSON.stringify({ + type: 'config', + id: '1234', + attributes: {}, + references: [], + managed: true, + }), + ]; + await supertest + .post('/api/saved_objects/_import') + .attach('file', Buffer.from(objectsToImport.join('\n'), 'utf8'), 'export.ndjson') + .expect(200) + .then((resp) => { + expect(resp.body).to.eql({ + success: true, + successCount: 1, + successResults: [ + { + id: '1234', + meta: { + title: 'Advanced Settings [1234]', + }, + type: 'config', + managed: true, + }, + ], + warnings: [], + }); + }); + }); + + it('should not overwrite managed if set on objects beging imported', async () => { + await supertest + .post('/api/saved_objects/_import') + .attach('file', join(__dirname, '../../fixtures/import_managed.ndjson')) + .expect(200) + .then((resp) => { + expect(resp.body).to.eql({ + success: true, + successCount: 4, + successResults: [managedVis, unmanagedTag, managedTag, managedDB], + warnings: [], + }); + }); + }); + it('should return 200 when conflicts exist but overwrite is passed in, without changing managed property on the object', async () => { + await supertest + .post('/api/saved_objects/_import') + .query({ overwrite: true }) + .attach('file', join(__dirname, '../../fixtures/import_managed.ndjson')) + .expect(200) + .then((resp) => { + expect(resp.body).to.eql({ + success: true, + successCount: 4, + successResults: [ + { ...managedVis, overwrite: true }, + { ...unmanagedTag, overwrite: true }, + { ...managedTag, overwrite: true }, + { ...managedDB, overwrite: true }, + ], + warnings: [], + }); + }); + }); }); }); } diff --git a/test/api_integration/apis/saved_objects/resolve_import_errors.ts b/test/api_integration/apis/saved_objects/resolve_import_errors.ts index 7ca61a26a11c1..ce9ca42a1dedc 100644 --- a/test/api_integration/apis/saved_objects/resolve_import_errors.ts +++ b/test/api_integration/apis/saved_objects/resolve_import_errors.ts @@ -84,9 +84,9 @@ export default function ({ getService }: FtrProviderContext) { success: true, successCount: 3, successResults: [ - { ...indexPattern, overwrite: true }, - { ...visualization, overwrite: true }, - { ...dashboard, overwrite: true }, + { ...indexPattern, overwrite: true, managed: false }, + { ...visualization, overwrite: true, managed: false }, + { ...dashboard, overwrite: true, managed: false }, ], warnings: [], }); @@ -112,7 +112,7 @@ export default function ({ getService }: FtrProviderContext) { expect(resp.body).to.eql({ success: true, successCount: 1, - successResults: [{ ...visualization, overwrite: true }], + successResults: [{ ...visualization, overwrite: true, managed: false }], warnings: [], }); }); @@ -163,6 +163,7 @@ export default function ({ getService }: FtrProviderContext) { type: 'visualization', id: '1', meta: { title: 'My favorite vis', icon: 'visualizeApp' }, + managed: false, }, ], warnings: [], diff --git a/test/api_integration/fixtures/import_managed.ndjson b/test/api_integration/fixtures/import_managed.ndjson new file mode 100644 index 0000000000000..82ebc57a8b688 --- /dev/null +++ b/test/api_integration/fixtures/import_managed.ndjson @@ -0,0 +1,4 @@ +{"id":"3fdaa535-5baf-46bc-8265-705eda43b181","type":"visualization","namespaces":["default"],"coreMigrationVersion":"8.8.0","typeMigrationVersion":"8.5.0","updated_at":"2023-04-24T19:57:13.859Z","created_at":"2023-04-24T19:57:13.859Z","version":"WzExNCwxXQ==","attributes":{"description":"","kibanaSavedObjectMeta":{"searchSourceJSON":"{\"filter\":[],\"query\":{\"query\":\"\",\"language\":\"lucene\"},\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}"},"title":"Managed Count of requests","uiStateJSON":"{\"spy\":{\"mode\":{\"name\":null,\"fill\":false}}}","version":1,"visState":"{\"title\":\"Count of requests\",\"type\":\"area\",\"params\":{\"type\":\"area\",\"grid\":{\"categoryLines\":false,\"style\":{\"color\":\"#eee\"}},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"truncate\":100,\"filter\":true},\"title\":{}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"Count\"}}],\"seriesParams\":[{\"show\":\"true\",\"type\":\"area\",\"mode\":\"stacked\",\"data\":{\"label\":\"Count\",\"id\":\"1\"},\"drawLinesBetweenPoints\":true,\"showCircles\":true,\"interpolate\":\"linear\",\"valueAxis\":\"ValueAxis-1\"}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":false,\"palette\":{\"type\":\"palette\",\"name\":\"kibana_palette\"},\"isVislibVis\":true,\"detailedTooltip\":true,\"fittingFunction\":\"zero\",\"legendSize\":\"auto\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"schema\":\"segment\",\"params\":{\"field\":\"@timestamp\",\"interval\":\"auto\",\"min_doc_count\":1,\"extended_bounds\":{}}}]}"},"references":[{"id":"91200a00-9efd-11e7-acb3-3dab96693fab","name":"kibanaSavedObjectMeta.searchSourceJSON.index","type":"index-pattern"}],"managed":true} +{"id":"00ad6a46-6ac3-4f6c-892c-2f72c54a5e7d","type":"tag","namespaces":["default"],"coreMigrationVersion":"8.8.0","typeMigrationVersion":"8.0.0","updated_at":"2023-04-24T19:58:24.550Z","created_at":"2023-04-24T19:58:24.550Z","version":"WzEyMSwxXQ==","attributes":{"color":"#173a58","description":"Editable","name":"unmanaged"},"references":[],"managed":false} +{"id":"0ed60f29-2021-4fd2-ba4e-943c61e2738c","type":"tag","namespaces":["default"],"coreMigrationVersion":"8.8.0","typeMigrationVersion":"8.0.0","updated_at":"2023-04-24T19:58:24.550Z","created_at":"2023-04-24T19:58:24.550Z","version":"WzEyMiwxXQ==","attributes":{"color":"#E7664C","description":"read-only","name":"managed"},"references":[],"managed":true} +{"id":"11fb046d-0e50-48a0-a410-a744b82cbffd","type":"dashboard","namespaces":["default"],"coreMigrationVersion":"8.8.0","typeMigrationVersion":"8.7.0","updated_at":"2023-04-24T20:54:57.921Z","created_at":"2023-04-24T20:54:57.921Z","version":"WzMwOSwxXQ==","attributes":{"description":"","hits":0,"kibanaSavedObjectMeta":{"searchSourceJSON":"{\"query\":{\"query\":\"\",\"language\":\"lucene\"},\"filter\":[],\"highlightAll\":true,\"version\":true}"},"optionsJSON":"{\"darkTheme\":false}","panelsJSON":"[{\"version\":\"7.3.0\",\"type\":\"visualization\",\"gridData\":{\"x\":0,\"y\":0,\"w\":24,\"h\":12,\"i\":\"1\"},\"panelIndex\":\"1\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_1\"}]","refreshInterval":{"display":"Off","pause":false,"value":0},"timeFrom":"Wed Sep 16 2015 22:52:17 GMT-0700","timeRestore":true,"timeTo":"Fri Sep 18 2015 12:24:38 GMT-0700","title":"Managed Requests","version":1},"references":[{"id":"dd7caf20-9efd-11e7-acb3-3dab96693fab","name":"1:panel_1","type":"visualization"}],"managed":true} diff --git a/test/api_integration/fixtures/kbn_archiver/saved_objects/managed_basic.json b/test/api_integration/fixtures/kbn_archiver/saved_objects/managed_basic.json new file mode 100644 index 0000000000000..4ca74083f824f --- /dev/null +++ b/test/api_integration/fixtures/kbn_archiver/saved_objects/managed_basic.json @@ -0,0 +1,110 @@ +{ + "id": "3fdaa535-5baf-46bc-8265-705eda43b181", + "type": "visualization", + "namespaces": [ + "default" + ], + "coreMigrationVersion": "8.8.0", + "typeMigrationVersion": "8.5.0", + "updated_at": "2023-04-24T19:57:13.859Z", + "created_at": "2023-04-24T19:57:13.859Z", + "version": "WzExNCwxXQ==", + "attributes": { + "description": "", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"filter\":[],\"query\":{\"query\":\"\",\"language\":\"lucene\"},\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + }, + "title": "Managed Count of requests", + "uiStateJSON": "{\"spy\":{\"mode\":{\"name\":null,\"fill\":false}}}", + "version": 1, + "visState": "{\"title\":\"Count of requests\",\"type\":\"area\",\"params\":{\"type\":\"area\",\"grid\":{\"categoryLines\":false,\"style\":{\"color\":\"#eee\"}},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"truncate\":100,\"filter\":true},\"title\":{}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"Count\"}}],\"seriesParams\":[{\"show\":\"true\",\"type\":\"area\",\"mode\":\"stacked\",\"data\":{\"label\":\"Count\",\"id\":\"1\"},\"drawLinesBetweenPoints\":true,\"showCircles\":true,\"interpolate\":\"linear\",\"valueAxis\":\"ValueAxis-1\"}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":false,\"palette\":{\"type\":\"palette\",\"name\":\"kibana_palette\"},\"isVislibVis\":true,\"detailedTooltip\":true,\"fittingFunction\":\"zero\",\"legendSize\":\"auto\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"schema\":\"segment\",\"params\":{\"field\":\"@timestamp\",\"interval\":\"auto\",\"min_doc_count\":1,\"extended_bounds\":{}}}]}" + }, + "references": [ + { + "id": "91200a00-9efd-11e7-acb3-3dab96693fab", + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern" + } + ], + "managed": true +} + +{ + "id": "00ad6a46-6ac3-4f6c-892c-2f72c54a5e7d", + "type": "tag", + "namespaces": [ + "default" + ], + "coreMigrationVersion": "8.8.0", + "typeMigrationVersion": "8.0.0", + "updated_at": "2023-04-24T19:58:24.550Z", + "created_at": "2023-04-24T19:58:24.550Z", + "version": "WzEyMSwxXQ==", + "attributes": { + "color": "#173a58", + "description": "Editable", + "name": "unmanaged" + }, + "references": [], + "managed": false +} + +{ + "id": "0ed60f29-2021-4fd2-ba4e-943c61e2738c", + "type": "tag", + "namespaces": [ + "default" + ], + "coreMigrationVersion": "8.8.0", + "typeMigrationVersion": "8.0.0", + "updated_at": "2023-04-24T19:58:24.550Z", + "created_at": "2023-04-24T19:58:24.550Z", + "version": "WzEyMiwxXQ==", + "attributes": { + "color": "#E7664C", + "description": "read-only", + "name": "managed" + }, + "references": [], + "managed": true +} + +{ + "id": "11fb046d-0e50-48a0-a410-a744b82cbffd", + "type": "dashboard", + "namespaces": [ + "default" + ], + "coreMigrationVersion": "8.8.0", + "typeMigrationVersion": "8.7.0", + "updated_at": "2023-04-24T20:54:57.921Z", + "created_at": "2023-04-24T20:54:57.921Z", + "version": "WzMwOSwxXQ==", + "attributes": { + "description": "", + "hits": 0, + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"\",\"language\":\"lucene\"},\"filter\":[],\"highlightAll\":true,\"version\":true}" + }, + "optionsJSON": "{\"darkTheme\":false}", + "panelsJSON": "[{\"version\":\"7.3.0\",\"type\":\"visualization\",\"gridData\":{\"x\":0,\"y\":0,\"w\":24,\"h\":12,\"i\":\"1\"},\"panelIndex\":\"1\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_1\"}]", + "refreshInterval": { + "display": "Off", + "pause": false, + "value": 0 + }, + "timeFrom": "Wed Sep 16 2015 22:52:17 GMT-0700", + "timeRestore": true, + "timeTo": "Fri Sep 18 2015 12:24:38 GMT-0700", + "title": "Managed Requests", + "version": 1 + }, + "references": [ + { + "id": "dd7caf20-9efd-11e7-acb3-3dab96693fab", + "name": "1:panel_1", + "type": "visualization" + } + ], + "managed": true +} diff --git a/test/api_integration/fixtures/kbn_archiver/saved_objects/managed_objects.json b/test/api_integration/fixtures/kbn_archiver/saved_objects/managed_objects.json new file mode 100644 index 0000000000000..7aa1e872adf41 --- /dev/null +++ b/test/api_integration/fixtures/kbn_archiver/saved_objects/managed_objects.json @@ -0,0 +1,98 @@ +{ + "attributes": { + "buildNum": 8467, + "defaultIndex": "91200a00-9efd-11e7-acb3-3dab96693fab" + }, + "coreMigrationVersion": "8.8.0", + "created_at": "2023-04-21T23:19:26.101Z", + "id": "c1818992-bb2c-4a9a-b276-83ada7cce03e", + "managed": false, + "references": [], + "type": "config", + "typeMigrationVersion": "8.7.0", + "updated_at": "2023-04-21T23:19:26.101Z", + "version": "WzkzLDFd" +} + +{ + "attributes": { + "fields": "[{\"name\":\"@message\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"@message.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"@tags\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"@tags.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"@timestamp\",\"type\":\"date\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"_id\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"_index\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"_score\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_source\",\"type\":\"_source\",\"count\":0,\"scripted\":false,\"searchable\":false,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"_type\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":false},{\"name\":\"agent\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"agent.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"bytes\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"clientip\",\"type\":\"ip\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"extension\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"extension.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"geo.coordinates\",\"type\":\"geo_point\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"geo.dest\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"geo.src\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"geo.srcdest\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"headings\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"headings.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"host\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"host.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"id\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"index\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"index.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"ip\",\"type\":\"ip\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"links\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"links.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"machine.os\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"machine.os.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"machine.ram\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"memory\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"meta.char\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"meta.related\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"meta.user.firstname\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"meta.user.lastname\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"phpmemory\",\"type\":\"number\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"referer\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"relatedContent.article:modified_time\",\"type\":\"date\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"relatedContent.article:published_time\",\"type\":\"date\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"relatedContent.article:section\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.article:section.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"relatedContent.article:tag\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.article:tag.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"relatedContent.og:description\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.og:description.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"relatedContent.og:image\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.og:image.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"relatedContent.og:image:height\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.og:image:height.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"relatedContent.og:image:width\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.og:image:width.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"relatedContent.og:site_name\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.og:site_name.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"relatedContent.og:title\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.og:title.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"relatedContent.og:type\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.og:type.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"relatedContent.og:url\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.og:url.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"relatedContent.twitter:card\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.twitter:card.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"relatedContent.twitter:description\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.twitter:description.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"relatedContent.twitter:image\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.twitter:image.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"relatedContent.twitter:site\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.twitter:site.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"relatedContent.twitter:title\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.twitter:title.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"relatedContent.url\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"relatedContent.url.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"request\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"request.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"response\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"response.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"spaces\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"spaces.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"type\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"url\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"url.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"utc_time\",\"type\":\"date\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true},{\"name\":\"xss\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":false,\"readFromDocValues\":false},{\"name\":\"xss.raw\",\"type\":\"string\",\"count\":0,\"scripted\":false,\"searchable\":true,\"aggregatable\":true,\"readFromDocValues\":true}]", + "timeFieldName": "@timestamp", + "title": "logstash-*" + }, + "coreMigrationVersion": "8.8.0", + "created_at": "2023-04-21T23:19:26.101Z", + "id": "6cda943f-a70e-43d4-b0cb-feb1b624cb62", + "managed": true, + "references": [], + "type": "index-pattern", + "typeMigrationVersion": "7.11.0", + "updated_at": "2023-04-21T23:19:26.101Z", + "version": "Wzk0LDFd" +} + +{ + "attributes": { + "description": "", + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"filter\":[],\"query\":{\"query\":\"\",\"language\":\"lucene\"},\"indexRefName\":\"kibanaSavedObjectMeta.searchSourceJSON.index\"}" + }, + "title": "Count of requests", + "uiStateJSON": "{\"spy\":{\"mode\":{\"name\":null,\"fill\":false}}}", + "version": 1, + "visState": "{\"title\":\"Count of requests\",\"type\":\"area\",\"params\":{\"type\":\"area\",\"grid\":{\"categoryLines\":false,\"style\":{\"color\":\"#eee\"}},\"categoryAxes\":[{\"id\":\"CategoryAxis-1\",\"type\":\"category\",\"position\":\"bottom\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\"},\"labels\":{\"show\":true,\"truncate\":100,\"filter\":true},\"title\":{}}],\"valueAxes\":[{\"id\":\"ValueAxis-1\",\"name\":\"LeftAxis-1\",\"type\":\"value\",\"position\":\"left\",\"show\":true,\"style\":{},\"scale\":{\"type\":\"linear\",\"mode\":\"normal\"},\"labels\":{\"show\":true,\"rotate\":0,\"filter\":false,\"truncate\":100},\"title\":{\"text\":\"Count\"}}],\"seriesParams\":[{\"show\":\"true\",\"type\":\"area\",\"mode\":\"stacked\",\"data\":{\"label\":\"Count\",\"id\":\"1\"},\"drawLinesBetweenPoints\":true,\"showCircles\":true,\"interpolate\":\"linear\",\"valueAxis\":\"ValueAxis-1\"}],\"addTooltip\":true,\"addLegend\":true,\"legendPosition\":\"right\",\"times\":[],\"addTimeMarker\":false,\"palette\":{\"type\":\"palette\",\"name\":\"kibana_palette\"},\"isVislibVis\":true,\"detailedTooltip\":true,\"fittingFunction\":\"zero\",\"legendSize\":\"auto\"},\"aggs\":[{\"id\":\"1\",\"enabled\":true,\"type\":\"count\",\"schema\":\"metric\",\"params\":{}},{\"id\":\"2\",\"enabled\":true,\"type\":\"date_histogram\",\"schema\":\"segment\",\"params\":{\"field\":\"@timestamp\",\"interval\":\"auto\",\"min_doc_count\":1,\"extended_bounds\":{}}}]}" + }, + "coreMigrationVersion": "8.8.0", + "created_at": "2023-04-21T23:19:26.101Z", + "id": "37fb7899-4b68-4a5b-9b4c-f9587ab7f0bc", + "managed": true, + "references": [ + { + "id": "6cda943f-a70e-43d4-b0cb-feb1b624cb62", + "name": "kibanaSavedObjectMeta.searchSourceJSON.index", + "type": "index-pattern" + } + ], + "type": "visualization", + "typeMigrationVersion": "8.5.0", + "updated_at": "2023-04-21T23:19:26.101Z", + "version": "Wzk1LDFd" +} + +{ + "attributes": { + "description": "", + "hits": 0, + "kibanaSavedObjectMeta": { + "searchSourceJSON": "{\"query\":{\"query\":\"\",\"language\":\"lucene\"},\"filter\":[],\"highlightAll\":true,\"version\":true}" + }, + "optionsJSON": "{\"darkTheme\":false}", + "panelsJSON": "[{\"version\":\"7.3.0\",\"type\":\"visualization\",\"gridData\":{\"x\":0,\"y\":0,\"w\":24,\"h\":12,\"i\":\"1\"},\"panelIndex\":\"1\",\"embeddableConfig\":{\"enhancements\":{}},\"panelRefName\":\"panel_1\"}]", + "refreshInterval": { + "display": "Off", + "pause": false, + "value": 0 + }, + "timeFrom": "Wed Sep 16 2015 22:52:17 GMT-0700", + "timeRestore": true, + "timeTo": "Fri Sep 18 2015 12:24:38 GMT-0700", + "title": "Requests", + "version": 1 + }, + "coreMigrationVersion": "8.8.0", + "created_at": "2023-04-21T23:19:26.101Z", + "id": "def09d77-089a-4e4f-b30b-eb9848d59648", + "managed": true, + "references": [ + { + "id": "37fb7899-4b68-4a5b-9b4c-f9587ab7f0bc", + "name": "1:panel_1", + "type": "visualization" + } + ], + "type": "dashboard", + "typeMigrationVersion": "8.7.0", + "updated_at": "2023-04-21T23:19:26.101Z", + "version": "Wzk2LDFd" +} + diff --git a/test/functional/apps/discover/group1/_discover_histogram.ts b/test/functional/apps/discover/group1/_discover_histogram.ts index 03608566969a5..c19005bfb12ff 100644 --- a/test/functional/apps/discover/group1/_discover_histogram.ts +++ b/test/functional/apps/discover/group1/_discover_histogram.ts @@ -292,5 +292,35 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { // check no error state expect(await PageObjects.discover.isChartVisible()).to.be(true); }); + + it('should reset all histogram state when resetting the saved search', async () => { + await PageObjects.common.navigateToApp('discover'); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.timePicker.setDefaultAbsoluteRange(); + const savedSearch = 'histogram state'; + await PageObjects.discover.saveSearch(savedSearch); + await PageObjects.discover.chooseBreakdownField('extension.keyword'); + await PageObjects.discover.setChartInterval('Second'); + let requestData = await testSubjects.getAttribute( + 'unifiedHistogramChart', + 'data-request-data' + ); + expect(JSON.parse(requestData)).to.eql({ + dataViewId: 'long-window-logstash-*', + timeField: '@timestamp', + timeInterval: 's', + breakdownField: 'extension.keyword', + }); + await PageObjects.discover.toggleChartVisibility(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + await PageObjects.discover.clickResetSavedSearchButton(); + await PageObjects.discover.waitUntilSearchingHasFinished(); + requestData = await testSubjects.getAttribute('unifiedHistogramChart', 'data-request-data'); + expect(JSON.parse(requestData)).to.eql({ + dataViewId: 'long-window-logstash-*', + timeField: '@timestamp', + timeInterval: 'auto', + }); + }); }); } diff --git a/test/plugin_functional/test_suites/saved_objects_hidden_type/import.ts b/test/plugin_functional/test_suites/saved_objects_hidden_type/import.ts index f8fa3c11a1b8c..897170a5f6a30 100644 --- a/test/plugin_functional/test_suites/saved_objects_hidden_type/import.ts +++ b/test/plugin_functional/test_suites/saved_objects_hidden_type/import.ts @@ -47,6 +47,7 @@ export default function ({ getService }: PluginFunctionalProviderContext) { meta: { title: 'my title', }, + managed: false, }, ], }); diff --git a/test/plugin_functional/test_suites/saved_objects_hidden_type/resolve_import_errors.ts b/test/plugin_functional/test_suites/saved_objects_hidden_type/resolve_import_errors.ts index be2af8cd5d115..26688ddd20046 100644 --- a/test/plugin_functional/test_suites/saved_objects_hidden_type/resolve_import_errors.ts +++ b/test/plugin_functional/test_suites/saved_objects_hidden_type/resolve_import_errors.ts @@ -59,6 +59,7 @@ export default function ({ getService }: PluginFunctionalProviderContext) { title: 'new title!', }, overwrite: true, + managed: false, }, ], }); diff --git a/test/plugin_functional/test_suites/saved_objects_management/hidden_from_http_apis.ts b/test/plugin_functional/test_suites/saved_objects_management/hidden_from_http_apis.ts index d9516ee0331c4..c37bd671a764f 100644 --- a/test/plugin_functional/test_suites/saved_objects_management/hidden_from_http_apis.ts +++ b/test/plugin_functional/test_suites/saved_objects_management/hidden_from_http_apis.ts @@ -188,6 +188,7 @@ export default function ({ getService }: PluginFunctionalProviderContext) { title: 'I am hidden from http apis but the client can still see me', }, type: 'test-hidden-from-http-apis-importable-exportable', + managed: false, }, { id: 'not-hidden-from-http-apis-import1', @@ -195,6 +196,7 @@ export default function ({ getService }: PluginFunctionalProviderContext) { title: 'I am not hidden from http apis', }, type: 'test-not-hidden-from-http-apis-importable-exportable', + managed: false, }, ], warnings: [], diff --git a/test/plugin_functional/test_suites/saved_objects_management/visible_in_management.ts b/test/plugin_functional/test_suites/saved_objects_management/visible_in_management.ts index c4cbd575dc064..3567db0172ac8 100644 --- a/test/plugin_functional/test_suites/saved_objects_management/visible_in_management.ts +++ b/test/plugin_functional/test_suites/saved_objects_management/visible_in_management.ts @@ -89,6 +89,7 @@ export default function ({ getService }: PluginFunctionalProviderContext) { title: 'Saved object type that is not visible in management', }, type: 'test-not-visible-in-management', + managed: false, }, ], warnings: [], diff --git a/tsconfig.base.json b/tsconfig.base.json index e80e83b23d7b2..47391d9185f14 100644 --- a/tsconfig.base.json +++ b/tsconfig.base.json @@ -1142,8 +1142,12 @@ "@kbn/server-route-repository/*": ["packages/kbn-server-route-repository/*"], "@kbn/serverless": ["x-pack/plugins/serverless"], "@kbn/serverless/*": ["x-pack/plugins/serverless/*"], + "@kbn/serverless-observability": ["x-pack/plugins/serverless_observability"], + "@kbn/serverless-observability/*": ["x-pack/plugins/serverless_observability/*"], "@kbn/serverless-project-switcher": ["packages/serverless/project_switcher"], "@kbn/serverless-project-switcher/*": ["packages/serverless/project_switcher/*"], + "@kbn/serverless-search": ["x-pack/plugins/serverless_search"], + "@kbn/serverless-search/*": ["x-pack/plugins/serverless_search/*"], "@kbn/serverless-storybook-config": ["packages/serverless/storybook/config"], "@kbn/serverless-storybook-config/*": ["packages/serverless/storybook/config/*"], "@kbn/serverless-types": ["packages/serverless/types"], @@ -1178,6 +1182,8 @@ "@kbn/shared-ux-card-no-data-mocks/*": ["packages/shared-ux/card/no_data/mocks/*"], "@kbn/shared-ux-card-no-data-types": ["packages/shared-ux/card/no_data/types"], "@kbn/shared-ux-card-no-data-types/*": ["packages/shared-ux/card/no_data/types/*"], + "@kbn/shared-ux-chrome-navigation": ["packages/shared-ux/chrome/navigation"], + "@kbn/shared-ux-chrome-navigation/*": ["packages/shared-ux/chrome/navigation/*"], "@kbn/shared-ux-file-context": ["packages/shared-ux/file/context"], "@kbn/shared-ux-file-context/*": ["packages/shared-ux/file/context/*"], "@kbn/shared-ux-file-image": ["packages/shared-ux/file/image/impl"], @@ -1430,6 +1436,8 @@ "@kbn/vis-type-vislib-plugin/*": ["src/plugins/vis_types/vislib/*"], "@kbn/vis-type-xy-plugin": ["src/plugins/vis_types/xy"], "@kbn/vis-type-xy-plugin/*": ["src/plugins/vis_types/xy/*"], + "@kbn/visualization-ui-components": ["src/plugins/visualization_ui_components"], + "@kbn/visualization-ui-components/*": ["src/plugins/visualization_ui_components/*"], "@kbn/visualizations-plugin": ["src/plugins/visualizations"], "@kbn/visualizations-plugin/*": ["src/plugins/visualizations/*"], "@kbn/watcher-plugin": ["x-pack/plugins/watcher"], diff --git a/x-pack/plugins/alerting/common/index.ts b/x-pack/plugins/alerting/common/index.ts index 1fa0806effdef..d71b69bcb51e7 100644 --- a/x-pack/plugins/alerting/common/index.ts +++ b/x-pack/plugins/alerting/common/index.ts @@ -66,4 +66,4 @@ export const INTERNAL_ALERTING_API_GET_ACTIVE_MAINTENANCE_WINDOWS_PATH = export const ALERTS_FEATURE_ID = 'alerts'; export const MONITORING_HISTORY_LIMIT = 200; -export const ENABLE_MAINTENANCE_WINDOWS = false; +export const ENABLE_MAINTENANCE_WINDOWS = true; diff --git a/x-pack/plugins/alerting/public/pages/maintenance_windows/translations.ts b/x-pack/plugins/alerting/public/pages/maintenance_windows/translations.ts index 7e0c2fa484f7a..3685398fba223 100644 --- a/x-pack/plugins/alerting/public/pages/maintenance_windows/translations.ts +++ b/x-pack/plugins/alerting/public/pages/maintenance_windows/translations.ts @@ -572,7 +572,7 @@ export const UPCOMING = i18n.translate('xpack.alerting.maintenanceWindows.upcomi export const UPGRADE_TO_PLATINUM = i18n.translate( 'xpack.alerting.maintenanceWindows.licenseCallout.updgradeToPlatinumTitle', { - defaultMessage: 'Maintenance Windows are a subscription feature.', + defaultMessage: 'Maintenance windows are a subscription feature', } ); diff --git a/x-pack/plugins/alerting/server/lib/convert_rule_ids_to_kuery_node.test.ts b/x-pack/plugins/alerting/server/lib/convert_rule_ids_to_kuery_node.test.ts index 0c17c68d6162b..258133dab6118 100644 --- a/x-pack/plugins/alerting/server/lib/convert_rule_ids_to_kuery_node.test.ts +++ b/x-pack/plugins/alerting/server/lib/convert_rule_ids_to_kuery_node.test.ts @@ -61,6 +61,10 @@ describe('convertRuleIdsToKueryNode', () => { }); test('should convert empty ids array correctly', () => { - expect(convertRuleIdsToKueryNode([])).toEqual(undefined); + expect(convertRuleIdsToKueryNode([])).toEqual({ + arguments: [], + function: 'or', + type: 'function', + }); }); }); diff --git a/x-pack/plugins/apm/public/components/app/mobile/transaction_overview/transaction_overview_tabs/stats_list/get_columns.tsx b/x-pack/plugins/apm/public/components/app/mobile/transaction_overview/transaction_overview_tabs/stats_list/get_columns.tsx index 18ac252011357..9bea439931bed 100644 --- a/x-pack/plugins/apm/public/components/app/mobile/transaction_overview/transaction_overview_tabs/stats_list/get_columns.tsx +++ b/x-pack/plugins/apm/public/components/app/mobile/transaction_overview/transaction_overview_tabs/stats_list/get_columns.tsx @@ -33,13 +33,11 @@ type MobileDetailedStatisticsByField = APIReturnType<'GET /internal/apm/mobile-services/{serviceName}/detailed_statistics'>; export function getColumns({ - agentName, detailedStatisticsLoading, detailedStatistics, comparisonEnabled, offset, }: { - agentName?: string; detailedStatisticsLoading: boolean; detailedStatistics: MobileDetailedStatisticsByField; comparisonEnabled?: boolean; diff --git a/x-pack/plugins/apm/server/routes/mobile/get_mobile_main_statistics_by_field.ts b/x-pack/plugins/apm/server/routes/mobile/get_mobile_main_statistics_by_field.ts index a5783997e391b..af345d52322bf 100644 --- a/x-pack/plugins/apm/server/routes/mobile/get_mobile_main_statistics_by_field.ts +++ b/x-pack/plugins/apm/server/routes/mobile/get_mobile_main_statistics_by_field.ts @@ -40,10 +40,18 @@ export interface MobileMainStatisticsResponse { name: string | number; latency: number | null; throughput: number; - crashRate?: number; + crashRate: number; }>; } +type MergedQueriesResponse = Array<{ + name: string | number; + latency: number | null; + throughput: number; + sessions: number; + crashes?: number; +}>; + export async function getMobileMainStatisticsByField({ kuery, apmEventClient, @@ -55,7 +63,7 @@ export async function getMobileMainStatisticsByField({ }: Props) { async function getMobileTransactionEventStatistics() { const response = await apmEventClient.search( - `get_mobile_main_statistics_by_field`, + `get_mobile_transaction_events_main_statistics_by_field`, { apm: { sources: [ @@ -90,6 +98,11 @@ export async function getMobileMainStatisticsByField({ field: TRANSACTION_DURATION, }, }, + sessions: { + cardinality: { + field: SESSION_ID, + }, + }, }, }, }, @@ -110,66 +123,59 @@ export async function getMobileMainStatisticsByField({ end, value: bucket.doc_count, }), + sessions: bucket.sessions.value, }; }) ?? [] ); } async function getMobileErrorEventStatistics() { - const response = await apmEventClient.search( - `get_mobile_transaction_events_main_statistics_by_field`, - { - apm: { - sources: [ - { - documentType: ApmDocumentType.ErrorEvent, - rollupInterval: RollupInterval.None, - }, - ], + const response = await apmEventClient.search(`get_mobile_crashes`, { + apm: { + sources: [ + { + documentType: ApmDocumentType.ErrorEvent, + rollupInterval: RollupInterval.None, + }, + ], + }, + body: { + track_total_hits: false, + size: 0, + query: { + bool: { + filter: [ + ...termQuery(SERVICE_NAME, serviceName), + ...rangeQuery(start, end), + ...environmentQuery(environment), + ...kqlQuery(kuery), + ], + }, }, - body: { - track_total_hits: false, - size: 0, - query: { - bool: { - filter: [ - ...termQuery(SERVICE_NAME, serviceName), - ...rangeQuery(start, end), - ...environmentQuery(environment), - ...kqlQuery(kuery), - ], + aggs: { + main_statistics: { + terms: { + field, + size: 1000, }, - }, - aggs: { - main_statistics: { - terms: { - field, - size: 1000, - }, - aggs: { - sessions: { - cardinality: { - field: SESSION_ID, - }, - }, - crashes: { - filter: { - term: { - [ERROR_TYPE]: 'crash', - }, + aggs: { + crashes: { + filter: { + term: { + [ERROR_TYPE]: 'crash', }, }, }, }, }, }, - } - ); + }, + }); return ( response.aggregations?.main_statistics.buckets.map((bucket) => { return { name: bucket.key, - crashRate: bucket.crashes.doc_count / bucket.sessions.value ?? 0, + crashes: bucket.crashes.doc_count ?? 0, }; }) ?? [] ); @@ -180,7 +186,19 @@ export async function getMobileMainStatisticsByField({ getMobileErrorEventStatistics(), ]); - const mainStatistics = merge(transactioEventStatistics, errorEventStatistics); + const mainStatisticsMerged: MergedQueriesResponse = merge( + transactioEventStatistics, + errorEventStatistics + ); + + const mainStatistics = mainStatisticsMerged.map((item) => { + return { + name: item.name, + latency: item.latency, + throughput: item.throughput, + crashRate: item.crashes ? item.crashes / item.sessions : 0, + }; + }); return { mainStatistics }; } diff --git a/x-pack/plugins/asset_manager/common/types_api.ts b/x-pack/plugins/asset_manager/common/types_api.ts index dbf470ac110de..8ec68734af24c 100644 --- a/x-pack/plugins/asset_manager/common/types_api.ts +++ b/x-pack/plugins/asset_manager/common/types_api.ts @@ -5,8 +5,16 @@ * 2.0. */ +import { schema } from '@kbn/config-schema'; + +export const assetTypeRT = schema.oneOf([ + schema.literal('k8s.pod'), + schema.literal('k8s.cluster'), + schema.literal('k8s.node'), +]); +export type AssetType = typeof assetTypeRT.type; + export type AssetKind = 'unknown' | 'node'; -export type AssetType = 'k8s.pod' | 'k8s.cluster' | 'k8s.node'; export type AssetStatus = | 'CREATING' | 'ACTIVE' @@ -52,6 +60,7 @@ export interface Asset extends ECSDocument { 'asset.status'?: AssetStatus; 'asset.parents'?: string | string[]; 'asset.children'?: string | string[]; + 'asset.references'?: string | string[]; 'asset.namespace'?: string; } @@ -120,3 +129,15 @@ export interface AssetFilters { from?: string; to?: string; } + +export const relationRT = schema.oneOf([ + schema.literal('ancestors'), + schema.literal('descendants'), + schema.literal('references'), +]); + +export type Relation = typeof relationRT.type; +export type RelationField = keyof Pick< + Asset, + 'asset.children' | 'asset.parents' | 'asset.references' +>; diff --git a/x-pack/plugins/asset_manager/docs/index.md b/x-pack/plugins/asset_manager/docs/index.md index 8ed01ac575c9f..790beb87b4f7e 100644 --- a/x-pack/plugins/asset_manager/docs/index.md +++ b/x-pack/plugins/asset_manager/docs/index.md @@ -78,7 +78,7 @@ _Notes:_ Invalid request with type and ean both specified ```curl -GET /assets?from=2023-03-25T17:44:44.000Z&type=k8s.pod&ean=k8s.pod:123 +GET kbn:/api/asset-manager/assets?from=2023-03-25T17:44:44.000Z&type=k8s.pod&ean=k8s.pod:123 { "statusCode": 400, @@ -94,7 +94,7 @@ GET /assets?from=2023-03-25T17:44:44.000Z&type=k8s.pod&ean=k8s.pod:123 All assets JSON response ```curl -GET /assets?from=2023-03-25T17:44:44.000Z&to=2023-03-25T18:44:44.000Z +GET kbn:/api/asset-manager/assets?from=2023-03-25T17:44:44.000Z&to=2023-03-25T18:44:44.000Z { "results": [ @@ -273,7 +273,7 @@ GET /assets?from=2023-03-25T17:44:44.000Z&to=2023-03-25T18:44:44.000Z Assets by type JSON response ```curl -GET /assets?from=2023-03-25T17:44:44.000Z&to=2023-03-25T18:44:44.000Z&type=k8s.pod +GET kbn:/api/asset-manager/assets?from=2023-03-25T17:44:44.000Z&to=2023-03-25T18:44:44.000Z&type=k8s.pod { "results": [ @@ -378,7 +378,7 @@ GET /assets?from=2023-03-25T17:44:44.000Z&to=2023-03-25T18:44:44.000Z&type=k8s.p Assets by EAN JSON response ```curl -GET /assets?from=2023-03-25T17:44:44.000Z&to=2023-03-25T18:44:44.000Z&ean=k8s.node:node-101&ean=k8s.pod:pod-6r1z +GET kbn:/api/asset-manager/assets?from=2023-03-25T17:44:44.000Z&to=2023-03-25T18:44:44.000Z&ean=k8s.node:node-101&ean=k8s.pod:pod-6r1z { "results": [ @@ -427,7 +427,7 @@ Returns assets found in the two time ranges, split by what occurs in only either Request where comparison range is missing assets that are found in the baseline range ```curl -GET /assets/diff?aFrom=2022-02-07T00:00:00.000Z&aTo=2022-02-07T01:30:00.000Z&bFrom=2022-02-07T01:00:00.000Z&bTo=2022-02-07T02:00:00.000Z +GET kbn:/api/asset-manager/assets/diff?aFrom=2022-02-07T00:00:00.000Z&aTo=2022-02-07T01:30:00.000Z&bFrom=2022-02-07T01:00:00.000Z&bTo=2022-02-07T02:00:00.000Z { "onlyInA": [ @@ -589,7 +589,7 @@ GET /assets/diff?aFrom=2022-02-07T00:00:00.000Z&aTo=2022-02-07T01:30:00.000Z&bFr Request where baseline range is missing assets that are found in the comparison range ```curl -GET /assets/diff?aFrom=2022-02-07T01:00:00.000Z&aTo=2022-02-07T01:30:00.000Z&bFrom=2022-02-07T01:00:00.000Z&bTo=2022-02-07T03:00:00.000Z +GET kbn:/api/asset-manager/assets/diff?aFrom=2022-02-07T01:00:00.000Z&aTo=2022-02-07T01:30:00.000Z&bFrom=2022-02-07T01:00:00.000Z&bTo=2022-02-07T03:00:00.000Z { "onlyInA": [], @@ -751,7 +751,7 @@ GET /assets/diff?aFrom=2022-02-07T01:00:00.000Z&aTo=2022-02-07T01:30:00.000Z&bFr Request where each range is missing assets found in the other range ```curl -GET /assets/diff?aFrom=2022-02-07T00:00:00.000Z&aTo=2022-02-07T01:30:00.000Z&bFrom=2022-02-07T01:00:00.000Z&bTo=2022-02-07T03:00:00.000Z +GET kbn:/api/asset-manager/assets/diff?aFrom=2022-02-07T00:00:00.000Z&aTo=2022-02-07T01:30:00.000Z&bFrom=2022-02-07T01:00:00.000Z&bTo=2022-02-07T03:00:00.000Z { "onlyInA": [ @@ -934,7 +934,7 @@ GET /assets/diff?aFrom=2022-02-07T00:00:00.000Z&aTo=2022-02-07T01:30:00.000Z&bFr Request where each range is missing assets found in the other range, but restricted by type ```curl -GET /assets/diff?aFrom=2022-02-07T00:00:00.000Z&aTo=2022-02-07T01:30:00.000Z&bFrom=2022-02-07T01:00:00.000Z&bTo=2022-02-07T03:00:00.000Z&type=k8s.pod +GET kbn:/api/asset-manager/assets/diff?aFrom=2022-02-07T00:00:00.000Z&aTo=2022-02-07T01:30:00.000Z&bFrom=2022-02-07T01:00:00.000Z&bTo=2022-02-07T03:00:00.000Z&type=k8s.pod { "onlyInA": [ @@ -1038,6 +1038,326 @@ GET /assets/diff?aFrom=2022-02-07T00:00:00.000Z&aTo=2022-02-07T01:30:00.000Z&bFr +#### GET /assets/related + +Returns assets related to the provided ean. The relation can be one of ancestors, descendants or references. + +#### Request + +| Option | Type | Required? | Default | Description | +| :--- | :--- | :--- | :--- | :--- | +| relation | string | Yes | N/A | The type of related assets we're looking for. One of (ancestors|descendants|references) | +| from | RangeDate | Yes | N/A | Starting point for date range to search for assets within | +| to | RangeDate | No | "now" | End point for date range to search for assets | +| ean | AssetEan | Yes | N/A | Single Elastic Asset Name representing the asset for which the related assets are being requested | +| type | AssetType[] | No | all | Restrict results to one or more asset.type value | +| maxDistance | number (1-5) | No | 1 | Maximum number of "hops" to search away from specified asset | + +#### Responses + +
+ +Request looking for ancestors + +```curl +GET kbn:/api/asset-manager/assets/related?ean=k8s.node:node-101&relation=ancestors&maxDistance=1&from=2023-04-18T13:10:13.111Z&to=2023-04-18T15:10:13.111Z +{ + "results": { + "primary": { + "@timestamp": "2023-04-18T14:10:13.111Z", + "asset.type": "k8s.node", + "asset.id": "node-101", + "asset.name": "k8s-node-101-aws", + "asset.ean": "k8s.node:node-101", + "asset.parents": [ + "k8s.cluster:cluster-001" + ], + "orchestrator.type": "kubernetes", + "orchestrator.cluster.name": "Cluster 001 (AWS EKS)", + "orchestrator.cluster.id": "cluster-001", + "cloud.provider": "aws", + "cloud.region": "us-east-1", + "cloud.service.name": "eks" + }, + "ancestors": [ + { + "@timestamp": "2023-04-18T14:10:13.111Z", + "asset.type": "k8s.cluster", + "asset.id": "cluster-001", + "asset.name": "Cluster 001 (AWS EKS)", + "asset.ean": "k8s.cluster:cluster-001", + "orchestrator.type": "kubernetes", + "orchestrator.cluster.name": "Cluster 001 (AWS EKS)", + "orchestrator.cluster.id": "cluster-001", + "cloud.provider": "aws", + "cloud.region": "us-east-1", + "cloud.service.name": "eks", + "distance": 1 + } + ] + } +} +``` + +
+ +
+ +Request looking for descendants + +```curl +GET kbn:/api/asset-manager/assets/related?ean=k8s.cluster:cluster-001&relation=descendants&maxDistance=1&from=2023-04-18T13:10:13.111Z&to=2023-04-18T15:10:13.111Z + +{ + "results": { + "primary": { + "@timestamp": "2023-04-18T14:10:13.111Z", + "asset.type": "k8s.cluster", + "asset.id": "cluster-001", + "asset.name": "Cluster 001 (AWS EKS)", + "asset.ean": "k8s.cluster:cluster-001", + "orchestrator.type": "kubernetes", + "orchestrator.cluster.name": "Cluster 001 (AWS EKS)", + "orchestrator.cluster.id": "cluster-001", + "cloud.provider": "aws", + "cloud.region": "us-east-1", + "cloud.service.name": "eks" + }, + "descendants": [ + { + "@timestamp": "2023-04-18T14:10:13.111Z", + "asset.type": "k8s.node", + "asset.id": "node-101", + "asset.name": "k8s-node-101-aws", + "asset.ean": "k8s.node:node-101", + "asset.parents": [ + "k8s.cluster:cluster-001" + ], + "orchestrator.type": "kubernetes", + "orchestrator.cluster.name": "Cluster 001 (AWS EKS)", + "orchestrator.cluster.id": "cluster-001", + "cloud.provider": "aws", + "cloud.region": "us-east-1", + "cloud.service.name": "eks", + "distance": 1 + }, + { + "@timestamp": "2023-04-18T14:10:13.111Z", + "asset.type": "k8s.node", + "asset.id": "node-102", + "asset.name": "k8s-node-102-aws", + "asset.ean": "k8s.node:node-102", + "asset.parents": [ + "k8s.cluster:cluster-001" + ], + "orchestrator.type": "kubernetes", + "orchestrator.cluster.name": "Cluster 001 (AWS EKS)", + "orchestrator.cluster.id": "cluster-001", + "cloud.provider": "aws", + "cloud.region": "us-east-1", + "cloud.service.name": "eks", + "distance": 1 + }, + { + "@timestamp": "2023-04-18T14:10:13.111Z", + "asset.type": "k8s.node", + "asset.id": "node-103", + "asset.name": "k8s-node-103-aws", + "asset.ean": "k8s.node:node-103", + "asset.parents": [ + "k8s.cluster:cluster-001" + ], + "orchestrator.type": "kubernetes", + "orchestrator.cluster.name": "Cluster 001 (AWS EKS)", + "orchestrator.cluster.id": "cluster-001", + "cloud.provider": "aws", + "cloud.region": "us-east-1", + "cloud.service.name": "eks", + "distance": 1 + } + ] + } +} +``` + +
+ +
+ +Request looking for references + +```curl +GET kbn:/api/asset-manager/assets/related?ean=k8s.pod:pod-200xrg1&relation=references&maxDistance=1&from=2023-04-18T13:10:13.111Z&to=2023-04-18T15:10:13.111Z + +{ + "results": { + "primary": { + "@timestamp": "2023-04-18T14:10:13.111Z", + "asset.type": "k8s.pod", + "asset.id": "pod-200xrg1", + "asset.name": "k8s-pod-200xrg1-aws", + "asset.ean": "k8s.pod:pod-200xrg1", + "asset.parents": [ + "k8s.node:node-101" + ], + "asset.references": [ + "k8s.cluster:cluster-001" + ] + }, + "references": [ + { + "@timestamp": "2023-04-18T14:10:13.111Z", + "asset.type": "k8s.cluster", + "asset.id": "cluster-001", + "asset.name": "Cluster 001 (AWS EKS)", + "asset.ean": "k8s.cluster:cluster-001", + "orchestrator.type": "kubernetes", + "orchestrator.cluster.name": "Cluster 001 (AWS EKS)", + "orchestrator.cluster.id": "cluster-001", + "cloud.provider": "aws", + "cloud.region": "us-east-1", + "cloud.service.name": "eks", + "distance": 1 + } + ] + } +} +``` + +
+ +
+ +Request with type filter and non-default maxDistance + +```curl +GET kbn:/api/asset-manager/assets/related?ean=k8s.cluster:cluster-001&relation=descendants&maxDistance=2&from=2023-04-18T13:10:13.111Z&to=2023-04-18T15:10:13.111Z&type=k8s.pod + +{ + "results": { + "primary": { + "@timestamp": "2023-04-18T14:10:13.111Z", + "asset.type": "k8s.cluster", + "asset.id": "cluster-001", + "asset.name": "Cluster 001 (AWS EKS)", + "asset.ean": "k8s.cluster:cluster-001", + "orchestrator.type": "kubernetes", + "orchestrator.cluster.name": "Cluster 001 (AWS EKS)", + "orchestrator.cluster.id": "cluster-001", + "cloud.provider": "aws", + "cloud.region": "us-east-1", + "cloud.service.name": "eks" + }, + "descendants": [ + { + "@timestamp": "2023-04-18T14:10:13.111Z", + "asset.type": "k8s.pod", + "asset.id": "pod-200xrg1", + "asset.name": "k8s-pod-200xrg1-aws", + "asset.ean": "k8s.pod:pod-200xrg1", + "asset.parents": [ + "k8s.node:node-101" + ], + "asset.references": [ + "k8s.cluster:cluster-001" + ], + "distance": 2 + }, + { + "@timestamp": "2023-04-18T14:10:13.111Z", + "asset.type": "k8s.pod", + "asset.id": "pod-200dfp2", + "asset.name": "k8s-pod-200dfp2-aws", + "asset.ean": "k8s.pod:pod-200dfp2", + "asset.parents": [ + "k8s.node:node-101" + ], + "distance": 2 + }, + { + "@timestamp": "2023-04-18T14:10:13.111Z", + "asset.type": "k8s.pod", + "asset.id": "pod-200wwc3", + "asset.name": "k8s-pod-200wwc3-aws", + "asset.ean": "k8s.pod:pod-200wwc3", + "asset.parents": [ + "k8s.node:node-101" + ], + "distance": 2 + }, + { + "@timestamp": "2023-04-18T14:10:13.111Z", + "asset.type": "k8s.pod", + "asset.id": "pod-200naq4", + "asset.name": "k8s-pod-200naq4-aws", + "asset.ean": "k8s.pod:pod-200naq4", + "asset.parents": [ + "k8s.node:node-102" + ], + "distance": 2 + }, + { + "@timestamp": "2023-04-18T14:10:13.111Z", + "asset.type": "k8s.pod", + "asset.id": "pod-200ohr5", + "asset.name": "k8s-pod-200ohr5-aws", + "asset.ean": "k8s.pod:pod-200ohr5", + "asset.parents": [ + "k8s.node:node-102" + ], + "distance": 2 + }, + { + "@timestamp": "2023-04-18T14:10:13.111Z", + "asset.type": "k8s.pod", + "asset.id": "pod-200yyx6", + "asset.name": "k8s-pod-200yyx6-aws", + "asset.ean": "k8s.pod:pod-200yyx6", + "asset.parents": [ + "k8s.node:node-103" + ], + "distance": 2 + }, + { + "@timestamp": "2023-04-18T14:10:13.111Z", + "asset.type": "k8s.pod", + "asset.id": "pod-200psd7", + "asset.name": "k8s-pod-200psd7-aws", + "asset.ean": "k8s.pod:pod-200psd7", + "asset.parents": [ + "k8s.node:node-103" + ], + "distance": 2 + }, + { + "@timestamp": "2023-04-18T14:10:13.111Z", + "asset.type": "k8s.pod", + "asset.id": "pod-200wmc8", + "asset.name": "k8s-pod-200wmc8-aws", + "asset.ean": "k8s.pod:pod-200wmc8", + "asset.parents": [ + "k8s.node:node-103" + ], + "distance": 2 + }, + { + "@timestamp": "2023-04-18T14:10:13.111Z", + "asset.type": "k8s.pod", + "asset.id": "pod-200ugg9", + "asset.name": "k8s-pod-200ugg9-aws", + "asset.ean": "k8s.pod:pod-200ugg9", + "asset.parents": [ + "k8s.node:node-103" + ], + "distance": 2 + } + ] + } +} +``` + +
+ #### GET /assets/sample Returns the list of pre-defined sample asset documents that would be indexed diff --git a/x-pack/plugins/asset_manager/jest.config.js b/x-pack/plugins/asset_manager/jest.config.js new file mode 100644 index 0000000000000..d54e474b86ff4 --- /dev/null +++ b/x-pack/plugins/asset_manager/jest.config.js @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +module.exports = { + preset: '@kbn/test', + rootDir: '../../..', + roots: ['/x-pack/plugins/asset_manager'], + coverageDirectory: '/target/kibana-coverage/jest/x-pack/plugins/asset_manager', + coverageReporters: ['text', 'html'], + collectCoverageFrom: [ + '/x-pack/plugins/asset_manager/{common,public,server}/**/*.{js,ts,tsx}', + ], +}; diff --git a/x-pack/plugins/asset_manager/server/lib/errors.ts b/x-pack/plugins/asset_manager/server/lib/errors.ts new file mode 100644 index 0000000000000..e0d341f87a9fd --- /dev/null +++ b/x-pack/plugins/asset_manager/server/lib/errors.ts @@ -0,0 +1,14 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export class AssetNotFoundError extends Error { + constructor(ean: string) { + super(`Asset with ean (${ean}) not found in the provided time range`); + Object.setPrototypeOf(this, new.target.prototype); + this.name = 'AssetNotFoundError'; + } +} diff --git a/x-pack/plugins/asset_manager/server/lib/get_all_related_assets.test.ts b/x-pack/plugins/asset_manager/server/lib/get_all_related_assets.test.ts new file mode 100644 index 0000000000000..7eaa05dbd35bb --- /dev/null +++ b/x-pack/plugins/asset_manager/server/lib/get_all_related_assets.test.ts @@ -0,0 +1,529 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +jest.mock('./get_assets', () => ({ getAssets: jest.fn() })); +jest.mock('./get_related_assets', () => ({ getRelatedAssets: jest.fn() })); + +import { elasticsearchClientMock } from '@kbn/core-elasticsearch-client-server-mocks'; +import { v4 as uuid } from 'uuid'; +import { AssetWithoutTimestamp } from '../../common/types_api'; +import { getAssets } from './get_assets'; // Mocked +import { getRelatedAssets } from './get_related_assets'; // Mocked +import { getAllRelatedAssets } from './get_all_related_assets'; + +const esClientMock = elasticsearchClientMock.createScopedClusterClient().asCurrentUser; + +describe('getAllRelatedAssets', () => { + beforeEach(() => { + (getAssets as jest.Mock).mockReset(); + (getRelatedAssets as jest.Mock).mockReset(); + }); + + it('throws if it cannot find the primary asset', async () => { + const primaryAsset: AssetWithoutTimestamp = { + 'asset.ean': 'primary-which-does-not-exist', + 'asset.type': 'k8s.pod', + 'asset.id': uuid(), + }; + + // Mock that we cannot find the primary + (getAssets as jest.Mock).mockResolvedValueOnce([]); + // Ensure maxDistance is respected + (getAssets as jest.Mock).mockRejectedValueOnce(new Error('Should respect maxDistance')); + (getRelatedAssets as jest.Mock).mockRejectedValueOnce(new Error('Should respect maxDistance')); + + await expect( + getAllRelatedAssets(esClientMock, { + ean: primaryAsset['asset.ean'], + relation: 'ancestors', + from: new Date().toISOString(), + maxDistance: 1, + size: 10, + }) + ).rejects.toThrow( + `Asset with ean (${primaryAsset['asset.ean']}) not found in the provided time range` + ); + }); + + it('returns only the primary if it does not have any ancestors', async () => { + const primaryAssetWithoutParents: AssetWithoutTimestamp = { + 'asset.ean': 'primary-ean', + 'asset.type': 'k8s.pod', + 'asset.id': uuid(), + 'asset.parents': [], + }; + + (getAssets as jest.Mock).mockResolvedValueOnce([primaryAssetWithoutParents]); + // Distance 1 + (getRelatedAssets as jest.Mock).mockResolvedValueOnce([]); + // Ensure maxDistance is respected + (getAssets as jest.Mock).mockRejectedValueOnce(new Error('Should respect maxDistance')); + (getRelatedAssets as jest.Mock).mockRejectedValueOnce(new Error('Should respect maxDistance')); + + await expect( + getAllRelatedAssets(esClientMock, { + ean: primaryAssetWithoutParents['asset.ean'], + from: new Date().toISOString(), + relation: 'ancestors', + maxDistance: 1, + size: 10, + }) + ).resolves.toStrictEqual({ + primary: primaryAssetWithoutParents, + ancestors: [], + }); + }); + + it('returns the primary and a directly referenced parent', async () => { + const parentAsset: AssetWithoutTimestamp = { + 'asset.ean': 'primary-ean', + 'asset.type': 'k8s.pod', + 'asset.id': uuid(), + }; + + const primaryAssetWithDirectParent: AssetWithoutTimestamp = { + 'asset.ean': 'primary-ean', + 'asset.type': 'k8s.pod', + 'asset.id': uuid(), + 'asset.parents': [parentAsset['asset.ean']], + }; + + // Primary + (getAssets as jest.Mock).mockResolvedValueOnce([primaryAssetWithDirectParent]); + // Distance 1 + (getAssets as jest.Mock).mockResolvedValueOnce([parentAsset]); + (getRelatedAssets as jest.Mock).mockResolvedValueOnce([]); + // Ensure maxDistance is respected + (getAssets as jest.Mock).mockRejectedValueOnce(new Error('Should respect maxDistance')); + (getRelatedAssets as jest.Mock).mockRejectedValueOnce(new Error('Should respect maxDistance')); + + await expect( + getAllRelatedAssets(esClientMock, { + ean: primaryAssetWithDirectParent['asset.ean'], + from: new Date().toISOString(), + relation: 'ancestors', + maxDistance: 1, + size: 10, + }) + ).resolves.toStrictEqual({ + primary: primaryAssetWithDirectParent, + ancestors: [ + { + ...parentAsset, + distance: 1, + }, + ], + }); + }); + + it('returns the primary and an indirectly referenced parent', async () => { + const primaryAssetWithIndirectParent: AssetWithoutTimestamp = { + 'asset.ean': 'primary-ean', + 'asset.type': 'k8s.pod', + 'asset.id': uuid(), + 'asset.parents': [], + }; + + const parentAsset: AssetWithoutTimestamp = { + 'asset.ean': 'primary-ean', + 'asset.type': 'k8s.pod', + 'asset.id': uuid(), + 'asset.children': [primaryAssetWithIndirectParent['asset.ean']], + }; + + // Primary + (getAssets as jest.Mock).mockResolvedValueOnce([primaryAssetWithIndirectParent]); + // Distance 1 + (getAssets as jest.Mock).mockResolvedValueOnce([]); + (getRelatedAssets as jest.Mock).mockResolvedValueOnce([parentAsset]); + // Ensure maxDistance is respected + (getAssets as jest.Mock).mockRejectedValueOnce(new Error('Should respect maxDistance')); + (getRelatedAssets as jest.Mock).mockRejectedValueOnce(new Error('Should respect maxDistance')); + + await expect( + getAllRelatedAssets(esClientMock, { + ean: primaryAssetWithIndirectParent['asset.ean'], + from: new Date().toISOString(), + relation: 'ancestors', + maxDistance: 1, + size: 10, + }) + ).resolves.toStrictEqual({ + primary: primaryAssetWithIndirectParent, + ancestors: [ + { + ...parentAsset, + distance: 1, + }, + ], + }); + }); + + it('returns the primary and all distance 1 parents', async () => { + const directlyReferencedParent: AssetWithoutTimestamp = { + 'asset.ean': 'directly-referenced-parent-ean', + 'asset.type': 'k8s.pod', + 'asset.id': uuid(), + 'asset.children': [], + }; + + const primaryAsset: AssetWithoutTimestamp = { + 'asset.ean': 'primary-ean', + 'asset.type': 'k8s.pod', + 'asset.id': uuid(), + 'asset.parents': [directlyReferencedParent['asset.ean']], + }; + + const indirectlyReferencedParent: AssetWithoutTimestamp = { + 'asset.ean': 'indirectly-referenced-parent-ean', + 'asset.type': 'k8s.pod', + 'asset.id': uuid(), + 'asset.children': [primaryAsset['asset.ean']], + }; + + // Primary + (getAssets as jest.Mock).mockResolvedValueOnce([primaryAsset]); + // Distance 1 + (getAssets as jest.Mock).mockResolvedValueOnce([directlyReferencedParent]); + (getRelatedAssets as jest.Mock).mockResolvedValueOnce([indirectlyReferencedParent]); + // Ensure maxDistance is respected + (getAssets as jest.Mock).mockRejectedValueOnce(new Error('Should respect maxDistance')); + (getRelatedAssets as jest.Mock).mockRejectedValueOnce(new Error('Should respect maxDistance')); + + await expect( + getAllRelatedAssets(esClientMock, { + ean: primaryAsset['asset.ean'], + from: new Date().toISOString(), + relation: 'ancestors', + maxDistance: 1, + size: 10, + }) + ).resolves.toStrictEqual({ + primary: primaryAsset, + ancestors: [ + { + ...directlyReferencedParent, + distance: 1, + }, + { + ...indirectlyReferencedParent, + distance: 1, + }, + ], + }); + }); + + it('returns the primary and one parent even with a two way relation defined', async () => { + const parentAsset: AssetWithoutTimestamp = { + 'asset.ean': 'parent-ean', + 'asset.type': 'k8s.pod', + 'asset.id': uuid(), + }; + + const primaryAsset: AssetWithoutTimestamp = { + 'asset.ean': 'primary-ean', + 'asset.type': 'k8s.pod', + 'asset.id': uuid(), + }; + + primaryAsset['asset.parents'] = [parentAsset['asset.ean']]; + parentAsset['asset.children'] = [primaryAsset['asset.ean']]; + + // Primary + (getAssets as jest.Mock).mockResolvedValueOnce([primaryAsset]); + // Distance 1 + (getAssets as jest.Mock).mockResolvedValueOnce([parentAsset]); + // Code should filter out any directly referenced parent from the indirectly referenced parents query + (getRelatedAssets as jest.Mock).mockResolvedValueOnce([]); + // Ensure maxDistance is respected + (getAssets as jest.Mock).mockRejectedValueOnce(new Error('Should respect maxDistance')); + (getRelatedAssets as jest.Mock).mockRejectedValueOnce(new Error('Should respect maxDistance')); + + await expect( + getAllRelatedAssets(esClientMock, { + ean: primaryAsset['asset.ean'], + from: new Date().toISOString(), + relation: 'ancestors', + maxDistance: 1, + size: 10, + }) + ).resolves.toStrictEqual({ + primary: primaryAsset, + ancestors: [ + { + ...parentAsset, + distance: 1, + }, + ], + }); + }); + + it('returns relations from 5 jumps', async () => { + const distance6Parent: AssetWithoutTimestamp = { + 'asset.ean': 'parent-5-ean', + 'asset.type': 'k8s.pod', + 'asset.id': uuid(), + }; + + const distance5Parent: AssetWithoutTimestamp = { + 'asset.ean': 'parent-5-ean', + 'asset.type': 'k8s.pod', + 'asset.id': uuid(), + 'asset.parents': [distance6Parent['asset.ean']], + }; + + const distance4Parent: AssetWithoutTimestamp = { + 'asset.ean': 'parent-4-ean', + 'asset.type': 'k8s.pod', + 'asset.id': uuid(), + 'asset.parents': [distance5Parent['asset.ean']], + }; + + const distance3Parent: AssetWithoutTimestamp = { + 'asset.ean': 'parent-3-ean', + 'asset.type': 'k8s.pod', + 'asset.id': uuid(), + 'asset.parents': [distance4Parent['asset.ean']], + }; + + const distance2Parent: AssetWithoutTimestamp = { + 'asset.ean': 'parent-2-ean', + 'asset.type': 'k8s.pod', + 'asset.id': uuid(), + 'asset.parents': [distance3Parent['asset.ean']], + }; + + const distance1Parent: AssetWithoutTimestamp = { + 'asset.ean': 'parent-1-ean', + 'asset.type': 'k8s.pod', + 'asset.id': uuid(), + 'asset.parents': [distance2Parent['asset.ean']], + }; + + const primaryAsset: AssetWithoutTimestamp = { + 'asset.ean': 'primary-ean', + 'asset.type': 'k8s.pod', + 'asset.id': uuid(), + 'asset.parents': [distance1Parent['asset.ean']], + }; + + // Only using directly referenced parents + (getRelatedAssets as jest.Mock).mockResolvedValue([]); + + // Primary + (getAssets as jest.Mock).mockResolvedValueOnce([primaryAsset]); + // Distance 1 + (getAssets as jest.Mock).mockResolvedValueOnce([distance1Parent]); + // Distance 2 + (getAssets as jest.Mock).mockResolvedValueOnce([distance2Parent]); + // Distance 3 + (getAssets as jest.Mock).mockResolvedValueOnce([distance3Parent]); + // Distance 4 + (getAssets as jest.Mock).mockResolvedValueOnce([distance4Parent]); + // Distance 5 + (getAssets as jest.Mock).mockResolvedValueOnce([distance5Parent]); + // Should not exceed maxDistance + (getAssets as jest.Mock).mockRejectedValueOnce(new Error('Should respect maxDistance')); + + await expect( + getAllRelatedAssets(esClientMock, { + ean: primaryAsset['asset.ean'], + from: new Date().toISOString(), + relation: 'ancestors', + maxDistance: 5, + size: 10, + }) + ).resolves.toStrictEqual({ + primary: primaryAsset, + ancestors: [ + { + ...distance1Parent, + distance: 1, + }, + { + ...distance2Parent, + distance: 2, + }, + { + ...distance3Parent, + distance: 3, + }, + { + ...distance4Parent, + distance: 4, + }, + { + ...distance5Parent, + distance: 5, + }, + ], + }); + }); + + it('returns relations from only 3 jumps if there are no more parents', async () => { + const distance3Parent: AssetWithoutTimestamp = { + 'asset.ean': 'parent-3-ean', + 'asset.type': 'k8s.pod', + 'asset.id': uuid(), + }; + + const distance2Parent: AssetWithoutTimestamp = { + 'asset.ean': 'parent-2-ean', + 'asset.type': 'k8s.pod', + 'asset.id': uuid(), + 'asset.parents': [distance3Parent['asset.ean']], + }; + + const distance1Parent: AssetWithoutTimestamp = { + 'asset.ean': 'parent-1-ean', + 'asset.type': 'k8s.pod', + 'asset.id': uuid(), + 'asset.parents': [distance2Parent['asset.ean']], + }; + + const primaryAsset: AssetWithoutTimestamp = { + 'asset.ean': 'primary-ean', + 'asset.type': 'k8s.pod', + 'asset.id': uuid(), + 'asset.parents': [distance1Parent['asset.ean']], + }; + + // Only using directly referenced parents + (getRelatedAssets as jest.Mock).mockResolvedValue([]); + + // Primary + (getAssets as jest.Mock).mockResolvedValueOnce([primaryAsset]); + // Distance 1 + (getAssets as jest.Mock).mockResolvedValueOnce([distance1Parent]); + // Distance 2 + (getAssets as jest.Mock).mockResolvedValueOnce([distance2Parent]); + // Distance 3 + (getAssets as jest.Mock).mockResolvedValueOnce([distance3Parent]); + + await expect( + getAllRelatedAssets(esClientMock, { + ean: primaryAsset['asset.ean'], + from: new Date().toISOString(), + relation: 'ancestors', + maxDistance: 5, + size: 10, + }) + ).resolves.toStrictEqual({ + primary: primaryAsset, + ancestors: [ + { + ...distance1Parent, + distance: 1, + }, + { + ...distance2Parent, + distance: 2, + }, + { + ...distance3Parent, + distance: 3, + }, + ], + }); + }); + + it('returns relations by distance even if there are multiple parents in each jump', async () => { + const distance2ParentA: AssetWithoutTimestamp = { + 'asset.ean': 'parent-2-ean-a', + 'asset.type': 'k8s.pod', + 'asset.id': uuid(), + }; + + const distance2ParentB: AssetWithoutTimestamp = { + 'asset.ean': 'parent-2-ean-b', + 'asset.type': 'k8s.pod', + 'asset.id': uuid(), + }; + + const distance2ParentC: AssetWithoutTimestamp = { + 'asset.ean': 'parent-2-ean-c', + 'asset.type': 'k8s.pod', + 'asset.id': uuid(), + }; + + const distance2ParentD: AssetWithoutTimestamp = { + 'asset.ean': 'parent-2-ean-d', + 'asset.type': 'k8s.pod', + 'asset.id': uuid(), + }; + + const distance1ParentA: AssetWithoutTimestamp = { + 'asset.ean': 'parent-1-ean-a', + 'asset.type': 'k8s.pod', + 'asset.id': uuid(), + 'asset.parents': [distance2ParentA['asset.ean'], distance2ParentB['asset.ean']], + }; + + const distance1ParentB: AssetWithoutTimestamp = { + 'asset.ean': 'parent-1-ean-b', + 'asset.type': 'k8s.pod', + 'asset.id': uuid(), + 'asset.parents': [distance2ParentC['asset.ean'], distance2ParentD['asset.ean']], + }; + + const primaryAsset: AssetWithoutTimestamp = { + 'asset.ean': 'primary-ean', + 'asset.type': 'k8s.pod', + 'asset.id': uuid(), + 'asset.parents': [distance1ParentA['asset.ean'], distance1ParentB['asset.ean']], + }; + + // Only using directly referenced parents + (getRelatedAssets as jest.Mock).mockResolvedValue([]); + + // Primary + (getAssets as jest.Mock).mockResolvedValueOnce([primaryAsset]); + // Distance 1 + (getAssets as jest.Mock).mockResolvedValueOnce([distance1ParentA, distance1ParentB]); + // Distance 2 (the order matters) + (getAssets as jest.Mock).mockResolvedValueOnce([distance2ParentA, distance2ParentB]); + (getAssets as jest.Mock).mockResolvedValueOnce([distance2ParentC, distance2ParentD]); + + await expect( + getAllRelatedAssets(esClientMock, { + ean: primaryAsset['asset.ean'], + from: new Date().toISOString(), + relation: 'ancestors', + maxDistance: 5, + size: 10, + }) + ).resolves.toStrictEqual({ + primary: primaryAsset, + ancestors: [ + { + ...distance1ParentA, + distance: 1, + }, + { + ...distance1ParentB, + distance: 1, + }, + { + ...distance2ParentA, + distance: 2, + }, + { + ...distance2ParentB, + distance: 2, + }, + { + ...distance2ParentC, + distance: 2, + }, + { + ...distance2ParentD, + distance: 2, + }, + ], + }); + }); +}); diff --git a/x-pack/plugins/asset_manager/server/lib/get_all_related_assets.ts b/x-pack/plugins/asset_manager/server/lib/get_all_related_assets.ts new file mode 100644 index 0000000000000..f297881e1aec6 --- /dev/null +++ b/x-pack/plugins/asset_manager/server/lib/get_all_related_assets.ts @@ -0,0 +1,145 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ElasticsearchClient } from '@kbn/core/server'; +import { flatten, without } from 'lodash'; +import { Asset, AssetType, Relation, RelationField } from '../../common/types_api'; +import { getAssets } from './get_assets'; +import { getRelatedAssets } from './get_related_assets'; +import { AssetNotFoundError } from './errors'; +import { toArray } from './utils'; + +interface GetAllRelatedAssetsOptions { + ean: string; + from: string; + to?: string; + relation: Relation; + type?: AssetType[]; + maxDistance: number; + size: number; +} + +export async function getAllRelatedAssets( + esClient: ElasticsearchClient, + options: GetAllRelatedAssetsOptions +) { + // How to put size into this? + const { ean, from, to, relation, maxDistance, type = [] } = options; + + const primary = await findPrimary(esClient, { ean, from, to }); + + let assetsToFetch = [primary]; + let currentDistance = 1; + const relatedAssets = []; + while (currentDistance <= maxDistance) { + const queryOptions: FindRelatedAssetsOptions = { + relation, + from, + to, + visitedEans: [primary['asset.ean'], ...relatedAssets.map((asset) => asset['asset.ean'])], + }; + // if we enforce the type filter before the last query we'll miss nodes with + // possible edges to the requested types + if (currentDistance === maxDistance && type.length) { + queryOptions.type = type; + } + + const results = flatten( + await Promise.all( + assetsToFetch.map((asset) => findRelatedAssets(esClient, asset, queryOptions)) + ) + ); + + if (results.length === 0) { + break; + } + + relatedAssets.push(...results.map(withDistance(currentDistance))); + + assetsToFetch = results; + currentDistance++; + } + + return { + primary, + [relation]: type.length + ? relatedAssets.filter((asset) => type.includes(asset['asset.type'])) + : relatedAssets, + }; +} + +async function findPrimary( + esClient: ElasticsearchClient, + { ean, from, to }: Pick +): Promise { + const primaryResults = await getAssets({ + esClient, + size: 1, + filters: { ean, from, to }, + }); + + if (primaryResults.length === 0) { + throw new AssetNotFoundError(ean); + } + + if (primaryResults.length > 1) { + throw new Error(`Illegal state: Found more than one asset with the same ean (ean=${ean}).`); + } + + return primaryResults[0]; +} + +type FindRelatedAssetsOptions = Pick< + GetAllRelatedAssetsOptions, + 'relation' | 'type' | 'from' | 'to' +> & { visitedEans: string[] }; + +async function findRelatedAssets( + esClient: ElasticsearchClient, + primary: Asset, + { relation, from, to, type, visitedEans }: FindRelatedAssetsOptions +): Promise { + const relationField = relationToDirectField(relation); + const directlyRelatedEans = toArray(primary[relationField]); + + let directlyRelatedAssets: Asset[] = []; + if (directlyRelatedEans.length) { + // get the directly related assets we haven't visited already + directlyRelatedAssets = await getAssets({ + esClient, + filters: { ean: without(directlyRelatedEans, ...visitedEans), from, to, type }, + }); + } + + const indirectlyRelatedAssets = await getRelatedAssets({ + esClient, + ean: primary['asset.ean'], + excludeEans: visitedEans.concat(directlyRelatedEans), + relation, + from, + to, + type, + }); + + return [...directlyRelatedAssets, ...indirectlyRelatedAssets]; +} + +function relationToDirectField(relation: Relation): RelationField { + if (relation === 'ancestors') { + return 'asset.parents'; + } else if (relation === 'descendants') { + return 'asset.children'; + } else { + return 'asset.references'; + } +} + +function withDistance( + distance: number +): (value: Asset, index: number, array: Asset[]) => Asset & { distance: number } { + return (asset: Asset) => ({ ...asset, distance }); +} diff --git a/x-pack/plugins/asset_manager/server/lib/get_assets.ts b/x-pack/plugins/asset_manager/server/lib/get_assets.ts index 9033254499253..6c9a06c342e8d 100644 --- a/x-pack/plugins/asset_manager/server/lib/get_assets.ts +++ b/x-pack/plugins/asset_manager/server/lib/get_assets.ts @@ -23,6 +23,8 @@ export async function getAssets({ size = 100, filters = {}, }: GetAssetsOptions): Promise { + // Maybe it makes the most sense to validate the filters here? + const { from = 'now-24h', to = 'now' } = filters; const dsl: SearchRequest = { index: ASSETS_INDEX_PREFIX + '*', @@ -62,7 +64,7 @@ export async function getAssets({ }); } - if (filters.type) { + if (filters.type?.length) { musts.push({ terms: { ['asset.type']: Array.isArray(filters.type) ? filters.type : [filters.type], diff --git a/x-pack/plugins/asset_manager/server/lib/get_related_assets.ts b/x-pack/plugins/asset_manager/server/lib/get_related_assets.ts new file mode 100644 index 0000000000000..548fd55dd2aed --- /dev/null +++ b/x-pack/plugins/asset_manager/server/lib/get_related_assets.ts @@ -0,0 +1,105 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { QueryDslQueryContainer, SearchRequest } from '@elastic/elasticsearch/lib/api/types'; +import { debug } from '../../common/debug_log'; +import { Asset, AssetType, Relation, RelationField } from '../../common/types_api'; +import { ASSETS_INDEX_PREFIX } from '../constants'; +import { ElasticsearchAccessorOptions } from '../types'; + +interface GetRelatedAssetsOptions extends ElasticsearchAccessorOptions { + size?: number; + ean: string; + excludeEans?: string[]; + from?: string; + to?: string; + relation: Relation; + type?: AssetType[]; +} + +export async function getRelatedAssets({ + esClient, + size = 100, + from = 'now-24h', + to = 'now', + ean, + excludeEans, + relation, + type, +}: GetRelatedAssetsOptions): Promise { + const relationField = relationToIndirectField(relation); + const must: QueryDslQueryContainer[] = [ + { + terms: { + [relationField]: [ean], + }, + }, + ]; + + if (type?.length) { + must.push({ + terms: { + ['asset.type']: type, + }, + }); + } + + const mustNot: QueryDslQueryContainer[] = + excludeEans && excludeEans.length + ? [ + { + terms: { + 'asset.ean': excludeEans, + }, + }, + ] + : []; + + const dsl: SearchRequest = { + index: ASSETS_INDEX_PREFIX + '*', + size, + query: { + bool: { + filter: [ + { + range: { + '@timestamp': { + gte: from, + lte: to, + }, + }, + }, + ], + must, + must_not: mustNot, + }, + }, + collapse: { + field: 'asset.ean', + }, + sort: { + '@timestamp': { + order: 'desc', + }, + }, + }; + + debug('Performing Asset Query', '\n\n', JSON.stringify(dsl, null, 2)); + + const response = await esClient.search(dsl); + return response.hits.hits.map((hit) => hit._source as Asset); +} + +function relationToIndirectField(relation: Relation): RelationField { + if (relation === 'ancestors') { + return 'asset.children'; + } else if (relation === 'descendants') { + return 'asset.parents'; + } else { + return 'asset.references'; + } +} diff --git a/x-pack/plugins/asset_manager/server/lib/sample_assets.ts b/x-pack/plugins/asset_manager/server/lib/sample_assets.ts index 7b08fa854de7b..f49300e4663e6 100644 --- a/x-pack/plugins/asset_manager/server/lib/sample_assets.ts +++ b/x-pack/plugins/asset_manager/server/lib/sample_assets.ts @@ -103,6 +103,7 @@ const sampleK8sPods: AssetWithoutTimestamp[] = [ 'asset.name': 'k8s-pod-200xrg1-aws', 'asset.ean': 'k8s.pod:pod-200xrg1', 'asset.parents': ['k8s.node:node-101'], + 'asset.references': ['k8s.cluster:cluster-001'], }, { 'asset.type': 'k8s.pod', @@ -162,8 +163,39 @@ const sampleK8sPods: AssetWithoutTimestamp[] = [ }, ]; +const sampleCircularReferences: AssetWithoutTimestamp[] = [ + { + 'asset.type': 'k8s.node', + 'asset.id': 'node-203', + 'asset.name': 'k8s-node-203-aws', + 'asset.ean': 'k8s.node:node-203', + 'orchestrator.type': 'kubernetes', + 'orchestrator.cluster.name': 'Cluster 001 (AWS EKS)', + 'orchestrator.cluster.id': 'cluster-001', + 'cloud.provider': 'aws', + 'cloud.region': 'us-east-1', + 'cloud.service.name': 'eks', + 'asset.references': ['k8s.pod:pod-203ugg9', 'k8s.pod:pod-203ugg5'], + }, + { + 'asset.type': 'k8s.pod', + 'asset.id': 'pod-203ugg5', + 'asset.name': 'k8s-pod-203ugg5-aws', + 'asset.ean': 'k8s.pod:pod-203ugg5', + 'asset.references': ['k8s.node:node-203'], + }, + { + 'asset.type': 'k8s.pod', + 'asset.id': 'pod-203ugg9', + 'asset.name': 'k8s-pod-203ugg9-aws', + 'asset.ean': 'k8s.pod:pod-203ugg9', + 'asset.references': ['k8s.node:node-203'], + }, +]; + export const sampleAssets: AssetWithoutTimestamp[] = [ ...sampleK8sClusters, ...sampleK8sNodes, ...sampleK8sPods, + ...sampleCircularReferences, ]; diff --git a/x-pack/plugins/asset_manager/server/lib/utils.ts b/x-pack/plugins/asset_manager/server/lib/utils.ts new file mode 100644 index 0000000000000..0e65ff60887be --- /dev/null +++ b/x-pack/plugins/asset_manager/server/lib/utils.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export function toArray(maybeArray: T | T[] | undefined): T[] { + if (!maybeArray) { + return []; + } + if (Array.isArray(maybeArray)) { + return maybeArray; + } + return [maybeArray]; +} diff --git a/x-pack/plugins/asset_manager/server/routes/assets.ts b/x-pack/plugins/asset_manager/server/routes/assets.ts index d1b4d839913e4..525744131d945 100644 --- a/x-pack/plugins/asset_manager/server/routes/assets.ts +++ b/x-pack/plugins/asset_manager/server/routes/assets.ts @@ -9,10 +9,14 @@ import { schema } from '@kbn/config-schema'; import { RequestHandlerContext } from '@kbn/core/server'; import { differenceBy, intersectionBy } from 'lodash'; import { debug } from '../../common/debug_log'; +import { AssetType, assetTypeRT, relationRT } from '../../common/types_api'; import { ASSET_MANAGER_API_BASE } from '../constants'; import { getAssets } from '../lib/get_assets'; +import { getAllRelatedAssets } from '../lib/get_all_related_assets'; import { SetupRouteOptions } from './types'; import { getEsClientFromContext } from './utils'; +import { AssetNotFoundError } from '../lib/errors'; +import { toArray } from '../lib/utils'; const assetType = schema.oneOf([ schema.literal('k8s.pod'), @@ -23,11 +27,29 @@ const assetType = schema.oneOf([ const getAssetsQueryOptions = schema.object({ from: schema.maybe(schema.string()), to: schema.maybe(schema.string()), - type: schema.maybe(schema.oneOf([schema.arrayOf(assetType), assetType])), + type: schema.maybe(schema.oneOf([schema.arrayOf(assetTypeRT), assetTypeRT])), ean: schema.maybe(schema.oneOf([schema.arrayOf(schema.string()), schema.string()])), size: schema.maybe(schema.number()), }); +const getAssetsDiffQueryOptions = schema.object({ + aFrom: schema.string(), + aTo: schema.string(), + bFrom: schema.string(), + bTo: schema.string(), + type: schema.maybe(schema.oneOf([schema.arrayOf(assetType), assetType])), +}); + +const getRelatedAssetsQueryOptions = schema.object({ + from: schema.string(), // ISO timestamp or ES datemath + to: schema.maybe(schema.string()), // ISO timestamp or ES datemath + ean: schema.string(), + relation: relationRT, + type: schema.maybe(schema.oneOf([assetTypeRT, schema.arrayOf(assetTypeRT)])), + maxDistance: schema.maybe(schema.number()), + size: schema.maybe(schema.number()), +}); + export function assetsRoutes({ router }: SetupRouteOptions) { // GET /assets router.get( @@ -58,14 +80,51 @@ export function assetsRoutes({ router }: SetupR } ); + // GET assets/related + router.get( + { + path: `${ASSET_MANAGER_API_BASE}/assets/related`, + validate: { + query: getRelatedAssetsQueryOptions, + }, + }, + async (context, req, res) => { + // Add references into sample data and write integration tests + + const { from, to, ean, relation } = req.query || {}; + const esClient = await getEsClientFromContext(context); + + // What if maxDistance is below 1? + const maxDistance = req.query.maxDistance ? Math.min(req.query.maxDistance, 5) : 1; // Validate maxDistance not larger than 5 + const size = req.query.size ? Math.min(req.query.size, 100) : 10; // Do we need pagination and sorting? Yes. + const type = toArray(req.query.type); + // Validate from and to to be ISO string only. Or use io-ts to coerce. + + try { + return res.ok({ + body: { + results: await getAllRelatedAssets(esClient, { + ean, + from, + to, + type, + maxDistance, + size, + relation, + }), + }, + }); + } catch (error: any) { + debug('error looking up asset records', error); + if (error instanceof AssetNotFoundError) { + return res.customError({ statusCode: 404, body: error.message }); + } + return res.customError({ statusCode: 500, body: error.message }); + } + } + ); + // GET /assets/diff - const getAssetsDiffQueryOptions = schema.object({ - aFrom: schema.string(), - aTo: schema.string(), - bFrom: schema.string(), - bTo: schema.string(), - type: schema.maybe(schema.oneOf([schema.arrayOf(assetType), assetType])), - }); router.get( { path: `${ASSET_MANAGER_API_BASE}/assets/diff`, @@ -74,7 +133,8 @@ export function assetsRoutes({ router }: SetupR }, }, async (context, req, res) => { - const { aFrom, aTo, bFrom, bTo, type } = req.query; + const { aFrom, aTo, bFrom, bTo } = req.query; + const type = toArray(req.query.type); if (new Date(aFrom) > new Date(aTo)) { return res.badRequest({ diff --git a/x-pack/plugins/asset_manager/tsconfig.json b/x-pack/plugins/asset_manager/tsconfig.json index 931c71de198dd..9f76a58f0d422 100644 --- a/x-pack/plugins/asset_manager/tsconfig.json +++ b/x-pack/plugins/asset_manager/tsconfig.json @@ -15,5 +15,6 @@ "@kbn/core", "@kbn/config-schema", "@kbn/core-http-server", + "@kbn/core-elasticsearch-client-server-mocks", ] } diff --git a/x-pack/plugins/cases/common/api/cases/case.ts b/x-pack/plugins/cases/common/api/cases/case.ts index 648e29ec3d76a..fb77d5f4a95d2 100644 --- a/x-pack/plugins/cases/common/api/cases/case.ts +++ b/x-pack/plugins/cases/common/api/cases/case.ts @@ -249,7 +249,7 @@ export const CasesByAlertIDRequestRt = rt.partial({ owner: rt.union([rt.array(rt.string), rt.string]), }); -export const CaseResponseRt = rt.intersection([ +export const CaseRt = rt.intersection([ CaseAttributesRt, rt.type({ id: rt.string, @@ -264,7 +264,7 @@ export const CaseResponseRt = rt.intersection([ export const CaseResolveResponseRt = rt.intersection([ rt.type({ - case: CaseResponseRt, + case: CaseRt, outcome: rt.union([rt.literal('exactMatch'), rt.literal('aliasMatch'), rt.literal('conflict')]), }), rt.partial({ @@ -275,7 +275,7 @@ export const CaseResolveResponseRt = rt.intersection([ export const CasesFindResponseRt = rt.intersection([ rt.type({ - cases: rt.array(CaseResponseRt), + cases: rt.array(CaseRt), page: rt.number, per_page: rt.number, total: rt.number, @@ -292,7 +292,7 @@ export const CasePatchRequestRt = rt.intersection([ ]); export const CasesPatchRequestRt = rt.type({ cases: rt.array(CasePatchRequestRt) }); -export const CasesResponseRt = rt.array(CaseResponseRt); +export const CasesRt = rt.array(CaseRt); export const CasePushRequestParamsRt = rt.type({ case_id: rt.string, @@ -339,7 +339,7 @@ export const CasesBulkGetRequestRt = rt.intersection([ ]); export const CasesBulkGetResponseRt = rt.type({ - cases: CasesResponseRt, + cases: CasesRt, errors: rt.array( rt.type({ error: rt.string, @@ -353,9 +353,9 @@ export const CasesBulkGetResponseRt = rt.type({ export type CaseAttributes = rt.TypeOf; export type CasePostRequest = rt.TypeOf; -export type CaseResponse = rt.TypeOf; +export type Case = rt.TypeOf; export type CaseResolveResponse = rt.TypeOf; -export type CasesResponse = rt.TypeOf; +export type Cases = rt.TypeOf; export type CasesFindRequest = rt.TypeOf; export type CasesByAlertIDRequest = rt.TypeOf; export type CasesFindResponse = rt.TypeOf; @@ -375,13 +375,15 @@ export type CasesByAlertId = rt.TypeOf; export type CasesBulkGetRequest = rt.TypeOf; export type CasesBulkGetResponse = rt.TypeOf; -export type CasesBulkGetRequestCertainFields< - Field extends keyof CaseResponse = keyof CaseResponse -> = Omit & { +export type CasesBulkGetRequestCertainFields = Omit< + CasesBulkGetRequest, + 'fields' +> & { fields?: Field[]; }; -export type CasesBulkGetResponseCertainFields< - Field extends keyof CaseResponse = keyof CaseResponse -> = Omit & { - cases: Array>; +export type CasesBulkGetResponseCertainFields = Omit< + CasesBulkGetResponse, + 'cases' +> & { + cases: Array>; }; diff --git a/x-pack/plugins/cases/common/api/saved_object.ts b/x-pack/plugins/cases/common/api/saved_object.ts index 2ed6ec2acdfe4..44af143284bce 100644 --- a/x-pack/plugins/cases/common/api/saved_object.ts +++ b/x-pack/plugins/cases/common/api/saved_object.ts @@ -68,5 +68,3 @@ export const SavedObjectFindOptionsRt = rt.partial({ */ sortOrder: rt.union([rt.literal('desc'), rt.literal('asc')]), }); - -export type SavedObjectFindOptions = rt.TypeOf; diff --git a/x-pack/plugins/cases/common/index.ts b/x-pack/plugins/cases/common/index.ts index d41de5543654d..6483bba8ce4f2 100644 --- a/x-pack/plugins/cases/common/index.ts +++ b/x-pack/plugins/cases/common/index.ts @@ -38,13 +38,15 @@ export { } from './api'; export type { - CaseResponse, + Case, + Cases, CasesBulkGetRequestCertainFields, CasesBulkGetResponseCertainFields, } from './api'; export type { - Case, + CaseUI, + CasesUI, Ecs, CasesFeatures, CaseViewRefreshPropInterface, diff --git a/x-pack/plugins/cases/common/ui/types.ts b/x-pack/plugins/cases/common/ui/types.ts index 76e6f2adeb546..b254d5dce0afd 100644 --- a/x-pack/plugins/cases/common/ui/types.ts +++ b/x-pack/plugins/cases/common/ui/types.ts @@ -20,7 +20,7 @@ import type { CaseUserActionResponse, SingleCaseMetricsResponse, Comment, - CaseResponse, + Case as CaseSnakeCase, UserActionFindResponse, FindTypeField as UserActionFindTypeField, CommentResponseAlertsType, @@ -92,8 +92,8 @@ export type FindCaseUserActions = Omit, userActions: CaseUserActions[]; }; export type CaseUserActionsStats = SnakeToCamelCase; -export type Case = Omit, 'comments'> & { comments: CommentUI[] }; -export type Cases = Omit, 'cases'> & { cases: Case[] }; +export type CaseUI = Omit, 'comments'> & { comments: CommentUI[] }; +export type CasesUI = Omit, 'cases'> & { cases: CaseUI[] }; export type CasesStatus = SnakeToCamelCase; export type CasesMetrics = SnakeToCamelCase; export type CaseUpdateRequest = SnakeToCamelCase; @@ -101,7 +101,7 @@ export type CaseConnectors = SnakeToCamelCase; export type CaseUsers = GetCaseUsersResponse; export interface ResolvedCase { - case: Case; + case: CaseUI; outcome: ResolvedSimpleSavedObject['outcome']; aliasTargetId?: ResolvedSimpleSavedObject['alias_target_id']; aliasPurpose?: ResolvedSimpleSavedObject['alias_purpose']; @@ -191,7 +191,7 @@ export type UpdateKey = keyof Pick< export interface UpdateByKey { updateKey: UpdateKey; updateValue: CasePatchRequest[UpdateKey]; - caseData: Case; + caseData: CaseUI; onSuccess?: () => void; onError?: () => void; } diff --git a/x-pack/plugins/cases/public/api/decoders.ts b/x-pack/plugins/cases/public/api/decoders.ts index 6402b2d56a342..121595ccb0414 100644 --- a/x-pack/plugins/cases/public/api/decoders.ts +++ b/x-pack/plugins/cases/public/api/decoders.ts @@ -16,12 +16,12 @@ import type { CasesStatusResponse, CasesMetricsResponse, CasesBulkGetResponseCertainFields, - CaseResponse, + Case, } from '../../common/api'; import { CasesFindResponseRt, CasesStatusResponseRt, - CasesResponseRt, + CasesRt, getTypeForCertainFieldsFromArray, CasesMetricsResponseRt, } from '../../common/api'; @@ -41,11 +41,11 @@ export const decodeCasesMetricsResponse = (metrics?: CasesMetricsResponse) => fold(throwErrors(createToasterPlainError), identity) ); -export const decodeCasesBulkGetResponse = ( +export const decodeCasesBulkGetResponse = ( res: CasesBulkGetResponseCertainFields, fields?: string[] ) => { - const typeToDecode = getTypeForCertainFieldsFromArray(CasesResponseRt, fields); + const typeToDecode = getTypeForCertainFieldsFromArray(CasesRt, fields); pipe(typeToDecode.decode(res.cases), fold(throwErrors(createToasterPlainError), identity)); return res; diff --git a/x-pack/plugins/cases/public/api/index.ts b/x-pack/plugins/cases/public/api/index.ts index c89b1ff94f9e9..9d30cd0b58557 100644 --- a/x-pack/plugins/cases/public/api/index.ts +++ b/x-pack/plugins/cases/public/api/index.ts @@ -6,7 +6,7 @@ */ import type { HttpStart } from '@kbn/core/public'; -import type { Cases, CasesStatus, CasesMetrics } from '../../common/ui'; +import type { CasesUI, CasesStatus, CasesMetrics } from '../../common/ui'; import { CASE_FIND_URL, CASE_METRICS_URL, @@ -14,7 +14,7 @@ import { INTERNAL_BULK_GET_CASES_URL, } from '../../common/constants'; import type { - CaseResponse, + Case, CasesBulkGetRequestCertainFields, CasesBulkGetResponseCertainFields, CasesFindRequest, @@ -41,7 +41,7 @@ export const getCases = async ({ http, signal, query, -}: HTTPService & { query: CasesFindRequest }): Promise => { +}: HTTPService & { query: CasesFindRequest }): Promise => { const res = await http.get(CASE_FIND_URL, { query, signal }); return convertAllCasesToCamel(decodeCasesFindResponse(res)); }; @@ -68,7 +68,7 @@ export const getCasesMetrics = async ({ return convertToCamelCase(decodeCasesMetricsResponse(res)); }; -export const bulkGetCases = async ({ +export const bulkGetCases = async ({ http, signal, params, diff --git a/x-pack/plugins/cases/public/api/utils.ts b/x-pack/plugins/cases/public/api/utils.ts index fd5d28139a4b4..012b03c48e397 100644 --- a/x-pack/plugins/cases/public/api/utils.ts +++ b/x-pack/plugins/cases/public/api/utils.ts @@ -13,15 +13,15 @@ import { } from '../../common/utils/attachments'; import type { CasesFindResponse, - CaseResponse, + Case, CaseUserActionsResponse, CommentRequest, Comment, CaseResolveResponse, - CasesResponse, + Cases, } from '../../common/api'; import { isCommentUserAction } from '../../common/utils/user_actions'; -import type { Cases, Case, CommentUI, ResolvedCase } from '../containers/types'; +import type { CasesUI, CaseUI, CommentUI, ResolvedCase } from '../containers/types'; export const convertArrayToCamelCase = (arrayOfSnakes: unknown[]): unknown[] => arrayOfSnakes.reduce((acc: unknown[], value) => { @@ -46,15 +46,15 @@ export const convertToCamelCase = (obj: T): U => return acc; }, {} as U); -export const convertCaseToCamelCase = (theCase: CaseResponse): Case => { +export const convertCaseToCamelCase = (theCase: Case): CaseUI => { const { comments, ...restCase } = theCase; return { - ...convertToCamelCase(restCase), + ...convertToCamelCase(restCase), ...(comments != null ? { comments: convertAttachmentsToCamelCase(comments) } : {}), }; }; -export const convertCasesToCamelCase = (cases: CasesResponse): Case[] => +export const convertCasesToCamelCase = (cases: Cases): CaseUI[] => cases.map(convertCaseToCamelCase); export const convertCaseResolveToCamelCase = (res: CaseResolveResponse): ResolvedCase => { @@ -113,7 +113,7 @@ const convertAttachmentToCamelExceptProperty = ( } as CommentUI; }; -export const convertAllCasesToCamel = (snakeCases: CasesFindResponse): Cases => ({ +export const convertAllCasesToCamel = (snakeCases: CasesFindResponse): CasesUI => ({ cases: convertCasesToCamelCase(snakeCases.cases), countOpenCases: snakeCases.count_open_cases, countInProgressCases: snakeCases.count_in_progress_cases, diff --git a/x-pack/plugins/cases/public/client/api/index.ts b/x-pack/plugins/cases/public/client/api/index.ts index 09a172121d08c..d040c3a8e7fb9 100644 --- a/x-pack/plugins/cases/public/client/api/index.ts +++ b/x-pack/plugins/cases/public/client/api/index.ts @@ -14,7 +14,7 @@ import type { CasesMetricsRequest, } from '../../../common/api'; import { getCasesFromAlertsUrl } from '../../../common/api'; -import type { Cases, CasesStatus, CasesMetrics } from '../../../common/ui'; +import type { CasesUI, CasesStatus, CasesMetrics } from '../../../common/ui'; import { bulkGetCases, getCases, getCasesMetrics, getCasesStatus } from '../../api'; import type { CasesUiStart } from '../../types'; @@ -26,7 +26,7 @@ export const createClientAPI = ({ http }: { http: HttpStart }): CasesUiStart['ap ): Promise => http.get(getCasesFromAlertsUrl(alertId), { query }), cases: { - find: (query: CasesFindRequest, signal?: AbortSignal): Promise => + find: (query: CasesFindRequest, signal?: AbortSignal): Promise => getCases({ http, query, signal }), getCasesStatus: (query: CasesStatusRequest, signal?: AbortSignal): Promise => getCasesStatus({ http, query, signal }), diff --git a/x-pack/plugins/cases/public/client/attachment_framework/types.ts b/x-pack/plugins/cases/public/client/attachment_framework/types.ts index 95a453b9d0a12..793bcca8d15eb 100644 --- a/x-pack/plugins/cases/public/client/attachment_framework/types.ts +++ b/x-pack/plugins/cases/public/client/attachment_framework/types.ts @@ -11,7 +11,7 @@ import type { CommentRequestExternalReferenceType, CommentRequestPersistableStateType, } from '../../../common/api'; -import type { Case } from '../../containers/types'; +import type { CaseUI } from '../../containers/types'; export enum AttachmentActionType { BUTTON = 'button', @@ -48,7 +48,7 @@ export interface AttachmentViewObject { } export interface CommonAttachmentViewProps { - caseData: Pick; + caseData: Pick; } export interface ExternalReferenceAttachmentViewProps extends CommonAttachmentViewProps { diff --git a/x-pack/plugins/cases/public/common/use_cases_toast.tsx b/x-pack/plugins/cases/public/common/use_cases_toast.tsx index 26027905f8f0e..d123cc1bdd5e8 100644 --- a/x-pack/plugins/cases/public/common/use_cases_toast.tsx +++ b/x-pack/plugins/cases/public/common/use_cases_toast.tsx @@ -11,7 +11,7 @@ import React from 'react'; import styled from 'styled-components'; import { toMountPoint } from '@kbn/kibana-react-plugin/public'; import { isValidOwner } from '../../common/utils/owner'; -import type { Case } from '../../common'; +import type { CaseUI } from '../../common'; import { CommentType } from '../../common'; import { useKibana, useToasts } from './lib/kibana'; import { generateCaseViewPath } from './navigation'; @@ -61,7 +61,7 @@ function getToastTitle({ title, attachments, }: { - theCase: Case; + theCase: CaseUI; title?: string; attachments?: CaseAttachmentsWithoutOwner; }): string { @@ -82,7 +82,7 @@ function getToastContent({ content, attachments, }: { - theCase: Case; + theCase: CaseUI; content?: string; attachments?: CaseAttachmentsWithoutOwner; }): string | undefined { @@ -131,7 +131,7 @@ export const useCasesToast = () => { title, content, }: { - theCase: Case; + theCase: CaseUI; attachments?: CaseAttachmentsWithoutOwner; title?: string; content?: string; diff --git a/x-pack/plugins/cases/public/components/actions/assignees/edit_assignees_flyout.tsx b/x-pack/plugins/cases/public/components/actions/assignees/edit_assignees_flyout.tsx index 42f4ef30ec594..2d9ee31171e42 100644 --- a/x-pack/plugins/cases/public/components/actions/assignees/edit_assignees_flyout.tsx +++ b/x-pack/plugins/cases/public/components/actions/assignees/edit_assignees_flyout.tsx @@ -21,13 +21,13 @@ import { EuiTitle, } from '@elastic/eui'; -import type { Case } from '../../../../common'; +import type { CaseUI } from '../../../../common'; import { EditAssigneesSelectable } from './edit_assignees_selectable'; import * as i18n from './translations'; import type { ItemsSelectionState } from '../types'; interface Props { - selectedCases: Case[]; + selectedCases: CaseUI[]; onClose: () => void; onSaveAssignees: (args: ItemsSelectionState) => void; } diff --git a/x-pack/plugins/cases/public/components/actions/assignees/edit_assignees_selectable.tsx b/x-pack/plugins/cases/public/components/actions/assignees/edit_assignees_selectable.tsx index afcbbd4e165f5..3630c7114c009 100644 --- a/x-pack/plugins/cases/public/components/actions/assignees/edit_assignees_selectable.tsx +++ b/x-pack/plugins/cases/public/components/actions/assignees/edit_assignees_selectable.tsx @@ -27,7 +27,7 @@ import { getUserDisplayName } from '@kbn/user-profile-components'; import { useBulkGetUserProfiles } from '../../../containers/user_profiles/use_bulk_get_user_profiles'; import { useIsUserTyping } from '../../../common/use_is_user_typing'; import { useSuggestUserProfiles } from '../../../containers/user_profiles/use_suggest_user_profiles'; -import type { Case } from '../../../../common'; +import type { CaseUI } from '../../../../common'; import * as i18n from './translations'; import { useItemsState } from '../use_items_state'; import type { ItemSelectableOption, ItemsSelectionState } from '../types'; @@ -38,7 +38,7 @@ import { SmallUserAvatar } from '../../user_profiles/small_user_avatar'; import { NoSelectedAssignees } from './no_selected_assignees'; interface Props { - selectedCases: Case[]; + selectedCases: CaseUI[]; onChangeAssignees: (args: ItemsSelectionState) => void; } diff --git a/x-pack/plugins/cases/public/components/actions/assignees/use_assignees_action.tsx b/x-pack/plugins/cases/public/components/actions/assignees/use_assignees_action.tsx index f2b1cb6947c9b..76e5d2239135e 100644 --- a/x-pack/plugins/cases/public/components/actions/assignees/use_assignees_action.tsx +++ b/x-pack/plugins/cases/public/components/actions/assignees/use_assignees_action.tsx @@ -7,14 +7,14 @@ import { EuiIcon } from '@elastic/eui'; import React from 'react'; -import type { Case } from '../../../../common'; +import type { CaseUI } from '../../../../common'; import type { UseActionProps } from '../types'; import { useItemsAction } from '../use_items_action'; import * as i18n from './translations'; export const useAssigneesAction = ({ onAction, onActionSuccess, isDisabled }: UseActionProps) => { const { isFlyoutOpen, onFlyoutClosed, onSaveItems, openFlyout, isActionDisabled } = - useItemsAction({ + useItemsAction({ fieldKey: 'assignees', isDisabled, onAction, @@ -27,7 +27,7 @@ export const useAssigneesAction = ({ onAction, onActionSuccess, isDisabled }: Us })), }); - const getAction = (selectedCases: Case[]) => { + const getAction = (selectedCases: CaseUI[]) => { return { name: i18n.EDIT_ASSIGNEES, onClick: () => openFlyout(selectedCases), diff --git a/x-pack/plugins/cases/public/components/actions/copy_id/use_copy_id_action.tsx b/x-pack/plugins/cases/public/components/actions/copy_id/use_copy_id_action.tsx index be2166ba5b250..260726daa5950 100644 --- a/x-pack/plugins/cases/public/components/actions/copy_id/use_copy_id_action.tsx +++ b/x-pack/plugins/cases/public/components/actions/copy_id/use_copy_id_action.tsx @@ -10,13 +10,13 @@ import { EuiIcon, EuiTextColor } from '@elastic/eui'; import * as i18n from '../../../common/translations'; import { useCasesToast } from '../../../common/use_cases_toast'; -import type { Case } from '../../../../common'; +import type { CaseUI } from '../../../../common'; import type { UseCopyIDActionProps } from '../types'; export const useCopyIDAction = ({ onActionSuccess }: UseCopyIDActionProps) => { const { showSuccessToast } = useCasesToast(); - const getAction = (selectedCase: Case) => { + const getAction = (selectedCase: CaseUI) => { return { name: {i18n.COPY_ID_ACTION_LABEL}, onClick: () => { diff --git a/x-pack/plugins/cases/public/components/actions/delete/use_delete_action.tsx b/x-pack/plugins/cases/public/components/actions/delete/use_delete_action.tsx index 608af0e66444b..52370742a6685 100644 --- a/x-pack/plugins/cases/public/components/actions/delete/use_delete_action.tsx +++ b/x-pack/plugins/cases/public/components/actions/delete/use_delete_action.tsx @@ -7,7 +7,7 @@ import React, { useCallback, useState } from 'react'; import { EuiIcon, EuiTextColor, useEuiTheme } from '@elastic/eui'; -import type { Case } from '../../../../common'; +import type { CaseUI } from '../../../../common'; import { useDeleteCases } from '../../../containers/use_delete_cases'; import * as i18n from './translations'; @@ -21,13 +21,13 @@ export const useDeleteAction = ({ onAction, onActionSuccess, isDisabled }: UseAc const euiTheme = useEuiTheme(); const { permissions } = useCasesContext(); const [isModalVisible, setIsModalVisible] = useState(false); - const [caseToBeDeleted, setCaseToBeDeleted] = useState([]); + const [caseToBeDeleted, setCaseToBeDeleted] = useState([]); const canDelete = permissions.delete; const isActionDisabled = isDisabled || !canDelete; const onCloseModal = useCallback(() => setIsModalVisible(false), []); const openModal = useCallback( - (selectedCases: Case[]) => { + (selectedCases: CaseUI[]) => { onAction(); setIsModalVisible(true); setCaseToBeDeleted(selectedCases); @@ -50,7 +50,7 @@ export const useDeleteAction = ({ onAction, onActionSuccess, isDisabled }: UseAc const color = isActionDisabled ? euiTheme.euiTheme.colors.disabled : 'danger'; - const getAction = (selectedCases: Case[]) => { + const getAction = (selectedCases: CaseUI[]) => { return { name: {getDeleteActionTitle(selectedCases.length)}, onClick: () => openModal(selectedCases), diff --git a/x-pack/plugins/cases/public/components/actions/severity/use_severity_action.tsx b/x-pack/plugins/cases/public/components/actions/severity/use_severity_action.tsx index 614bb0cbef77c..d271f8891bfeb 100644 --- a/x-pack/plugins/cases/public/components/actions/severity/use_severity_action.tsx +++ b/x-pack/plugins/cases/public/components/actions/severity/use_severity_action.tsx @@ -9,14 +9,14 @@ import { useCallback } from 'react'; import type { EuiContextMenuPanelItemDescriptor } from '@elastic/eui'; import { CaseSeverity } from '../../../../common/api'; import { useUpdateCases } from '../../../containers/use_bulk_update_case'; -import type { Case } from '../../../../common'; +import type { CaseUI } from '../../../../common'; import * as i18n from './translations'; import type { UseActionProps } from '../types'; import { useCasesContext } from '../../cases_context/use_cases_context'; import { severities } from '../../severity/config'; -const getSeverityToasterMessage = (severity: CaseSeverity, cases: Case[]): string => { +const getSeverityToasterMessage = (severity: CaseSeverity, cases: CaseUI[]): string => { const totalCases = cases.length; const caseTitle = totalCases === 1 ? cases[0].title : ''; @@ -39,7 +39,7 @@ interface UseSeverityActionProps extends UseActionProps { selectedSeverity?: CaseSeverity; } -const shouldDisableSeverity = (cases: Case[], severity: CaseSeverity) => +const shouldDisableSeverity = (cases: CaseUI[], severity: CaseSeverity) => cases.every((theCase) => theCase.severity === severity); export const useSeverityAction = ({ @@ -54,7 +54,7 @@ export const useSeverityAction = ({ const isActionDisabled = isDisabled || !canUpdateSeverity; const handleUpdateCaseSeverity = useCallback( - (selectedCases: Case[], severity: CaseSeverity) => { + (selectedCases: CaseUI[], severity: CaseSeverity) => { onAction(); const casesToUpdate = selectedCases.map((theCase) => ({ severity, @@ -76,7 +76,7 @@ export const useSeverityAction = ({ const getSeverityIcon = (severity: CaseSeverity): string => selectedSeverity && selectedSeverity === severity ? 'check' : 'empty'; - const getActions = (selectedCases: Case[]): EuiContextMenuPanelItemDescriptor[] => { + const getActions = (selectedCases: CaseUI[]): EuiContextMenuPanelItemDescriptor[] => { return [ { name: severities[CaseSeverity.LOW].label, diff --git a/x-pack/plugins/cases/public/components/actions/status/use_status_action.tsx b/x-pack/plugins/cases/public/components/actions/status/use_status_action.tsx index 6b9fe58c15105..6c32d2cdbd865 100644 --- a/x-pack/plugins/cases/public/components/actions/status/use_status_action.tsx +++ b/x-pack/plugins/cases/public/components/actions/status/use_status_action.tsx @@ -8,7 +8,7 @@ import { useCallback } from 'react'; import type { EuiContextMenuPanelItemDescriptor } from '@elastic/eui'; import { useUpdateCases } from '../../../containers/use_bulk_update_case'; -import type { Case } from '../../../../common'; +import type { CaseUI } from '../../../../common'; import { CaseStatuses } from '../../../../common'; import * as i18n from './translations'; @@ -16,7 +16,7 @@ import type { UseActionProps } from '../types'; import { statuses } from '../../status'; import { useCasesContext } from '../../cases_context/use_cases_context'; -const getStatusToasterMessage = (status: CaseStatuses, cases: Case[]): string => { +const getStatusToasterMessage = (status: CaseStatuses, cases: CaseUI[]): string => { const totalCases = cases.length; const caseTitle = totalCases === 1 ? cases[0].title : ''; @@ -35,7 +35,7 @@ interface UseStatusActionProps extends UseActionProps { selectedStatus?: CaseStatuses; } -const shouldDisableStatus = (cases: Case[], status: CaseStatuses) => +const shouldDisableStatus = (cases: CaseUI[], status: CaseStatuses) => cases.every((theCase) => theCase.status === status); export const useStatusAction = ({ @@ -50,7 +50,7 @@ export const useStatusAction = ({ const isActionDisabled = isDisabled || !canUpdateStatus; const handleUpdateCaseStatus = useCallback( - (selectedCases: Case[], status: CaseStatuses) => { + (selectedCases: CaseUI[], status: CaseStatuses) => { onAction(); const casesToUpdate = selectedCases.map((theCase) => ({ status, @@ -72,7 +72,7 @@ export const useStatusAction = ({ const getStatusIcon = (status: CaseStatuses): string => selectedStatus && selectedStatus === status ? 'check' : 'empty'; - const getActions = (selectedCases: Case[]): EuiContextMenuPanelItemDescriptor[] => { + const getActions = (selectedCases: CaseUI[]): EuiContextMenuPanelItemDescriptor[] => { return [ { name: statuses[CaseStatuses.open].label, diff --git a/x-pack/plugins/cases/public/components/actions/tags/edit_tags_flyout.tsx b/x-pack/plugins/cases/public/components/actions/tags/edit_tags_flyout.tsx index babedee38611c..6bf5853d5e671 100644 --- a/x-pack/plugins/cases/public/components/actions/tags/edit_tags_flyout.tsx +++ b/x-pack/plugins/cases/public/components/actions/tags/edit_tags_flyout.tsx @@ -22,14 +22,14 @@ import { EuiTitle, } from '@elastic/eui'; -import type { Case } from '../../../../common'; +import type { CaseUI } from '../../../../common'; import { useGetTags } from '../../../containers/use_get_tags'; import { EditTagsSelectable } from './edit_tags_selectable'; import * as i18n from './translations'; import type { ItemsSelectionState } from '../types'; interface Props { - selectedCases: Case[]; + selectedCases: CaseUI[]; onClose: () => void; onSaveTags: (args: ItemsSelectionState) => void; } diff --git a/x-pack/plugins/cases/public/components/actions/tags/edit_tags_selectable.tsx b/x-pack/plugins/cases/public/components/actions/tags/edit_tags_selectable.tsx index 3bdbb60cac8e8..437c3c94b1915 100644 --- a/x-pack/plugins/cases/public/components/actions/tags/edit_tags_selectable.tsx +++ b/x-pack/plugins/cases/public/components/actions/tags/edit_tags_selectable.tsx @@ -20,13 +20,13 @@ import { } from '@elastic/eui'; import { isEmpty } from 'lodash'; -import type { Case } from '../../../../common'; +import type { CaseUI } from '../../../../common'; import * as i18n from './translations'; import { useItemsState } from '../use_items_state'; import type { ItemSelectableOption, ItemsSelectionState } from '../types'; interface Props { - selectedCases: Case[]; + selectedCases: CaseUI[]; tags: string[]; isLoading: boolean; onChangeTags: (args: ItemsSelectionState) => void; diff --git a/x-pack/plugins/cases/public/components/actions/tags/use_tags_action.tsx b/x-pack/plugins/cases/public/components/actions/tags/use_tags_action.tsx index 2e4acd618b34f..ff7d9dc078f39 100644 --- a/x-pack/plugins/cases/public/components/actions/tags/use_tags_action.tsx +++ b/x-pack/plugins/cases/public/components/actions/tags/use_tags_action.tsx @@ -7,14 +7,14 @@ import { EuiIcon } from '@elastic/eui'; import React from 'react'; -import type { Case } from '../../../../common'; +import type { CaseUI } from '../../../../common'; import type { UseActionProps } from '../types'; import { useItemsAction } from '../use_items_action'; import * as i18n from './translations'; export const useTagsAction = ({ onAction, onActionSuccess, isDisabled }: UseActionProps) => { const { isFlyoutOpen, onFlyoutClosed, onSaveItems, openFlyout, isActionDisabled } = - useItemsAction({ + useItemsAction({ fieldKey: 'tags', isDisabled, onAction, @@ -24,7 +24,7 @@ export const useTagsAction = ({ onAction, onActionSuccess, isDisabled }: UseActi itemsTransformer: (items) => items, }); - const getAction = (selectedCases: Case[]) => { + const getAction = (selectedCases: CaseUI[]) => { return { name: i18n.EDIT_TAGS, onClick: () => openFlyout(selectedCases), diff --git a/x-pack/plugins/cases/public/components/actions/use_items_action.tsx b/x-pack/plugins/cases/public/components/actions/use_items_action.tsx index 6ab5dce5f48ef..464f14bbee11b 100644 --- a/x-pack/plugins/cases/public/components/actions/use_items_action.tsx +++ b/x-pack/plugins/cases/public/components/actions/use_items_action.tsx @@ -9,14 +9,14 @@ import { useCallback, useState } from 'react'; import { difference, isEqual } from 'lodash'; import type { CaseUpdateRequest } from '../../../common/ui'; import { useUpdateCases } from '../../containers/use_bulk_update_case'; -import type { Case } from '../../../common'; +import type { CaseUI } from '../../../common'; import { useCasesContext } from '../cases_context/use_cases_context'; import type { UseActionProps, ItemsSelectionState } from './types'; type UseItemsActionProps = UseActionProps & { fieldKey: 'tags' | 'assignees'; successToasterTitle: (totalCases: number) => string; - fieldSelector: (theCase: Case) => string[]; + fieldSelector: (theCase: CaseUI) => string[]; itemsTransformer: (items: string[]) => T; }; @@ -32,13 +32,13 @@ export const useItemsAction = ({ const { mutate: updateCases } = useUpdateCases(); const { permissions } = useCasesContext(); const [isFlyoutOpen, setIsFlyoutOpen] = useState(false); - const [selectedCasesToEdit, setSelectedCasesToEdit] = useState([]); + const [selectedCasesToEdit, setSelectedCasesToEdit] = useState([]); const canUpdateStatus = permissions.update; const isActionDisabled = isDisabled || !canUpdateStatus; const onFlyoutClosed = useCallback(() => setIsFlyoutOpen(false), []); const openFlyout = useCallback( - (selectedCases: Case[]) => { + (selectedCases: CaseUI[]) => { onAction(); setIsFlyoutOpen(true); setSelectedCasesToEdit(selectedCases); diff --git a/x-pack/plugins/cases/public/components/actions/use_items_state.tsx b/x-pack/plugins/cases/public/components/actions/use_items_state.tsx index bd5db49336b5a..99ccf9b9e2055 100644 --- a/x-pack/plugins/cases/public/components/actions/use_items_state.tsx +++ b/x-pack/plugins/cases/public/components/actions/use_items_state.tsx @@ -8,14 +8,14 @@ import type { EuiSelectableOption, IconType } from '@elastic/eui'; import { assertNever } from '@elastic/eui'; import { useCallback, useReducer, useMemo } from 'react'; -import type { Case } from '../../../common'; +import type { CaseUI } from '../../../common'; import type { ItemSelectableOption, ItemsSelectionState } from './types'; interface UseItemsStateProps { items: string[]; - selectedCases: Case[]; + selectedCases: CaseUI[]; itemToSelectableOption: (item: Payload[number]) => EuiSelectableOption; - fieldSelector: (theCase: Case) => string[]; + fieldSelector: (theCase: CaseUI) => string[]; onChangeItems: (args: ItemsSelectionState) => void; } @@ -153,7 +153,7 @@ const getInitialItemsState = ({ fieldSelector, }: { items: string[]; - selectedCases: Case[]; + selectedCases: CaseUI[]; fieldSelector: UseItemsStateProps['fieldSelector']; }): State => { const itemCounterMap = createItemsCounterMapping({ selectedCases, fieldSelector }); @@ -183,7 +183,7 @@ const createItemsCounterMapping = ({ selectedCases, fieldSelector, }: { - selectedCases: Case[]; + selectedCases: CaseUI[]; fieldSelector: UseItemsStateProps['fieldSelector']; }) => { const counterMap = new Map(); diff --git a/x-pack/plugins/cases/public/components/add_comment/index.tsx b/x-pack/plugins/cases/public/components/add_comment/index.tsx index d75401841b6f5..fceeef2d31412 100644 --- a/x-pack/plugins/cases/public/components/add_comment/index.tsx +++ b/x-pack/plugins/cases/public/components/add_comment/index.tsx @@ -25,7 +25,7 @@ import { } from '@kbn/es-ui-shared-plugin/static/forms/hook_form_lib'; import { CommentType } from '../../../common/api'; import { useCreateAttachments } from '../../containers/use_create_attachments'; -import type { Case } from '../../containers/types'; +import type { CaseUI } from '../../containers/types'; import type { EuiMarkdownEditorRef } from '../markdown_editor'; import { MarkdownEditorForm } from '../markdown_editor'; import { getMarkdownEditorStorageKey } from '../markdown_editor/utils'; @@ -57,7 +57,7 @@ export interface AddCommentProps { id: string; caseId: string; onCommentSaving?: () => void; - onCommentPosted: (newCase: Case) => void; + onCommentPosted: (newCase: CaseUI) => void; showLoading?: boolean; statusActionButton: JSX.Element | null; } diff --git a/x-pack/plugins/cases/public/components/all_cases/all_cases_list.tsx b/x-pack/plugins/cases/public/components/all_cases/all_cases_list.tsx index 7666d518fe9b4..f30fd33fd0995 100644 --- a/x-pack/plugins/cases/public/components/all_cases/all_cases_list.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/all_cases_list.tsx @@ -11,7 +11,7 @@ import { EuiProgress } from '@elastic/eui'; import { difference, head, isEmpty } from 'lodash/fp'; import styled, { css } from 'styled-components'; -import type { Case, CaseStatusWithAllStatus, FilterOptions } from '../../../common/ui/types'; +import type { CaseUI, CaseStatusWithAllStatus, FilterOptions } from '../../../common/ui/types'; import { SortFieldCase, StatusAll } from '../../../common/ui/types'; import { CaseStatuses, caseStatuses } from '../../../common/api'; import { OWNER_INFO } from '../../../common/constants'; @@ -64,7 +64,7 @@ const mapToReadableSolutionName = (solution: string): Solution => { export interface AllCasesListProps { hiddenStatuses?: CaseStatusWithAllStatus[]; isSelectorView?: boolean; - onRowClick?: (theCase?: Case) => void; + onRowClick?: (theCase?: CaseUI) => void; } export const AllCasesList = React.memo( @@ -84,7 +84,7 @@ export const AllCasesList = React.memo( isSelectorView, initialFilterOptions ); - const [selectedCases, setSelectedCases] = useState([]); + const [selectedCases, setSelectedCases] = useState([]); const { data = initialData, isFetching: isLoadingCases } = useGetCases({ filterOptions, @@ -224,7 +224,7 @@ export const AllCasesList = React.memo( [data, queryParams] ); - const euiBasicTableSelectionProps = useMemo>( + const euiBasicTableSelectionProps = useMemo>( () => ({ onSelectionChange: setSelectedCases, initialSelected: selectedCases, @@ -235,7 +235,7 @@ export const AllCasesList = React.memo( const isDataEmpty = useMemo(() => data.total === 0, [data]); const tableRowProps = useCallback( - (theCase: Case) => ({ + (theCase: CaseUI) => ({ 'data-test-subj': `cases-table-row-${theCase.id}`, }), [] diff --git a/x-pack/plugins/cases/public/components/all_cases/assignees_column.tsx b/x-pack/plugins/cases/public/components/all_cases/assignees_column.tsx index 8b5444f9a9d91..41e936a7021c0 100644 --- a/x-pack/plugins/cases/public/components/all_cases/assignees_column.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/assignees_column.tsx @@ -8,7 +8,7 @@ import React, { useCallback, useMemo, useState } from 'react'; import { EuiButtonEmpty, EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import type { UserProfileWithAvatar } from '@kbn/user-profile-components'; -import type { Case } from '../../../common/ui/types'; +import type { CaseUI } from '../../../common/ui/types'; import { getEmptyTagValue } from '../empty_value'; import { UserToolTip } from '../user_profiles/user_tooltip'; import { useAssignees } from '../../containers/user_profiles/use_assignees'; @@ -19,7 +19,7 @@ import * as i18n from './translations'; const COMPRESSED_AVATAR_LIMIT = 3; export interface AssigneesColumnProps { - assignees: Case['assignees']; + assignees: CaseUI['assignees']; userProfiles: Map; compressedDisplayLimit?: number; } diff --git a/x-pack/plugins/cases/public/components/all_cases/selector_modal/all_cases_selector_modal.tsx b/x-pack/plugins/cases/public/components/all_cases/selector_modal/all_cases_selector_modal.tsx index 6a9629699734b..1aaf9c87cf245 100644 --- a/x-pack/plugins/cases/public/components/all_cases/selector_modal/all_cases_selector_modal.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/selector_modal/all_cases_selector_modal.tsx @@ -17,14 +17,14 @@ import { import styled from 'styled-components'; import { QueryClientProvider } from '@tanstack/react-query'; import { ReactQueryDevtools } from '@tanstack/react-query-devtools'; -import type { Case, CaseStatusWithAllStatus } from '../../../../common/ui/types'; +import type { CaseUI, CaseStatusWithAllStatus } from '../../../../common/ui/types'; import * as i18n from '../../../common/translations'; import { AllCasesList } from '../all_cases_list'; import { casesQueryClient } from '../../cases_context/query_client'; export interface AllCasesSelectorModalProps { hiddenStatuses?: CaseStatusWithAllStatus[]; - onRowClick?: (theCase?: Case) => void; + onRowClick?: (theCase?: CaseUI) => void; onClose?: () => void; } @@ -46,7 +46,7 @@ export const AllCasesSelectorModal = React.memo( }, [onClose]); const onClick = useCallback( - (theCase?: Case) => { + (theCase?: CaseUI) => { closeModal(); if (onRowClick) { onRowClick(theCase); diff --git a/x-pack/plugins/cases/public/components/all_cases/selector_modal/use_cases_add_to_existing_case_modal.test.tsx b/x-pack/plugins/cases/public/components/all_cases/selector_modal/use_cases_add_to_existing_case_modal.test.tsx index e98397d8bb37e..a63fd6ceaef10 100644 --- a/x-pack/plugins/cases/public/components/all_cases/selector_modal/use_cases_add_to_existing_case_modal.test.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/selector_modal/use_cases_add_to_existing_case_modal.test.tsx @@ -10,7 +10,7 @@ import { act, renderHook } from '@testing-library/react-hooks'; import userEvent from '@testing-library/user-event'; import React from 'react'; import AllCasesSelectorModal from '.'; -import type { Case } from '../../../../common'; +import type { CaseUI } from '../../../../common'; import { CaseStatuses, StatusAll } from '../../../../common'; import type { AppMockRenderer } from '../../../common/mock'; import { allCasesPermissions, createAppMockRenderer } from '../../../common/mock'; @@ -144,7 +144,7 @@ describe('use cases add to existing case modal hook', () => { it('should call getAttachments with the case info', async () => { AllCasesSelectorModalMock.mockImplementation(({ onRowClick }) => { - onRowClick({ id: 'test' } as Case); + onRowClick({ id: 'test' } as CaseUI); return null; }); @@ -159,7 +159,7 @@ describe('use cases add to existing case modal hook', () => { it('should show a toaster info when no attachments are defined and noAttachmentsToaster is defined', async () => { AllCasesSelectorModalMock.mockImplementation(({ onRowClick }) => { - onRowClick({ id: 'test' } as Case); + onRowClick({ id: 'test' } as CaseUI); return null; }); @@ -182,7 +182,7 @@ describe('use cases add to existing case modal hook', () => { it('should show a toaster info when no attachments are defined and noAttachmentsToaster is not defined', async () => { AllCasesSelectorModalMock.mockImplementation(({ onRowClick }) => { - onRowClick({ id: 'test' } as Case); + onRowClick({ id: 'test' } as CaseUI); return null; }); @@ -213,7 +213,7 @@ describe('use cases add to existing case modal hook', () => { }); AllCasesSelectorModalMock.mockImplementation(({ onRowClick }) => { - onRowClick({ id: 'test' } as Case); + onRowClick({ id: 'test' } as CaseUI); return null; }); @@ -244,7 +244,7 @@ describe('use cases add to existing case modal hook', () => { }); AllCasesSelectorModalMock.mockImplementation(({ onRowClick }) => { - onRowClick({ id: 'test' } as Case); + onRowClick({ id: 'test' } as CaseUI); return null; }); @@ -295,7 +295,7 @@ describe('use cases add to existing case modal hook', () => { // simulate a case selected AllCasesSelectorModalMock.mockImplementation(({ onRowClick }) => { - onRowClick({ id: 'test' } as Case); + onRowClick({ id: 'test' } as CaseUI); return null; }); diff --git a/x-pack/plugins/cases/public/components/all_cases/selector_modal/use_cases_add_to_existing_case_modal.tsx b/x-pack/plugins/cases/public/components/all_cases/selector_modal/use_cases_add_to_existing_case_modal.tsx index ea2e0f200433e..fb7a40d5725df 100644 --- a/x-pack/plugins/cases/public/components/all_cases/selector_modal/use_cases_add_to_existing_case_modal.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/selector_modal/use_cases_add_to_existing_case_modal.tsx @@ -9,7 +9,7 @@ import { useCallback } from 'react'; import { CaseStatuses, StatusAll } from '../../../../common'; import type { AllCasesSelectorModalProps } from '.'; import { useCasesToast } from '../../../common/use_cases_toast'; -import type { Case } from '../../../containers/types'; +import type { CaseUI } from '../../../containers/types'; import { CasesContextStoreActionsList } from '../../cases_context/cases_context_reducer'; import { useCasesContext } from '../../cases_context/use_cases_context'; import { useCasesAddToNewCaseFlyout } from '../../create/flyout/use_cases_add_to_new_case_flyout'; @@ -27,13 +27,13 @@ export type AddToExistingCaseModalProps = Omit void; + onSuccess?: (theCase: CaseUI) => void; }; export const useCasesAddToExistingCaseModal = (props: AddToExistingCaseModalProps = {}) => { const createNewCaseFlyout = useCasesAddToNewCaseFlyout({ onClose: props.onClose, - onSuccess: (theCase?: Case) => { + onSuccess: (theCase?: CaseUI) => { if (props.onSuccess && theCase) { return props.onSuccess(theCase); } @@ -60,8 +60,8 @@ export const useCasesAddToExistingCaseModal = (props: AddToExistingCaseModalProp const handleOnRowClick = useCallback( async ( - theCase: Case | undefined, - getAttachments?: ({ theCase }: { theCase?: Case }) => CaseAttachmentsWithoutOwner + theCase: CaseUI | undefined, + getAttachments?: ({ theCase }: { theCase?: CaseUI }) => CaseAttachmentsWithoutOwner ) => { const attachments = getAttachments?.({ theCase }) ?? []; // when the case is undefined in the modal @@ -121,14 +121,14 @@ export const useCasesAddToExistingCaseModal = (props: AddToExistingCaseModalProp ({ getAttachments, }: { - getAttachments?: ({ theCase }: { theCase?: Case }) => CaseAttachmentsWithoutOwner; + getAttachments?: ({ theCase }: { theCase?: CaseUI }) => CaseAttachmentsWithoutOwner; } = {}) => { dispatch({ type: CasesContextStoreActionsList.OPEN_ADD_TO_CASE_MODAL, payload: { ...props, hiddenStatuses: [CaseStatuses.closed, StatusAll], - onRowClick: (theCase?: Case) => { + onRowClick: (theCase?: CaseUI) => { handleOnRowClick(theCase, getAttachments); }, onClose: () => { diff --git a/x-pack/plugins/cases/public/components/all_cases/table.tsx b/x-pack/plugins/cases/public/components/all_cases/table.tsx index 61fb081a0dd9a..0aa9f78c5d0bf 100644 --- a/x-pack/plugins/cases/public/components/all_cases/table.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/table.tsx @@ -14,26 +14,26 @@ import styled from 'styled-components'; import { CasesTableUtilityBar } from './utility_bar'; import { LinkButton } from '../links'; -import type { Cases, Case } from '../../../common/ui/types'; +import type { CasesUI, CaseUI } from '../../../common/ui/types'; import * as i18n from './translations'; import { useCreateCaseNavigation } from '../../common/navigation'; import { useCasesContext } from '../cases_context/use_cases_context'; interface CasesTableProps { - columns: EuiBasicTableProps['columns']; - data: Cases; + columns: EuiBasicTableProps['columns']; + data: CasesUI; goToCreateCase?: () => void; isCasesLoading: boolean; isCommentUpdating: boolean; isDataEmpty: boolean; isSelectorView?: boolean; - onChange: EuiBasicTableProps['onChange']; + onChange: EuiBasicTableProps['onChange']; pagination: Pagination; - selectedCases: Case[]; - selection: EuiTableSelectionType; - sorting: EuiBasicTableProps['sorting']; + selectedCases: CaseUI[]; + selection: EuiTableSelectionType; + sorting: EuiBasicTableProps['sorting']; tableRef: MutableRefObject; - tableRowProps: EuiBasicTableProps['rowProps']; + tableRowProps: EuiBasicTableProps['rowProps']; deselectCases: () => void; } diff --git a/x-pack/plugins/cases/public/components/all_cases/use_actions.tsx b/x-pack/plugins/cases/public/components/all_cases/use_actions.tsx index 88d94f65f900c..ea43f79b4954e 100644 --- a/x-pack/plugins/cases/public/components/all_cases/use_actions.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/use_actions.tsx @@ -13,7 +13,7 @@ import type { } from '@elastic/eui'; import { EuiButtonIcon, EuiContextMenu, EuiPopover } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; -import type { Case } from '../../containers/types'; +import type { CaseUI } from '../../containers/types'; import { useDeleteAction } from '../actions/delete/use_delete_action'; import { ConfirmDeleteCaseModal } from '../confirm_delete_case'; import { useStatusAction } from '../actions/status/use_status_action'; @@ -29,7 +29,7 @@ import { useAssigneesAction } from '../actions/assignees/use_assignees_action'; import { EditAssigneesFlyout } from '../actions/assignees/edit_assignees_flyout'; import { useCopyIDAction } from '../actions/copy_id/use_copy_id_action'; -const ActionColumnComponent: React.FC<{ theCase: Case; disableActions: boolean }> = ({ +const ActionColumnComponent: React.FC<{ theCase: CaseUI; disableActions: boolean }> = ({ theCase, disableActions, }) => { @@ -223,7 +223,7 @@ ActionColumnComponent.displayName = 'ActionColumnComponent'; const ActionColumn = React.memo(ActionColumnComponent); interface UseBulkActionsReturnValue { - actions: EuiTableComputedColumnType | null; + actions: EuiTableComputedColumnType | null; } interface UseBulkActionsProps { @@ -239,7 +239,7 @@ export const useActions = ({ disableActions }: UseBulkActionsProps): UseBulkActi ? { name: i18n.ACTIONS, align: 'right', - render: (theCase: Case) => { + render: (theCase: CaseUI) => { return ( ); diff --git a/x-pack/plugins/cases/public/components/all_cases/use_bulk_actions.tsx b/x-pack/plugins/cases/public/components/all_cases/use_bulk_actions.tsx index 1d7efd62736fb..eadd3eb884081 100644 --- a/x-pack/plugins/cases/public/components/all_cases/use_bulk_actions.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/use_bulk_actions.tsx @@ -11,7 +11,7 @@ import type { } from '@elastic/eui'; import React, { useMemo } from 'react'; -import type { Case } from '../../containers/types'; +import type { CaseUI } from '../../containers/types'; import { useDeleteAction } from '../actions/delete/use_delete_action'; import { useSeverityAction } from '../actions/severity/use_severity_action'; import { useStatusAction } from '../actions/status/use_status_action'; @@ -23,7 +23,7 @@ import { EditAssigneesFlyout } from '../actions/assignees/edit_assignees_flyout' import * as i18n from './translations'; interface UseBulkActionsProps { - selectedCases: Case[]; + selectedCases: CaseUI[]; onAction: () => void; onActionSuccess: () => void; } diff --git a/x-pack/plugins/cases/public/components/all_cases/use_cases_columns.tsx b/x-pack/plugins/cases/public/components/all_cases/use_cases_columns.tsx index 1f267eca40a84..b2048893b1895 100644 --- a/x-pack/plugins/cases/public/components/all_cases/use_cases_columns.tsx +++ b/x-pack/plugins/cases/public/components/all_cases/use_cases_columns.tsx @@ -28,7 +28,7 @@ import { Status } from '@kbn/cases-components'; import type { UserProfileWithAvatar } from '@kbn/user-profile-components'; import { euiStyled } from '@kbn/kibana-react-plugin/common'; -import type { Case } from '../../../common/ui/types'; +import type { CaseUI } from '../../../common/ui/types'; import type { ActionConnector } from '../../../common/api'; import { CaseStatuses, CaseSeverity } from '../../../common/api'; import { OWNER_INFO } from '../../../common/constants'; @@ -47,9 +47,9 @@ import { useCasesFeatures } from '../../common/use_cases_features'; import { AssigneesColumn } from './assignees_column'; type CasesColumns = - | EuiTableActionsColumnType - | EuiTableComputedColumnType - | EuiTableFieldDataColumnType; + | EuiTableActionsColumnType + | EuiTableComputedColumnType + | EuiTableFieldDataColumnType; const MediumShadeText = styled.p` color: ${({ theme }) => theme.eui.euiColorMediumShade}; @@ -80,7 +80,7 @@ export interface GetCasesColumn { userProfiles: Map; isSelectorView: boolean; connectors?: ActionConnector[]; - onRowClick?: (theCase: Case) => void; + onRowClick?: (theCase: CaseUI) => void; showSolutionColumn?: boolean; disableActions?: boolean; } @@ -102,7 +102,7 @@ export const useCasesColumns = ({ const { actions } = useActions({ disableActions }); const assignCaseAction = useCallback( - async (theCase: Case) => { + async (theCase: CaseUI) => { if (onRowClick) { onRowClick(theCase); } @@ -115,7 +115,7 @@ export const useCasesColumns = ({ field: 'title', name: i18n.NAME, sortable: true, - render: (title: string, theCase: Case) => { + render: (title: string, theCase: CaseUI) => { if (theCase.id != null && theCase.title != null) { const caseDetailsLinkComponent = isSelectorView ? ( theCase.title @@ -145,7 +145,7 @@ export const useCasesColumns = ({ columns.push({ field: 'assignees', name: i18n.ASSIGNEES, - render: (assignees: Case['assignees']) => ( + render: (assignees: CaseUI['assignees']) => ( ), width: '180px', @@ -156,7 +156,7 @@ export const useCasesColumns = ({ columns.push({ field: 'tags', name: i18n.TAGS, - render: (tags: Case['tags']) => { + render: (tags: CaseUI['tags']) => { if (tags != null && tags.length > 0) { const clampedBadges = ( @@ -207,7 +207,7 @@ export const useCasesColumns = ({ align: RIGHT_ALIGNMENT, field: 'totalAlerts', name: ALERTS, - render: (totalAlerts: Case['totalAlerts']) => + render: (totalAlerts: CaseUI['totalAlerts']) => totalAlerts != null ? renderStringField(`${totalAlerts}`, `case-table-column-alertsCount`) : getEmptyTagValue(), @@ -241,7 +241,7 @@ export const useCasesColumns = ({ align: RIGHT_ALIGNMENT, field: 'totalComment', name: i18n.COMMENTS, - render: (totalComment: Case['totalComment']) => + render: (totalComment: CaseUI['totalComment']) => totalComment != null ? renderStringField(`${totalComment}`, `case-table-column-commentCount`) : getEmptyTagValue(), @@ -253,7 +253,7 @@ export const useCasesColumns = ({ field: 'closedAt', name: i18n.CLOSED_ON, sortable: true, - render: (closedAt: Case['closedAt']) => { + render: (closedAt: CaseUI['closedAt']) => { if (closedAt != null) { return ( @@ -269,7 +269,7 @@ export const useCasesColumns = ({ field: 'createdAt', name: i18n.CREATED_ON, sortable: true, - render: (createdAt: Case['createdAt']) => { + render: (createdAt: CaseUI['createdAt']) => { if (createdAt != null) { return ( @@ -287,7 +287,7 @@ export const useCasesColumns = ({ field: 'updatedAt', name: i18n.UPDATED_ON, sortable: true, - render: (updatedAt: Case['updatedAt']) => { + render: (updatedAt: CaseUI['updatedAt']) => { if (updatedAt != null) { return ( @@ -304,7 +304,7 @@ export const useCasesColumns = ({ columns.push( { name: i18n.EXTERNAL_INCIDENT, - render: (theCase: Case) => { + render: (theCase: CaseUI) => { if (theCase.id != null) { return ; } @@ -316,7 +316,7 @@ export const useCasesColumns = ({ field: 'status', name: i18n.STATUS, sortable: true, - render: (status: Case['status']) => { + render: (status: CaseUI['status']) => { if (status != null) { return ; } @@ -330,7 +330,7 @@ export const useCasesColumns = ({ field: 'severity', name: i18n.SEVERITY, sortable: true, - render: (severity: Case['severity']) => { + render: (severity: CaseUI['severity']) => { if (severity != null) { const severityData = severities[severity ?? CaseSeverity.LOW]; return ( @@ -349,7 +349,7 @@ export const useCasesColumns = ({ if (isSelectorView) { columns.push({ align: RIGHT_ALIGNMENT, - render: (theCase: Case) => { + render: (theCase: CaseUI) => { if (theCase.id != null) { return ( void; } diff --git a/x-pack/plugins/cases/public/components/case_action_bar/actions.tsx b/x-pack/plugins/cases/public/components/case_action_bar/actions.tsx index b80cd5c2dbe74..b6d9248839f3c 100644 --- a/x-pack/plugins/cases/public/components/case_action_bar/actions.tsx +++ b/x-pack/plugins/cases/public/components/case_action_bar/actions.tsx @@ -12,15 +12,15 @@ import * as i18n from '../case_view/translations'; import { useDeleteCases } from '../../containers/use_delete_cases'; import { ConfirmDeleteCaseModal } from '../confirm_delete_case'; import { PropertyActions } from '../property_actions'; -import type { Case } from '../../../common/ui/types'; +import type { CaseUI } from '../../../common/ui/types'; import { useAllCasesNavigation } from '../../common/navigation'; import { useCasesContext } from '../cases_context/use_cases_context'; import { useCasesToast } from '../../common/use_cases_toast'; import { AttachmentActionType } from '../../client/attachment_framework/types'; interface CaseViewActions { - caseData: Case; - currentExternalIncident: Case['externalService']; + caseData: CaseUI; + currentExternalIncident: CaseUI['externalService']; } const ActionsComponent: React.FC = ({ caseData, currentExternalIncident }) => { diff --git a/x-pack/plugins/cases/public/components/case_action_bar/helpers.ts b/x-pack/plugins/cases/public/components/case_action_bar/helpers.ts index 772bedd266dd8..2e1e176ff850a 100644 --- a/x-pack/plugins/cases/public/components/case_action_bar/helpers.ts +++ b/x-pack/plugins/cases/public/components/case_action_bar/helpers.ts @@ -6,10 +6,10 @@ */ import { CaseStatuses } from '../../../common/api'; -import type { Case } from '../../containers/types'; +import type { CaseUI } from '../../containers/types'; import { statuses } from '../status'; -export const getStatusDate = (theCase: Case): string | null => { +export const getStatusDate = (theCase: CaseUI): string | null => { if (theCase.status === CaseStatuses.open) { return theCase.createdAt; } else if (theCase.status === CaseStatuses['in-progress']) { diff --git a/x-pack/plugins/cases/public/components/case_action_bar/index.tsx b/x-pack/plugins/cases/public/components/case_action_bar/index.tsx index b8be843e8c659..f412dd7371561 100644 --- a/x-pack/plugins/cases/public/components/case_action_bar/index.tsx +++ b/x-pack/plugins/cases/public/components/case_action_bar/index.tsx @@ -16,7 +16,7 @@ import { EuiFlexItem, EuiIconTip, } from '@elastic/eui'; -import type { Case } from '../../../common/ui/types'; +import type { CaseUI } from '../../../common/ui/types'; import type { CaseStatuses } from '../../../common/api'; import * as i18n from '../case_view/translations'; import { Actions } from './actions'; @@ -44,7 +44,7 @@ const MyDescriptionList = styled(EuiDescriptionList)` `; export interface CaseActionBarProps { - caseData: Case; + caseData: CaseUI; isLoading: boolean; onUpdateField: (args: OnUpdateFields) => void; } diff --git a/x-pack/plugins/cases/public/components/case_view/case_view_tabs.tsx b/x-pack/plugins/cases/public/components/case_view/case_view_tabs.tsx index 630248bf79d52..b1e41d7c38b30 100644 --- a/x-pack/plugins/cases/public/components/case_view/case_view_tabs.tsx +++ b/x-pack/plugins/cases/public/components/case_view/case_view_tabs.tsx @@ -13,7 +13,7 @@ import { useCaseViewNavigation } from '../../common/navigation'; import { useCasesContext } from '../cases_context/use_cases_context'; import { EXPERIMENTAL_DESC, EXPERIMENTAL_LABEL } from '../header_page/translations'; import { ACTIVITY_TAB, ALERTS_TAB, FILES_TAB } from './translations'; -import type { Case } from '../../../common'; +import type { CaseUI } from '../../../common'; import { useGetCaseFileStats } from '../../containers/use_get_case_file_stats'; const ExperimentalBadge = styled(EuiBetaBadge)` @@ -49,7 +49,7 @@ const FilesTab = ({ FilesTab.displayName = 'FilesTab'; export interface CaseViewTabsProps { - caseData: Case; + caseData: CaseUI; activeTab: CASE_VIEW_PAGE_TABS; } diff --git a/x-pack/plugins/cases/public/components/case_view/components/case_view_activity.test.tsx b/x-pack/plugins/cases/public/components/case_view/components/case_view_activity.test.tsx index 7386d8bcd7ea1..51c1ad17eaba6 100644 --- a/x-pack/plugins/cases/public/components/case_view/components/case_view_activity.test.tsx +++ b/x-pack/plugins/cases/public/components/case_view/components/case_view_activity.test.tsx @@ -21,7 +21,7 @@ import type { AppMockRenderer } from '../../../common/mock'; import { createAppMockRenderer, noUpdateCasesPermissions } from '../../../common/mock'; import { CaseViewActivity } from './case_view_activity'; import { ConnectorTypes } from '../../../../common/api/connectors'; -import type { Case } from '../../../../common'; +import type { CaseUI } from '../../../../common'; import { CASE_VIEW_PAGE_TABS } from '../../../../common/types'; import type { CaseViewProps } from '../types'; import { useFindCaseUserActions } from '../../../containers/use_find_case_user_actions'; @@ -54,7 +54,7 @@ jest.mock('../../../containers/use_get_case_users'); (useGetTags as jest.Mock).mockReturnValue({ data: ['coke', 'pepsi'], refetch: jest.fn() }); -const caseData: Case = { +const caseData: CaseUI = { ...basicCase, comments: [...basicCase.comments, alertComment], connector: { diff --git a/x-pack/plugins/cases/public/components/case_view/components/case_view_activity.tsx b/x-pack/plugins/cases/public/components/case_view/components/case_view_activity.tsx index c4f387c617417..b0774ccbefce5 100644 --- a/x-pack/plugins/cases/public/components/case_view/components/case_view_activity.tsx +++ b/x-pack/plugins/cases/public/components/case_view/components/case_view_activity.tsx @@ -18,7 +18,7 @@ import { useGetCurrentUserProfile } from '../../../containers/user_profiles/use_ import { useGetSupportedActionConnectors } from '../../../containers/configure/use_get_supported_action_connectors'; import type { CaseSeverity } from '../../../../common/api'; import type { CaseUsers, UseFetchAlertData } from '../../../../common/ui/types'; -import type { Case, CaseStatuses } from '../../../../common'; +import type { CaseUI, CaseStatuses } from '../../../../common'; import { EditConnector } from '../../edit_connector'; import type { CasesNavigation } from '../../links'; import { StatusActionButton } from '../../status/button'; @@ -81,7 +81,7 @@ export const CaseViewActivity = ({ useFetchAlertData, }: { ruleDetailsNavigation?: CasesNavigation; - caseData: Case; + caseData: CaseUI; actionsNavigation?: CasesNavigation; showAlertDetails?: (alertId: string, index: string) => void; useFetchAlertData: UseFetchAlertData; diff --git a/x-pack/plugins/cases/public/components/case_view/components/case_view_alerts.test.tsx b/x-pack/plugins/cases/public/components/case_view/components/case_view_alerts.test.tsx index 54e5a0bc2febb..6833df2804630 100644 --- a/x-pack/plugins/cases/public/components/case_view/components/case_view_alerts.test.tsx +++ b/x-pack/plugins/cases/public/components/case_view/components/case_view_alerts.test.tsx @@ -11,18 +11,18 @@ import { OBSERVABILITY_OWNER } from '../../../../common/constants'; import { alertCommentWithIndices, basicCase } from '../../../containers/mock'; import type { AppMockRenderer } from '../../../common/mock'; import { createAppMockRenderer } from '../../../common/mock'; -import type { Case } from '../../../../common'; +import type { CaseUI } from '../../../../common'; import { CaseViewAlerts } from './case_view_alerts'; import * as api from '../../../containers/api'; jest.mock('../../../containers/api'); -const caseData: Case = { +const caseData: CaseUI = { ...basicCase, comments: [...basicCase.comments, alertCommentWithIndices], }; -describe('Case View Page activity tab', () => { +describe('CaseUI View Page activity tab', () => { const getAlertsStateTableMock = jest.fn(); let appMockRender: AppMockRenderer; diff --git a/x-pack/plugins/cases/public/components/case_view/components/case_view_alerts.tsx b/x-pack/plugins/cases/public/components/case_view/components/case_view_alerts.tsx index 6b884325d3f73..e3393bf7f3544 100644 --- a/x-pack/plugins/cases/public/components/case_view/components/case_view_alerts.tsx +++ b/x-pack/plugins/cases/public/components/case_view/components/case_view_alerts.tsx @@ -10,7 +10,7 @@ import React, { useMemo } from 'react'; import type { EuiFlyoutSize } from '@elastic/eui'; import { EuiFlexItem, EuiFlexGroup, EuiProgress } from '@elastic/eui'; import { SECURITY_SOLUTION_OWNER } from '../../../../common/constants'; -import type { Case } from '../../../../common'; +import type { CaseUI } from '../../../../common'; import { useKibana } from '../../../common/lib/kibana'; import { getManualAlertIds, getRegistrationContextFromAlerts } from './helpers'; import { useGetFeatureIds } from '../../../containers/use_get_feature_ids'; @@ -18,7 +18,7 @@ import { CaseViewAlertsEmpty } from './case_view_alerts_empty'; import { CaseViewTabs } from '../case_view_tabs'; import { CASE_VIEW_PAGE_TABS } from '../../../../common/types'; interface CaseViewAlertsProps { - caseData: Case; + caseData: CaseUI; } export const CaseViewAlerts = ({ caseData }: CaseViewAlertsProps) => { const { triggersActionsUi } = useKibana().services; diff --git a/x-pack/plugins/cases/public/components/case_view/components/case_view_files.test.tsx b/x-pack/plugins/cases/public/components/case_view/components/case_view_files.test.tsx index dc5b937bd8781..1480ab7fb43f1 100644 --- a/x-pack/plugins/cases/public/components/case_view/components/case_view_files.test.tsx +++ b/x-pack/plugins/cases/public/components/case_view/components/case_view_files.test.tsx @@ -9,7 +9,7 @@ import React from 'react'; import { screen, waitFor } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; -import type { Case } from '../../../../common'; +import type { CaseUI } from '../../../../common'; import type { AppMockRenderer } from '../../../common/mock'; import { createAppMockRenderer } from '../../../common/mock'; @@ -21,7 +21,7 @@ jest.mock('../../../containers/use_get_case_files'); const useGetCaseFilesMock = useGetCaseFiles as jest.Mock; -const caseData: Case = { +const caseData: CaseUI = { ...basicCase, comments: [...basicCase.comments, alertCommentWithIndices], }; diff --git a/x-pack/plugins/cases/public/components/case_view/components/case_view_files.tsx b/x-pack/plugins/cases/public/components/case_view/components/case_view_files.tsx index 54693acfa2390..85cd4685a41fb 100644 --- a/x-pack/plugins/cases/public/components/case_view/components/case_view_files.tsx +++ b/x-pack/plugins/cases/public/components/case_view/components/case_view_files.tsx @@ -12,7 +12,7 @@ import type { FileJSON } from '@kbn/shared-ux-file-types'; import { EuiFlexItem, EuiFlexGroup } from '@elastic/eui'; -import type { Case } from '../../../../common/ui/types'; +import type { CaseUI } from '../../../../common/ui/types'; import type { CaseFilesFilteringOptions } from '../../../containers/use_get_case_files'; import { CASE_VIEW_PAGE_TABS } from '../../../../common/types'; @@ -22,7 +22,7 @@ import { CaseViewTabs } from '../case_view_tabs'; import { FilesUtilityBar } from '../../files/files_utility_bar'; interface CaseViewFilesProps { - caseData: Case; + caseData: CaseUI; } export const DEFAULT_CASE_FILES_FILTERING_OPTIONS = { diff --git a/x-pack/plugins/cases/public/components/case_view/components/user_list.tsx b/x-pack/plugins/cases/public/components/case_view/components/user_list.tsx index 47bd0ac3750a9..96b4c80c723f9 100644 --- a/x-pack/plugins/cases/public/components/case_view/components/user_list.tsx +++ b/x-pack/plugins/cases/public/components/case_view/components/user_list.tsx @@ -22,7 +22,7 @@ import styled, { css } from 'styled-components'; import type { UserProfileWithAvatar } from '@kbn/user-profile-components'; import { useCaseViewNavigation } from '../../../common/navigation'; -import type { Case } from '../../../containers/types'; +import type { CaseUI } from '../../../containers/types'; import * as i18n from '../translations'; import type { CaseUserWithProfileInfo, UserInfoWithAvatar } from '../../user_profiles/types'; import { HoverableUserWithAvatar } from '../../user_profiles/hoverable_user_with_avatar'; @@ -30,7 +30,7 @@ import { convertToUserInfo } from '../../user_profiles/user_converter'; import { getSortField } from '../../user_profiles/sort'; interface UserListProps { - theCase: Case; + theCase: CaseUI; headline: string; loading?: boolean; users: CaseUserWithProfileInfo[]; diff --git a/x-pack/plugins/cases/public/components/case_view/mocks.ts b/x-pack/plugins/cases/public/components/case_view/mocks.ts index 1f656ea42aa8c..af335653a9a51 100644 --- a/x-pack/plugins/cases/public/components/case_view/mocks.ts +++ b/x-pack/plugins/cases/public/components/case_view/mocks.ts @@ -13,7 +13,7 @@ import { caseUserActions, getAlertUserAction, } from '../../containers/mock'; -import type { Case } from '../../containers/types'; +import type { CaseUI } from '../../containers/types'; import type { CaseViewProps } from './types'; export const alertsHit = [ @@ -63,7 +63,7 @@ export const caseViewProps: CaseViewProps = { ], }; -export const caseData: Case = { +export const caseData: CaseUI = { ...basicCase, comments: [...basicCase.comments, alertComment], connector: { diff --git a/x-pack/plugins/cases/public/components/case_view/types.ts b/x-pack/plugins/cases/public/components/case_view/types.ts index 0e6bf82c5fef9..0dba765f0d5cb 100644 --- a/x-pack/plugins/cases/public/components/case_view/types.ts +++ b/x-pack/plugins/cases/public/components/case_view/types.ts @@ -7,7 +7,7 @@ import type { MutableRefObject } from 'react'; import type { CasesTimelineIntegration } from '../timeline_context'; import type { CasesNavigation } from '../links'; -import type { CaseViewRefreshPropInterface, Case } from '../../../common'; +import type { CaseViewRefreshPropInterface, CaseUI } from '../../../common'; import type { UseFetchAlertData } from '../../../common/ui'; export interface CaseViewBaseProps { @@ -30,12 +30,12 @@ export interface CaseViewProps extends CaseViewBaseProps { export interface CaseViewPageProps extends CaseViewBaseProps { caseId: string; fetchCase: () => void; - caseData: Case; + caseData: CaseUI; } export interface OnUpdateFields { - key: keyof Case; - value: Case[keyof Case]; + key: keyof CaseUI; + value: CaseUI[keyof CaseUI]; onSuccess?: () => void; onError?: () => void; } diff --git a/x-pack/plugins/cases/public/components/case_view/use_on_update_field.ts b/x-pack/plugins/cases/public/components/case_view/use_on_update_field.ts index d0fc6f98f0ce6..713c73d9b830c 100644 --- a/x-pack/plugins/cases/public/components/case_view/use_on_update_field.ts +++ b/x-pack/plugins/cases/public/components/case_view/use_on_update_field.ts @@ -11,12 +11,12 @@ import deepEqual from 'fast-deep-equal'; import type { CaseConnector } from '../../../common/api'; import type { CaseAttributes } from '../../../common/api/cases/case'; import type { CaseStatuses } from '../../../common/api/cases/status'; -import type { Case, UpdateByKey, UpdateKey } from '../../containers/types'; +import type { CaseUI, UpdateByKey, UpdateKey } from '../../containers/types'; import { useUpdateCase } from '../../containers/use_update_case'; import { getTypedPayload } from '../../containers/utils'; import type { OnUpdateFields } from './types'; -export const useOnUpdateField = ({ caseData }: { caseData: Case }) => { +export const useOnUpdateField = ({ caseData }: { caseData: CaseUI }) => { const { isLoading, updateKey: loadingKey, updateCaseProperty } = useUpdateCase(); const onUpdateField = useCallback( diff --git a/x-pack/plugins/cases/public/components/create/description.test.tsx b/x-pack/plugins/cases/public/components/create/description.test.tsx index e7128572d2935..56ae139b5732b 100644 --- a/x-pack/plugins/cases/public/components/create/description.test.tsx +++ b/x-pack/plugins/cases/public/components/create/description.test.tsx @@ -17,8 +17,6 @@ import { schema } from './schema'; import type { AppMockRenderer } from '../../common/mock'; import { createAppMockRenderer } from '../../common/mock'; -jest.mock('../markdown_editor/plugins/lens/use_lens_draft_comment'); - describe('Description', () => { let globalForm: FormHook; let appMockRender: AppMockRenderer; diff --git a/x-pack/plugins/cases/public/components/create/description.tsx b/x-pack/plugins/cases/public/components/create/description.tsx index 48ae59f9e6e7e..5c512e701c123 100644 --- a/x-pack/plugins/cases/public/components/create/description.tsx +++ b/x-pack/plugins/cases/public/components/create/description.tsx @@ -5,14 +5,9 @@ * 2.0. */ -import React, { memo, useEffect, useRef } from 'react'; -import { - UseField, - useFormContext, - useFormData, -} from '@kbn/es-ui-shared-plugin/static/forms/hook_form_lib'; +import React, { memo, useRef } from 'react'; +import { UseField, useFormData } from '@kbn/es-ui-shared-plugin/static/forms/hook_form_lib'; import { MarkdownEditorForm } from '../markdown_editor'; -import { useLensDraftComment } from '../markdown_editor/plugins/lens/use_lens_draft_comment'; import { ID as LensPluginId } from '../markdown_editor/plugins/lens/constants'; interface Props { @@ -23,33 +18,10 @@ interface Props { export const fieldName = 'description'; const DescriptionComponent: React.FC = ({ isLoading, draftStorageKey }) => { - const { draftComment, hasIncomingLensState, openLensModal, clearDraftComment } = - useLensDraftComment(); - const { setFieldValue } = useFormContext(); const [{ title, tags }] = useFormData({ watch: ['title', 'tags'] }); const editorRef = useRef>(); const disabledUiPlugins = [LensPluginId]; - useEffect(() => { - if (draftComment?.commentId === fieldName && editorRef.current) { - setFieldValue(fieldName, draftComment.comment); - - if (draftComment.caseTitle) { - setFieldValue('title', draftComment.caseTitle); - } - - if (draftComment.caseTags && draftComment.caseTags.length > 0) { - setFieldValue('tags', draftComment.caseTags); - } - - if (hasIncomingLensState) { - openLensModal({ editorRef: editorRef.current }); - } else { - clearDraftComment(); - } - } - }, [clearDraftComment, draftComment, hasIncomingLensState, openLensModal, setFieldValue]); - return ( Promise; onClose?: () => void; - onSuccess?: (theCase: Case) => void; + onSuccess?: (theCase: CaseUI) => void; attachments?: CaseAttachmentsWithoutOwner; headerContent?: React.ReactNode; initialValue?: Pick; diff --git a/x-pack/plugins/cases/public/components/create/flyout/use_cases_add_to_new_case_flyout.tsx b/x-pack/plugins/cases/public/components/create/flyout/use_cases_add_to_new_case_flyout.tsx index a92046e8c9928..a8e234f9bb96a 100644 --- a/x-pack/plugins/cases/public/components/create/flyout/use_cases_add_to_new_case_flyout.tsx +++ b/x-pack/plugins/cases/public/components/create/flyout/use_cases_add_to_new_case_flyout.tsx @@ -9,7 +9,7 @@ import type React from 'react'; import { useCallback } from 'react'; import type { CaseAttachmentsWithoutOwner } from '../../../types'; import { useCasesToast } from '../../../common/use_cases_toast'; -import type { Case } from '../../../containers/types'; +import type { CaseUI } from '../../../containers/types'; import { CasesContextStoreActionsList } from '../../cases_context/cases_context_reducer'; import { useCasesContext } from '../../cases_context/use_cases_context'; import type { CreateCaseFlyoutProps } from './create_case_flyout'; @@ -46,7 +46,7 @@ export const useCasesAddToNewCaseFlyout = (props: AddToNewCaseFlyoutProps = {}) return props.onClose(); } }, - onSuccess: async (theCase: Case) => { + onSuccess: async (theCase: CaseUI) => { if (theCase) { casesToasts.showSuccessAttach({ theCase, diff --git a/x-pack/plugins/cases/public/components/create/form.tsx b/x-pack/plugins/cases/public/components/create/form.tsx index 05dfef2063630..76344989ac0b2 100644 --- a/x-pack/plugins/cases/public/components/create/form.tsx +++ b/x-pack/plugins/cases/public/components/create/form.tsx @@ -24,7 +24,7 @@ import { Connector } from './connector'; import * as i18n from './translations'; import { SyncAlertsToggle } from './sync_alerts_toggle'; import type { ActionConnector, CasePostRequest } from '../../../common/api'; -import type { Case } from '../../containers/types'; +import type { CaseUI } from '../../containers/types'; import type { CasesTimelineIntegration } from '../timeline_context'; import { CasesTimelineIntegrationProvider } from '../timeline_context'; import { InsertTimeline } from '../insert_timeline'; @@ -69,9 +69,9 @@ export interface CreateCaseFormFieldsProps { } export interface CreateCaseFormProps extends Pick, 'withSteps'> { onCancel: () => void; - onSuccess: (theCase: Case) => void; + onSuccess: (theCase: CaseUI) => void; afterCaseCreated?: ( - theCase: Case, + theCase: CaseUI, createAttachments: UseCreateAttachments['createAttachments'] ) => Promise; timelineIntegration?: CasesTimelineIntegration; @@ -208,7 +208,7 @@ export const CreateCaseForm: React.FC = React.memo( onConfirmationCallback: handleOnConfirmationCallback, }); - const handleOnSuccess = (theCase: Case): void => { + const handleOnSuccess = (theCase: CaseUI): void => { removeItemFromSessionStorage(draftStorageKey); return onSuccess(theCase); }; diff --git a/x-pack/plugins/cases/public/components/create/form_context.tsx b/x-pack/plugins/cases/public/components/create/form_context.tsx index f3a78e8a1b9ca..d62f8e155badf 100644 --- a/x-pack/plugins/cases/public/components/create/form_context.tsx +++ b/x-pack/plugins/cases/public/components/create/form_context.tsx @@ -13,7 +13,7 @@ import { getNoneConnector, normalizeActionConnector } from '../configure_cases/u import { usePostCase } from '../../containers/use_post_case'; import { usePostPushToService } from '../../containers/use_post_push_to_service'; -import type { Case } from '../../containers/types'; +import type { CaseUI } from '../../containers/types'; import type { CasePostRequest } from '../../../common/api'; import { CaseSeverity, NONE_CONNECTOR_ID } from '../../../common/api'; import type { UseCreateAttachments } from '../../containers/use_create_attachments'; @@ -39,11 +39,11 @@ const initialCaseValue: FormProps = { interface Props { afterCaseCreated?: ( - theCase: Case, + theCase: CaseUI, createAttachments: UseCreateAttachments['createAttachments'] ) => Promise; children?: JSX.Element | JSX.Element[]; - onSuccess?: (theCase: Case) => void; + onSuccess?: (theCase: CaseUI) => void; attachments?: CaseAttachmentsWithoutOwner; initialValue?: Pick; } diff --git a/x-pack/plugins/cases/public/components/description/index.tsx b/x-pack/plugins/cases/public/components/description/index.tsx index 6ebbf8edd6f45..3574f21f87ce3 100644 --- a/x-pack/plugins/cases/public/components/description/index.tsx +++ b/x-pack/plugins/cases/public/components/description/index.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useCallback, useRef, useState } from 'react'; +import React, { useCallback, useEffect, useRef, useState } from 'react'; import styled from 'styled-components'; import { css } from '@emotion/react'; import { @@ -21,14 +21,19 @@ import { getMarkdownEditorStorageKey } from '../markdown_editor/utils'; import * as i18n from '../user_actions/translations'; import { useCasesContext } from '../cases_context/use_cases_context'; import { useLensDraftComment } from '../markdown_editor/plugins/lens/use_lens_draft_comment'; +import type { EditableMarkdownRefObject, EuiMarkdownEditorRef } from '../markdown_editor'; import { EditableMarkdown, ScrollableMarkdown } from '../markdown_editor'; -import type { Case } from '../../containers/types'; +import type { CaseUI } from '../../containers/types'; import type { OnUpdateFields } from '../case_view/types'; import { schema } from './schema'; const DESCRIPTION_ID = 'description'; + +export interface DescriptionMarkdownRefObject extends EditableMarkdownRefObject { + editor: EuiMarkdownEditorRef | null; +} export interface DescriptionProps { - caseData: Case; + caseData: CaseUI; isLoadingDescription: boolean; onUpdateField: ({ key, value, onSuccess, onError }: OnUpdateFields) => void; } @@ -73,6 +78,13 @@ const getDraftDescription = ( return sessionStorage.getItem(draftStorageKey); }; +const isCommentRef = ( + ref: EditableMarkdownRefObject | null | undefined +): ref is EditableMarkdownRefObject => { + const commentRef = ref as EditableMarkdownRefObject; + return commentRef?.setComment != null; +}; + export const Description = ({ caseData, onUpdateField, @@ -82,6 +94,8 @@ export const Description = ({ const [isEditable, setIsEditable] = useState(false); const descriptionRef = useRef(null); + const descriptionMarkdownRef = useRef(null); + const { euiTheme } = useEuiTheme(); const { appId, permissions } = useCasesContext(); @@ -89,6 +103,7 @@ export const Description = ({ clearDraftComment: clearLensDraftComment, draftComment: lensDraftComment, hasIncomingLensState, + openLensModal, } = useLensDraftComment(); const handleOnChangeEditable = useCallback(() => { @@ -117,6 +132,22 @@ export const Description = ({ setIsEditable(true); } + useEffect(() => { + if ( + isCommentRef(descriptionMarkdownRef.current) && + descriptionMarkdownRef.current.editor?.textarea && + lensDraftComment && + lensDraftComment.commentId === DESCRIPTION_ID + ) { + descriptionMarkdownRef.current.setComment(lensDraftComment.comment); + if (hasIncomingLensState) { + openLensModal({ editorRef: descriptionMarkdownRef.current.editor }); + } else { + clearLensDraftComment(); + } + } + }, [clearLensDraftComment, lensDraftComment, hasIncomingLensState, openLensModal]); + const hasUnsavedChanges = draftDescription && draftDescription !== caseData.description && !isLoadingDescription; @@ -131,6 +162,7 @@ export const Description = ({ editorRef={descriptionRef} fieldName="content" formSchema={schema} + ref={descriptionMarkdownRef} /> ) : ( diff --git a/x-pack/plugins/cases/public/components/edit_connector/index.tsx b/x-pack/plugins/cases/public/components/edit_connector/index.tsx index 8a63c9d02ad26..fd2ca685b8854 100644 --- a/x-pack/plugins/cases/public/components/edit_connector/index.tsx +++ b/x-pack/plugins/cases/public/components/edit_connector/index.tsx @@ -22,7 +22,7 @@ import { isEmpty, noop } from 'lodash/fp'; import type { FieldConfig } from '@kbn/es-ui-shared-plugin/static/forms/hook_form_lib'; import { Form, UseField, useForm } from '@kbn/es-ui-shared-plugin/static/forms/hook_form_lib'; -import type { Case, CaseConnectors } from '../../../common/ui/types'; +import type { CaseUI, CaseConnectors } from '../../../common/ui/types'; import type { ActionConnector, CaseConnector, ConnectorTypeFields } from '../../../common/api'; import { NONE_CONNECTOR_ID } from '../../../common/api'; import { ConnectorSelector } from '../connector_selector/form'; @@ -37,7 +37,7 @@ import { PushCallouts } from './push_callouts'; import { normalizeActionConnector, getNoneConnector } from '../configure_cases/utils'; export interface EditConnectorProps { - caseData: Case; + caseData: CaseUI; caseConnectors: CaseConnectors; supportedActionConnectors: ActionConnector[]; isLoading: boolean; diff --git a/x-pack/plugins/cases/public/components/use_create_case_modal/create_case_modal.tsx b/x-pack/plugins/cases/public/components/use_create_case_modal/create_case_modal.tsx index 0418746eff912..482c198d15d63 100644 --- a/x-pack/plugins/cases/public/components/use_create_case_modal/create_case_modal.tsx +++ b/x-pack/plugins/cases/public/components/use_create_case_modal/create_case_modal.tsx @@ -8,14 +8,14 @@ import React, { memo } from 'react'; import { EuiModal, EuiModalBody, EuiModalHeader, EuiModalHeaderTitle } from '@elastic/eui'; -import type { Case } from '../../containers/types'; +import type { CaseUI } from '../../containers/types'; import * as i18n from '../../common/translations'; import { CreateCase } from '../create'; export interface CreateCaseModalProps { isModalOpen: boolean; onCloseCaseModal: () => void; - onSuccess: (theCase: Case) => Promise; + onSuccess: (theCase: CaseUI) => Promise; } const CreateModalComponent: React.FC = ({ diff --git a/x-pack/plugins/cases/public/components/use_create_case_modal/index.tsx b/x-pack/plugins/cases/public/components/use_create_case_modal/index.tsx index f640fd2b3df7c..92a24b615e383 100644 --- a/x-pack/plugins/cases/public/components/use_create_case_modal/index.tsx +++ b/x-pack/plugins/cases/public/components/use_create_case_modal/index.tsx @@ -6,11 +6,11 @@ */ import React, { useState, useCallback, useMemo } from 'react'; -import type { Case } from '../../../common/ui/types'; +import type { CaseUI } from '../../../common/ui/types'; import { CreateCaseModal } from './create_case_modal'; export interface UseCreateCaseModalProps { - onCaseCreated: (theCase: Case) => void; + onCaseCreated: (theCase: CaseUI) => void; } export interface UseCreateCaseModalReturnedValues { modal: JSX.Element; diff --git a/x-pack/plugins/cases/public/components/user_actions/comment/registered_attachments.tsx b/x-pack/plugins/cases/public/components/user_actions/comment/registered_attachments.tsx index 9f79e966a0833..2aa419d8ece5c 100644 --- a/x-pack/plugins/cases/public/components/user_actions/comment/registered_attachments.tsx +++ b/x-pack/plugins/cases/public/components/user_actions/comment/registered_attachments.tsx @@ -50,10 +50,10 @@ type BuilderArgs = Pick< /** * Provides a render function for attachment type */ -const getAttachmentRenderer = memoize((attachmentViewObject: AttachmentViewObject) => { +const getAttachmentRenderer = memoize(() => { let AttachmentElement: React.ReactElement; - const renderCallback = (props: object) => { + const renderCallback = (attachmentViewObject: AttachmentViewObject, props: object) => { if (!attachmentViewObject.children) return; if (!AttachmentElement) { @@ -120,7 +120,7 @@ export const createRegisteredAttachmentUserActionBuilder = < const attachmentViewObject = attachmentType.getAttachmentViewObject(props); - const renderer = getAttachmentRenderer(attachmentViewObject); + const renderer = getAttachmentRenderer(); const actions = attachmentViewObject.getActions?.(props) ?? []; const [primaryActions, nonPrimaryActions] = partition(actions, 'isPrimary'); const visiblePrimaryActions = primaryActions.slice(0, 2); @@ -164,7 +164,7 @@ export const createRegisteredAttachmentUserActionBuilder = < /> ), - children: renderer(props), + children: renderer(attachmentViewObject, props), }, ]; }, diff --git a/x-pack/plugins/cases/public/components/user_actions/comment/user.tsx b/x-pack/plugins/cases/public/components/user_actions/comment/user.tsx index 0c40f738c56b6..119ae2b9039b3 100644 --- a/x-pack/plugins/cases/public/components/user_actions/comment/user.tsx +++ b/x-pack/plugins/cases/public/components/user_actions/comment/user.tsx @@ -46,10 +46,17 @@ const MyEuiCommentFooter = styled(EuiText)` `} `; -const hasDraftComment = (appId = '', caseId: string, commentId: string): boolean => { - const draftStorageKey = getMarkdownEditorStorageKey(appId, caseId, commentId); +const hasDraftComment = ( + applicationId = '', + caseId: string, + commentId: string, + comment: string +): boolean => { + const draftStorageKey = getMarkdownEditorStorageKey(applicationId, caseId, commentId); - return Boolean(sessionStorage.getItem(draftStorageKey)); + const sessionValue = sessionStorage.getItem(draftStorageKey); + + return Boolean(sessionValue && sessionValue !== comment); }; export const createUserAttachmentUserActionBuilder = ({ @@ -78,7 +85,8 @@ export const createUserAttachmentUserActionBuilder = ({ className: classNames('userAction__comment', { outlined, isEdit, - draftFooter: !isEdit && !isLoading && hasDraftComment(appId, caseId, comment.id), + draftFooter: + !isEdit && !isLoading && hasDraftComment(appId, caseId, comment.id, comment.comment), }), children: ( <> @@ -95,7 +103,7 @@ export const createUserAttachmentUserActionBuilder = ({ version: comment.version, })} /> - {!isEdit && !isLoading && hasDraftComment(appId, caseId, comment.id) ? ( + {!isEdit && !isLoading && hasDraftComment(appId, caseId, comment.id, comment.comment) ? ( {i18n.UNSAVED_DRAFT_COMMENT} diff --git a/x-pack/plugins/cases/public/components/user_actions/types.ts b/x-pack/plugins/cases/public/components/user_actions/types.ts index 4396aeea50f02..2c539e0b9ff42 100644 --- a/x-pack/plugins/cases/public/components/user_actions/types.ts +++ b/x-pack/plugins/cases/public/components/user_actions/types.ts @@ -10,7 +10,7 @@ import type { UserProfileWithAvatar } from '@kbn/user-profile-components'; import type { SnakeToCamelCase } from '../../../common/types'; import type { ActionTypes, UserActionWithResponse } from '../../../common/api'; import type { - Case, + CaseUI, CaseConnectors, CaseUserActions, CommentUI, @@ -31,7 +31,7 @@ export interface UserActionTreeProps { caseConnectors: CaseConnectors; userProfiles: Map; currentUserProfile: CurrentUserProfile; - data: Case; + data: CaseUI; getRuleDetailsHref?: RuleDetailsNavigation['href']; actionsNavigation?: ActionsNavigation; onRuleDetailsClick?: RuleDetailsNavigation['onClick']; @@ -48,7 +48,7 @@ export type SupportedUserActionTypes = keyof Omit; currentUserProfile: CurrentUserProfile; externalReferenceAttachmentTypeRegistry: ExternalReferenceAttachmentTypeRegistry; diff --git a/x-pack/plugins/cases/public/components/user_actions/use_user_actions_handler.tsx b/x-pack/plugins/cases/public/components/user_actions/use_user_actions_handler.tsx index e19dbea584fc8..1cd7d641acdc7 100644 --- a/x-pack/plugins/cases/public/components/user_actions/use_user_actions_handler.tsx +++ b/x-pack/plugins/cases/public/components/user_actions/use_user_actions_handler.tsx @@ -7,7 +7,7 @@ import { useCallback, useEffect, useRef, useState } from 'react'; import { useCaseViewParams } from '../../common/navigation'; -import type { Case } from '../../containers/types'; +import type { CaseUI } from '../../containers/types'; import { useLensDraftComment } from '../markdown_editor/plugins/lens/use_lens_draft_comment'; import { useUpdateComment } from '../../containers/use_update_comment'; import type { AddCommentRefObject } from '../add_comment'; @@ -28,7 +28,7 @@ export type UseUserActionsHandler = Pick< | 'handleSaveComment' | 'handleManageQuote' | 'handleDeleteComment' -> & { handleUpdate: (updatedCase: Case) => void }; +> & { handleUpdate: (updatedCase: CaseUI) => void }; const isAddCommentRef = ( ref: AddCommentRefObject | UserActionMarkdownRefObject | null | undefined @@ -37,6 +37,13 @@ const isAddCommentRef = ( return commentRef?.addQuote != null; }; +const isSetCommentRef = ( + ref: AddCommentRefObject | UserActionMarkdownRefObject | null | undefined +): ref is AddCommentRefObject => { + const commentRef = ref as UserActionMarkdownRefObject; + return commentRef?.setComment != null; +}; + export const useUserActionsHandler = (): UseUserActionsHandler => { const { detailName: caseId } = useCaseViewParams(); const { clearDraftComment, draftComment, hasIncomingLensState, openLensModal } = @@ -122,7 +129,7 @@ export const useUserActionsHandler = (): UseUserActionsHandler => { ); useEffect(() => { - if (draftComment?.commentId) { + if (draftComment?.commentId && draftComment?.commentId !== 'description') { setManageMarkdownEditIds((prevManageMarkdownEditIds) => { if ( NEW_COMMENT_ID !== draftComment?.commentId && @@ -135,7 +142,7 @@ export const useUserActionsHandler = (): UseUserActionsHandler => { const ref = commentRefs?.current?.[draftComment.commentId]; - if (isAddCommentRef(ref) && ref.editor?.textarea) { + if (isSetCommentRef(ref) && ref.editor?.textarea) { ref.setComment(draftComment.comment); if (hasIncomingLensState) { openLensModal({ editorRef: ref.editor }); diff --git a/x-pack/plugins/cases/public/containers/__mocks__/api.ts b/x-pack/plugins/cases/public/containers/__mocks__/api.ts index b29e45f6f101e..19aea63bdb0bf 100644 --- a/x-pack/plugins/cases/public/containers/__mocks__/api.ts +++ b/x-pack/plugins/cases/public/containers/__mocks__/api.ts @@ -7,8 +7,8 @@ import type { ActionLicense, - Cases, - Case, + CasesUI, + CaseUI, CasesStatus, FetchCasesProps, FindCaseUserActions, @@ -53,7 +53,7 @@ export const getCase = async ( caseId: string, includeComments: boolean = true, signal: AbortSignal -): Promise => Promise.resolve(basicCase); +): Promise => Promise.resolve(basicCase); export const resolveCase = async ( caseId: string, @@ -101,9 +101,9 @@ export const getCases = async ({ sortOrder: 'desc', }, signal, -}: FetchCasesProps): Promise => Promise.resolve(allCases); +}: FetchCasesProps): Promise => Promise.resolve(allCases); -export const postCase = async (newCase: CasePostRequest, signal: AbortSignal): Promise => +export const postCase = async (newCase: CasePostRequest, signal: AbortSignal): Promise => Promise.resolve(basicCasePost); export const patchCase = async ( @@ -111,18 +111,18 @@ export const patchCase = async ( updatedCase: Pick, version: string, signal: AbortSignal -): Promise => Promise.resolve([basicCase]); +): Promise => Promise.resolve([basicCase]); export const updateCases = async ( cases: CaseUpdateRequest[], signal: AbortSignal -): Promise => Promise.resolve(allCases.cases); +): Promise => Promise.resolve(allCases.cases); export const createAttachments = async ( newComment: CommentRequest, caseId: string, signal: AbortSignal -): Promise => Promise.resolve(basicCase); +): Promise => Promise.resolve(basicCase); export const deleteComment = async ( caseId: string, @@ -136,7 +136,7 @@ export const patchComment = async ( commentUpdate: string, version: string, signal: AbortSignal -): Promise => Promise.resolve(basicCaseCommentPatch); +): Promise => Promise.resolve(basicCaseCommentPatch); export const deleteCases = async (caseIds: string[], signal: AbortSignal): Promise => Promise.resolve(true); @@ -145,7 +145,7 @@ export const pushCase = async ( caseId: string, connectorId: string, signal: AbortSignal -): Promise => Promise.resolve(pushedCase); +): Promise => Promise.resolve(pushedCase); export const getActionLicense = async (signal: AbortSignal): Promise => Promise.resolve(actionLicenses); diff --git a/x-pack/plugins/cases/public/containers/api.ts b/x-pack/plugins/cases/public/containers/api.ts index a45bfa3752c91..2d9e17658d156 100644 --- a/x-pack/plugins/cases/public/containers/api.ts +++ b/x-pack/plugins/cases/public/containers/api.ts @@ -9,7 +9,6 @@ import type { ValidFeatureId } from '@kbn/rule-data-utils'; import { BASE_RAC_ALERTS_API_PATH } from '@kbn/rule-registry-plugin/common/constants'; import type { CaseConnectors, - Cases, CaseUpdateRequest, FetchCasesProps, ResolvedCase, @@ -17,15 +16,14 @@ import type { CaseUserActionTypeWithAll, CaseUserActionsStats, CaseUsers, + CasesUI, } from '../../common/ui/types'; import { SeverityAll, SortFieldCase, StatusAll } from '../../common/ui/types'; import type { BulkCreateCommentRequest, CasePatchRequest, CasePostRequest, - CaseResponse, CaseResolveResponse, - CasesResponse, UserActionFindResponse, CommentRequest, User, @@ -33,6 +31,8 @@ import type { CasesFindResponse, GetCaseConnectorsResponse, CaseUserActionStatsResponse, + Case, + Cases, } from '../../common/api'; import { CommentType, @@ -69,7 +69,7 @@ import { import type { ActionLicense, - Case, + CaseUI, SingleCaseMetrics, SingleCaseMetricsFeature, CaseUserActions, @@ -91,8 +91,8 @@ export const getCase = async ( caseId: string, includeComments: boolean = true, signal: AbortSignal -): Promise => { - const response = await KibanaServices.get().http.fetch(getCaseDetailsUrl(caseId), { +): Promise => { + const response = await KibanaServices.get().http.fetch(getCaseDetailsUrl(caseId), { method: 'GET', query: { includeComments, @@ -223,7 +223,7 @@ export const getCases = async ({ sortOrder: 'desc', }, signal, -}: FetchCasesProps): Promise => { +}: FetchCasesProps): Promise => { const query = { ...(filterOptions.status !== StatusAll ? { status: filterOptions.status } : {}), ...(filterOptions.severity !== SeverityAll ? { severity: filterOptions.severity } : {}), @@ -245,8 +245,8 @@ export const getCases = async ({ return convertAllCasesToCamel(decodeCasesFindResponse(response)); }; -export const postCase = async (newCase: CasePostRequest, signal: AbortSignal): Promise => { - const response = await KibanaServices.get().http.fetch(CASES_URL, { +export const postCase = async (newCase: CasePostRequest, signal: AbortSignal): Promise => { + const response = await KibanaServices.get().http.fetch(CASES_URL, { method: 'POST', body: JSON.stringify(newCase), signal, @@ -262,8 +262,8 @@ export const patchCase = async ( >, version: string, signal: AbortSignal -): Promise => { - const response = await KibanaServices.get().http.fetch(CASES_URL, { +): Promise => { + const response = await KibanaServices.get().http.fetch(CASES_URL, { method: 'PATCH', body: JSON.stringify({ cases: [{ ...updatedCase, id: caseId, version }] }), signal, @@ -274,12 +274,12 @@ export const patchCase = async ( export const updateCases = async ( cases: CaseUpdateRequest[], signal: AbortSignal -): Promise => { +): Promise => { if (cases.length === 0) { return []; } - const response = await KibanaServices.get().http.fetch(CASES_URL, { + const response = await KibanaServices.get().http.fetch(CASES_URL, { method: 'PATCH', body: JSON.stringify({ cases }), signal, @@ -292,15 +292,12 @@ export const postComment = async ( newComment: CommentRequest, caseId: string, signal: AbortSignal -): Promise => { - const response = await KibanaServices.get().http.fetch( - `${CASES_URL}/${caseId}/comments`, - { - method: 'POST', - body: JSON.stringify(newComment), - signal, - } - ); +): Promise => { + const response = await KibanaServices.get().http.fetch(`${CASES_URL}/${caseId}/comments`, { + method: 'POST', + body: JSON.stringify(newComment), + signal, + }); return convertCaseToCamelCase(decodeCaseResponse(response)); }; @@ -318,8 +315,8 @@ export const patchComment = async ({ version: string; signal: AbortSignal; owner: string; -}): Promise => { - const response = await KibanaServices.get().http.fetch(getCaseCommentsUrl(caseId), { +}): Promise => { + const response = await KibanaServices.get().http.fetch(getCaseCommentsUrl(caseId), { method: 'PATCH', body: JSON.stringify({ comment: commentUpdate, @@ -342,7 +339,7 @@ export const deleteComment = async ({ commentId: string; signal: AbortSignal; }): Promise => { - await KibanaServices.get().http.fetch(getCaseCommentDeleteUrl(caseId, commentId), { + await KibanaServices.get().http.fetch(getCaseCommentDeleteUrl(caseId, commentId), { method: 'DELETE', signal, }); @@ -361,8 +358,8 @@ export const pushCase = async ( caseId: string, connectorId: string, signal: AbortSignal -): Promise => { - const response = await KibanaServices.get().http.fetch( +): Promise => { + const response = await KibanaServices.get().http.fetch( getCasePushUrl(caseId, connectorId), { method: 'POST', @@ -390,8 +387,8 @@ export const createAttachments = async ( attachments: BulkCreateCommentRequest, caseId: string, signal: AbortSignal -): Promise => { - const response = await KibanaServices.get().http.fetch( +): Promise => { + const response = await KibanaServices.get().http.fetch( INTERNAL_BULK_CREATE_ATTACHMENTS_URL.replace('{case_id}', caseId), { method: 'POST', diff --git a/x-pack/plugins/cases/public/containers/mock.ts b/x-pack/plugins/cases/public/containers/mock.ts index 37f1cbd5744cf..c6b09106bb010 100644 --- a/x-pack/plugins/cases/public/containers/mock.ts +++ b/x-pack/plugins/cases/public/containers/mock.ts @@ -6,7 +6,14 @@ */ import type { FileJSON } from '@kbn/shared-ux-file-types'; -import type { ActionLicense, Cases, Case, CasesStatus, CaseUserActions, CommentUI } from './types'; +import type { + ActionLicense, + CasesUI, + CaseUI, + CasesStatus, + CaseUserActions, + CommentUI, +} from './types'; import type { ResolvedCase, @@ -22,9 +29,9 @@ import type { } from '../../common/ui/types'; import type { CaseConnector, - CaseResponse, + Case, CasesFindResponse, - CasesResponse, + Cases, CasesStatusResponse, CaseUserActionResponse, CaseUserActionsResponse, @@ -208,7 +215,7 @@ export const persistableStateAttachment: PersistableComment = { version: 'WzQ3LDFc', }; -export const basicCase: Case = { +export const basicCase: CaseUI = { owner: SECURITY_SOLUTION_OWNER, closedAt: null, closedBy: null, @@ -325,7 +332,7 @@ export const basicCaseMetrics: SingleCaseMetrics = { }, }; -export const mockCase: Case = { +export const mockCase: CaseUI = { owner: SECURITY_SOLUTION_OWNER, closedAt: null, closedBy: null, @@ -357,7 +364,7 @@ export const mockCase: Case = { assignees: [], }; -export const basicCasePost: Case = { +export const basicCasePost: CaseUI = { ...basicCase, updatedAt: null, updatedBy: null, @@ -398,7 +405,7 @@ export const basicPush = { pushedBy: elasticUser, }; -export const pushedCase: Case = { +export const pushedCase: CaseUI = { ...basicCase, connector: { id: pushConnectorId, @@ -419,7 +426,7 @@ const basicAction = { type: 'title', }; -export const cases: Case[] = [ +export const cases: CaseUI[] = [ basicCase, { ...pushedCase, @@ -437,7 +444,7 @@ export const cases: Case[] = [ caseWithRegisteredAttachments, ]; -export const allCases: Cases = { +export const allCases: CasesUI = { cases, page: 1, perPage: 5, @@ -515,7 +522,7 @@ export const persistableStateAttachmentSnake: Comment = { version: 'WzQ3LDFc', }; -export const basicCaseSnake: CaseResponse = { +export const basicCaseSnake: Case = { ...basicCase, status: CaseStatuses.open, closed_at: null, @@ -529,7 +536,7 @@ export const basicCaseSnake: CaseResponse = { updated_at: basicUpdatedAt, updated_by: elasticUserSnake, owner: SECURITY_SOLUTION_OWNER, -} as CaseResponse; +} as Case; export const caseWithAlertsSnake = { ...basicCaseSnake, @@ -583,7 +590,7 @@ export const pushedCaseSnake = { external_service: { ...basicPushSnake, connector_id: pushConnectorId }, }; -export const casesSnake: CasesResponse = [ +export const casesSnake: Cases = [ basicCaseSnake, { ...pushedCaseSnake, @@ -910,7 +917,7 @@ export const useGetCasesMockState = { isError: false, }; -export const basicCaseClosed: Case = { +export const basicCaseClosed: CaseUI = { ...basicCase, closedAt: '2020-02-25T23:06:33.798Z', closedBy: elasticUser, diff --git a/x-pack/plugins/cases/public/containers/use_create_attachments.tsx b/x-pack/plugins/cases/public/containers/use_create_attachments.tsx index 074b85839c4d9..38cb5de7ee513 100644 --- a/x-pack/plugins/cases/public/containers/use_create_attachments.tsx +++ b/x-pack/plugins/cases/public/containers/use_create_attachments.tsx @@ -9,7 +9,7 @@ import { useReducer, useCallback, useRef, useEffect } from 'react'; import { createAttachments } from './api'; import * as i18n from './translations'; -import type { Case } from './types'; +import type { CaseUI } from './types'; import { useToasts } from '../common/lib/kibana'; import type { CaseAttachmentsWithoutOwner } from '../types'; @@ -45,7 +45,7 @@ export interface PostComment { caseId: string; caseOwner: string; data: CaseAttachmentsWithoutOwner; - updateCase?: (newCase: Case) => void; + updateCase?: (newCase: CaseUI) => void; throwOnError?: boolean; } export interface UseCreateAttachments extends NewCommentState { diff --git a/x-pack/plugins/cases/public/containers/use_get_cases.tsx b/x-pack/plugins/cases/public/containers/use_get_cases.tsx index b9f55cc77682f..356534d60cc06 100644 --- a/x-pack/plugins/cases/public/containers/use_get_cases.tsx +++ b/x-pack/plugins/cases/public/containers/use_get_cases.tsx @@ -8,7 +8,7 @@ import type { UseQueryResult } from '@tanstack/react-query'; import { useQuery } from '@tanstack/react-query'; import { casesQueriesKeys, DEFAULT_TABLE_ACTIVE_PAGE, DEFAULT_TABLE_LIMIT } from './constants'; -import type { Cases, FilterOptions, QueryParams } from './types'; +import type { CasesUI, FilterOptions, QueryParams } from './types'; import { SortFieldCase, StatusAll, SeverityAll } from './types'; import { useToasts } from '../common/lib/kibana'; import * as i18n from './translations'; @@ -35,7 +35,7 @@ export const DEFAULT_QUERY_PARAMS: QueryParams = { sortOrder: 'desc', }; -export const initialData: Cases = { +export const initialData: CasesUI = { cases: [], countClosedCases: 0, countInProgressCases: 0, @@ -50,7 +50,7 @@ export const useGetCases = ( queryParams?: Partial; filterOptions?: Partial; } = {} -): UseQueryResult => { +): UseQueryResult => { const toasts = useToasts(); return useQuery( casesQueriesKeys.cases(params), diff --git a/x-pack/plugins/cases/public/containers/use_post_push_to_service.tsx b/x-pack/plugins/cases/public/containers/use_post_push_to_service.tsx index d13500dcbc5fa..bda1c3bc37d54 100644 --- a/x-pack/plugins/cases/public/containers/use_post_push_to_service.tsx +++ b/x-pack/plugins/cases/public/containers/use_post_push_to_service.tsx @@ -10,7 +10,7 @@ import type { CaseConnector } from '../../common/api'; import { pushCase } from './api'; import * as i18n from './translations'; -import type { Case } from './types'; +import type { CaseUI } from './types'; import { useToasts } from '../common/lib/kibana'; interface PushToServiceState { @@ -53,7 +53,7 @@ export interface UsePostPushToService extends PushToServiceState { pushCaseToExternalService: ({ caseId, connector, - }: PushToServiceRequest) => Promise; + }: PushToServiceRequest) => Promise; } export const usePostPushToService = (): UsePostPushToService => { diff --git a/x-pack/plugins/cases/public/containers/utils.test.ts b/x-pack/plugins/cases/public/containers/utils.test.ts index c87c81a02f818..b7a0b17ec5ff0 100644 --- a/x-pack/plugins/cases/public/containers/utils.test.ts +++ b/x-pack/plugins/cases/public/containers/utils.test.ts @@ -13,7 +13,7 @@ import { constructReportersFilter, } from './utils'; -import type { Case } from './types'; +import type { CaseUI } from './types'; const caseBeforeUpdate = { comments: [ @@ -24,9 +24,9 @@ const caseBeforeUpdate = { settings: { syncAlerts: true, }, -} as Case; +} as CaseUI; -const caseAfterUpdate = { title: 'My case' } as Case; +const caseAfterUpdate = { title: 'My case' } as CaseUI; describe('utils', () => { describe('valueToUpdateIsSettings', () => { diff --git a/x-pack/plugins/cases/public/containers/utils.ts b/x-pack/plugins/cases/public/containers/utils.ts index 733e5bd08de7a..66b540040415f 100644 --- a/x-pack/plugins/cases/public/containers/utils.ts +++ b/x-pack/plugins/cases/public/containers/utils.ts @@ -13,8 +13,6 @@ import { pipe } from 'fp-ts/lib/pipeable'; import type { ToastInputFields } from '@kbn/core/public'; import { NO_ASSIGNEES_FILTERING_KEYWORD } from '../../common/constants'; import type { - CaseResponse, - CasesResponse, CasesConfigurationsResponse, CasesConfigureResponse, CaseUserActionsResponse, @@ -23,10 +21,12 @@ import type { SingleCaseMetricsResponse, User, CaseUserActionStatsResponse, + Case, + Cases, } from '../../common/api'; import { - CaseResponseRt, - CasesResponseRt, + CaseRt, + CasesRt, throwErrors, CaseConfigurationsResponseRt, CaseConfigureResponseRt, @@ -36,7 +36,7 @@ import { SingleCaseMetricsResponseRt, CaseUserActionStatsResponseRt, } from '../../common/api'; -import type { Case, FilterOptions, UpdateByKey } from './types'; +import type { CaseUI, FilterOptions, UpdateByKey } from './types'; import * as i18n from './translations'; export const getTypedPayload = (a: unknown): T => a as T; @@ -49,8 +49,8 @@ export const covertToSnakeCase = (obj: Record) => export const createToasterPlainError = (message: string) => new ToasterError([message]); -export const decodeCaseResponse = (respCase?: CaseResponse) => - pipe(CaseResponseRt.decode(respCase), fold(throwErrors(createToasterPlainError), identity)); +export const decodeCaseResponse = (respCase?: Case) => + pipe(CaseRt.decode(respCase), fold(throwErrors(createToasterPlainError), identity)); export const decodeCaseResolveResponse = (respCase?: CaseResolveResponse) => pipe( @@ -64,8 +64,8 @@ export const decodeSingleCaseMetricsResponse = (respCase?: SingleCaseMetricsResp fold(throwErrors(createToasterPlainError), identity) ); -export const decodeCasesResponse = (respCase?: CasesResponse) => - pipe(CasesResponseRt.decode(respCase), fold(throwErrors(createToasterPlainError), identity)); +export const decodeCasesResponse = (respCase?: Cases) => + pipe(CasesRt.decode(respCase), fold(throwErrors(createToasterPlainError), identity)); export const decodeCaseConfigurationsResponse = (respCase?: CasesConfigurationsResponse) => { return pipe( @@ -114,8 +114,8 @@ export class ToasterError extends Error { } } export const createUpdateSuccessToaster = ( - caseBeforeUpdate: Case, - caseAfterUpdate: Case, + caseBeforeUpdate: CaseUI, + caseAfterUpdate: CaseUI, key: UpdateByKey['updateKey'], value: UpdateByKey['updateValue'] ): ToastInputFields => { diff --git a/x-pack/plugins/cases/public/types.ts b/x-pack/plugins/cases/public/types.ts index 6b88c79abb6a3..be2275c8c0980 100644 --- a/x-pack/plugins/cases/public/types.ts +++ b/x-pack/plugins/cases/public/types.ts @@ -25,7 +25,7 @@ import type { LicensingPluginStart } from '@kbn/licensing-plugin/public'; import type { FilesSetup, FilesStart } from '@kbn/files-plugin/public'; import type { SavedObjectsManagementPluginStart } from '@kbn/saved-objects-management-plugin/public'; import type { - CaseResponse, + Case, CasesBulkGetRequestCertainFields, CasesBulkGetResponseCertainFields, CasesByAlertId, @@ -48,7 +48,7 @@ import type { GetCasesProps } from './client/ui/get_cases'; import type { GetAllCasesSelectorModalProps } from './client/ui/get_all_cases_selector_modal'; import type { GetCreateCaseFlyoutProps } from './client/ui/get_create_case_flyout'; import type { GetRecentCasesProps } from './client/ui/get_recent_cases'; -import type { Cases, CasesStatus, CasesMetrics } from '../common/ui'; +import type { CasesUI, CasesStatus, CasesMetrics } from '../common/ui'; import type { GroupAlertsByRule } from './client/helpers/group_alerts_by_rule'; import type { getUICapabilities } from './client/helpers/capabilities'; import type { AttachmentFramework } from './client/attachment_framework/types'; @@ -103,10 +103,10 @@ export interface CasesUiStart { api: { getRelatedCases: (alertId: string, query: CasesByAlertIDRequest) => Promise; cases: { - find: (query: CasesFindRequest, signal?: AbortSignal) => Promise; + find: (query: CasesFindRequest, signal?: AbortSignal) => Promise; getCasesStatus: (query: CasesStatusRequest, signal?: AbortSignal) => Promise; getCasesMetrics: (query: CasesMetricsRequest, signal?: AbortSignal) => Promise; - bulkGet: ( + bulkGet: ( params: CasesBulkGetRequestCertainFields, signal?: AbortSignal ) => Promise>; diff --git a/x-pack/plugins/cases/server/client/attachments/add.ts b/x-pack/plugins/cases/server/client/attachments/add.ts index 920adca9dc1bf..ae4d4aab68e1d 100644 --- a/x-pack/plugins/cases/server/client/attachments/add.ts +++ b/x-pack/plugins/cases/server/client/attachments/add.ts @@ -12,7 +12,7 @@ import { identity } from 'fp-ts/lib/function'; import { SavedObjectsUtils } from '@kbn/core/server'; -import type { CaseResponse } from '../../../common/api'; +import type { Case } from '../../../common/api'; import { CommentRequestRt, throwErrors } from '../../../common/api'; import { CaseCommentModel } from '../../common/models'; @@ -29,10 +29,7 @@ import { validateRegisteredAttachments } from './validators'; * * @ignore */ -export const addComment = async ( - addArgs: AddArgs, - clientArgs: CasesClientArgs -): Promise => { +export const addComment = async (addArgs: AddArgs, clientArgs: CasesClientArgs): Promise => { const { comment, caseId } = addArgs; const query = pipe( CommentRequestRt.decode(comment), diff --git a/x-pack/plugins/cases/server/client/attachments/bulk_create.ts b/x-pack/plugins/cases/server/client/attachments/bulk_create.ts index 1213f9a373b7c..e989410a7a389 100644 --- a/x-pack/plugins/cases/server/client/attachments/bulk_create.ts +++ b/x-pack/plugins/cases/server/client/attachments/bulk_create.ts @@ -12,7 +12,7 @@ import { identity } from 'fp-ts/lib/function'; import { SavedObjectsUtils } from '@kbn/core/server'; -import type { CaseResponse, CommentRequest } from '../../../common/api'; +import type { Case, CommentRequest } from '../../../common/api'; import { BulkCreateCommentRequestRt, throwErrors } from '../../../common/api'; import { CaseCommentModel } from '../../common/models'; @@ -33,7 +33,7 @@ import { validateRegisteredAttachments } from './validators'; export const bulkCreate = async ( args: BulkCreateArgs, clientArgs: CasesClientArgs -): Promise => { +): Promise => { const { attachments, caseId } = args; pipe( diff --git a/x-pack/plugins/cases/server/client/attachments/client.ts b/x-pack/plugins/cases/server/client/attachments/client.ts index b45806ee9f58a..ae4abe2d667dc 100644 --- a/x-pack/plugins/cases/server/client/attachments/client.ts +++ b/x-pack/plugins/cases/server/client/attachments/client.ts @@ -9,7 +9,7 @@ import type { AlertResponse, AllCommentsResponse, BulkGetAttachmentsResponse, - CaseResponse, + Case, Comment, Comments, } from '../../../common/api'; @@ -45,8 +45,8 @@ export interface AttachmentsSubClient { /** * Adds an attachment to a case. */ - add(params: AddArgs): Promise; - bulkCreate(params: BulkCreateArgs): Promise; + add(params: AddArgs): Promise; + bulkCreate(params: BulkCreateArgs): Promise; bulkGet(params: BulkGetArgs): Promise; /** * Deletes all attachments associated with a single case. @@ -78,7 +78,7 @@ export interface AttachmentsSubClient { * * The request must include all fields for the attachment. Even the fields that are not changing. */ - update(updateArgs: UpdateArgs): Promise; + update(updateArgs: UpdateArgs): Promise; } /** diff --git a/x-pack/plugins/cases/server/client/attachments/update.ts b/x-pack/plugins/cases/server/client/attachments/update.ts index 692e2f6b15204..213d4a86ea242 100644 --- a/x-pack/plugins/cases/server/client/attachments/update.ts +++ b/x-pack/plugins/cases/server/client/attachments/update.ts @@ -10,7 +10,7 @@ import Boom from '@hapi/boom'; import { CaseCommentModel } from '../../common/models'; import { createCaseError } from '../../common/error'; import { isCommentRequestTypeExternalReference } from '../../../common/utils/attachments'; -import type { CaseResponse } from '../../../common/api'; +import type { Case } from '../../../common/api'; import { CASE_SAVED_OBJECT } from '../../../common/constants'; import type { CasesClientArgs } from '..'; import { decodeCommentRequest } from '../utils'; @@ -25,7 +25,7 @@ import type { UpdateArgs } from './types'; export async function update( { caseID, updateRequest: queryParams }: UpdateArgs, clientArgs: CasesClientArgs -): Promise { +): Promise { const { services: { attachmentService }, logger, diff --git a/x-pack/plugins/cases/server/client/cases/bulk_get.test.ts b/x-pack/plugins/cases/server/client/cases/bulk_get.test.ts index 8628fa64056ad..fd68bd7e8d36d 100644 --- a/x-pack/plugins/cases/server/client/cases/bulk_get.test.ts +++ b/x-pack/plugins/cases/server/client/cases/bulk_get.test.ts @@ -5,8 +5,8 @@ * 2.0. */ -import type { CaseResponse } from '../../../common/api'; -import { getTypeProps, CaseResponseRt } from '../../../common/api'; +import type { Case } from '../../../common/api'; +import { getTypeProps, CaseRt } from '../../../common/api'; import { mockCases } from '../../mocks'; import { createCasesClientMockArgs } from '../mocks'; import { bulkGet } from './bulk_get'; @@ -39,8 +39,8 @@ describe('bulkGet', () => { unauthorized: [], }); - const typeProps = getTypeProps(CaseResponseRt) ?? {}; - const validFields = Object.keys(typeProps) as Array; + const typeProps = getTypeProps(CaseRt) ?? {}; + const validFields = Object.keys(typeProps) as Array; beforeEach(() => { jest.clearAllMocks(); diff --git a/x-pack/plugins/cases/server/client/cases/bulk_get.ts b/x-pack/plugins/cases/server/client/cases/bulk_get.ts index 85952b84bef91..3c2542c244874 100644 --- a/x-pack/plugins/cases/server/client/cases/bulk_get.ts +++ b/x-pack/plugins/cases/server/client/cases/bulk_get.ts @@ -16,31 +16,31 @@ import type { CasesBulkGetResponse, CasesBulkGetResponseCertainFields, CasesBulkGetRequestCertainFields, - CaseResponse, + Case, CaseAttributes, } from '../../../common/api'; import { CasesBulkGetRequestRt, - CasesResponseRt, + CasesRt, excess, throwErrors, getTypeForCertainFieldsFromArray, - CaseResponseRt, + CaseRt, } from '../../../common/api'; import { getTypeProps } from '../../../common/api/runtime_types'; import { createCaseError } from '../../common/error'; import { asArray, flattenCaseSavedObject } from '../../common/utils'; import type { CasesClientArgs, SOWithErrors } from '../types'; import { includeFieldsRequiredForAuthentication } from '../../authorization/utils'; -import type { CaseSavedObject } from '../../common/types'; import { Operations } from '../../authorization'; +import type { CaseSavedObjectTransformed } from '../../common/types/case'; type CaseSavedObjectWithErrors = SOWithErrors; /** * Retrieves multiple cases by ids. */ -export const bulkGet = async ( +export const bulkGet = async ( params: CasesBulkGetRequestCertainFields, clientArgs: CasesClientArgs ): Promise> => { @@ -66,7 +66,7 @@ export const bulkGet = async caseInfo.error === undefined - ) as [CaseSavedObject[], CaseSavedObjectWithErrors]; + ) as [CaseSavedObjectTransformed[], CaseSavedObjectWithErrors]; const { authorized: authorizedCases, unauthorized: unauthorizedCases } = await authorization.getAndEnsureAuthorizedEntities({ @@ -103,7 +103,7 @@ export const bulkGet = async { return; } - const typeProps = getTypeProps(CaseResponseRt) ?? {}; + const typeProps = getTypeProps(CaseRt) ?? {}; const validFields = Object.keys(typeProps); for (const field of fields) { @@ -142,7 +142,7 @@ const throwErrorIfCaseIdsReachTheLimit = (ids: string[]) => { const constructErrors = ( soBulkGetErrors: CaseSavedObjectWithErrors, - unauthorizedCases: CaseSavedObject[] + unauthorizedCases: CaseSavedObjectTransformed[] ): CasesBulkGetResponse['errors'] => { const errors: CasesBulkGetResponse['errors'] = []; diff --git a/x-pack/plugins/cases/server/client/cases/client.ts b/x-pack/plugins/cases/server/client/cases/client.ts index bf3253fda6558..a014eeec56a6c 100644 --- a/x-pack/plugins/cases/server/client/cases/client.ts +++ b/x-pack/plugins/cases/server/client/cases/client.ts @@ -13,7 +13,7 @@ import type { AllTagsFindRequest, AllReportersFindRequest, CasesByAlertId, - CaseResponse, + Case, CasesBulkGetRequestCertainFields, CasesBulkGetResponseCertainFields, } from '../../../common/api'; @@ -65,7 +65,7 @@ export interface CasesSubClient { /** * Retrieves multiple cases with the specified IDs. */ - bulkGet( + bulkGet( params: CasesBulkGetRequestCertainFields ): Promise>; /** diff --git a/x-pack/plugins/cases/server/client/cases/create.ts b/x-pack/plugins/cases/server/client/cases/create.ts index a8f9975fee39f..1d1a687ee9998 100644 --- a/x-pack/plugins/cases/server/client/cases/create.ts +++ b/x-pack/plugins/cases/server/client/cases/create.ts @@ -12,10 +12,10 @@ import { identity } from 'fp-ts/lib/function'; import { SavedObjectsUtils } from '@kbn/core/server'; -import type { CaseResponse, CasePostRequest } from '../../../common/api'; +import type { Case, CasePostRequest } from '../../../common/api'; import { throwErrors, - CaseResponseRt, + CaseRt, ActionTypes, CasePostRequestRt, excess, @@ -35,10 +35,7 @@ import { LICENSING_CASE_ASSIGNMENT_FEATURE } from '../../common/constants'; * * @ignore */ -export const create = async ( - data: CasePostRequest, - clientArgs: CasesClientArgs -): Promise => { +export const create = async (data: CasePostRequest, clientArgs: CasesClientArgs): Promise => { const { services: { caseService, userActionService, licensingService, notificationService }, user, @@ -129,7 +126,7 @@ export const create = async ( }); } - return CaseResponseRt.encode(flattenedCase); + return CaseRt.encode(flattenedCase); } catch (error) { throw createCaseError({ message: `Failed to create case: ${error}`, error, logger }); } diff --git a/x-pack/plugins/cases/server/client/cases/find.test.ts b/x-pack/plugins/cases/server/client/cases/find.test.ts index f23ad82df1fcf..bb0701647d8af 100644 --- a/x-pack/plugins/cases/server/client/cases/find.test.ts +++ b/x-pack/plugins/cases/server/client/cases/find.test.ts @@ -6,7 +6,7 @@ */ import { v1 as uuidv1 } from 'uuid'; -import type { CaseResponse } from '../../../common/api'; +import type { Case } from '../../../common/api'; import { flattenCaseSavedObject } from '../../common/utils'; import { mockCases } from '../../mocks'; @@ -16,7 +16,7 @@ import { find } from './find'; describe('find', () => { describe('constructSearch', () => { const clientArgs = createCasesClientMockArgs(); - const casesMap = new Map( + const casesMap = new Map( mockCases.map((obj) => { return [obj.id, flattenCaseSavedObject({ savedObject: obj, totalComment: 2 })]; }) diff --git a/x-pack/plugins/cases/server/client/cases/get.ts b/x-pack/plugins/cases/server/client/cases/get.ts index 669efc96c960c..88668f04f7f36 100644 --- a/x-pack/plugins/cases/server/client/cases/get.ts +++ b/x-pack/plugins/cases/server/client/cases/get.ts @@ -11,7 +11,7 @@ import { identity } from 'fp-ts/lib/function'; import type { SavedObjectsResolveResponse } from '@kbn/core/server'; import type { - CaseResponse, + Case, CaseResolveResponse, User, AllTagsFindRequest, @@ -22,7 +22,7 @@ import type { AttachmentTotals, } from '../../../common/api'; import { - CaseResponseRt, + CaseRt, CaseResolveResponseRt, AllTagsFindRequestRt, excess, @@ -37,7 +37,7 @@ import type { CasesClientArgs } from '..'; import { Operations } from '../../authorization'; import { combineAuthorizedAndOwnerFilter } from '../utils'; import { CasesService } from '../../services'; -import type { CaseSavedObject } from '../../common/types'; +import type { CaseSavedObjectTransformed } from '../../common/types/case'; /** * Parameters for finding cases IDs using an alert ID @@ -173,7 +173,7 @@ export interface GetParams { export const get = async ( { id, includeComments }: GetParams, clientArgs: CasesClientArgs -): Promise => { +): Promise => { const { services: { caseService }, logger, @@ -181,7 +181,7 @@ export const get = async ( } = clientArgs; try { - const theCase: CaseSavedObject = await caseService.getCase({ + const theCase: CaseSavedObjectTransformed = await caseService.getCase({ id, }); @@ -191,7 +191,7 @@ export const get = async ( }); if (!includeComments) { - return CaseResponseRt.encode( + return CaseRt.encode( flattenCaseSavedObject({ savedObject: theCase, }) @@ -206,7 +206,7 @@ export const get = async ( }, }); - return CaseResponseRt.encode( + return CaseRt.encode( flattenCaseSavedObject({ savedObject: theCase, comments: theComments.saved_objects, diff --git a/x-pack/plugins/cases/server/client/cases/push.ts b/x-pack/plugins/cases/server/client/cases/push.ts index 4f3ab74557278..da30764c45e4b 100644 --- a/x-pack/plugins/cases/server/client/cases/push.ts +++ b/x-pack/plugins/cases/server/client/cases/push.ts @@ -14,19 +14,13 @@ import type { SecurityPluginStart } from '@kbn/security-plugin/server'; import { asSavedObjectExecutionSource } from '@kbn/actions-plugin/server'; import type { ActionConnector, - CaseResponse, + Case, ExternalServiceResponse, CasesConfigureAttributes, CommentRequestAlertType, CommentAttributes, } from '../../../common/api'; -import { - CaseResponseRt, - CaseStatuses, - ActionTypes, - OWNER_FIELD, - CommentType, -} from '../../../common/api'; +import { CaseRt, CaseStatuses, ActionTypes, OWNER_FIELD, CommentType } from '../../../common/api'; import { CASE_COMMENT_SAVED_OBJECT, CASE_SAVED_OBJECT } from '../../../common/constants'; import { createIncident, getDurationInSeconds, getUserProfiles } from './utils'; @@ -103,7 +97,7 @@ export const push = async ( clientArgs: CasesClientArgs, casesClient: CasesClient, casesClientInternal: CasesClientInternal -): Promise => { +): Promise => { const { unsecuredSavedObjectsClient, services: { @@ -282,7 +276,7 @@ export const push = async ( /* End of update case with push information */ - return CaseResponseRt.encode( + return CaseRt.encode( flattenCaseSavedObject({ savedObject: { ...myCase, diff --git a/x-pack/plugins/cases/server/client/cases/update.ts b/x-pack/plugins/cases/server/client/cases/update.ts index f1f13c6ed362a..07423b4904685 100644 --- a/x-pack/plugins/cases/server/client/cases/update.ts +++ b/x-pack/plugins/cases/server/client/cases/update.ts @@ -25,15 +25,15 @@ import type { CaseAssignees, CaseAttributes, CasePatchRequest, - CaseResponse, + Case, CasesPatchRequest, - CasesResponse, + Cases, CommentAttributes, User, } from '../../../common/api'; import { CasesPatchRequestRt, - CasesResponseRt, + CasesRt, CaseStatuses, CommentType, excess, @@ -62,7 +62,7 @@ import { Operations } from '../../authorization'; import { dedupAssignees, getClosedInfoForUpdate, getDurationForUpdate } from './utils'; import { LICENSING_CASE_ASSIGNMENT_FEATURE } from '../../common/constants'; import type { LicensingService } from '../../services/licensing'; -import type { CaseSavedObject } from '../../common/types'; +import type { CaseSavedObjectTransformed } from '../../common/types/case'; /** * Throws an error if any of the requests attempt to update the owner of a case. @@ -257,7 +257,7 @@ async function updateAlerts({ } function partitionPatchRequest( - casesMap: Map, + casesMap: Map, patchReqCases: CasePatchRequest[] ): { nonExistingCases: CasePatchRequest[]; @@ -292,7 +292,7 @@ function partitionPatchRequest( interface UpdateRequestWithOriginalCase { updateReq: CasePatchRequest; - originalCase: CaseSavedObject; + originalCase: CaseSavedObjectTransformed; } /** @@ -303,7 +303,7 @@ interface UpdateRequestWithOriginalCase { export const update = async ( cases: CasesPatchRequest, clientArgs: CasesClientArgs -): Promise => { +): Promise => { const { services: { caseService, @@ -335,7 +335,7 @@ export const update = async ( const casesMap = myCases.saved_objects.reduce((acc, so) => { acc.set(so.id, so); return acc; - }, new Map()); + }, new Map()); const { nonExistingCases, conflictedCases, casesToAuthorize } = partitionPatchRequest( casesMap, @@ -442,7 +442,7 @@ export const update = async ( savedObject: mergeOriginalSOWithUpdatedSO(originalCase, updatedCase), }), ]; - }, [] as CaseResponse[]); + }, [] as Case[]); await userActionService.creator.bulkCreateUpdateCase({ originalCases: myCases.saved_objects, @@ -458,7 +458,7 @@ export const update = async ( await notificationService.bulkNotifyAssignees(casesAndAssigneesToNotifyForAssignment); - return CasesResponseRt.encode(returnUpdatedCase); + return CasesRt.encode(returnUpdatedCase); } catch (error) { const idVersions = cases.cases.map((caseInfo) => ({ id: caseInfo.id, @@ -521,11 +521,11 @@ const patchCases = async ({ const getCasesAndAssigneesToNotifyForAssignment = ( updatedCases: SavedObjectsBulkUpdateResponse, - casesMap: Map, + casesMap: Map, user: CasesClientArgs['user'] ) => { return updatedCases.saved_objects.reduce< - Array<{ assignees: CaseAssignees; theCase: CaseSavedObject }> + Array<{ assignees: CaseAssignees; theCase: CaseSavedObjectTransformed }> >((acc, updatedCase) => { const originalCaseSO = casesMap.get(updatedCase.id); @@ -554,9 +554,9 @@ const getCasesAndAssigneesToNotifyForAssignment = ( }; const mergeOriginalSOWithUpdatedSO = ( - originalSO: CaseSavedObject, + originalSO: CaseSavedObjectTransformed, updatedSO: SavedObjectsUpdateResponse -): CaseSavedObject => { +): CaseSavedObjectTransformed => { return { ...originalSO, ...updatedSO, diff --git a/x-pack/plugins/cases/server/client/cases/utils.ts b/x-pack/plugins/cases/server/client/cases/utils.ts index 069695587474c..5b43b4ae68766 100644 --- a/x-pack/plugins/cases/server/client/cases/utils.ts +++ b/x-pack/plugins/cases/server/client/cases/utils.ts @@ -15,7 +15,7 @@ import { isPushedUserAction } from '../../../common/utils/user_actions'; import type { ActionConnector, CaseFullExternalService, - CaseResponse, + Case, Comment, User, CaseAttributes, @@ -34,7 +34,7 @@ import { getCaseViewPath } from '../../common/utils'; import * as i18n from './translations'; interface CreateIncidentArgs { - theCase: CaseResponse; + theCase: Case; userActions: CaseUserActionsDeprecatedResponse; connector: ActionConnector; alerts: CasesClientGetAlertsResponse; @@ -106,7 +106,7 @@ interface CountAlertsInfo { } const getAlertsInfo = ( - comments: CaseResponse['comments'] + comments: Case['comments'] ): { totalAlerts: number; hasUnpushedAlertComments: boolean } => { const countingInfo = { totalComments: 0, pushed: 0, totalAlerts: 0 }; @@ -129,7 +129,7 @@ const getAlertsInfo = ( }; const addAlertMessage = (params: { - theCase: CaseResponse; + theCase: Case; externalServiceComments: ExternalServiceComment[]; spaceId: string; publicBaseUrl?: IBasePath['publicBaseUrl']; @@ -238,7 +238,7 @@ export const formatComments = ({ userProfiles, publicBaseUrl, }: { - theCase: CaseResponse; + theCase: Case; latestPushInfo: LatestPushInfo; userActions: CaseUserActionsDeprecatedResponse; spaceId: string; @@ -275,7 +275,7 @@ export const formatComments = ({ }; export const addKibanaInformationToDescription = ( - theCase: CaseResponse, + theCase: Case, spaceId: string, userProfiles?: Map, publicBaseUrl?: IBasePath['publicBaseUrl'] @@ -307,7 +307,7 @@ export const addKibanaInformationToDescription = ( }; const addKibanaInformationToComments = ( - comments: CaseResponse['comments'] = [], + comments: Case['comments'] = [], userProfiles?: Map ): ExternalServiceComment[] => comments.map((theComment) => { @@ -328,7 +328,7 @@ const addKibanaInformationToComments = ( }); export const getEntity = ( - entity: { createdBy: CaseResponse['created_by']; updatedBy: CaseResponse['updated_by'] }, + entity: { createdBy: Case['created_by']; updatedBy: Case['updated_by'] }, userProfiles?: Map ): string => { return ( diff --git a/x-pack/plugins/cases/server/client/metrics/actions/actions.test.ts b/x-pack/plugins/cases/server/client/metrics/actions/actions.test.ts index e8211662c1820..56c81a9a41d59 100644 --- a/x-pack/plugins/cases/server/client/metrics/actions/actions.test.ts +++ b/x-pack/plugins/cases/server/client/metrics/actions/actions.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import type { CaseResponse } from '../../../../common/api'; +import type { Case } from '../../../../common/api'; import { createCasesClientMock } from '../../mocks'; import type { CasesClientArgs } from '../../types'; import { loggingSystemMock } from '@kbn/core/server/mocks'; @@ -30,7 +30,7 @@ const constructorOptions = { caseId: 'test-id', casesClient: clientMock, clientA describe('Actions', () => { beforeAll(() => { getAuthorizationFilter.mockResolvedValue({}); - clientMock.cases.get.mockResolvedValue({ id: '' } as unknown as CaseResponse); + clientMock.cases.get.mockResolvedValue({ id: '' } as unknown as Case); }); beforeEach(() => { diff --git a/x-pack/plugins/cases/server/client/metrics/alerts/count.test.ts b/x-pack/plugins/cases/server/client/metrics/alerts/count.test.ts index 15209b1608194..9fa308f93049e 100644 --- a/x-pack/plugins/cases/server/client/metrics/alerts/count.test.ts +++ b/x-pack/plugins/cases/server/client/metrics/alerts/count.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import type { CaseResponse } from '../../../../common/api'; +import type { Case } from '../../../../common/api'; import { createCasesClientMock } from '../../mocks'; import type { CasesClientArgs } from '../../types'; import { loggingSystemMock } from '@kbn/core/server/mocks'; @@ -32,7 +32,7 @@ const constructorOptions = { caseId: 'test-id', casesClient: clientMock, clientA describe('AlertsCount', () => { beforeAll(() => { getAuthorizationFilter.mockResolvedValue({}); - clientMock.cases.get.mockResolvedValue({ id: 'test-id' } as unknown as CaseResponse); + clientMock.cases.get.mockResolvedValue({ id: 'test-id' } as unknown as Case); }); beforeEach(() => { diff --git a/x-pack/plugins/cases/server/client/metrics/all_cases/mttr.test.ts b/x-pack/plugins/cases/server/client/metrics/all_cases/mttr.test.ts index a13346d2ecfab..bff57ce82a176 100644 --- a/x-pack/plugins/cases/server/client/metrics/all_cases/mttr.test.ts +++ b/x-pack/plugins/cases/server/client/metrics/all_cases/mttr.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import type { CaseResponse } from '../../../../common/api'; +import type { Case } from '../../../../common/api'; import { createCasesClientMock } from '../../mocks'; import type { CasesClientArgs } from '../../types'; import { loggingSystemMock } from '@kbn/core/server/mocks'; @@ -32,7 +32,7 @@ const constructorOptions = { casesClient: clientMock, clientArgs }; describe('MTTR', () => { beforeAll(() => { getAuthorizationFilter.mockResolvedValue({}); - clientMock.cases.get.mockResolvedValue({ id: '' } as unknown as CaseResponse); + clientMock.cases.get.mockResolvedValue({ id: '' } as unknown as Case); }); beforeEach(() => { diff --git a/x-pack/plugins/cases/server/client/metrics/get_case_metrics.test.ts b/x-pack/plugins/cases/server/client/metrics/get_case_metrics.test.ts index 1fabee2893e06..023b951dcbf98 100644 --- a/x-pack/plugins/cases/server/client/metrics/get_case_metrics.test.ts +++ b/x-pack/plugins/cases/server/client/metrics/get_case_metrics.test.ts @@ -8,7 +8,7 @@ import { loggingSystemMock, savedObjectsClientMock } from '@kbn/core/server/mocks'; import { getCaseMetrics } from './get_case_metrics'; -import type { CaseResponse } from '../../../common/api'; +import type { Case } from '../../../common/api'; import { CaseStatuses } from '../../../common/api'; import type { CasesClientMock } from '../mocks'; import { createCasesClientMock } from '../mocks'; @@ -21,7 +21,7 @@ import { } from '../../services/mocks'; import { mockAlertsService } from './test_utils/alerts'; import { createStatusChangeSavedObject } from './test_utils/lifespan'; -import type { CaseSavedObject } from '../../common/types'; +import type { CaseSavedObjectTransformed } from '../../common/types/case'; describe('getCaseMetrics', () => { const inProgressStatusChangeTimestamp = new Date('2021-11-23T20:00:43Z'); @@ -164,7 +164,7 @@ function createMockClient() { return { created_at: '2021-11-23T19:59:43Z', closed_at: '2021-11-23T19:59:44Z', - } as unknown as CaseResponse; + } as unknown as Case; }); client.attachments.getAllAlertsAttachToCase.mockImplementation(async () => { @@ -191,7 +191,7 @@ function createMockClientArgs() { attributes: { owner: 'security', }, - } as unknown as CaseSavedObject; + } as unknown as CaseSavedObjectTransformed; }); const alertsService = mockAlertsService(); diff --git a/x-pack/plugins/cases/server/client/typedoc_interfaces.ts b/x-pack/plugins/cases/server/client/typedoc_interfaces.ts index a1aa86c8046a0..22359af185384 100644 --- a/x-pack/plugins/cases/server/client/typedoc_interfaces.ts +++ b/x-pack/plugins/cases/server/client/typedoc_interfaces.ts @@ -17,14 +17,14 @@ import type { AllCommentsResponse, CasePostRequest, CaseResolveResponse, - CaseResponse, + Case, CasesConfigurePatch, CasesConfigureRequest, CasesConfigureResponse, CasesFindRequest, CasesFindResponse, CasesPatchRequest, - CasesResponse, + Cases, CaseUserActionsResponse, Comments, CasesBulkGetResponse, @@ -38,9 +38,9 @@ import type { export interface ICasePostRequest extends CasePostRequest {} export interface ICasesFindRequest extends CasesFindRequest {} export interface ICasesPatchRequest extends CasesPatchRequest {} -export interface ICaseResponse extends CaseResponse {} +export interface ICaseResponse extends Case {} export interface ICaseResolveResponse extends CaseResolveResponse {} -export interface ICasesResponse extends CasesResponse {} +export interface ICasesResponse extends Cases {} export interface ICasesFindResponse extends CasesFindResponse {} export interface ICasesBulkGetResponse extends CasesBulkGetResponse {} diff --git a/x-pack/plugins/cases/server/client/utils.test.ts b/x-pack/plugins/cases/server/client/utils.test.ts index fb3e89b598b03..2b63f9c732105 100644 --- a/x-pack/plugins/cases/server/client/utils.test.ts +++ b/x-pack/plugins/cases/server/client/utils.test.ts @@ -12,7 +12,6 @@ import { toElasticsearchQuery } from '@kbn/es-query'; import { CaseStatuses } from '../../common'; import { CaseSeverity } from '../../common/api'; -import { ESCaseSeverity, ESCaseStatus } from '../services/cases/types'; import { createSavedObjectsSerializerMock } from './mocks'; import { arraysDifference, @@ -22,6 +21,7 @@ import { constructSearch, convertSortField, } from './utils'; +import { CasePersistedSeverity, CasePersistedStatus } from '../common/types/case'; describe('utils', () => { describe('convertSortField', () => { @@ -401,9 +401,9 @@ describe('utils', () => { }); it.each([ - [CaseStatuses.open, ESCaseStatus.OPEN], - [CaseStatuses['in-progress'], ESCaseStatus.IN_PROGRESS], - [CaseStatuses.closed, ESCaseStatus.CLOSED], + [CaseStatuses.open, CasePersistedStatus.OPEN], + [CaseStatuses['in-progress'], CasePersistedStatus.IN_PROGRESS], + [CaseStatuses.closed, CasePersistedStatus.CLOSED], ])('creates a filter for status "%s"', (status, expectedStatus) => { expect(constructQueryOptions({ status }).filter).toMatchInlineSnapshot(` Object { @@ -426,10 +426,10 @@ describe('utils', () => { }); it.each([ - [CaseSeverity.LOW, ESCaseSeverity.LOW], - [CaseSeverity.MEDIUM, ESCaseSeverity.MEDIUM], - [CaseSeverity.HIGH, ESCaseSeverity.HIGH], - [CaseSeverity.CRITICAL, ESCaseSeverity.CRITICAL], + [CaseSeverity.LOW, CasePersistedSeverity.LOW], + [CaseSeverity.MEDIUM, CasePersistedSeverity.MEDIUM], + [CaseSeverity.HIGH, CasePersistedSeverity.HIGH], + [CaseSeverity.CRITICAL, CasePersistedSeverity.CRITICAL], ])('creates a filter for severity "%s"', (severity, expectedSeverity) => { expect(constructQueryOptions({ severity }).filter).toMatchInlineSnapshot(` Object { diff --git a/x-pack/plugins/cases/server/common/constants.ts b/x-pack/plugins/cases/server/common/constants.ts index 822907b83be39..69c1f3e619c97 100644 --- a/x-pack/plugins/cases/server/common/constants.ts +++ b/x-pack/plugins/cases/server/common/constants.ts @@ -7,7 +7,7 @@ import { CaseSeverity, CaseStatuses } from '../../common/api'; import { CASE_COMMENT_SAVED_OBJECT, CASE_SAVED_OBJECT } from '../../common/constants'; -import { ESCaseSeverity, ESCaseStatus } from '../services/cases/types'; +import { CasePersistedSeverity, CasePersistedStatus } from './types/case'; /** * The name of the saved object reference indicating the action connector ID. This is stored in the Saved Object reference @@ -40,28 +40,28 @@ export const EXTERNAL_REFERENCE_REF_NAME = 'externalReferenceId'; */ export const LICENSING_CASE_ASSIGNMENT_FEATURE = 'Cases user assignment'; -export const SEVERITY_EXTERNAL_TO_ESMODEL: Record = { - [CaseSeverity.LOW]: ESCaseSeverity.LOW, - [CaseSeverity.MEDIUM]: ESCaseSeverity.MEDIUM, - [CaseSeverity.HIGH]: ESCaseSeverity.HIGH, - [CaseSeverity.CRITICAL]: ESCaseSeverity.CRITICAL, +export const SEVERITY_EXTERNAL_TO_ESMODEL: Record = { + [CaseSeverity.LOW]: CasePersistedSeverity.LOW, + [CaseSeverity.MEDIUM]: CasePersistedSeverity.MEDIUM, + [CaseSeverity.HIGH]: CasePersistedSeverity.HIGH, + [CaseSeverity.CRITICAL]: CasePersistedSeverity.CRITICAL, }; -export const SEVERITY_ESMODEL_TO_EXTERNAL: Record = { - [ESCaseSeverity.LOW]: CaseSeverity.LOW, - [ESCaseSeverity.MEDIUM]: CaseSeverity.MEDIUM, - [ESCaseSeverity.HIGH]: CaseSeverity.HIGH, - [ESCaseSeverity.CRITICAL]: CaseSeverity.CRITICAL, +export const SEVERITY_ESMODEL_TO_EXTERNAL: Record = { + [CasePersistedSeverity.LOW]: CaseSeverity.LOW, + [CasePersistedSeverity.MEDIUM]: CaseSeverity.MEDIUM, + [CasePersistedSeverity.HIGH]: CaseSeverity.HIGH, + [CasePersistedSeverity.CRITICAL]: CaseSeverity.CRITICAL, }; -export const STATUS_EXTERNAL_TO_ESMODEL: Record = { - [CaseStatuses.open]: ESCaseStatus.OPEN, - [CaseStatuses['in-progress']]: ESCaseStatus.IN_PROGRESS, - [CaseStatuses.closed]: ESCaseStatus.CLOSED, +export const STATUS_EXTERNAL_TO_ESMODEL: Record = { + [CaseStatuses.open]: CasePersistedStatus.OPEN, + [CaseStatuses['in-progress']]: CasePersistedStatus.IN_PROGRESS, + [CaseStatuses.closed]: CasePersistedStatus.CLOSED, }; -export const STATUS_ESMODEL_TO_EXTERNAL: Record = { - [ESCaseStatus.OPEN]: CaseStatuses.open, - [ESCaseStatus.IN_PROGRESS]: CaseStatuses['in-progress'], - [ESCaseStatus.CLOSED]: CaseStatuses.closed, +export const STATUS_ESMODEL_TO_EXTERNAL: Record = { + [CasePersistedStatus.OPEN]: CaseStatuses.open, + [CasePersistedStatus.IN_PROGRESS]: CaseStatuses['in-progress'], + [CasePersistedStatus.CLOSED]: CaseStatuses.closed, }; diff --git a/x-pack/plugins/cases/server/common/models/case_with_comments.ts b/x-pack/plugins/cases/server/common/models/case_with_comments.ts index 2febbd22da77f..93d4c04261f52 100644 --- a/x-pack/plugins/cases/server/common/models/case_with_comments.ts +++ b/x-pack/plugins/cases/server/common/models/case_with_comments.ts @@ -13,26 +13,21 @@ import type { SavedObjectsUpdateResponse, } from '@kbn/core/server'; import type { - CaseResponse, + Case, CommentAttributes, CommentPatchRequest, CommentRequest, CommentRequestUserType, CommentRequestAlertType, } from '../../../common/api'; -import { - CaseResponseRt, - CaseStatuses, - CommentType, - ActionTypes, - Actions, -} from '../../../common/api'; +import { CaseRt, CaseStatuses, CommentType, ActionTypes, Actions } from '../../../common/api'; import { CASE_SAVED_OBJECT, MAX_DOCS_PER_PAGE } from '../../../common/constants'; import type { CasesClientArgs } from '../../client'; import type { RefreshSetting } from '../../services/types'; import { createCaseError } from '../error'; import { AttachmentLimitChecker } from '../limiter_checker'; -import type { AlertInfo, CaseSavedObject } from '../types'; +import type { AlertInfo } from '../types'; +import type { CaseSavedObjectTransformed } from '../types/case'; import { countAlertsForID, flattenCommentSavedObjects, @@ -51,9 +46,9 @@ type CommentRequestWithId = Array<{ id: string } & CommentRequest>; */ export class CaseCommentModel { private readonly params: CaseCommentModelParams; - private readonly caseInfo: CaseSavedObject; + private readonly caseInfo: CaseSavedObjectTransformed; - private constructor(caseInfo: CaseSavedObject, params: CaseCommentModelParams) { + private constructor(caseInfo: CaseSavedObjectTransformed, params: CaseCommentModelParams) { this.caseInfo = caseInfo; this.params = params; } @@ -69,7 +64,7 @@ export class CaseCommentModel { return new CaseCommentModel(savedObject, options); } - public get savedObject(): CaseSavedObject { + public get savedObject(): CaseSavedObjectTransformed { return this.caseInfo; } @@ -179,7 +174,7 @@ export class CaseCommentModel { } } - private newObjectWithInfo(caseInfo: CaseSavedObject): CaseCommentModel { + private newObjectWithInfo(caseInfo: CaseSavedObjectTransformed): CaseCommentModel { return new CaseCommentModel(caseInfo, this.params); } @@ -434,7 +429,7 @@ export class CaseCommentModel { }; } - public async encodeWithComments(): Promise { + public async encodeWithComments(): Promise { try { const comments = await this.params.services.caseService.getAllCaseComments({ id: this.caseInfo.id, @@ -453,7 +448,7 @@ export class CaseCommentModel { ...this.formatForEncoding(comments.total), }; - return CaseResponseRt.encode(caseResponse); + return CaseRt.encode(caseResponse); } catch (error) { throw createCaseError({ message: `Failed encoding the commentable case, case id: ${this.caseInfo.id}: ${error}`, diff --git a/x-pack/plugins/cases/server/common/types.ts b/x-pack/plugins/cases/server/common/types.ts index 0f4d64f60dfa6..a622126f0b305 100644 --- a/x-pack/plugins/cases/server/common/types.ts +++ b/x-pack/plugins/cases/server/common/types.ts @@ -5,14 +5,13 @@ * 2.0. */ +import type { SavedObjectsFindOptions } from '@kbn/core-saved-objects-api-server'; import type { SavedObject } from '@kbn/core-saved-objects-server'; import type { KueryNode } from '@kbn/es-query'; import type { - CaseAttributes, CommentAttributes, CommentRequestExternalReferenceSOType, FileAttachmentMetadata, - SavedObjectFindOptions, } from '../../common/api'; /** @@ -23,12 +22,25 @@ export interface AlertInfo { index: string; } -export type SavedObjectFindOptionsKueryNode = Omit & { +type FindOptions = Pick< + SavedObjectsFindOptions, + | 'defaultSearchOperator' + | 'hasReferenceOperator' + | 'perPage' + | 'hasReference' + | 'fields' + | 'page' + | 'search' + | 'searchFields' + | 'sortField' + | 'sortOrder' + | 'rootSearchFields' +>; + +export type SavedObjectFindOptionsKueryNode = FindOptions & { filter?: KueryNode; }; -export type CaseSavedObject = SavedObject; - export type FileAttachmentRequest = Omit< CommentRequestExternalReferenceSOType, 'externalReferenceMetadata' diff --git a/x-pack/plugins/cases/server/common/types/attachments.ts b/x-pack/plugins/cases/server/common/types/attachments.ts new file mode 100644 index 0000000000000..55b9990c5fb12 --- /dev/null +++ b/x-pack/plugins/cases/server/common/types/attachments.ts @@ -0,0 +1,48 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { JsonValue } from '@kbn/utility-types'; +import type { User } from './user'; + +interface AttachmentCommonPersistedAttributes { + created_at: string; + created_by: User; + owner: string; + pushed_at: string | null; + pushed_by: User | null; + updated_at: string | null; + updated_by: User | null; +} + +export interface AttachmentRequestAttributes { + type: string; + alertId?: string | string[]; + index?: string | string[]; + rule?: { + id: string | null; + name: string | null; + }; + comment?: string; + actions?: { + targets: Array<{ + hostname: string; + endpointId: string; + }>; + type: string; + }; + externalReferenceMetadata?: Record | null; + externalReferenceAttachmentTypeId?: string; + externalReferenceStorage?: { + type: string; + soType?: string; + }; + persistableStateAttachmentState?: Record; + persistableStateAttachmentTypeId?: string; +} + +export type AttachmentPersistedAttributes = AttachmentRequestAttributes & + AttachmentCommonPersistedAttributes; diff --git a/x-pack/plugins/cases/server/common/types/case.ts b/x-pack/plugins/cases/server/common/types/case.ts new file mode 100644 index 0000000000000..8e425853964c0 --- /dev/null +++ b/x-pack/plugins/cases/server/common/types/case.ts @@ -0,0 +1,52 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { SavedObject } from '@kbn/core-saved-objects-server'; +import type { CaseAttributes } from '../../../common/api'; +import type { ConnectorPersisted } from './connectors'; +import type { ExternalServicePersisted } from './external_service'; +import type { User, UserProfile } from './user'; + +export enum CasePersistedSeverity { + LOW = 0, + MEDIUM = 10, + HIGH = 20, + CRITICAL = 30, +} + +export enum CasePersistedStatus { + OPEN = 0, + IN_PROGRESS = 10, + CLOSED = 20, +} + +export interface CasePersistedAttributes { + assignees: UserProfile[]; + closed_at: string | null; + closed_by: User | null; + created_at: string; + created_by: User; + connector: ConnectorPersisted; + description: string; + duration: number | null; + external_service: ExternalServicePersisted | null; + owner: string; + settings: { syncAlerts: boolean }; + severity: CasePersistedSeverity; + status: CasePersistedStatus; + tags: string[]; + title: string; + total_alerts: number; + total_comments: number; + updated_at: string | null; + updated_by: User | null; +} + +export type CaseTransformedAttributes = CaseAttributes; + +export type CaseSavedObject = SavedObject; +export type CaseSavedObjectTransformed = SavedObject; diff --git a/x-pack/plugins/cases/server/common/types/configure.ts b/x-pack/plugins/cases/server/common/types/configure.ts new file mode 100644 index 0000000000000..0018d50b702b5 --- /dev/null +++ b/x-pack/plugins/cases/server/common/types/configure.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { ConnectorPersisted } from './connectors'; +import type { User } from './user'; + +export interface ConfigurePersistedAttributes { + connector: ConnectorPersisted; + closure_type: string; + owner: string; + created_at: string; + created_by: User; + updated_at: string | null; + updated_by: User | null; +} diff --git a/x-pack/plugins/lens/public/shared_components/field_picker/index.ts b/x-pack/plugins/cases/server/common/types/connector_mappings.ts similarity index 60% rename from x-pack/plugins/lens/public/shared_components/field_picker/index.ts rename to x-pack/plugins/cases/server/common/types/connector_mappings.ts index f434f885f44d4..d4f20075745f2 100644 --- a/x-pack/plugins/lens/public/shared_components/field_picker/index.ts +++ b/x-pack/plugins/cases/server/common/types/connector_mappings.ts @@ -5,6 +5,11 @@ * 2.0. */ -export { FieldPicker } from './field_picker'; -export { TruncatedLabel } from './truncated_label'; -export type { FieldOptionValue, FieldOption } from './types'; +export interface ConnectorMappingsPersistedAttributes { + mappings: Array<{ + action_type: string; + source: string; + target: string; + }>; + owner: string; +} diff --git a/x-pack/plugins/cases/server/common/types/connectors.ts b/x-pack/plugins/cases/server/common/types/connectors.ts new file mode 100644 index 0000000000000..995130260f8cd --- /dev/null +++ b/x-pack/plugins/cases/server/common/types/connectors.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export type ConnectorPersistedFields = Array<{ + key: string; + value: unknown; +}>; + +export interface ConnectorPersisted { + name: string; + type: string; + fields: ConnectorPersistedFields | null; +} diff --git a/x-pack/plugins/cases/server/common/types/external_service.ts b/x-pack/plugins/cases/server/common/types/external_service.ts new file mode 100644 index 0000000000000..187e088114eed --- /dev/null +++ b/x-pack/plugins/cases/server/common/types/external_service.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { User } from './user'; + +export interface ExternalServicePersisted { + connector_name: string; + external_id: string; + external_title: string; + external_url: string; + pushed_at: string; + pushed_by: User; +} diff --git a/x-pack/plugins/cases/server/common/types/user.ts b/x-pack/plugins/cases/server/common/types/user.ts new file mode 100644 index 0000000000000..fa32986ef8d97 --- /dev/null +++ b/x-pack/plugins/cases/server/common/types/user.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export interface User { + email: string | null | undefined; + full_name: string | null | undefined; + username: string | null | undefined; + profile_uid?: string; +} + +export interface UserProfile { + uid: string; +} diff --git a/x-pack/plugins/cases/server/common/types/user_actions.ts b/x-pack/plugins/cases/server/common/types/user_actions.ts new file mode 100644 index 0000000000000..bc5366a2adaa8 --- /dev/null +++ b/x-pack/plugins/cases/server/common/types/user_actions.ts @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { User } from './user'; + +interface UserActionCommonPersistedAttributes { + action: string; + created_at: string; + created_by: User; + owner: string; +} + +export interface UserActionPersistedAttributes extends UserActionCommonPersistedAttributes { + type: string; + payload: Record; +} diff --git a/x-pack/plugins/cases/server/common/utils.test.ts b/x-pack/plugins/cases/server/common/utils.test.ts index 684fe426d7dc5..c2ef8281a5887 100644 --- a/x-pack/plugins/cases/server/common/utils.test.ts +++ b/x-pack/plugins/cases/server/common/utils.test.ts @@ -10,7 +10,7 @@ import { makeLensEmbeddableFactory } from '@kbn/lens-plugin/server/embeddable/ma import { OWNER_INFO, SECURITY_SOLUTION_OWNER } from '../../common/constants'; import type { CaseConnector, - CaseResponse, + Case, CommentAttributes, CommentRequest, CommentRequestUserType, @@ -256,7 +256,7 @@ describe('common utils', () => { describe('transformCases', () => { it('transforms correctly', () => { - const casesMap = new Map( + const casesMap = new Map( mockCases.map((obj) => { return [obj.id, flattenCaseSavedObject({ savedObject: obj, totalComment: 2 })]; }) diff --git a/x-pack/plugins/cases/server/common/utils.ts b/x-pack/plugins/cases/server/common/utils.ts index 47a546ab9374a..988c38a9c0795 100644 --- a/x-pack/plugins/cases/server/common/utils.ts +++ b/x-pack/plugins/cases/server/common/utils.ts @@ -24,18 +24,16 @@ import { OWNER_INFO, } from '../../common/constants'; import type { CASE_VIEW_PAGE_TABS } from '../../common/types'; -import type { AlertInfo, CaseSavedObject, FileAttachmentRequest } from './types'; +import type { AlertInfo, FileAttachmentRequest } from './types'; import type { - CaseAttributes, CasePostRequest, - CaseResponse, + Case, CasesFindResponse, CommentAttributes, CommentRequest, CommentRequestActionsType, CommentRequestAlertType, - CommentRequestExternalReferenceSOType, CommentRequestUserType, Comment, Comments, @@ -46,7 +44,6 @@ import { CaseStatuses, CommentType, ConnectorTypes, - ExternalReferenceStorageType, ExternalReferenceSORt, FileAttachmentMetadataRt, } from '../../common/api'; @@ -56,6 +53,7 @@ import { getLensVisualizations, } from '../../common/utils/markdown_plugins/utils'; import { dedupAssignees } from '../client/cases/utils'; +import type { CaseSavedObjectTransformed, CaseTransformedAttributes } from './types/case'; /** * Default sort field for querying saved objects. @@ -73,7 +71,7 @@ export const transformNewCase = ({ }: { user: User; newCase: CasePostRequest; -}): CaseAttributes => ({ +}): CaseTransformedAttributes => ({ ...newCase, duration: null, severity: newCase.severity ?? CaseSeverity.LOW, @@ -97,7 +95,7 @@ export const transformCases = ({ perPage, total, }: { - casesMap: Map; + casesMap: Map; countOpenCases: number; countInProgressCases: number; countClosedCases: number; @@ -120,11 +118,11 @@ export const flattenCaseSavedObject = ({ totalComment = comments.length, totalAlerts = 0, }: { - savedObject: CaseSavedObject; + savedObject: CaseSavedObjectTransformed; comments?: Array>; totalComment?: number; totalAlerts?: number; -}): CaseResponse => ({ +}): Case => ({ id: savedObject.id, version: savedObject.version ?? '0', comments: flattenCommentSavedObjects(comments), @@ -254,18 +252,6 @@ export const isCommentRequestTypeAlert = ( return context.type === CommentType.alert; }; -/** - * A type narrowing function for external reference so attachments. - */ -export const isCommentRequestTypeExternalReferenceSO = ( - context: Partial -): context is CommentRequestExternalReferenceSOType => { - return ( - context.type === CommentType.externalReference && - context.externalReferenceStorage?.type === ExternalReferenceStorageType.savedObject - ); -}; - /** * A type narrowing function for file attachments. */ diff --git a/x-pack/plugins/cases/server/connectors/jira/format.test.ts b/x-pack/plugins/cases/server/connectors/jira/format.test.ts index 7ddabdf5e2ff1..acca9c7886ec2 100644 --- a/x-pack/plugins/cases/server/connectors/jira/format.test.ts +++ b/x-pack/plugins/cases/server/connectors/jira/format.test.ts @@ -5,14 +5,14 @@ * 2.0. */ -import type { CaseResponse } from '../../../common/api'; +import type { Case } from '../../../common/api'; import { format } from './format'; describe('Jira formatter', () => { const theCase = { tags: ['tag'], connector: { fields: { priority: 'High', issueType: 'Task', parent: null } }, - } as CaseResponse; + } as Case; it('it formats correctly', async () => { const res = await format(theCase, []); @@ -20,7 +20,7 @@ describe('Jira formatter', () => { }); it('it formats correctly when fields do not exist ', async () => { - const invalidFields = { tags: ['tag'], connector: { fields: null } } as CaseResponse; + const invalidFields = { tags: ['tag'], connector: { fields: null } } as Case; const res = await format(invalidFields, []); expect(res).toEqual({ priority: null, issueType: null, parent: null, labels: theCase.tags }); }); diff --git a/x-pack/plugins/cases/server/connectors/resilient/format.test.ts b/x-pack/plugins/cases/server/connectors/resilient/format.test.ts index cd850bd28fe37..29ab88e09c388 100644 --- a/x-pack/plugins/cases/server/connectors/resilient/format.test.ts +++ b/x-pack/plugins/cases/server/connectors/resilient/format.test.ts @@ -5,13 +5,13 @@ * 2.0. */ -import type { CaseResponse } from '../../../common/api'; +import type { Case } from '../../../common/api'; import { format } from './format'; describe('IBM Resilient formatter', () => { const theCase = { connector: { fields: { incidentTypes: ['2'], severityCode: '2' } }, - } as CaseResponse; + } as Case; it('it formats correctly', async () => { const res = await format(theCase, []); @@ -19,7 +19,7 @@ describe('IBM Resilient formatter', () => { }); it('it formats correctly when fields do not exist ', async () => { - const invalidFields = { tags: ['a tag'], connector: { fields: null } } as CaseResponse; + const invalidFields = { tags: ['a tag'], connector: { fields: null } } as Case; const res = await format(invalidFields, []); expect(res).toEqual({ incidentTypes: null, severityCode: null }); }); diff --git a/x-pack/plugins/cases/server/connectors/servicenow/itsm_format.test.ts b/x-pack/plugins/cases/server/connectors/servicenow/itsm_format.test.ts index 8db9ba7df4859..0edec51ce4f48 100644 --- a/x-pack/plugins/cases/server/connectors/servicenow/itsm_format.test.ts +++ b/x-pack/plugins/cases/server/connectors/servicenow/itsm_format.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import type { CaseResponse } from '../../../common/api'; +import type { Case } from '../../../common/api'; import { format } from './itsm_format'; describe('ITSM formatter', () => { @@ -14,7 +14,7 @@ describe('ITSM formatter', () => { connector: { fields: { severity: '2', urgency: '2', impact: '2', category: 'software', subcategory: 'os' }, }, - } as CaseResponse; + } as Case; it('it formats correctly', async () => { const res = await format(theCase, []); @@ -26,7 +26,7 @@ describe('ITSM formatter', () => { }); it('it formats correctly when fields do not exist ', async () => { - const invalidFields = { connector: { fields: null } } as CaseResponse; + const invalidFields = { connector: { fields: null } } as Case; const res = await format(invalidFields, []); expect(res).toEqual({ severity: null, diff --git a/x-pack/plugins/cases/server/connectors/servicenow/sir_format.test.ts b/x-pack/plugins/cases/server/connectors/servicenow/sir_format.test.ts index 6697aad205b92..23d14ec6b2d75 100644 --- a/x-pack/plugins/cases/server/connectors/servicenow/sir_format.test.ts +++ b/x-pack/plugins/cases/server/connectors/servicenow/sir_format.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import type { CaseResponse } from '../../../common/api'; +import type { Case } from '../../../common/api'; import { format } from './sir_format'; describe('SIR formatter', () => { @@ -22,7 +22,7 @@ describe('SIR formatter', () => { priority: '2 - High', }, }, - } as CaseResponse; + } as Case; it('it formats correctly without alerts', async () => { const res = await format(theCase, []); @@ -40,7 +40,7 @@ describe('SIR formatter', () => { }); it('it formats correctly when fields do not exist ', async () => { - const invalidFields = { connector: { fields: null } } as CaseResponse; + const invalidFields = { connector: { fields: null } } as Case; const res = await format(invalidFields, []); expect(res).toEqual({ dest_ip: [], @@ -159,7 +159,7 @@ describe('SIR formatter', () => { const newCase = { ...theCase, connector: { fields: { ...theCase.connector.fields, destIp: false, malwareHash: false } }, - } as CaseResponse; + } as Case; const res = await format(newCase, alerts); expect(res).toEqual({ diff --git a/x-pack/plugins/cases/server/connectors/swimlane/format.test.ts b/x-pack/plugins/cases/server/connectors/swimlane/format.test.ts index d3500c5f9e18e..116b0eef1027c 100644 --- a/x-pack/plugins/cases/server/connectors/swimlane/format.test.ts +++ b/x-pack/plugins/cases/server/connectors/swimlane/format.test.ts @@ -5,14 +5,14 @@ * 2.0. */ -import type { CaseResponse } from '../../../common/api'; +import type { Case } from '../../../common/api'; import { format } from './format'; describe('Swimlane formatter', () => { const theCase = { id: 'case-id', connector: { fields: null }, - } as CaseResponse; + } as Case; it('it formats correctly', async () => { const res = await format(theCase, []); diff --git a/x-pack/plugins/cases/server/connectors/types.ts b/x-pack/plugins/cases/server/connectors/types.ts index b4cb6af0ddde9..c1f1480d359b1 100644 --- a/x-pack/plugins/cases/server/connectors/types.ts +++ b/x-pack/plugins/cases/server/connectors/types.ts @@ -6,7 +6,7 @@ */ import type { Logger } from '@kbn/core/server'; -import type { CaseResponse, ConnectorMappingsAttributes } from '../../common/api'; +import type { Case, ConnectorMappingsAttributes } from '../../common/api'; import type { CasesClientGetAlertsResponse } from '../client/alerts/types'; import type { CasesClientFactory } from '../client/factory'; import type { RegisterActionType } from '../types'; @@ -21,7 +21,7 @@ export interface RegisterConnectorsArgs extends GetActionTypeParams { } export interface ICasesConnector { - format: (theCase: CaseResponse, alerts: CasesClientGetAlertsResponse) => TExternalServiceParams; + format: (theCase: Case, alerts: CasesClientGetAlertsResponse) => TExternalServiceParams; getMapping: () => ConnectorMappingsAttributes[]; } diff --git a/x-pack/plugins/cases/server/mocks.ts b/x-pack/plugins/cases/server/mocks.ts index 823acef076fe3..8cef503691bcb 100644 --- a/x-pack/plugins/cases/server/mocks.ts +++ b/x-pack/plugins/cases/server/mocks.ts @@ -6,14 +6,14 @@ */ import type { SavedObject } from '@kbn/core/server'; -import type { CaseSavedObject } from './common/types'; import type { CasePostRequest, CommentAttributes } from '../common/api'; import { CaseSeverity, CaseStatuses, CommentType, ConnectorTypes } from '../common/api'; import { SECURITY_SOLUTION_OWNER } from '../common/constants'; import type { CasesStart } from './types'; import { createCasesClientMock } from './client/mocks'; +import type { CaseSavedObjectTransformed } from './common/types/case'; -export const mockCases: CaseSavedObject[] = [ +export const mockCases: CaseSavedObjectTransformed[] = [ { type: 'cases', id: 'mock-id-1', diff --git a/x-pack/plugins/cases/server/saved_object_types/cases.ts b/x-pack/plugins/cases/server/saved_object_types/cases.ts index 2a9492b6c755f..a4f0cdc7b02de 100644 --- a/x-pack/plugins/cases/server/saved_object_types/cases.ts +++ b/x-pack/plugins/cases/server/saved_object_types/cases.ts @@ -14,7 +14,7 @@ import type { SavedObjectsType, } from '@kbn/core/server'; import { CASE_SAVED_OBJECT } from '../../common/constants'; -import type { ESCaseAttributes } from '../services/cases/types'; +import type { CasePersistedAttributes } from '../common/types/case'; import { handleExport } from './import_export/export'; import { caseMigrations } from './migrations'; @@ -195,10 +195,10 @@ export const createCaseSavedObjectType = ( importableAndExportable: true, defaultSearchField: 'title', icon: 'casesApp', - getTitle: (savedObject: SavedObject) => savedObject.attributes.title, + getTitle: (savedObject: SavedObject) => savedObject.attributes.title, onExport: async ( context: SavedObjectsExportTransformContext, - objects: Array> + objects: Array> ) => handleExport({ context, objects, coreSetup, logger }), }, }); diff --git a/x-pack/plugins/cases/server/saved_object_types/import_export/export.ts b/x-pack/plugins/cases/server/saved_object_types/import_export/export.ts index 0fe7b51385981..703036c216058 100644 --- a/x-pack/plugins/cases/server/saved_object_types/import_export/export.ts +++ b/x-pack/plugins/cases/server/saved_object_types/import_export/export.ts @@ -25,7 +25,7 @@ import { } from '../../../common/constants'; import { defaultSortField } from '../../common/utils'; import { createCaseError } from '../../common/error'; -import type { ESCaseAttributes } from '../../services/cases/types'; +import type { CasePersistedAttributes } from '../../common/types/case'; export async function handleExport({ context, @@ -34,13 +34,15 @@ export async function handleExport({ logger, }: { context: SavedObjectsExportTransformContext; - objects: Array>; + objects: Array>; coreSetup: CoreSetup; logger: Logger; }): Promise< Array< SavedObject< - ESCaseAttributes | CommentAttributesWithoutRefs | CaseUserActionAttributesWithoutConnectorId + | CasePersistedAttributes + | CommentAttributesWithoutRefs + | CaseUserActionAttributesWithoutConnectorId > > > { diff --git a/x-pack/plugins/cases/server/saved_object_types/migrations/cases.test.ts b/x-pack/plugins/cases/server/saved_object_types/migrations/cases.test.ts index 5b2eb65080682..bb6c5f1130bda 100644 --- a/x-pack/plugins/cases/server/saved_object_types/migrations/cases.test.ts +++ b/x-pack/plugins/cases/server/saved_object_types/migrations/cases.test.ts @@ -9,8 +9,8 @@ import type { SavedObjectSanitizedDoc, SavedObjectUnsanitizedDoc } from '@kbn/co import type { CaseAttributes, CaseFullExternalService } from '../../../common/api'; import { CaseSeverity, CaseStatuses, ConnectorTypes, NONE_CONNECTOR_ID } from '../../../common/api'; import { CASE_SAVED_OBJECT } from '../../../common/constants'; +import { CasePersistedSeverity, CasePersistedStatus } from '../../common/types/case'; import { getNoneCaseConnector } from '../../common/utils'; -import { ESCaseSeverity, ESCaseStatus } from '../../services/cases/types'; import type { ESCaseConnectorWithId } from '../../services/test_utils'; import { createExternalService } from '../../services/test_utils'; import { @@ -585,10 +585,10 @@ describe('case migrations', () => { describe('update severity', () => { it.each([ - [CaseSeverity.LOW, ESCaseSeverity.LOW], - [CaseSeverity.MEDIUM, ESCaseSeverity.MEDIUM], - [CaseSeverity.HIGH, ESCaseSeverity.HIGH], - [CaseSeverity.CRITICAL, ESCaseSeverity.CRITICAL], + [CaseSeverity.LOW, CasePersistedSeverity.LOW], + [CaseSeverity.MEDIUM, CasePersistedSeverity.MEDIUM], + [CaseSeverity.HIGH, CasePersistedSeverity.HIGH], + [CaseSeverity.CRITICAL, CasePersistedSeverity.CRITICAL], ])( 'migrates "%s" severity keyword value to matching short', (oldSeverityValue, expectedSeverityValue) => { @@ -624,7 +624,7 @@ describe('case migrations', () => { ...doc, attributes: { ...doc.attributes, - severity: ESCaseSeverity.LOW, + severity: CasePersistedSeverity.LOW, }, references: [], }); @@ -633,9 +633,9 @@ describe('case migrations', () => { describe('update status', () => { it.each([ - [CaseStatuses.open, ESCaseStatus.OPEN], - [CaseStatuses['in-progress'], ESCaseStatus.IN_PROGRESS], - [CaseStatuses.closed, ESCaseStatus.CLOSED], + [CaseStatuses.open, CasePersistedStatus.OPEN], + [CaseStatuses['in-progress'], CasePersistedStatus.IN_PROGRESS], + [CaseStatuses.closed, CasePersistedStatus.CLOSED], ])( 'migrates "%s" status keyword value to matching short', (oldStatusValue, expectedStatusValue) => { @@ -671,7 +671,7 @@ describe('case migrations', () => { ...doc, attributes: { ...doc.attributes, - status: ESCaseStatus.OPEN, + status: CasePersistedStatus.OPEN, }, references: [], }); diff --git a/x-pack/plugins/cases/server/saved_object_types/migrations/cases.ts b/x-pack/plugins/cases/server/saved_object_types/migrations/cases.ts index 38f91952f1469..6b78ab04d90ed 100644 --- a/x-pack/plugins/cases/server/saved_object_types/migrations/cases.ts +++ b/x-pack/plugins/cases/server/saved_object_types/migrations/cases.ts @@ -11,7 +11,6 @@ import { cloneDeep, unset, flow } from 'lodash'; import type { SavedObjectUnsanitizedDoc, SavedObjectSanitizedDoc } from '@kbn/core/server'; import type { SanitizedCaseOwner } from '.'; import { addOwnerToSO } from '.'; -import type { ESConnectorFields } from '../../services'; import type { CaseAttributes } from '../../../common/api'; import { CaseSeverity, ConnectorTypes } from '../../../common/api'; @@ -27,7 +26,8 @@ import { } from './user_actions/connector_id'; import { CASE_TYPE_INDIVIDUAL } from './constants'; import { pipeMigrations } from './utils'; -import { ESCaseSeverity, ESCaseStatus } from '../../services/cases/types'; +import type { ConnectorPersistedFields } from '../../common/types/connectors'; +import { CasePersistedSeverity, CasePersistedStatus } from '../../common/types/case'; interface UnsanitizedCaseConnector { connector_id: string; @@ -38,7 +38,7 @@ interface SanitizedCaseConnector { id: string; name: string | null; type: string | null; - fields: null | ESConnectorFields; + fields: null | ConnectorPersistedFields; }; } @@ -137,8 +137,11 @@ export const addAssignees = ( export const convertSeverity = ( doc: SavedObjectUnsanitizedDoc -): SavedObjectSanitizedDoc & { severity: ESCaseSeverity }> => { - const severity = SEVERITY_EXTERNAL_TO_ESMODEL[doc.attributes.severity] ?? ESCaseSeverity.LOW; +): SavedObjectSanitizedDoc< + Omit & { severity: CasePersistedSeverity } +> => { + const severity = + SEVERITY_EXTERNAL_TO_ESMODEL[doc.attributes.severity] ?? CasePersistedSeverity.LOW; return { ...doc, attributes: { ...doc.attributes, severity }, @@ -148,8 +151,8 @@ export const convertSeverity = ( export const convertStatus = ( doc: SavedObjectUnsanitizedDoc -): SavedObjectSanitizedDoc & { status: ESCaseStatus }> => { - const status = STATUS_EXTERNAL_TO_ESMODEL[doc.attributes?.status] ?? ESCaseStatus.OPEN; +): SavedObjectSanitizedDoc & { status: CasePersistedStatus }> => { + const status = STATUS_EXTERNAL_TO_ESMODEL[doc.attributes?.status] ?? CasePersistedStatus.OPEN; return { ...doc, attributes: { ...doc.attributes, status }, diff --git a/x-pack/plugins/cases/server/saved_object_types/migrations/comments.ts b/x-pack/plugins/cases/server/saved_object_types/migrations/comments.ts index b3978b6e12ef6..02afa01bf49c3 100644 --- a/x-pack/plugins/cases/server/saved_object_types/migrations/comments.ts +++ b/x-pack/plugins/cases/server/saved_object_types/migrations/comments.ts @@ -17,7 +17,6 @@ import type { } from '@kbn/core/server'; import { mergeSavedObjectMigrationMaps } from '@kbn/core/server'; import type { LensServerPluginSetup } from '@kbn/lens-plugin/server'; -import type { CommentAttributes } from '../../../common/api'; import { CommentType } from '../../../common/api'; import type { LensMarkdownNode, MarkdownNode } from '../../../common/utils/markdown_plugins/utils'; import { @@ -32,6 +31,7 @@ import { GENERATED_ALERT, SUB_CASE_SAVED_OBJECT } from './constants'; import type { PersistableStateAttachmentTypeRegistry } from '../../attachment_framework/persistable_state_registry'; import { getAllPersistableAttachmentMigrations } from './get_all_persistable_attachment_migrations'; import type { PersistableStateAttachmentState } from '../../attachment_framework/types'; +import type { AttachmentPersistedAttributes } from '../../common/types/attachments'; interface UnsanitizedComment { comment: string; @@ -71,7 +71,7 @@ export const createCommentsMigrations = ( const persistableStateAttachmentMigrations = mapValues< MigrateFunctionsObject, - SavedObjectMigrationFn + SavedObjectMigrationFn >( getAllPersistableAttachmentMigrations(migrationDeps.persistableStateAttachmentTypeRegistry), migratePersistableStateAttachments @@ -134,8 +134,10 @@ export const createCommentsMigrations = ( }; export const migratePersistableStateAttachments = - (migrate: MigrateFunction): SavedObjectMigrationFn => - (doc: SavedObjectUnsanitizedDoc) => { + ( + migrate: MigrateFunction + ): SavedObjectMigrationFn => + (doc: SavedObjectUnsanitizedDoc) => { if (doc.attributes.type !== CommentType.persistableState) { return doc; } diff --git a/x-pack/plugins/cases/server/saved_object_types/migrations/configuration.test.ts b/x-pack/plugins/cases/server/saved_object_types/migrations/configuration.test.ts index 9d46e90bca17f..b4a3c962dabad 100644 --- a/x-pack/plugins/cases/server/saved_object_types/migrations/configuration.test.ts +++ b/x-pack/plugins/cases/server/saved_object_types/migrations/configuration.test.ts @@ -13,9 +13,9 @@ import { CASE_CONFIGURE_SAVED_OBJECT, SECURITY_SOLUTION_OWNER } from '../../../c import { CONNECTOR_ID_REFERENCE_NAME } from '../../common/constants'; import { getNoneCaseConnector } from '../../common/utils'; import type { ESCaseConnectorWithId } from '../../services/test_utils'; -import type { ESCasesConfigureAttributes } from '../../services/configure/types'; import type { UnsanitizedConfigureConnector } from './configuration'; import { createConnectorAttributeMigration, configureConnectorIdMigration } from './configuration'; +import type { ConfigurePersistedAttributes } from '../../common/types/configure'; // eslint-disable-next-line @typescript-eslint/naming-convention const create_7_14_0_configSchema = (connector?: ESCaseConnectorWithId) => ({ @@ -135,7 +135,7 @@ describe('configuration migrations', () => { const migratedConnector = configureConnectorIdMigration( configureSavedObject - ) as SavedObjectSanitizedDoc; + ) as SavedObjectSanitizedDoc; expect(migratedConnector.references.length).toBe(0); expect(migratedConnector.attributes.connector).not.toHaveProperty('id'); @@ -146,7 +146,7 @@ describe('configuration migrations', () => { const migratedConnector = configureConnectorIdMigration( configureSavedObject - ) as SavedObjectSanitizedDoc; + ) as SavedObjectSanitizedDoc; expect(migratedConnector.references.length).toBe(0); expect(migratedConnector.attributes.connector).toMatchInlineSnapshot(` @@ -168,7 +168,7 @@ describe('configuration migrations', () => { const migratedConnector = configureConnectorIdMigration( configureSavedObject - ) as SavedObjectSanitizedDoc; + ) as SavedObjectSanitizedDoc; expect(migratedConnector.references).toEqual([ { id: '123', type: ACTION_SAVED_OBJECT_TYPE, name: CONNECTOR_ID_REFERENCE_NAME }, @@ -181,7 +181,7 @@ describe('configuration migrations', () => { const migratedConnector = configureConnectorIdMigration( configureSavedObject - ) as SavedObjectSanitizedDoc; + ) as SavedObjectSanitizedDoc; expect(migratedConnector).toMatchInlineSnapshot(` Object { diff --git a/x-pack/plugins/cases/server/services/attachments/index.ts b/x-pack/plugins/cases/server/services/attachments/index.ts index bde31a375ec72..e76b93ce0e5b9 100644 --- a/x-pack/plugins/cases/server/services/attachments/index.ts +++ b/x-pack/plugins/cases/server/services/attachments/index.ts @@ -7,20 +7,14 @@ import type { SavedObject, - SavedObjectReference, SavedObjectsBulkResponse, SavedObjectsBulkUpdateResponse, SavedObjectsFindResponse, - SavedObjectsUpdateOptions, SavedObjectsUpdateResponse, } from '@kbn/core/server'; import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; -import type { - CommentAttributes as AttachmentAttributes, - CommentAttributesWithoutRefs as AttachmentAttributesWithoutRefs, - CommentPatchAttributes as AttachmentPatchAttributes, -} from '../../../common/api'; +import type { CommentAttributes as AttachmentAttributes } from '../../../common/api'; import { CommentType } from '../../../common/api'; import { CASE_COMMENT_SAVED_OBJECT, CASE_SAVED_OBJECT } from '../../../common/constants'; import { buildFilter, combineFilters } from '../../client/utils'; @@ -32,50 +26,19 @@ import { injectAttachmentSOAttributesFromRefsForPatch, } from '../so_references'; import type { SavedObjectFindOptionsKueryNode } from '../../common/types'; -import type { IndexRefresh } from '../types'; -import type { AttachedToCaseArgs, ServiceContext } from './types'; +import type { + AlertsAttachedToCaseArgs, + AttachmentsAttachedToCaseArgs, + BulkCreateAttachments, + BulkUpdateAttachmentArgs, + CountActionsAttachedToCaseArgs, + CreateAttachmentArgs, + DeleteAttachmentArgs, + ServiceContext, + UpdateAttachmentArgs, +} from './types'; import { AttachmentGetter } from './operations/get'; - -type AlertsAttachedToCaseArgs = AttachedToCaseArgs; - -interface AttachmentsAttachedToCaseArgs extends AttachedToCaseArgs { - attachmentType: CommentType; - aggregations: Record; -} - -interface CountActionsAttachedToCaseArgs extends AttachedToCaseArgs { - aggregations: Record; -} - -interface DeleteAttachmentArgs extends IndexRefresh { - attachmentIds: string[]; -} - -interface CreateAttachmentArgs extends IndexRefresh { - attributes: AttachmentAttributes; - references: SavedObjectReference[]; - id: string; -} - -interface BulkCreateAttachments extends IndexRefresh { - attachments: Array<{ - attributes: AttachmentAttributes; - references: SavedObjectReference[]; - id: string; - }>; -} - -interface UpdateArgs { - attachmentId: string; - updatedAttributes: AttachmentPatchAttributes; - options?: Omit, 'upsert'>; -} - -export type UpdateAttachmentArgs = UpdateArgs; - -interface BulkUpdateAttachmentArgs extends IndexRefresh { - comments: UpdateArgs[]; -} +import type { AttachmentPersistedAttributes } from '../../common/types/attachments'; export class AttachmentService { private readonly _getter: AttachmentGetter; @@ -136,10 +99,7 @@ export class AttachmentService { const combinedFilter = combineFilters([attachmentFilter, filter]); - const response = await this.context.unsecuredSavedObjectsClient.find< - AttachmentAttributes, - Agg - >({ + const response = await this.context.unsecuredSavedObjectsClient.find({ type: CASE_COMMENT_SAVED_OBJECT, hasReference: { type: CASE_SAVED_OBJECT, id: caseId }, page: 1, @@ -207,7 +167,7 @@ export class AttachmentService { ); const attachment = - await this.context.unsecuredSavedObjectsClient.create( + await this.context.unsecuredSavedObjectsClient.create( CASE_COMMENT_SAVED_OBJECT, extractedAttributes, { @@ -234,7 +194,7 @@ export class AttachmentService { try { this.context.log.debug(`Attempting to bulk create attachments`); const res = - await this.context.unsecuredSavedObjectsClient.bulkCreate( + await this.context.unsecuredSavedObjectsClient.bulkCreate( attachments.map((attachment) => { const { attributes: extractedAttributes, references: extractedReferences } = extractAttachmentSORefsFromAttributes( @@ -288,7 +248,7 @@ export class AttachmentService { const shouldUpdateRefs = extractedReferences.length > 0 || didDeleteOperation; const res = - await this.context.unsecuredSavedObjectsClient.update( + await this.context.unsecuredSavedObjectsClient.update( CASE_COMMENT_SAVED_OBJECT, attachmentId, extractedAttributes, @@ -325,7 +285,7 @@ export class AttachmentService { ); const res = - await this.context.unsecuredSavedObjectsClient.bulkUpdate( + await this.context.unsecuredSavedObjectsClient.bulkUpdate( comments.map((c) => { const { attributes: extractedAttributes, @@ -380,7 +340,7 @@ export class AttachmentService { try { this.context.log.debug(`Attempting to find comments`); const res = - await this.context.unsecuredSavedObjectsClient.find({ + await this.context.unsecuredSavedObjectsClient.find({ sortField: defaultSortField, ...options, type: CASE_COMMENT_SAVED_OBJECT, diff --git a/x-pack/plugins/cases/server/services/attachments/operations/get.ts b/x-pack/plugins/cases/server/services/attachments/operations/get.ts index 3db7059b3977b..4aa5c65ebdcc1 100644 --- a/x-pack/plugins/cases/server/services/attachments/operations/get.ts +++ b/x-pack/plugins/cases/server/services/attachments/operations/get.ts @@ -8,6 +8,7 @@ import type { SavedObject } from '@kbn/core/server'; import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { FILE_SO_TYPE } from '@kbn/files-plugin/common'; +import type { AttachmentPersistedAttributes } from '../../../common/types/attachments'; import { CASE_COMMENT_SAVED_OBJECT, CASE_SAVED_OBJECT, @@ -19,13 +20,12 @@ import type { AttachmentTotals, AttributesTypeAlerts, CommentAttributes as AttachmentAttributes, - CommentAttributesWithoutRefs as AttachmentAttributesWithoutRefs, - CommentAttributes, } from '../../../../common/api'; import { CommentType } from '../../../../common/api'; import type { - AttachedToCaseArgs, + AlertIdsAggsResult, BulkOptionalAttributes, + GetAllAlertsAttachToCaseArgs, GetAttachmentArgs, ServiceContext, } from '../types'; @@ -37,29 +37,19 @@ import { partitionByCaseAssociation } from '../../../common/partitioning'; import type { AttachmentSavedObject } from '../../../common/types'; import { getCaseReferenceId } from '../../../common/references'; -type GetAllAlertsAttachToCaseArgs = AttachedToCaseArgs; - -interface AlertIdsAggsResult { - alertIds: { - buckets: Array<{ - key: string; - }>; - }; -} - export class AttachmentGetter { constructor(private readonly context: ServiceContext) {} public async bulkGet( attachmentIds: string[] - ): Promise> { + ): Promise> { try { this.context.log.debug( `Attempting to retrieve attachments with ids: ${attachmentIds.join()}` ); const response = - await this.context.unsecuredSavedObjectsClient.bulkGet( + await this.context.unsecuredSavedObjectsClient.bulkGet( attachmentIds.map((id) => ({ id, type: CASE_COMMENT_SAVED_OBJECT })) ); @@ -85,7 +75,9 @@ export class AttachmentGetter { `Attempting to retrieve attachments associated with cases: [${caseIds}]` ); - const finder = this.context.unsecuredSavedObjectsClient.createPointInTimeFinder({ + // We are intentionally not adding the type here because we only want to interact with the id and this function + // should not use the attributes + const finder = this.context.unsecuredSavedObjectsClient.createPointInTimeFinder({ type: CASE_COMMENT_SAVED_OBJECT, hasReference: caseIds.map((id) => ({ id, type: CASE_SAVED_OBJECT })), sortField: 'created_at', @@ -133,18 +125,24 @@ export class AttachmentGetter { const combinedFilter = combineFilters([alertsFilter, filter]); const finder = - this.context.unsecuredSavedObjectsClient.createPointInTimeFinder({ - type: CASE_COMMENT_SAVED_OBJECT, - hasReference: { type: CASE_SAVED_OBJECT, id: caseId }, - sortField: 'created_at', - sortOrder: 'asc', - filter: combinedFilter, - perPage: MAX_DOCS_PER_PAGE, - }); + this.context.unsecuredSavedObjectsClient.createPointInTimeFinder( + { + type: CASE_COMMENT_SAVED_OBJECT, + hasReference: { type: CASE_SAVED_OBJECT, id: caseId }, + sortField: 'created_at', + sortOrder: 'asc', + filter: combinedFilter, + perPage: MAX_DOCS_PER_PAGE, + } + ); let result: Array> = []; for await (const userActionSavedObject of finder.find()) { - result = result.concat(userActionSavedObject.saved_objects); + result = result.concat( + // We need a cast here because to limited attachment type conflicts with the expected result even though they + // should be the same + userActionSavedObject.saved_objects as unknown as Array> + ); } return result; @@ -197,11 +195,10 @@ export class AttachmentGetter { }: GetAttachmentArgs): Promise> { try { this.context.log.debug(`Attempting to GET attachment ${attachmentId}`); - const res = - await this.context.unsecuredSavedObjectsClient.get( - CASE_COMMENT_SAVED_OBJECT, - attachmentId - ); + const res = await this.context.unsecuredSavedObjectsClient.get( + CASE_COMMENT_SAVED_OBJECT, + attachmentId + ); return injectAttachmentSOAttributesFromRefs( res, @@ -305,7 +302,7 @@ export class AttachmentGetter { }: { caseId: string; fileIds: string[]; - }): Promise>> { + }): Promise>> { try { this.context.log.debug('Attempting to find file attachments'); @@ -324,7 +321,7 @@ export class AttachmentGetter { * to retrieve them all. */ const finder = - this.context.unsecuredSavedObjectsClient.createPointInTimeFinder( + this.context.unsecuredSavedObjectsClient.createPointInTimeFinder( { type: CASE_COMMENT_SAVED_OBJECT, hasReference: references, @@ -334,7 +331,7 @@ export class AttachmentGetter { } ); - const foundAttachments: Array> = []; + const foundAttachments: Array> = []; for await (const attachmentSavedObjects of finder.find()) { foundAttachments.push( diff --git a/x-pack/plugins/cases/server/services/attachments/types.ts b/x-pack/plugins/cases/server/services/attachments/types.ts index 554ba8afb049b..dbf9075031d83 100644 --- a/x-pack/plugins/cases/server/services/attachments/types.ts +++ b/x-pack/plugins/cases/server/services/attachments/types.ts @@ -5,15 +5,24 @@ * 2.0. */ +import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import type { Logger, SavedObject, + SavedObjectReference, SavedObjectsBulkResponse, SavedObjectsClientContract, + SavedObjectsUpdateOptions, } from '@kbn/core/server'; import type { KueryNode } from '@kbn/es-query'; +import type { CommentType } from '../../../common'; +import type { + CommentAttributes as AttachmentAttributes, + CommentPatchAttributes as AttachmentPatchAttributes, +} from '../../../common/api'; import type { PersistableStateAttachmentTypeRegistry } from '../../attachment_framework/persistable_state_registry'; import type { PartialField } from '../../types'; +import type { IndexRefresh } from '../types'; export interface ServiceContext { log: Logger; @@ -36,3 +45,54 @@ export interface BulkOptionalAttributes extends Omit, 'saved_objects'> { saved_objects: Array>; } + +export type GetAllAlertsAttachToCaseArgs = AttachedToCaseArgs; + +export interface AlertIdsAggsResult { + alertIds: { + buckets: Array<{ + key: string; + }>; + }; +} + +export type AlertsAttachedToCaseArgs = AttachedToCaseArgs; + +export interface AttachmentsAttachedToCaseArgs extends AttachedToCaseArgs { + attachmentType: CommentType; + aggregations: Record; +} + +export interface CountActionsAttachedToCaseArgs extends AttachedToCaseArgs { + aggregations: Record; +} + +export interface DeleteAttachmentArgs extends IndexRefresh { + attachmentIds: string[]; +} + +export interface CreateAttachmentArgs extends IndexRefresh { + attributes: AttachmentAttributes; + references: SavedObjectReference[]; + id: string; +} + +export interface BulkCreateAttachments extends IndexRefresh { + attachments: Array<{ + attributes: AttachmentAttributes; + references: SavedObjectReference[]; + id: string; + }>; +} + +export interface UpdateArgs { + attachmentId: string; + updatedAttributes: AttachmentPatchAttributes; + options?: Omit, 'upsert'>; +} + +export type UpdateAttachmentArgs = UpdateArgs; + +export interface BulkUpdateAttachmentArgs extends IndexRefresh { + comments: UpdateArgs[]; +} diff --git a/x-pack/plugins/cases/server/services/cases/index.test.ts b/x-pack/plugins/cases/server/services/cases/index.test.ts index c84d4df964157..c0039529ffc91 100644 --- a/x-pack/plugins/cases/server/services/cases/index.test.ts +++ b/x-pack/plugins/cases/server/services/cases/index.test.ts @@ -41,11 +41,10 @@ import { basicCaseFields, createSOFindResponse, } from '../test_utils'; -import type { ESCaseAttributes } from './types'; -import { ESCaseSeverity, ESCaseStatus } from './types'; import { AttachmentService } from '../attachments'; import { PersistableStateAttachmentTypeRegistry } from '../../attachment_framework/persistable_state_registry'; -import type { CaseSavedObject } from '../../common/types'; +import type { CaseSavedObjectTransformed, CasePersistedAttributes } from '../../common/types/case'; +import { CasePersistedSeverity, CasePersistedStatus } from '../../common/types/case'; const createUpdateSOResponse = ({ connector, @@ -55,15 +54,15 @@ const createUpdateSOResponse = ({ }: { connector?: ESCaseConnectorWithId; externalService?: CaseFullExternalService; - severity?: ESCaseSeverity; - status?: ESCaseStatus; -} = {}): SavedObjectsUpdateResponse => { + severity?: CasePersistedSeverity; + status?: CasePersistedStatus; +} = {}): SavedObjectsUpdateResponse => { const references: SavedObjectReference[] = createSavedObjectReferences({ connector, externalService, }); - let attributes: Partial = { total_alerts: -1, total_comments: -1 }; + let attributes: Partial = { total_alerts: -1, total_comments: -1 }; if (connector) { const { id, ...restConnector } = connector; @@ -95,9 +94,9 @@ const createFindSO = ( params: { connector?: ESCaseConnectorWithId; externalService?: CaseFullExternalService; - overrides?: Partial; + overrides?: Partial; } = {} -): SavedObjectsFindResult => ({ +): SavedObjectsFindResult => ({ ...createCaseSavedObjectResponse(params), score: 0, }); @@ -174,7 +173,7 @@ describe('CasesService', () => { describe('patch', () => { it('includes the passed in fields', async () => { unsecuredSavedObjectsClient.update.mockResolvedValue( - {} as SavedObjectsUpdateResponse + {} as SavedObjectsUpdateResponse ); await service.patchCase({ @@ -185,14 +184,14 @@ describe('CasesService', () => { severity: CaseSeverity.CRITICAL, status: CaseStatuses['in-progress'], }), - originalCase: {} as CaseSavedObject, + originalCase: {} as CaseSavedObjectTransformed, }); const { connector: ignoreConnector, external_service: ignoreExternalService, ...restUpdateAttributes - } = unsecuredSavedObjectsClient.update.mock.calls[0][2] as Partial; + } = unsecuredSavedObjectsClient.update.mock.calls[0][2] as Partial; expect(restUpdateAttributes).toMatchInlineSnapshot(` Object { "assignees": Array [], @@ -228,7 +227,7 @@ describe('CasesService', () => { it('transforms the connector.fields to an array of key/value pairs', async () => { unsecuredSavedObjectsClient.update.mockResolvedValue( - {} as SavedObjectsUpdateResponse + {} as SavedObjectsUpdateResponse ); await service.patchCase({ @@ -237,11 +236,11 @@ describe('CasesService', () => { connector: createJiraConnector(), externalService: createExternalService(), }), - originalCase: {} as CaseSavedObject, + originalCase: {} as CaseSavedObjectTransformed, }); const { connector } = unsecuredSavedObjectsClient.update.mock - .calls[0][2] as Partial; + .calls[0][2] as Partial; expect(connector?.fields).toMatchInlineSnapshot(` Array [ Object { @@ -262,7 +261,7 @@ describe('CasesService', () => { it('preserves the connector fields but does not have the id', async () => { unsecuredSavedObjectsClient.update.mockResolvedValue( - {} as SavedObjectsUpdateResponse + {} as SavedObjectsUpdateResponse ); await service.patchCase({ @@ -271,11 +270,11 @@ describe('CasesService', () => { connector: createJiraConnector(), externalService: createExternalService(), }), - originalCase: {} as CaseSavedObject, + originalCase: {} as CaseSavedObjectTransformed, }); const { connector } = unsecuredSavedObjectsClient.update.mock - .calls[0][2] as Partial; + .calls[0][2] as Partial; expect(connector).toMatchInlineSnapshot(` Object { "fields": Array [ @@ -300,17 +299,17 @@ describe('CasesService', () => { it('removes the connector id and adds it to the references', async () => { unsecuredSavedObjectsClient.update.mockResolvedValue( - {} as SavedObjectsUpdateResponse + {} as SavedObjectsUpdateResponse ); await service.patchCase({ caseId: '1', updatedAttributes: createCaseUpdateParams({ connector: createJiraConnector() }), - originalCase: {} as CaseSavedObject, + originalCase: {} as CaseSavedObjectTransformed, }); const updateAttributes = unsecuredSavedObjectsClient.update.mock - .calls[0][2] as Partial; + .calls[0][2] as Partial; expect(updateAttributes.connector).not.toHaveProperty('id'); const updateOptions = unsecuredSavedObjectsClient.update.mock @@ -328,7 +327,7 @@ describe('CasesService', () => { it('removes the external_service connector_id and adds it to the references', async () => { unsecuredSavedObjectsClient.update.mockResolvedValue( - {} as SavedObjectsUpdateResponse + {} as SavedObjectsUpdateResponse ); await service.patchCase({ @@ -337,11 +336,11 @@ describe('CasesService', () => { connector: getNoneCaseConnector(), externalService: createExternalService(), }), - originalCase: {} as CaseSavedObject, + originalCase: {} as CaseSavedObjectTransformed, }); const updateAttributes = unsecuredSavedObjectsClient.update.mock - .calls[0][2] as Partial; + .calls[0][2] as Partial; expect(updateAttributes.external_service).not.toHaveProperty('connector_id'); const updateOptions = unsecuredSavedObjectsClient.update.mock @@ -359,7 +358,7 @@ describe('CasesService', () => { it('builds references for external service connector id, case connector id, and includes the existing references', async () => { unsecuredSavedObjectsClient.update.mockResolvedValue( - {} as SavedObjectsUpdateResponse + {} as SavedObjectsUpdateResponse ); await service.patchCase({ @@ -370,7 +369,7 @@ describe('CasesService', () => { }), originalCase: { references: [{ id: 'a', name: 'awesome', type: 'hello' }], - } as CaseSavedObject, + } as CaseSavedObjectTransformed, }); const updateOptions = unsecuredSavedObjectsClient.update.mock @@ -398,7 +397,7 @@ describe('CasesService', () => { it('builds references for connector_id and preserves the existing connector.id reference', async () => { unsecuredSavedObjectsClient.update.mockResolvedValue( - {} as SavedObjectsUpdateResponse + {} as SavedObjectsUpdateResponse ); await service.patchCase({ @@ -408,7 +407,7 @@ describe('CasesService', () => { references: [ { id: '1', name: CONNECTOR_ID_REFERENCE_NAME, type: ACTION_SAVED_OBJECT_TYPE }, ], - } as CaseSavedObject, + } as CaseSavedObjectTransformed, }); const updateOptions = unsecuredSavedObjectsClient.update.mock @@ -431,7 +430,7 @@ describe('CasesService', () => { it('preserves the external_service fields except for the connector_id', async () => { unsecuredSavedObjectsClient.update.mockResolvedValue( - {} as SavedObjectsUpdateResponse + {} as SavedObjectsUpdateResponse ); await service.patchCase({ @@ -440,11 +439,11 @@ describe('CasesService', () => { connector: getNoneCaseConnector(), externalService: createExternalService(), }), - originalCase: {} as CaseSavedObject, + originalCase: {} as CaseSavedObjectTransformed, }); const updateAttributes = unsecuredSavedObjectsClient.update.mock - .calls[0][2] as Partial; + .calls[0][2] as Partial; expect(updateAttributes.external_service).toMatchInlineSnapshot(` Object { "connector_name": ".jira", @@ -463,13 +462,13 @@ describe('CasesService', () => { it('creates an empty updatedAttributes when there is no connector or external_service as input', async () => { unsecuredSavedObjectsClient.update.mockResolvedValue( - {} as SavedObjectsUpdateResponse + {} as SavedObjectsUpdateResponse ); await service.patchCase({ caseId: '1', updatedAttributes: createCaseUpdateParams({}), - originalCase: {} as CaseSavedObject, + originalCase: {} as CaseSavedObjectTransformed, }); expect(unsecuredSavedObjectsClient.update.mock.calls[0][2]).toMatchInlineSnapshot( @@ -482,13 +481,13 @@ describe('CasesService', () => { it('creates a updatedAttributes field with the none connector', async () => { unsecuredSavedObjectsClient.update.mockResolvedValue( - {} as SavedObjectsUpdateResponse + {} as SavedObjectsUpdateResponse ); await service.patchCase({ caseId: '1', updatedAttributes: createCaseUpdateParams({ connector: getNoneCaseConnector() }), - originalCase: {} as CaseSavedObject, + originalCase: {} as CaseSavedObjectTransformed, }); expect(unsecuredSavedObjectsClient.update.mock.calls[0][2]).toMatchInlineSnapshot(` @@ -503,49 +502,49 @@ describe('CasesService', () => { }); it.each([ - [CaseSeverity.LOW, ESCaseSeverity.LOW], - [CaseSeverity.MEDIUM, ESCaseSeverity.MEDIUM], - [CaseSeverity.HIGH, ESCaseSeverity.HIGH], - [CaseSeverity.CRITICAL, ESCaseSeverity.CRITICAL], + [CaseSeverity.LOW, CasePersistedSeverity.LOW], + [CaseSeverity.MEDIUM, CasePersistedSeverity.MEDIUM], + [CaseSeverity.HIGH, CasePersistedSeverity.HIGH], + [CaseSeverity.CRITICAL, CasePersistedSeverity.CRITICAL], ])( 'properly converts "%s" severity to corresponding ES value on updating SO', async (patchParamsSeverity, expectedSeverity) => { unsecuredSavedObjectsClient.update.mockResolvedValue( - {} as SavedObjectsUpdateResponse + {} as SavedObjectsUpdateResponse ); await service.patchCase({ caseId: '1', updatedAttributes: createCaseUpdateParams({ severity: patchParamsSeverity }), - originalCase: {} as CaseSavedObject, + originalCase: {} as CaseSavedObjectTransformed, }); const patchAttributes = unsecuredSavedObjectsClient.update.mock - .calls[0][2] as ESCaseAttributes; + .calls[0][2] as CasePersistedAttributes; expect(patchAttributes.severity).toEqual(expectedSeverity); } ); it.each([ - [CaseStatuses.open, ESCaseStatus.OPEN], - [CaseStatuses['in-progress'], ESCaseStatus.IN_PROGRESS], - [CaseStatuses.closed, ESCaseStatus.CLOSED], + [CaseStatuses.open, CasePersistedStatus.OPEN], + [CaseStatuses['in-progress'], CasePersistedStatus.IN_PROGRESS], + [CaseStatuses.closed, CasePersistedStatus.CLOSED], ])( 'properly converts "%s" status to corresponding ES value on updating SO', async (patchParamsStatus, expectedStatus) => { unsecuredSavedObjectsClient.update.mockResolvedValue( - {} as SavedObjectsUpdateResponse + {} as SavedObjectsUpdateResponse ); await service.patchCase({ caseId: '1', updatedAttributes: createCaseUpdateParams({ status: patchParamsStatus }), - originalCase: {} as CaseSavedObject, + originalCase: {} as CaseSavedObjectTransformed, }); const patchAttributes = unsecuredSavedObjectsClient.update.mock - .calls[0][2] as ESCaseAttributes; + .calls[0][2] as CasePersistedAttributes; expect(patchAttributes.status).toEqual(expectedStatus); } @@ -571,7 +570,7 @@ describe('CasesService', () => { connector: getNoneCaseConnector(), severity: CaseSeverity.LOW, }), - originalCase: {} as CaseSavedObject, + originalCase: {} as CaseSavedObjectTransformed, }, { caseId: '2', @@ -579,7 +578,7 @@ describe('CasesService', () => { connector: getNoneCaseConnector(), severity: CaseSeverity.MEDIUM, }), - originalCase: {} as CaseSavedObject, + originalCase: {} as CaseSavedObjectTransformed, }, { caseId: '3', @@ -587,7 +586,7 @@ describe('CasesService', () => { connector: getNoneCaseConnector(), severity: CaseSeverity.HIGH, }), - originalCase: {} as CaseSavedObject, + originalCase: {} as CaseSavedObjectTransformed, }, { caseId: '4', @@ -595,18 +594,18 @@ describe('CasesService', () => { connector: getNoneCaseConnector(), severity: CaseSeverity.CRITICAL, }), - originalCase: {} as CaseSavedObject, + originalCase: {} as CaseSavedObjectTransformed, }, ], }); const patchResults = unsecuredSavedObjectsClient.bulkUpdate.mock - .calls[0][0] as unknown as Array>; + .calls[0][0] as unknown as Array>; - expect(patchResults[0].attributes.severity).toEqual(ESCaseSeverity.LOW); - expect(patchResults[1].attributes.severity).toEqual(ESCaseSeverity.MEDIUM); - expect(patchResults[2].attributes.severity).toEqual(ESCaseSeverity.HIGH); - expect(patchResults[3].attributes.severity).toEqual(ESCaseSeverity.CRITICAL); + expect(patchResults[0].attributes.severity).toEqual(CasePersistedSeverity.LOW); + expect(patchResults[1].attributes.severity).toEqual(CasePersistedSeverity.MEDIUM); + expect(patchResults[2].attributes.severity).toEqual(CasePersistedSeverity.HIGH); + expect(patchResults[3].attributes.severity).toEqual(CasePersistedSeverity.CRITICAL); }); it('properly converts status to corresponding ES value on bulk updating SO', async () => { @@ -626,7 +625,7 @@ describe('CasesService', () => { connector: getNoneCaseConnector(), status: CaseStatuses.open, }), - originalCase: {} as CaseSavedObject, + originalCase: {} as CaseSavedObjectTransformed, }, { caseId: '2', @@ -634,7 +633,7 @@ describe('CasesService', () => { connector: getNoneCaseConnector(), status: CaseStatuses['in-progress'], }), - originalCase: {} as CaseSavedObject, + originalCase: {} as CaseSavedObjectTransformed, }, { caseId: '3', @@ -642,23 +641,25 @@ describe('CasesService', () => { connector: getNoneCaseConnector(), status: CaseStatuses.closed, }), - originalCase: {} as CaseSavedObject, + originalCase: {} as CaseSavedObjectTransformed, }, ], }); const patchResults = unsecuredSavedObjectsClient.bulkUpdate.mock - .calls[0][0] as unknown as Array>; + .calls[0][0] as unknown as Array>; - expect(patchResults[0].attributes.status).toEqual(ESCaseStatus.OPEN); - expect(patchResults[1].attributes.status).toEqual(ESCaseStatus.IN_PROGRESS); - expect(patchResults[2].attributes.status).toEqual(ESCaseStatus.CLOSED); + expect(patchResults[0].attributes.status).toEqual(CasePersistedStatus.OPEN); + expect(patchResults[1].attributes.status).toEqual(CasePersistedStatus.IN_PROGRESS); + expect(patchResults[2].attributes.status).toEqual(CasePersistedStatus.CLOSED); }); }); describe('post', () => { it('creates a null external_service field when the attribute was null in the creation parameters', async () => { - unsecuredSavedObjectsClient.create.mockResolvedValue({} as SavedObject); + unsecuredSavedObjectsClient.create.mockResolvedValue( + {} as SavedObject + ); await service.postNewCase({ attributes: createCasePostParams({ connector: createJiraConnector() }), @@ -671,7 +672,9 @@ describe('CasesService', () => { }); it('includes the creation attributes excluding the connector.id and connector_id', async () => { - unsecuredSavedObjectsClient.create.mockResolvedValue({} as SavedObject); + unsecuredSavedObjectsClient.create.mockResolvedValue( + {} as SavedObject + ); await service.postNewCase({ attributes: createCasePostParams({ @@ -682,7 +685,7 @@ describe('CasesService', () => { }); const creationAttributes = unsecuredSavedObjectsClient.create.mock - .calls[0][1] as ESCaseAttributes; + .calls[0][1] as CasePersistedAttributes; expect(creationAttributes.connector).not.toHaveProperty('id'); expect(creationAttributes.external_service).not.toHaveProperty('connector_id'); expect(creationAttributes).toMatchInlineSnapshot(` @@ -769,7 +772,9 @@ describe('CasesService', () => { }); it('includes default values for total_alerts and total_comments', async () => { - unsecuredSavedObjectsClient.create.mockResolvedValue({} as SavedObject); + unsecuredSavedObjectsClient.create.mockResolvedValue( + {} as SavedObject + ); await service.postNewCase({ attributes: createCasePostParams({ @@ -779,14 +784,16 @@ describe('CasesService', () => { }); const postAttributes = unsecuredSavedObjectsClient.create.mock - .calls[0][1] as ESCaseAttributes; + .calls[0][1] as CasePersistedAttributes; expect(postAttributes.total_alerts).toEqual(-1); expect(postAttributes.total_comments).toEqual(-1); }); it('moves the connector.id and connector_id to the references', async () => { - unsecuredSavedObjectsClient.create.mockResolvedValue({} as SavedObject); + unsecuredSavedObjectsClient.create.mockResolvedValue( + {} as SavedObject + ); await service.postNewCase({ attributes: createCasePostParams({ @@ -815,7 +822,9 @@ describe('CasesService', () => { }); it('sets fields to an empty array when it is not included with the connector', async () => { - unsecuredSavedObjectsClient.create.mockResolvedValue({} as SavedObject); + unsecuredSavedObjectsClient.create.mockResolvedValue( + {} as SavedObject + ); await service.postNewCase({ attributes: createCasePostParams({ @@ -831,7 +840,9 @@ describe('CasesService', () => { }); it('does not create a reference for a none connector', async () => { - unsecuredSavedObjectsClient.create.mockResolvedValue({} as SavedObject); + unsecuredSavedObjectsClient.create.mockResolvedValue( + {} as SavedObject + ); await service.postNewCase({ attributes: createCasePostParams({ connector: getNoneCaseConnector() }), @@ -844,7 +855,9 @@ describe('CasesService', () => { }); it('does not create a reference for an external_service field that is null', async () => { - unsecuredSavedObjectsClient.create.mockResolvedValue({} as SavedObject); + unsecuredSavedObjectsClient.create.mockResolvedValue( + {} as SavedObject + ); await service.postNewCase({ attributes: createCasePostParams({ connector: getNoneCaseConnector() }), @@ -857,14 +870,16 @@ describe('CasesService', () => { }); it.each([ - [CaseSeverity.LOW, ESCaseSeverity.LOW], - [CaseSeverity.MEDIUM, ESCaseSeverity.MEDIUM], - [CaseSeverity.HIGH, ESCaseSeverity.HIGH], - [CaseSeverity.CRITICAL, ESCaseSeverity.CRITICAL], + [CaseSeverity.LOW, CasePersistedSeverity.LOW], + [CaseSeverity.MEDIUM, CasePersistedSeverity.MEDIUM], + [CaseSeverity.HIGH, CasePersistedSeverity.HIGH], + [CaseSeverity.CRITICAL, CasePersistedSeverity.CRITICAL], ])( 'properly converts "%s" severity to corresponding ES value on creating SO', async (postParamsSeverity, expectedSeverity) => { - unsecuredSavedObjectsClient.create.mockResolvedValue({} as SavedObject); + unsecuredSavedObjectsClient.create.mockResolvedValue( + {} as SavedObject + ); await service.postNewCase({ attributes: createCasePostParams({ @@ -875,19 +890,21 @@ describe('CasesService', () => { }); const postAttributes = unsecuredSavedObjectsClient.create.mock - .calls[0][1] as ESCaseAttributes; + .calls[0][1] as CasePersistedAttributes; expect(postAttributes.severity).toEqual(expectedSeverity); } ); it.each([ - [CaseStatuses.open, ESCaseStatus.OPEN], - [CaseStatuses['in-progress'], ESCaseStatus.IN_PROGRESS], - [CaseStatuses.closed, ESCaseStatus.CLOSED], + [CaseStatuses.open, CasePersistedStatus.OPEN], + [CaseStatuses['in-progress'], CasePersistedStatus.IN_PROGRESS], + [CaseStatuses.closed, CasePersistedStatus.CLOSED], ])( 'properly converts "%s" status to corresponding ES value on creating SO', async (postParamsStatus, expectedStatus) => { - unsecuredSavedObjectsClient.create.mockResolvedValue({} as SavedObject); + unsecuredSavedObjectsClient.create.mockResolvedValue( + {} as SavedObject + ); await service.postNewCase({ attributes: createCasePostParams({ @@ -898,7 +915,7 @@ describe('CasesService', () => { }); const postAttributes = unsecuredSavedObjectsClient.create.mock - .calls[0][1] as ESCaseAttributes; + .calls[0][1] as CasePersistedAttributes; expect(postAttributes.status).toEqual(expectedStatus); } ); @@ -929,7 +946,7 @@ describe('CasesService', () => { connector: createJiraConnector(), externalService: createExternalService(), }), - originalCase: {} as CaseSavedObject, + originalCase: {} as CaseSavedObjectTransformed, }, ], }); @@ -970,10 +987,16 @@ describe('CasesService', () => { it('properly converts the severity field to the corresponding external value in the bulkPatch response', async () => { unsecuredSavedObjectsClient.bulkUpdate.mockResolvedValue({ saved_objects: [ - createCaseSavedObjectResponse({ overrides: { severity: ESCaseSeverity.LOW } }), - createCaseSavedObjectResponse({ overrides: { severity: ESCaseSeverity.MEDIUM } }), - createCaseSavedObjectResponse({ overrides: { severity: ESCaseSeverity.HIGH } }), - createCaseSavedObjectResponse({ overrides: { severity: ESCaseSeverity.CRITICAL } }), + createCaseSavedObjectResponse({ overrides: { severity: CasePersistedSeverity.LOW } }), + createCaseSavedObjectResponse({ + overrides: { severity: CasePersistedSeverity.MEDIUM }, + }), + createCaseSavedObjectResponse({ + overrides: { severity: CasePersistedSeverity.HIGH }, + }), + createCaseSavedObjectResponse({ + overrides: { severity: CasePersistedSeverity.CRITICAL }, + }), ], }); @@ -982,7 +1005,7 @@ describe('CasesService', () => { { caseId: '1', updatedAttributes: createCasePostParams({ connector: getNoneCaseConnector() }), - originalCase: {} as CaseSavedObject, + originalCase: {} as CaseSavedObjectTransformed, }, ], }); @@ -995,9 +1018,11 @@ describe('CasesService', () => { it('properly converts the status field to the corresponding external value in the bulkPatch response', async () => { unsecuredSavedObjectsClient.bulkUpdate.mockResolvedValue({ saved_objects: [ - createCaseSavedObjectResponse({ overrides: { status: ESCaseStatus.OPEN } }), - createCaseSavedObjectResponse({ overrides: { status: ESCaseStatus.IN_PROGRESS } }), - createCaseSavedObjectResponse({ overrides: { status: ESCaseStatus.CLOSED } }), + createCaseSavedObjectResponse({ overrides: { status: CasePersistedStatus.OPEN } }), + createCaseSavedObjectResponse({ + overrides: { status: CasePersistedStatus.IN_PROGRESS }, + }), + createCaseSavedObjectResponse({ overrides: { status: CasePersistedStatus.CLOSED } }), ], }); @@ -1006,7 +1031,7 @@ describe('CasesService', () => { { caseId: '1', updatedAttributes: createCasePostParams({ connector: getNoneCaseConnector() }), - originalCase: {} as CaseSavedObject, + originalCase: {} as CaseSavedObjectTransformed, }, ], }); @@ -1029,7 +1054,7 @@ describe('CasesService', () => { { caseId: '1', updatedAttributes: createCasePostParams({ connector: getNoneCaseConnector() }), - originalCase: {} as CaseSavedObject, + originalCase: {} as CaseSavedObjectTransformed, }, ], }); @@ -1052,7 +1077,7 @@ describe('CasesService', () => { const res = await service.patchCase({ caseId: '1', updatedAttributes: createCaseUpdateParams({}), - originalCase: {} as CaseSavedObject, + originalCase: {} as CaseSavedObjectTransformed, }); expect(res.attributes).toMatchInlineSnapshot(` @@ -1076,7 +1101,7 @@ describe('CasesService', () => { const res = await service.patchCase({ caseId: '1', updatedAttributes: createCaseUpdateParams({}), - originalCase: {} as CaseSavedObject, + originalCase: {} as CaseSavedObjectTransformed, }); expect(res.attributes).toMatchInlineSnapshot(` @@ -1093,7 +1118,7 @@ describe('CasesService', () => { const res = await service.patchCase({ caseId: '1', updatedAttributes: createCaseUpdateParams({}), - originalCase: {} as CaseSavedObject, + originalCase: {} as CaseSavedObjectTransformed, }); expect(res.attributes).toMatchInlineSnapshot(`Object {}`); @@ -1102,13 +1127,13 @@ describe('CasesService', () => { it('returns an undefined connector if it is not returned by the update', async () => { unsecuredSavedObjectsClient.update.mockResolvedValue( - {} as SavedObjectsUpdateResponse + {} as SavedObjectsUpdateResponse ); const res = await service.patchCase({ caseId: '1', updatedAttributes: createCaseUpdateParams({}), - originalCase: {} as CaseSavedObject, + originalCase: {} as CaseSavedObjectTransformed, }); expect(res).toMatchInlineSnapshot(` @@ -1120,7 +1145,7 @@ describe('CasesService', () => { it('returns the default none connector when it cannot find the reference', async () => { const { name, type, fields } = createESJiraConnector(); - const returnValue: SavedObjectsUpdateResponse = { + const returnValue: SavedObjectsUpdateResponse = { type: CASE_SAVED_OBJECT, id: '1', attributes: { @@ -1139,7 +1164,7 @@ describe('CasesService', () => { const res = await service.patchCase({ caseId: '1', updatedAttributes: createCaseUpdateParams({}), - originalCase: {} as CaseSavedObject, + originalCase: {} as CaseSavedObjectTransformed, }); expect(res.attributes.connector).toMatchInlineSnapshot(` @@ -1154,7 +1179,7 @@ describe('CasesService', () => { it('returns none external service connector when it cannot find the reference', async () => { const { connector_id: id, ...restExternalConnector } = createExternalService()!; - const returnValue: SavedObjectsUpdateResponse = { + const returnValue: SavedObjectsUpdateResponse = { type: CASE_SAVED_OBJECT, id: '1', attributes: { @@ -1169,7 +1194,7 @@ describe('CasesService', () => { const res = await service.patchCase({ caseId: '1', updatedAttributes: createCaseUpdateParams({}), - originalCase: {} as CaseSavedObject, + originalCase: {} as CaseSavedObjectTransformed, }); expect(res.attributes.external_service?.connector_id).toBe('none'); @@ -1177,7 +1202,7 @@ describe('CasesService', () => { it('returns the saved object fields when it cannot find the reference for connector_id', async () => { const { connector_id: id, ...restExternalConnector } = createExternalService()!; - const returnValue: SavedObjectsUpdateResponse = { + const returnValue: SavedObjectsUpdateResponse = { type: CASE_SAVED_OBJECT, id: '1', attributes: { @@ -1192,7 +1217,7 @@ describe('CasesService', () => { const res = await service.patchCase({ caseId: '1', updatedAttributes: createCaseUpdateParams({}), - originalCase: {} as CaseSavedObject, + originalCase: {} as CaseSavedObjectTransformed, }); expect(res).toMatchInlineSnapshot(` @@ -1228,7 +1253,7 @@ describe('CasesService', () => { const res = await service.patchCase({ caseId: '1', updatedAttributes: createCaseUpdateParams({}), - originalCase: {} as CaseSavedObject, + originalCase: {} as CaseSavedObjectTransformed, }); expect(res.attributes.connector).toMatchInlineSnapshot(` @@ -1254,7 +1279,7 @@ describe('CasesService', () => { const res = await service.patchCase({ caseId: '1', updatedAttributes: createCaseUpdateParams({}), - originalCase: {} as CaseSavedObject, + originalCase: {} as CaseSavedObjectTransformed, }); expect(res.attributes.external_service).toMatchInlineSnapshot(` @@ -1276,10 +1301,10 @@ describe('CasesService', () => { }); it.each([ - [ESCaseSeverity.LOW, CaseSeverity.LOW], - [ESCaseSeverity.MEDIUM, CaseSeverity.MEDIUM], - [ESCaseSeverity.HIGH, CaseSeverity.HIGH], - [ESCaseSeverity.CRITICAL, CaseSeverity.CRITICAL], + [CasePersistedSeverity.LOW, CaseSeverity.LOW], + [CasePersistedSeverity.MEDIUM, CaseSeverity.MEDIUM], + [CasePersistedSeverity.HIGH, CaseSeverity.HIGH], + [CasePersistedSeverity.CRITICAL, CaseSeverity.CRITICAL], ])( 'properly converts "%s" severity to corresponding external value in the patch response', async (internalSeverityValue, expectedSeverity) => { @@ -1290,7 +1315,7 @@ describe('CasesService', () => { const res = await service.patchCase({ caseId: '1', updatedAttributes: createCaseUpdateParams({}), - originalCase: {} as CaseSavedObject, + originalCase: {} as CaseSavedObjectTransformed, }); expect(res.attributes.severity).toEqual(expectedSeverity); @@ -1298,9 +1323,9 @@ describe('CasesService', () => { ); it.each([ - [ESCaseStatus.OPEN, CaseStatuses.open], - [ESCaseStatus.IN_PROGRESS, CaseStatuses['in-progress']], - [ESCaseStatus.CLOSED, CaseStatuses.closed], + [CasePersistedStatus.OPEN, CaseStatuses.open], + [CasePersistedStatus.IN_PROGRESS, CaseStatuses['in-progress']], + [CasePersistedStatus.CLOSED, CaseStatuses.closed], ])( 'properly converts "%s" status to corresponding external value in the patch response', async (internalStatusValue, expectedStatus) => { @@ -1311,7 +1336,7 @@ describe('CasesService', () => { const res = await service.patchCase({ caseId: '1', updatedAttributes: createCaseUpdateParams({}), - originalCase: {} as CaseSavedObject, + originalCase: {} as CaseSavedObjectTransformed, }); expect(res.attributes.status).toEqual(expectedStatus); @@ -1324,7 +1349,7 @@ describe('CasesService', () => { const res = await service.patchCase({ caseId: '1', updatedAttributes: createCaseUpdateParams({}), - originalCase: {} as CaseSavedObject, + originalCase: {} as CaseSavedObjectTransformed, }); expect(res.attributes).not.toHaveProperty('total_alerts'); @@ -1351,10 +1376,10 @@ describe('CasesService', () => { }); it.each([ - [ESCaseSeverity.LOW, CaseSeverity.LOW], - [ESCaseSeverity.MEDIUM, CaseSeverity.MEDIUM], - [ESCaseSeverity.HIGH, CaseSeverity.HIGH], - [ESCaseSeverity.CRITICAL, CaseSeverity.CRITICAL], + [CasePersistedSeverity.LOW, CaseSeverity.LOW], + [CasePersistedSeverity.MEDIUM, CaseSeverity.MEDIUM], + [CasePersistedSeverity.HIGH, CaseSeverity.HIGH], + [CasePersistedSeverity.CRITICAL, CaseSeverity.CRITICAL], ])( 'properly converts "%s" severity to corresponding external value in the post response', async (internalSeverityValue, expectedSeverity) => { @@ -1372,9 +1397,9 @@ describe('CasesService', () => { ); it.each([ - [ESCaseStatus.OPEN, CaseStatuses.open], - [ESCaseStatus.IN_PROGRESS, CaseStatuses['in-progress']], - [ESCaseStatus.CLOSED, CaseStatuses.closed], + [CasePersistedStatus.OPEN, CaseStatuses.open], + [CasePersistedStatus.IN_PROGRESS, CaseStatuses['in-progress']], + [CasePersistedStatus.CLOSED, CaseStatuses.closed], ])( 'properly converts "%s" status to corresponding external value in the post response', async (internalStatusValue, expectedStatus) => { @@ -1444,10 +1469,10 @@ describe('CasesService', () => { }); it.each([ - [ESCaseSeverity.LOW, CaseSeverity.LOW], - [ESCaseSeverity.MEDIUM, CaseSeverity.MEDIUM], - [ESCaseSeverity.HIGH, CaseSeverity.HIGH], - [ESCaseSeverity.CRITICAL, CaseSeverity.CRITICAL], + [CasePersistedSeverity.LOW, CaseSeverity.LOW], + [CasePersistedSeverity.MEDIUM, CaseSeverity.MEDIUM], + [CasePersistedSeverity.HIGH, CaseSeverity.HIGH], + [CasePersistedSeverity.CRITICAL, CaseSeverity.CRITICAL], ])( 'includes the properly converted "%s" severity field in the result', async (severity, expectedSeverity) => { @@ -1463,9 +1488,9 @@ describe('CasesService', () => { ); it.each([ - [ESCaseStatus.OPEN, CaseStatuses.open], - [ESCaseStatus.IN_PROGRESS, CaseStatuses['in-progress']], - [ESCaseStatus.CLOSED, CaseStatuses.closed], + [CasePersistedStatus.OPEN, CaseStatuses.open], + [CasePersistedStatus.IN_PROGRESS, CaseStatuses['in-progress']], + [CasePersistedStatus.CLOSED, CaseStatuses.closed], ])( 'includes the properly converted "%s" status field in the result', async (status, expectedStatus) => { @@ -1523,16 +1548,16 @@ describe('CasesService', () => { unsecuredSavedObjectsClient.bulkGet.mockResolvedValue({ saved_objects: [ createCaseSavedObjectResponse({ - overrides: { severity: ESCaseSeverity.LOW }, + overrides: { severity: CasePersistedSeverity.LOW }, }), createCaseSavedObjectResponse({ - overrides: { severity: ESCaseSeverity.MEDIUM }, + overrides: { severity: CasePersistedSeverity.MEDIUM }, }), createCaseSavedObjectResponse({ - overrides: { severity: ESCaseSeverity.HIGH }, + overrides: { severity: CasePersistedSeverity.HIGH }, }), createCaseSavedObjectResponse({ - overrides: { severity: ESCaseSeverity.CRITICAL }, + overrides: { severity: CasePersistedSeverity.CRITICAL }, }), ], }); @@ -1548,13 +1573,13 @@ describe('CasesService', () => { unsecuredSavedObjectsClient.bulkGet.mockResolvedValue({ saved_objects: [ createCaseSavedObjectResponse({ - overrides: { status: ESCaseStatus.OPEN }, + overrides: { status: CasePersistedStatus.OPEN }, }), createCaseSavedObjectResponse({ - overrides: { status: ESCaseStatus.IN_PROGRESS }, + overrides: { status: CasePersistedStatus.IN_PROGRESS }, }), createCaseSavedObjectResponse({ - overrides: { status: ESCaseStatus.CLOSED }, + overrides: { status: CasePersistedStatus.CLOSED }, }), ], }); @@ -1652,7 +1677,7 @@ describe('CasesService', () => { type: ACTION_SAVED_OBJECT_TYPE, }, ], - } as unknown as SavedObject); + } as unknown as SavedObject); const res = await service.getCase({ id: 'a' }); expect(res.attributes.connector).toMatchInlineSnapshot(` @@ -1670,7 +1695,7 @@ describe('CasesService', () => { it('returns a null external_services when it is already null', async () => { unsecuredSavedObjectsClient.get.mockResolvedValue({ attributes: { external_service: null }, - } as SavedObject); + } as SavedObject); const res = await service.getCase({ id: 'a' }); expect(res.attributes.connector).toMatchInlineSnapshot(` @@ -1686,16 +1711,16 @@ describe('CasesService', () => { }); it.each([ - [ESCaseSeverity.LOW, CaseSeverity.LOW], - [ESCaseSeverity.MEDIUM, CaseSeverity.MEDIUM], - [ESCaseSeverity.HIGH, CaseSeverity.HIGH], - [ESCaseSeverity.CRITICAL, CaseSeverity.CRITICAL], + [CasePersistedSeverity.LOW, CaseSeverity.LOW], + [CasePersistedSeverity.MEDIUM, CaseSeverity.MEDIUM], + [CasePersistedSeverity.HIGH, CaseSeverity.HIGH], + [CasePersistedSeverity.CRITICAL, CaseSeverity.CRITICAL], ])( 'includes the properly converted "%s" severity field in the result', async (internalSeverityValue, expectedSeverity) => { unsecuredSavedObjectsClient.get.mockResolvedValue({ attributes: { severity: internalSeverityValue }, - } as SavedObject); + } as SavedObject); const res = await service.getCase({ id: 'a' }); @@ -1704,15 +1729,15 @@ describe('CasesService', () => { ); it.each([ - [ESCaseStatus.OPEN, CaseStatuses.open], - [ESCaseStatus.IN_PROGRESS, CaseStatuses['in-progress']], - [ESCaseStatus.CLOSED, CaseStatuses.closed], + [CasePersistedStatus.OPEN, CaseStatuses.open], + [CasePersistedStatus.IN_PROGRESS, CaseStatuses['in-progress']], + [CasePersistedStatus.CLOSED, CaseStatuses.closed], ])( 'includes the properly converted "%s" status field in the result', async (internalStatusValue, expectedStatus) => { unsecuredSavedObjectsClient.get.mockResolvedValue({ attributes: { status: internalStatusValue }, - } as SavedObject); + } as SavedObject); const res = await service.getCase({ id: 'a' }); @@ -1726,7 +1751,7 @@ describe('CasesService', () => { total_alerts: -1, total_comments: -1, }, - } as unknown as SavedObject); + } as unknown as SavedObject); const res = await service.getCase({ id: 'a' }); expect(res.attributes).not.toHaveProperty('total_alerts'); @@ -1760,7 +1785,7 @@ describe('CasesService', () => { page: 1, per_page: 1, aggregations: { myAggregation: { value: 0 } }, - } as SavedObjectsFindResponse); + } as SavedObjectsFindResponse); const res = await service.executeAggregations({ aggregationBuilders }); expect(res).toEqual({ myAggregation: { value: 0 } }); @@ -1773,7 +1798,7 @@ describe('CasesService', () => { page: 1, per_page: 1, aggregations: { myAggregation: { value: 0 } }, - } as SavedObjectsFindResponse); + } as SavedObjectsFindResponse); await service.executeAggregations({ aggregationBuilders, options: { perPage: 20 } }); expect(unsecuredSavedObjectsClient.find.mock.calls[0][0]).toMatchInlineSnapshot(` diff --git a/x-pack/plugins/cases/server/services/cases/index.ts b/x-pack/plugins/cases/server/services/cases/index.ts index bc694a44d93eb..93c6d610d5539 100644 --- a/x-pack/plugins/cases/server/services/cases/index.ts +++ b/x-pack/plugins/cases/server/services/cases/index.ts @@ -20,7 +20,6 @@ import type { } from '@kbn/core/server'; import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; -import type { KueryNode } from '@kbn/es-query'; import { nodeBuilder } from '@kbn/es-query'; import { @@ -28,16 +27,9 @@ import { CASE_SAVED_OBJECT, MAX_DOCS_PER_PAGE, } from '../../../common/constants'; -import type { - CaseResponse, - CasesFindRequest, - CommentAttributes, - User, - CaseAttributes, - CaseStatuses, -} from '../../../common/api'; +import type { Case, CommentAttributes, User, CaseStatuses } from '../../../common/api'; import { caseStatuses } from '../../../common/api'; -import type { CaseSavedObject, SavedObjectFindOptionsKueryNode } from '../../common/types'; +import type { SavedObjectFindOptionsKueryNode } from '../../common/types'; import { defaultSortField, flattenCaseSavedObject } from '../../common/utils'; import { DEFAULT_PAGE, DEFAULT_PER_PAGE } from '../../routes/api'; import { combineFilters } from '../../client/utils'; @@ -50,88 +42,30 @@ import { transformBulkResponseToExternalModel, transformFindResponseToExternalModel, } from './transform'; -import type { ESCaseAttributes } from './types'; -import { ESCaseStatus } from './types'; import type { AttachmentService } from '../attachments'; import type { AggregationBuilder, AggregationResponse } from '../../client/metrics/types'; import { createCaseError } from '../../common/error'; -import type { IndexRefresh } from '../types'; - -interface GetCaseIdsByAlertIdArgs { - alertId: string; - filter?: KueryNode; -} - -interface PushedArgs { - pushed_at: string; - pushed_by: User; -} - -interface GetCaseArgs { - id: string; -} - -interface DeleteCaseArgs extends GetCaseArgs, IndexRefresh {} - -interface GetCasesArgs { - caseIds: string[]; - fields?: string[]; -} - -interface FindCommentsArgs { - id: string | string[]; - options?: SavedObjectFindOptionsKueryNode; -} - -interface FindCaseCommentsArgs { - id: string | string[]; - options?: SavedObjectFindOptionsKueryNode; -} - -interface PostCaseArgs extends IndexRefresh { - attributes: CaseAttributes; - id: string; -} - -interface PatchCase extends IndexRefresh { - caseId: string; - updatedAttributes: Partial; - originalCase: CaseSavedObject; - version?: string; -} -type PatchCaseArgs = PatchCase; - -interface PatchCasesArgs extends IndexRefresh { - cases: Array>; -} - -interface CasesMapWithPageInfo { - casesMap: Map; - page: number; - perPage: number; - total: number; -} - -type FindCaseOptions = CasesFindRequest & SavedObjectFindOptionsKueryNode; - -interface GetTagsArgs { - unsecuredSavedObjectsClient: SavedObjectsClientContract; - filter?: KueryNode; -} - -interface GetReportersArgs { - unsecuredSavedObjectsClient: SavedObjectsClientContract; - filter?: KueryNode; -} - -interface GetCaseIdsByAlertIdAggs { - references: { - doc_count: number; - caseIds: { - buckets: Array<{ key: string }>; - }; - }; -} +import type { + CasePersistedAttributes, + CaseSavedObjectTransformed, + CaseTransformedAttributes, +} from '../../common/types/case'; +import { CasePersistedStatus } from '../../common/types/case'; +import type { + GetCaseIdsByAlertIdArgs, + GetCaseIdsByAlertIdAggs, + CasesMapWithPageInfo, + DeleteCaseArgs, + GetCaseArgs, + GetCasesArgs, + FindCommentsArgs, + FindCaseCommentsArgs, + GetReportersArgs, + GetTagsArgs, + PostCaseArgs, + PatchCaseArgs, + PatchCasesArgs, +} from './types'; export class CasesService { private readonly log: Logger; @@ -174,7 +108,7 @@ export class CasesService { alertId, filter, }: GetCaseIdsByAlertIdArgs): Promise< - SavedObjectsFindResponse + SavedObjectsFindResponse<{ owner: string }, GetCaseIdsByAlertIdAggs> > { try { this.log.debug(`Attempting to GET all cases for alert id ${alertId}`); @@ -184,7 +118,7 @@ export class CasesService { ]); const response = await this.unsecuredSavedObjectsClient.find< - CommentAttributes, + { owner: string }, GetCaseIdsByAlertIdAggs >({ type: CASE_COMMENT_SAVED_OBJECT, @@ -206,7 +140,7 @@ export class CasesService { * Extracts the case IDs from the alert aggregation */ public static getCaseIDsFromAlertAggs( - result: SavedObjectsFindResponse + result: SavedObjectsFindResponse ): string[] { return result.aggregations?.references.caseIds.buckets.map((b) => b.key) ?? []; } @@ -217,20 +151,20 @@ export class CasesService { public async findCasesGroupedByID({ caseOptions, }: { - caseOptions: FindCaseOptions; + caseOptions: SavedObjectFindOptionsKueryNode; }): Promise { const cases = await this.findCases(caseOptions); const casesMap = cases.saved_objects.reduce((accMap, caseInfo) => { accMap.set(caseInfo.id, caseInfo); return accMap; - }, new Map>()); + }, new Map>()); const commentTotals = await this.attachmentService.getter.getCaseCommentStats({ caseIds: Array.from(casesMap.keys()), }); - const casesWithComments = new Map(); + const casesWithComments = new Map(); for (const [id, caseInfo] of casesMap.entries()) { const { alerts, userComments } = commentTotals.get(id) ?? { alerts: 0, userComments: 0 }; @@ -260,7 +194,7 @@ export class CasesService { [status in CaseStatuses]: number; }> { const cases = await this.unsecuredSavedObjectsClient.find< - ESCaseAttributes, + CasePersistedAttributes, { statuses: { buckets: Array<{ @@ -286,9 +220,9 @@ export class CasesService { const statusBuckets = CasesService.getStatusBuckets(cases.aggregations?.statuses.buckets); return { - open: statusBuckets?.get(ESCaseStatus.OPEN) ?? 0, - 'in-progress': statusBuckets?.get(ESCaseStatus.IN_PROGRESS) ?? 0, - closed: statusBuckets?.get(ESCaseStatus.CLOSED) ?? 0, + open: statusBuckets?.get(CasePersistedStatus.OPEN) ?? 0, + 'in-progress': statusBuckets?.get(CasePersistedStatus.IN_PROGRESS) ?? 0, + closed: statusBuckets?.get(CasePersistedStatus.CLOSED) ?? 0, }; } @@ -326,10 +260,10 @@ export class CasesService { } } - public async getCase({ id: caseId }: GetCaseArgs): Promise { + public async getCase({ id: caseId }: GetCaseArgs): Promise { try { this.log.debug(`Attempting to GET case ${caseId}`); - const caseSavedObject = await this.unsecuredSavedObjectsClient.get( + const caseSavedObject = await this.unsecuredSavedObjectsClient.get( CASE_SAVED_OBJECT, caseId ); @@ -342,13 +276,14 @@ export class CasesService { public async getResolveCase({ id: caseId, - }: GetCaseArgs): Promise> { + }: GetCaseArgs): Promise> { try { this.log.debug(`Attempting to resolve case ${caseId}`); - const resolveCaseResult = await this.unsecuredSavedObjectsClient.resolve( - CASE_SAVED_OBJECT, - caseId - ); + const resolveCaseResult = + await this.unsecuredSavedObjectsClient.resolve( + CASE_SAVED_OBJECT, + caseId + ); return { ...resolveCaseResult, saved_object: transformSavedObjectToExternalModel(resolveCaseResult.saved_object), @@ -362,10 +297,10 @@ export class CasesService { public async getCases({ caseIds, fields, - }: GetCasesArgs): Promise> { + }: GetCasesArgs): Promise> { try { this.log.debug(`Attempting to GET cases ${caseIds.join(', ')}`); - const cases = await this.unsecuredSavedObjectsClient.bulkGet( + const cases = await this.unsecuredSavedObjectsClient.bulkGet( caseIds.map((caseId) => ({ type: CASE_SAVED_OBJECT, id: caseId, fields })) ); return transformBulkResponseToExternalModel(cases); @@ -377,14 +312,15 @@ export class CasesService { public async findCases( options?: SavedObjectFindOptionsKueryNode - ): Promise> { + ): Promise> { try { this.log.debug(`Attempting to find cases`); - const cases = await this.unsecuredSavedObjectsClient.find({ + const cases = await this.unsecuredSavedObjectsClient.find({ sortField: defaultSortField, ...options, type: CASE_SAVED_OBJECT, }); + return transformFindResponseToExternalModel(cases); } catch (error) { this.log.error(`Error on find cases: ${error}`); @@ -402,6 +338,8 @@ export class CasesService { } } + // TODO: This should probably be moved into the client since it is after the transform has + // occurred within the attachment service private async getAllComments({ id, options, @@ -431,6 +369,8 @@ export class CasesService { } } + // TODO: This should probably be moved into the client since it is after the transform has + // occurred within the attachment service /** * Default behavior is to retrieve all comments that adhere to a given filter (if one is included). * to override this pass in the either the page or perPage options. @@ -471,7 +411,7 @@ export class CasesService { this.log.debug(`Attempting to GET all reporters`); const results = await this.unsecuredSavedObjectsClient.find< - ESCaseAttributes, + CasePersistedAttributes, { reporters: { buckets: Array<{ @@ -533,7 +473,7 @@ export class CasesService { this.log.debug(`Attempting to GET all cases`); const results = await this.unsecuredSavedObjectsClient.find< - ESCaseAttributes, + CasePersistedAttributes, { tags: { buckets: Array<{ key: string }> } } >({ type: CASE_SAVED_OBJECT, @@ -558,7 +498,11 @@ export class CasesService { } } - public async postNewCase({ attributes, id, refresh }: PostCaseArgs): Promise { + public async postNewCase({ + attributes, + id, + refresh, + }: PostCaseArgs): Promise { try { this.log.debug(`Attempting to POST a new case`); const transformedAttributes = transformAttributesToESModel(attributes); @@ -566,7 +510,7 @@ export class CasesService { transformedAttributes.attributes.total_alerts = -1; transformedAttributes.attributes.total_comments = -1; - const createdCase = await this.unsecuredSavedObjectsClient.create( + const createdCase = await this.unsecuredSavedObjectsClient.create( CASE_SAVED_OBJECT, transformedAttributes.attributes, { id, references: transformedAttributes.referenceHandler.build(), refresh } @@ -585,12 +529,12 @@ export class CasesService { originalCase, version, refresh, - }: PatchCaseArgs): Promise> { + }: PatchCaseArgs): Promise> { try { this.log.debug(`Attempting to UPDATE case ${caseId}`); const transformedAttributes = transformAttributesToESModel(updatedAttributes); - const updatedCase = await this.unsecuredSavedObjectsClient.update( + const updatedCase = await this.unsecuredSavedObjectsClient.update( CASE_SAVED_OBJECT, caseId, transformedAttributes.attributes, @@ -611,7 +555,7 @@ export class CasesService { public async patchCases({ cases, refresh, - }: PatchCasesArgs): Promise> { + }: PatchCasesArgs): Promise> { try { this.log.debug(`Attempting to UPDATE case ${cases.map((c) => c.caseId).join(', ')}`); @@ -626,10 +570,10 @@ export class CasesService { }; }); - const updatedCases = await this.unsecuredSavedObjectsClient.bulkUpdate( - bulkUpdate, - { refresh } - ); + const updatedCases = + await this.unsecuredSavedObjectsClient.bulkUpdate(bulkUpdate, { + refresh, + }); return transformUpdateResponsesToExternalModels(updatedCases); } catch (error) { @@ -651,7 +595,7 @@ export class CasesService { }, {}); const res = await this.unsecuredSavedObjectsClient.find< - ESCaseAttributes, + CasePersistedAttributes, AggregationResponse >({ sortField: defaultSortField, diff --git a/x-pack/plugins/cases/server/services/cases/transform.test.ts b/x-pack/plugins/cases/server/services/cases/transform.test.ts index afd2de272bc42..1ba613e8c6d1e 100644 --- a/x-pack/plugins/cases/server/services/cases/transform.test.ts +++ b/x-pack/plugins/cases/server/services/cases/transform.test.ts @@ -23,7 +23,7 @@ import { PUSH_CONNECTOR_ID_REFERENCE_NAME, } from '../../common/constants'; import { getNoneCaseConnector } from '../../common/utils'; -import { ESCaseSeverity, ESCaseStatus } from './types'; +import { CasePersistedSeverity, CasePersistedStatus } from '../../common/types/case'; describe('case transforms', () => { describe('transformUpdateResponseToExternalModel', () => { @@ -200,10 +200,10 @@ describe('case transforms', () => { }); it.each([ - [ESCaseSeverity.LOW, CaseSeverity.LOW], - [ESCaseSeverity.MEDIUM, CaseSeverity.MEDIUM], - [ESCaseSeverity.HIGH, CaseSeverity.HIGH], - [ESCaseSeverity.CRITICAL, CaseSeverity.CRITICAL], + [CasePersistedSeverity.LOW, CaseSeverity.LOW], + [CasePersistedSeverity.MEDIUM, CaseSeverity.MEDIUM], + [CasePersistedSeverity.HIGH, CaseSeverity.HIGH], + [CasePersistedSeverity.CRITICAL, CaseSeverity.CRITICAL], ])( 'properly converts "%s" severity to corresponding external value "%s"', (internalSeverityValue, expectedSeverityValue) => { @@ -222,9 +222,9 @@ describe('case transforms', () => { ); it.each([ - [ESCaseStatus.OPEN, CaseStatuses.open], - [ESCaseStatus.IN_PROGRESS, CaseStatuses['in-progress']], - [ESCaseStatus.CLOSED, CaseStatuses.closed], + [CasePersistedStatus.OPEN, CaseStatuses.open], + [CasePersistedStatus.IN_PROGRESS, CaseStatuses['in-progress']], + [CasePersistedStatus.CLOSED, CaseStatuses.closed], ])( 'properly converts "%s" status to corresponding ES Value "%s"', (internalStatusValue, expectedStatusValue) => { @@ -387,10 +387,10 @@ describe('case transforms', () => { }); it.each([ - [CaseSeverity.LOW, ESCaseSeverity.LOW], - [CaseSeverity.MEDIUM, ESCaseSeverity.MEDIUM], - [CaseSeverity.HIGH, ESCaseSeverity.HIGH], - [CaseSeverity.CRITICAL, ESCaseSeverity.CRITICAL], + [CaseSeverity.LOW, CasePersistedSeverity.LOW], + [CaseSeverity.MEDIUM, CasePersistedSeverity.MEDIUM], + [CaseSeverity.HIGH, CasePersistedSeverity.HIGH], + [CaseSeverity.CRITICAL, CasePersistedSeverity.CRITICAL], ])( 'properly converts "%s" severity to corresponding ES Value "%s"', (externalSeverityValue, expectedSeverityValue) => { @@ -410,9 +410,9 @@ describe('case transforms', () => { }); it.each([ - [CaseStatuses.open, ESCaseStatus.OPEN], - [CaseStatuses['in-progress'], ESCaseStatus.IN_PROGRESS], - [CaseStatuses.closed, ESCaseStatus.CLOSED], + [CaseStatuses.open, CasePersistedStatus.OPEN], + [CaseStatuses['in-progress'], CasePersistedStatus.IN_PROGRESS], + [CaseStatuses.closed, CasePersistedStatus.CLOSED], ])( 'properly converts "%s" status to corresponding ES Value "%s"', (externalStatusValue, expectedStatusValue) => { @@ -501,10 +501,10 @@ describe('case transforms', () => { }); it.each([ - [ESCaseSeverity.LOW, CaseSeverity.LOW], - [ESCaseSeverity.MEDIUM, CaseSeverity.MEDIUM], - [ESCaseSeverity.HIGH, CaseSeverity.HIGH], - [ESCaseSeverity.CRITICAL, CaseSeverity.CRITICAL], + [CasePersistedSeverity.LOW, CaseSeverity.LOW], + [CasePersistedSeverity.MEDIUM, CaseSeverity.MEDIUM], + [CasePersistedSeverity.HIGH, CaseSeverity.HIGH], + [CasePersistedSeverity.CRITICAL, CaseSeverity.CRITICAL], ])( 'properly converts "%s" severity to corresponding external value "%s"', (internalSeverityValue, expectedSeverityValue) => { @@ -529,9 +529,9 @@ describe('case transforms', () => { }); it.each([ - [ESCaseStatus.OPEN, CaseStatuses.open], - [ESCaseStatus.IN_PROGRESS, CaseStatuses['in-progress']], - [ESCaseStatus.CLOSED, CaseStatuses.closed], + [CasePersistedStatus.OPEN, CaseStatuses.open], + [CasePersistedStatus.IN_PROGRESS, CaseStatuses['in-progress']], + [CasePersistedStatus.CLOSED, CaseStatuses.closed], ])( 'properly converts "%s" status to corresponding external value "%s"', (internalStatusValue, expectedStatusValue) => { diff --git a/x-pack/plugins/cases/server/services/cases/transform.ts b/x-pack/plugins/cases/server/services/cases/transform.ts index 6adacf41f526a..5b31bde8107c4 100644 --- a/x-pack/plugins/cases/server/services/cases/transform.ts +++ b/x-pack/plugins/cases/server/services/cases/transform.ts @@ -16,7 +16,6 @@ import type { SavedObjectsUpdateResponse, } from '@kbn/core/server'; import { ACTION_SAVED_OBJECT_TYPE } from '@kbn/actions-plugin/server'; -import type { ESCaseAttributes, ExternalServicesWithoutConnectorId } from './types'; import { CONNECTOR_ID_REFERENCE_NAME, PUSH_CONNECTOR_ID_REFERENCE_NAME, @@ -25,7 +24,7 @@ import { STATUS_ESMODEL_TO_EXTERNAL, STATUS_EXTERNAL_TO_ESMODEL, } from '../../common/constants'; -import type { CaseAttributes, CaseFullExternalService } from '../../../common/api'; +import type { CaseFullExternalService } from '../../../common/api'; import { CaseSeverity, CaseStatuses, NONE_CONNECTOR_ID } from '../../../common/api'; import { findConnectorIdReference, @@ -34,11 +33,12 @@ import { transformESConnectorToExternalModel, } from '../transform'; import { ConnectorReferenceHandler } from '../connector_reference_handler'; -import type { CaseSavedObject } from '../../common/types'; +import type { CasePersistedAttributes, CaseTransformedAttributes } from '../../common/types/case'; +import type { ExternalServicePersisted } from '../../common/types/external_service'; export function transformUpdateResponsesToExternalModels( - response: SavedObjectsBulkUpdateResponse -): SavedObjectsBulkUpdateResponse { + response: SavedObjectsBulkUpdateResponse +): SavedObjectsBulkUpdateResponse { return { ...response, saved_objects: response.saved_objects.map((so) => ({ @@ -49,8 +49,8 @@ export function transformUpdateResponsesToExternalModels( } export function transformUpdateResponseToExternalModel( - updatedCase: SavedObjectsUpdateResponse -): SavedObjectsUpdateResponse { + updatedCase: SavedObjectsUpdateResponse +): SavedObjectsUpdateResponse { const { connector, external_service, @@ -64,7 +64,7 @@ export function transformUpdateResponseToExternalModel( ({ total_alerts: -1, total_comments: -1, - } as ESCaseAttributes); + } as CasePersistedAttributes); const transformedConnector = transformESConnectorToExternalModel({ // if the saved object had an error the attributes field will not exist @@ -94,16 +94,16 @@ export function transformUpdateResponseToExternalModel( }; } -export function transformAttributesToESModel(caseAttributes: CaseAttributes): { - attributes: ESCaseAttributes; +export function transformAttributesToESModel(caseAttributes: CaseTransformedAttributes): { + attributes: CasePersistedAttributes; referenceHandler: ConnectorReferenceHandler; }; -export function transformAttributesToESModel(caseAttributes: Partial): { - attributes: Partial; +export function transformAttributesToESModel(caseAttributes: Partial): { + attributes: Partial; referenceHandler: ConnectorReferenceHandler; }; -export function transformAttributesToESModel(caseAttributes: Partial): { - attributes: Partial; +export function transformAttributesToESModel(caseAttributes: Partial): { + attributes: Partial; referenceHandler: ConnectorReferenceHandler; } { const { connector, external_service, severity, status, ...restAttributes } = caseAttributes; @@ -154,15 +154,15 @@ function buildReferenceHandler( * definition like this: * * export function transformArrayResponseToExternalModel( - * response: SavedObjectsBulkResponse | SavedObjectsFindResponse - * ): SavedObjectsBulkResponse | SavedObjectsFindResponse { + * response: SavedObjectsBulkResponse | SavedObjectsFindResponse + * ): SavedObjectsBulkResponse | SavedObjectsFindResponse { * * See this issue for more details: https://stackoverflow.com/questions/49510832/typescript-how-to-map-over-union-array-type */ export function transformBulkResponseToExternalModel( - response: SavedObjectsBulkResponse -): SavedObjectsBulkResponse { + response: SavedObjectsBulkResponse +): SavedObjectsBulkResponse { return { ...response, saved_objects: response.saved_objects.map((so) => ({ @@ -173,8 +173,8 @@ export function transformBulkResponseToExternalModel( } export function transformFindResponseToExternalModel( - response: SavedObjectsFindResponse -): SavedObjectsFindResponse { + response: SavedObjectsFindResponse +): SavedObjectsFindResponse { return { ...response, saved_objects: response.saved_objects.map((so) => ({ @@ -185,8 +185,8 @@ export function transformFindResponseToExternalModel( } export function transformSavedObjectToExternalModel( - caseSavedObject: SavedObject -): CaseSavedObject { + caseSavedObject: SavedObject +): SavedObject { const connector = transformESConnectorOrUseDefault({ // if the saved object had an error the attributes field will not exist connector: caseSavedObject.attributes?.connector, @@ -209,7 +209,7 @@ export function transformSavedObjectToExternalModel( ({ total_alerts: -1, total_comments: -1, - } as ESCaseAttributes); + } as CasePersistedAttributes); return { ...caseSavedObject, @@ -226,7 +226,7 @@ export function transformSavedObjectToExternalModel( function transformESExternalService( // this type needs to match that of CaseFullExternalService except that it does not include the connector_id, see: x-pack/plugins/cases/common/api/cases/case.ts // that's why it can be null here - externalService: ExternalServicesWithoutConnectorId | null | undefined, + externalService: ExternalServicePersisted | null | undefined, references: SavedObjectReference[] | undefined ): CaseFullExternalService | null { const connectorIdRef = findConnectorIdReference(PUSH_CONNECTOR_ID_REFERENCE_NAME, references); diff --git a/x-pack/plugins/cases/server/services/cases/types.ts b/x-pack/plugins/cases/server/services/cases/types.ts index 5e831b7fd058f..3a57fa3eea83a 100644 --- a/x-pack/plugins/cases/server/services/cases/types.ts +++ b/x-pack/plugins/cases/server/services/cases/types.ts @@ -5,49 +5,88 @@ * 2.0. */ -import type * as rt from 'io-ts'; -import type { CaseAttributes, CaseExternalServiceBasicRt } from '../../../common/api'; -import type { ESCaseConnector } from '..'; - -/** - * This type should only be used within the cases service and its helper functions (e.g. the transforms). - * - * The type represents how the external services portion of the object will be layed out when stored in ES. The external_service will have its - * connector_id field removed and placed within the references field. - */ -export type ExternalServicesWithoutConnectorId = Omit< - rt.TypeOf, - 'connector_id' ->; - -export enum ESCaseSeverity { - LOW = 0, - MEDIUM = 10, - HIGH = 20, - CRITICAL = 30, -} - -export enum ESCaseStatus { - OPEN = 0, - IN_PROGRESS = 10, - CLOSED = 20, -} - -/** - * This type should only be used within the cases service and its helper functions (e.g. the transforms). - * - * The type represents how the Cases object will be layed out in ES. - * 1 - It will not have connector.id or external_service.connector_id. Instead those fields will be transformed into the references field. - * 2 - The Severity type is internally a number. - */ -export type ESCaseAttributes = Omit< - CaseAttributes, - 'connector' | 'external_service' | 'severity' | 'status' -> & { - severity: ESCaseSeverity; - status: ESCaseStatus; - connector: ESCaseConnector; - external_service: ExternalServicesWithoutConnectorId | null; - total_alerts: number; - total_comments: number; -}; +import type { KueryNode } from '@kbn/es-query'; +import type { SavedObjectsClientContract } from '@kbn/core/server'; +import type { Case } from '../../../common/api'; +import type { IndexRefresh } from '../types'; +import type { User } from '../../common/types/user'; +import type { + CaseSavedObjectTransformed, + CaseTransformedAttributes, +} from '../../common/types/case'; +import type { SavedObjectFindOptionsKueryNode } from '../../common/types'; + +export interface GetCaseIdsByAlertIdArgs { + alertId: string; + filter?: KueryNode; +} + +export interface PushedArgs { + pushed_at: string; + pushed_by: User; +} + +export interface GetCaseArgs { + id: string; +} + +export interface DeleteCaseArgs extends GetCaseArgs, IndexRefresh {} + +export interface GetCasesArgs { + caseIds: string[]; + fields?: string[]; +} + +export interface FindCommentsArgs { + id: string | string[]; + options?: SavedObjectFindOptionsKueryNode; +} + +export interface FindCaseCommentsArgs { + id: string | string[]; + options?: SavedObjectFindOptionsKueryNode; +} + +export interface PostCaseArgs extends IndexRefresh { + attributes: CaseTransformedAttributes; + id: string; +} + +export interface PatchCase extends IndexRefresh { + caseId: string; + updatedAttributes: Partial; + originalCase: CaseSavedObjectTransformed; + version?: string; +} + +export type PatchCaseArgs = PatchCase; + +export interface PatchCasesArgs extends IndexRefresh { + cases: Array>; +} + +export interface CasesMapWithPageInfo { + casesMap: Map; + page: number; + perPage: number; + total: number; +} + +export interface GetTagsArgs { + unsecuredSavedObjectsClient: SavedObjectsClientContract; + filter?: KueryNode; +} + +export interface GetReportersArgs { + unsecuredSavedObjectsClient: SavedObjectsClientContract; + filter?: KueryNode; +} + +export interface GetCaseIdsByAlertIdAggs { + references: { + doc_count: number; + caseIds: { + buckets: Array<{ key: string }>; + }; + }; +} diff --git a/x-pack/plugins/cases/server/services/configure/index.test.ts b/x-pack/plugins/cases/server/services/configure/index.test.ts index 6c65aaab70828..3fb25e2ff115e 100644 --- a/x-pack/plugins/cases/server/services/configure/index.test.ts +++ b/x-pack/plugins/cases/server/services/configure/index.test.ts @@ -24,11 +24,11 @@ import type { import { ACTION_SAVED_OBJECT_TYPE } from '@kbn/actions-plugin/server'; import { loggerMock } from '@kbn/logging-mocks'; import { CaseConfigureService } from '.'; -import type { ESCasesConfigureAttributes } from './types'; import { CONNECTOR_ID_REFERENCE_NAME } from '../../common/constants'; import { getNoneCaseConnector } from '../../common/utils'; import type { ESCaseConnectorWithId } from '../test_utils'; import { createESJiraConnector, createJiraConnector } from '../test_utils'; +import type { ConfigurePersistedAttributes } from '../../common/types/configure'; const basicConfigFields = { closure_type: 'close-by-pushing' as const, @@ -60,7 +60,7 @@ const createConfigPostParams = (connector: CaseConnector): CasesConfigureAttribu const createUpdateConfigSO = ( connector?: ESCaseConnectorWithId -): SavedObjectsUpdateResponse => { +): SavedObjectsUpdateResponse => { const references: SavedObjectReference[] = connector && connector.id !== 'none' ? [ @@ -87,7 +87,7 @@ const createUpdateConfigSO = ( const createConfigSO = ( connector?: ESCaseConnectorWithId -): SavedObject => { +): SavedObject => { const references: SavedObjectReference[] = connector ? [ { @@ -119,17 +119,17 @@ const createConfigSO = ( const createConfigSOPromise = ( connector?: ESCaseConnectorWithId -): Promise> => Promise.resolve(createConfigSO(connector)); +): Promise> => Promise.resolve(createConfigSO(connector)); const createConfigFindSO = ( connector?: ESCaseConnectorWithId -): SavedObjectsFindResult => ({ +): SavedObjectsFindResult => ({ ...createConfigSO(connector), score: 0, }); const createSOFindResponse = ( - savedObjects: Array> + savedObjects: Array> ) => ({ saved_objects: savedObjects, total: savedObjects.length, @@ -163,7 +163,7 @@ describe('CaseConfigureService', () => { }); const { connector: ignoreConnector, ...restUpdateAttributes } = unsecuredSavedObjectsClient - .update.mock.calls[0][2] as Partial; + .update.mock.calls[0][2] as Partial; expect(restUpdateAttributes).toMatchInlineSnapshot(` Object { @@ -198,7 +198,7 @@ describe('CaseConfigureService', () => { }); const { connector } = unsecuredSavedObjectsClient.update.mock - .calls[0][2] as Partial; + .calls[0][2] as Partial; expect(connector?.fields).toMatchInlineSnapshot(` Array [ @@ -231,7 +231,7 @@ describe('CaseConfigureService', () => { }); const { connector } = unsecuredSavedObjectsClient.update.mock - .calls[0][2] as Partial; + .calls[0][2] as Partial; expect(connector).toMatchInlineSnapshot(` Object { @@ -269,7 +269,7 @@ describe('CaseConfigureService', () => { }); const updateAttributes = unsecuredSavedObjectsClient.update.mock - .calls[0][2] as Partial; + .calls[0][2] as Partial; expect(updateAttributes.connector).not.toHaveProperty('id'); @@ -400,7 +400,7 @@ describe('CaseConfigureService', () => { describe('post', () => { it('includes the creation attributes excluding the connector.id field', async () => { unsecuredSavedObjectsClient.create.mockReturnValue( - Promise.resolve({} as SavedObject) + Promise.resolve({} as SavedObject) ); await service.post({ @@ -410,7 +410,7 @@ describe('CaseConfigureService', () => { }); const creationAttributes = unsecuredSavedObjectsClient.create.mock - .calls[0][1] as ESCasesConfigureAttributes; + .calls[0][1] as ConfigurePersistedAttributes; expect(creationAttributes.connector).not.toHaveProperty('id'); expect(creationAttributes).toMatchInlineSnapshot(` Object { @@ -452,7 +452,7 @@ describe('CaseConfigureService', () => { it('moves the connector.id to the references', async () => { unsecuredSavedObjectsClient.create.mockReturnValue( - Promise.resolve({} as SavedObject) + Promise.resolve({} as SavedObject) ); await service.post({ @@ -478,7 +478,7 @@ describe('CaseConfigureService', () => { it('sets connector.fields to an empty array when it is not included', async () => { unsecuredSavedObjectsClient.create.mockReturnValue( - Promise.resolve({} as SavedObject) + Promise.resolve({} as SavedObject) ); await service.post({ @@ -500,7 +500,7 @@ describe('CaseConfigureService', () => { it('does not create a reference for a none connector', async () => { unsecuredSavedObjectsClient.create.mockReturnValue( - Promise.resolve({} as SavedObject) + Promise.resolve({} as SavedObject) ); await service.post({ @@ -545,7 +545,7 @@ describe('CaseConfigureService', () => { it('returns an undefined connector if it is not returned by the update', async () => { unsecuredSavedObjectsClient.update.mockReturnValue( - Promise.resolve({} as SavedObjectsUpdateResponse) + Promise.resolve({} as SavedObjectsUpdateResponse) ); const res = await service.patch({ @@ -564,7 +564,7 @@ describe('CaseConfigureService', () => { it('returns the default none connector when it cannot find the reference', async () => { const { name, type, fields } = createESJiraConnector(); - const returnValue: SavedObjectsUpdateResponse = { + const returnValue: SavedObjectsUpdateResponse = { type: CASE_CONFIGURE_SAVED_OBJECT, id: '1', attributes: { @@ -707,7 +707,7 @@ describe('CaseConfigureService', () => { type: ACTION_SAVED_OBJECT_TYPE, }, ], - } as unknown as SavedObject) + } as unknown as SavedObject) ); const res = await service.get({ unsecuredSavedObjectsClient, configurationId: '1' }); diff --git a/x-pack/plugins/cases/server/services/configure/index.ts b/x-pack/plugins/cases/server/services/configure/index.ts index 8a63f1fcfce2f..d424c96f006dc 100644 --- a/x-pack/plugins/cases/server/services/configure/index.ts +++ b/x-pack/plugins/cases/server/services/configure/index.ts @@ -8,13 +8,11 @@ import type { Logger, SavedObject, - SavedObjectsClientContract, SavedObjectsFindResponse, SavedObjectsUpdateResponse, } from '@kbn/core/server'; import { ACTION_SAVED_OBJECT_TYPE } from '@kbn/actions-plugin/server'; -import type { SavedObjectFindOptionsKueryNode } from '../../common/types'; import { CONNECTOR_ID_REFERENCE_NAME } from '../../common/constants'; import type { CasesConfigureAttributes, CasesConfigurePatch } from '../../../common/api'; import { CASE_CONFIGURE_SAVED_OBJECT } from '../../../common/constants'; @@ -24,33 +22,14 @@ import { transformESConnectorOrUseDefault, } from '../transform'; import { ConnectorReferenceHandler } from '../connector_reference_handler'; -import type { ESCasesConfigureAttributes } from './types'; -import type { IndexRefresh } from '../types'; - -interface ClientArgs { - unsecuredSavedObjectsClient: SavedObjectsClientContract; -} - -interface GetCaseConfigureArgs extends ClientArgs { - configurationId: string; -} - -interface DeleteCaseConfigureArgs extends GetCaseConfigureArgs, IndexRefresh {} - -interface FindCaseConfigureArgs extends ClientArgs { - options?: SavedObjectFindOptionsKueryNode; -} - -interface PostCaseConfigureArgs extends ClientArgs, IndexRefresh { - attributes: CasesConfigureAttributes; - id: string; -} - -interface PatchCaseConfigureArgs extends ClientArgs, IndexRefresh { - configurationId: string; - updatedAttributes: Partial; - originalConfiguration: SavedObject; -} +import type { + DeleteCaseConfigureArgs, + FindCaseConfigureArgs, + GetCaseConfigureArgs, + PatchCaseConfigureArgs, + PostCaseConfigureArgs, +} from './types'; +import type { ConfigurePersistedAttributes } from '../../common/types/configure'; export class CaseConfigureService { constructor(private readonly log: Logger) {} @@ -79,7 +58,7 @@ export class CaseConfigureService { }: GetCaseConfigureArgs): Promise> { try { this.log.debug(`Attempting to GET case configuration ${configurationId}`); - const configuration = await unsecuredSavedObjectsClient.get( + const configuration = await unsecuredSavedObjectsClient.get( CASE_CONFIGURE_SAVED_OBJECT, configurationId ); @@ -98,7 +77,7 @@ export class CaseConfigureService { try { this.log.debug(`Attempting to find all case configuration`); - const findResp = await unsecuredSavedObjectsClient.find({ + const findResp = await unsecuredSavedObjectsClient.find({ ...options, // Get the latest configuration sortField: 'created_at', @@ -122,7 +101,7 @@ export class CaseConfigureService { try { this.log.debug(`Attempting to POST a new case configuration`); const esConfigInfo = transformAttributesToESModel(attributes); - const createdConfig = await unsecuredSavedObjectsClient.create( + const createdConfig = await unsecuredSavedObjectsClient.create( CASE_CONFIGURE_SAVED_OBJECT, esConfigInfo.attributes, { id, references: esConfigInfo.referenceHandler.build(), refresh } @@ -147,7 +126,7 @@ export class CaseConfigureService { const esUpdateInfo = transformAttributesToESModel(updatedAttributes); const updatedConfiguration = - await unsecuredSavedObjectsClient.update( + await unsecuredSavedObjectsClient.update( CASE_CONFIGURE_SAVED_OBJECT, configurationId, { @@ -168,7 +147,7 @@ export class CaseConfigureService { } function transformUpdateResponseToExternalModel( - updatedConfiguration: SavedObjectsUpdateResponse + updatedConfiguration: SavedObjectsUpdateResponse ): SavedObjectsUpdateResponse { const { connector, ...restUpdatedAttributes } = updatedConfiguration.attributes ?? {}; @@ -178,10 +157,12 @@ function transformUpdateResponseToExternalModel( referenceName: CONNECTOR_ID_REFERENCE_NAME, }); + const castedAttributesWithoutConnector = restUpdatedAttributes as CasesConfigurePatch; + return { ...updatedConfiguration, attributes: { - ...restUpdatedAttributes, + ...castedAttributesWithoutConnector, // this will avoid setting connector to undefined, it won't include to field at all ...(transformedConnector && { connector: transformedConnector }), }, @@ -189,7 +170,7 @@ function transformUpdateResponseToExternalModel( } function transformToExternalModel( - configuration: SavedObject + configuration: SavedObject ): SavedObject { const connector = transformESConnectorOrUseDefault({ // if the saved object had an error the attributes field will not exist @@ -198,17 +179,19 @@ function transformToExternalModel( referenceName: CONNECTOR_ID_REFERENCE_NAME, }); + const castedAttributes = configuration.attributes as CasesConfigureAttributes; + return { ...configuration, attributes: { - ...configuration.attributes, + ...castedAttributes, connector, }, }; } function transformFindResponseToExternalModel( - configurations: SavedObjectsFindResponse + configurations: SavedObjectsFindResponse ): SavedObjectsFindResponse { return { ...configurations, @@ -220,15 +203,15 @@ function transformFindResponseToExternalModel( } function transformAttributesToESModel(configuration: CasesConfigureAttributes): { - attributes: ESCasesConfigureAttributes; + attributes: ConfigurePersistedAttributes; referenceHandler: ConnectorReferenceHandler; }; function transformAttributesToESModel(configuration: Partial): { - attributes: Partial; + attributes: Partial; referenceHandler: ConnectorReferenceHandler; }; function transformAttributesToESModel(configuration: Partial): { - attributes: Partial; + attributes: Partial; referenceHandler: ConnectorReferenceHandler; } { const { connector, ...restWithoutConnector } = configuration; diff --git a/x-pack/plugins/cases/server/services/configure/types.ts b/x-pack/plugins/cases/server/services/configure/types.ts index 4e6ecc03955ae..2d47e32387a5c 100644 --- a/x-pack/plugins/cases/server/services/configure/types.ts +++ b/x-pack/plugins/cases/server/services/configure/types.ts @@ -5,13 +5,32 @@ * 2.0. */ +import type { SavedObject, SavedObjectsClientContract } from '@kbn/core/server'; import type { CasesConfigureAttributes } from '../../../common/api'; -import type { ESCaseConnector } from '..'; +import type { IndexRefresh } from '../types'; +import type { SavedObjectFindOptionsKueryNode } from '../../common/types'; -/** - * This type should only be used within the configure service. It represents how the configure saved object will be layed - * out in ES. - */ -export type ESCasesConfigureAttributes = Omit & { - connector: ESCaseConnector; -}; +export interface ClientArgs { + unsecuredSavedObjectsClient: SavedObjectsClientContract; +} + +export interface GetCaseConfigureArgs extends ClientArgs { + configurationId: string; +} + +export interface DeleteCaseConfigureArgs extends GetCaseConfigureArgs, IndexRefresh {} + +export interface FindCaseConfigureArgs extends ClientArgs { + options?: SavedObjectFindOptionsKueryNode; +} + +export interface PostCaseConfigureArgs extends ClientArgs, IndexRefresh { + attributes: CasesConfigureAttributes; + id: string; +} + +export interface PatchCaseConfigureArgs extends ClientArgs, IndexRefresh { + configurationId: string; + updatedAttributes: Partial; + originalConfiguration: SavedObject; +} diff --git a/x-pack/plugins/cases/server/services/connector_mappings/index.ts b/x-pack/plugins/cases/server/services/connector_mappings/index.ts index 3f0c2d64260a7..f5301337770d6 100644 --- a/x-pack/plugins/cases/server/services/connector_mappings/index.ts +++ b/x-pack/plugins/cases/server/services/connector_mappings/index.ts @@ -5,41 +5,38 @@ * 2.0. */ -import type { Logger, SavedObjectReference, SavedObjectsClientContract } from '@kbn/core/server'; +import type { + Logger, + SavedObject, + SavedObjectsFindResponse, + SavedObjectsUpdateResponse, +} from '@kbn/core/server'; import { CASE_CONNECTOR_MAPPINGS_SAVED_OBJECT } from '../../../common/constants'; +import type { + FindConnectorMappingsArgs, + PostConnectorMappingsArgs, + UpdateConnectorMappingsArgs, +} from './types'; +import type { ConnectorMappingsPersistedAttributes } from '../../common/types/connector_mappings'; import type { ConnectorMappings } from '../../../common/api'; -import type { SavedObjectFindOptionsKueryNode } from '../../common/types'; -import type { IndexRefresh } from '../types'; - -interface ClientArgs { - unsecuredSavedObjectsClient: SavedObjectsClientContract; -} -interface FindConnectorMappingsArgs extends ClientArgs { - options?: SavedObjectFindOptionsKueryNode; -} - -interface PostConnectorMappingsArgs extends ClientArgs, IndexRefresh { - attributes: ConnectorMappings; - references: SavedObjectReference[]; -} - -interface UpdateConnectorMappingsArgs extends ClientArgs, IndexRefresh { - mappingId: string; - attributes: Partial; - references: SavedObjectReference[]; -} export class ConnectorMappingsService { constructor(private readonly log: Logger) {} - public async find({ unsecuredSavedObjectsClient, options }: FindConnectorMappingsArgs) { + public async find({ + unsecuredSavedObjectsClient, + options, + }: FindConnectorMappingsArgs): Promise> { try { this.log.debug(`Attempting to find all connector mappings`); - return await unsecuredSavedObjectsClient.find({ - ...options, - type: CASE_CONNECTOR_MAPPINGS_SAVED_OBJECT, - }); + const connectorMappings = + await unsecuredSavedObjectsClient.find({ + ...options, + type: CASE_CONNECTOR_MAPPINGS_SAVED_OBJECT, + }); + + return connectorMappings as SavedObjectsFindResponse; } catch (error) { this.log.error(`Attempting to find all connector mappings: ${error}`); throw error; @@ -51,17 +48,20 @@ export class ConnectorMappingsService { attributes, references, refresh, - }: PostConnectorMappingsArgs) { + }: PostConnectorMappingsArgs): Promise> { try { this.log.debug(`Attempting to POST a new connector mappings`); - return await unsecuredSavedObjectsClient.create( - CASE_CONNECTOR_MAPPINGS_SAVED_OBJECT, - attributes, - { - references, - refresh, - } - ); + const connectorMappings = + await unsecuredSavedObjectsClient.create( + CASE_CONNECTOR_MAPPINGS_SAVED_OBJECT, + attributes, + { + references, + refresh, + } + ); + + return connectorMappings as SavedObject; } catch (error) { this.log.error(`Error on POST a new connector mappings: ${error}`); throw error; @@ -74,18 +74,21 @@ export class ConnectorMappingsService { attributes, references, refresh, - }: UpdateConnectorMappingsArgs) { + }: UpdateConnectorMappingsArgs): Promise> { try { this.log.debug(`Attempting to UPDATE connector mappings ${mappingId}`); - return await unsecuredSavedObjectsClient.update( - CASE_CONNECTOR_MAPPINGS_SAVED_OBJECT, - mappingId, - attributes, - { - references, - refresh, - } - ); + const updatedMappings = + await unsecuredSavedObjectsClient.update( + CASE_CONNECTOR_MAPPINGS_SAVED_OBJECT, + mappingId, + attributes, + { + references, + refresh, + } + ); + + return updatedMappings as SavedObjectsUpdateResponse; } catch (error) { this.log.error(`Error on UPDATE connector mappings ${mappingId}: ${error}`); throw error; diff --git a/x-pack/plugins/cases/server/services/connector_mappings/types.ts b/x-pack/plugins/cases/server/services/connector_mappings/types.ts new file mode 100644 index 0000000000000..a82663dbdfdac --- /dev/null +++ b/x-pack/plugins/cases/server/services/connector_mappings/types.ts @@ -0,0 +1,30 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { SavedObjectReference, SavedObjectsClientContract } from '@kbn/core/server'; + +import type { ConnectorMappings } from '../../../common/api'; +import type { SavedObjectFindOptionsKueryNode } from '../../common/types'; +import type { IndexRefresh } from '../types'; + +export interface ClientArgs { + unsecuredSavedObjectsClient: SavedObjectsClientContract; +} +export interface FindConnectorMappingsArgs extends ClientArgs { + options?: SavedObjectFindOptionsKueryNode; +} + +export interface PostConnectorMappingsArgs extends ClientArgs, IndexRefresh { + attributes: ConnectorMappings; + references: SavedObjectReference[]; +} + +export interface UpdateConnectorMappingsArgs extends ClientArgs, IndexRefresh { + mappingId: string; + attributes: Partial; + references: SavedObjectReference[]; +} diff --git a/x-pack/plugins/cases/server/services/index.ts b/x-pack/plugins/cases/server/services/index.ts index e15584b6ced9e..f1bfc940a36f1 100644 --- a/x-pack/plugins/cases/server/services/index.ts +++ b/x-pack/plugins/cases/server/services/index.ts @@ -6,7 +6,6 @@ */ import type { SavedObjectsClientContract } from '@kbn/core/server'; -import type { ConnectorTypes } from '../../common/api'; export { CasesService } from './cases'; export { CaseConfigureService } from './configure'; @@ -19,14 +18,3 @@ export { UserProfileService } from './user_profiles'; export interface ClientArgs { unsecuredSavedObjectsClient: SavedObjectsClientContract; } - -export type ESConnectorFields = Array<{ - key: string; - value: unknown; -}>; - -export interface ESCaseConnector { - name: string; - type: ConnectorTypes; - fields: ESConnectorFields | null; -} diff --git a/x-pack/plugins/cases/server/services/notifications/email_notification_service.ts b/x-pack/plugins/cases/server/services/notifications/email_notification_service.ts index 2800a248b1394..8c8fd98e1a848 100644 --- a/x-pack/plugins/cases/server/services/notifications/email_notification_service.ts +++ b/x-pack/plugins/cases/server/services/notifications/email_notification_service.ts @@ -11,7 +11,7 @@ import type { NotificationsPluginStart } from '@kbn/notifications-plugin/server' import type { SecurityPluginStart } from '@kbn/security-plugin/server'; import type { UserProfileUserInfo } from '@kbn/user-profile-components'; import { CASE_SAVED_OBJECT, MAX_CONCURRENT_SEARCHES } from '../../../common/constants'; -import type { CaseSavedObject } from '../../common/types'; +import type { CaseSavedObjectTransformed } from '../../common/types/case'; import { getCaseViewPath } from '../../common/utils'; import type { NotificationService, NotifyArgs } from './types'; @@ -46,12 +46,12 @@ export class EmailNotificationService implements NotificationService { this.publicBaseUrl = publicBaseUrl; } - private static getTitle(theCase: CaseSavedObject) { + private static getTitle(theCase: CaseSavedObjectTransformed) { return `[Elastic][Cases] ${theCase.attributes.title}`; } private static getMessage( - theCase: CaseSavedObject, + theCase: CaseSavedObjectTransformed, spaceId: string, publicBaseUrl?: IBasePath['publicBaseUrl'] ) { diff --git a/x-pack/plugins/cases/server/services/notifications/types.ts b/x-pack/plugins/cases/server/services/notifications/types.ts index 0efc326cf7835..48909c00a77d7 100644 --- a/x-pack/plugins/cases/server/services/notifications/types.ts +++ b/x-pack/plugins/cases/server/services/notifications/types.ts @@ -6,11 +6,11 @@ */ import type { CaseAssignees } from '../../../common/api'; -import type { CaseSavedObject } from '../../common/types'; +import type { CaseSavedObjectTransformed } from '../../common/types/case'; export interface NotifyArgs { assignees: CaseAssignees; - theCase: CaseSavedObject; + theCase: CaseSavedObjectTransformed; } export interface NotificationService { diff --git a/x-pack/plugins/cases/server/services/so_references.ts b/x-pack/plugins/cases/server/services/so_references.ts index f85c4cab1829d..8a3cc747c752a 100644 --- a/x-pack/plugins/cases/server/services/so_references.ts +++ b/x-pack/plugins/cases/server/services/so_references.ts @@ -5,15 +5,16 @@ * 2.0. */ -import type { SavedObjectsUpdateResponse } from '@kbn/core/server'; -import type { SavedObject, SavedObjectReference } from '@kbn/core/types'; +import type { + SavedObjectsUpdateResponse, + SavedObject, + SavedObjectReference, +} from '@kbn/core/server'; import { isEqual, uniqWith } from 'lodash'; import type { CommentAttributesNoSO, - CommentRequest, CommentAttributes, CommentPatchAttributes, - CommentAttributesWithoutRefs, } from '../../common/api'; import type { PersistableStateAttachmentTypeRegistry } from '../attachment_framework/persistable_state_registry'; import { @@ -21,11 +22,17 @@ import { extractPersistableStateReferencesFromSO, } from '../attachment_framework/so_references'; import { EXTERNAL_REFERENCE_REF_NAME } from '../common/constants'; -import { isCommentRequestTypeExternalReferenceSO } from '../common/utils'; +import type { + AttachmentPersistedAttributes, + AttachmentRequestAttributes, +} from '../common/types/attachments'; +import { isCommentRequestTypeExternalReferenceSO } from './type_guards'; import type { PartialField } from '../types'; import { SOReferenceExtractor } from './so_reference_extractor'; -export const getAttachmentSOExtractor = (attachment: Partial) => { +export const getAttachmentSOExtractor = ( + attachment: Partial +): SOReferenceExtractor => { const fieldsToExtract = []; if (isCommentRequestTypeExternalReferenceSO(attachment)) { @@ -47,7 +54,7 @@ type OptionalAttributes = PartialField, 'attributes'>; * then the error field will be set and attributes will be undefined. */ export const injectAttachmentAttributesAndHandleErrors = ( - savedObject: OptionalAttributes, + savedObject: OptionalAttributes, persistableStateAttachmentTypeRegistry: PersistableStateAttachmentTypeRegistry ): OptionalAttributes => { if (!hasAttributes(savedObject)) { @@ -64,9 +71,9 @@ const hasAttributes = (savedObject: OptionalAttributes): savedObject is Sa }; export const injectAttachmentSOAttributesFromRefs = ( - savedObject: SavedObject, + savedObject: SavedObject, persistableStateAttachmentTypeRegistry: PersistableStateAttachmentTypeRegistry -) => { +): SavedObject => { const soExtractor = getAttachmentSOExtractor(savedObject.attributes); const so = soExtractor.populateFieldsFromReferences(savedObject); const injectedAttributes = injectPersistableReferencesToSO(so.attributes, so.references, { @@ -78,9 +85,9 @@ export const injectAttachmentSOAttributesFromRefs = ( export const injectAttachmentSOAttributesFromRefsForPatch = ( updatedAttributes: CommentPatchAttributes, - savedObject: SavedObjectsUpdateResponse, + savedObject: SavedObjectsUpdateResponse, persistableStateAttachmentTypeRegistry: PersistableStateAttachmentTypeRegistry -) => { +): SavedObjectsUpdateResponse => { const soExtractor = getAttachmentSOExtractor(savedObject.attributes); const so = soExtractor.populateFieldsFromReferencesForPatch({ dataBeforeRequest: updatedAttributes, @@ -101,11 +108,17 @@ export const injectAttachmentSOAttributesFromRefsForPatch = ( } as SavedObjectsUpdateResponse; }; +interface ExtractionResults { + attributes: AttachmentPersistedAttributes; + references: SavedObjectReference[]; + didDeleteOperation: boolean; +} + export const extractAttachmentSORefsFromAttributes = ( attributes: CommentAttributes | CommentPatchAttributes, references: SavedObjectReference[], persistableStateAttachmentTypeRegistry: PersistableStateAttachmentTypeRegistry -) => { +): ExtractionResults => { const soExtractor = getAttachmentSOExtractor(attributes); const { @@ -129,5 +142,5 @@ export const extractAttachmentSORefsFromAttributes = ( }; }; -export const getUniqueReferences = (references: SavedObjectReference[]) => +export const getUniqueReferences = (references: SavedObjectReference[]): SavedObjectReference[] => uniqWith(references, isEqual); diff --git a/x-pack/plugins/cases/server/services/test_utils.ts b/x-pack/plugins/cases/server/services/test_utils.ts index d0108564d476a..f0cfdbe6b1866 100644 --- a/x-pack/plugins/cases/server/services/test_utils.ts +++ b/x-pack/plugins/cases/server/services/test_utils.ts @@ -7,7 +7,6 @@ import type { SavedObject, SavedObjectReference, SavedObjectsFindResult } from '@kbn/core/server'; import { ACTION_SAVED_OBJECT_TYPE } from '@kbn/actions-plugin/server'; -import type { ESConnectorFields } from '.'; import { CONNECTOR_ID_REFERENCE_NAME, PUSH_CONNECTOR_ID_REFERENCE_NAME } from '../common/constants'; import type { CaseAttributes, @@ -17,9 +16,11 @@ import type { } from '../../common/api'; import { CaseSeverity, CaseStatuses, ConnectorTypes, NONE_CONNECTOR_ID } from '../../common/api'; import { CASE_SAVED_OBJECT, SECURITY_SOLUTION_OWNER } from '../../common/constants'; -import type { ESCaseAttributes, ExternalServicesWithoutConnectorId } from './cases/types'; -import { ESCaseSeverity, ESCaseStatus } from './cases/types'; import { getNoneCaseConnector } from '../common/utils'; +import type { ConnectorPersistedFields } from '../common/types/connectors'; +import type { CasePersistedAttributes } from '../common/types/case'; +import { CasePersistedSeverity, CasePersistedStatus } from '../common/types/case'; +import type { ExternalServicePersisted } from '../common/types/external_service'; /** * This is only a utility interface to help with constructing test cases. After the migration, the ES format will no longer @@ -29,7 +30,7 @@ export interface ESCaseConnectorWithId { id: string; name: string; type: ConnectorTypes; - fields: ESConnectorFields | null; + fields: ConnectorPersistedFields | null; } /** @@ -97,7 +98,7 @@ export const createExternalService = ( ...overrides, }); -export const basicESCaseFields: ESCaseAttributes = { +export const basicESCaseFields: CasePersistedAttributes = { closed_at: null, closed_by: null, created_at: '2019-11-25T21:54:48.952Z', @@ -106,11 +107,11 @@ export const basicESCaseFields: ESCaseAttributes = { email: 'testemail@elastic.co', username: 'elastic', }, - severity: ESCaseSeverity.LOW, + severity: CasePersistedSeverity.LOW, duration: null, description: 'This is a brand new case of a bad meanie defacing data', title: 'Super Bad Security Issue', - status: ESCaseStatus.OPEN, + status: CasePersistedStatus.OPEN, tags: ['defacement'], updated_at: '2019-11-25T21:54:48.952Z', updated_by: { @@ -167,9 +168,9 @@ export const createCaseSavedObjectResponse = ({ }: { connector?: ESCaseConnectorWithId; externalService?: CaseFullExternalService; - overrides?: Partial; + overrides?: Partial; caseId?: string; -} = {}): SavedObject => { +} = {}): SavedObject => { const references: SavedObjectReference[] = createSavedObjectReferences({ connector, externalService, @@ -181,7 +182,7 @@ export const createCaseSavedObjectResponse = ({ fields: connector?.fields ?? null, }; - let restExternalService: ExternalServicesWithoutConnectorId | null = null; + let restExternalService: ExternalServicePersisted | null = null; if (externalService !== null) { const { connector_id: ignored, ...rest } = externalService ?? { connector_name: '.jira', diff --git a/x-pack/plugins/cases/server/services/transform.ts b/x-pack/plugins/cases/server/services/transform.ts index 50d5192610d4f..1229ec1fd6c62 100644 --- a/x-pack/plugins/cases/server/services/transform.ts +++ b/x-pack/plugins/cases/server/services/transform.ts @@ -9,7 +9,7 @@ import type { SavedObjectReference } from '@kbn/core/server'; import { ACTION_SAVED_OBJECT_TYPE } from '@kbn/actions-plugin/server'; import type { CaseConnector, ConnectorTypeFields } from '../../common/api'; import { getNoneCaseConnector } from '../common/utils'; -import type { ESCaseConnector, ESConnectorFields } from '.'; +import type { ConnectorPersistedFields, ConnectorPersisted } from '../common/types/connectors'; export function findConnectorIdReference( name: string, @@ -23,7 +23,7 @@ export function transformESConnectorToExternalModel({ references, referenceName, }: { - connector?: ESCaseConnector; + connector?: ConnectorPersisted; references?: SavedObjectReference[]; referenceName: string; }): CaseConnector | undefined { @@ -32,7 +32,7 @@ export function transformESConnectorToExternalModel({ } function transformConnectorFieldsToExternalModel( - connector?: ESCaseConnector, + connector?: ConnectorPersisted, connectorId?: string ): CaseConnector | undefined { if (!connector) { @@ -72,7 +72,7 @@ export function transformESConnectorOrUseDefault({ references, referenceName, }: { - connector?: ESCaseConnector; + connector?: ConnectorPersisted; references?: SavedObjectReference[]; referenceName: string; }): CaseConnector { @@ -82,12 +82,12 @@ export function transformESConnectorOrUseDefault({ ); } -export function transformFieldsToESModel(connector: CaseConnector): ESConnectorFields { +export function transformFieldsToESModel(connector: CaseConnector): ConnectorPersistedFields { if (!connector.fields) { return []; } - return Object.entries(connector.fields).reduce( + return Object.entries(connector.fields).reduce( (acc, [key, value]) => [ ...acc, { diff --git a/x-pack/plugins/cases/server/services/type_guards.ts b/x-pack/plugins/cases/server/services/type_guards.ts new file mode 100644 index 0000000000000..ec4c100b17585 --- /dev/null +++ b/x-pack/plugins/cases/server/services/type_guards.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { CommentRequestExternalReferenceSOType } from '../../common/api'; +import { CommentType, ExternalReferenceStorageType } from '../../common/api'; +import type { AttachmentRequestAttributes } from '../common/types/attachments'; + +/** + * A type narrowing function for external reference saved object attachments. + */ +export const isCommentRequestTypeExternalReferenceSO = ( + context: Partial +): context is CommentRequestExternalReferenceSOType => { + return ( + context.type === CommentType.externalReference && + context.externalReferenceStorage?.type === ExternalReferenceStorageType.savedObject + ); +}; diff --git a/x-pack/plugins/cases/server/services/user_actions/index.ts b/x-pack/plugins/cases/server/services/user_actions/index.ts index 252e3985a7483..167f0e123fb07 100644 --- a/x-pack/plugins/cases/server/services/user_actions/index.ts +++ b/x-pack/plugins/cases/server/services/user_actions/index.ts @@ -5,20 +5,13 @@ * 2.0. */ -import type { - SavedObject, - SavedObjectReference, - SavedObjectsFindResponse, - SavedObjectsRawDoc, -} from '@kbn/core/server'; +import type { SavedObject, SavedObjectsFindResponse, SavedObjectsRawDoc } from '@kbn/core/server'; import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import type { KueryNode } from '@kbn/es-query'; import type { - CaseUserActionAttributesWithoutConnectorId, CaseUserActionDeprecatedResponse, CaseUserActionInjectedAttributes, - User, } from '../../../common/api'; import { ActionTypes } from '../../../common/api'; import { @@ -30,97 +23,22 @@ import { buildFilter, combineFilters } from '../../client/utils'; import type { CaseConnectorActivity, CaseConnectorFields, + ConnectorActivityAggsResult, + ConnectorFieldsBeforePushAggsResult, + GetUsersResponse, + ParticipantsAggsResult, PushInfo, PushTimeFrameInfo, ServiceContext, + TimeFrameInfo, + TopHits, + UserActionsStatsAggsResult, } from './types'; import { defaultSortField } from '../../common/utils'; import { UserActionPersister } from './operations/create'; import { UserActionFinder } from './operations/find'; import { transformToExternalModel, legacyTransformFindResponseToExternalModel } from './transform'; - -export interface UserActionItem { - attributes: CaseUserActionAttributesWithoutConnectorId; - references: SavedObjectReference[]; -} - -interface TopHits { - hits: { - total: number; - hits: SavedObjectsRawDoc[]; - }; -} - -interface TimeFrameInfo { - mostRecent: TopHits; - oldest: TopHits; -} - -interface ConnectorActivityAggsResult { - references: { - connectors: { - ids: { - buckets: Array<{ - key: string; - reverse: { - connectorActivity: { - buckets: { - changeConnector: TimeFrameInfo; - createCase: TimeFrameInfo; - pushInfo: TimeFrameInfo; - }; - }; - }; - }>; - }; - }; - }; -} - -interface ConnectorFieldsBeforePushAggsResult { - references: { - connectors: { - reverse: { - ids: { - buckets: Record; - }; - }; - }; - }; -} - -interface UserActionsStatsAggsResult { - total: number; - totals: { - buckets: Array<{ - key: string; - doc_count: number; - }>; - }; -} - -interface ParticipantsAggsResult { - participants: { - buckets: Array<{ - key: string; - docs: { - hits: { - hits: SavedObjectsRawDoc[]; - }; - }; - }>; - }; - assignees: { - buckets: Array<{ - key: string; - }>; - }; -} - -interface GetUsersResponse { - participants: Array<{ id: string; owner: string; user: User }>; - assignedAndUnassignedUsers: Set; -} +import type { UserActionPersistedAttributes } from '../../common/types/user_actions'; export class CaseUserActionService { private readonly _creator: UserActionPersister; @@ -160,7 +78,7 @@ export class CaseUserActionService { }); const response = await this.context.unsecuredSavedObjectsClient.find< - CaseUserActionAttributesWithoutConnectorId, + UserActionPersistedAttributes, ConnectorFieldsBeforePushAggsResult >({ type: CASE_USER_ACTION_SAVED_OBJECT, @@ -286,7 +204,7 @@ export class CaseUserActionService { if (fields.mostRecent.hits.hits.length > 0) { const rawFieldsDoc = fields.mostRecent.hits.hits[0]; const doc = - this.context.savedObjectsSerializer.rawToSavedObject( + this.context.savedObjectsSerializer.rawToSavedObject( rawFieldsDoc ); @@ -326,17 +244,15 @@ export class CaseUserActionService { }); const userActions = - await this.context.unsecuredSavedObjectsClient.find( - { - type: CASE_USER_ACTION_SAVED_OBJECT, - hasReference: { type, id }, - page: 1, - perPage: 1, - sortField: 'created_at', - sortOrder: 'desc', - filter: connectorsFilter, - } - ); + await this.context.unsecuredSavedObjectsClient.find({ + type: CASE_USER_ACTION_SAVED_OBJECT, + hasReference: { type, id }, + page: 1, + perPage: 1, + sortField: 'created_at', + sortOrder: 'desc', + filter: connectorsFilter, + }); if (userActions.saved_objects.length <= 0) { return; @@ -366,7 +282,7 @@ export class CaseUserActionService { }); const response = await this.context.unsecuredSavedObjectsClient.find< - CaseUserActionAttributesWithoutConnectorId, + UserActionPersistedAttributes, ConnectorActivityAggsResult >({ type: CASE_USER_ACTION_SAVED_OBJECT, @@ -414,7 +330,7 @@ export class CaseUserActionService { let fieldsDoc: SavedObject | undefined; if (rawFieldsDoc != null) { const doc = - this.context.savedObjectsSerializer.rawToSavedObject( + this.context.savedObjectsSerializer.rawToSavedObject( rawFieldsDoc ); @@ -459,7 +375,7 @@ export class CaseUserActionService { const rawPushDoc = topHits.hits.hits[0]; const doc = - this.context.savedObjectsSerializer.rawToSavedObject( + this.context.savedObjectsSerializer.rawToSavedObject( rawPushDoc ); @@ -568,16 +484,14 @@ export class CaseUserActionService { const type = CASE_SAVED_OBJECT; const userActions = - await this.context.unsecuredSavedObjectsClient.find( - { - type: CASE_USER_ACTION_SAVED_OBJECT, - hasReference: { type, id }, - page: 1, - perPage: MAX_DOCS_PER_PAGE, - sortField: 'created_at', - sortOrder: 'asc', - } - ); + await this.context.unsecuredSavedObjectsClient.find({ + type: CASE_USER_ACTION_SAVED_OBJECT, + hasReference: { type, id }, + page: 1, + perPage: MAX_DOCS_PER_PAGE, + sortField: 'created_at', + sortOrder: 'asc', + }); return legacyTransformFindResponseToExternalModel( userActions, @@ -595,6 +509,8 @@ export class CaseUserActionService { `Attempting to retrieve user actions associated with cases: [${caseIds}]` ); + // We are intentionally not adding the type here because we only want to interact with the id and this function + // should not use the attributes const finder = this.context.unsecuredSavedObjectsClient.createPointInTimeFinder({ type: CASE_USER_ACTION_SAVED_OBJECT, hasReference: caseIds.map((id) => ({ id, type: CASE_SAVED_OBJECT })), @@ -640,7 +556,7 @@ export class CaseUserActionService { const combinedFilter = combineFilters([connectorsFilter, filter]); const response = await this.context.unsecuredSavedObjectsClient.find< - CaseUserActionAttributesWithoutConnectorId, + UserActionPersistedAttributes, { references: { connectors: { ids: { buckets: Array<{ key: string }> } } } } >({ type: CASE_USER_ACTION_SAVED_OBJECT, @@ -698,7 +614,7 @@ export class CaseUserActionService { public async getCaseUserActionStats({ caseId }: { caseId: string }) { const response = await this.context.unsecuredSavedObjectsClient.find< - CaseUserActionAttributesWithoutConnectorId, + UserActionPersistedAttributes, UserActionsStatsAggsResult >({ type: CASE_USER_ACTION_SAVED_OBJECT, @@ -742,7 +658,7 @@ export class CaseUserActionService { public async getUsers({ caseId }: { caseId: string }): Promise { const response = await this.context.unsecuredSavedObjectsClient.find< - CaseUserActionAttributesWithoutConnectorId, + UserActionPersistedAttributes, ParticipantsAggsResult >({ type: CASE_USER_ACTION_SAVED_OBJECT, @@ -762,9 +678,7 @@ export class CaseUserActionService { for (const bucket of participantsBuckets) { const rawDoc = bucket.docs.hits.hits[0]; const user = - this.context.savedObjectsSerializer.rawToSavedObject( - rawDoc - ); + this.context.savedObjectsSerializer.rawToSavedObject(rawDoc); /** * We are interested only for the created_by diff --git a/x-pack/plugins/cases/server/services/user_actions/operations/create.ts b/x-pack/plugins/cases/server/services/user_actions/operations/create.ts index ff58f9e6a52fa..25096baddf479 100644 --- a/x-pack/plugins/cases/server/services/user_actions/operations/create.ts +++ b/x-pack/plugins/cases/server/services/user_actions/operations/create.ts @@ -5,81 +5,38 @@ * 2.0. */ -import type { - SavedObject, - SavedObjectReference, - SavedObjectsBulkResponse, - SavedObjectsUpdateResponse, -} from '@kbn/core/server'; +import type { SavedObject, SavedObjectsBulkResponse } from '@kbn/core/server'; import { get, isEmpty } from 'lodash'; +import type { UserActionPersistedAttributes } from '../../../common/types/user_actions'; import { CASE_SAVED_OBJECT, CASE_USER_ACTION_SAVED_OBJECT } from '../../../../common/constants'; -import type { CaseSavedObject } from '../../../common/types'; import { arraysDifference } from '../../../client/utils'; import { isUserActionType } from '../../../../common/utils/user_actions'; import type { ActionTypeValues, CaseAssignees, - CaseAttributes, CaseUserProfile, - CommentRequest, - User, UserAction as Action, } from '../../../../common/api'; import { Actions, ActionTypes } from '../../../../common/api'; import { BuilderFactory } from '../builder_factory'; import type { - Attributes, BuilderParameters, - CommonArguments, - CreateUserAction, + BulkCreateAttachmentUserAction, + BulkCreateBulkUpdateCaseUserActions, + CommonUserActionArgs, + CreatePayloadFunction, + CreateUserActionClient, + CreateUserActionES, + GetUserActionItemByDifference, + PostCaseUserActionArgs, ServiceContext, + TypedUserActionDiffedItems, UserActionEvent, - UserActionParameters, } from '../types'; import { isAssigneesArray, isStringArray } from '../type_guards'; import type { IndexRefresh } from '../../types'; import { UserActionAuditLogger } from '../audit_logger'; -type CommonUserActionArgs = CommonArguments; - -interface GetUserActionItemByDifference extends CommonUserActionArgs { - field: string; - originalValue: unknown; - newValue: unknown; -} - -interface TypedUserActionDiffedItems extends GetUserActionItemByDifference { - originalValue: T[]; - newValue: T[]; -} - -type CreatePayloadFunction = ( - items: Item[] -) => UserActionParameters['payload']; - -interface BulkCreateBulkUpdateCaseUserActions extends IndexRefresh { - originalCases: CaseSavedObject[]; - updatedCases: Array>; - user: User; -} - -interface BulkCreateAttachmentUserAction extends Omit, IndexRefresh { - attachments: Array<{ id: string; owner: string; attachment: CommentRequest }>; -} - -type CreateUserActionClient = CreateUserAction & - CommonUserActionArgs & - IndexRefresh; - -interface CreateUserActionES extends IndexRefresh { - attributes: T; - references: SavedObjectReference[]; -} - -interface PostCaseUserActionArgs extends IndexRefresh { - actions: UserActionEvent[]; -} - export class UserActionPersister { private static readonly userActionFieldsAllowed: Set = new Set(Object.keys(ActionTypes)); @@ -335,7 +292,9 @@ export class UserActionPersister { private async bulkCreate({ actions, refresh, - }: PostCaseUserActionArgs): Promise | undefined> { + }: PostCaseUserActionArgs): Promise< + SavedObjectsBulkResponse | undefined + > { if (isEmpty(actions)) { return; } @@ -343,7 +302,7 @@ export class UserActionPersister { try { this.context.log.debug(`Attempting to POST a new case user action`); - return await this.context.unsecuredSavedObjectsClient.bulkCreate( + return await this.context.unsecuredSavedObjectsClient.bulkCreate( actions.map((action) => ({ type: CASE_USER_ACTION_SAVED_OBJECT, ...action.parameters, diff --git a/x-pack/plugins/cases/server/services/user_actions/operations/find.ts b/x-pack/plugins/cases/server/services/user_actions/operations/find.ts index b04cb76f3022c..5ce99d41a5ed2 100644 --- a/x-pack/plugins/cases/server/services/user_actions/operations/find.ts +++ b/x-pack/plugins/cases/server/services/user_actions/operations/find.ts @@ -8,12 +8,10 @@ import type { KueryNode } from '@kbn/es-query'; import { fromKueryExpression } from '@kbn/es-query'; import type { SavedObjectsFindResponse } from '@kbn/core-saved-objects-api-server'; -import type { SavedObject } from '@kbn/core-saved-objects-common'; +import type { SavedObject } from '@kbn/core-saved-objects-server'; import { DEFAULT_PAGE, DEFAULT_PER_PAGE } from '../../../routes/api'; import { defaultSortField } from '../../../common/utils'; import type { - CaseUserActionAttributesWithoutConnectorId, - UserActionFindRequest, ActionTypeValues, FindTypeField, CaseUserActionInjectedAttributes, @@ -25,14 +23,10 @@ import { MAX_DOCS_PER_PAGE, } from '../../../../common/constants'; -import type { ServiceContext } from '../types'; +import type { FindOptions, ServiceContext } from '../types'; import { transformFindResponseToExternalModel, transformToExternalModel } from '../transform'; import { buildFilter, combineFilters, NodeBuilderOperators } from '../../../client/utils'; - -interface FindOptions extends UserActionFindRequest { - caseId: string; - filter?: KueryNode; -} +import type { UserActionPersistedAttributes } from '../../../common/types/user_actions'; export class UserActionFinder { constructor(private readonly context: ServiceContext) {} @@ -51,17 +45,15 @@ export class UserActionFinder { const finalFilter = combineFilters([filter, UserActionFinder.buildFilter(types)]); const userActions = - await this.context.unsecuredSavedObjectsClient.find( - { - type: CASE_USER_ACTION_SAVED_OBJECT, - hasReference: { type: CASE_SAVED_OBJECT, id: caseId }, - page: page ?? DEFAULT_PAGE, - perPage: perPage ?? DEFAULT_PER_PAGE, - sortField: 'created_at', - sortOrder: sortOrder ?? 'asc', - filter: finalFilter, - } - ); + await this.context.unsecuredSavedObjectsClient.find({ + type: CASE_USER_ACTION_SAVED_OBJECT, + hasReference: { type: CASE_SAVED_OBJECT, id: caseId }, + page: page ?? DEFAULT_PAGE, + perPage: perPage ?? DEFAULT_PER_PAGE, + sortField: 'created_at', + sortOrder: sortOrder ?? 'asc', + filter: finalFilter, + }); return transformFindResponseToExternalModel( userActions, @@ -197,7 +189,7 @@ export class UserActionFinder { const combinedFilters = combineFilters([updateActionFilter, statusChangeFilter, filter]); const finder = - this.context.unsecuredSavedObjectsClient.createPointInTimeFinder( + this.context.unsecuredSavedObjectsClient.createPointInTimeFinder( { type: CASE_USER_ACTION_SAVED_OBJECT, hasReference: { type: CASE_SAVED_OBJECT, id: caseId }, diff --git a/x-pack/plugins/cases/server/services/user_actions/transform.ts b/x-pack/plugins/cases/server/services/user_actions/transform.ts index 439e57eed386d..10a6104e15807 100644 --- a/x-pack/plugins/cases/server/services/user_actions/transform.ts +++ b/x-pack/plugins/cases/server/services/user_actions/transform.ts @@ -16,7 +16,6 @@ import { } from '../../../common/utils/user_actions'; import type { CaseUserActionAttributes, - CaseUserActionAttributesWithoutConnectorId, CaseUserActionDeprecatedResponse, CaseUserActionInjectedAttributes, } from '../../../common/api'; @@ -30,13 +29,14 @@ import { PUSH_CONNECTOR_ID_REFERENCE_NAME, } from '../../common/constants'; import { findConnectorIdReference } from '../transform'; -import { isCommentRequestTypeExternalReferenceSO } from '../../common/utils'; +import { isCommentRequestTypeExternalReferenceSO } from '../type_guards'; import type { PersistableStateAttachmentTypeRegistry } from '../../attachment_framework/persistable_state_registry'; import { injectPersistableReferencesToSO } from '../../attachment_framework/so_references'; import { findReferenceId } from '../../common/references'; +import type { UserActionPersistedAttributes } from '../../common/types/user_actions'; export function transformFindResponseToExternalModel( - userActions: SavedObjectsFindResponse, + userActions: SavedObjectsFindResponse, persistableStateAttachmentTypeRegistry: PersistableStateAttachmentTypeRegistry ): SavedObjectsFindResponse { return { @@ -49,7 +49,7 @@ export function transformFindResponseToExternalModel( } export function transformToExternalModel( - userAction: SavedObject, + userAction: SavedObject, persistableStateAttachmentTypeRegistry: PersistableStateAttachmentTypeRegistry ): SavedObject { const { references } = userAction; @@ -75,7 +75,7 @@ export function transformToExternalModel( * @deprecated remove when the getAllRoute is removed */ export function legacyTransformFindResponseToExternalModel( - userActions: SavedObjectsFindResponse, + userActions: SavedObjectsFindResponse, persistableStateAttachmentTypeRegistry: PersistableStateAttachmentTypeRegistry ): SavedObjectsFindResponse { return { @@ -91,7 +91,7 @@ export function legacyTransformFindResponseToExternalModel( * @deprecated remove when the getAll route is removed */ function legacyTransformToExternalModel( - userAction: SavedObject, + userAction: SavedObject, persistableStateAttachmentTypeRegistry: PersistableStateAttachmentTypeRegistry ): SavedObject { const { references } = userAction; @@ -114,7 +114,7 @@ function legacyTransformToExternalModel( } const addReferenceIdToPayload = ( - userAction: SavedObject, + userAction: SavedObject, persistableStateAttachmentTypeRegistry: PersistableStateAttachmentTypeRegistry ): CaseUserActionAttributes['payload'] => { const connectorId = getConnectorIdFromReferences(userAction); @@ -176,7 +176,7 @@ const addReferenceIdToPayload = ( }; function getConnectorIdFromReferences( - userAction: SavedObject + userAction: SavedObject ): string | null { const { references } = userAction; diff --git a/x-pack/plugins/cases/server/services/user_actions/types.ts b/x-pack/plugins/cases/server/services/user_actions/types.ts index 4d9813c42591d..f88bd2ba3fe15 100644 --- a/x-pack/plugins/cases/server/services/user_actions/types.ts +++ b/x-pack/plugins/cases/server/services/user_actions/types.ts @@ -11,23 +11,34 @@ import type { Logger, ISavedObjectsSerializer, SavedObject, + SavedObjectsRawDoc, + SavedObjectsUpdateResponse, } from '@kbn/core/server'; +import type { KueryNode } from '@kbn/es-query'; import type { AuditLogger } from '@kbn/security-plugin/server'; import type { CaseAssignees } from '../../../common/api/cases/assignee'; import type { + ActionTypeValues, + CaseAttributes, CasePostRequest, CaseSettings, CaseSeverity, CaseStatuses, + CaseUserActionAttributesWithoutConnectorId, CaseUserActionInjectedAttributes, + CommentRequest, CommentUserAction, ConnectorUserAction, PushedUserAction, User, UserAction, + UserActionFindRequest, UserActionTypes, } from '../../../common/api'; import type { PersistableStateAttachmentTypeRegistry } from '../../attachment_framework/persistable_state_registry'; +import type { UserActionPersistedAttributes } from '../../common/types/user_actions'; +import type { IndexRefresh } from '../types'; +import type { CaseSavedObjectTransformed } from '../../common/types/case'; export interface BuilderParameters { title: { @@ -97,17 +108,8 @@ export interface CommonArguments { action?: UserAction; } -export interface Attributes { - action: UserAction; - created_at: string; - created_by: User; - owner: string; - type: UserActionTypes; - payload: Record; -} - export interface SavedObjectParameters { - attributes: Attributes; + attributes: UserActionPersistedAttributes; references: SavedObjectReference[]; } @@ -160,3 +162,133 @@ export interface PushInfo { date: Date; connectorId: string; } + +export interface UserActionItem { + attributes: CaseUserActionAttributesWithoutConnectorId; + references: SavedObjectReference[]; +} + +export interface TopHits { + hits: { + total: number; + hits: SavedObjectsRawDoc[]; + }; +} + +export interface TimeFrameInfo { + mostRecent: TopHits; + oldest: TopHits; +} + +export interface ConnectorActivityAggsResult { + references: { + connectors: { + ids: { + buckets: Array<{ + key: string; + reverse: { + connectorActivity: { + buckets: { + changeConnector: TimeFrameInfo; + createCase: TimeFrameInfo; + pushInfo: TimeFrameInfo; + }; + }; + }; + }>; + }; + }; + }; +} + +export interface ConnectorFieldsBeforePushAggsResult { + references: { + connectors: { + reverse: { + ids: { + buckets: Record; + }; + }; + }; + }; +} + +export interface UserActionsStatsAggsResult { + total: number; + totals: { + buckets: Array<{ + key: string; + doc_count: number; + }>; + }; +} + +export interface ParticipantsAggsResult { + participants: { + buckets: Array<{ + key: string; + docs: { + hits: { + hits: SavedObjectsRawDoc[]; + }; + }; + }>; + }; + assignees: { + buckets: Array<{ + key: string; + }>; + }; +} + +export interface GetUsersResponse { + participants: Array<{ id: string; owner: string; user: User }>; + assignedAndUnassignedUsers: Set; +} + +export interface FindOptions extends UserActionFindRequest { + caseId: string; + filter?: KueryNode; +} + +export type CommonUserActionArgs = CommonArguments; + +export interface GetUserActionItemByDifference extends CommonUserActionArgs { + field: string; + originalValue: unknown; + newValue: unknown; +} + +export interface TypedUserActionDiffedItems extends GetUserActionItemByDifference { + originalValue: T[]; + newValue: T[]; +} + +export type CreatePayloadFunction = ( + items: Item[] +) => UserActionParameters['payload']; + +export interface BulkCreateBulkUpdateCaseUserActions extends IndexRefresh { + originalCases: CaseSavedObjectTransformed[]; + updatedCases: Array>; + user: User; +} + +export interface BulkCreateAttachmentUserAction + extends Omit, + IndexRefresh { + attachments: Array<{ id: string; owner: string; attachment: CommentRequest }>; +} + +export type CreateUserActionClient = CreateUserAction & + CommonUserActionArgs & + IndexRefresh; + +export interface CreateUserActionES extends IndexRefresh { + attributes: T; + references: SavedObjectReference[]; +} + +export interface PostCaseUserActionArgs extends IndexRefresh { + actions: UserActionEvent[]; +} diff --git a/x-pack/plugins/cases/server/telemetry/queries/cases.test.ts b/x-pack/plugins/cases/server/telemetry/queries/cases.test.ts index b97235ff82247..560997e8802be 100644 --- a/x-pack/plugins/cases/server/telemetry/queries/cases.test.ts +++ b/x-pack/plugins/cases/server/telemetry/queries/cases.test.ts @@ -7,7 +7,7 @@ import type { SavedObjectsFindResponse } from '@kbn/core/server'; import { savedObjectsRepositoryMock, loggingSystemMock } from '@kbn/core/server/mocks'; -import { ESCaseStatus } from '../../services/cases/types'; +import { CasePersistedStatus } from '../../common/types/case'; import type { AttachmentAggregationResult, AttachmentFrameworkAggsResult, @@ -99,7 +99,7 @@ describe('getCasesTelemetryData', () => { status: { buckets: [ { - key: ESCaseStatus.OPEN, + key: CasePersistedStatus.OPEN, doc_count: 2, }, ], diff --git a/x-pack/plugins/cases/server/telemetry/queries/cases.ts b/x-pack/plugins/cases/server/telemetry/queries/cases.ts index 59576fa1f45c0..abd1979d752e8 100644 --- a/x-pack/plugins/cases/server/telemetry/queries/cases.ts +++ b/x-pack/plugins/cases/server/telemetry/queries/cases.ts @@ -14,8 +14,6 @@ import { CASE_USER_ACTION_SAVED_OBJECT, OWNERS, } from '../../../common/constants'; -import { ESCaseStatus } from '../../services/cases/types'; -import type { ESCaseAttributes } from '../../services/cases/types'; import type { CollectTelemetryDataParams, CasesTelemetry, @@ -37,12 +35,14 @@ import { getReferencesAggregationQuery, getSolutionValues, } from './utils'; +import type { CasePersistedAttributes } from '../../common/types/case'; +import { CasePersistedStatus } from '../../common/types/case'; export const getLatestCasesDates = async ({ savedObjectsClient, }: CollectTelemetryDataParams): Promise => { const find = async (sortField: string) => - savedObjectsClient.find({ + savedObjectsClient.find({ page: 1, perPage: 1, sortField, @@ -94,9 +94,12 @@ export const getCasesTelemetryData = async ({ total: casesRes.total, ...getCountsFromBuckets(aggregationsBuckets.counts), status: { - open: findValueInBuckets(aggregationsBuckets.status, ESCaseStatus.OPEN), - inProgress: findValueInBuckets(aggregationsBuckets.status, ESCaseStatus.IN_PROGRESS), - closed: findValueInBuckets(aggregationsBuckets.status, ESCaseStatus.CLOSED), + open: findValueInBuckets(aggregationsBuckets.status, CasePersistedStatus.OPEN), + inProgress: findValueInBuckets( + aggregationsBuckets.status, + CasePersistedStatus.IN_PROGRESS + ), + closed: findValueInBuckets(aggregationsBuckets.status, CasePersistedStatus.CLOSED), }, syncAlertsOn: findValueInBuckets(aggregationsBuckets.syncAlerts, 1), syncAlertsOff: findValueInBuckets(aggregationsBuckets.syncAlerts, 0), diff --git a/x-pack/plugins/cloud_defend/public/components/control_general_view/index.tsx b/x-pack/plugins/cloud_defend/public/components/control_general_view/index.tsx index 0a253b8c68a73..0c126de3b39ec 100644 --- a/x-pack/plugins/cloud_defend/public/components/control_general_view/index.tsx +++ b/x-pack/plugins/cloud_defend/public/components/control_general_view/index.tsx @@ -338,8 +338,9 @@ export const ControlGeneralView = ({ policy, onChange, show }: ViewDeps) => {
{selectors.map((selector, i) => { - const usedByResponse = !!responses.find((response) => - response.match.includes(selector.name) + const usedByResponse = !!responses.find( + (response) => + response.match.includes(selector.name) || response?.exclude?.includes(selector.name) ); return ( diff --git a/x-pack/plugins/cloud_defend/public/components/control_general_view/translations.ts b/x-pack/plugins/cloud_defend/public/components/control_general_view/translations.ts index d80ef8030ea6a..1cb3d92150b6b 100644 --- a/x-pack/plugins/cloud_defend/public/components/control_general_view/translations.ts +++ b/x-pack/plugins/cloud_defend/public/components/control_general_view/translations.ts @@ -156,6 +156,10 @@ export const errorValueRequired = i18n.translate('xpack.cloudDefend.errorValueRe defaultMessage: 'At least one value is required.', }); +export const errorActionRequired = i18n.translate('xpack.cloudDefend.errorActionRequired', { + defaultMessage: 'At least one action is required.', +}); + export const getSelectorIconTooltip = (type: SelectorType) => { switch (type) { case 'process': diff --git a/x-pack/plugins/cloud_defend/public/components/control_general_view_response/index.test.tsx b/x-pack/plugins/cloud_defend/public/components/control_general_view_response/index.test.tsx index 24bfcbadc124f..099ce4a1c2a2e 100644 --- a/x-pack/plugins/cloud_defend/public/components/control_general_view_response/index.test.tsx +++ b/x-pack/plugins/cloud_defend/public/components/control_general_view_response/index.test.tsx @@ -206,4 +206,19 @@ describe('', () => { expect(onDuplicate.mock.calls).toHaveLength(1); expect(onDuplicate.mock.calls[0][0]).toEqual(mockResponse); }); + + it('shows an error if no actions specified', async () => { + const { getByTestId, getByText, rerender } = render(); + + const checkBox = getByTestId('cloud-defend-chkalertaction'); + if (checkBox) { + userEvent.click(checkBox); + } + + const updatedResponse = onChange.mock.calls[0][0]; + rerender(); + + expect(getByText(i18n.errorActionRequired)).toBeTruthy(); + expect(updatedResponse.hasErrors).toBeTruthy(); + }); }); diff --git a/x-pack/plugins/cloud_defend/public/components/control_general_view_response/index.tsx b/x-pack/plugins/cloud_defend/public/components/control_general_view_response/index.tsx index 88fed27c61455..af037c70bd71a 100644 --- a/x-pack/plugins/cloud_defend/public/components/control_general_view_response/index.tsx +++ b/x-pack/plugins/cloud_defend/public/components/control_general_view_response/index.tsx @@ -29,7 +29,12 @@ import { } from '@elastic/eui'; import { useStyles } from './styles'; import { useStyles as useSelectorStyles } from '../control_general_view_selector/styles'; -import { ControlGeneralViewResponseDeps, ResponseAction } from '../../types'; +import { + ControlGeneralViewResponseDeps, + ResponseAction, + Response, + ControlFormErrorMap, +} from '../../types'; import * as i18n from '../control_general_view/translations'; import { getSelectorTypeIcon } from '../../common/utils'; @@ -59,6 +64,21 @@ export const ControlGeneralViewResponse = ({ const [accordionState, setAccordionState] = useState<'open' | 'closed'>( responses.length - 1 === index ? 'open' : 'closed' ); + const onResponseChange = useCallback( + (resp: Response, i: number) => { + const hasMatch = resp.match.length > 0; + const hasActions = resp.actions.length > 0; + + if (!hasMatch || !hasActions) { + resp.hasErrors = true; + } else { + delete resp.hasErrors; + } + + onChange(resp, i); + }, + [onChange] + ); const onTogglePopover = useCallback(() => { setPopoverOpen(!isPopoverOpen); @@ -81,15 +101,10 @@ export const ControlGeneralViewResponse = ({ const onChangeMatches = useCallback( (options) => { response.match = options.map((option: EuiComboBoxOptionOption) => option.value); - if (response.match.length === 0) { - response.hasErrors = true; - } else { - delete response.hasErrors; // keeps it out of the yaml. - } - onChange(response, index); + onResponseChange(response, index); }, - [index, onChange, response] + [index, onResponseChange, response] ); const onChangeExcludes = useCallback( @@ -100,9 +115,9 @@ export const ControlGeneralViewResponse = ({ delete response.exclude; } - onChange(response, index); + onResponseChange(response, index); }, - [index, onChange, response] + [index, onResponseChange, response] ); const selectorOptions = useMemo(() => { @@ -142,8 +157,8 @@ export const ControlGeneralViewResponse = ({ const onShowExclude = useCallback(() => { const updatedResponse = { ...response }; updatedResponse.exclude = []; - onChange(updatedResponse, index); - }, [index, onChange, response]); + onResponseChange(updatedResponse, index); + }, [index, onResponseChange, response]); const logSelected = response.actions.includes('log'); const alertSelected = response.actions.includes('alert'); @@ -170,20 +185,24 @@ export const ControlGeneralViewResponse = ({ updatedResponse.actions.splice(actionIndex, 1); } - onChange(updatedResponse, index); + onResponseChange(updatedResponse, index); }, - [index, onChange, response] + [index, onResponseChange, response] ); const errors = useMemo(() => { - const errs: string[] = []; + const errs: ControlFormErrorMap = {}; if (response.match.length === 0) { - errs.push(i18n.errorValueRequired); + errs.match = [i18n.errorValueRequired]; + } + + if (response.actions.length === 0) { + errs.actions = [i18n.errorActionRequired]; } return errs; - }, [response.match.length]); + }, [response.actions.length, response.match.length]); const onToggleAccordion = useCallback((isOpen: boolean) => { setAccordionState(isOpen ? 'open' : 'closed'); @@ -205,6 +224,8 @@ export const ControlGeneralViewResponse = ({ }; }, [accordionState, response.match]); + const errorList = useMemo(() => Object.values(errors), [errors]); + return ( } > - 0}> - 0}> + 0}> + )} - + { // validate responses responses.forEach((response) => { // for now we force 'alert' action if 'block' action added. - if (response.actions.includes('block') && !response.actions.includes('alert')) { + if ( + response.actions && + response.actions.includes('block') && + !response.actions.includes('alert') + ) { errors.push(i18n.errorAlertActionRequired); } }); diff --git a/x-pack/plugins/cloud_integrations/cloud_chat/common/constants.ts b/x-pack/plugins/cloud_integrations/cloud_chat/common/constants.ts index 33dd954b5756f..b196959a582d3 100755 --- a/x-pack/plugins/cloud_integrations/cloud_chat/common/constants.ts +++ b/x-pack/plugins/cloud_integrations/cloud_chat/common/constants.ts @@ -6,4 +6,4 @@ */ export const GET_CHAT_USER_DATA_ROUTE_PATH = '/internal/cloud/chat_user'; -export const DEFAULT_TRIAL_BUFFER = 60; +export const DEFAULT_TRIAL_BUFFER = 90; diff --git a/x-pack/plugins/enterprise_search/common/connectors/native_connectors.ts b/x-pack/plugins/enterprise_search/common/connectors/native_connectors.ts index bccfe15835a63..a130d1260d5c4 100644 --- a/x-pack/plugins/enterprise_search/common/connectors/native_connectors.ts +++ b/x-pack/plugins/enterprise_search/common/connectors/native_connectors.ts @@ -7,7 +7,7 @@ import { i18n } from '@kbn/i18n'; -import { DisplayType, FeatureName, NativeConnector } from '../types/connectors'; +import { DisplayType, FeatureName, FieldType, NativeConnector } from '../types/connectors'; export const NATIVE_CONNECTOR_DEFINITIONS: Record = { mongodb: { @@ -27,7 +27,7 @@ export const NATIVE_CONNECTOR_DEFINITIONS: Record { it('test', () => { + const envConfig = Cypress.env('crawler_test'); + const indexName = 'cypress-crawler-' + Math.random(); + login(); - cy.visit('/app/enterprise_search/content/search_indices/new_index'); + cy.visit(ROUTES.NEW_INDEX); + + // Crawler selected by default + cy.getBySel(NEW_INDEX_CARD.SELECT_CRAWLER).click(); + + // we are in correct route + cy.url().should('contain', ROUTES.NEW_INDEX); + + cy.getBySel(CRAWLER_INDEX.CREATE_BUTTON).should('be.disabled'); + + // type new name + cy.getBySel(CRAWLER_INDEX.INDEX_NAME_INPUT).type(indexName); + + // create index + cy.getBySel(CRAWLER_INDEX.CREATE_BUTTON).click(); + + // make sure we are in new index + cy.url().should('contain', getIndexRoute(indexName) + 'domain_management'); + + cy.getBySel(CRAWLER_INDEX.DOMAIN_MANAGEMENT.DOMAIN_INPUT).type(envConfig.domain); + cy.getBySel(CRAWLER_INDEX.DOMAIN_MANAGEMENT.DOMAIN_BUTTON).click(); + + cy.getBySel(CRAWLER_INDEX.DOMAIN_MANAGEMENT.SUBMIT_BUTTON).should('be.enabled'); + cy.getBySel(CRAWLER_INDEX.DOMAIN_MANAGEMENT.SUBMIT_BUTTON).click(); + + cy.getBySel(CRAWLER_INDEX.CRAWL_DROPDOWN).should('be.enabled'); + cy.getBySel(CRAWLER_INDEX.CRAWL_DROPDOWN).click(); + cy.getBySel(CRAWLER_INDEX.CRAWL_ALL_DOMAINS).click(); + + // go to overview tab + cy.getBySel(INDEX_OVERVIEW.TABS.OVERVIEW).click(); + + // Page header has index name + cy.get('main header h1').should('contain.text', indexName); + // check Ingestion Type stat is Crawler + cy.getBySel(INDEX_OVERVIEW.STATS.INGESTION_TYPE).should('contain.text', 'Crawler'); + + cy.getBySel(INDEX_OVERVIEW.STATS.DOCUMENT_COUNT).should((el) => { + const text = el.text(); + const count = parseInt(text.match(/[0-9]+/g), 10); + expect(count).to.gt(0); + }); }); }); diff --git a/x-pack/plugins/enterprise_search/cypress/e2e/content/new_index/mongo_connector.cy.ts b/x-pack/plugins/enterprise_search/cypress/e2e/content/new_index/mongo_connector.cy.ts new file mode 100644 index 0000000000000..dd1fd0e4ccb43 --- /dev/null +++ b/x-pack/plugins/enterprise_search/cypress/e2e/content/new_index/mongo_connector.cy.ts @@ -0,0 +1,95 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { login } from '../../../tasks/login'; +import { + CONNECTOR_INDEX, + getIndexRoute, + INDEX_OVERVIEW, + NEW_INDEX_CARD, + NEW_CONNECTOR_PAGE, + ROUTES, + SELECT_CONNECTOR, + SEARCH_INDICES, +} from '../selectors'; + +describe('Enterprise Search MongoDB connector', () => { + it('succesfully syncs documents with single sync', () => { + // Get configuration information from cypress.env.json + const mongoConfig = Cypress.env('mongo_test'); + const indexName = 'cypress-mongodb-' + Math.random(); + const baseUrl = Cypress.config().baseUrl; + login(); + + cy.visit(ROUTES.SEARCH_INDICES_OVERVIEW); + cy.getBySel(SEARCH_INDICES.CREATE_INDEX_BUTTON).click(); + + cy.url().should('eq', baseUrl + ROUTES.NEW_INDEX); + + // select connector + cy.getBySel(NEW_INDEX_CARD.SELECT_CONNECTOR).click(); + + // we are in correct route + cy.url().should('contain', ROUTES.SELECT_CONNECTOR); + + // Select MongoDB from the list + cy.get('#checkableCard-mongodb').should('not.be.selected'); + cy.get('#checkableCard-mongodb-details') + .find('a') + .invoke('attr', 'href') + .should('include', 'connectors-mongodb.html'); + + cy.get('#checkableCard-mongodb').click(); + + cy.getBySel(SELECT_CONNECTOR.SELECT_AND_CONFIGURE_BUTTON).click(); + + // Connector URL, mongo selected + cy.url().should('contain', 'service_type=mongodb'); + + cy.getBySel(NEW_CONNECTOR_PAGE.INDEX_NAME_INPUT).type(indexName); + + // create index + cy.getBySel(NEW_CONNECTOR_PAGE.CREATE_BUTTON).click(); + + // make sure we are in new index route + cy.url().should('contain', getIndexRoute(indexName) + 'configuration'); + + // Fill in connector configuration + cy.getBySel(CONNECTOR_INDEX.getConfigurationRow('host')).type(mongoConfig.host); + cy.getBySel(CONNECTOR_INDEX.getConfigurationRow('user')).type(mongoConfig.username); + cy.getBySel(CONNECTOR_INDEX.getConfigurationRow('password')).type(mongoConfig.password); + cy.getBySel(CONNECTOR_INDEX.getConfigurationRow('database')).type(mongoConfig.database); + cy.getBySel(CONNECTOR_INDEX.getConfigurationRow('collection')).type(mongoConfig.collection); + cy.getBySel(CONNECTOR_INDEX.SAVE_CONFIG).click(); + + // Wait until configuration is saved + cy.getBySel(CONNECTOR_INDEX.EDIT_CONFIG); + cy.getBySel(CONNECTOR_INDEX.SET_SCHEDULE_BUTTON).click(); + + // Scheduling Tab opened + cy.url().should('contain', getIndexRoute(indexName) + 'scheduling'); + + // Start one time sync + cy.getBySel(CONNECTOR_INDEX.HEADER_SYNC_MENU).click(); + cy.getBySel(CONNECTOR_INDEX.HEADER_SYNC_MENU_START).click(); + + // go to overview tab + cy.getBySel(INDEX_OVERVIEW.TABS.OVERVIEW).click(); + + cy.getBySel(INDEX_OVERVIEW.STATS.INGESTION_TYPE).should('contain.text', 'Connector'); + cy.getBySel(INDEX_OVERVIEW.STATS.CONNECTOR_TYPE).should('contain.text', 'MongoDB'); + cy.getBySel(INDEX_OVERVIEW.STATS.INGESTION_STATUS).should('contain.text', 'Configured'); + cy.getBySel(INDEX_OVERVIEW.STATS.INGESTION_STATUS).should('contain.text', 'Connected'); + + // Wait until document count > 0 + cy.getBySel(INDEX_OVERVIEW.STATS.DOCUMENT_COUNT).should((el) => { + const text = el.text(); + const count = parseInt(text.match(/[0-9]+/g), 10); + expect(count).to.gt(0); + }); + }); +}); diff --git a/x-pack/plugins/enterprise_search/cypress/e2e/content/selectors.ts b/x-pack/plugins/enterprise_search/cypress/e2e/content/selectors.ts new file mode 100644 index 0000000000000..e6f1e2e45174d --- /dev/null +++ b/x-pack/plugins/enterprise_search/cypress/e2e/content/selectors.ts @@ -0,0 +1,70 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export const ROUTES = { + CRAWLER_INDEX: '/app/enterprise_search/content/search_indices/new_index/crawler', + NEW_INDEX: '/app/enterprise_search/content/search_indices/new_index', + SEARCH_INDICES_OVERVIEW: '/app/enterprise_search/content/search_indices/', + SELECT_CONNECTOR: '/app/enterprise_search/content/search_indices/new_index/select_connector', +}; + +export const SEARCH_INDICES = { + CREATE_INDEX_BUTTON: 'entSearchContent-searchIndices-createButton', +}; + +export const SELECT_CONNECTOR = { + SELECT_AND_CONFIGURE_BUTTON: 'entSearchContent-connector-selectConnector-selectAndConfigure', +}; + +export const NEW_CONNECTOR_PAGE = { + CREATE_BUTTON: 'entSearchContent-connector-newIndex-createIndex', + INDEX_NAME_INPUT: 'entSearchContent-connector-newIndex-editName', +}; + +export const CONNECTOR_INDEX = { + EDIT_CONFIG: 'entSearchContent-connector-configuration-editConfiguration', + HEADER_SYNC_MENU: 'entSearchContent-connector-header-sync-menu', + HEADER_SYNC_MENU_START: 'entSearchContent-connector-header-sync-startSync', + SAVE_CONFIG: 'entSearchContent-connector-configuration-saveConfiguration', + SET_SCHEDULE_BUTTON: 'entSearchContent-connector-configuration-setScheduleAndSync', + getConfigurationRow: (rowkey: string) => + `entSearchContent-connector-configuration-formrow-${rowkey}`, +}; + +export const NEW_INDEX_CARD = { + SELECT_CONNECTOR: 'entSearchContent-newIndexCard-button-connector', + SELECT_CRAWLER: 'entSearchContent-newIndexCard-button-crawler', +}; + +export const CRAWLER_INDEX = { + CRAWL_ALL_DOMAINS: 'entSearchContent-crawler-startCrawlMenu-crawlAllDomains', + CRAWL_DROPDOWN: 'entSearchContent-crawler-startCrawlMenu-menuButton', + CREATE_BUTTON: 'entSearchContent-crawler-newIndex-createIndex', + DOMAIN_MANAGEMENT: { + DOMAIN_BUTTON: 'entSearchContent-crawler-addDomainForm-validate-button', + DOMAIN_INPUT: 'entSearchContent-crawler-addDomainForm-validate-input', + SUBMIT_BUTTON: 'entSearchContent-crawler-addDomain-submitButton', + }, + INDEX_NAME_INPUT: 'entSearchContent-crawler-newIndex-editName', +}; + +export const INDEX_OVERVIEW = { + STATS: { + CONNECTOR_TYPE: 'entSearchContent-indexOverview-totalStats-connectorType', + DOCUMENT_COUNT: 'entSearchContent-indexOverview-totalStats-documentCount', + INGESTION_STATUS: 'entSearchContent-indexOverview-connectorStats-ingestionStatus', + INGESTION_TYPE: 'entSearchContent-indexOverview-totalStats-ingestionType', + }, + TABS: { + CRAWLER_SCHEDULER: 'entSearchContent-index-crawler-scheduler-tab', + OVERVIEW: 'entSearchContent-index-overview-tab', + }, +}; + +export const getIndexRoute = (indexName: string) => { + return `/app/enterprise_search/content/search_indices/search-${indexName}/`; +}; diff --git a/x-pack/plugins/enterprise_search/cypress/support/e2e.ts b/x-pack/plugins/enterprise_search/cypress/support/e2e.ts index 1e2b130d59973..df0828bfa15cd 100644 --- a/x-pack/plugins/enterprise_search/cypress/support/e2e.ts +++ b/x-pack/plugins/enterprise_search/cypress/support/e2e.ts @@ -29,9 +29,10 @@ declare global { // eslint-disable-next-line @typescript-eslint/no-namespace namespace Cypress { interface Chainable { + // eslint-disable-next-line @typescript-eslint/no-explicit-any + findBySel(value: string, ...args: any[]): Chainable; // eslint-disable-next-line @typescript-eslint/no-explicit-any getBySel(value: string, ...args: any[]): Chainable; - getKibanaVersion(): Chainable; } } } @@ -41,7 +42,13 @@ function getBySel(selector: string, ...args: any[]) { return cy.get(`[data-test-subj="${selector}"]`, ...args); } +// eslint-disable-next-line @typescript-eslint/no-explicit-any +function findBySel(selector: string, ...args: any[]) { + return cy.find(`[data-test-subj="${selector}"]`, ...args); +} + Cypress.Commands.add('getBySel', getBySel); +Cypress.Commands.add('findBySel', findBySel); Cypress.on('uncaught:exception', () => { return false; diff --git a/x-pack/plugins/enterprise_search/public/applications/__mocks__/kea_logic/hooks.mock.ts b/x-pack/plugins/enterprise_search/public/applications/__mocks__/kea_logic/hooks.mock.ts index ce21fd08f180a..77e40a9094d7c 100644 --- a/x-pack/plugins/enterprise_search/public/applications/__mocks__/kea_logic/hooks.mock.ts +++ b/x-pack/plugins/enterprise_search/public/applications/__mocks__/kea_logic/hooks.mock.ts @@ -36,8 +36,8 @@ export const mockAllActions = { */ jest.mock('kea', () => ({ ...(jest.requireActual('kea') as object), - useValues: jest.fn(() => ({ ...mockAllValues })), useActions: jest.fn(() => ({ ...mockAllActions })), + useValues: jest.fn(() => ({ ...mockAllValues })), })); /** diff --git a/x-pack/plugins/enterprise_search/public/applications/__mocks__/kea_logic/kibana_logic.mock.ts b/x-pack/plugins/enterprise_search/public/applications/__mocks__/kea_logic/kibana_logic.mock.ts index 9c1b0575694c4..d79ebb3530ce2 100644 --- a/x-pack/plugins/enterprise_search/public/applications/__mocks__/kea_logic/kibana_logic.mock.ts +++ b/x-pack/plugins/enterprise_search/public/applications/__mocks__/kea_logic/kibana_logic.mock.ts @@ -35,6 +35,7 @@ export const mockKibanaValues = { guidedOnboarding: {}, history: mockHistory, isCloud: false, + isSidebarEnabled: true, lens: { EmbeddableComponent: jest.fn(), stateHelperApi: jest.fn().mockResolvedValue({ diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/search_indices.mock.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/search_indices.mock.ts index 1a4a58558dc5c..0f864125659fa 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/search_indices.mock.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/search_indices.mock.ts @@ -10,6 +10,7 @@ import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE } from '../../../../co import { ConnectorStatus, DisplayType, + FieldType, FilteringPolicy, FilteringRuleRule, FilteringValidationState, @@ -45,6 +46,7 @@ export const indices: ElasticsearchIndexWithIngestion[] = [ required: false, sensitive: false, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], value: 'barbar', }, @@ -156,6 +158,7 @@ export const indices: ElasticsearchIndexWithIngestion[] = [ required: false, sensitive: false, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], value: 'barbar', }, diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/view_index.mock.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/view_index.mock.ts index 3f9972d1545c5..4e2a0ceda0fbc 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/view_index.mock.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/__mocks__/view_index.mock.ts @@ -10,6 +10,7 @@ import { ENTERPRISE_SEARCH_CONNECTOR_CRAWLER_SERVICE_TYPE } from '../../../../co import { SyncStatus, ConnectorStatus, + FieldType, FilteringPolicy, FilteringRuleRule, FilteringValidationState, @@ -55,6 +56,7 @@ export const connectorIndex: ConnectorViewIndex = { required: false, sensitive: false, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], value: 'barbar', }, @@ -170,6 +172,7 @@ export const crawlerIndex: CrawlerViewIndex = { required: false, sensitive: false, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], value: 'barbar', }, diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/convert_connector_api_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/convert_connector_api_logic.test.ts new file mode 100644 index 0000000000000..01691488470f1 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/convert_connector_api_logic.test.ts @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { mockHttpValues } from '../../../__mocks__/kea_logic'; + +import { nextTick } from '@kbn/test-jest-helpers'; + +import { convertConnector } from './convert_connector_api_logic'; + +describe('ConvertConnectorApilogic', () => { + const { http } = mockHttpValues; + beforeEach(() => { + jest.clearAllMocks(); + }); + describe('convertConnector', () => { + it('calls correct api', async () => { + const promise = Promise.resolve('result'); + http.put.mockReturnValue(promise); + const result = convertConnector({ connectorId: 'connectorId1' }); + await nextTick(); + expect(http.put).toHaveBeenCalledWith( + '/internal/enterprise_search/connectors/connectorId1/native', + { body: JSON.stringify({ is_native: false }) } + ); + await expect(result).resolves.toEqual('result'); + }); + }); +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/convert_connector_api_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/convert_connector_api_logic.ts new file mode 100644 index 0000000000000..ba998c9dbce9d --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/connector/convert_connector_api_logic.ts @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { createApiLogic } from '../../../shared/api_logic/create_api_logic'; +import { HttpLogic } from '../../../shared/http'; + +export interface ConvertConnectorApiLogicArgs { + connectorId: string; +} + +export interface ConvertConnectorApiLogicResponse { + updated: boolean; +} + +export const convertConnector = async ({ + connectorId, +}: ConvertConnectorApiLogicArgs): Promise => { + const route = `/internal/enterprise_search/connectors/${connectorId}/native`; + + return await HttpLogic.values.http.put<{ updated: boolean }>(route, { + body: JSON.stringify({ is_native: false }), + }); +}; + +export const ConvertConnectorApiLogic = createApiLogic( + ['convert_connector_api_logic'], + convertConnector +); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/ml_models/text_expansion/start_text_expansion_model_api_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/ml_models/text_expansion/start_text_expansion_model_api_logic.ts new file mode 100644 index 0000000000000..fa925be4bce00 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/api/ml_models/text_expansion/start_text_expansion_model_api_logic.ts @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { ELSER_MODEL_ID } from '../../../../../../common/ml_inference_pipeline'; +import { Actions, createApiLogic } from '../../../../shared/api_logic/create_api_logic'; +import { HttpLogic } from '../../../../shared/http'; + +export type StartTextExpansionModelArgs = undefined; + +export interface StartTextExpansionModelResponse { + deploymentState: string; + modelId: string; +} + +export const startTextExpansionModel = async (): Promise => { + const route = `/internal/enterprise_search/ml/models/${ELSER_MODEL_ID}/deploy`; + return await HttpLogic.values.http.post(route, { + body: undefined, + }); +}; + +export const StartTextExpansionModelApiLogic = createApiLogic( + ['start_text_expansion_model_api_logic'], + startTextExpansionModel +); + +export type StartTextExpansionModelApiLogicActions = Actions< + StartTextExpansionModelArgs, + StartTextExpansionModelResponse +>; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/engine/engine_connect/engine_api_integration.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/engine/engine_connect/engine_api_integration.tsx index 2fe691e262b64..0d47f02e7475b 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/engine/engine_connect/engine_api_integration.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/engine/engine_connect/engine_api_integration.tsx @@ -19,7 +19,7 @@ import { EngineApiLogic } from './engine_api_logic'; import { elasticsearchUrl } from './search_application_api'; -const SearchUISnippet = (esUrl: string, engineName: string, apiKey: string) => `6 +const SearchUISnippet = (esUrl: string, engineName: string, apiKey: string) => ` import EnginesAPIConnector from "@elastic/search-ui-engines-connector"; const connector = new EnginesAPIConnector({ @@ -74,7 +74,7 @@ export const EngineApiIntegrationStage: React.FC = () => {

{i18n.translate('xpack.enterpriseSearch.content.engine.api.step3.intro', { defaultMessage: - 'Learn how to integrate with your search application with the language clients maintained by Elastic to help build your search experience.', + 'Use the following code snippets to connect to your search application.', })}

diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/engine/engine_connect/engine_connect.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/engine/engine_connect/engine_connect.tsx index a6c29285f4f66..018470da69410 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/engine/engine_connect/engine_connect.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/engine/engine_connect/engine_connect.tsx @@ -26,6 +26,8 @@ import { EngineViewLogic } from '../engine_view_logic'; import { SearchApplicationAPI } from './search_application_api'; +import '../search_application_layout.scss'; + const pageTitle = i18n.translate( 'xpack.enterpriseSearch.content.searchApplications.connect.pageTitle', { @@ -68,6 +70,8 @@ export const EngineConnect: React.FC = () => { pageViewTelemetry={EngineViewTabs.CONNECT} isLoading={isLoadingEngine} pageHeader={{ + bottomBorder: false, + className: 'searchApplicationHeaderBackgroundColor', pageTitle, rightSideItems: [], }} @@ -84,6 +88,8 @@ export const EngineConnect: React.FC = () => { pageViewTelemetry={EngineViewTabs.CONNECT} isLoading={isLoadingEngine} pageHeader={{ + bottomBorder: false, + className: 'searchApplicationHeaderBackgroundColor', pageTitle, rightSideItems: [], tabs: [ diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/engine/engine_search_preview/engine_search_preview.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/engine/engine_search_preview/engine_search_preview.tsx index 5cd4895c3aa35..25818607f102f 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/engine/engine_search_preview/engine_search_preview.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/engine/engine_search_preview/engine_search_preview.tsx @@ -72,6 +72,7 @@ import { ResultsView, Sorting, } from './search_ui_components'; +import '../search_application_layout.scss'; class InternalEngineTransporter implements Transporter { constructor( @@ -313,6 +314,8 @@ export const EngineSearchPreview: React.FC = () => { pageViewTelemetry={EngineViewTabs.PREVIEW} isLoading={isLoadingEngine} pageHeader={{ + bottomBorder: false, + className: 'searchApplicationHeaderBackgroundColor', pageTitle: ( { pageChrome={[engineName]} pageViewTelemetry={tabId} pageHeader={{ + bottomBorder: false, pageTitle: engineName, rightSideItems: [], }} @@ -91,6 +92,7 @@ export const EngineView: React.FC = () => { pageChrome={[engineName]} pageViewTelemetry={tabId} pageHeader={{ + bottomBorder: false, pageTitle: engineName, rightSideItems: [], }} diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/engine/search_application_content.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/engine/search_application_content.tsx index 4bf79b31a1491..4fa39f2fa0cf2 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/engine/search_application_content.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/engine/search_application_content.tsx @@ -30,6 +30,7 @@ import { EngineIndices } from './engine_indices'; import { EngineIndicesLogic } from './engine_indices_logic'; import { EngineSchema } from './engine_schema'; import { EngineViewLogic } from './engine_view_logic'; +import './search_application_layout.scss'; const pageTitle = i18n.translate( 'xpack.enterpriseSearch.content.searchApplications.content.pageTitle', @@ -78,6 +79,8 @@ export const SearchApplicationContent = () => { pageViewTelemetry={EngineViewTabs.CONTENT} isLoading={isLoadingEngine} pageHeader={{ + bottomBorder: false, + className: 'searchApplicationHeaderBackgroundColor', pageTitle, rightSideItems: [], }} @@ -103,6 +106,7 @@ export const SearchApplicationContent = () => { pageViewTelemetry={EngineViewTabs.CONTENT} isLoading={isLoadingEngine} pageHeader={{ + bottomBorder: false, breadcrumbs: [ { color: 'primary', @@ -119,6 +123,7 @@ export const SearchApplicationContent = () => { ), }, ], + className: 'searchApplicationHeaderBackgroundColor', pageTitle, rightSideItems: [ { expect(popover).toHaveLength(1); expect(popover.text()).toMatch( - 'This functionality is in technical preview and may be changed or removed completely in a future release.' + 'This functionality may be changed or removed completely in a future release.' ); }); }); @@ -177,7 +177,7 @@ describe('CreateEngineButton', () => { expect(popover).toHaveLength(1); expect(popover.text()).toMatch( - 'This functionality is in technical preview and may be changed or removed completely in a future release.' + 'This functionality may be changed or removed completely in a future release.' ); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/engines/engines_list.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/engines/engines_list.tsx index da0b98b843c9b..c47e35fb3fe9e 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/engines/engines_list.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/engines/engines_list.tsx @@ -97,7 +97,7 @@ export const CreateEngineButton: React.FC = ({ disabled
diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/layout/engines_page_template.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/layout/engines_page_template.tsx index 94f0d9ae56e7c..ed0cd55b7549a 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/layout/engines_page_template.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/layout/engines_page_template.tsx @@ -23,6 +23,7 @@ export const EnterpriseSearchEnginesPageTemplate: React.FC< const navItems = useEnterpriseSearchEngineNav(engineName, pageTemplateProps.isEmptyState); return ( = ({ onSelect, isSelected return ( } title={title} @@ -110,6 +111,7 @@ export const NewIndexCard: React.FC = ({ onSelect, isSelected )} = ({ fullWidth > = ({ { { )} - {getSyncButtonText()} + + {getSyncButtonText()} +
} @@ -90,6 +92,7 @@ export const SyncsContextMenu: React.FC = () => { ? [] : [ { { setIsEditing(!isEditing)} > diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_field.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_field.tsx index e154785a33531..df833d940c068 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_field.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_field.tsx @@ -12,7 +12,6 @@ import { useActions, useValues } from 'kea'; import { EuiAccordion, EuiFieldText, - EuiFieldNumber, EuiFieldPassword, EuiRadioGroup, EuiSelect, @@ -30,7 +29,6 @@ import { ConnectorConfigurationLogic, ConfigEntry, ensureStringType, - ensureNumberType, ensureBooleanType, } from './connector_configuration_logic'; @@ -44,7 +42,17 @@ export const ConnectorConfigurationField: React.FC { setLocalConfigEntry({ ...configEntry, value: event.target.value }); }} diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_form.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_form.tsx index 2c40eb0beafa4..0c9720a894c49 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_form.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_form.tsx @@ -51,9 +51,11 @@ export const ConnectorConfigurationForm = () => { depends_on: dependencies, key, display, + is_valid: isValid, label, sensitive, tooltip, + validation_errors: validationErrors, } = configEntry; const helpText = defaultValue ? i18n.translate( @@ -89,7 +91,14 @@ export const ConnectorConfigurationForm = () => { <> {topSpacing} - + @@ -99,7 +108,14 @@ export const ConnectorConfigurationForm = () => { } return ( - + ); @@ -108,6 +124,7 @@ export const ConnectorConfigurationForm = () => { { required: false, sensitive: false, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], value: 'oldBar', }, @@ -80,6 +81,7 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: false, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], value: 'oldBar', }, @@ -89,6 +91,7 @@ describe('ConnectorConfigurationLogic', () => { default_value: '', depends_on: [], display: DisplayType.TEXTBOX, + is_valid: true, key: 'foo', label: 'newBar', options: [], @@ -96,7 +99,9 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: false, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], + validation_errors: [], value: 'oldBar', }, ], @@ -114,6 +119,7 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: false, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], value: 'fourthBar', }, @@ -131,6 +137,7 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: false, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], value: 'fourthBar', }, @@ -140,6 +147,7 @@ describe('ConnectorConfigurationLogic', () => { default_value: '', depends_on: [], display: DisplayType.TEXTBOX, + is_valid: true, key: 'foo', label: 'thirdBar', options: [], @@ -147,7 +155,9 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: false, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], + validation_errors: [], value: 'fourthBar', }, ], @@ -166,6 +176,7 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: false, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], value: 'foofoo', }, @@ -179,6 +190,7 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: true, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], value: 'fourthBar', }, @@ -192,6 +204,7 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: true, tooltip: '', + type: FieldType.STRING, ui_restrictions: ['advanced'], value: 'I am restricted', }, @@ -205,6 +218,7 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: true, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], value: 'I should appear (one dependency)', }, @@ -221,6 +235,7 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: true, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], value: 'I should appear (multiple dependencies)', }, @@ -234,6 +249,7 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: true, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], value: 'I should hide (one dependency)', }, @@ -250,6 +266,7 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: true, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], value: 'I should hide (multiple dependencies)', }, @@ -265,6 +282,7 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: false, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], value: 'foofoo', }, @@ -278,6 +296,7 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: true, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], value: 'fourthBar', }, @@ -291,6 +310,7 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: true, tooltip: '', + type: FieldType.STRING, ui_restrictions: ['advanced'], value: 'I am restricted', }, @@ -304,6 +324,7 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: true, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], value: 'I should appear (one dependency)', }, @@ -320,6 +341,7 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: true, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], value: 'I should appear (multiple dependencies)', }, @@ -333,6 +355,7 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: true, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], value: 'I should hide (one dependency)', }, @@ -349,6 +372,7 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: true, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], value: 'I should hide (multiple dependencies)', }, @@ -357,6 +381,7 @@ describe('ConnectorConfigurationLogic', () => { default_value: '', depends_on: [], display: DisplayType.TEXTBOX, + is_valid: true, key: 'bar', label: 'foo', options: [], @@ -364,7 +389,9 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: false, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], + validation_errors: [], value: 'fafa', }); expect(ConnectorConfigurationLogic.values).toEqual({ @@ -380,6 +407,7 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: false, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], value: 'foofoo', }, @@ -393,6 +421,7 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: true, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], value: 'fourthBar', }, @@ -406,6 +435,7 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: true, tooltip: '', + type: FieldType.STRING, ui_restrictions: ['advanced'], value: 'I am restricted', }, @@ -419,6 +449,7 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: true, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], value: 'I should appear (one dependency)', }, @@ -435,6 +466,7 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: true, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], value: 'I should appear (multiple dependencies)', }, @@ -448,6 +480,7 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: true, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], value: 'I should hide (one dependency)', }, @@ -464,6 +497,7 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: true, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], value: 'I should hide (multiple dependencies)', }, @@ -473,6 +507,7 @@ describe('ConnectorConfigurationLogic', () => { default_value: '', depends_on: [], display: DisplayType.TEXTBOX, + is_valid: true, key: 'bar', label: 'foo', options: [], @@ -480,13 +515,16 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: false, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], + validation_errors: [], value: 'foofoo', }, { default_value: '', depends_on: [], display: DisplayType.TEXTBOX, + is_valid: true, key: 'password', label: 'thirdBar', options: [], @@ -494,13 +532,16 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: true, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], + validation_errors: [], value: 'fourthBar', }, { default_value: '', depends_on: [{ field: 'bar', value: 'foofoo' }], display: DisplayType.TEXTBOX, + is_valid: true, key: 'shownDependent1', label: 'Shown Dependent', options: [], @@ -508,7 +549,9 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: true, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], + validation_errors: [], value: 'I should appear (one dependency)', }, { @@ -518,6 +561,7 @@ describe('ConnectorConfigurationLogic', () => { { field: 'password', value: 'fourthBar' }, ], display: DisplayType.TEXTBOX, + is_valid: true, key: 'shownDependent2', label: 'Shown Dependent 1', options: [], @@ -525,7 +569,9 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: true, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], + validation_errors: [], value: 'I should appear (multiple dependencies)', }, ], @@ -540,6 +586,7 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: false, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], value: 'fafa', }, @@ -553,6 +600,7 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: true, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], value: 'fourthBar', }, @@ -566,6 +614,7 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: true, tooltip: '', + type: FieldType.STRING, ui_restrictions: ['advanced'], value: 'I am restricted', }, @@ -579,6 +628,7 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: true, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], value: 'I should appear (one dependency)', }, @@ -595,6 +645,7 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: true, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], value: 'I should appear (multiple dependencies)', }, @@ -608,6 +659,7 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: true, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], value: 'I should hide (one dependency)', }, @@ -624,6 +676,7 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: true, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], value: 'I should hide (multiple dependencies)', }, @@ -633,6 +686,7 @@ describe('ConnectorConfigurationLogic', () => { default_value: '', depends_on: [], display: DisplayType.TEXTBOX, + is_valid: true, key: 'bar', label: 'foo', options: [], @@ -640,13 +694,16 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: false, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], + validation_errors: [], value: 'fafa', }, { default_value: '', depends_on: [], display: DisplayType.TEXTBOX, + is_valid: true, key: 'password', label: 'thirdBar', options: [], @@ -654,13 +711,16 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: true, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], + validation_errors: [], value: 'fourthBar', }, { default_value: '', depends_on: [{ field: 'bar', value: 'fafa' }], display: DisplayType.TEXTBOX, + is_valid: true, key: 'hiddenDependent1', label: 'Shown Dependent 2', options: [], @@ -668,7 +728,9 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: true, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], + validation_errors: [], value: 'I should hide (one dependency)', }, { @@ -678,6 +740,7 @@ describe('ConnectorConfigurationLogic', () => { { field: 'password', value: 'fourthBar' }, ], display: DisplayType.TEXTBOX, + is_valid: true, key: 'hiddenDependent2', label: 'Shown Dependent', options: [], @@ -685,7 +748,9 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: true, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], + validation_errors: [], value: 'I should hide (multiple dependencies)', }, ], @@ -703,6 +768,7 @@ describe('ConnectorConfigurationLogic', () => { default_value: '', depends_on: [], display: DisplayType.TEXTBOX, + is_valid: true, key: 'foo', label: 'bar', options: [], @@ -710,7 +776,9 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: false, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], + validation_errors: [], value: 'barbar', }, ], @@ -740,6 +808,7 @@ describe('ConnectorConfigurationLogic', () => { default_value: '', depends_on: [], display: DisplayType.TEXTBOX, + is_valid: true, key: 'foo', label: 'bar', options: [], @@ -747,7 +816,9 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: false, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], + validation_errors: [], value: 'barbar', }, ], @@ -762,6 +833,7 @@ describe('ConnectorConfigurationLogic', () => { default_value: '', depends_on: [], display: DisplayType.TEXTBOX, + is_valid: true, key: 'foo', label: 'bar', options: [], @@ -769,7 +841,9 @@ describe('ConnectorConfigurationLogic', () => { required: false, sensitive: false, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], + validation_errors: [], value: 'barbar', }, ], @@ -786,13 +860,16 @@ describe('ConnectorConfigurationLogic', () => { default_value: '', depends_on: [], display: DisplayType.TEXTBOX, + is_valid: true, label: 'bar', options: [], order: 1, required: false, sensitive: true, tooltip: '', + type: FieldType.STRING, ui_restrictions: [], + validation_errors: [], value: 'Barbara', }, }); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_logic.ts index 861ab90079229..065fe42d5bb0b 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_configuration_logic.ts @@ -7,12 +7,15 @@ import { kea, MakeLogicType } from 'kea'; +import { i18n } from '@kbn/i18n'; + import { ConnectorConfiguration, ConnectorStatus, Dependency, DependencyLookup, DisplayType, + FieldType, SelectOption, } from '../../../../../../common/types/connectors'; import { isNotNullish } from '../../../../../../common/utils/is_not_nullish'; @@ -59,6 +62,7 @@ export interface ConfigEntry { default_value: string | number | boolean | null; depends_on: Dependency[]; display: DisplayType; + is_valid: boolean; key: string; label: string; options: SelectOption[]; @@ -66,7 +70,9 @@ export interface ConfigEntry { required: boolean; sensitive: boolean; tooltip: string; + type: FieldType; ui_restrictions: string[]; + validation_errors: string[]; value: string | number | boolean | null; } @@ -86,7 +92,9 @@ function sortAndFilterConnectorConfiguration(config: ConnectorConfiguration): Co .map( (key) => ({ + is_valid: true, key, + validation_errors: [], ...config[key], } as ConfigEntry) ) @@ -119,13 +127,65 @@ function sortAndFilterConnectorConfiguration(config: ConnectorConfiguration): Co ); } +function validateConnectorConfiguration(config: ConfigEntry[]): ConfigEntry[] { + return config.map((configEntry) => { + const label = configEntry.label; + + configEntry.validation_errors = []; + + if (configEntry.type === FieldType.INTEGER && !validIntInput(configEntry.value)) { + configEntry.validation_errors.push( + i18n.translate( + 'xpack.enterpriseSearch.content.indices.configurationConnector.config.invalidInteger', + { + defaultMessage: '{label} must be an integer.', + values: { label }, + } + ) + ); + } + + configEntry.is_valid = configEntry.validation_errors.length <= 0; + + return configEntry; + }); +} + +function validIntInput(value: string | number | boolean | null): boolean { + // reject non integers (including x.0 floats), but don't validate if empty + return (value !== null || value !== '') && + (isNaN(Number(value)) || + !Number.isSafeInteger(value) || + ensureStringType(value).indexOf('.') >= 0) + ? false + : true; +} + +function ensureCorrectTyping( + type: FieldType, + value: string | number | boolean | null +): string | number | boolean | null { + switch (type) { + case FieldType.INTEGER: + return validIntInput(value) ? ensureIntType(value) : value; + case FieldType.BOOLEAN: + return ensureBooleanType(value); + default: + return ensureStringType(value); + } +} + export function ensureStringType(value: string | number | boolean | null): string { - return String(value); + return value !== null ? String(value) : ''; } -export function ensureNumberType(value: string | number | boolean | null): number { - const numberValue = Number(value); - return isNaN(numberValue) ? 0 : numberValue; +export function ensureIntType(value: string | number | boolean | null): number | null { + // int is null-safe to prevent empty values from becoming zeroes + if (value === null || value === '') { + return null; + } + + return parseInt(String(value), 10); } export function ensureBooleanType(value: string | number | boolean | null): boolean { @@ -265,6 +325,7 @@ export const ConnectorConfigurationLogic = kea< required, sensitive, tooltip, + type, // eslint-disable-next-line @typescript-eslint/naming-convention ui_restrictions, value, @@ -281,8 +342,9 @@ export const ConnectorConfigurationLogic = kea< required, sensitive, tooltip, + type, ui_restrictions, - value, + value: ensureCorrectTyping(type, value), }, }), setLocalConfigState: (_, { configState }) => configState, @@ -303,7 +365,10 @@ export const ConnectorConfigurationLogic = kea< ], localConfigView: [ () => [selectors.localConfigState], - (configState) => sortAndFilterConnectorConfiguration(configState), + (configState) => { + const config = sortAndFilterConnectorConfiguration(configState); + return validateConnectorConfiguration(config); + }, ], }), }); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_overview_panels.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_overview_panels.tsx index c3afcbc46494d..52b3c0881e15d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_overview_panels.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/connector_overview_panels.tsx @@ -48,6 +48,7 @@ export const ConnectorOverviewPanels: React.FC = () => { { /> - + {ingestionStatus === IngestionStatus.INCOMPLETE ? ( { + const { convertConnector, hideModal, showModal } = useActions(ConvertConnectorLogic); + const { isLoading, isModalVisible } = useValues(ConvertConnectorLogic); + + return ( + <> + {isModalVisible && ( + hideModal()} + onConfirm={() => convertConnector()} + title={i18n.translate( + 'xpack.enterpriseSearch.content.engine.indices.convertInfexConfirm.title', + { defaultMessage: 'Sure you want to convert your connector?' } + )} + buttonColor="danger" + cancelButtonText={CANCEL_BUTTON_LABEL} + confirmButtonText={i18n.translate( + 'xpack.enterpriseSearch.content.engine.indices.convertIndexConfirm.text', + { + defaultMessage: 'Yes', + } + )} + isLoading={isLoading} + defaultFocusedButton="confirm" + maxWidth + > + +

+ {i18n.translate( + 'xpack.enterpriseSearch.content.engine.indices.convertIndexConfirm.description', + { + defaultMessage: + "Once you convert a native connector to a self-managed connector client this can't be undone.", + } + )} +

+
+
+ )} + + + + + + +

+ {i18n.translate( + 'xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnector.convertConnector.title', + { + defaultMessage: 'Customize your connector', + } + )} +

+
+
+
+ + + + {i18n.translate( + 'xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnector.convertConnector.linkTitle', + { defaultMessage: 'connector client' } + )} + + ), + }} + /> + + showModal()}> + {i18n.translate( + 'xpack.enterpriseSearch.content.indices.configurationConnector.nativeConnector.convertConnector.buttonTitle', + { defaultMessage: 'Convert connector' } + )} + + + + ); +}; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/native_connector_configuration/convert_connector_logic.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/native_connector_configuration/convert_connector_logic.tsx new file mode 100644 index 0000000000000..841f8cde106a2 --- /dev/null +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/native_connector_configuration/convert_connector_logic.tsx @@ -0,0 +1,82 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { kea, MakeLogicType } from 'kea'; + +import { Status } from '../../../../../../../common/types/api'; +import { Actions } from '../../../../../shared/api_logic/create_api_logic'; +import { + ConvertConnectorApiLogic, + ConvertConnectorApiLogicArgs, + ConvertConnectorApiLogicResponse, +} from '../../../../api/connector/convert_connector_api_logic'; +import { IndexViewActions, IndexViewLogic } from '../../index_view_logic'; + +interface ConvertConnectorValues { + connectorId: typeof IndexViewLogic.values.connectorId; + isLoading: boolean; + isModalVisible: boolean; + status: Status; +} + +type ConvertConnectorActions = Pick< + Actions, + 'apiError' | 'apiSuccess' | 'makeRequest' +> & { + convertConnector(): void; + fetchIndex(): IndexViewActions['fetchIndex']; + hideModal(): void; + showModal(): void; +}; + +export const ConvertConnectorLogic = kea< + MakeLogicType +>({ + actions: { + convertConnector: () => true, + deleteDomain: () => true, + hideModal: () => true, + showModal: () => true, + }, + connect: { + actions: [ + ConvertConnectorApiLogic, + ['apiError', 'apiSuccess', 'makeRequest'], + IndexViewLogic, + ['fetchIndex'], + ], + values: [ConvertConnectorApiLogic, ['status'], IndexViewLogic, ['connectorId']], + }, + listeners: ({ actions, values }) => ({ + convertConnector: () => { + if (values.connectorId) { + actions.makeRequest({ connectorId: values.connectorId }); + } + }, + }), + path: ['enterprise_search', 'convert_connector_modal'], + reducers: { + isModalVisible: [ + false, + { + apiError: () => false, + apiSuccess: () => false, + hideModal: () => false, + showModal: () => true, + }, + ], + }, + selectors: ({ selectors }) => ({ + isLoading: [() => [selectors.status], (status: Status) => status === Status.LOADING], + }), +}); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/native_connector_configuration/native_connector_advanced_configuration.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/native_connector_configuration/native_connector_advanced_configuration.tsx index 83f0a10db1538..2749f83703072 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/native_connector_configuration/native_connector_advanced_configuration.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector/native_connector_configuration/native_connector_advanced_configuration.tsx @@ -39,6 +39,7 @@ export const NativeConnectorAdvancedConfiguration: React.FC = () => { { + + + + +
diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector_total_stats.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector_total_stats.tsx index d27375b9ce99d..4150d409ed49d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector_total_stats.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/connector_total_stats.tsx @@ -36,8 +36,9 @@ export const ConnectorTotalStats: React.FC = () => { return <>; } - const stats: EuiStatProps[] = [ + const stats: EuiStatProps[] & { 'data-test-subj'?: string } = [ { + 'data-test-subj': 'entSearchContent-indexOverview-totalStats-ingestionType', description: i18n.translate( 'xpack.enterpriseSearch.content.searchIndex.totalStats.ingestionTypeCardLabel', { @@ -53,6 +54,7 @@ export const ConnectorTotalStats: React.FC = () => { ), }, { + 'data-test-subj': 'entSearchContent-indexOverview-totalStats-connectorType', description: i18n.translate('xpack.enterpriseSearch.connector.connectorTypePanel.title', { defaultMessage: 'Connector type', }), diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawler_domain_detail/extraction_rules/edit_extraction_rule.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawler_domain_detail/extraction_rules/edit_extraction_rule.tsx index 87f26d7bac147..fa69e05bd65fd 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawler_domain_detail/extraction_rules/edit_extraction_rule.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawler_domain_detail/extraction_rules/edit_extraction_rule.tsx @@ -103,7 +103,7 @@ export const EditExtractionRule: React.FC = ({ saveRule, }) => { const { closeEditRuleFlyout, openEditRuleFlyout } = useActions(ExtractionRulesLogic); - const { fieldRuleFlyoutVisible, fieldRuleToEdit, fieldRuleToEditIndex, fieldRuleToEditIsNew } = + const { fieldRuleFlyoutVisible, fieldRuleToEdit, fieldRuleToEditIsNew } = useValues(ExtractionRulesLogic); const [urlToggle, setUrlToggle] = useState(UrlState.ALL); const { control, formState, getValues, handleSubmit, reset, setValue } = @@ -437,6 +437,7 @@ export const EditExtractionRule: React.FC = ({ if (fieldRuleToEditIsNew) { appendRule(fieldRule); } else { + const fieldRuleToEditIndex = rulesFields.findIndex(({ id: ruleId }) => ruleId === id); updateRule(fieldRuleToEditIndex ?? 0, fieldRule); } closeEditRuleFlyout(); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawler_domain_detail/extraction_rules/extraction_rules_logic.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawler_domain_detail/extraction_rules/extraction_rules_logic.tsx index 8c56f4c4d5f19..6ca86c9e30885 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawler_domain_detail/extraction_rules/extraction_rules_logic.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawler_domain_detail/extraction_rules/extraction_rules_logic.tsx @@ -57,15 +57,12 @@ interface ExtractionRulesActions { hideDeleteModal: () => void; openEditRuleFlyout({ fieldRule, - fieldRuleIndex, isNewRule, }: { fieldRule?: ExtractionRuleFieldRule; - fieldRuleIndex?: number; isNewRule: boolean; }): { fieldRule: ExtractionRuleFieldRule; - fieldRuleIndex?: number; isNewRule: boolean; }; fetchDomainData: CrawlerDomainDetailActions['fetchDomainData']; @@ -101,7 +98,6 @@ interface ExtractionRulesValues { fieldRuleFlyoutVisible: boolean; fieldRuleToDelete: { extractionRuleId?: string; fieldRuleIndex?: number }; fieldRuleToEdit: ExtractionRuleFieldRule | null; - fieldRuleToEditIndex: number | null; fieldRuleToEditIsNew: boolean; indexName: string; isLoading: boolean; @@ -289,13 +285,6 @@ export const ExtractionRulesLogic = kea< openEditRuleFlyout: (_, { fieldRule }) => fieldRule ?? null, }, ], - fieldRuleToEditIndex: [ - null, - { - closeEditRuleFlyout: () => null, - openEditRuleFlyout: (_, { fieldRuleIndex }) => fieldRuleIndex ?? null, - }, - ], fieldRuleToEditIsNew: [ true, { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawler_domain_detail/extraction_rules/extraction_rules_table.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawler_domain_detail/extraction_rules/extraction_rules_table.tsx index 1a2e545dd4fe4..d2ae9936bf290 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawler_domain_detail/extraction_rules/extraction_rules_table.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/crawler_domain_detail/extraction_rules/extraction_rules_table.tsx @@ -66,7 +66,6 @@ export const ExtractionRulesTable: React.FC = () => { if (rule) { openEditRuleFlyout({ fieldRule: rule, - fieldRuleIndex: rule.index, isNewRule: false, }); } diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/domain_management/add_domain/add_domain_form.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/domain_management/add_domain/add_domain_form.tsx index 512a69030e382..98d61a2a73662 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/domain_management/add_domain/add_domain_form.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/domain_management/add_domain/add_domain_form.tsx @@ -66,11 +66,17 @@ export const AddDomainForm: React.FC = () => { value={addDomainFormInputValue} onChange={(e) => setAddDomainFormInputValue(e.target.value)} fullWidth + data-test-subj="entSearchContent-crawler-addDomainForm-validate-input" />
- + {i18n.translate( 'xpack.enterpriseSearch.crawler.addDomainForm.validateButtonLabel', { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/domain_management/add_domain/add_domain_form_submit_button.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/domain_management/add_domain/add_domain_form_submit_button.tsx index 8ba831017df86..8e9d448647673 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/domain_management/add_domain/add_domain_form_submit_button.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler/domain_management/add_domain/add_domain_form_submit_button.tsx @@ -21,7 +21,13 @@ export const AddDomainFormSubmitButton: React.FC = () => { const { allowSubmit } = useValues(AddDomainLogic); return ( - + {i18n.translate('xpack.enterpriseSearch.crawler.addDomainForm.submitButtonLabel', { defaultMessage: 'Add domain', })} diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler_total_stats.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler_total_stats.tsx index 7825e93328dc8..8bf7b407d591b 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler_total_stats.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/crawler_total_stats.tsx @@ -29,8 +29,9 @@ export const CrawlerTotalStats: React.FC = () => { const documentCount = indexData?.count ?? 0; const hideStats = isLoading || isError; - const stats: EuiStatProps[] = [ + const stats: EuiStatProps[] & { 'data-test-subj'?: string } = [ { + 'data-test-subj': 'entSearchContent-indexOverview-totalStats-ingestionType', description: i18n.translate( 'xpack.enterpriseSearch.content.searchIndex.totalStats.ingestionTypeCardLabel', { @@ -56,6 +57,7 @@ export const CrawlerTotalStats: React.FC = () => { title: domains.length, }, { + 'data-test-subj': 'entSearchContent-indexOverview-totalStats-documentCount', description: i18n.translate( 'xpack.enterpriseSearch.content.searchIndex.totalStats.documentCountCardLabel', { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/inference_pipeline_card.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/inference_pipeline_card.tsx index 700fe4fc2983c..4ee18025e5c41 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/inference_pipeline_card.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/inference_pipeline_card.tsx @@ -167,6 +167,12 @@ export const InferencePipelineCard: React.FC = (pipeline) => )} > ({ @@ -26,6 +27,7 @@ jest.mock('./text_expansion_callout_data', () => ({ dismiss: jest.fn(), isCreateButtonDisabled: false, isDismissable: false, + isStartButtonDisabled: false, show: true, })), })); @@ -34,6 +36,8 @@ const DEFAULT_VALUES = { isCreateButtonDisabled: false, isModelDownloadInProgress: false, isModelDownloaded: false, + isModelStarted: false, + isStartButtonDisabled: false, }; describe('TextExpansionCallOut', () => { @@ -63,6 +67,15 @@ describe('TextExpansionCallOut', () => { const wrapper = shallow(); expect(wrapper.find(ModelDeployed).length).toBe(1); }); + it('renders panel with deployment in progress status if the model has been started', () => { + setMockValues({ + ...DEFAULT_VALUES, + isModelStarted: true, + }); + + const wrapper = shallow(); + expect(wrapper.find(ModelStarted).length).toBe(1); + }); describe('DeployModel', () => { it('renders deploy button', () => { @@ -109,12 +122,43 @@ describe('TextExpansionCallOut', () => { }); describe('ModelDeployed', () => { + it('renders start button', () => { + const wrapper = shallow( + {}} isDismissable={false} isStartButtonDisabled={false} /> + ); + expect(wrapper.find(EuiButton).length).toBe(1); + const button = wrapper.find(EuiButton); + expect(button.prop('disabled')).toBe(false); + }); + it('renders disabled start button if it is set to disabled', () => { + const wrapper = shallow( + {}} isDismissable={false} isStartButtonDisabled /> + ); + expect(wrapper.find(EuiButton).length).toBe(1); + const button = wrapper.find(EuiButton); + expect(button.prop('disabled')).toBe(true); + }); + it('renders dismiss button if it is set to dismissable', () => { + const wrapper = shallow( + {}} isDismissable isStartButtonDisabled={false} /> + ); + expect(wrapper.find(TextExpansionDismissButton).length).toBe(1); + }); + it('does not render dismiss button if it is set to non-dismissable', () => { + const wrapper = shallow( + {}} isDismissable={false} isStartButtonDisabled={false} /> + ); + expect(wrapper.find(TextExpansionDismissButton).length).toBe(0); + }); + }); + + describe('ModelStarted', () => { it('renders dismiss button if it is set to dismissable', () => { - const wrapper = shallow( {}} isDismissable />); + const wrapper = shallow( {}} isDismissable />); expect(wrapper.find(TextExpansionDismissButton).length).toBe(1); }); it('does not render dismiss button if it is set to non-dismissable', () => { - const wrapper = shallow( {}} isDismissable={false} />); + const wrapper = shallow( {}} isDismissable={false} />); expect(wrapper.find(TextExpansionDismissButton).length).toBe(0); }); }); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout.tsx index 53e3e9c492a59..94a4d4d05fc96 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout.tsx @@ -12,19 +12,21 @@ import { useActions, useValues } from 'kea'; import { EuiBadge, EuiButton, + EuiButtonEmpty, EuiButtonIcon, + EuiCallOut, EuiFlexGroup, EuiFlexItem, EuiIcon, EuiLink, - EuiPanel, + EuiSpacer, EuiText, - EuiTitle, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { FormattedMessage, FormattedHTMLMessage } from '@kbn/i18n-react'; import { docLinks } from '../../../../../shared/doc_links'; +import { KibanaLogic } from '../../../../../shared/kibana'; import { useTextExpansionCallOutData } from './text_expansion_callout_data'; import { TextExpansionCalloutLogic } from './text_expansion_callout_logic'; @@ -33,6 +35,7 @@ export interface TextExpansionCallOutState { dismiss: () => void; isCreateButtonDisabled: boolean; isDismissable: boolean; + isStartButtonDisabled: boolean; show: boolean; } @@ -63,7 +66,7 @@ export const DeployModel = ({ const { createTextExpansionModel } = useActions(TextExpansionCalloutLogic); return ( - + @@ -76,16 +79,14 @@ export const DeployModel = ({ - -

- - - -

-
+ +

+ {i18n.translate( + 'xpack.enterpriseSearch.content.index.pipelines.textExpansionCallOut.title', + { defaultMessage: 'Improve your results with ELSER' } + )} +

+
{isDismissable && ( @@ -97,7 +98,7 @@ export const DeployModel = ({ - + - - + + - + -
+ ); }; @@ -143,22 +149,22 @@ export const ModelDeploymentInProgress = ({ dismiss, isDismissable, }: Pick) => ( - + - + - -

- -

-
+ +

+ {i18n.translate( + 'xpack.enterpriseSearch.content.index.pipelines.textExpansionCallOut.deployingTitle', + { defaultMessage: 'Your ELSER model is deploying.' } + )} +

+
{isDismissable && ( @@ -168,37 +174,134 @@ export const ModelDeploymentInProgress = ({
- - + +

+ {i18n.translate( + 'xpack.enterpriseSearch.content.index.pipelines.textExpansionCallOut.deployingBody', + { + defaultMessage: + 'You can continue creating your pipeline with other uploaded models in the meantime.', + } + )} +

-
+ ); export const ModelDeployed = ({ dismiss, isDismissable, + isStartButtonDisabled, +}: Pick) => { + const { startTextExpansionModel } = useActions(TextExpansionCalloutLogic); + + return ( + + + + + + + + + +

+ {i18n.translate( + 'xpack.enterpriseSearch.content.index.pipelines.textExpansionCallOut.deployedTitle', + { defaultMessage: 'Your ELSER model has deployed but not started.' } + )} +

+
+
+ {isDismissable && ( + + + + )} +
+
+ + +

+ {i18n.translate( + 'xpack.enterpriseSearch.content.index.pipelines.textExpansionCallOut.deployedBody', + { + defaultMessage: + 'You may start the model in a single-threaded configuration for testing, or tune the performance for a production environment.', + } + )} +

+
+
+ + + + + + + startTextExpansionModel(undefined)} + > + {i18n.translate( + 'xpack.enterpriseSearch.content.indices.pipelines.textExpansionCallOut.startModelButton.label', + { + defaultMessage: 'Start single-threaded', + } + )} + + + + + KibanaLogic.values.navigateToUrl('/app/ml/trained_models', { + shouldNotCreateHref: true, + }) + } + > + {i18n.translate('xpack.enterpriseSearch.content.engine.api.step1.viewKeysButton', { + defaultMessage: 'Fine-tune performance', + })} + + + + +
+
+ ); +}; + +export const ModelStarted = ({ + dismiss, + isDismissable, }: Pick) => ( - + - + - -

- -

-
+ +

+ {i18n.translate( + 'xpack.enterpriseSearch.content.index.pipelines.textExpansionCallOut.startedTitle', + { defaultMessage: 'Your ELSER model has started.' } + )} +

+
{isDismissable && ( @@ -208,28 +311,43 @@ export const ModelDeployed = ({
- - + +

+ {i18n.translate( + 'xpack.enterpriseSearch.content.index.pipelines.textExpansionCallOut.startedBody', + { defaultMessage: 'Enjoy the power of ELSER in your custom Inference pipeline.' } + )} +

-
+ ); export const TextExpansionCallOut: React.FC = (props) => { const { dismiss, isDismissable, show } = useTextExpansionCallOutData(props); - const { isCreateButtonDisabled, isModelDownloadInProgress, isModelDownloaded } = - useValues(TextExpansionCalloutLogic); + const { + isCreateButtonDisabled, + isModelDownloadInProgress, + isModelDownloaded, + isModelStarted, + isStartButtonDisabled, + } = useValues(TextExpansionCalloutLogic); if (!show) return null; - if (!!isModelDownloadInProgress) { + if (isModelDownloadInProgress) { return ; - } else if (!!isModelDownloaded) { - return ; + } else if (isModelDownloaded) { + return ( + + ); + } else if (isModelStarted) { + return ; } return ( diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout_data.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout_data.tsx index 35f8f105c1e1e..3f864f030e3f1 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout_data.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout_data.tsx @@ -20,7 +20,7 @@ const isDismissed = () => localStorage.getItem(TEXT_EXPANSION_CALL_OUT_DISMISSED export const useTextExpansionCallOutData = ({ isDismissable = false, }: TextExpansionCallOutProps): TextExpansionCallOutState => { - const { isCreateButtonDisabled } = useValues(TextExpansionCalloutLogic); + const { isCreateButtonDisabled, isStartButtonDisabled } = useValues(TextExpansionCalloutLogic); const [show, setShow] = useState(() => { if (!isDismissable) return true; @@ -50,6 +50,7 @@ export const useTextExpansionCallOutData = ({ dismiss, isCreateButtonDisabled, isDismissable, + isStartButtonDisabled, show, }; }; diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout_logic.test.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout_logic.test.ts index 23afb770bead4..099e6b31e2b6a 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout_logic.test.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout_logic.test.ts @@ -25,7 +25,10 @@ const DEFAULT_VALUES: TextExpansionCalloutValues = { isCreateButtonDisabled: false, isModelDownloadInProgress: false, isModelDownloaded: false, + isModelStarted: false, isPollingTextExpansionModelActive: false, + isStartButtonDisabled: false, + startTextExpansionModelStatus: Status.IDLE, textExpansionModel: undefined, textExpansionModelPollTimeoutId: null, }; @@ -184,6 +187,19 @@ describe('TextExpansionCalloutLogic', () => { }); }); + describe('startTextExpansionModelSuccess', () => { + it('sets startedTextExpansionModel', () => { + jest.spyOn(TextExpansionCalloutLogic.actions, 'fetchTextExpansionModel'); + + TextExpansionCalloutLogic.actions.startTextExpansionModelSuccess({ + deploymentState: MlModelDeploymentState.FullyAllocated, + modelId: 'mock-model-id', + }); + + expect(TextExpansionCalloutLogic.actions.fetchTextExpansionModel).toHaveBeenCalled(); + }); + }); + describe('stopPollingTextExpansionModel', () => { it('clears polling timeout and poll timeout ID if it is set', () => { mount({ @@ -269,6 +285,23 @@ describe('TextExpansionCalloutLogic', () => { }); }); + describe('isModelStarted', () => { + it('is set to true if the model is started', () => { + FetchTextExpansionModelApiLogic.actions.apiSuccess({ + deploymentState: MlModelDeploymentState.FullyAllocated, + modelId: 'mock-model-id', + }); + expect(TextExpansionCalloutLogic.values.isModelStarted).toBe(true); + }); + it('is set to false if the model is not started', () => { + FetchTextExpansionModelApiLogic.actions.apiSuccess({ + deploymentState: MlModelDeploymentState.NotDeployed, + modelId: 'mock-model-id', + }); + expect(TextExpansionCalloutLogic.values.isModelStarted).toBe(false); + }); + }); + describe('isPollingTextExpansionModelActive', () => { it('is set to false if polling is not active', () => { mount({ diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout_logic.ts b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout_logic.ts index 140cfb265f6d8..7d301e1bdf59d 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/pipelines/ml_inference/text_expansion_callout_logic.ts @@ -19,6 +19,10 @@ import { FetchTextExpansionModelApiLogicActions, FetchTextExpansionModelResponse, } from '../../../../api/ml_models/text_expansion/fetch_text_expansion_model_api_logic'; +import { + StartTextExpansionModelApiLogic, + StartTextExpansionModelApiLogicActions, +} from '../../../../api/ml_models/text_expansion/start_text_expansion_model_api_logic'; const FETCH_TEXT_EXPANSION_MODEL_POLLING_DURATION = 5000; // 5 seconds const FETCH_TEXT_EXPANSION_MODEL_POLLING_DURATION_ON_FAILURE = 30000; // 30 seconds @@ -35,6 +39,8 @@ interface TextExpansionCalloutActions { pollTimeoutId: ReturnType; }; startPollingTextExpansionModel: () => void; + startTextExpansionModel: StartTextExpansionModelApiLogicActions['makeRequest']; + startTextExpansionModelSuccess: StartTextExpansionModelApiLogicActions['apiSuccess']; stopPollingTextExpansionModel: () => void; textExpansionModel: FetchTextExpansionModelApiLogicActions['apiSuccess']; } @@ -45,7 +51,10 @@ export interface TextExpansionCalloutValues { isCreateButtonDisabled: boolean; isModelDownloadInProgress: boolean; isModelDownloaded: boolean; + isModelStarted: boolean; isPollingTextExpansionModelActive: boolean; + isStartButtonDisabled: boolean; + startTextExpansionModelStatus: Status; textExpansionModel: FetchTextExpansionModelResponse | undefined; textExpansionModelPollTimeoutId: null | ReturnType; } @@ -72,12 +81,16 @@ export const TextExpansionCalloutLogic = kea< 'apiSuccess as fetchTextExpansionModelSuccess', 'apiError as fetchTextExpansionModelError', ], + StartTextExpansionModelApiLogic, + ['makeRequest as startTextExpansionModel', 'apiSuccess as startTextExpansionModelSuccess'], ], values: [ CreateTextExpansionModelApiLogic, - ['data as createdTextExpansionModel', 'status as createTextExpansionModelStatus'], // error as ... + ['data as createdTextExpansionModel', 'status as createTextExpansionModelStatus'], FetchTextExpansionModelApiLogic, ['data as textExpansionModel'], + StartTextExpansionModelApiLogic, + ['status as startTextExpansionModelStatus'], ], }, events: ({ actions, values }) => ({ @@ -133,6 +146,9 @@ export const TextExpansionCalloutLogic = kea< } actions.createTextExpansionModelPollingTimeout(FETCH_TEXT_EXPANSION_MODEL_POLLING_DURATION); }, + startTextExpansionModelSuccess: () => { + actions.fetchTextExpansionModel(undefined); + }, stopPollingTextExpansionModel: () => { if (values.textExpansionModelPollTimeoutId !== null) { clearTimeout(values.textExpansionModelPollTimeoutId); @@ -163,8 +179,11 @@ export const TextExpansionCalloutLogic = kea< isModelDownloaded: [ () => [selectors.textExpansionModel], (data: FetchTextExpansionModelResponse) => - data?.deploymentState === MlModelDeploymentState.Downloaded || - // TODO: add button for starting model, then remove these states + data?.deploymentState === MlModelDeploymentState.Downloaded, + ], + isModelStarted: [ + () => [selectors.textExpansionModel], + (data: FetchTextExpansionModelResponse) => data?.deploymentState === MlModelDeploymentState.Starting || data?.deploymentState === MlModelDeploymentState.Started || data?.deploymentState === MlModelDeploymentState.FullyAllocated, @@ -174,5 +193,9 @@ export const TextExpansionCalloutLogic = kea< (pollingTimeoutId: TextExpansionCalloutValues['textExpansionModelPollTimeoutId']) => pollingTimeoutId !== null, ], + isStartButtonDisabled: [ + () => [selectors.startTextExpansionModelStatus], + (status: Status) => status !== Status.IDLE, + ], }), }); diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/search_index.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/search_index.tsx index 6b4e1c475f9fb..cad08d5252b02 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/search_index.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/search_index.tsx @@ -98,6 +98,7 @@ export const SearchIndex: React.FC = () => { const ALL_INDICES_TABS: EuiTabbedContentTab[] = [ { content: , + 'data-test-subj': 'entSearchContent-index-overview-tab', id: SearchIndexTabId.OVERVIEW, name: i18n.translate('xpack.enterpriseSearch.content.searchIndex.overviewTabLabel', { defaultMessage: 'Overview', @@ -167,6 +168,7 @@ export const SearchIndex: React.FC = () => { }, { content: , + 'data-test-subj': 'entSearchContent-index-crawler-scheduler-tab', id: SearchIndexTabId.SCHEDULING, name: i18n.translate('xpack.enterpriseSearch.content.searchIndex.schedulingTabLabel', { defaultMessage: 'Scheduling', diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs.tsx index c885160693f44..b82b555950380 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/sync_jobs/sync_jobs.tsx @@ -115,6 +115,7 @@ export const SyncJobs: React.FC = () => { <> setSyncJobFlyout(undefined)} syncJob={syncJobFlyout} /> { ? [] : [ - + {i18n.translate( 'xpack.enterpriseSearch.content.searchIndices.create.buttonTitle', { diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/crawler_status_indicator/start_crawl_context_menu.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/crawler_status_indicator/start_crawl_context_menu.tsx index b85839351e2ea..09b69ab40ac61 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/crawler_status_indicator/start_crawl_context_menu.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/shared/crawler_status_indicator/start_crawl_context_menu.tsx @@ -25,7 +25,13 @@ export const StartCrawlContextMenu: React.FC = () => { return ( + {i18n.translate( 'xpack.enterpriseSearch.crawler.crawlerStatusIndicator.retryCrawlButtonLabel', { @@ -48,6 +54,7 @@ export const StartCrawlContextMenu: React.FC = () => { startCrawl(); }} icon="play" + data-test-subj="entSearchContent-crawler-startCrawlMenu-crawlAllDomains" > {i18n.translate( 'xpack.enterpriseSearch.crawler.startCrawlContextMenu.crawlAllDomainsMenuLabel', diff --git a/x-pack/plugins/enterprise_search/public/applications/index.test.tsx b/x-pack/plugins/enterprise_search/public/applications/index.test.tsx index c9d14e6d67006..010b8a0fb4bb1 100644 --- a/x-pack/plugins/enterprise_search/public/applications/index.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/index.test.tsx @@ -27,8 +27,8 @@ import { renderApp, renderHeaderActions } from '.'; describe('renderApp', () => { const kibanaDeps = { - params: coreMock.createAppMountParameters(), core: coreMock.createStart(), + params: coreMock.createAppMountParameters(), plugins: { charts: chartPluginMock.createStartContract(), data: dataPluginMock.createStartContract(), diff --git a/x-pack/plugins/enterprise_search/public/applications/index.tsx b/x-pack/plugins/enterprise_search/public/applications/index.tsx index 40c3d8bdaf105..6c07c49292df1 100644 --- a/x-pack/plugins/enterprise_search/public/applications/index.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/index.tsx @@ -37,10 +37,26 @@ import { mountLicensingLogic } from './shared/licensing'; export const renderApp = ( App: React.FC, - { params, core, plugins }: { params: AppMountParameters; core: CoreStart; plugins: PluginsStart }, + { + params, + core, + plugins, + isSidebarEnabled = true, + }: { + core: CoreStart; + isSidebarEnabled: boolean; + params: AppMountParameters; + plugins: PluginsStart; + }, { config, data }: { config: ClientConfigType; data: ClientData } ) => { - const { publicUrl, errorConnectingMessage, ...initialData } = data; + const { access, features, publicUrl, errorConnectingMessage, readOnlyMode, ...initialData } = + data; + const { history } = params; + const { application, chrome, http, uiSettings } = core; + const { capabilities, navigateToUrl } = application; + const { charts, cloud, guidedOnboarding, lens, security } = plugins; + const entCloudHost = getCloudEnterpriseSearchHost(plugins.cloud); externalUrl.enterpriseSearchUrl = publicUrl || entCloudHost || config.host || ''; @@ -48,44 +64,46 @@ export const renderApp = ( hasAppSearchAccess: false, hasWorkplaceSearchAccess: false, }; - const productAccess = data.access || noProductAccess; - const productFeatures = data.features ?? { ...DEFAULT_PRODUCT_FEATURES }; + + const productAccess = access || noProductAccess; + const productFeatures = features ?? { ...DEFAULT_PRODUCT_FEATURES }; const EmptyContext: FC = ({ children }) => <>{children}; - const CloudContext = plugins.cloud?.CloudContextProvider || EmptyContext; + const CloudContext = cloud?.CloudContextProvider || EmptyContext; resetContext({ createStore: true }); const store = getContext().store; const unmountKibanaLogic = mountKibanaLogic({ - application: core.application, - capabilities: core.application.capabilities, + application, + capabilities, + charts, + cloud, config, data: plugins.data, - lens: plugins.lens, + guidedOnboarding, + history, + isSidebarEnabled, + lens, + navigateToUrl, productAccess, productFeatures, - charts: plugins.charts, - cloud: plugins.cloud, - uiSettings: core.uiSettings, - guidedOnboarding: plugins.guidedOnboarding, - history: params.history, - navigateToUrl: core.application.navigateToUrl, - security: plugins.security, - setBreadcrumbs: core.chrome.setBreadcrumbs, - setChromeIsVisible: core.chrome.setIsVisible, - setDocTitle: core.chrome.docTitle.change, renderHeaderActions: (HeaderActions) => params.setHeaderActionMenu((el) => renderHeaderActions(HeaderActions, store, el)), + security, + setBreadcrumbs: chrome.setBreadcrumbs, + setChromeIsVisible: chrome.setIsVisible, + setDocTitle: chrome.docTitle.change, + uiSettings, }); const unmountLicensingLogic = mountLicensingLogic({ - license$: plugins.licensing.license$, canManageLicense: core.application.capabilities.management?.stack?.license_management, + license$: plugins.licensing.license$, }); const unmountHttpLogic = mountHttpLogic({ - http: core.http, errorConnectingMessage, - readOnlyMode: initialData.readOnlyMode, + http, + readOnlyMode, }); const unmountFlashMessagesLogic = mountFlashMessagesLogic(); diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/doc_links/doc_links.ts b/x-pack/plugins/enterprise_search/public/applications/shared/doc_links/doc_links.ts index 607dc7361e2f4..bd273957d2ffa 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/doc_links/doc_links.ts +++ b/x-pack/plugins/enterprise_search/public/applications/shared/doc_links/doc_links.ts @@ -36,6 +36,7 @@ class DocLinks { public appSearchWebCrawlerReference: string; public behavioralAnalytics: string; public behavioralAnalyticsEvents: string; + public buildConnector: string; public bulkApi: string; public clientsGoIndex: string; public clientsGuide: string; @@ -164,6 +165,7 @@ class DocLinks { this.appSearchWebCrawlerReference = ''; this.behavioralAnalytics = ''; this.behavioralAnalyticsEvents = ''; + this.buildConnector = ''; this.bulkApi = ''; this.clientsGoIndex = ''; this.clientsGuide = ''; @@ -294,6 +296,7 @@ class DocLinks { this.appSearchWebCrawlerReference = docLinks.links.appSearch.webCrawlerReference; this.behavioralAnalytics = docLinks.links.enterpriseSearch.behavioralAnalytics; this.behavioralAnalyticsEvents = docLinks.links.enterpriseSearch.behavioralAnalyticsEvents; + this.buildConnector = docLinks.links.enterpriseSearch.buildConnector; this.bulkApi = docLinks.links.enterpriseSearch.bulkApi; this.clientsGoIndex = docLinks.links.clients.goIndex; this.clientsGuide = docLinks.links.clients.guide; diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/kibana/kibana_logic.ts b/x-pack/plugins/enterprise_search/public/applications/shared/kibana/kibana_logic.ts index b7d264ba43e99..df35a2f651363 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/kibana/kibana_logic.ts +++ b/x-pack/plugins/enterprise_search/public/applications/shared/kibana/kibana_logic.ts @@ -33,27 +33,26 @@ type RequiredFieldsOnly = { }; interface KibanaLogicProps { application: ApplicationStart; - config: ClientConfigType; - productAccess: ProductAccess; - productFeatures: ProductFeatures; - // Kibana core capabilities: Capabilities; + charts: ChartsPluginStart; + cloud?: CloudSetup; + config: ClientConfigType; data: DataPublicPluginStart; + guidedOnboarding: GuidedOnboardingPluginStart; history: ScopedHistory; + isSidebarEnabled: boolean; lens: LensPublicStart; navigateToUrl: RequiredFieldsOnly; + productAccess: ProductAccess; + productFeatures: ProductFeatures; + renderHeaderActions(HeaderActions: FC): void; + security: SecurityPluginStart; setBreadcrumbs(crumbs: ChromeBreadcrumb[]): void; setChromeIsVisible(isVisible: boolean): void; setDocTitle(title: string): void; - renderHeaderActions(HeaderActions: FC): void; - // Required plugins - charts: ChartsPluginStart; - guidedOnboarding: GuidedOnboardingPluginStart; - security: SecurityPluginStart; uiSettings: IUiSettingsClient; - // Optional plugins - cloud?: CloudSetup; } + export interface KibanaValues extends Omit { cloud: Partial; data: DataPublicPluginStart; @@ -73,6 +72,7 @@ export const KibanaLogic = kea>({ data: [props.data, {}], guidedOnboarding: [props.guidedOnboarding, {}], history: [props.history, {}], + isSidebarEnabled: [props.isSidebarEnabled, {}], lens: [props.lens, {}], navigateToUrl: [ (url: string, options?: CreateHrefOptions) => { diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/layout/nav.test.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/layout/nav.test.tsx index dcb343a2beec4..a0fc064d9e565 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/layout/nav.test.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/layout/nav.test.tsx @@ -35,7 +35,11 @@ describe('useEnterpriseSearchContentNav', () => { it('returns an array of top-level Enterprise Search nav items', () => { const fullProductAccess: ProductAccess = DEFAULT_PRODUCT_ACCESS; - setMockValues({ productAccess: fullProductAccess, productFeatures: DEFAULT_PRODUCT_FEATURES }); + setMockValues({ + isSidebarEnabled: true, + productAccess: fullProductAccess, + productFeatures: DEFAULT_PRODUCT_FEATURES, + }); expect(useEnterpriseSearchNav()).toEqual([ { @@ -48,9 +52,9 @@ describe('useEnterpriseSearchContentNav', () => { name: 'Elasticsearch', }, { + href: '/app/enterprise_search/search_experiences', id: 'searchExperiences', name: 'Search Experiences', - href: '/app/enterprise_search/search_experiences', }, ], name: 'Overview', @@ -74,12 +78,11 @@ describe('useEnterpriseSearchContentNav', () => { }, { id: 'applications', - name: 'Applications', items: [ { + href: '/app/enterprise_search/content/engines', id: 'searchApplications', name: 'Search Applications', - href: '/app/enterprise_search/content/engines', }, { href: '/app/enterprise_search/analytics', @@ -87,6 +90,7 @@ describe('useEnterpriseSearchContentNav', () => { name: 'Behavioral Analytics', }, ], + name: 'Applications', }, { id: 'standaloneExperiences', @@ -114,7 +118,11 @@ describe('useEnterpriseSearchContentNav', () => { hasWorkplaceSearchAccess: false, }; - setMockValues({ productAccess: noProductAccess, productFeatures: DEFAULT_PRODUCT_FEATURES }); + setMockValues({ + isSidebarEnabled: true, + productAccess: noProductAccess, + productFeatures: DEFAULT_PRODUCT_FEATURES, + }); mockKibanaValues.uiSettings.get.mockReturnValue(false); const esNav = useEnterpriseSearchNav(); @@ -130,6 +138,7 @@ describe('useEnterpriseSearchContentNav', () => { }; setMockValues({ + isSidebarEnabled: true, productAccess: workplaceSearchProductAccess, productFeatures: DEFAULT_PRODUCT_FEATURES, }); @@ -157,6 +166,7 @@ describe('useEnterpriseSearchContentNav', () => { }; setMockValues({ + isSidebarEnabled: true, productAccess: appSearchProductAccess, productFeatures: DEFAULT_PRODUCT_FEATURES, }); @@ -183,6 +193,7 @@ describe('useEnterpriseSearchEngineNav', () => { jest.clearAllMocks(); mockKibanaValues.uiSettings.get.mockReturnValue(true); setMockValues({ + isSidebarEnabled: true, productAccess: DEFAULT_PRODUCT_ACCESS, productFeatures: DEFAULT_PRODUCT_FEATURES, }); @@ -200,9 +211,9 @@ describe('useEnterpriseSearchEngineNav', () => { name: 'Elasticsearch', }, { + href: '/app/enterprise_search/search_experiences', id: 'searchExperiences', name: 'Search Experiences', - href: '/app/enterprise_search/search_experiences', }, ], name: 'Overview', @@ -225,12 +236,11 @@ describe('useEnterpriseSearchEngineNav', () => { }, { id: 'applications', - name: 'Applications', items: [ { + href: '/app/enterprise_search/content/engines', id: 'searchApplications', name: 'Search Applications', - href: '/app/enterprise_search/content/engines', }, { href: '/app/enterprise_search/analytics', @@ -238,6 +248,7 @@ describe('useEnterpriseSearchEngineNav', () => { name: 'Behavioral Analytics', }, ], + name: 'Applications', }, { id: 'standaloneExperiences', @@ -287,7 +298,7 @@ describe('useEnterpriseSearchEngineNav', () => { { href: `/app/enterprise_search/content/engines/${engineName}/preview`, id: 'enterpriseSearchEnginePreview', - name: 'Preview', + name: 'Search Preview', }, { href: `/app/enterprise_search/content/engines/${engineName}/content`, @@ -346,9 +357,9 @@ describe('useEnterpriseSearchAnalyticsNav', () => { name: 'Elasticsearch', }, { + href: '/app/enterprise_search/search_experiences', id: 'searchExperiences', name: 'Search Experiences', - href: '/app/enterprise_search/search_experiences', }, ], name: 'Overview', @@ -366,7 +377,6 @@ describe('useEnterpriseSearchAnalyticsNav', () => { }, { id: 'applications', - name: 'Applications', items: [ { href: '/app/enterprise_search/content/engines', @@ -379,6 +389,7 @@ describe('useEnterpriseSearchAnalyticsNav', () => { name: 'Behavioral Analytics', }, ], + name: 'Applications', }, { id: 'standaloneExperiences', @@ -400,7 +411,9 @@ describe('useEnterpriseSearchAnalyticsNav', () => { beforeEach(() => { jest.clearAllMocks(); - setMockValues({}); + setMockValues({ + isSidebarEnabled: true, + }); }); it('returns basic nav all params are empty', () => { diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/layout/nav.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/layout/nav.tsx index 7fbc354ff725f..e1b9609164efc 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/layout/nav.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/layout/nav.tsx @@ -30,7 +30,8 @@ import { KibanaLogic } from '../kibana'; import { generateNavLink } from './nav_link_helpers'; export const useEnterpriseSearchNav = () => { - const { productAccess, productFeatures } = useValues(KibanaLogic); + const { isSidebarEnabled, productAccess, productFeatures } = useValues(KibanaLogic); + if (!isSidebarEnabled) return undefined; const navItems: Array> = [ { @@ -174,6 +175,7 @@ export const useEnterpriseSearchNav = () => { export const useEnterpriseSearchEngineNav = (engineName?: string, isEmptyState?: boolean) => { const navItems = useEnterpriseSearchNav(); + if (!navItems) return undefined; if (!engineName) return navItems; const applicationsItem = navItems.find((item) => item.id === 'applications'); if (!applicationsItem || !applicationsItem.items) return navItems; @@ -196,7 +198,7 @@ export const useEnterpriseSearchEngineNav = (engineName?: string, isEmptyState?: { id: 'enterpriseSearchEnginePreview', name: i18n.translate('xpack.enterpriseSearch.nav.engine.previewTitle', { - defaultMessage: 'Preview', + defaultMessage: 'Search Preview', }), ...generateNavLink({ shouldNotCreateHref: true, @@ -255,6 +257,9 @@ export const useEnterpriseSearchAnalyticsNav = ( } ) => { const navItems = useEnterpriseSearchNav(); + + if (!navItems) return undefined; + const applicationsNav = navItems.find((item) => item.id === 'applications'); const analyticsNav = applicationsNav?.items?.find((item) => item.id === 'analyticsCollections'); diff --git a/x-pack/plugins/enterprise_search/public/applications/shared/layout/page_template.tsx b/x-pack/plugins/enterprise_search/public/applications/shared/layout/page_template.tsx index 4793d11b56c76..333d4d5f33b9a 100644 --- a/x-pack/plugins/enterprise_search/public/applications/shared/layout/page_template.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/shared/layout/page_template.tsx @@ -35,13 +35,13 @@ import './page_template.scss'; export type PageTemplateProps = KibanaPageTemplateProps & { customPageSections?: boolean; // If false, automatically wraps children in an EuiPageSection + emptyState?: React.ReactNode; hideFlashMessages?: boolean; isLoading?: boolean; - emptyState?: React.ReactNode; - setPageChrome?: React.ReactNode; // Used by product-specific page templates pageChrome?: BreadcrumbTrail; pageViewTelemetry?: string; + setPageChrome?: React.ReactNode; }; export const EnterpriseSearchPageTemplateWrapper: React.FC = ({ @@ -73,7 +73,11 @@ export const EnterpriseSearchPageTemplateWrapper: React.FC = ), }} isEmptyState={isEmptyState && !isLoading} - solutionNav={solutionNav ? { icon: 'logoEnterpriseSearch', ...solutionNav } : undefined} + solutionNav={ + solutionNav && solutionNav.items + ? { icon: 'logoEnterpriseSearch', ...solutionNav } + : undefined + } > {setPageChrome} {readOnlyMode && ( diff --git a/x-pack/plugins/enterprise_search/public/index.ts b/x-pack/plugins/enterprise_search/public/index.ts index b24616fc4b3d8..8dc84c6934e42 100644 --- a/x-pack/plugins/enterprise_search/public/index.ts +++ b/x-pack/plugins/enterprise_search/public/index.ts @@ -12,3 +12,5 @@ import { EnterpriseSearchPlugin } from './plugin'; export const plugin = (initializerContext: PluginInitializerContext) => { return new EnterpriseSearchPlugin(initializerContext); }; + +export type { EnterpriseSearchPublicSetup, EnterpriseSearchPublicStart } from './plugin'; diff --git a/x-pack/plugins/enterprise_search/public/plugin.ts b/x-pack/plugins/enterprise_search/public/plugin.ts index 0c732495ab416..c4612fa27a428 100644 --- a/x-pack/plugins/enterprise_search/public/plugin.ts +++ b/x-pack/plugins/enterprise_search/public/plugin.ts @@ -38,10 +38,13 @@ import { ClientConfigType, InitialAppData } from '../common/types'; import { docLinks } from './applications/shared/doc_links'; export interface ClientData extends InitialAppData { - publicUrl?: string; errorConnectingMessage?: string; + publicUrl?: string; } +export type EnterpriseSearchPublicSetup = ReturnType; +export type EnterpriseSearchPublicStart = ReturnType; + interface PluginsSetup { cloud?: CloudSetup; home?: HomePublicPluginSetup; @@ -49,8 +52,8 @@ interface PluginsSetup { } export interface PluginsStart { - cloud?: CloudSetup & CloudStart; charts: ChartsPluginStart; + cloud?: CloudSetup & CloudStart; data: DataPublicPluginStart; guidedOnboarding: GuidedOnboardingPluginStart; lens: LensPublicStart; @@ -60,23 +63,63 @@ export interface PluginsStart { export class EnterpriseSearchPlugin implements Plugin { private config: ClientConfigType; - private hasInitialized: boolean = false; - private data: ClientData = {} as ClientData; constructor(initializerContext: PluginInitializerContext) { this.config = initializerContext.config.get(); } + private data: ClientData = {} as ClientData; + + private async getInitialData(http: HttpSetup) { + if (!this.config.host && this.config.canDeployEntSearch) return; // No API to call + if (this.hasInitialized) return; // We've already made an initial call + + try { + this.data = await http.get('/internal/enterprise_search/config_data'); + this.hasInitialized = true; + } catch (e) { + this.data.errorConnectingMessage = `${e.response.status} ${e.message}`; + } + } + + private async getKibanaDeps( + core: CoreSetup, + params: AppMountParameters, + cloudSetup?: CloudSetup + ) { + // Helper for using start dependencies on mount (instead of setup dependencies) + // and for grouping Kibana-related args together (vs. plugin-specific args) + const [coreStart, pluginsStart] = await core.getStartServices(); + const cloud = + cloudSetup && (pluginsStart as PluginsStart).cloud + ? { ...cloudSetup, ...(pluginsStart as PluginsStart).cloud } + : undefined; + const plugins = { ...pluginsStart, cloud } as PluginsStart; + + coreStart.chrome + .getChromeStyle$() + .subscribe((style) => (this.isSidebarEnabled = style === 'classic')); + + return { core: coreStart, isSidebarEnabled: this.isSidebarEnabled, params, plugins }; + } + + private getPluginData() { + // Small helper for grouping plugin data related args together + return { config: this.config, data: this.data, isSidebarEnabled: this.isSidebarEnabled }; + } + + private hasInitialized: boolean = false; + private isSidebarEnabled = true; + public setup(core: CoreSetup, plugins: PluginsSetup) { const { cloud } = plugins; const { config } = this; core.application.register({ - id: ENTERPRISE_SEARCH_OVERVIEW_PLUGIN.ID, - title: ENTERPRISE_SEARCH_OVERVIEW_PLUGIN.NAV_TITLE, - euiIconType: ENTERPRISE_SEARCH_OVERVIEW_PLUGIN.LOGO, appRoute: ENTERPRISE_SEARCH_OVERVIEW_PLUGIN.URL, category: DEFAULT_APP_CATEGORIES.enterpriseSearch, + euiIconType: ENTERPRISE_SEARCH_OVERVIEW_PLUGIN.LOGO, + id: ENTERPRISE_SEARCH_OVERVIEW_PLUGIN.ID, mount: async (params: AppMountParameters) => { const kibanaDeps = await this.getKibanaDeps(core, params, cloud); const { chrome, http } = kibanaDeps.core; @@ -92,14 +135,14 @@ export class EnterpriseSearchPlugin implements Plugin { return renderApp(EnterpriseSearchOverview, kibanaDeps, pluginData); }, + title: ENTERPRISE_SEARCH_OVERVIEW_PLUGIN.NAV_TITLE, }); core.application.register({ - id: ENTERPRISE_SEARCH_CONTENT_PLUGIN.ID, - title: ENTERPRISE_SEARCH_CONTENT_PLUGIN.NAV_TITLE, - euiIconType: ENTERPRISE_SEARCH_CONTENT_PLUGIN.LOGO, appRoute: ENTERPRISE_SEARCH_CONTENT_PLUGIN.URL, category: DEFAULT_APP_CATEGORIES.enterpriseSearch, + euiIconType: ENTERPRISE_SEARCH_CONTENT_PLUGIN.LOGO, + id: ENTERPRISE_SEARCH_CONTENT_PLUGIN.ID, mount: async (params: AppMountParameters) => { const kibanaDeps = await this.getKibanaDeps(core, params, cloud); const { chrome, http } = kibanaDeps.core; @@ -115,16 +158,14 @@ export class EnterpriseSearchPlugin implements Plugin { return renderApp(EnterpriseSearchContent, kibanaDeps, pluginData); }, + title: ENTERPRISE_SEARCH_CONTENT_PLUGIN.NAV_TITLE, }); core.application.register({ - id: ANALYTICS_PLUGIN.ID, - title: ANALYTICS_PLUGIN.NAME, - euiIconType: ENTERPRISE_SEARCH_OVERVIEW_PLUGIN.LOGO, - searchable: true, - navLinkStatus: AppNavLinkStatus.default, appRoute: ANALYTICS_PLUGIN.URL, category: DEFAULT_APP_CATEGORIES.enterpriseSearch, + euiIconType: ENTERPRISE_SEARCH_OVERVIEW_PLUGIN.LOGO, + id: ANALYTICS_PLUGIN.ID, mount: async (params: AppMountParameters) => { const kibanaDeps = await this.getKibanaDeps(core, params, cloud); const { chrome, http } = kibanaDeps.core; @@ -138,14 +179,16 @@ export class EnterpriseSearchPlugin implements Plugin { return renderApp(Analytics, kibanaDeps, pluginData); }, + navLinkStatus: AppNavLinkStatus.default, + searchable: true, + title: ANALYTICS_PLUGIN.NAME, }); core.application.register({ - id: ELASTICSEARCH_PLUGIN.ID, - title: ELASTICSEARCH_PLUGIN.NAME, - euiIconType: ENTERPRISE_SEARCH_OVERVIEW_PLUGIN.LOGO, appRoute: ELASTICSEARCH_PLUGIN.URL, category: DEFAULT_APP_CATEGORIES.enterpriseSearch, + euiIconType: ENTERPRISE_SEARCH_OVERVIEW_PLUGIN.LOGO, + id: ELASTICSEARCH_PLUGIN.ID, mount: async (params: AppMountParameters) => { const kibanaDeps = await this.getKibanaDeps(core, params, cloud); const { chrome, http } = kibanaDeps.core; @@ -159,15 +202,15 @@ export class EnterpriseSearchPlugin implements Plugin { return renderApp(Elasticsearch, kibanaDeps, pluginData); }, + title: ELASTICSEARCH_PLUGIN.NAME, }); if (config.canDeployEntSearch) { core.application.register({ - id: APP_SEARCH_PLUGIN.ID, - title: APP_SEARCH_PLUGIN.NAME, - euiIconType: ENTERPRISE_SEARCH_OVERVIEW_PLUGIN.LOGO, appRoute: APP_SEARCH_PLUGIN.URL, category: DEFAULT_APP_CATEGORIES.enterpriseSearch, + euiIconType: ENTERPRISE_SEARCH_OVERVIEW_PLUGIN.LOGO, + id: APP_SEARCH_PLUGIN.ID, mount: async (params: AppMountParameters) => { const kibanaDeps = await this.getKibanaDeps(core, params, cloud); const { chrome, http } = kibanaDeps.core; @@ -181,14 +224,14 @@ export class EnterpriseSearchPlugin implements Plugin { return renderApp(AppSearch, kibanaDeps, pluginData); }, + title: APP_SEARCH_PLUGIN.NAME, }); core.application.register({ - id: WORKPLACE_SEARCH_PLUGIN.ID, - title: WORKPLACE_SEARCH_PLUGIN.NAME, - euiIconType: ENTERPRISE_SEARCH_OVERVIEW_PLUGIN.LOGO, appRoute: WORKPLACE_SEARCH_PLUGIN.URL, category: DEFAULT_APP_CATEGORIES.enterpriseSearch, + euiIconType: ENTERPRISE_SEARCH_OVERVIEW_PLUGIN.LOGO, + id: WORKPLACE_SEARCH_PLUGIN.ID, mount: async (params: AppMountParameters) => { const kibanaDeps = await this.getKibanaDeps(core, params, cloud); const { chrome, http } = kibanaDeps.core; @@ -205,15 +248,15 @@ export class EnterpriseSearchPlugin implements Plugin { return renderApp(WorkplaceSearch, kibanaDeps, pluginData); }, + title: WORKPLACE_SEARCH_PLUGIN.NAME, }); } core.application.register({ - id: SEARCH_EXPERIENCES_PLUGIN.ID, - title: SEARCH_EXPERIENCES_PLUGIN.NAME, - euiIconType: ENTERPRISE_SEARCH_OVERVIEW_PLUGIN.LOGO, appRoute: SEARCH_EXPERIENCES_PLUGIN.URL, category: DEFAULT_APP_CATEGORIES.enterpriseSearch, + euiIconType: ENTERPRISE_SEARCH_OVERVIEW_PLUGIN.LOGO, + id: SEARCH_EXPERIENCES_PLUGIN.ID, mount: async (params: AppMountParameters) => { const kibanaDeps = await this.getKibanaDeps(core, params, cloud); const { chrome, http } = kibanaDeps.core; @@ -227,68 +270,69 @@ export class EnterpriseSearchPlugin implements Plugin { return renderApp(SearchExperiences, kibanaDeps, pluginData); }, + title: SEARCH_EXPERIENCES_PLUGIN.NAME, }); if (plugins.home) { plugins.home.featureCatalogue.registerSolution({ - id: ENTERPRISE_SEARCH_OVERVIEW_PLUGIN.ID, - title: ENTERPRISE_SEARCH_OVERVIEW_PLUGIN.NAME, - icon: 'logoEnterpriseSearch', description: ENTERPRISE_SEARCH_OVERVIEW_PLUGIN.DESCRIPTION, - path: ENTERPRISE_SEARCH_OVERVIEW_PLUGIN.URL, + icon: 'logoEnterpriseSearch', + id: ENTERPRISE_SEARCH_OVERVIEW_PLUGIN.ID, order: 100, + path: ENTERPRISE_SEARCH_OVERVIEW_PLUGIN.URL, + title: ENTERPRISE_SEARCH_OVERVIEW_PLUGIN.NAME, }); plugins.home.featureCatalogue.register({ - id: ANALYTICS_PLUGIN.ID, - title: ANALYTICS_PLUGIN.NAME, - icon: 'appAnalytics', + category: 'data', description: ANALYTICS_PLUGIN.DESCRIPTION, + icon: 'appAnalytics', + id: ANALYTICS_PLUGIN.ID, path: ANALYTICS_PLUGIN.URL, - category: 'data', showOnHomePage: false, + title: ANALYTICS_PLUGIN.NAME, }); if (config.canDeployEntSearch) { plugins.home.featureCatalogue.register({ - id: APP_SEARCH_PLUGIN.ID, - title: APP_SEARCH_PLUGIN.NAME, - icon: 'appSearchApp', + category: 'data', description: APP_SEARCH_PLUGIN.DESCRIPTION, + icon: 'appSearchApp', + id: APP_SEARCH_PLUGIN.ID, path: APP_SEARCH_PLUGIN.URL, - category: 'data', showOnHomePage: false, + title: APP_SEARCH_PLUGIN.NAME, }); plugins.home.featureCatalogue.register({ - id: WORKPLACE_SEARCH_PLUGIN.ID, - title: WORKPLACE_SEARCH_PLUGIN.NAME, - icon: 'workplaceSearchApp', + category: 'data', description: WORKPLACE_SEARCH_PLUGIN.DESCRIPTION, + icon: 'workplaceSearchApp', + id: WORKPLACE_SEARCH_PLUGIN.ID, path: WORKPLACE_SEARCH_PLUGIN.URL, - category: 'data', showOnHomePage: false, + title: WORKPLACE_SEARCH_PLUGIN.NAME, }); } plugins.home.featureCatalogue.register({ - id: ELASTICSEARCH_PLUGIN.ID, - title: ELASTICSEARCH_PLUGIN.NAME, - icon: 'appElasticsearch', + category: 'data', description: ELASTICSEARCH_PLUGIN.DESCRIPTION, + icon: 'appElasticsearch', + id: ELASTICSEARCH_PLUGIN.ID, path: ELASTICSEARCH_PLUGIN.URL, - category: 'data', showOnHomePage: false, + title: ELASTICSEARCH_PLUGIN.NAME, }); plugins.home.featureCatalogue.register({ - id: SEARCH_EXPERIENCES_PLUGIN.ID, - title: SEARCH_EXPERIENCES_PLUGIN.NAME, - icon: 'logoEnterpriseSearch', + category: 'data', description: SEARCH_EXPERIENCES_PLUGIN.DESCRIPTION, + icon: 'logoEnterpriseSearch', + id: SEARCH_EXPERIENCES_PLUGIN.ID, path: SEARCH_EXPERIENCES_PLUGIN.URL, - category: 'data', showOnHomePage: false, + title: SEARCH_EXPERIENCES_PLUGIN.NAME, }); } } @@ -300,38 +344,4 @@ export class EnterpriseSearchPlugin implements Plugin { } public stop() {} - - private async getKibanaDeps( - core: CoreSetup, - params: AppMountParameters, - cloudSetup?: CloudSetup - ) { - // Helper for using start dependencies on mount (instead of setup dependencies) - // and for grouping Kibana-related args together (vs. plugin-specific args) - const [coreStart, pluginsStart] = await core.getStartServices(); - const cloud = - cloudSetup && (pluginsStart as PluginsStart).cloud - ? { ...cloudSetup, ...(pluginsStart as PluginsStart).cloud } - : undefined; - const plugins = { ...pluginsStart, cloud } as PluginsStart; - - return { params, core: coreStart, plugins }; - } - - private getPluginData() { - // Small helper for grouping plugin data related args together - return { config: this.config, data: this.data }; - } - - private async getInitialData(http: HttpSetup) { - if (!this.config.host && this.config.canDeployEntSearch) return; // No API to call - if (this.hasInitialized) return; // We've already made an initial call - - try { - this.data = await http.get('/internal/enterprise_search/config_data'); - this.hasInitialized = true; - } catch (e) { - this.data.errorConnectingMessage = `${e.response.status} ${e.message}`; - } - } } diff --git a/x-pack/plugins/enterprise_search/server/lib/connectors/put_update_native.ts b/x-pack/plugins/enterprise_search/server/lib/connectors/put_update_native.ts new file mode 100644 index 0000000000000..6b3039974f8a4 --- /dev/null +++ b/x-pack/plugins/enterprise_search/server/lib/connectors/put_update_native.ts @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { IScopedClusterClient } from '@kbn/core-elasticsearch-server'; + +import { CONNECTORS_INDEX } from '../..'; +import { Connector } from '../../../common/types/connectors'; + +export const putUpdateNative = async ( + client: IScopedClusterClient, + connectorId: string, + isNative: boolean +) => { + const result = await client.asCurrentUser.update({ + doc: { + is_native: isNative, + }, + id: connectorId, + index: CONNECTORS_INDEX, + }); + + return result; +}; diff --git a/x-pack/plugins/enterprise_search/server/lib/ml/ml_model_deployment_common.ts b/x-pack/plugins/enterprise_search/server/lib/ml/ml_model_deployment_common.ts index f97362725bac5..9465a94301443 100644 --- a/x-pack/plugins/enterprise_search/server/lib/ml/ml_model_deployment_common.ts +++ b/x-pack/plugins/enterprise_search/server/lib/ml/ml_model_deployment_common.ts @@ -11,7 +11,7 @@ import { isResourceNotFoundException, } from '../../utils/identify_exceptions'; -export const acceptableModelNames = ['.elser_model_1_SNAPSHOT']; +export const acceptableModelNames = ['.elser_model_1', '.elser_model_1_SNAPSHOT']; export function isNotFoundExceptionError(error: unknown): boolean { return ( diff --git a/x-pack/plugins/enterprise_search/server/lib/ml/start_ml_model_deployment.test.ts b/x-pack/plugins/enterprise_search/server/lib/ml/start_ml_model_deployment.test.ts index 827f41b83f575..ae11a89ed5ac0 100644 --- a/x-pack/plugins/enterprise_search/server/lib/ml/start_ml_model_deployment.test.ts +++ b/x-pack/plugins/enterprise_search/server/lib/ml/start_ml_model_deployment.test.ts @@ -15,7 +15,8 @@ import * as mockGetStatus from './get_ml_model_deployment_status'; import { startMlModelDeployment } from './start_ml_model_deployment'; describe('startMlModelDeployment', () => { - const knownModelName = '.elser_model_1_SNAPSHOT'; + const productionModelName = '.elser_model_1'; + const snapshotModelName = '.elser_model_1_SNAPSHOT'; const mockTrainedModelsProvider = { getTrainedModels: jest.fn(), getTrainedModelsStats: jest.fn(), @@ -27,7 +28,7 @@ describe('startMlModelDeployment', () => { }); it('should error when there is no trained model provider', () => { - expect(() => startMlModelDeployment(knownModelName, undefined)).rejects.toThrowError( + expect(() => startMlModelDeployment(productionModelName, undefined)).rejects.toThrowError( 'Machine Learning is not enabled' ); }); @@ -49,7 +50,7 @@ describe('startMlModelDeployment', () => { jest.spyOn(mockGetStatus, 'getMlModelDeploymentStatus').mockReturnValueOnce( Promise.resolve({ deploymentState: MlModelDeploymentState.Starting, - modelId: knownModelName, + modelId: productionModelName, nodeAllocationCount: 0, startTime: 123456, targetAllocationCount: 3, @@ -57,7 +58,26 @@ describe('startMlModelDeployment', () => { ); const response = await startMlModelDeployment( - knownModelName, + productionModelName, + mockTrainedModelsProvider as unknown as MlTrainedModels + ); + + expect(response.deploymentState).toEqual(MlModelDeploymentState.Starting); + }); + + it('should return the deployment state if not "downloaded" for snapshot model', async () => { + jest.spyOn(mockGetStatus, 'getMlModelDeploymentStatus').mockReturnValueOnce( + Promise.resolve({ + deploymentState: MlModelDeploymentState.Starting, + modelId: snapshotModelName, + nodeAllocationCount: 0, + startTime: 123456, + targetAllocationCount: 3, + }) + ); + + const response = await startMlModelDeployment( + snapshotModelName, mockTrainedModelsProvider as unknown as MlTrainedModels ); @@ -70,7 +90,7 @@ describe('startMlModelDeployment', () => { .mockReturnValueOnce( Promise.resolve({ deploymentState: MlModelDeploymentState.Downloaded, - modelId: knownModelName, + modelId: productionModelName, nodeAllocationCount: 0, startTime: 123456, targetAllocationCount: 3, @@ -79,7 +99,7 @@ describe('startMlModelDeployment', () => { .mockReturnValueOnce( Promise.resolve({ deploymentState: MlModelDeploymentState.Starting, - modelId: knownModelName, + modelId: productionModelName, nodeAllocationCount: 0, startTime: 123456, targetAllocationCount: 3, @@ -88,7 +108,7 @@ describe('startMlModelDeployment', () => { mockTrainedModelsProvider.startTrainedModelDeployment.mockImplementation(async () => {}); const response = await startMlModelDeployment( - knownModelName, + productionModelName, mockTrainedModelsProvider as unknown as MlTrainedModels ); expect(response.deploymentState).toEqual(MlModelDeploymentState.Starting); diff --git a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/connectors.ts b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/connectors.ts index 32e7cb79a2597..f0c0df50f7155 100644 --- a/x-pack/plugins/enterprise_search/server/routes/enterprise_search/connectors.ts +++ b/x-pack/plugins/enterprise_search/server/routes/enterprise_search/connectors.ts @@ -22,6 +22,7 @@ import { fetchSyncJobsByConnectorId } from '../../lib/connectors/fetch_sync_jobs import { cancelSyncs } from '../../lib/connectors/post_cancel_syncs'; import { updateFiltering } from '../../lib/connectors/put_update_filtering'; import { updateFilteringDraft } from '../../lib/connectors/put_update_filtering_draft'; +import { putUpdateNative } from '../../lib/connectors/put_update_native'; import { startConnectorSync } from '../../lib/connectors/start_sync'; import { updateConnectorConfiguration } from '../../lib/connectors/update_connector_configuration'; import { updateConnectorNameAndDescription } from '../../lib/connectors/update_connector_name_and_description'; @@ -383,4 +384,24 @@ export function registerConnectorRoutes({ router, log }: RouteDependencies) { return result ? response.ok({ body: result }) : response.conflict(); }) ); + router.put( + { + path: '/internal/enterprise_search/connectors/{connectorId}/native', + validate: { + body: schema.object({ + is_native: schema.boolean(), + }), + params: schema.object({ + connectorId: schema.string(), + }), + }, + }, + elasticsearchErrorHandler(log, async (context, request, response) => { + const { client } = (await context.core).elasticsearch; + const connectorId = decodeURIComponent(request.params.connectorId); + const { is_native } = request.body; + const result = await putUpdateNative(client, connectorId, is_native); + return result ? response.ok({ body: result }) : response.conflict(); + }) + ); } diff --git a/x-pack/plugins/exploratory_view/public/components/shared/exploratory_view/hooks/use_add_to_case.ts b/x-pack/plugins/exploratory_view/public/components/shared/exploratory_view/hooks/use_add_to_case.ts index 67f79242a9376..bdd2e228d93f3 100644 --- a/x-pack/plugins/exploratory_view/public/components/shared/exploratory_view/hooks/use_add_to_case.ts +++ b/x-pack/plugins/exploratory_view/public/components/shared/exploratory_view/hooks/use_add_to_case.ts @@ -8,7 +8,7 @@ import { useCallback, useState } from 'react'; import { i18n } from '@kbn/i18n'; import { HttpSetup, MountPoint } from '@kbn/core/public'; -import { Case } from '@kbn/cases-plugin/common'; +import { CaseUI } from '@kbn/cases-plugin/common'; import { TypedLensByValueInput } from '@kbn/lens-plugin/public'; import { CasesDeepLinkId, DRAFT_COMMENT_STORAGE_ID } from '@kbn/cases-plugin/public'; import { observabilityFeatureId } from '@kbn/observability-shared-plugin/public'; @@ -17,7 +17,7 @@ import { AddToCaseProps } from '../header/add_to_case_action'; async function addToCase( http: HttpSetup, - theCase: Case, + theCase: CaseUI, attributes: TypedLensByValueInput['attributes'], timeRange?: { from: string; to: string }, owner?: string @@ -46,7 +46,7 @@ export const useAddToCase = ({ owner = observabilityFeatureId, }: AddToCaseProps & { appId?: 'securitySolutionUI' | 'observability'; - getToastText: (thaCase: Case) => MountPoint; + getToastText: (thaCase: CaseUI) => MountPoint; }) => { const [isSaving, setIsSaving] = useState(false); const [isCasesOpen, setIsCasesOpen] = useState(false); @@ -59,7 +59,7 @@ export const useAddToCase = ({ } = useKibana().services; const onCaseClicked = useCallback( - (theCase?: Case) => { + (theCase?: CaseUI) => { if (theCase && lensAttributes) { setIsCasesOpen(false); setIsSaving(true); diff --git a/x-pack/plugins/fleet/common/errors.ts b/x-pack/plugins/fleet/common/errors.ts index 8e22b971be6ad..75c789e30e9ce 100644 --- a/x-pack/plugins/fleet/common/errors.ts +++ b/x-pack/plugins/fleet/common/errors.ts @@ -17,3 +17,5 @@ export class FleetError extends Error { } export class PackagePolicyValidationError extends FleetError {} + +export class MessageSigningError extends FleetError {} diff --git a/x-pack/plugins/fleet/common/types/models/package_spec.ts b/x-pack/plugins/fleet/common/types/models/package_spec.ts index 95edf515725d0..60f9b29bd218b 100644 --- a/x-pack/plugins/fleet/common/types/models/package_spec.ts +++ b/x-pack/plugins/fleet/common/types/models/package_spec.ts @@ -36,6 +36,7 @@ export interface PackageSpecManifest { export type PackageSpecPackageType = 'integration' | 'input'; export type PackageSpecCategory = + | 'advanced_analytics_ueba' | 'analytics_engine' | 'application_observability' | 'app_search' diff --git a/x-pack/plugins/fleet/server/routes/message_signing_service/handlers.test.ts b/x-pack/plugins/fleet/server/routes/message_signing_service/handlers.test.ts index b20a29121f81b..d9987f325338b 100644 --- a/x-pack/plugins/fleet/server/routes/message_signing_service/handlers.test.ts +++ b/x-pack/plugins/fleet/server/routes/message_signing_service/handlers.test.ts @@ -10,7 +10,7 @@ import { httpServerMock, coreMock } from '@kbn/core/server/mocks'; import type { KibanaRequest } from '@kbn/core/server'; import { createAppContextStartContractMock, xpackMocks } from '../../mocks'; -import { appContextService } from '../../services/app_context'; +import { appContextService } from '../../services'; import type { FleetRequestHandlerContext } from '../../types'; import { rotateKeyPairHandler } from './handlers'; @@ -44,27 +44,12 @@ describe('FleetMessageSigningServiceHandler', () => { appContextService.stop(); }); - it('POST /message_signing_service/rotate_key_pair?acknowledge=true succeeds with an 200 with `acknowledge=true`', async () => { - (appContextService.getMessageSigningService()?.rotateKeyPair as jest.Mock).mockReturnValue( - true - ); - - await rotateKeyPairHandler( - coreMock.createCustomRequestHandlerContext(context), - request, - response - ); - expect(response.ok).toHaveBeenCalledWith({ - body: { - message: 'Key pair rotated successfully.', - }, + it(`POST /message_signing_service/rotate_key_pair?acknowledge=true fails with an 500 with "acknowledge=true" when no messaging service`, async () => { + appContextService.start({ + ...createAppContextStartContractMock(), + // @ts-expect-error + messageSigningService: undefined, }); - }); - - it(`POST /message_signing_service/rotate_key_pair?acknowledge=true fails with an 500 with "acknowledge=true" when rotateKeyPair doesn't succeed`, async () => { - (appContextService.getMessageSigningService()?.rotateKeyPair as jest.Mock).mockReturnValue( - false - ); await rotateKeyPairHandler( coreMock.createCustomRequestHandlerContext(context), @@ -74,26 +59,49 @@ describe('FleetMessageSigningServiceHandler', () => { expect(response.customError).toHaveBeenCalledWith({ statusCode: 500, body: { - message: 'Failed to rotate key pair!', + message: 'Failed to rotate key pair. Message signing service is unavailable!', }, }); }); - it(`POST /message_signing_service/rotate_key_pair?acknowledge=true fails with an 500 with "acknowledge=true" when no messaging service`, async () => { - (appContextService.getMessageSigningService()?.rotateKeyPair as jest.Mock).mockReturnValue( - undefined - ); - + it('POST /message_signing_service/rotate_key_pair?acknowledge=true succeeds with `acknowledge=true`', async () => { await rotateKeyPairHandler( coreMock.createCustomRequestHandlerContext(context), request, response ); - expect(response.customError).toHaveBeenCalledWith({ - statusCode: 500, + expect(response.ok).toHaveBeenCalledWith({ body: { - message: 'Failed to rotate key pair!', + message: 'Key pair rotated successfully.', }, }); }); + + it.each([ + 'foo', + Error('do not show this').message, + Error(JSON.stringify({ not: 'even this' })).message, + ])( + 'POST /message_signing_service/rotate_key_pair?acknowledge=true throws only a generic 500 error if rotate fails with error `%s`', + async (error) => { + // specific error + (appContextService.getMessageSigningService()?.rotateKeyPair as jest.Mock).mockRejectedValue( + Error(error) + ); + + await rotateKeyPairHandler( + coreMock.createCustomRequestHandlerContext(context), + request, + response + ); + + // API shows generic error + expect(response.customError).toHaveBeenCalledWith({ + statusCode: 500, + body: { + message: 'Failed to rotate key pair!', + }, + }); + } + ); }); diff --git a/x-pack/plugins/fleet/server/routes/message_signing_service/handlers.ts b/x-pack/plugins/fleet/server/routes/message_signing_service/handlers.ts index 18a00ca86fdd8..7e2acdb5171a8 100644 --- a/x-pack/plugins/fleet/server/routes/message_signing_service/handlers.ts +++ b/x-pack/plugins/fleet/server/routes/message_signing_service/handlers.ts @@ -18,25 +18,29 @@ export const rotateKeyPairHandler: FleetRequestHandler< TypeOf, undefined > = async (_, __, response) => { + const logger = appContextService.getLogger(); + const messageSigningService = appContextService.getMessageSigningService(); + if (!messageSigningService) { + const errorMessage = 'Failed to rotate key pair. Message signing service is unavailable!'; + logger.error(errorMessage); + return response.customError({ + statusCode: 500, + body: { + message: errorMessage, + }, + }); + } + try { - const rotateKeyPairResponse = await appContextService - .getMessageSigningService() - ?.rotateKeyPair(); + await messageSigningService.rotateKeyPair(); - if (!rotateKeyPairResponse) { - return response.customError({ - statusCode: 500, - body: { - message: 'Failed to rotate key pair!', - }, - }); - } return response.ok({ body: { message: 'Key pair rotated successfully.', }, }); } catch (error) { - return defaultFleetErrorHandler({ error, response }); + logger.error(error); + return defaultFleetErrorHandler({ error: new Error('Failed to rotate key pair!'), response }); } }; diff --git a/x-pack/plugins/fleet/server/services/security/message_signing_service.test.ts b/x-pack/plugins/fleet/server/services/security/message_signing_service.test.ts index 6503f2f08d566..cb4288cd31488 100644 --- a/x-pack/plugins/fleet/server/services/security/message_signing_service.test.ts +++ b/x-pack/plugins/fleet/server/services/security/message_signing_service.test.ts @@ -14,7 +14,7 @@ import { encryptedSavedObjectsMock } from '@kbn/encrypted-saved-objects-plugin/s import { MESSAGE_SIGNING_KEYS_SAVED_OBJECT_TYPE } from '../../constants'; import { createAppContextStartContractMock } from '../../mocks'; -import { appContextService } from '../app_context'; +import { appContextService } from '..'; import { type MessageSigningServiceInterface, @@ -108,7 +108,7 @@ describe('MessageSigningService', () => { it('can correctly rotate existing key pair', async () => { mockCreatePointInTimeFinderAsInternalUserOnce([keyPairObj]); - const rotateKeyPairResponse = await messageSigningService.rotateKeyPair(); + await messageSigningService.rotateKeyPair(); expect(soClientMock.delete).toBeCalledWith( MESSAGE_SIGNING_KEYS_SAVED_OBJECT_TYPE, @@ -119,8 +119,60 @@ describe('MessageSigningService', () => { public_key: expect.any(String), passphrase: expect.any(String), }); + }); + + it('does not generate key pair on rotation if no key pair exists', async () => { + // no previous key pair + mockCreatePointInTimeFinderAsInternalUserOnce([]); + + const response = messageSigningService.rotateKeyPair(); + await expect(response).rejects.toThrowError( + 'Error rotating key pair: Error fetching current key pair: No current key pair found!' + ); + }); + + it('throws `getCurrentKeyPairObj` error if any on rotate', async () => { + mockCreatePointInTimeFinderAsInternalUserOnce([keyPairObj]); + // mock delete to throw + jest + .spyOn(messageSigningService, 'getCurrentKeyPairObj' as any) + .mockRejectedValue(Error('foo')); + + const response = messageSigningService.rotateKeyPair(); + await expect(response).rejects.toThrowError( + 'Error rotating key pair: Error fetching current key pair: foo' + ); + }); + + it('throws `soClient` `delete` error if any on rotate', async () => { + mockCreatePointInTimeFinderAsInternalUserOnce([keyPairObj]); + // mock delete to throw + soClientMock.delete.mockRejectedValue(Error('foo')); + + const response = messageSigningService.rotateKeyPair(); + await expect(response).rejects.toThrowError( + 'Error rotating key pair: Error deleting current key pair: foo' + ); + }); + + it('throws `soClient` `create` error if any on rotate', async () => { + mockCreatePointInTimeFinderAsInternalUserOnce([keyPairObj]); + // mock delete to throw + soClientMock.create.mockRejectedValue(Error('foo')); + + const response = messageSigningService.rotateKeyPair(); + await expect(response).rejects.toThrowError( + 'Error rotating key pair: Error creating key pair: foo' + ); + }); + + it('throws `generateKeyPair` error if any on rotate', async () => { + mockCreatePointInTimeFinderAsInternalUserOnce([keyPairObj]); + // mock delete to throw + messageSigningService.generateKeyPair = jest.fn().mockRejectedValue(Error('foo')); - expect(rotateKeyPairResponse).toEqual(true); + const response = messageSigningService.rotateKeyPair(); + await expect(response).rejects.toThrowError('Error rotating key pair: foo'); }); it('does not generate key pair if one exists', async () => { diff --git a/x-pack/plugins/fleet/server/services/security/message_signing_service.ts b/x-pack/plugins/fleet/server/services/security/message_signing_service.ts index fc5583dec01d0..6fcf92c0aebe8 100644 --- a/x-pack/plugins/fleet/server/services/security/message_signing_service.ts +++ b/x-pack/plugins/fleet/server/services/security/message_signing_service.ts @@ -15,6 +15,8 @@ import type { import type { EncryptedSavedObjectsClient } from '@kbn/encrypted-saved-objects-plugin/server'; import { SECURITY_EXTENSION_ID } from '@kbn/core-saved-objects-server'; +import { MessageSigningError } from '../../../common/errors'; + import { MESSAGE_SIGNING_KEYS_SAVED_OBJECT_TYPE } from '../../constants'; import { appContextService } from '../app_context'; @@ -30,7 +32,7 @@ export interface MessageSigningServiceInterface { generateKeyPair( providedPassphrase?: string ): Promise<{ privateKey: string; publicKey: string; passphrase: string }>; - rotateKeyPair(): Promise; + rotateKeyPair(): Promise; sign(message: Buffer | Record): Promise<{ data: Buffer; signature: string }>; getPublicKey(): Promise; } @@ -40,15 +42,13 @@ export class MessageSigningService implements MessageSigningServiceInterface { constructor(private esoClient: EncryptedSavedObjectsClient) {} - public get isEncryptionAvailable(): boolean { + public get isEncryptionAvailable(): MessageSigningServiceInterface['isEncryptionAvailable'] { return appContextService.getEncryptedSavedObjectsSetup()?.canEncrypt ?? false; } - public async generateKeyPair(providedPassphrase?: string): Promise<{ - privateKey: string; - publicKey: string; - passphrase: string; - }> { + public async generateKeyPair( + providedPassphrase?: string + ): ReturnType { const existingKeyPair = await this.checkForExistingKeyPair(); if (existingKeyPair) { return existingKeyPair; @@ -82,21 +82,25 @@ export class MessageSigningService implements MessageSigningServiceInterface { } : { ...keypairSoObject, passphrase_plain: passphrase }; - await this.soClient.create>( - MESSAGE_SIGNING_KEYS_SAVED_OBJECT_TYPE, - keypairSoObject - ); + try { + await this.soClient.create>( + MESSAGE_SIGNING_KEYS_SAVED_OBJECT_TYPE, + keypairSoObject + ); - return { - privateKey, - publicKey, - passphrase, - }; + return { + privateKey, + publicKey, + passphrase, + }; + } catch (error) { + throw new MessageSigningError(`Error creating key pair: ${error.message}`, error); + } } public async sign( message: Buffer | Record - ): Promise<{ data: Buffer; signature: string }> { + ): ReturnType { const { privateKey: serializedPrivateKey, passphrase } = await this.generateKeyPair(); const msgBuffer = Buffer.isBuffer(message) @@ -125,7 +129,7 @@ export class MessageSigningService implements MessageSigningServiceInterface { }; } - public async getPublicKey(): Promise { + public async getPublicKey(): ReturnType { const { publicKey } = await this.generateKeyPair(); if (!publicKey) { @@ -135,26 +139,34 @@ export class MessageSigningService implements MessageSigningServiceInterface { return publicKey; } - public async rotateKeyPair(): Promise { - const isRemoved = await this.removeKeyPair(); - if (isRemoved) { + public async rotateKeyPair(): ReturnType { + try { + await this.removeKeyPair(); await this.generateKeyPair(); - return true; + } catch (error) { + throw new MessageSigningError(`Error rotating key pair: ${error.message}`, error); } - return false; - // TODO: Apply changes to all policies } - private async removeKeyPair(): Promise { - const currentKeyPair = await this.getCurrentKeyPairObj(); - if (currentKeyPair) { + private async removeKeyPair(): Promise { + let currentKeyPair: Awaited>; + try { + currentKeyPair = await this.getCurrentKeyPairObj(); + if (!currentKeyPair) { + throw new MessageSigningError('No current key pair found!'); + } + } catch (error) { + throw new MessageSigningError(`Error fetching current key pair: ${error.message}`, error); + } + + try { await this.soClient.delete(MESSAGE_SIGNING_KEYS_SAVED_OBJECT_TYPE, currentKeyPair.id); - return true; + } catch (error) { + throw new MessageSigningError(`Error deleting current key pair: ${error.message}`, error); } - return false; } - private get soClient() { + private get soClient(): SavedObjectsClientContract { if (this._soClient) { return this._soClient; } diff --git a/x-pack/plugins/lens/common/constants.ts b/x-pack/plugins/lens/common/constants.ts index 1495410cdb14c..8838b974ac4dc 100644 --- a/x-pack/plugins/lens/common/constants.ts +++ b/x-pack/plugins/lens/common/constants.ts @@ -8,6 +8,7 @@ import rison from '@kbn/rison'; import type { RefreshInterval, TimeRange } from '@kbn/data-plugin/common/query'; import type { Filter } from '@kbn/es-query'; +import { i18n } from '@kbn/i18n'; export const PLUGIN_ID = 'lens'; export const APP_ID = 'lens'; @@ -88,3 +89,7 @@ export function getEditPath( export function getFullPath(id?: string) { return `/app/${PLUGIN_ID}${id ? getEditPath(id) : getBasePath()}`; } + +export const LENS_APP_NAME = i18n.translate('xpack.lens.queryInput.appName', { + defaultMessage: 'Lens', +}); diff --git a/x-pack/plugins/lens/kibana.jsonc b/x-pack/plugins/lens/kibana.jsonc index 2db1d1ee9a889..394ac6fb8bd06 100644 --- a/x-pack/plugins/lens/kibana.jsonc +++ b/x-pack/plugins/lens/kibana.jsonc @@ -35,7 +35,7 @@ "expressionXY", "eventAnnotation", "unifiedSearch", - "unifiedFieldList" + "unifiedFieldList", ], "optionalPlugins": [ "expressionLegacyMetricVis", @@ -53,7 +53,8 @@ "kibanaReact", "embeddable", "fieldFormats", - "charts" + "charts", + "visualizationUiComponents" ], "extraPublicDirs": [ "common/constants" diff --git a/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/dimension_editor.tsx b/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/dimension_editor.tsx index 4f7842ee125c4..c43bf5d0c68bb 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/dimension_editor.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/dimension_editor.tsx @@ -27,6 +27,7 @@ import { EuiButtonIcon, } from '@elastic/eui'; import ReactDOM from 'react-dom'; +import { NameInput } from '@kbn/visualization-ui-components/public'; import type { FormBasedDimensionEditorProps } from './dimension_panel'; import type { OperationSupportMatrix } from './operation_support'; import { deleteColumn, GenericIndexPatternColumn } from '../form_based'; @@ -68,7 +69,6 @@ import { } from './dimensions_editor_helpers'; import type { TemporaryState } from './dimensions_editor_helpers'; import { FieldInput } from './field_input'; -import { NameInput } from '../../../shared_components'; import { ParamEditorProps } from '../operations/definitions'; import { WrappingHelpPopover } from '../help_popover'; import { isColumn } from '../operations/definitions/helpers'; @@ -784,6 +784,13 @@ export function DimensionEditor(props: DimensionEditorProps) { incompleteColumn={ layer.incompleteColumns ? layer.incompleteColumns[referenceId] : undefined } + onResetIncomplete={() => { + updateLayer({ + ...layer, + // clean up the incomplete column data for the referenced id + incompleteColumns: { ...layer.incompleteColumns, [referenceId]: null }, + }); + }} onDeleteColumn={() => { updateLayer( deleteColumn({ diff --git a/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/field_select.tsx b/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/field_select.tsx index 93c6e74e6fb41..74f5d94ab2754 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/field_select.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/field_select.tsx @@ -11,13 +11,13 @@ import React, { useMemo } from 'react'; import { i18n } from '@kbn/i18n'; import { EuiComboBoxOptionOption, EuiComboBoxProps } from '@elastic/eui'; import { useExistingFieldsReader } from '@kbn/unified-field-list-plugin/public'; -import type { OperationType } from '../form_based'; -import type { OperationSupportMatrix } from './operation_support'; import { FieldOption, FieldOptionValue, FieldPicker, -} from '../../../shared_components/field_picker'; +} from '@kbn/visualization-ui-components/public'; +import type { OperationType } from '../form_based'; +import type { OperationSupportMatrix } from './operation_support'; import { fieldContainsData } from '../../../shared_components'; import type { IndexPattern } from '../../../types'; import { getFieldType } from '../pure_utils'; diff --git a/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/filtering.tsx b/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/filtering.tsx index 13db26af12108..31caf495ecaa4 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/filtering.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/filtering.tsx @@ -7,10 +7,13 @@ import React, { useCallback } from 'react'; import { isEqual } from 'lodash'; import type { Query } from '@kbn/es-query'; +import { validateQuery, FilterQueryInput } from '@kbn/visualization-ui-components/public'; +import { useKibana } from '@kbn/kibana-react-plugin/public'; +import { LENS_APP_NAME } from '../../../../common/constants'; import { GenericIndexPatternColumn, operationDefinitionMap } from '../operations'; import type { FormBasedLayer } from '../types'; -import { validateQuery, FilterQueryInput } from '../../../shared_components'; import type { IndexPattern } from '../../../types'; +import { LensAppServices } from '../../../app_plugin/types'; export function setFilter(columnId: string, layer: FormBasedLayer, query: Query | undefined) { return { @@ -51,6 +54,8 @@ export function Filtering({ [columnId, indexPattern, inputFilter, layer, updateLayer] ); + const lensServices = useKibana().services; + const selectedOperation = operationDefinitionMap[selectedColumn.operationType]; if (!selectedOperation.filterable) { @@ -61,8 +66,10 @@ export function Filtering({ ); } diff --git a/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/format_selector.tsx b/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/format_selector.tsx index 62770711a62df..fc2c4bfa8ae27 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/format_selector.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/format_selector.tsx @@ -8,9 +8,9 @@ import React, { useCallback, useMemo, useState } from 'react'; import { i18n } from '@kbn/i18n'; import { EuiFormRow, EuiComboBox, EuiSpacer, EuiRange, EuiFieldText } from '@elastic/eui'; +import { useDebouncedValue } from '@kbn/visualization-ui-components/public'; import { GenericIndexPatternColumn } from '../form_based'; import { isColumnFormatted } from '../operations/definitions/helpers'; -import { useDebouncedValue } from '../../../shared_components'; const supportedFormats: Record = { number: { diff --git a/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/reference_editor.test.tsx b/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/reference_editor.test.tsx index cb50049e3fbec..74a43f3e7db21 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/reference_editor.test.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/reference_editor.test.tsx @@ -65,6 +65,7 @@ describe('reference editor', () => { onChooseField: jest.fn(), onChooseFunction: jest.fn(), onDeleteColumn: jest.fn(), + onResetIncomplete: jest.fn(), columnId: 'ref', paramEditorUpdater, selectionStyle: 'full' as const, diff --git a/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/reference_editor.tsx b/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/reference_editor.tsx index fa918b07eb29d..53fe225d4d926 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/reference_editor.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/dimension_panel/reference_editor.tsx @@ -92,6 +92,7 @@ export interface ReferenceEditorProps { ) => void; onChooseField: (choice: FieldChoiceWithOperationType) => void; onDeleteColumn: () => void; + onResetIncomplete: () => void; onChooseFunction: (operationType: string, field?: IndexPatternField) => void; // Services @@ -116,6 +117,7 @@ export const ReferenceEditor = (props: ReferenceEditorProps) => { functionLabel, onChooseField, onDeleteColumn, + onResetIncomplete, onChooseFunction, fieldLabel, operationDefinitionMap, @@ -261,6 +263,10 @@ export const ReferenceEditor = (props: ReferenceEditorProps) => { } const operationType = choices[0].value!; + // When it has an incomplete state, make sure to clear it up before updating + if (incompleteColumn) { + onResetIncomplete(); + } if (column?.operationType === operationType) { return; } diff --git a/x-pack/plugins/lens/public/datasources/form_based/layer_settings.tsx b/x-pack/plugins/lens/public/datasources/form_based/layer_settings.tsx index c79bc41dd7dd7..198393a235b98 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/layer_settings.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/layer_settings.tsx @@ -21,10 +21,10 @@ import { i18n } from '@kbn/i18n'; import { css } from '@emotion/react'; import React from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; +import { TooltipWrapper } from '@kbn/visualization-ui-components/public'; import type { DatasourceLayerSettingsProps } from '../../types'; import type { FormBasedPrivateState } from './types'; import { isSamplingValueEnabled } from './utils'; -import { TooltipWrapper } from '../../shared_components'; const samplingValues = [0.00001, 0.0001, 0.001, 0.01, 0.1, 1]; interface SamplingSliderProps { diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/date_histogram.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/date_histogram.tsx index c9f872c6b509e..6682221808547 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/date_histogram.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/date_histogram.tsx @@ -29,12 +29,12 @@ import { } from '@kbn/data-plugin/public'; import { extendedBoundsToAst, intervalOptions } from '@kbn/data-plugin/common'; import { buildExpressionFunction } from '@kbn/expressions-plugin/public'; +import { TooltipWrapper } from '@kbn/visualization-ui-components/public'; import { updateColumnParam } from '../layer_helpers'; import { OperationDefinition, ParamEditorProps } from '.'; import { FieldBasedIndexPatternColumn } from './column_types'; import { getInvalidFieldMessage, getSafeName } from './helpers'; import { FormBasedLayer } from '../../types'; -import { TooltipWrapper } from '../../../../shared_components'; const { isValidInterval } = search.aggs; const autoInterval = 'auto'; diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/filters/filter_popover.test.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/filters/filter_popover.test.tsx index 4b57750819ab4..b2ea1c81e2cab 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/filters/filter_popover.test.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/filters/filter_popover.test.tsx @@ -13,7 +13,7 @@ import { createMockedIndexPattern } from '../../../mocks'; import { FilterPopover } from './filter_popover'; import { LabelInput } from '../shared_components'; import { QueryStringInput } from '@kbn/unified-search-plugin/public'; -import { QueryInput } from '../../../../../shared_components'; +import { QueryInput } from '@kbn/visualization-ui-components/public'; jest.mock('.', () => ({ isQueryValid: () => true, diff --git a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/filters/filter_popover.tsx b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/filters/filter_popover.tsx index 924abc6ede984..d38a09714e7d3 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/filters/filter_popover.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/operations/definitions/filters/filter_popover.tsx @@ -12,10 +12,13 @@ import { EuiPopover, EuiSpacer } from '@elastic/eui'; import type { Query } from '@kbn/es-query'; // Need to keep it separate to make it work Jest mocks in dimension_panel tests // import { QueryInput } from '../../../../shared_components/query_input'; -import { isQueryValid, QueryInput } from '../../../../../shared_components'; +import { isQueryValid, QueryInput } from '@kbn/visualization-ui-components/public'; +import { useKibana } from '@kbn/kibana-react-plugin/public'; +import { LENS_APP_NAME } from '../../../../../../common/constants'; import { IndexPattern } from '../../../../../types'; import { FilterValue, defaultLabel } from '.'; import { LabelInput } from '../shared_components'; +import { LensAppServices } from '../../../../../app_plugin/types'; export const FilterPopover = ({ filter, @@ -60,7 +63,7 @@ export const FilterPopover = ({ { if (inputRef.current) inputRef.current.focus(); }} + appName={LENS_APP_NAME} + services={useKibana().services} /> setIncompleteColumn(undefined)} onDeleteColumn={() => { throw new Error('Should not be called'); }} diff --git a/x-pack/plugins/lens/public/datasources/form_based/utils.tsx b/x-pack/plugins/lens/public/datasources/form_based/utils.tsx index c136aab767b65..e967a468dc851 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/utils.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/utils.tsx @@ -25,6 +25,7 @@ import { } from '@kbn/data-plugin/public'; import { estypes } from '@elastic/elasticsearch'; +import { isQueryValid } from '@kbn/visualization-ui-components/public'; import type { DateRange } from '../../../common/types'; import type { FramePublicAPI, @@ -58,7 +59,6 @@ import { mergeLayer } from './state_helpers'; import { supportsRarityRanking } from './operations/definitions/terms'; import { DEFAULT_MAX_DOC_COUNT } from './operations/definitions/terms/constants'; import { getOriginalId } from '../../../common/expressions/datatable/transpose_helpers'; -import { isQueryValid } from '../../shared_components'; import { ReducedSamplingSectionEntries } from './info_badges'; function isMinOrMaxColumn( diff --git a/x-pack/plugins/lens/public/datasources/text_based/field_select.test.tsx b/x-pack/plugins/lens/public/datasources/text_based/field_select.test.tsx index 2a8e63da1b0e1..bd84ce529ea6d 100644 --- a/x-pack/plugins/lens/public/datasources/text_based/field_select.test.tsx +++ b/x-pack/plugins/lens/public/datasources/text_based/field_select.test.tsx @@ -6,7 +6,7 @@ */ import React from 'react'; -import { FieldPicker, FieldOptionValue } from '../../shared_components/field_picker'; +import { FieldPicker, FieldOptionValue } from '@kbn/visualization-ui-components/public'; import { type FieldOptionCompatible, FieldSelect, FieldSelectProps } from './field_select'; import { shallowWithIntl as shallow } from '@kbn/test-jest-helpers'; diff --git a/x-pack/plugins/lens/public/datasources/text_based/field_select.tsx b/x-pack/plugins/lens/public/datasources/text_based/field_select.tsx index 5ca4f1e341ad9..9dc2d5115c03d 100644 --- a/x-pack/plugins/lens/public/datasources/text_based/field_select.tsx +++ b/x-pack/plugins/lens/public/datasources/text_based/field_select.tsx @@ -9,7 +9,11 @@ import React, { useMemo } from 'react'; import { EuiComboBoxOptionOption, EuiComboBoxProps } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import type { DatatableColumn } from '@kbn/expressions-plugin/public'; -import { FieldPicker, FieldOptionValue, FieldOption } from '../../shared_components/field_picker'; +import { + FieldPicker, + FieldOptionValue, + FieldOption, +} from '@kbn/visualization-ui-components/public'; import type { TextBasedLayerColumn } from './types'; import type { DataType } from '../../types'; diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.tsx index 1873e563f05a3..6c8e5e527f556 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/layer_panel.tsx @@ -21,6 +21,7 @@ import { i18n } from '@kbn/i18n'; import { css } from '@emotion/react'; import { euiThemeVars } from '@kbn/ui-theme'; import { DragDropIdentifier, ReorderProvider, DropType } from '@kbn/dom-drag-drop'; +import { DimensionButton } from '@kbn/visualization-ui-components/public'; import { LayerType } from '../../../../common/types'; import { LayerActions } from './layer_actions'; import { IndexPatternServiceAPI } from '../../../data_views_service/service'; @@ -38,7 +39,6 @@ import { LayerSettings } from './layer_settings'; import { LayerPanelProps, ActiveDimensionState } from './types'; import { DimensionContainer } from './dimension_container'; import { EmptyDimensionButton } from './buttons/empty_dimension_button'; -import { DimensionButton } from './buttons/dimension_button'; import { DraggableDimensionButton } from './buttons/draggable_dimension_button'; import { useFocusUpdate } from './use_focus_update'; import { @@ -561,7 +561,7 @@ export function LayerPanel( className="lnsLayerPanel__dimension" accessorConfig={accessorConfig} label={columnLabelMap?.[accessorConfig.columnId] ?? ''} - group={group} + groupLabel={group.groupLabel} onClick={(id: string) => { setActiveDimension({ isNew: false, @@ -573,7 +573,10 @@ export function LayerPanel( props.onRemoveDimension({ columnId: id, layerId }); removeButtonRef(id); }} - message={messages[0]} + message={{ + severity: messages[0]?.severity, + content: messages[0]?.shortMessage || messages[0]?.longMessage, + }} > {layerDatasource ? ( ) => ( - - {title ? {title} : null} - - -); - -export const IconWarning = ({ title, titleId, ...props }: Omit) => ( - - {title ? {title} : null} - - - -); diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/message_list.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/message_list.tsx index 0cbb33248358a..ebf221e9a4832 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/message_list.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/workspace_panel/message_list.tsx @@ -20,7 +20,6 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { css, SerializedStyles } from '@emotion/react'; -import { IconError, IconWarning } from '../custom_icons'; import { UserMessage } from '../../../types'; export const MessageList = ({ @@ -85,14 +84,14 @@ export const MessageList = ({ > {errorCount > 0 && ( <> - + {errorCount} )} {warningCount > 0 && ( <> {message.severity === 'error' ? ( - + ) : ( - + )} diff --git a/x-pack/plugins/lens/public/shared_components/axis/title/axis_title_settings.tsx b/x-pack/plugins/lens/public/shared_components/axis/title/axis_title_settings.tsx index d46b99cd817d5..5b88455a28e5c 100644 --- a/x-pack/plugins/lens/public/shared_components/axis/title/axis_title_settings.tsx +++ b/x-pack/plugins/lens/public/shared_components/axis/title/axis_title_settings.tsx @@ -8,8 +8,9 @@ import React, { useCallback, useMemo } from 'react'; import { EuiSpacer, EuiFormRow } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; +import { useDebouncedValue } from '@kbn/visualization-ui-components/public'; import type { AxesSettingsConfig } from '../../../visualizations/xy/types'; -import { type LabelMode, useDebouncedValue, VisLabel } from '../..'; +import { type LabelMode, VisLabel } from '../..'; type AxesSettingsConfigKeys = keyof AxesSettingsConfig; diff --git a/x-pack/plugins/lens/public/shared_components/coloring/utils.ts b/x-pack/plugins/lens/public/shared_components/coloring/utils.ts index 5ccd144e74628..dc9383a2cb561 100644 --- a/x-pack/plugins/lens/public/shared_components/coloring/utils.ts +++ b/x-pack/plugins/lens/public/shared_components/coloring/utils.ts @@ -5,7 +5,7 @@ * 2.0. */ -import chroma from 'chroma-js'; +import { chroma } from '@kbn/visualization-ui-components/public'; import { euiLightVars, euiDarkVars } from '@kbn/ui-theme'; import { isColorDark } from '@elastic/eui'; diff --git a/x-pack/plugins/lens/public/shared_components/index.ts b/x-pack/plugins/lens/public/shared_components/index.ts index 95000c5c4248b..16c88a8d50389 100644 --- a/x-pack/plugins/lens/public/shared_components/index.ts +++ b/x-pack/plugins/lens/public/shared_components/index.ts @@ -9,16 +9,7 @@ export type { ToolbarPopoverProps } from './toolbar_popover'; export { ToolbarPopover } from './toolbar_popover'; export { LegendSettingsPopover } from './legend/legend_settings_popover'; export { PalettePicker } from './palette_picker'; -export { FieldPicker, TruncatedLabel } from './field_picker'; -export type { FieldOption, FieldOptionValue } from './field_picker'; export { ChangeIndexPattern, fieldContainsData } from './dataview_picker'; -export { QueryInput, isQueryValid, validateQuery } from './query_input'; -export { - NewBucketButton, - DraggableBucketContainer, - DragDropBuckets, - FieldsBucketContainer, -} from './drag_drop_bucket'; export { RangeInputField } from './range_input_field'; export { AxisBoundsControl, @@ -28,17 +19,11 @@ export { getDataBounds, axisExtentConfigToExpression, } from './axis/extent'; -export { TooltipWrapper } from './tooltip_wrapper'; export * from './coloring'; -export { useDebouncedValue } from './debounced_value'; export * from './helpers'; export { LegendActionPopover } from './legend/action/legend_action_popover'; -export { NameInput } from './name_input'; export { ValueLabelsSettings } from './value_labels_settings'; export { AxisTitleSettings } from './axis/title/axis_title_settings'; export { AxisTicksSettings } from './axis/ticks/axis_ticks_settings'; -export { DimensionEditorSection } from './dimension_section'; -export { FilterQueryInput } from './filter_query_input'; export * from './static_header'; export * from './vis_label'; -export { IconSelect } from './icon_select/icon_select'; diff --git a/x-pack/plugins/lens/public/shared_components/legend/layout/columns_number_setting.tsx b/x-pack/plugins/lens/public/shared_components/legend/layout/columns_number_setting.tsx index c0db8ce10a7b3..4ffc7c4066115 100644 --- a/x-pack/plugins/lens/public/shared_components/legend/layout/columns_number_setting.tsx +++ b/x-pack/plugins/lens/public/shared_components/legend/layout/columns_number_setting.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; import { EuiFieldNumber, EuiFormRow } from '@elastic/eui'; -import { useDebouncedValue } from '../../debounced_value'; +import { useDebouncedValue } from '@kbn/visualization-ui-components/public'; export const DEFAULT_FLOATING_COLUMNS = 1; diff --git a/x-pack/plugins/lens/public/shared_components/legend/legend_settings_popover.tsx b/x-pack/plugins/lens/public/shared_components/legend/legend_settings_popover.tsx index 49f03b505283c..cfd42ed41c7cd 100644 --- a/x-pack/plugins/lens/public/shared_components/legend/legend_settings_popover.tsx +++ b/x-pack/plugins/lens/public/shared_components/legend/legend_settings_popover.tsx @@ -17,11 +17,11 @@ import { import { Position, VerticalAlignment, HorizontalAlignment } from '@elastic/charts'; import { ToolbarButtonProps } from '@kbn/kibana-react-plugin/public'; import { LegendSize } from '@kbn/visualizations-plugin/public'; +import { useDebouncedValue } from '@kbn/visualization-ui-components/public'; import { ToolbarPopover } from '../toolbar_popover'; import { LegendLocationSettings } from './location/legend_location_settings'; import { ColumnsNumberSetting } from './layout/columns_number_setting'; import { LegendSizeSettings } from './size/legend_size_settings'; -import { useDebouncedValue } from '../debounced_value'; export interface LegendSettingsPopoverProps { /** diff --git a/x-pack/plugins/lens/public/types.ts b/x-pack/plugins/lens/public/types.ts index 6d24931032274..1ee21390dc984 100644 --- a/x-pack/plugins/lens/public/types.ts +++ b/x-pack/plugins/lens/public/types.ts @@ -45,6 +45,7 @@ import type { DragContextState, DropType, } from '@kbn/dom-drag-drop'; +import type { AccessorConfig } from '@kbn/visualization-ui-components/public'; import type { DateRange, LayerType, SortingHint } from '../common/types'; import type { LensSortActionData, @@ -804,21 +805,6 @@ export type VisualizationDimensionEditorProps = VisualizationConfig panelRef: MutableRefObject; }; -export interface AccessorConfig { - columnId: string; - triggerIconType?: - | 'color' - | 'disabled' - | 'colorBy' - | 'none' - | 'invisible' - | 'aggregate' - | 'custom'; - customIcon?: IconType; - color?: string; - palette?: string[] | Array<{ color: string; stop: number }>; -} - export type VisualizationDimensionGroupConfig = SharedDimensionProps & { groupLabel: string; dimensionEditorGroupLabel?: string; diff --git a/x-pack/plugins/lens/public/visualizations/datatable/components/dimension_editor_addtional_section.tsx b/x-pack/plugins/lens/public/visualizations/datatable/components/dimension_editor_addtional_section.tsx index 19bcfcbabd536..0ab29526c939a 100644 --- a/x-pack/plugins/lens/public/visualizations/datatable/components/dimension_editor_addtional_section.tsx +++ b/x-pack/plugins/lens/public/visualizations/datatable/components/dimension_editor_addtional_section.tsx @@ -10,10 +10,10 @@ import { i18n } from '@kbn/i18n'; import { css } from '@emotion/react'; import { EuiFormRow, EuiFieldText, EuiText, useEuiTheme, EuiComboBox } from '@elastic/eui'; import { PaletteRegistry } from '@kbn/coloring'; +import { useDebouncedValue } from '@kbn/visualization-ui-components/public'; import type { VisualizationDimensionEditorProps } from '../../../types'; import type { DatatableVisualizationState } from '../visualization'; -import { useDebouncedValue } from '../../../shared_components'; import type { ColumnState } from '../../../../common/expressions'; import { diff --git a/x-pack/plugins/lens/public/visualizations/gauge/dimension_editor.tsx b/x-pack/plugins/lens/public/visualizations/gauge/dimension_editor.tsx index c886eaa360ec2..4406cea21b274 100644 --- a/x-pack/plugins/lens/public/visualizations/gauge/dimension_editor.tsx +++ b/x-pack/plugins/lens/public/visualizations/gauge/dimension_editor.tsx @@ -25,8 +25,9 @@ import { } from '@kbn/coloring'; import { GaugeTicksPositions, GaugeColorModes } from '@kbn/expression-gauge-plugin/common'; import { getMaxValue, getMinValue } from '@kbn/expression-gauge-plugin/public'; +import { TooltipWrapper } from '@kbn/visualization-ui-components/public'; import { isNumericFieldForDatatable } from '../../../common/expressions/datatable/utils'; -import { applyPaletteParams, PalettePanelContainer, TooltipWrapper } from '../../shared_components'; +import { applyPaletteParams, PalettePanelContainer } from '../../shared_components'; import type { VisualizationDimensionEditorProps } from '../../types'; import type { GaugeVisualizationState } from './constants'; import { defaultPaletteParams } from './palette_config'; diff --git a/x-pack/plugins/lens/public/visualizations/gauge/toolbar_component/index.tsx b/x-pack/plugins/lens/public/visualizations/gauge/toolbar_component/index.tsx index 81f4c8f6d1170..f9b9b01d3d72b 100644 --- a/x-pack/plugins/lens/public/visualizations/gauge/toolbar_component/index.tsx +++ b/x-pack/plugins/lens/public/visualizations/gauge/toolbar_component/index.tsx @@ -9,8 +9,9 @@ import React, { memo, useState } from 'react'; import { EuiFlexGroup, EuiFlexItem, EuiFormRow } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import type { GaugeLabelMajorMode } from '@kbn/expression-gauge-plugin/common'; +import { useDebouncedValue } from '@kbn/visualization-ui-components/public'; import type { VisualizationToolbarProps } from '../../../types'; -import { ToolbarPopover, useDebouncedValue, VisLabel } from '../../../shared_components'; +import { ToolbarPopover, VisLabel } from '../../../shared_components'; import './gauge_config_panel.scss'; import type { GaugeVisualizationState } from '../constants'; diff --git a/x-pack/plugins/lens/public/visualizations/heatmap/toolbar_component.tsx b/x-pack/plugins/lens/public/visualizations/heatmap/toolbar_component.tsx index 7cf23904f6937..2ccf66520d24e 100644 --- a/x-pack/plugins/lens/public/visualizations/heatmap/toolbar_component.tsx +++ b/x-pack/plugins/lens/public/visualizations/heatmap/toolbar_component.tsx @@ -11,13 +11,13 @@ import { Position } from '@elastic/charts'; import { i18n } from '@kbn/i18n'; import { LegendSize } from '@kbn/visualizations-plugin/public'; import { EuiIconAxisLeft, EuiIconAxisBottom } from '@kbn/chart-icons'; +import { TooltipWrapper } from '@kbn/visualization-ui-components/public'; import type { VisualizationToolbarProps } from '../../types'; import { LegendSettingsPopover, ToolbarPopover, ValueLabelsSettings, AxisTitleSettings, - TooltipWrapper, AxisTicksSettings, } from '../../shared_components'; import type { HeatmapVisualizationState } from './types'; diff --git a/x-pack/plugins/lens/public/visualizations/legacy_metric/metric_config_panel/appearance_options_popover.tsx b/x-pack/plugins/lens/public/visualizations/legacy_metric/metric_config_panel/appearance_options_popover.tsx index b5ce24e030d57..3d92f9cee9428 100644 --- a/x-pack/plugins/lens/public/visualizations/legacy_metric/metric_config_panel/appearance_options_popover.tsx +++ b/x-pack/plugins/lens/public/visualizations/legacy_metric/metric_config_panel/appearance_options_popover.tsx @@ -7,7 +7,8 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; -import { ToolbarPopover, TooltipWrapper } from '../../../shared_components'; +import { TooltipWrapper } from '@kbn/visualization-ui-components/public'; +import { ToolbarPopover } from '../../../shared_components'; import { TitlePositionOptions } from './title_position_option'; import { FramePublicAPI } from '../../../types'; import type { LegacyMetricState } from '../../../../common/types'; diff --git a/x-pack/plugins/lens/public/visualizations/metric/dimension_editor.test.tsx b/x-pack/plugins/lens/public/visualizations/metric/dimension_editor.test.tsx index 346b89666dc22..0442505da8c0d 100644 --- a/x-pack/plugins/lens/public/visualizations/metric/dimension_editor.test.tsx +++ b/x-pack/plugins/lens/public/visualizations/metric/dimension_editor.test.tsx @@ -27,7 +27,7 @@ import { EuiColorPickerOutput } from '@elastic/eui/src/components/color_picker/c import { createMockFramePublicAPI } from '../../mocks'; import { chartPluginMock } from '@kbn/charts-plugin/public/mocks'; import { euiLightVars } from '@kbn/ui-theme'; -import { DebouncedInput } from '../../shared_components/debounced_input'; +import { DebouncedInput } from '@kbn/visualization-ui-components/public'; import { DatasourcePublicAPI } from '../..'; import { CollapseFunction } from '../../../common/expressions'; diff --git a/x-pack/plugins/lens/public/visualizations/metric/dimension_editor.tsx b/x-pack/plugins/lens/public/visualizations/metric/dimension_editor.tsx index a1180e0055eb2..f0903af010889 100644 --- a/x-pack/plugins/lens/public/visualizations/metric/dimension_editor.tsx +++ b/x-pack/plugins/lens/public/visualizations/metric/dimension_editor.tsx @@ -33,13 +33,13 @@ import { import { getDataBoundsForPalette } from '@kbn/expression-metric-vis-plugin/public'; import { getColumnByAccessor } from '@kbn/visualizations-plugin/common/utils'; import { css } from '@emotion/react'; -import { isNumericFieldForDatatable } from '../../../common/expressions/datatable/utils'; import { - applyPaletteParams, - PalettePanelContainer, + DebouncedInput, useDebouncedValue, IconSelect, -} from '../../shared_components'; +} from '@kbn/visualization-ui-components/public'; +import { isNumericFieldForDatatable } from '../../../common/expressions/datatable/utils'; +import { applyPaletteParams, PalettePanelContainer } from '../../shared_components'; import type { VisualizationDimensionEditorProps } from '../../types'; import { defaultNumberPaletteParams, defaultPercentagePaletteParams } from './palette_config'; import { @@ -49,7 +49,6 @@ import { showingBar, } from './visualization'; import { CollapseSetting } from '../../shared_components/collapse_setting'; -import { DebouncedInput } from '../../shared_components/debounced_input'; import { iconsSet } from './icon_set'; export type SupportingVisType = 'none' | 'bar' | 'trendline'; diff --git a/x-pack/plugins/lens/public/visualizations/metric/icon_set.ts b/x-pack/plugins/lens/public/visualizations/metric/icon_set.ts index c21e6809dd0b4..9626979e64966 100644 --- a/x-pack/plugins/lens/public/visualizations/metric/icon_set.ts +++ b/x-pack/plugins/lens/public/visualizations/metric/icon_set.ts @@ -7,7 +7,7 @@ import { i18n } from '@kbn/i18n'; import { AvailableMetricIcon } from '@kbn/expression-metric-vis-plugin/common'; -import { IconSet } from '../../shared_components/icon_select/icon_select'; +import { type IconSet } from '@kbn/visualization-ui-components/public'; export const iconsSet: IconSet = [ { diff --git a/x-pack/plugins/lens/public/visualizations/metric/toolbar.tsx b/x-pack/plugins/lens/public/visualizations/metric/toolbar.tsx index 342bb0a30d576..1ee4ee0be28c3 100644 --- a/x-pack/plugins/lens/public/visualizations/metric/toolbar.tsx +++ b/x-pack/plugins/lens/public/visualizations/metric/toolbar.tsx @@ -8,8 +8,9 @@ import React, { useCallback } from 'react'; import { i18n } from '@kbn/i18n'; import { EuiFlexGroup, EuiFormRow, EuiFieldText } from '@elastic/eui'; +import { useDebouncedValue } from '@kbn/visualization-ui-components/public'; import { VisualizationToolbarProps } from '../../types'; -import { ToolbarPopover, useDebouncedValue } from '../../shared_components'; +import { ToolbarPopover } from '../../shared_components'; import { MetricVisualizationState } from './visualization'; export function Toolbar(props: VisualizationToolbarProps) { diff --git a/x-pack/plugins/lens/public/visualizations/metric/visualization.tsx b/x-pack/plugins/lens/public/visualizations/metric/visualization.tsx index b4b0b159a2711..3db4693698002 100644 --- a/x-pack/plugins/lens/public/visualizations/metric/visualization.tsx +++ b/x-pack/plugins/lens/public/visualizations/metric/visualization.tsx @@ -16,6 +16,7 @@ import { LayoutDirection } from '@elastic/charts'; import { euiLightVars, euiThemeVars } from '@kbn/ui-theme'; import { KibanaThemeProvider } from '@kbn/kibana-react-plugin/public'; import { IconChartMetric } from '@kbn/chart-icons'; +import { AccessorConfig } from '@kbn/visualization-ui-components/public'; import { CollapseFunction } from '../../../common/expressions'; import type { LayerType } from '../../../common/types'; import { layerTypes } from '../../../common/layer_types'; @@ -24,7 +25,6 @@ import { getSuggestions } from './suggestions'; import { Visualization, OperationMetadata, - AccessorConfig, VisualizationConfigProps, VisualizationDimensionGroupConfig, Suggestion, diff --git a/x-pack/plugins/lens/public/visualizations/partition/toolbar.tsx b/x-pack/plugins/lens/public/visualizations/partition/toolbar.tsx index 8f5d9e11bead9..f25a97d7d7500 100644 --- a/x-pack/plugins/lens/public/visualizations/partition/toolbar.tsx +++ b/x-pack/plugins/lens/public/visualizations/partition/toolbar.tsx @@ -22,17 +22,13 @@ import { import type { Position } from '@elastic/charts'; import type { PaletteRegistry } from '@kbn/coloring'; import { LegendSize } from '@kbn/visualizations-plugin/public'; +import { useDebouncedValue } from '@kbn/visualization-ui-components/public'; import { DEFAULT_PERCENT_DECIMALS } from './constants'; import { PartitionChartsMeta } from './partition_charts_meta'; import { PieLayerState, PieVisualizationState, SharedPieLayerState } from '../../../common/types'; import { LegendDisplay } from '../../../common/constants'; import { VisualizationDimensionEditorProps, VisualizationToolbarProps } from '../../types'; -import { - ToolbarPopover, - LegendSettingsPopover, - useDebouncedValue, - PalettePicker, -} from '../../shared_components'; +import { ToolbarPopover, LegendSettingsPopover, PalettePicker } from '../../shared_components'; import { getDefaultVisualValuesForLayer } from '../../shared_components/datasource_default_values'; import { shouldShowValuesInLegend } from './render_helpers'; import { CollapseSetting } from '../../shared_components/collapse_setting'; diff --git a/x-pack/plugins/lens/public/visualizations/partition/visualization.tsx b/x-pack/plugins/lens/public/visualizations/partition/visualization.tsx index ca6216f3838b0..8d7ccc0ca7e6d 100644 --- a/x-pack/plugins/lens/public/visualizations/partition/visualization.tsx +++ b/x-pack/plugins/lens/public/visualizations/partition/visualization.tsx @@ -16,11 +16,11 @@ import { VIS_EVENT_TO_TRIGGER } from '@kbn/visualizations-plugin/public'; import { EuiSpacer } from '@elastic/eui'; import { PartitionVisConfiguration } from '@kbn/visualizations-plugin/common/convert_to_lens'; import { LayerTypes } from '@kbn/expression-xy-plugin/public'; +import { AccessorConfig } from '@kbn/visualization-ui-components/public'; import type { FormBasedPersistedState } from '../../datasources/form_based/types'; import type { Visualization, OperationMetadata, - AccessorConfig, VisualizationDimensionGroupConfig, Suggestion, VisualizeEditorContext, diff --git a/x-pack/plugins/lens/public/visualizations/xy/annotations/helpers.tsx b/x-pack/plugins/lens/public/visualizations/xy/annotations/helpers.tsx index c63fc226907c5..6174017f3054b 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/annotations/helpers.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/annotations/helpers.tsx @@ -16,8 +16,9 @@ import { import { EventAnnotationConfig } from '@kbn/event-annotation-plugin/common'; import { IconChartBarAnnotations } from '@kbn/chart-icons'; import { LayerTypes } from '@kbn/expression-xy-plugin/public'; +import type { AccessorConfig } from '@kbn/visualization-ui-components/public'; import { isDraggedDataViewField } from '../../../utils'; -import type { FramePublicAPI, Visualization, AccessorConfig } from '../../../types'; +import type { FramePublicAPI, Visualization } from '../../../types'; import { isHorizontalChart } from '../state_helpers'; import { annotationsIconSet } from '../xy_config_panel/annotations_config_panel/icon_set'; import type { XYState, XYDataLayerConfig, XYAnnotationLayerConfig, XYLayerConfig } from '../types'; diff --git a/x-pack/plugins/lens/public/visualizations/xy/color_assignment.ts b/x-pack/plugins/lens/public/visualizations/xy/color_assignment.ts index 1416797ad8014..9fefea76a9d30 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/color_assignment.ts +++ b/x-pack/plugins/lens/public/visualizations/xy/color_assignment.ts @@ -14,7 +14,8 @@ import { defaultAnnotationRangeColor, isRangeAnnotationConfig, } from '@kbn/event-annotation-plugin/public'; -import type { AccessorConfig, FramePublicAPI } from '../../types'; +import type { AccessorConfig } from '@kbn/visualization-ui-components/public'; +import type { FramePublicAPI } from '../../types'; import { getColumnToLabelMap } from './state_helpers'; import { FormatFactory } from '../../../common/types'; import { isDataLayer, isReferenceLayer, isAnnotationsLayer } from './visualization_helpers'; diff --git a/x-pack/plugins/lens/public/visualizations/xy/reference_line_helpers.tsx b/x-pack/plugins/lens/public/visualizations/xy/reference_line_helpers.tsx index e53c371303739..d850925261ae2 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/reference_line_helpers.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/reference_line_helpers.tsx @@ -10,7 +10,8 @@ import { i18n } from '@kbn/i18n'; import { Datatable } from '@kbn/expressions-plugin/public'; import { IconChartBarReferenceLine } from '@kbn/chart-icons'; import { LayerTypes } from '@kbn/expression-xy-plugin/public'; -import type { DatasourceLayers, FramePublicAPI, Visualization, AccessorConfig } from '../../types'; +import type { AccessorConfig } from '@kbn/visualization-ui-components/public'; +import type { DatasourceLayers, FramePublicAPI, Visualization } from '../../types'; import { groupAxesByType } from './axes_configuration'; import { isHorizontalChart, isPercentageSeries, isStackedChart } from './state_helpers'; import type { diff --git a/x-pack/plugins/lens/public/visualizations/xy/state_helpers.ts b/x-pack/plugins/lens/public/visualizations/xy/state_helpers.ts index ab20281a81d53..2f8caef2b895e 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/state_helpers.ts +++ b/x-pack/plugins/lens/public/visualizations/xy/state_helpers.ts @@ -11,7 +11,7 @@ import type { SavedObjectReference } from '@kbn/core/public'; import { isQueryAnnotationConfig } from '@kbn/event-annotation-plugin/public'; import { i18n } from '@kbn/i18n'; import { VisualizeFieldContext } from '@kbn/ui-actions-plugin/public'; -import { validateQuery } from '../../shared_components'; +import { validateQuery } from '@kbn/visualization-ui-components/public'; import { DataViewsState } from '../../state_management'; import type { FramePublicAPI, DatasourcePublicAPI, VisualizeEditorContext } from '../../types'; import { diff --git a/x-pack/plugins/lens/public/visualizations/xy/to_expression.ts b/x-pack/plugins/lens/public/visualizations/xy/to_expression.ts index 85bd512fa4480..3074fc57fd702 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/to_expression.ts +++ b/x-pack/plugins/lens/public/visualizations/xy/to_expression.ts @@ -49,7 +49,6 @@ import type { } from './types'; import type { OperationMetadata, DatasourcePublicAPI, DatasourceLayers } from '../../types'; import { getColumnToLabelMap } from './state_helpers'; -import { hasIcon } from '../../shared_components/icon_select/icon_select'; import { defaultReferenceLineColor } from './color_assignment'; import { getDefaultVisualValuesForLayer } from '../../shared_components/datasource_default_values'; import { @@ -64,6 +63,7 @@ import { hasNumericHistogramDimension, } from '../../shared_components'; import type { CollapseExpressionFunction } from '../../../common/expressions'; +import { hasIcon } from './xy_config_panel/shared/marker_decoration_settings'; export const getSortedAccessors = ( datasource: DatasourcePublicAPI | undefined, diff --git a/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx b/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx index 1ecd9adbd8cc5..56ebe50bf5fd2 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/visualization.tsx @@ -21,6 +21,7 @@ import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; import type { IStorageWrapper } from '@kbn/kibana-utils-plugin/public'; import type { UnifiedSearchPublicPluginStart } from '@kbn/unified-search-plugin/public'; import { LayerTypes } from '@kbn/expression-xy-plugin/public'; +import type { AccessorConfig } from '@kbn/visualization-ui-components/public'; import { generateId } from '../../id_generator'; import { isDraggedDataViewField, @@ -36,13 +37,7 @@ import { DimensionEditor, } from './xy_config_panel/dimension_editor'; import { LayerHeader, LayerHeaderContent } from './xy_config_panel/layer_header'; -import type { - Visualization, - AccessorConfig, - FramePublicAPI, - Suggestion, - UserMessage, -} from '../../types'; +import type { Visualization, FramePublicAPI, Suggestion, UserMessage } from '../../types'; import type { FormBasedPersistedState } from '../../datasources/form_based/types'; import { type State, diff --git a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/annotations_config_panel/annotations_panel.tsx b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/annotations_config_panel/annotations_panel.tsx index 54ae5fc640bc4..9cb5f4d64079e 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/annotations_config_panel/annotations_panel.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/annotations_config_panel/annotations_panel.tsx @@ -25,20 +25,19 @@ import { import moment from 'moment'; import { useExistingFieldsReader } from '@kbn/unified-field-list-plugin/public'; import { + IconSelectSetting, FieldOption, FieldOptionValue, FieldPicker, -} from '../../../../shared_components/field_picker'; -import { FormatFactory } from '../../../../../common/types'; -import { - DimensionEditorSection, NameInput, useDebouncedValue, -} from '../../../../shared_components'; + DimensionEditorSection, + ColorPicker, +} from '@kbn/visualization-ui-components/public'; +import { FormatFactory } from '../../../../../common/types'; import { isHorizontalChart } from '../../state_helpers'; import { defaultAnnotationLabel, defaultRangeAnnotationLabel } from '../../annotations/helpers'; -import { ColorPicker } from '../color_picker'; -import { IconSelectSetting, TextDecorationSetting } from '../shared/marker_decoration_settings'; +import { TextDecorationSetting } from '../shared/marker_decoration_settings'; import { LineStyleSettings } from '../shared/line_style_settings'; import { updateLayer } from '..'; import { annotationsIconSet } from './icon_set'; @@ -216,12 +215,9 @@ export const AnnotationsPanel = ( {!isRange && ( <> setAnnotations({ icon })} defaultIcon="triangle" - currentConfig={{ - axisMode: 'bottom', - ...currentAnnotation, - }} + currentIcon={currentAnnotation?.icon} customIconSet={annotationsIconSet} /> = [ { diff --git a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/annotations_config_panel/query_annotation_panel.tsx b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/annotations_config_panel/query_annotation_panel.tsx index 00f0013c92822..e502efe559597 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/annotations_config_panel/query_annotation_panel.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/annotations_config_panel/query_annotation_panel.tsx @@ -13,12 +13,15 @@ import React from 'react'; import { useExistingFieldsReader } from '@kbn/unified-field-list-plugin/public'; import { FieldOption, + FilterQueryInput, FieldOptionValue, FieldPicker, - FilterQueryInput, -} from '../../../../shared_components'; +} from '@kbn/visualization-ui-components/public'; +import { useKibana } from '@kbn/kibana-react-plugin/public'; +import { LENS_APP_NAME } from '../../../../../common/constants'; import type { FramePublicAPI } from '../../../../types'; import type { XYState, XYAnnotationLayerConfig } from '../../types'; +import { LensAppServices } from '../../../../app_plugin/types'; export const defaultQuery: Query = { query: '', @@ -85,7 +88,9 @@ export const ConfigPanelQueryAnnotation = ({ onChange({ filter: { type: 'kibana_query', ...query } }); }} data-test-subj="lnsXY-annotation-query-based-query-input" - indexPattern={currentIndexPattern} + dataView={currentIndexPattern} + appName={LENS_APP_NAME} + queryInputServices={useKibana().services} /> diff --git a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/annotations_config_panel/tooltip_annotation_panel.tsx b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/annotations_config_panel/tooltip_annotation_panel.tsx index d3f68686c3bac..12b2926fa7b14 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/annotations_config_panel/tooltip_annotation_panel.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/annotations_config_panel/tooltip_annotation_panel.tsx @@ -10,17 +10,19 @@ import { i18n } from '@kbn/i18n'; import React, { useCallback, useMemo } from 'react'; import { QueryPointEventAnnotationConfig } from '@kbn/event-annotation-plugin/common'; import { useExistingFieldsReader } from '@kbn/unified-field-list-plugin/public'; -import type { IndexPattern } from '../../../../types'; import { FieldOption, FieldOptionValue, FieldPicker, +} from '@kbn/visualization-ui-components/public'; +import { useDebouncedValue, NewBucketButton, DragDropBuckets, DraggableBucketContainer, FieldsBucketContainer, -} from '../../../../shared_components'; +} from '@kbn/visualization-ui-components/public'; +import type { IndexPattern } from '../../../../types'; export const MAX_TOOLTIP_FIELDS_SIZE = 2; diff --git a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/axis_settings_popover.tsx b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/axis_settings_popover.tsx index 2d7471958ee92..e83899cdbf926 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/axis_settings_popover.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/axis_settings_popover.tsx @@ -17,10 +17,10 @@ import { EuiIconAxisRight, EuiIconAxisTop, } from '@kbn/chart-icons'; +import { useDebouncedValue } from '@kbn/visualization-ui-components/public'; import { isHorizontalChart } from '../state_helpers'; import { ToolbarPopover, - useDebouncedValue, AxisTitleSettings, AxisBoundsControl, AxisTicksSettings, diff --git a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/dimension_editor.tsx b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/dimension_editor.tsx index 802d73d345718..f5d19edd81c5e 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/dimension_editor.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/dimension_editor.tsx @@ -10,12 +10,13 @@ import { i18n } from '@kbn/i18n'; import { EuiButtonGroup, EuiFormRow, htmlIdGenerator } from '@elastic/eui'; import type { PaletteRegistry } from '@kbn/coloring'; import type { DatatableUtilitiesService } from '@kbn/data-plugin/common'; +import { useDebouncedValue } from '@kbn/visualization-ui-components/public'; +import { ColorPicker } from '@kbn/visualization-ui-components/public'; import type { VisualizationDimensionEditorProps } from '../../../types'; import { State, XYState, XYDataLayerConfig, YConfig, YAxisMode } from '../types'; import { FormatFactory } from '../../../../common/types'; import { getSeriesColor, isHorizontalChart } from '../state_helpers'; -import { ColorPicker } from './color_picker'; -import { PalettePicker, useDebouncedValue } from '../../../shared_components'; +import { PalettePicker } from '../../../shared_components'; import { getDataLayers, isAnnotationsLayer, isReferenceLayer } from '../visualization_helpers'; import { ReferenceLinePanel } from './reference_line_config_panel'; import { AnnotationsPanel } from './annotations_config_panel'; diff --git a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/index.tsx b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/index.tsx index 4342ecac69954..e0b4ab1ae1669 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/index.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/index.tsx @@ -11,6 +11,7 @@ import { Position, ScaleType } from '@elastic/charts'; import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import { AxisExtentConfig } from '@kbn/expression-xy-plugin/common'; import { LegendSize } from '@kbn/visualizations-plugin/public'; +import { TooltipWrapper } from '@kbn/visualization-ui-components/public'; import type { LegendSettingsPopoverProps } from '../../../shared_components/legend/legend_settings_popover'; import type { VisualizationToolbarProps, FramePublicAPI } from '../../../types'; import { State, XYState, AxesSettingsConfig } from '../types'; @@ -20,7 +21,6 @@ import { AxisSettingsPopover } from './axis_settings_popover'; import { getAxesConfiguration, getXDomain, GroupsConfiguration } from '../axes_configuration'; import { VisualOptionsPopover } from './visual_options_popover'; import { getScaleType } from '../to_expression'; -import { TooltipWrapper } from '../../../shared_components'; import { getDefaultVisualValuesForLayer } from '../../../shared_components/datasource_default_values'; import { getDataLayers } from '../visualization_helpers'; diff --git a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/reference_line_config_panel/icon_set.ts b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/reference_line_config_panel/icon_set.ts index d64fde37ebd25..73d53b566002d 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/reference_line_config_panel/icon_set.ts +++ b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/reference_line_config_panel/icon_set.ts @@ -7,7 +7,7 @@ import { i18n } from '@kbn/i18n'; import { AvailableReferenceLineIcon } from '@kbn/expression-xy-plugin/common'; -import { IconSet } from '../../../../shared_components/icon_select/icon_select'; +import { type IconSet } from '@kbn/visualization-ui-components/public'; export const referenceLineIconsSet: IconSet = [ { diff --git a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/reference_line_config_panel/reference_line_panel.tsx b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/reference_line_config_panel/reference_line_panel.tsx index d3907a28fecac..d160777eeaa4d 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/reference_line_config_panel/reference_line_panel.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/reference_line_config_panel/reference_line_panel.tsx @@ -10,17 +10,19 @@ import { i18n } from '@kbn/i18n'; import { EuiButtonGroup, EuiFormRow } from '@elastic/eui'; import type { PaletteRegistry } from '@kbn/coloring'; import { FillStyle } from '@kbn/expression-xy-plugin/common'; +import { + useDebouncedValue, + IconSelectSetting, + ColorPicker, +} from '@kbn/visualization-ui-components/public'; import type { VisualizationDimensionEditorProps } from '../../../../types'; import { State, XYState, XYReferenceLineLayerConfig, YConfig } from '../../types'; import { FormatFactory } from '../../../../../common/types'; -import { ColorPicker } from '../color_picker'; import { updateLayer } from '..'; -import { useDebouncedValue } from '../../../../shared_components'; import { idPrefix } from '../dimension_editor'; import { isHorizontalChart } from '../../state_helpers'; import { - IconSelectSetting, MarkerDecorationPosition, TextDecorationSetting, } from '../shared/marker_decoration_settings'; @@ -77,8 +79,8 @@ export const ReferenceLinePanel = ( <> setConfig({ icon })} + currentIcon={localConfig?.icon} customIconSet={referenceLineIconsSet} /> ({ ); } -export function IconSelectSetting({ - currentConfig, - setConfig, - customIconSet, - defaultIcon = 'empty', -}: { - currentConfig?: MarkerDecorationConfig; - setConfig: (config: MarkerDecorationConfig) => void; - customIconSet: IconSet; - defaultIcon?: string; -}) { - return ( - - { - setConfig({ icon: newIcon }); - }} - /> - - ); -} - export function MarkerDecorationPosition({ currentConfig, setConfig, diff --git a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/visual_options_popover/fill_opacity_option.tsx b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/visual_options_popover/fill_opacity_option.tsx index 236fc4c9eec7f..fa991c9fbc292 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/visual_options_popover/fill_opacity_option.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/visual_options_popover/fill_opacity_option.tsx @@ -8,7 +8,7 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; import { EuiFormRow, EuiRange } from '@elastic/eui'; -import { useDebouncedValue } from '../../../../shared_components'; +import { useDebouncedValue } from '@kbn/visualization-ui-components/public'; export interface FillOpacityOptionProps { /** diff --git a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/visual_options_popover/index.tsx b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/visual_options_popover/index.tsx index e1f995393ee7e..cac7df703159b 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/visual_options_popover/index.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/xy_config_panel/visual_options_popover/index.tsx @@ -7,7 +7,8 @@ import React from 'react'; import { i18n } from '@kbn/i18n'; -import { ToolbarPopover, TooltipWrapper, ValueLabelsSettings } from '../../../../shared_components'; +import { TooltipWrapper } from '@kbn/visualization-ui-components/public'; +import { ToolbarPopover, ValueLabelsSettings } from '../../../../shared_components'; import { MissingValuesOptions } from './missing_values_option'; import { LineCurveOption } from './line_curve_option'; import { FillOpacityOption } from './fill_opacity_option'; diff --git a/x-pack/plugins/lens/readme.md b/x-pack/plugins/lens/readme.md index b3768ba0b2540..334ab844c4308 100644 --- a/x-pack/plugins/lens/readme.md +++ b/x-pack/plugins/lens/readme.md @@ -229,7 +229,8 @@ Run all tests from the `x-pack` root directory - Run `node scripts/functional_tests_server` - Run `node ../scripts/functional_test_runner.js --config ./test/functional/apps/lens/group1/config.ts` - Run `node ../scripts/functional_test_runner.js --config ./test/functional/apps/lens/group2/config.ts` - - Run `node ../scripts/functional_test_runner.js --config ./test/functional/apps/lens/group3/config.ts` + - ... + - Run `node ../scripts/functional_test_runner.js --config ./test/functional/apps/lens/group6/config.ts` - API Functional tests: - Run `node scripts/functional_tests_server` - Run `node ../scripts/functional_test_runner.js --config ./test/api_integration/config.ts --grep=Lens` diff --git a/x-pack/plugins/lens/tsconfig.json b/x-pack/plugins/lens/tsconfig.json index 291804ddd0c10..a6e0a18ff4c1d 100644 --- a/x-pack/plugins/lens/tsconfig.json +++ b/x-pack/plugins/lens/tsconfig.json @@ -65,6 +65,7 @@ "@kbn/safer-lodash-set", "@kbn/shared-ux-router", "@kbn/dom-drag-drop", + "@kbn/visualization-ui-components", ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/ml/public/application/management/jobs_list/components/insufficient_license_page.tsx b/x-pack/plugins/ml/public/application/management/jobs_list/components/insufficient_license_page.tsx index a6a9e11198822..9c68f6d4f7aec 100644 --- a/x-pack/plugins/ml/public/application/management/jobs_list/components/insufficient_license_page.tsx +++ b/x-pack/plugins/ml/public/application/management/jobs_list/components/insufficient_license_page.tsx @@ -10,7 +10,14 @@ import React, { FC } from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; import { CoreStart } from '@kbn/core/public'; -import { EuiEmptyPrompt, EuiLink, EuiPageContent_Deprecated as EuiPageContent } from '@elastic/eui'; +import { + EuiButton, + EuiButtonEmpty, + EuiFlexGroup, + EuiFlexItem, + EuiPageTemplate, + EuiText, +} from '@elastic/eui'; interface Props { basePath: CoreStart['http']['basePath']; @@ -18,41 +25,63 @@ interface Props { export const InsufficientLicensePage: FC = ({ basePath }) => ( <> - + + + } data-test-subj="mlPageInsufficientLicense" - > - - - - } - body={ -

- - - - ), - }} - /> -

- } - /> -
+ body={ + + + +

+ +

+
+
+ + + + + + + , + + + + + + , + + + +
+ } + /> ); diff --git a/x-pack/plugins/observability/public/config/paths.ts b/x-pack/plugins/observability/public/config/paths.ts index 73430af2edbcf..8d20c22637698 100644 --- a/x-pack/plugins/observability/public/config/paths.ts +++ b/x-pack/plugins/observability/public/config/paths.ts @@ -18,6 +18,7 @@ export const paths = { ruleDetails: (ruleId?: string | null) => ruleId ? `${RULES_PAGE_LINK}/${encodeURI(ruleId)}` : RULES_PAGE_LINK, slos: SLOS_PAGE_LINK, + slosWelcome: `${SLOS_PAGE_LINK}/welcome`, sloCreate: `${SLOS_PAGE_LINK}/create`, sloEdit: (sloId: string) => `${SLOS_PAGE_LINK}/edit/${encodeURI(sloId)}`, sloDetails: (sloId: string) => `${SLOS_PAGE_LINK}/${encodeURI(sloId)}`, diff --git a/x-pack/plugins/observability/public/hooks/slo/__storybook_mocks__/use_fetch_slo_list.ts b/x-pack/plugins/observability/public/hooks/slo/__storybook_mocks__/use_fetch_slo_list.ts index 3c573cb6754d5..2faa0887b82ea 100644 --- a/x-pack/plugins/observability/public/hooks/slo/__storybook_mocks__/use_fetch_slo_list.ts +++ b/x-pack/plugins/observability/public/hooks/slo/__storybook_mocks__/use_fetch_slo_list.ts @@ -12,6 +12,7 @@ export const useFetchSloList = (): UseFetchSloListResponse => { return { isInitialLoading: false, isLoading: false, + isRefetching: false, isError: false, isSuccess: true, sloList, diff --git a/x-pack/plugins/observability/public/hooks/slo/use_clone_slo.ts b/x-pack/plugins/observability/public/hooks/slo/use_clone_slo.ts index d2fcc25eb2c34..00fddd8aebf14 100644 --- a/x-pack/plugins/observability/public/hooks/slo/use_clone_slo.ts +++ b/x-pack/plugins/observability/public/hooks/slo/use_clone_slo.ts @@ -7,15 +7,19 @@ import { v1 as uuidv1 } from 'uuid'; import { useMutation, useQueryClient } from '@tanstack/react-query'; +import { i18n } from '@kbn/i18n'; import type { CreateSLOInput, CreateSLOResponse, FindSLOResponse } from '@kbn/slo-schema'; import { useKibana } from '../../utils/kibana_react'; export function useCloneSlo() { - const { http } = useKibana().services; + const { + http, + notifications: { toasts }, + } = useKibana().services; const queryClient = useQueryClient(); - const cloneSlo = useMutation< + return useMutation< CreateSLOResponse, string, { slo: CreateSLOInput; idToCopyFrom?: string }, @@ -41,7 +45,10 @@ export function useCloneSlo() { const optimisticUpdate = { ...data, - results: [...(data?.results || []), { ...sloUsedToClone, name: slo.name, id: uuidv1() }], + results: [ + ...(data?.results || []), + { ...sloUsedToClone, name: slo.name, id: uuidv1(), summary: undefined }, + ], total: data?.total && data.total + 1, }; @@ -50,20 +57,31 @@ export function useCloneSlo() { queryClient.setQueryData(queryKey, optimisticUpdate); } + toasts.addSuccess( + i18n.translate('xpack.observability.slo.clone.successNotification', { + defaultMessage: 'Successfully created {name}', + values: { name: slo.name }, + }) + ); + // Return a context object with the snapshotted value return { previousSloList: data }; }, // If the mutation fails, use the context returned from onMutate to roll back - onError: (_err, _slo, context) => { + onError: (_err, { slo }, context) => { if (context?.previousSloList) { queryClient.setQueryData(['fetchSloList'], context.previousSloList); } + toasts.addDanger( + i18n.translate('xpack.observability.slo.clone.errorNotification', { + defaultMessage: 'Failed to clone {name}', + values: { name: slo.name }, + }) + ); }, onSuccess: () => { queryClient.invalidateQueries(['fetchSloList']); }, } ); - - return cloneSlo; } diff --git a/x-pack/plugins/observability/public/hooks/slo/use_create_slo.ts b/x-pack/plugins/observability/public/hooks/slo/use_create_slo.ts index d9b000fee0cd2..3b4bdf4ce61bd 100644 --- a/x-pack/plugins/observability/public/hooks/slo/use_create_slo.ts +++ b/x-pack/plugins/observability/public/hooks/slo/use_create_slo.ts @@ -5,27 +5,70 @@ * 2.0. */ +import { v1 as uuidv1 } from 'uuid'; import { useMutation, useQueryClient } from '@tanstack/react-query'; -import type { CreateSLOInput, CreateSLOResponse } from '@kbn/slo-schema'; +import { i18n } from '@kbn/i18n'; +import type { CreateSLOInput, CreateSLOResponse, FindSLOResponse } from '@kbn/slo-schema'; import { useKibana } from '../../utils/kibana_react'; export function useCreateSlo() { - const { http } = useKibana().services; + const { + http, + notifications: { toasts }, + } = useKibana().services; const queryClient = useQueryClient(); - const createSlo = useMutation( + return useMutation( ({ slo }: { slo: CreateSLOInput }) => { const body = JSON.stringify(slo); return http.post(`/api/observability/slos`, { body }); }, { mutationKey: ['createSlo'], - onSuccess: () => { + onSuccess: (_data, { slo: { name } }) => { + toasts.addSuccess( + i18n.translate('xpack.observability.slo.create.successNotification', { + defaultMessage: 'Successfully created {name}', + values: { name }, + }) + ); queryClient.invalidateQueries(['fetchSloList']); }, + onError: (error, { slo: { name } }) => { + toasts.addError(new Error(String(error)), { + title: i18n.translate('xpack.observability.slo.create.errorNotification', { + defaultMessage: 'Something went wrong while creating {name}', + values: { name }, + }), + }); + }, + onMutate: async ({ slo }) => { + // Cancel any outgoing refetches (so they don't overwrite our optimistic update) + await queryClient.cancelQueries(['fetchSloList']); + + const latestFetchSloListRequest = ( + queryClient.getQueriesData(['fetchSloList']) || [] + ).at(0); + + const [queryKey, data] = latestFetchSloListRequest || []; + + const newItem = { ...slo, id: uuidv1() }; + + const optimisticUpdate = { + ...data, + results: [...(data?.results || []), { ...newItem }], + total: data?.total ? data.total + 1 : 1, + }; + + // Optimistically update to the new value + if (queryKey) { + queryClient.setQueryData(queryKey, optimisticUpdate); + } + + // Return a context object with the snapshotted value + return { previousSloList: data }; + }, } ); - - return createSlo; } diff --git a/x-pack/plugins/observability/public/hooks/slo/use_delete_slo.ts b/x-pack/plugins/observability/public/hooks/slo/use_delete_slo.ts index f0af48585a26a..2878b3e158684 100644 --- a/x-pack/plugins/observability/public/hooks/slo/use_delete_slo.ts +++ b/x-pack/plugins/observability/public/hooks/slo/use_delete_slo.ts @@ -6,21 +6,24 @@ */ import { useMutation, useQueryClient } from '@tanstack/react-query'; +import { i18n } from '@kbn/i18n'; import { FindSLOResponse } from '@kbn/slo-schema'; - import { useKibana } from '../../utils/kibana_react'; -export function useDeleteSlo(sloId: string) { - const { http } = useKibana().services; +export function useDeleteSlo() { + const { + http, + notifications: { toasts }, + } = useKibana().services; const queryClient = useQueryClient(); const deleteSlo = useMutation< string, string, - { id: string }, + { id: string; name: string }, { previousSloList: FindSLOResponse | undefined } >( - ['deleteSlo', sloId], + ['deleteSlo'], ({ id }) => { try { return http.delete(`/api/observability/slos/${id}`); @@ -50,16 +53,30 @@ export function useDeleteSlo(sloId: string) { queryClient.setQueryData(queryKey, optimisticUpdate); } + toasts.addSuccess( + i18n.translate('xpack.observability.slo.slo.delete.successNotification', { + defaultMessage: 'Deleted {name}', + values: { name: slo.name }, + }) + ); + // Return a context object with the snapshotted value return { previousSloList: data }; }, // If the mutation fails, use the context returned from onMutate to roll back - onError: (_err, _slo, context) => { + onError: (_err, slo, context) => { if (context?.previousSloList) { queryClient.setQueryData(['fetchSloList'], context.previousSloList); } + + toasts.addDanger( + i18n.translate('xpack.observability.slo.slo.delete.errorNotification', { + defaultMessage: 'Failed to delete {name}', + values: { name: slo.name }, + }) + ); }, - onSuccess: () => { + onSuccess: (_success, slo) => { queryClient.invalidateQueries(['fetchSloList']); }, } diff --git a/x-pack/plugins/observability/public/hooks/slo/use_fetch_rules_for_slo.ts b/x-pack/plugins/observability/public/hooks/slo/use_fetch_rules_for_slo.ts index 153e2fb95c966..39ea6fdf994e9 100644 --- a/x-pack/plugins/observability/public/hooks/slo/use_fetch_rules_for_slo.ts +++ b/x-pack/plugins/observability/public/hooks/slo/use_fetch_rules_for_slo.ts @@ -77,8 +77,9 @@ export function useFetchRulesForSlo({ sloIds }: Params): UseFetchRulesForSloResp // ignore error for retrieving slos } }, - enabled: Boolean(sloIds), + enabled: Boolean(sloIds?.length), refetchOnWindowFocus: false, + keepPreviousData: true, } ); diff --git a/x-pack/plugins/observability/public/hooks/slo/use_fetch_slo_list.ts b/x-pack/plugins/observability/public/hooks/slo/use_fetch_slo_list.ts index fa9c2761e94d8..086ec0d8e77a9 100644 --- a/x-pack/plugins/observability/public/hooks/slo/use_fetch_slo_list.ts +++ b/x-pack/plugins/observability/public/hooks/slo/use_fetch_slo_list.ts @@ -28,6 +28,7 @@ interface SLOListParams { export interface UseFetchSloListResponse { isInitialLoading: boolean; isLoading: boolean; + isRefetching: boolean; isSuccess: boolean; isError: boolean; sloList: FindSLOResponse | undefined; @@ -96,14 +97,19 @@ export function useFetchSloList({ queryClient.invalidateQueries(['fetchActiveAlerts'], { exact: false, }); + + queryClient.invalidateQueries(['fetchRulesForSlo'], { + exact: false, + }); }, } ); return { sloList: data, - isLoading: isLoading || isRefetching, isInitialLoading, + isLoading, + isRefetching, isSuccess, isError, refetch, diff --git a/x-pack/plugins/observability/public/hooks/slo/use_update_slo.ts b/x-pack/plugins/observability/public/hooks/slo/use_update_slo.ts index 46d3d2eddea76..5fc25f4192756 100644 --- a/x-pack/plugins/observability/public/hooks/slo/use_update_slo.ts +++ b/x-pack/plugins/observability/public/hooks/slo/use_update_slo.ts @@ -6,27 +6,43 @@ */ import { useMutation, useQueryClient } from '@tanstack/react-query'; +import { i18n } from '@kbn/i18n'; import type { UpdateSLOInput, UpdateSLOResponse } from '@kbn/slo-schema'; import { useKibana } from '../../utils/kibana_react'; export function useUpdateSlo() { - const { http } = useKibana().services; + const { + http, + notifications: { toasts }, + } = useKibana().services; const queryClient = useQueryClient(); - const updateSlo = useMutation( + return useMutation( ({ sloId, slo }: { sloId: string; slo: UpdateSLOInput }) => { const body = JSON.stringify(slo); return http.put(`/api/observability/slos/${sloId}`, { body }); }, { mutationKey: ['updateSlo'], - onSuccess: () => { + onSuccess: (_data, { slo: { name } }) => { + toasts.addSuccess( + i18n.translate('xpack.observability.slo.update.successNotification', { + defaultMessage: 'Successfully updated {name}', + values: { name }, + }) + ); queryClient.invalidateQueries(['fetchSloList']); queryClient.invalidateQueries(['fetchHistoricalSummary']); }, + onError: (error, { slo: { name } }) => { + toasts.addError(new Error(String(error)), { + title: i18n.translate('xpack.observability.slo.update.errorNotification', { + defaultMessage: 'Something went wrong when updating {name}', + values: { name }, + }), + }); + }, } ); - - return updateSlo; } diff --git a/x-pack/plugins/observability/public/pages/slo_details/components/header_control.tsx b/x-pack/plugins/observability/public/pages/slo_details/components/header_control.tsx index 848b35b8bb293..ace0f1a6e5167 100644 --- a/x-pack/plugins/observability/public/pages/slo_details/components/header_control.tsx +++ b/x-pack/plugins/observability/public/pages/slo_details/components/header_control.tsx @@ -5,20 +5,20 @@ * 2.0. */ -import React, { useState } from 'react'; -import { useIsMutating } from '@tanstack/react-query'; +import React, { useCallback, useState } from 'react'; import { i18n } from '@kbn/i18n'; import { EuiButton, EuiContextMenuItem, EuiContextMenuPanel, EuiPopover } from '@elastic/eui'; import { SLOWithSummaryResponse } from '@kbn/slo-schema'; import { useCapabilities } from '../../../hooks/slo/use_capabilities'; import { useKibana } from '../../../utils/kibana_react'; +import { useCloneSlo } from '../../../hooks/slo/use_clone_slo'; +import { useDeleteSlo } from '../../../hooks/slo/use_delete_slo'; import { isApmIndicatorType } from '../../../utils/slo/indicator'; import { convertSliApmParamsToApmAppDeeplinkUrl } from '../../../utils/slo/convert_sli_apm_params_to_apm_app_deeplink_url'; import { SLO_BURN_RATE_RULE_ID } from '../../../../common/constants'; import { rulesLocatorID, sloFeatureId } from '../../../../common'; import { paths } from '../../../config/paths'; -import { useCloneSlo } from '../../../hooks/slo/use_clone_slo'; import { transformSloResponseToCreateSloInput, transformValuesToCreateSLOInput, @@ -35,7 +35,6 @@ export function HeaderControl({ isLoading, slo }: Props) { const { application: { navigateToUrl }, http: { basePath }, - notifications: { toasts }, share: { url: { locators }, }, @@ -47,15 +46,15 @@ export function HeaderControl({ isLoading, slo }: Props) { const [isRuleFlyoutVisible, setRuleFlyoutVisibility] = useState(false); const [isDeleteConfirmationModalOpen, setDeleteConfirmationModalOpen] = useState(false); - const { mutateAsync: cloneSlo } = useCloneSlo(); - const isDeleting = Boolean(useIsMutating(['deleteSlo', slo?.id])); + const { mutate: cloneSlo } = useCloneSlo(); + const { mutate: deleteSlo } = useDeleteSlo(); const handleActionsClick = () => setIsPopoverOpen((value) => !value); const closePopover = () => setIsPopoverOpen(false); const handleEdit = () => { if (slo) { - navigateToUrl(basePath.prepend(paths.observability.sloEdit(slo.id))); + navigate(basePath.prepend(paths.observability.sloEdit(slo.id))); } }; @@ -104,7 +103,7 @@ export function HeaderControl({ isLoading, slo }: Props) { transactionType, }); - navigateToUrl(basePath.prepend(url)); + navigate(basePath.prepend(url)); } }; @@ -116,16 +115,9 @@ export function HeaderControl({ isLoading, slo }: Props) { transformSloResponseToCreateSloInput({ ...slo, name: `[Copy] ${slo.name}` })! ); - await cloneSlo({ slo: newSlo, idToCopyFrom: slo.id }); - - toasts.addSuccess( - i18n.translate('xpack.observability.slo.sloDetails.headerControl.cloneSuccess', { - defaultMessage: 'Successfully created {name}', - values: { name: newSlo.name }, - }) - ); + cloneSlo({ slo: newSlo, idToCopyFrom: slo.id }); - navigateToUrl(basePath.prepend(paths.observability.slos)); + navigate(basePath.prepend(paths.observability.slos)); } }; @@ -138,10 +130,18 @@ export function HeaderControl({ isLoading, slo }: Props) { setDeleteConfirmationModalOpen(false); }; - const handleDeleteSuccess = () => { - navigateToUrl(basePath.prepend(paths.observability.slos)); + const handleDeleteConfirm = async () => { + if (slo) { + deleteSlo({ id: slo.id, name: slo.name }); + navigate(basePath.prepend(paths.observability.slos)); + } }; + const navigate = useCallback( + (url: string) => setTimeout(() => navigateToUrl(url)), + [navigateToUrl] + ); + return ( <> {i18n.translate('xpack.observability.slo.sloDetails.headerControl.actions', { defaultMessage: 'Actions', @@ -264,7 +264,7 @@ export function HeaderControl({ isLoading, slo }: Props) { ) : null} diff --git a/x-pack/plugins/observability/public/pages/slo_details/slo_details.test.tsx b/x-pack/plugins/observability/public/pages/slo_details/slo_details.test.tsx index 1dc86a2901a44..6268f3682fa55 100644 --- a/x-pack/plugins/observability/public/pages/slo_details/slo_details.test.tsx +++ b/x-pack/plugins/observability/public/pages/slo_details/slo_details.test.tsx @@ -6,19 +6,21 @@ */ import React from 'react'; -import { fireEvent, screen } from '@testing-library/react'; +import { fireEvent, screen, waitFor } from '@testing-library/react'; import { useKibana } from '../../utils/kibana_react'; import { useParams } from 'react-router-dom'; import { useLicense } from '../../hooks/use_license'; +import { useCapabilities } from '../../hooks/slo/use_capabilities'; import { useFetchSloDetails } from '../../hooks/slo/use_fetch_slo_details'; +import { useFetchHistoricalSummary } from '../../hooks/slo/use_fetch_historical_summary'; +import { useFetchActiveAlerts } from '../../hooks/slo/use_fetch_active_alerts'; +import { useCloneSlo } from '../../hooks/slo/use_clone_slo'; +import { useDeleteSlo } from '../../hooks/slo/use_delete_slo'; import { render } from '../../utils/test_helper'; import { SloDetailsPage } from './slo_details'; import { buildSlo } from '../../data/slo/slo'; import { paths } from '../../config/paths'; -import { useFetchHistoricalSummary } from '../../hooks/slo/use_fetch_historical_summary'; -import { useCapabilities } from '../../hooks/slo/use_capabilities'; -import { useFetchActiveAlerts } from '../../hooks/slo/use_fetch_active_alerts'; import { HEALTHY_STEP_DOWN_ROLLING_SLO, historicalSummaryData, @@ -34,22 +36,27 @@ jest.mock('react-router-dom', () => ({ jest.mock('../../utils/kibana_react'); jest.mock('../../hooks/use_breadcrumbs'); jest.mock('../../hooks/use_license'); +jest.mock('../../hooks/slo/use_capabilities'); jest.mock('../../hooks/slo/use_fetch_active_alerts'); jest.mock('../../hooks/slo/use_fetch_slo_details'); jest.mock('../../hooks/slo/use_fetch_historical_summary'); -jest.mock('../../hooks/slo/use_capabilities'); +jest.mock('../../hooks/slo/use_clone_slo'); +jest.mock('../../hooks/slo/use_delete_slo'); const useKibanaMock = useKibana as jest.Mock; const useParamsMock = useParams as jest.Mock; const useLicenseMock = useLicense as jest.Mock; +const useCapabilitiesMock = useCapabilities as jest.Mock; const useFetchActiveAlertsMock = useFetchActiveAlerts as jest.Mock; const useFetchSloDetailsMock = useFetchSloDetails as jest.Mock; const useFetchHistoricalSummaryMock = useFetchHistoricalSummary as jest.Mock; -const useCapabilitiesMock = useCapabilities as jest.Mock; +const useCloneSloMock = useCloneSlo as jest.Mock; +const useDeleteSloMock = useDeleteSlo as jest.Mock; const mockNavigate = jest.fn(); -const mockBasePathPrepend = jest.fn(); const mockLocator = jest.fn(); +const mockClone = jest.fn(); +const mockDelete = jest.fn(); const mockKibana = () => { useKibanaMock.mockReturnValue({ @@ -58,12 +65,13 @@ const mockKibana = () => { charts: chartPluginMock.createStartContract(), http: { basePath: { - prepend: mockBasePathPrepend, + prepend: (url: string) => url, }, }, notifications: { toasts: { addSuccess: jest.fn(), + addDanger: jest.fn(), addError: jest.fn(), }, }, @@ -100,6 +108,8 @@ describe('SLO Details Page', () => { sloHistoricalSummaryResponse: historicalSummaryData, }); useFetchActiveAlertsMock.mockReturnValue({ isLoading: false, data: {} }); + useCloneSloMock.mockReturnValue({ mutate: mockClone }); + useDeleteSloMock.mockReturnValue({ mutate: mockDelete }); }); describe('when the incorrect license is found', () => { @@ -111,7 +121,7 @@ describe('SLO Details Page', () => { render(); - expect(mockNavigate).toBeCalledWith(mockBasePathPrepend(paths.observability.slos)); + expect(mockNavigate).toBeCalledWith(paths.observability.slos); }); }); @@ -217,7 +227,26 @@ describe('SLO Details Page', () => { render(); fireEvent.click(screen.getByTestId('o11yHeaderControlActionsButton')); - expect(screen.queryByTestId('sloDetailsHeaderControlPopoverClone')).toBeTruthy(); + + const button = screen.queryByTestId('sloDetailsHeaderControlPopoverClone'); + + expect(button).toBeTruthy(); + + fireEvent.click(button!); + + const { id, createdAt, enabled, revision, summary, updatedAt, ...newSlo } = slo; + + expect(mockClone).toBeCalledWith({ + idToCopyFrom: slo.id, + slo: { + ...newSlo, + name: `[Copy] ${newSlo.name}`, + }, + }); + + await waitFor(() => { + expect(mockNavigate).toBeCalledWith(paths.observability.slos); + }); }); it("renders a 'Delete' button under actions menu", async () => { @@ -229,14 +258,25 @@ describe('SLO Details Page', () => { render(); fireEvent.click(screen.getByTestId('o11yHeaderControlActionsButton')); - expect(screen.queryByTestId('sloDetailsHeaderControlPopoverDelete')).toBeTruthy(); - const manageRulesButton = screen.queryByTestId('sloDetailsHeaderControlPopoverManageRules'); - expect(manageRulesButton).toBeTruthy(); + const button = screen.queryByTestId('sloDetailsHeaderControlPopoverDelete'); - fireEvent.click(manageRulesButton!); + expect(button).toBeTruthy(); - expect(mockLocator).toBeCalled(); + fireEvent.click(button!); + + const deleteModalConfirmButton = screen.queryByTestId('confirmModalConfirmButton'); + + fireEvent.click(deleteModalConfirmButton!); + + expect(mockDelete).toBeCalledWith({ + id: slo.id, + name: slo.name, + }); + + await waitFor(() => { + expect(mockNavigate).toBeCalledWith(paths.observability.slos); + }); }); it('renders the Overview tab by default', async () => { diff --git a/x-pack/plugins/observability/public/pages/slo_edit/components/slo_edit_form.tsx b/x-pack/plugins/observability/public/pages/slo_edit/components/slo_edit_form.tsx index 195bc7933a74d..9331c648bbd8c 100644 --- a/x-pack/plugins/observability/public/pages/slo_edit/components/slo_edit_form.tsx +++ b/x-pack/plugins/observability/public/pages/slo_edit/components/slo_edit_form.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useEffect, useState } from 'react'; +import React, { useCallback, useEffect, useState } from 'react'; import { FormProvider, useForm } from 'react-hook-form'; import { useLocation, useHistory } from 'react-router-dom'; import { @@ -51,7 +51,6 @@ export function SloEditForm({ slo }: Props) { const { application: { navigateToUrl }, http: { basePath }, - notifications: { toasts }, triggersActionsUi: { getAddRuleFlyout: AddRuleFlyout }, } = useKibana().services; @@ -121,64 +120,39 @@ export function SloEditForm({ slo }: Props) { const values = getValues(); if (isEditMode) { - try { - const processedValues = transformValuesToUpdateSLOInput(values); + const processedValues = transformValuesToUpdateSLOInput(values); + if (isCreateRuleCheckboxChecked) { await updateSlo({ sloId: slo.id, slo: processedValues }); - - toasts.addSuccess( - i18n.translate('xpack.observability.slo.sloEdit.update.success', { - defaultMessage: 'Successfully updated {name}', - values: { name: getValues().name }, - }) + navigate( + basePath.prepend( + `${paths.observability.sloEdit(slo.id)}?${CREATE_RULE_SEARCH_PARAM}=true` + ) ); - - if (isCreateRuleCheckboxChecked) { - navigateToUrl( - basePath.prepend( - `${paths.observability.sloEdit(slo.id)}?${CREATE_RULE_SEARCH_PARAM}=true` - ) - ); - } else { - navigateToUrl(basePath.prepend(paths.observability.slos)); - } - } catch (error) { - toasts.addError(new Error(error), { - title: i18n.translate('xpack.observability.slo.sloEdit.creation.error', { - defaultMessage: 'Something went wrong', - }), - }); + } else { + updateSlo({ sloId: slo.id, slo: processedValues }); + navigate(basePath.prepend(paths.observability.slos)); } } else { - try { - const processedValues = transformValuesToCreateSLOInput(values); + const processedValues = transformValuesToCreateSLOInput(values); + if (isCreateRuleCheckboxChecked) { const { id } = await createSlo({ slo: processedValues }); - - toasts.addSuccess( - i18n.translate('xpack.observability.slo.sloEdit.creation.success', { - defaultMessage: 'Successfully created {name}', - values: { name: getValues().name }, - }) + navigate( + basePath.prepend(`${paths.observability.sloEdit(id)}?${CREATE_RULE_SEARCH_PARAM}=true`) ); - - if (isCreateRuleCheckboxChecked) { - navigateToUrl( - basePath.prepend(`${paths.observability.sloEdit(id)}?${CREATE_RULE_SEARCH_PARAM}=true`) - ); - } else { - navigateToUrl(basePath.prepend(paths.observability.slos)); - } - } catch (error) { - toasts.addError(new Error(error), { - title: i18n.translate('xpack.observability.slo.sloEdit.creation.error', { - defaultMessage: 'Something went wrong', - }), - }); + } else { + createSlo({ slo: processedValues }); + navigate(basePath.prepend(paths.observability.slos)); } } }; + const navigate = useCallback( + (url: string) => setTimeout(() => navigateToUrl(url)), + [navigateToUrl] + ); + const handleChangeCheckbox = () => { setIsCreateRuleCheckboxChecked(!isCreateRuleCheckboxChecked); }; diff --git a/x-pack/plugins/observability/public/pages/slo_edit/slo_edit.test.tsx b/x-pack/plugins/observability/public/pages/slo_edit/slo_edit.test.tsx index 73b386e54ca16..da327bc22b492 100644 --- a/x-pack/plugins/observability/public/pages/slo_edit/slo_edit.test.tsx +++ b/x-pack/plugins/observability/public/pages/slo_edit/slo_edit.test.tsx @@ -539,46 +539,6 @@ describe('SLO Edit Page', () => { }); describe('when submitting has completed successfully', () => { - it('renders a success toast', async () => { - const slo = buildSlo(); - - jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: '123' }); - jest - .spyOn(Router, 'useLocation') - .mockReturnValue({ pathname: 'foo', search: '', state: '', hash: '' }); - - useFetchSloMock.mockReturnValue({ isLoading: false, slo }); - - useFetchIndicesMock.mockReturnValue({ - isLoading: false, - indices: [{ name: 'some-index' }], - }); - - useCreateSloMock.mockReturnValue({ - mutateAsync: jest.fn().mockResolvedValue('success'), - isLoading: false, - isSuccess: false, - isError: false, - }); - - useUpdateSloMock.mockReturnValue({ - mutateAsync: jest.fn().mockResolvedValue('success'), - isLoading: false, - isSuccess: false, - isError: false, - }); - - render(); - - expect(screen.queryByTestId('sloFormSubmitButton')).toBeEnabled(); - - await waitFor(() => { - fireEvent.click(screen.getByTestId('sloFormSubmitButton')); - }); - - expect(mockAddSuccess).toBeCalled(); - }); - it('navigates to the SLO List page when checkbox to create new rule is not checked', async () => { const slo = buildSlo(); @@ -615,8 +575,9 @@ describe('SLO Edit Page', () => { await waitFor(() => { fireEvent.click(screen.getByTestId('sloFormSubmitButton')); }); - - expect(mockNavigate).toBeCalledWith(mockBasePathPrepend(paths.observability.slos)); + await waitFor(() => { + expect(mockNavigate).toBeCalledWith(mockBasePathPrepend(paths.observability.slos)); + }); }); it('navigates to the SLO Edit page when checkbox to create new rule is checked', async () => { @@ -657,9 +618,11 @@ describe('SLO Edit Page', () => { fireEvent.click(screen.getByTestId('sloFormSubmitButton')); }); - expect(mockNavigate).toBeCalledWith( - mockBasePathPrepend(`${paths.observability.sloEdit(slo.id)}?create-rule=true`) - ); + await waitFor(() => { + expect(mockNavigate).toBeCalledWith( + mockBasePathPrepend(`${paths.observability.sloEdit(slo.id)}?create-rule=true`) + ); + }); }); it('opens the Add Rule Flyout when visiting an existing SLO with search params set', async () => { @@ -698,47 +661,5 @@ describe('SLO Edit Page', () => { }); }); }); - - describe('when submitting has not completed successfully', () => { - it('renders an error toast', async () => { - const slo = buildSlo(); - - jest.spyOn(Router, 'useParams').mockReturnValue({ sloId: '123' }); - jest - .spyOn(Router, 'useLocation') - .mockReturnValue({ pathname: 'foo', search: '', state: '', hash: '' }); - - useFetchSloMock.mockReturnValue({ isLoading: false, slo }); - - useFetchIndicesMock.mockReturnValue({ - isLoading: false, - indices: [{ name: 'some-index' }], - }); - - useCreateSloMock.mockReturnValue({ - mutateAsync: jest.fn().mockRejectedValue('argh, I died'), - isLoading: false, - isSuccess: false, - isError: false, - }); - - useUpdateSloMock.mockReturnValue({ - mutateAsync: jest.fn().mockRejectedValue('argh, I died'), - isLoading: false, - isSuccess: false, - isError: false, - }); - - render(); - - expect(screen.queryByTestId('sloFormSubmitButton')).toBeEnabled(); - - await waitFor(() => { - fireEvent.click(screen.getByTestId('sloFormSubmitButton')); - }); - - expect(mockAddError).toBeCalled(); - }); - }); }); }); diff --git a/x-pack/plugins/observability/public/pages/slos/components/badges/slo_badges.tsx b/x-pack/plugins/observability/public/pages/slos/components/badges/slo_badges.tsx index 89d5eadf4d9ad..380d1a898bf0c 100644 --- a/x-pack/plugins/observability/public/pages/slos/components/badges/slo_badges.tsx +++ b/x-pack/plugins/observability/public/pages/slos/components/badges/slo_badges.tsx @@ -6,7 +6,7 @@ */ import React from 'react'; -import { EuiFlexGroup } from '@elastic/eui'; +import { EuiFlexGroup, EuiSkeletonRectangle } from '@elastic/eui'; import { SLOWithSummaryResponse } from '@kbn/slo-schema'; import { Rule } from '@kbn/triggers-actions-ui-plugin/public'; @@ -14,25 +14,54 @@ import { SloIndicatorTypeBadge } from './slo_indicator_type_badge'; import { SloStatusBadge } from '../../../../components/slo/slo_status_badge'; import { SloActiveAlertsBadge } from '../../../../components/slo/slo_status_badge/slo_active_alerts_badge'; import { SloTimeWindowBadge } from './slo_time_window_badge'; +import { SloRulesBadge } from './slo_rules_badge'; import type { ActiveAlerts } from '../../../../hooks/slo/use_fetch_active_alerts'; import type { SloRule } from '../../../../hooks/slo/use_fetch_rules_for_slo'; -import { SloRulesBadge } from './slo_rules_badge'; export interface Props { activeAlerts?: ActiveAlerts; + isLoading: boolean; rules: Array> | undefined; slo: SLOWithSummaryResponse; onClickRuleBadge: () => void; } -export function SloBadges({ activeAlerts, rules, slo, onClickRuleBadge }: Props) { +export function SloBadges({ activeAlerts, isLoading, rules, slo, onClickRuleBadge }: Props) { return ( - - - - - + {isLoading ? ( + <> + + + + + ) : ( + <> + + + + + + + )} ); } diff --git a/x-pack/plugins/observability/public/pages/slos/components/slo_delete_confirmation_modal.tsx b/x-pack/plugins/observability/public/pages/slos/components/slo_delete_confirmation_modal.tsx index b1b2d341a9bd8..e132661aa16ad 100644 --- a/x-pack/plugins/observability/public/pages/slos/components/slo_delete_confirmation_modal.tsx +++ b/x-pack/plugins/observability/public/pages/slos/components/slo_delete_confirmation_modal.tsx @@ -5,94 +5,49 @@ * 2.0. */ +import React from 'react'; import { EuiConfirmModal } from '@elastic/eui'; -import React, { useState } from 'react'; import { i18n } from '@kbn/i18n'; import type { SLOWithSummaryResponse } from '@kbn/slo-schema'; -import { useKibana } from '../../../utils/kibana_react'; -import { useDeleteSlo } from '../../../hooks/slo/use_delete_slo'; export interface SloDeleteConfirmationModalProps { slo: SLOWithSummaryResponse; onCancel: () => void; - onSuccess?: () => void; + onConfirm: () => void; } export function SloDeleteConfirmationModal({ - slo: { id, name }, + slo: { name }, onCancel, - onSuccess, + onConfirm, }: SloDeleteConfirmationModalProps) { - const { - notifications: { toasts }, - } = useKibana().services; - - const [isVisible, setIsVisible] = useState(true); - - const { mutate: deleteSlo, isSuccess, isError } = useDeleteSlo(id); - - if (isSuccess) { - toasts.addSuccess(getDeleteSuccesfulMessage(name)); - onSuccess?.(); - } - - if (isError) { - toasts.addDanger(getDeleteFailMessage(name)); - } - - const handleConfirm = () => { - setIsVisible(false); - deleteSlo({ id }); - }; - - return isVisible ? ( + return ( {i18n.translate('xpack.observability.slo.slo.deleteConfirmationModal.descriptionText', { defaultMessage: "You can't recover {name} after deleting.", values: { name }, })} - ) : null; -} - -const getTitle = () => - i18n.translate('xpack.observability.slo.slo.deleteConfirmationModal.title', { - defaultMessage: 'Are you sure?', - }); - -const getCancelButtonText = () => - i18n.translate('xpack.observability.slo.slo.deleteConfirmationModal.cancelButtonLabel', { - defaultMessage: 'Cancel', - }); - -const getConfirmButtonText = (name: string) => - i18n.translate('xpack.observability.slo.slo.deleteConfirmationModal.deleteButtonLabel', { - defaultMessage: 'Delete {name}', - values: { name }, - }); - -const getDeleteSuccesfulMessage = (name: string) => - i18n.translate( - 'xpack.observability.slo.slo.deleteConfirmationModal.successNotification.descriptionText', - { - defaultMessage: 'Deleted {name}', - values: { name }, - } - ); - -const getDeleteFailMessage = (name: string) => - i18n.translate( - 'xpack.observability.slo.slo.deleteConfirmationModal.errorNotification.descriptionText', - { - defaultMessage: 'Failed to delete {name}', - values: { name }, - } ); +} diff --git a/x-pack/plugins/observability/public/pages/slos/components/slo_list.tsx b/x-pack/plugins/observability/public/pages/slos/components/slo_list.tsx index e71a2cd98a0e6..0efab27b0ebdf 100644 --- a/x-pack/plugins/observability/public/pages/slos/components/slo_list.tsx +++ b/x-pack/plugins/observability/public/pages/slos/components/slo_list.tsx @@ -29,7 +29,7 @@ export function SloList({ autoRefresh }: Props) { const [sort, setSort] = useState('creationTime'); const [indicatorTypeFilter, setIndicatorTypeFilter] = useState([]); - const { isLoading, isError, sloList, refetch } = useFetchSloList({ + const { isInitialLoading, isLoading, isRefetching, isError, sloList, refetch } = useFetchSloList({ page: activePage + 1, name: query, sortBy: sort, @@ -69,7 +69,15 @@ export function SloList({ autoRefresh }: Props) { - + {results.length ? ( diff --git a/x-pack/plugins/observability/public/pages/slos/components/slo_list_item.tsx b/x-pack/plugins/observability/public/pages/slos/components/slo_list_item.tsx index 3fe0f5d31f543..eb3a29ea61958 100644 --- a/x-pack/plugins/observability/public/pages/slos/components/slo_list_item.tsx +++ b/x-pack/plugins/observability/public/pages/slos/components/slo_list_item.tsx @@ -6,7 +6,7 @@ */ import React, { useState } from 'react'; -import { useIsMutating, useQueryClient } from '@tanstack/react-query'; +import { useQueryClient } from '@tanstack/react-query'; import { EuiButtonIcon, EuiContextMenuItem, @@ -46,6 +46,7 @@ export interface SloListItemProps { historicalSummary?: HistoricalSummaryResponse[]; historicalSummaryLoading: boolean; activeAlerts?: ActiveAlerts; + onConfirmDelete: (slo: SLOWithSummaryResponse) => void; } export function SloListItem({ @@ -54,6 +55,7 @@ export function SloListItem({ historicalSummary = [], historicalSummaryLoading, activeAlerts, + onConfirmDelete, }: SloListItemProps) { const { application: { navigateToUrl }, @@ -69,7 +71,6 @@ export function SloListItem({ const filteredRuleTypes = useGetFilteredRuleTypes(); const { mutate: cloneSlo } = useCloneSlo(); - const isDeletingSlo = Boolean(useIsMutating(['deleteSlo', slo.id])); const [isActionsPopoverOpen, setIsActionsPopoverOpen] = useState(false); const [isAddRuleFlyoutOpen, setIsAddRuleFlyoutOpen] = useState(false); @@ -123,21 +124,17 @@ export function SloListItem({ setIsActionsPopoverOpen(false); }; + const handleDeleteConfirm = () => { + setDeleteConfirmationModalOpen(false); + onConfirmDelete(slo); + }; + const handleDeleteCancel = () => { setDeleteConfirmationModalOpen(false); }; return ( - + {/* CONTENT */} @@ -146,13 +143,18 @@ export function SloListItem({ - - {slo.name} - + {slo.summary ? ( + + {slo.name} + + ) : ( + {slo.name} + )} - + {slo.summary ? ( + + ) : null} @@ -276,7 +280,11 @@ export function SloListItem({ ) : null} {isDeleteConfirmationModalOpen ? ( - + ) : null} ); diff --git a/x-pack/plugins/observability/public/pages/slos/components/slo_list_items.tsx b/x-pack/plugins/observability/public/pages/slos/components/slo_list_items.tsx index 2f6f71612788e..e70f8139fe9f5 100644 --- a/x-pack/plugins/observability/public/pages/slos/components/slo_list_items.tsx +++ b/x-pack/plugins/observability/public/pages/slos/components/slo_list_items.tsx @@ -11,6 +11,7 @@ import type { SLOWithSummaryResponse } from '@kbn/slo-schema'; import { useFetchActiveAlerts } from '../../../hooks/slo/use_fetch_active_alerts'; import { useFetchRulesForSlo } from '../../../hooks/slo/use_fetch_rules_for_slo'; import { useFetchHistoricalSummary } from '../../../hooks/slo/use_fetch_historical_summary'; +import { useDeleteSlo } from '../../../hooks/slo/use_delete_slo'; import { SloListItem } from './slo_list_item'; import { SloListEmpty } from './slo_list_empty'; import { SloListError } from './slo_list_error'; @@ -29,6 +30,8 @@ export function SloListItems({ sloList, loading, error }: Props) { const { isLoading: historicalSummaryLoading, sloHistoricalSummaryResponse } = useFetchHistoricalSummary({ sloIds }); + const { mutate: deleteSlo } = useDeleteSlo(); + if (!loading && !error && sloList.length === 0) { return ; } @@ -36,6 +39,10 @@ export function SloListItems({ sloList, loading, error }: Props) { return ; } + const handleDelete = (slo: SLOWithSummaryResponse) => { + deleteSlo({ id: slo.id, name: slo.name }); + }; + return ( {sloList.map((slo) => ( @@ -46,6 +53,7 @@ export function SloListItems({ sloList, loading, error }: Props) { historicalSummary={sloHistoricalSummaryResponse?.[slo.id]} historicalSummaryLoading={historicalSummaryLoading} slo={slo} + onConfirmDelete={handleDelete} /> ))} diff --git a/x-pack/plugins/observability/public/pages/slos/slos.test.tsx b/x-pack/plugins/observability/public/pages/slos/slos.test.tsx index 12a6f2762de58..f017f8690305f 100644 --- a/x-pack/plugins/observability/public/pages/slos/slos.test.tsx +++ b/x-pack/plugins/observability/public/pages/slos/slos.test.tsx @@ -6,7 +6,7 @@ */ import React from 'react'; -import { screen, act } from '@testing-library/react'; +import { screen, act, waitFor } from '@testing-library/react'; import { chartPluginMock } from '@kbn/charts-plugin/public/mocks'; import { waitForEuiPopoverOpen } from '@elastic/eui/lib/test/rtl'; @@ -23,6 +23,7 @@ import { SlosPage } from './slos'; import { emptySloList, sloList } from '../../data/slo/slo'; import { historicalSummaryData } from '../../data/slo/historical_summary_data'; import { useCapabilities } from '../../hooks/slo/use_capabilities'; +import { paths } from '../../config/paths'; jest.mock('react-router-dom', () => ({ ...jest.requireActual('react-router-dom'), @@ -70,7 +71,7 @@ const mockKibana = () => { charts: chartPluginMock.createSetupContract(), http: { basePath: { - prepend: jest.fn(), + prepend: (url: string) => url, }, }, notifications: { @@ -106,17 +107,22 @@ describe('SLOs Page', () => { }); describe('when the incorrect license is found', () => { - it('renders the welcome prompt with subscription buttons', async () => { + beforeEach(() => { useFetchSloListMock.mockReturnValue({ isLoading: false, sloList: emptySloList }); useLicenseMock.mockReturnValue({ hasAtLeast: () => false }); - + useFetchHistoricalSummaryMock.mockReturnValue({ + isLoading: false, + sloHistoricalSummaryResponse: {}, + }); + }); + it('navigates to the SLOs Welcome Page', async () => { await act(async () => { render(); }); - expect(screen.queryByTestId('slosPageWelcomePrompt')).toBeTruthy(); - expect(screen.queryByTestId('slosPageWelcomePromptSignupForCloudButton')).toBeTruthy(); - expect(screen.queryByTestId('slosPageWelcomePromptSignupForLicenseButton')).toBeTruthy(); + await waitFor(() => { + expect(mockNavigate).toBeCalledWith(paths.observability.slosWelcome); + }); }); }); @@ -125,14 +131,20 @@ describe('SLOs Page', () => { useLicenseMock.mockReturnValue({ hasAtLeast: () => true }); }); - it('renders the SLOs Welcome Prompt when the API has finished loading and there are no results', async () => { + it('navigates to the SLOs Welcome Page when the API has finished loading and there are no results', async () => { useFetchSloListMock.mockReturnValue({ isLoading: false, sloList: emptySloList }); + useFetchHistoricalSummaryMock.mockReturnValue({ + isLoading: false, + sloHistoricalSummaryResponse: {}, + }); await act(async () => { render(); }); - expect(screen.queryByTestId('slosPageWelcomePrompt')).toBeTruthy(); + await waitFor(() => { + expect(mockNavigate).toBeCalledWith(paths.observability.slosWelcome); + }); }); it('should have a create new SLO button', async () => { @@ -206,7 +218,9 @@ describe('SLOs Page', () => { button.click(); - expect(mockNavigate).toBeCalled(); + expect(mockNavigate).toBeCalledWith( + `${paths.observability.sloEdit(sloList.results.at(0)?.id || '')}` + ); }); it('allows creating a new rule for an SLO', async () => { @@ -283,7 +297,10 @@ describe('SLOs Page', () => { screen.getByTestId('confirmModalConfirmButton').click(); - expect(mockDeleteSlo).toBeCalledWith({ id: sloList.results.at(0)?.id }); + expect(mockDeleteSlo).toBeCalledWith({ + id: sloList.results.at(0)?.id, + name: sloList.results.at(0)?.name, + }); }); it('allows cloning an SLO', async () => { diff --git a/x-pack/plugins/observability/public/pages/slos/slos.tsx b/x-pack/plugins/observability/public/pages/slos/slos.tsx index f9cf30cb7b344..9b7df97e1e13c 100644 --- a/x-pack/plugins/observability/public/pages/slos/slos.tsx +++ b/x-pack/plugins/observability/public/pages/slos/slos.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React, { useState } from 'react'; +import React, { useEffect, useState } from 'react'; import { EuiButton } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; @@ -16,7 +16,6 @@ import { useBreadcrumbs } from '../../hooks/use_breadcrumbs'; import { useCapabilities } from '../../hooks/slo/use_capabilities'; import { useFetchSloList } from '../../hooks/slo/use_fetch_slo_list'; import { SloList } from './components/slo_list'; -import { SloListWelcomePrompt } from './components/slo_list_welcome_prompt'; import { AutoRefreshButton } from './components/auto_refresh_button'; import { HeaderTitle } from './components/header_title'; import { FeedbackButton } from '../../components/slo/feedback_button/feedback_button'; @@ -55,14 +54,16 @@ export function SlosPage() { setIsAutoRefreshing(!isAutoRefreshing); }; + useEffect(() => { + if ((!isLoading && total === 0) || hasAtLeast('platinum') === false) { + navigateToUrl(basePath.prepend(paths.observability.slosWelcome)); + } + }, [basePath, hasAtLeast, isLoading, navigateToUrl, total]); + if (isInitialLoading) { return null; } - if ((!isLoading && total === 0) || !hasAtLeast('platinum')) { - return ; - } - return ( { + useKibanaMock.mockReturnValue({ + services: { + application: { navigateToUrl: mockNavigate }, + http: { + basePath: { + prepend: (url: string) => url, + }, + }, + }, + }); +}; + +describe('SLOs Welcome Page', () => { + beforeEach(() => { + jest.clearAllMocks(); + mockKibana(); + useCapabilitiesMock.mockReturnValue({ hasWriteCapabilities: true, hasReadCapabilities: true }); + }); + + describe('when the incorrect license is found', () => { + it('renders the welcome message with subscription buttons', async () => { + useFetchSloListMock.mockReturnValue({ isLoading: false, sloList: emptySloList }); + useLicenseMock.mockReturnValue({ hasAtLeast: () => false }); + + render(); + + expect(screen.queryByTestId('slosPageWelcomePrompt')).toBeTruthy(); + expect(screen.queryByTestId('slosPageWelcomePromptSignupForCloudButton')).toBeTruthy(); + expect(screen.queryByTestId('slosPageWelcomePromptSignupForLicenseButton')).toBeTruthy(); + }); + }); + + describe('when the correct license is found', () => { + beforeEach(() => { + useLicenseMock.mockReturnValue({ hasAtLeast: () => true }); + }); + + describe('when loading is done and no results are found', () => { + beforeEach(() => { + useFetchSloListMock.mockReturnValue({ isLoading: false, emptySloList }); + }); + + it('should display the welcome message with a Create new SLO button which should navigate to the SLO Creation page', async () => { + render(); + expect(screen.queryByTestId('slosPageWelcomePrompt')).toBeTruthy(); + + const createNewSloButton = screen.queryByTestId('o11ySloListWelcomePromptCreateSloButton'); + expect(createNewSloButton).toBeTruthy(); + createNewSloButton?.click(); + + await waitFor(() => { + expect(mockNavigate).toBeCalledWith(paths.observability.sloCreate); + }); + }); + }); + + describe('when loading is done and results are found', () => { + beforeEach(() => { + useFetchSloListMock.mockReturnValue({ isLoading: false, sloList }); + }); + + it('should navigate to the SLO List page', async () => { + render(); + await waitFor(() => { + expect(mockNavigate).toBeCalledWith(paths.observability.slos); + }); + }); + }); + }); +}); diff --git a/x-pack/plugins/observability/public/pages/slos/components/slo_list_welcome_prompt.tsx b/x-pack/plugins/observability/public/pages/slos_welcome/slos_welcome.tsx similarity index 87% rename from x-pack/plugins/observability/public/pages/slos/components/slo_list_welcome_prompt.tsx rename to x-pack/plugins/observability/public/pages/slos_welcome/slos_welcome.tsx index 478c0d85cc613..50a062413951b 100644 --- a/x-pack/plugins/observability/public/pages/slos/components/slo_list_welcome_prompt.tsx +++ b/x-pack/plugins/observability/public/pages/slos_welcome/slos_welcome.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React from 'react'; +import React, { useEffect } from 'react'; import { EuiPageTemplate, EuiButton, @@ -18,13 +18,14 @@ import { } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { useKibana } from '../../../utils/kibana_react'; -import { useLicense } from '../../../hooks/use_license'; -import { usePluginContext } from '../../../hooks/use_plugin_context'; -import { paths } from '../../../config/paths'; +import { useKibana } from '../../utils/kibana_react'; +import { useLicense } from '../../hooks/use_license'; +import { usePluginContext } from '../../hooks/use_plugin_context'; +import { useFetchSloList } from '../../hooks/slo/use_fetch_slo_list'; +import { paths } from '../../config/paths'; import illustration from './assets/illustration.svg'; -export function SloListWelcomePrompt() { +export function SlosWelcomePage() { const { application: { navigateToUrl }, http: { basePath }, @@ -32,14 +33,24 @@ export function SloListWelcomePrompt() { const { ObservabilityPageTemplate } = usePluginContext(); const { hasAtLeast } = useLicense(); - const hasRightLicense = hasAtLeast('platinum'); + const { isLoading, sloList } = useFetchSloList(); + const { total } = sloList || { total: 0 }; + const handleClickCreateSlo = () => { navigateToUrl(basePath.prepend(paths.observability.sloCreate)); }; - return ( + const hasSlosAndHasPermissions = total > 0 && hasAtLeast('platinum') === true; + + useEffect(() => { + if (hasSlosAndHasPermissions) { + navigateToUrl(basePath.prepend(paths.observability.slos)); + } + }, [basePath, hasSlosAndHasPermissions, navigateToUrl]); + + return hasSlosAndHasPermissions || isLoading ? null : ( {i18n.translate('xpack.observability.slo.sloList.welcomePrompt.learnMoreLink', { diff --git a/x-pack/plugins/observability/public/routes/index.tsx b/x-pack/plugins/observability/public/routes/index.tsx index f6fe307195309..165a7e6767569 100644 --- a/x-pack/plugins/observability/public/routes/index.tsx +++ b/x-pack/plugins/observability/public/routes/index.tsx @@ -17,6 +17,7 @@ import { OverviewPage } from '../pages/overview/overview'; import { RulesPage } from '../pages/rules/rules'; import { RuleDetailsPage } from '../pages/rule_details'; import { SlosPage } from '../pages/slos/slos'; +import { SlosWelcomePage } from '../pages/slos_welcome/slos_welcome'; import { SloDetailsPage } from '../pages/slo_details/slo_details'; import { SloEditPage } from '../pages/slo_edit/slo_edit'; import { casesPath } from '../../common'; @@ -135,6 +136,13 @@ export const routes = { params: {}, exact: true, }, + '/slos/welcome': { + handler: () => { + return ; + }, + params: {}, + exact: true, + }, '/slos/edit/:sloId': { handler: () => { return ; diff --git a/x-pack/plugins/observability/public/utils/kibana_react.storybook_decorator.tsx b/x-pack/plugins/observability/public/utils/kibana_react.storybook_decorator.tsx index a0e5a1f0e037b..c79428b508ef0 100644 --- a/x-pack/plugins/observability/public/utils/kibana_react.storybook_decorator.tsx +++ b/x-pack/plugins/observability/public/utils/kibana_react.storybook_decorator.tsx @@ -11,6 +11,7 @@ import { KibanaContextProvider } from '@kbn/kibana-react-plugin/public'; import { AppMountParameters } from '@kbn/core-application-browser'; import { KibanaPageTemplate } from '@kbn/shared-ux-page-kibana-template'; import { CoreTheme } from '@kbn/core-theme-browser'; +import { MemoryRouter } from 'react-router-dom'; import { casesFeatureId, sloFeatureId } from '../../common'; import { PluginContext } from '../context/plugin_context'; import { createObservabilityRuleTypeRegistryMock } from '../rules/observability_rule_type_registry_mock'; @@ -19,7 +20,9 @@ import { ConfigSchema } from '../plugin'; export function KibanaReactStorybookDecorator(Story: ComponentType) { const queryClient = new QueryClient(); - const appMountParameters = { setHeaderActionMenu: () => {} } as unknown as AppMountParameters; + const appMountParameters = { + setHeaderActionMenu: () => {}, + } as unknown as AppMountParameters; const observabilityRuleTypeRegistry = createObservabilityRuleTypeRegistryMock(); const config: ConfigSchema = { @@ -31,7 +34,6 @@ export function KibanaReactStorybookDecorator(Story: ComponentType) { }, }, }; - const mockTheme: CoreTheme = { darkMode: false, }; @@ -86,6 +88,9 @@ export function KibanaReactStorybookDecorator(Story: ComponentType) { addDanger: () => {}, }, }, + share: { + url: { locators: { get: () => {} } }, + }, storage: { get: () => {}, }, @@ -114,9 +119,11 @@ export function KibanaReactStorybookDecorator(Story: ComponentType) { ObservabilityPageTemplate: KibanaPageTemplate, }} > - - - + + + + + ); diff --git a/x-pack/plugins/observability_onboarding/public/application/app.tsx b/x-pack/plugins/observability_onboarding/public/application/app.tsx index 28d96eda8df26..13e45999336f8 100644 --- a/x-pack/plugins/observability_onboarding/public/application/app.tsx +++ b/x-pack/plugins/observability_onboarding/public/application/app.tsx @@ -17,20 +17,23 @@ import { KibanaContextProvider, KibanaThemeProvider, RedirectAppLinks, - useKibana, useUiSetting$, } from '@kbn/kibana-react-plugin/public'; -import { useBreadcrumbs } from '@kbn/observability-plugin/public'; -import { RouterProvider, createRouter } from '@kbn/typed-react-router-config'; +import { Route } from '@kbn/shared-ux-router'; import { euiDarkVars, euiLightVars } from '@kbn/ui-theme'; import React from 'react'; import ReactDOM from 'react-dom'; -import { Redirect, RouteComponentProps, RouteProps } from 'react-router-dom'; -import { Home } from '../components/app/home'; +import { + Router, + Switch, + RouteComponentProps, + RouteProps, +} from 'react-router-dom'; import { ObservabilityOnboardingPluginSetupDeps, ObservabilityOnboardingPluginStartDeps, } from '../plugin'; +import { routes } from '../routes'; export type BreadcrumbTitle< T extends { [K in keyof T]?: string | undefined } = {} @@ -49,33 +52,33 @@ export const onBoardingTitle = i18n.translate( } ); -export const onboardingRoutes: RouteDefinition[] = [ - { - exact: true, - path: '/', - render: () => , - breadcrumb: onBoardingTitle, - }, -]; +export const breadcrumbsApp = { + id: 'observabilityOnboarding', + label: onBoardingTitle, +}; + +function App() { + return ( + <> + + {Object.keys(routes).map((key) => { + const path = key as keyof typeof routes; + const { handler, exact } = routes[path]; + const Wrapper = () => { + return handler(); + }; + return ( + + ); + })} + + + ); +} function ObservabilityOnboardingApp() { const [darkMode] = useUiSetting$('theme:darkMode'); - const { http } = useKibana().services; - const basePath = http.basePath.get(); - - useBreadcrumbs([ - { - text: onBoardingTitle, - href: basePath + '/app/observabilityOnboarding', - }, - { - text: i18n.translate('xpack.observability_onboarding.breadcrumbs.logs', { - defaultMessage: 'Logs', - }), - }, - ]); - return ( ({ @@ -85,14 +88,12 @@ function ObservabilityOnboardingApp() { })} >
- +
); } -export const observabilityOnboardingRouter = createRouter({}); - export function ObservabilityOnboardingAppRoot({ appMountParameters, core, @@ -131,14 +132,11 @@ export function ObservabilityOnboardingAppRoot({ }} > - + - + diff --git a/x-pack/plugins/observability_onboarding/public/components/app/custom_logs/index.tsx b/x-pack/plugins/observability_onboarding/public/components/app/custom_logs/index.tsx new file mode 100644 index 0000000000000..9cdffa9ea05d0 --- /dev/null +++ b/x-pack/plugins/observability_onboarding/public/components/app/custom_logs/index.tsx @@ -0,0 +1,95 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EuiFlexGroup, EuiFlexItem, EuiSpacer } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { useBreadcrumbs } from '@kbn/observability-plugin/public'; +import React, { ComponentType, useRef, useState } from 'react'; +import { + FilmstripFrame, + FilmstripTransition, + TransitionState, +} from '../../shared/filmstrip_transition'; +import { Provider as WizardProvider, Step as WizardStep } from './wizard'; +import { HorizontalSteps } from './wizard/horizontal_steps'; +import { PageTitle } from './wizard/page_title'; +import { breadcrumbsApp } from '../../../application/app'; + +export function CustomLogs() { + useBreadcrumbs( + [ + { + text: i18n.translate( + 'xpack.observability_onboarding.breadcrumbs.logs', + { defaultMessage: 'Logs' } + ), + }, + ], + breadcrumbsApp + ); + return ; +} + +const TRANSITION_DURATION = 180; + +function AnimatedTransitionsWizard() { + const [transition, setTransition] = useState('ready'); + const TransitionComponent = useRef(() => null); + + function onChangeStep({ + direction, + StepComponent, + }: { + direction: 'back' | 'next'; + StepComponent: ComponentType; + }) { + setTransition(direction); + TransitionComponent.current = StepComponent; + setTimeout(() => { + setTransition('ready'); + }, TRANSITION_DURATION + 10); + } + + return ( + + + + + + + + + + + + + { + // eslint-disable-next-line react/jsx-pascal-case + transition === 'back' ? : null + } + + + + + + { + // eslint-disable-next-line react/jsx-pascal-case + transition === 'next' ? : null + } + + + + + + ); +} diff --git a/x-pack/plugins/observability_onboarding/public/components/app/home/logs_onboarding_wizard/configure_logs.tsx b/x-pack/plugins/observability_onboarding/public/components/app/custom_logs/wizard/configure_logs.tsx similarity index 100% rename from x-pack/plugins/observability_onboarding/public/components/app/home/logs_onboarding_wizard/configure_logs.tsx rename to x-pack/plugins/observability_onboarding/public/components/app/custom_logs/wizard/configure_logs.tsx diff --git a/x-pack/plugins/observability_onboarding/public/components/app/home/logs_onboarding_wizard/horizontal_steps.tsx b/x-pack/plugins/observability_onboarding/public/components/app/custom_logs/wizard/horizontal_steps.tsx similarity index 100% rename from x-pack/plugins/observability_onboarding/public/components/app/home/logs_onboarding_wizard/horizontal_steps.tsx rename to x-pack/plugins/observability_onboarding/public/components/app/custom_logs/wizard/horizontal_steps.tsx diff --git a/x-pack/plugins/observability_onboarding/public/components/app/home/logs_onboarding_wizard/import_data.tsx b/x-pack/plugins/observability_onboarding/public/components/app/custom_logs/wizard/import_data.tsx similarity index 100% rename from x-pack/plugins/observability_onboarding/public/components/app/home/logs_onboarding_wizard/import_data.tsx rename to x-pack/plugins/observability_onboarding/public/components/app/custom_logs/wizard/import_data.tsx diff --git a/x-pack/plugins/observability_onboarding/public/components/app/home/logs_onboarding_wizard/index.tsx b/x-pack/plugins/observability_onboarding/public/components/app/custom_logs/wizard/index.tsx similarity index 100% rename from x-pack/plugins/observability_onboarding/public/components/app/home/logs_onboarding_wizard/index.tsx rename to x-pack/plugins/observability_onboarding/public/components/app/custom_logs/wizard/index.tsx diff --git a/x-pack/plugins/observability_onboarding/public/components/app/home/logs_onboarding_wizard/inspect.tsx b/x-pack/plugins/observability_onboarding/public/components/app/custom_logs/wizard/inspect.tsx similarity index 100% rename from x-pack/plugins/observability_onboarding/public/components/app/home/logs_onboarding_wizard/inspect.tsx rename to x-pack/plugins/observability_onboarding/public/components/app/custom_logs/wizard/inspect.tsx diff --git a/x-pack/plugins/observability_onboarding/public/components/app/home/logs_onboarding_wizard/install_elastic_agent.tsx b/x-pack/plugins/observability_onboarding/public/components/app/custom_logs/wizard/install_elastic_agent.tsx similarity index 100% rename from x-pack/plugins/observability_onboarding/public/components/app/home/logs_onboarding_wizard/install_elastic_agent.tsx rename to x-pack/plugins/observability_onboarding/public/components/app/custom_logs/wizard/install_elastic_agent.tsx diff --git a/x-pack/plugins/observability_onboarding/public/components/app/home/logs_onboarding_wizard/name_logs.tsx b/x-pack/plugins/observability_onboarding/public/components/app/custom_logs/wizard/name_logs.tsx similarity index 100% rename from x-pack/plugins/observability_onboarding/public/components/app/home/logs_onboarding_wizard/name_logs.tsx rename to x-pack/plugins/observability_onboarding/public/components/app/custom_logs/wizard/name_logs.tsx diff --git a/x-pack/plugins/observability_onboarding/public/components/app/home/logs_onboarding_wizard/page_title.tsx b/x-pack/plugins/observability_onboarding/public/components/app/custom_logs/wizard/page_title.tsx similarity index 100% rename from x-pack/plugins/observability_onboarding/public/components/app/home/logs_onboarding_wizard/page_title.tsx rename to x-pack/plugins/observability_onboarding/public/components/app/custom_logs/wizard/page_title.tsx diff --git a/x-pack/plugins/observability_onboarding/public/components/app/home/index.tsx b/x-pack/plugins/observability_onboarding/public/components/app/home/index.tsx index 4b4b3dfdbf3af..5620b7535ba63 100644 --- a/x-pack/plugins/observability_onboarding/public/components/app/home/index.tsx +++ b/x-pack/plugins/observability_onboarding/public/components/app/home/index.tsx @@ -5,95 +5,299 @@ * 2.0. */ -import { EuiFlexGroup, EuiFlexItem, EuiSpacer } from '@elastic/eui'; -import React, { ComponentType, useRef, useState } from 'react'; import { - FilmstripFrame, - FilmstripTransition, - TransitionState, -} from '../../shared/filmstrip_transition'; -import { - Provider as WizardProvider, - Step as WizardStep, -} from './logs_onboarding_wizard'; -import { HorizontalSteps } from './logs_onboarding_wizard/horizontal_steps'; -import { PageTitle } from './logs_onboarding_wizard/page_title'; - -export function Home({ animated = true }: { animated?: boolean }) { - if (animated) { - return ; - } - return ; -} - -function StillTransitionsWizard() { - return ( - - - - - - - - ); -} + EuiFlexGroup, + EuiFlexItem, + EuiSpacer, + EuiTitle, + EuiText, + EuiCard, + EuiHorizontalRule, + EuiButtonEmpty, + EuiBadge, +} from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; +import { useBreadcrumbs } from '@kbn/observability-plugin/public'; +import React from 'react'; +import { useKibanaNavigation } from '../../../hooks/use_kibana_navigation'; +import { breadcrumbsApp } from '../../../application/app'; -const TRANSITION_DURATION = 180; +export function Home() { + useBreadcrumbs([], breadcrumbsApp); -function AnimatedTransitionsWizard() { - const [transition, setTransition] = useState('ready'); - const TransitionComponent = useRef(() => null); + const navigateToKibanaUrl = useKibanaNavigation(); - function onChangeStep({ - direction, - StepComponent, - }: { - direction: 'back' | 'next'; - StepComponent: ComponentType; - }) { - setTransition(direction); - TransitionComponent.current = StepComponent; - setTimeout(() => { - setTransition('ready'); - }, TRANSITION_DURATION + 10); - } + const handleClickSystemLogs = () => {}; + const handleClickCustomLogs = () => { + navigateToKibanaUrl('/app/observabilityOnboarding/customLogs'); + }; + const handleClickApmSetupGuide = () => { + navigateToKibanaUrl('/app/home#/tutorial/apm'); + }; + const handleClickKubernetesSetupGuide = () => { + navigateToKibanaUrl('/app/integrations/detail/kubernetes'); + }; + const handleClickIntegrations = () => { + navigateToKibanaUrl('/app/integrations'); + }; + const handleClickSampleData = () => { + navigateToKibanaUrl('/app/home#/tutorial_directory/sampleData'); + }; + const handleClickSkip = () => { + navigateToKibanaUrl('/app/observability/overview'); + }; return ( - - - - - - - - - - - - - { - // eslint-disable-next-line react/jsx-pascal-case - transition === 'back' ? : null + + + +

+ {i18n.translate('xpack.observability_onboarding.home.title', { + defaultMessage: 'Get started with Observability', + })} +

+
+
+ + +

+ {i18n.translate('xpack.observability_onboarding.home.description', { + defaultMessage: + 'Monitor and gain insights across your cloud-native and distributed systems on a single platform.', + })} +

+
+ +
+ + + + + {i18n.translate( + 'xpack.observability_onboarding.card.systemLogs.quickstartBadge', + { + defaultMessage: 'Quickstart', + } + )} + } -
- - - - - { - // eslint-disable-next-line react/jsx-pascal-case - transition === 'next' ? : null + title={i18n.translate( + 'xpack.observability_onboarding.card.systemLogs.title', + { defaultMessage: 'Collect system logs' } + )} + selectable={{ + onClick: handleClickSystemLogs, + color: 'primary', + fill: true, + fullWidth: false, + style: { margin: 'auto' }, + }} + paddingSize="xl" + > + + +

+ {i18n.translate( + 'xpack.observability_onboarding.card.systemLogs.description1', + { + defaultMessage: + 'The quickest path to onboard log data and start analysing it straight away.', + } + )} +

+

+ {i18n.translate( + 'xpack.observability_onboarding.card.systemLogs.description2', + { + defaultMessage: + 'Monitor servers, personal computers and more by collecting logs from your machine.', + } + )} +

+
+ +
+ + + {i18n.translate( + 'xpack.observability_onboarding.card.customLogs.fewMinutesBadge', + { defaultMessage: 'In a few minutes' } + )} + } - - - -
-
+ title={i18n.translate( + 'xpack.observability_onboarding.card.customLogs.title', + { defaultMessage: 'Collect custom logs' } + )} + selectable={{ + onClick: handleClickCustomLogs, + color: 'primary', + fill: true, + fullWidth: false, + style: { margin: 'auto' }, + }} + paddingSize="xl" + > + + +

+ {i18n.translate( + 'xpack.observability_onboarding.card.customLogs.description.text', + { + defaultMessage: + 'Choose what logs to collect, configure an ingest pipeline, and explore your data.', + } + )} +

+
    +
  • + {i18n.translate( + 'xpack.observability_onboarding.card.customLogs.description.example.streamlogs', + { defaultMessage: 'Stream custom logs' } + )} +
  • +
  • + {i18n.translate( + 'xpack.observability_onboarding.card.customLogs.description.example.networkStream', + { + defaultMessage: 'Collect network streaming logs', + } + )} +
  • +
  • + {i18n.translate( + 'xpack.observability_onboarding.card.customLogs.description.example.uploadLogFile', + { defaultMessage: 'Upload log files' } + )} +
  • +
  • + {i18n.translate( + 'xpack.observability_onboarding.card.customLogs.description.example.andMore', + { defaultMessage: '... and more' } + )} +
  • +
+
+ +
+
+
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + {i18n.translate('xpack.observability_onboarding.skipLinkLabel', { + defaultMessage: 'Skip for now', + })} + + +
); } + +const setupGuideBadgeLabel = i18n.translate( + 'xpack.observability_onboarding.card.setupGuide', + { defaultMessage: 'Setup guide' } +); diff --git a/x-pack/plugins/observability_onboarding/public/hooks/use_kibana_navigation.ts b/x-pack/plugins/observability_onboarding/public/hooks/use_kibana_navigation.ts new file mode 100644 index 0000000000000..f9628e7e333ba --- /dev/null +++ b/x-pack/plugins/observability_onboarding/public/hooks/use_kibana_navigation.ts @@ -0,0 +1,27 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { useKibana } from '@kbn/kibana-react-plugin/public'; +import type { ApplicationStart, HttpStart } from '@kbn/core/public'; + +interface ObservabilityOnboardingAppServices { + application: ApplicationStart; + http: HttpStart; +} + +export function useKibanaNavigation() { + const { + application: { navigateToUrl }, + http: { basePath }, + } = useKibana().services; + + const navigateToKibanaUrl = (kibanaPath: string) => { + navigateToUrl(basePath.prepend(kibanaPath)); + }; + + return navigateToKibanaUrl; +} diff --git a/x-pack/plugins/observability_onboarding/public/routes/index.tsx b/x-pack/plugins/observability_onboarding/public/routes/index.tsx new file mode 100644 index 0000000000000..d462844f91d51 --- /dev/null +++ b/x-pack/plugins/observability_onboarding/public/routes/index.tsx @@ -0,0 +1,51 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import * as t from 'io-ts'; +import React from 'react'; +import { Redirect } from 'react-router-dom'; +import { Home } from '../components/app/home'; +import { CustomLogs } from '../components/app/custom_logs'; + +export type RouteParams = DecodeParams< + typeof routes[T]['params'] +>; + +type DecodeParams = { + [key in keyof TParams]: TParams[key] extends t.Any + ? t.TypeOf + : never; +}; + +export interface Params { + query?: t.HasProps; + path?: t.HasProps; +} + +export const routes = { + '/': { + handler: () => { + return ; + }, + params: {}, + exact: true, + }, + '/overview': { + handler: () => { + return ; + }, + params: {}, + exact: true, + }, + '/customLogs': { + handler: () => { + return ; + }, + params: {}, + exact: true, + }, +}; diff --git a/x-pack/plugins/observability_onboarding/tsconfig.json b/x-pack/plugins/observability_onboarding/tsconfig.json index 4534db3d6d37a..e7c9d9d48d8a9 100644 --- a/x-pack/plugins/observability_onboarding/tsconfig.json +++ b/x-pack/plugins/observability_onboarding/tsconfig.json @@ -19,9 +19,9 @@ "@kbn/i18n", "@kbn/core-http-browser", "@kbn/ui-theme", - "@kbn/typed-react-router-config", "@kbn/server-route-repository", "@kbn/config-schema", + "@kbn/shared-ux-router", ], "exclude": [ "target/**/*", diff --git a/x-pack/plugins/observability_shared/public/components/page_template/lazy_page_template.tsx b/x-pack/plugins/observability_shared/public/components/page_template/lazy_page_template.tsx index 7c61cae4f2c73..e61254fa10ca6 100644 --- a/x-pack/plugins/observability_shared/public/components/page_template/lazy_page_template.tsx +++ b/x-pack/plugins/observability_shared/public/components/page_template/lazy_page_template.tsx @@ -6,6 +6,8 @@ */ import React from 'react'; +import useObservable from 'react-use/lib/useObservable'; + import type { ObservabilityPageTemplateDependencies, WrappedPageTemplateProps, @@ -15,12 +17,19 @@ export const LazyObservabilityPageTemplate = React.lazy(() => import('./page_tem export type LazyObservabilityPageTemplateProps = WrappedPageTemplateProps; -export function createLazyObservabilityPageTemplate( - injectedDeps: ObservabilityPageTemplateDependencies -) { - return (pageTemplateProps: LazyObservabilityPageTemplateProps) => ( - - - - ); +export function createLazyObservabilityPageTemplate({ + isSidebarEnabled$, + ...injectedDeps +}: ObservabilityPageTemplateDependencies) { + return (pageTemplateProps: LazyObservabilityPageTemplateProps) => { + const isSidebarEnabled = useObservable(isSidebarEnabled$); + const { showSolutionNav: showSolutionNavProp, ...props } = pageTemplateProps; + const showSolutionNav = !!showSolutionNavProp || isSidebarEnabled; + + return ( + + + + ); + }; } diff --git a/x-pack/plugins/observability_shared/public/components/page_template/page_template.test.tsx b/x-pack/plugins/observability_shared/public/components/page_template/page_template.test.tsx index b33925ed09e4b..3ea28007c207d 100644 --- a/x-pack/plugins/observability_shared/public/components/page_template/page_template.test.tsx +++ b/x-pack/plugins/observability_shared/public/components/page_template/page_template.test.tsx @@ -9,7 +9,7 @@ import { I18nProvider } from '@kbn/i18n-react'; import { render } from '@testing-library/react'; import { shallow } from 'enzyme'; import React from 'react'; -import { of } from 'rxjs'; +import { BehaviorSubject, of } from 'rxjs'; import { getKibanaPageTemplateKibanaDependenciesMock as getPageTemplateServices } from '@kbn/shared-ux-page-kibana-template-mocks'; import { guidedOnboardingMock } from '@kbn/guided-onboarding-plugin/public/mocks'; @@ -56,6 +56,7 @@ describe('Page template', () => { navigationSections$: navigationRegistry.sections$, getPageTemplateServices, guidedOnboardingApi: guidedOnboardingMock.createStart().guidedOnboardingApi, + isSidebarEnabled$: new BehaviorSubject(true), }); const component = shallow( diff --git a/x-pack/plugins/observability_shared/public/components/page_template/page_template.tsx b/x-pack/plugins/observability_shared/public/components/page_template/page_template.tsx index 696cda97e3e53..f2f94ed74e565 100644 --- a/x-pack/plugins/observability_shared/public/components/page_template/page_template.tsx +++ b/x-pack/plugins/observability_shared/public/components/page_template/page_template.tsx @@ -11,7 +11,7 @@ import { i18n } from '@kbn/i18n'; import React, { useMemo } from 'react'; import { matchPath, useLocation } from 'react-router-dom'; import useObservable from 'react-use/lib/useObservable'; -import type { Observable } from 'rxjs'; +import type { BehaviorSubject, Observable } from 'rxjs'; import type { ApplicationStart } from '@kbn/core/public'; import { useKibana } from '@kbn/kibana-react-plugin/public'; import { @@ -85,9 +85,13 @@ export interface ObservabilityPageTemplateDependencies { navigationSections$: Observable; getPageTemplateServices: () => KibanaPageTemplateKibanaDependencies; guidedOnboardingApi: GuidedOnboardingPluginStart['guidedOnboardingApi']; + isSidebarEnabled$: BehaviorSubject; } -export type ObservabilityPageTemplateProps = ObservabilityPageTemplateDependencies & +export type ObservabilityPageTemplateProps = Omit< + ObservabilityPageTemplateDependencies, + 'isSidebarEnabled$' +> & WrappedPageTemplateProps; export function ObservabilityPageTemplate({ diff --git a/x-pack/plugins/observability_shared/public/plugin.ts b/x-pack/plugins/observability_shared/public/plugin.ts index 527d33e8a502e..7a0ee7a452dde 100644 --- a/x-pack/plugins/observability_shared/public/plugin.ts +++ b/x-pack/plugins/observability_shared/public/plugin.ts @@ -5,6 +5,8 @@ * 2.0. */ +import { BehaviorSubject } from 'rxjs'; + import type { CoreStart, Plugin } from '@kbn/core/public'; import type { GuidedOnboardingPluginStart } from '@kbn/guided-onboarding-plugin/public'; import { createNavigationRegistry } from './components/page_template/helpers/navigation_registry'; @@ -13,6 +15,7 @@ import { updateGlobalNavigation } from './services/update_global_navigation'; export interface ObservabilitySharedStart { guidedOnboarding: GuidedOnboardingPluginStart; + setIsSidebarEnabled: (isEnabled: boolean) => void; } export type ObservabilitySharedPluginSetup = ReturnType; @@ -20,6 +23,11 @@ export type ObservabilitySharedPluginStart = ReturnType; + + constructor() { + this.isSidebarEnabled$ = new BehaviorSubject(true); + } public setup() { return { @@ -39,6 +47,7 @@ export class ObservabilitySharedPlugin implements Plugin { navigationSections$: this.navigationRegistry.sections$, guidedOnboardingApi: plugins.guidedOnboarding.guidedOnboardingApi, getPageTemplateServices: () => ({ coreStart: core }), + isSidebarEnabled$: this.isSidebarEnabled$, }); return { @@ -46,6 +55,7 @@ export class ObservabilitySharedPlugin implements Plugin { PageTemplate, }, updateGlobalNavigation, + setIsSidebarEnabled: (isEnabled: boolean) => this.isSidebarEnabled$.next(isEnabled), }; } diff --git a/x-pack/plugins/osquery/cypress/tasks/api_fixtures.ts b/x-pack/plugins/osquery/cypress/tasks/api_fixtures.ts index ce3be460ed22f..2a19019ea3ffb 100644 --- a/x-pack/plugins/osquery/cypress/tasks/api_fixtures.ts +++ b/x-pack/plugins/osquery/cypress/tasks/api_fixtures.ts @@ -10,7 +10,7 @@ import type { RuleResponse, } from '@kbn/security-solution-plugin/common/detection_engine/rule_schema'; import type { AgentPolicy } from '@kbn/fleet-plugin/common'; -import type { CaseResponse } from '@kbn/cases-plugin/common'; +import type { Case } from '@kbn/cases-plugin/common'; import type { SavedQuerySOFormData } from '../../public/saved_queries/form/use_saved_query_form'; import type { LiveQueryDetailsItem } from '../../public/actions/use_live_query_details'; import type { PackSavedObject, PackItem } from '../../public/packs/types'; @@ -181,7 +181,7 @@ export const cleanupRule = (id: string) => { }; export const loadCase = (owner: string) => - request({ + request({ method: 'POST', url: '/api/cases', body: { diff --git a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_case.ts b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_case.ts index d9c297789ffdc..fffdd11815112 100644 --- a/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_case.ts +++ b/x-pack/plugins/security_solution/common/endpoint/data_loaders/index_case.ts @@ -6,7 +6,7 @@ */ import type { KbnClient } from '@kbn/test'; -import type { CaseResponse } from '@kbn/cases-plugin/common'; +import type { Case } from '@kbn/cases-plugin/common'; import { CASES_URL } from '@kbn/cases-plugin/common'; import type { CasePostRequest } from '@kbn/cases-plugin/common/api'; import { CaseSeverity, ConnectorTypes } from '@kbn/cases-plugin/common/api'; @@ -14,7 +14,7 @@ import type { AxiosError } from 'axios'; import { EndpointError } from '../errors'; export interface IndexedCase { - data: CaseResponse; + data: Case; cleanup: () => Promise<{ /** The ID of the cases that were deleted */ data: string; @@ -55,7 +55,7 @@ export const indexCase = async ( }; const createdCase = ( - await kbnClient.request({ + await kbnClient.request({ method: 'POST', path: CASES_URL, body: newCaseReq, diff --git a/x-pack/plugins/security_solution/cypress/e2e/detection_alerts/alerts_details.cy.ts b/x-pack/plugins/security_solution/cypress/e2e/detection_alerts/alerts_details.cy.ts index ac52c58a37928..e6c0d4c1bc637 100644 --- a/x-pack/plugins/security_solution/cypress/e2e/detection_alerts/alerts_details.cy.ts +++ b/x-pack/plugins/security_solution/cypress/e2e/detection_alerts/alerts_details.cy.ts @@ -21,10 +21,9 @@ import { cleanKibana } from '../../tasks/common'; import { waitForAlertsToPopulate } from '../../tasks/create_new_rule'; import { esArchiverLoad, esArchiverUnload } from '../../tasks/es_archiver'; import { login, visit, visitWithoutDateRange } from '../../tasks/login'; -import { getUnmappedRule, getNewRule } from '../../objects/rule'; +import { getUnmappedRule } from '../../objects/rule'; import { ALERTS_URL } from '../../urls/navigation'; import { tablePageSelector } from '../../screens/table_pagination'; -import { ALERTS_COUNT } from '../../screens/alerts'; describe('Alert details flyout', () => { describe('With unmapped fields', { testIsolation: false }, () => { @@ -90,55 +89,46 @@ describe('Alert details flyout', () => { }); describe('Url state management', { testIsolation: false }, () => { - const testRule = getNewRule(); before(() => { cleanKibana(); + esArchiverLoad('query_alert'); login(); - createRule(testRule); visit(ALERTS_URL); waitForAlertsToPopulate(); }); - it('should store the flyout state in the url when it is opened', () => { + beforeEach(() => { expandFirstAlert(); + }); + + it('should store the flyout state in the url when it is opened', () => { cy.get(OVERVIEW_RULE).should('be.visible'); cy.url().should('include', 'eventFlyout='); }); it('should remove the flyout state from the url when it is closed', () => { - expandFirstAlert(); cy.get(OVERVIEW_RULE).should('be.visible'); closeAlertFlyout(); cy.url().should('not.include', 'eventFlyout='); }); it('should open the alert flyout when the page is refreshed', () => { - expandFirstAlert(); cy.get(OVERVIEW_RULE).should('be.visible'); cy.reload(); cy.get(OVERVIEW_RULE).should('be.visible'); - cy.get(OVERVIEW_RULE).then((field) => { - expect(field).to.contain(testRule.name); - }); + cy.get(OVERVIEW_RULE).should('contain', 'Endpoint Security'); }); it('should show the copy link button for the flyout', () => { - expandFirstAlert(); cy.get(COPY_ALERT_FLYOUT_LINK).should('be.visible'); }); - it('should open the flyout given the custom url', () => { - expandFirstAlert(); + it('should have the `kibana.alert.url` field set', () => { + const alertUrl = + 'http://localhost:5601/app/security/alerts/redirect/eabbdefc23da981f2b74ab58b82622a97bb9878caa11bc914e2adfacc94780f1?index=.alerts-security.alerts-default×tamp=2023-04-27T11:03:57.906Z'; openTable(); - filterBy('_id'); - cy.get('[data-test-subj="event-field-_id"]') - .invoke('text') - .then((alertId) => { - cy.visit(`http://localhost:5620/app/security/alerts/redirect/${alertId}`); - cy.get('[data-test-subj="unifiedQueryInput"]').should('have.text', `_id: ${alertId}`); - cy.get(ALERTS_COUNT).should('have.text', '1 alert'); - cy.get(OVERVIEW_RULE).should('be.visible'); - }); + filterBy('kibana.alert.url'); + cy.get('[data-test-subj="formatted-field-kibana.alert.url"]').should('have.text', alertUrl); }); }); }); diff --git a/x-pack/plugins/security_solution/cypress/e2e/detection_alerts/building_block_alerts.cy.ts b/x-pack/plugins/security_solution/cypress/e2e/detection_alerts/building_block_alerts.cy.ts index 8d831f29bd653..fcd98e0f1f127 100644 --- a/x-pack/plugins/security_solution/cypress/e2e/detection_alerts/building_block_alerts.cy.ts +++ b/x-pack/plugins/security_solution/cypress/e2e/detection_alerts/building_block_alerts.cy.ts @@ -7,6 +7,7 @@ import { getBuildingBlockRule } from '../../objects/rule'; import { OVERVIEW_ALERTS_HISTOGRAM_EMPTY } from '../../screens/overview'; +import { HIGHLIGHTED_ROWS_IN_TABLE } from '../../screens/rule_details'; import { OVERVIEW } from '../../screens/security_header'; import { goToRuleDetails } from '../../tasks/alerts_detection_rules'; import { createRule } from '../../tasks/api_calls/rules'; @@ -40,6 +41,9 @@ describe('Alerts generated by building block rules', () => { // Check that generated events are visible on the Details page waitForAlertsToPopulate(EXPECTED_NUMBER_OF_ALERTS); + // Make sure rows are highlighted + cy.get(HIGHLIGHTED_ROWS_IN_TABLE).should('exist'); + navigateFromHeaderTo(OVERVIEW); // Check that generated events are hidden on the Overview page diff --git a/x-pack/plugins/security_solution/cypress/screens/rule_details.ts b/x-pack/plugins/security_solution/cypress/screens/rule_details.ts index 4abb1cad40d05..70c9ac4bc207d 100644 --- a/x-pack/plugins/security_solution/cypress/screens/rule_details.ts +++ b/x-pack/plugins/security_solution/cypress/screens/rule_details.ts @@ -141,3 +141,6 @@ export const THREAT_TECHNIQUE = '[data-test-subj="threatTechniqueLink"]'; export const THREAT_SUBTECHNIQUE = '[data-test-subj="threatSubtechniqueLink"]'; export const BACK_TO_RULES_TABLE = '[data-test-subj="breadcrumb"][title="Rules"]'; + +export const HIGHLIGHTED_ROWS_IN_TABLE = + '[data-test-subj="euiDataGridBody"] .alertsTableHighlightedRow'; diff --git a/x-pack/plugins/security_solution/public/common/components/link_to/index.ts b/x-pack/plugins/security_solution/public/common/components/link_to/index.ts index 4630ae0f6f71e..6b29af13f8827 100644 --- a/x-pack/plugins/security_solution/public/common/components/link_to/index.ts +++ b/x-pack/plugins/security_solution/public/common/components/link_to/index.ts @@ -7,10 +7,12 @@ import { isEmpty } from 'lodash/fp'; import { useCallback } from 'react'; -import { useGetUrlSearch, useGetUrlStateQueryString } from '../navigation/use_get_url_search'; +import { + useUrlStateQueryParams, + useGetUrlStateQueryParams, +} from '../navigation/use_url_state_query_params'; import { useAppUrl } from '../../lib/kibana/hooks'; import type { SecurityPageName } from '../../../app/types'; -import { needsUrlState } from '../../links'; export { getAlertDetailsUrl, getAlertDetailsTabUrl } from './redirect_to_alerts'; export { getDetectionEngineUrl, getRuleDetailsUrl } from './redirect_to_detection_engine'; @@ -43,17 +45,17 @@ export type FormatUrl = (path: string, options?: Partial) => s */ export const useFormatUrl = (page: SecurityPageName) => { const { getAppUrl } = useAppUrl(); - const search = useGetUrlSearch(page); + const queryParams = useUrlStateQueryParams(page); const formatUrl = useCallback( (path: string, { absolute = false, skipSearch = false } = {}) => { - const formattedPath = formatPath(path, search, skipSearch); + const formattedPath = formatPath(path, queryParams, skipSearch); return getAppUrl({ deepLinkId: page, path: formattedPath, absolute }); }, - [getAppUrl, page, search] + [getAppUrl, page, queryParams] ); - return { formatUrl, search }; + return { formatUrl, search: queryParams }; }; export type GetSecuritySolutionUrl = (param: { @@ -65,16 +67,16 @@ export type GetSecuritySolutionUrl = (param: { export const useGetSecuritySolutionUrl = () => { const { getAppUrl } = useAppUrl(); - const getUrlStateQueryString = useGetUrlStateQueryString(); + const getUrlStateQueryParams = useGetUrlStateQueryParams(); const getSecuritySolutionUrl = useCallback( ({ deepLinkId, path = '', absolute = false, skipSearch = false }) => { - const search = needsUrlState(deepLinkId) ? getUrlStateQueryString() : ''; + const search = getUrlStateQueryParams(deepLinkId); const formattedPath = formatPath(path, search, skipSearch); return getAppUrl({ deepLinkId, path: formattedPath, absolute }); }, - [getAppUrl, getUrlStateQueryString] + [getAppUrl, getUrlStateQueryParams] ); return getSecuritySolutionUrl; diff --git a/x-pack/plugins/security_solution/public/common/components/navigation/__mocks__/use_url_state_query_params.ts b/x-pack/plugins/security_solution/public/common/components/navigation/__mocks__/use_url_state_query_params.ts new file mode 100644 index 0000000000000..453859d3b6f8e --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/components/navigation/__mocks__/use_url_state_query_params.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { SecurityPageName } from '../../../../../common/constants'; + +export const useUrlStateQueryParams = (_pageName: SecurityPageName) => ''; +export const useGetUrlStateQueryParams = () => (_pageName: SecurityPageName) => ''; diff --git a/x-pack/plugins/security_solution/public/common/components/navigation/use_get_url_search.tsx b/x-pack/plugins/security_solution/public/common/components/navigation/use_url_state_query_params.tsx similarity index 50% rename from x-pack/plugins/security_solution/public/common/components/navigation/use_get_url_search.tsx rename to x-pack/plugins/security_solution/public/common/components/navigation/use_url_state_query_params.tsx index 816e35c217ee0..9f5d50d353eb8 100644 --- a/x-pack/plugins/security_solution/public/common/components/navigation/use_get_url_search.tsx +++ b/x-pack/plugins/security_solution/public/common/components/navigation/use_url_state_query_params.tsx @@ -12,21 +12,20 @@ import { useGlobalQueryString } from '../../utils/global_query_string'; import { getSearch } from './helpers'; -export const useGetUrlSearch = (pageName: SecurityPageName) => { - const globalQueryString = useGlobalQueryString(); - const urlSearch = useMemo( - () => getSearch(pageName, globalQueryString), - [globalQueryString, pageName] +export const useUrlStateQueryParams = (pageName: SecurityPageName) => { + const getUrlStateQueryParams = useGetUrlStateQueryParams(); + const urlStateQueryParams = useMemo( + () => getUrlStateQueryParams(pageName), + [getUrlStateQueryParams, pageName] ); - - return urlSearch; + return urlStateQueryParams; }; -export const useGetUrlStateQueryString = () => { +export const useGetUrlStateQueryParams = () => { const globalQueryString = useGlobalQueryString(); - const getUrlStateQueryString = useCallback(() => { - return globalQueryString.length > 0 ? `?${globalQueryString}` : ''; - }, [globalQueryString]); - - return getUrlStateQueryString; + const getUrlStateQueryParams = useCallback( + (pageName: SecurityPageName) => getSearch(pageName, globalQueryString), + [globalQueryString] + ); + return getUrlStateQueryParams; }; diff --git a/x-pack/plugins/security_solution/public/common/hooks/flyout/use_init_flyout_url_param.ts b/x-pack/plugins/security_solution/public/common/hooks/flyout/use_init_flyout_url_param.ts index 875a87e46e4af..a67b605841917 100644 --- a/x-pack/plugins/security_solution/public/common/hooks/flyout/use_init_flyout_url_param.ts +++ b/x-pack/plugins/security_solution/public/common/hooks/flyout/use_init_flyout_url_param.ts @@ -10,10 +10,10 @@ import { useCallback, useEffect, useState } from 'react'; import { useDispatch } from 'react-redux'; import { - dataTableActions, dataTableSelectors, - tableDefaults, TableId, + tableDefaults, + dataTableActions, } from '@kbn/securitysolution-data-table'; import { useInitializeUrlParam } from '../../utils/global_query_string'; import { URL_PARAM_KEY } from '../use_url_state'; @@ -39,16 +39,28 @@ export const useInitFlyoutFromUrlParam = () => { }, []); const loadExpandedDetailFromUrl = useCallback(() => { - const { initialized, isLoading, totalCount } = dataTableCurrent; + const { initialized, isLoading, totalCount, additionalFilters } = dataTableCurrent; const isTableLoaded = initialized && !isLoading && totalCount > 0; - if (urlDetails && isTableLoaded) { - updateHasLoadedUrlDetails(true); - dispatch( - dataTableActions.toggleDetailPanel({ - id: TableId.alertsOnAlertsPage, - ...urlDetails, - }) - ); + if (urlDetails) { + if (!additionalFilters.showBuildingBlockAlerts) { + // We want to show building block alerts when loading the flyout in case the alert is a building block alert + dispatch( + dataTableActions.updateShowBuildingBlockAlertsFilter({ + id: TableId.alertsOnAlertsPage, + showBuildingBlockAlerts: true, + }) + ); + } + + if (isTableLoaded) { + updateHasLoadedUrlDetails(true); + dispatch( + dataTableActions.toggleDetailPanel({ + id: TableId.alertsOnAlertsPage, + ...urlDetails, + }) + ); + } } }, [dataTableCurrent, dispatch, urlDetails]); diff --git a/x-pack/plugins/security_solution/public/common/hooks/use_dashboard_button_href.ts b/x-pack/plugins/security_solution/public/common/hooks/use_dashboard_button_href.ts deleted file mode 100644 index e5e3d048a7b23..0000000000000 --- a/x-pack/plugins/security_solution/public/common/hooks/use_dashboard_button_href.ts +++ /dev/null @@ -1,60 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0; you may not use this file except in compliance with the Elastic License - * 2.0. - */ -import { useState, useEffect } from 'react'; -import type { SavedObjectAttributes } from '@kbn/securitysolution-io-ts-alerting-types'; -import { useKibana } from '../lib/kibana'; - -export const dashboardRequestBody = (title: string) => ({ - type: 'dashboard', - search: `"${title}"`, - fields: ['title'], -}); - -export const useDashboardButtonHref = ({ - to, - from, - title, -}: { - to?: string; - from?: string; - title: string; -}) => { - const { - dashboard, - savedObjects: { client: savedObjectsClient }, - } = useKibana().services; - - const [buttonHref, setButtonHref] = useState(); - - useEffect(() => { - if (dashboard?.locator && savedObjectsClient) { - savedObjectsClient.find(dashboardRequestBody(title)).then( - async (DashboardsSO?: { - savedObjects?: Array<{ - attributes?: SavedObjectAttributes; - id?: string; - }>; - }) => { - if (DashboardsSO?.savedObjects?.length && to && from) { - const dashboardUrl = await dashboard?.locator?.getUrl({ - dashboardId: DashboardsSO.savedObjects[0].id, - timeRange: { - to, - from, - }, - }); - setButtonHref(dashboardUrl); - } - } - ); - } - }, [dashboard, from, savedObjectsClient, to, title]); - - return { - buttonHref, - }; -}; diff --git a/x-pack/plugins/security_solution/public/common/hooks/use_dashboard_href.ts b/x-pack/plugins/security_solution/public/common/hooks/use_dashboard_href.ts new file mode 100644 index 0000000000000..777f48fee4307 --- /dev/null +++ b/x-pack/plugins/security_solution/public/common/hooks/use_dashboard_href.ts @@ -0,0 +1,51 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { useState, useEffect, useMemo } from 'react'; +import { SecurityPageName } from '../../../common/constants'; +import { useUrlStateQueryParams } from '../components/navigation/use_url_state_query_params'; +import { useKibana, useAppUrl } from '../lib/kibana'; + +export const dashboardRequestBody = (title: string) => ({ + type: 'dashboard', + search: `"${title}"`, + fields: ['title'], +}); + +export const useDashboardHref = ({ title }: { title: string }): string | undefined => { + const { dashboard } = useKibana().services; + const { getAppUrl } = useAppUrl(); + const [dashboardId, setDashboardId] = useState(); + + const params = useUrlStateQueryParams(SecurityPageName.dashboards); + + useEffect(() => { + let ignore = false; + (async () => { + if (dashboard && title) { + const findDashboardsService = await dashboard?.findDashboardsService(); + const { id } = (await findDashboardsService.findByTitle(title)) ?? {}; + if (!ignore) { + setDashboardId(id); + } + } + })(); + return () => { + ignore = true; + }; + }, [dashboard, title]); + + return useMemo(() => { + if (dashboardId) { + return getAppUrl({ + deepLinkId: SecurityPageName.dashboards, + path: `${dashboardId}${params}`, + }); + } else { + return undefined; + } + }, [dashboardId, getAppUrl, params]); +}; diff --git a/x-pack/plugins/security_solution/public/common/lib/kuery/index.ts b/x-pack/plugins/security_solution/public/common/lib/kuery/index.ts index e21a5a519fc51..e6d5d67daf2bf 100644 --- a/x-pack/plugins/security_solution/public/common/lib/kuery/index.ts +++ b/x-pack/plugins/security_solution/public/common/lib/kuery/index.ts @@ -97,6 +97,15 @@ export const getBrowserFieldPath = (field: string, browserFields: BrowserFields) return [splitFields[0], 'fields', field]; }; +export const getFieldEsTypes = (field: string, browserFields: BrowserFields): string[] => { + const pathBrowserField = getBrowserFieldPath(field, browserFields); + const browserField = get(pathBrowserField, browserFields); + if (browserField != null) { + return browserField.esTypes; + } + return []; +}; + export const checkIfFieldTypeIsDate = (field: string, browserFields: BrowserFields) => { const pathBrowserField = getBrowserFieldPath(field, browserFields); const browserField = get(pathBrowserField, browserFields); diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_histogram_panel/index.test.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_histogram_panel/index.test.tsx index 7af2fa33eefba..d0b2f9b4db08b 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_histogram_panel/index.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_kpis/alerts_histogram_panel/index.test.tsx @@ -78,7 +78,7 @@ jest.mock('../../../../common/lib/kibana', () => { }; }); -jest.mock('../../../../common/components/navigation/use_get_url_search'); +jest.mock('../../../../common/components/navigation/use_url_state_query_params'); const defaultUseQueryAlertsReturn = { loading: true, diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/alerts_grouping.test.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/alerts_grouping.test.tsx index 4a57d7cac8e73..dae31cb56a79b 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/alerts_grouping.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/alerts_grouping.test.tsx @@ -155,15 +155,9 @@ describe('GroupedAlertsTable', () => { if (i.skip) { return mockQueryResponse; } - if (i.query.aggs.groupByFields.multi_terms != null) { - return { - ...mockQueryResponse, - data: groupingSearchResponse.ruleName, - }; - } return { ...mockQueryResponse, - data: i.query.aggs.groupByFields.terms.field != null ? groupingSearchResponse.hostName : {}, + data: groupingSearchResponse, }; }); }); @@ -214,6 +208,68 @@ describe('GroupedAlertsTable', () => { expect(within(level0).getByTestId('alerts-table')).toBeInTheDocument(); }); + it('Query gets passed correctly', () => { + jest + .spyOn(window.localStorage, 'getItem') + .mockReturnValue(getMockStorageState(['kibana.alert.rule.name'])); + + render( + + + + ); + expect(mockUseQueryAlerts).toHaveBeenLastCalledWith({ + indexName: 'test', + query: { + _source: false, + aggs: { + groupByFields: { + aggs: { + bucket_truncate: { + bucket_sort: { from: 0, size: 25, sort: [{ unitsCount: { order: 'desc' } }] }, + }, + countSeveritySubAggregation: { cardinality: { field: 'kibana.alert.severity' } }, + hostsCountAggregation: { cardinality: { field: 'host.name' } }, + description: { terms: { field: 'kibana.alert.rule.description', size: 1 } }, + ruleTags: { terms: { field: 'kibana.alert.rule.tags' } }, + severitiesSubAggregation: { terms: { field: 'kibana.alert.severity' } }, + unitsCount: { cardinality: { field: 'kibana.alert.uuid' } }, + usersCountAggregation: { cardinality: { field: 'user.name' } }, + }, + multi_terms: { + size: 10000, + terms: [ + { field: 'kibana.alert.rule.name', missing: '-' }, + { field: 'kibana.alert.rule.name', missing: '--' }, + ], + }, + }, + groupsCount: { cardinality: { field: 'kibana.alert.rule.name' } }, + unitsCount: { value_count: { field: 'kibana.alert.rule.name' } }, + }, + query: { + bool: { + filter: [ + { bool: { filter: [], must: [], must_not: [], should: [] } }, + { + range: { + '@timestamp': { + gte: '2020-07-07T08:20:18.966Z', + lte: '2020-07-08T08:20:18.966Z', + }, + }, + }, + ], + }, + }, + runtime_mappings: {}, + size: 0, + }, + queryName: 'securitySolutionUI fetchAlerts grouping', + skip: false, + }); + }); + it('renders grouping table in second accordion level when 2 groups are selected', async () => { jest .spyOn(window.localStorage, 'getItem') diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/alerts_grouping.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/alerts_grouping.tsx index 99ae3f4ff3433..968e415f38214 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/alerts_grouping.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/alerts_grouping.tsx @@ -132,10 +132,6 @@ const GroupedAlertsTableComponent: React.FC = (props) setPageIndex((curr) => curr.map(() => DEFAULT_PAGE_INDEX)); }, []); - useEffect(() => { - resetAllPagination(); - }, [resetAllPagination, selectedGroups]); - const setPageVar = useCallback( (newNumber: number, groupingLevel: number, pageType: 'index' | 'size') => { if (pageType === 'index') { @@ -158,23 +154,31 @@ const GroupedAlertsTableComponent: React.FC = (props) [setStoragePageSize] ); - const nonGroupingFilters = useRef({ + const paginationResetTriggers = useRef({ defaultFilters: props.defaultFilters, globalFilters: props.globalFilters, globalQuery: props.globalQuery, + selectedGroups, }); useEffect(() => { - const nonGrouping = { + const triggers = { defaultFilters: props.defaultFilters, globalFilters: props.globalFilters, globalQuery: props.globalQuery, + selectedGroups, }; - if (!isEqual(nonGroupingFilters.current, nonGrouping)) { + if (!isEqual(paginationResetTriggers.current, triggers)) { resetAllPagination(); - nonGroupingFilters.current = nonGrouping; + paginationResetTriggers.current = triggers; } - }, [props.defaultFilters, props.globalFilters, props.globalQuery, resetAllPagination]); + }, [ + props.defaultFilters, + props.globalFilters, + props.globalQuery, + resetAllPagination, + selectedGroups, + ]); const getLevel = useCallback( (level: number, selectedGroup: string, parentGroupingFilter?: string) => { @@ -184,6 +188,7 @@ const GroupedAlertsTableComponent: React.FC = (props) return getLevel( level + 1, selectedGroups[level + 1], + // stringify because if the filter is passed as an object, it will cause unnecessary re-rendering JSON.stringify([ ...groupingFilters, ...(parentGroupingFilter ? JSON.parse(parentGroupingFilter) : []), diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/alerts_sub_grouping.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/alerts_sub_grouping.tsx index cf8a8128cb166..6fefc30e556cc 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/alerts_sub_grouping.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/alerts_sub_grouping.tsx @@ -15,7 +15,8 @@ import { getEsQueryConfig } from '@kbn/data-plugin/common'; import type { DynamicGroupingProps } from '@kbn/securitysolution-grouping/src'; import type { MappingRuntimeFields } from '@elastic/elasticsearch/lib/api/types'; import type { TableIdLiteral } from '@kbn/securitysolution-data-table'; -import { combineQueries } from '../../../common/lib/kuery'; +import { parseGroupingQuery } from '@kbn/securitysolution-grouping/src'; +import { combineQueries, getFieldEsTypes } from '../../../common/lib/kuery'; import { SourcererScopeName } from '../../../common/store/sourcerer/model'; import type { AlertsGroupingAggregation } from './grouping_settings/types'; import type { Status } from '../../../../common/detection_engine/schemas/common'; @@ -140,17 +141,32 @@ export const GroupedSubLevelComponent: React.FC = ({ } }, [defaultFilters, globalFilters, globalQuery, parentGroupingFilter]); + const selectedGroupEsTypes = useMemo( + () => getFieldEsTypes(selectedGroup, browserFields), + [selectedGroup, browserFields] + ); + const queryGroups = useMemo(() => { return getAlertsGroupingQuery({ additionalFilters, selectedGroup, + selectedGroupEsTypes, from, runtimeMappings, to, pageSize, pageIndex, }); - }, [additionalFilters, from, pageIndex, pageSize, runtimeMappings, selectedGroup, to]); + }, [ + additionalFilters, + from, + pageIndex, + pageSize, + runtimeMappings, + selectedGroup, + selectedGroupEsTypes, + to, + ]); const emptyGlobalQuery = useMemo(() => getGlobalQuery([]), [getGlobalQuery]); @@ -177,6 +193,11 @@ export const GroupedSubLevelComponent: React.FC = ({ skip: isNoneGroup([selectedGroup]), }); + const buckets = useMemo( + () => parseGroupingQuery(alertsGroupsData?.aggregations?.groupByFields?.buckets ?? []), + [alertsGroupsData] + ); + useEffect(() => { if (!isNoneGroup([selectedGroup])) { setAlertsQuery(queryGroups); @@ -225,7 +246,13 @@ export const GroupedSubLevelComponent: React.FC = ({ () => getGrouping({ activePage: pageIndex, - data: alertsGroupsData?.aggregations, + data: { + ...alertsGroupsData?.aggregations, + groupByFields: { + ...alertsGroupsData?.aggregations?.groupByFields, + buckets, + }, + }, groupingLevel, inspectButton: inspect, isLoading: loading || isLoadingGroups, @@ -238,20 +265,21 @@ export const GroupedSubLevelComponent: React.FC = ({ takeActionItems: getTakeActionItems, }), [ - alertsGroupsData?.aggregations, getGrouping, - getTakeActionItems, + pageIndex, + alertsGroupsData, + buckets, groupingLevel, inspect, - isLoadingGroups, loading, - pageIndex, + isLoadingGroups, pageSize, renderChildComponent, onGroupClose, selectedGroup, - setPageIndex, + getTakeActionItems, setPageSize, + setPageIndex, ] ); }; diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/grouping_settings/group_panel_renderers.test.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/grouping_settings/group_panel_renderers.test.tsx index ff70bfe8e47ce..2038bddea952e 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/grouping_settings/group_panel_renderers.test.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/grouping_settings/group_panel_renderers.test.tsx @@ -5,51 +5,74 @@ * 2.0. */ -import { shallow } from 'enzyme'; - import { renderGroupPanel } from '.'; +import { render } from '@testing-library/react'; describe('renderGroupPanel', () => { it('renders correctly when the field renderer exists', () => { - const wrapperRuleName = shallow( - renderGroupPanel('kibana.alert.rule.name', { - key: ['Rule name test', 'Some description'], - doc_count: 10, - })! + let { getByTestId } = render( + renderGroupPanel( + 'kibana.alert.rule.name', + { + key: ['Rule name test', 'Some description'], + doc_count: 10, + }, + 'This is a null group!' + )! ); - expect(wrapperRuleName.find('[data-test-subj="rule-name-group-renderer"]')).toBeTruthy(); - const wrapperHostName = shallow( - renderGroupPanel('host.name', { - key: 'Host', - doc_count: 2, - })! + expect(getByTestId('rule-name-group-renderer')).toBeInTheDocument(); + const result1 = render( + renderGroupPanel( + 'host.name', + { + key: 'Host', + doc_count: 2, + }, + 'This is a null group!' + )! ); + getByTestId = result1.getByTestId; + + expect(getByTestId('host-name-group-renderer')).toBeInTheDocument(); - expect(wrapperHostName.find('[data-test-subj="host-name-group-renderer"]')).toBeTruthy(); - const wrapperUserName = shallow( - renderGroupPanel('user.name', { - key: 'User test', - doc_count: 1, - })! + const result2 = render( + renderGroupPanel( + 'user.name', + { + key: 'User test', + doc_count: 1, + }, + 'This is a null group!' + )! ); + getByTestId = result2.getByTestId; - expect(wrapperUserName.find('[data-test-subj="host-name-group-renderer"]')).toBeTruthy(); - const wrapperSourceIp = shallow( - renderGroupPanel('source.ip', { - key: 'sourceIp', - doc_count: 23, - })! + expect(getByTestId('host-name-group-renderer')).toBeInTheDocument(); + const result3 = render( + renderGroupPanel( + 'source.ip', + { + key: 'sourceIp', + doc_count: 23, + }, + 'This is a null group!' + )! ); + getByTestId = result3.getByTestId; - expect(wrapperSourceIp.find('[data-test-subj="source-ip-group-renderer"]')).toBeTruthy(); + expect(getByTestId('source-ip-group-renderer')).toBeInTheDocument(); }); it('returns undefined when the renderer does not exist', () => { - const wrapper = renderGroupPanel('process.name', { - key: 'process', - doc_count: 10, - }); + const wrapper = renderGroupPanel( + 'process.name', + { + key: 'process', + doc_count: 10, + }, + 'This is a null group!' + ); expect(wrapper).toBeUndefined(); }); diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/grouping_settings/group_panel_renderers.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/grouping_settings/group_panel_renderers.tsx index ffea45007fc6d..2781b78247cf6 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/grouping_settings/group_panel_renderers.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/grouping_settings/group_panel_renderers.tsx @@ -11,6 +11,7 @@ import { EuiFlexGroup, EuiFlexItem, EuiIcon, + EuiIconTip, EuiText, EuiTextColor, EuiTitle, @@ -18,32 +19,35 @@ import { import { euiThemeVars } from '@kbn/ui-theme'; import { isArray } from 'lodash/fp'; import React from 'react'; -import type { RawBucket } from '@kbn/securitysolution-grouping'; +import type { GroupPanelRenderer } from '@kbn/securitysolution-grouping/src'; import type { AlertsGroupingAggregation } from './types'; import { firstNonNullValue } from '../../../../../common/endpoint/models/ecs_safety_helpers'; import type { GenericBuckets } from '../../../../../common/search_strategy'; import { PopoverItems } from '../../../../common/components/popover_items'; import { COLUMN_TAGS } from '../../../pages/detection_engine/rules/translations'; -export const renderGroupPanel = ( - selectedGroup: string, - bucket: RawBucket +export const renderGroupPanel: GroupPanelRenderer = ( + selectedGroup, + bucket, + nullGroupMessage ) => { switch (selectedGroup) { case 'kibana.alert.rule.name': return isArray(bucket.key) ? ( ) : undefined; case 'host.name': - return ; + return ; case 'user.name': - return ; + return ; case 'source.ip': - return ; + return ; } }; @@ -89,66 +93,87 @@ const RuleNameGroupContent = React.memo<{ }); RuleNameGroupContent.displayName = 'RuleNameGroup'; -const HostNameGroupContent = React.memo<{ hostName: string | string[] }>(({ hostName }) => ( - - ( + ({ hostName, nullGroupMessage }) => ( + - - - - - -
{hostName}
-
-
-
-)); -HostNameGroupContent.displayName = 'HostNameGroupContent'; - -const UserNameGroupContent = React.memo<{ userName: string | string[] }>(({ userName }) => { - const userNameValue = firstNonNullValue(userName) ?? '-'; - return ( - - - + + - + -
{userName}
+
{hostName}
+ {nullGroupMessage && ( + + + + )}
- ); -}); + ) +); +HostNameGroupContent.displayName = 'HostNameGroupContent'; + +const UserNameGroupContent = React.memo<{ userName: string | string[]; nullGroupMessage?: string }>( + ({ userName, nullGroupMessage }) => { + const userNameValue = firstNonNullValue(userName) ?? '-'; + return ( + + + + + + + +
{userName}
+
+
+ {nullGroupMessage && ( + + + + )} +
+ ); + } +); UserNameGroupContent.displayName = 'UserNameGroupContent'; -const SourceIpGroupContent = React.memo<{ sourceIp: string | string[] }>(({ sourceIp }) => ( - - - - - - -
{sourceIp}
-
-
-
-)); +const SourceIpGroupContent = React.memo<{ sourceIp: string | string[]; nullGroupMessage?: string }>( + ({ sourceIp, nullGroupMessage }) => ( + + + + + + +
{sourceIp}
+
+
+ {nullGroupMessage && ( + + + + )} +
+ ) +); SourceIpGroupContent.displayName = 'SourceIpGroupContent'; diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/grouping_settings/mock.ts b/x-pack/plugins/security_solution/public/detections/components/alerts_table/grouping_settings/mock.ts index 9e0b4e63715aa..c9717c2a1ad2b 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/grouping_settings/mock.ts +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/grouping_settings/mock.ts @@ -8,1729 +8,1339 @@ import { mockAlertSearchResponse } from '../../../../common/components/alerts_treemap/lib/mocks/mock_alert_search_response'; export const groupingSearchResponse = { - ruleName: { - ...mockAlertSearchResponse, - hits: { - total: { - value: 6048, - relation: 'eq', - }, - max_score: null, - hits: [], - }, - aggregations: { - groupsCount: { - value: 32, - }, - groupByFields: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: ['critical hosts [Duplicate]', 'f'], - key_as_string: 'critical hosts [Duplicate]|f', - doc_count: 300, - hostsCountAggregation: { - value: 30, - }, - ruleTags: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'cool', - doc_count: 300, - }, - { - key: 'rule', - doc_count: 300, - }, - ], - }, - unitsCount: { - value: 300, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'critical', - doc_count: 300, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 0, - }, - }, - { - key: ['critical hosts [Duplicate] [Duplicate]', 'f'], - key_as_string: 'critical hosts [Duplicate] [Duplicate]|f', - doc_count: 300, - hostsCountAggregation: { - value: 30, - }, - ruleTags: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'cool', - doc_count: 300, - }, - { - key: 'rule', - doc_count: 300, - }, - ], - }, - unitsCount: { - value: 300, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'critical', - doc_count: 300, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 0, - }, - }, - { - key: ['high hosts [Duplicate]', 'f'], - key_as_string: 'high hosts [Duplicate]|f', - doc_count: 300, - hostsCountAggregation: { - value: 30, - }, - ruleTags: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'cool', - doc_count: 300, - }, - { - key: 'rule', - doc_count: 300, - }, - ], - }, - unitsCount: { - value: 300, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'high', - doc_count: 300, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 0, - }, - }, - { - key: ['high hosts [Duplicate] [Duplicate]', 'f'], - key_as_string: 'high hosts [Duplicate] [Duplicate]|f', - doc_count: 300, - hostsCountAggregation: { - value: 30, - }, - ruleTags: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'cool', - doc_count: 300, - }, - { - key: 'rule', - doc_count: 300, - }, - ], - }, - unitsCount: { - value: 300, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'high', - doc_count: 300, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 0, - }, - }, - { - key: ['low hosts [Duplicate]', 'f'], - key_as_string: 'low hosts [Duplicate]|f', - doc_count: 300, - hostsCountAggregation: { - value: 30, - }, - ruleTags: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'cool', - doc_count: 300, - }, - { - key: 'rule', - doc_count: 300, - }, - ], - }, - unitsCount: { - value: 300, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'low', - doc_count: 300, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 0, - }, - }, - { - key: ['low hosts [Duplicate] [Duplicate]', 'f'], - key_as_string: 'low hosts [Duplicate] [Duplicate]|f', - doc_count: 300, - hostsCountAggregation: { - value: 30, - }, - ruleTags: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'cool', - doc_count: 300, - }, - { - key: 'rule', - doc_count: 300, - }, - ], - }, - unitsCount: { - value: 300, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'low', - doc_count: 300, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 0, - }, - }, - { - key: ['medium hosts [Duplicate]', 'f'], - key_as_string: 'medium hosts [Duplicate]|f', - doc_count: 300, - hostsCountAggregation: { - value: 30, - }, - ruleTags: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'cool', - doc_count: 300, - }, - { - key: 'rule', - doc_count: 300, - }, - ], - }, - unitsCount: { - value: 300, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'medium', - doc_count: 300, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 0, - }, - }, - { - key: ['medium hosts [Duplicate] [Duplicate]', 'f'], - key_as_string: 'medium hosts [Duplicate] [Duplicate]|f', - doc_count: 300, - hostsCountAggregation: { - value: 30, - }, - ruleTags: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'cool', - doc_count: 300, - }, - { - key: 'rule', - doc_count: 300, - }, - ], - }, - unitsCount: { - value: 300, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'medium', - doc_count: 300, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 0, - }, - }, - { - key: ['critical users [Duplicate]', 'f'], - key_as_string: 'critical users [Duplicate]|f', - doc_count: 273, - hostsCountAggregation: { - value: 10, - }, - ruleTags: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'cool', - doc_count: 273, - }, - { - key: 'rule', - doc_count: 273, - }, - ], - }, - unitsCount: { - value: 273, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'critical', - doc_count: 273, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 91, - }, - }, - { - key: ['critical users [Duplicate] [Duplicate]', 'f'], - key_as_string: 'critical users [Duplicate] [Duplicate]|f', - doc_count: 273, - hostsCountAggregation: { - value: 10, - }, - ruleTags: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'cool', - doc_count: 273, - }, - { - key: 'rule', - doc_count: 273, - }, - ], - }, - unitsCount: { - value: 273, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'critical', - doc_count: 273, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 91, - }, - }, - { - key: ['high users [Duplicate]', 'f'], - key_as_string: 'high users [Duplicate]|f', - doc_count: 273, - hostsCountAggregation: { - value: 10, - }, - ruleTags: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'cool', - doc_count: 273, - }, - { - key: 'rule', - doc_count: 273, - }, - ], - }, - unitsCount: { - value: 273, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'high', - doc_count: 273, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 91, - }, - }, - { - key: ['high users [Duplicate] [Duplicate]', 'f'], - key_as_string: 'high users [Duplicate] [Duplicate]|f', - doc_count: 273, - hostsCountAggregation: { - value: 10, - }, - ruleTags: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'cool', - doc_count: 273, - }, - { - key: 'rule', - doc_count: 273, - }, - ], - }, - unitsCount: { - value: 273, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'high', - doc_count: 273, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 91, - }, - }, - { - key: ['low users [Duplicate]', 'f'], - key_as_string: 'low users [Duplicate]|f', - doc_count: 273, - hostsCountAggregation: { - value: 10, - }, - ruleTags: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'cool', - doc_count: 273, - }, - { - key: 'rule', - doc_count: 273, - }, - ], - }, - unitsCount: { - value: 273, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'low', - doc_count: 273, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 91, - }, - }, - { - key: ['low users [Duplicate] [Duplicate]', 'f'], - key_as_string: 'low users [Duplicate] [Duplicate]|f', - doc_count: 273, - hostsCountAggregation: { - value: 10, - }, - ruleTags: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'cool', - doc_count: 273, - }, - { - key: 'rule', - doc_count: 273, - }, - ], - }, - unitsCount: { - value: 273, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'low', - doc_count: 273, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 91, - }, - }, - { - key: ['medium users [Duplicate]', 'f'], - key_as_string: 'medium users [Duplicate]|f', - doc_count: 273, - hostsCountAggregation: { - value: 10, - }, - ruleTags: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'cool', - doc_count: 273, - }, - { - key: 'rule', - doc_count: 273, - }, - ], - }, - unitsCount: { - value: 273, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'medium', - doc_count: 273, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 91, - }, - }, - { - key: ['medium users [Duplicate] [Duplicate]', 'f'], - key_as_string: 'medium users [Duplicate] [Duplicate]|f', - doc_count: 273, - hostsCountAggregation: { - value: 10, - }, - ruleTags: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'cool', - doc_count: 273, - }, - { - key: 'rule', - doc_count: 273, - }, - ], - }, - unitsCount: { - value: 273, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'medium', - doc_count: 273, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 91, - }, - }, - { - key: ['critical hosts', 'f'], - key_as_string: 'critical hosts|f', - doc_count: 100, - hostsCountAggregation: { - value: 30, - }, - ruleTags: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'cool', - doc_count: 100, - }, - { - key: 'rule', - doc_count: 100, - }, - ], - }, - unitsCount: { - value: 100, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'critical', - doc_count: 100, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 0, - }, - }, - { - key: ['critical hosts [Duplicate] [Duplicate] [Duplicate]', 'f'], - key_as_string: 'critical hosts [Duplicate] [Duplicate] [Duplicate]|f', - doc_count: 100, - hostsCountAggregation: { - value: 30, - }, - ruleTags: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'cool', - doc_count: 100, - }, - { - key: 'rule', - doc_count: 100, - }, - ], - }, - unitsCount: { - value: 100, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'critical', - doc_count: 100, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 0, - }, - }, - { - key: ['high hosts', 'f'], - key_as_string: 'high hosts|f', - doc_count: 100, - hostsCountAggregation: { - value: 30, - }, - ruleTags: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'cool', - doc_count: 100, - }, - { - key: 'rule', - doc_count: 100, - }, - ], - }, - unitsCount: { - value: 100, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'high', - doc_count: 100, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 0, - }, - }, - { - key: ['high hosts [Duplicate] [Duplicate] [Duplicate]', 'f'], - key_as_string: 'high hosts [Duplicate] [Duplicate] [Duplicate]|f', - doc_count: 100, - hostsCountAggregation: { - value: 30, - }, - ruleTags: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'cool', - doc_count: 100, - }, - { - key: 'rule', - doc_count: 100, - }, - ], - }, - unitsCount: { - value: 100, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'high', - doc_count: 100, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 0, - }, - }, - { - key: ['low hosts ', 'f'], - key_as_string: 'low hosts |f', - doc_count: 100, - hostsCountAggregation: { - value: 30, - }, - ruleTags: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'cool', - doc_count: 100, - }, - { - key: 'rule', - doc_count: 100, - }, - ], - }, - unitsCount: { - value: 100, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'low', - doc_count: 100, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 0, - }, - }, - { - key: ['low hosts [Duplicate] [Duplicate] [Duplicate]', 'f'], - key_as_string: 'low hosts [Duplicate] [Duplicate] [Duplicate]|f', - doc_count: 100, - hostsCountAggregation: { - value: 30, - }, - ruleTags: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'cool', - doc_count: 100, - }, - { - key: 'rule', - doc_count: 100, - }, - ], - }, - unitsCount: { - value: 100, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'low', - doc_count: 100, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 0, - }, - }, - { - key: ['medium hosts', 'f'], - key_as_string: 'medium hosts|f', - doc_count: 100, - hostsCountAggregation: { - value: 30, - }, - ruleTags: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'cool', - doc_count: 100, - }, - { - key: 'rule', - doc_count: 100, - }, - ], - }, - unitsCount: { - value: 100, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'medium', - doc_count: 100, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 0, - }, - }, - { - key: ['medium hosts [Duplicate] [Duplicate] [Duplicate]', 'f'], - key_as_string: 'medium hosts [Duplicate] [Duplicate] [Duplicate]|f', - doc_count: 100, - hostsCountAggregation: { - value: 30, - }, - ruleTags: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'cool', - doc_count: 100, - }, - { - key: 'rule', - doc_count: 100, - }, - ], - }, - unitsCount: { - value: 100, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'medium', - doc_count: 100, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 0, - }, - }, - { - key: ['critical users [Duplicate] [Duplicate] [Duplicate]', 'f'], - key_as_string: 'critical users [Duplicate] [Duplicate] [Duplicate]|f', - doc_count: 91, - hostsCountAggregation: { - value: 10, - }, - ruleTags: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'cool', - doc_count: 91, - }, - { - key: 'rule', - doc_count: 91, - }, - ], - }, - unitsCount: { - value: 91, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'critical', - doc_count: 91, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 91, - }, - }, - ], - }, - unitsCount: { - value: 6048, - }, + ...mockAlertSearchResponse, + hits: { + total: { + value: 6048, + relation: 'eq', }, + max_score: null, + hits: [], }, - hostName: { - ...mockAlertSearchResponse, - hits: { - total: { - value: 900, - relation: 'eq', - }, - max_score: null, - hits: [], + aggregations: { + groupsCount: { + value: 32, + }, + groupByFields: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: ['critical hosts [Duplicate]', 'critical hosts [Duplicate]'], + key_as_string: 'critical hosts [Duplicate]|critical hosts [Duplicate]', + doc_count: 300, + hostsCountAggregation: { + value: 30, + }, + ruleTags: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'cool', + doc_count: 300, + }, + { + key: 'rule', + doc_count: 300, + }, + ], + }, + description: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'f', + doc_count: 1, + }, + ], + }, + unitsCount: { + value: 300, + }, + severitiesSubAggregation: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'critical', + doc_count: 300, + }, + ], + }, + countSeveritySubAggregation: { + value: 1, + }, + usersCountAggregation: { + value: 0, + }, + }, + { + key: ['critical hosts [Duplicate] [Duplicate]', 'critical hosts [Duplicate] [Duplicate]'], + key_as_string: + 'critical hosts [Duplicate] [Duplicate]|critical hosts [Duplicate] [Duplicate]', + doc_count: 300, + hostsCountAggregation: { + value: 30, + }, + ruleTags: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'cool', + doc_count: 300, + }, + { + key: 'rule', + doc_count: 300, + }, + ], + }, + description: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'f', + doc_count: 1, + }, + ], + }, + unitsCount: { + value: 300, + }, + severitiesSubAggregation: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'critical', + doc_count: 300, + }, + ], + }, + countSeveritySubAggregation: { + value: 1, + }, + usersCountAggregation: { + value: 0, + }, + }, + { + key: ['high hosts [Duplicate]', 'high hosts [Duplicate]'], + key_as_string: 'high hosts [Duplicate]|high hosts [Duplicate]', + doc_count: 300, + hostsCountAggregation: { + value: 30, + }, + ruleTags: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'cool', + doc_count: 300, + }, + { + key: 'rule', + doc_count: 300, + }, + ], + }, + description: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'f', + doc_count: 1, + }, + ], + }, + unitsCount: { + value: 300, + }, + severitiesSubAggregation: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'high', + doc_count: 300, + }, + ], + }, + countSeveritySubAggregation: { + value: 1, + }, + usersCountAggregation: { + value: 0, + }, + }, + { + key: ['high hosts [Duplicate] [Duplicate]', 'high hosts [Duplicate] [Duplicate]'], + key_as_string: 'high hosts [Duplicate] [Duplicate]|high hosts [Duplicate] [Duplicate]', + doc_count: 300, + hostsCountAggregation: { + value: 30, + }, + ruleTags: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'cool', + doc_count: 300, + }, + { + key: 'rule', + doc_count: 300, + }, + ], + }, + description: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'f', + doc_count: 1, + }, + ], + }, + unitsCount: { + value: 300, + }, + severitiesSubAggregation: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'high', + doc_count: 300, + }, + ], + }, + countSeveritySubAggregation: { + value: 1, + }, + usersCountAggregation: { + value: 0, + }, + }, + { + key: ['low hosts [Duplicate]', 'low hosts [Duplicate]'], + key_as_string: 'low hosts [Duplicate]|low hosts [Duplicate]', + doc_count: 300, + hostsCountAggregation: { + value: 30, + }, + ruleTags: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'cool', + doc_count: 300, + }, + { + key: 'rule', + doc_count: 300, + }, + ], + }, + description: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'f', + doc_count: 1, + }, + ], + }, + unitsCount: { + value: 300, + }, + severitiesSubAggregation: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'low', + doc_count: 300, + }, + ], + }, + countSeveritySubAggregation: { + value: 1, + }, + usersCountAggregation: { + value: 0, + }, + }, + { + key: ['low hosts [Duplicate] [Duplicate]', 'low hosts [Duplicate] [Duplicate]'], + key_as_string: 'low hosts [Duplicate] [Duplicate]|low hosts [Duplicate] [Duplicate]', + doc_count: 300, + hostsCountAggregation: { + value: 30, + }, + ruleTags: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'cool', + doc_count: 300, + }, + { + key: 'rule', + doc_count: 300, + }, + ], + }, + description: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'f', + doc_count: 1, + }, + ], + }, + unitsCount: { + value: 300, + }, + severitiesSubAggregation: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'low', + doc_count: 300, + }, + ], + }, + countSeveritySubAggregation: { + value: 1, + }, + usersCountAggregation: { + value: 0, + }, + }, + { + key: ['medium hosts [Duplicate]', 'medium hosts [Duplicate]'], + key_as_string: 'medium hosts [Duplicate]|medium hosts [Duplicate]', + doc_count: 300, + hostsCountAggregation: { + value: 30, + }, + ruleTags: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'cool', + doc_count: 300, + }, + { + key: 'rule', + doc_count: 300, + }, + ], + }, + description: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'f', + doc_count: 1, + }, + ], + }, + unitsCount: { + value: 300, + }, + severitiesSubAggregation: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'medium', + doc_count: 300, + }, + ], + }, + countSeveritySubAggregation: { + value: 1, + }, + usersCountAggregation: { + value: 0, + }, + }, + { + key: ['medium hosts [Duplicate] [Duplicate]', 'medium hosts [Duplicate] [Duplicate]'], + key_as_string: + 'medium hosts [Duplicate] [Duplicate]|medium hosts [Duplicate] [Duplicate]', + doc_count: 300, + hostsCountAggregation: { + value: 30, + }, + ruleTags: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'cool', + doc_count: 300, + }, + { + key: 'rule', + doc_count: 300, + }, + ], + }, + description: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'f', + doc_count: 1, + }, + ], + }, + unitsCount: { + value: 300, + }, + severitiesSubAggregation: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'medium', + doc_count: 300, + }, + ], + }, + countSeveritySubAggregation: { + value: 1, + }, + usersCountAggregation: { + value: 0, + }, + }, + { + key: ['critical users [Duplicate]', 'critical users [Duplicate]'], + key_as_string: 'critical users [Duplicate]|critical users [Duplicate]', + doc_count: 273, + hostsCountAggregation: { + value: 10, + }, + ruleTags: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'cool', + doc_count: 273, + }, + { + key: 'rule', + doc_count: 273, + }, + ], + }, + description: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'f', + doc_count: 1, + }, + ], + }, + unitsCount: { + value: 273, + }, + severitiesSubAggregation: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'critical', + doc_count: 273, + }, + ], + }, + countSeveritySubAggregation: { + value: 1, + }, + usersCountAggregation: { + value: 91, + }, + }, + { + key: [ + 'critical users [Duplicate] [Duplicate]', + 'critical users [Duplicate] [Duplicate]', + ], + key_as_string: + 'critical users [Duplicate] [Duplicate]|critical users [Duplicate] [Duplicate]', + doc_count: 273, + hostsCountAggregation: { + value: 10, + }, + ruleTags: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'cool', + doc_count: 273, + }, + { + key: 'rule', + doc_count: 273, + }, + ], + }, + description: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'f', + doc_count: 1, + }, + ], + }, + unitsCount: { + value: 273, + }, + severitiesSubAggregation: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'critical', + doc_count: 273, + }, + ], + }, + countSeveritySubAggregation: { + value: 1, + }, + usersCountAggregation: { + value: 91, + }, + }, + { + key: ['high users [Duplicate]', 'high users [Duplicate]'], + key_as_string: 'high users [Duplicate]|high users [Duplicate]', + doc_count: 273, + hostsCountAggregation: { + value: 10, + }, + ruleTags: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'cool', + doc_count: 273, + }, + { + key: 'rule', + doc_count: 273, + }, + ], + }, + description: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'f', + doc_count: 1, + }, + ], + }, + unitsCount: { + value: 273, + }, + severitiesSubAggregation: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'high', + doc_count: 273, + }, + ], + }, + countSeveritySubAggregation: { + value: 1, + }, + usersCountAggregation: { + value: 91, + }, + }, + { + key: ['high users [Duplicate] [Duplicate]', 'high users [Duplicate] [Duplicate]'], + key_as_string: 'high users [Duplicate] [Duplicate]|high users [Duplicate] [Duplicate]', + doc_count: 273, + hostsCountAggregation: { + value: 10, + }, + ruleTags: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'cool', + doc_count: 273, + }, + { + key: 'rule', + doc_count: 273, + }, + ], + }, + description: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'f', + doc_count: 1, + }, + ], + }, + unitsCount: { + value: 273, + }, + severitiesSubAggregation: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'high', + doc_count: 273, + }, + ], + }, + countSeveritySubAggregation: { + value: 1, + }, + usersCountAggregation: { + value: 91, + }, + }, + { + key: ['low users [Duplicate]', 'low users [Duplicate]'], + key_as_string: 'low users [Duplicate]|low users [Duplicate]', + doc_count: 273, + hostsCountAggregation: { + value: 10, + }, + ruleTags: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'cool', + doc_count: 273, + }, + { + key: 'rule', + doc_count: 273, + }, + ], + }, + description: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'f', + doc_count: 1, + }, + ], + }, + unitsCount: { + value: 273, + }, + severitiesSubAggregation: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'low', + doc_count: 273, + }, + ], + }, + countSeveritySubAggregation: { + value: 1, + }, + usersCountAggregation: { + value: 91, + }, + }, + { + key: ['low users [Duplicate] [Duplicate]', 'low users [Duplicate] [Duplicate]'], + key_as_string: 'low users [Duplicate] [Duplicate]|low users [Duplicate] [Duplicate]', + doc_count: 273, + hostsCountAggregation: { + value: 10, + }, + ruleTags: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'cool', + doc_count: 273, + }, + { + key: 'rule', + doc_count: 273, + }, + ], + }, + description: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'f', + doc_count: 1, + }, + ], + }, + unitsCount: { + value: 273, + }, + severitiesSubAggregation: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'low', + doc_count: 273, + }, + ], + }, + countSeveritySubAggregation: { + value: 1, + }, + usersCountAggregation: { + value: 91, + }, + }, + { + key: ['medium users [Duplicate]', 'medium users [Duplicate]'], + key_as_string: 'medium users [Duplicate]|medium users [Duplicate]', + doc_count: 273, + hostsCountAggregation: { + value: 10, + }, + ruleTags: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'cool', + doc_count: 273, + }, + { + key: 'rule', + doc_count: 273, + }, + ], + }, + description: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'f', + doc_count: 1, + }, + ], + }, + unitsCount: { + value: 273, + }, + severitiesSubAggregation: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'medium', + doc_count: 273, + }, + ], + }, + countSeveritySubAggregation: { + value: 1, + }, + usersCountAggregation: { + value: 91, + }, + }, + { + key: ['medium users [Duplicate] [Duplicate]', 'medium users [Duplicate] [Duplicate]'], + key_as_string: + 'medium users [Duplicate] [Duplicate]|medium users [Duplicate] [Duplicate]', + doc_count: 273, + hostsCountAggregation: { + value: 10, + }, + ruleTags: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'cool', + doc_count: 273, + }, + { + key: 'rule', + doc_count: 273, + }, + ], + }, + description: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'f', + doc_count: 1, + }, + ], + }, + unitsCount: { + value: 273, + }, + severitiesSubAggregation: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'medium', + doc_count: 273, + }, + ], + }, + countSeveritySubAggregation: { + value: 1, + }, + usersCountAggregation: { + value: 91, + }, + }, + { + key: ['critical hosts', 'critical hosts'], + key_as_string: 'critical hosts|critical hosts', + doc_count: 100, + hostsCountAggregation: { + value: 30, + }, + ruleTags: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'cool', + doc_count: 100, + }, + { + key: 'rule', + doc_count: 100, + }, + ], + }, + description: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'f', + doc_count: 1, + }, + ], + }, + unitsCount: { + value: 100, + }, + severitiesSubAggregation: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'critical', + doc_count: 100, + }, + ], + }, + countSeveritySubAggregation: { + value: 1, + }, + usersCountAggregation: { + value: 0, + }, + }, + { + key: [ + 'critical hosts [Duplicate] [Duplicate] [Duplicate]', + 'critical hosts [Duplicate] [Duplicate] [Duplicate]', + ], + key_as_string: + 'critical hosts [Duplicate] [Duplicate] [Duplicate]|critical hosts [Duplicate] [Duplicate] [Duplicate]', + doc_count: 100, + hostsCountAggregation: { + value: 30, + }, + ruleTags: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'cool', + doc_count: 100, + }, + { + key: 'rule', + doc_count: 100, + }, + ], + }, + description: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'f', + doc_count: 1, + }, + ], + }, + unitsCount: { + value: 100, + }, + severitiesSubAggregation: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'critical', + doc_count: 100, + }, + ], + }, + countSeveritySubAggregation: { + value: 1, + }, + usersCountAggregation: { + value: 0, + }, + }, + { + key: ['high hosts', 'high hosts'], + key_as_string: 'high hosts|high hosts', + doc_count: 100, + hostsCountAggregation: { + value: 30, + }, + ruleTags: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'cool', + doc_count: 100, + }, + { + key: 'rule', + doc_count: 100, + }, + ], + }, + description: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'f', + doc_count: 1, + }, + ], + }, + unitsCount: { + value: 100, + }, + severitiesSubAggregation: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'high', + doc_count: 100, + }, + ], + }, + countSeveritySubAggregation: { + value: 1, + }, + usersCountAggregation: { + value: 0, + }, + }, + { + key: [ + 'high hosts [Duplicate] [Duplicate] [Duplicate]', + 'high hosts [Duplicate] [Duplicate] [Duplicate]', + ], + key_as_string: + 'high hosts [Duplicate] [Duplicate] [Duplicate]|high hosts [Duplicate] [Duplicate] [Duplicate]', + doc_count: 100, + hostsCountAggregation: { + value: 30, + }, + ruleTags: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'cool', + doc_count: 100, + }, + { + key: 'rule', + doc_count: 100, + }, + ], + }, + description: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'f', + doc_count: 1, + }, + ], + }, + unitsCount: { + value: 100, + }, + severitiesSubAggregation: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'high', + doc_count: 100, + }, + ], + }, + countSeveritySubAggregation: { + value: 1, + }, + usersCountAggregation: { + value: 0, + }, + }, + { + key: ['low hosts ', 'low hosts '], + key_as_string: 'low hosts |low hosts ', + doc_count: 100, + hostsCountAggregation: { + value: 30, + }, + ruleTags: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'cool', + doc_count: 100, + }, + { + key: 'rule', + doc_count: 100, + }, + ], + }, + description: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'f', + doc_count: 1, + }, + ], + }, + unitsCount: { + value: 100, + }, + severitiesSubAggregation: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'low', + doc_count: 100, + }, + ], + }, + countSeveritySubAggregation: { + value: 1, + }, + usersCountAggregation: { + value: 0, + }, + }, + { + key: [ + 'low hosts [Duplicate] [Duplicate] [Duplicate]', + 'low hosts [Duplicate] [Duplicate] [Duplicate]', + ], + key_as_string: + 'low hosts [Duplicate] [Duplicate] [Duplicate]|low hosts [Duplicate] [Duplicate] [Duplicate]', + doc_count: 100, + hostsCountAggregation: { + value: 30, + }, + ruleTags: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'cool', + doc_count: 100, + }, + { + key: 'rule', + doc_count: 100, + }, + ], + }, + description: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'f', + doc_count: 1, + }, + ], + }, + unitsCount: { + value: 100, + }, + severitiesSubAggregation: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'low', + doc_count: 100, + }, + ], + }, + countSeveritySubAggregation: { + value: 1, + }, + usersCountAggregation: { + value: 0, + }, + }, + { + key: ['medium hosts', 'medium hosts'], + key_as_string: 'medium hosts|medium hosts', + doc_count: 100, + hostsCountAggregation: { + value: 30, + }, + ruleTags: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'cool', + doc_count: 100, + }, + { + key: 'rule', + doc_count: 100, + }, + ], + }, + description: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'f', + doc_count: 1, + }, + ], + }, + unitsCount: { + value: 100, + }, + severitiesSubAggregation: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'medium', + doc_count: 100, + }, + ], + }, + countSeveritySubAggregation: { + value: 1, + }, + usersCountAggregation: { + value: 0, + }, + }, + { + key: [ + 'medium hosts [Duplicate] [Duplicate] [Duplicate]', + 'medium hosts [Duplicate] [Duplicate] [Duplicate]', + ], + key_as_string: + 'medium hosts [Duplicate] [Duplicate] [Duplicate]|medium hosts [Duplicate] [Duplicate] [Duplicate]', + doc_count: 100, + hostsCountAggregation: { + value: 30, + }, + ruleTags: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'cool', + doc_count: 100, + }, + { + key: 'rule', + doc_count: 100, + }, + ], + }, + description: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'f', + doc_count: 1, + }, + ], + }, + unitsCount: { + value: 100, + }, + severitiesSubAggregation: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'medium', + doc_count: 100, + }, + ], + }, + countSeveritySubAggregation: { + value: 1, + }, + usersCountAggregation: { + value: 0, + }, + }, + { + key: [ + 'critical users [Duplicate] [Duplicate] [Duplicate]', + 'critical users [Duplicate] [Duplicate] [Duplicate]', + ], + key_as_string: + 'critical users [Duplicate] [Duplicate] [Duplicate]|critical users [Duplicate] [Duplicate] [Duplicate]', + doc_count: 91, + hostsCountAggregation: { + value: 10, + }, + ruleTags: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'cool', + doc_count: 91, + }, + { + key: 'rule', + doc_count: 91, + }, + ], + }, + description: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'f', + doc_count: 1, + }, + ], + }, + unitsCount: { + value: 91, + }, + severitiesSubAggregation: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'critical', + doc_count: 91, + }, + ], + }, + countSeveritySubAggregation: { + value: 1, + }, + usersCountAggregation: { + value: 91, + }, + }, + ], + }, + description: { + doc_count_error_upper_bound: 0, + sum_other_doc_count: 0, + buckets: [ + { + key: 'f', + doc_count: 1, + }, + ], }, - aggregations: { - groupsCount: { - value: 40, - }, - groupByFields: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'Host-f0m6ngo8fo', - doc_count: 75, - rulesCountAggregation: { - value: 3, - }, - unitsCount: { - value: 75, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'critical', - doc_count: 75, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 25, - }, - }, - { - key: 'Host-4aijlqggv8', - doc_count: 63, - rulesCountAggregation: { - value: 3, - }, - unitsCount: { - value: 63, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'critical', - doc_count: 63, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 21, - }, - }, - { - key: 'Host-e50lhbdm91', - doc_count: 51, - rulesCountAggregation: { - value: 3, - }, - unitsCount: { - value: 51, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'critical', - doc_count: 51, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 17, - }, - }, - { - key: 'sqp', - doc_count: 42, - rulesCountAggregation: { - value: 3, - }, - unitsCount: { - value: 42, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'critical', - doc_count: 42, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 0, - }, - }, - { - key: 'sUl', - doc_count: 33, - rulesCountAggregation: { - value: 3, - }, - unitsCount: { - value: 33, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'critical', - doc_count: 33, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 0, - }, - }, - { - key: 'vLJ', - doc_count: 30, - rulesCountAggregation: { - value: 3, - }, - unitsCount: { - value: 30, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'critical', - doc_count: 30, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 0, - }, - }, - { - key: 'Host-n28uwmsqmd', - doc_count: 27, - rulesCountAggregation: { - value: 3, - }, - unitsCount: { - value: 27, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'critical', - doc_count: 27, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 9, - }, - }, - { - key: 'JaE', - doc_count: 27, - rulesCountAggregation: { - value: 3, - }, - unitsCount: { - value: 27, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'critical', - doc_count: 27, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 0, - }, - }, - { - key: 'CUA', - doc_count: 24, - rulesCountAggregation: { - value: 3, - }, - unitsCount: { - value: 24, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'critical', - doc_count: 24, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 0, - }, - }, - { - key: 'FWT', - doc_count: 24, - rulesCountAggregation: { - value: 3, - }, - unitsCount: { - value: 24, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'critical', - doc_count: 24, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 0, - }, - }, - { - key: 'ZqT', - doc_count: 24, - rulesCountAggregation: { - value: 3, - }, - unitsCount: { - value: 24, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'critical', - doc_count: 24, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 0, - }, - }, - { - key: 'mmn', - doc_count: 24, - rulesCountAggregation: { - value: 3, - }, - unitsCount: { - value: 24, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'critical', - doc_count: 24, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 0, - }, - }, - { - key: 'xRS', - doc_count: 24, - rulesCountAggregation: { - value: 3, - }, - unitsCount: { - value: 24, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'critical', - doc_count: 24, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 0, - }, - }, - { - key: 'HiC', - doc_count: 21, - rulesCountAggregation: { - value: 3, - }, - unitsCount: { - value: 21, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'critical', - doc_count: 21, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 0, - }, - }, - { - key: 'Host-d7zbfvl3zz', - doc_count: 21, - rulesCountAggregation: { - value: 3, - }, - unitsCount: { - value: 21, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'critical', - doc_count: 21, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 7, - }, - }, - { - key: 'Nnc', - doc_count: 21, - rulesCountAggregation: { - value: 3, - }, - unitsCount: { - value: 21, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'critical', - doc_count: 21, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 0, - }, - }, - { - key: 'OqH', - doc_count: 21, - rulesCountAggregation: { - value: 3, - }, - unitsCount: { - value: 21, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'critical', - doc_count: 21, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 0, - }, - }, - { - key: 'Vaw', - doc_count: 21, - rulesCountAggregation: { - value: 3, - }, - unitsCount: { - value: 21, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'critical', - doc_count: 21, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 0, - }, - }, - { - key: 'XPg', - doc_count: 21, - rulesCountAggregation: { - value: 3, - }, - unitsCount: { - value: 21, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'critical', - doc_count: 21, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 0, - }, - }, - { - key: 'qBS', - doc_count: 21, - rulesCountAggregation: { - value: 3, - }, - unitsCount: { - value: 21, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'critical', - doc_count: 21, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 0, - }, - }, - { - key: 'rwt', - doc_count: 21, - rulesCountAggregation: { - value: 3, - }, - unitsCount: { - value: 21, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'critical', - doc_count: 21, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 0, - }, - }, - { - key: 'xVJ', - doc_count: 21, - rulesCountAggregation: { - value: 3, - }, - unitsCount: { - value: 21, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'critical', - doc_count: 21, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 0, - }, - }, - { - key: 'Bxg', - doc_count: 18, - rulesCountAggregation: { - value: 3, - }, - unitsCount: { - value: 18, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'critical', - doc_count: 18, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 0, - }, - }, - { - key: 'efP', - doc_count: 18, - rulesCountAggregation: { - value: 3, - }, - unitsCount: { - value: 18, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'critical', - doc_count: 18, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 0, - }, - }, - { - key: 'qcb', - doc_count: 18, - rulesCountAggregation: { - value: 3, - }, - unitsCount: { - value: 18, - }, - severitiesSubAggregation: { - doc_count_error_upper_bound: 0, - sum_other_doc_count: 0, - buckets: [ - { - key: 'critical', - doc_count: 18, - }, - ], - }, - countSeveritySubAggregation: { - value: 1, - }, - usersCountAggregation: { - value: 0, - }, - }, - ], - }, - unitsCount: { - value: 900, - }, + unitsCount: { + value: 6048, }, }, }; diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/grouping_settings/query_builder.test.ts b/x-pack/plugins/security_solution/public/detections/components/alerts_table/grouping_settings/query_builder.test.ts index b4f8568da2c60..0d92882d4c53a 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/grouping_settings/query_builder.test.ts +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/grouping_settings/query_builder.test.ts @@ -15,6 +15,7 @@ describe('getAlertsGroupingQuery', () => { pageIndex: 0, pageSize: 25, runtimeMappings: {}, + selectedGroupEsTypes: ['keyword'], selectedGroup: 'kibana.alert.rule.name', additionalFilters: [ { @@ -60,11 +61,23 @@ describe('getAlertsGroupingQuery', () => { field: 'kibana.alert.uuid', }, }, + description: { + terms: { + field: 'kibana.alert.rule.description', + size: 1, + }, + }, bucket_truncate: { bucket_sort: { from: 0, size: 25, - sort: undefined, + sort: [ + { + unitsCount: { + order: 'desc', + }, + }, + ], }, }, countSeveritySubAggregation: { @@ -98,9 +111,11 @@ describe('getAlertsGroupingQuery', () => { terms: [ { field: 'kibana.alert.rule.name', + missing: '-', }, { - field: 'kibana.alert.rule.description', + field: 'kibana.alert.rule.name', + missing: '--', }, ], }, @@ -152,6 +167,7 @@ describe('getAlertsGroupingQuery', () => { pageIndex: 0, pageSize: 25, runtimeMappings: {}, + selectedGroupEsTypes: ['keyword'], selectedGroup: 'process.name', additionalFilters: [ { @@ -201,7 +217,13 @@ describe('getAlertsGroupingQuery', () => { bucket_sort: { from: 0, size: 25, - sort: undefined, + sort: [ + { + unitsCount: { + order: 'desc', + }, + }, + ], }, }, rulesCountAggregation: { @@ -210,9 +232,18 @@ describe('getAlertsGroupingQuery', () => { }, }, }, - terms: { - field: 'process.name', + multi_terms: { size: 10000, + terms: [ + { + field: 'process.name', + missing: '-', + }, + { + field: 'process.name', + missing: '--', + }, + ], }, }, }, diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/grouping_settings/query_builder.ts b/x-pack/plugins/security_solution/public/detections/components/alerts_table/grouping_settings/query_builder.ts index 921a8d3e3d43f..cde272af8d498 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/grouping_settings/query_builder.ts +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/grouping_settings/query_builder.ts @@ -10,14 +10,6 @@ import type { BoolQuery } from '@kbn/es-query'; import type { NamedAggregation } from '@kbn/securitysolution-grouping'; import { isNoneGroup, getGroupingQuery } from '@kbn/securitysolution-grouping'; -const getGroupFields = (groupValue: string) => { - if (groupValue === 'kibana.alert.rule.name') { - return [groupValue, 'kibana.alert.rule.description']; - } else { - return [groupValue]; - } -}; - interface AlertsGroupingQueryParams { additionalFilters: Array<{ bool: BoolQuery; @@ -27,6 +19,7 @@ interface AlertsGroupingQueryParams { pageSize: number; runtimeMappings: MappingRuntimeFields; selectedGroup: string; + selectedGroupEsTypes: string[]; to: string; } @@ -37,12 +30,13 @@ export const getAlertsGroupingQuery = ({ pageSize, runtimeMappings, selectedGroup, + selectedGroupEsTypes, to, }: AlertsGroupingQueryParams) => getGroupingQuery({ additionalFilters, from, - groupByFields: !isNoneGroup([selectedGroup]) ? getGroupFields(selectedGroup) : [], + groupByField: selectedGroup, statsAggregations: !isNoneGroup([selectedGroup]) ? getAggregationsByGroupField(selectedGroup) : [], @@ -56,7 +50,9 @@ export const getAlertsGroupingQuery = ({ : []), ], runtimeMappings, + selectedGroupEsTypes, size: pageSize, + sort: [{ unitsCount: { order: 'desc' } }], to, }); @@ -74,6 +70,14 @@ const getAggregationsByGroupField = (field: string): NamedAggregation[] => { case 'kibana.alert.rule.name': aggMetrics.push( ...[ + { + description: { + terms: { + field: 'kibana.alert.rule.description', + size: 1, + }, + }, + }, { countSeveritySubAggregation: { cardinality: { diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/grouping_settings/types.ts b/x-pack/plugins/security_solution/public/detections/components/alerts_table/grouping_settings/types.ts index 72d3d95b86789..d271551f83460 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/grouping_settings/types.ts +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/grouping_settings/types.ts @@ -12,6 +12,9 @@ export interface AlertsGroupingAggregation { unitsCount?: { value?: NumberOrNull; }; + description?: { + buckets?: GenericBuckets[]; + }; severitiesSubAggregation?: { buckets?: GenericBuckets[]; }; diff --git a/x-pack/plugins/security_solution/public/detections/components/alerts_table/index.tsx b/x-pack/plugins/security_solution/public/detections/components/alerts_table/index.tsx index 44958844bae18..eb8435d7578be 100644 --- a/x-pack/plugins/security_solution/public/detections/components/alerts_table/index.tsx +++ b/x-pack/plugins/security_solution/public/detections/components/alerts_table/index.tsx @@ -12,6 +12,8 @@ import type { FC } from 'react'; import React, { useRef, useEffect, useState, useCallback, useMemo } from 'react'; import { Storage } from '@kbn/kibana-utils-plugin/public'; import type { AlertsTableStateProps } from '@kbn/triggers-actions-ui-plugin/public/application/sections/alerts_table/alerts_table_state'; +import type { Alert } from '@kbn/triggers-actions-ui-plugin/public/types'; +import { ALERT_BUILDING_BLOCK_TYPE } from '@kbn/rule-data-utils'; import styled from 'styled-components'; import { useDispatch, useSelector } from 'react-redux'; import { getEsQueryConfig } from '@kbn/data-plugin/public'; @@ -49,6 +51,9 @@ import * as i18n from './translations'; const { updateIsLoading, updateTotalCount } = dataTableActions; +// Highlight rows with building block alerts +const shouldHighlightRow = (alert: Alert) => !!alert[ALERT_BUILDING_BLOCK_TYPE]; + const storage = new Storage(localStorage); interface GridContainerProps { @@ -255,6 +260,7 @@ export const AlertsTableComponent: FC = ({ query: finalBoolQuery, showExpandToDetails: false, gridStyle, + shouldHighlightRow, rowHeightsOptions, columns: finalColumns, browserFields: finalBrowserFields, diff --git a/x-pack/plugins/security_solution/public/detections/pages/alerts/alert_details_redirect.test.tsx b/x-pack/plugins/security_solution/public/detections/pages/alerts/alert_details_redirect.test.tsx new file mode 100644 index 0000000000000..60ed09ab4d002 --- /dev/null +++ b/x-pack/plugins/security_solution/public/detections/pages/alerts/alert_details_redirect.test.tsx @@ -0,0 +1,132 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import React from 'react'; +import { render } from '@testing-library/react'; +import { Router } from 'react-router-dom'; +import { AlertDetailsRedirect } from './alert_details_redirect'; +import { + createSecuritySolutionStorageMock, + mockGlobalState, + SUB_PLUGINS_REDUCER, + TestProviders, +} from '../../../common/mock'; +import { createStore } from '../../../common/store'; +import { kibanaObservable } from '@kbn/timelines-plugin/public/mock'; +import { + ALERTS_PATH, + ALERT_DETAILS_REDIRECT_PATH, + DEFAULT_ALERTS_INDEX, +} from '../../../../common/constants'; +import { mockHistory } from '../../../common/utils/route/mocks'; + +jest.mock('../../../common/lib/kibana'); + +const testAlertId = 'test-alert-id'; +jest.mock('react-router-dom', () => ({ + ...jest.requireActual('react-router-dom'), + useParams: () => ({ + alertId: testAlertId, + }), +})); + +const testIndex = '.someTestIndex'; +const testTimestamp = '2023-04-20T12:00:00.000Z'; +const mockPathname = `${ALERT_DETAILS_REDIRECT_PATH}/${testAlertId}`; + +describe('AlertDetailsRedirect', () => { + const { storage } = createSecuritySolutionStorageMock(); + const store = createStore(mockGlobalState, SUB_PLUGINS_REDUCER, kibanaObservable, storage); + afterEach(() => { + mockHistory.replace.mockClear(); + }); + + describe('with index and timestamp query parameters set', () => { + it('redirects to the expected path with the correct query parameters', () => { + const testSearch = `?index=${testIndex}×tamp=${testTimestamp}`; + const historyMock = { + ...mockHistory, + location: { + hash: '', + pathname: mockPathname, + search: testSearch, + state: '', + }, + }; + render( + + + + + + ); + + expect(historyMock.replace).toHaveBeenCalledWith({ + hash: '', + pathname: ALERTS_PATH, + search: `?query=(language:kuery,query:'_id: ${testAlertId}')&timerange=(global:(linkTo:!(timeline,socTrends),timerange:(from:'${testTimestamp}',kind:absolute,to:'2023-04-20T12:05:00.000Z')),timeline:(linkTo:!(global,socTrends),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now/d,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now/d)))&eventFlyout=(panelView:eventDetail,params:(eventId:${testAlertId},indexName:${testIndex}))`, + state: undefined, + }); + }); + }); + + describe('with only index query parameter set', () => { + it('redirects to the expected path with the default global timestamp settings', () => { + const testSearch = `?index=${testIndex}`; + const historyMock = { + ...mockHistory, + location: { + hash: '', + pathname: mockPathname, + search: testSearch, + state: '', + }, + }; + render( + + + + + + ); + + expect(historyMock.replace).toHaveBeenCalledWith({ + hash: '', + pathname: ALERTS_PATH, + search: `?query=(language:kuery,query:'_id: ${testAlertId}')&timerange=(global:(linkTo:!(timeline,socTrends),timerange:(from:'2020-07-07T08:20:18.966Z',kind:absolute,to:'2020-07-08T08:25:18.966Z')),timeline:(linkTo:!(global,socTrends),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now/d,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now/d)))&eventFlyout=(panelView:eventDetail,params:(eventId:${testAlertId},indexName:${testIndex}))`, + state: undefined, + }); + }); + }); + + describe('with no query parameters set', () => { + it('redirects to the expected path with the proper default alerts index and default global timestamp setting', () => { + const historyMock = { + ...mockHistory, + location: { + hash: '', + pathname: mockPathname, + search: '', + state: '', + }, + }; + render( + + + + + + ); + + expect(historyMock.replace).toHaveBeenCalledWith({ + hash: '', + pathname: ALERTS_PATH, + search: `?query=(language:kuery,query:'_id: ${testAlertId}')&timerange=(global:(linkTo:!(timeline,socTrends),timerange:(from:'2020-07-07T08:20:18.966Z',kind:absolute,to:'2020-07-08T08:25:18.966Z')),timeline:(linkTo:!(global,socTrends),timerange:(from:'2020-07-07T08:20:18.966Z',fromStr:now/d,kind:relative,to:'2020-07-08T08:20:18.966Z',toStr:now/d)))&eventFlyout=(panelView:eventDetail,params:(eventId:${testAlertId},indexName:.internal${DEFAULT_ALERTS_INDEX}-default))`, + state: undefined, + }); + }); + }); +}); diff --git a/x-pack/plugins/security_solution/public/detections/pages/alerts/alert_details_redirect.tsx b/x-pack/plugins/security_solution/public/detections/pages/alerts/alert_details_redirect.tsx index c44fcfdd7e509..ec8bf7c1526e3 100644 --- a/x-pack/plugins/security_solution/public/detections/pages/alerts/alert_details_redirect.tsx +++ b/x-pack/plugins/security_solution/public/detections/pages/alerts/alert_details_redirect.tsx @@ -32,9 +32,9 @@ export const AlertDetailsRedirect = () => { // Default to the existing global timerange if we don't get this query param for whatever reason const fromTime = timestamp ?? globalTimerange.from; - // Add 1 millisecond to the alert timestamp as the alert table is non-inclusive of the end time - // So we have to extend slightly beyond the range of the timestamp of the given alert - const toTime = moment(timestamp ?? globalTimerange.to).add('1', 'millisecond'); + // Add 5 minutes to the alert timestamp as the alert table is non-inclusive of the end time + // This also provides padding time if the user clears the `_id` filter after redirect to see other alerts + const toTime = moment(timestamp ?? globalTimerange.to).add('5', 'minutes'); const timerange = encode({ global: { diff --git a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_details_tab_body/index.tsx b/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_details_tab_body/index.tsx index 514fabdb16a96..1bfec441d3642 100644 --- a/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_details_tab_body/index.tsx +++ b/x-pack/plugins/security_solution/public/explore/components/risk_score/risk_details_tab_body/index.tsx @@ -30,7 +30,7 @@ import type { HostRiskScore, UserRiskScore } from '../../../../../common/search_ import { buildEntityNameFilter, RiskScoreEntity } from '../../../../../common/search_strategy'; import type { UsersComponentsQueryProps } from '../../../users/pages/navigation/types'; import type { HostsComponentsQueryProps } from '../../../hosts/pages/navigation/types'; -import { useDashboardButtonHref } from '../../../../common/hooks/use_dashboard_button_href'; +import { useDashboardHref } from '../../../../common/hooks/use_dashboard_href'; import { RiskScoresNoDataDetected } from '../risk_score_onboarding/risk_score_no_data_detected'; const StyledEuiFlexGroup = styled(EuiFlexGroup)` @@ -62,11 +62,7 @@ const RiskDetailsTabBodyComponent: React.FC< : usersSelectors.userRiskScoreSeverityFilterSelector()(state) ); - const { buttonHref } = useDashboardButtonHref({ - to: endDate, - from: startDate, - title: getDashboardTitle(riskEntity), - }); + const buttonHref = useDashboardHref({ title: getDashboardTitle(riskEntity) }); const timerange = useMemo( () => ({ @@ -182,6 +178,8 @@ const RiskDetailsTabBodyComponent: React.FC< isDisabled={!buttonHref} data-test-subj={`risky-${riskEntity}s-view-dashboard-button`} target="_blank" + iconType="popout" + iconSide="right" > {i18n.VIEW_DASHBOARD_BUTTON} diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/mocked_data/isolate.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/mocked_data/isolate.cy.ts index 392e2ed310ccd..4259c3d0b708b 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/mocked_data/isolate.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/mocked_data/isolate.cy.ts @@ -67,7 +67,8 @@ describe('Isolate command', () => { beforeEach(() => { login(); }); - it('should allow filtering endpoint by Isolated status', () => { + // FLAKY: https://github.com/elastic/security-team/issues/6518 + it.skip('should allow filtering endpoint by Isolated status', () => { cy.visit(APP_PATH + getEndpointListPath({ name: 'endpointList' })); closeAllToasts(); filterOutIsolatedHosts(); diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/mocked_data/response_actions.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/mocked_data/response_actions.cy.ts index f98850f8002c8..baca2aec7474d 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/mocked_data/response_actions.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/mocked_data/response_actions.cy.ts @@ -150,7 +150,7 @@ describe('Response actions', () => { cleanupRule(ruleId); }); - // flaky + // FLAKY: https://github.com/elastic/security-team/issues/6518 it.skip('All response action controls are disabled', () => { visitRuleActions(ruleId); cy.getByTestSubj('response-actions-wrapper').within(() => { diff --git a/x-pack/plugins/security_solution/public/management/cypress/tasks/api_fixtures.ts b/x-pack/plugins/security_solution/public/management/cypress/tasks/api_fixtures.ts index 3b8b7cfae6340..708c10ac3cc4d 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/tasks/api_fixtures.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/tasks/api_fixtures.ts @@ -5,7 +5,7 @@ * 2.0. */ -import type { CaseResponse } from '@kbn/cases-plugin/common'; +import type { Case } from '@kbn/cases-plugin/common'; import type { RuleResponse } from '../../../../common/detection_engine/rule_schema'; import { request } from './common'; @@ -69,7 +69,7 @@ export const loadRule = (includeResponseActions = true) => }).then((response) => response.body); export const loadCase = (owner: string) => - request({ + request({ method: 'POST', url: '/api/cases', body: { diff --git a/x-pack/plugins/security_solution/public/overview/components/detection_response/cases_table/use_case_items.ts b/x-pack/plugins/security_solution/public/overview/components/detection_response/cases_table/use_case_items.ts index 5bb453e566ae9..6961fc5fbe90e 100644 --- a/x-pack/plugins/security_solution/public/overview/components/detection_response/cases_table/use_case_items.ts +++ b/x-pack/plugins/security_solution/public/overview/components/detection_response/cases_table/use_case_items.ts @@ -7,8 +7,7 @@ import { useState, useEffect, useMemo } from 'react'; -import type { CaseStatuses } from '@kbn/cases-plugin/common'; -import type { Cases } from '@kbn/cases-plugin/common/ui'; +import type { CaseStatuses, CasesUI } from '@kbn/cases-plugin/common'; import { v4 as uuidv4 } from 'uuid'; import { APP_ID } from '../../../../../common/constants'; @@ -103,7 +102,7 @@ export const useCaseItems: UseCaseItems = ({ skip }) => { return { items, isLoading, updatedAt }; }; -function parseCases(casesResponse: Cases): CaseItem[] { +function parseCases(casesResponse: CasesUI): CaseItem[] { const allCases = casesResponse.cases || []; return allCases.reduce((accumulated, currentCase) => { diff --git a/x-pack/plugins/security_solution/public/timelines/components/flyout/add_to_case_button/index.tsx b/x-pack/plugins/security_solution/public/timelines/components/flyout/add_to_case_button/index.tsx index 5da2a90ce14e4..508f0ffb63a4b 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/flyout/add_to_case_button/index.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/flyout/add_to_case_button/index.tsx @@ -10,7 +10,7 @@ import { EuiButton, EuiContextMenuPanel, EuiContextMenuItem, EuiPopover } from ' import React, { useCallback, useMemo, useState } from 'react'; import { useDispatch } from 'react-redux'; -import type { Case } from '@kbn/cases-plugin/common'; +import type { CaseUI } from '@kbn/cases-plugin/common'; import { APP_ID, APP_UI_ID } from '../../../../../common/constants'; import { timelineSelectors } from '../../../store/timeline'; import { setInsertTimeline, showTimeline } from '../../../store/timeline/actions'; @@ -49,7 +49,7 @@ const AddToCaseButtonComponent: React.FC = ({ timelineId }) => { const [isCaseModalOpen, openCaseModal] = useState(false); const onRowClick = useCallback( - async (theCase?: Case) => { + async (theCase?: CaseUI) => { openCaseModal(false); await navigateToApp(APP_UI_ID, { deepLinkId: SecurityPageName.case, diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/constants.ts b/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/constants.ts index 4b4f3c39628f6..6fdecfb1c1317 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/constants.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/constants.ts @@ -7,6 +7,6 @@ export const MANAGED_USER_INDEX = ['logs-entityanalytics_azure.users-*']; export const MANAGED_USER_PACKAGE_NAME = 'entityanalytics_azure'; -export const INSTALL_INTEGRATION_HREF = `/app/fleet/integrations/${MANAGED_USER_PACKAGE_NAME}/add-integration`; +export const INSTALL_INTEGRATION_HREF = `/detail/${MANAGED_USER_PACKAGE_NAME}/overview`; export const ONE_WEEK_IN_HOURS = 24 * 7; export const MANAGED_USER_QUERY_ID = 'managedUserDetailsQuery'; diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/hooks.ts b/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/hooks.ts index 13d3b07676238..6e197ad52e4ff 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/hooks.ts +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/hooks.ts @@ -117,7 +117,7 @@ export const useManagedUser = (userName: string) => { } }, [from, search, to, userName, isInitializing]); - const { data: installedIntegrations } = useInstalledIntegrations({ + const { data: installedIntegrations, isLoading: loadingIntegrations } = useInstalledIntegrations({ packages: [MANAGED_USER_PACKAGE_NAME], }); @@ -156,7 +156,7 @@ export const useManagedUser = (userName: string) => { return useMemo( () => ({ details: managedUserDetails, - isLoading: loadingManagedUser, + isLoading: loadingManagedUser || loadingIntegrations, isIntegrationEnabled, firstSeen: { date: firstSeen, @@ -167,6 +167,7 @@ export const useManagedUser = (userName: string) => { [ firstSeen, isIntegrationEnabled, + loadingIntegrations, lastSeen, loadingFirstSeen, loadingLastSeen, diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/managed_user.test.tsx b/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/managed_user.test.tsx index fe08629c85367..442252e494800 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/managed_user.test.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/managed_user.test.tsx @@ -78,4 +78,34 @@ describe('ManagedUser', () => { expect(getByTestId('managedUser-data')).toHaveTextContent('123456, 654321'); }); + + it('it renders the call out when the integration is disabled', () => { + const { queryByTestId } = render( + + + + ); + + expect(queryByTestId('managedUser-integration-disable-callout')).toBeInTheDocument(); + }); + + it("it doesn't show the call out when the user is loading", () => { + const { queryByTestId } = render( + + + + ); + + expect(queryByTestId('managedUser-integration-disable-callout')).not.toBeInTheDocument(); + }); }); diff --git a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/managed_user.tsx b/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/managed_user.tsx index 873a7a5bde78a..fd05fb8290509 100644 --- a/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/managed_user.tsx +++ b/x-pack/plugins/security_solution/public/timelines/components/side_panel/new_user_detail/managed_user.tsx @@ -29,6 +29,7 @@ import { FormattedRelativePreferenceDate } from '../../../../common/components/f import type { ManagedUserData } from './types'; import { INSTALL_INTEGRATION_HREF, MANAGED_USER_QUERY_ID, ONE_WEEK_IN_HOURS } from './constants'; import { InspectButton, InspectButtonContainer } from '../../../../common/components/inspect'; +import { useAppUrl } from '../../../../common/lib/kibana'; export const ManagedUser = ({ managedUser, @@ -49,8 +50,14 @@ export const ManagedUser = ({ () => getManagedUserTableColumns(contextID, isDraggable), [isDraggable, contextID] ); + const { getAppUrl } = useAppUrl(); - if (!managedUser.isIntegrationEnabled) { + const installedIntegrationHref = useMemo( + () => getAppUrl({ appId: 'integrations', path: INSTALL_INTEGRATION_HREF }), + [getAppUrl] + ); + + if (!managedUser.isLoading && !managedUser.isIntegrationEnabled) { return ( <> @@ -62,7 +69,7 @@ export const ManagedUser = ({ title={

{i18n.NO_ACTIVE_INTEGRATION_TITLE}

} body={

{i18n.NO_ACTIVE_INTEGRATION_TEXT}

} actions={ - + {i18n.ADD_EXTERNAL_INTEGRATION_BUTTON} } diff --git a/x-pack/plugins/serverless_observability/.gitignore b/x-pack/plugins/serverless_observability/.gitignore new file mode 100644 index 0000000000000..c3dca1b96fcc2 --- /dev/null +++ b/x-pack/plugins/serverless_observability/.gitignore @@ -0,0 +1,2 @@ +/build +/target diff --git a/x-pack/plugins/serverless_observability/README.mdx b/x-pack/plugins/serverless_observability/README.mdx new file mode 100755 index 0000000000000..fa2dde090f4b7 --- /dev/null +++ b/x-pack/plugins/serverless_observability/README.mdx @@ -0,0 +1,3 @@ +# Serverless Observability project plugin + +This plugin contains configuration and code used to create a Serverless Observability project. It leverages universal configuration and other APIs in the [`serverless`](../serverless/README.mdx) plugin to configure Kibana. \ No newline at end of file diff --git a/x-pack/plugins/security_solution/public/common/components/navigation/__mocks__/use_get_url_search.ts b/x-pack/plugins/serverless_observability/common/index.ts similarity index 70% rename from x-pack/plugins/security_solution/public/common/components/navigation/__mocks__/use_get_url_search.ts rename to x-pack/plugins/serverless_observability/common/index.ts index 63a9648da35c6..d6a5ea767034c 100644 --- a/x-pack/plugins/security_solution/public/common/components/navigation/__mocks__/use_get_url_search.ts +++ b/x-pack/plugins/serverless_observability/common/index.ts @@ -5,6 +5,5 @@ * 2.0. */ -import type { SearchNavTab } from '../types'; - -export const useGetUrlSearch = (tab: SearchNavTab) => ''; +export const PLUGIN_ID = 'serverlessObservability'; +export const PLUGIN_NAME = 'serverlessObservability'; diff --git a/x-pack/plugins/serverless_observability/kibana.jsonc b/x-pack/plugins/serverless_observability/kibana.jsonc new file mode 100644 index 0000000000000..12d528dd33ac2 --- /dev/null +++ b/x-pack/plugins/serverless_observability/kibana.jsonc @@ -0,0 +1,22 @@ +{ + "type": "plugin", + "id": "@kbn/serverless-observability", + "owner": "@elastic/appex-sharedux", + "description": "Serverless customizations for observability.", + "plugin": { + "id": "serverlessObservability", + "server": true, + "browser": true, + "configPath": [ + "xpack", + "serverless", + "observability" + ], + "requiredPlugins": [ + "serverless", + "observabilityShared" + ], + "optionalPlugins": [], + "requiredBundles": [] + } +} diff --git a/x-pack/plugins/serverless_observability/package.json b/x-pack/plugins/serverless_observability/package.json new file mode 100644 index 0000000000000..64b310d7eabae --- /dev/null +++ b/x-pack/plugins/serverless_observability/package.json @@ -0,0 +1,11 @@ +{ + "name": "@kbn/serverless-observability", + "version": "1.0.0", + "license": "Elastic License 2.0", + "private": true, + "scripts": { + "build": "yarn plugin-helpers build", + "plugin-helpers": "node ../../../scripts/plugin_helpers", + "kbn": "node ../../../scripts/kbn" + } +} \ No newline at end of file diff --git a/x-pack/plugins/serverless_observability/public/index.ts b/x-pack/plugins/serverless_observability/public/index.ts new file mode 100644 index 0000000000000..a785b68735375 --- /dev/null +++ b/x-pack/plugins/serverless_observability/public/index.ts @@ -0,0 +1,19 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ServerlessObservabilityPlugin } from './plugin'; + +// This exports static code and TypeScript types, +// as well as, Kibana Platform `plugin()` initializer. +export function plugin() { + return new ServerlessObservabilityPlugin(); +} + +export type { + ServerlessObservabilityPluginSetup, + ServerlessObservabilityPluginStart, +} from './types'; diff --git a/x-pack/plugins/serverless_observability/public/plugin.ts b/x-pack/plugins/serverless_observability/public/plugin.ts new file mode 100644 index 0000000000000..48da91bb4ea26 --- /dev/null +++ b/x-pack/plugins/serverless_observability/public/plugin.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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { CoreSetup, CoreStart, Plugin } from '@kbn/core/public'; +import { + ServerlessObservabilityPluginSetup, + ServerlessObservabilityPluginStart, + ServerlessObservabilityPluginSetupDependencies, + ServerlessObservabilityPluginStartDependencies, +} from './types'; + +export class ServerlessObservabilityPlugin + implements Plugin +{ + public setup( + _core: CoreSetup, + _setupDeps: ServerlessObservabilityPluginSetupDependencies + ): ServerlessObservabilityPluginSetup { + return {}; + } + + public start( + _core: CoreStart, + { observabilityShared }: ServerlessObservabilityPluginStartDependencies + ): ServerlessObservabilityPluginStart { + observabilityShared.setIsSidebarEnabled(false); + return {}; + } + + public stop() {} +} diff --git a/x-pack/plugins/serverless_observability/public/types.ts b/x-pack/plugins/serverless_observability/public/types.ts new file mode 100644 index 0000000000000..417a9c1701c84 --- /dev/null +++ b/x-pack/plugins/serverless_observability/public/types.ts @@ -0,0 +1,28 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ServerlessPluginSetup, ServerlessPluginStart } from '@kbn/serverless/public'; +import { + ObservabilitySharedPluginSetup, + ObservabilitySharedPluginStart, +} from '@kbn/observability-shared-plugin/public'; + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface ServerlessObservabilityPluginSetup {} + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface ServerlessObservabilityPluginStart {} + +export interface ServerlessObservabilityPluginSetupDependencies { + observabilityShared: ObservabilitySharedPluginSetup; + serverless: ServerlessPluginSetup; +} + +export interface ServerlessObservabilityPluginStartDependencies { + observabilityShared: ObservabilitySharedPluginStart; + serverless: ServerlessPluginStart; +} diff --git a/x-pack/plugins/serverless_observability/server/config.ts b/x-pack/plugins/serverless_observability/server/config.ts new file mode 100644 index 0000000000000..599a9f2bd7769 --- /dev/null +++ b/x-pack/plugins/serverless_observability/server/config.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { schema, TypeOf } from '@kbn/config-schema'; +import { PluginConfigDescriptor } from '@kbn/core/server'; + +export * from './types'; + +const configSchema = schema.object({ + enabled: schema.boolean({ defaultValue: false }), +}); + +type ConfigType = TypeOf; + +export const config: PluginConfigDescriptor = { + schema: configSchema, +}; + +export type ServerlessObservabilityConfig = TypeOf; diff --git a/x-pack/plugins/serverless_observability/server/index.ts b/x-pack/plugins/serverless_observability/server/index.ts new file mode 100644 index 0000000000000..c45e363a429bf --- /dev/null +++ b/x-pack/plugins/serverless_observability/server/index.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { PluginInitializerContext } from '@kbn/core/server'; + +import { ServerlessObservabilityPlugin } from './plugin'; +export { config } from './config'; + +// This exports static code and TypeScript types, +// as well as, Kibana Platform `plugin()` initializer. + +export function plugin(initializerContext: PluginInitializerContext) { + return new ServerlessObservabilityPlugin(initializerContext); +} + +export type { + ServerlessObservabilityPluginSetup, + ServerlessObservabilityPluginStart, +} from './types'; diff --git a/x-pack/plugins/serverless_observability/server/plugin.ts b/x-pack/plugins/serverless_observability/server/plugin.ts new file mode 100644 index 0000000000000..8b28ba2b0a4ac --- /dev/null +++ b/x-pack/plugins/serverless_observability/server/plugin.ts @@ -0,0 +1,26 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { PluginInitializerContext, Plugin } from '@kbn/core/server'; + +import { ServerlessObservabilityPluginSetup, ServerlessObservabilityPluginStart } from './types'; + +export class ServerlessObservabilityPlugin + implements Plugin +{ + constructor(_initializerContext: PluginInitializerContext) {} + + public setup() { + return {}; + } + + public start() { + return {}; + } + + public stop() {} +} diff --git a/x-pack/plugins/serverless_observability/server/types.ts b/x-pack/plugins/serverless_observability/server/types.ts new file mode 100644 index 0000000000000..f8a587103e886 --- /dev/null +++ b/x-pack/plugins/serverless_observability/server/types.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface ServerlessObservabilityPluginSetup {} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface ServerlessObservabilityPluginStart {} diff --git a/x-pack/plugins/serverless_observability/tsconfig.json b/x-pack/plugins/serverless_observability/tsconfig.json new file mode 100644 index 0000000000000..d3cc73ef6a7a6 --- /dev/null +++ b/x-pack/plugins/serverless_observability/tsconfig.json @@ -0,0 +1,23 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types" + }, + "include": [ + "index.ts", + "common/**/*.ts", + "public/**/*.ts", + "public/**/*.tsx", + "server/**/*.ts", + "../../../typings/**/*" + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/core", + "@kbn/config-schema", + "@kbn/serverless", + "@kbn/observability-shared-plugin", + ] +} diff --git a/x-pack/plugins/serverless_search/.gitignore b/x-pack/plugins/serverless_search/.gitignore new file mode 100644 index 0000000000000..c3dca1b96fcc2 --- /dev/null +++ b/x-pack/plugins/serverless_search/.gitignore @@ -0,0 +1,2 @@ +/build +/target diff --git a/x-pack/plugins/serverless_search/README.mdx b/x-pack/plugins/serverless_search/README.mdx new file mode 100755 index 0000000000000..0b89338e5cae5 --- /dev/null +++ b/x-pack/plugins/serverless_search/README.mdx @@ -0,0 +1,3 @@ +# Serverless Search project plugin + +This plugin contains configuration and code used to create a Serverless Search project. It leverages universal configuration and other APIs in the [`serverless`](../serverless/README.mdx) plugin to configure Kibana. \ No newline at end of file diff --git a/x-pack/plugins/lens/public/shared_components/query_input/index.ts b/x-pack/plugins/serverless_search/common/index.ts similarity index 71% rename from x-pack/plugins/lens/public/shared_components/query_input/index.ts rename to x-pack/plugins/serverless_search/common/index.ts index b2934de916822..539748f2cea38 100644 --- a/x-pack/plugins/lens/public/shared_components/query_input/index.ts +++ b/x-pack/plugins/serverless_search/common/index.ts @@ -5,5 +5,5 @@ * 2.0. */ -export { QueryInput } from './query_input'; -export { validateQuery, isQueryValid } from './helpers'; +export const PLUGIN_ID = 'serverlessSearch'; +export const PLUGIN_NAME = 'serverlessSearch'; diff --git a/x-pack/plugins/serverless_search/kibana.jsonc b/x-pack/plugins/serverless_search/kibana.jsonc new file mode 100644 index 0000000000000..b548823567ce0 --- /dev/null +++ b/x-pack/plugins/serverless_search/kibana.jsonc @@ -0,0 +1,23 @@ +{ + "type": "plugin", + "id": "@kbn/serverless-search", + "owner": "@elastic/appex-sharedux", + "description": "Serverless customizations for search.", + "plugin": { + "id": "serverlessSearch", + "server": true, + "browser": true, + "configPath": [ + "xpack", + "serverless", + "search" + ], + "requiredPlugins": [ + "serverless", + "enterpriseSearch", + "management" + ], + "optionalPlugins": [], + "requiredBundles": [] + } +} diff --git a/x-pack/plugins/serverless_search/package.json b/x-pack/plugins/serverless_search/package.json new file mode 100644 index 0000000000000..b7820231076ee --- /dev/null +++ b/x-pack/plugins/serverless_search/package.json @@ -0,0 +1,11 @@ +{ + "name": "@kbn/serverless-search", + "version": "1.0.0", + "license": "Elastic License 2.0", + "private": true, + "scripts": { + "build": "yarn plugin-helpers build", + "plugin-helpers": "node ../../../scripts/plugin_helpers", + "kbn": "node ../../../scripts/kbn" + } +} diff --git a/x-pack/plugins/serverless_search/public/index.ts b/x-pack/plugins/serverless_search/public/index.ts new file mode 100644 index 0000000000000..5031ccc61d1ac --- /dev/null +++ b/x-pack/plugins/serverless_search/public/index.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ServerlessSearchPlugin } from './plugin'; + +// This exports static code and TypeScript types, +// as well as, Kibana Platform `plugin()` initializer. +export function plugin() { + return new ServerlessSearchPlugin(); +} + +export type { ServerlessSearchPluginSetup, ServerlessSearchPluginStart } from './types'; diff --git a/x-pack/plugins/serverless_search/public/plugin.ts b/x-pack/plugins/serverless_search/public/plugin.ts new file mode 100644 index 0000000000000..62a83cff6f477 --- /dev/null +++ b/x-pack/plugins/serverless_search/public/plugin.ts @@ -0,0 +1,34 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { CoreSetup, CoreStart, Plugin } from '@kbn/core/public'; +import { + ServerlessSearchPluginSetup, + ServerlessSearchPluginSetupDependencies, + ServerlessSearchPluginStart, + ServerlessSearchPluginStartDependencies, +} from './types'; + +export class ServerlessSearchPlugin + implements Plugin +{ + public setup( + _core: CoreSetup, + _setupDeps: ServerlessSearchPluginSetupDependencies + ): ServerlessSearchPluginSetup { + return {}; + } + + public start( + _core: CoreStart, + _startDeps: ServerlessSearchPluginStartDependencies + ): ServerlessSearchPluginStart { + return {}; + } + + public stop() {} +} diff --git a/x-pack/plugins/serverless_search/public/types.ts b/x-pack/plugins/serverless_search/public/types.ts new file mode 100644 index 0000000000000..ad66e6df85c74 --- /dev/null +++ b/x-pack/plugins/serverless_search/public/types.ts @@ -0,0 +1,31 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { ServerlessPluginSetup, ServerlessPluginStart } from '@kbn/serverless/public'; +import { ManagementSetup, ManagementStart } from '@kbn/management-plugin/public'; +import { + EnterpriseSearchPublicSetup, + EnterpriseSearchPublicStart, +} from '@kbn/enterprise-search-plugin/public'; + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface ServerlessSearchPluginSetup {} + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface ServerlessSearchPluginStart {} + +export interface ServerlessSearchPluginSetupDependencies { + enterpriseSearch: EnterpriseSearchPublicSetup; + management: ManagementSetup; + serverless: ServerlessPluginSetup; +} + +export interface ServerlessSearchPluginStartDependencies { + enterpriseSearch: EnterpriseSearchPublicStart; + management: ManagementStart; + serverless: ServerlessPluginStart; +} diff --git a/x-pack/plugins/serverless_search/server/config.ts b/x-pack/plugins/serverless_search/server/config.ts new file mode 100644 index 0000000000000..546c594aaabfb --- /dev/null +++ b/x-pack/plugins/serverless_search/server/config.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { schema, TypeOf } from '@kbn/config-schema'; +import { PluginConfigDescriptor } from '@kbn/core/server'; + +export * from './types'; + +const configSchema = schema.object({ + enabled: schema.boolean({ defaultValue: false }), +}); + +type ConfigType = TypeOf; + +export const config: PluginConfigDescriptor = { + schema: configSchema, +}; + +export type ServerlessSearchConfig = TypeOf; diff --git a/x-pack/plugins/serverless_search/server/index.ts b/x-pack/plugins/serverless_search/server/index.ts new file mode 100644 index 0000000000000..90e0b170d4a71 --- /dev/null +++ b/x-pack/plugins/serverless_search/server/index.ts @@ -0,0 +1,20 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { PluginInitializerContext } from '@kbn/core/server'; + +import { ServerlessSearchPlugin } from './plugin'; +export { config } from './config'; + +// This exports static code and TypeScript types, +// as well as, Kibana Platform `plugin()` initializer. + +export function plugin(initializerContext: PluginInitializerContext) { + return new ServerlessSearchPlugin(initializerContext); +} + +export type { ServerlessSearchPluginSetup, ServerlessSearchPluginStart } from './types'; diff --git a/x-pack/plugins/serverless_search/server/plugin.ts b/x-pack/plugins/serverless_search/server/plugin.ts new file mode 100644 index 0000000000000..99d9bf01da0df --- /dev/null +++ b/x-pack/plugins/serverless_search/server/plugin.ts @@ -0,0 +1,26 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { PluginInitializerContext, Plugin } from '@kbn/core/server'; + +import { ServerlessSearchPluginSetup, ServerlessSearchPluginStart } from './types'; + +export class ServerlessSearchPlugin + implements Plugin +{ + constructor(_initializerContext: PluginInitializerContext) {} + + public setup() { + return {}; + } + + public start() { + return {}; + } + + public stop() {} +} diff --git a/x-pack/plugins/serverless_search/server/types.ts b/x-pack/plugins/serverless_search/server/types.ts new file mode 100644 index 0000000000000..6011e2eb60fa0 --- /dev/null +++ b/x-pack/plugins/serverless_search/server/types.ts @@ -0,0 +1,11 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface ServerlessSearchPluginSetup {} +// eslint-disable-next-line @typescript-eslint/no-empty-interface +export interface ServerlessSearchPluginStart {} diff --git a/x-pack/plugins/serverless_search/tsconfig.json b/x-pack/plugins/serverless_search/tsconfig.json new file mode 100644 index 0000000000000..c8150e5a71926 --- /dev/null +++ b/x-pack/plugins/serverless_search/tsconfig.json @@ -0,0 +1,24 @@ +{ + "extends": "../../../tsconfig.base.json", + "compilerOptions": { + "outDir": "target/types" + }, + "include": [ + "index.ts", + "common/**/*.ts", + "public/**/*.ts", + "public/**/*.tsx", + "server/**/*.ts", + "../../../typings/**/*" + ], + "exclude": [ + "target/**/*" + ], + "kbn_references": [ + "@kbn/core", + "@kbn/config-schema", + "@kbn/enterprise-search-plugin", + "@kbn/management-plugin", + "@kbn/serverless", + ] +} diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/actions_popover.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/actions_popover.tsx index 019a8c3972d65..90822b63dccfa 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/actions_popover.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/actions_popover.tsx @@ -235,7 +235,12 @@ export function ActionsPopover({ }, }, { - name: monitor.isStatusAlertEnabled ? disableAlertLabel : enableMonitorAlertLabel, + name: ( + + {monitor.isStatusAlertEnabled ? disableAlertLabel : enableMonitorAlertLabel} + + ), + disabled: !canEditSynthetics, icon: alertLoading ? ( ) : monitor.isStatusAlertEnabled ? ( diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/metric_item_icon.tsx b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/metric_item_icon.tsx index a1fdf1e734d5c..7534d94ebe1b2 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/metric_item_icon.tsx +++ b/x-pack/plugins/synthetics/public/apps/synthetics/components/monitors_page/overview/overview/metric_item_icon.tsx @@ -27,7 +27,7 @@ import { useRef } from 'react'; import { selectErrorPopoverState, toggleErrorPopoverOpen } from '../../../../state'; import { useErrorDetailsLink } from '../../../common/links/error_details_link'; import { MonitorOverviewItem, OverviewPing } from '../../../../../../../common/runtime_types'; -import { manualTestRunSelector } from '../../../../state/manual_test_runs'; +import { manualTestRunSelector, isTestRunning } from '../../../../state/manual_test_runs'; import { useFormatTestRunAt } from '../../../../utils/monitor_test_result/test_time_formats'; const Container = styled.div` @@ -62,7 +62,7 @@ export const MetricItemIcon = ({ dispatch(toggleErrorPopoverOpen(configIdByLocation)); }; - const inProgress = testNowRun?.status === 'in-progress' || testNowRun?.status === 'loading'; + const inProgress = isTestRunning(testNowRun); const errorLink = useErrorDetailsLink({ configId: monitor.configId, @@ -75,9 +75,11 @@ export const MetricItemIcon = ({ if (inProgress) { return ( - - - + + + + + ); } @@ -164,6 +166,10 @@ const ERROR_DETAILS = i18n.translate('xpack.synthetics.errorDetails.label', { defaultMessage: 'Error details', }); +const TEST_IN_PROGRESS = i18n.translate('xpack.synthetics.inProgress.label', { + defaultMessage: 'Manual test run is in progress.', +}); + const StyledIcon = euiStyled.div<{ boxShadow: string }>` box-sizing: border-box; display: flex; diff --git a/x-pack/plugins/synthetics/public/apps/synthetics/state/manual_test_runs/index.ts b/x-pack/plugins/synthetics/public/apps/synthetics/state/manual_test_runs/index.ts index 9f1d5a3296f00..936efc6ada6ca 100644 --- a/x-pack/plugins/synthetics/public/apps/synthetics/state/manual_test_runs/index.ts +++ b/x-pack/plugins/synthetics/public/apps/synthetics/state/manual_test_runs/index.ts @@ -31,6 +31,9 @@ export enum TestRunStatus { COMPLETED = 'completed', } +export const isTestRunning = (testRun?: ManualTestRun) => + testRun?.status === TestRunStatus.IN_PROGRESS || testRun?.status === TestRunStatus.LOADING; + export interface ManualTestRun { configId: string; name: string; diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/step_define_form.test.tsx b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/step_define_form.test.tsx index beb4020378409..ea19ddad91825 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/step_define_form.test.tsx +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_define/step_define_form.test.tsx @@ -63,7 +63,8 @@ const createMockStorage = () => ({ clear: jest.fn(), }); -describe('Transform: ', () => { +// FLAKY: https://github.com/elastic/kibana/issues/150777 +describe.skip('Transform: ', () => { test('Minimal initialization', async () => { // Arrange const mlSharedImports = await getMlSharedImports(); diff --git a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_details/step_details_form.tsx b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_details/step_details_form.tsx index a983b91e27e40..1c756b242c79f 100644 --- a/x-pack/plugins/transform/public/app/sections/create_transform/components/step_details/step_details_form.tsx +++ b/x-pack/plugins/transform/public/app/sections/create_transform/components/step_details/step_details_form.tsx @@ -278,7 +278,9 @@ export const StepDetailsForm: FC = React.memo( // Reset retention policy settings when the user disables the whole option useEffect(() => { if (!isRetentionPolicyEnabled) { - setRetentionPolicyDateField(isRetentionPolicyAvailable ? dateFieldNames[0] : ''); + setRetentionPolicyDateField( + isRetentionPolicyAvailable ? dataViewAvailableTimeFields[0] : '' + ); setRetentionPolicyMaxAge(''); } // eslint-disable-next-line react-hooks/exhaustive-deps @@ -713,7 +715,7 @@ export const StepDetailsForm: FC = React.memo( )} > ({ text }))} + options={dataViewAvailableTimeFields.map((text: string) => ({ text }))} value={retentionPolicyDateField} onChange={(e) => setRetentionPolicyDateField(e.target.value)} data-test-subj="transformRetentionPolicyDateFieldSelect" diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 5fa53e035d76b..5c3e05fe9671e 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -18728,11 +18728,9 @@ "xpack.lens.breadcrumbsEditInLensFromDashboard": "Conversion de la visualisation {title}", "xpack.lens.chartSwitch.noResults": "Résultats introuvables pour {term}.", "xpack.lens.configure.configurePanelTitle": "{groupLabel}", - "xpack.lens.configure.editConfig": "Modifier la configuration {label}", "xpack.lens.configure.suggestedValuee": "Valeur suggérée : {value}", "xpack.lens.confirmModal.saveDuplicateButtonLabel": "Enregistrer {name}", "xpack.lens.datatable.visualizationOf": "Tableau {operations}", - "xpack.lens.editorFrame.colorIndicatorLabel": "Couleur de cette dimension : {hex}", "xpack.lens.editorFrame.configurationFailureMoreErrors": " +{errors} {errors, plural, one {erreur} other {erreurs}}", "xpack.lens.editorFrame.expressionFailureMessage": "Erreur de requête : {type}, {reason}", "xpack.lens.editorFrame.expressionFailureMessageWithContext": "Erreur de requête : {type}, {reason} dans {context}", @@ -18761,8 +18759,6 @@ "xpack.lens.indexPattern.fieldNoOperation": "Le champ {field} ne peut pas être utilisé sans opération", "xpack.lens.indexPattern.fieldsNotFound": "{count, plural, one {Champ} other {Champs}} {missingFields} {count, plural, one {introuvable} other {introuvables}}.", "xpack.lens.indexPattern.fieldsWrongType": "{count, plural, one {Champ} other {Champs}} {invalidFields} {count, plural, other {}}de type incorrect", - "xpack.lens.indexPattern.filters.queryPlaceholderKql": "{example}", - "xpack.lens.indexPattern.filters.queryPlaceholderLucene": "{example}", "xpack.lens.indexPattern.formulaExpressionNotHandled": "L'opération {operation} dans la formule ne comprend pas les paramètres suivants : {params}", "xpack.lens.indexPattern.formulaExpressionParseError": "La formule {expression} ne peut pas être analysée", "xpack.lens.indexPattern.formulaExpressionWrongType": "Les paramètres de l'opération {operation} dans la formule sont de type incorrect : {params}", @@ -18810,7 +18806,6 @@ "xpack.lens.indexPattern.reducedTimeRangeWithDateHistogram": "Une plage temporelle réduite peut uniquement être utilisée sans histogramme des dates. Retirez la dimension d'histogramme des dates ou retirez la plage temporelle réduite de {column}.", "xpack.lens.indexPattern.reducedTimeRangeWithoutTimefield": "Une plage temporelle réduite peut uniquement être utilisée avec un champ temporel par défaut spécifié dans la vue de données. Utilisez une autre vue de données avec un champ temporel par défaut ou retirez la plage temporelle réduite de {column}.", "xpack.lens.indexPattern.referenceLineDimensionEditorLabel": "Ligne de référence {groupLabel}", - "xpack.lens.indexPattern.removeColumnLabel": "Retirer la configuration de \"{groupLabel}\"", "xpack.lens.indexPattern.standardDeviationOf": "Écart-type de {name}", "xpack.lens.indexPattern.staticValueError": "La valeur statique de {value} n'est pas un nombre valide", "xpack.lens.indexPattern.staticValueLabelWithValue": "Valeur statique : {value}", @@ -18977,9 +18972,6 @@ "xpack.lens.collapse.none": "Aucun", "xpack.lens.collapse.sum": "Somme", "xpack.lens.configPanel.addLayerButton": "Ajouter un calque", - "xpack.lens.configPanel.color.tooltip.auto": "Lens choisit automatiquement des couleurs à votre place sauf si vous spécifiez une couleur personnalisée.", - "xpack.lens.configPanel.color.tooltip.custom": "Effacez la couleur personnalisée pour revenir au mode \"Auto\".", - "xpack.lens.configPanel.color.tooltip.disabled": "Vous ne pouvez pas appliquer de couleurs personnalisées à des séries individuelles lorsque le calque inclut un champ \"Répartir par\".", "xpack.lens.configPanel.experimentalLabel": "Version d'évaluation technique", "xpack.lens.configPanel.selectLayerType": "Sélectionner le type de calque", "xpack.lens.configPanel.selectVisualization": "Sélectionner une visualisation", @@ -18991,7 +18983,6 @@ "xpack.lens.configure.invalidConfigTooltipClick": "Cliquez pour en savoir plus.", "xpack.lens.configure.invalidReferenceLineDimension": "La ligne de référence est affectée à un axe qui n’existe plus. Vous pouvez déplacer cette ligne de référence vers un autre axe disponible ou la supprimer.", "xpack.lens.confirmModal.cancelButtonLabel": "Annuler", - "xpack.lens.customBucketContainer.dragToReorder": "Faire glisser pour réorganiser", "xpack.lens.dashboardLabel": "Tableau de bord", "xpack.lens.datatable.addLayer": "Visualisation", "xpack.lens.datatable.breakdownColumn": "Diviser les indicateurs par", @@ -19015,12 +19006,10 @@ "xpack.lens.dimensionContainer.close": "Fermer", "xpack.lens.dimensionContainer.closeConfiguration": "Fermer la configuration", "xpack.lens.discover.visualizeFieldLegend": "Visualiser le champ", - "xpack.lens.editorFrame.aggregateIndicatorLabel": "Cette dimension n'est pas visible dans le graphique car toutes les valeurs individuelles sont agrégées en une valeur unique", "xpack.lens.editorFrame.applyChanges": "Appliquer les modifications", "xpack.lens.editorFrame.applyChangesLabel": "Appliquer les modifications", "xpack.lens.editorFrame.applyChangesWorkspacePrompt": "Appliquer les modifications pour générer le rendu de la visualisation", "xpack.lens.editorFrame.buildExpressionError": "Une erreur inattendue s'est produite lors de la préparation du graphique", - "xpack.lens.editorFrame.customIconIndicatorLabel": "Cette dimension utilise une icône personnalisée", "xpack.lens.editorFrame.dataFailure": "Une erreur s'est produite lors du chargement des données.", "xpack.lens.editorFrame.dataViewNotFound": "Vue de données introuvable", "xpack.lens.editorFrame.dataViewReconfigure": "Recréez-la dans la page de gestion des vues de données.", @@ -19032,12 +19021,9 @@ "xpack.lens.editorFrame.expressionMissingDatasource": "Impossible de trouver la source de données pour la visualisation", "xpack.lens.editorFrame.expressionMissingVisualizationType": "Type de visualisation non trouvé.", "xpack.lens.editorFrame.goToForums": "Formuler des requêtes et donner un retour", - "xpack.lens.editorFrame.invisibleIndicatorLabel": "Cette dimension n'est pas visible actuellement dans le graphique", "xpack.lens.editorFrame.layerSettingsTitle": "Paramètres du calque", "xpack.lens.editorFrame.networkErrorMessage": "Erreur réseau, réessayez plus tard ou contactez votre administrateur.", - "xpack.lens.editorFrame.noColorIndicatorLabel": "Cette dimension n'a pas de couleur individuelle", "xpack.lens.editorFrame.optionalDimensionLabel": "Facultatif", - "xpack.lens.editorFrame.paletteColorIndicatorLabel": "Cette dimension utilise une palette", "xpack.lens.editorFrame.previewErrorLabel": "L'aperçu du rendu a échoué", "xpack.lens.editorFrame.requiresFieldWarningLabel": "Nécessite un champ.", "xpack.lens.editorFrame.suggestionPanelTitle": "Suggestions", @@ -19064,10 +19050,6 @@ "xpack.lens.fieldFormats.suffix.m": "/m", "xpack.lens.fieldFormats.suffix.s": "/s", "xpack.lens.fieldFormats.suffix.title": "Suffixe", - "xpack.lens.fieldPicker.fieldPlaceholder": "Sélectionner un champ", - "xpack.lens.fieldsBucketContainer.deleteButtonDisabled": "Au moins un élément est requis.", - "xpack.lens.fieldsBucketContainer.dragHandleDisabled": "La réorganisation requiert plusieurs éléments.", - "xpack.lens.fieldsBucketContainer.dragToReorder": "Faire glisser pour réorganiser", "xpack.lens.fittingFunctionsDescription.carry": "Remplit les blancs avec la dernière valeur", "xpack.lens.fittingFunctionsDescription.linear": "Remplit les blancs avec une ligne", "xpack.lens.fittingFunctionsDescription.lookahead": "Remplit les blancs avec la valeur suivante", @@ -19188,7 +19170,6 @@ "xpack.lens.indexPattern.chooseFieldLabel": "Pour utiliser cette fonction, sélectionnez un champ.", "xpack.lens.indexPattern.chooseSubFunction": "Choisir une sous-fonction", "xpack.lens.indexPattern.columnFormatLabel": "Format de valeur", - "xpack.lens.indexPattern.columnLabel": "Nom", "xpack.lens.indexPattern.count": "Décompte", "xpack.lens.indexPattern.count.documentation.quick": "\nNombre total de documents. Lorsque vous fournissez un champ, le nombre total de valeurs de champ est compté. Lorsque vous utilisez la fonction de décompte pour les champs qui comportent plusieurs valeurs dans un même document, toutes les valeurs sont comptées.\n ", "xpack.lens.indexPattern.count.signature": "[champ : chaîne]", @@ -19236,9 +19217,7 @@ "xpack.lens.indexPattern.fieldExploreInDiscover": "Explorer dans Discover", "xpack.lens.indexPattern.fieldPlaceholder": "Champ", "xpack.lens.indexPattern.fieldStatsNoData": "Lens ne peut pas créer de visualisation avec ce champ, car il ne contient pas de données. Pour créer une visualisation, glissez-déposez un autre champ.", - "xpack.lens.indexPattern.filterBy.clickToEdit": "Cliquer pour modifier", "xpack.lens.indexPattern.filterBy.emptyFilterQuery": "(vide)", - "xpack.lens.indexPattern.filterBy.label": "Filtrer par", "xpack.lens.indexPattern.filters": "Filtres", "xpack.lens.indexPattern.filters.addaFilter": "Ajouter un filtre", "xpack.lens.indexPattern.filters.clickToEdit": "Cliquer pour modifier", @@ -19772,7 +19751,6 @@ "xpack.lens.xyChart.legendVisibility.show": "Afficher", "xpack.lens.xyChart.lineColor.label": "Couleur", "xpack.lens.xyChart.lineMarker.auto": "Auto", - "xpack.lens.xyChart.lineMarker.icon": "Décoration de l’icône", "xpack.lens.xyChart.lineMarker.position": "Position de la décoration", "xpack.lens.xyChart.lineMarker.textVisibility.field": "Champ", "xpack.lens.xyChart.lineMarker.textVisibility.name": "Nom", @@ -19795,8 +19773,6 @@ "xpack.lens.xyChart.scaleLinear": "Linéaire", "xpack.lens.xyChart.scaleLog": "Logarithmique", "xpack.lens.xyChart.scaleSquare": "Racine carrée", - "xpack.lens.xyChart.seriesColor.auto": "Auto", - "xpack.lens.xyChart.seriesColor.label": "Couleur de la série", "xpack.lens.xyChart.setScale": "Échelle de l'axe", "xpack.lens.xyChart.showCurrenTimeMarker": "Afficher le repère de temps actuel", "xpack.lens.xyChart.showEnzones": "Afficher les marqueurs de données partielles", @@ -21010,7 +20986,6 @@ "xpack.ml.jobsList.stopDatafeedsConfirmModal.stopButtonLabel": "Arrêter {jobsCount, plural, one {le flux de données} other {les flux de données}}", "xpack.ml.jobsList.stopDatafeedsModal.stopDatafeedsTitle": "Arrêter le flux de données pour {jobsCount, plural, one {{jobId}} other {# tâches}} ?", "xpack.ml.managedJobsWarningCallout": "{jobsCount, plural, one {Cette tâche} other {Au moins l'une de ces tâches}} est préconfigurée par Elastic. Le fait de {jobsCount, plural, one {la} other {les}} {action} peut avoir un impact sur d'autres éléments du produit.", - "xpack.ml.management.jobsList.insufficientLicenseDescription": "Pour utiliser ces fonctionnalités de Machine Learning, vous devez {link}.", "xpack.ml.management.jobsSpacesList.updateSpaces.error": "Erreur lors de la mise à jour de {id}", "xpack.ml.management.syncSavedObjectsFlyout.datafeedsAdded.title": "Objets enregistrés sans flux de données ({count})", "xpack.ml.management.syncSavedObjectsFlyout.datafeedsRemoved.title": "Objets enregistrés avec des ID de flux de données sans correspondance ({count})", @@ -22487,7 +22462,6 @@ "xpack.ml.management.jobsList.accessDeniedTitle": "Accès refusé", "xpack.ml.management.jobsList.analyticsDocsLabel": "Documents de tâches d'analyse", "xpack.ml.management.jobsList.anomalyDetectionDocsLabel": "Documents de tâches de détection des anomalies", - "xpack.ml.management.jobsList.insufficientLicenseDescription.link": "démarrer un essai ou mettre à niveau votre abonnement", "xpack.ml.management.jobsList.insufficientLicenseLabel": "Mettre à niveau pour bénéficier des fonctionnalités d'abonnement", "xpack.ml.management.jobsList.jobsListTagline": "Visualisez, exportez et importez des éléments d'analyse de Machine Learning et de détection des anomalies.", "xpack.ml.management.jobsList.jobsListTitle": "Machine Learning", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index 77b406f88495a..0ed53a0ef38fc 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -18727,11 +18727,9 @@ "xpack.lens.breadcrumbsEditInLensFromDashboard": "{title}ビジュアライゼーションを変換中", "xpack.lens.chartSwitch.noResults": "{term}の結果が見つかりませんでした。", "xpack.lens.configure.configurePanelTitle": "{groupLabel}", - "xpack.lens.configure.editConfig": "{label}構成の編集", "xpack.lens.configure.suggestedValuee": "候補の値:{value}", "xpack.lens.confirmModal.saveDuplicateButtonLabel": "{name}を保存", "xpack.lens.datatable.visualizationOf": "表 {operations}", - "xpack.lens.editorFrame.colorIndicatorLabel": "このディメンションの色:{hex}", "xpack.lens.editorFrame.configurationFailureMoreErrors": " +{errors} {errors, plural, other {エラー}}", "xpack.lens.editorFrame.expressionFailureMessage": "リクエストエラー:{type}、{reason}", "xpack.lens.editorFrame.expressionFailureMessageWithContext": "リクエストエラー:{type}、{context}の{reason}", @@ -18760,8 +18758,6 @@ "xpack.lens.indexPattern.fieldNoOperation": "フィールド{field}は演算なしで使用できません", "xpack.lens.indexPattern.fieldsNotFound": "{count, plural, other {フィールド}}{missingFields}{count, plural, other {が}}見つかりません", "xpack.lens.indexPattern.fieldsWrongType": "{count, plural, other {フィールド}}\"{invalidFields}\"は正しくない型{count, plural, other {です}}", - "xpack.lens.indexPattern.filters.queryPlaceholderKql": "{example}", - "xpack.lens.indexPattern.filters.queryPlaceholderLucene": "{example}", "xpack.lens.indexPattern.formulaExpressionNotHandled": "式{operation}の演算には次のパラメーターがありません:{params}", "xpack.lens.indexPattern.formulaExpressionParseError": "式{expression}を解析できません", "xpack.lens.indexPattern.formulaExpressionWrongType": "式の演算{operation}のパラメーターの型が正しくありません:{params}", @@ -18809,7 +18805,6 @@ "xpack.lens.indexPattern.reducedTimeRangeWithDateHistogram": "時間範囲の縮小は、データヒストグラムなしでのみ使用できます。データヒストグラムディメンションを削除するか、縮小された時間範囲を{column}から削除してください。", "xpack.lens.indexPattern.reducedTimeRangeWithoutTimefield": "時間範囲の縮小は、データビューの指定されたデフォルト時間フィールドでのみ使用できます。デフォルト時間フィールドで別のデータビューを使用するか、縮小された時間範囲を{column}から削除してください。", "xpack.lens.indexPattern.referenceLineDimensionEditorLabel": "{groupLabel}基準線", - "xpack.lens.indexPattern.removeColumnLabel": "\"{groupLabel}\"から構成を削除", "xpack.lens.indexPattern.standardDeviationOf": "{name}の標準偏差", "xpack.lens.indexPattern.staticValueError": "{value}の固定値が有効な数値ではありません", "xpack.lens.indexPattern.staticValueLabelWithValue": "固定値:{value}", @@ -18977,9 +18972,6 @@ "xpack.lens.collapse.none": "なし", "xpack.lens.collapse.sum": "合計", "xpack.lens.configPanel.addLayerButton": "レイヤーを追加", - "xpack.lens.configPanel.color.tooltip.auto": "カスタム色を指定しない場合、Lensは自動的に色を選択します。", - "xpack.lens.configPanel.color.tooltip.custom": "[自動]モードに戻すには、カスタム色をオフにしてください。", - "xpack.lens.configPanel.color.tooltip.disabled": "レイヤーに[内訳の基準]フィールドが含まれている場合は、個別の系列にカスタム色を適用できません。", "xpack.lens.configPanel.experimentalLabel": "テクニカルプレビュー", "xpack.lens.configPanel.selectLayerType": "レイヤータイプを選択", "xpack.lens.configPanel.selectVisualization": "ビジュアライゼーションを選択してください", @@ -18991,7 +18983,6 @@ "xpack.lens.configure.invalidConfigTooltipClick": "詳細はクリックしてください。", "xpack.lens.configure.invalidReferenceLineDimension": "この基準線は存在しない軸に割り当てられています。この基準線を別の使用可能な軸に移動するか、削除することができます。", "xpack.lens.confirmModal.cancelButtonLabel": "キャンセル", - "xpack.lens.customBucketContainer.dragToReorder": "ドラッグして並べ替え", "xpack.lens.dashboardLabel": "ダッシュボード", "xpack.lens.datatable.addLayer": "ビジュアライゼーション", "xpack.lens.datatable.breakdownColumn": "メトリックの分割基準", @@ -19015,12 +19006,10 @@ "xpack.lens.dimensionContainer.close": "閉じる", "xpack.lens.dimensionContainer.closeConfiguration": "構成を閉じる", "xpack.lens.discover.visualizeFieldLegend": "Visualize フィールド", - "xpack.lens.editorFrame.aggregateIndicatorLabel": "すべての個別の値が1つの値に集約されているため、このディメンションはグラフに表示されません", "xpack.lens.editorFrame.applyChanges": "変更を適用", "xpack.lens.editorFrame.applyChangesLabel": "変更を適用", "xpack.lens.editorFrame.applyChangesWorkspacePrompt": "変更を適用してビジュアライゼーションを表示", "xpack.lens.editorFrame.buildExpressionError": "グラフの準備中に予期しないエラーが発生しました", - "xpack.lens.editorFrame.customIconIndicatorLabel": "このディメンションはカスタムアイコンを使用しています", "xpack.lens.editorFrame.dataFailure": "データの読み込み中にエラーが発生しました。", "xpack.lens.editorFrame.dataViewNotFound": "データビューが見つかりません", "xpack.lens.editorFrame.dataViewReconfigure": "データビュー管理ページで再作成します。", @@ -19032,12 +19021,9 @@ "xpack.lens.editorFrame.expressionMissingDatasource": "ビジュアライゼーションのデータソースが見つかりませんでした", "xpack.lens.editorFrame.expressionMissingVisualizationType": "ビジュアライゼーションタイプが見つかりません。", "xpack.lens.editorFrame.goToForums": "リクエストとフィードバック", - "xpack.lens.editorFrame.invisibleIndicatorLabel": "このディメンションは現在グラフに表示されません", "xpack.lens.editorFrame.layerSettingsTitle": "レイヤー設定", "xpack.lens.editorFrame.networkErrorMessage": "ネットワークエラーです。しばらくたってから再試行するか、管理者に連絡してください。", - "xpack.lens.editorFrame.noColorIndicatorLabel": "このディメンションには個別の色がありません", "xpack.lens.editorFrame.optionalDimensionLabel": "オプション", - "xpack.lens.editorFrame.paletteColorIndicatorLabel": "このディメンションはパレットを使用しています", "xpack.lens.editorFrame.previewErrorLabel": "レンダリングのプレビューに失敗しました", "xpack.lens.editorFrame.requiresFieldWarningLabel": "必須フィールド", "xpack.lens.editorFrame.suggestionPanelTitle": "提案", @@ -19064,10 +19050,6 @@ "xpack.lens.fieldFormats.suffix.m": "/m", "xpack.lens.fieldFormats.suffix.s": "/s", "xpack.lens.fieldFormats.suffix.title": "接尾辞", - "xpack.lens.fieldPicker.fieldPlaceholder": "フィールドを選択", - "xpack.lens.fieldsBucketContainer.deleteButtonDisabled": "1つ以上のアイテムが必要です。", - "xpack.lens.fieldsBucketContainer.dragHandleDisabled": "並べ替えには1つ以上のアイテムが必要です。", - "xpack.lens.fieldsBucketContainer.dragToReorder": "ドラッグして並べ替え", "xpack.lens.fittingFunctionsDescription.carry": "ギャップを最後の値で埋める", "xpack.lens.fittingFunctionsDescription.linear": "ギャップを線で埋める", "xpack.lens.fittingFunctionsDescription.lookahead": "ギャップを次の値で埋める", @@ -19188,7 +19170,6 @@ "xpack.lens.indexPattern.chooseFieldLabel": "この関数を使用するには、フィールドを選択してください。", "xpack.lens.indexPattern.chooseSubFunction": "サブ関数を選択", "xpack.lens.indexPattern.columnFormatLabel": "値の形式", - "xpack.lens.indexPattern.columnLabel": "名前", "xpack.lens.indexPattern.count": "カウント", "xpack.lens.indexPattern.count.documentation.quick": "\nドキュメントの総数。フィールドを入力すると、フィールド値の合計数がカウントされます。1つのドキュメントに複数の値があるフィールドでCount関数を使用すると、すべての値がカウントされます。\n ", "xpack.lens.indexPattern.count.signature": "[field: string]", @@ -19236,9 +19217,7 @@ "xpack.lens.indexPattern.fieldExploreInDiscover": "Discoverで探索", "xpack.lens.indexPattern.fieldPlaceholder": "フィールド", "xpack.lens.indexPattern.fieldStatsNoData": "Lensはこのフィールドのビジュアライゼーションを作成できません。フィールドにデータがありません。ビジュアライゼーションを作成するには、別のフィールドをドラッグします。", - "xpack.lens.indexPattern.filterBy.clickToEdit": "クリックして編集", "xpack.lens.indexPattern.filterBy.emptyFilterQuery": "(空)", - "xpack.lens.indexPattern.filterBy.label": "フィルタリング条件", "xpack.lens.indexPattern.filters": "フィルター", "xpack.lens.indexPattern.filters.addaFilter": "フィルターを追加", "xpack.lens.indexPattern.filters.clickToEdit": "クリックして編集", @@ -19772,7 +19751,6 @@ "xpack.lens.xyChart.legendVisibility.show": "表示", "xpack.lens.xyChart.lineColor.label": "色", "xpack.lens.xyChart.lineMarker.auto": "自動", - "xpack.lens.xyChart.lineMarker.icon": "アイコン装飾", "xpack.lens.xyChart.lineMarker.position": "装飾位置", "xpack.lens.xyChart.lineMarker.textVisibility.field": "フィールド", "xpack.lens.xyChart.lineMarker.textVisibility.name": "名前", @@ -19795,8 +19773,6 @@ "xpack.lens.xyChart.scaleLinear": "線形", "xpack.lens.xyChart.scaleLog": "対数", "xpack.lens.xyChart.scaleSquare": "平方根", - "xpack.lens.xyChart.seriesColor.auto": "自動", - "xpack.lens.xyChart.seriesColor.label": "系列色", "xpack.lens.xyChart.setScale": "軸のスケール", "xpack.lens.xyChart.showCurrenTimeMarker": "現在時刻マーカーを表示", "xpack.lens.xyChart.showEnzones": "部分データマーカーを表示", @@ -21001,7 +20977,6 @@ "xpack.ml.jobsList.startDatafeedsModal.startManagedDatafeedsDescription": "{jobsCount, plural, other {これらのジョブのうちの少なくとも1個のジョブ}}はElasticによってあらかじめ構成されています。終了日を指定して{jobsCount, plural, other {それらを}}開始すると、製品の他の部分に影響する可能性があります。", "xpack.ml.jobsList.stopDatafeedsConfirmModal.stopButtonLabel": "{jobsCount, plural, other {データフィード}}を終了", "xpack.ml.managedJobsWarningCallout": "{jobsCount, plural, other {これらのジョブのうちの少なくとも1個のジョブ}}はElasticによってあらかじめ構成されています。{jobsCount, plural, other {それらを}}{action}すると、製品の他の部分に影響する可能性があります。", - "xpack.ml.management.jobsList.insufficientLicenseDescription": "これらの機械学習機能を使用するには、{link}する必要があります。", "xpack.ml.management.jobsSpacesList.updateSpaces.error": "{id}の更新エラー", "xpack.ml.management.syncSavedObjectsFlyout.datafeedsAdded.title": "データフィードがない選択されたオブジェクト({count})", "xpack.ml.management.syncSavedObjectsFlyout.datafeedsRemoved.title": "データフィードIDが一致しない保存されたオブジェクト({count})", @@ -22473,7 +22448,6 @@ "xpack.ml.management.jobsList.accessDeniedTitle": "アクセスが拒否されました", "xpack.ml.management.jobsList.analyticsDocsLabel": "分析ジョブドキュメント", "xpack.ml.management.jobsList.anomalyDetectionDocsLabel": "異常検知ジョブドキュメント", - "xpack.ml.management.jobsList.insufficientLicenseDescription.link": "試用版を開始するか、サブスクリプションをアップグレード", "xpack.ml.management.jobsList.insufficientLicenseLabel": "サブスクリプション機能のアップグレード", "xpack.ml.management.jobsList.jobsListTagline": "機械学習分析と異常検知項目を表示、エクスポート、インポートします。", "xpack.ml.management.jobsList.jobsListTitle": "機械学習", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 0f3fdbdcf15b4..d88f43949ac7c 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -18729,11 +18729,9 @@ "xpack.lens.breadcrumbsEditInLensFromDashboard": "正在转换 {title} 可视化", "xpack.lens.chartSwitch.noResults": "找不到 {term} 的结果。", "xpack.lens.configure.configurePanelTitle": "{groupLabel}", - "xpack.lens.configure.editConfig": "编辑 {label} 配置", "xpack.lens.configure.suggestedValuee": "建议值:{value}", "xpack.lens.confirmModal.saveDuplicateButtonLabel": "保存 {name}", "xpack.lens.datatable.visualizationOf": "表 {operations}", - "xpack.lens.editorFrame.colorIndicatorLabel": "此维度的颜色:{hex}", "xpack.lens.editorFrame.configurationFailureMoreErrors": " +{errors} 个{errors, plural, other {错误}}", "xpack.lens.editorFrame.expressionFailureMessage": "请求错误:{type},{reason}", "xpack.lens.editorFrame.expressionFailureMessageWithContext": "请求错误:{type},{context} 中的 {reason}", @@ -18762,8 +18760,6 @@ "xpack.lens.indexPattern.fieldNoOperation": "没有运算,无法使用字段 {field}", "xpack.lens.indexPattern.fieldsNotFound": "找不到{count, plural, other {字段}} {missingFields} {count, plural, other {}}。", "xpack.lens.indexPattern.fieldsWrongType": "{count, plural, other {字段}} {invalidFields} {count, plural, other {}} 的类型不正确", - "xpack.lens.indexPattern.filters.queryPlaceholderKql": "{example}", - "xpack.lens.indexPattern.filters.queryPlaceholderLucene": "{example}", "xpack.lens.indexPattern.formulaExpressionNotHandled": "公式中的运算 {operation} 缺失以下参数:{params}", "xpack.lens.indexPattern.formulaExpressionParseError": "公式 {expression} 无法解析", "xpack.lens.indexPattern.formulaExpressionWrongType": "公式中运算 {operation} 的参数的类型不正确:{params}", @@ -18811,7 +18807,6 @@ "xpack.lens.indexPattern.reducedTimeRangeWithDateHistogram": "仅在没有 Date Histogram 时才可以使用缩小的时间范围。移除 Date Histogram 维度,或从 {column} 中移除缩小的时间范围。", "xpack.lens.indexPattern.reducedTimeRangeWithoutTimefield": "只能将缩小的时间范围用于数据视图上的指定默认时间字段。使用具有默认时间字段的不同数据视图,或从 {column} 中移除缩小的时间范围。", "xpack.lens.indexPattern.referenceLineDimensionEditorLabel": "{groupLabel} 参考线", - "xpack.lens.indexPattern.removeColumnLabel": "从“{groupLabel}”中删除配置", "xpack.lens.indexPattern.standardDeviationOf": "{name} 的标准偏差", "xpack.lens.indexPattern.staticValueError": "{value} 的静态值不是有效数字", "xpack.lens.indexPattern.staticValueLabelWithValue": "静态值:{value}", @@ -18979,9 +18974,6 @@ "xpack.lens.collapse.none": "无", "xpack.lens.collapse.sum": "求和", "xpack.lens.configPanel.addLayerButton": "添加图层", - "xpack.lens.configPanel.color.tooltip.auto": "Lens 自动为您选取颜色,除非您指定定制颜色。", - "xpack.lens.configPanel.color.tooltip.custom": "清除定制颜色以返回到“自动”模式。", - "xpack.lens.configPanel.color.tooltip.disabled": "图层包括“细分方式”字段时,无法将定制颜色应用于各个序列。", "xpack.lens.configPanel.experimentalLabel": "技术预览", "xpack.lens.configPanel.selectLayerType": "选择图层类型", "xpack.lens.configPanel.selectVisualization": "选择可视化", @@ -18993,7 +18985,6 @@ "xpack.lens.configure.invalidConfigTooltipClick": "单击了解更多详情。", "xpack.lens.configure.invalidReferenceLineDimension": "此参考线分配给了不再存在的轴。您可以将此参考线移到其他可用的轴,或将其移除。", "xpack.lens.confirmModal.cancelButtonLabel": "取消", - "xpack.lens.customBucketContainer.dragToReorder": "拖动以重新排序", "xpack.lens.dashboardLabel": "仪表板", "xpack.lens.datatable.addLayer": "可视化", "xpack.lens.datatable.breakdownColumn": "指标拆分依据", @@ -19017,12 +19008,10 @@ "xpack.lens.dimensionContainer.close": "关闭", "xpack.lens.dimensionContainer.closeConfiguration": "关闭配置", "xpack.lens.discover.visualizeFieldLegend": "可视化字段", - "xpack.lens.editorFrame.aggregateIndicatorLabel": "此维度在图表中不可见,因为所有个体值都聚合到单一值中", "xpack.lens.editorFrame.applyChanges": "应用更改", "xpack.lens.editorFrame.applyChangesLabel": "应用更改", "xpack.lens.editorFrame.applyChangesWorkspacePrompt": "应用更改以呈现可视化", "xpack.lens.editorFrame.buildExpressionError": "准备图表时发生意外错误", - "xpack.lens.editorFrame.customIconIndicatorLabel": "此维度正在使用定制图标", "xpack.lens.editorFrame.dataFailure": "加载数据时出错。", "xpack.lens.editorFrame.dataViewNotFound": "找不到数据视图", "xpack.lens.editorFrame.dataViewReconfigure": "在数据视图管理页面中重新创建。", @@ -19034,12 +19023,9 @@ "xpack.lens.editorFrame.expressionMissingDatasource": "无法找到可视化的数据源", "xpack.lens.editorFrame.expressionMissingVisualizationType": "找不到可视化类型。", "xpack.lens.editorFrame.goToForums": "提出请求并提供反馈", - "xpack.lens.editorFrame.invisibleIndicatorLabel": "此维度当前在图表中不可见", "xpack.lens.editorFrame.layerSettingsTitle": "图层设置", "xpack.lens.editorFrame.networkErrorMessage": "网络错误,请稍后重试或联系管理员。", - "xpack.lens.editorFrame.noColorIndicatorLabel": "此维度没有单独的颜色", "xpack.lens.editorFrame.optionalDimensionLabel": "可选", - "xpack.lens.editorFrame.paletteColorIndicatorLabel": "此维度正在使用调色板", "xpack.lens.editorFrame.previewErrorLabel": "预览呈现失败", "xpack.lens.editorFrame.requiresFieldWarningLabel": "需要字段", "xpack.lens.editorFrame.suggestionPanelTitle": "建议", @@ -19066,10 +19052,6 @@ "xpack.lens.fieldFormats.suffix.m": "/m", "xpack.lens.fieldFormats.suffix.s": "/s", "xpack.lens.fieldFormats.suffix.title": "后缀", - "xpack.lens.fieldPicker.fieldPlaceholder": "选择字段", - "xpack.lens.fieldsBucketContainer.deleteButtonDisabled": "至少需要一个项目。", - "xpack.lens.fieldsBucketContainer.dragHandleDisabled": "重新排序需要多个项目。", - "xpack.lens.fieldsBucketContainer.dragToReorder": "拖动以重新排序", "xpack.lens.fittingFunctionsDescription.carry": "使用最后一个值填充空距", "xpack.lens.fittingFunctionsDescription.linear": "使用线填充空距", "xpack.lens.fittingFunctionsDescription.lookahead": "使用下一个值填充空距", @@ -19190,7 +19172,6 @@ "xpack.lens.indexPattern.chooseFieldLabel": "要使用此函数,请选择字段。", "xpack.lens.indexPattern.chooseSubFunction": "选择子函数", "xpack.lens.indexPattern.columnFormatLabel": "值格式", - "xpack.lens.indexPattern.columnLabel": "名称", "xpack.lens.indexPattern.count": "计数", "xpack.lens.indexPattern.count.documentation.quick": "\n文档总数。提供字段时,将计算字段值的总数。将计数函数用于单个文档中具有多个值的字段时,将对所有值计数。\n ", "xpack.lens.indexPattern.count.signature": "[字段:字符串]", @@ -19238,9 +19219,7 @@ "xpack.lens.indexPattern.fieldExploreInDiscover": "在 Discover 中浏览", "xpack.lens.indexPattern.fieldPlaceholder": "字段", "xpack.lens.indexPattern.fieldStatsNoData": "Lens 无法使用此字段创建可视化,因为其中未包含数据。要创建可视化,请拖放其他字段。", - "xpack.lens.indexPattern.filterBy.clickToEdit": "单击以编辑", "xpack.lens.indexPattern.filterBy.emptyFilterQuery": "(空)", - "xpack.lens.indexPattern.filterBy.label": "筛选依据", "xpack.lens.indexPattern.filters": "筛选", "xpack.lens.indexPattern.filters.addaFilter": "添加筛选", "xpack.lens.indexPattern.filters.clickToEdit": "单击以编辑", @@ -19774,7 +19753,6 @@ "xpack.lens.xyChart.legendVisibility.show": "显示", "xpack.lens.xyChart.lineColor.label": "颜色", "xpack.lens.xyChart.lineMarker.auto": "自动", - "xpack.lens.xyChart.lineMarker.icon": "图标装饰", "xpack.lens.xyChart.lineMarker.position": "装饰位置", "xpack.lens.xyChart.lineMarker.textVisibility.field": "字段", "xpack.lens.xyChart.lineMarker.textVisibility.name": "名称", @@ -19797,8 +19775,6 @@ "xpack.lens.xyChart.scaleLinear": "线性", "xpack.lens.xyChart.scaleLog": "对数", "xpack.lens.xyChart.scaleSquare": "平方根", - "xpack.lens.xyChart.seriesColor.auto": "自动", - "xpack.lens.xyChart.seriesColor.label": "系列颜色", "xpack.lens.xyChart.setScale": "轴刻度", "xpack.lens.xyChart.showCurrenTimeMarker": "显示当前时间标记", "xpack.lens.xyChart.showEnzones": "显示部分数据标记", @@ -21009,7 +20985,6 @@ "xpack.ml.jobsList.stopDatafeedsConfirmModal.stopButtonLabel": "停止{jobsCount, plural, other {数据馈送}}", "xpack.ml.jobsList.stopDatafeedsModal.stopDatafeedsTitle": "停止 {jobsCount, plural, one {{jobId}} other {# 个作业}}的数据馈送?", "xpack.ml.managedJobsWarningCallout": "{jobsCount, plural, one {此作业} other {至少一个此类作业}}由 Elastic 预配置;{action} {jobsCount, plural, one {此作业} other {这些作业}}可能会影响该产品的其他部分。", - "xpack.ml.management.jobsList.insufficientLicenseDescription": "要使用这些 Machine Learning 功能,必须{link}。", "xpack.ml.management.jobsSpacesList.updateSpaces.error": "更新 {id} 时出错", "xpack.ml.management.syncSavedObjectsFlyout.datafeedsAdded.title": "缺失数据馈送的已保存对象 ({count})", "xpack.ml.management.syncSavedObjectsFlyout.datafeedsRemoved.title": "具有不匹配数据馈送 ID 的已保存对象 ({count})", @@ -22486,7 +22461,6 @@ "xpack.ml.management.jobsList.accessDeniedTitle": "访问被拒绝", "xpack.ml.management.jobsList.analyticsDocsLabel": "分析作业文档", "xpack.ml.management.jobsList.anomalyDetectionDocsLabel": "异常检测作业文档", - "xpack.ml.management.jobsList.insufficientLicenseDescription.link": "开始试用或升级您的订阅", "xpack.ml.management.jobsList.insufficientLicenseLabel": "升级以使用订阅功能", "xpack.ml.management.jobsList.jobsListTagline": "查看、导出和导入 Machine Learning 分析和异常检测项目。", "xpack.ml.management.jobsList.jobsListTitle": "Machine Learning", diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/alerts_table.scss b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/alerts_table.scss index fa62ba0307bf0..672ffa2b9d36f 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/alerts_table.scss +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/alerts_table.scss @@ -1,3 +1,7 @@ +.alertsTableHighlightedRow { + background-color: $euiColorHighlight; +} + .alertsTableActiveRow { background-color: tintOrShade($euiColorLightShade, 50%, 0); } diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/alerts_table.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/alerts_table.tsx index e01000507c882..3612beb93102c 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/alerts_table.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/alerts_table.tsx @@ -33,10 +33,8 @@ import { SystemCellId } from './types'; import { SystemCellFactory, systemCells } from './cells'; import { triggersActionsUiQueriesKeys } from '../../hooks/constants'; -export const ACTIVE_ROW_CLASS = 'alertsTableActiveRow'; - const AlertsFlyout = lazy(() => import('./alerts_flyout')); -const GridStyles: EuiDataGridStyle = { +const DefaultGridStyle: EuiDataGridStyle = { border: 'none', header: 'underline', fontSize: 's', @@ -63,7 +61,9 @@ const isSystemCell = (columnId: string): columnId is SystemCellId => { const AlertsTable: React.FunctionComponent = (props: AlertsTableProps) => { const dataGridRef = useRef(null); - const [_, setRowClasses] = useState({}); + const [activeRowClasses, setActiveRowClasses] = useState< + NonNullable + >({}); const alertsData = props.useFetchAlertsData(); const { activePage, @@ -286,11 +286,30 @@ const AlertsTable: React.FunctionComponent = (props: AlertsTab useEffect(() => { // Row classes do not deal with visible row indices, so we need to handle page offset const rowIndex = flyoutAlertIndex + pagination.pageIndex * pagination.pageSize; - setRowClasses({ - [rowIndex]: ACTIVE_ROW_CLASS, + setActiveRowClasses({ + [rowIndex]: 'alertsTableActiveRow', }); }, [flyoutAlertIndex, pagination.pageIndex, pagination.pageSize]); + // Update highlighted rows when alerts or pagination changes + const highlightedRowClasses = useMemo(() => { + let mappedRowClasses: EuiDataGridStyle['rowClasses'] = {}; + const shouldHighlightRowCheck = props.shouldHighlightRow; + if (shouldHighlightRowCheck) { + mappedRowClasses = alerts.reduce>( + (rowClasses, alert, index) => { + if (shouldHighlightRowCheck(alert)) { + rowClasses[index + pagination.pageIndex * pagination.pageSize] = + 'alertsTableHighlightedRow'; + } + return rowClasses; + }, + {} + ); + } + return mappedRowClasses; + }, [props.shouldHighlightRow, alerts, pagination.pageIndex, pagination.pageSize]); + const handleFlyoutClose = useCallback(() => setFlyoutAlertIndex(-1), [setFlyoutAlertIndex]); const renderCellValue = useCallback( @@ -377,6 +396,47 @@ const AlertsTable: React.FunctionComponent = (props: AlertsTab return props.columns; }, [getCellActions, disabledCellActions, props.columns, visibleCellActions]); + // Merges the default grid style with the grid style that comes in through props. + const actualGridStyle = useMemo(() => { + const propGridStyle: NonNullable = props.gridStyle ?? {}; + // Merges default row classes, custom ones and adds the active row class style + const mergedGridStyle: EuiDataGridStyle = { + ...DefaultGridStyle, + ...propGridStyle, + rowClasses: { + // We're spreadind the highlighted row classes first, so that the active + // row classed can override the highlighted row classes. + ...highlightedRowClasses, + ...activeRowClasses, + }, + }; + + // If ANY additional rowClasses have been provided, we need to merge them with our internal ones + if (propGridStyle.rowClasses) { + // Get all row indices with a rowClass. + const mergedKeys = [ + ...Object.keys(mergedGridStyle.rowClasses || {}), + ...Object.keys(propGridStyle.rowClasses || {}), + ]; + // Deduplicate keys to avoid extra iterations + const dedupedKeys = Array.from(new Set(mergedKeys)); + + // For each index, merge row classes + const mergedRowClasses = dedupedKeys.reduce>( + (rowClasses, key) => { + const intKey = parseInt(key, 10); + // Use internal row classes over custom row classes. + rowClasses[intKey] = + mergedGridStyle.rowClasses?.[intKey] || propGridStyle.rowClasses?.[intKey] || ''; + return rowClasses; + }, + {} + ); + mergedGridStyle.rowClasses = mergedRowClasses; + } + return mergedGridStyle; + }, [activeRowClasses, highlightedRowClasses, props.gridStyle]); + return (
@@ -404,7 +464,7 @@ const AlertsTable: React.FunctionComponent = (props: AlertsTab leadingControlColumns={leadingControlColumns} rowCount={alertsCount} renderCellValue={handleRenderCellValue} - gridStyle={{ ...GridStyles, ...(props.gridStyle ?? {}) }} + gridStyle={actualGridStyle} sorting={{ columns: sortingColumns, onSort }} toolbarVisibility={toolbarVisibility} pagination={{ diff --git a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/alerts_table_state.tsx b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/alerts_table_state.tsx index d9353516c6472..e9123776a2144 100644 --- a/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/alerts_table_state.tsx +++ b/x-pack/plugins/triggers_actions_ui/public/application/sections/alerts_table/alerts_table_state.tsx @@ -70,6 +70,10 @@ export type AlertsTableStateProps = { onUpdate?: (args: TableUpdateHandlerArgs) => void; showAlertStatusWithFlapping?: boolean; toolbarVisibility?: EuiDataGridToolBarVisibilityOptions; + /** + * Allows to consumers of the table to decide to highlight a row based on the current alert. + */ + shouldHighlightRow?: (alert: Alert) => boolean; } & Partial; export interface AlertsTableStorage { @@ -138,6 +142,7 @@ const AlertsTableStateWithQueryProvider = ({ onUpdate, showAlertStatusWithFlapping, toolbarVisibility, + shouldHighlightRow, }: AlertsTableStateProps) => { const { cases: casesService } = useKibana<{ cases?: CasesService }>().services; @@ -353,6 +358,7 @@ const AlertsTableStateWithQueryProvider = ({ controls: persistentControls, showInspectButton, toolbarVisibility, + shouldHighlightRow, }), [ alertsTableConfiguration, @@ -380,6 +386,7 @@ const AlertsTableStateWithQueryProvider = ({ persistentControls, showInspectButton, toolbarVisibility, + shouldHighlightRow, ] ); diff --git a/x-pack/plugins/triggers_actions_ui/public/types.ts b/x-pack/plugins/triggers_actions_ui/public/types.ts index 756ea14488fad..4c7d743cb3085 100644 --- a/x-pack/plugins/triggers_actions_ui/public/types.ts +++ b/x-pack/plugins/triggers_actions_ui/public/types.ts @@ -532,6 +532,10 @@ export type AlertsTableProps = { controls?: EuiDataGridToolBarAdditionalControlsOptions; showInspectButton?: boolean; toolbarVisibility?: EuiDataGridToolBarVisibilityOptions; + /** + * Allows to consumers of the table to decide to highlight a row based on the current alert. + */ + shouldHighlightRow?: (alert: Alert) => boolean; } & Partial>; // TODO We need to create generic type between our plugin, right now we have different one because of the old alerts table diff --git a/x-pack/test/api_integration/apis/asset_manager/tests/assets.ts b/x-pack/test/api_integration/apis/asset_manager/tests/assets.ts index d99fdf9a9746b..cda8ef88fcc46 100644 --- a/x-pack/test/api_integration/apis/asset_manager/tests/assets.ts +++ b/x-pack/test/api_integration/apis/asset_manager/tests/assets.ts @@ -5,13 +5,16 @@ * 2.0. */ -import { AssetWithoutTimestamp } from '@kbn/assetManager-plugin/common/types_api'; +import { pick, sortBy } from 'lodash'; + +import { Asset, AssetWithoutTimestamp } from '@kbn/assetManager-plugin/common/types_api'; import expect from '@kbn/expect'; import { FtrProviderContext } from '../../../ftr_provider_context'; import { createSampleAssets, deleteSampleAssets, viewSampleAssetDocs } from '../helpers'; const ASSETS_ENDPOINT = '/api/asset-manager/assets'; -const DIFF_ENDPOINT = ASSETS_ENDPOINT + '/diff'; +const DIFF_ENDPOINT = `${ASSETS_ENDPOINT}/diff`; +const RELATED_ASSETS_ENDPOINT = `${ASSETS_ENDPOINT}/related`; export default function ({ getService }: FtrProviderContext) { const supertest = getService('supertest'); @@ -307,9 +310,252 @@ export default function ({ getService }: FtrProviderContext) { delete asset['@timestamp']; }); - expect(getResponse.body.onlyInA).to.eql(onlyInA); - expect(getResponse.body.onlyInB).to.eql(onlyInB); - expect(getResponse.body.inBoth).to.eql(inBoth); + const sortByEan = (assets: any[]) => sortBy(assets, (asset) => asset['asset.ean']); + expect(sortByEan(getResponse.body.onlyInA)).to.eql(sortByEan(onlyInA)); + expect(sortByEan(getResponse.body.onlyInB)).to.eql(sortByEan(onlyInB)); + expect(sortByEan(getResponse.body.inBoth)).to.eql(sortByEan(inBoth)); + }); + }); + + describe('GET /assets/related', () => { + describe('basic validation of all relations', () => { + const relations = [ + { + name: 'ancestors', + ean: 'k8s.node:node-101', + expectedRelatedEans: ['k8s.cluster:cluster-001'], + }, + { + name: 'descendants', + ean: 'k8s.cluster:cluster-001', + expectedRelatedEans: ['k8s.node:node-101', 'k8s.node:node-102', 'k8s.node:node-103'], + }, + { + name: 'references', + ean: 'k8s.pod:pod-200xrg1', + expectedRelatedEans: ['k8s.cluster:cluster-001'], + }, + ]; + + relations.forEach((relation) => { + it(`should return the ${relation.name} assets`, async () => { + await createSampleAssets(supertest); + + const getResponse = await supertest + .get(RELATED_ASSETS_ENDPOINT) + .query({ + relation: relation.name, + size: sampleAssetDocs.length, + from: 'now-1d', + ean: relation.ean, + maxDistance: 1, + }) + .expect(200); + + const relatedEans = getResponse.body.results[relation.name].map( + (asset: Asset) => asset['asset.ean'] + ); + expect(relatedEans).to.eql(relation.expectedRelatedEans); + }); + }); + }); + + describe('response validation', () => { + it('should return 404 if primary asset not found', async () => { + await supertest + .get(RELATED_ASSETS_ENDPOINT) + .query({ + relation: 'descendants', + size: sampleAssetDocs.length, + from: 'now-1d', + ean: 'non-existing-ean', + maxDistance: 5, + }) + .expect(404); + }); + + it('should return the primary asset', async () => { + await createSampleAssets(supertest); + + const sampleCluster = sampleAssetDocs.find( + (asset) => asset['asset.id'] === 'cluster-002' + ); + + const getResponse = await supertest + .get(RELATED_ASSETS_ENDPOINT) + .query({ + relation: 'descendants', + size: sampleAssetDocs.length, + from: 'now-1d', + ean: sampleCluster!['asset.ean'], + maxDistance: 5, + }) + .expect(200); + + const { + body: { results }, + } = getResponse; + delete results.primary['@timestamp']; + expect(results.primary).to.eql(sampleCluster); + }); + + it('should return empty assets when none matching', async () => { + await createSampleAssets(supertest); + + const sampleCluster = sampleAssetDocs.find( + (asset) => asset['asset.id'] === 'cluster-002' + ); + + const getResponse = await supertest + .get(RELATED_ASSETS_ENDPOINT) + .query({ + relation: 'descendants', + size: sampleAssetDocs.length, + from: 'now-1d', + ean: sampleCluster!['asset.ean'], + maxDistance: 5, + }) + .expect(200); + + const { + body: { results }, + } = getResponse; + expect(results).to.have.property('descendants'); + expect(results.descendants).to.have.length(0); + }); + + it('breaks circular dependency', async () => { + await createSampleAssets(supertest); + + // pods reference a node that references the pods + const sampleNode = sampleAssetDocs.find((asset) => asset['asset.id'] === 'pod-203ugg5'); + + const getResponse = await supertest + .get(RELATED_ASSETS_ENDPOINT) + .query({ + relation: 'references', + size: sampleAssetDocs.length, + from: 'now-1d', + ean: sampleNode!['asset.ean'], + maxDistance: 5, + }) + .expect(200); + + const { + body: { results }, + } = getResponse; + expect( + results.references.map((asset: Asset) => pick(asset, ['asset.ean', 'distance'])) + ).to.eql([ + { 'asset.ean': 'k8s.node:node-203', distance: 1 }, + { 'asset.ean': 'k8s.pod:pod-203ugg9', distance: 2 }, + ]); + }); + }); + + describe('no asset.type filters', () => { + it('should return all descendants of a provided ean at maxDistance 1', async () => { + await createSampleAssets(supertest); + + const sampleCluster = sampleAssetDocs.find( + (asset) => asset['asset.id'] === 'cluster-001' + ); + + const getResponse = await supertest + .get(RELATED_ASSETS_ENDPOINT) + .query({ + relation: 'descendants', + size: sampleAssetDocs.length, + from: 'now-1d', + ean: sampleCluster!['asset.ean'], + maxDistance: 1, + }) + .expect(200); + + const { + body: { results }, + } = getResponse; + expect(results.descendants).to.have.length(3); + expect(results.descendants.every((asset: { distance: number }) => asset.distance === 1)); + }); + + it('should return all descendants of a provided ean at maxDistance 2', async () => { + await createSampleAssets(supertest); + + const sampleCluster = sampleAssetDocs.find( + (asset) => asset['asset.id'] === 'cluster-001' + ); + + const getResponse = await supertest + .get(RELATED_ASSETS_ENDPOINT) + .query({ + relation: 'descendants', + size: sampleAssetDocs.length, + from: 'now-1d', + ean: sampleCluster!['asset.ean'], + maxDistance: 2, + }) + .expect(200); + + const { + body: { results }, + } = getResponse; + expect(results.descendants).to.have.length(12); + }); + }); + + describe('with asset.type filters', () => { + it('should filter by the provided asset type', async () => { + await createSampleAssets(supertest); + + const sampleCluster = sampleAssetDocs.find( + (asset) => asset['asset.id'] === 'cluster-001' + ); + + const getResponse = await supertest + .get(RELATED_ASSETS_ENDPOINT) + .query({ + relation: 'descendants', + size: sampleAssetDocs.length, + from: 'now-1d', + ean: sampleCluster!['asset.ean'], + maxDistance: 1, + type: ['k8s.pod'], + }) + .expect(200); + + const { + body: { results }, + } = getResponse; + expect(results.descendants).to.have.length(0); + }); + + it('should return all descendants of a provided ean at maxDistance 2', async () => { + await createSampleAssets(supertest); + + const sampleCluster = sampleAssetDocs.find( + (asset) => asset['asset.id'] === 'cluster-001' + ); + + const getResponse = await supertest + .get(RELATED_ASSETS_ENDPOINT) + .query({ + relation: 'descendants', + size: sampleAssetDocs.length, + from: 'now-1d', + ean: sampleCluster!['asset.ean'], + maxDistance: 2, + type: ['k8s.pod'], + }) + .expect(200); + + const { + body: { results }, + } = getResponse; + expect(results.descendants).to.have.length(9); + expect(results.descendants.every((asset: { distance: number }) => asset.distance === 2)); + expect(results.descendants.every((asset: Asset) => asset['asset.type'] === 'k8s.pod')); + }); }); }); }); diff --git a/x-pack/test/apm_api_integration/tests/mobile/mobile_location_stats.spec.ts b/x-pack/test/apm_api_integration/tests/mobile/mobile_location_stats.spec.ts index 171b43b1f1a0d..356dbb0a5397b 100644 --- a/x-pack/test/apm_api_integration/tests/mobile/mobile_location_stats.spec.ts +++ b/x-pack/test/apm_api_integration/tests/mobile/mobile_location_stats.spec.ts @@ -96,7 +96,8 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); }); - describe('when filters are applied', () => { + // FAILING: https://github.com/elastic/kibana/issues/156207 + describe.skip('when filters are applied', () => { it('returns empty state for filters', async () => { const response = await getMobileLocationStats({ serviceName: 'synth-android', diff --git a/x-pack/test/apm_api_integration/tests/mobile/mobile_stats.spec.ts b/x-pack/test/apm_api_integration/tests/mobile/mobile_stats.spec.ts index c52c13ea64cae..2517c906c4cb4 100644 --- a/x-pack/test/apm_api_integration/tests/mobile/mobile_stats.spec.ts +++ b/x-pack/test/apm_api_integration/tests/mobile/mobile_stats.spec.ts @@ -98,7 +98,8 @@ export default function ApiTest({ getService }: FtrProviderContext) { }); }); - describe('when filters are applied', () => { + // FAILING: https://github.com/elastic/kibana/issues/156218 + describe.skip('when filters are applied', () => { it('returns empty state for filters', async () => { const response = await getMobileStats({ serviceName: 'synth-android', diff --git a/x-pack/test/cases_api_integration/common/lib/alerts.ts b/x-pack/test/cases_api_integration/common/lib/alerts.ts index c949b805f45d0..be0ee606f503d 100644 --- a/x-pack/test/cases_api_integration/common/lib/alerts.ts +++ b/x-pack/test/cases_api_integration/common/lib/alerts.ts @@ -12,7 +12,7 @@ import { ToolingLog } from '@kbn/tooling-log'; import { DETECTION_ENGINE_QUERY_SIGNALS_URL } from '@kbn/security-solution-plugin/common/constants'; import { DetectionAlert } from '@kbn/security-solution-plugin/common/detection_engine/schemas/alerts'; import { RiskEnrichmentFields } from '@kbn/security-solution-plugin/server/lib/detection_engine/rule_types/utils/enrichments/types'; -import { CaseResponse, CommentType } from '@kbn/cases-plugin/common'; +import { Case, CommentType } from '@kbn/cases-plugin/common'; import { ALERT_CASE_IDS } from '@kbn/rule-data-utils'; import { getRuleForSignalTesting, @@ -199,7 +199,7 @@ export const createCaseAndAttachAlert = async ({ owner: string; alerts: Alerts; getAlerts: (alerts: Alerts) => Promise>>; -}): Promise => { +}): Promise => { const cases = await Promise.all( [...Array(totalCases).keys()].map((index) => createCase( diff --git a/x-pack/test/cases_api_integration/common/lib/api/attachments.ts b/x-pack/test/cases_api_integration/common/lib/api/attachments.ts index 0ead00d99ad10..b5d423309aec8 100644 --- a/x-pack/test/cases_api_integration/common/lib/api/attachments.ts +++ b/x-pack/test/cases_api_integration/common/lib/api/attachments.ts @@ -11,7 +11,7 @@ import { AllCommentsResponse, BulkCreateCommentRequest, BulkGetAttachmentsResponse, - CaseResponse, + Case, CommentPatchRequest, CommentRequest, Comment, @@ -63,7 +63,7 @@ export const createComment = async ({ auth?: { user: User; space: string | null } | null; expectedHttpCode?: number; headers?: Record; -}): Promise => { +}): Promise => { const apiCall = supertest.post( `${getSpaceUrlPrefix(auth?.space)}${CASES_URL}/${caseId}/comments` ); @@ -91,7 +91,7 @@ export const bulkCreateAttachments = async ({ params: BulkCreateCommentRequest; auth?: { user: User; space: string | null }; expectedHttpCode?: number; -}): Promise => { +}): Promise => { const { body: theCase } = await supertest .post( `${getSpaceUrlPrefix(auth.space)}${CASES_INTERNAL_URL}/${caseId}/attachments/_bulk_create` @@ -114,7 +114,7 @@ export const createCaseAndBulkCreateAttachments = async ({ numberOfAttachments?: number; auth?: { user: User; space: string | null }; expectedHttpCode?: number; -}): Promise<{ theCase: CaseResponse; attachments: BulkCreateCommentRequest }> => { +}): Promise<{ theCase: Case; attachments: BulkCreateCommentRequest }> => { const postedCase = await createCase(supertest, postCaseReq); const attachments = getAttachments(numberOfAttachments); const patchedCase = await bulkCreateAttachments({ @@ -247,7 +247,7 @@ export const updateComment = async ({ expectedHttpCode?: number; auth?: { user: User; space: string | null } | null; headers?: Record; -}): Promise => { +}): Promise => { const apiCall = supertest.patch( `${getSpaceUrlPrefix(auth?.space)}${CASES_URL}/${caseId}/comments` ); diff --git a/x-pack/test/cases_api_integration/common/lib/api/case.ts b/x-pack/test/cases_api_integration/common/lib/api/case.ts index 9485ea3a797b7..29e813c9dd7c1 100644 --- a/x-pack/test/cases_api_integration/common/lib/api/case.ts +++ b/x-pack/test/cases_api_integration/common/lib/api/case.ts @@ -6,7 +6,7 @@ */ import { CASES_URL } from '@kbn/cases-plugin/common'; -import { CasePostRequest, CaseResponse } from '@kbn/cases-plugin/common/api'; +import { CasePostRequest, Case } from '@kbn/cases-plugin/common/api'; import type SuperTest from 'supertest'; import { User } from '../authentication/types'; @@ -19,7 +19,7 @@ export const createCase = async ( expectedHttpCode: number = 200, auth: { user: User; space: string | null } | null = { user: superUser, space: null }, headers: Record = {} -): Promise => { +): Promise => { const apiCall = supertest.post(`${getSpaceUrlPrefix(auth?.space)}${CASES_URL}`); setupAuth({ apiCall, headers, auth }); diff --git a/x-pack/test/cases_api_integration/common/lib/api/connectors.ts b/x-pack/test/cases_api_integration/common/lib/api/connectors.ts index eee179df52d2b..0a2b00b7acbb1 100644 --- a/x-pack/test/cases_api_integration/common/lib/api/connectors.ts +++ b/x-pack/test/cases_api_integration/common/lib/api/connectors.ts @@ -15,7 +15,7 @@ import { CaseConnector, ConnectorTypes, CasePostRequest, - CaseResponse, + Case, GetCaseConnectorsResponse, getCaseConnectorsUrl, } from '@kbn/cases-plugin/common/api'; @@ -219,7 +219,7 @@ export const createCaseWithConnector = async ({ createCaseReq?: CasePostRequest; headers?: Record; }): Promise<{ - postedCase: CaseResponse; + postedCase: Case; connector: CreateConnectorResponse; configuration: CasesConfigureResponse; }> => { diff --git a/x-pack/test/cases_api_integration/common/lib/api/index.ts b/x-pack/test/cases_api_integration/common/lib/api/index.ts index 88fe7a1482379..a4358cc87358b 100644 --- a/x-pack/test/cases_api_integration/common/lib/api/index.ts +++ b/x-pack/test/cases_api_integration/common/lib/api/index.ts @@ -27,9 +27,9 @@ import { } from '@kbn/cases-plugin/common/constants'; import { CasesConfigureResponse, - CaseResponse, + Case, CaseStatuses, - CasesResponse, + Cases, CasesFindResponse, CasesPatchRequest, CasesConfigurePatch, @@ -45,9 +45,9 @@ import { } from '@kbn/cases-plugin/common/api'; import { SignalHit } from '@kbn/security-solution-plugin/server/lib/detection_engine/rule_types/types'; import { ActionResult } from '@kbn/actions-plugin/server/types'; -import { ESCasesConfigureAttributes } from '@kbn/cases-plugin/server/services/configure/types'; -import { ESCaseAttributes } from '@kbn/cases-plugin/server/services/cases/types'; +import { CasePersistedAttributes } from '@kbn/cases-plugin/server/common/types/case'; import type { SavedObjectsRawDocSource } from '@kbn/core/server'; +import type { ConfigurePersistedAttributes } from '@kbn/cases-plugin/server/common/types/configure'; import { User } from '../authentication/types'; import { superUser } from '../authentication/users'; import { getSpaceUrlPrefix, setupAuth } from './helpers'; @@ -130,8 +130,8 @@ export const setStatus = async ({ }: { supertest: SuperTest.SuperTest; cases: SetStatusCasesParams[]; -}): Promise => { - const { body }: { body: CasesResponse } = await supertest +}): Promise => { + const { body }: { body: Cases } = await supertest .patch(CASES_URL) .set('kbn-xsrf', 'true') .send({ cases }) @@ -312,7 +312,7 @@ export const getConnectorMappingsFromES = async ({ es }: { es: Client }) => { }; interface ConfigureSavedObject { - 'cases-configure': ESCasesConfigureAttributes; + 'cases-configure': ConfigurePersistedAttributes; } /** @@ -343,7 +343,7 @@ export const getConfigureSavedObjectsFromES = async ({ es }: { es: Client }) => export const getCaseSavedObjectsFromES = async ({ es }: { es: Client }) => { const cases: TransportResult< - estypes.SearchResponse<{ cases: ESCaseAttributes }>, + estypes.SearchResponse<{ cases: CasePersistedAttributes }>, unknown > = await es.search( { @@ -366,7 +366,7 @@ export const getCaseSavedObjectsFromES = async ({ es }: { es: Client }) => { export const getCaseCommentSavedObjectsFromES = async ({ es }: { es: Client }) => { const comments: TransportResult< - estypes.SearchResponse<{ ['cases-comments']: ESCaseAttributes }>, + estypes.SearchResponse<{ ['cases-comments']: CasePersistedAttributes }>, unknown > = await es.search( { @@ -389,7 +389,7 @@ export const getCaseCommentSavedObjectsFromES = async ({ es }: { es: Client }) = export const getCaseUserActionsSavedObjectsFromES = async ({ es }: { es: Client }) => { const userActions: TransportResult< - estypes.SearchResponse<{ ['cases-user-actions']: ESCaseAttributes }>, + estypes.SearchResponse<{ ['cases-user-actions']: CasePersistedAttributes }>, unknown > = await es.search( { @@ -422,7 +422,7 @@ export const updateCase = async ({ expectedHttpCode?: number; auth?: { user: User; space: string | null } | null; headers?: Record; -}): Promise => { +}): Promise => { const apiCall = supertest.patch(`${getSpaceUrlPrefix(auth?.space)}${CASES_URL}`); setupAuth({ apiCall, headers, auth }); @@ -514,7 +514,7 @@ export const getCase = async ({ includeComments?: boolean; expectedHttpCode?: number; auth?: { user: User; space: string | null }; -}): Promise => { +}): Promise => { const { body: theCase } = await supertest .get( `${getSpaceUrlPrefix(auth?.space)}${CASES_URL}/${caseId}?includeComments=${includeComments}` @@ -674,7 +674,7 @@ export const pushCase = async ({ expectedHttpCode?: number; auth?: { user: User; space: string | null } | null; headers?: Record; -}): Promise => { +}): Promise => { const apiCall = supertest.post( `${getSpaceUrlPrefix(auth?.space)}${CASES_URL}/${caseId}/connector/${connectorId}/_push` ); diff --git a/x-pack/test/cases_api_integration/common/lib/api/omit.ts b/x-pack/test/cases_api_integration/common/lib/api/omit.ts index b543ebff837fb..ea974f8357453 100644 --- a/x-pack/test/cases_api_integration/common/lib/api/omit.ts +++ b/x-pack/test/cases_api_integration/common/lib/api/omit.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { CaseResponse, Comment } from '@kbn/cases-plugin/common/api'; +import { Case, Comment } from '@kbn/cases-plugin/common/api'; import { omit } from 'lodash'; interface CommonSavedObjectAttributes { @@ -36,10 +36,8 @@ export const removeServerGeneratedPropertiesFromSavedObject = < ]); }; -export const removeServerGeneratedPropertiesFromCase = ( - theCase: CaseResponse -): Partial => { - return removeServerGeneratedPropertiesFromSavedObject(theCase, ['closed_at']); +export const removeServerGeneratedPropertiesFromCase = (theCase: Case): Partial => { + return removeServerGeneratedPropertiesFromSavedObject(theCase, ['closed_at']); }; export const removeServerGeneratedPropertiesFromComments = ( diff --git a/x-pack/test/cases_api_integration/common/lib/mock.ts b/x-pack/test/cases_api_integration/common/lib/mock.ts index eb3ebb805af9b..16355aca51c76 100644 --- a/x-pack/test/cases_api_integration/common/lib/mock.ts +++ b/x-pack/test/cases_api_integration/common/lib/mock.ts @@ -7,7 +7,7 @@ import { CasePostRequest, - CaseResponse, + Case, CasesFindResponse, Comment, ConnectorTypes, @@ -161,7 +161,7 @@ export const persistableStateAttachment: CommentRequestPersistableStateType = { export const postCaseResp = ( id?: string | null, req: CasePostRequest = postCaseReq -): Partial => ({ +): Partial => ({ ...req, ...(id != null ? { id } : {}), comments: [], diff --git a/x-pack/test/cases_api_integration/common/lib/validation.ts b/x-pack/test/cases_api_integration/common/lib/validation.ts index e022beb5a597a..dd1ca12a2db15 100644 --- a/x-pack/test/cases_api_integration/common/lib/validation.ts +++ b/x-pack/test/cases_api_integration/common/lib/validation.ts @@ -8,7 +8,7 @@ import expect from '@kbn/expect'; import { AttachmentTotals, - CaseResponse, + Case, CasesByAlertId, RelatedCaseInfo, } from '@kbn/cases-plugin/common/api'; @@ -17,7 +17,7 @@ import { xorWith, isEqual } from 'lodash'; type AttachmentTotalsKeys = keyof AttachmentTotals; export interface TestCaseWithTotals { - caseInfo: CaseResponse; + caseInfo: Case; totals?: Partial; } diff --git a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/alerts/get_cases.ts b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/alerts/get_cases.ts index ba3ad76740d29..07ea283247d91 100644 --- a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/alerts/get_cases.ts +++ b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/alerts/get_cases.ts @@ -7,7 +7,7 @@ import expect from '@kbn/expect'; import { CASES_URL } from '@kbn/cases-plugin/common/constants'; -import { CaseResponse } from '@kbn/cases-plugin/common/api'; +import { Case } from '@kbn/cases-plugin/common/api'; import { FtrProviderContext } from '../../../../common/ftr_provider_context'; import { @@ -71,14 +71,14 @@ export default ({ getService }: FtrProviderContext): void => { // if there are more than 100 responses, the implementation sets the aggregation size to the // specific value const numCases = 102; - const createCasePromises: Array> = []; + const createCasePromises: Array> = []; for (let i = 0; i < numCases; i++) { createCasePromises.push(createCase(supertest, getPostCaseRequest())); } const cases = await Promise.all(createCasePromises); - const commentPromises: Array> = []; + const commentPromises: Array> = []; for (const caseInfo of cases) { commentPromises.push( createComment({ supertest, caseId: caseInfo.id, params: postCommentAlertReq }) diff --git a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/find_cases.ts b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/find_cases.ts index c0e6322f638e5..38893e313a11f 100644 --- a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/find_cases.ts +++ b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/find_cases.ts @@ -9,13 +9,8 @@ import { v1 as uuidv1 } from 'uuid'; import expect from '@kbn/expect'; import { CASES_URL } from '@kbn/cases-plugin/common/constants'; +import { Case, CaseSeverity, CaseStatuses, CommentType } from '@kbn/cases-plugin/common/api'; import { ALERTING_CASES_SAVED_OBJECT_INDEX } from '@kbn/core-saved-objects-server'; -import { - CaseResponse, - CaseSeverity, - CaseStatuses, - CommentType, -} from '@kbn/cases-plugin/common/api'; import { FtrProviderContext } from '../../../../common/ftr_provider_context'; import { @@ -243,7 +238,7 @@ export default ({ getService }: FtrProviderContext): void => { const postedCase = await createCase(supertest, postCaseReq); // all fields that contain the UserRt definition must be included here (aka created_by, closed_by, and updated_by) // see https://github.com/elastic/kibana/issues/139503 - const queryFields: Array> = [ + const queryFields: Array> = [ ['title', 'created_by', 'closed_by', 'updated_by'], ['title', 'description', 'created_by', 'closed_by', 'updated_by'], ]; @@ -501,7 +496,7 @@ export default ({ getService }: FtrProviderContext): void => { await deleteAllCaseItems(es); }); - const createCasesWithTitleAsNumber = async (total: number): Promise => { + const createCasesWithTitleAsNumber = async (total: number): Promise => { const responsePromises = []; for (let i = 0; i < total; i++) { // this doesn't guarantee that the cases will be created in order that the for-loop executes, diff --git a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/import_export.ts b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/import_export.ts index 1f21ca98c08d0..4f96aed515793 100644 --- a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/import_export.ts +++ b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/import_export.ts @@ -28,7 +28,10 @@ import { CaseSeverity, CaseUserActionAttributesWithoutConnectorId, } from '@kbn/cases-plugin/common/api'; -import { ESCaseSeverity, ESCaseStatus } from '@kbn/cases-plugin/server/services/cases/types'; +import { + CasePersistedSeverity, + CasePersistedStatus, +} from '@kbn/cases-plugin/server/common/types/case'; import { ObjectRemover as ActionsRemover } from '../../../../../alerting_api_integration/common/lib'; import { deleteAllCaseItems, @@ -211,8 +214,8 @@ const expectExportToHaveCaseSavedObject = ( expect(createdCaseSO.attributes.connector.name).to.eql(caseRequest.connector.name); expect(createdCaseSO.attributes.connector.fields).to.eql([]); expect(createdCaseSO.attributes.settings).to.eql(caseRequest.settings); - expect(createdCaseSO.attributes.status).to.eql(ESCaseStatus.OPEN); - expect(createdCaseSO.attributes.severity).to.eql(ESCaseSeverity.LOW); + expect(createdCaseSO.attributes.status).to.eql(CasePersistedStatus.OPEN); + expect(createdCaseSO.attributes.severity).to.eql(CasePersistedSeverity.LOW); expect(createdCaseSO.attributes.duration).to.eql(null); expect(createdCaseSO.attributes.tags).to.eql(caseRequest.tags); }; diff --git a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/migrations.ts b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/migrations.ts index a63e1b3be5c67..f908e90c58afb 100644 --- a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/migrations.ts +++ b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/migrations.ts @@ -8,7 +8,10 @@ import expect from '@kbn/expect'; import { CASES_URL, SECURITY_SOLUTION_OWNER } from '@kbn/cases-plugin/common/constants'; import { AttributesTypeUser } from '@kbn/cases-plugin/common/api'; -import { ESCaseSeverity, ESCaseStatus } from '@kbn/cases-plugin/server/services/cases/types'; +import { + CasePersistedSeverity, + CasePersistedStatus, +} from '@kbn/cases-plugin/server/common/types/case'; import { FtrProviderContext } from '../../../../../common/ftr_provider_context'; import { deleteAllCaseItems, @@ -499,11 +502,11 @@ export default function createGetTests({ getService }: FtrProviderContext) { describe('severity', () => { it('severity keyword values are converted to matching short', async () => { - const expectedSeverityValues: Record = { - 'cases:063d5820-1284-11ed-81af-63a2bdfb2bf6': ESCaseSeverity.LOW, - 'cases:063d5820-1284-11ed-81af-63a2bdfb2bf7': ESCaseSeverity.MEDIUM, - 'cases:063d5820-1284-11ed-81af-63a2bdfb2bf8': ESCaseSeverity.HIGH, - 'cases:063d5820-1284-11ed-81af-63a2bdfb2bf9': ESCaseSeverity.CRITICAL, + const expectedSeverityValues: Record = { + 'cases:063d5820-1284-11ed-81af-63a2bdfb2bf6': CasePersistedSeverity.LOW, + 'cases:063d5820-1284-11ed-81af-63a2bdfb2bf7': CasePersistedSeverity.MEDIUM, + 'cases:063d5820-1284-11ed-81af-63a2bdfb2bf8': CasePersistedSeverity.HIGH, + 'cases:063d5820-1284-11ed-81af-63a2bdfb2bf9': CasePersistedSeverity.CRITICAL, }; const casesFromES = await getCaseSavedObjectsFromES({ es }); @@ -518,11 +521,11 @@ export default function createGetTests({ getService }: FtrProviderContext) { describe('status', () => { it('status keyword values are converted to matching short', async () => { - const expectedStatusValues: Record = { - 'cases:063d5820-1284-11ed-81af-63a2bdfb2bf6': ESCaseStatus.OPEN, - 'cases:063d5820-1284-11ed-81af-63a2bdfb2bf7': ESCaseStatus.OPEN, - 'cases:063d5820-1284-11ed-81af-63a2bdfb2bf8': ESCaseStatus.IN_PROGRESS, - 'cases:063d5820-1284-11ed-81af-63a2bdfb2bf9': ESCaseStatus.CLOSED, + const expectedStatusValues: Record = { + 'cases:063d5820-1284-11ed-81af-63a2bdfb2bf6': CasePersistedStatus.OPEN, + 'cases:063d5820-1284-11ed-81af-63a2bdfb2bf7': CasePersistedStatus.OPEN, + 'cases:063d5820-1284-11ed-81af-63a2bdfb2bf8': CasePersistedStatus.IN_PROGRESS, + 'cases:063d5820-1284-11ed-81af-63a2bdfb2bf9': CasePersistedStatus.CLOSED, }; const casesFromES = await getCaseSavedObjectsFromES({ es }); diff --git a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/patch_cases.ts b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/patch_cases.ts index 8f784d2e9c697..34b4c0dbaa019 100644 --- a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/patch_cases.ts +++ b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/cases/patch_cases.ts @@ -11,7 +11,7 @@ import { ALERT_WORKFLOW_STATUS } from '@kbn/rule-data-utils'; import { DETECTION_ENGINE_QUERY_SIGNALS_URL } from '@kbn/security-solution-plugin/common/constants'; import { CaseSeverity, - CasesResponse, + Cases, CaseStatuses, CommentType, ConnectorTypes, @@ -597,7 +597,7 @@ export default ({ getService }: FtrProviderContext): void => { ); // does NOT updates alert status when the status is updated and syncAlerts=false - const updatedIndWithStatus: CasesResponse = (await setStatus({ + const updatedIndWithStatus: Cases = (await setStatus({ supertest, cases: [ { @@ -611,7 +611,7 @@ export default ({ getService }: FtrProviderContext): void => { status: CaseStatuses['in-progress'], }, ], - })) as CasesResponse; + })) as Cases; await es.indices.refresh({ index: defaultSignalsIndex }); @@ -730,7 +730,7 @@ export default ({ getService }: FtrProviderContext): void => { signals.get(signalsIndex2)?.get(signalIDInSecondIndex)?._source?.signal?.status ).to.be(CaseStatuses.open); - const updatedIndWithStatus: CasesResponse = (await setStatus({ + const updatedIndWithStatus: Cases = (await setStatus({ supertest, cases: [ { @@ -739,7 +739,7 @@ export default ({ getService }: FtrProviderContext): void => { status: CaseStatuses.closed, }, ], - })) as CasesResponse; + })) as Cases; await es.indices.refresh({ index: defaultSignalsIndex }); await es.indices.refresh({ index: signalsIndex2 }); diff --git a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/client/update_alert_status.ts b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/client/update_alert_status.ts index 6926b3e088ad1..be47e250c7a9f 100644 --- a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/client/update_alert_status.ts +++ b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/client/update_alert_status.ts @@ -6,7 +6,7 @@ */ import expect from '@kbn/expect'; -import { CasesResponse, CaseStatuses, CommentType } from '@kbn/cases-plugin/common/api'; +import { Cases, CaseStatuses, CommentType } from '@kbn/cases-plugin/common/api'; import { FtrProviderContext } from '../../../../common/ftr_provider_context'; import { postCaseReq } from '../../../../common/lib/mock'; @@ -96,7 +96,7 @@ export default ({ getService }: FtrProviderContext): void => { // does NOT updates alert status when the status is updated and syncAlerts=false // this performs the cases update through the test plugin that leverages the cases client instead // of going through RESTful API of the cases plugin - const { body: updatedIndWithStatus }: { body: CasesResponse } = await supertest + const { body: updatedIndWithStatus }: { body: Cases } = await supertest .patch('/api/cases_user/cases') .set('kbn-xsrf', 'true') .send({ diff --git a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/internal/bulk_create_attachments.ts b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/internal/bulk_create_attachments.ts index a26031124ca45..74b2799d232ac 100644 --- a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/internal/bulk_create_attachments.ts +++ b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/internal/bulk_create_attachments.ts @@ -11,7 +11,7 @@ import { ALERT_CASE_IDS, ALERT_WORKFLOW_STATUS } from '@kbn/rule-data-utils'; import { BulkCreateCommentRequest, - CaseResponse, + Case, CaseStatuses, CommentRequestExternalReferenceSOType, CommentType, @@ -80,7 +80,7 @@ export default ({ getService }: FtrProviderContext): void => { const log = getService('log'); const validateCommentsIgnoringOrder = ( - comments: CaseResponse['comments'], + comments: Case['comments'], attachments: BulkCreateCommentRequest ) => { expect(comments?.length).to.eql(attachments.length); diff --git a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/internal/bulk_delete_file_attachments.ts b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/internal/bulk_delete_file_attachments.ts index bd2a4b8f85456..3c0c1b39c5a93 100644 --- a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/internal/bulk_delete_file_attachments.ts +++ b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/internal/bulk_delete_file_attachments.ts @@ -6,7 +6,7 @@ */ import expect from '@kbn/expect'; -import { CaseResponse } from '@kbn/cases-plugin/common'; +import { Case } from '@kbn/cases-plugin/common'; import { constructFileKindIdByOwner } from '@kbn/cases-plugin/common/files'; import { Owner } from '@kbn/cases-plugin/common/constants/types'; import { CASES_TEST_FIXTURE_FILE_KIND_ID } from '@kbn/cases-api-integration-test-plugin/server/files'; @@ -62,7 +62,7 @@ export default ({ getService }: FtrProviderContext): void => { }); describe('failures', () => { - let postedCase: CaseResponse; + let postedCase: Case; before(async () => { postedCase = await createCase(supertest, getPostCaseRequest()); diff --git a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/internal/bulk_get_attachments.ts b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/internal/bulk_get_attachments.ts index c5751ebf99a19..2d1a7c2ab69a6 100644 --- a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/internal/bulk_get_attachments.ts +++ b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/internal/bulk_get_attachments.ts @@ -9,7 +9,7 @@ import expect from '@kbn/expect'; import { AttributesTypeExternalReference, AttributesTypeExternalReferenceSO, - CaseResponse, + Case, CommentResponseTypePersistableState, } from '@kbn/cases-plugin/common/api'; import { FtrProviderContext } from '../../../../common/ftr_provider_context'; @@ -50,7 +50,7 @@ export default ({ getService }: FtrProviderContext): void => { describe('bulk_get_attachments', () => { describe('setup using two comments', () => { - let updatedCase: CaseResponse; + let updatedCase: Case; before(async () => { const postedCase = await createCase(supertest, postCaseReq); @@ -212,8 +212,8 @@ export default ({ getService }: FtrProviderContext): void => { }); describe('security and observability cases', () => { - let secCase: CaseResponse; - let obsCase: CaseResponse; + let secCase: Case; + let obsCase: Case; let secAttachmentId: string; let obsAttachmentId: string; diff --git a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/user_actions/find_user_actions.ts b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/user_actions/find_user_actions.ts index ea7b41be84d89..28bab81a70bee 100644 --- a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/user_actions/find_user_actions.ts +++ b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/user_actions/find_user_actions.ts @@ -8,7 +8,7 @@ import expect from '@kbn/expect'; import { ActionTypes, - CaseResponse, + Case, CaseSeverity, CaseStatuses, CommentUserAction, @@ -131,7 +131,7 @@ export default ({ getService }: FtrProviderContext): void => { }); describe('pagination', () => { - let theCase: CaseResponse; + let theCase: Case; beforeEach(async () => { theCase = await createCase(supertest, getPostCaseRequest()); @@ -793,9 +793,9 @@ export default ({ getService }: FtrProviderContext): void => { describe('rbac', () => { const supertestWithoutAuth = getService('supertestWithoutAuth'); - let secCase: CaseResponse; - let obsCase: CaseResponse; - let secCaseSpace2: CaseResponse; + let secCase: Case; + let obsCase: Case; + let secCaseSpace2: Case; beforeEach(async () => { [secCase, obsCase, secCaseSpace2] = await Promise.all([ diff --git a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/user_actions/get_all_user_actions.ts b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/user_actions/get_all_user_actions.ts index fc8ab00e63c64..744e70d3809a6 100644 --- a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/user_actions/get_all_user_actions.ts +++ b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/user_actions/get_all_user_actions.ts @@ -8,7 +8,7 @@ import expect from '@kbn/expect'; import { - CaseResponse, + Case, CaseSeverity, CaseStatuses, CommentType, @@ -342,7 +342,7 @@ export default ({ getService }: FtrProviderContext): void => { describe('rbac', () => { const supertestWithoutAuth = getService('supertestWithoutAuth'); - let caseInfo: CaseResponse; + let caseInfo: Case; beforeEach(async () => { caseInfo = await createCase(supertestWithoutAuth, getPostCaseRequest(), 200, { user: superUser, diff --git a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/user_actions/get_user_action_stats.ts b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/user_actions/get_user_action_stats.ts index 8448f22b7f9e0..6801fa4fe3785 100644 --- a/x-pack/test/cases_api_integration/security_and_spaces/tests/common/user_actions/get_user_action_stats.ts +++ b/x-pack/test/cases_api_integration/security_and_spaces/tests/common/user_actions/get_user_action_stats.ts @@ -6,12 +6,7 @@ */ import expect from '@kbn/expect'; -import { - CaseResponse, - CaseSeverity, - CaseStatuses, - ConnectorTypes, -} from '@kbn/cases-plugin/common/api'; +import { Case, CaseSeverity, CaseStatuses, ConnectorTypes } from '@kbn/cases-plugin/common/api'; import { globalRead, @@ -140,7 +135,7 @@ export default ({ getService }: FtrProviderContext): void => { describe('rbac', () => { const supertestWithoutAuth = getService('supertestWithoutAuth'); - let theCase: CaseResponse; + let theCase: Case; beforeEach(async () => { theCase = await createCase(supertestWithoutAuth, getPostCaseRequest(), 200, { user: superUser, diff --git a/x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/threat_match.ts b/x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/threat_match.ts index c381c216bbf71..912fa62e8447d 100644 --- a/x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/threat_match.ts +++ b/x-pack/test/detection_engine_api_integration/security_and_spaces/rule_execution_logic/threat_match.ts @@ -145,7 +145,8 @@ export default ({ getService }: FtrProviderContext) => { /** * Specific api integration tests for threat matching rule type */ - describe('Threat match type rules', () => { + // FLAKY: https://github.com/elastic/kibana/issues/155304 + describe.skip('Threat match type rules', () => { before(async () => { // await deleteSignalsIndex(supertest, log); // await deleteAllAlerts(supertest, log); diff --git a/x-pack/test/examples/search_examples/partial_results_example.ts b/x-pack/test/examples/search_examples/partial_results_example.ts index f7d199463e256..269b2e79ab38f 100644 --- a/x-pack/test/examples/search_examples/partial_results_example.ts +++ b/x-pack/test/examples/search_examples/partial_results_example.ts @@ -14,8 +14,7 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const PageObjects = getPageObjects(['common']); const retry = getService('retry'); - // FLAKY: https://github.com/elastic/kibana/issues/116038 - describe.skip('Partial results example', () => { + describe('Partial results example', () => { before(async () => { await PageObjects.common.navigateToApp('searchExamples'); await testSubjects.click('/search'); diff --git a/x-pack/test/functional/apps/lens/group1/index.ts b/x-pack/test/functional/apps/lens/group1/index.ts index a129a66c519d9..67d4e8023e4fc 100644 --- a/x-pack/test/functional/apps/lens/group1/index.ts +++ b/x-pack/test/functional/apps/lens/group1/index.ts @@ -37,7 +37,7 @@ export default ({ getService, loadTestFile, getPageObjects }: FtrProviderContext }; let indexPatternString: string; before(async () => { - await log.debug('Starting lens before method'); + log.debug('Starting lens before method'); await browser.setWindowSize(1280, 1200); await kibanaServer.savedObjects.cleanStandardList(); try { @@ -74,16 +74,9 @@ export default ({ getService, loadTestFile, getPageObjects }: FtrProviderContext if (config.get('esTestCluster.ccs')) { loadTestFile(require.resolve('./smokescreen')); } else { - loadTestFile(require.resolve('./smokescreen')); - loadTestFile(require.resolve('./ad_hoc_data_view')); - loadTestFile(require.resolve('./partition')); - loadTestFile(require.resolve('./persistent_context')); - loadTestFile(require.resolve('./table_dashboard')); - loadTestFile(require.resolve('./table')); - loadTestFile(require.resolve('./text_based_languages')); - loadTestFile(require.resolve('./fields_list')); - loadTestFile(require.resolve('./layer_actions')); - loadTestFile(require.resolve('./field_formatters')); + // total run time ~16 min + loadTestFile(require.resolve('./smokescreen')); // 12m 12s + loadTestFile(require.resolve('./ad_hoc_data_view')); // 3m 40s } }); }; diff --git a/x-pack/test/functional/apps/lens/group1/field_formatters.ts b/x-pack/test/functional/apps/lens/group2/field_formatters.ts similarity index 100% rename from x-pack/test/functional/apps/lens/group1/field_formatters.ts rename to x-pack/test/functional/apps/lens/group2/field_formatters.ts diff --git a/x-pack/test/functional/apps/lens/group1/fields_list.ts b/x-pack/test/functional/apps/lens/group2/fields_list.ts similarity index 100% rename from x-pack/test/functional/apps/lens/group1/fields_list.ts rename to x-pack/test/functional/apps/lens/group2/fields_list.ts diff --git a/x-pack/test/functional/apps/lens/group2/index.ts b/x-pack/test/functional/apps/lens/group2/index.ts index 277b415a9ab49..18302745362ab 100644 --- a/x-pack/test/functional/apps/lens/group2/index.ts +++ b/x-pack/test/functional/apps/lens/group2/index.ts @@ -14,22 +14,14 @@ export default ({ getService, loadTestFile, getPageObjects }: FtrProviderContext const esArchiver = getService('esArchiver'); const kibanaServer = getService('kibanaServer'); const PageObjects = getPageObjects(['timePicker']); - const config = getService('config'); - let remoteEsArchiver; describe('lens app - group 2', () => { const esArchive = 'x-pack/test/functional/es_archives/logstash_functional'; const localIndexPatternString = 'logstash-*'; - const remoteIndexPatternString = 'ftr-remote:logstash-*'; const localFixtures = { lensBasic: 'x-pack/test/functional/fixtures/kbn_archiver/lens/lens_basic.json', lensDefault: 'x-pack/test/functional/fixtures/kbn_archiver/lens/default', }; - - const remoteFixtures = { - lensBasic: 'x-pack/test/functional/fixtures/kbn_archiver/lens/ccs/lens_basic.json', - lensDefault: 'x-pack/test/functional/fixtures/kbn_archiver/lens/ccs/default', - }; let esNode: EsArchiver; let fixtureDirs: { lensBasic: string; @@ -37,21 +29,12 @@ export default ({ getService, loadTestFile, getPageObjects }: FtrProviderContext }; let indexPatternString: string; before(async () => { - await log.debug('Starting lens before method'); + log.debug('Starting lens before method'); await browser.setWindowSize(1280, 1200); await kibanaServer.savedObjects.cleanStandardList(); - try { - config.get('esTestCluster.ccs'); - remoteEsArchiver = getService('remoteEsArchiver' as 'esArchiver'); - esNode = remoteEsArchiver; - fixtureDirs = remoteFixtures; - indexPatternString = remoteIndexPatternString; - } catch (error) { - esNode = esArchiver; - fixtureDirs = localFixtures; - indexPatternString = localIndexPatternString; - } - + esNode = esArchiver; + fixtureDirs = localFixtures; + indexPatternString = localIndexPatternString; await esNode.load(esArchive); // changing the timepicker default here saves us from having to set it in Discover (~8s) await PageObjects.timePicker.setDefaultAbsoluteRangeViaUiSettings(); @@ -64,21 +47,21 @@ export default ({ getService, loadTestFile, getPageObjects }: FtrProviderContext }); after(async () => { - await esArchiver.unload(esArchive); + await esNode.unload(esArchive); await PageObjects.timePicker.resetDefaultAbsoluteRangeViaUiSettings(); await kibanaServer.importExport.unload(fixtureDirs.lensBasic); await kibanaServer.importExport.unload(fixtureDirs.lensDefault); await kibanaServer.savedObjects.cleanStandardList(); }); - loadTestFile(require.resolve('./add_to_dashboard')); - loadTestFile(require.resolve('./runtime_fields')); - loadTestFile(require.resolve('./dashboard')); - loadTestFile(require.resolve('./terms')); - loadTestFile(require.resolve('./epoch_millis')); - loadTestFile(require.resolve('./show_underlying_data')); - loadTestFile(require.resolve('./show_underlying_data_dashboard')); - loadTestFile(require.resolve('./share')); - loadTestFile(require.resolve('./tsdb')); + // total run time ~ 16m 20s + loadTestFile(require.resolve('./partition')); // 1m 40s + loadTestFile(require.resolve('./persistent_context')); // 1m + loadTestFile(require.resolve('./table_dashboard')); // 3m 10s + loadTestFile(require.resolve('./table')); // 1m 40s + loadTestFile(require.resolve('./text_based_languages')); // 3m 40s + loadTestFile(require.resolve('./fields_list')); // 2m 7s + loadTestFile(require.resolve('./layer_actions')); // 1m 45s + loadTestFile(require.resolve('./field_formatters')); // 1m 30s }); }; diff --git a/x-pack/test/functional/apps/lens/group1/layer_actions.ts b/x-pack/test/functional/apps/lens/group2/layer_actions.ts similarity index 100% rename from x-pack/test/functional/apps/lens/group1/layer_actions.ts rename to x-pack/test/functional/apps/lens/group2/layer_actions.ts diff --git a/x-pack/test/functional/apps/lens/group1/partition.ts b/x-pack/test/functional/apps/lens/group2/partition.ts similarity index 100% rename from x-pack/test/functional/apps/lens/group1/partition.ts rename to x-pack/test/functional/apps/lens/group2/partition.ts diff --git a/x-pack/test/functional/apps/lens/group1/persistent_context.ts b/x-pack/test/functional/apps/lens/group2/persistent_context.ts similarity index 100% rename from x-pack/test/functional/apps/lens/group1/persistent_context.ts rename to x-pack/test/functional/apps/lens/group2/persistent_context.ts diff --git a/x-pack/test/functional/apps/lens/group1/table.ts b/x-pack/test/functional/apps/lens/group2/table.ts similarity index 100% rename from x-pack/test/functional/apps/lens/group1/table.ts rename to x-pack/test/functional/apps/lens/group2/table.ts diff --git a/x-pack/test/functional/apps/lens/group1/table_dashboard.ts b/x-pack/test/functional/apps/lens/group2/table_dashboard.ts similarity index 100% rename from x-pack/test/functional/apps/lens/group1/table_dashboard.ts rename to x-pack/test/functional/apps/lens/group2/table_dashboard.ts diff --git a/x-pack/test/functional/apps/lens/group1/text_based_languages.ts b/x-pack/test/functional/apps/lens/group2/text_based_languages.ts similarity index 100% rename from x-pack/test/functional/apps/lens/group1/text_based_languages.ts rename to x-pack/test/functional/apps/lens/group2/text_based_languages.ts diff --git a/x-pack/test/functional/apps/lens/group2/add_to_dashboard.ts b/x-pack/test/functional/apps/lens/group3/add_to_dashboard.ts similarity index 100% rename from x-pack/test/functional/apps/lens/group2/add_to_dashboard.ts rename to x-pack/test/functional/apps/lens/group3/add_to_dashboard.ts diff --git a/x-pack/test/functional/apps/lens/group2/epoch_millis.ts b/x-pack/test/functional/apps/lens/group3/epoch_millis.ts similarity index 100% rename from x-pack/test/functional/apps/lens/group2/epoch_millis.ts rename to x-pack/test/functional/apps/lens/group3/epoch_millis.ts diff --git a/x-pack/test/functional/apps/lens/group3/index.ts b/x-pack/test/functional/apps/lens/group3/index.ts index 315d905f300e9..aa2112f248f71 100644 --- a/x-pack/test/functional/apps/lens/group3/index.ts +++ b/x-pack/test/functional/apps/lens/group3/index.ts @@ -71,25 +71,10 @@ export default ({ getService, loadTestFile, getPageObjects }: FtrProviderContext await kibanaServer.savedObjects.cleanStandardList(); }); - loadTestFile(require.resolve('./colors')); - loadTestFile(require.resolve('./chart_data')); - loadTestFile(require.resolve('./time_shift')); - loadTestFile(require.resolve('./drag_and_drop')); - loadTestFile(require.resolve('./disable_auto_apply')); - loadTestFile(require.resolve('./geo_field')); - loadTestFile(require.resolve('./formula')); - loadTestFile(require.resolve('./heatmap')); - loadTestFile(require.resolve('./gauge')); - loadTestFile(require.resolve('./metric')); - loadTestFile(require.resolve('./legacy_metric')); - loadTestFile(require.resolve('./reference_lines')); - loadTestFile(require.resolve('./annotations')); - loadTestFile(require.resolve('./inspector')); - loadTestFile(require.resolve('./error_handling')); - loadTestFile(require.resolve('./lens_tagging')); - loadTestFile(require.resolve('./lens_reporting')); - // keep these two last in the group in this order because they are messing with the default saved objects - loadTestFile(require.resolve('./rollup')); - loadTestFile(require.resolve('./no_data')); + // total run time ~16 min + loadTestFile(require.resolve('./add_to_dashboard')); // 12m 50s + loadTestFile(require.resolve('./runtime_fields')); // 1m + loadTestFile(require.resolve('./terms')); // 1m 35s + loadTestFile(require.resolve('./epoch_millis')); // 30s }); }; diff --git a/x-pack/test/functional/apps/lens/group2/runtime_fields.ts b/x-pack/test/functional/apps/lens/group3/runtime_fields.ts similarity index 100% rename from x-pack/test/functional/apps/lens/group2/runtime_fields.ts rename to x-pack/test/functional/apps/lens/group3/runtime_fields.ts diff --git a/x-pack/test/functional/apps/lens/group2/terms.ts b/x-pack/test/functional/apps/lens/group3/terms.ts similarity index 100% rename from x-pack/test/functional/apps/lens/group2/terms.ts rename to x-pack/test/functional/apps/lens/group3/terms.ts diff --git a/x-pack/test/functional/apps/lens/group3/chart_data.ts b/x-pack/test/functional/apps/lens/group4/chart_data.ts similarity index 100% rename from x-pack/test/functional/apps/lens/group3/chart_data.ts rename to x-pack/test/functional/apps/lens/group4/chart_data.ts diff --git a/x-pack/test/functional/apps/lens/group3/colors.ts b/x-pack/test/functional/apps/lens/group4/colors.ts similarity index 100% rename from x-pack/test/functional/apps/lens/group3/colors.ts rename to x-pack/test/functional/apps/lens/group4/colors.ts diff --git a/x-pack/test/functional/apps/lens/group4/config.ts b/x-pack/test/functional/apps/lens/group4/config.ts new file mode 100644 index 0000000000000..d927f93adeffd --- /dev/null +++ b/x-pack/test/functional/apps/lens/group4/config.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrConfigProviderContext } from '@kbn/test'; + +export default async function ({ readConfigFile }: FtrConfigProviderContext) { + const functionalConfig = await readConfigFile(require.resolve('../../../config.base.js')); + + return { + ...functionalConfig.getAll(), + testFiles: [require.resolve('.')], + }; +} diff --git a/x-pack/test/functional/apps/lens/group2/dashboard.ts b/x-pack/test/functional/apps/lens/group4/dashboard.ts similarity index 100% rename from x-pack/test/functional/apps/lens/group2/dashboard.ts rename to x-pack/test/functional/apps/lens/group4/dashboard.ts diff --git a/x-pack/test/functional/apps/lens/group4/index.ts b/x-pack/test/functional/apps/lens/group4/index.ts new file mode 100644 index 0000000000000..13cfa3fe421e1 --- /dev/null +++ b/x-pack/test/functional/apps/lens/group4/index.ts @@ -0,0 +1,85 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EsArchiver } from '@kbn/es-archiver'; +import { FtrProviderContext } from '../../../ftr_provider_context'; + +export default ({ getService, loadTestFile, getPageObjects }: FtrProviderContext) => { + const browser = getService('browser'); + const log = getService('log'); + const esArchiver = getService('esArchiver'); + const kibanaServer = getService('kibanaServer'); + const PageObjects = getPageObjects(['timePicker']); + const config = getService('config'); + let remoteEsArchiver; + + describe('lens app - group 4', () => { + const esArchive = 'x-pack/test/functional/es_archives/logstash_functional'; + const localIndexPatternString = 'logstash-*'; + const remoteIndexPatternString = 'ftr-remote:logstash-*'; + const localFixtures = { + lensBasic: 'x-pack/test/functional/fixtures/kbn_archiver/lens/lens_basic.json', + lensDefault: 'x-pack/test/functional/fixtures/kbn_archiver/lens/default', + }; + + const remoteFixtures = { + lensBasic: 'x-pack/test/functional/fixtures/kbn_archiver/lens/ccs/lens_basic.json', + lensDefault: 'x-pack/test/functional/fixtures/kbn_archiver/lens/ccs/default', + }; + let esNode: EsArchiver; + let fixtureDirs: { + lensBasic: string; + lensDefault: string; + }; + let indexPatternString: string; + before(async () => { + await log.debug('Starting lens before method'); + await browser.setWindowSize(1280, 1200); + await kibanaServer.savedObjects.cleanStandardList(); + try { + config.get('esTestCluster.ccs'); + remoteEsArchiver = getService('remoteEsArchiver' as 'esArchiver'); + esNode = remoteEsArchiver; + fixtureDirs = remoteFixtures; + indexPatternString = remoteIndexPatternString; + } catch (error) { + esNode = esArchiver; + fixtureDirs = localFixtures; + indexPatternString = localIndexPatternString; + } + + await esNode.load(esArchive); + // changing the timepicker default here saves us from having to set it in Discover (~8s) + await PageObjects.timePicker.setDefaultAbsoluteRangeViaUiSettings(); + await kibanaServer.uiSettings.update({ + defaultIndex: indexPatternString, + 'dateFormat:tz': 'UTC', + }); + await kibanaServer.importExport.load(fixtureDirs.lensBasic); + await kibanaServer.importExport.load(fixtureDirs.lensDefault); + }); + + after(async () => { + await esArchiver.unload(esArchive); + await PageObjects.timePicker.resetDefaultAbsoluteRangeViaUiSettings(); + await kibanaServer.importExport.unload(fixtureDirs.lensBasic); + await kibanaServer.importExport.unload(fixtureDirs.lensDefault); + await kibanaServer.savedObjects.cleanStandardList(); + }); + + // total run time ~16m 30s + loadTestFile(require.resolve('./colors')); // 1m 2s + loadTestFile(require.resolve('./chart_data')); // 1m 10s + loadTestFile(require.resolve('./time_shift')); // 1m + loadTestFile(require.resolve('./dashboard')); // 6m 45s + loadTestFile(require.resolve('./show_underlying_data')); // 2m + loadTestFile(require.resolve('./show_underlying_data_dashboard')); // 2m 10s + loadTestFile(require.resolve('./share')); // 1m 20s + // keep it last in the group + loadTestFile(require.resolve('./tsdb')); // 1m + }); +}; diff --git a/x-pack/test/functional/apps/lens/group2/share.ts b/x-pack/test/functional/apps/lens/group4/share.ts similarity index 100% rename from x-pack/test/functional/apps/lens/group2/share.ts rename to x-pack/test/functional/apps/lens/group4/share.ts diff --git a/x-pack/test/functional/apps/lens/group2/show_underlying_data.ts b/x-pack/test/functional/apps/lens/group4/show_underlying_data.ts similarity index 100% rename from x-pack/test/functional/apps/lens/group2/show_underlying_data.ts rename to x-pack/test/functional/apps/lens/group4/show_underlying_data.ts diff --git a/x-pack/test/functional/apps/lens/group2/show_underlying_data_dashboard.ts b/x-pack/test/functional/apps/lens/group4/show_underlying_data_dashboard.ts similarity index 100% rename from x-pack/test/functional/apps/lens/group2/show_underlying_data_dashboard.ts rename to x-pack/test/functional/apps/lens/group4/show_underlying_data_dashboard.ts diff --git a/x-pack/test/functional/apps/lens/group3/time_shift.ts b/x-pack/test/functional/apps/lens/group4/time_shift.ts similarity index 100% rename from x-pack/test/functional/apps/lens/group3/time_shift.ts rename to x-pack/test/functional/apps/lens/group4/time_shift.ts diff --git a/x-pack/test/functional/apps/lens/group2/tsdb.ts b/x-pack/test/functional/apps/lens/group4/tsdb.ts similarity index 100% rename from x-pack/test/functional/apps/lens/group2/tsdb.ts rename to x-pack/test/functional/apps/lens/group4/tsdb.ts diff --git a/x-pack/test/functional/apps/lens/group5/config.ts b/x-pack/test/functional/apps/lens/group5/config.ts new file mode 100644 index 0000000000000..d927f93adeffd --- /dev/null +++ b/x-pack/test/functional/apps/lens/group5/config.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrConfigProviderContext } from '@kbn/test'; + +export default async function ({ readConfigFile }: FtrConfigProviderContext) { + const functionalConfig = await readConfigFile(require.resolve('../../../config.base.js')); + + return { + ...functionalConfig.getAll(), + testFiles: [require.resolve('.')], + }; +} diff --git a/x-pack/test/functional/apps/lens/group3/drag_and_drop.ts b/x-pack/test/functional/apps/lens/group5/drag_and_drop.ts similarity index 100% rename from x-pack/test/functional/apps/lens/group3/drag_and_drop.ts rename to x-pack/test/functional/apps/lens/group5/drag_and_drop.ts diff --git a/x-pack/test/functional/apps/lens/group3/formula.ts b/x-pack/test/functional/apps/lens/group5/formula.ts similarity index 100% rename from x-pack/test/functional/apps/lens/group3/formula.ts rename to x-pack/test/functional/apps/lens/group5/formula.ts diff --git a/x-pack/test/functional/apps/lens/group3/gauge.ts b/x-pack/test/functional/apps/lens/group5/gauge.ts similarity index 100% rename from x-pack/test/functional/apps/lens/group3/gauge.ts rename to x-pack/test/functional/apps/lens/group5/gauge.ts diff --git a/x-pack/test/functional/apps/lens/group3/geo_field.ts b/x-pack/test/functional/apps/lens/group5/geo_field.ts similarity index 100% rename from x-pack/test/functional/apps/lens/group3/geo_field.ts rename to x-pack/test/functional/apps/lens/group5/geo_field.ts diff --git a/x-pack/test/functional/apps/lens/group3/heatmap.ts b/x-pack/test/functional/apps/lens/group5/heatmap.ts similarity index 100% rename from x-pack/test/functional/apps/lens/group3/heatmap.ts rename to x-pack/test/functional/apps/lens/group5/heatmap.ts diff --git a/x-pack/test/functional/apps/lens/group5/index.ts b/x-pack/test/functional/apps/lens/group5/index.ts new file mode 100644 index 0000000000000..5dabfd4a71499 --- /dev/null +++ b/x-pack/test/functional/apps/lens/group5/index.ts @@ -0,0 +1,81 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EsArchiver } from '@kbn/es-archiver'; +import { FtrProviderContext } from '../../../ftr_provider_context'; + +export default ({ getService, loadTestFile, getPageObjects }: FtrProviderContext) => { + const browser = getService('browser'); + const log = getService('log'); + const esArchiver = getService('esArchiver'); + const kibanaServer = getService('kibanaServer'); + const PageObjects = getPageObjects(['timePicker']); + const config = getService('config'); + let remoteEsArchiver; + + describe('lens app - group 5', () => { + const esArchive = 'x-pack/test/functional/es_archives/logstash_functional'; + const localIndexPatternString = 'logstash-*'; + const remoteIndexPatternString = 'ftr-remote:logstash-*'; + const localFixtures = { + lensBasic: 'x-pack/test/functional/fixtures/kbn_archiver/lens/lens_basic.json', + lensDefault: 'x-pack/test/functional/fixtures/kbn_archiver/lens/default', + }; + + const remoteFixtures = { + lensBasic: 'x-pack/test/functional/fixtures/kbn_archiver/lens/ccs/lens_basic.json', + lensDefault: 'x-pack/test/functional/fixtures/kbn_archiver/lens/ccs/default', + }; + let esNode: EsArchiver; + let fixtureDirs: { + lensBasic: string; + lensDefault: string; + }; + let indexPatternString: string; + before(async () => { + log.debug('Starting lens before method'); + await browser.setWindowSize(1280, 1200); + await kibanaServer.savedObjects.cleanStandardList(); + try { + config.get('esTestCluster.ccs'); + remoteEsArchiver = getService('remoteEsArchiver' as 'esArchiver'); + esNode = remoteEsArchiver; + fixtureDirs = remoteFixtures; + indexPatternString = remoteIndexPatternString; + } catch (error) { + esNode = esArchiver; + fixtureDirs = localFixtures; + indexPatternString = localIndexPatternString; + } + + await esNode.load(esArchive); + // changing the timepicker default here saves us from having to set it in Discover (~8s) + await PageObjects.timePicker.setDefaultAbsoluteRangeViaUiSettings(); + await kibanaServer.uiSettings.update({ + defaultIndex: indexPatternString, + 'dateFormat:tz': 'UTC', + }); + await kibanaServer.importExport.load(fixtureDirs.lensBasic); + await kibanaServer.importExport.load(fixtureDirs.lensDefault); + }); + + after(async () => { + await esArchiver.unload(esArchive); + await PageObjects.timePicker.resetDefaultAbsoluteRangeViaUiSettings(); + await kibanaServer.importExport.unload(fixtureDirs.lensBasic); + await kibanaServer.importExport.unload(fixtureDirs.lensDefault); + await kibanaServer.savedObjects.cleanStandardList(); + }); + + // total run time ~ 16m + loadTestFile(require.resolve('./drag_and_drop')); // 7m 40s + loadTestFile(require.resolve('./geo_field')); // 26s + loadTestFile(require.resolve('./formula')); // 5m 52s + loadTestFile(require.resolve('./heatmap')); // 51s + loadTestFile(require.resolve('./gauge')); // 1m 17s + }); +}; diff --git a/x-pack/test/functional/apps/lens/group3/annotations.ts b/x-pack/test/functional/apps/lens/group6/annotations.ts similarity index 100% rename from x-pack/test/functional/apps/lens/group3/annotations.ts rename to x-pack/test/functional/apps/lens/group6/annotations.ts diff --git a/x-pack/test/functional/apps/lens/group6/config.ts b/x-pack/test/functional/apps/lens/group6/config.ts new file mode 100644 index 0000000000000..d927f93adeffd --- /dev/null +++ b/x-pack/test/functional/apps/lens/group6/config.ts @@ -0,0 +1,17 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrConfigProviderContext } from '@kbn/test'; + +export default async function ({ readConfigFile }: FtrConfigProviderContext) { + const functionalConfig = await readConfigFile(require.resolve('../../../config.base.js')); + + return { + ...functionalConfig.getAll(), + testFiles: [require.resolve('.')], + }; +} diff --git a/x-pack/test/functional/apps/lens/group3/disable_auto_apply.ts b/x-pack/test/functional/apps/lens/group6/disable_auto_apply.ts similarity index 100% rename from x-pack/test/functional/apps/lens/group3/disable_auto_apply.ts rename to x-pack/test/functional/apps/lens/group6/disable_auto_apply.ts diff --git a/x-pack/test/functional/apps/lens/group3/error_handling.ts b/x-pack/test/functional/apps/lens/group6/error_handling.ts similarity index 100% rename from x-pack/test/functional/apps/lens/group3/error_handling.ts rename to x-pack/test/functional/apps/lens/group6/error_handling.ts diff --git a/x-pack/test/functional/apps/lens/group6/index.ts b/x-pack/test/functional/apps/lens/group6/index.ts new file mode 100644 index 0000000000000..bc59c2878805e --- /dev/null +++ b/x-pack/test/functional/apps/lens/group6/index.ts @@ -0,0 +1,88 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { EsArchiver } from '@kbn/es-archiver'; +import { FtrProviderContext } from '../../../ftr_provider_context'; + +export default ({ getService, loadTestFile, getPageObjects }: FtrProviderContext) => { + const browser = getService('browser'); + const log = getService('log'); + const esArchiver = getService('esArchiver'); + const kibanaServer = getService('kibanaServer'); + const PageObjects = getPageObjects(['timePicker']); + const config = getService('config'); + let remoteEsArchiver; + + describe('lens app - group 6', () => { + const esArchive = 'x-pack/test/functional/es_archives/logstash_functional'; + const localIndexPatternString = 'logstash-*'; + const remoteIndexPatternString = 'ftr-remote:logstash-*'; + const localFixtures = { + lensBasic: 'x-pack/test/functional/fixtures/kbn_archiver/lens/lens_basic.json', + lensDefault: 'x-pack/test/functional/fixtures/kbn_archiver/lens/default', + }; + + const remoteFixtures = { + lensBasic: 'x-pack/test/functional/fixtures/kbn_archiver/lens/ccs/lens_basic.json', + lensDefault: 'x-pack/test/functional/fixtures/kbn_archiver/lens/ccs/default', + }; + let esNode: EsArchiver; + let fixtureDirs: { + lensBasic: string; + lensDefault: string; + }; + let indexPatternString: string; + before(async () => { + log.debug('Starting lens before method'); + await browser.setWindowSize(1280, 1200); + await kibanaServer.savedObjects.cleanStandardList(); + try { + config.get('esTestCluster.ccs'); + remoteEsArchiver = getService('remoteEsArchiver' as 'esArchiver'); + esNode = remoteEsArchiver; + fixtureDirs = remoteFixtures; + indexPatternString = remoteIndexPatternString; + } catch (error) { + esNode = esArchiver; + fixtureDirs = localFixtures; + indexPatternString = localIndexPatternString; + } + + await esNode.load(esArchive); + // changing the timepicker default here saves us from having to set it in Discover (~8s) + await PageObjects.timePicker.setDefaultAbsoluteRangeViaUiSettings(); + await kibanaServer.uiSettings.update({ + defaultIndex: indexPatternString, + 'dateFormat:tz': 'UTC', + }); + await kibanaServer.importExport.load(fixtureDirs.lensBasic); + await kibanaServer.importExport.load(fixtureDirs.lensDefault); + }); + + after(async () => { + await esArchiver.unload(esArchive); + await PageObjects.timePicker.resetDefaultAbsoluteRangeViaUiSettings(); + await kibanaServer.importExport.unload(fixtureDirs.lensBasic); + await kibanaServer.importExport.unload(fixtureDirs.lensDefault); + await kibanaServer.savedObjects.cleanStandardList(); + }); + + // total run time ~16m + loadTestFile(require.resolve('./metric')); // 4m 7s + loadTestFile(require.resolve('./legacy_metric')); // 29s + loadTestFile(require.resolve('./disable_auto_apply')); // 1m 6s + loadTestFile(require.resolve('./reference_lines')); // 1m + loadTestFile(require.resolve('./annotations')); // 1m + loadTestFile(require.resolve('./inspector')); // 1m 19s + loadTestFile(require.resolve('./error_handling')); // 1m 8s + loadTestFile(require.resolve('./lens_tagging')); // 1m 9s + loadTestFile(require.resolve('./lens_reporting')); // 3m + // keep these two last in the group in this order because they are messing with the default saved objects + loadTestFile(require.resolve('./rollup')); // 1m 30s + loadTestFile(require.resolve('./no_data')); // 36s + }); +}; diff --git a/x-pack/test/functional/apps/lens/group3/inspector.ts b/x-pack/test/functional/apps/lens/group6/inspector.ts similarity index 100% rename from x-pack/test/functional/apps/lens/group3/inspector.ts rename to x-pack/test/functional/apps/lens/group6/inspector.ts diff --git a/x-pack/test/functional/apps/lens/group3/legacy_metric.ts b/x-pack/test/functional/apps/lens/group6/legacy_metric.ts similarity index 100% rename from x-pack/test/functional/apps/lens/group3/legacy_metric.ts rename to x-pack/test/functional/apps/lens/group6/legacy_metric.ts diff --git a/x-pack/test/functional/apps/lens/group3/lens_reporting.ts b/x-pack/test/functional/apps/lens/group6/lens_reporting.ts similarity index 100% rename from x-pack/test/functional/apps/lens/group3/lens_reporting.ts rename to x-pack/test/functional/apps/lens/group6/lens_reporting.ts diff --git a/x-pack/test/functional/apps/lens/group3/lens_tagging.ts b/x-pack/test/functional/apps/lens/group6/lens_tagging.ts similarity index 100% rename from x-pack/test/functional/apps/lens/group3/lens_tagging.ts rename to x-pack/test/functional/apps/lens/group6/lens_tagging.ts diff --git a/x-pack/test/functional/apps/lens/group3/metric.ts b/x-pack/test/functional/apps/lens/group6/metric.ts similarity index 100% rename from x-pack/test/functional/apps/lens/group3/metric.ts rename to x-pack/test/functional/apps/lens/group6/metric.ts diff --git a/x-pack/test/functional/apps/lens/group3/no_data.ts b/x-pack/test/functional/apps/lens/group6/no_data.ts similarity index 100% rename from x-pack/test/functional/apps/lens/group3/no_data.ts rename to x-pack/test/functional/apps/lens/group6/no_data.ts diff --git a/x-pack/test/functional/apps/lens/group3/reference_lines.ts b/x-pack/test/functional/apps/lens/group6/reference_lines.ts similarity index 100% rename from x-pack/test/functional/apps/lens/group3/reference_lines.ts rename to x-pack/test/functional/apps/lens/group6/reference_lines.ts diff --git a/x-pack/test/functional/apps/lens/group3/rollup.ts b/x-pack/test/functional/apps/lens/group6/rollup.ts similarity index 100% rename from x-pack/test/functional/apps/lens/group3/rollup.ts rename to x-pack/test/functional/apps/lens/group6/rollup.ts diff --git a/x-pack/test/functional/apps/transform/edit_clone/cloning.ts b/x-pack/test/functional/apps/transform/edit_clone/cloning.ts index 6b3bbac3f7b3d..152ea8c9caa66 100644 --- a/x-pack/test/functional/apps/transform/edit_clone/cloning.ts +++ b/x-pack/test/functional/apps/transform/edit_clone/cloning.ts @@ -35,12 +35,19 @@ function getTransformConfig(): TransformPivotConfig { source: { index: ['ft_ecommerce'] }, pivot: { group_by: { category: { terms: { field: 'category.keyword' } } }, - aggregations: { 'products.base_price.avg': { avg: { field: 'products.base_price' } } }, + aggregations: { + 'products.base_price.avg': { avg: { field: 'products.base_price' } }, + 'order_date.max': { + max: { + field: 'order_date', + }, + }, + }, }, description: 'ecommerce batch transform with avg(products.base_price) grouped by terms(category)', frequency: '3s', - retention_policy: { time: { field: 'order_date', max_age: '1d' } }, + retention_policy: { time: { field: 'order_date.max', max_age: '1d' } }, settings: { max_page_search_size: 250, num_failure_retries: 0, @@ -75,11 +82,16 @@ function getTransformConfigWithRuntimeMappings(): TransformPivotConfig { 'rt_total_charge.avg': { avg: { field: 'rt_total_charge' } }, 'rt_total_charge.min': { min: { field: 'rt_total_charge' } }, 'rt_total_charge.max': { max: { field: 'rt_total_charge' } }, + max_order_date: { + max: { + field: 'order_date', + }, + }, }, }, description: 'ecommerce batch transform grouped by terms(rt_gender_lower)', frequency: '3s', - retention_policy: { time: { field: 'order_date', max_age: '3d' } }, + retention_policy: { time: { field: 'max_order_date', max_age: '3d' } }, settings: { max_page_search_size: 250, num_failure_retries: 5, @@ -155,11 +167,16 @@ function getTransformConfigWithBoolFilterAgg(): TransformPivotConfig { }, }, }, + max_order_date: { + max: { + field: 'order_date', + }, + }, }, }, description: 'ecommerce batch transform with filter aggregations', frequency: '3s', - retention_policy: { time: { field: 'order_date', max_age: '3d' } }, + retention_policy: { time: { field: 'max_order_date', max_age: '3d' } }, settings: { max_page_search_size: 250, num_failure_retries: 5, @@ -253,7 +270,7 @@ export default function ({ getService }: FtrProviderContext) { ], }, retentionPolicySwitchEnabled: true, - retentionPolicyField: 'order_date', + retentionPolicyField: 'order_date.max', retentionPolicyMaxAge: '1d', numFailureRetries: getNumFailureRetriesStr( transformConfigWithPivot.settings?.num_failure_retries @@ -288,7 +305,7 @@ export default function ({ getService }: FtrProviderContext) { values: [`female`, `male`], }, retentionPolicySwitchEnabled: true, - retentionPolicyField: 'order_date', + retentionPolicyField: 'max_order_date', retentionPolicyMaxAge: '3d', numFailureRetries: getNumFailureRetriesStr( transformConfigWithRuntimeMapping.settings?.num_failure_retries @@ -341,7 +358,7 @@ export default function ({ getService }: FtrProviderContext) { ], }, retentionPolicySwitchEnabled: true, - retentionPolicyField: 'order_date', + retentionPolicyField: 'max_order_date', retentionPolicyMaxAge: '3d', numFailureRetries: getNumFailureRetriesStr( transformConfigWithBoolFilterAgg.settings?.num_failure_retries diff --git a/x-pack/test/functional/services/cases/api.ts b/x-pack/test/functional/services/cases/api.ts index 743037fed22c5..2322c8b798eb5 100644 --- a/x-pack/test/functional/services/cases/api.ts +++ b/x-pack/test/functional/services/cases/api.ts @@ -6,12 +6,7 @@ */ import pMap from 'p-map'; -import { - CasePostRequest, - CaseResponse, - CaseSeverity, - CaseStatuses, -} from '@kbn/cases-plugin/common/api'; +import { CasePostRequest, Case, CaseSeverity, CaseStatuses } from '@kbn/cases-plugin/common/api'; import { createCase as createCaseAPI, deleteAllCaseItems, @@ -36,7 +31,7 @@ export function CasesAPIServiceProvider({ getService }: FtrProviderContext) { const supertestWithoutAuth = getService('supertestWithoutAuth'); return { - async createCase(overwrites: Partial = {}): Promise { + async createCase(overwrites: Partial = {}): Promise { const caseData = { ...generateRandomCaseWithoutConnector(), ...overwrites, @@ -66,7 +61,7 @@ export function CasesAPIServiceProvider({ getService }: FtrProviderContext) { }: { caseId: Parameters[0]['caseId']; params: Parameters[0]['params']; - }): Promise { + }): Promise { return createComment({ supertest: kbnSupertest, params, caseId }); }, @@ -100,7 +95,7 @@ export function CasesAPIServiceProvider({ getService }: FtrProviderContext) { return suggestUserProfiles({ supertest: kbnSupertest, req: options }); }, - async getCase({ caseId }: OmitSupertest[0]>): Promise { + async getCase({ caseId }: OmitSupertest[0]>): Promise { return getCase({ supertest: kbnSupertest, caseId }); }, diff --git a/x-pack/test/functional/services/cases/single_case_view.ts b/x-pack/test/functional/services/cases/single_case_view.ts index 237881f2af78b..c3e668557af57 100644 --- a/x-pack/test/functional/services/cases/single_case_view.ts +++ b/x-pack/test/functional/services/cases/single_case_view.ts @@ -41,7 +41,7 @@ export function CasesSingleViewServiceProvider({ getService, getPageObject }: Ft }, async getCommentCount(): Promise { - const commentsContainer = await testSubjects.find('user-actions'); + const commentsContainer = await testSubjects.find('user-actions-list'); const comments = await commentsContainer.findAllByClassName('euiComment'); return comments.length - 1; // don't count the element for adding a new comment }, @@ -58,13 +58,22 @@ export function CasesSingleViewServiceProvider({ getService, getPageObject }: Ft }); }, - async addVisualization(visName: string) { + async addVisualizationToNewComment(visName: string) { // open saved object finder const addCommentElement = await testSubjects.find('add-comment'); const addVisualizationButton = await addCommentElement.findByCssSelector( '[data-test-subj="euiMarkdownEditorToolbarButton"][aria-label="Visualization"]' ); await addVisualizationButton.click(); + + await this.findAndSaveVisualization(visName); + + await testSubjects.existOrFail('cases-app', { timeout: 10 * 1000 }); + + await this.submitComment(); + }, + + async findAndSaveVisualization(visName: string) { await testSubjects.existOrFail('savedObjectsFinderTable', { timeout: 10 * 1000 }); // select visualization @@ -78,8 +87,6 @@ export function CasesSingleViewServiceProvider({ getService, getPageObject }: Ft // save and return to cases app, add comment await lensPage.saveAndReturn(); - await testSubjects.existOrFail('cases-app', { timeout: 10 * 1000 }); - await this.submitComment(); }, async openVisualizationButtonTooltip() { diff --git a/x-pack/test/functional_with_es_ssl/apps/cases/group1/view_case.ts b/x-pack/test/functional_with_es_ssl/apps/cases/group1/view_case.ts index 8c9f7a4450f83..d2d6d7b6a4396 100644 --- a/x-pack/test/functional_with_es_ssl/apps/cases/group1/view_case.ts +++ b/x-pack/test/functional_with_es_ssl/apps/cases/group1/view_case.ts @@ -272,16 +272,6 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { }); it('shows unsaved comment message when page is refreshed', async () => { - const commentArea = await find.byCssSelector( - '[data-test-subj="add-comment"] textarea.euiMarkdownEditorTextArea' - ); - await commentArea.focus(); - await commentArea.type('Test comment from automation'); - - await testSubjects.click('submit-comment'); - - await header.waitUntilLoadingHasFinished(); - await testSubjects.click('property-actions-user-action-ellipses'); await header.waitUntilLoadingHasFinished(); @@ -299,6 +289,8 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { await editCommentTextArea.focus(); await editCommentTextArea.type('Edited comment'); + await header.waitUntilLoadingHasFinished(); + await browser.refresh(); await header.waitUntilLoadingHasFinished(); @@ -341,6 +333,104 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { }); }); + describe('Lens visualization', () => { + before(async () => { + await cases.testResources.installKibanaSampleData('logs'); + }); + + after(async () => { + await cases.testResources.removeKibanaSampleData('logs'); + }); + + createOneCaseBeforeDeleteAllAfter(getPageObject, getService); + + it('adds lens visualization in description', async () => { + await testSubjects.click('description-edit-icon'); + + await header.waitUntilLoadingHasFinished(); + + const editCommentTextArea = await find.byCssSelector( + '[data-test-subj*="editable-markdown-form"] textarea.euiMarkdownEditorTextArea' + ); + + await header.waitUntilLoadingHasFinished(); + + await editCommentTextArea.focus(); + + const editableDescription = await testSubjects.find('editable-markdown-form'); + + const addVisualizationButton = await editableDescription.findByCssSelector( + '[data-test-subj="euiMarkdownEditorToolbarButton"][aria-label="Visualization"]' + ); + await addVisualizationButton.click(); + + await cases.singleCase.findAndSaveVisualization('[Logs] Bytes distribution'); + + await header.waitUntilLoadingHasFinished(); + + await testSubjects.click('editable-save-markdown'); + + await header.waitUntilLoadingHasFinished(); + + const description = await find.byCssSelector('[data-test-subj="description"]'); + + await description.findByCssSelector('[data-test-subj="xyVisChart"]'); + }); + + it('adds lens visualization in existing comment', async () => { + const commentArea = await find.byCssSelector( + '[data-test-subj="add-comment"] textarea.euiMarkdownEditorTextArea' + ); + await commentArea.focus(); + await commentArea.type('Test comment from automation'); + + await header.waitUntilLoadingHasFinished(); + + await testSubjects.click('submit-comment'); + + await header.waitUntilLoadingHasFinished(); + + await testSubjects.click('property-actions-user-action-ellipses'); + + await header.waitUntilLoadingHasFinished(); + + await testSubjects.click('property-actions-user-action-pencil'); + + await header.waitUntilLoadingHasFinished(); + + const editComment = await find.byCssSelector('[data-test-subj*="editable-markdown-form"]'); + + const addVisualizationButton = await editComment.findByCssSelector( + '[data-test-subj="euiMarkdownEditorToolbarButton"][aria-label="Visualization"]' + ); + await addVisualizationButton.click(); + + await cases.singleCase.findAndSaveVisualization('[Logs] Bytes distribution'); + + await header.waitUntilLoadingHasFinished(); + + await testSubjects.click('editable-save-markdown'); + + await header.waitUntilLoadingHasFinished(); + + const createdComment = await find.byCssSelector( + '[data-test-subj*="comment-create-action"] [data-test-subj="scrollable-markdown"]' + ); + + await createdComment.findByCssSelector('[data-test-subj="xyVisChart"]'); + }); + + it('adds lens visualization in new comment', async () => { + await cases.singleCase.addVisualizationToNewComment('[Logs] Bytes distribution'); + + await header.waitUntilLoadingHasFinished(); + + const newComment = await find.byCssSelector('[data-test-subj*="comment-create-action"]'); + + await newComment.findByCssSelector('[data-test-subj="xyVisChart"]'); + }); + }); + describe('Severity field', () => { createOneCaseBeforeDeleteAllAfter(getPageObject, getService); diff --git a/x-pack/test/functional_with_es_ssl/apps/cases/group2/attachment_framework.ts b/x-pack/test/functional_with_es_ssl/apps/cases/group2/attachment_framework.ts index 9b18dcbca8ebc..a81f862b54b65 100644 --- a/x-pack/test/functional_with_es_ssl/apps/cases/group2/attachment_framework.ts +++ b/x-pack/test/functional_with_es_ssl/apps/cases/group2/attachment_framework.ts @@ -9,7 +9,7 @@ import type SuperTest from 'supertest'; import { ExternalReferenceStorageType, CommentType, - CaseResponse, + Case, CommentRequest, } from '@kbn/cases-plugin/common/api'; import { expect } from 'expect'; @@ -84,7 +84,7 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { */ describe('Attachment framework', () => { describe('External reference attachments', () => { - let caseWithAttachment: CaseResponse; + let caseWithAttachment: Case; before(async () => { caseWithAttachment = await createAttachmentAndNavigate({ @@ -180,7 +180,7 @@ export default ({ getPageObject, getService }: FtrProviderContext) => { }, }); - let caseWithAttachment: CaseResponse; + let caseWithAttachment: Case; let dataViewId = ''; before(async () => { diff --git a/x-pack/test/observability_functional/apps/observability/pages/alerts/add_to_case.ts b/x-pack/test/observability_functional/apps/observability/pages/alerts/add_to_case.ts index 40cfb2977850e..e43305267ffb0 100644 --- a/x-pack/test/observability_functional/apps/observability/pages/alerts/add_to_case.ts +++ b/x-pack/test/observability_functional/apps/observability/pages/alerts/add_to_case.ts @@ -12,8 +12,7 @@ export default ({ getService, getPageObjects }: FtrProviderContext) => { const observability = getService('observability'); const retry = getService('retry'); - // Failing: See https://github.com/elastic/kibana/issues/154726 - describe.skip('Observability alerts / Add to case >', function () { + describe('Observability alerts / Add to case >', function () { this.tags('includeFirefox'); before(async () => { @@ -26,7 +25,7 @@ export default ({ getService, getPageObjects }: FtrProviderContext) => { await esArchiver.unload('x-pack/test/functional/es_archives/observability/alerts'); }); - describe('When user has all priviledges for cases', () => { + describe('When user has all privileges for cases', () => { before(async () => { await observability.users.setTestUserRole( observability.users.defineBasicObservabilityRole({ @@ -49,8 +48,10 @@ export default ({ getService, getPageObjects }: FtrProviderContext) => { }); }); - it('opens a flyout when Add to new case is clicked', async () => { - await observability.alerts.addToCase.addToNewCaseButtonClick(); + it('opens a flyout when "Add to new case" is clicked', async () => { + await retry.try(async () => { + await observability.alerts.addToCase.addToNewCaseButtonClick(); + }); await retry.try(async () => { await observability.alerts.addToCase.getCreateCaseFlyoutOrFail(); diff --git a/x-pack/test/observability_functional/apps/observability/pages/cases/case_details.ts b/x-pack/test/observability_functional/apps/observability/pages/cases/case_details.ts index 96e989a9173e7..2fe088f795154 100644 --- a/x-pack/test/observability_functional/apps/observability/pages/cases/case_details.ts +++ b/x-pack/test/observability_functional/apps/observability/pages/cases/case_details.ts @@ -16,6 +16,7 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { const observability = getService('observability'); const find = getService('find'); const PageObjects = getPageObjects(['common', 'header']); + const retry = getService('retry'); describe('Observability cases', () => { before(async () => { @@ -38,25 +39,29 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { ); const owner = 'observability'; - const caseData = await cases.api.createCase({ - title: 'Sample case', - owner, - }); - await cases.api.createAttachment({ - caseId: caseData.id, - params: { - alertId: ['alert-id'], - index: ['.internal.alerts-observability.alerts-default-000001'], - rule: { id: 'rule-id', name: 'My rule name' }, - type: CommentType.alert, + await retry.try(async () => { + const caseData = await cases.api.createCase({ + title: 'Sample case', owner, - }, + }); + await cases.api.createAttachment({ + caseId: caseData.id, + params: { + alertId: ['alert-id'], + index: ['.internal.alerts-observability.alerts-default-000001'], + rule: { id: 'rule-id', name: 'My rule name' }, + type: CommentType.alert, + owner, + }, + }); }); }); after(async () => { - await cases.api.deleteAllCases(); - await observability.users.restoreDefaultTestUserRole(); + await retry.try(async () => { + await cases.api.deleteAllCases(); + await observability.users.restoreDefaultTestUserRole(); + }); }); it('should link to observability rule pages in case details', async () => { diff --git a/x-pack/test/saved_object_tagging/functional/tests/discover_integration.ts b/x-pack/test/saved_object_tagging/functional/tests/discover_integration.ts index b2772cec74ea1..4529bf260fef1 100644 --- a/x-pack/test/saved_object_tagging/functional/tests/discover_integration.ts +++ b/x-pack/test/saved_object_tagging/functional/tests/discover_integration.ts @@ -20,6 +20,7 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { 'timePicker', 'discover', ]); + const retry = getService('retry'); /** * Select tags in the searchbar's tag filter. @@ -118,6 +119,16 @@ export default function ({ getPageObjects, getService }: FtrProviderContext) { it('allows to create a tag from the tag selector', async () => { await PageObjects.discover.clickSaveSearchButton(); + const searchName = 'search-with-new-tag'; + // preventing an occasional flakiness when the saved object wasn't set and the form can't be submitted + await retry.waitFor( + `saved search title is set to ${searchName} and save button is clickable`, + async () => { + const saveButton = await testSubjects.find('confirmSaveSavedObjectButton'); + await testSubjects.setValue('savedObjectTitle', searchName); + return (await saveButton.getAttribute('disabled')) !== 'true'; + } + ); await testSubjects.setValue('savedObjectTitle', 'search-with-new-tag'); await testSubjects.click('savedObjectTagSelector'); await testSubjects.click(`tagSelectorOption-action__create`); diff --git a/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_cases/details_view.ts b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_cases/details_view.ts index 522d6d2516b1c..79e4d3345cdc5 100644 --- a/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_cases/details_view.ts +++ b/x-pack/test/screenshot_creation/apps/response_ops_docs/stack_cases/details_view.ts @@ -31,7 +31,7 @@ export default function ({ getService }: FtrProviderContext) { it('cases visualization screenshot', async () => { await cases.navigation.navigateToApp(); await cases.navigation.navigateToSingleCase('cases', CASE_ID); - await cases.singleCase.addVisualization('[Logs] Bytes distribution'); + await cases.singleCase.addVisualizationToNewComment('[Logs] Bytes distribution'); await cases.singleCase.openVisualizationButtonTooltip(); await commonScreenshots.takeScreenshot( diff --git a/x-pack/test/security_solution_cypress/es_archives/query_alert/data.json b/x-pack/test/security_solution_cypress/es_archives/query_alert/data.json new file mode 100644 index 0000000000000..551f3a376033d --- /dev/null +++ b/x-pack/test/security_solution_cypress/es_archives/query_alert/data.json @@ -0,0 +1,419 @@ +{ + "type": "doc", + "value": { + "id": "eabbdefc23da981f2b74ab58b82622a97bb9878caa11bc914e2adfacc94780f1", + "index": ".internal.alerts-security.alerts-default-000001", + "source": { + "@timestamp": "2023-04-27T11:03:57.906Z", + "Endpoint": { + "capabilities": [ + "isolation", + "kill_process", + "suspend_process", + "running_processes", + "get_file", + "execute" + ], + "configuration": { + "isolation": true + }, + "policy": { + "applied": { + "endpoint_policy_version": 3, + "id": "C2A9093E-E289-4C0A-AA44-8C32A414FA7A", + "name": "With Eventing", + "status": "success", + "version": 5 + } + }, + "state": { + "isolation": true + }, + "status": "enrolled" + }, + "agent": { + "id": "b563ce99-e373-4a1f-a5fe-97e956140aeb", + "type": "endpoint", + "version": "8.8.0" + }, + "data_stream": { + "dataset": "endpoint.alerts", + "namespace": "default", + "type": "logs" + }, + "dll": [ + { + "Ext": { + "compile_time": 1534424710, + "malware_classification": { + "identifier": "Whitelisted", + "score": 0, + "threshold": 0, + "version": "3.0.0" + }, + "mapped_address": 5362483200, + "mapped_size": 0 + }, + "code_signature": { + "subject_name": "Cybereason Inc", + "trusted": true + }, + "hash": { + "md5": "1f2d082566b0fc5f2c238a5180db7451", + "sha1": "ca85243c0af6a6471bdaa560685c51eefd6dbc0d", + "sha256": "8ad40c90a611d36eb8f9eb24fa04f7dbca713db383ff55a03aa0f382e92061a2" + }, + "path": "C:\\Program Files\\Cybereason ActiveProbe\\AmSvc.exe", + "pe": { + "architecture": "x64" + } + } + ], + "ecs": { + "version": "1.4.0" + }, + "elastic": { + "agent": { + "id": "b563ce99-e373-4a1f-a5fe-97e956140aeb" + } + }, + "event.action": "creation", + "event.agent_id_status": "auth_metadata_missing", + "event.category": "malware", + "event.code": "malicious_file", + "event.dataset": "endpoint", + "event.id": "b28993d4-8b8a-4f0f-9f54-84a89bad66ae", + "event.ingested": "2023-04-27T10:58:03Z", + "event.kind": "signal", + "event.module": "endpoint", + "event.sequence": 5826, + "event.type": "creation", + "file": { + "Ext": { + "code_signature": [ + { + "subject_name": "bad signer", + "trusted": false + } + ], + "malware_classification": { + "identifier": "endpointpe", + "score": 1, + "threshold": 0.66, + "version": "3.0.33" + }, + "quarantine_message": "fake quarantine message", + "quarantine_result": true, + "temp_file_path": "C:/temp/fake_malware.exe" + }, + "accessed": 1682752652103, + "created": 1682752652103, + "hash": { + "md5": "fake file md5", + "sha1": "fake file sha1", + "sha256": "fake file sha256" + }, + "mtime": 1682752652103, + "name": "fake_malware.exe", + "owner": "SYSTEM", + "path": "C:/fake_malware.exe", + "size": 3456 + }, + "host": { + "architecture": "wtnozeqvub", + "hostname": "Host-fwarau82er", + "id": "4260adf9-5e63-445d-92c6-e03359bcd342", + "ip": [ + "10.249.37.72", + "10.150.39.243", + "10.186.17.170" + ], + "mac": [ + "f5-f-97-dc-20-67", + "b5-56-ca-98-81-ca", + "22-86-39-4c-87-33" + ], + "name": "Host-fwarau82er", + "os": { + "Ext": { + "variant": "Darwin" + }, + "family": "Darwin", + "full": "macOS Monterey", + "name": "macOS", + "platform": "macOS", + "version": "12.6.1" + } + }, + "kibana.alert.ancestors": [ + { + "depth": 0, + "id": "vT9cwocBh3b8EMpD8lsi", + "index": ".ds-logs-endpoint.alerts-default-2023.04.27-000001", + "type": "event" + } + ], + "kibana.alert.depth": 1, + "kibana.alert.last_detected": "2023-04-27T11:03:57.993Z", + "kibana.alert.original_event.action": "creation", + "kibana.alert.original_event.agent_id_status": "auth_metadata_missing", + "kibana.alert.original_event.category": "malware", + "kibana.alert.original_event.code": "malicious_file", + "kibana.alert.original_event.dataset": "endpoint", + "kibana.alert.original_event.id": "b28993d4-8b8a-4f0f-9f54-84a89bad66ae", + "kibana.alert.original_event.ingested": "2023-04-27T10:58:03Z", + "kibana.alert.original_event.kind": "alert", + "kibana.alert.original_event.module": "endpoint", + "kibana.alert.original_event.sequence": 5826, + "kibana.alert.original_event.type": "creation", + "kibana.alert.original_time": "2023-04-29T07:17:32.103Z", + "kibana.alert.reason": "malware event with process malware writer, file fake_malware.exe, on Host-fwarau82er created medium alert Endpoint Security.", + "kibana.alert.risk_score": 47, + "kibana.alert.rule.actions": [ + ], + "kibana.alert.rule.author": [ + "Elastic" + ], + "kibana.alert.rule.category": "Custom Query Rule", + "kibana.alert.rule.consumer": "siem", + "kibana.alert.rule.created_at": "2023-04-27T10:58:27.546Z", + "kibana.alert.rule.created_by": "elastic", + "kibana.alert.rule.description": "Generates a detection alert each time an Elastic Endpoint Security alert is received. Enabling this rule allows you to immediately begin investigating your Endpoint alerts.", + "kibana.alert.rule.enabled": true, + "kibana.alert.rule.exceptions_list": [ + { + "id": "endpoint_list", + "list_id": "endpoint_list", + "namespace_type": "agnostic", + "type": "endpoint" + } + ], + "kibana.alert.rule.execution.uuid": "ebf843ff-e0e1-47f8-9ed2-cc8066afbcef", + "kibana.alert.rule.false_positives": [ + ], + "kibana.alert.rule.from": "now-10m", + "kibana.alert.rule.immutable": true, + "kibana.alert.rule.indices": [ + "logs-endpoint.alerts-*" + ], + "kibana.alert.rule.interval": "5m", + "kibana.alert.rule.license": "Elastic License v2", + "kibana.alert.rule.max_signals": 10000, + "kibana.alert.rule.name": "Endpoint Security", + "kibana.alert.rule.parameters": { + "author": [ + "Elastic" + ], + "description": "Generates a detection alert each time an Elastic Endpoint Security alert is received. Enabling this rule allows you to immediately begin investigating your Endpoint alerts.", + "exceptions_list": [ + { + "id": "endpoint_list", + "list_id": "endpoint_list", + "namespace_type": "agnostic", + "type": "endpoint" + } + ], + "false_positives": [ + ], + "from": "now-10m", + "immutable": true, + "index": [ + "logs-endpoint.alerts-*" + ], + "language": "kuery", + "license": "Elastic License v2", + "max_signals": 10000, + "query": "event.kind:alert and event.module:(endpoint and not endgame)\n", + "references": [ + ], + "related_integrations": [ + { + "package": "endpoint", + "version": "^8.2.0" + } + ], + "required_fields": [ + { + "ecs": true, + "name": "event.kind", + "type": "keyword" + }, + { + "ecs": true, + "name": "event.module", + "type": "keyword" + } + ], + "risk_score": 47, + "risk_score_mapping": [ + { + "field": "event.risk_score", + "operator": "equals", + "value": "" + } + ], + "rule_id": "9a1a2dae-0b5f-4c3d-8305-a268d404c306", + "rule_name_override": "message", + "setup": "", + "severity": "medium", + "severity_mapping": [ + { + "field": "event.severity", + "operator": "equals", + "severity": "low", + "value": "21" + }, + { + "field": "event.severity", + "operator": "equals", + "severity": "medium", + "value": "47" + }, + { + "field": "event.severity", + "operator": "equals", + "severity": "high", + "value": "73" + }, + { + "field": "event.severity", + "operator": "equals", + "severity": "critical", + "value": "99" + } + ], + "threat": [ + ], + "timestamp_override": "event.ingested", + "to": "now", + "type": "query", + "version": 101 + }, + "kibana.alert.rule.producer": "siem", + "kibana.alert.rule.references": [ + ], + "kibana.alert.rule.revision": 0, + "kibana.alert.rule.risk_score": 47, + "kibana.alert.rule.risk_score_mapping": [ + { + "field": "event.risk_score", + "operator": "equals", + "value": "" + } + ], + "kibana.alert.rule.rule_id": "9a1a2dae-0b5f-4c3d-8305-a268d404c306", + "kibana.alert.rule.rule_name_override": "message", + "kibana.alert.rule.rule_type_id": "siem.queryRule", + "kibana.alert.rule.severity": "medium", + "kibana.alert.rule.severity_mapping": [ + { + "field": "event.severity", + "operator": "equals", + "severity": "low", + "value": "21" + }, + { + "field": "event.severity", + "operator": "equals", + "severity": "medium", + "value": "47" + }, + { + "field": "event.severity", + "operator": "equals", + "severity": "high", + "value": "73" + }, + { + "field": "event.severity", + "operator": "equals", + "severity": "critical", + "value": "99" + } + ], + "kibana.alert.rule.tags": [ + "Elastic", + "Endpoint Security" + ], + "kibana.alert.rule.threat": [ + ], + "kibana.alert.rule.timestamp_override": "event.ingested", + "kibana.alert.rule.to": "now", + "kibana.alert.rule.type": "query", + "kibana.alert.rule.updated_at": "2023-04-27T10:58:27.546Z", + "kibana.alert.rule.updated_by": "elastic", + "kibana.alert.rule.uuid": "7015a3e2-e4ea-11ed-8c11-49608884878f", + "kibana.alert.rule.version": 101, + "kibana.alert.severity": "medium", + "kibana.alert.start": "2023-04-27T11:03:57.993Z", + "kibana.alert.status": "active", + "kibana.alert.url": "http://localhost:5601/app/security/alerts/redirect/eabbdefc23da981f2b74ab58b82622a97bb9878caa11bc914e2adfacc94780f1?index=.alerts-security.alerts-default×tamp=2023-04-27T11:03:57.906Z", + "kibana.alert.uuid": "eabbdefc23da981f2b74ab58b82622a97bb9878caa11bc914e2adfacc94780f1", + "kibana.alert.workflow_status": "open", + "kibana.space_ids": [ + "default" + ], + "kibana.version": "8.8.0", + "process": { + "Ext": { + "ancestry": [ + "qa5jgw1wr7", + "5k1hclygc6" + ], + "code_signature": [ + { + "subject_name": "bad signer", + "trusted": false + } + ], + "token": { + "domain": "NT AUTHORITY", + "integrity_level": 16384, + "integrity_level_name": "system", + "privileges": [ + { + "description": "Replace a process level token", + "enabled": false, + "name": "SeAssignPrimaryTokenPrivilege" + } + ], + "sid": "S-1-5-18", + "type": "tokenPrimary", + "user": "SYSTEM" + }, + "user": "SYSTEM" + }, + "entity_id": "nqh8ts6ves", + "entry_leader": { + "entity_id": "jnm38bel0w", + "name": "fake entry", + "pid": 791 + }, + "executable": "C:/malware.exe", + "group_leader": { + "entity_id": "jnm38bel0w", + "name": "fake leader", + "pid": 848 + }, + "hash": { + "md5": "fake md5", + "sha1": "fake sha1", + "sha256": "fake sha256" + }, + "name": "malware writer", + "parent": { + "entity_id": "qa5jgw1wr7", + "pid": 1 + }, + "pid": 2, + "session_leader": { + "entity_id": "jnm38bel0w", + "name": "fake session", + "pid": 909 + }, + "start": 1682752652103, + "uptime": 0 + } + } + } +} \ No newline at end of file diff --git a/x-pack/test/security_solution_cypress/es_archives/query_alert/mappings.json b/x-pack/test/security_solution_cypress/es_archives/query_alert/mappings.json new file mode 100644 index 0000000000000..f346eee132104 --- /dev/null +++ b/x-pack/test/security_solution_cypress/es_archives/query_alert/mappings.json @@ -0,0 +1,7904 @@ +{ + "type": "index", + "value": { + "aliases": { + ".alerts-security.alerts-default": { + "is_write_index": true + }, + ".siem-signals-default": { + "is_write_index": false + } + }, + "index": ".internal.alerts-security.alerts-default-000001", + "mappings": { + "_meta": { + "kibana": { + "version": "8.8.0" + }, + "managed": true, + "namespace": "default" + }, + "dynamic": "false", + "properties": { + "@timestamp": { + "type": "date" + }, + "agent": { + "properties": { + "build": { + "properties": { + "original": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ephemeral_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "client": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + }, + "as": { + "properties": { + "number": { + "type": "long" + }, + "organization": { + "properties": { + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "bytes": { + "type": "long" + }, + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "geo": { + "properties": { + "city_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "location": { + "type": "geo_point" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "postal_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "timezone": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ip": { + "type": "ip" + }, + "mac": { + "ignore_above": 1024, + "type": "keyword" + }, + "nat": { + "properties": { + "ip": { + "type": "ip" + }, + "port": { + "type": "long" + } + } + }, + "packets": { + "type": "long" + }, + "port": { + "type": "long" + }, + "registered_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "subdomain": { + "ignore_above": 1024, + "type": "keyword" + }, + "top_level_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "user": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "email": { + "ignore_above": 1024, + "type": "keyword" + }, + "full_name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "cloud": { + "properties": { + "account": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "availability_zone": { + "ignore_above": 1024, + "type": "keyword" + }, + "instance": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "machine": { + "properties": { + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "origin": { + "properties": { + "account": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "availability_zone": { + "ignore_above": 1024, + "type": "keyword" + }, + "instance": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "machine": { + "properties": { + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "project": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "provider": { + "ignore_above": 1024, + "type": "keyword" + }, + "region": { + "ignore_above": 1024, + "type": "keyword" + }, + "service": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "project": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "provider": { + "ignore_above": 1024, + "type": "keyword" + }, + "region": { + "ignore_above": 1024, + "type": "keyword" + }, + "service": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "target": { + "properties": { + "account": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "availability_zone": { + "ignore_above": 1024, + "type": "keyword" + }, + "instance": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "machine": { + "properties": { + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "project": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "provider": { + "ignore_above": 1024, + "type": "keyword" + }, + "region": { + "ignore_above": 1024, + "type": "keyword" + }, + "service": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + } + } + }, + "container": { + "properties": { + "cpu": { + "properties": { + "usage": { + "scaling_factor": 1000, + "type": "scaled_float" + } + } + }, + "disk": { + "properties": { + "read": { + "properties": { + "bytes": { + "type": "long" + } + } + }, + "write": { + "properties": { + "bytes": { + "type": "long" + } + } + } + } + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "image": { + "properties": { + "hash": { + "properties": { + "all": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "tag": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "labels": { + "type": "object" + }, + "memory": { + "properties": { + "usage": { + "scaling_factor": 1000, + "type": "scaled_float" + } + } + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "network": { + "properties": { + "egress": { + "properties": { + "bytes": { + "type": "long" + } + } + }, + "ingress": { + "properties": { + "bytes": { + "type": "long" + } + } + } + } + }, + "runtime": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "destination": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + }, + "as": { + "properties": { + "number": { + "type": "long" + }, + "organization": { + "properties": { + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "bytes": { + "type": "long" + }, + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "geo": { + "properties": { + "city_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "location": { + "type": "geo_point" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "postal_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "timezone": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ip": { + "type": "ip" + }, + "mac": { + "ignore_above": 1024, + "type": "keyword" + }, + "nat": { + "properties": { + "ip": { + "type": "ip" + }, + "port": { + "type": "long" + } + } + }, + "packets": { + "type": "long" + }, + "port": { + "type": "long" + }, + "registered_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "subdomain": { + "ignore_above": 1024, + "type": "keyword" + }, + "top_level_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "user": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "email": { + "ignore_above": 1024, + "type": "keyword" + }, + "full_name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "device": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "manufacturer": { + "ignore_above": 1024, + "type": "keyword" + }, + "model": { + "properties": { + "identifier": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "dll": { + "properties": { + "code_signature": { + "properties": { + "digest_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "exists": { + "type": "boolean" + }, + "signing_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "status": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "team_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "timestamp": { + "type": "date" + }, + "trusted": { + "type": "boolean" + }, + "valid": { + "type": "boolean" + } + } + }, + "hash": { + "properties": { + "md5": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha1": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha384": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha512": { + "ignore_above": 1024, + "type": "keyword" + }, + "ssdeep": { + "ignore_above": 1024, + "type": "keyword" + }, + "tlsh": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "ignore_above": 1024, + "type": "keyword" + }, + "pe": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "company": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "file_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "imphash": { + "ignore_above": 1024, + "type": "keyword" + }, + "original_file_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "pehash": { + "ignore_above": 1024, + "type": "keyword" + }, + "product": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "dns": { + "properties": { + "answers": { + "properties": { + "class": { + "ignore_above": 1024, + "type": "keyword" + }, + "data": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "ttl": { + "type": "long" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "header_flags": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "op_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "question": { + "properties": { + "class": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "registered_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "subdomain": { + "ignore_above": 1024, + "type": "keyword" + }, + "top_level_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "resolved_ip": { + "type": "ip" + }, + "response_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ecs": { + "properties": { + "version": { + "type": "keyword" + } + } + }, + "email": { + "properties": { + "attachments": { + "properties": { + "file": { + "properties": { + "extension": { + "ignore_above": 1024, + "type": "keyword" + }, + "hash": { + "properties": { + "md5": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha1": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha384": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha512": { + "ignore_above": 1024, + "type": "keyword" + }, + "ssdeep": { + "ignore_above": 1024, + "type": "keyword" + }, + "tlsh": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "mime_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "size": { + "type": "long" + } + } + } + }, + "type": "nested" + }, + "bcc": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "cc": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "content_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "delivery_timestamp": { + "type": "date" + }, + "direction": { + "ignore_above": 1024, + "type": "keyword" + }, + "from": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "local_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "message_id": { + "type": "wildcard" + }, + "origination_timestamp": { + "type": "date" + }, + "reply_to": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "sender": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "subject": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "to": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "x_mailer": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "error": { + "properties": { + "code": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "message": { + "type": "match_only_text" + }, + "stack_trace": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "event": { + "properties": { + "action": { + "type": "keyword" + }, + "agent_id_status": { + "ignore_above": 1024, + "type": "keyword" + }, + "category": { + "ignore_above": 1024, + "type": "keyword" + }, + "code": { + "ignore_above": 1024, + "type": "keyword" + }, + "created": { + "type": "date" + }, + "dataset": { + "ignore_above": 1024, + "type": "keyword" + }, + "duration": { + "type": "long" + }, + "end": { + "type": "date" + }, + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "ingested": { + "type": "date" + }, + "kind": { + "type": "keyword" + }, + "module": { + "ignore_above": 1024, + "type": "keyword" + }, + "original": { + "type": "keyword" + }, + "outcome": { + "ignore_above": 1024, + "type": "keyword" + }, + "provider": { + "ignore_above": 1024, + "type": "keyword" + }, + "reason": { + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + }, + "risk_score": { + "type": "float" + }, + "risk_score_norm": { + "type": "float" + }, + "sequence": { + "type": "long" + }, + "severity": { + "type": "long" + }, + "start": { + "type": "date" + }, + "timezone": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "url": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "faas": { + "properties": { + "coldstart": { + "type": "boolean" + }, + "execution": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "trigger": { + "properties": { + "request_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + }, + "type": "nested" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "file": { + "properties": { + "accessed": { + "type": "date" + }, + "attributes": { + "ignore_above": 1024, + "type": "keyword" + }, + "code_signature": { + "properties": { + "digest_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "exists": { + "type": "boolean" + }, + "signing_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "status": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "team_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "timestamp": { + "type": "date" + }, + "trusted": { + "type": "boolean" + }, + "valid": { + "type": "boolean" + } + } + }, + "created": { + "type": "date" + }, + "ctime": { + "type": "date" + }, + "device": { + "ignore_above": 1024, + "type": "keyword" + }, + "directory": { + "ignore_above": 1024, + "type": "keyword" + }, + "drive_letter": { + "ignore_above": 1, + "type": "keyword" + }, + "elf": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "byte_order": { + "ignore_above": 1024, + "type": "keyword" + }, + "cpu_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "creation_date": { + "type": "date" + }, + "exports": { + "type": "flattened" + }, + "header": { + "properties": { + "abi_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "class": { + "ignore_above": 1024, + "type": "keyword" + }, + "data": { + "ignore_above": 1024, + "type": "keyword" + }, + "entrypoint": { + "type": "long" + }, + "object_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "os_abi": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "imports": { + "type": "flattened" + }, + "sections": { + "properties": { + "chi2": { + "type": "long" + }, + "entropy": { + "type": "long" + }, + "flags": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "physical_offset": { + "ignore_above": 1024, + "type": "keyword" + }, + "physical_size": { + "type": "long" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "virtual_address": { + "type": "long" + }, + "virtual_size": { + "type": "long" + } + }, + "type": "nested" + }, + "segments": { + "properties": { + "sections": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + }, + "type": "nested" + }, + "shared_libraries": { + "ignore_above": 1024, + "type": "keyword" + }, + "telfhash": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "extension": { + "ignore_above": 1024, + "type": "keyword" + }, + "fork_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "gid": { + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "ignore_above": 1024, + "type": "keyword" + }, + "hash": { + "properties": { + "md5": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha1": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha384": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha512": { + "ignore_above": 1024, + "type": "keyword" + }, + "ssdeep": { + "ignore_above": 1024, + "type": "keyword" + }, + "tlsh": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "inode": { + "ignore_above": 1024, + "type": "keyword" + }, + "mime_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "mode": { + "ignore_above": 1024, + "type": "keyword" + }, + "mtime": { + "type": "date" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "owner": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "pe": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "company": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "file_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "imphash": { + "ignore_above": 1024, + "type": "keyword" + }, + "original_file_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "pehash": { + "ignore_above": 1024, + "type": "keyword" + }, + "product": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "size": { + "type": "long" + }, + "target_path": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "uid": { + "ignore_above": 1024, + "type": "keyword" + }, + "x509": { + "properties": { + "alternative_names": { + "ignore_above": 1024, + "type": "keyword" + }, + "issuer": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "not_after": { + "type": "date" + }, + "not_before": { + "type": "date" + }, + "public_key_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_curve": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_exponent": { + "type": "long" + }, + "public_key_size": { + "type": "long" + }, + "serial_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "signature_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "version_number": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "group": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "host": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "boot": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "cpu": { + "properties": { + "usage": { + "scaling_factor": 1000, + "type": "scaled_float" + } + } + }, + "disk": { + "properties": { + "read": { + "properties": { + "bytes": { + "type": "long" + } + } + }, + "write": { + "properties": { + "bytes": { + "type": "long" + } + } + } + } + }, + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "geo": { + "properties": { + "city_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "location": { + "type": "geo_point" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "postal_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "timezone": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hostname": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "ip": { + "type": "ip" + }, + "mac": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "network": { + "properties": { + "egress": { + "properties": { + "bytes": { + "type": "long" + }, + "packets": { + "type": "long" + } + } + }, + "ingress": { + "properties": { + "bytes": { + "type": "long" + }, + "packets": { + "type": "long" + } + } + } + } + }, + "os": { + "properties": { + "family": { + "ignore_above": 1024, + "type": "keyword" + }, + "full": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "kernel": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "platform": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "pid_ns_ino": { + "ignore_above": 1024, + "type": "keyword" + }, + "risk": { + "properties": { + "calculated_level": { + "ignore_above": 1024, + "type": "keyword" + }, + "calculated_score": { + "type": "float" + }, + "calculated_score_norm": { + "type": "float" + }, + "static_level": { + "ignore_above": 1024, + "type": "keyword" + }, + "static_score": { + "type": "float" + }, + "static_score_norm": { + "type": "float" + } + } + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "uptime": { + "type": "long" + } + } + }, + "http": { + "properties": { + "request": { + "properties": { + "body": { + "properties": { + "bytes": { + "type": "long" + }, + "content": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + } + } + }, + "bytes": { + "type": "long" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "method": { + "ignore_above": 1024, + "type": "keyword" + }, + "mime_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "referrer": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "response": { + "properties": { + "body": { + "properties": { + "bytes": { + "type": "long" + }, + "content": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + } + } + }, + "bytes": { + "type": "long" + }, + "mime_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "status_code": { + "type": "long" + } + } + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "kibana": { + "properties": { + "alert": { + "properties": { + "action_group": { + "type": "keyword" + }, + "ancestors": { + "properties": { + "depth": { + "type": "long" + }, + "id": { + "type": "keyword" + }, + "index": { + "type": "keyword" + }, + "rule": { + "type": "keyword" + }, + "type": { + "type": "keyword" + } + } + }, + "building_block_type": { + "type": "keyword" + }, + "case_ids": { + "type": "keyword" + }, + "depth": { + "type": "long" + }, + "duration": { + "properties": { + "us": { + "type": "long" + } + } + }, + "end": { + "type": "date" + }, + "flapping": { + "type": "boolean" + }, + "flapping_history": { + "type": "boolean" + }, + "group": { + "properties": { + "id": { + "type": "keyword" + }, + "index": { + "type": "integer" + } + } + }, + "instance": { + "properties": { + "id": { + "type": "keyword" + } + } + }, + "last_detected": { + "type": "date" + }, + "maintenance_window_ids": { + "type": "keyword" + }, + "new_terms": { + "type": "keyword" + }, + "original_event": { + "properties": { + "action": { + "type": "keyword" + }, + "agent_id_status": { + "type": "keyword" + }, + "category": { + "type": "keyword" + }, + "code": { + "type": "keyword" + }, + "created": { + "type": "date" + }, + "dataset": { + "type": "keyword" + }, + "duration": { + "type": "keyword" + }, + "end": { + "type": "date" + }, + "hash": { + "type": "keyword" + }, + "id": { + "type": "keyword" + }, + "ingested": { + "type": "date" + }, + "kind": { + "type": "keyword" + }, + "module": { + "type": "keyword" + }, + "original": { + "type": "keyword" + }, + "outcome": { + "type": "keyword" + }, + "provider": { + "type": "keyword" + }, + "reason": { + "type": "keyword" + }, + "reference": { + "type": "keyword" + }, + "risk_score": { + "type": "float" + }, + "risk_score_norm": { + "type": "float" + }, + "sequence": { + "type": "long" + }, + "severity": { + "type": "long" + }, + "start": { + "type": "date" + }, + "timezone": { + "type": "keyword" + }, + "type": { + "type": "keyword" + }, + "url": { + "type": "keyword" + } + } + }, + "original_time": { + "type": "date" + }, + "reason": { + "type": "keyword" + }, + "risk_score": { + "type": "float" + }, + "rule": { + "properties": { + "author": { + "type": "keyword" + }, + "building_block_type": { + "type": "keyword" + }, + "category": { + "type": "keyword" + }, + "consumer": { + "type": "keyword" + }, + "created_at": { + "type": "date" + }, + "created_by": { + "type": "keyword" + }, + "description": { + "type": "keyword" + }, + "enabled": { + "type": "keyword" + }, + "exceptions_list": { + "type": "object" + }, + "execution": { + "properties": { + "uuid": { + "type": "keyword" + } + } + }, + "false_positives": { + "type": "keyword" + }, + "from": { + "type": "keyword" + }, + "immutable": { + "type": "keyword" + }, + "interval": { + "type": "keyword" + }, + "license": { + "type": "keyword" + }, + "max_signals": { + "type": "long" + }, + "name": { + "type": "keyword" + }, + "note": { + "type": "keyword" + }, + "parameters": { + "ignore_above": 4096, + "type": "flattened" + }, + "producer": { + "type": "keyword" + }, + "references": { + "type": "keyword" + }, + "revision": { + "type": "long" + }, + "rule_id": { + "type": "keyword" + }, + "rule_name_override": { + "type": "keyword" + }, + "rule_type_id": { + "type": "keyword" + }, + "tags": { + "type": "keyword" + }, + "threat": { + "properties": { + "framework": { + "type": "keyword" + }, + "tactic": { + "properties": { + "id": { + "type": "keyword" + }, + "name": { + "type": "keyword" + }, + "reference": { + "type": "keyword" + } + } + }, + "technique": { + "properties": { + "id": { + "type": "keyword" + }, + "name": { + "type": "keyword" + }, + "reference": { + "type": "keyword" + }, + "subtechnique": { + "properties": { + "id": { + "type": "keyword" + }, + "name": { + "type": "keyword" + }, + "reference": { + "type": "keyword" + } + } + } + } + } + } + }, + "timeline_id": { + "type": "keyword" + }, + "timeline_title": { + "type": "keyword" + }, + "timestamp_override": { + "type": "keyword" + }, + "to": { + "type": "keyword" + }, + "type": { + "type": "keyword" + }, + "updated_at": { + "type": "date" + }, + "updated_by": { + "type": "keyword" + }, + "uuid": { + "type": "keyword" + }, + "version": { + "type": "keyword" + } + } + }, + "severity": { + "type": "keyword" + }, + "start": { + "type": "date" + }, + "status": { + "type": "keyword" + }, + "suppression": { + "properties": { + "docs_count": { + "type": "long" + }, + "end": { + "type": "date" + }, + "start": { + "type": "date" + }, + "terms": { + "properties": { + "field": { + "type": "keyword" + }, + "value": { + "type": "keyword" + } + } + } + } + }, + "system_status": { + "type": "keyword" + }, + "threshold_result": { + "properties": { + "cardinality": { + "properties": { + "field": { + "type": "keyword" + }, + "value": { + "type": "long" + } + } + }, + "count": { + "type": "long" + }, + "from": { + "type": "date" + }, + "terms": { + "properties": { + "field": { + "type": "keyword" + }, + "value": { + "type": "keyword" + } + } + } + } + }, + "time_range": { + "format": "epoch_millis||strict_date_optional_time", + "type": "date_range" + }, + "url": { + "ignore_above": 2048, + "index": false, + "type": "keyword" + }, + "uuid": { + "type": "keyword" + }, + "workflow_reason": { + "type": "keyword" + }, + "workflow_status": { + "type": "keyword" + }, + "workflow_user": { + "type": "keyword" + } + } + }, + "space_ids": { + "type": "keyword" + }, + "version": { + "type": "version" + } + } + }, + "labels": { + "type": "object" + }, + "log": { + "properties": { + "file": { + "properties": { + "path": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "level": { + "ignore_above": 1024, + "type": "keyword" + }, + "logger": { + "ignore_above": 1024, + "type": "keyword" + }, + "origin": { + "properties": { + "file": { + "properties": { + "line": { + "type": "long" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "function": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "syslog": { + "properties": { + "appname": { + "ignore_above": 1024, + "type": "keyword" + }, + "facility": { + "properties": { + "code": { + "type": "long" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hostname": { + "ignore_above": 1024, + "type": "keyword" + }, + "msgid": { + "ignore_above": 1024, + "type": "keyword" + }, + "priority": { + "type": "long" + }, + "procid": { + "ignore_above": 1024, + "type": "keyword" + }, + "severity": { + "properties": { + "code": { + "type": "long" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "structured_data": { + "type": "flattened" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "message": { + "type": "match_only_text" + }, + "network": { + "properties": { + "application": { + "ignore_above": 1024, + "type": "keyword" + }, + "bytes": { + "type": "long" + }, + "community_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "direction": { + "ignore_above": 1024, + "type": "keyword" + }, + "forwarded_ip": { + "type": "ip" + }, + "iana_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "inner": { + "properties": { + "vlan": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "packets": { + "type": "long" + }, + "protocol": { + "ignore_above": 1024, + "type": "keyword" + }, + "transport": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "vlan": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "observer": { + "properties": { + "egress": { + "properties": { + "interface": { + "properties": { + "alias": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "vlan": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "zone": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "geo": { + "properties": { + "city_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "location": { + "type": "geo_point" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "postal_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "timezone": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hostname": { + "ignore_above": 1024, + "type": "keyword" + }, + "ingress": { + "properties": { + "interface": { + "properties": { + "alias": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "vlan": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "zone": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ip": { + "type": "ip" + }, + "mac": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "os": { + "properties": { + "family": { + "ignore_above": 1024, + "type": "keyword" + }, + "full": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "kernel": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "platform": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "product": { + "ignore_above": 1024, + "type": "keyword" + }, + "serial_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "vendor": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "orchestrator": { + "properties": { + "api_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "cluster": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "url": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "namespace": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "resource": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "ip": { + "type": "ip" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "parent": { + "properties": { + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "organization": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "package": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "build_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "checksum": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "install_scope": { + "ignore_above": 1024, + "type": "keyword" + }, + "installed": { + "type": "date" + }, + "license": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + }, + "size": { + "type": "long" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "process": { + "properties": { + "args": { + "ignore_above": 1024, + "type": "keyword" + }, + "args_count": { + "type": "long" + }, + "code_signature": { + "properties": { + "digest_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "exists": { + "type": "boolean" + }, + "signing_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "status": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "team_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "timestamp": { + "type": "date" + }, + "trusted": { + "type": "boolean" + }, + "valid": { + "type": "boolean" + } + } + }, + "command_line": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + }, + "elf": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "byte_order": { + "ignore_above": 1024, + "type": "keyword" + }, + "cpu_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "creation_date": { + "type": "date" + }, + "exports": { + "type": "flattened" + }, + "header": { + "properties": { + "abi_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "class": { + "ignore_above": 1024, + "type": "keyword" + }, + "data": { + "ignore_above": 1024, + "type": "keyword" + }, + "entrypoint": { + "type": "long" + }, + "object_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "os_abi": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "imports": { + "type": "flattened" + }, + "sections": { + "properties": { + "chi2": { + "type": "long" + }, + "entropy": { + "type": "long" + }, + "flags": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "physical_offset": { + "ignore_above": 1024, + "type": "keyword" + }, + "physical_size": { + "type": "long" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "virtual_address": { + "type": "long" + }, + "virtual_size": { + "type": "long" + } + }, + "type": "nested" + }, + "segments": { + "properties": { + "sections": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + }, + "type": "nested" + }, + "shared_libraries": { + "ignore_above": 1024, + "type": "keyword" + }, + "telfhash": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "end": { + "type": "date" + }, + "entity_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "entry_leader": { + "properties": { + "args": { + "ignore_above": 1024, + "type": "keyword" + }, + "args_count": { + "type": "long" + }, + "attested_groups": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "attested_user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "command_line": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + }, + "entity_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "entry_meta": { + "properties": { + "source": { + "properties": { + "ip": { + "type": "ip" + } + } + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "executable": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "interactive": { + "type": "boolean" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "parent": { + "properties": { + "entity_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "pid": { + "type": "long" + }, + "session_leader": { + "properties": { + "entity_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "pid": { + "type": "long" + }, + "start": { + "type": "date" + } + } + }, + "start": { + "type": "date" + } + } + }, + "pid": { + "type": "long" + }, + "real_group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "real_user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "same_as_process": { + "type": "boolean" + }, + "saved_group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "saved_user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "start": { + "type": "date" + }, + "supplemental_groups": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "tty": { + "properties": { + "char_device": { + "properties": { + "major": { + "type": "long" + }, + "minor": { + "type": "long" + } + } + } + } + }, + "user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "working_directory": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "env_vars": { + "ignore_above": 1024, + "type": "keyword" + }, + "executable": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "exit_code": { + "type": "long" + }, + "group_leader": { + "properties": { + "args": { + "ignore_above": 1024, + "type": "keyword" + }, + "args_count": { + "type": "long" + }, + "command_line": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + }, + "entity_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "executable": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "interactive": { + "type": "boolean" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "pid": { + "type": "long" + }, + "real_group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "real_user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "same_as_process": { + "type": "boolean" + }, + "saved_group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "saved_user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "start": { + "type": "date" + }, + "supplemental_groups": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "tty": { + "properties": { + "char_device": { + "properties": { + "major": { + "type": "long" + }, + "minor": { + "type": "long" + } + } + } + } + }, + "user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "working_directory": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hash": { + "properties": { + "md5": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha1": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha384": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha512": { + "ignore_above": 1024, + "type": "keyword" + }, + "ssdeep": { + "ignore_above": 1024, + "type": "keyword" + }, + "tlsh": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "interactive": { + "type": "boolean" + }, + "io": { + "properties": { + "bytes_skipped": { + "properties": { + "length": { + "type": "long" + }, + "offset": { + "type": "long" + } + } + }, + "max_bytes_per_process_exceeded": { + "type": "boolean" + }, + "text": { + "type": "wildcard" + }, + "total_bytes_captured": { + "type": "long" + }, + "total_bytes_skipped": { + "type": "long" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "parent": { + "properties": { + "args": { + "ignore_above": 1024, + "type": "keyword" + }, + "args_count": { + "type": "long" + }, + "code_signature": { + "properties": { + "digest_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "exists": { + "type": "boolean" + }, + "signing_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "status": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "team_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "timestamp": { + "type": "date" + }, + "trusted": { + "type": "boolean" + }, + "valid": { + "type": "boolean" + } + } + }, + "command_line": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + }, + "elf": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "byte_order": { + "ignore_above": 1024, + "type": "keyword" + }, + "cpu_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "creation_date": { + "type": "date" + }, + "exports": { + "type": "flattened" + }, + "header": { + "properties": { + "abi_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "class": { + "ignore_above": 1024, + "type": "keyword" + }, + "data": { + "ignore_above": 1024, + "type": "keyword" + }, + "entrypoint": { + "type": "long" + }, + "object_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "os_abi": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "imports": { + "type": "flattened" + }, + "sections": { + "properties": { + "chi2": { + "type": "long" + }, + "entropy": { + "type": "long" + }, + "flags": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "physical_offset": { + "ignore_above": 1024, + "type": "keyword" + }, + "physical_size": { + "type": "long" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "virtual_address": { + "type": "long" + }, + "virtual_size": { + "type": "long" + } + }, + "type": "nested" + }, + "segments": { + "properties": { + "sections": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + }, + "type": "nested" + }, + "shared_libraries": { + "ignore_above": 1024, + "type": "keyword" + }, + "telfhash": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "end": { + "type": "date" + }, + "entity_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "executable": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "exit_code": { + "type": "long" + }, + "group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "group_leader": { + "properties": { + "entity_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "pid": { + "type": "long" + }, + "start": { + "type": "date" + } + } + }, + "hash": { + "properties": { + "md5": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha1": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha384": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha512": { + "ignore_above": 1024, + "type": "keyword" + }, + "ssdeep": { + "ignore_above": 1024, + "type": "keyword" + }, + "tlsh": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "interactive": { + "type": "boolean" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "pe": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "company": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "file_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "imphash": { + "ignore_above": 1024, + "type": "keyword" + }, + "original_file_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "pehash": { + "ignore_above": 1024, + "type": "keyword" + }, + "product": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "pgid": { + "type": "long" + }, + "pid": { + "type": "long" + }, + "real_group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "real_user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "saved_group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "saved_user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "start": { + "type": "date" + }, + "supplemental_groups": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "thread": { + "properties": { + "id": { + "type": "long" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "title": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "tty": { + "properties": { + "char_device": { + "properties": { + "major": { + "type": "long" + }, + "minor": { + "type": "long" + } + } + } + } + }, + "uptime": { + "type": "long" + }, + "user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "working_directory": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "pe": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "company": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "file_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "imphash": { + "ignore_above": 1024, + "type": "keyword" + }, + "original_file_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "pehash": { + "ignore_above": 1024, + "type": "keyword" + }, + "product": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "pgid": { + "type": "long" + }, + "pid": { + "type": "long" + }, + "previous": { + "properties": { + "args": { + "ignore_above": 1024, + "type": "keyword" + }, + "args_count": { + "type": "long" + }, + "executable": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "real_group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "real_user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "saved_group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "saved_user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "session_leader": { + "properties": { + "args": { + "ignore_above": 1024, + "type": "keyword" + }, + "args_count": { + "type": "long" + }, + "command_line": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + }, + "entity_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "executable": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "interactive": { + "type": "boolean" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "parent": { + "properties": { + "entity_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "pid": { + "type": "long" + }, + "session_leader": { + "properties": { + "entity_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "pid": { + "type": "long" + }, + "start": { + "type": "date" + } + } + }, + "start": { + "type": "date" + } + } + }, + "pid": { + "type": "long" + }, + "real_group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "real_user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "same_as_process": { + "type": "boolean" + }, + "saved_group": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "saved_user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "start": { + "type": "date" + }, + "supplemental_groups": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "tty": { + "properties": { + "char_device": { + "properties": { + "major": { + "type": "long" + }, + "minor": { + "type": "long" + } + } + } + } + }, + "user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "working_directory": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "start": { + "type": "date" + }, + "supplemental_groups": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "thread": { + "properties": { + "id": { + "type": "long" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "title": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "tty": { + "properties": { + "char_device": { + "properties": { + "major": { + "type": "long" + }, + "minor": { + "type": "long" + } + } + }, + "columns": { + "type": "long" + }, + "rows": { + "type": "long" + } + } + }, + "uptime": { + "type": "long" + }, + "user": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "working_directory": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "registry": { + "properties": { + "data": { + "properties": { + "bytes": { + "ignore_above": 1024, + "type": "keyword" + }, + "strings": { + "type": "wildcard" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hive": { + "ignore_above": 1024, + "type": "keyword" + }, + "key": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "ignore_above": 1024, + "type": "keyword" + }, + "value": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "related": { + "properties": { + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "hosts": { + "ignore_above": 1024, + "type": "keyword" + }, + "ip": { + "type": "ip" + }, + "user": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "rule": { + "properties": { + "author": { + "ignore_above": 1024, + "type": "keyword" + }, + "category": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "license": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + }, + "ruleset": { + "ignore_above": 1024, + "type": "keyword" + }, + "uuid": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "server": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + }, + "as": { + "properties": { + "number": { + "type": "long" + }, + "organization": { + "properties": { + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "bytes": { + "type": "long" + }, + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "geo": { + "properties": { + "city_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "location": { + "type": "geo_point" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "postal_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "timezone": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ip": { + "type": "ip" + }, + "mac": { + "ignore_above": 1024, + "type": "keyword" + }, + "nat": { + "properties": { + "ip": { + "type": "ip" + }, + "port": { + "type": "long" + } + } + }, + "packets": { + "type": "long" + }, + "port": { + "type": "long" + }, + "registered_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "subdomain": { + "ignore_above": 1024, + "type": "keyword" + }, + "top_level_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "user": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "email": { + "ignore_above": 1024, + "type": "keyword" + }, + "full_name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "service": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + }, + "environment": { + "ignore_above": 1024, + "type": "keyword" + }, + "ephemeral_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "node": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "role": { + "ignore_above": 1024, + "type": "keyword" + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "origin": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + }, + "environment": { + "ignore_above": 1024, + "type": "keyword" + }, + "ephemeral_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "node": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "role": { + "ignore_above": 1024, + "type": "keyword" + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "state": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "state": { + "ignore_above": 1024, + "type": "keyword" + }, + "target": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + }, + "environment": { + "ignore_above": 1024, + "type": "keyword" + }, + "ephemeral_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "node": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "role": { + "ignore_above": 1024, + "type": "keyword" + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "state": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "signal": { + "properties": { + "ancestors": { + "properties": { + "depth": { + "path": "kibana.alert.ancestors.depth", + "type": "alias" + }, + "id": { + "path": "kibana.alert.ancestors.id", + "type": "alias" + }, + "index": { + "path": "kibana.alert.ancestors.index", + "type": "alias" + }, + "type": { + "path": "kibana.alert.ancestors.type", + "type": "alias" + } + } + }, + "depth": { + "path": "kibana.alert.depth", + "type": "alias" + }, + "group": { + "properties": { + "id": { + "path": "kibana.alert.group.id", + "type": "alias" + }, + "index": { + "path": "kibana.alert.group.index", + "type": "alias" + } + } + }, + "original_event": { + "properties": { + "action": { + "path": "kibana.alert.original_event.action", + "type": "alias" + }, + "category": { + "path": "kibana.alert.original_event.category", + "type": "alias" + }, + "code": { + "path": "kibana.alert.original_event.code", + "type": "alias" + }, + "created": { + "path": "kibana.alert.original_event.created", + "type": "alias" + }, + "dataset": { + "path": "kibana.alert.original_event.dataset", + "type": "alias" + }, + "duration": { + "path": "kibana.alert.original_event.duration", + "type": "alias" + }, + "end": { + "path": "kibana.alert.original_event.end", + "type": "alias" + }, + "hash": { + "path": "kibana.alert.original_event.hash", + "type": "alias" + }, + "id": { + "path": "kibana.alert.original_event.id", + "type": "alias" + }, + "kind": { + "path": "kibana.alert.original_event.kind", + "type": "alias" + }, + "module": { + "path": "kibana.alert.original_event.module", + "type": "alias" + }, + "outcome": { + "path": "kibana.alert.original_event.outcome", + "type": "alias" + }, + "provider": { + "path": "kibana.alert.original_event.provider", + "type": "alias" + }, + "reason": { + "path": "kibana.alert.original_event.reason", + "type": "alias" + }, + "risk_score": { + "path": "kibana.alert.original_event.risk_score", + "type": "alias" + }, + "risk_score_norm": { + "path": "kibana.alert.original_event.risk_score_norm", + "type": "alias" + }, + "sequence": { + "path": "kibana.alert.original_event.sequence", + "type": "alias" + }, + "severity": { + "path": "kibana.alert.original_event.severity", + "type": "alias" + }, + "start": { + "path": "kibana.alert.original_event.start", + "type": "alias" + }, + "timezone": { + "path": "kibana.alert.original_event.timezone", + "type": "alias" + }, + "type": { + "path": "kibana.alert.original_event.type", + "type": "alias" + } + } + }, + "original_time": { + "path": "kibana.alert.original_time", + "type": "alias" + }, + "reason": { + "path": "kibana.alert.reason", + "type": "alias" + }, + "rule": { + "properties": { + "author": { + "path": "kibana.alert.rule.author", + "type": "alias" + }, + "building_block_type": { + "path": "kibana.alert.building_block_type", + "type": "alias" + }, + "created_at": { + "path": "kibana.alert.rule.created_at", + "type": "alias" + }, + "created_by": { + "path": "kibana.alert.rule.created_by", + "type": "alias" + }, + "description": { + "path": "kibana.alert.rule.description", + "type": "alias" + }, + "enabled": { + "path": "kibana.alert.rule.enabled", + "type": "alias" + }, + "false_positives": { + "path": "kibana.alert.rule.false_positives", + "type": "alias" + }, + "from": { + "path": "kibana.alert.rule.from", + "type": "alias" + }, + "id": { + "path": "kibana.alert.rule.uuid", + "type": "alias" + }, + "immutable": { + "path": "kibana.alert.rule.immutable", + "type": "alias" + }, + "interval": { + "path": "kibana.alert.rule.interval", + "type": "alias" + }, + "license": { + "path": "kibana.alert.rule.license", + "type": "alias" + }, + "max_signals": { + "path": "kibana.alert.rule.max_signals", + "type": "alias" + }, + "name": { + "path": "kibana.alert.rule.name", + "type": "alias" + }, + "note": { + "path": "kibana.alert.rule.note", + "type": "alias" + }, + "references": { + "path": "kibana.alert.rule.references", + "type": "alias" + }, + "risk_score": { + "path": "kibana.alert.risk_score", + "type": "alias" + }, + "rule_id": { + "path": "kibana.alert.rule.rule_id", + "type": "alias" + }, + "rule_name_override": { + "path": "kibana.alert.rule.rule_name_override", + "type": "alias" + }, + "severity": { + "path": "kibana.alert.severity", + "type": "alias" + }, + "tags": { + "path": "kibana.alert.rule.tags", + "type": "alias" + }, + "threat": { + "properties": { + "framework": { + "path": "kibana.alert.rule.threat.framework", + "type": "alias" + }, + "tactic": { + "properties": { + "id": { + "path": "kibana.alert.rule.threat.tactic.id", + "type": "alias" + }, + "name": { + "path": "kibana.alert.rule.threat.tactic.name", + "type": "alias" + }, + "reference": { + "path": "kibana.alert.rule.threat.tactic.reference", + "type": "alias" + } + } + }, + "technique": { + "properties": { + "id": { + "path": "kibana.alert.rule.threat.technique.id", + "type": "alias" + }, + "name": { + "path": "kibana.alert.rule.threat.technique.name", + "type": "alias" + }, + "reference": { + "path": "kibana.alert.rule.threat.technique.reference", + "type": "alias" + }, + "subtechnique": { + "properties": { + "id": { + "path": "kibana.alert.rule.threat.technique.subtechnique.id", + "type": "alias" + }, + "name": { + "path": "kibana.alert.rule.threat.technique.subtechnique.name", + "type": "alias" + }, + "reference": { + "path": "kibana.alert.rule.threat.technique.subtechnique.reference", + "type": "alias" + } + } + } + } + } + } + }, + "timeline_id": { + "path": "kibana.alert.rule.timeline_id", + "type": "alias" + }, + "timeline_title": { + "path": "kibana.alert.rule.timeline_title", + "type": "alias" + }, + "timestamp_override": { + "path": "kibana.alert.rule.timestamp_override", + "type": "alias" + }, + "to": { + "path": "kibana.alert.rule.to", + "type": "alias" + }, + "type": { + "path": "kibana.alert.rule.type", + "type": "alias" + }, + "updated_at": { + "path": "kibana.alert.rule.updated_at", + "type": "alias" + }, + "updated_by": { + "path": "kibana.alert.rule.updated_by", + "type": "alias" + }, + "version": { + "path": "kibana.alert.rule.version", + "type": "alias" + } + } + }, + "status": { + "path": "kibana.alert.workflow_status", + "type": "alias" + }, + "threshold_result": { + "properties": { + "cardinality": { + "properties": { + "field": { + "path": "kibana.alert.threshold_result.cardinality.field", + "type": "alias" + }, + "value": { + "path": "kibana.alert.threshold_result.cardinality.value", + "type": "alias" + } + } + }, + "count": { + "path": "kibana.alert.threshold_result.count", + "type": "alias" + }, + "from": { + "path": "kibana.alert.threshold_result.from", + "type": "alias" + }, + "terms": { + "properties": { + "field": { + "path": "kibana.alert.threshold_result.terms.field", + "type": "alias" + }, + "value": { + "path": "kibana.alert.threshold_result.terms.value", + "type": "alias" + } + } + } + } + } + } + }, + "source": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + }, + "as": { + "properties": { + "number": { + "type": "long" + }, + "organization": { + "properties": { + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "bytes": { + "type": "long" + }, + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "geo": { + "properties": { + "city_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "location": { + "type": "geo_point" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "postal_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "timezone": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ip": { + "type": "ip" + }, + "mac": { + "ignore_above": 1024, + "type": "keyword" + }, + "nat": { + "properties": { + "ip": { + "type": "ip" + }, + "port": { + "type": "long" + } + } + }, + "packets": { + "type": "long" + }, + "port": { + "type": "long" + }, + "registered_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "subdomain": { + "ignore_above": 1024, + "type": "keyword" + }, + "top_level_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "user": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "email": { + "ignore_above": 1024, + "type": "keyword" + }, + "full_name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "span": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "tags": { + "type": "keyword" + }, + "threat": { + "properties": { + "enrichments": { + "properties": { + "indicator": { + "properties": { + "as": { + "properties": { + "number": { + "type": "long" + }, + "organization": { + "properties": { + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "confidence": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "email": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "file": { + "properties": { + "accessed": { + "type": "date" + }, + "attributes": { + "ignore_above": 1024, + "type": "keyword" + }, + "code_signature": { + "properties": { + "digest_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "exists": { + "type": "boolean" + }, + "signing_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "status": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "team_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "timestamp": { + "type": "date" + }, + "trusted": { + "type": "boolean" + }, + "valid": { + "type": "boolean" + } + } + }, + "created": { + "type": "date" + }, + "ctime": { + "type": "date" + }, + "device": { + "ignore_above": 1024, + "type": "keyword" + }, + "directory": { + "ignore_above": 1024, + "type": "keyword" + }, + "drive_letter": { + "ignore_above": 1, + "type": "keyword" + }, + "elf": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "byte_order": { + "ignore_above": 1024, + "type": "keyword" + }, + "cpu_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "creation_date": { + "type": "date" + }, + "exports": { + "type": "flattened" + }, + "header": { + "properties": { + "abi_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "class": { + "ignore_above": 1024, + "type": "keyword" + }, + "data": { + "ignore_above": 1024, + "type": "keyword" + }, + "entrypoint": { + "type": "long" + }, + "object_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "os_abi": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "imports": { + "type": "flattened" + }, + "sections": { + "properties": { + "chi2": { + "type": "long" + }, + "entropy": { + "type": "long" + }, + "flags": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "physical_offset": { + "ignore_above": 1024, + "type": "keyword" + }, + "physical_size": { + "type": "long" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "virtual_address": { + "type": "long" + }, + "virtual_size": { + "type": "long" + } + }, + "type": "nested" + }, + "segments": { + "properties": { + "sections": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + }, + "type": "nested" + }, + "shared_libraries": { + "ignore_above": 1024, + "type": "keyword" + }, + "telfhash": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "extension": { + "ignore_above": 1024, + "type": "keyword" + }, + "fork_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "gid": { + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "ignore_above": 1024, + "type": "keyword" + }, + "hash": { + "properties": { + "md5": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha1": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha384": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha512": { + "ignore_above": 1024, + "type": "keyword" + }, + "ssdeep": { + "ignore_above": 1024, + "type": "keyword" + }, + "tlsh": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "inode": { + "ignore_above": 1024, + "type": "keyword" + }, + "mime_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "mode": { + "ignore_above": 1024, + "type": "keyword" + }, + "mtime": { + "type": "date" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "owner": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "pe": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "company": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "file_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "imphash": { + "ignore_above": 1024, + "type": "keyword" + }, + "original_file_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "pehash": { + "ignore_above": 1024, + "type": "keyword" + }, + "product": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "size": { + "type": "long" + }, + "target_path": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "uid": { + "ignore_above": 1024, + "type": "keyword" + }, + "x509": { + "properties": { + "alternative_names": { + "ignore_above": 1024, + "type": "keyword" + }, + "issuer": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "not_after": { + "type": "date" + }, + "not_before": { + "type": "date" + }, + "public_key_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_curve": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_exponent": { + "type": "long" + }, + "public_key_size": { + "type": "long" + }, + "serial_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "signature_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "version_number": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "first_seen": { + "type": "date" + }, + "geo": { + "properties": { + "city_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "location": { + "type": "geo_point" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "postal_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "timezone": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ip": { + "type": "ip" + }, + "last_seen": { + "type": "date" + }, + "marking": { + "properties": { + "tlp": { + "ignore_above": 1024, + "type": "keyword" + }, + "tlp_version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "modified_at": { + "type": "date" + }, + "port": { + "type": "long" + }, + "provider": { + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + }, + "registry": { + "properties": { + "data": { + "properties": { + "bytes": { + "ignore_above": 1024, + "type": "keyword" + }, + "strings": { + "type": "wildcard" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hive": { + "ignore_above": 1024, + "type": "keyword" + }, + "key": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "ignore_above": 1024, + "type": "keyword" + }, + "value": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "scanner_stats": { + "type": "long" + }, + "sightings": { + "type": "long" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "url": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "extension": { + "ignore_above": 1024, + "type": "keyword" + }, + "fragment": { + "ignore_above": 1024, + "type": "keyword" + }, + "full": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + }, + "original": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + }, + "password": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "type": "wildcard" + }, + "port": { + "type": "long" + }, + "query": { + "ignore_above": 1024, + "type": "keyword" + }, + "registered_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "scheme": { + "ignore_above": 1024, + "type": "keyword" + }, + "subdomain": { + "ignore_above": 1024, + "type": "keyword" + }, + "top_level_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "username": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "x509": { + "properties": { + "alternative_names": { + "ignore_above": 1024, + "type": "keyword" + }, + "issuer": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "not_after": { + "type": "date" + }, + "not_before": { + "type": "date" + }, + "public_key_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_curve": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_exponent": { + "type": "long" + }, + "public_key_size": { + "type": "long" + }, + "serial_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "signature_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "version_number": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "matched": { + "properties": { + "atomic": { + "ignore_above": 1024, + "type": "keyword" + }, + "field": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "index": { + "ignore_above": 1024, + "type": "keyword" + }, + "occurred": { + "type": "date" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + }, + "type": "nested" + }, + "feed": { + "properties": { + "dashboard_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "framework": { + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "alias": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "indicator": { + "properties": { + "as": { + "properties": { + "number": { + "type": "long" + }, + "organization": { + "properties": { + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "confidence": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "email": { + "properties": { + "address": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "file": { + "properties": { + "accessed": { + "type": "date" + }, + "attributes": { + "ignore_above": 1024, + "type": "keyword" + }, + "code_signature": { + "properties": { + "digest_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "exists": { + "type": "boolean" + }, + "signing_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "status": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "team_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "timestamp": { + "type": "date" + }, + "trusted": { + "type": "boolean" + }, + "valid": { + "type": "boolean" + } + } + }, + "created": { + "type": "date" + }, + "ctime": { + "type": "date" + }, + "device": { + "ignore_above": 1024, + "type": "keyword" + }, + "directory": { + "ignore_above": 1024, + "type": "keyword" + }, + "drive_letter": { + "ignore_above": 1, + "type": "keyword" + }, + "elf": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "byte_order": { + "ignore_above": 1024, + "type": "keyword" + }, + "cpu_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "creation_date": { + "type": "date" + }, + "exports": { + "type": "flattened" + }, + "header": { + "properties": { + "abi_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "class": { + "ignore_above": 1024, + "type": "keyword" + }, + "data": { + "ignore_above": 1024, + "type": "keyword" + }, + "entrypoint": { + "type": "long" + }, + "object_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "os_abi": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "imports": { + "type": "flattened" + }, + "sections": { + "properties": { + "chi2": { + "type": "long" + }, + "entropy": { + "type": "long" + }, + "flags": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "physical_offset": { + "ignore_above": 1024, + "type": "keyword" + }, + "physical_size": { + "type": "long" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "virtual_address": { + "type": "long" + }, + "virtual_size": { + "type": "long" + } + }, + "type": "nested" + }, + "segments": { + "properties": { + "sections": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + }, + "type": "nested" + }, + "shared_libraries": { + "ignore_above": 1024, + "type": "keyword" + }, + "telfhash": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "extension": { + "ignore_above": 1024, + "type": "keyword" + }, + "fork_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "gid": { + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "ignore_above": 1024, + "type": "keyword" + }, + "hash": { + "properties": { + "md5": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha1": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha384": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha512": { + "ignore_above": 1024, + "type": "keyword" + }, + "ssdeep": { + "ignore_above": 1024, + "type": "keyword" + }, + "tlsh": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "inode": { + "ignore_above": 1024, + "type": "keyword" + }, + "mime_type": { + "ignore_above": 1024, + "type": "keyword" + }, + "mode": { + "ignore_above": 1024, + "type": "keyword" + }, + "mtime": { + "type": "date" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "owner": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "pe": { + "properties": { + "architecture": { + "ignore_above": 1024, + "type": "keyword" + }, + "company": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "ignore_above": 1024, + "type": "keyword" + }, + "file_version": { + "ignore_above": 1024, + "type": "keyword" + }, + "imphash": { + "ignore_above": 1024, + "type": "keyword" + }, + "original_file_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "pehash": { + "ignore_above": 1024, + "type": "keyword" + }, + "product": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "size": { + "type": "long" + }, + "target_path": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "uid": { + "ignore_above": 1024, + "type": "keyword" + }, + "x509": { + "properties": { + "alternative_names": { + "ignore_above": 1024, + "type": "keyword" + }, + "issuer": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "not_after": { + "type": "date" + }, + "not_before": { + "type": "date" + }, + "public_key_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_curve": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_exponent": { + "type": "long" + }, + "public_key_size": { + "type": "long" + }, + "serial_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "signature_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "version_number": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "first_seen": { + "type": "date" + }, + "geo": { + "properties": { + "city_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "continent_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "country_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "location": { + "type": "geo_point" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "postal_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_iso_code": { + "ignore_above": 1024, + "type": "keyword" + }, + "region_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "timezone": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "ip": { + "type": "ip" + }, + "last_seen": { + "type": "date" + }, + "marking": { + "properties": { + "tlp": { + "ignore_above": 1024, + "type": "keyword" + }, + "tlp_version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "modified_at": { + "type": "date" + }, + "port": { + "type": "long" + }, + "provider": { + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + }, + "registry": { + "properties": { + "data": { + "properties": { + "bytes": { + "ignore_above": 1024, + "type": "keyword" + }, + "strings": { + "type": "wildcard" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hive": { + "ignore_above": 1024, + "type": "keyword" + }, + "key": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "ignore_above": 1024, + "type": "keyword" + }, + "value": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "scanner_stats": { + "type": "long" + }, + "sightings": { + "type": "long" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "url": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "extension": { + "ignore_above": 1024, + "type": "keyword" + }, + "fragment": { + "ignore_above": 1024, + "type": "keyword" + }, + "full": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + }, + "original": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + }, + "password": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "type": "wildcard" + }, + "port": { + "type": "long" + }, + "query": { + "ignore_above": 1024, + "type": "keyword" + }, + "registered_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "scheme": { + "ignore_above": 1024, + "type": "keyword" + }, + "subdomain": { + "ignore_above": 1024, + "type": "keyword" + }, + "top_level_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "username": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "x509": { + "properties": { + "alternative_names": { + "ignore_above": 1024, + "type": "keyword" + }, + "issuer": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "not_after": { + "type": "date" + }, + "not_before": { + "type": "date" + }, + "public_key_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_curve": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_exponent": { + "type": "long" + }, + "public_key_size": { + "type": "long" + }, + "serial_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "signature_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "version_number": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "software": { + "properties": { + "alias": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "platforms": { + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "tactic": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "technique": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + }, + "subtechnique": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + } + } + }, + "tls": { + "properties": { + "cipher": { + "ignore_above": 1024, + "type": "keyword" + }, + "client": { + "properties": { + "certificate": { + "ignore_above": 1024, + "type": "keyword" + }, + "certificate_chain": { + "ignore_above": 1024, + "type": "keyword" + }, + "hash": { + "properties": { + "md5": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha1": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "issuer": { + "ignore_above": 1024, + "type": "keyword" + }, + "ja3": { + "ignore_above": 1024, + "type": "keyword" + }, + "not_after": { + "type": "date" + }, + "not_before": { + "type": "date" + }, + "server_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "ignore_above": 1024, + "type": "keyword" + }, + "supported_ciphers": { + "ignore_above": 1024, + "type": "keyword" + }, + "x509": { + "properties": { + "alternative_names": { + "ignore_above": 1024, + "type": "keyword" + }, + "issuer": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "not_after": { + "type": "date" + }, + "not_before": { + "type": "date" + }, + "public_key_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_curve": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_exponent": { + "type": "long" + }, + "public_key_size": { + "type": "long" + }, + "serial_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "signature_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "version_number": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "curve": { + "ignore_above": 1024, + "type": "keyword" + }, + "established": { + "type": "boolean" + }, + "next_protocol": { + "ignore_above": 1024, + "type": "keyword" + }, + "resumed": { + "type": "boolean" + }, + "server": { + "properties": { + "certificate": { + "ignore_above": 1024, + "type": "keyword" + }, + "certificate_chain": { + "ignore_above": 1024, + "type": "keyword" + }, + "hash": { + "properties": { + "md5": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha1": { + "ignore_above": 1024, + "type": "keyword" + }, + "sha256": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "issuer": { + "ignore_above": 1024, + "type": "keyword" + }, + "ja3s": { + "ignore_above": 1024, + "type": "keyword" + }, + "not_after": { + "type": "date" + }, + "not_before": { + "type": "date" + }, + "subject": { + "ignore_above": 1024, + "type": "keyword" + }, + "x509": { + "properties": { + "alternative_names": { + "ignore_above": 1024, + "type": "keyword" + }, + "issuer": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "not_after": { + "type": "date" + }, + "not_before": { + "type": "date" + }, + "public_key_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_curve": { + "ignore_above": 1024, + "type": "keyword" + }, + "public_key_exponent": { + "type": "long" + }, + "public_key_size": { + "type": "long" + }, + "serial_number": { + "ignore_above": 1024, + "type": "keyword" + }, + "signature_algorithm": { + "ignore_above": 1024, + "type": "keyword" + }, + "subject": { + "properties": { + "common_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "country": { + "ignore_above": 1024, + "type": "keyword" + }, + "distinguished_name": { + "ignore_above": 1024, + "type": "keyword" + }, + "locality": { + "ignore_above": 1024, + "type": "keyword" + }, + "organization": { + "ignore_above": 1024, + "type": "keyword" + }, + "organizational_unit": { + "ignore_above": 1024, + "type": "keyword" + }, + "state_or_province": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "version_number": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + }, + "version_protocol": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "trace": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "transaction": { + "properties": { + "id": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "url": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "extension": { + "ignore_above": 1024, + "type": "keyword" + }, + "fragment": { + "ignore_above": 1024, + "type": "keyword" + }, + "full": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + }, + "original": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "type": "wildcard" + }, + "password": { + "ignore_above": 1024, + "type": "keyword" + }, + "path": { + "type": "wildcard" + }, + "port": { + "type": "long" + }, + "query": { + "ignore_above": 1024, + "type": "keyword" + }, + "registered_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "scheme": { + "ignore_above": 1024, + "type": "keyword" + }, + "subdomain": { + "ignore_above": 1024, + "type": "keyword" + }, + "top_level_domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "username": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "user": { + "properties": { + "changes": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "email": { + "ignore_above": 1024, + "type": "keyword" + }, + "full_name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "effective": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "email": { + "ignore_above": 1024, + "type": "keyword" + }, + "full_name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "email": { + "ignore_above": 1024, + "type": "keyword" + }, + "full_name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "risk": { + "properties": { + "calculated_level": { + "ignore_above": 1024, + "type": "keyword" + }, + "calculated_score": { + "type": "float" + }, + "calculated_score_norm": { + "type": "float" + }, + "static_level": { + "ignore_above": 1024, + "type": "keyword" + }, + "static_score": { + "type": "float" + }, + "static_score_norm": { + "type": "float" + } + } + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + }, + "target": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "email": { + "ignore_above": 1024, + "type": "keyword" + }, + "full_name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "group": { + "properties": { + "domain": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "hash": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "roles": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "user_agent": { + "properties": { + "device": { + "properties": { + "name": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "name": { + "ignore_above": 1024, + "type": "keyword" + }, + "original": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "os": { + "properties": { + "family": { + "ignore_above": 1024, + "type": "keyword" + }, + "full": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "kernel": { + "ignore_above": 1024, + "type": "keyword" + }, + "name": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "platform": { + "ignore_above": 1024, + "type": "keyword" + }, + "type": { + "ignore_above": 1024, + "type": "keyword" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "vulnerability": { + "properties": { + "category": { + "ignore_above": 1024, + "type": "keyword" + }, + "classification": { + "ignore_above": 1024, + "type": "keyword" + }, + "description": { + "fields": { + "text": { + "type": "match_only_text" + } + }, + "ignore_above": 1024, + "type": "keyword" + }, + "enumeration": { + "ignore_above": 1024, + "type": "keyword" + }, + "id": { + "ignore_above": 1024, + "type": "keyword" + }, + "reference": { + "ignore_above": 1024, + "type": "keyword" + }, + "report_id": { + "ignore_above": 1024, + "type": "keyword" + }, + "scanner": { + "properties": { + "vendor": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "score": { + "properties": { + "base": { + "type": "float" + }, + "environmental": { + "type": "float" + }, + "temporal": { + "type": "float" + }, + "version": { + "ignore_above": 1024, + "type": "keyword" + } + } + }, + "severity": { + "ignore_above": 1024, + "type": "keyword" + } + } + } + } + }, + "settings": { + "index": { + "auto_expand_replicas": "0-1", + "hidden": "true", + "lifecycle": { + "name": ".alerts-ilm-policy", + "rollover_alias": ".alerts-security.alerts-default" + }, + "mapping": { + "total_fields": { + "limit": "2500" + } + }, + "number_of_replicas": "0", + "number_of_shards": "1" + } + } + } +} \ No newline at end of file diff --git a/x-pack/test/spaces_api_integration/common/suites/copy_to_space.ts b/x-pack/test/spaces_api_integration/common/suites/copy_to_space.ts index 4c5ae878bbf6e..2325e0259c8dd 100644 --- a/x-pack/test/spaces_api_integration/common/suites/copy_to_space.ts +++ b/x-pack/test/spaces_api_integration/common/suites/copy_to_space.ts @@ -182,6 +182,7 @@ export function copyToSpaceTestSuiteFactory(context: FtrProviderContext) { icon: 'dashboardApp', }, destinationId: dashboardDestinationId, + managed: false, }, ], }, @@ -229,24 +230,28 @@ export function copyToSpaceTestSuiteFactory(context: FtrProviderContext) { title: `Copy to Space index pattern 1 from ${spaceId} space`, }, destinationId: indexPatternDestinationId, + managed: false, }, { id: `cts_vis_1_${spaceId}`, type: 'visualization', meta: { icon: 'visualizeApp', title: `CTS vis 1 from ${spaceId} space` }, destinationId: vis1DestinationId, + managed: false, }, { id: `cts_vis_2_${spaceId}`, type: 'visualization', meta: { icon: 'visualizeApp', title: `CTS vis 2 from ${spaceId} space` }, destinationId: vis2DestinationId, + managed: false, }, { id: `cts_vis_3_${spaceId}`, type: 'visualization', meta: { icon: 'visualizeApp', title: `CTS vis 3 from ${spaceId} space` }, destinationId: vis3DestinationId, + managed: false, }, { id: `cts_dashboard_${spaceId}`, @@ -256,6 +261,7 @@ export function copyToSpaceTestSuiteFactory(context: FtrProviderContext) { title: `This is the ${spaceId} test space CTS dashboard`, }, destinationId: dashboardDestinationId, + managed: false, }, ], }, @@ -357,18 +363,21 @@ export function copyToSpaceTestSuiteFactory(context: FtrProviderContext) { }, overwrite: true, destinationId: `cts_ip_1_${destination}`, // this conflicted with another index pattern in the destination space because of a shared originId + managed: false, }, { id: `cts_vis_1_${spaceId}`, type: 'visualization', meta: { icon: 'visualizeApp', title: `CTS vis 1 from ${spaceId} space` }, destinationId: vis1DestinationId, + managed: false, }, { id: `cts_vis_2_${spaceId}`, type: 'visualization', meta: { icon: 'visualizeApp', title: `CTS vis 2 from ${spaceId} space` }, destinationId: vis2DestinationId, + managed: false, }, { id: `cts_vis_3_${spaceId}`, @@ -376,6 +385,7 @@ export function copyToSpaceTestSuiteFactory(context: FtrProviderContext) { meta: { icon: 'visualizeApp', title: `CTS vis 3 from ${spaceId} space` }, overwrite: true, destinationId: `cts_vis_3_${destination}`, // this conflicted with another visualization in the destination space because of a shared originId + managed: false, }, { id: `cts_dashboard_${spaceId}`, @@ -386,6 +396,7 @@ export function copyToSpaceTestSuiteFactory(context: FtrProviderContext) { }, overwrite: true, destinationId: `cts_dashboard_${destination}`, // this conflicted with another dashboard in the destination space because of a shared originId + managed: false, }, ], }, @@ -419,12 +430,14 @@ export function copyToSpaceTestSuiteFactory(context: FtrProviderContext) { type: 'visualization', meta: { icon: 'visualizeApp', title: `CTS vis 1 from ${spaceId} space` }, destinationId: vis1DestinationId, + managed: false, }, { id: `cts_vis_2_${spaceId}`, type: 'visualization', meta: { icon: 'visualizeApp', title: `CTS vis 2 from ${spaceId} space` }, destinationId: vis2DestinationId, + managed: false, }, ]; const expectedErrors = [ @@ -522,7 +535,8 @@ export function copyToSpaceTestSuiteFactory(context: FtrProviderContext) { const destinationId = successResults![0].destinationId; expect(destinationId).to.match(UUID_PATTERN); const meta = { title, icon: 'beaker' }; - expect(successResults).to.eql([{ type, id: sourceId, meta, destinationId }]); + const managed = false; // default added By `create` + expect(successResults).to.eql([{ type, id: sourceId, meta, destinationId, managed }]); expect(errors).to.be(undefined); }; @@ -594,7 +608,14 @@ export function copyToSpaceTestSuiteFactory(context: FtrProviderContext) { expect(success).to.eql(true); expect(successCount).to.eql(1); expect(successResults).to.eql([ - { type, id: inexactMatchIdA, meta, overwrite: true, destinationId }, + { + type, + id: inexactMatchIdA, + meta, + overwrite: true, + destinationId, + managed: false, + }, ]); expect(errors).to.be(undefined); } else { @@ -635,7 +656,14 @@ export function copyToSpaceTestSuiteFactory(context: FtrProviderContext) { expect(success).to.eql(true); expect(successCount).to.eql(1); expect(successResults).to.eql([ - { type, id: inexactMatchIdB, meta, overwrite: true, destinationId }, + { + type, + id: inexactMatchIdB, + meta, + overwrite: true, + destinationId, + managed: false, + }, ]); expect(errors).to.be(undefined); } else { @@ -676,7 +704,14 @@ export function copyToSpaceTestSuiteFactory(context: FtrProviderContext) { expect(success).to.eql(true); expect(successCount).to.eql(1); expect(successResults).to.eql([ - { type, id: inexactMatchIdC, meta, overwrite: true, destinationId }, + { + type, + id: inexactMatchIdC, + meta, + overwrite: true, + destinationId, + managed: false, + }, ]); expect(errors).to.be(undefined); } else { diff --git a/x-pack/test/spaces_api_integration/common/suites/resolve_copy_to_space_conflicts.ts b/x-pack/test/spaces_api_integration/common/suites/resolve_copy_to_space_conflicts.ts index 5f2c361714c49..0a71beb9bffa0 100644 --- a/x-pack/test/spaces_api_integration/common/suites/resolve_copy_to_space_conflicts.ts +++ b/x-pack/test/spaces_api_integration/common/suites/resolve_copy_to_space_conflicts.ts @@ -108,6 +108,7 @@ export function resolveCopyToSpaceConflictsSuite(context: FtrProviderContext) { }, destinationId: `cts_ip_1_${destination}`, // this conflicted with another index pattern in the destination space because of a shared originId overwrite: true, + managed: false, }, { id: `cts_vis_3_${sourceSpaceId}`, @@ -118,6 +119,7 @@ export function resolveCopyToSpaceConflictsSuite(context: FtrProviderContext) { }, destinationId: `cts_vis_3_${destination}`, // this conflicted with another visualization in the destination space because of a shared originId overwrite: true, + managed: false, }, ], }, @@ -147,6 +149,7 @@ export function resolveCopyToSpaceConflictsSuite(context: FtrProviderContext) { }, destinationId: `cts_dashboard_${destinationSpaceId}`, // this conflicted with another dashboard in the destination space because of a shared originId overwrite: true, + managed: false, }, ], }, @@ -380,7 +383,14 @@ export function resolveCopyToSpaceConflictsSuite(context: FtrProviderContext) { })(); const meta = { title, icon: 'beaker' }; expect(successResults).to.eql([ - { type, id, meta, overwrite: true, ...(destinationId && { destinationId }) }, + { + type, + id, + meta, + overwrite: true, + ...(destinationId && { destinationId }), + managed: false, + }, ]); }; diff --git a/yarn.lock b/yarn.lock index 8d50c606a6675..30eb8b94a1714 100644 --- a/yarn.lock +++ b/yarn.lock @@ -1543,10 +1543,10 @@ resolved "https://registry.yarnpkg.com/@elastic/eslint-plugin-eui/-/eslint-plugin-eui-0.0.2.tgz#56b9ef03984a05cc213772ae3713ea8ef47b0314" integrity sha512-IoxURM5zraoQ7C8f+mJb9HYSENiZGgRVcG4tLQxE61yHNNRDXtGDWTZh8N1KIHcsqN1CEPETjuzBXkJYF/fDiQ== -"@elastic/eui@77.1.1": - version "77.1.1" - resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-77.1.1.tgz#82f4294bf3239d5d825c1d939c49d125bfdbeb72" - integrity sha512-guJmHoGDbvKh/738taKDZGSdNk+OXMse513oPaPf4NoXpQUeYvl3gLT50mX5J4nwILS1LFKNGrbU2Es77HM1cQ== +"@elastic/eui@77.1.2": + version "77.1.2" + resolved "https://registry.yarnpkg.com/@elastic/eui/-/eui-77.1.2.tgz#85c20c682058ada1a9478af2894c290cc20c1678" + integrity sha512-cq7TI/rOomifh/KXU1V+wGirClomkMcQ166K9/7eMyqJb50AAuweu5JkjiDRNvB06uX1lDP6GjSb+oGvf8885A== dependencies: "@types/chroma-js" "^2.0.0" "@types/lodash" "^4.14.160" @@ -1570,6 +1570,7 @@ react-focus-on "^3.7.0" react-input-autosize "^3.0.0" react-is "^17.0.2" + react-remove-scroll-bar "^2.3.4" react-virtualized-auto-sizer "^1.0.6" react-window "^1.8.6" refractor "^3.5.0" @@ -5016,6 +5017,10 @@ "@kbn/server-route-repository@link:packages/kbn-server-route-repository": version "0.0.0" uid "" + +"@kbn/serverless-observability@link:x-pack/plugins/serverless_observability": + version "0.0.0" + uid "" "@kbn/serverless-project-switcher@link:packages/serverless/project_switcher": version "0.0.0" @@ -5029,6 +5034,10 @@ version "0.0.0" uid "" +"@kbn/serverless-search@link:x-pack/plugins/serverless_search": + version "0.0.0" + uid "" + "@kbn/serverless@link:x-pack/plugins/serverless": version "0.0.0" uid "" @@ -5093,6 +5102,10 @@ version "0.0.0" uid "" +"@kbn/shared-ux-chrome-navigation@link:packages/shared-ux/chrome/navigation": + version "0.0.0" + uid "" + "@kbn/shared-ux-file-context@link:packages/shared-ux/file/context": version "0.0.0" uid "" @@ -5597,6 +5610,10 @@ version "0.0.0" uid "" +"@kbn/visualization-ui-components@link:src/plugins/visualization_ui_components": + version "0.0.0" + uid "" + "@kbn/visualizations-plugin@link:src/plugins/visualizations": version "0.0.0" uid "" @@ -9874,12 +9891,12 @@ resolved "https://registry.yarnpkg.com/@xobotyi/scrollbar-width/-/scrollbar-width-1.9.5.tgz#80224a6919272f405b87913ca13b92929bdf3c4d" integrity sha512-N8tkAACJx2ww8vFMneJmaAgmjAG1tnVBZJRLRcx061tmsLRZHSEZSLuGWnwPtunsSLvSqXQ2wfp7Mgqg1I+2dQ== -"@xstate/react@^3.0.2": - version "3.0.2" - resolved "https://registry.yarnpkg.com/@xstate/react/-/react-3.0.2.tgz#7907f1e2df464c14b1cac2120a25070a0c81e111" - integrity sha512-sFbnMyi+FHF6bXbdvOF6RKVJ9VxrhhUz7KJ/8qKwpqFs0h+EoGOXdfAeuS3aEy29JsFaRclozBxDpsEJd/vlkg== +"@xstate/react@^3.2.1": + version "3.2.2" + resolved "https://registry.yarnpkg.com/@xstate/react/-/react-3.2.2.tgz#ddf0f9d75e2c19375b1e1b7335e72cb99762aed8" + integrity sha512-feghXWLedyq8JeL13yda3XnHPZKwYDN5HPBLykpLeuNpr9178tQd2/3d0NrH6gSd0sG5mLuLeuD+ck830fgzLQ== dependencies: - use-isomorphic-layout-effect "^1.0.0" + use-isomorphic-layout-effect "^1.1.2" use-sync-external-store "^1.0.0" "@xtuc/ieee754@^1.2.0": @@ -24248,7 +24265,7 @@ react-refresh@^0.11.0: resolved "https://registry.yarnpkg.com/react-refresh/-/react-refresh-0.11.0.tgz#77198b944733f0f1f1a90e791de4541f9f074046" integrity sha512-F27qZr8uUqwhWZboondsPx8tnC3Ct3SxZA3V5WyEvujRyyNv0VYPhoBg1gZ8/MV5tubQp76Trw8lTv9hzRBa+A== -react-remove-scroll-bar@^2.3.3: +react-remove-scroll-bar@^2.3.3, react-remove-scroll-bar@^2.3.4: version "2.3.4" resolved "https://registry.yarnpkg.com/react-remove-scroll-bar/-/react-remove-scroll-bar-2.3.4.tgz#53e272d7a5cb8242990c7f144c44d8bd8ab5afd9" integrity sha512-63C4YQBUt0m6ALadE9XV56hV8BgJWDmmTPY758iIJjfQKt2nYwoUrPk0LXRXcB/yIj82T1/Ixfdpdk68LwIB0A== @@ -28251,7 +28268,7 @@ use-composed-ref@^1.3.0: resolved "https://registry.yarnpkg.com/use-composed-ref/-/use-composed-ref-1.3.0.tgz#3d8104db34b7b264030a9d916c5e94fbe280dbda" integrity sha512-GLMG0Jc/jiKov/3Ulid1wbv3r54K9HlMW29IWcDFPEqFkSO2nS0MuefWgMJpeHQ9YJeXDL3ZUF+P3jdXlZX/cQ== -use-isomorphic-layout-effect@^1.0.0, use-isomorphic-layout-effect@^1.1.1: +use-isomorphic-layout-effect@^1.1.1, use-isomorphic-layout-effect@^1.1.2: version "1.1.2" resolved "https://registry.yarnpkg.com/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz#497cefb13d863d687b08477d9e5a164ad8c1a6fb" integrity sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA== @@ -29627,10 +29644,10 @@ xpath@0.0.32: resolved "https://registry.yarnpkg.com/xpath/-/xpath-0.0.32.tgz#1b73d3351af736e17ec078d6da4b8175405c48af" integrity sha512-rxMJhSIoiO8vXcWvSifKqhvV96GjiD5wYb8/QHdoRyQvraTpp4IEv944nhGausZZ3u7dhQXteZuZbaqfpB7uYw== -xstate@^4.35.2: - version "4.35.2" - resolved "https://registry.yarnpkg.com/xstate/-/xstate-4.35.2.tgz#92916638e315c448f1d26e920273187907256817" - integrity sha512-5X7EyJv5OHHtGQwN7DsmCAbSnDs3Mxl1cXQ4PVaLwi+7p/RRapERnd1dFyHjYin+KQoLLfuXpl1dPBThgyIGNg== +xstate@^4.37.1: + version "4.37.2" + resolved "https://registry.yarnpkg.com/xstate/-/xstate-4.37.2.tgz#c5f4c1d8062784238b91e2dfddca05f821cb4eac" + integrity sha512-Qm337O49CRTZ3PRyRuK6b+kvI+D3JGxXIZCTul+xEsyFCVkTFDt5jixaL1nBWcUBcaTQ9um/5CRGVItPi7fveg== "xtend@>=4.0.0 <4.1.0-0", xtend@^4.0.0, xtend@^4.0.1, xtend@^4.0.2, xtend@~4.0.0, xtend@~4.0.1: version "4.0.2"