From 907c12ad7eacc7c10c2282666ef5861342070c0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Gerg=C5=91=20=C3=81brah=C3=A1m?= Date: Tue, 26 Sep 2023 17:29:11 +0200 Subject: [PATCH 01/26] [Defend Workflows] Add tags for new cy tests (#166929) --- .../e2e/policy/policy_experimental_features_disabled.cy.ts | 2 +- .../public/management/cypress/e2e/policy/policy_list.cy.ts | 1 + 2 files changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_experimental_features_disabled.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_experimental_features_disabled.cy.ts index 1d072bad8a68b..f9ede38759d5a 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_experimental_features_disabled.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_experimental_features_disabled.cy.ts @@ -12,7 +12,7 @@ import type { IndexedFleetEndpointPolicyResponse } from '../../../../../common/e import { login } from '../../tasks/login'; import { createAgentPolicyTask, getEndpointIntegrationVersion } from '../../tasks/fleet'; -describe('Disabled experimental features on: ', () => { +describe('Disabled experimental features on: ', { tags: '@ess' }, () => { describe('Policy list', () => { describe('Renders policy list without protection updates feature flag', () => { let indexedPolicy: IndexedFleetEndpointPolicyResponse; diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_list.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_list.cy.ts index b3e5e0477c5be..0a88b58359649 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_list.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/policy/policy_list.cy.ts @@ -16,6 +16,7 @@ import { createAgentPolicyTask, getEndpointIntegrationVersion } from '../../task describe( 'Policy List', { + tags: '@ess', env: { ftrConfig: { enableExperimental: ['protectionUpdatesEnabled'] } }, }, () => { From 0c1dc2381db6bfe1f50b72ce70bb056451220f8d Mon Sep 17 00:00:00 2001 From: Jordan <51442161+JordanSh@users.noreply.github.com> Date: Tue, 26 Sep 2023 18:38:37 +0300 Subject: [PATCH 02/26] [Cloud Security] Rules page enhancements (#166374) --- .../get_csp_rule_template.ts | 7 +- .../cloud_security_posture/common/types.ts | 1 + .../common/utils/helpers.test.ts | 17 ++-- .../common/utils/helpers.ts | 9 +- .../public/pages/rules/rules_container.tsx | 23 ++++- .../public/pages/rules/rules_table.tsx | 13 +-- .../public/pages/rules/rules_table_header.tsx | 65 +++++++++++--- .../public/pages/rules/use_csp_rules.ts | 8 +- .../server/routes/benchmarks/benchmarks.ts | 4 +- .../get_csp_rule_template.ts | 30 +++++-- .../get_csp_rule_templates.test.ts | 89 +++++++++++++++++++ 11 files changed, 227 insertions(+), 39 deletions(-) create mode 100644 x-pack/plugins/cloud_security_posture/server/routes/csp_rule_template/get_csp_rule_templates.test.ts diff --git a/x-pack/plugins/cloud_security_posture/common/schemas/csp_rule_template_api/get_csp_rule_template.ts b/x-pack/plugins/cloud_security_posture/common/schemas/csp_rule_template_api/get_csp_rule_template.ts index 7b6345e749d71..350909e540d4d 100644 --- a/x-pack/plugins/cloud_security_posture/common/schemas/csp_rule_template_api/get_csp_rule_template.ts +++ b/x-pack/plugins/cloud_security_posture/common/schemas/csp_rule_template_api/get_csp_rule_template.ts @@ -57,7 +57,7 @@ export const findCspRuleTemplateRequest = schema.object({ schema.literal('metadata.benchmark.rule_number'), ], { - defaultValue: 'metadata.name', + defaultValue: 'metadata.benchmark.rule_number', } ), @@ -79,4 +79,9 @@ export const findCspRuleTemplateRequest = schema.object({ * package_policy_id */ packagePolicyId: schema.maybe(schema.string()), + + /** + * rule section + */ + section: schema.maybe(schema.string()), }); diff --git a/x-pack/plugins/cloud_security_posture/common/types.ts b/x-pack/plugins/cloud_security_posture/common/types.ts index f2b6c00399915..036826ba9e6de 100644 --- a/x-pack/plugins/cloud_security_posture/common/types.ts +++ b/x-pack/plugins/cloud_security_posture/common/types.ts @@ -122,6 +122,7 @@ export interface Benchmark { export type BenchmarkId = CspRuleTemplateMetadata['benchmark']['id']; export type BenchmarkName = CspRuleTemplateMetadata['benchmark']['name']; +export type RuleSection = CspRuleTemplateMetadata['section']; // Fleet Integration types export type PostureInput = typeof SUPPORTED_CLOUDBEAT_INPUTS[number]; diff --git a/x-pack/plugins/cloud_security_posture/common/utils/helpers.test.ts b/x-pack/plugins/cloud_security_posture/common/utils/helpers.test.ts index 7e7d25a5b28bd..6ce2add754f20 100644 --- a/x-pack/plugins/cloud_security_posture/common/utils/helpers.test.ts +++ b/x-pack/plugins/cloud_security_posture/common/utils/helpers.test.ts @@ -6,11 +6,7 @@ */ import { createPackagePolicyMock } from '@kbn/fleet-plugin/common/mocks'; -import { - getBenchmarkFromPackagePolicy, - getBenchmarkTypeFilter, - cleanupCredentials, -} from './helpers'; +import { getBenchmarkFromPackagePolicy, getBenchmarkFilter, cleanupCredentials } from './helpers'; describe('test helper methods', () => { it('get default integration type from inputs with multiple enabled types', () => { @@ -60,11 +56,20 @@ describe('test helper methods', () => { const typeK8s = getBenchmarkFromPackagePolicy(mockPackagePolicy.inputs); expect(typeK8s).toMatch('cis_k8s'); }); + it('get benchmark type filter based on a benchmark id', () => { - const typeFilter = getBenchmarkTypeFilter('cis_eks'); + const typeFilter = getBenchmarkFilter('cis_eks'); expect(typeFilter).toMatch('csp-rule-template.attributes.metadata.benchmark.id: "cis_eks"'); }); + it('should return a string with the correct filter when given a benchmark type and section', () => { + const typeAndSectionFilter = getBenchmarkFilter('cis_k8s', 'API Server'); + + expect(typeAndSectionFilter).toMatch( + 'csp-rule-template.attributes.metadata.benchmark.id: "cis_k8s" AND csp-rule-template.attributes.metadata.section: "API Server"' + ); + }); + describe('cleanupCredentials', () => { it('cleans unused aws credential methods, except role_arn when using assume_role', () => { const mockPackagePolicy = createPackagePolicyMock(); diff --git a/x-pack/plugins/cloud_security_posture/common/utils/helpers.ts b/x-pack/plugins/cloud_security_posture/common/utils/helpers.ts index 9cf31c944d27a..1cf006589bd7a 100644 --- a/x-pack/plugins/cloud_security_posture/common/utils/helpers.ts +++ b/x-pack/plugins/cloud_security_posture/common/utils/helpers.ts @@ -27,6 +27,7 @@ import type { BaseCspSetupStatus, AwsCredentialsType, GcpCredentialsType, + RuleSection, } from '../types'; /** @@ -46,8 +47,12 @@ export const extractErrorMessage = (e: unknown, defaultMessage = 'Unknown Error' return defaultMessage; // TODO: i18n }; -export const getBenchmarkTypeFilter = (type: BenchmarkId): string => - `${CSP_RULE_TEMPLATE_SAVED_OBJECT_TYPE}.attributes.metadata.benchmark.id: "${type}"`; +export const getBenchmarkFilter = (type: BenchmarkId, section?: RuleSection): string => + `${CSP_RULE_TEMPLATE_SAVED_OBJECT_TYPE}.attributes.metadata.benchmark.id: "${type}"${ + section + ? ` AND ${CSP_RULE_TEMPLATE_SAVED_OBJECT_TYPE}.attributes.metadata.section: "${section}"` + : '' + }`; export const isEnabledBenchmarkInputType = (input: PackagePolicyInput | NewPackagePolicyInput) => input.enabled; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_container.tsx b/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_container.tsx index 74ce3ba55ef85..81472e29b6ee7 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_container.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_container.tsx @@ -58,6 +58,7 @@ export const RulesContainer = () => { const [selectedRuleId, setSelectedRuleId] = useState(null); const { pageSize, setPageSize } = usePageSize(LOCAL_STORAGE_PAGE_SIZE_RULES_KEY); const [rulesQuery, setRulesQuery] = useState({ + section: undefined, search: '', page: 0, perPage: pageSize || 10, @@ -65,6 +66,7 @@ export const RulesContainer = () => { const { data, status, error } = useFindCspRuleTemplates( { + section: rulesQuery.section, search: rulesQuery.search, page: 1, perPage: MAX_ITEMS_PER_PAGE, @@ -77,12 +79,31 @@ export const RulesContainer = () => { [data, error, status, rulesQuery] ); + // We need to make this call again without the filters. this way the section list is always full + const allRules = useFindCspRuleTemplates( + { + page: 1, + perPage: MAX_ITEMS_PER_PAGE, + }, + params.packagePolicyId + ); + + const sectionList = useMemo( + () => allRules.data?.items.map((rule) => rule.metadata.section), + [allRules.data] + ); + const cleanedSectionList = [...new Set(sectionList)]; + return (
+ setRulesQuery((currentQuery) => ({ ...currentQuery, section: value })) + } + sectionSelectOptions={cleanedSectionList} search={(value) => setRulesQuery((currentQuery) => ({ ...currentQuery, search: value }))} - searchValue={rulesQuery.search} + searchValue={rulesQuery.search || ''} totalRulesCount={rulesPageData.all_rules.length} pageSize={rulesPageData.rules_page.length} isSearching={status === 'loading'} diff --git a/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_table.tsx b/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_table.tsx index 557239e5cb613..167589024529b 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_table.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_table.tsx @@ -58,12 +58,6 @@ export const RulesTable = ({ style: { background: row.metadata.id === selectedRuleId ? euiTheme.colors.highlight : undefined, }, - onClick: (e: MouseEvent) => { - const tag = (e.target as HTMLDivElement).tagName; - // Ignore checkbox and switch toggle columns - if (tag === 'BUTTON' || tag === 'INPUT') return; - setSelectedRuleId(row.metadata.id); - }, }); return ( @@ -86,6 +80,13 @@ type GetColumnProps = Pick; const getColumns = ({ setSelectedRuleId, }: GetColumnProps): Array> => [ + { + field: 'metadata.benchmark.rule_number', + name: i18n.translate('xpack.csp.rules.rulesTable.ruleNumberColumnLabel', { + defaultMessage: 'Rule Number', + }), + width: '10%', + }, { field: 'metadata.name', name: i18n.translate('xpack.csp.rules.rulesTable.nameColumnLabel', { diff --git a/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_table_header.tsx b/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_table_header.tsx index 0109915ff68c6..18e31bdb366db 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_table_header.tsx +++ b/x-pack/plugins/cloud_security_posture/public/pages/rules/rules_table_header.tsx @@ -5,13 +5,24 @@ * 2.0. */ import React, { useState } from 'react'; -import { EuiFieldSearch, EuiFlexItem, EuiText, EuiSpacer } from '@elastic/eui'; +import { + EuiComboBox, + EuiFieldSearch, + EuiFlexItem, + EuiText, + EuiSpacer, + EuiFlexGroup, + type EuiComboBoxOptionOption, +} from '@elastic/eui'; import useDebounce from 'react-use/lib/useDebounce'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; +import { css } from '@emotion/react'; interface RulesTableToolbarProps { - search(value: string): void; + search: (value: string) => void; + onSectionChange: (value: string | undefined) => void; + sectionSelectOptions: string[]; totalRulesCount: number; searchValue: string; isSearching: boolean; @@ -29,15 +40,47 @@ export const RulesTableHeader = ({ isSearching, totalRulesCount, pageSize, -}: RulesTableToolbarProps) => ( - -); + onSectionChange, + sectionSelectOptions, +}: RulesTableToolbarProps) => { + const [selected, setSelected] = useState([]); + + const sectionOptions = sectionSelectOptions.map((option) => ({ + label: option, + })); + + return ( + + + + + + { + setSelected(option); + onSectionChange(option.length ? option[0].label : undefined); + }} + /> + + + ); +}; const SEARCH_DEBOUNCE_MS = 300; diff --git a/x-pack/plugins/cloud_security_posture/public/pages/rules/use_csp_rules.ts b/x-pack/plugins/cloud_security_posture/public/pages/rules/use_csp_rules.ts index e0870d1e64b01..ac150e05bf95e 100644 --- a/x-pack/plugins/cloud_security_posture/public/pages/rules/use_csp_rules.ts +++ b/x-pack/plugins/cloud_security_posture/public/pages/rules/use_csp_rules.ts @@ -14,20 +14,20 @@ import { FIND_CSP_RULE_TEMPLATE_ROUTE_PATH, } from '../../../common/constants'; -export type RulesQuery = Required>; +export type RulesQuery = Pick; export type RulesQueryResult = ReturnType; export const useFindCspRuleTemplates = ( - { search, page, perPage }: RulesQuery, + { search, page, perPage, section }: RulesQuery, packagePolicyId: string ) => { const { http } = useKibana().services; return useQuery( - [CSP_RULE_TEMPLATE_SAVED_OBJECT_TYPE, { search, page, perPage, packagePolicyId }], + [CSP_RULE_TEMPLATE_SAVED_OBJECT_TYPE, { section, search, page, perPage, packagePolicyId }], () => { return http.get(FIND_CSP_RULE_TEMPLATE_ROUTE_PATH, { - query: { packagePolicyId, page, perPage, search }, + query: { packagePolicyId, page, perPage, search, section }, version: FIND_CSP_RULE_TEMPLATE_API_CURRENT_VERSION, }); } diff --git a/x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.ts b/x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.ts index a62e4a1c4ee09..4c78265c1c15e 100644 --- a/x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.ts +++ b/x-pack/plugins/cloud_security_posture/server/routes/benchmarks/benchmarks.ts @@ -18,7 +18,7 @@ import { benchmarksQueryParamsSchema } from '../../../common/schemas/benchmark'; import type { Benchmark } from '../../../common/types'; import { getBenchmarkFromPackagePolicy, - getBenchmarkTypeFilter, + getBenchmarkFilter, isNonNullable, } from '../../../common/utils/helpers'; import { CspRouter } from '../../types'; @@ -38,7 +38,7 @@ export const getRulesCountForPolicy = async ( ): Promise => { const rules = await soClient.find({ type: CSP_RULE_TEMPLATE_SAVED_OBJECT_TYPE, - filter: getBenchmarkTypeFilter(benchmarkId), + filter: getBenchmarkFilter(benchmarkId), perPage: 0, }); diff --git a/x-pack/plugins/cloud_security_posture/server/routes/csp_rule_template/get_csp_rule_template.ts b/x-pack/plugins/cloud_security_posture/server/routes/csp_rule_template/get_csp_rule_template.ts index fb6e0e7c53ab0..0b249e9f3656e 100644 --- a/x-pack/plugins/cloud_security_posture/server/routes/csp_rule_template/get_csp_rule_template.ts +++ b/x-pack/plugins/cloud_security_posture/server/routes/csp_rule_template/get_csp_rule_template.ts @@ -8,13 +8,12 @@ import { NewPackagePolicy } from '@kbn/fleet-plugin/common'; import { SavedObjectsClientContract } from '@kbn/core-saved-objects-api-server'; import { transformError } from '@kbn/securitysolution-es-utils'; +import semverCompare from 'semver/functions/compare'; +import semverValid from 'semver/functions/valid'; import { GetCspRuleTemplateRequest, GetCspRuleTemplateResponse } from '../../../common/types'; import { CspRuleTemplate } from '../../../common/schemas'; import { findCspRuleTemplateRequest } from '../../../common/schemas/csp_rule_template_api/get_csp_rule_template'; -import { - getBenchmarkFromPackagePolicy, - getBenchmarkTypeFilter, -} from '../../../common/utils/helpers'; +import { getBenchmarkFromPackagePolicy, getBenchmarkFilter } from '../../../common/utils/helpers'; import { CSP_RULE_TEMPLATE_SAVED_OBJECT_TYPE, @@ -23,6 +22,22 @@ import { import { CspRouter } from '../../types'; import { PACKAGE_POLICY_SAVED_OBJECT_TYPE } from '../benchmarks/benchmarks'; +export const getSortedCspRulesTemplates = (cspRulesTemplates: CspRuleTemplate[]) => { + return cspRulesTemplates.slice().sort((a, b) => { + const ruleNumberA = a?.metadata?.benchmark?.rule_number; + const ruleNumberB = b?.metadata?.benchmark?.rule_number; + + const versionA = semverValid(ruleNumberA); + const versionB = semverValid(ruleNumberB); + + if (versionA !== null && versionB !== null) { + return semverCompare(versionA, versionB); + } else { + return String(ruleNumberA).localeCompare(String(ruleNumberB)); + } + }); +}; + const getBenchmarkIdFromPackagePolicyId = async ( soClient: SavedObjectsClientContract, packagePolicyId: string @@ -57,15 +72,18 @@ const findCspRuleTemplateHandler = async ( perPage: options.perPage, sortField: options.sortField, fields: options?.fields, - filter: getBenchmarkTypeFilter(benchmarkId), + filter: getBenchmarkFilter(benchmarkId, options.section), }); const cspRulesTemplates = cspRulesTemplatesSo.saved_objects.map( (cspRuleTemplate) => cspRuleTemplate.attributes ); + // Semantic version sorting using semver for valid versions and custom comparison for invalid versions + const sortedCspRulesTemplates = getSortedCspRulesTemplates(cspRulesTemplates); + return { - items: cspRulesTemplates, + items: sortedCspRulesTemplates, total: cspRulesTemplatesSo.total, page: options.page, perPage: options.perPage, diff --git a/x-pack/plugins/cloud_security_posture/server/routes/csp_rule_template/get_csp_rule_templates.test.ts b/x-pack/plugins/cloud_security_posture/server/routes/csp_rule_template/get_csp_rule_templates.test.ts new file mode 100644 index 0000000000000..f894d031c4bc0 --- /dev/null +++ b/x-pack/plugins/cloud_security_posture/server/routes/csp_rule_template/get_csp_rule_templates.test.ts @@ -0,0 +1,89 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { getSortedCspRulesTemplates } from './get_csp_rule_template'; +import { CspRuleTemplate } from '../../../common/schemas'; + +describe('getSortedCspRulesTemplates', () => { + it('sorts by metadata.benchmark.rule_number, invalid semantic version still should still get sorted and empty values should be sorted last', () => { + const cspRulesTemplates = [ + { metadata: { benchmark: { rule_number: '1.0.0' } } }, + { metadata: { benchmark: { rule_number: '2.0.0' } } }, + { metadata: { benchmark: { rule_number: '1.1.0' } } }, + { metadata: { benchmark: { rule_number: '1.0.1' } } }, + { metadata: { benchmark: { rule_number: 'invalid' } } }, + { metadata: { benchmark: { rule_number: '3.0' } } }, + { metadata: { benchmark: {} } }, + ] as CspRuleTemplate[]; + + const sortedCspRulesTemplates = getSortedCspRulesTemplates(cspRulesTemplates); + + expect(sortedCspRulesTemplates).toEqual([ + { metadata: { benchmark: { rule_number: '1.0.0' } } }, + { metadata: { benchmark: { rule_number: '1.0.1' } } }, + { metadata: { benchmark: { rule_number: '1.1.0' } } }, + { metadata: { benchmark: { rule_number: '2.0.0' } } }, + { metadata: { benchmark: { rule_number: '3.0' } } }, + { metadata: { benchmark: { rule_number: 'invalid' } } }, + { metadata: { benchmark: {} } }, + ]); + }); + + it('edge case - returns empty array if input is empty', () => { + const cspRulesTemplates: CspRuleTemplate[] = []; + + const sortedCspRulesTemplates = getSortedCspRulesTemplates(cspRulesTemplates); + + expect(sortedCspRulesTemplates).toEqual([]); + }); + + it('edge case - returns sorted array even if input only has one element', () => { + const cspRulesTemplates = [ + { metadata: { benchmark: { rule_number: '1.0.0' } } }, + ] as CspRuleTemplate[]; + + const sortedCspRulesTemplates = getSortedCspRulesTemplates(cspRulesTemplates); + + expect(sortedCspRulesTemplates).toEqual([ + { metadata: { benchmark: { rule_number: '1.0.0' } } }, + ]); + }); + + it('returns sorted array even with undefined or null properties', () => { + const cspRulesTemplates = [ + { metadata: { benchmark: { rule_number: '1.0.0' } } }, + { metadata: { benchmark: { rule_number: undefined } } }, + { metadata: { benchmark: { rule_number: '2.0.0' } } }, + { metadata: { benchmark: { rule_number: null } } }, + ] as CspRuleTemplate[]; + + const sortedCspRulesTemplates = getSortedCspRulesTemplates(cspRulesTemplates); + + expect(sortedCspRulesTemplates).toEqual([ + { metadata: { benchmark: { rule_number: '1.0.0' } } }, + { metadata: { benchmark: { rule_number: '2.0.0' } } }, + { metadata: { benchmark: { rule_number: null } } }, + { metadata: { benchmark: { rule_number: undefined } } }, + ]); + }); + + it('returns sorted array with invalid semantic versions', () => { + const cspRulesTemplates = [ + { metadata: { benchmark: { rule_number: '1.0.0' } } }, + { metadata: { benchmark: { rule_number: '2.0' } } }, + { metadata: { benchmark: { rule_number: '3.0.0' } } }, + ] as CspRuleTemplate[]; + + const sortedCspRulesTemplates = getSortedCspRulesTemplates(cspRulesTemplates); + + expect(sortedCspRulesTemplates).toEqual([ + { metadata: { benchmark: { rule_number: '1.0.0' } } }, + { metadata: { benchmark: { rule_number: '2.0' } } }, + { metadata: { benchmark: { rule_number: '3.0.0' } } }, + ]); + }); +}); From df3dd04707442db5c90696729c4567aacaf544dc Mon Sep 17 00:00:00 2001 From: Julia Date: Tue, 26 Sep 2023 17:48:41 +0200 Subject: [PATCH 03/26] [RAM][HTTP Versioning] bulk delete api versioning (#164015) ## Summary Part of https://github.com/elastic/kibana/issues/157883 Converts _bulk_delete to new HTTP versioned model ### Checklist - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Thomas Watson --- .../routes/rule/apis/bulk_delete/index.ts | 23 +++ .../rule/apis/bulk_delete/schemas/latest.ts | 8 ++ .../rule/apis/bulk_delete/schemas/v1.ts | 13 ++ .../rule/apis/bulk_delete/types/latest.ts | 8 ++ .../routes/rule/apis/bulk_delete/types/v1.ts | 29 ++++ .../apis/bulk_delete/validation/latest.ts | 8 ++ .../rule/apis/bulk_delete/validation/v1.ts | 30 ++++ .../bulk_delete/bulk_delete_rules.test.ts} | 135 ++++++++---------- .../methods/bulk_delete/bulk_delete_rules.ts} | 99 +++++++++---- .../rule/methods/bulk_delete/index.ts | 9 ++ .../rule/methods/bulk_delete/schemas/index.ts | 13 ++ .../rule/methods/bulk_delete/types/index.ts | 28 ++++ .../methods/bulk_delete/validation/index.ts | 30 ++++ .../alerting/server/data/rule/index.ts | 2 + .../data/rule/methods/bulk_delete_rules_so.ts | 29 ++++ .../server/routes/bulk_delete_rules.ts | 50 ------- .../plugins/alerting/server/routes/index.ts | 2 +- .../bulk_delete_rules_route.test.ts} | 14 +- .../bulk_delete/bulk_delete_rules_route.ts | 69 +++++++++ .../retry_if_bulk_operation_conflicts.ts | 6 +- .../rules_client/methods/bulk_disable.ts | 4 +- .../rules_client/methods/bulk_enable.ts | 8 +- .../server/rules_client/rules_client.ts | 9 +- .../server/rules_client/tests/test_helpers.ts | 133 +++++++++++++++++ .../group3/tests/alerting/bulk_delete.ts | 74 +++++----- 25 files changed, 626 insertions(+), 207 deletions(-) create mode 100644 x-pack/plugins/alerting/common/routes/rule/apis/bulk_delete/index.ts create mode 100644 x-pack/plugins/alerting/common/routes/rule/apis/bulk_delete/schemas/latest.ts create mode 100644 x-pack/plugins/alerting/common/routes/rule/apis/bulk_delete/schemas/v1.ts create mode 100644 x-pack/plugins/alerting/common/routes/rule/apis/bulk_delete/types/latest.ts create mode 100644 x-pack/plugins/alerting/common/routes/rule/apis/bulk_delete/types/v1.ts create mode 100644 x-pack/plugins/alerting/common/routes/rule/apis/bulk_delete/validation/latest.ts create mode 100644 x-pack/plugins/alerting/common/routes/rule/apis/bulk_delete/validation/v1.ts rename x-pack/plugins/alerting/server/{rules_client/tests/bulk_delete.test.ts => application/rule/methods/bulk_delete/bulk_delete_rules.test.ts} (84%) rename x-pack/plugins/alerting/server/{rules_client/methods/bulk_delete.ts => application/rule/methods/bulk_delete/bulk_delete_rules.ts} (61%) create mode 100644 x-pack/plugins/alerting/server/application/rule/methods/bulk_delete/index.ts create mode 100644 x-pack/plugins/alerting/server/application/rule/methods/bulk_delete/schemas/index.ts create mode 100644 x-pack/plugins/alerting/server/application/rule/methods/bulk_delete/types/index.ts create mode 100644 x-pack/plugins/alerting/server/application/rule/methods/bulk_delete/validation/index.ts create mode 100644 x-pack/plugins/alerting/server/data/rule/methods/bulk_delete_rules_so.ts delete mode 100644 x-pack/plugins/alerting/server/routes/bulk_delete_rules.ts rename x-pack/plugins/alerting/server/routes/{bulk_delete_rules.test.ts => rule/apis/bulk_delete/bulk_delete_rules_route.test.ts} (87%) create mode 100644 x-pack/plugins/alerting/server/routes/rule/apis/bulk_delete/bulk_delete_rules_route.ts diff --git a/x-pack/plugins/alerting/common/routes/rule/apis/bulk_delete/index.ts b/x-pack/plugins/alerting/common/routes/rule/apis/bulk_delete/index.ts new file mode 100644 index 0000000000000..69a79adfab2e9 --- /dev/null +++ b/x-pack/plugins/alerting/common/routes/rule/apis/bulk_delete/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. + */ + +export { bulkDeleteRulesRequestBodySchema } from './schemas/latest'; +export { bulkDeleteRulesRequestBodySchema as bulkDeleteRulesRequestBodySchemaV1 } from './schemas/v1'; + +export type { + BulkDeleteRulesResponse, + BulkOperationError, + BulkDeleteRulesRequestBody, +} from './types/latest'; +export type { + BulkDeleteRulesResponse as BulkDeleteRulesResponseV1, + BulkOperationError as BulkOperationErrorV1, + BulkDeleteRulesRequestBody as BulkDeleteRulesRequestBodyV1, +} from './types/v1'; + +export { validateCommonBulkOptions } from './validation/latest'; +export { validateCommonBulkOptions as validateCommonBulkOptionsV1 } from './validation/v1'; diff --git a/x-pack/plugins/alerting/common/routes/rule/apis/bulk_delete/schemas/latest.ts b/x-pack/plugins/alerting/common/routes/rule/apis/bulk_delete/schemas/latest.ts new file mode 100644 index 0000000000000..25300c97a6d2e --- /dev/null +++ b/x-pack/plugins/alerting/common/routes/rule/apis/bulk_delete/schemas/latest.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './v1'; diff --git a/x-pack/plugins/alerting/common/routes/rule/apis/bulk_delete/schemas/v1.ts b/x-pack/plugins/alerting/common/routes/rule/apis/bulk_delete/schemas/v1.ts new file mode 100644 index 0000000000000..7cf5da6665087 --- /dev/null +++ b/x-pack/plugins/alerting/common/routes/rule/apis/bulk_delete/schemas/v1.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { schema } from '@kbn/config-schema'; + +export const bulkDeleteRulesRequestBodySchema = schema.object({ + filter: schema.maybe(schema.string()), + ids: schema.maybe(schema.arrayOf(schema.string(), { minSize: 1, maxSize: 1000 })), +}); diff --git a/x-pack/plugins/alerting/common/routes/rule/apis/bulk_delete/types/latest.ts b/x-pack/plugins/alerting/common/routes/rule/apis/bulk_delete/types/latest.ts new file mode 100644 index 0000000000000..25300c97a6d2e --- /dev/null +++ b/x-pack/plugins/alerting/common/routes/rule/apis/bulk_delete/types/latest.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './v1'; diff --git a/x-pack/plugins/alerting/common/routes/rule/apis/bulk_delete/types/v1.ts b/x-pack/plugins/alerting/common/routes/rule/apis/bulk_delete/types/v1.ts new file mode 100644 index 0000000000000..3b7f062b836af --- /dev/null +++ b/x-pack/plugins/alerting/common/routes/rule/apis/bulk_delete/types/v1.ts @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import type { TypeOf } from '@kbn/config-schema'; +import { bulkDeleteRulesRequestBodySchemaV1 } from '..'; +import { RuleParamsV1, RuleResponseV1 } from '../../../response'; + +export interface BulkOperationError { + message: string; + status?: number; + rule: { + id: string; + name: string; + }; +} + +export type BulkDeleteRulesRequestBody = TypeOf; + +export interface BulkDeleteRulesResponse { + body: { + rules: Array>; + errors: BulkOperationError[]; + total: number; + taskIdsFailedToBeDeleted: string[]; + }; +} diff --git a/x-pack/plugins/alerting/common/routes/rule/apis/bulk_delete/validation/latest.ts b/x-pack/plugins/alerting/common/routes/rule/apis/bulk_delete/validation/latest.ts new file mode 100644 index 0000000000000..25300c97a6d2e --- /dev/null +++ b/x-pack/plugins/alerting/common/routes/rule/apis/bulk_delete/validation/latest.ts @@ -0,0 +1,8 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export * from './v1'; diff --git a/x-pack/plugins/alerting/common/routes/rule/apis/bulk_delete/validation/v1.ts b/x-pack/plugins/alerting/common/routes/rule/apis/bulk_delete/validation/v1.ts new file mode 100644 index 0000000000000..e429d75db3e0c --- /dev/null +++ b/x-pack/plugins/alerting/common/routes/rule/apis/bulk_delete/validation/v1.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 Boom from '@hapi/boom'; +import { BulkDeleteRulesRequestBody } from '..'; + +export const validateCommonBulkOptions = (options: BulkDeleteRulesRequestBody) => { + const filter = options.filter; + const ids = options.ids; + + if (!ids && !filter) { + throw Boom.badRequest( + "Either 'ids' or 'filter' property in method's arguments should be provided" + ); + } + + if (ids?.length === 0) { + throw Boom.badRequest("'ids' property should not be an empty array"); + } + + if (ids && filter) { + throw Boom.badRequest( + "Both 'filter' and 'ids' are supplied. Define either 'ids' or 'filter' properties in method's arguments" + ); + } +}; diff --git a/x-pack/plugins/alerting/server/rules_client/tests/bulk_delete.test.ts b/x-pack/plugins/alerting/server/application/rule/methods/bulk_delete/bulk_delete_rules.test.ts similarity index 84% rename from x-pack/plugins/alerting/server/rules_client/tests/bulk_delete.test.ts rename to x-pack/plugins/alerting/server/application/rule/methods/bulk_delete/bulk_delete_rules.test.ts index 8d478b12d65a9..c33cd867a1be8 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/bulk_delete.test.ts +++ b/x-pack/plugins/alerting/server/application/rule/methods/bulk_delete/bulk_delete_rules.test.ts @@ -5,32 +5,33 @@ * 2.0. */ -import { RulesClient, ConstructorOptions } from '../rules_client'; +import { RulesClient, ConstructorOptions } from '../../../../rules_client/rules_client'; import { savedObjectsClientMock, savedObjectsRepositoryMock } from '@kbn/core/server/mocks'; import { taskManagerMock } from '@kbn/task-manager-plugin/server/mocks'; -import { ruleTypeRegistryMock } from '../../rule_type_registry.mock'; -import { alertingAuthorizationMock } from '../../authorization/alerting_authorization.mock'; -import { RecoveredActionGroup } from '../../../common'; +import { schema } from '@kbn/config-schema'; import { encryptedSavedObjectsMock } from '@kbn/encrypted-saved-objects-plugin/server/mocks'; import { actionsAuthorizationMock } from '@kbn/actions-plugin/server/mocks'; -import { AlertingAuthorization } from '../../authorization/alerting_authorization'; import { ActionsAuthorization } from '@kbn/actions-plugin/server'; import { auditLoggerMock } from '@kbn/security-plugin/server/audit/mocks'; -import { getBeforeSetup, setGlobalDate } from './lib'; -import { bulkMarkApiKeysForInvalidation } from '../../invalidate_pending_api_keys/bulk_mark_api_keys_for_invalidation'; import { loggerMock } from '@kbn/logging-mocks'; +import { ruleTypeRegistryMock } from '../../../../rule_type_registry.mock'; +import { alertingAuthorizationMock } from '../../../../authorization/alerting_authorization.mock'; +import { RecoveredActionGroup } from '../../../../../common'; +import { AlertingAuthorization } from '../../../../authorization/alerting_authorization'; +import { getBeforeSetup, setGlobalDate } from '../../../../rules_client/tests/lib'; +import { bulkMarkApiKeysForInvalidation } from '../../../../invalidate_pending_api_keys/bulk_mark_api_keys_for_invalidation'; import { - defaultRule, - enabledRule1, - enabledRule2, - returnedRule1, - returnedRule2, - siemRule1, -} from './test_helpers'; -import { schema } from '@kbn/config-schema'; -import { migrateLegacyActions } from '../lib'; - -jest.mock('../lib/siem_legacy_actions/migrate_legacy_actions', () => { + enabledRuleForBulkDelete1, + enabledRuleForBulkDelete2, + enabledRuleForBulkDelete3, + returnedRuleForBulkDelete1, + returnedRuleForBulkDelete2, + returnedRuleForBulkDelete3, + siemRuleForBulkDelete1, +} from '../../../../rules_client/tests/test_helpers'; +import { migrateLegacyActions } from '../../../../rules_client/lib'; + +jest.mock('../../../../rules_client/lib/siem_legacy_actions/migrate_legacy_actions', () => { return { migrateLegacyActions: jest.fn(), }; @@ -41,7 +42,7 @@ jest.mock('../lib/siem_legacy_actions/migrate_legacy_actions', () => { resultedReferences: [], }); -jest.mock('../../invalidate_pending_api_keys/bulk_mark_api_keys_for_invalidation', () => ({ +jest.mock('../../../../invalidate_pending_api_keys/bulk_mark_api_keys_for_invalidation', () => ({ bulkMarkApiKeysForInvalidation: jest.fn(), })); @@ -91,36 +92,6 @@ const getBulkOperationStatusErrorResponse = (statusCode: number) => ({ }, }); -export const enabledRule3 = { - ...defaultRule, - id: 'id3', - attributes: { - ...defaultRule.attributes, - enabled: true, - scheduledTaskId: 'id3', - apiKey: Buffer.from('789:ghi').toString('base64'), - apiKeyCreatedByUser: true, - }, -}; - -export const returnedRule3 = { - actions: [], - alertTypeId: 'fakeType', - apiKey: 'Nzg5OmdoaQ==', - apiKeyCreatedByUser: true, - consumer: 'fakeConsumer', - enabled: true, - id: 'id3', - name: 'fakeName', - notifyWhen: undefined, - params: undefined, - schedule: { - interval: '5m', - }, - scheduledTaskId: 'id3', - snoozeSchedule: [], -}; - beforeEach(() => { getBeforeSetup(rulesClientParams, taskManager, ruleTypeRegistry); jest.clearAllMocks(); @@ -132,7 +103,13 @@ describe('bulkDelete', () => { let rulesClient: RulesClient; const mockCreatePointInTimeFinderAsInternalUser = ( - response = { saved_objects: [enabledRule1, enabledRule2, enabledRule3] } + response = { + saved_objects: [ + enabledRuleForBulkDelete1, + enabledRuleForBulkDelete2, + enabledRuleForBulkDelete3, + ], + } ) => { encryptedSavedObjects.createPointInTimeFinderDecryptedAsInternalUser = jest .fn() @@ -197,11 +174,13 @@ describe('bulkDelete', () => { const result = await rulesClient.bulkDeleteRules({ filter: 'fake_filter' }); expect(unsecuredSavedObjectsClient.bulkDelete).toHaveBeenCalledTimes(1); - expect(unsecuredSavedObjectsClient.bulkDelete).toHaveBeenCalledWith([ - enabledRule1, - enabledRule2, - enabledRule3, - ]); + expect(unsecuredSavedObjectsClient.bulkDelete).toHaveBeenCalledWith( + [enabledRuleForBulkDelete1, enabledRuleForBulkDelete2, enabledRuleForBulkDelete3].map( + ({ id }) => ({ id, type: 'alert' }) + ), + undefined + ); + expect(taskManager.bulkRemove).toHaveBeenCalledTimes(1); expect(taskManager.bulkRemove).toHaveBeenCalledWith(['id1', 'id3']); expect(bulkMarkApiKeysForInvalidation).toHaveBeenCalledTimes(1); @@ -211,7 +190,7 @@ describe('bulkDelete', () => { expect.anything() ); expect(result).toStrictEqual({ - rules: [returnedRule1, returnedRule3], + rules: [returnedRuleForBulkDelete1, returnedRuleForBulkDelete3], errors: [{ message: 'UPS', rule: { id: 'id2', name: 'fakeName' }, status: 500 }], total: 2, taskIdsFailedToBeDeleted: [], @@ -241,25 +220,25 @@ describe('bulkDelete', () => { .mockResolvedValueOnce({ close: jest.fn(), find: function* asyncGenerator() { - yield { saved_objects: [enabledRule1, enabledRule2] }; + yield { saved_objects: [enabledRuleForBulkDelete1, enabledRuleForBulkDelete2] }; }, }) .mockResolvedValueOnce({ close: jest.fn(), find: function* asyncGenerator() { - yield { saved_objects: [enabledRule2] }; + yield { saved_objects: [enabledRuleForBulkDelete2] }; }, }) .mockResolvedValueOnce({ close: jest.fn(), find: function* asyncGenerator() { - yield { saved_objects: [enabledRule2] }; + yield { saved_objects: [enabledRuleForBulkDelete2] }; }, }) .mockResolvedValueOnce({ close: jest.fn(), find: function* asyncGenerator() { - yield { saved_objects: [enabledRule2] }; + yield { saved_objects: [enabledRuleForBulkDelete2] }; }, }); @@ -275,7 +254,7 @@ describe('bulkDelete', () => { expect.anything() ); expect(result).toStrictEqual({ - rules: [returnedRule1], + rules: [returnedRuleForBulkDelete1], errors: [{ message: 'UPS', rule: { id: 'id2', name: 'fakeName' }, status: 409 }], total: 2, taskIdsFailedToBeDeleted: [], @@ -305,19 +284,19 @@ describe('bulkDelete', () => { .mockResolvedValueOnce({ close: jest.fn(), find: function* asyncGenerator() { - yield { saved_objects: [enabledRule1, enabledRule2] }; + yield { saved_objects: [enabledRuleForBulkDelete1, enabledRuleForBulkDelete2] }; }, }) .mockResolvedValueOnce({ close: jest.fn(), find: function* asyncGenerator() { - yield { saved_objects: [enabledRule2] }; + yield { saved_objects: [enabledRuleForBulkDelete2] }; }, }) .mockResolvedValueOnce({ close: jest.fn(), find: function* asyncGenerator() { - yield { saved_objects: [enabledRule2] }; + yield { saved_objects: [enabledRuleForBulkDelete2] }; }, }); @@ -333,7 +312,7 @@ describe('bulkDelete', () => { expect.anything() ); expect(result).toStrictEqual({ - rules: [returnedRule1, returnedRule2], + rules: [returnedRuleForBulkDelete1, returnedRuleForBulkDelete2], errors: [], total: 2, taskIdsFailedToBeDeleted: [], @@ -481,15 +460,21 @@ describe('bulkDelete', () => { .mockResolvedValueOnce({ close: jest.fn(), find: function* asyncGenerator() { - yield { saved_objects: [enabledRule1, enabledRule2, siemRule1] }; + yield { + saved_objects: [ + enabledRuleForBulkDelete1, + enabledRuleForBulkDelete2, + siemRuleForBulkDelete1, + ], + }; }, }); unsecuredSavedObjectsClient.bulkDelete.mockResolvedValue({ statuses: [ - { id: enabledRule1.id, type: 'alert', success: true }, - { id: enabledRule2.id, type: 'alert', success: true }, - { id: siemRule1.id, type: 'alert', success: true }, + { id: enabledRuleForBulkDelete1.id, type: 'alert', success: true }, + { id: enabledRuleForBulkDelete2.id, type: 'alert', success: true }, + { id: siemRuleForBulkDelete1.id, type: 'alert', success: true }, ], }); @@ -497,19 +482,19 @@ describe('bulkDelete', () => { expect(migrateLegacyActions).toHaveBeenCalledTimes(3); expect(migrateLegacyActions).toHaveBeenCalledWith(expect.any(Object), { - ruleId: enabledRule1.id, + ruleId: enabledRuleForBulkDelete1.id, skipActionsValidation: true, - attributes: enabledRule1.attributes, + attributes: enabledRuleForBulkDelete1.attributes, }); expect(migrateLegacyActions).toHaveBeenCalledWith(expect.any(Object), { - ruleId: enabledRule2.id, + ruleId: enabledRuleForBulkDelete2.id, skipActionsValidation: true, - attributes: enabledRule2.attributes, + attributes: enabledRuleForBulkDelete2.attributes, }); expect(migrateLegacyActions).toHaveBeenCalledWith(expect.any(Object), { - ruleId: siemRule1.id, + ruleId: siemRuleForBulkDelete1.id, skipActionsValidation: true, - attributes: siemRule1.attributes, + attributes: siemRuleForBulkDelete1.attributes, }); }); }); diff --git a/x-pack/plugins/alerting/server/rules_client/methods/bulk_delete.ts b/x-pack/plugins/alerting/server/application/rule/methods/bulk_delete/bulk_delete_rules.ts similarity index 61% rename from x-pack/plugins/alerting/server/rules_client/methods/bulk_delete.ts rename to x-pack/plugins/alerting/server/application/rule/methods/bulk_delete/bulk_delete_rules.ts index 03ce78952e9db..e8a7b77a88c3d 100644 --- a/x-pack/plugins/alerting/server/rules_client/methods/bulk_delete.ts +++ b/x-pack/plugins/alerting/server/application/rule/methods/bulk_delete/bulk_delete_rules.ts @@ -5,30 +5,49 @@ * 2.0. */ import pMap from 'p-map'; +import Boom from '@hapi/boom'; import { KueryNode, nodeBuilder } from '@kbn/es-query'; import { SavedObjectsBulkUpdateObject } from '@kbn/core/server'; import { withSpan } from '@kbn/apm-utils'; -import { RawRule } from '../../types'; -import { convertRuleIdsToKueryNode } from '../../lib'; -import { bulkMarkApiKeysForInvalidation } from '../../invalidate_pending_api_keys/bulk_mark_api_keys_for_invalidation'; -import { ruleAuditEvent, RuleAuditAction } from '../common/audit_events'; -import { tryToRemoveTasks } from '../common'; -import { API_KEY_GENERATE_CONCURRENCY } from '../common/constants'; +import { convertRuleIdsToKueryNode } from '../../../../lib'; +import { bulkMarkApiKeysForInvalidation } from '../../../../invalidate_pending_api_keys/bulk_mark_api_keys_for_invalidation'; +import { ruleAuditEvent, RuleAuditAction } from '../../../../rules_client/common/audit_events'; +import { tryToRemoveTasks } from '../../../../rules_client/common'; +import { API_KEY_GENERATE_CONCURRENCY } from '../../../../rules_client/common/constants'; import { getAuthorizationFilter, checkAuthorizationAndGetTotal, - getAlertFromRaw, migrateLegacyActions, -} from '../lib'; +} from '../../../../rules_client/lib'; import { retryIfBulkOperationConflicts, buildKueryNodeFilter, - getAndValidateCommonBulkOptions, -} from '../common'; -import { BulkOptions, BulkOperationError, RulesClientContext } from '../types'; +} from '../../../../rules_client/common'; +import type { RulesClientContext } from '../../../../rules_client/types'; +import type { + BulkOperationError, + BulkDeleteRulesResult, + BulkDeleteRulesRequestBody, +} from './types'; +import { validateCommonBulkOptions } from './validation'; +import type { RuleAttributes } from '../../../../data/rule/types'; +import { bulkDeleteRulesSo } from '../../../../data/rule'; +import { transformRuleAttributesToRuleDomain, transformRuleDomainToRule } from '../../transforms'; +import { ruleDomainSchema } from '../../schemas'; +import type { RuleParams, RuleDomain } from '../../types'; +import type { RawRule, SanitizedRule } from '../../../../types'; + +export const bulkDeleteRules = async ( + context: RulesClientContext, + options: BulkDeleteRulesRequestBody +): Promise> => { + try { + validateCommonBulkOptions(options); + } catch (error) { + throw Boom.badRequest(`Error validating bulk delete data - ${error.message}`); + } -export const bulkDeleteRules = async (context: RulesClientContext, options: BulkOptions) => { - const { ids, filter } = getAndValidateCommonBulkOptions(options); + const { ids, filter } = options; const kueryNodeFilter = ids ? convertRuleIdsToKueryNode(ids) : buildKueryNodeFilter(filter); const authorizationFilter = await getAuthorizationFilter(context, { action: 'DELETE' }); @@ -71,20 +90,35 @@ export const bulkDeleteRules = async (context: RulesClientContext, options: Bulk ]); const deletedRules = rules.map(({ id, attributes, references }) => { - return getAlertFromRaw( - context, + // TODO (http-versioning): alertTypeId should never be null, but we need to + // fix the type cast from SavedObjectsBulkUpdateObject to SavedObjectsBulkUpdateObject + // when we are doing the bulk create and this should fix itself + const ruleType = context.ruleTypeRegistry.get(attributes.alertTypeId!); + const ruleDomain = transformRuleAttributesToRuleDomain(attributes as RuleAttributes, { id, - attributes.alertTypeId as string, - attributes as RawRule, + logger: context.logger, + ruleType, references, - false - ); + omitGeneratedValues: false, + }); + + try { + ruleDomainSchema.validate(ruleDomain); + } catch (e) { + context.logger.warn(`Error validating bulk edited rule domain object for id: ${id}, ${e}`); + } + return ruleDomain; }); + // // TODO (http-versioning): This should be of type Rule, change this when all rule types are fixed + const deletedPublicRules = deletedRules.map((rule: RuleDomain) => { + return transformRuleDomainToRule(rule); + }) as Array>; + if (result.status === 'fulfilled') { - return { errors, total, rules: deletedRules, taskIdsFailedToBeDeleted: result.value }; + return { errors, total, rules: deletedPublicRules, taskIdsFailedToBeDeleted: result.value }; } else { - return { errors, total, rules: deletedRules, taskIdsFailedToBeDeleted: [] }; + return { errors, total, rules: deletedPublicRules, taskIdsFailedToBeDeleted: [] }; } }; @@ -98,15 +132,17 @@ const bulkDeleteWithOCC = async ( type: 'rules', }, () => - context.encryptedSavedObjectsClient.createPointInTimeFinderDecryptedAsInternalUser({ - filter, - type: 'alert', - perPage: 100, - ...(context.namespace ? { namespaces: [context.namespace] } : undefined), - }) + context.encryptedSavedObjectsClient.createPointInTimeFinderDecryptedAsInternalUser( + { + filter, + type: 'alert', + perPage: 100, + ...(context.namespace ? { namespaces: [context.namespace] } : undefined), + } + ) ); - const rulesToDelete: Array> = []; + const rulesToDelete: Array> = []; const apiKeyToRuleIdMapping: Record = {}; const taskIdToRuleIdMapping: Record = {}; const ruleNameToRuleIdMapping: Record = {}; @@ -142,7 +178,11 @@ const bulkDeleteWithOCC = async ( const result = await withSpan( { name: 'unsecuredSavedObjectsClient.bulkDelete', type: 'rules' }, - () => context.unsecuredSavedObjectsClient.bulkDelete(rulesToDelete) + () => + bulkDeleteRulesSo({ + savedObjectsClient: context.unsecuredSavedObjectsClient, + ids: rulesToDelete.map(({ id }) => id), + }) ); const deletedRuleIds: string[] = []; @@ -173,6 +213,7 @@ const bulkDeleteWithOCC = async ( const rules = rulesToDelete.filter((rule) => deletedRuleIds.includes(rule.id)); // migrate legacy actions only for SIEM rules + // TODO (http-versioning) Remove RawRuleAction and RawRule casts await pMap( rules, async (rule) => { diff --git a/x-pack/plugins/alerting/server/application/rule/methods/bulk_delete/index.ts b/x-pack/plugins/alerting/server/application/rule/methods/bulk_delete/index.ts new file mode 100644 index 0000000000000..ac9048c366b6b --- /dev/null +++ b/x-pack/plugins/alerting/server/application/rule/methods/bulk_delete/index.ts @@ -0,0 +1,9 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +export { bulkDeleteRules } from './bulk_delete_rules'; +export type { BulkDeleteRulesResult, BulkDeleteRulesRequestBody } from './types'; diff --git a/x-pack/plugins/alerting/server/application/rule/methods/bulk_delete/schemas/index.ts b/x-pack/plugins/alerting/server/application/rule/methods/bulk_delete/schemas/index.ts new file mode 100644 index 0000000000000..7cf5da6665087 --- /dev/null +++ b/x-pack/plugins/alerting/server/application/rule/methods/bulk_delete/schemas/index.ts @@ -0,0 +1,13 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { schema } from '@kbn/config-schema'; + +export const bulkDeleteRulesRequestBodySchema = schema.object({ + filter: schema.maybe(schema.string()), + ids: schema.maybe(schema.arrayOf(schema.string(), { minSize: 1, maxSize: 1000 })), +}); diff --git a/x-pack/plugins/alerting/server/application/rule/methods/bulk_delete/types/index.ts b/x-pack/plugins/alerting/server/application/rule/methods/bulk_delete/types/index.ts new file mode 100644 index 0000000000000..d7075638a5027 --- /dev/null +++ b/x-pack/plugins/alerting/server/application/rule/methods/bulk_delete/types/index.ts @@ -0,0 +1,28 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import type { TypeOf } from '@kbn/config-schema'; +import { bulkDeleteRulesRequestBodySchema } from '../schemas'; +import type { SanitizedRule } from '../../../../../types'; +import type { RuleParams } from '../../../types'; + +export interface BulkOperationError { + message: string; + status?: number; + rule: { + id: string; + name: string; + }; +} + +export type BulkDeleteRulesRequestBody = TypeOf; + +export interface BulkDeleteRulesResult { + rules: Array>; + errors: BulkOperationError[]; + total: number; + taskIdsFailedToBeDeleted: string[]; +} diff --git a/x-pack/plugins/alerting/server/application/rule/methods/bulk_delete/validation/index.ts b/x-pack/plugins/alerting/server/application/rule/methods/bulk_delete/validation/index.ts new file mode 100644 index 0000000000000..35893977bb06c --- /dev/null +++ b/x-pack/plugins/alerting/server/application/rule/methods/bulk_delete/validation/index.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 Boom from '@hapi/boom'; +import { BulkDeleteRulesRequestBody } from '../types'; + +export const validateCommonBulkOptions = (options: BulkDeleteRulesRequestBody) => { + const filter = options.filter; + const ids = options.ids; + + if (!ids && !filter) { + throw Boom.badRequest( + "Either 'ids' or 'filter' property in method's arguments should be provided" + ); + } + + if (ids?.length === 0) { + throw Boom.badRequest("'ids' property should not be an empty array"); + } + + if (ids && filter) { + throw Boom.badRequest( + "Both 'filter' and 'ids' are supplied. Define either 'ids' or 'filter' properties in method's arguments" + ); + } +}; diff --git a/x-pack/plugins/alerting/server/data/rule/index.ts b/x-pack/plugins/alerting/server/data/rule/index.ts index 6256ac9b2278a..08306a281ac52 100644 --- a/x-pack/plugins/alerting/server/data/rule/index.ts +++ b/x-pack/plugins/alerting/server/data/rule/index.ts @@ -15,3 +15,5 @@ export { findRulesSo } from './methods/find_rules_so'; export type { FindRulesSoParams } from './methods/find_rules_so'; export { bulkCreateRulesSo } from './methods/bulk_create_rule_so'; export type { BulkCreateRulesSoParams } from './methods/bulk_create_rule_so'; +export { bulkDeleteRulesSo } from './methods/bulk_delete_rules_so'; +export type { BulkDeleteRulesSoParams } from './methods/bulk_delete_rules_so'; diff --git a/x-pack/plugins/alerting/server/data/rule/methods/bulk_delete_rules_so.ts b/x-pack/plugins/alerting/server/data/rule/methods/bulk_delete_rules_so.ts new file mode 100644 index 0000000000000..7f3568f76cf98 --- /dev/null +++ b/x-pack/plugins/alerting/server/data/rule/methods/bulk_delete_rules_so.ts @@ -0,0 +1,29 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { + SavedObjectsClientContract, + SavedObjectsBulkDeleteOptions, + SavedObjectsBulkDeleteResponse, +} from '@kbn/core/server'; + +export interface BulkDeleteRulesSoParams { + savedObjectsClient: SavedObjectsClientContract; + ids: string[]; + savedObjectsBulkDeleteOptions?: SavedObjectsBulkDeleteOptions; +} + +export const bulkDeleteRulesSo = ( + params: BulkDeleteRulesSoParams +): Promise => { + const { savedObjectsClient, ids, savedObjectsBulkDeleteOptions } = params; + + return savedObjectsClient.bulkDelete( + ids.map((id) => ({ id, type: 'alert' })), + savedObjectsBulkDeleteOptions + ); +}; diff --git a/x-pack/plugins/alerting/server/routes/bulk_delete_rules.ts b/x-pack/plugins/alerting/server/routes/bulk_delete_rules.ts deleted file mode 100644 index 1eca663de21a8..0000000000000 --- a/x-pack/plugins/alerting/server/routes/bulk_delete_rules.ts +++ /dev/null @@ -1,50 +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 { schema } from '@kbn/config-schema'; -import { IRouter } from '@kbn/core/server'; -import { verifyAccessAndContext, handleDisabledApiKeysError } from './lib'; -import { ILicenseState, RuleTypeDisabledError } from '../lib'; -import { AlertingRequestHandlerContext, INTERNAL_BASE_ALERTING_API_PATH } from '../types'; - -export const bulkDeleteRulesRoute = ({ - router, - licenseState, -}: { - router: IRouter; - licenseState: ILicenseState; -}) => { - router.patch( - { - path: `${INTERNAL_BASE_ALERTING_API_PATH}/rules/_bulk_delete`, - validate: { - body: schema.object({ - filter: schema.maybe(schema.string()), - ids: schema.maybe(schema.arrayOf(schema.string(), { minSize: 1, maxSize: 1000 })), - }), - }, - }, - handleDisabledApiKeysError( - router.handleLegacyErrors( - verifyAccessAndContext(licenseState, async (context, req, res) => { - const rulesClient = (await context.alerting).getRulesClient(); - const { filter, ids } = req.body; - - try { - const result = await rulesClient.bulkDeleteRules({ filter, ids }); - return res.ok({ body: result }); - } catch (e) { - if (e instanceof RuleTypeDisabledError) { - return e.sendResponse(res); - } - throw e; - } - }) - ) - ) - ); -}; diff --git a/x-pack/plugins/alerting/server/routes/index.ts b/x-pack/plugins/alerting/server/routes/index.ts index fe82abe56c4af..a93803ed6d585 100644 --- a/x-pack/plugins/alerting/server/routes/index.ts +++ b/x-pack/plugins/alerting/server/routes/index.ts @@ -40,7 +40,7 @@ import { bulkEditInternalRulesRoute } from './rule/apis/bulk_edit/bulk_edit_rule import { snoozeRuleRoute } from './snooze_rule'; import { unsnoozeRuleRoute } from './unsnooze_rule'; import { runSoonRoute } from './run_soon'; -import { bulkDeleteRulesRoute } from './bulk_delete_rules'; +import { bulkDeleteRulesRoute } from './rule/apis/bulk_delete/bulk_delete_rules_route'; import { bulkEnableRulesRoute } from './bulk_enable_rules'; import { bulkDisableRulesRoute } from './bulk_disable_rules'; import { cloneRuleRoute } from './clone_rule'; diff --git a/x-pack/plugins/alerting/server/routes/bulk_delete_rules.test.ts b/x-pack/plugins/alerting/server/routes/rule/apis/bulk_delete/bulk_delete_rules_route.test.ts similarity index 87% rename from x-pack/plugins/alerting/server/routes/bulk_delete_rules.test.ts rename to x-pack/plugins/alerting/server/routes/rule/apis/bulk_delete/bulk_delete_rules_route.test.ts index c15405be85253..21099f6ba6086 100644 --- a/x-pack/plugins/alerting/server/routes/bulk_delete_rules.test.ts +++ b/x-pack/plugins/alerting/server/routes/rule/apis/bulk_delete/bulk_delete_rules_route.test.ts @@ -7,16 +7,16 @@ import { httpServiceMock } from '@kbn/core/server/mocks'; -import { bulkDeleteRulesRoute } from './bulk_delete_rules'; -import { licenseStateMock } from '../lib/license_state.mock'; -import { mockHandlerArguments } from './_mock_handler_arguments'; -import { rulesClientMock } from '../rules_client.mock'; -import { RuleTypeDisabledError } from '../lib/errors/rule_type_disabled'; -import { verifyApiAccess } from '../lib/license_api_access'; +import { bulkDeleteRulesRoute } from './bulk_delete_rules_route'; +import { licenseStateMock } from '../../../../lib/license_state.mock'; +import { mockHandlerArguments } from '../../../_mock_handler_arguments'; +import { rulesClientMock } from '../../../../rules_client.mock'; +import { RuleTypeDisabledError } from '../../../../lib/errors/rule_type_disabled'; +import { verifyApiAccess } from '../../../../lib/license_api_access'; const rulesClient = rulesClientMock.create(); -jest.mock('../lib/license_api_access', () => ({ +jest.mock('../../../../lib/license_api_access', () => ({ verifyApiAccess: jest.fn(), })); diff --git a/x-pack/plugins/alerting/server/routes/rule/apis/bulk_delete/bulk_delete_rules_route.ts b/x-pack/plugins/alerting/server/routes/rule/apis/bulk_delete/bulk_delete_rules_route.ts new file mode 100644 index 0000000000000..24dff47131978 --- /dev/null +++ b/x-pack/plugins/alerting/server/routes/rule/apis/bulk_delete/bulk_delete_rules_route.ts @@ -0,0 +1,69 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { IRouter } from '@kbn/core/server'; +import { verifyAccessAndContext, handleDisabledApiKeysError } from '../../../lib'; +import { ILicenseState, RuleTypeDisabledError } from '../../../../lib'; +import { AlertingRequestHandlerContext, INTERNAL_BASE_ALERTING_API_PATH } from '../../../../types'; +import { + bulkDeleteRulesRequestBodySchemaV1, + BulkDeleteRulesRequestBodyV1, + BulkDeleteRulesResponseV1, +} from '../../../../../common/routes/rule/apis/bulk_delete'; +import type { RuleParamsV1 } from '../../../../../common/routes/rule/response'; +import { transformRuleToRuleResponseV1 } from '../../transforms'; +import { Rule } from '../../../../application/rule/types'; + +export const bulkDeleteRulesRoute = ({ + router, + licenseState, +}: { + router: IRouter; + licenseState: ILicenseState; +}) => { + router.patch( + { + path: `${INTERNAL_BASE_ALERTING_API_PATH}/rules/_bulk_delete`, + validate: { + body: bulkDeleteRulesRequestBodySchemaV1, + }, + }, + handleDisabledApiKeysError( + router.handleLegacyErrors( + verifyAccessAndContext(licenseState, async (context, req, res) => { + const rulesClient = (await context.alerting).getRulesClient(); + + const body: BulkDeleteRulesRequestBodyV1 = req.body; + const { filter, ids } = body; + + try { + const bulkDeleteResults = await rulesClient.bulkDeleteRules({ + filter, + ids, + }); + const resultBody: BulkDeleteRulesResponseV1 = { + body: { + ...bulkDeleteResults, + rules: bulkDeleteResults.rules.map((rule) => { + // TODO (http-versioning): Remove this cast, this enables us to move forward + // without fixing all of other solution types + return transformRuleToRuleResponseV1(rule as Rule); + }), + }, + }; + return res.ok(resultBody); + } catch (e) { + if (e instanceof RuleTypeDisabledError) { + return e.sendResponse(res); + } + throw e; + } + }) + ) + ) + ); +}; diff --git a/x-pack/plugins/alerting/server/rules_client/common/retry_if_bulk_operation_conflicts.ts b/x-pack/plugins/alerting/server/rules_client/common/retry_if_bulk_operation_conflicts.ts index 428f43a0dcfa6..7a652c5230f47 100644 --- a/x-pack/plugins/alerting/server/rules_client/common/retry_if_bulk_operation_conflicts.ts +++ b/x-pack/plugins/alerting/server/rules_client/common/retry_if_bulk_operation_conflicts.ts @@ -13,13 +13,13 @@ import { withSpan } from '@kbn/apm-utils'; import { convertRuleIdsToKueryNode } from '../../lib'; import { BulkOperationError } from '../types'; import { waitBeforeNextRetry, RETRY_IF_CONFLICTS_ATTEMPTS } from './wait_before_next_retry'; -import { RawRule } from '../../types'; +import { RuleAttributes } from '../../data/rule/types'; const MAX_RULES_IDS_IN_RETRY = 1000; interface BulkOperationResult { errors: BulkOperationError[]; - rules: Array>; + rules: Array>; accListSpecificForBulkOperation: string[][]; } @@ -63,7 +63,7 @@ const handler = async ({ filter: KueryNode | null; accListSpecificForBulkOperation?: string[][]; accErrors?: BulkOperationError[]; - accRules?: Array>; + accRules?: Array>; retries?: number; }): Promise => { try { diff --git a/x-pack/plugins/alerting/server/rules_client/methods/bulk_disable.ts b/x-pack/plugins/alerting/server/rules_client/methods/bulk_disable.ts index 5ec0ae99ca99c..30b8b1eb01bba 100644 --- a/x-pack/plugins/alerting/server/rules_client/methods/bulk_disable.ts +++ b/x-pack/plugins/alerting/server/rules_client/methods/bulk_disable.ts @@ -28,6 +28,7 @@ import { } from '../lib'; import { BulkOptions, BulkOperationError, RulesClientContext } from '../types'; import { tryToRemoveTasks } from '../common'; +import { RuleAttributes } from '../../data/rule/types'; export const bulkDisableRules = async (context: RulesClientContext, options: BulkOptions) => { const { ids, filter } = getAndValidateCommonBulkOptions(options); @@ -218,7 +219,8 @@ const bulkDisableRulesWithOCC = async ( return { errors, - rules: disabledRules, + // TODO: delete the casting when we do versioning of bulk disable api + rules: disabledRules as Array>, accListSpecificForBulkOperation: [taskIdsToDisable, taskIdsToDelete], }; }; diff --git a/x-pack/plugins/alerting/server/rules_client/methods/bulk_enable.ts b/x-pack/plugins/alerting/server/rules_client/methods/bulk_enable.ts index 0e3f0eb042ec5..fda778e6b11af 100644 --- a/x-pack/plugins/alerting/server/rules_client/methods/bulk_enable.ts +++ b/x-pack/plugins/alerting/server/rules_client/methods/bulk_enable.ts @@ -30,6 +30,7 @@ import { } from '../lib'; import { RulesClientContext, BulkOperationError, BulkOptions } from '../types'; import { validateScheduleLimit } from '../../application/rule/methods/get_schedule_frequency'; +import { RuleAttributes } from '../../data/rule/types'; const getShouldScheduleTask = async ( context: RulesClientContext, @@ -284,7 +285,12 @@ const bulkEnableRulesWithOCC = async ( }); } }); - return { errors, rules, accListSpecificForBulkOperation: [taskIdsToEnable] }; + return { + errors, + // TODO: delete the casting when we do versioning of bulk disable api + rules: rules as Array>, + accListSpecificForBulkOperation: [taskIdsToEnable], + }; }; export const tryToEnableTasks = async ({ diff --git a/x-pack/plugins/alerting/server/rules_client/rules_client.ts b/x-pack/plugins/alerting/server/rules_client/rules_client.ts index f2274648d3981..4c1138f23cb39 100644 --- a/x-pack/plugins/alerting/server/rules_client/rules_client.ts +++ b/x-pack/plugins/alerting/server/rules_client/rules_client.ts @@ -8,7 +8,6 @@ import { SanitizedRule, RuleTypeParams } from '../types'; import { parseDuration } from '../../common/parse_duration'; import { RulesClientContext, BulkOptions, MuteOptions } from './types'; - import { clone, CloneArguments } from './methods/clone'; import { createRule, CreateRuleParams } from '../application/rule/methods/create'; import { get, GetParams } from './methods/get'; @@ -37,7 +36,10 @@ import { AggregateParams } from '../application/rule/methods/aggregate/types'; import { aggregateRules } from '../application/rule/methods/aggregate'; import { deleteRule } from './methods/delete'; import { update, UpdateOptions } from './methods/update'; -import { bulkDeleteRules } from './methods/bulk_delete'; +import { + bulkDeleteRules, + BulkDeleteRulesRequestBody, +} from '../application/rule/methods/bulk_delete'; import { bulkEditRules, BulkEditOptions, @@ -139,7 +141,8 @@ export class RulesClient { public getActionErrorLogWithAuth = (params: GetActionErrorLogByIdParams) => getActionErrorLogWithAuth(this.context, params); - public bulkDeleteRules = (options: BulkOptions) => bulkDeleteRules(this.context, options); + public bulkDeleteRules = (options: BulkDeleteRulesRequestBody) => + bulkDeleteRules(this.context, options); public bulkEdit = (options: BulkEditOptions) => bulkEditRules(this.context, options); public bulkEnableRules = (options: BulkOptions) => bulkEnableRules(this.context, options); diff --git a/x-pack/plugins/alerting/server/rules_client/tests/test_helpers.ts b/x-pack/plugins/alerting/server/rules_client/tests/test_helpers.ts index fd4e534838940..ac8f482e88c5b 100644 --- a/x-pack/plugins/alerting/server/rules_client/tests/test_helpers.ts +++ b/x-pack/plugins/alerting/server/rules_client/tests/test_helpers.ts @@ -42,6 +42,24 @@ export const defaultRule = { version: '1', }; +export const defaultRuleForBulkDelete = { + id: 'id1', + type: 'alert', + attributes: { + name: 'fakeName', + consumer: 'fakeConsumer', + alertTypeId: 'fakeType', + schedule: { interval: '5m' }, + actions: [] as unknown, + executionStatus: { + lastExecutionDate: new Date('2019-02-12T21:01:22.000Z'), + status: 'pending', + }, + }, + references: [], + version: '1', +}; + export const siemRule1 = { ...defaultRule, attributes: { @@ -51,6 +69,15 @@ export const siemRule1 = { id: 'siem-id1', }; +export const siemRuleForBulkDelete1 = { + ...defaultRuleForBulkDelete, + attributes: { + ...defaultRuleForBulkDelete.attributes, + consumer: AlertConsumers.SIEM, + }, + id: 'siem-id1', +}; + export const siemRule2 = { ...siemRule1, id: 'siem-id2', @@ -77,6 +104,51 @@ export const enabledRule2 = { }, }; +export const enabledRule3 = { + ...defaultRule, + id: 'id3', + attributes: { + ...defaultRule.attributes, + enabled: true, + scheduledTaskId: 'id3', + apiKey: Buffer.from('789:ghi').toString('base64'), + apiKeyCreatedByUser: true, + }, +}; + +export const enabledRuleForBulkDelete1 = { + ...defaultRuleForBulkDelete, + attributes: { + ...defaultRuleForBulkDelete.attributes, + enabled: true, + scheduledTaskId: 'id1', + apiKey: Buffer.from('123:abc').toString('base64'), + }, +}; + +export const enabledRuleForBulkDelete2 = { + ...defaultRuleForBulkDelete, + id: 'id2', + attributes: { + ...defaultRuleForBulkDelete.attributes, + enabled: true, + scheduledTaskId: 'id2', + apiKey: Buffer.from('321:abc').toString('base64'), + }, +}; + +export const enabledRuleForBulkDelete3 = { + ...defaultRuleForBulkDelete, + id: 'id3', + attributes: { + ...defaultRuleForBulkDelete.attributes, + enabled: true, + scheduledTaskId: 'id3', + apiKey: Buffer.from('789:ghi').toString('base64'), + apiKeyCreatedByUser: true, + }, +}; + export const disabledRule1 = { ...defaultRule, attributes: { @@ -166,6 +238,67 @@ export const returnedRule2 = { snoozeSchedule: [], }; +export const returnedRuleForBulkDelete1 = { + actions: [], + alertTypeId: 'fakeType', + consumer: 'fakeConsumer', + enabled: true, + id: 'id1', + name: 'fakeName', + executionStatus: { + lastExecutionDate: new Date('2019-02-12T21:01:22.000Z'), + status: 'pending', + }, + createdAt: new Date('2019-02-12T21:01:22.479Z'), + updatedAt: new Date('2019-02-12T21:01:22.479Z'), + schedule: { + interval: '5m', + }, + scheduledTaskId: 'id1', + snoozeSchedule: [], +}; + +export const returnedRuleForBulkDelete2 = { + actions: [], + alertTypeId: 'fakeType', + consumer: 'fakeConsumer', + enabled: true, + id: 'id2', + name: 'fakeName', + executionStatus: { + lastExecutionDate: new Date('2019-02-12T21:01:22.000Z'), + status: 'pending', + }, + createdAt: new Date('2019-02-12T21:01:22.479Z'), + updatedAt: new Date('2019-02-12T21:01:22.479Z'), + schedule: { + interval: '5m', + }, + scheduledTaskId: 'id2', + snoozeSchedule: [], +}; + +export const returnedRuleForBulkDelete3 = { + actions: [], + alertTypeId: 'fakeType', + apiKeyCreatedByUser: true, + consumer: 'fakeConsumer', + enabled: true, + id: 'id3', + name: 'fakeName', + executionStatus: { + lastExecutionDate: new Date('2019-02-12T21:01:22.000Z'), + status: 'pending', + }, + createdAt: new Date('2019-02-12T21:01:22.479Z'), + updatedAt: new Date('2019-02-12T21:01:22.479Z'), + schedule: { + interval: '5m', + }, + scheduledTaskId: 'id3', + snoozeSchedule: [], +}; + export const returnedDisabledRule1 = { ...returnedRule1, enabled: false, diff --git a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/bulk_delete.ts b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/bulk_delete.ts index ef50420bb6561..4d2e9781688c9 100644 --- a/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/bulk_delete.ts +++ b/x-pack/test/alerting_api_integration/security_and_spaces/group3/tests/alerting/bulk_delete.ts @@ -17,33 +17,32 @@ import { const getDefaultRules = (response: any) => ({ id: response.body.rules[0].id, - apiKey: response.body.rules[0].apiKey, - apiKeyCreatedByUser: false, - notifyWhen: 'onThrottleInterval', + api_key_created_by_user: false, + notify_when: 'onThrottleInterval', enabled: true, name: 'abc', tags: ['foo'], consumer: 'alertsFixture', throttle: '1m', - alertTypeId: 'test.noop', - apiKeyOwner: response.body.rules[0].apiKeyOwner, - createdBy: 'elastic', - updatedBy: response.body.rules[0].updatedBy, - muteAll: false, - mutedInstanceIds: [], + rule_type_id: 'test.noop', + api_key_owner: response.body.rules[0].api_key_owner, + created_by: 'elastic', + updated_by: response.body.rules[0].updated_by, + mute_all: false, + muted_alert_ids: [], schedule: { interval: '1m' }, actions: [], params: {}, running: false, - snoozeSchedule: [], - updatedAt: response.body.rules[0].updatedAt, - createdAt: response.body.rules[0].createdAt, - scheduledTaskId: response.body.rules[0].scheduledTaskId, - executionStatus: response.body.rules[0].executionStatus, + snooze_schedule: [], + updated_at: response.body.rules[0].updated_at, + created_at: response.body.rules[0].created_at, + scheduled_task_id: response.body.rules[0].scheduled_task_id, + execution_status: response.body.rules[0].execution_status, monitoring: response.body.rules[0].monitoring, revision: 0, - ...(response.body.rules[0].nextRun ? { nextRun: response.body.rules[0].nextRun } : {}), - ...(response.body.rules[0].lastRun ? { lastRun: response.body.rules[0].lastRun } : {}), + ...(response.body.rules[0].next_run ? { next_run: response.body.rules[0].next_run } : {}), + ...(response.body.rules[0].last_run ? { last_run: response.body.rules[0].last_run } : {}), }); const getThreeRules = (response: any) => { @@ -51,33 +50,32 @@ const getThreeRules = (response: any) => { for (let i = 0; i < 3; i++) { rules.push({ id: response.body.rules[i].id, - apiKey: response.body.rules[i].apiKey, - apiKeyCreatedByUser: false, - notifyWhen: 'onThrottleInterval', + api_key_created_by_user: false, + notify_when: 'onThrottleInterval', enabled: true, name: 'abc', tags: ['multiple-rules-delete'], consumer: 'alertsFixture', throttle: '1m', - alertTypeId: 'test.noop', - apiKeyOwner: response.body.rules[i].apiKeyOwner, - createdBy: 'elastic', - updatedBy: response.body.rules[i].updatedBy, - muteAll: false, - mutedInstanceIds: [], + rule_type_id: 'test.noop', + api_key_owner: response.body.rules[i].api_key_owner, + created_by: 'elastic', + updated_by: response.body.rules[i].updated_by, + mute_all: false, + muted_alert_ids: [], schedule: { interval: '1m' }, actions: [], params: {}, running: false, - snoozeSchedule: [], - updatedAt: response.body.rules[i].updatedAt, - createdAt: response.body.rules[i].createdAt, - scheduledTaskId: response.body.rules[i].scheduledTaskId, - executionStatus: response.body.rules[i].executionStatus, + snooze_schedule: [], + updated_at: response.body.rules[i].updated_at, + created_at: response.body.rules[i].created_at, + scheduled_task_id: response.body.rules[i].scheduled_task_id, + execution_status: response.body.rules[i].execution_status, monitoring: response.body.rules[i].monitoring, revision: 0, - ...(response.body.rules[i].nextRun ? { nextRun: response.body.rules[i].nextRun } : {}), - ...(response.body.rules[i].lastRun ? { lastRun: response.body.rules[i].lastRun } : {}), + ...(response.body.rules[i].next_run ? { next_run: response.body.rules[i].next_run } : {}), + ...(response.body.rules[i].last_run ? { last_run: response.body.rules[i].last_run } : {}), }); } return rules; @@ -230,7 +228,7 @@ export default ({ getService }: FtrProviderContext) => { rules: [ { ...getDefaultRules(response), - alertTypeId: 'test.restricted-noop', + rule_type_id: 'test.restricted-noop', consumer: 'alertsRestrictedFixture', }, ], @@ -298,7 +296,7 @@ export default ({ getService }: FtrProviderContext) => { break; case 'superuser at space1': expect(response.body).to.eql({ - rules: [{ ...getDefaultRules(response), alertTypeId: 'test.restricted-noop' }], + rules: [{ ...getDefaultRules(response), rule_type_id: 'test.restricted-noop' }], errors: [], total: 1, taskIdsFailedToBeDeleted: [], @@ -604,7 +602,7 @@ export default ({ getService }: FtrProviderContext) => { expect(response.statusCode).to.eql(400); expect(response.body.message).to.eql( - "Both 'filter' and 'ids' are supplied. Define either 'ids' or 'filter' properties in method's arguments" + "Error validating bulk delete data - Both 'filter' and 'ids' are supplied. Define either 'ids' or 'filter' properties in method's arguments" ); objectRemover.add(space.id, createdRule1.id, 'rule', 'alerting'); await getScheduledTask(createdRule1.scheduled_task_id); @@ -641,7 +639,8 @@ export default ({ getService }: FtrProviderContext) => { expect(response.body).to.eql({ error: 'Bad Request', - message: "Either 'ids' or 'filter' property in method's arguments should be provided", + message: + "Error validating bulk delete data - Either 'ids' or 'filter' property in method's arguments should be provided", statusCode: 400, }); }); @@ -669,7 +668,8 @@ export default ({ getService }: FtrProviderContext) => { expect(response.body).to.eql({ error: 'Bad Request', - message: "Either 'ids' or 'filter' property in method's arguments should be provided", + message: + "Error validating bulk delete data - Either 'ids' or 'filter' property in method's arguments should be provided", statusCode: 400, }); }); From 6cf246b50503928abe03e07b69cd82c43ba84609 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Efe=20G=C3=BCrkan=20YALAMAN?= Date: Tue, 26 Sep 2023 18:22:00 +0200 Subject: [PATCH 04/26] Gracefully handle 404s for documents and mappings (#167101) ## Summary ![Screenshot 2023-09-25 at 17 09 34](https://github.com/elastic/kibana/assets/1410658/eb040d9c-6521-4a05-a57f-3e9d15b2db0a) ![Screenshot 2023-09-25 at 17 09 42](https://github.com/elastic/kibana/assets/1410658/cbc41a65-697b-4011-968b-fb6660835d28) ### Checklist - [x] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [x] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [x] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Co-authored-by: Liam Thompson <32779855+leemthompo@users.noreply.github.com> --- .../components/search_index/documents.tsx | 27 +++++++++++++++-- .../search_index/index_mappings.tsx | 30 ++++++++++++++++--- 2 files changed, 50 insertions(+), 7 deletions(-) diff --git a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/documents.tsx b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/documents.tsx index 694639b1d19c6..b2932c9547e27 100644 --- a/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/documents.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/enterprise_search_content/components/search_index/documents.tsx @@ -10,6 +10,7 @@ import React, { useEffect, useState, ChangeEvent } from 'react'; import { useActions, useValues } from 'kea'; import { + EuiCallOut, EuiFieldSearch, EuiFlexGroup, EuiFlexItem, @@ -74,7 +75,7 @@ export const SearchIndexDocuments: React.FC = () => { const { makeRequest: getDocuments } = useActions(documentLogic); const { makeRequest: getMappings } = useActions(mappingLogic); - const { data, status } = useValues(documentLogic); + const { data, status, error } = useValues(documentLogic); const { data: mappingData, status: mappingStatus } = useValues(mappingLogic); const docs = data?.results?.hits.hits ?? []; @@ -84,6 +85,8 @@ export const SearchIndexDocuments: React.FC = () => { const shouldShowAccessControlSwitcher = hasDocumentLevelSecurityFeature && productFeatures.hasDocumentLevelSecurityEnabled; + const isAccessControlIndexNotFound = + shouldShowAccessControlSwitcher && error?.body?.statusCode === 404; useEffect(() => { getDocuments({ @@ -141,11 +144,29 @@ export const SearchIndexDocuments: React.FC = () => { - {docs.length === 0 && + {isAccessControlIndexNotFound && ( + +

+ {i18n.translate('xpack.enterpriseSearch.content.searchIndex.documents.noIndex', { + defaultMessage: + "An Access Control Index won't be created until you enable document-level security and run your first access control sync.", + })} +

+
+ )} + {!isAccessControlIndexNotFound && + docs.length === 0 && i18n.translate('xpack.enterpriseSearch.content.searchIndex.documents.noMappings', { defaultMessage: 'No documents found for index', })} - {docs.length > 0 && ( + {!isAccessControlIndexNotFound && docs.length > 0 && ( { ? indexName : stripSearchPrefix(indexName, CONNECTORS_ACCESS_CONTROL_INDEX_PREFIX); const { makeRequest: makeMappingRequest } = useActions(mappingsWithPropsApiLogic(indexToShow)); - const { data: mappingData } = useValues(mappingsWithPropsApiLogic(indexToShow)); + const { data: mappingData, error } = useValues(mappingsWithPropsApiLogic(indexToShow)); const shouldShowAccessControlSwitch = hasDocumentLevelSecurityFeature && productFeatures.hasDocumentLevelSecurityEnabled; + const isAccessControlIndexNotFound = + shouldShowAccessControlSwitch && error?.body?.statusCode === 404; + useEffect(() => { makeMappingRequest({ indexName: indexToShow }); }, [indexToShow, indexName]); @@ -77,9 +81,27 @@ export const SearchIndexIndexMappings: React.FC = () => {
)} - - {JSON.stringify(mappingData, null, 2)} - + {isAccessControlIndexNotFound ? ( + +

+ {i18n.translate('xpack.enterpriseSearch.content.searchIndex.mappings.noIndex', { + defaultMessage: + "An Access Control Index won't be created until you enable document-level security and run your first access control sync.", + })} +

+
+ ) : ( + + {JSON.stringify(mappingData, null, 2)} + + )}
From 302ec109ceb0416d124874a88dd83a8243ee083c Mon Sep 17 00:00:00 2001 From: James Gowdy Date: Tue, 26 Sep 2023 17:25:25 +0100 Subject: [PATCH 05/26] [ML] Adding created_by job property for the advanced wizard (#167021) Adds `created_by` property of `advanced-wizard` to all jobs created by the advanced job wizard. Previously no `created_by` property was added to these jobs. When cloning, jobs with no `created_by` property or one with a value of `advanced-wizard` will be opened in the advanced wizard. Closes https://github.com/elastic/kibana/issues/166053 --- x-pack/plugins/ml/common/constants/new_job.ts | 1 + .../public/application/jobs/jobs_list/components/utils.js | 8 +++++++- .../new_job/common/job_creator/advanced_job_creator.ts | 6 ++++-- .../jobs/new_job/common/job_creator/geo_job_creator.ts | 6 +++++- .../common/job_creator/multi_metric_job_creator.ts | 6 +++++- .../new_job/common/job_creator/population_job_creator.ts | 6 +++++- .../jobs/new_job/common/job_creator/rare_job_creator.ts | 6 +++++- .../common/job_creator/single_metric_job_creator.ts | 2 +- .../pages/index_or_search/preconfigured_job_redirect.ts | 1 + 9 files changed, 34 insertions(+), 8 deletions(-) diff --git a/x-pack/plugins/ml/common/constants/new_job.ts b/x-pack/plugins/ml/common/constants/new_job.ts index 12aa5393ad6e1..24584a6e8d29b 100644 --- a/x-pack/plugins/ml/common/constants/new_job.ts +++ b/x-pack/plugins/ml/common/constants/new_job.ts @@ -19,6 +19,7 @@ export enum CREATED_BY_LABEL { SINGLE_METRIC = 'single-metric-wizard', MULTI_METRIC = 'multi-metric-wizard', POPULATION = 'population-wizard', + ADVANCED = 'advanced-wizard', CATEGORIZATION = 'categorization-wizard', RARE = 'rare-wizard', GEO = 'geo-wizard', diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/utils.js b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/utils.js index ea8a43b51c47d..9dfef0ff8b5a3 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/utils.js +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/utils.js @@ -24,6 +24,7 @@ import { mlCalendarService } from '../../../services/calendar_service'; import { isPopulatedObject } from '@kbn/ml-is-populated-object'; import { ML_PAGES } from '../../../../../common/constants/locator'; import { PLUGIN_ID } from '../../../../../common/constants/app'; +import { CREATED_BY_LABEL } from '../../../../../common/constants/new_job'; export function loadFullJob(jobId) { return new Promise((resolve, reject) => { @@ -240,7 +241,12 @@ export async function cloneJob(jobId) { return; } - if (cloneableJob !== undefined && originalJob?.custom_settings?.created_by !== undefined) { + const createdBy = originalJob?.custom_settings?.created_by; + if ( + cloneableJob !== undefined && + createdBy !== undefined && + createdBy !== CREATED_BY_LABEL.ADVANCED + ) { // if the job is from a wizards, i.e. contains a created_by property // use tempJobCloningObjects to temporarily store the job mlJobService.tempJobCloningObjects.createdBy = originalJob?.custom_settings?.created_by; diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/advanced_job_creator.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/advanced_job_creator.ts index face450f58cd3..150b57402ee5e 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/advanced_job_creator.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/advanced_job_creator.ts @@ -11,14 +11,14 @@ import type { Field, Aggregation, SplitField } from '@kbn/ml-anomaly-utils'; import type { SavedSearch } from '@kbn/saved-search-plugin/public'; import { JobCreator } from './job_creator'; -import { +import type { Job, Datafeed, Detector, CustomRule, } from '../../../../../../common/types/anomaly_detection_jobs'; import { createBasicDetector } from './util/default_configs'; -import { JOB_TYPE } from '../../../../../../common/constants/new_job'; +import { CREATED_BY_LABEL, JOB_TYPE } from '../../../../../../common/constants/new_job'; import { getRichDetectors } from './util/general'; import { isValidJson } from '../../../../../../common/util/validation_utils'; @@ -41,6 +41,7 @@ export class AdvancedJobCreator extends JobCreator { constructor(indexPattern: DataView, savedSearch: SavedSearch | null, query: object) { super(indexPattern, savedSearch, query); + this.createdBy = CREATED_BY_LABEL.ADVANCED; this._queryString = JSON.stringify(this._datafeed_config.query); @@ -182,6 +183,7 @@ export class AdvancedJobCreator extends JobCreator { public cloneFromExistingJob(job: Job, datafeed: Datafeed) { this._overrideConfigs(job, datafeed); + this.createdBy = CREATED_BY_LABEL.ADVANCED; const detectors = getRichDetectors(job, datafeed, this.additionalFields, true); // keep track of the custom rules for each detector diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/geo_job_creator.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/geo_job_creator.ts index 596eb56230dc0..59e89070b38dd 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/geo_job_creator.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/geo_job_creator.ts @@ -9,7 +9,11 @@ import type { DataView } from '@kbn/data-views-plugin/public'; import type { Field, Aggregation, SplitField, AggFieldPair } from '@kbn/ml-anomaly-utils'; import type { SavedSearch } from '@kbn/saved-search-plugin/public'; import { JobCreator } from './job_creator'; -import { Job, Datafeed, Detector } from '../../../../../../common/types/anomaly_detection_jobs'; +import type { + Job, + Datafeed, + Detector, +} from '../../../../../../common/types/anomaly_detection_jobs'; import { createBasicDetector } from './util/default_configs'; import { JOB_TYPE, CREATED_BY_LABEL } from '../../../../../../common/constants/new_job'; import { getRichDetectors } from './util/general'; diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/multi_metric_job_creator.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/multi_metric_job_creator.ts index 794057ea209e8..39ad966b595e7 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/multi_metric_job_creator.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/multi_metric_job_creator.ts @@ -9,7 +9,11 @@ import type { DataView } from '@kbn/data-views-plugin/public'; import type { Field, Aggregation, SplitField, AggFieldPair } from '@kbn/ml-anomaly-utils'; import type { SavedSearch } from '@kbn/saved-search-plugin/public'; import { JobCreator } from './job_creator'; -import { Job, Datafeed, Detector } from '../../../../../../common/types/anomaly_detection_jobs'; +import type { + Job, + Datafeed, + Detector, +} from '../../../../../../common/types/anomaly_detection_jobs'; import { createBasicDetector } from './util/default_configs'; import { JOB_TYPE, CREATED_BY_LABEL } from '../../../../../../common/constants/new_job'; import { getRichDetectors } from './util/general'; diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/population_job_creator.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/population_job_creator.ts index 09f10b0a2f1aa..08de5d30d11eb 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/population_job_creator.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/population_job_creator.ts @@ -9,7 +9,11 @@ import type { DataView } from '@kbn/data-views-plugin/public'; import type { Field, Aggregation, SplitField, AggFieldPair } from '@kbn/ml-anomaly-utils'; import type { SavedSearch } from '@kbn/saved-search-plugin/public'; import { JobCreator } from './job_creator'; -import { Job, Datafeed, Detector } from '../../../../../../common/types/anomaly_detection_jobs'; +import type { + Job, + Datafeed, + Detector, +} from '../../../../../../common/types/anomaly_detection_jobs'; import { createBasicDetector } from './util/default_configs'; import { JOB_TYPE, CREATED_BY_LABEL } from '../../../../../../common/constants/new_job'; import { getRichDetectors } from './util/general'; diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/rare_job_creator.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/rare_job_creator.ts index f586ec332773d..cc9601fc85634 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/rare_job_creator.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/rare_job_creator.ts @@ -14,7 +14,11 @@ import { } from '@kbn/ml-anomaly-utils'; import type { SavedSearch } from '@kbn/saved-search-plugin/public'; import { JobCreator } from './job_creator'; -import { Job, Datafeed, Detector } from '../../../../../../common/types/anomaly_detection_jobs'; +import type { + Job, + Datafeed, + Detector, +} from '../../../../../../common/types/anomaly_detection_jobs'; import { JOB_TYPE, CREATED_BY_LABEL } from '../../../../../../common/constants/new_job'; import { getRichDetectors, isSparseDataJob } from './util/general'; diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/single_metric_job_creator.ts b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/single_metric_job_creator.ts index b0a1a1136bc6b..07a949b6a34a3 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/single_metric_job_creator.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/common/job_creator/single_metric_job_creator.ts @@ -17,7 +17,7 @@ import { import type { SavedSearch } from '@kbn/saved-search-plugin/public'; import { parseInterval } from '../../../../../../common/util/parse_interval'; import { JobCreator } from './job_creator'; -import { +import type { Job, Datafeed, Detector, diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/index_or_search/preconfigured_job_redirect.ts b/x-pack/plugins/ml/public/application/jobs/new_job/pages/index_or_search/preconfigured_job_redirect.ts index 471ba1e30608e..3f288d8f6191f 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/index_or_search/preconfigured_job_redirect.ts +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/index_or_search/preconfigured_job_redirect.ts @@ -63,6 +63,7 @@ async function getWizardUrlFromCloningJob(createdBy: string | undefined, dataVie case CREATED_BY_LABEL.GEO: page = JOB_TYPE.GEO; break; + case CREATED_BY_LABEL.ADVANCED: default: page = JOB_TYPE.ADVANCED; break; From 090569bb45573cc5df92add8c1a114134e8079e7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Yulia=20=C4=8Cech?= <6585477+yuliacech@users.noreply.github.com> Date: Tue, 26 Sep 2023 18:36:46 +0200 Subject: [PATCH 06/26] [Management team] Fix the type check errors (#167133) ## Summary This PR fixes the errors of the type checkers on some of the Management team's plugins. The errors were identified by running the command `node scripts/type_check --project ` with these files as suggested by the Operations team: - ./packages/kbn-generate-console-definitions/tsconfig.json - ./src/plugins/console/tsconfig.json - ./packages/kbn-management/settings/components/field_row/tsconfig.json --- .../components/field_row/footer/change_image_link.test.tsx | 2 +- .../settings/components/field_row/footer/index.ts | 3 ++- src/plugins/console/public/lib/autocomplete/autocomplete.ts | 6 +++--- 3 files changed, 6 insertions(+), 5 deletions(-) diff --git a/packages/kbn-management/settings/components/field_row/footer/change_image_link.test.tsx b/packages/kbn-management/settings/components/field_row/footer/change_image_link.test.tsx index 201942bc89d44..c101ef175b395 100644 --- a/packages/kbn-management/settings/components/field_row/footer/change_image_link.test.tsx +++ b/packages/kbn-management/settings/components/field_row/footer/change_image_link.test.tsx @@ -16,7 +16,7 @@ const IMAGE = `data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAQAAAAEACAIAAADTED8 describe('ChangeImageLink', () => { const defaultProps: ChangeImageLinkProps = { field: { - name: 'test', + id: 'test', type: 'image', ariaAttributes: { ariaLabel: 'test', diff --git a/packages/kbn-management/settings/components/field_row/footer/index.ts b/packages/kbn-management/settings/components/field_row/footer/index.ts index 0322c72010380..fc8cac296885c 100644 --- a/packages/kbn-management/settings/components/field_row/footer/index.ts +++ b/packages/kbn-management/settings/components/field_row/footer/index.ts @@ -7,4 +7,5 @@ */ export { FieldInputFooter, type FieldInputFooterProps } from './input_footer'; -export { InputResetLink, type FieldResetLinkProps } from './reset_link'; +export { InputResetLink } from './reset_link'; +export type { InputResetLinkProps } from './reset_link'; diff --git a/src/plugins/console/public/lib/autocomplete/autocomplete.ts b/src/plugins/console/public/lib/autocomplete/autocomplete.ts index 487ed95672d83..d6bb3879669ae 100644 --- a/src/plugins/console/public/lib/autocomplete/autocomplete.ts +++ b/src/plugins/console/public/lib/autocomplete/autocomplete.ts @@ -998,12 +998,12 @@ export default function ({ ) { // will simulate autocomplete on 'GET /a/b/' with a filter by index return { - tokenPath: context.urlTokenPath.slice(0, -1), - predicate: (term) => term.meta === 'index', + tokenPath: context.urlTokenPath?.slice(0, -1), + predicate: (term: any) => term.meta === 'index', }; } else { // will do nothing special - return { tokenPath: context.urlTokenPath, predicate: (term) => true }; + return { tokenPath: context.urlTokenPath, predicate: () => true }; } })(); From 9cccd0ee4d9e88d8114ccceb463f92b5bd07eca9 Mon Sep 17 00:00:00 2001 From: Thomas Watson Date: Tue, 26 Sep 2023 20:27:57 +0200 Subject: [PATCH 07/26] Upgrade execa from v4.1.0 to v5.1.1 (#167211) --- package.json | 2 +- yarn.lock | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/package.json b/package.json index a08963d37feea..90d9f8aa5d2d7 100644 --- a/package.json +++ b/package.json @@ -880,7 +880,7 @@ "del": "^6.1.0", "elastic-apm-node": "^4.0.0", "email-addresses": "^5.0.0", - "execa": "^4.0.2", + "execa": "^5.1.1", "expiry-js": "0.1.7", "extract-zip": "^2.0.1", "fast-deep-equal": "^3.1.1", diff --git a/yarn.lock b/yarn.lock index 7e1992e29ade1..6a4f80236417c 100644 --- a/yarn.lock +++ b/yarn.lock @@ -16172,7 +16172,7 @@ exec-sh@^0.3.2: resolved "https://registry.yarnpkg.com/exec-sh/-/exec-sh-0.3.2.tgz#6738de2eb7c8e671d0366aea0b0db8c6f7d7391b" integrity sha512-9sLAvzhI5nc8TpuQUh4ahMdCrWT00wPWz7j47/emR5+2qEfoZP5zzUXvx+vdx+H6ohhnsYC31iX04QLYJK8zTg== -execa@4.1.0, execa@^4.0.2: +execa@4.1.0: version "4.1.0" resolved "https://registry.yarnpkg.com/execa/-/execa-4.1.0.tgz#4e5491ad1572f2f17a77d388c6c857135b22847a" integrity sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA== From d86eebd6c1e7dd8b084bba91566fdd9298293b0e Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Mike=20C=C3=B4t=C3=A9?= Date: Tue, 26 Sep 2023 14:29:38 -0400 Subject: [PATCH 08/26] [Task Manager] Force validation on all tasks using state (#164574) Resolves https://github.com/elastic/kibana/issues/159347 Part of https://github.com/elastic/kibana/issues/155764 In this PR, I'm forcing validation on any tasks using state by ensuring a state schema is defined by the task type. Without this schema and once this PR merges, Task Manager will now fail validation by throwing `[TaskValidator] stateSchemaByVersion not defined for task type: XYZ` errors. This forces an explicit schema to be defined so we can properly handle state objects in ZDT environments. --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../task_manager/server/task_validator.test.ts | 8 ++------ .../task_manager/server/task_validator.ts | 17 +++++++---------- 2 files changed, 9 insertions(+), 16 deletions(-) diff --git a/x-pack/plugins/task_manager/server/task_validator.test.ts b/x-pack/plugins/task_manager/server/task_validator.test.ts index 52822adf6f49f..08c18591e468e 100644 --- a/x-pack/plugins/task_manager/server/task_validator.test.ts +++ b/x-pack/plugins/task_manager/server/task_validator.test.ts @@ -64,9 +64,7 @@ describe('TaskValidator', () => { expect(result).toEqual(task); }); - // TODO: Remove skip once all task types have defined their state schema. - // https://github.com/elastic/kibana/issues/159347 - it.skip(`should fail to validate the state schema when the task type doesn't have stateSchemaByVersion defined`, () => { + it(`should fail to validate the state schema when the task type doesn't have stateSchemaByVersion defined`, () => { const definitions = new TaskTypeDictionary(mockLogger()); definitions.registerTaskDefinitions({ foo: fooTaskDefinition, @@ -322,9 +320,7 @@ describe('TaskValidator', () => { expect(result).toEqual(task); }); - // TODO: Remove skip once all task types have defined their state schema. - // https://github.com/elastic/kibana/issues/159347 - it.skip(`should fail to validate the state schema when the task type doesn't have stateSchemaByVersion defined`, () => { + it(`should fail to validate the state schema when the task type doesn't have stateSchemaByVersion defined`, () => { const definitions = new TaskTypeDictionary(mockLogger()); definitions.registerTaskDefinitions({ foo: fooTaskDefinition, diff --git a/x-pack/plugins/task_manager/server/task_validator.ts b/x-pack/plugins/task_manager/server/task_validator.ts index 61d9a903dd5b4..900af04cd1207 100644 --- a/x-pack/plugins/task_manager/server/task_validator.ts +++ b/x-pack/plugins/task_manager/server/task_validator.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { max, memoize } from 'lodash'; +import { max, memoize, isEmpty } from 'lodash'; import type { Logger } from '@kbn/core/server'; import type { ObjectType } from '@kbn/config-schema'; import { TaskTypeDictionary } from './task_type_dictionary'; @@ -64,14 +64,13 @@ export class TaskValidator { const taskTypeDef = this.definitions.get(task.taskType); const latestStateSchema = this.cachedGetLatestStateSchema(taskTypeDef); - // TODO: Remove once all task types have defined their state schema. - // https://github.com/elastic/kibana/issues/159347 - // Otherwise, failures on read / write would occur. (don't forget to unskip test) - if (!latestStateSchema) { + let state = task.state; + + // Skip validating tasks that don't use state + if (!latestStateSchema && isEmpty(state)) { return task; } - let state = task.state; try { state = this.getValidatedStateSchema( this.migrateTaskState(task.state, task.stateVersion, taskTypeDef, latestStateSchema), @@ -111,10 +110,8 @@ export class TaskValidator { const taskTypeDef = this.definitions.get(task.taskType); const latestStateSchema = this.cachedGetLatestStateSchema(taskTypeDef); - // TODO: Remove once all task types have defined their state schema. - // https://github.com/elastic/kibana/issues/159347 - // Otherwise, failures on read / write would occur. (don't forget to unskip test) - if (!latestStateSchema) { + // Skip validating tasks that don't use state + if (!latestStateSchema && isEmpty(task.state)) { return task; } From 838500336cafb8acc74845c4cce5bdb49621e10a Mon Sep 17 00:00:00 2001 From: Thomas Watson Date: Tue, 26 Sep 2023 20:32:36 +0200 Subject: [PATCH 09/26] [Ops] Add ability to scope type check to staged files (#167236) --- .../scripts/steps/check_types_commits.sh | 30 ++++++++++++++----- 1 file changed, 22 insertions(+), 8 deletions(-) diff --git a/.buildkite/scripts/steps/check_types_commits.sh b/.buildkite/scripts/steps/check_types_commits.sh index 113f516efc023..36ea6299194e9 100755 --- a/.buildkite/scripts/steps/check_types_commits.sh +++ b/.buildkite/scripts/steps/check_types_commits.sh @@ -9,18 +9,28 @@ if [[ "${CI-}" == "true" ]]; then sha1=$(git merge-base $GITHUB_PR_TARGET_BRANCH $GITHUB_PR_TRIGGERED_SHA) sha2="${GITHUB_PR_TRIGGERED_SHA-}" else - # Script take between 0 and 2 arguments representing two commit SHA's: - # If 0, it will diff HEAD and HEAD^ - # If 1 (SHA1), it will diff SHA1 and SHA1^ - # If 2 (SHA1, SHA2), it will diff SHA1 and SHA2 - sha1="${1-HEAD}" - sha2="${2-$sha1^}" + if [[ "${1-}" == "--cached" ]]; then + # Only check staged files + sha1=$1 + sha2="" + else + # Script take between 0 and 2 arguments representing two commit SHA's: + # If 0, it will diff HEAD and HEAD^ + # If 1 (SHA1), it will diff SHA1 and SHA1^ + # If 2 (SHA1, SHA2), it will diff SHA1 and SHA2 + sha1="${1-HEAD}" + sha2="${2-$sha1^}" + fi fi uniq_dirs=() uniq_tsconfigs=() -echo "Detecting files changed between $sha1 and $sha2..." +if [[ "$sha1" == "--cached" ]]; then + echo "Detecting files changed in staging area..." +else + echo "Detecting files changed between $sha1 and $sha2..." +fi files=($(git diff --name-only $sha1 $sha2)) @@ -102,7 +112,11 @@ do done if [ ${#uniq_tsconfigs[@]} -eq 0 ]; then - echo "No tsconfig.json files found for changes in $sha1 $sha2" + if [[ "$sha1" == "--cached" ]]; then + echo "No tsconfig.json files found for staged changes" + else + echo "No tsconfig.json files found for changes between $sha1 and $sha2" + fi exit fi From f42b40fe35ffe1384d6ef146a2b8c1c1556770d1 Mon Sep 17 00:00:00 2001 From: Thomas Watson Date: Tue, 26 Sep 2023 20:33:06 +0200 Subject: [PATCH 10/26] [type check] Fix ./test/tsconfig.json TypeScript errors (#167239) Co-authored-by: Stratoula Kalafateli --- test/functional/apps/console/_autocomplete.ts | 5 ++--- 1 file changed, 2 insertions(+), 3 deletions(-) diff --git a/test/functional/apps/console/_autocomplete.ts b/test/functional/apps/console/_autocomplete.ts index dd2e5a131efea..2f9d8db9cf9d2 100644 --- a/test/functional/apps/console/_autocomplete.ts +++ b/test/functional/apps/console/_autocomplete.ts @@ -213,11 +213,10 @@ GET _search 'pressRight', 'pressLeft', 'pressLeft', - ]; + ] as const; for (const keyPress of keyPresses) { await PageObjects.console.sleepForDebouncePeriod(); log.debug('Key', keyPress); - // @ts-ignore await PageObjects.console[keyPress](); expect(await PageObjects.console.isAutocompleteVisible()).to.be.eql(false); } @@ -258,7 +257,7 @@ GET _search for (const char of [method.at(-1), ' ', '_']) { await PageObjects.console.sleepForDebouncePeriod(); log.debug('Key type "%s"', char); - await PageObjects.console.enterText(char ?? ''); // e.g. 'Post ' -> 'Post _' + await PageObjects.console.enterText(char!); // e.g. 'Post ' -> 'Post _' } await retry.waitFor('autocomplete to be visible', () => From 14ed446c2324606d47c2c405ee9d329b01d78f9a Mon Sep 17 00:00:00 2001 From: Davis McPhee Date: Tue, 26 Sep 2023 16:09:44 -0300 Subject: [PATCH 11/26] [Unified Doc Viewer] Exclude static style assets from Unified Doc Viewer tree shaking (#167199) ## Summary This PR updates tree shaking in Unified Doc Viewer to exclude static style assets. Before: ![image](https://github.com/elastic/kibana/assets/25592674/5e07b4e3-ae73-4596-896e-f8f4900736c3) After: ![image](https://github.com/elastic/kibana/assets/25592674/ac13a4f8-b680-4d70-bf73-85bd02294711) Test by launching Kibana before and after the fix with prod bundles and no bundle caching: ``` node scripts/kibana --dev --dist --no-cache ``` Fixes #167198. ### Checklist - [ ] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [ ] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [ ] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [ ] If a plugin configuration key changed, check if it needs to be allowlisted in the cloud and added to the [docker list](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker) - [ ] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [ ] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --- packages/kbn-unified-doc-viewer/package.json | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/packages/kbn-unified-doc-viewer/package.json b/packages/kbn-unified-doc-viewer/package.json index c301255f057bc..a254194d5d940 100644 --- a/packages/kbn-unified-doc-viewer/package.json +++ b/packages/kbn-unified-doc-viewer/package.json @@ -3,5 +3,8 @@ "private": true, "version": "1.0.0", "license": "SSPL-1.0 OR Elastic License 2.0", - "sideEffects": false -} \ No newline at end of file + "sideEffects": [ + "*.css", + "*.scss" + ] +} From c9a98a78469c0163cb91e8f04a5d709afccd46cc Mon Sep 17 00:00:00 2001 From: christineweng <18648970+christineweng@users.noreply.github.com> Date: Tue, 26 Sep 2023 14:15:30 -0500 Subject: [PATCH 12/26] [Security Solution] Expandable flyout - add accessibility support (#166996) ## Summary This PR adds accessibility support in the new expandably flyout, namely: - Added recommended aria-label to components - Adjusted heading sizes to follow "Heading level should only increase by one" rule ### Checklist - [x] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [x] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) --- .../cti_details/threat_details_view.tsx | 4 ++-- .../flyout/left/components/host_details.tsx | 12 ++++++------ .../flyout/left/components/related_cases.tsx | 15 ++++++++++++++- .../flyout/left/components/user_details.tsx | 12 ++++++------ .../public/flyout/left/tabs/insights_tab.tsx | 2 +- .../public/flyout/left/tabs/visualize_tab.tsx | 2 +- .../flyout/right/components/description.tsx | 7 +++++++ .../right/components/expand_detail_button.tsx | 13 +++++++++++++ .../flyout/right/components/header_title.tsx | 4 ++-- .../right/components/insights_summary_row.tsx | 16 ++++++++++++++-- .../right/components/investigation_guide.tsx | 7 +++++++ .../public/flyout/right/components/reason.tsx | 7 +++++++ .../flyout/right/components/response_button.tsx | 7 +++++++ .../flyout/right/components/risk_score.tsx | 4 ++-- .../public/flyout/right/components/severity.tsx | 4 ++-- .../flyout/right/components/share_button.tsx | 7 +++++++ .../public/flyout/right/tabs/overview_tab.tsx | 17 ++++++++++++++--- .../shared/components/expandable_panel.tsx | 8 +++++++- 18 files changed, 119 insertions(+), 29 deletions(-) diff --git a/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/threat_details_view.tsx b/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/threat_details_view.tsx index 7b0c35dd45a1f..e811b33e3b572 100644 --- a/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/threat_details_view.tsx +++ b/x-pack/plugins/security_solution/public/common/components/event_details/cti_details/threat_details_view.tsx @@ -28,11 +28,11 @@ const EnrichmentSectionHeader: React.FC<{ type?: ENRICHMENT_TYPES }> = ({ type } -
+

{type === ENRICHMENT_TYPES.IndicatorMatchRule ? i18n.INDICATOR_ENRICHMENT_TITLE : i18n.INVESTIGATION_ENRICHMENT_TITLE} -

+
diff --git a/x-pack/plugins/security_solution/public/flyout/left/components/host_details.tsx b/x-pack/plugins/security_solution/public/flyout/left/components/host_details.tsx index 2bccfbc8ac34b..44a1a23abf774 100644 --- a/x-pack/plugins/security_solution/public/flyout/left/components/host_details.tsx +++ b/x-pack/plugins/security_solution/public/flyout/left/components/host_details.tsx @@ -231,12 +231,12 @@ export const HostDetails: React.FC = ({ hostName, timestamp, s return ( <> -

+

-

+
= ({ hostName, timestamp, s data-test-subj={HOST_DETAILS_TEST_ID} > -
+

-

+
= ({ hostName, timestamp, s -
+

-

+
diff --git a/x-pack/plugins/security_solution/public/flyout/left/components/related_cases.tsx b/x-pack/plugins/security_solution/public/flyout/left/components/related_cases.tsx index 76a97e6e71053..681d542eac3a1 100644 --- a/x-pack/plugins/security_solution/public/flyout/left/components/related_cases.tsx +++ b/x-pack/plugins/security_solution/public/flyout/left/components/related_cases.tsx @@ -10,6 +10,7 @@ import type { EuiBasicTableColumn } from '@elastic/eui'; import { EuiInMemoryTable, EuiSkeletonText } from '@elastic/eui'; import type { RelatedCase } from '@kbn/cases-plugin/common'; import { FormattedMessage } from '@kbn/i18n-react'; +import { i18n } from '@kbn/i18n'; import { CellTooltipWrapper } from '../../shared/components/cell_tooltip_wrapper'; import { CaseDetailsLink } from '../../../common/components/links'; import { @@ -65,7 +66,19 @@ export const RelatedCases: React.VFC = ({ eventId }) => { const { loading, error, data, dataCount } = useFetchRelatedCases({ eventId }); if (loading) { - return ; + return ( + + ); } if (error) { diff --git a/x-pack/plugins/security_solution/public/flyout/left/components/user_details.tsx b/x-pack/plugins/security_solution/public/flyout/left/components/user_details.tsx index 12ad057284cd6..8d395f4a1d3dd 100644 --- a/x-pack/plugins/security_solution/public/flyout/left/components/user_details.tsx +++ b/x-pack/plugins/security_solution/public/flyout/left/components/user_details.tsx @@ -232,12 +232,12 @@ export const UserDetails: React.FC = ({ userName, timestamp, s return ( <> -

+

-

+
= ({ userName, timestamp, s data-test-subj={USER_DETAILS_TEST_ID} > -
+

-

+
= ({ userName, timestamp, s -
+

-

+
diff --git a/x-pack/plugins/security_solution/public/flyout/left/tabs/insights_tab.tsx b/x-pack/plugins/security_solution/public/flyout/left/tabs/insights_tab.tsx index 6f35b6b26f3c8..3e8c1f22de622 100644 --- a/x-pack/plugins/security_solution/public/flyout/left/tabs/insights_tab.tsx +++ b/x-pack/plugins/security_solution/public/flyout/left/tabs/insights_tab.tsx @@ -113,7 +113,7 @@ export const InsightsTab: React.FC = memo(() => { color="primary" name="coarsness" legend={i18n.translate( - 'xpack.securitySolution.flyout.left.insights.buttonGroupButtonLabel', + 'xpack.securitySolution.flyout.left.insights.buttonGroupLegendLabel', { defaultMessage: 'Insights options', } diff --git a/x-pack/plugins/security_solution/public/flyout/left/tabs/visualize_tab.tsx b/x-pack/plugins/security_solution/public/flyout/left/tabs/visualize_tab.tsx index 923a2e9aa3ed6..632bcb856a257 100644 --- a/x-pack/plugins/security_solution/public/flyout/left/tabs/visualize_tab.tsx +++ b/x-pack/plugins/security_solution/public/flyout/left/tabs/visualize_tab.tsx @@ -91,7 +91,7 @@ export const VisualizeTab: FC = memo(() => { color="primary" name="coarsness" legend={i18n.translate( - 'xpack.securitySolution.flyout.left.visualize.buttonGroupButtonLabel', + 'xpack.securitySolution.flyout.left.visualize.buttonGroupLegendLabel', { defaultMessage: 'Visualize options', } diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/description.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/description.tsx index ac8ec64a0ee34..4b0169eeacbc2 100644 --- a/x-pack/plugins/security_solution/public/flyout/right/components/description.tsx +++ b/x-pack/plugins/security_solution/public/flyout/right/components/description.tsx @@ -11,6 +11,7 @@ import React, { useMemo, useCallback } from 'react'; import { isEmpty } from 'lodash'; import { useExpandableFlyoutContext } from '@kbn/expandable-flyout'; import { FormattedMessage } from '@kbn/i18n-react'; +import { i18n } from '@kbn/i18n'; import { useRightPanelContext } from '../context'; import { useBasicDataFromDetailsData } from '../../../timelines/components/side_panel/event_details/helpers'; import { @@ -65,6 +66,12 @@ export const Description: FC = () => { onClick={openRulePreview} iconSide="right" data-test-subj={RULE_SUMMARY_BUTTON_TEST_ID} + aria-label={i18n.translate( + 'xpack.securitySolution.flyout.right.about.description.ruleSummaryButtonAriaLabel', + { + defaultMessage: 'Show rule summary', + } + )} > { onClick={collapseDetails} iconType="arrowEnd" data-test-subj={COLLAPSE_DETAILS_BUTTON_TEST_ID} + aria-label={i18n.translate( + 'xpack.securitySolution.flyout.right.header.collapseDetailButtonAriaLabel', + { + defaultMessage: 'Collapse details', + } + )} > { onClick={expandDetails} iconType="arrowStart" data-test-subj={EXPAND_DETAILS_BUTTON_TEST_ID} + aria-label={i18n.translate( + 'xpack.securitySolution.flyout.right.header.expandDetailButtonAriaLabel', + { + defaultMessage: 'Expand details', + } + )} > = memo(({ flyoutIsExpandable }) )} -

+

{isAlert && !isEmpty(ruleName) ? ( ruleName ) : ( @@ -95,7 +95,7 @@ export const HeaderTitle: VFC = memo(({ flyoutIsExpandable }) defaultMessage="Event details" /> )} -

+
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/insights_summary_row.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/insights_summary_row.tsx index 8a981d037667f..9ffc267c3ccae 100644 --- a/x-pack/plugins/security_solution/public/flyout/right/components/insights_summary_row.tsx +++ b/x-pack/plugins/security_solution/public/flyout/right/components/insights_summary_row.tsx @@ -9,6 +9,7 @@ import type { ReactElement, VFC } from 'react'; import React from 'react'; import { css } from '@emotion/react'; import { EuiButtonIcon, EuiFlexGroup, EuiFlexItem, EuiHealth, EuiSkeletonText } from '@elastic/eui'; +import { i18n } from '@kbn/i18n'; import { FormattedCount } from '../../../common/components/formatted_number'; export interface InsightsSummaryRowProps { @@ -64,7 +65,13 @@ export const InsightsSummaryRow: VFC = ({ lines={1} size="m" isLoading={loading} - contentAriaLabel="Loading" + contentAriaLabel={i18n.translate( + 'xpack.securitySolution.flyout.right.insights.insightSummaryLoadingAriaLabel', + { + defaultMessage: 'Loading insights for {value}', + values: { value }, + } + )} data-test-subj={loadingDataTestSubj} /> ); @@ -83,7 +90,12 @@ export const InsightsSummaryRow: VFC = ({ { onClick={goToInvestigationsTab} iconType="documentation" data-test-subj={INVESTIGATION_GUIDE_BUTTON_TEST_ID} + aria-label={i18n.translate( + 'xpack.securitySolution.flyout.right.investigation.investigationGuide.investigationGuideButtonAriaLabel', + { + defaultMessage: 'Show investigation guide', + } + )} > { onClick={openRulePreview} iconSide="right" data-test-subj={REASON_DETAILS_PREVIEW_BUTTON_TEST_ID} + aria-label={i18n.translate( + 'xpack.securitySolution.flyout.right.about.reason.alertReasonButtonAriaLabel', + { + defaultMessage: 'Show full reason', + } + )} > { onClick={goToResponseTab} iconType="documentation" data-test-subj={RESPONSE_BUTTON_TEST_ID} + aria-label={i18n.translate( + 'xpack.securitySolution.flyout.right.response.responseButtonAriaLabel', + { + defaultMessage: 'Response', + } + )} > { -
+

-

+
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/severity.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/severity.tsx index 81896bf770636..a7cfddde6c903 100644 --- a/x-pack/plugins/security_solution/public/flyout/right/components/severity.tsx +++ b/x-pack/plugins/security_solution/public/flyout/right/components/severity.tsx @@ -46,12 +46,12 @@ export const DocumentSeverity: FC = memo(() => { -
+

-

+
diff --git a/x-pack/plugins/security_solution/public/flyout/right/components/share_button.tsx b/x-pack/plugins/security_solution/public/flyout/right/components/share_button.tsx index e9637e61205da..4c5e5a4507c38 100644 --- a/x-pack/plugins/security_solution/public/flyout/right/components/share_button.tsx +++ b/x-pack/plugins/security_solution/public/flyout/right/components/share_button.tsx @@ -9,6 +9,7 @@ import { copyToClipboard, EuiButtonEmpty, EuiCopy } from '@elastic/eui'; import type { FC } from 'react'; import React from 'react'; import { FormattedMessage } from '@kbn/i18n-react'; +import { i18n } from '@kbn/i18n'; import { FLYOUT_URL_PARAM } from '../../shared/hooks/url/use_sync_flyout_state_with_url'; import { SHARE_BUTTON_TEST_ID } from './test_ids'; @@ -40,6 +41,12 @@ export const ShareButton: FC = ({ alertUrl }) => { }} iconType="share" data-test-subj={SHARE_BUTTON_TEST_ID} + aria-label={i18n.translate( + 'xpack.securitySolution.flyout.right.header.shareButtonAriaLabel', + { + defaultMessage: 'Share Alert', + } + )} > { return ( - <> + @@ -29,7 +40,7 @@ export const OverviewTab: FC = memo(() => { - + ); }); diff --git a/x-pack/plugins/security_solution/public/flyout/shared/components/expandable_panel.tsx b/x-pack/plugins/security_solution/public/flyout/shared/components/expandable_panel.tsx index 4f06ce9a45eb4..3e273d7d126f3 100644 --- a/x-pack/plugins/security_solution/public/flyout/shared/components/expandable_panel.tsx +++ b/x-pack/plugins/security_solution/public/flyout/shared/components/expandable_panel.tsx @@ -22,6 +22,7 @@ import { } from '@elastic/eui'; import type { IconType } from '@elastic/eui'; import { css } from '@emotion/react'; +import { i18n } from '@kbn/i18n'; export interface ExpandablePanelPanelProps { header: { @@ -99,7 +100,12 @@ export const ExpandablePanel: React.FC = ({ () => ( Date: Tue, 26 Sep 2023 15:15:46 -0400 Subject: [PATCH 13/26] chore(slo): Simplify resources installation (#166987) --- .../services/slo/resource_installer.test.ts | 128 ++++++------------ .../server/services/slo/resource_installer.ts | 79 ----------- 2 files changed, 40 insertions(+), 167 deletions(-) diff --git a/x-pack/plugins/observability/server/services/slo/resource_installer.test.ts b/x-pack/plugins/observability/server/services/slo/resource_installer.test.ts index 42add5a539566..8337c85b5f156 100644 --- a/x-pack/plugins/observability/server/services/slo/resource_installer.test.ts +++ b/x-pack/plugins/observability/server/services/slo/resource_installer.test.ts @@ -12,7 +12,6 @@ import { SLO_COMPONENT_TEMPLATE_SETTINGS_NAME, SLO_INDEX_TEMPLATE_NAME, SLO_INGEST_PIPELINE_NAME, - SLO_RESOURCES_VERSION, SLO_SUMMARY_COMPONENT_TEMPLATE_MAPPINGS_NAME, SLO_SUMMARY_COMPONENT_TEMPLATE_SETTINGS_NAME, SLO_SUMMARY_INDEX_TEMPLATE_NAME, @@ -21,95 +20,48 @@ import { import { DefaultResourceInstaller } from './resource_installer'; describe('resourceInstaller', () => { - describe('when the common resources are not installed yet', () => { - it('installs the common resources', async () => { - const mockClusterClient = elasticsearchServiceMock.createElasticsearchClient(); - mockClusterClient.indices.getIndexTemplate.mockResponseOnce({ index_templates: [] }); - const installer = new DefaultResourceInstaller(mockClusterClient, loggerMock.create()); + it('installs the common resources', async () => { + const mockClusterClient = elasticsearchServiceMock.createElasticsearchClient(); + mockClusterClient.indices.getIndexTemplate.mockResponseOnce({ index_templates: [] }); + const installer = new DefaultResourceInstaller(mockClusterClient, loggerMock.create()); - await installer.ensureCommonResourcesInstalled(); + await installer.ensureCommonResourcesInstalled(); - expect(mockClusterClient.cluster.putComponentTemplate).toHaveBeenCalledTimes(4); - expect(mockClusterClient.cluster.putComponentTemplate).toHaveBeenNthCalledWith( - 1, - expect.objectContaining({ name: SLO_COMPONENT_TEMPLATE_MAPPINGS_NAME }) - ); - expect(mockClusterClient.cluster.putComponentTemplate).toHaveBeenNthCalledWith( - 2, - expect.objectContaining({ name: SLO_COMPONENT_TEMPLATE_SETTINGS_NAME }) - ); - expect(mockClusterClient.cluster.putComponentTemplate).toHaveBeenNthCalledWith( - 3, - expect.objectContaining({ name: SLO_SUMMARY_COMPONENT_TEMPLATE_MAPPINGS_NAME }) - ); - expect(mockClusterClient.cluster.putComponentTemplate).toHaveBeenNthCalledWith( - 4, - expect.objectContaining({ name: SLO_SUMMARY_COMPONENT_TEMPLATE_SETTINGS_NAME }) - ); - expect(mockClusterClient.indices.putIndexTemplate).toHaveBeenCalledTimes(2); - expect(mockClusterClient.indices.putIndexTemplate).toHaveBeenNthCalledWith( - 1, - expect.objectContaining({ name: SLO_INDEX_TEMPLATE_NAME }) - ); - expect(mockClusterClient.indices.putIndexTemplate).toHaveBeenNthCalledWith( - 2, - expect.objectContaining({ name: SLO_SUMMARY_INDEX_TEMPLATE_NAME }) - ); + expect(mockClusterClient.cluster.putComponentTemplate).toHaveBeenCalledTimes(4); + expect(mockClusterClient.cluster.putComponentTemplate).toHaveBeenNthCalledWith( + 1, + expect.objectContaining({ name: SLO_COMPONENT_TEMPLATE_MAPPINGS_NAME }) + ); + expect(mockClusterClient.cluster.putComponentTemplate).toHaveBeenNthCalledWith( + 2, + expect.objectContaining({ name: SLO_COMPONENT_TEMPLATE_SETTINGS_NAME }) + ); + expect(mockClusterClient.cluster.putComponentTemplate).toHaveBeenNthCalledWith( + 3, + expect.objectContaining({ name: SLO_SUMMARY_COMPONENT_TEMPLATE_MAPPINGS_NAME }) + ); + expect(mockClusterClient.cluster.putComponentTemplate).toHaveBeenNthCalledWith( + 4, + expect.objectContaining({ name: SLO_SUMMARY_COMPONENT_TEMPLATE_SETTINGS_NAME }) + ); + expect(mockClusterClient.indices.putIndexTemplate).toHaveBeenCalledTimes(2); + expect(mockClusterClient.indices.putIndexTemplate).toHaveBeenNthCalledWith( + 1, + expect.objectContaining({ name: SLO_INDEX_TEMPLATE_NAME }) + ); + expect(mockClusterClient.indices.putIndexTemplate).toHaveBeenNthCalledWith( + 2, + expect.objectContaining({ name: SLO_SUMMARY_INDEX_TEMPLATE_NAME }) + ); - expect(mockClusterClient.ingest.putPipeline).toHaveBeenCalledTimes(2); - expect(mockClusterClient.ingest.putPipeline).toHaveBeenNthCalledWith( - 1, - expect.objectContaining({ id: SLO_INGEST_PIPELINE_NAME }) - ); - expect(mockClusterClient.ingest.putPipeline).toHaveBeenNthCalledWith( - 2, - expect.objectContaining({ id: SLO_SUMMARY_INGEST_PIPELINE_NAME }) - ); - }); - }); - - describe('when the common resources are already installed', () => { - it('skips the installation', async () => { - const mockClusterClient = elasticsearchServiceMock.createElasticsearchClient(); - mockClusterClient.indices.getIndexTemplate.mockResponseOnce({ - index_templates: [ - { - name: SLO_INDEX_TEMPLATE_NAME, - index_template: { - index_patterns: [], - composed_of: [], - _meta: { version: SLO_RESOURCES_VERSION }, - }, - }, - ], - }); - mockClusterClient.indices.getIndexTemplate.mockResponseOnce({ - index_templates: [ - { - name: SLO_SUMMARY_INDEX_TEMPLATE_NAME, - index_template: { - index_patterns: [], - composed_of: [], - _meta: { version: SLO_RESOURCES_VERSION }, - }, - }, - ], - }); - mockClusterClient.ingest.getPipeline.mockResponseOnce({ - // @ts-ignore _meta not typed properly - [SLO_INGEST_PIPELINE_NAME]: { _meta: { version: SLO_RESOURCES_VERSION } }, - }); - mockClusterClient.ingest.getPipeline.mockResponseOnce({ - // @ts-ignore _meta not typed properly - [SLO_SUMMARY_INGEST_PIPELINE_NAME]: { _meta: { version: SLO_RESOURCES_VERSION } }, - }); - const installer = new DefaultResourceInstaller(mockClusterClient, loggerMock.create()); - - await installer.ensureCommonResourcesInstalled(); - - expect(mockClusterClient.cluster.putComponentTemplate).not.toHaveBeenCalled(); - expect(mockClusterClient.indices.putIndexTemplate).not.toHaveBeenCalled(); - expect(mockClusterClient.ingest.putPipeline).not.toHaveBeenCalled(); - }); + expect(mockClusterClient.ingest.putPipeline).toHaveBeenCalledTimes(2); + expect(mockClusterClient.ingest.putPipeline).toHaveBeenNthCalledWith( + 1, + expect.objectContaining({ id: SLO_INGEST_PIPELINE_NAME }) + ); + expect(mockClusterClient.ingest.putPipeline).toHaveBeenNthCalledWith( + 2, + expect.objectContaining({ id: SLO_SUMMARY_INGEST_PIPELINE_NAME }) + ); }); }); diff --git a/x-pack/plugins/observability/server/services/slo/resource_installer.ts b/x-pack/plugins/observability/server/services/slo/resource_installer.ts index 742b2a8e7202e..4fc77ea2399c7 100644 --- a/x-pack/plugins/observability/server/services/slo/resource_installer.ts +++ b/x-pack/plugins/observability/server/services/slo/resource_installer.ts @@ -23,7 +23,6 @@ import { SLO_INDEX_TEMPLATE_PATTERN, SLO_INGEST_PIPELINE_INDEX_NAME_PREFIX, SLO_INGEST_PIPELINE_NAME, - SLO_RESOURCES_VERSION, SLO_SUMMARY_COMPONENT_TEMPLATE_MAPPINGS_NAME, SLO_SUMMARY_COMPONENT_TEMPLATE_SETTINGS_NAME, SLO_SUMMARY_DESTINATION_INDEX_NAME, @@ -46,13 +45,6 @@ export class DefaultResourceInstaller implements ResourceInstaller { constructor(private esClient: ElasticsearchClient, private logger: Logger) {} public async ensureCommonResourcesInstalled(): Promise { - const alreadyInstalled = await this.areResourcesAlreadyInstalled(); - - if (alreadyInstalled) { - this.logger.info('SLO resources already installed - skipping'); - return; - } - try { this.logger.info('Installing SLO shared resources'); await Promise.all([ @@ -105,77 +97,6 @@ export class DefaultResourceInstaller implements ResourceInstaller { } } - private async areResourcesAlreadyInstalled(): Promise { - let indexTemplateExists = false; - try { - const { index_templates: indexTemplates } = await this.execute(() => - this.esClient.indices.getIndexTemplate({ - name: SLO_INDEX_TEMPLATE_NAME, - }) - ); - - const sloIndexTemplate = indexTemplates.find( - (template) => template.name === SLO_INDEX_TEMPLATE_NAME - ); - indexTemplateExists = - !!sloIndexTemplate && - sloIndexTemplate.index_template._meta?.version === SLO_RESOURCES_VERSION; - } catch (err) { - return false; - } - - let summaryIndexTemplateExists = false; - try { - const { index_templates: indexTemplates } = await this.execute(() => - this.esClient.indices.getIndexTemplate({ - name: SLO_SUMMARY_INDEX_TEMPLATE_NAME, - }) - ); - const sloSummaryIndexTemplate = indexTemplates.find( - (template) => template.name === SLO_SUMMARY_INDEX_TEMPLATE_NAME - ); - summaryIndexTemplateExists = - !!sloSummaryIndexTemplate && - sloSummaryIndexTemplate.index_template._meta?.version === SLO_RESOURCES_VERSION; - } catch (err) { - return false; - } - - let ingestPipelineExists = false; - try { - const pipeline = await this.execute(() => - this.esClient.ingest.getPipeline({ id: SLO_INGEST_PIPELINE_NAME }) - ); - - ingestPipelineExists = - // @ts-ignore _meta is not defined on the type - pipeline && pipeline[SLO_INGEST_PIPELINE_NAME]._meta.version === SLO_RESOURCES_VERSION; - } catch (err) { - return false; - } - - let summaryIngestPipelineExists = false; - try { - const pipeline = await this.execute(() => - this.esClient.ingest.getPipeline({ id: SLO_SUMMARY_INGEST_PIPELINE_NAME }) - ); - - summaryIngestPipelineExists = - pipeline && - // @ts-ignore _meta is not defined on the type - pipeline[SLO_SUMMARY_INGEST_PIPELINE_NAME]._meta.version === SLO_RESOURCES_VERSION; - } catch (err) { - return false; - } - - return ( - indexTemplateExists && - summaryIndexTemplateExists && - ingestPipelineExists && - summaryIngestPipelineExists - ); - } - private async createOrUpdateComponentTemplate(template: ClusterPutComponentTemplateRequest) { this.logger.info(`Installing SLO component template [${template.name}]`); return this.execute(() => this.esClient.cluster.putComponentTemplate(template)); From 22029b50e80daf70f0f3a6213d18445522db261a Mon Sep 17 00:00:00 2001 From: Panagiota Mitsopoulou Date: Tue, 26 Sep 2023 21:23:30 +0200 Subject: [PATCH 14/26] use KibanaThemeProvider from react-kibana-context-theme (#167232) Fixes https://github.com/elastic/kibana/issues/164369 ### Acceptance criteria - use KibanaThemeProvider from @kbn/react-kibana-context-theme for the App component --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../plugins/observability/public/application/index.tsx | 9 +++------ x-pack/plugins/observability/tsconfig.json | 3 ++- 2 files changed, 5 insertions(+), 7 deletions(-) diff --git a/x-pack/plugins/observability/public/application/index.tsx b/x-pack/plugins/observability/public/application/index.tsx index 46dfd7a50d3ec..2d251ac71660e 100644 --- a/x-pack/plugins/observability/public/application/index.tsx +++ b/x-pack/plugins/observability/public/application/index.tsx @@ -14,11 +14,8 @@ import { Router, Routes, Route } from '@kbn/shared-ux-router'; import { AppMountParameters, APP_WRAPPER_CLASS, CoreStart } from '@kbn/core/public'; import { EuiThemeProvider } from '@kbn/kibana-react-plugin/common'; import type { LazyObservabilityPageTemplateProps } from '@kbn/observability-shared-plugin/public'; -import { - KibanaContextProvider, - KibanaThemeProvider, - RedirectAppLinks, -} from '@kbn/kibana-react-plugin/public'; +import { KibanaContextProvider, RedirectAppLinks } from '@kbn/kibana-react-plugin/public'; +import { KibanaThemeProvider } from '@kbn/react-kibana-context-theme'; import { Storage } from '@kbn/kibana-utils-plugin/public'; import { UsageCollectionSetup } from '@kbn/usage-collection-plugin/public'; import { ObservabilityAIAssistantProvider } from '@kbn/observability-ai-assistant-plugin/public'; @@ -90,7 +87,7 @@ export const renderApp = ({ ReactDOM.render( - + Date: Tue, 26 Sep 2023 14:42:10 -0700 Subject: [PATCH 15/26] [UnifiedDataTable] Add gridStyle override support (#166994) --- .../src/components/data_table.test.tsx | 33 +++++++++++++++++++ .../src/components/data_table.tsx | 8 ++++- 2 files changed, 40 insertions(+), 1 deletion(-) diff --git a/packages/kbn-unified-data-table/src/components/data_table.test.tsx b/packages/kbn-unified-data-table/src/components/data_table.test.tsx index 7ca0888230749..6aa101cc558b4 100644 --- a/packages/kbn-unified-data-table/src/components/data_table.test.tsx +++ b/packages/kbn-unified-data-table/src/components/data_table.test.tsx @@ -432,4 +432,37 @@ describe('UnifiedDataTable', () => { expect(tourStep).toEqual('test-expand'); }); }); + + describe('gridStyleOverride', () => { + it('should render the grid with the default style if no gridStyleOverride is provided', async () => { + const component = await getComponent({ + ...getProps(), + }); + + const grid = findTestSubject(component, 'docTable'); + + expect(grid.hasClass('euiDataGrid--bordersHorizontal')).toBeTruthy(); + expect(grid.hasClass('euiDataGrid--fontSizeSmall')).toBeTruthy(); + expect(grid.hasClass('euiDataGrid--paddingLarge')).toBeTruthy(); + expect(grid.hasClass('euiDataGrid--rowHoverHighlight')).toBeTruthy(); + expect(grid.hasClass('euiDataGrid--headerUnderline')).toBeTruthy(); + expect(grid.hasClass('euiDataGrid--stripes')).toBeTruthy(); + }); + it('should render the grid with style override if gridStyleOverride is provided', async () => { + const component = await getComponent({ + ...getProps(), + gridStyleOverride: { + stripes: false, + rowHover: 'none', + border: 'none', + }, + }); + + const grid = findTestSubject(component, 'docTable'); + + expect(grid.hasClass('euiDataGrid--stripes')).toBeFalsy(); + expect(grid.hasClass('euiDataGrid--rowHoverHighlight')).toBeFalsy(); + expect(grid.hasClass('euiDataGrid--bordersNone')).toBeTruthy(); + }); + }); }); diff --git a/packages/kbn-unified-data-table/src/components/data_table.tsx b/packages/kbn-unified-data-table/src/components/data_table.tsx index e5f5e5dbbba39..a9d749e46169d 100644 --- a/packages/kbn-unified-data-table/src/components/data_table.tsx +++ b/packages/kbn-unified-data-table/src/components/data_table.tsx @@ -27,6 +27,7 @@ import { EuiDataGridControlColumn, EuiDataGridCustomBodyProps, EuiDataGridCellValueElementProps, + EuiDataGridStyle, } from '@elastic/eui'; import type { DataView } from '@kbn/data-views-plugin/public'; import { @@ -282,6 +283,10 @@ export interface UnifiedDataTableProps { * Optional key/value pairs to set guided onboarding steps ids for a data table components included to guided tour. */ componentsTourSteps?: Record; + /** + * Optional gridStyle override. + */ + gridStyleOverride?: EuiDataGridStyle; } export const EuiDataGridMemoized = React.memo(EuiDataGrid); @@ -335,6 +340,7 @@ export const UnifiedDataTable = ({ externalCustomRenderers, consumer = 'discover', componentsTourSteps, + gridStyleOverride, }: UnifiedDataTableProps) => { const { fieldFormats, toastNotifications, dataViewFieldEditor, uiSettings, storage, data } = services; @@ -789,7 +795,7 @@ export const UnifiedDataTable = ({ toolbarVisibility={toolbarVisibility} rowHeightsOptions={rowHeightsOptions} inMemory={inMemory} - gridStyle={GRID_STYLE} + gridStyle={gridStyleOverride ?? GRID_STYLE} renderCustomGridBody={renderCustomGridBody} trailingControlColumns={trailingControlColumns} /> From 4dfd31def0ab83d22473c627ebe1639579eca7e8 Mon Sep 17 00:00:00 2001 From: "Quynh Nguyen (Quinn)" <43350163+qn895@users.noreply.github.com> Date: Tue, 26 Sep 2023 17:15:35 -0500 Subject: [PATCH 16/26] [ML] Add data drift detection workflow from Trained models to Data comparison view (#162853) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit ## Summary This PR adds data drift detection workflow from Trained models to Data comparison view. It also renames Data comparison to Data Drift. **From the new map view in Trained model list:** - Clicking on the index icon in the map view will give an option/action to Analyze data drift https://github.com/elastic/kibana/assets/43350163/a68163ab-8a83-4378-8cf3-ea49f4480a06 - If model has detected related indices, it will also give an option to Analyze data drift in the Transform actions **From the data comparison/drift page:** - Default screen with list of available data views and saved search will be shown Screen Shot 2023-09-07 at 00 22 01 - But can also customize index patterns for the data sets to analyze. Upon 'analyzing', a new data view will be created if needed (either permanently or temporarily). Screen Shot 2023-08-29 at 16 56 57 Screen Shot 2023-09-07 at 00 22 49 - If there exists a data view with exact combination of index patterns and time field, it will use that data view - If there exists a data view with the same index patterns but different time field, it will create a new data view with name `{referencePattern},{comparisonPattern}-{timeField}` - If no data view exists that matches, it will create a new data view with name `{referencePattern},{comparisonPattern}` ## For reviewers: - **appex-sharedux**: [Small change in the exported type interface for BaseSavedObjectFinder](https://github.com/elastic/kibana/pull/162853/files#diff-5e2e62df8aba5ac9445962bfa00eee933a386110d0a24dfe6ac0f300a796ccc3) to correctly list `children` as an accepted prop. This prop which is used for the `toolsRight`. - **security-solution**: Renaming of `Data comparison` to `Data Drift` ## Tests: [Flaky test suite runner with Data Drift test](https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3216#018accc2-d33b-4cd6-a178-589e6698b675) ... successful after 50 runs✅ ### Checklist Delete any items that are not applicable to this PR. - [ ] Any text added [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [ ] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [ ] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [ ] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [ ] If a plugin configuration key changed, check if it needs to be allowlisted in the cloud and added to the [docker list](https://github.com/elastic/kibana/blob/main/src/dev/build/tasks/os_packages/docker_generator/resources/base/bin/kibana-docker) - [ ] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [ ] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) ### Risk Matrix Delete this section if it is not applicable to this PR. Before closing this PR, invite QA, stakeholders, and other developers to identify risks that should be tested prior to the change/feature release. When forming the risk matrix, consider some of the following examples and how they may potentially impact the change: | Risk | Probability | Severity | Mitigation/Notes | |---------------------------|-------------|----------|-------------------------| | Multiple Spaces—unexpected behavior in non-default Kibana Space. | Low | High | Integration tests will verify that all features are still supported in non-default Kibana Space and when user switches between spaces. | | Multiple nodes—Elasticsearch polling might have race conditions when multiple Kibana nodes are polling for the same tasks. | High | Low | Tasks are idempotent, so executing them multiple times will not result in logical error, but will degrade performance. To test for this case we add plenty of unit tests around this logic and document manual testing procedure. | | Code should gracefully handle cases when feature X or plugin Y are disabled. | Medium | High | Unit tests will verify that any feature flag or plugin combination still results in our service operational. | | [See more potential risk examples](https://github.com/elastic/kibana/blob/main/RISK_MATRIX.mdx) | ### For maintainers - [ ] This was checked for breaking API changes and was [labeled appropriately](https://www.elastic.co/guide/en/kibana/master/contributing.html#kibana-release-notes-process) --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- api_docs/data_view_editor.devdocs.json | 2 +- api_docs/kbn_deeplinks_ml.devdocs.json | 6 +- packages/deeplinks/ml/deep_links.ts | 2 +- packages/default-nav/ml/default_navigation.ts | 4 +- .../chrome/navigation/mocks/src/navlinks.ts | 2 +- .../default_navigation.test.tsx.snap | 14 +- .../public/data_view_editor_service.ts | 12 + .../public/data_view_editor_service_lazy.ts | 9 + src/plugins/data_view_editor/public/index.ts | 6 +- src/plugins/data_view_editor/public/mocks.ts | 1 + .../data_view_editor/public/plugin.tsx | 8 + src/plugins/data_view_editor/public/types.ts | 9 + .../__snapshots__/overview.test.tsx.snap | 1 + .../public/finder/saved_object_finder.tsx | 1 + .../document_count_chart.tsx | 15 +- .../src/random_sampler_manager.ts | 30 +- .../data_visualizer/public/api/index.ts | 6 +- .../total_count_header.tsx | 22 +- .../random_sampling_menu.tsx | 12 +- .../application/common/hooks/use_data.ts | 138 +++- .../common/hooks/use_document_count_stats.ts | 1 + .../application/common/hooks/use_search.ts | 2 +- .../common/util/get_data_test_subject.ts | 11 + .../data_comparison_distribution_chart.tsx | 51 -- .../charts/overlap_distribution_chart.tsx | 64 -- .../charts/data_drift_distribution_chart.tsx | 71 ++ .../charts/default_value_formatter.ts | 41 ++ .../charts/no_charts_data.tsx | 0 .../charts/overlap_distribution_chart.tsx | 90 +++ .../charts/single_distribution_chart.tsx | 33 +- .../constants.ts | 38 +- .../data_drift_app_state.tsx} | 68 +- .../data_drift_chart_tooltip_body.tsx} | 37 +- .../data_drift_overview_table.tsx} | 131 ++-- .../data_drift_page.tsx} | 246 +++---- .../data_drift_utils.test.ts} | 10 +- .../data_drift_utils.ts} | 0 .../data_drift_view.tsx} | 68 +- .../document_count_with_dual_brush.tsx | 103 ++- .../{data_comparison => data_drift}/index.ts | 9 +- .../{data_comparison => data_drift}/types.ts | 39 +- .../use_data_drift_result.ts | 230 +++++-- .../data_drift/use_state_manager.ts | 84 +++ .../public/application/index.ts | 2 +- .../index_data_visualizer_view.tsx | 4 +- .../components/search_panel/search_bar.tsx | 4 +- .../index_data_visualizer/locator/locator.ts | 4 +- .../utils/saved_search_utils.ts | 1 + .../plugins/data_visualizer/public/index.ts | 2 +- .../lazy_load_bundle/component_wrapper.tsx | 10 +- .../public/lazy_load_bundle/index.ts | 4 +- .../public/lazy_load_bundle/lazy/index.tsx | 2 +- .../plugins/data_visualizer/public/plugin.ts | 4 +- x-pack/plugins/ml/common/constants/locator.ts | 5 +- x-pack/plugins/ml/common/types/locator.ts | 5 +- .../plugins/ml/common/types/trained_models.ts | 2 + x-pack/plugins/ml/kibana.jsonc | 1 + x-pack/plugins/ml/public/application/app.tsx | 1 + .../components/ml_page/side_nav.tsx | 8 +- .../contexts/kibana/kibana_context.ts | 2 + .../pages/job_map/components/controls.tsx | 24 + .../data_drift_index_patterns_editor.tsx | 436 +++++++++++++ .../data_drift_page.tsx} | 18 +- .../data_drift/data_view_editor.tsx | 190 ++++++ .../data_drift/index_patterns_picker.tsx | 205 ++++++ .../new_job/pages/index_or_search/page.tsx | 3 +- .../model_management/model_actions.tsx | 34 + .../model_management/models_list.tsx | 1 + .../public/application/routing/breadcrumbs.ts | 8 +- .../routes/datavisualizer/data_comparison.tsx | 26 +- .../routes/datavisualizer/data_drift.tsx | 107 +++ .../routing/routes/datavisualizer/index.ts | 1 + .../routes/new_job/index_or_search.tsx | 20 - .../services/ml_api_service/trained_models.ts | 1 + .../plugins/ml/public/locator/ml_locator.ts | 5 +- x-pack/plugins/ml/public/plugin.ts | 3 + .../search_deep_links.ts | 8 +- .../data_frame_analytics/analytics_manager.ts | 218 +------ .../model_management/models_provider.ts | 615 +++++++++++++----- .../server/routes/schemas/inference_schema.ts | 1 + .../ml/server/routes/trained_models.ts | 76 ++- x-pack/plugins/ml/tsconfig.json | 1 + .../public/navigation/links/constants.ts | 2 +- .../navigation/links/sections/ml_links.ts | 8 +- .../links/sections/ml_translations.ts | 10 +- .../translations/translations/fr-FR.json | 1 - .../translations/translations/ja-JP.json | 1 - .../translations/translations/zh-CN.json | 1 - .../apis/ml/trained_models/get_models.ts | 68 +- .../apps/ml/data_visualizer/data_drift.ts | 111 ++++ .../apps/ml/data_visualizer/index.ts | 1 + x-pack/test/functional/services/ml/api.ts | 13 +- .../test/functional/services/ml/data_drift.ts | 214 ++++++ x-pack/test/functional/services/ml/index.ts | 5 +- .../services/ml/job_source_selection.ts | 4 + .../test/functional/services/ml/navigation.ts | 4 + 96 files changed, 3211 insertions(+), 1021 deletions(-) create mode 100644 src/plugins/data_view_editor/public/data_view_editor_service_lazy.ts create mode 100644 x-pack/plugins/data_visualizer/public/application/common/util/get_data_test_subject.ts delete mode 100644 x-pack/plugins/data_visualizer/public/application/data_comparison/charts/data_comparison_distribution_chart.tsx delete mode 100644 x-pack/plugins/data_visualizer/public/application/data_comparison/charts/overlap_distribution_chart.tsx create mode 100644 x-pack/plugins/data_visualizer/public/application/data_drift/charts/data_drift_distribution_chart.tsx create mode 100644 x-pack/plugins/data_visualizer/public/application/data_drift/charts/default_value_formatter.ts rename x-pack/plugins/data_visualizer/public/application/{data_comparison => data_drift}/charts/no_charts_data.tsx (100%) create mode 100644 x-pack/plugins/data_visualizer/public/application/data_drift/charts/overlap_distribution_chart.tsx rename x-pack/plugins/data_visualizer/public/application/{data_comparison => data_drift}/charts/single_distribution_chart.tsx (51%) rename x-pack/plugins/data_visualizer/public/application/{data_comparison => data_drift}/constants.ts (99%) rename x-pack/plugins/data_visualizer/public/application/{data_comparison/data_comparison_app_state.tsx => data_drift/data_drift_app_state.tsx} (52%) rename x-pack/plugins/data_visualizer/public/application/{data_comparison/data_comparison_chart_tooltip_body.tsx => data_drift/data_drift_chart_tooltip_body.tsx} (80%) rename x-pack/plugins/data_visualizer/public/application/{data_comparison/data_comparison_overview_table.tsx => data_drift/data_drift_overview_table.tsx} (64%) rename x-pack/plugins/data_visualizer/public/application/{data_comparison/data_comparison_page.tsx => data_drift/data_drift_page.tsx} (60%) rename x-pack/plugins/data_visualizer/public/application/{data_comparison/data_comparison_utils.test.ts => data_drift/data_drift_utils.test.ts} (87%) rename x-pack/plugins/data_visualizer/public/application/{data_comparison/data_comparison_utils.ts => data_drift/data_drift_utils.ts} (100%) rename x-pack/plugins/data_visualizer/public/application/{data_comparison/data_comparison_view.tsx => data_drift/data_drift_view.tsx} (78%) rename x-pack/plugins/data_visualizer/public/application/{data_comparison => data_drift}/document_count_with_dual_brush.tsx (58%) rename x-pack/plugins/data_visualizer/public/application/{data_comparison => data_drift}/index.ts (64%) rename x-pack/plugins/data_visualizer/public/application/{data_comparison => data_drift}/types.ts (76%) rename x-pack/plugins/data_visualizer/public/application/{data_comparison => data_drift}/use_data_drift_result.ts (78%) create mode 100644 x-pack/plugins/data_visualizer/public/application/data_drift/use_state_manager.ts create mode 100644 x-pack/plugins/ml/public/application/datavisualizer/data_drift/data_drift_index_patterns_editor.tsx rename x-pack/plugins/ml/public/application/datavisualizer/{data_comparison/data_comparison_page.tsx => data_drift/data_drift_page.tsx} (69%) create mode 100644 x-pack/plugins/ml/public/application/datavisualizer/data_drift/data_view_editor.tsx create mode 100644 x-pack/plugins/ml/public/application/datavisualizer/data_drift/index_patterns_picker.tsx create mode 100644 x-pack/plugins/ml/public/application/routing/routes/datavisualizer/data_drift.tsx create mode 100644 x-pack/test/functional/apps/ml/data_visualizer/data_drift.ts create mode 100644 x-pack/test/functional/services/ml/data_drift.ts diff --git a/api_docs/data_view_editor.devdocs.json b/api_docs/data_view_editor.devdocs.json index 6ecfaa57fcaa8..bc40d7a29ec62 100644 --- a/api_docs/data_view_editor.devdocs.json +++ b/api_docs/data_view_editor.devdocs.json @@ -320,4 +320,4 @@ "misc": [], "objects": [] } -} \ No newline at end of file +} diff --git a/api_docs/kbn_deeplinks_ml.devdocs.json b/api_docs/kbn_deeplinks_ml.devdocs.json index a1d4f7262f54a..d15d3e61bc630 100644 --- a/api_docs/kbn_deeplinks_ml.devdocs.json +++ b/api_docs/kbn_deeplinks_ml.devdocs.json @@ -45,7 +45,7 @@ "label": "DeepLinkId", "description": [], "signature": [ - "\"ml\" | \"ml:nodes\" | \"ml:notifications\" | \"ml:overview\" | \"ml:settings\" | \"ml:dataVisualizer\" | \"ml:anomalyDetection\" | \"ml:anomalyExplorer\" | \"ml:singleMetricViewer\" | \"ml:dataComparison\" | \"ml:dataFrameAnalytics\" | \"ml:resultExplorer\" | \"ml:analyticsMap\" | \"ml:aiOps\" | \"ml:logRateAnalysis\" | \"ml:logPatternAnalysis\" | \"ml:changePointDetections\" | \"ml:modelManagement\" | \"ml:nodesOverview\" | \"ml:memoryUsage\" | \"ml:fileUpload\" | \"ml:indexDataVisualizer\" | \"ml:calendarSettings\" | \"ml:filterListsSettings\"" + "\"ml\" | \"ml:nodes\" | \"ml:notifications\" | \"ml:overview\" | \"ml:settings\" | \"ml:dataVisualizer\" | \"ml:anomalyDetection\" | \"ml:anomalyExplorer\" | \"ml:singleMetricViewer\" | \"ml:dataDrift\" | \"ml:dataFrameAnalytics\" | \"ml:resultExplorer\" | \"ml:analyticsMap\" | \"ml:aiOps\" | \"ml:logRateAnalysis\" | \"ml:logPatternAnalysis\" | \"ml:changePointDetections\" | \"ml:modelManagement\" | \"ml:nodesOverview\" | \"ml:memoryUsage\" | \"ml:fileUpload\" | \"ml:indexDataVisualizer\" | \"ml:calendarSettings\" | \"ml:filterListsSettings\"" ], "path": "packages/deeplinks/ml/deep_links.ts", "deprecated": false, @@ -60,7 +60,7 @@ "label": "LinkId", "description": [], "signature": [ - "\"nodes\" | \"notifications\" | \"overview\" | \"settings\" | \"dataVisualizer\" | \"anomalyDetection\" | \"anomalyExplorer\" | \"singleMetricViewer\" | \"dataComparison\" | \"dataFrameAnalytics\" | \"resultExplorer\" | \"analyticsMap\" | \"aiOps\" | \"logRateAnalysis\" | \"logPatternAnalysis\" | \"changePointDetections\" | \"modelManagement\" | \"nodesOverview\" | \"memoryUsage\" | \"fileUpload\" | \"indexDataVisualizer\" | \"calendarSettings\" | \"filterListsSettings\"" + "\"nodes\" | \"notifications\" | \"overview\" | \"settings\" | \"dataVisualizer\" | \"anomalyDetection\" | \"anomalyExplorer\" | \"singleMetricViewer\" | \"dataDrift\" | \"dataFrameAnalytics\" | \"resultExplorer\" | \"analyticsMap\" | \"aiOps\" | \"logRateAnalysis\" | \"logPatternAnalysis\" | \"changePointDetections\" | \"modelManagement\" | \"nodesOverview\" | \"memoryUsage\" | \"fileUpload\" | \"indexDataVisualizer\" | \"calendarSettings\" | \"filterListsSettings\"" ], "path": "packages/deeplinks/ml/deep_links.ts", "deprecated": false, @@ -70,4 +70,4 @@ ], "objects": [] } -} \ No newline at end of file +} diff --git a/packages/deeplinks/ml/deep_links.ts b/packages/deeplinks/ml/deep_links.ts index dc6accb275272..1c16543512b09 100644 --- a/packages/deeplinks/ml/deep_links.ts +++ b/packages/deeplinks/ml/deep_links.ts @@ -15,7 +15,7 @@ export type LinkId = | 'anomalyDetection' | 'anomalyExplorer' | 'singleMetricViewer' - | 'dataComparison' + | 'dataDrift' | 'dataFrameAnalytics' | 'resultExplorer' | 'analyticsMap' diff --git a/packages/default-nav/ml/default_navigation.ts b/packages/default-nav/ml/default_navigation.ts index 829c2307299d3..c0035f6f25db0 100644 --- a/packages/default-nav/ml/default_navigation.ts +++ b/packages/default-nav/ml/default_navigation.ts @@ -114,9 +114,9 @@ export const defaultNavigation: MlNodeDefinition = { }, { title: i18n.translate('defaultNavigation.ml.dataComparison', { - defaultMessage: 'Data comparison', + defaultMessage: 'Data drift', }), - link: 'ml:dataComparison', + link: 'ml:dataDrift', }, ], }, diff --git a/packages/shared-ux/chrome/navigation/mocks/src/navlinks.ts b/packages/shared-ux/chrome/navigation/mocks/src/navlinks.ts index c3d3b756eaae4..b0adfd22734fc 100644 --- a/packages/shared-ux/chrome/navigation/mocks/src/navlinks.ts +++ b/packages/shared-ux/chrome/navigation/mocks/src/navlinks.ts @@ -62,7 +62,7 @@ const allNavLinks: AppDeepLinkId[] = [ 'ml:fileUpload', 'ml:filterListsSettings', 'ml:indexDataVisualizer', - 'ml:dataComparison', + 'ml:dataDrift', 'ml:logPatternAnalysis', 'ml:logRateAnalysis', 'ml:memoryUsage', diff --git a/packages/shared-ux/chrome/navigation/src/ui/__snapshots__/default_navigation.test.tsx.snap b/packages/shared-ux/chrome/navigation/src/ui/__snapshots__/default_navigation.test.tsx.snap index f7f08fe075f56..d73d9c68385bc 100644 --- a/packages/shared-ux/chrome/navigation/src/ui/__snapshots__/default_navigation.test.tsx.snap +++ b/packages/shared-ux/chrome/navigation/src/ui/__snapshots__/default_navigation.test.tsx.snap @@ -473,21 +473,21 @@ Array [ "children": undefined, "deepLink": Object { "baseUrl": "/mocked", - "href": "http://mocked/ml:dataComparison", - "id": "ml:dataComparison", - "title": "Deeplink ml:dataComparison", - "url": "/mocked/ml:dataComparison", + "href": "http://mocked/ml:dataDrift", + "id": "ml:dataDrift", + "title": "Deeplink ml:dataDrift", + "url": "/mocked/ml:dataDrift", }, "href": undefined, - "id": "ml:dataComparison", + "id": "ml:dataDrift", "isActive": false, "path": Array [ "rootNav:ml", "data_visualizer", - "ml:dataComparison", + "ml:dataDrift", ], "renderItem": undefined, - "title": "Data comparison", + "title": "Data drift", }, ], "deepLink": undefined, diff --git a/src/plugins/data_view_editor/public/data_view_editor_service.ts b/src/plugins/data_view_editor/public/data_view_editor_service.ts index 8d709ca30fe32..c9b382447fd87 100644 --- a/src/plugins/data_view_editor/public/data_view_editor_service.ts +++ b/src/plugins/data_view_editor/public/data_view_editor_service.ts @@ -37,12 +37,24 @@ export const matchedIndiciesDefault = { visibleIndices: [], }; +/** + * ConstructorArgs for DataViewEditorService + */ export interface DataViewEditorServiceConstructorArgs { + /** + * Dependencies for the DataViewEditorService + */ services: { http: HttpSetup; dataViews: DataViewsServicePublic; }; + /** + * Whether service requires requireTimestampField + */ requireTimestampField?: boolean; + /** + * Initial type, indexPattern, and name to populate service + */ initialValues: { name?: string; type?: INDEX_PATTERN_TYPE; diff --git a/src/plugins/data_view_editor/public/data_view_editor_service_lazy.ts b/src/plugins/data_view_editor/public/data_view_editor_service_lazy.ts new file mode 100644 index 0000000000000..14c9e809e9842 --- /dev/null +++ b/src/plugins/data_view_editor/public/data_view_editor_service_lazy.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 { DataViewEditorService } from './data_view_editor_service'; diff --git a/src/plugins/data_view_editor/public/index.ts b/src/plugins/data_view_editor/public/index.ts index 3d6d40c9846ac..7b55450cd2928 100644 --- a/src/plugins/data_view_editor/public/index.ts +++ b/src/plugins/data_view_editor/public/index.ts @@ -20,7 +20,11 @@ import { DataViewEditorPlugin } from './plugin'; -export type { PluginStart as DataViewEditorStart, DataViewEditorProps } from './types'; +export type { + PluginStart as DataViewEditorStart, + DataViewEditorProps, + DataViewEditorService, +} from './types'; export function plugin() { return new DataViewEditorPlugin(); diff --git a/src/plugins/data_view_editor/public/mocks.ts b/src/plugins/data_view_editor/public/mocks.ts index fe4f3663cbab2..0ea3587b2b7b7 100644 --- a/src/plugins/data_view_editor/public/mocks.ts +++ b/src/plugins/data_view_editor/public/mocks.ts @@ -23,6 +23,7 @@ const createStartContract = (): Start => { userPermissions: { editDataView: jest.fn(), }, + dataViewEditorServiceFactory: jest.fn(), }; }; diff --git a/src/plugins/data_view_editor/public/plugin.tsx b/src/plugins/data_view_editor/public/plugin.tsx index 232958fbb2c21..34263ad6cdca5 100644 --- a/src/plugins/data_view_editor/public/plugin.tsx +++ b/src/plugins/data_view_editor/public/plugin.tsx @@ -63,6 +63,14 @@ export class DataViewEditorPlugin userPermissions: { editDataView: () => dataViews.getCanSaveSync(), }, + /** + * Helper method to generate a new data view editor service. + * @returns DataViewEditorService + */ + dataViewEditorServiceFactory: async () => { + const module = await import('./data_view_editor_service_lazy'); + return module; + }, }; } diff --git a/src/plugins/data_view_editor/public/types.ts b/src/plugins/data_view_editor/public/types.ts index 93fe26ab47627..472fe2393a4af 100644 --- a/src/plugins/data_view_editor/public/types.ts +++ b/src/plugins/data_view_editor/public/types.ts @@ -24,6 +24,7 @@ import type { INDEX_PATTERN_TYPE, MatchedItem, } from '@kbn/data-views-plugin/public'; +import type { DataViewEditorService } from './data_view_editor_service'; import { DataPublicPluginStart, IndexPatternAggRestrictions } from './shared_imports'; export interface DataViewEditorContext { @@ -74,12 +75,20 @@ export interface DataViewEditorProps { // eslint-disable-next-line @typescript-eslint/no-empty-interface export interface PluginSetup {} +export type { DataViewEditorService }; export interface PluginStart { openEditor(options: DataViewEditorProps): () => void; IndexPatternEditorComponent: FC; userPermissions: { editDataView: () => boolean; }; + /** + * Helper method to generate a new data view editor service. + * @param requireTimestampField - whether service requires requireTimestampField + * @param initialValues - initial type, indexPattern, and name to populate service + * @returns DataViewEditorService + */ + dataViewEditorServiceFactory: () => Promise; } // eslint-disable-next-line @typescript-eslint/no-empty-interface diff --git a/src/plugins/kibana_overview/public/components/overview/__snapshots__/overview.test.tsx.snap b/src/plugins/kibana_overview/public/components/overview/__snapshots__/overview.test.tsx.snap index 453d20385e706..656a59a6425f6 100644 --- a/src/plugins/kibana_overview/public/components/overview/__snapshots__/overview.test.tsx.snap +++ b/src/plugins/kibana_overview/public/components/overview/__snapshots__/overview.test.tsx.snap @@ -711,6 +711,7 @@ exports[`Overview renders correctly when there is no user data view 1`] = ` dataViewEditor={ Object { "IndexPatternEditorComponent": [MockFunction], + "dataViewEditorServiceFactory": [MockFunction], "openEditor": [MockFunction], "userPermissions": Object { "editDataView": [MockFunction], diff --git a/src/plugins/saved_objects_finder/public/finder/saved_object_finder.tsx b/src/plugins/saved_objects_finder/public/finder/saved_object_finder.tsx index aad1734dff657..d660a8bf2857a 100644 --- a/src/plugins/saved_objects_finder/public/finder/saved_object_finder.tsx +++ b/src/plugins/saved_objects_finder/public/finder/saved_object_finder.tsx @@ -75,6 +75,7 @@ interface BaseSavedObjectFinder { savedObjectMetaData: Array>; showFilter?: boolean; leftChildren?: ReactElement | ReactElement[]; + children?: ReactElement | ReactElement[]; helpText?: string; } diff --git a/x-pack/packages/ml/aiops_components/src/document_count_chart/document_count_chart.tsx b/x-pack/packages/ml/aiops_components/src/document_count_chart/document_count_chart.tsx index 967821db0e0db..dd0d30862ea78 100644 --- a/x-pack/packages/ml/aiops_components/src/document_count_chart/document_count_chart.tsx +++ b/x-pack/packages/ml/aiops_components/src/document_count_chart/document_count_chart.tsx @@ -104,6 +104,8 @@ export interface DocumentCountChartProps { brushSelectionUpdateHandler?: BrushSelectionUpdateHandler; /** Optional width */ width?: number; + /** Optional chart height */ + height?: number; /** Data chart points */ chartPoints: LogRateHistogramItem[]; /** Data chart points split */ @@ -130,6 +132,8 @@ export interface DocumentCountChartProps { deviationBrush?: BrushSettings; /** Optional settings override for the 'baseline' brush */ baselineBrush?: BrushSettings; + /** Optional data-test-subject */ + dataTestSubj?: string; } const SPEC_ID = 'document_count'; @@ -174,9 +178,11 @@ function getBaselineBadgeOverflow( */ export const DocumentCountChart: FC = (props) => { const { + dataTestSubj, dependencies, brushSelectionUpdateHandler, width, + height, chartPoints, chartPointsSplit, timeRangeEarliest, @@ -417,7 +423,7 @@ export const DocumentCountChart: FC = (props) => { return ( <> {isBrushVisible && ( -
+
= (props) => {
)} -
+
(0); private mode$ = new BehaviorSubject(RANDOM_SAMPLER_OPTION.ON_AUTOMATIC); private probability$ = new BehaviorSubject(DEFAULT_PROBABILITY); - private setRandomSamplerModeInStorage: (mode: RandomSamplerOption) => void; - private setRandomSamplerProbabilityInStorage: (prob: RandomSamplerProbability) => void; + private setRandomSamplerModeInStorage?: (mode: RandomSamplerOption) => void; + private setRandomSamplerProbabilityInStorage?: (prob: RandomSamplerProbability) => void; /** * Initial values @@ -69,15 +69,17 @@ export class RandomSampler { * @param setRandomSamplerProbability - initial setter for random sampler probability */ constructor( - randomSamplerMode: RandomSamplerOption, - setRandomSamplerMode: (mode: RandomSamplerOption) => void, - randomSamplerProbability: RandomSamplerProbability, - setRandomSamplerProbability: (prob: RandomSamplerProbability) => void + randomSamplerMode?: RandomSamplerOption, + setRandomSamplerMode?: (mode: RandomSamplerOption) => void, + randomSamplerProbability?: RandomSamplerProbability, + setRandomSamplerProbability?: (prob: RandomSamplerProbability) => void ) { - this.mode$.next(randomSamplerMode); - this.setRandomSamplerModeInStorage = setRandomSamplerMode; - this.probability$.next(randomSamplerProbability); - this.setRandomSamplerProbabilityInStorage = setRandomSamplerProbability; + if (randomSamplerMode) this.mode$.next(randomSamplerMode); + + if (setRandomSamplerMode) this.setRandomSamplerModeInStorage = setRandomSamplerMode; + if (randomSamplerProbability) this.probability$.next(randomSamplerProbability); + if (setRandomSamplerProbability) + this.setRandomSamplerProbabilityInStorage = setRandomSamplerProbability; } /** @@ -100,7 +102,9 @@ export class RandomSampler { * @param {RandomSamplerOption} mode - mode to use when wrapping/unwrapping random sampling aggs */ public setMode(mode: RandomSamplerOption) { - this.setRandomSamplerModeInStorage(mode); + if (this.setRandomSamplerModeInStorage) { + this.setRandomSamplerModeInStorage(mode); + } return this.mode$.next(mode); } @@ -123,7 +127,9 @@ export class RandomSampler { * @param {RandomSamplerProbability} probability - numeric value 0 < probability < 1 to use for random sampling */ public setProbability(probability: RandomSamplerProbability) { - this.setRandomSamplerProbabilityInStorage(probability); + if (this.setRandomSamplerProbabilityInStorage) { + this.setRandomSamplerProbabilityInStorage(probability); + } return this.probability$.next(probability); } diff --git a/x-pack/plugins/data_visualizer/public/api/index.ts b/x-pack/plugins/data_visualizer/public/api/index.ts index a07f4041637b1..68c265e200f12 100644 --- a/x-pack/plugins/data_visualizer/public/api/index.ts +++ b/x-pack/plugins/data_visualizer/public/api/index.ts @@ -7,7 +7,7 @@ import { lazyLoadModules } from '../lazy_load_bundle'; import type { - DataComparisonSpec, + DataDriftSpec, FileDataVisualizerSpec, IndexDataVisualizerSpec, } from '../application'; @@ -22,7 +22,7 @@ export async function getIndexDataVisualizerComponent(): Promise<() => IndexData return () => modules.IndexDataVisualizer; } -export async function getDataComparisonComponent(): Promise<() => DataComparisonSpec> { +export async function getDataDriftComponent(): Promise<() => DataDriftSpec> { const modules = await lazyLoadModules(); - return () => modules.DataComparison; + return () => modules.DataDrift; } diff --git a/x-pack/plugins/data_visualizer/public/application/common/components/document_count_content/total_count_header.tsx b/x-pack/plugins/data_visualizer/public/application/common/components/document_count_content/total_count_header.tsx index 99ecd72d29857..e681e6c85efcb 100644 --- a/x-pack/plugins/data_visualizer/public/application/common/components/document_count_content/total_count_header.tsx +++ b/x-pack/plugins/data_visualizer/public/application/common/components/document_count_content/total_count_header.tsx @@ -9,30 +9,44 @@ import { EuiFlexItem, EuiText, EuiLoadingSpinner, EuiIconTip } from '@elastic/eu import { FormattedMessage } from '@kbn/i18n-react'; import React from 'react'; import { i18n } from '@kbn/i18n'; - +import { getDataTestSubject } from '../../util/get_data_test_subject'; const SIGFIGS_IF_ROUNDING = 3; // Number of sigfigs to use for values < 10 +const defaultDocCountLabel = i18n.translate( + 'xpack.dataVisualizer.searchPanel.totalDocumentsLabel', + { defaultMessage: 'Total documents' } +); + export const TotalCountHeader = ({ + id, totalCount, approximate, loading, + label = defaultDocCountLabel, }: { + id?: string; totalCount: number; + label?: string; loading?: boolean; approximate?: boolean; }) => { return ( - + ) : ( - + void; + id?: string; } -export const SamplingMenu: FC = ({ randomSampler, reload }) => { +export const SamplingMenu: FC = ({ randomSampler, reload, id }) => { const [showSamplingOptionsPopover, setShowSamplingOptionsPopover] = useState(false); const samplingProbability = useObservable( @@ -129,13 +131,15 @@ export const SamplingMenu: FC = ({ randomSampler, reload }) => { return ( setShowSamplingOptionsPopover(!showSamplingOptionsPopover)} iconSide="right" iconType="arrowDown" + size="s" > {buttonText} @@ -152,7 +156,7 @@ export const SamplingMenu: FC = ({ randomSampler, reload }) => { = ({ randomSampler, reload }) => { )} > setRandomSamplerPreference(e.target.value as RandomSamplerOption)} diff --git a/x-pack/plugins/data_visualizer/public/application/common/hooks/use_data.ts b/x-pack/plugins/data_visualizer/public/application/common/hooks/use_data.ts index 9e7e3f9633291..65c882ba551d9 100644 --- a/x-pack/plugins/data_visualizer/public/application/common/hooks/use_data.ts +++ b/x-pack/plugins/data_visualizer/public/application/common/hooks/use_data.ts @@ -6,7 +6,6 @@ */ import { DataView } from '@kbn/data-views-plugin/common'; -import * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { Dictionary } from '@kbn/ml-url-state'; import { Moment } from 'moment'; import { useExecutionContext } from '@kbn/kibana-react-plugin/public'; @@ -14,8 +13,14 @@ import { useEffect, useMemo, useState } from 'react'; import { mlTimefilterRefresh$, useTimefilter } from '@kbn/ml-date-picker'; import { merge } from 'rxjs'; import { RandomSampler } from '@kbn/ml-random-sampler-utils'; +import { mapAndFlattenFilters } from '@kbn/data-plugin/public'; +import { Query } from '@kbn/es-query'; +import { SearchQueryLanguage } from '@kbn/ml-query-utils'; +import { createMergedEsQuery } from '../../index_data_visualizer/utils/saved_search_utils'; +import { useDataDriftStateManagerContext } from '../../data_drift/use_state_manager'; +import type { InitialSettings } from '../../data_drift/use_data_drift_result'; import { - DocumentStatsSearchStrategyParams, + type DocumentStatsSearchStrategyParams, useDocumentCountStats, } from './use_document_count_stats'; import { useDataVisualizerKibana } from '../../kibana_context'; @@ -24,16 +29,23 @@ import { useTimeBuckets } from './use_time_buckets'; const DEFAULT_BAR_TARGET = 75; export const useData = ( + initialSettings: InitialSettings, selectedDataView: DataView, contextId: string, - searchQuery: estypes.QueryDslQueryContainer, + searchString: Query['query'], + searchQueryLanguage: SearchQueryLanguage, randomSampler: RandomSampler, + randomSamplerProd: RandomSampler, onUpdate?: (params: Dictionary) => void, barTarget: number = DEFAULT_BAR_TARGET, timeRange?: { min: Moment; max: Moment } ) => { const { - services: { executionContext }, + services: { + executionContext, + uiSettings, + data: { query: queryManager }, + }, } = useDataVisualizerKibana(); useExecutionContext(executionContext, { @@ -50,26 +62,95 @@ export const useData = ( autoRefreshSelector: true, }); - const docCountRequestParams: DocumentStatsSearchStrategyParams | undefined = useMemo(() => { - const timefilterActiveBounds = timeRange ?? timefilter.getActiveBounds(); - if (timefilterActiveBounds !== undefined) { - _timeBuckets.setInterval('auto'); - _timeBuckets.setBounds(timefilterActiveBounds); - _timeBuckets.setBarTarget(barTarget); - return { - earliest: timefilterActiveBounds.min?.valueOf(), - latest: timefilterActiveBounds.max?.valueOf(), - intervalMs: _timeBuckets.getInterval()?.asMilliseconds(), - index: selectedDataView.getIndexPattern(), - searchQuery, - timeFieldName: selectedDataView.timeFieldName, - runtimeFieldMap: selectedDataView.getRuntimeMappings(), - }; - } + const { reference: referenceStateManager, comparison: comparisonStateManager } = + useDataDriftStateManagerContext(); + + const docCountRequestParams: + | { + reference: DocumentStatsSearchStrategyParams | undefined; + comparison: DocumentStatsSearchStrategyParams | undefined; + } + | undefined = useMemo( + () => { + const searchQuery = + searchString !== undefined && searchQueryLanguage !== undefined + ? { query: searchString, language: searchQueryLanguage } + : undefined; + + const timefilterActiveBounds = timeRange ?? timefilter.getActiveBounds(); + if (timefilterActiveBounds !== undefined) { + _timeBuckets.setInterval('auto'); + _timeBuckets.setBounds(timefilterActiveBounds); + _timeBuckets.setBarTarget(barTarget); + const query = { + earliest: timefilterActiveBounds.min?.valueOf(), + latest: timefilterActiveBounds.max?.valueOf(), + intervalMs: _timeBuckets.getInterval()?.asMilliseconds(), + timeFieldName: selectedDataView.timeFieldName, + runtimeFieldMap: selectedDataView.getRuntimeMappings(), + }; + + const refQuery = createMergedEsQuery( + searchQuery, + mapAndFlattenFilters([ + ...queryManager.filterManager.getFilters(), + ...(referenceStateManager.filters ?? []), + ]), + selectedDataView, + uiSettings + ); + + const compQuery = createMergedEsQuery( + searchQuery, + mapAndFlattenFilters([ + ...queryManager.filterManager.getFilters(), + ...(comparisonStateManager.filters ?? []), + ]), + selectedDataView, + uiSettings + ); + + return { + reference: { + ...query, + searchQuery: refQuery, + index: initialSettings ? initialSettings.reference : selectedDataView.getIndexPattern(), + }, + comparison: { + ...query, + searchQuery: compQuery, + index: initialSettings + ? initialSettings.comparison + : selectedDataView.getIndexPattern(), + }, + }; + } + }, // eslint-disable-next-line react-hooks/exhaustive-deps - }, [lastRefresh, JSON.stringify({ searchQuery, timeRange })]); + [ + lastRefresh, + searchString, + searchQueryLanguage, + // eslint-disable-next-line react-hooks/exhaustive-deps + JSON.stringify({ + timeRange, + globalFilters: queryManager.filterManager.getFilters(), + compFilters: comparisonStateManager?.filters, + refFilters: referenceStateManager?.filters, + }), + ] + ); - const documentStats = useDocumentCountStats(docCountRequestParams, lastRefresh, randomSampler); + const documentStats = useDocumentCountStats( + docCountRequestParams?.reference, + lastRefresh, + randomSampler + ); + const documentStatsProd = useDocumentCountStats( + docCountRequestParams?.comparison, + lastRefresh, + randomSamplerProd + ); useEffect(() => { const timefilterUpdateSubscription = merge( @@ -102,12 +183,19 @@ export const useData = ( return { documentStats, + documentStatsProd, timefilter, /** Start timestamp filter */ - earliest: docCountRequestParams?.earliest, + earliest: Math.min( + docCountRequestParams?.reference?.earliest ?? 0, + docCountRequestParams?.comparison?.earliest ?? 0 + ), /** End timestamp filter */ - latest: docCountRequestParams?.latest, - intervalMs: docCountRequestParams?.intervalMs, + latest: Math.max( + docCountRequestParams?.reference?.latest ?? 0, + docCountRequestParams?.comparison?.latest ?? 0 + ), + intervalMs: docCountRequestParams?.reference?.intervalMs, forceRefresh: () => setLastRefresh(Date.now()), }; }; diff --git a/x-pack/plugins/data_visualizer/public/application/common/hooks/use_document_count_stats.ts b/x-pack/plugins/data_visualizer/public/application/common/hooks/use_document_count_stats.ts index 6514b1f98a292..87a9a37d4d2c5 100644 --- a/x-pack/plugins/data_visualizer/public/application/common/hooks/use_document_count_stats.ts +++ b/x-pack/plugins/data_visualizer/public/application/common/hooks/use_document_count_stats.ts @@ -236,6 +236,7 @@ export function useDocumentCountStats { + if (!id) return testSubject; + return `${testSubject}-${id}`; +}; diff --git a/x-pack/plugins/data_visualizer/public/application/data_comparison/charts/data_comparison_distribution_chart.tsx b/x-pack/plugins/data_visualizer/public/application/data_comparison/charts/data_comparison_distribution_chart.tsx deleted file mode 100644 index 96a4876d5df11..0000000000000 --- a/x-pack/plugins/data_visualizer/public/application/data_comparison/charts/data_comparison_distribution_chart.tsx +++ /dev/null @@ -1,51 +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 { Axis, BarSeries, Chart, Position, ScaleType, Settings, Tooltip } from '@elastic/charts'; -import React from 'react'; -import { NoChartsData } from './no_charts_data'; -import { ComparisonHistogram } from '../types'; -import { DataComparisonChartTooltipBody } from '../data_comparison_chart_tooltip_body'; -import { COMPARISON_LABEL, DATA_COMPARISON_TYPE } from '../constants'; - -export const DataComparisonDistributionChart = ({ - featureName, - fieldType, - data, - colors, -}: { - featureName: string; - fieldType: string; - data: ComparisonHistogram[]; - colors: { referenceColor: string; productionColor: string }; -}) => { - if (data.length === 0) return ; - return ( - - - - - Number(d).toFixed(2)} /> - { - const key = identifier.seriesKeys[0]; - return key === COMPARISON_LABEL ? colors.productionColor : colors.referenceColor; - }} - /> - - ); -}; diff --git a/x-pack/plugins/data_visualizer/public/application/data_comparison/charts/overlap_distribution_chart.tsx b/x-pack/plugins/data_visualizer/public/application/data_comparison/charts/overlap_distribution_chart.tsx deleted file mode 100644 index 34f6a797831c0..0000000000000 --- a/x-pack/plugins/data_visualizer/public/application/data_comparison/charts/overlap_distribution_chart.tsx +++ /dev/null @@ -1,64 +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 { AreaSeries, Chart, CurveType, ScaleType, Settings, Tooltip } from '@elastic/charts'; -import { i18n } from '@kbn/i18n'; -import React from 'react'; -import { NoChartsData } from './no_charts_data'; -import type { ComparisonHistogram, DataComparisonField } from '../types'; -import { DataComparisonChartTooltipBody } from '../data_comparison_chart_tooltip_body'; -import { COMPARISON_LABEL, DATA_COMPARISON_TYPE, REFERENCE_LABEL } from '../constants'; - -export const OverlapDistributionComparison = ({ - data, - colors, - fieldType, - fieldName, -}: { - data: ComparisonHistogram[]; - colors: { referenceColor: string; productionColor: string }; - fieldType?: DataComparisonField['type']; - fieldName?: DataComparisonField['field']; -}) => { - if (data.length === 0) return ; - - return ( - - - - - { - const key = identifier.seriesKeys[0]; - return key === COMPARISON_LABEL ? colors.productionColor : colors.referenceColor; - }} - /> - - ); -}; diff --git a/x-pack/plugins/data_visualizer/public/application/data_drift/charts/data_drift_distribution_chart.tsx b/x-pack/plugins/data_visualizer/public/application/data_drift/charts/data_drift_distribution_chart.tsx new file mode 100644 index 0000000000000..1a777ceda0f04 --- /dev/null +++ b/x-pack/plugins/data_visualizer/public/application/data_drift/charts/data_drift_distribution_chart.tsx @@ -0,0 +1,71 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { Axis, BarSeries, Chart, Tooltip, Position, ScaleType, Settings } from '@elastic/charts'; +import React from 'react'; +import { FIELD_FORMAT_IDS } from '@kbn/field-formats-plugin/common'; +import { NoChartsData } from './no_charts_data'; +import type { Feature } from '../types'; +import { COMPARISON_LABEL, DATA_COMPARISON_TYPE } from '../constants'; +import { DataComparisonChartTooltipBody } from '../data_drift_chart_tooltip_body'; +import { getFieldFormatType, useFieldFormatter } from './default_value_formatter'; + +const CHART_HEIGHT = 200; + +export const DataDriftDistributionChart = ({ + item, + colors, + secondaryType, +}: { + item: Feature | undefined; + colors: { referenceColor: string; comparisonColor: string }; + secondaryType: string; + domain?: Feature['domain']; +}) => { + const xAxisFormatter = useFieldFormatter(getFieldFormatType(secondaryType)); + const yAxisFormatter = useFieldFormatter(FIELD_FORMAT_IDS.NUMBER); + + if (!item || item.comparisonDistribution.length === 0) return ; + const { featureName, fieldType, comparisonDistribution: data } = item; + + return ( +
+ + + + + + { + const key = identifier.seriesKeys[0]; + return key === COMPARISON_LABEL ? colors.comparisonColor : colors.referenceColor; + }} + /> + +
+ ); +}; diff --git a/x-pack/plugins/data_visualizer/public/application/data_drift/charts/default_value_formatter.ts b/x-pack/plugins/data_visualizer/public/application/data_drift/charts/default_value_formatter.ts new file mode 100644 index 0000000000000..c97e5f371bb63 --- /dev/null +++ b/x-pack/plugins/data_visualizer/public/application/data_drift/charts/default_value_formatter.ts @@ -0,0 +1,41 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ +import { useMemo, useCallback } from 'react'; +import { FIELD_FORMAT_IDS } from '@kbn/field-formats-plugin/common'; +import { useDataVisualizerKibana } from '../../kibana_context'; + +export const getFieldFormatType = (type: string) => { + switch (type) { + case 'number': + return FIELD_FORMAT_IDS.NUMBER; + case 'boolean': + return FIELD_FORMAT_IDS.BOOLEAN; + default: + return FIELD_FORMAT_IDS.STRING; + } +}; +export const useFieldFormatter = (fieldType: FIELD_FORMAT_IDS) => { + const { + services: { + data: { fieldFormats }, + }, + } = useDataVisualizerKibana(); + + const fieldFormatter = useMemo(() => { + return fieldFormats.deserialize({ + id: fieldType, + }); + }, [fieldFormats, fieldType]); + + return useCallback( + (v: unknown) => { + const func = fieldFormatter.convert.bind(fieldFormatter); + return func(v); + }, + [fieldFormatter] + ); +}; diff --git a/x-pack/plugins/data_visualizer/public/application/data_comparison/charts/no_charts_data.tsx b/x-pack/plugins/data_visualizer/public/application/data_drift/charts/no_charts_data.tsx similarity index 100% rename from x-pack/plugins/data_visualizer/public/application/data_comparison/charts/no_charts_data.tsx rename to x-pack/plugins/data_visualizer/public/application/data_drift/charts/no_charts_data.tsx diff --git a/x-pack/plugins/data_visualizer/public/application/data_drift/charts/overlap_distribution_chart.tsx b/x-pack/plugins/data_visualizer/public/application/data_drift/charts/overlap_distribution_chart.tsx new file mode 100644 index 0000000000000..5913d9e813881 --- /dev/null +++ b/x-pack/plugins/data_visualizer/public/application/data_drift/charts/overlap_distribution_chart.tsx @@ -0,0 +1,90 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { + AreaSeries, + Axis, + Chart, + CurveType, + Position, + ScaleType, + Settings, + Tooltip, +} from '@elastic/charts'; +import { i18n } from '@kbn/i18n'; +import React from 'react'; +import { FIELD_FORMAT_IDS } from '@kbn/field-formats-plugin/common'; +import { NoChartsData } from './no_charts_data'; +import type { ComparisonHistogram, DataDriftField } from '../types'; +import { DataComparisonChartTooltipBody } from '../data_drift_chart_tooltip_body'; +import { COMPARISON_LABEL, DATA_COMPARISON_TYPE, REFERENCE_LABEL } from '../constants'; +import { getFieldFormatType, useFieldFormatter } from './default_value_formatter'; + +export const OverlapDistributionComparison = ({ + data, + colors, + fieldType, + fieldName, + secondaryType, +}: { + data: ComparisonHistogram[]; + colors: { referenceColor: string; comparisonColor: string }; + secondaryType: string; + fieldType?: DataDriftField['type']; + fieldName?: DataDriftField['field']; +}) => { + const xAxisFormatter = useFieldFormatter(getFieldFormatType(secondaryType)); + const yAxisFormatter = useFieldFormatter(FIELD_FORMAT_IDS.NUMBER); + if (data.length === 0) return ; + + return ( + + + + + + + { + const key = identifier.seriesKeys[0]; + return key === COMPARISON_LABEL ? colors.comparisonColor : colors.referenceColor; + }} + /> + + ); +}; diff --git a/x-pack/plugins/data_visualizer/public/application/data_comparison/charts/single_distribution_chart.tsx b/x-pack/plugins/data_visualizer/public/application/data_drift/charts/single_distribution_chart.tsx similarity index 51% rename from x-pack/plugins/data_visualizer/public/application/data_comparison/charts/single_distribution_chart.tsx rename to x-pack/plugins/data_visualizer/public/application/data_drift/charts/single_distribution_chart.tsx index 22796f371cb55..a8232a2ea7e12 100644 --- a/x-pack/plugins/data_visualizer/public/application/data_comparison/charts/single_distribution_chart.tsx +++ b/x-pack/plugins/data_visualizer/public/application/data_drift/charts/single_distribution_chart.tsx @@ -6,28 +6,55 @@ */ import { SeriesColorAccessor } from '@elastic/charts/dist/chart_types/xy_chart/utils/specs'; -import { BarSeries, Chart, ScaleType, Settings } from '@elastic/charts'; +import { Axis, BarSeries, Chart, Position, ScaleType, Settings, Tooltip } from '@elastic/charts'; import React from 'react'; +import { FIELD_FORMAT_IDS } from '@kbn/field-formats-plugin/common'; +import { getFieldFormatType, useFieldFormatter } from './default_value_formatter'; +import { DataComparisonChartTooltipBody } from '../data_drift_chart_tooltip_body'; import { NoChartsData } from './no_charts_data'; import { DATA_COMPARISON_TYPE } from '../constants'; -import { DataComparisonField, Histogram } from '../types'; +import { DataDriftField, Feature, Histogram } from '../types'; export const SingleDistributionChart = ({ data, color, fieldType, + secondaryType, name, }: { data: Histogram[]; name: string; + secondaryType: string; color?: SeriesColorAccessor; - fieldType?: DataComparisonField['type']; + fieldType?: DataDriftField['type']; + domain?: Feature['domain']; }) => { + const xAxisFormatter = useFieldFormatter(getFieldFormatType(secondaryType)); + const yAxisFormatter = useFieldFormatter(FIELD_FORMAT_IDS.NUMBER); + if (data.length === 0) return ; return ( + + + + + + = ({ +const getStr = (arg: string | string[] | null, fallbackStr?: string): string => { + if (arg === undefined || arg == null) return fallbackStr ?? ''; + + if (typeof arg === 'string') return arg.replaceAll(`'`, ''); + + if (Array.isArray(arg)) return arg.join(','); + + return ''; +}; + +export const DataDriftDetectionAppState: FC = ({ dataView, savedSearch, }) => { @@ -75,6 +94,37 @@ export const DataComparisonDetectionAppState: FC @@ -83,7 +133,15 @@ export const DataComparisonDetectionAppState: FC - + + + diff --git a/x-pack/plugins/data_visualizer/public/application/data_comparison/data_comparison_chart_tooltip_body.tsx b/x-pack/plugins/data_visualizer/public/application/data_drift/data_drift_chart_tooltip_body.tsx similarity index 80% rename from x-pack/plugins/data_visualizer/public/application/data_comparison/data_comparison_chart_tooltip_body.tsx rename to x-pack/plugins/data_visualizer/public/application/data_drift/data_drift_chart_tooltip_body.tsx index b867239884f7e..fff45cf27a0cc 100644 --- a/x-pack/plugins/data_visualizer/public/application/data_comparison/data_comparison_chart_tooltip_body.tsx +++ b/x-pack/plugins/data_visualizer/public/application/data_drift/data_drift_chart_tooltip_body.tsx @@ -17,9 +17,29 @@ import { TooltipTableRow, } from '@elastic/charts'; import React from 'react'; +import { FIELD_FORMAT_IDS } from '@kbn/field-formats-plugin/common'; +import { useFieldFormatter } from './charts/default_value_formatter'; const style: TooltipCellStyle = { textAlign: 'right' }; export const DataComparisonChartTooltipBody: TooltipSpec['body'] = ({ items }) => { + const percentFormatter = useFieldFormatter(FIELD_FORMAT_IDS.PERCENT); + + const footer = + items.length > 1 ? ( + + + {} + Diff + + + {items[1].datum.doc_count - items[0].datum.doc_count} + + + {percentFormatter(items[1].datum.percentage - items[0].datum.percentage)} + + + + ) : null; return ( @@ -36,25 +56,12 @@ export const DataComparisonChartTooltipBody: TooltipSpec['body'] = ({ items }) = {} {label} {datum.doc_count} - {`${(datum.percentage * 100).toFixed( - 1 - )}`} + {percentFormatter(datum.percentage)} ))} - - - {} - Diff - - {items[1].datum.doc_count - items[0].datum.doc_count} - - - {`${((items[1].datum.percentage - items[0].datum.percentage) * 100).toFixed(1)}%`} - - - + {footer} ); }; diff --git a/x-pack/plugins/data_visualizer/public/application/data_comparison/data_comparison_overview_table.tsx b/x-pack/plugins/data_visualizer/public/application/data_drift/data_drift_overview_table.tsx similarity index 64% rename from x-pack/plugins/data_visualizer/public/application/data_comparison/data_comparison_overview_table.tsx rename to x-pack/plugins/data_visualizer/public/application/data_drift/data_drift_overview_table.tsx index 46cd0510443f8..1c03e18f52e8e 100644 --- a/x-pack/plugins/data_visualizer/public/application/data_comparison/data_comparison_overview_table.tsx +++ b/x-pack/plugins/data_visualizer/public/application/data_drift/data_drift_overview_table.tsx @@ -6,7 +6,7 @@ */ import type { UseTableState } from '@kbn/ml-in-memory-table'; -import React, { ReactNode, useMemo, useState } from 'react'; +import React, { ReactNode, useEffect, useMemo, useState } from 'react'; import { i18n } from '@kbn/i18n'; import { EuiBasicTableColumn, @@ -21,26 +21,23 @@ import { FieldTypeIcon } from '../common/components/field_type_icon'; import { COLLAPSE_ROW, EXPAND_ROW } from '../../../common/i18n_constants'; import { COMPARISON_LABEL, REFERENCE_LABEL } from './constants'; import { useCurrentEuiTheme } from '../common/hooks/use_current_eui_theme'; -import { DataComparisonField, Feature, FETCH_STATUS } from './types'; -import { formatSignificanceLevel } from './data_comparison_utils'; +import { type DataDriftField, type Feature, FETCH_STATUS } from './types'; +import { formatSignificanceLevel } from './data_drift_utils'; import { SingleDistributionChart } from './charts/single_distribution_chart'; import { OverlapDistributionComparison } from './charts/overlap_distribution_chart'; -import { DataComparisonDistributionChart } from './charts/data_comparison_distribution_chart'; +import { DataDriftDistributionChart } from './charts/data_drift_distribution_chart'; -const dataComparisonYesLabel = i18n.translate( - 'xpack.dataVisualizer.dataComparison.fieldTypeYesLabel', - { - defaultMessage: 'Yes', - } -); +const dataComparisonYesLabel = i18n.translate('xpack.dataVisualizer.dataDrift.fieldTypeYesLabel', { + defaultMessage: 'Yes', +}); const dataComparisonNoLabel = i18n.translate( - 'xpack.dataVisualizer.dataComparison.driftDetectedNoLabel', + 'xpack.dataVisualizer.dataDrift.driftDetectedNoLabel', { defaultMessage: 'No', } ); -export const DataComparisonOverviewTable = ({ +export const DataDriftOverviewTable = ({ data, onTableChange, pagination, @@ -51,29 +48,55 @@ export const DataComparisonOverviewTable = ({ status: FETCH_STATUS; } & UseTableState) => { const euiTheme = useCurrentEuiTheme(); - const colors = { - referenceColor: euiTheme.euiColorVis2, - productionColor: euiTheme.euiColorVis1, - }; + + const colors = useMemo( + () => ({ + referenceColor: euiTheme.euiColorVis2, + comparisonColor: euiTheme.euiColorVis1, + }), + [euiTheme] + ); const [itemIdToExpandedRowMap, setItemIdToExpandedRowMap] = useState>( {} ); const referenceDistributionLabel = i18n.translate( - 'xpack.dataVisualizer.dataComparison.dataComparisonDistributionLabel', + 'xpack.dataVisualizer.dataDrift.dataComparisonDistributionLabel', { defaultMessage: '{label} distribution', values: { label: REFERENCE_LABEL }, } ); const comparisonDistributionLabel = i18n.translate( - 'xpack.dataVisualizer.dataComparison.dataComparisonDistributionLabel', + 'xpack.dataVisualizer.dataDrift.dataComparisonDistributionLabel', { defaultMessage: '{label} distribution', values: { label: COMPARISON_LABEL }, } ); + useEffect(() => { + const updatedItemIdToExpandedRowMap = { ...itemIdToExpandedRowMap }; + // Update expanded row in case data is stale + Object.keys(updatedItemIdToExpandedRowMap).forEach((itemId) => { + const item = data.find((d) => d.featureName === itemId); + if (item) { + const { featureName } = item; + + updatedItemIdToExpandedRowMap[featureName] = ( + + ); + } + }); + setItemIdToExpandedRowMap(updatedItemIdToExpandedRowMap); + + // eslint-disable-next-line react-hooks/exhaustive-deps + }, [data, colors]); + const columns: Array> = [ { align: 'left', @@ -99,31 +122,31 @@ export const DataComparisonOverviewTable = ({ { field: 'featureName', - name: i18n.translate('xpack.dataVisualizer.dataComparison.fieldNameLabel', { + name: i18n.translate('xpack.dataVisualizer.dataDrift.fieldNameLabel', { defaultMessage: 'Name', }), - 'data-test-subj': 'mlDataComparisonOverviewTableFeatureName', + 'data-test-subj': 'mlDataDriftOverviewTableFeatureName', sortable: true, textOnly: true, }, { field: 'secondaryType', - name: i18n.translate('xpack.dataVisualizer.dataComparison.fieldTypeLabel', { + name: i18n.translate('xpack.dataVisualizer.dataDrift.fieldTypeLabel', { defaultMessage: 'Type', }), - 'data-test-subj': 'mlDataComparisonOverviewTableFeatureType', + 'data-test-subj': 'mlDataDriftOverviewTableFeatureType', sortable: true, textOnly: true, - render: (secondaryType: DataComparisonField['secondaryType']) => { + render: (secondaryType: DataDriftField['secondaryType']) => { return ; }, }, { field: 'driftDetected', - name: i18n.translate('xpack.dataVisualizer.dataComparison.driftDetectedLabel', { + name: i18n.translate('xpack.dataVisualizer.dataDrift.driftDetectedLabel', { defaultMessage: 'Drift detected', }), - 'data-test-subj': 'mlDataComparisonOverviewTableDriftDetected', + 'data-test-subj': 'mlDataDriftOverviewTableDriftDetected', sortable: true, textOnly: true, render: (driftDetected: boolean) => { @@ -134,20 +157,20 @@ export const DataComparisonOverviewTable = ({ field: 'similarityTestPValue', name: ( - {i18n.translate('xpack.dataVisualizer.dataComparison.pValueLabel', { + {i18n.translate('xpack.dataVisualizer.dataDrift.pValueLabel', { defaultMessage: 'Similarity p-value', })} ), - 'data-test-subj': 'mlDataComparisonOverviewTableSimilarityTestPValue', + 'data-test-subj': 'mlDataDriftOverviewTableSimilarityTestPValue', sortable: true, textOnly: true, render: (similarityTestPValue: number) => { @@ -157,7 +180,7 @@ export const DataComparisonOverviewTable = ({ { field: 'referenceHistogram', name: referenceDistributionLabel, - 'data-test-subj': 'mlDataComparisonOverviewTableReferenceDistribution', + 'data-test-subj': 'mlDataDriftOverviewTableReferenceDistribution', sortable: false, render: (referenceHistogram: Feature['referenceHistogram'], item) => { return ( @@ -167,24 +190,26 @@ export const DataComparisonOverviewTable = ({ data={referenceHistogram} color={colors.referenceColor} name={referenceDistributionLabel} + secondaryType={item.secondaryType} />
); }, }, { - field: 'productionHistogram', + field: 'comparisonHistogram', name: comparisonDistributionLabel, - 'data-test-subj': 'mlDataComparisonOverviewTableDataComparisonDistributionChart', + 'data-test-subj': 'mlDataDriftOverviewTableDataComparisonDistributionChart', sortable: false, - render: (productionDistribution: Feature['productionHistogram'], item) => { + render: (comparisonDistribution: Feature['comparisonHistogram'], item) => { return (
); @@ -193,7 +218,7 @@ export const DataComparisonOverviewTable = ({ { field: 'comparisonDistribution', name: 'Comparison', - 'data-test-subj': 'mlDataComparisonOverviewTableDataComparisonDistributionChart', + 'data-test-subj': 'mlDataDriftOverviewTableDataComparisonDistributionChart', sortable: false, render: (comparisonDistribution: Feature['comparisonDistribution'], item) => { return ( @@ -203,6 +228,7 @@ export const DataComparisonOverviewTable = ({ fieldType={item.fieldType} data={comparisonDistribution} colors={colors} + secondaryType={item.secondaryType} />
); @@ -212,8 +238,8 @@ export const DataComparisonOverviewTable = ({ const getRowProps = (item: Feature) => { return { - 'data-test-subj': `mlDataComparisonOverviewTableRow row-${item.featureName}`, - className: 'mlDataComparisonOverviewTableRow', + 'data-test-subj': `mlDataDriftOverviewTableRow row-${item.featureName}`, + className: 'mlDataDriftOverviewTableRow', onClick: () => {}, }; }; @@ -221,8 +247,7 @@ export const DataComparisonOverviewTable = ({ const getCellProps = (item: Feature, column: EuiTableFieldDataColumnType) => { const { field } = column; return { - className: 'mlDataComparisonOverviewTableCell', - 'data-test-subj': `mlDataComparisonOverviewTableCell row-${item.featureName}-column-${String( + 'data-test-subj': `mlDataDriftOverviewTableCell row-${item.featureName}-column-${String( field )}`, textOnly: true, @@ -235,16 +260,12 @@ export const DataComparisonOverviewTable = ({ if (itemIdToExpandedRowMapValues[item.featureName]) { delete itemIdToExpandedRowMapValues[item.featureName]; } else { - const { featureName, comparisonDistribution } = item; itemIdToExpandedRowMapValues[item.featureName] = ( -
- -
+ ); } setItemIdToExpandedRowMap(itemIdToExpandedRowMapValues); @@ -253,11 +274,11 @@ export const DataComparisonOverviewTable = ({ const tableMessage = useMemo(() => { switch (status) { case FETCH_STATUS.NOT_INITIATED: - return i18n.translate('xpack.dataVisualizer.dataComparison.dataComparisonRunAnalysisMsg', { + return i18n.translate('xpack.dataVisualizer.dataDrift.dataComparisonRunAnalysisMsg', { defaultMessage: 'Run analysis to compare reference and comparison data', }); case FETCH_STATUS.LOADING: - return i18n.translate('xpack.dataVisualizer.dataComparison.dataComparisonLoadingMsg', { + return i18n.translate('xpack.dataVisualizer.dataDrift.dataComparisonLoadingMsg', { defaultMessage: 'Analyzing', }); default: @@ -267,12 +288,10 @@ export const DataComparisonOverviewTable = ({ return ( - tableCaption={i18n.translate( - 'xpack.dataVisualizer.dataComparison.dataComparisonTableCaption', - { - defaultMessage: 'Data comparison overview', - } - )} + data-test-subj="mlDataDriftTable" + tableCaption={i18n.translate('xpack.dataVisualizer.dataDrift.dataDriftTableCaption', { + defaultMessage: 'Data drift overview', + })} items={data} rowHeader="featureName" columns={columns} diff --git a/x-pack/plugins/data_visualizer/public/application/data_comparison/data_comparison_page.tsx b/x-pack/plugins/data_visualizer/public/application/data_drift/data_drift_page.tsx similarity index 60% rename from x-pack/plugins/data_visualizer/public/application/data_comparison/data_comparison_page.tsx rename to x-pack/plugins/data_visualizer/public/application/data_drift/data_drift_page.tsx index 801e3c1da7a4b..86ddff5c25e3f 100644 --- a/x-pack/plugins/data_visualizer/public/application/data_comparison/data_comparison_page.tsx +++ b/x-pack/plugins/data_visualizer/public/application/data_drift/data_drift_page.tsx @@ -16,7 +16,7 @@ import { EuiPanel, EuiSpacer, EuiPageHeader, - EuiCallOut, + EuiHorizontalRule, } from '@elastic/eui'; import type { WindowParameters } from '@kbn/aiops-utils'; @@ -35,13 +35,11 @@ import moment from 'moment'; import { css } from '@emotion/react'; import type { SearchQueryLanguage } from '@kbn/ml-query-utils'; import { i18n } from '@kbn/i18n'; -import { RANDOM_SAMPLER_OPTION, RandomSampler } from '@kbn/ml-random-sampler-utils'; -import { MIN_SAMPLER_PROBABILITY } from '../index_data_visualizer/constants/random_sampler'; +import type { InitialSettings } from './use_data_drift_result'; +import { useDataDriftStateManagerContext } from './use_state_manager'; import { useData } from '../common/hooks/use_data'; import { DV_FROZEN_TIER_PREFERENCE, - DV_RANDOM_SAMPLER_P_VALUE, - DV_RANDOM_SAMPLER_PREFERENCE, DVKey, DVStorageMapped, } from '../index_data_visualizer/types/storage'; @@ -49,7 +47,7 @@ import { useCurrentEuiTheme } from '../common/hooks/use_current_eui_theme'; import { DataComparisonFullAppState, getDefaultDataComparisonState } from './types'; import { useDataSource } from '../common/hooks/data_source_context'; import { useDataVisualizerKibana } from '../kibana_context'; -import { DataComparisonView } from './data_comparison_view'; +import { DataDriftView } from './data_drift_view'; import { COMPARISON_LABEL, REFERENCE_LABEL } from './constants'; import { SearchPanelContent } from '../index_data_visualizer/components/search_panel/search_bar'; import { useSearch } from '../common/hooks/use_search'; @@ -124,40 +122,39 @@ export const PageHeader: FC = () => { ); }; -export const DataComparisonPage: FC = () => { +const getDataDriftDataLabel = (label: string, indexPattern?: string) => + i18n.translate('xpack.dataVisualizer.dataDrift.dataLabel', { + defaultMessage: '{label} data', + values: { label }, + }) + (indexPattern ? `: ${indexPattern}` : ''); + +interface Props { + initialSettings: InitialSettings; +} + +export const DataDriftPage: FC = ({ initialSettings }) => { const { services: { data: dataService }, } = useDataVisualizerKibana(); const { dataView, savedSearch } = useDataSource(); - const [dataComparisonListState, setAiopsListState] = usePageUrlState<{ - pageKey: 'DV_DATA_COMP'; - pageUrlState: DataComparisonFullAppState; - }>('DV_DATA_COMP', getDefaultDataComparisonState()); + const { reference: referenceStateManager, comparison: comparisonStateManager } = + useDataDriftStateManagerContext(); - const [randomSamplerMode, setRandomSamplerMode] = useStorage< - DVKey, - DVStorageMapped - >(DV_RANDOM_SAMPLER_PREFERENCE, RANDOM_SAMPLER_OPTION.ON_AUTOMATIC); + const [dataComparisonListState, setDataComparisonListState] = usePageUrlState<{ + pageKey: 'DV_DATA_DRIFT'; + pageUrlState: DataComparisonFullAppState; + }>('DV_DATA_DRIFT', getDefaultDataComparisonState()); - const [randomSamplerProbability, setRandomSamplerProbability] = useStorage< - DVKey, - DVStorageMapped - >(DV_RANDOM_SAMPLER_P_VALUE, MIN_SAMPLER_PROBABILITY); const [lastRefresh, setLastRefresh] = useState(0); const forceRefresh = useCallback(() => setLastRefresh(Date.now()), [setLastRefresh]); - const randomSampler = useMemo( - () => - new RandomSampler( - randomSamplerMode, - setRandomSamplerMode, - randomSamplerProbability, - setRandomSamplerProbability - ), - // eslint-disable-next-line react-hooks/exhaustive-deps - [] + const randomSampler = useMemo(() => referenceStateManager.randomSampler, [referenceStateManager]); + + const randomSamplerProd = useMemo( + () => comparisonStateManager.randomSampler, + [comparisonStateManager] ); const [globalState, setGlobalState] = useUrlState('_g'); @@ -183,7 +180,7 @@ export const DataComparisonPage: FC = () => { setSelectedSavedSearch(null); } - setAiopsListState({ + setDataComparisonListState({ ...dataComparisonListState, searchQuery: searchParams.searchQuery, searchString: searchParams.searchString, @@ -191,7 +188,7 @@ export const DataComparisonPage: FC = () => { filters: searchParams.filters, }); }, - [selectedSavedSearch, dataComparisonListState, setAiopsListState] + [selectedSavedSearch, dataComparisonListState, setDataComparisonListState] ); const { searchQueryLanguage, searchString, searchQuery } = useSearch( @@ -199,11 +196,14 @@ export const DataComparisonPage: FC = () => { dataComparisonListState ); - const { documentStats, timefilter } = useData( + const { documentStats, documentStatsProd, timefilter } = useData( + initialSettings, dataView, 'data_drift', - searchQuery, + searchString, + searchQueryLanguage, randomSampler, + randomSamplerProd, setGlobalState, undefined ); @@ -243,7 +243,7 @@ export const DataComparisonPage: FC = () => { const euiTheme = useCurrentEuiTheme(); const colors = { referenceColor: euiTheme.euiColorVis2, - productionColor: euiTheme.euiColorVis1, + comparisonColor: euiTheme.euiColorVis1, }; const [windowParameters, setWindowParameters] = useState(); @@ -280,7 +280,7 @@ export const DataComparisonPage: FC = () => { return colors.referenceColor; } if (start >= windowParameters.deviationMin && end <= windowParameters.deviationMax) { - return colors.productionColor; + return colors.comparisonColor; } return null; @@ -289,12 +289,15 @@ export const DataComparisonPage: FC = () => { [JSON.stringify({ windowParameters, colors })] ); + const referenceIndexPatternLabel = initialSettings?.reference + ? getDataDriftDataLabel(REFERENCE_LABEL, initialSettings.reference) + : getDataDriftDataLabel(REFERENCE_LABEL); + const comparisonIndexPatternLabel = initialSettings?.comparison + ? getDataDriftDataLabel(COMPARISON_LABEL, initialSettings?.comparison) + : getDataDriftDataLabel(COMPARISON_LABEL); + return ( - + @@ -308,84 +311,97 @@ export const DataComparisonPage: FC = () => { setSearchParams={setSearchParams} /> - {documentCountStats !== undefined && ( - - - - - - )} + + + + + + + - {!dataView?.isTimeBased() ? ( - -

- {i18n.translate( - 'xpack.dataVisualizer.dataComparisonTimeSeriesWarning.description', - { - defaultMessage: 'Data comparison only runs over time-based indices.', - } - )} -

-
- ) : ( - - )} +
diff --git a/x-pack/plugins/data_visualizer/public/application/data_comparison/data_comparison_utils.test.ts b/x-pack/plugins/data_visualizer/public/application/data_drift/data_drift_utils.test.ts similarity index 87% rename from x-pack/plugins/data_visualizer/public/application/data_comparison/data_comparison_utils.test.ts rename to x-pack/plugins/data_visualizer/public/application/data_drift/data_drift_utils.test.ts index 08f0305e4126a..66dd69f66fb07 100644 --- a/x-pack/plugins/data_visualizer/public/application/data_comparison/data_comparison_utils.test.ts +++ b/x-pack/plugins/data_visualizer/public/application/data_drift/data_drift_utils.test.ts @@ -5,7 +5,7 @@ * 2.0. */ -import { computeChi2PValue } from './data_comparison_utils'; +import { computeChi2PValue } from './data_drift_utils'; import { Histogram } from './types'; describe('computeChi2PValue()', () => { @@ -32,7 +32,7 @@ describe('computeChi2PValue()', () => { percentage: 0.5422117647058824, }, ]; - const productionTerms: Histogram[] = [ + const comparisonTerms: Histogram[] = [ { key: 'ap-northwest-1', doc_count: 40320, @@ -55,7 +55,7 @@ describe('computeChi2PValue()', () => { }, ]; expect(computeChi2PValue([], [])).toStrictEqual(1); - expect(computeChi2PValue(referenceTerms, productionTerms)).toStrictEqual(0.99); + expect(computeChi2PValue(referenceTerms, comparisonTerms)).toStrictEqual(0.99); }); test('should return close to 0 if datasets differ', () => { @@ -71,7 +71,7 @@ describe('computeChi2PValue()', () => { percentage: 0, }, ]; - const productionTerms: Histogram[] = [ + const comparisonTerms: Histogram[] = [ { key: 'jackson', doc_count: 0, @@ -83,6 +83,6 @@ describe('computeChi2PValue()', () => { percentage: 1, }, ]; - expect(computeChi2PValue(referenceTerms, productionTerms)).toStrictEqual(0); + expect(computeChi2PValue(referenceTerms, comparisonTerms)).toStrictEqual(0); }); }); diff --git a/x-pack/plugins/data_visualizer/public/application/data_comparison/data_comparison_utils.ts b/x-pack/plugins/data_visualizer/public/application/data_drift/data_drift_utils.ts similarity index 100% rename from x-pack/plugins/data_visualizer/public/application/data_comparison/data_comparison_utils.ts rename to x-pack/plugins/data_visualizer/public/application/data_drift/data_drift_utils.ts diff --git a/x-pack/plugins/data_visualizer/public/application/data_comparison/data_comparison_view.tsx b/x-pack/plugins/data_visualizer/public/application/data_drift/data_drift_view.tsx similarity index 78% rename from x-pack/plugins/data_visualizer/public/application/data_comparison/data_comparison_view.tsx rename to x-pack/plugins/data_visualizer/public/application/data_drift/data_drift_view.tsx index 31134832ec56a..dc4193fe8a331 100644 --- a/x-pack/plugins/data_visualizer/public/application/data_comparison/data_comparison_view.tsx +++ b/x-pack/plugins/data_visualizer/public/application/data_drift/data_drift_view.tsx @@ -16,44 +16,44 @@ import { FormattedMessage } from '@kbn/i18n-react'; import { EuiSwitchEvent } from '@elastic/eui/src/components/form/switch/switch'; import { useTableState } from '@kbn/ml-in-memory-table'; import type { SearchQueryLanguage } from '@kbn/ml-query-utils'; -import { RandomSampler } from '@kbn/ml-random-sampler-utils'; -import { QueryDslQueryContainer } from '@elastic/elasticsearch/lib/api/types'; import { kbnTypeToSupportedType } from '../common/util/field_types_utils'; -import { getDataComparisonType, useFetchDataComparisonResult } from './use_data_drift_result'; -import type { DataComparisonField, Feature, TimeRange } from './types'; -import { DataComparisonOverviewTable } from './data_comparison_overview_table'; +import { + getDataComparisonType, + type InitialSettings, + useFetchDataComparisonResult, +} from './use_data_drift_result'; +import type { DataDriftField, Feature, TimeRange } from './types'; +import { DataDriftOverviewTable } from './data_drift_overview_table'; const showOnlyDriftedFieldsOptionLabel = i18n.translate( - 'xpack.dataVisualizer.dataComparison.showOnlyDriftedFieldsOptionLabel', + 'xpack.dataVisualizer.dataDrift.showOnlyDriftedFieldsOptionLabel', { defaultMessage: 'Show only fields with drifted data' } ); -interface DataComparisonViewProps { +interface DataDriftViewProps { windowParameters?: WindowParameters; dataView: DataView; searchString: Query['query']; - searchQuery: QueryDslQueryContainer; searchQueryLanguage: SearchQueryLanguage; isBrushCleared: boolean; runAnalysisDisabled?: boolean; onReset: () => void; lastRefresh: number; - forceRefresh: () => void; - randomSampler: RandomSampler; + onRefresh: () => void; + initialSettings: InitialSettings; } // Data drift view -export const DataComparisonView = ({ +export const DataDriftView = ({ windowParameters, dataView, searchString, - searchQuery, searchQueryLanguage, onReset, isBrushCleared, lastRefresh, - forceRefresh, - randomSampler, -}: DataComparisonViewProps) => { + onRefresh, + initialSettings, +}: DataDriftViewProps) => { const [showDataComparisonOnly, setShowDataComparisonOnly] = useState(false); const [currentAnalysisWindowParameters, setCurrentAnalysisWindowParameters] = useState< @@ -62,16 +62,16 @@ export const DataComparisonView = ({ const [fetchInfo, setFetchIno] = useState< | { - fields: DataComparisonField[]; + fields: DataDriftField[]; currentDataView: DataView; - timeRanges?: { reference: TimeRange; production: TimeRange }; + timeRanges?: { reference: TimeRange; comparison: TimeRange }; } | undefined >(); - const onRefresh = useCallback(() => { + const refresh = useCallback(() => { setCurrentAnalysisWindowParameters(windowParameters); - const mergedFields: DataComparisonField[] = []; + const mergedFields: DataDriftField[] = []; if (dataView) { mergedFields.push( ...dataView.fields @@ -101,7 +101,7 @@ export const DataComparisonView = ({ start: windowParameters.baselineMin, end: windowParameters.baselineMax, }, - production: { + comparison: { start: windowParameters.deviationMin, end: windowParameters.deviationMax, }, @@ -109,18 +109,17 @@ export const DataComparisonView = ({ } : {}), }); - if (forceRefresh) { - forceRefresh(); + if (onRefresh) { + onRefresh(); } - }, [dataView, windowParameters, forceRefresh]); + }, [dataView, windowParameters, onRefresh]); const { result, cancelRequest } = useFetchDataComparisonResult({ ...fetchInfo, + initialSettings, lastRefresh, - randomSampler, searchString, searchQueryLanguage, - searchQuery, }); const filteredData = useMemo(() => { @@ -152,7 +151,9 @@ export const DataComparisonView = ({ setPageIndex(0); }; - return windowParameters === undefined ? ( + const requiresWindowParameters = dataView?.isTimeBased() && windowParameters === undefined; + + return requiresWindowParameters ? ( @@ -170,13 +171,12 @@ export const DataComparisonView = ({ body={

} - data-test-subj="dataVisualizerNoWindowParametersEmptyPrompt" + data-test-subj="dataDriftNoWindowParametersEmptyPrompt" /> ) : (
@@ -186,10 +186,10 @@ export const DataComparisonView = ({ progress={result.loaded} progressMessage={result.progressMessage ?? ''} isRunning={result.loaded > 0 && result.loaded < 1} - onRefresh={onRefresh} + onRefresh={refresh} onCancel={cancelRequest} shouldRerunAnalysis={shouldRerunAnalysis} - runAnalysisDisabled={!dataView || !windowParameters} + runAnalysisDisabled={!dataView || requiresWindowParameters} > @@ -214,7 +214,7 @@ export const DataComparisonView = ({ body={{result.errorBody}} /> ) : ( - void; approximate: boolean; + stateManager: DataDriftStateManager; + label?: string; + id?: string; } export const DocumentCountWithDualBrush: FC = ({ + id, randomSampler, reload, brushSelectionUpdateHandler, @@ -60,13 +70,35 @@ export const DocumentCountWithDualBrush: FC = ({ barHighlightColorOverride, windowParameters, incomingInitialAnalysisStart, - approximate, + stateManager, + label, ...docCountChartProps }) => { const { - services: { data, uiSettings, fieldFormats, charts }, + services: { + data, + uiSettings, + fieldFormats, + charts, + unifiedSearch: { + ui: { SearchBar }, + }, + }, } = useDataVisualizerKibana(); + const { dataView } = useDataDriftStateManagerContext(); + + const approximate = useObservable( + randomSampler + .getProbability$() + .pipe( + map((samplingProbability) => + isDefined(samplingProbability) ? samplingProbability < 1 : false + ) + ), + false + ); + const bucketTimestamps = Object.keys(documentCountStats?.buckets ?? {}).map((time) => +time); const splitBucketTimestamps = Object.keys(documentCountStatsSplit?.buckets ?? {}).map( (time) => +time @@ -74,6 +106,35 @@ export const DocumentCountWithDualBrush: FC = ({ const timeRangeEarliest = Math.min(...[...bucketTimestamps, ...splitBucketTimestamps]); const timeRangeLatest = Math.max(...[...bucketTimestamps, ...splitBucketTimestamps]); + if (dataView.getTimeField() === undefined) { + return ( + + +

{label}

+
+ + + stateManager.setFilters(filters)} + indexPatterns={[dataView]} + displayStyle={'inPage'} + isClearable={true} + /> + + + + + +
+ ); + } if ( documentCountStats === undefined || documentCountStats.buckets === undefined || @@ -99,13 +160,35 @@ export const DocumentCountWithDualBrush: FC = ({ } return ( - - + + + + + + - + stateManager.setFilters(filters)} + indexPatterns={[dataView]} + displayStyle={'inPage'} + isClearable={true} + customSubmitButton={
} + /> + - + @@ -125,6 +208,8 @@ export const DocumentCountWithDualBrush: FC = ({ barColorOverride={barColorOverride} barHighlightColorOverride={barHighlightColorOverride} {...docCountChartProps} + height={60} + dataTestSubj={getDataTestSubject('dataDriftDocCountChart', id)} /> )} diff --git a/x-pack/plugins/data_visualizer/public/application/data_comparison/index.ts b/x-pack/plugins/data_visualizer/public/application/data_drift/index.ts similarity index 64% rename from x-pack/plugins/data_visualizer/public/application/data_comparison/index.ts rename to x-pack/plugins/data_visualizer/public/application/data_drift/index.ts index 887f640da0d1a..9d0507e9d404d 100644 --- a/x-pack/plugins/data_visualizer/public/application/data_comparison/index.ts +++ b/x-pack/plugins/data_visualizer/public/application/data_drift/index.ts @@ -5,11 +5,8 @@ * 2.0. */ -import { - DataComparisonDetectionAppState, - type DataComparisonSpec, -} from './data_comparison_app_state'; -export { type DataComparisonSpec }; +import { DataDriftDetectionAppState, type DataDriftSpec } from './data_drift_app_state'; +export { type DataDriftSpec }; // required for dynamic import using React.lazy() // eslint-disable-next-line import/no-default-export -export default DataComparisonDetectionAppState; +export default DataDriftDetectionAppState; diff --git a/x-pack/plugins/data_visualizer/public/application/data_comparison/types.ts b/x-pack/plugins/data_visualizer/public/application/data_drift/types.ts similarity index 76% rename from x-pack/plugins/data_visualizer/public/application/data_comparison/types.ts rename to x-pack/plugins/data_visualizer/public/application/data_drift/types.ts index 46272c045d51c..55da47f44d01c 100644 --- a/x-pack/plugins/data_visualizer/public/application/data_comparison/types.ts +++ b/x-pack/plugins/data_visualizer/public/application/data_drift/types.ts @@ -6,18 +6,23 @@ */ import { isPopulatedObject } from '@kbn/ml-is-populated-object'; -import { Filter, Query } from '@kbn/es-query'; +import type { Filter, Query } from '@kbn/es-query'; import * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { SEARCH_QUERY_LANGUAGE, SearchQueryLanguage } from '@kbn/ml-query-utils'; import { DATA_COMPARISON_TYPE } from './constants'; -export interface DataComparisonAppState { +export interface DataComparisonQueryState { searchString?: Query['query']; searchQuery?: estypes.QueryDslQueryContainer; searchQueryLanguage: SearchQueryLanguage; filters?: Filter[]; } +export interface DataComparisonAppState extends DataComparisonQueryState { + reference: DataComparisonQueryState; + comparison: DataComparisonQueryState; +} + export type DataComparisonFullAppState = Required; export type BasicAppState = DataComparisonFullAppState; @@ -32,6 +37,18 @@ export const getDefaultDataComparisonState = ( searchQuery: defaultSearchQuery, searchQueryLanguage: SEARCH_QUERY_LANGUAGE.KUERY, filters: [], + reference: { + searchString: '', + searchQuery: defaultSearchQuery, + searchQueryLanguage: SEARCH_QUERY_LANGUAGE.KUERY, + filters: [], + }, + comparison: { + searchString: '', + searchQuery: defaultSearchQuery, + searchQueryLanguage: SEARCH_QUERY_LANGUAGE.KUERY, + filters: [], + }, ...overrides, }); @@ -45,18 +62,28 @@ export interface ComparisonHistogram extends Histogram { g: string; } +interface Domain { + min: number; + max: number; +} // Show the overview table export interface Feature { featureName: string; - fieldType: DataComparisonField['type']; + fieldType: DataDriftField['type']; + secondaryType: DataDriftField['secondaryType']; driftDetected: boolean; similarityTestPValue: number; - productionHistogram: Histogram[]; + comparisonHistogram: Histogram[]; referenceHistogram: Histogram[]; comparisonDistribution: ComparisonHistogram[]; + domain?: { + doc_count: Domain; + percentage: Domain; + x: Domain; + }; } -export interface DataComparisonField { +export interface DataDriftField { field: string; type: DataComparisonType; secondaryType: string; @@ -92,7 +119,7 @@ export interface NumericDriftData { pValue: number; range?: Range; referenceHistogram: Histogram[]; - productionHistogram: Histogram[]; + comparisonHistogram: Histogram[]; secondaryType: string; } export interface CategoricalDriftData { diff --git a/x-pack/plugins/data_visualizer/public/application/data_comparison/use_data_drift_result.ts b/x-pack/plugins/data_visualizer/public/application/data_drift/use_data_drift_result.ts similarity index 78% rename from x-pack/plugins/data_visualizer/public/application/data_comparison/use_data_drift_result.ts rename to x-pack/plugins/data_visualizer/public/application/data_drift/use_data_drift_result.ts index a8e145c3fee1b..7707f23afd3e0 100644 --- a/x-pack/plugins/data_visualizer/public/application/data_comparison/use_data_drift_result.ts +++ b/x-pack/plugins/data_visualizer/public/application/data_drift/use_data_drift_result.ts @@ -17,11 +17,14 @@ import type { MappingRuntimeFields } from '@elastic/elasticsearch/lib/api/typesW import type { SearchQueryLanguage } from '@kbn/ml-query-utils'; import { getDefaultDSLQuery } from '@kbn/ml-query-utils'; import { i18n } from '@kbn/i18n'; -import { RandomSampler, RandomSamplerWrapper } from '@kbn/ml-random-sampler-utils'; +import { RandomSamplerWrapper } from '@kbn/ml-random-sampler-utils'; import { extractErrorMessage } from '@kbn/ml-error-utils'; import { AggregationsAggregate } from '@elastic/elasticsearch/lib/api/types'; import { QueryDslBoolQuery } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { isDefined } from '@kbn/ml-is-defined'; +import { mapAndFlattenFilters } from '@kbn/data-plugin/public'; +import { createMergedEsQuery } from '../index_data_visualizer/utils/saved_search_utils'; +import { useDataDriftStateManagerContext } from './use_state_manager'; import { useDataVisualizerKibana } from '../kibana_context'; import { REFERENCE_LABEL, @@ -39,12 +42,13 @@ import { Result, isNumericDriftData, Feature, - DataComparisonField, + DataDriftField, TimeRange, + ComparisonHistogram, } from './types'; -import { computeChi2PValue } from './data_comparison_utils'; +import { computeChi2PValue } from './data_drift_utils'; -export const getDataComparisonType = (kibanaType: string): DataComparisonField['type'] => { +export const getDataComparisonType = (kibanaType: string): DataDriftField['type'] => { switch (kibanaType) { case 'number': return DATA_COMPARISON_TYPE.NUMERIC; @@ -58,6 +62,41 @@ export const getDataComparisonType = (kibanaType: string): DataComparisonField[' type UseDataSearch = ReturnType; +const computeDomain = (comparisonDistribution: Histogram[] | ComparisonHistogram[]) => { + const domain: NonNullable = { + x: { min: 0, max: 0 }, + percentage: { min: 0, max: 0 }, + doc_count: { min: 0, max: 0 }, + }; + + comparisonDistribution.forEach((dist) => { + if (isDefined(dist.percentage)) { + if (dist.percentage >= domain.percentage.max) { + domain.percentage.max = dist.percentage; + } else { + domain.percentage.min = dist.percentage; + } + } + + if (isDefined(dist.doc_count)) { + if (dist.doc_count >= domain.doc_count.max) { + domain.doc_count.max = dist.doc_count; + } else { + domain.doc_count.min = dist.doc_count; + } + } + + const parsedKey = typeof dist.key === 'number' ? dist.key : parseFloat(dist.key); + if (!isNaN(parsedKey)) { + if (parsedKey >= domain.x.max) { + domain.x.max = parsedKey; + } else { + domain.x.min = parsedKey; + } + } + }); + return domain; +}; export const useDataSearch = () => { const { data } = useDataVisualizerKibana().services; @@ -130,10 +169,16 @@ const processDataComparisonResult = ( ): Feature[] => { return Object.entries(result).map(([featureName, data]) => { if (isNumericDriftData(data)) { - // normalize data.referenceHistogram and data.productionHistogram to use frequencies instead of counts + // normalize data.referenceHistogram and data.comparisonHistogram to use frequencies instead of counts const referenceHistogram: Histogram[] = normalizeHistogram(data.referenceHistogram); - const productionHistogram: Histogram[] = normalizeHistogram(data.productionHistogram); + const comparisonHistogram: Histogram[] = normalizeHistogram(data.comparisonHistogram); + const comparisonDistribution: ComparisonHistogram[] = [ + ...referenceHistogram.map((h) => ({ ...h, g: REFERENCE_LABEL })), + ...comparisonHistogram.map((h) => ({ ...h, g: COMPARISON_LABEL })), + ]; + + const domain = computeDomain(comparisonHistogram); return { featureName, secondaryType: data.secondaryType, @@ -141,11 +186,9 @@ const processDataComparisonResult = ( driftDetected: data.pValue < DRIFT_P_VALUE_THRESHOLD, similarityTestPValue: data.pValue, referenceHistogram: referenceHistogram ?? [], - productionHistogram: productionHistogram ?? [], - comparisonDistribution: [ - ...referenceHistogram.map((h) => ({ ...h, g: REFERENCE_LABEL })), - ...productionHistogram.map((h) => ({ ...h, g: COMPARISON_LABEL })), - ], + comparisonHistogram: comparisonHistogram ?? [], + comparisonDistribution, + domain, }; } @@ -163,12 +206,12 @@ const processDataComparisonResult = ( (acc, term) => acc + term.doc_count, data.baselineSumOtherDocCount ); - const productionTotalDocCount: number = data.driftedTerms.reduce( + const comparisonTotalDocCount: number = data.driftedTerms.reduce( (acc, term) => acc + term.doc_count, data.driftedSumOtherDocCount ); - // Sort the categories (allKeys) by the following metric: Math.abs(productionDocCount-referenceDocCount)/referenceDocCount + // Sort the categories (allKeys) by the following metric: Math.abs(comparisonDocCount-referenceDocCount)/referenceDocCount const sortedKeys = allKeys .map((k) => { const key = k.toString(); @@ -176,11 +219,11 @@ const processDataComparisonResult = ( const driftedTerm = data.driftedTerms.find((t) => t.key === key); if (baselineTerm && driftedTerm) { const referencePercentage = baselineTerm.doc_count / referenceTotalDocCount; - const productionPercentage = driftedTerm.doc_count / productionTotalDocCount; + const comparisonPercentage = driftedTerm.doc_count / comparisonTotalDocCount; return { key, relative_drift: - Math.abs(productionPercentage - referencePercentage) / referencePercentage, + Math.abs(comparisonPercentage - referencePercentage) / referencePercentage, }; } return { @@ -199,10 +242,14 @@ const processDataComparisonResult = ( const { normalizedTerms: normalizedDriftedTerms } = normalizeTerms( data.driftedTerms, sortedKeys, - productionTotalDocCount + comparisonTotalDocCount ); const pValue: number = computeChi2PValue(normalizedBaselineTerms, normalizedDriftedTerms); + const comparisonDistribution = [ + ...normalizedBaselineTerms.map((h) => ({ ...h, g: REFERENCE_LABEL })), + ...normalizedDriftedTerms.map((h) => ({ ...h, g: COMPARISON_LABEL })), + ]; return { featureName, secondaryType: data.secondaryType, @@ -210,11 +257,9 @@ const processDataComparisonResult = ( driftDetected: pValue < DRIFT_P_VALUE_THRESHOLD, similarityTestPValue: pValue, referenceHistogram: normalizedBaselineTerms ?? [], - productionHistogram: normalizedDriftedTerms ?? [], - comparisonDistribution: [ - ...normalizedBaselineTerms.map((h) => ({ ...h, g: REFERENCE_LABEL })), - ...normalizedDriftedTerms.map((h) => ({ ...h, g: COMPARISON_LABEL })), - ], + comparisonHistogram: normalizedDriftedTerms ?? [], + comparisonDistribution, + domain: computeDomain(comparisonDistribution), }; }); }; @@ -259,13 +304,13 @@ const getDataComparisonQuery = ({ } } - const refDataQuery: NonNullable = { + const queryAndRuntimeMappings: NonNullable = { query, }; if (runtimeFields) { - refDataQuery.runtime_mappings = runtimeFields; + queryAndRuntimeMappings.runtime_mappings = runtimeFields; } - return refDataQuery; + return queryAndRuntimeMappings; }; const fetchReferenceBaselineData = async ({ @@ -277,7 +322,7 @@ const fetchReferenceBaselineData = async ({ }: { baseRequest: EsRequestParams; dataSearch: UseDataSearch; - fields: DataComparisonField[]; + fields: DataDriftField[]; randomSamplerWrapper: RandomSamplerWrapper; signal: AbortSignal; }) => { @@ -332,7 +377,7 @@ const fetchComparisonDriftedData = async ({ }: { baseRequest: EsRequestParams; dataSearch: UseDataSearch; - fields: DataComparisonField[]; + fields: DataDriftField[]; randomSamplerWrapper: RandomSamplerWrapper; signal: AbortSignal; baselineResponseAggs: object; @@ -411,7 +456,7 @@ const fetchHistogramData = async ({ }: { baseRequest: EsRequestParams; dataSearch: UseDataSearch; - fields: DataComparisonField[]; + fields: DataDriftField[]; randomSamplerWrapper: RandomSamplerWrapper; signal: AbortSignal; baselineResponseAggs: Record; @@ -504,14 +549,14 @@ export const fetchInParallelChunks = async < asyncFetchFn, errorMsg, }: { - fields: DataComparisonField[]; + fields: DataDriftField[]; randomSamplerWrapper: RandomSamplerWrapper; - asyncFetchFn: (chunkedFields: DataComparisonField[]) => Promise; + asyncFetchFn: (chunkedFields: DataDriftField[]) => Promise; errorMsg?: string; }): Promise => { const { unwrap } = randomSamplerWrapper; const results = await Promise.allSettled( - chunk(fields, 30).map((chunkedFields: DataComparisonField[]) => asyncFetchFn(chunkedFields)) + chunk(fields, 30).map((chunkedFields: DataDriftField[]) => asyncFetchFn(chunkedFields)) ); const mergedResults = results @@ -532,7 +577,7 @@ export const fetchInParallelChunks = async < // eslint-disable-next-line no-console console.error(error); return { - error: errorMsg ?? 'An error occurred fetching data comparison data', + error: errorMsg ?? 'An error occurred fetching data drift data', errorBody: error.reason.message, }; } @@ -551,22 +596,29 @@ const initialState = { error: undefined, errorBody: undefined, }; + +export interface InitialSettings { + index: string; + comparison: string; + reference: string; + timeField: string; +} + export const useFetchDataComparisonResult = ( { fields, + initialSettings, currentDataView, timeRanges, - searchQuery, searchString, + searchQueryLanguage, lastRefresh, - randomSampler, }: { lastRefresh: number; - randomSampler?: RandomSampler; - fields?: DataComparisonField[]; + initialSettings?: InitialSettings; + fields?: DataDriftField[]; currentDataView?: DataView; - timeRanges?: { reference: TimeRange; production: TimeRange }; - searchQuery?: estypes.QueryDslQueryContainer; + timeRanges?: { reference: TimeRange; comparison: TimeRange }; searchString?: Query['query']; searchQueryLanguage?: SearchQueryLanguage; } = { lastRefresh: 0 } @@ -576,6 +628,13 @@ export const useFetchDataComparisonResult = ( const [loaded, setLoaded] = useState(0); const [progressMessage, setProgressMessage] = useState(); const abortController = useRef(new AbortController()); + const { + uiSettings, + data: { query: queryManager }, + } = useDataVisualizerKibana().services; + + const { reference: referenceStateManager, comparison: comparisonStateManager } = + useDataDriftStateManagerContext(); const cancelRequest = useCallback(() => { abortController.current.abort(); @@ -588,9 +647,12 @@ export const useFetchDataComparisonResult = ( useEffect( () => { const doFetchEsRequest = async function () { - if (!randomSampler) return; + const randomSampler = referenceStateManager.randomSampler; + const randomSamplerProd = comparisonStateManager.randomSampler; + if (!randomSampler || !randomSamplerProd) return; const randomSamplerWrapper = randomSampler.createRandomSamplerWrapper(); + const prodRandomSamplerWrapper = randomSamplerProd.createRandomSamplerWrapper(); setLoaded(0); setResult({ @@ -600,7 +662,7 @@ export const useFetchDataComparisonResult = ( }); setProgressMessage( - i18n.translate('xpack.dataVisualizer.dataComparison.progress.started', { + i18n.translate('xpack.dataVisualizer.dataDrift.progress.started', { defaultMessage: `Ready to fetch data for comparison.`, }) ); @@ -611,19 +673,35 @@ export const useFetchDataComparisonResult = ( setResult({ data: undefined, status: FETCH_STATUS.LOADING, error: undefined }); // Place holder for when there might be difference data views in the future - const referenceIndex = currentDataView?.getIndexPattern(); - const productionIndex = referenceIndex; + const referenceIndex = initialSettings + ? initialSettings.reference + : currentDataView?.getIndexPattern(); + const comparisonIndex = initialSettings ? initialSettings.comparison : referenceIndex; const runtimeFields = currentDataView?.getRuntimeMappings(); setProgressMessage( - i18n.translate('xpack.dataVisualizer.dataComparison.progress.loadedFields', { + i18n.translate('xpack.dataVisualizer.dataDrift.progress.loadedFields', { defaultMessage: `Loaded fields from index '{referenceIndex}' to analyze.`, values: { referenceIndex }, }) ); + + const kqlQuery = + searchString !== undefined && searchQueryLanguage !== undefined + ? { query: searchString, language: searchQueryLanguage } + : undefined; + const refDataQuery = getDataComparisonQuery({ - searchQuery, + searchQuery: createMergedEsQuery( + kqlQuery, + mapAndFlattenFilters([ + ...queryManager.filterManager.getFilters(), + ...(referenceStateManager.filters ?? []), + ]), + currentDataView, + uiSettings + ), datetimeField: currentDataView?.timeFieldName, runtimeFields, timeRange: timeRanges?.reference, @@ -633,7 +711,7 @@ export const useFetchDataComparisonResult = ( const fieldsCount = fields.length; setProgressMessage( - i18n.translate('xpack.dataVisualizer.dataComparison.progress.loadingReference', { + i18n.translate('xpack.dataVisualizer.dataDrift.progress.loadingReference', { defaultMessage: `Loading reference data for {fieldsCount} fields.`, values: { fieldsCount }, }) @@ -673,45 +751,54 @@ export const useFetchDataComparisonResult = ( } setProgressMessage( - i18n.translate('xpack.dataVisualizer.dataComparison.progress.loadedReference', { + i18n.translate('xpack.dataVisualizer.dataDrift.progress.loadedReference', { defaultMessage: `Loaded reference data.`, }) ); setLoaded(0.25); const prodDataQuery = getDataComparisonQuery({ - searchQuery, + searchQuery: createMergedEsQuery( + kqlQuery, + mapAndFlattenFilters([ + ...queryManager.filterManager.getFilters(), + ...(comparisonStateManager.filters ?? []), + ]), + currentDataView, + uiSettings + ), datetimeField: currentDataView?.timeFieldName, runtimeFields, - timeRange: timeRanges?.production, + timeRange: timeRanges?.comparison, }); setProgressMessage( - i18n.translate('xpack.dataVisualizer.dataComparison.progress.loadingComparison', { + i18n.translate('xpack.dataVisualizer.dataDrift.progress.loadingComparison', { defaultMessage: `Loading comparison data for {fieldsCount} fields.`, values: { fieldsCount }, }) ); const driftedRequest: EsRequestParams = { - index: productionIndex, + index: comparisonIndex, body: { size: 0, aggs: {} as Record, ...prodDataQuery, }, }; + const driftedRespAggs = await fetchInParallelChunks({ fields, - randomSamplerWrapper, + randomSamplerWrapper: prodRandomSamplerWrapper, - asyncFetchFn: (chunkedFields: DataComparisonField[]) => + asyncFetchFn: (chunkedFields: DataDriftField[]) => fetchComparisonDriftedData({ dataSearch, baseRequest: driftedRequest, baselineResponseAggs, fields: chunkedFields, - randomSamplerWrapper, + randomSamplerWrapper: prodRandomSamplerWrapper, signal, }), }); @@ -727,7 +814,7 @@ export const useFetchDataComparisonResult = ( setLoaded(0.5); setProgressMessage( - i18n.translate('xpack.dataVisualizer.dataComparison.progress.loadedComparison', { + i18n.translate('xpack.dataVisualizer.dataDrift.progress.loadedComparison', { defaultMessage: `Loaded comparison data. Now loading histogram data.`, }) ); @@ -745,7 +832,7 @@ export const useFetchDataComparisonResult = ( fields, randomSamplerWrapper, - asyncFetchFn: (chunkedFields: DataComparisonField[]) => + asyncFetchFn: (chunkedFields: DataDriftField[]) => fetchHistogramData({ dataSearch, baseRequest: referenceHistogramRequest, @@ -769,16 +856,13 @@ export const useFetchDataComparisonResult = ( setLoaded(0.75); setProgressMessage( - i18n.translate( - 'xpack.dataVisualizer.dataComparison.progress.loadedReferenceHistogram', - { - defaultMessage: `Loaded histogram data for reference data set.`, - } - ) + i18n.translate('xpack.dataVisualizer.dataDrift.progress.loadedReferenceHistogram', { + defaultMessage: `Loaded histogram data for reference data set.`, + }) ); - const productionHistogramRequest: EsRequestParams = { - index: productionIndex, + const comparisonHistogramRequest: EsRequestParams = { + index: comparisonIndex, body: { size: 0, aggs: {} as Record, @@ -786,14 +870,14 @@ export const useFetchDataComparisonResult = ( }, }; - const productionHistogramRespAggs = await fetchInParallelChunks({ + const comparisonHistogramRespAggs = await fetchInParallelChunks({ fields, randomSamplerWrapper, - asyncFetchFn: (chunkedFields: DataComparisonField[]) => + asyncFetchFn: (chunkedFields: DataDriftField[]) => fetchHistogramData({ dataSearch, - baseRequest: productionHistogramRequest, + baseRequest: comparisonHistogramRequest, baselineResponseAggs, driftedRespAggs, fields: chunkedFields, @@ -802,12 +886,12 @@ export const useFetchDataComparisonResult = ( }), }); - if (isReturnedError(productionHistogramRespAggs)) { + if (isReturnedError(comparisonHistogramRespAggs)) { setResult({ data: undefined, status: FETCH_STATUS.FAILURE, - error: productionHistogramRespAggs.error, - errorBody: productionHistogramRespAggs.errorBody, + error: comparisonHistogramRespAggs.error, + errorBody: comparisonHistogramRespAggs.errorBody, }); return; } @@ -818,14 +902,14 @@ export const useFetchDataComparisonResult = ( type === DATA_COMPARISON_TYPE.NUMERIC && driftedRespAggs[`${field}_ks_test`] && referenceHistogramRespAggs[`${field}_histogram`] && - productionHistogramRespAggs[`${field}_histogram`] + comparisonHistogramRespAggs[`${field}_histogram`] ) { data[field] = { secondaryType, type: DATA_COMPARISON_TYPE.NUMERIC, pValue: driftedRespAggs[`${field}_ks_test`].two_sided, referenceHistogram: referenceHistogramRespAggs[`${field}_histogram`].buckets, - productionHistogram: productionHistogramRespAggs[`${field}_histogram`].buckets, + comparisonHistogram: comparisonHistogramRespAggs[`${field}_histogram`].buckets, }; } if ( @@ -846,7 +930,7 @@ export const useFetchDataComparisonResult = ( } setProgressMessage( - i18n.translate('xpack.dataVisualizer.dataComparison.progress.loadedHistogramData', { + i18n.translate('xpack.dataVisualizer.dataDrift.progress.loadedHistogramData', { defaultMessage: `Loaded histogram data for comparison data set.`, }) ); @@ -862,7 +946,7 @@ export const useFetchDataComparisonResult = ( setResult({ data: undefined, status: FETCH_STATUS.FAILURE, - error: 'An error occurred while fetching data comparison data', + error: 'An error occurred while fetching data drift data', errorBody: extractErrorMessage(e), }); } @@ -872,6 +956,8 @@ export const useFetchDataComparisonResult = ( }, // eslint-disable-next-line react-hooks/exhaustive-deps [ + referenceStateManager, + comparisonStateManager, dataSearch, // eslint-disable-next-line react-hooks/exhaustive-deps JSON.stringify({ diff --git a/x-pack/plugins/data_visualizer/public/application/data_drift/use_state_manager.ts b/x-pack/plugins/data_visualizer/public/application/data_drift/use_state_manager.ts new file mode 100644 index 0000000000000..e6536e130e982 --- /dev/null +++ b/x-pack/plugins/data_visualizer/public/application/data_drift/use_state_manager.ts @@ -0,0 +1,84 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 { createContext, useContext, useState } from 'react'; +import { DataView } from '@kbn/data-views-plugin/common'; +import type { Filter } from '@kbn/es-query'; +import * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import type { SearchQueryLanguage } from '@kbn/ml-query-utils'; +import { RandomSampler } from '@kbn/ml-random-sampler-utils'; + +export const defaultSearchQuery = { + match_all: {}, +}; + +interface StateManagerInitialParams { + id: string; + indexPattern: string; + searchString: string; + searchQuery: estypes.QueryDslQueryContainer; + searchQueryLanguage: SearchQueryLanguage; + filters: Filter[]; + timeField?: string; +} + +export const DataDriftStateManagerContext = createContext<{ + dataView: DataView; + reference: DataDriftStateManager; + comparison: DataDriftStateManager; +}>({ + get dataView(): never { + throw new Error('DataDriftStateManagerContext is not implemented'); + }, + get reference(): never { + throw new Error('reference is not implemented'); + }, + get comparison(): never { + throw new Error('comparison is not implemented'); + }, +}); + +export type DataDriftStateManager = ReturnType; + +export const useDataDriftStateManager = ({ + id, + indexPattern: initialIndexPattern, + searchString: initialSearchString, + searchQuery: initialSearchQuery, + searchQueryLanguage: initialSearchQueryLanguage, + filters: initialFilters, + timeField: initialTimeField, +}: StateManagerInitialParams) => { + const [query, setQuery] = useState(initialSearchQuery); + const [indexPattern, setIndexPattern] = useState(initialIndexPattern); + const [searchString, setSearchString] = useState(initialSearchString); + const [searchQueryLanguage, setSearchQueryLanguage] = useState(initialSearchQueryLanguage); + const [filters, setFilters] = useState(initialFilters); + const [timeField, setTimeField] = useState(initialTimeField); + const [randomSampler] = useState(new RandomSampler()); + + return { + id, + query, + setQuery, + indexPattern, + setIndexPattern, + searchString, + setSearchString, + searchQueryLanguage, + setSearchQueryLanguage, + filters, + setFilters, + timeField, + setTimeField, + randomSampler, + }; +}; + +export function useDataDriftStateManagerContext() { + return useContext(DataDriftStateManagerContext); +} diff --git a/x-pack/plugins/data_visualizer/public/application/index.ts b/x-pack/plugins/data_visualizer/public/application/index.ts index 8a89702d5ea95..d2bf7ed6a8f0e 100644 --- a/x-pack/plugins/data_visualizer/public/application/index.ts +++ b/x-pack/plugins/data_visualizer/public/application/index.ts @@ -12,4 +12,4 @@ export type { IndexDataVisualizerViewProps, } from './index_data_visualizer'; export { IndexDataVisualizer } from './index_data_visualizer'; -export type { DataComparisonSpec } from './data_comparison'; +export type { DataDriftSpec } from './data_drift'; diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/index_data_visualizer_view/index_data_visualizer_view.tsx b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/index_data_visualizer_view/index_data_visualizer_view.tsx index 256d77fec965b..d752cb4b166f5 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/index_data_visualizer_view/index_data_visualizer_view.tsx +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/index_data_visualizer_view/index_data_visualizer_view.tsx @@ -21,7 +21,7 @@ import { EuiTitle, } from '@elastic/eui'; -import { Filter, FilterStateStore, Query } from '@kbn/es-query'; +import { type Filter, FilterStateStore, type Query } from '@kbn/es-query'; import { generateFilters } from '@kbn/data-plugin/public'; import { DataView, DataViewField } from '@kbn/data-views-plugin/public'; import { usePageUrlState, useUrlState } from '@kbn/ml-url-state'; @@ -33,7 +33,7 @@ import { import { useStorage } from '@kbn/ml-local-storage'; import type { SavedSearch } from '@kbn/saved-search-plugin/public'; -import { SEARCH_QUERY_LANGUAGE, SearchQueryLanguage } from '@kbn/ml-query-utils'; +import { SEARCH_QUERY_LANGUAGE, type SearchQueryLanguage } from '@kbn/ml-query-utils'; import { kbnTypeToSupportedType } from '../../../common/util/field_types_utils'; import { useCurrentEuiTheme } from '../../../common/hooks/use_current_eui_theme'; import { diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/search_panel/search_bar.tsx b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/search_panel/search_bar.tsx index 9819d3f9d9e91..3ad691bbe11ce 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/search_panel/search_bar.tsx +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/search_panel/search_bar.tsx @@ -5,12 +5,12 @@ * 2.0. */ -import { Filter, Query, TimeRange } from '@kbn/es-query'; +import type { Filter, Query, TimeRange } from '@kbn/es-query'; import { i18n } from '@kbn/i18n'; import React, { useEffect, useState } from 'react'; import { isDefined } from '@kbn/ml-is-defined'; import { DataView } from '@kbn/data-views-plugin/common'; -import { SearchQueryLanguage } from '@kbn/ml-query-utils'; +import type { SearchQueryLanguage } from '@kbn/ml-query-utils'; import { createMergedEsQuery } from '../../utils/saved_search_utils'; import { useDataVisualizerKibana } from '../../../kibana_context'; diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/locator/locator.ts b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/locator/locator.ts index 6d2fffd09ac3b..ecba601a40a07 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/locator/locator.ts +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/locator/locator.ts @@ -6,8 +6,8 @@ */ import { encode } from '@kbn/rison'; import { stringify } from 'query-string'; -import { SerializableRecord } from '@kbn/utility-types'; -import { Filter, TimeRange } from '@kbn/es-query'; +import type { SerializableRecord } from '@kbn/utility-types'; +import type { Filter, TimeRange } from '@kbn/es-query'; import type { RefreshInterval } from '@kbn/data-plugin/common'; import { LocatorDefinition, LocatorPublic } from '@kbn/share-plugin/common'; import { GlobalQueryStateFromUrl } from '@kbn/data-plugin/public'; diff --git a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/utils/saved_search_utils.ts b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/utils/saved_search_utils.ts index 6961c5d822a67..04bc52bf08057 100644 --- a/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/utils/saved_search_utils.ts +++ b/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/utils/saved_search_utils.ts @@ -100,6 +100,7 @@ export function createMergedEsQuery( uiSettings ? getEsQueryConfig(uiSettings) : undefined ); } + return combinedQuery; } diff --git a/x-pack/plugins/data_visualizer/public/index.ts b/x-pack/plugins/data_visualizer/public/index.ts index 1312419797bb1..b17e0a4347418 100644 --- a/x-pack/plugins/data_visualizer/public/index.ts +++ b/x-pack/plugins/data_visualizer/public/index.ts @@ -17,7 +17,7 @@ export type { FileDataVisualizerSpec, IndexDataVisualizerSpec, IndexDataVisualizerViewProps, - DataComparisonSpec, + DataDriftSpec, } from './application'; export type { GetAdditionalLinksParams, diff --git a/x-pack/plugins/data_visualizer/public/lazy_load_bundle/component_wrapper.tsx b/x-pack/plugins/data_visualizer/public/lazy_load_bundle/component_wrapper.tsx index cbd897ac20811..6902ef121b9b6 100644 --- a/x-pack/plugins/data_visualizer/public/lazy_load_bundle/component_wrapper.tsx +++ b/x-pack/plugins/data_visualizer/public/lazy_load_bundle/component_wrapper.tsx @@ -7,7 +7,7 @@ import React, { FC, Suspense } from 'react'; import { EuiErrorBoundary, EuiSkeletonText } from '@elastic/eui'; -import type { DataComparisonDetectionAppStateProps } from '../application/data_comparison/data_comparison_app_state'; +import type { DataDriftDetectionAppStateProps } from '../application/data_drift/data_drift_app_state'; const LazyWrapper: FC = ({ children }) => ( @@ -27,14 +27,14 @@ export const FileDataVisualizerWrapper: FC = () => { ); }; -const DataComparisonLazy = React.lazy(() => import('../application/data_comparison')); +const DataDriftLazy = React.lazy(() => import('../application/data_drift')); /** * Lazy-wrapped ExplainLogRateSpikesAppState React component - * @param {ExplainLogRateSpikesAppStateProps} props - properties specifying the data on which to run the analysis. + * @param {DataDriftDetectionAppStateProps} props - properties specifying the data on which to run the analysis. */ -export const DataComparison: FC = (props) => ( +export const DataDrift: FC = (props) => ( - + ); diff --git a/x-pack/plugins/data_visualizer/public/lazy_load_bundle/index.ts b/x-pack/plugins/data_visualizer/public/lazy_load_bundle/index.ts index ba7cb83f78403..4d0cee4447c13 100644 --- a/x-pack/plugins/data_visualizer/public/lazy_load_bundle/index.ts +++ b/x-pack/plugins/data_visualizer/public/lazy_load_bundle/index.ts @@ -7,7 +7,7 @@ import { HttpSetup } from '@kbn/core/public'; import type { - DataComparisonSpec, + DataDriftSpec, FileDataVisualizerSpec, IndexDataVisualizerSpec, } from '../application'; @@ -18,7 +18,7 @@ let loadModulesPromise: Promise; interface LazyLoadedModules { FileDataVisualizer: FileDataVisualizerSpec; IndexDataVisualizer: IndexDataVisualizerSpec; - DataComparison: DataComparisonSpec; + DataDrift: DataDriftSpec; getHttp: () => HttpSetup; } diff --git a/x-pack/plugins/data_visualizer/public/lazy_load_bundle/lazy/index.tsx b/x-pack/plugins/data_visualizer/public/lazy_load_bundle/lazy/index.tsx index 181e15edc5fd3..efb9b7ba1bae1 100644 --- a/x-pack/plugins/data_visualizer/public/lazy_load_bundle/lazy/index.tsx +++ b/x-pack/plugins/data_visualizer/public/lazy_load_bundle/lazy/index.tsx @@ -7,4 +7,4 @@ export type { FileDataVisualizerSpec, IndexDataVisualizerSpec } from '../../application'; export { FileDataVisualizer, IndexDataVisualizer } from '../../application'; -export { DataComparison } from '../component_wrapper'; +export { DataDrift } from '../component_wrapper'; diff --git a/x-pack/plugins/data_visualizer/public/plugin.ts b/x-pack/plugins/data_visualizer/public/plugin.ts index 05b06c484322a..e2c259726ea4d 100644 --- a/x-pack/plugins/data_visualizer/public/plugin.ts +++ b/x-pack/plugins/data_visualizer/public/plugin.ts @@ -25,7 +25,7 @@ import type { IndexPatternFieldEditorStart } from '@kbn/data-view-field-editor-p import { FieldFormatsStart } from '@kbn/field-formats-plugin/public'; import type { UiActionsStart } from '@kbn/ui-actions-plugin/public'; import { - getDataComparisonComponent, + getDataDriftComponent, getFileDataVisualizerComponent, getIndexDataVisualizerComponent, } from './api'; @@ -90,7 +90,7 @@ export class DataVisualizerPlugin return { getFileDataVisualizerComponent, getIndexDataVisualizerComponent, - getDataComparisonComponent, + getDataDriftComponent, getMaxBytesFormatted, }; } diff --git a/x-pack/plugins/ml/common/constants/locator.ts b/x-pack/plugins/ml/common/constants/locator.ts index 8f3b0ac23ee29..92c89c5aedf94 100644 --- a/x-pack/plugins/ml/common/constants/locator.ts +++ b/x-pack/plugins/ml/common/constants/locator.ts @@ -15,8 +15,9 @@ export const ML_PAGES = { DATA_FRAME_ANALYTICS_SOURCE_SELECTION: 'data_frame_analytics/source_selection', DATA_FRAME_ANALYTICS_CREATE_JOB: 'data_frame_analytics/new_job', TRAINED_MODELS_MANAGE: 'trained_models', - DATA_COMPARISON_INDEX_SELECT: 'data_comparison_index_select', - DATA_COMPARISON: 'data_comparison', + DATA_DRIFT_INDEX_SELECT: 'data_drift_index_select', + DATA_DRIFT_CUSTOM: 'data_drift_custom', + DATA_DRIFT: 'data_drift', NODES: 'nodes', MEMORY_USAGE: 'memory_usage', DATA_FRAME_ANALYTICS_EXPLORATION: 'data_frame_analytics/exploration', diff --git a/x-pack/plugins/ml/common/types/locator.ts b/x-pack/plugins/ml/common/types/locator.ts index 31de127c56044..329ba59ba9073 100644 --- a/x-pack/plugins/ml/common/types/locator.ts +++ b/x-pack/plugins/ml/common/types/locator.ts @@ -58,8 +58,9 @@ export type MlGenericUrlState = MLPageState< | typeof ML_PAGES.FILTER_LISTS_MANAGE | typeof ML_PAGES.FILTER_LISTS_NEW | typeof ML_PAGES.SETTINGS - | typeof ML_PAGES.DATA_COMPARISON - | typeof ML_PAGES.DATA_COMPARISON_INDEX_SELECT + | typeof ML_PAGES.DATA_DRIFT_CUSTOM + | typeof ML_PAGES.DATA_DRIFT_INDEX_SELECT + | typeof ML_PAGES.DATA_DRIFT | typeof ML_PAGES.DATA_VISUALIZER | typeof ML_PAGES.DATA_VISUALIZER_FILE | typeof ML_PAGES.DATA_VISUALIZER_INDEX_SELECT diff --git a/x-pack/plugins/ml/common/types/trained_models.ts b/x-pack/plugins/ml/common/types/trained_models.ts index 0b636b70071dc..70f588712c351 100644 --- a/x-pack/plugins/ml/common/types/trained_models.ts +++ b/x-pack/plugins/ml/common/types/trained_models.ts @@ -11,6 +11,7 @@ import type { FeatureImportanceBaseline, TotalFeatureImportance, } from '@kbn/ml-data-frame-analytics-utils'; +import { IndexName, IndicesIndexState } from '@elastic/elasticsearch/lib/api/types'; import type { XOR } from './common'; import type { MlSavedObjectType } from './saved_objects'; @@ -110,6 +111,7 @@ export type TrainedModelConfigResponse = estypes.MlTrainedModelConfig & { tags: string[]; version: string; inference_config?: Record; + indices?: Array>; }; export interface PipelineDefinition { diff --git a/x-pack/plugins/ml/kibana.jsonc b/x-pack/plugins/ml/kibana.jsonc index e2b327009f66a..e3afdf35d0c4f 100644 --- a/x-pack/plugins/ml/kibana.jsonc +++ b/x-pack/plugins/ml/kibana.jsonc @@ -13,6 +13,7 @@ "charts", "cloud", "data", + "dataViewEditor", "dataViews", "dataVisualizer", "discover", diff --git a/x-pack/plugins/ml/public/application/app.tsx b/x-pack/plugins/ml/public/application/app.tsx index a5993f99e4a9c..5acc519f242a7 100644 --- a/x-pack/plugins/ml/public/application/app.tsx +++ b/x-pack/plugins/ml/public/application/app.tsx @@ -91,6 +91,7 @@ const App: FC = ({ coreStart, deps, appMountParams, isServerless }) => embeddable: deps.embeddable, maps: deps.maps, triggersActionsUi: deps.triggersActionsUi, + dataViewEditor: deps.dataViewEditor, dataVisualizer: deps.dataVisualizer, usageCollection: deps.usageCollection, fieldFormats: deps.fieldFormats, diff --git a/x-pack/plugins/ml/public/application/components/ml_page/side_nav.tsx b/x-pack/plugins/ml/public/application/components/ml_page/side_nav.tsx index 94b58758135c6..dda32fbaf8af7 100644 --- a/x-pack/plugins/ml/public/application/components/ml_page/side_nav.tsx +++ b/x-pack/plugins/ml/public/application/components/ml_page/side_nav.tsx @@ -235,13 +235,13 @@ export function useSideNavItems(activeRoute: MlRoute | undefined) { testSubj: 'mlMainTab indexDataVisualizer', }, { - id: 'data_comparison', - pathId: ML_PAGES.DATA_COMPARISON_INDEX_SELECT, + id: 'data_drift', + pathId: ML_PAGES.DATA_DRIFT_INDEX_SELECT, name: i18n.translate('xpack.ml.navMenu.dataComparisonText', { - defaultMessage: 'Data Comparison', + defaultMessage: 'Data Drift', }), disabled: disableLinks, - testSubj: 'mlMainTab dataComparison', + testSubj: 'mlMainTab dataDrift', }, ], }, diff --git a/x-pack/plugins/ml/public/application/contexts/kibana/kibana_context.ts b/x-pack/plugins/ml/public/application/contexts/kibana/kibana_context.ts index 852a8b8699512..f9bd1fe2315b3 100644 --- a/x-pack/plugins/ml/public/application/contexts/kibana/kibana_context.ts +++ b/x-pack/plugins/ml/public/application/contexts/kibana/kibana_context.ts @@ -29,11 +29,13 @@ import type { SavedObjectsManagementPluginStart } from '@kbn/saved-objects-manag import type { ContentManagementPublicStart } from '@kbn/content-management-plugin/public'; import type { SavedSearchPublicPluginStart } from '@kbn/saved-search-plugin/public'; import type { PresentationUtilPluginStart } from '@kbn/presentation-util-plugin/public'; +import { DataViewEditorStart } from '@kbn/data-view-editor-plugin/public'; import type { MlServicesContext } from '../../app'; interface StartPlugins { data: DataPublicPluginStart; dataViews: DataViewsPublicPluginStart; + dataViewEditor: DataViewEditorStart; security?: SecurityPluginSetup; licenseManagement?: LicenseManagementUIPluginSetup; share: SharePluginStart; diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/components/controls.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/components/controls.tsx index 74356242ae8aa..1df5180934fc4 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/components/controls.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/components/controls.tsx @@ -171,6 +171,15 @@ export const Controls: FC = React.memo( // eslint-disable-next-line react-hooks/exhaustive-deps }, [share.url.locators, nodeLabel]); + const onAnalyzeDataDrift = useCallback(async () => { + closePopover(); + const path = await mlLocator.getUrl({ + page: ML_PAGES.DATA_DRIFT_CUSTOM, + pageState: { comparison: nodeLabel }, + }); + await navigateToPath(path); + }, [nodeLabel, navigateToPath, mlLocator]); + const onCloneJobClick = useCallback(async () => { navigateToWizardWithClonedJob({ config: details[nodeId], stats: details[nodeId]?.stats }); // eslint-disable-next-line react-hooks/exhaustive-deps @@ -263,6 +272,21 @@ export const Controls: FC = React.memo( , ] : []), + ...(nodeType === JOB_MAP_NODE_TYPES.INDEX + ? [ + + + , + ] + : []), ...(nodeType === JOB_MAP_NODE_TYPES.INDEX ? [ { + // If it's not a letter, number or is something longer, reject it + if (!keyPressed || !/[a-z0-9]/i.test(keyPressed) || keyPressed.length !== 1) { + return false; + } + return true; +}; + +type DataViewEditorServiceSpec = DataViewEditorService; +const getDefaultIndexPattern = (referenceIndexPattern: string, comparisonIndexPattern: string) => + referenceIndexPattern === comparisonIndexPattern + ? referenceIndexPattern + : `${referenceIndexPattern},${comparisonIndexPattern}`; + +export function DataDriftIndexPatternsEditor({ + referenceDataViewEditorService, + comparisonDataViewEditorService, + initialReferenceIndexPattern, + initialComparisonIndexPattern, +}: { + referenceDataViewEditorService: DataViewEditorServiceSpec; + comparisonDataViewEditorService: DataViewEditorServiceSpec; + initialReferenceIndexPattern?: string; + initialComparisonIndexPattern?: string; +}) { + const { + services: { + dataViewEditor, + data: { dataViews }, + }, + } = useMlKibana(); + const locator = useMlLocator()!; + const canEditDataView = dataViewEditor?.userPermissions.editDataView(); + const [timeField, setTimeField] = useState>>([]); + const [dataViewName, setDataViewName] = useState(''); + const [dataViewMsg, setDataViewMsg] = useState(); + const [foundDataViewId, setFoundDataViewId] = useState(); + const [refError, setRefError] = useState(); + const [comparisonError, setComparisonError] = useState(); + const toastNotificationService = useToastNotificationService(); + + // For the purpose of data drift, the two datasets need to have the same common timestamp field if they exist + // In data view management, creating a data view provides union of all the timestamp fields + // Here, we need the intersection of two sets instead + const combinedTimeFieldOptions$: Observable>> = + useMemo(() => { + return combineLatest([ + referenceDataViewEditorService?.timestampFieldOptions$, + comparisonDataViewEditorService?.timestampFieldOptions$, + ]).pipe( + map(([referenceTimeFieldOptions, productionTimeFieldOptions]) => { + const intersectedTimeFields = intersectionBy( + referenceTimeFieldOptions, + productionTimeFieldOptions, + (d) => d.fieldName + ).map(({ display, fieldName }) => ({ + label: display, + value: fieldName, + })); + + return intersectedTimeFields; + }) + ); + }, [comparisonDataViewEditorService, referenceDataViewEditorService]); + + const combinedTimeFieldOptions = useObservable(combinedTimeFieldOptions$, []); + + const [referenceIndexPattern, setReferenceIndexPattern] = useState( + initialReferenceIndexPattern ?? '' + ); + const [comparisonIndexPattern, setComparisonIndexPattern] = useState( + initialComparisonIndexPattern ?? '' + ); + + const navigateToPath = useNavigateToPath(); + const abortCtrl = useRef(new AbortController()); + + useEffect(() => { + let unmounted = false; + + if ( + !unmounted && + Array.isArray(combinedTimeFieldOptions) && + combinedTimeFieldOptions.length > 0 && + timeField.length === 0 + ) { + setTimeField([combinedTimeFieldOptions[0]]); + } + + return () => { + unmounted = true; + }; + }, [combinedTimeFieldOptions, timeField]); + + useEffect( + function validateMatchingDataViews() { + let unmounted = false; + const getMatchingDataView = async () => { + abortCtrl.current.abort(); + abortCtrl.current = new AbortController(); + + setDataViewMsg(undefined); + setFoundDataViewId(undefined); + if (!unmounted && referenceIndexPattern && comparisonIndexPattern) { + const indicesName = getDefaultIndexPattern(referenceIndexPattern, comparisonIndexPattern); + + const matchingDataViews = await dataViews.find(indicesName); + + const timeFieldName = + Array.isArray(timeField) && timeField.length > 0 && timeField[0].value !== '' + ? timeField[0].value + : undefined; + + if (Array.isArray(matchingDataViews) && matchingDataViews.length > 0) { + const foundDataView = matchingDataViews.find((d) => { + return d.timeFieldName === timeFieldName; + }); + + if (foundDataView) { + setFoundDataViewId(foundDataView.id); + } else { + setDataViewMsg( + i18n.translate( + 'xpack.ml.dataDrift.indexPatternsEditor.hasDataViewWithDifferentTimeField', + { + defaultMessage: `Found a data view matching pattern '{indexPattern}' but with a different time field. Creating a new data view to analyze data drift.`, + values: { indexPattern: indicesName }, + } + ) + ); + } + } + } + }; + + getMatchingDataView(); + + return () => { + abortCtrl.current?.abort(); + unmounted = true; + }; + }, + [referenceIndexPattern, comparisonIndexPattern, timeField, dataViews] + ); + const createDataViewAndRedirectToDataDriftPage = debounce(async (createAdHocDV = false) => { + // Create adhoc data view + const indicesName = getDefaultIndexPattern(referenceIndexPattern, comparisonIndexPattern); + + const timeFieldName = + Array.isArray(timeField) && timeField.length > 0 ? timeField[0].value : undefined; + + let dataView; + + try { + if (!foundDataViewId) { + const defaultDataViewName = + dataViewMsg === undefined + ? indicesName + : `${indicesName}${timeFieldName ? '-' + timeFieldName : ''}`; + + const modifiedDataViewName = dataViewName === '' ? defaultDataViewName : dataViewName; + if (canEditDataView && createAdHocDV === false) { + dataView = await dataViews.createAndSave({ + title: indicesName, + name: modifiedDataViewName, + timeFieldName, + }); + } else { + dataView = await dataViews.create({ + title: indicesName, + name: modifiedDataViewName, + timeFieldName, + }); + } + } + const dataViewId = foundDataViewId ?? dataView?.id; + const url = await locator.getUrl({ + page: ML_PAGES.DATA_DRIFT, + pageState: { + index: dataViewId, + reference: encodeURIComponent(referenceIndexPattern), + comparison: encodeURIComponent(comparisonIndexPattern), + timeFieldName, + }, + }); + + await navigateToPath(url); + } catch (e) { + toastNotificationService.displayErrorToast(e); + } + }, 400); + + const hasError = + refError !== undefined || + comparisonError !== undefined || + !comparisonIndexPattern || + !referenceIndexPattern; + + const firstSetOfSteps = [ + { + title: i18n.translate('xpack.ml.dataDrift.indexPatternsEditor.enterReferenceDataTitle', { + defaultMessage: 'Enter index pattern for reference data', + }), + children: ( + + + } + helpText={ + + } + dataViewEditorService={referenceDataViewEditorService} + indexPattern={referenceIndexPattern} + setIndexPattern={setReferenceIndexPattern} + onError={setRefError} + /> + + ), + }, + { + title: i18n.translate('xpack.ml.dataDrift.indexPatternsEditor.enterComparisonDataTitle', { + defaultMessage: 'Enter index pattern for comparison data', + }), + children: ( + + + } + helpText={ + + } + dataViewEditorService={comparisonDataViewEditorService} + indexPattern={comparisonIndexPattern} + setIndexPattern={setComparisonIndexPattern} + onError={setComparisonError} + /> + + ), + }, + { + title: i18n.translate('xpack.ml.dataDrift.indexPatternsEditor.additionalSettingsTitle', { + defaultMessage: 'Additional settings', + }), + children: ( + + {combinedTimeFieldOptions.length > 0 ? ( + + <> + + placeholder={i18n.translate( + 'xpack.ml.dataDrift.indexPatternsEditor.timestampFieldOptions', + { + defaultMessage: 'Select an optional timestamp field', + } + )} + singleSelection={{ asPlainText: true }} + options={combinedTimeFieldOptions} + selectedOptions={timeField} + onChange={(newValue) => { + if (newValue.length === 0) { + // Don't allow clearing the type. One must always be selected + return; + } + setTimeField(newValue); + }} + isClearable={false} + isDisabled={comparisonIndexPattern === '' && referenceIndexPattern === ''} + data-test-subj="timestampField" + aria-label={i18n.translate( + 'xpack.ml.dataDrift.indexPatternsEditor.timestampSelectAriaLabel', + { + defaultMessage: 'Timestamp field', + } + )} + fullWidth + /> + + + ) : null} + {!foundDataViewId ? ( + + ) => { + setDataViewName(e.target.value); + }} + fullWidth + data-test-subj="dataDriftDataViewNameInput" + /> + + ) : null} + + {dataViewMsg ? {dataViewMsg} : null} + + + + {canEditDataView && foundDataViewId === undefined ? ( + + + + + + ) : null} + + + + + + + + + + ), + }, + ]; + + return ; +} diff --git a/x-pack/plugins/ml/public/application/datavisualizer/data_comparison/data_comparison_page.tsx b/x-pack/plugins/ml/public/application/datavisualizer/data_drift/data_drift_page.tsx similarity index 69% rename from x-pack/plugins/ml/public/application/datavisualizer/data_comparison/data_comparison_page.tsx rename to x-pack/plugins/ml/public/application/datavisualizer/data_drift/data_drift_page.tsx index 8b016d17cc938..94aa60cb8147a 100644 --- a/x-pack/plugins/ml/public/application/datavisualizer/data_comparison/data_comparison_page.tsx +++ b/x-pack/plugins/ml/public/application/datavisualizer/data_drift/data_drift_page.tsx @@ -8,23 +8,23 @@ import React, { FC, useEffect, useState } from 'react'; import { EuiFlexGroup, EuiFlexItem } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; -import type { DataComparisonSpec } from '@kbn/data-visualizer-plugin/public'; +import type { DataDriftSpec } from '@kbn/data-visualizer-plugin/public'; import { useMlKibana } from '../../contexts/kibana'; import { useDataSource } from '../../contexts/ml'; import { MlPageHeader } from '../../components/page_header'; import { TechnicalPreviewBadge } from '../../components/technical_preview_badge'; -export const DataComparisonPage: FC = () => { +export const DataDriftPage: FC = () => { const { services: { dataVisualizer }, } = useMlKibana(); - const [DataComparisonView, setDataComparisonView] = useState(null); + const [DataDriftView, setDataDriftView] = useState(null); useEffect(() => { if (dataVisualizer !== undefined) { - const { getDataComparisonComponent } = dataVisualizer; - getDataComparisonComponent().then(setDataComparisonView); + const { getDataDriftComponent } = dataVisualizer; + getDataDriftComponent().then(setDataDriftView); } }, [dataVisualizer]); @@ -36,8 +36,8 @@ export const DataComparisonPage: FC = () => { @@ -45,8 +45,8 @@ export const DataComparisonPage: FC = () => { - {dataView && DataComparisonView ? ( - + {dataView && DataDriftView ? ( + ) : null} ); diff --git a/x-pack/plugins/ml/public/application/datavisualizer/data_drift/data_view_editor.tsx b/x-pack/plugins/ml/public/application/datavisualizer/data_drift/data_view_editor.tsx new file mode 100644 index 0000000000000..05a1aaa4ad851 --- /dev/null +++ b/x-pack/plugins/ml/public/application/datavisualizer/data_drift/data_view_editor.tsx @@ -0,0 +1,190 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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 useDebounce from 'react-use/lib/useDebounce'; +import useObservable from 'react-use/lib/useObservable'; +import React, { ChangeEvent, ReactNode, useMemo, useState, useEffect } from 'react'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n-react'; + +import { + EuiBasicTable, + EuiCallOut, + EuiFieldText, + EuiFlexItem, + EuiFormRow, + EuiFlexGrid, + useEuiTheme, +} from '@elastic/eui'; +import type { DataViewEditorService } from '@kbn/data-view-editor-plugin/public'; +import type { MatchedItem } from '@kbn/data-views-plugin/public'; +import { useTableSettings } from '../../data_frame_analytics/pages/analytics_management/components/analytics_list/use_table_settings'; +import { canAppendWildcard, matchedIndicesDefault } from './data_drift_index_patterns_editor'; + +interface DataViewEditorProps { + label: ReactNode; + dataViewEditorService: DataViewEditorService; + indexPattern: string; + setIndexPattern: (ip: string) => void; + onError: (errorMsg?: string) => void; + helpText?: ReactNode; +} + +const mustMatchError = i18n.translate( + 'xpack.ml.dataDrift.indexPatternsEditor.createIndex.noMatch', + { + defaultMessage: 'Name must match one or more data streams, indices, or index aliases.', + } +); + +export function DataViewEditor({ + label, + dataViewEditorService, + indexPattern, + setIndexPattern, + onError, + helpText, +}: DataViewEditorProps) { + useDebounce( + () => { + dataViewEditorService.setIndexPattern(indexPattern); + }, + 250, + [indexPattern] + ); + const matchedIndices = useObservable( + dataViewEditorService.matchedIndices$, + matchedIndicesDefault + ); + + const matchedReferenceIndices = + indexPattern === '' || (indexPattern !== '' && matchedIndices.exactMatchedIndices.length === 0) + ? matchedIndices.allIndices + : matchedIndices.exactMatchedIndices; + const [appendedWildcard, setAppendedWildcard] = useState(false); + + const [pageState, updatePageState] = useState({ + pageIndex: 0, + pageSize: 10, + sortField: 'name', + sortDirection: 'asc', + }); + + const { onTableChange, pagination } = useTableSettings( + matchedReferenceIndices.length, + pageState, + // @ts-expect-error callback will have all the 4 necessary params + updatePageState + ); + + const pageOfItems = useMemo(() => { + return matchedReferenceIndices.slice( + pagination.pageIndex * pagination.pageSize, + (pagination.pageIndex + 1) * pagination.pageSize + ); + }, [pagination.pageSize, pagination.pageIndex, matchedReferenceIndices]); + + const columns = [ + { + field: 'name', + name: i18n.translate('xpack.ml.dataDrift.indexPatternsEditor.tableColShard', { + defaultMessage: 'Matched indices', + }), + sortable: false, + truncateText: false, + }, + ]; + const errorMessage = useMemo(() => { + if (indexPattern === '') + return i18n.translate('xpack.ml.dataDrift.indexPatternsEditor.error.noEmptyIndexPattern', { + defaultMessage: 'Index pattern must not be empty.', + }); + if (indexPattern !== '' && matchedIndices.exactMatchedIndices.length === 0) { + return mustMatchError; + } + return undefined; + }, [indexPattern, matchedIndices.exactMatchedIndices.length]); + + useEffect(() => { + if (onError) { + onError(errorMessage); + } + }, [onError, errorMessage]); + const { euiTheme } = useEuiTheme(); + + return ( + + + + ) => { + let query = e.target.value; + if (query.length === 1 && !appendedWildcard && canAppendWildcard(query)) { + query += '*'; + setAppendedWildcard(true); + setTimeout(() => e.target.setSelectionRange(1, 1)); + } else { + if (['', '*'].includes(query) && appendedWildcard) { + query = ''; + setAppendedWildcard(false); + } + } + setIndexPattern(query); + }} + fullWidth + data-test-subj="createIndexPatternTitleInput" + placeholder="example-pattern*" + /> + + + + {errorMessage === mustMatchError ? ( + + + + + ), + }} + /> + + ) : null} + + items={pageOfItems} + columns={columns} + pagination={pagination} + onChange={onTableChange} + /> + + + ); +} diff --git a/x-pack/plugins/ml/public/application/datavisualizer/data_drift/index_patterns_picker.tsx b/x-pack/plugins/ml/public/application/datavisualizer/data_drift/index_patterns_picker.tsx new file mode 100644 index 0000000000000..1f414d8224578 --- /dev/null +++ b/x-pack/plugins/ml/public/application/datavisualizer/data_drift/index_patterns_picker.tsx @@ -0,0 +1,205 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor 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, { FC, useEffect, useState, useMemo } from 'react'; +import { EuiPageBody, EuiPageSection, EuiButton, EuiPanel } from '@elastic/eui'; +import { parse } from 'query-string'; +import { i18n } from '@kbn/i18n'; +import { FormattedMessage } from '@kbn/i18n-react'; +import { SavedObjectFinder } from '@kbn/saved-objects-finder-plugin/public'; +import { type DataViewEditorService as DataViewEditorServiceSpec } from '@kbn/data-view-editor-plugin/public'; +import { INDEX_PATTERN_TYPE } from '@kbn/data-views-plugin/public'; +import { createPath } from '../../routing/router'; +import { ML_PAGES } from '../../../../common/constants/locator'; +import { DataDriftIndexPatternsEditor } from './data_drift_index_patterns_editor'; + +import { MlPageHeader } from '../../components/page_header'; +import { useMlKibana, useNavigateToPath } from '../../contexts/kibana'; +export const DataDriftIndexOrSearchRedirect: FC = () => { + const navigateToPath = useNavigateToPath(); + const { contentManagement, uiSettings } = useMlKibana().services; + const { + services: { dataViewEditor }, + } = useMlKibana(); + + const nextStepPath = '/data_drift'; + const onObjectSelection = (id: string, type: string) => { + navigateToPath( + `${nextStepPath}?${type === 'index-pattern' ? 'index' : 'savedSearchId'}=${encodeURIComponent( + id + )}` + ); + }; + + const canEditDataView = dataViewEditor?.userPermissions.editDataView(); + + return ( +
+ + + + + + 'search', + name: i18n.translate( + 'xpack.ml.newJob.wizard.searchSelection.savedObjectType.search', + { + defaultMessage: 'Saved search', + } + ), + }, + { + type: 'index-pattern', + getIconForSavedObject: () => 'indexPatternApp', + name: i18n.translate( + 'xpack.ml.newJob.wizard.searchSelection.savedObjectType.dataView', + { + defaultMessage: 'Data view', + } + ), + }, + ]} + fixedPageSize={20} + services={{ + contentClient: contentManagement.client, + uiSettings, + }} + > + navigateToPath(createPath(ML_PAGES.DATA_DRIFT_CUSTOM))} + disabled={!canEditDataView} + > + + + + + +
+ ); +}; + +export const DataDriftIndexPatternsPicker: FC = () => { + const { reference, comparison } = parse(location.search, { + sort: false, + }) as { reference: string; comparison: string }; + + const [dataViewEditorServices, setDataViewEditorServices] = useState< + | { + referenceDataViewEditorService: DataViewEditorServiceSpec; + comparisonDataViewEditorService: DataViewEditorServiceSpec; + } + | undefined + >(); + + const { + services: { + dataViewEditor, + http, + data: { dataViews }, + }, + } = useMlKibana(); + const { dataViewEditorServiceFactory } = dataViewEditor; + + const initialComparisonIndexPattern = useMemo( + () => (comparison ? comparison.replaceAll(`'`, '') : ''), + [comparison] + ); + const initialReferenceIndexPattern = useMemo( + () => (reference ? reference.replaceAll(`'`, '') : ''), + [reference] + ); + + useEffect(() => { + let unmounted = false; + const getDataViewEditorService = async () => { + if (http && dataViews && dataViewEditorServiceFactory) { + const { DataViewEditorService } = await dataViewEditorServiceFactory(); + const referenceDataViewEditorService = new DataViewEditorService({ + // @ts-expect-error Mismatch in DataViewsServicePublic import, but should be same + services: { http, dataViews }, + initialValues: { + name: '', + type: INDEX_PATTERN_TYPE.DEFAULT, + indexPattern: initialReferenceIndexPattern, + }, + requireTimestampField: false, + }); + const comparisonDataViewEditorService = new DataViewEditorService({ + // @ts-expect-error Mismatch in DataViewsServicePublic import, but should be same + services: { http, dataViews }, + initialValues: { + name: '', + type: INDEX_PATTERN_TYPE.DEFAULT, + indexPattern: initialComparisonIndexPattern, + }, + requireTimestampField: false, + }); + if (!unmounted) { + setDataViewEditorServices({ + referenceDataViewEditorService, + comparisonDataViewEditorService, + }); + } + } + }; + getDataViewEditorService(); + + return () => { + unmounted = true; + }; + }, [ + dataViewEditorServiceFactory, + http, + dataViews, + initialReferenceIndexPattern, + initialComparisonIndexPattern, + ]); + + return ( +
+ + + + + + {dataViewEditorServices ? ( + + ) : null} + + +
+ ); +}; diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/index_or_search/page.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/index_or_search/page.tsx index d9c0200961caa..c4b81907e52b9 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/index_or_search/page.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/index_or_search/page.tsx @@ -17,8 +17,9 @@ export interface PageProps { nextStepPath: string; } +const RESULTS_PER_PAGE = 20; + export const Page: FC = ({ nextStepPath }) => { - const RESULTS_PER_PAGE = 20; const { contentManagement, uiSettings } = useMlKibana().services; const navigateToPath = useNavigateToPath(); diff --git a/x-pack/plugins/ml/public/application/model_management/model_actions.tsx b/x-pack/plugins/ml/public/application/model_management/model_actions.tsx index c276dbc8ea921..f10ba782ee9da 100644 --- a/x-pack/plugins/ml/public/application/model_management/model_actions.tsx +++ b/x-pack/plugins/ml/public/application/model_management/model_actions.tsx @@ -540,6 +540,40 @@ export function useModelActions({ return canTestTrainedModels && isTestable(item, true) && !isLoading; }, }, + { + name: i18n.translate('xpack.ml.inference.modelsList.analyzeDataDriftLabel', { + defaultMessage: 'Analyze data drift', + }), + description: i18n.translate('xpack.ml.inference.modelsList.analyzeDataDriftLabel', { + defaultMessage: 'Analyze data drift', + }), + 'data-test-subj': 'mlModelsAnalyzeDataDriftAction', + icon: 'visTagCloud', + type: 'icon', + isPrimary: true, + available: (item) => { + return ( + item?.metadata?.analytics_config !== undefined || + (Array.isArray(item.indices) && item.indices.length > 0) + ); + }, + onClick: async (item) => { + let indexPatterns: string[] | undefined = item?.indices + ?.map((o) => Object.keys(o)) + .flat(); + + if (item?.metadata?.analytics_config?.dest?.index !== undefined) { + const destIndex = item.metadata.analytics_config.dest?.index; + indexPatterns = [destIndex]; + } + const path = await urlLocator.getUrl({ + page: ML_PAGES.DATA_DRIFT_CUSTOM, + pageState: indexPatterns ? { comparison: indexPatterns.join(',') } : {}, + }); + + await navigateToPath(path, false); + }, + }, ], [ urlLocator, diff --git a/x-pack/plugins/ml/public/application/model_management/models_list.tsx b/x-pack/plugins/ml/public/application/model_management/models_list.tsx index 5ddcc2096b914..1ce6fa18fbc3f 100644 --- a/x-pack/plugins/ml/public/application/model_management/models_list.tsx +++ b/x-pack/plugins/ml/public/application/model_management/models_list.tsx @@ -187,6 +187,7 @@ export const ModelsList: FC = ({ try { const response = await trainedModelsApiService.getTrainedModels(undefined, { with_pipelines: true, + with_indices: true, }); const newItems: ModelItem[] = []; diff --git a/x-pack/plugins/ml/public/application/routing/breadcrumbs.ts b/x-pack/plugins/ml/public/application/routing/breadcrumbs.ts index 2824b835f914a..bbb80e11fbe84 100644 --- a/x-pack/plugins/ml/public/application/routing/breadcrumbs.ts +++ b/x-pack/plugins/ml/public/application/routing/breadcrumbs.ts @@ -120,11 +120,11 @@ export const FILTER_LISTS_BREADCRUMB: ChromeBreadcrumb = Object.freeze({ href: '/settings/filter_lists', }); -export const DATA_COMPARISON_BREADCRUMB: ChromeBreadcrumb = Object.freeze({ +export const DATA_DRIFT_BREADCRUMB: ChromeBreadcrumb = Object.freeze({ text: i18n.translate('xpack.ml.settings.breadcrumbs.dataComparisonLabel', { - defaultMessage: 'Data comparison', + defaultMessage: 'Data drift', }), - href: '/data_comparison_index_select', + href: '/data_drift_index_select', }); const breadcrumbs = { @@ -133,7 +133,7 @@ const breadcrumbs = { ANOMALY_DETECTION_BREADCRUMB, DATA_FRAME_ANALYTICS_BREADCRUMB, TRAINED_MODELS, - DATA_COMPARISON_BREADCRUMB, + DATA_DRIFT_BREADCRUMB, DATA_VISUALIZER_BREADCRUMB, AIOPS_BREADCRUMB_LOG_RATE_ANALYSIS, AIOPS_BREADCRUMB_LOG_PATTERN_ANALYSIS, diff --git a/x-pack/plugins/ml/public/application/routing/routes/datavisualizer/data_comparison.tsx b/x-pack/plugins/ml/public/application/routing/routes/datavisualizer/data_comparison.tsx index 46f58318c1b92..5a79c13fc3921 100644 --- a/x-pack/plugins/ml/public/application/routing/routes/datavisualizer/data_comparison.tsx +++ b/x-pack/plugins/ml/public/application/routing/routes/datavisualizer/data_comparison.tsx @@ -7,28 +7,28 @@ import React, { FC } from 'react'; import { i18n } from '@kbn/i18n'; +import { DataDriftPage } from '../../../datavisualizer/data_drift/data_drift_page'; import { DataSourceContextProvider } from '../../../contexts/ml'; -import { DataComparisonPage } from '../../../datavisualizer/data_comparison/data_comparison_page'; import { ML_PAGES } from '../../../../locator'; import { NavigateToPath } from '../../../contexts/kibana'; import { createPath, MlRoute, PageLoader, PageProps } from '../../router'; import { useRouteResolver } from '../../use_resolver'; import { breadcrumbOnClickFactory, - DATA_COMPARISON_BREADCRUMB, + DATA_DRIFT_BREADCRUMB, DATA_VISUALIZER_BREADCRUMB, getBreadcrumbWithUrlForApp, } from '../../breadcrumbs'; import { basicResolvers } from '../../resolvers'; -export const dataComparisonRouteFactory = ( +export const dataDriftRouteFactory = ( navigateToPath: NavigateToPath, basePath: string ): MlRoute => ({ - id: 'data_comparison', - path: createPath(ML_PAGES.DATA_COMPARISON), - title: i18n.translate('xpack.ml.dataVisualizer.dataComparison.docTitle', { - defaultMessage: 'Data Comparison', + id: 'data_drift', + path: createPath(ML_PAGES.DATA_DRIFT), + title: i18n.translate('xpack.ml.dataVisualizer.dataDrift.docTitle', { + defaultMessage: 'Data Drift', }), render: (props, deps) => , breadcrumbs: [ @@ -37,18 +37,18 @@ export const dataComparisonRouteFactory = ( text: DATA_VISUALIZER_BREADCRUMB.text, ...(navigateToPath ? { - href: `${basePath}/app/ml${DATA_COMPARISON_BREADCRUMB.href}`, - onClick: breadcrumbOnClickFactory(DATA_COMPARISON_BREADCRUMB.href, navigateToPath), + href: `${basePath}/app/ml${DATA_DRIFT_BREADCRUMB.href}`, + onClick: breadcrumbOnClickFactory(DATA_DRIFT_BREADCRUMB.href, navigateToPath), } : {}), }, { - text: i18n.translate('xpack.ml.trainedModelsBreadcrumbs.dataComparisonLabel', { - defaultMessage: 'Data Comparison', + text: i18n.translate('xpack.ml.trainedModelsBreadcrumbs.dataDriftLabel', { + defaultMessage: 'Data Drift', }), }, ], - 'data-test-subj': 'mlPageDataComparison', + 'data-test-subj': 'mlPageDataDrift', }); const PageWrapper: FC = () => { @@ -57,7 +57,7 @@ const PageWrapper: FC = () => { return ( - + ); diff --git a/x-pack/plugins/ml/public/application/routing/routes/datavisualizer/data_drift.tsx b/x-pack/plugins/ml/public/application/routing/routes/datavisualizer/data_drift.tsx new file mode 100644 index 0000000000000..df2d9adee8f30 --- /dev/null +++ b/x-pack/plugins/ml/public/application/routing/routes/datavisualizer/data_drift.tsx @@ -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; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { i18n } from '@kbn/i18n'; +import React, { FC } from 'react'; +import { + DataDriftIndexOrSearchRedirect, + DataDriftIndexPatternsPicker, +} from '../../../datavisualizer/data_drift/index_patterns_picker'; +import { NavigateToPath } from '../../../contexts/kibana'; +import { MlRoute } from '../..'; +import { createPath, PageLoader, PageProps } from '../../router'; +import { ML_PAGES } from '../../../../../common/constants/locator'; +import { + breadcrumbOnClickFactory, + DATA_DRIFT_BREADCRUMB, + DATA_VISUALIZER_BREADCRUMB, + getBreadcrumbWithUrlForApp, +} from '../../breadcrumbs'; +import { useRouteResolver } from '../../use_resolver'; +import { basicResolvers } from '../../resolvers'; +import { DataSourceContextProvider } from '../../../contexts/ml'; + +export const dataDriftRouteIndexOrSearchFactory = ( + navigateToPath: NavigateToPath, + basePath: string +): MlRoute => ({ + id: 'data_drift', + path: createPath(ML_PAGES.DATA_DRIFT_INDEX_SELECT), + title: i18n.translate('xpack.ml.dataVisualizer.dataDrift.docTitle', { + defaultMessage: 'Data Drift', + }), + render: (props, deps) => ( + + ), + breadcrumbs: [ + getBreadcrumbWithUrlForApp('ML_BREADCRUMB', navigateToPath, basePath), + { + text: DATA_VISUALIZER_BREADCRUMB.text, + ...(navigateToPath + ? { + href: `${basePath}/app/ml${DATA_DRIFT_BREADCRUMB.href}`, + onClick: breadcrumbOnClickFactory(DATA_DRIFT_BREADCRUMB.href, navigateToPath), + } + : {}), + }, + { + text: i18n.translate('xpack.ml.trainedModelsBreadcrumbs.dataDriftLabel', { + defaultMessage: 'Data Drift', + }), + }, + ], + 'data-test-subj': 'mlPageDataDrift', +}); + +export const dataDriftRouteIndexPatternFactory = ( + navigateToPath: NavigateToPath, + basePath: string +): MlRoute => ({ + id: 'data_drift', + path: createPath(ML_PAGES.DATA_DRIFT_CUSTOM), + title: i18n.translate('xpack.ml.dataVisualizer.dataDriftCustomIndexPatterns.docTitle', { + defaultMessage: 'Data Drift Custom Index Patterns', + }), + render: (props, deps) => , + breadcrumbs: [ + getBreadcrumbWithUrlForApp('ML_BREADCRUMB', navigateToPath, basePath), + { + text: DATA_VISUALIZER_BREADCRUMB.text, + ...(navigateToPath + ? { + href: `${basePath}/app/ml${DATA_DRIFT_BREADCRUMB.href}`, + onClick: breadcrumbOnClickFactory(DATA_DRIFT_BREADCRUMB.href, navigateToPath), + } + : {}), + }, + { + text: i18n.translate('xpack.ml.trainedModelsBreadcrumbs.dataDriftLabel', { + defaultMessage: 'Data Drift', + }), + }, + ], + 'data-test-subj': 'mlPageDataDriftCustomIndexPatterns', +}); + +interface DataDriftPageProps extends PageProps { + mode: 'data_drift_index_select' | 'data_drift_custom'; +} +const PageWrapper: FC = ({ mode }) => { + const { context } = useRouteResolver('full', [], basicResolvers()); + + return ( + + + {mode === ML_PAGES.DATA_DRIFT_INDEX_SELECT ? ( + + ) : ( + + )} + + + ); +}; diff --git a/x-pack/plugins/ml/public/application/routing/routes/datavisualizer/index.ts b/x-pack/plugins/ml/public/application/routing/routes/datavisualizer/index.ts index 560a26007f203..c469f6412d598 100644 --- a/x-pack/plugins/ml/public/application/routing/routes/datavisualizer/index.ts +++ b/x-pack/plugins/ml/public/application/routing/routes/datavisualizer/index.ts @@ -6,5 +6,6 @@ */ export * from './datavisualizer'; +export * from './data_drift'; export * from './index_based'; export * from './file_based'; diff --git a/x-pack/plugins/ml/public/application/routing/routes/new_job/index_or_search.tsx b/x-pack/plugins/ml/public/application/routing/routes/new_job/index_or_search.tsx index cb12cd22ab6c2..24976cffc43d9 100644 --- a/x-pack/plugins/ml/public/application/routing/routes/new_job/index_or_search.tsx +++ b/x-pack/plugins/ml/public/application/routing/routes/new_job/index_or_search.tsx @@ -185,26 +185,6 @@ export const changePointDetectionIndexOrSearchRouteFactory = ( breadcrumbs: getChangePointDetectionBreadcrumbs(navigateToPath, basePath), }); -export const dataComparisonIndexOrSearchRouteFactory = ( - navigateToPath: NavigateToPath, - basePath: string -): MlRoute => ({ - id: 'data_view_data_comparison', - path: createPath(ML_PAGES.DATA_COMPARISON_INDEX_SELECT), - title: i18n.translate('xpack.ml.selectDataViewLabel', { - defaultMessage: 'Select Data View', - }), - render: (props, deps) => ( - - ), - breadcrumbs: getDataVisBreadcrumbs(navigateToPath, basePath), -}); - const PageWrapper: FC = ({ nextStepPath, mode }) => { const { services: { diff --git a/x-pack/plugins/ml/public/application/services/ml_api_service/trained_models.ts b/x-pack/plugins/ml/public/application/services/ml_api_service/trained_models.ts index c10867af0011b..e723da6c16d45 100644 --- a/x-pack/plugins/ml/public/application/services/ml_api_service/trained_models.ts +++ b/x-pack/plugins/ml/public/application/services/ml_api_service/trained_models.ts @@ -32,6 +32,7 @@ export interface InferenceQueryParams { tags?: string; // Custom kibana endpoint query params with_pipelines?: boolean; + with_indices?: boolean; include?: 'total_feature_importance' | 'feature_importance_baseline' | string; } diff --git a/x-pack/plugins/ml/public/locator/ml_locator.ts b/x-pack/plugins/ml/public/locator/ml_locator.ts index 6008741860d6d..e397778315a6a 100644 --- a/x-pack/plugins/ml/public/locator/ml_locator.ts +++ b/x-pack/plugins/ml/public/locator/ml_locator.ts @@ -77,8 +77,9 @@ export class MlLocatorDefinition implements LocatorDefinition { case ML_PAGES.MEMORY_USAGE: path = formatMemoryUsageUrl('', params.pageState); break; - case ML_PAGES.DATA_COMPARISON_INDEX_SELECT: - case ML_PAGES.DATA_COMPARISON: + case ML_PAGES.DATA_DRIFT_INDEX_SELECT: + case ML_PAGES.DATA_DRIFT_CUSTOM: + case ML_PAGES.DATA_DRIFT: case ML_PAGES.ANOMALY_DETECTION_CREATE_JOB: case ML_PAGES.ANOMALY_DETECTION_CREATE_JOB_RECOGNIZER: case ML_PAGES.ANOMALY_DETECTION_CREATE_JOB_ADVANCED: diff --git a/x-pack/plugins/ml/public/plugin.ts b/x-pack/plugins/ml/public/plugin.ts index 4eae00a53d401..140ac875ed8f3 100644 --- a/x-pack/plugins/ml/public/plugin.ts +++ b/x-pack/plugins/ml/public/plugin.ts @@ -48,6 +48,7 @@ import type { ChartsPluginStart } from '@kbn/charts-plugin/public'; import type { CasesUiSetup, CasesUiStart } from '@kbn/cases-plugin/public'; import type { SavedSearchPublicPluginStart } from '@kbn/saved-search-plugin/public'; import type { PresentationUtilPluginStart } from '@kbn/presentation-util-plugin/public'; +import type { DataViewEditorStart } from '@kbn/data-view-editor-plugin/public'; import { getMlSharedServices, MlSharedServices, @@ -61,6 +62,7 @@ import { ML_APP_ROUTE, PLUGIN_ICON_SOLUTION, PLUGIN_ID } from '../common/constan import type { MlCapabilities } from './shared'; export interface MlStartDependencies { + dataViewEditor: DataViewEditorStart; data: DataPublicPluginStart; unifiedSearch: UnifiedSearchPublicPluginStart; licensing: LicensingPluginStart; @@ -137,6 +139,7 @@ export class MlPlugin implements Plugin { { charts: pluginsStart.charts, data: pluginsStart.data, + dataViewEditor: pluginsStart.dataViewEditor, unifiedSearch: pluginsStart.unifiedSearch, dashboard: pluginsStart.dashboard, share: pluginsStart.share, diff --git a/x-pack/plugins/ml/public/register_helper/register_search_links/search_deep_links.ts b/x-pack/plugins/ml/public/register_helper/register_search_links/search_deep_links.ts index f9bdd2b50e4a4..9b9642a8a982a 100644 --- a/x-pack/plugins/ml/public/register_helper/register_search_links/search_deep_links.ts +++ b/x-pack/plugins/ml/public/register_helper/register_search_links/search_deep_links.ts @@ -265,11 +265,11 @@ function createDeepLinks( getDataComparisonDeepLink: (): AppDeepLink => { return { - id: 'dataComparison', - title: i18n.translate('xpack.ml.deepLink.dataComparison', { - defaultMessage: 'Data Comparison', + id: 'dataDrift', + title: i18n.translate('xpack.ml.deepLink.dataDrift', { + defaultMessage: 'Data Drift', }), - path: `/${ML_PAGES.DATA_COMPARISON_INDEX_SELECT}`, + path: `/${ML_PAGES.DATA_DRIFT_INDEX_SELECT}`, navLinkStatus: getNavStatus(true), }; }, diff --git a/x-pack/plugins/ml/server/models/data_frame_analytics/analytics_manager.ts b/x-pack/plugins/ml/server/models/data_frame_analytics/analytics_manager.ts index 4f1796782a6ae..bee696f02de81 100644 --- a/x-pack/plugins/ml/server/models/data_frame_analytics/analytics_manager.ts +++ b/x-pack/plugins/ml/server/models/data_frame_analytics/analytics_manager.ts @@ -18,9 +18,8 @@ import { type AnalyticsMapNodeElement, type MapElements, } from '@kbn/ml-data-frame-analytics-utils'; -import type { TransformGetTransformTransformSummary } from '@elastic/elasticsearch/lib/api/types'; -import { flatten } from 'lodash'; import { isPopulatedObject } from '@kbn/ml-is-populated-object'; +import type { ModelService } from '../model_management/models_provider'; import { modelsProvider } from '../model_management'; import { type ExtendAnalyticsMapArgs, @@ -43,13 +42,15 @@ import { DEFAULT_TRAINED_MODELS_PAGE_SIZE } from '../../routes/trained_models'; export class AnalyticsManager { private _trainedModels: estypes.MlTrainedModelConfig[] = []; private _jobs: estypes.MlDataframeAnalyticsSummary[] = []; - private _transforms?: TransformGetTransformTransformSummary[]; + private _modelsProvider: ModelService; constructor( private readonly _mlClient: MlClient, private readonly _client: IScopedClusterClient, private readonly _enabledFeatures: MlFeatures - ) {} + ) { + this._modelsProvider = modelsProvider(this._client); + } private async initData() { const [models, jobs] = await Promise.all([ @@ -64,30 +65,6 @@ export class AnalyticsManager { this._jobs = jobs.data_frame_analytics; } - private async initTransformData() { - if (!this._transforms) { - try { - const body = await this._client.asCurrentUser.transform.getTransform({ - size: 1000, - }); - this._transforms = body.transforms; - return body.transforms; - } catch (e) { - if (e.meta?.statusCode !== 403) { - // eslint-disable-next-line no-console - console.error(e); - } - } - } - } - - private getNodeId( - elementOriginalId: string, - nodeType: typeof JOB_MAP_NODE_TYPES[keyof typeof JOB_MAP_NODE_TYPES] - ): string { - return `${elementOriginalId}-${nodeType}`; - } - private isDuplicateElement(analyticsId: string, elements: MapElements[]): boolean { let isDuplicate = false; elements.forEach((elem) => { @@ -608,8 +585,12 @@ export class AnalyticsManager { } if (modelId && model) { - // First, find information about the trained model - result.elements.push({ + const pipelinesAndIndicesResults = + await this._modelsProvider.getModelsPipelinesAndIndicesMap(modelId, { + withIndices: true, + }); + // Adding information about the trained model + pipelinesAndIndicesResults.elements.push({ data: { id: modelNodeId, label: modelId, @@ -617,182 +598,9 @@ export class AnalyticsManager { isRoot: true, }, }); - result.details[modelNodeId] = model; - - let pipelinesResponse; - let indicesSettings; - try { - // Then, find the pipelines that have the trained model set as index.default_pipelines - pipelinesResponse = await modelsProvider(this._client).getModelsPipelines([modelId]); - } catch (e) { - // Possible that the user doesn't have permissions to view ingest pipelines - // If so, gracefully exit - if (e.meta?.statusCode !== 403) { - // eslint-disable-next-line no-console - console.error(e); - } - - return result; - } - - const pipelines = pipelinesResponse?.get(modelId); - - if (pipelines) { - const pipelineIds = new Set(Object.keys(pipelines)); - for (const pipelineId of pipelineIds) { - const pipelineNodeId = `${pipelineId}-${JOB_MAP_NODE_TYPES.INGEST_PIPELINE}`; - result.details[pipelineNodeId] = pipelines[pipelineId]; + pipelinesAndIndicesResults.details[modelNodeId] = model; - result.elements.push({ - data: { - id: pipelineNodeId, - label: pipelineId, - type: JOB_MAP_NODE_TYPES.INGEST_PIPELINE, - }, - }); - - result.elements.push({ - data: { - id: `${modelNodeId}~${pipelineNodeId}`, - source: modelNodeId, - target: pipelineNodeId, - }, - }); - } - const pipelineIdsToDestinationIndices: Record = {}; - - let indicesPermissions; - try { - indicesSettings = await this._client.asInternalUser.indices.getSettings(); - const hasPrivilegesResponse = await this._client.asCurrentUser.security.hasPrivileges({ - index: [ - { - names: Object.keys(indicesSettings), - privileges: ['read'], - }, - ], - }); - indicesPermissions = hasPrivilegesResponse.index; - } catch (e) { - // Possible that the user doesn't have permissions to view - // If so, gracefully exit - if (e.meta?.statusCode !== 403) { - // eslint-disable-next-line no-console - console.error(e); - } - return result; - } - - for (const [indexName, { settings }] of Object.entries(indicesSettings)) { - if ( - settings?.index?.default_pipeline && - pipelineIds.has(settings.index.default_pipeline) && - indicesPermissions[indexName]?.read === true - ) { - if (Array.isArray(pipelineIdsToDestinationIndices[settings.index.default_pipeline])) { - pipelineIdsToDestinationIndices[settings.index.default_pipeline].push(indexName); - } else { - pipelineIdsToDestinationIndices[settings.index.default_pipeline] = [indexName]; - } - } - } - - for (const [pipelineId, indexIds] of Object.entries(pipelineIdsToDestinationIndices)) { - const pipelineNodeId = this.getNodeId(pipelineId, JOB_MAP_NODE_TYPES.INGEST_PIPELINE); - - for (const destinationIndexId of indexIds) { - const destinationIndexNodeId = this.getNodeId( - destinationIndexId, - JOB_MAP_NODE_TYPES.INDEX - ); - - const destinationIndexDetails = await this.getIndexData(destinationIndexId); - result.details[destinationIndexNodeId] = { - ...destinationIndexDetails, - ml_inference_models: [modelId], - }; - - result.elements.push({ - data: { - id: destinationIndexNodeId, - label: destinationIndexId, - type: JOB_MAP_NODE_TYPES.INDEX, - }, - }); - - result.elements.push({ - data: { - id: `${pipelineNodeId}~${destinationIndexNodeId}`, - source: pipelineNodeId, - target: destinationIndexNodeId, - }, - }); - } - } - - const destinationIndices = flatten(Object.values(pipelineIdsToDestinationIndices)); - - // From these destination indices, see if there's any transforms that have the indexId as the source destination index - if (destinationIndices.length > 0) { - const transforms = await this.initTransformData(); - - if (!transforms) return result; - - for (const destinationIndex of destinationIndices) { - const destinationIndexNodeId = `${destinationIndex}-${JOB_MAP_NODE_TYPES.INDEX}`; - - const foundTransform = transforms?.find((t) => { - const transformSourceIndex = Array.isArray(t.source.index) - ? t.source.index[0] - : t.source.index; - return transformSourceIndex === destinationIndex; - }); - if (foundTransform) { - const transformDestIndex = foundTransform.dest.index; - const transformNodeId = `${foundTransform.id}-${JOB_MAP_NODE_TYPES.TRANSFORM}`; - const transformDestIndexNodeId = `${transformDestIndex}-${JOB_MAP_NODE_TYPES.INDEX}`; - - const destIndex = await this.getIndexData(transformDestIndex); - result.details[transformNodeId] = foundTransform; - result.details[transformDestIndexNodeId] = destIndex; - - result.elements.push( - { - data: { - id: transformNodeId, - label: foundTransform.id, - type: JOB_MAP_NODE_TYPES.TRANSFORM, - }, - }, - { - data: { - id: transformDestIndexNodeId, - label: transformDestIndex, - type: JOB_MAP_NODE_TYPES.INDEX, - }, - } - ); - - result.elements.push( - { - data: { - id: `${destinationIndexNodeId}~${transformNodeId}`, - source: destinationIndexNodeId, - target: transformNodeId, - }, - }, - { - data: { - id: `${transformNodeId}~${transformDestIndexNodeId}`, - source: transformNodeId, - target: transformDestIndexNodeId, - }, - } - ); - } - } - } - } + return pipelinesAndIndicesResults; } } catch (error) { result.error = error.message || 'An error occurred fetching map'; diff --git a/x-pack/plugins/ml/server/models/model_management/models_provider.ts b/x-pack/plugins/ml/server/models/model_management/models_provider.ts index f6164ad6e65ca..d05096bef8189 100644 --- a/x-pack/plugins/ml/server/models/model_management/models_provider.ts +++ b/x-pack/plugins/ml/server/models/model_management/models_provider.ts @@ -6,6 +6,10 @@ */ import type { IScopedClusterClient } from '@kbn/core/server'; +import { JOB_MAP_NODE_TYPES, type MapElements } from '@kbn/ml-data-frame-analytics-utils'; +import { flatten } from 'lodash'; +import type { TransformGetTransformTransformSummary } from '@elastic/elasticsearch/lib/api/types'; +import type { IndexName, IndicesIndexState } from '@elastic/elasticsearch/lib/api/types'; import type { IngestPipeline, IngestSimulateDocument, @@ -21,197 +25,472 @@ import type { CloudSetup } from '@kbn/cloud-plugin/server'; import type { PipelineDefinition } from '../../../common/types/trained_models'; export type ModelService = ReturnType; +export const modelsProvider = (client: IScopedClusterClient, cloud?: CloudSetup) => + new ModelsProvider(client, cloud); -export function modelsProvider(client: IScopedClusterClient, cloud?: CloudSetup) { - return { - /** - * Retrieves the map of model ids and aliases with associated pipelines. - * @param modelIds - Array of models ids and model aliases. - */ - async getModelsPipelines(modelIds: string[]) { - const modelIdsMap = new Map | null>( - modelIds.map((id: string) => [id, null]) - ); - - try { - const body = await client.asCurrentUser.ingest.getPipeline(); +interface ModelMapResult { + ingestPipelines: Map | null>; + indices: Array>; + /** + * Map elements + */ + elements: MapElements[]; + /** + * Transform, job or index details + */ + details: Record; + /** + * Error + */ + error: null | any; +} - for (const [pipelineName, pipelineDefinition] of Object.entries(body)) { - const { processors } = pipelineDefinition as { processors: Array> }; +export class ModelsProvider { + private _transforms?: TransformGetTransformTransformSummary[]; - for (const processor of processors) { - const id = processor.inference?.model_id; - if (modelIdsMap.has(id)) { - const obj = modelIdsMap.get(id); - if (obj === null) { - modelIdsMap.set(id, { [pipelineName]: pipelineDefinition }); - } else { - obj![pipelineName] = pipelineDefinition; - } - } - } - } - } catch (error) { - if (error.statusCode === 404) { - // ES returns 404 when there are no pipelines - // Instead, we should return the modelIdsMap and a 200 - return modelIdsMap; - } - throw error; - } + constructor(private _client: IScopedClusterClient, private _cloud?: CloudSetup) {} - return modelIdsMap; - }, - - /** - * Deletes associated pipelines of the requested model - * @param modelIds - */ - async deleteModelPipelines(modelIds: string[]) { - const pipelines = await this.getModelsPipelines(modelIds); - const pipelinesIds: string[] = [ - ...new Set([...pipelines.values()].flatMap((v) => Object.keys(v!))), - ]; - await Promise.all( - pipelinesIds.map((id) => client.asCurrentUser.ingest.deletePipeline({ id })) - ); - }, - - /** - * Simulates the effect of the pipeline on given document. - * - */ - async simulatePipeline(docs: IngestSimulateDocument[], pipelineConfig: IngestPipeline) { - const simulateRequest: IngestSimulateRequest = { - docs, - pipeline: pipelineConfig, - }; - let result = {}; + private async initTransformData() { + if (!this._transforms) { try { - result = await client.asCurrentUser.ingest.simulate(simulateRequest); - } catch (error) { - if (error.statusCode === 404) { - // ES returns 404 when there are no pipelines - // Instead, we should return an empty response and a 200 - return result; + const body = await this._client.asCurrentUser.transform.getTransform({ + size: 1000, + }); + this._transforms = body.transforms; + return body.transforms; + } catch (e) { + if (e.meta?.statusCode !== 403) { + // eslint-disable-next-line no-console + console.error(e); } - throw error; } + } + } - return result; - }, - - /** - * Creates the pipeline - * - */ - async createInferencePipeline(pipelineConfig: IngestPipeline, pipelineName: string) { - let result = {}; - - result = await client.asCurrentUser.ingest.putPipeline({ - id: pipelineName, - ...pipelineConfig, + private async getIndexData(index: string): Promise> { + try { + const indexData = await this._client.asInternalUser.indices.get({ + index, }); + return indexData; + } catch (e) { + // Possible that the user doesn't have permissions to view + // If so, gracefully exit + if (e.meta?.statusCode !== 403) { + // eslint-disable-next-line no-console + console.error(e); + } + return { [index]: null }; + } + } + private getNodeId( + elementOriginalId: string, + nodeType: typeof JOB_MAP_NODE_TYPES[keyof typeof JOB_MAP_NODE_TYPES] + ): string { + return `${elementOriginalId}-${nodeType}`; + } - return result; - }, - - /** - * Retrieves existing pipelines. - * - */ - async getPipelines() { - let result = {}; - try { - result = await client.asCurrentUser.ingest.getPipeline(); - } catch (error) { - if (error.statusCode === 404) { - // ES returns 404 when there are no pipelines - // Instead, we should return an empty response and a 200 - return result; - } - throw error; + /** + * Simulates the effect of the pipeline on given document. + * + */ + async simulatePipeline(docs: IngestSimulateDocument[], pipelineConfig: IngestPipeline) { + const simulateRequest: IngestSimulateRequest = { + docs, + pipeline: pipelineConfig, + }; + let result = {}; + try { + result = await this._client.asCurrentUser.ingest.simulate(simulateRequest); + } catch (error) { + if (error.statusCode === 404) { + // ES returns 404 when there are no pipelines + // Instead, we should return an empty response and a 200 + return result; } + throw error; + } - return result; - }, - - /** - * Returns a list of elastic curated models available for download. - */ - async getModelDownloads(): Promise { - // We assume that ML nodes in Cloud are always on linux-x86_64, even if other node types aren't. - const isCloud = !!cloud?.cloudId; - - const nodesInfoResponse = - await client.asInternalUser.transport.request({ - method: 'GET', - path: `/_nodes/ml:true/os`, - }); + return result; + } + + /** + * Creates the pipeline + * + */ + async createInferencePipeline(pipelineConfig: IngestPipeline, pipelineName: string) { + let result = {}; + + result = await this._client.asCurrentUser.ingest.putPipeline({ + id: pipelineName, + ...pipelineConfig, + }); + + return result; + } + + /** + * Retrieves existing pipelines. + * + */ + async getPipelines() { + let result = {}; + try { + result = await this._client.asCurrentUser.ingest.getPipeline(); + } catch (error) { + if (error.statusCode === 404) { + // ES returns 404 when there are no pipelines + // Instead, we should return an empty response and a 200 + return result; + } + throw error; + } + + return result; + } + + /** + * Retrieves the map of model ids and aliases with associated pipelines. + * @param modelIds - Array of models ids and model aliases. + */ + async getModelsPipelines(modelIds: string[]) { + const modelIdsMap = new Map | null>( + modelIds.map((id: string) => [id, null]) + ); - let osName: string | undefined; - let arch: string | undefined; - // Indicates that all ML nodes have the same architecture - let sameArch = true; - for (const node of Object.values(nodesInfoResponse.nodes)) { - if (!osName) { - osName = node.os?.name; + try { + const body = await this._client.asCurrentUser.ingest.getPipeline(); + + for (const [pipelineName, pipelineDefinition] of Object.entries(body)) { + const { processors } = pipelineDefinition as { processors: Array> }; + + for (const processor of processors) { + const id = processor.inference?.model_id; + if (modelIdsMap.has(id)) { + const obj = modelIdsMap.get(id); + if (obj === null) { + modelIdsMap.set(id, { [pipelineName]: pipelineDefinition }); + } else { + obj![pipelineName] = pipelineDefinition; + } + } } - if (!arch) { - arch = node.os?.arch; + } + } catch (error) { + if (error.statusCode === 404) { + // ES returns 404 when there are no pipelines + // Instead, we should return the modelIdsMap and a 200 + return modelIdsMap; + } + throw error; + } + + return modelIdsMap; + } + + /** + * Retrieves the network map and metadata of model ids, pipelines, and indices that are tied to the model ids. + * @param modelIds - Array of models ids and model aliases. + */ + async getModelsPipelinesAndIndicesMap( + modelId: string, + { + withIndices, + }: { + withIndices: boolean; + } + ): Promise { + const result: ModelMapResult = { + ingestPipelines: new Map(), + indices: [], + elements: [], + details: {}, + error: null, + }; + + let pipelinesResponse; + let indicesSettings; + + try { + pipelinesResponse = await this.getModelsPipelines([modelId]); + + // 1. Get list of pipelines that are related to the model + const pipelines = pipelinesResponse?.get(modelId); + const modelNodeId = this.getNodeId(modelId, JOB_MAP_NODE_TYPES.TRAINED_MODEL); + + if (pipelines) { + const pipelineIds = new Set(Object.keys(pipelines)); + result.ingestPipelines = pipelinesResponse; + + for (const pipelineId of pipelineIds) { + const pipelineNodeId = this.getNodeId(pipelineId, JOB_MAP_NODE_TYPES.INGEST_PIPELINE); + result.details[pipelineNodeId] = pipelines[pipelineId]; + + result.elements.push({ + data: { + id: pipelineNodeId, + label: pipelineId, + type: JOB_MAP_NODE_TYPES.INGEST_PIPELINE, + }, + }); + + result.elements.push({ + data: { + id: `${modelNodeId}~${pipelineNodeId}`, + source: modelNodeId, + target: pipelineNodeId, + }, + }); } - if (node.os?.name !== osName || node.os?.arch !== arch) { - sameArch = false; - break; + + if (withIndices === true) { + const pipelineIdsToDestinationIndices: Record = {}; + + let indicesPermissions; + try { + indicesSettings = await this._client.asInternalUser.indices.getSettings(); + const hasPrivilegesResponse = await this._client.asCurrentUser.security.hasPrivileges({ + index: [ + { + names: Object.keys(indicesSettings), + privileges: ['read'], + }, + ], + }); + indicesPermissions = hasPrivilegesResponse.index; + } catch (e) { + // Possible that the user doesn't have permissions to view + // If so, gracefully exit + if (e.meta?.statusCode !== 403) { + // eslint-disable-next-line no-console + console.error(e); + } + return result; + } + + // 2. From list of model pipelines, find all indices that have pipeline set as index.default_pipeline + for (const [indexName, { settings }] of Object.entries(indicesSettings)) { + if ( + settings?.index?.default_pipeline && + pipelineIds.has(settings.index.default_pipeline) && + indicesPermissions[indexName]?.read === true + ) { + if (Array.isArray(pipelineIdsToDestinationIndices[settings.index.default_pipeline])) { + pipelineIdsToDestinationIndices[settings.index.default_pipeline].push(indexName); + } else { + pipelineIdsToDestinationIndices[settings.index.default_pipeline] = [indexName]; + } + } + } + + // 3. Grab index information for all the indices found, and add their info to the map + for (const [pipelineId, indexIds] of Object.entries(pipelineIdsToDestinationIndices)) { + const pipelineNodeId = this.getNodeId(pipelineId, JOB_MAP_NODE_TYPES.INGEST_PIPELINE); + + for (const destinationIndexId of indexIds) { + const destinationIndexNodeId = this.getNodeId( + destinationIndexId, + JOB_MAP_NODE_TYPES.INDEX + ); + + const destinationIndexDetails = await this.getIndexData(destinationIndexId); + + result.indices.push(destinationIndexDetails); + + result.details[destinationIndexNodeId] = { + ...destinationIndexDetails, + ml_inference_models: [modelId], + }; + + result.elements.push({ + data: { + id: destinationIndexNodeId, + label: destinationIndexId, + type: JOB_MAP_NODE_TYPES.INDEX, + }, + }); + + result.elements.push({ + data: { + id: `${pipelineNodeId}~${destinationIndexNodeId}`, + source: pipelineNodeId, + target: destinationIndexNodeId, + }, + }); + } + } + + const destinationIndices = flatten(Object.values(pipelineIdsToDestinationIndices)); + + // 4. From these destination indices, check if there's any transforms that have the indexId as the source destination index + if (destinationIndices.length > 0) { + const transforms = await this.initTransformData(); + + if (!transforms) return result; + + for (const destinationIndex of destinationIndices) { + const destinationIndexNodeId = `${destinationIndex}-${JOB_MAP_NODE_TYPES.INDEX}`; + + const foundTransform = transforms?.find((t) => { + const transformSourceIndex = Array.isArray(t.source.index) + ? t.source.index[0] + : t.source.index; + return transformSourceIndex === destinationIndex; + }); + + // 5. If any of the transforms use these indices as source , find the destination indices to complete the map + if (foundTransform) { + const transformDestIndex = foundTransform.dest.index; + const transformNodeId = `${foundTransform.id}-${JOB_MAP_NODE_TYPES.TRANSFORM}`; + const transformDestIndexNodeId = `${transformDestIndex}-${JOB_MAP_NODE_TYPES.INDEX}`; + + const destIndex = await this.getIndexData(transformDestIndex); + + result.indices.push(destIndex); + + result.details[transformNodeId] = foundTransform; + result.details[transformDestIndexNodeId] = destIndex; + + result.elements.push( + { + data: { + id: transformNodeId, + label: foundTransform.id, + type: JOB_MAP_NODE_TYPES.TRANSFORM, + }, + }, + { + data: { + id: transformDestIndexNodeId, + label: transformDestIndex, + type: JOB_MAP_NODE_TYPES.INDEX, + }, + } + ); + + result.elements.push( + { + data: { + id: `${destinationIndexNodeId}~${transformNodeId}`, + source: destinationIndexNodeId, + target: transformNodeId, + }, + }, + { + data: { + id: `${transformNodeId}~${transformDestIndexNodeId}`, + source: transformNodeId, + target: transformDestIndexNodeId, + }, + } + ); + } + } + } } } + return result; + } catch (error) { + if (error.statusCode === 404) { + // ES returns 404 when there are no pipelines + // Instead, we should return the modelIdsMap and a 200 + return result; + } + throw error; + } + + return result; + } + + /** + * Deletes associated pipelines of the requested model + * @param modelIds + */ + async deleteModelPipelines(modelIds: string[]) { + const pipelines = await this.getModelsPipelines(modelIds); + const pipelinesIds: string[] = [ + ...new Set([...pipelines.values()].flatMap((v) => Object.keys(v!))), + ]; + await Promise.all( + pipelinesIds.map((id) => this._client.asCurrentUser.ingest.deletePipeline({ id })) + ); + } - const result = Object.entries(ELASTIC_MODEL_DEFINITIONS).map(([name, def]) => { - const recommended = - (isCloud && def.os === 'Linux' && def.arch === 'amd64') || - (sameArch && !!def?.os && def?.os === osName && def?.arch === arch); - return { - ...def, - name, - ...(recommended ? { recommended } : {}), - }; + /** + * Returns a list of elastic curated models available for download. + */ + async getModelDownloads(): Promise { + // We assume that ML nodes in Cloud are always on linux-x86_64, even if other node types aren't. + const isCloud = !!this._cloud?.cloudId; + + const nodesInfoResponse = + await this._client.asInternalUser.transport.request({ + method: 'GET', + path: `/_nodes/ml:true/os`, }); - return result; - }, - - /** - * Provides an ELSER model name and configuration for download based on the current cluster architecture. - * The current default version is 2. If running on Cloud it returns the Linux x86_64 optimized version. - * If any of the ML nodes run a different OS rather than Linux, or the CPU architecture isn't x86_64, - * a portable version of the model is returned. - */ - async getELSER(options?: GetElserOptions): Promise | never { - const modelDownloadConfig = await this.getModelDownloads(); - - let requestedModel: ModelDefinitionResponse | undefined; - let recommendedModel: ModelDefinitionResponse | undefined; - let defaultModel: ModelDefinitionResponse | undefined; - - for (const model of modelDownloadConfig) { - if (options?.version === model.version) { + let osName: string | undefined; + let arch: string | undefined; + // Indicates that all ML nodes have the same architecture + let sameArch = true; + for (const node of Object.values(nodesInfoResponse.nodes)) { + if (!osName) { + osName = node.os?.name; + } + if (!arch) { + arch = node.os?.arch; + } + if (node.os?.name !== osName || node.os?.arch !== arch) { + sameArch = false; + break; + } + } + + const result = Object.entries(ELASTIC_MODEL_DEFINITIONS).map(([name, def]) => { + const recommended = + (isCloud && def.os === 'Linux' && def.arch === 'amd64') || + (sameArch && !!def?.os && def?.os === osName && def?.arch === arch); + return { + ...def, + name, + ...(recommended ? { recommended } : {}), + }; + }); + + return result; + } + + /** + * Provides an ELSER model name and configuration for download based on the current cluster architecture. + * The current default version is 2. If running on Cloud it returns the Linux x86_64 optimized version. + * If any of the ML nodes run a different OS rather than Linux, or the CPU architecture isn't x86_64, + * a portable version of the model is returned. + */ + async getELSER(options?: GetElserOptions): Promise | never { + const modelDownloadConfig = await this.getModelDownloads(); + + let requestedModel: ModelDefinitionResponse | undefined; + let recommendedModel: ModelDefinitionResponse | undefined; + let defaultModel: ModelDefinitionResponse | undefined; + + for (const model of modelDownloadConfig) { + if (options?.version === model.version) { + requestedModel = model; + if (model.recommended) { requestedModel = model; - if (model.recommended) { - requestedModel = model; - break; - } - } else if (model.recommended) { - recommendedModel = model; - } else if (model.default) { - defaultModel = model; + break; } + } else if (model.recommended) { + recommendedModel = model; + } else if (model.default) { + defaultModel = model; } + } - if (!requestedModel && !defaultModel && !recommendedModel) { - throw new Error('Requested model not found'); - } + if (!requestedModel && !defaultModel && !recommendedModel) { + throw new Error('Requested model not found'); + } - return requestedModel || recommendedModel || defaultModel!; - }, - }; + return requestedModel || recommendedModel || defaultModel!; + } } diff --git a/x-pack/plugins/ml/server/routes/schemas/inference_schema.ts b/x-pack/plugins/ml/server/routes/schemas/inference_schema.ts index 1b48a49c8d82f..260b3bc5881d8 100644 --- a/x-pack/plugins/ml/server/routes/schemas/inference_schema.ts +++ b/x-pack/plugins/ml/server/routes/schemas/inference_schema.ts @@ -48,6 +48,7 @@ export const optionalModelIdSchema = schema.object({ export const getInferenceQuerySchema = schema.object({ size: schema.maybe(schema.string()), with_pipelines: schema.maybe(schema.string()), + with_indices: schema.maybe(schema.oneOf([schema.string(), schema.boolean()])), include: schema.maybe(schema.string()), }); diff --git a/x-pack/plugins/ml/server/routes/trained_models.ts b/x-pack/plugins/ml/server/routes/trained_models.ts index 8685652ab3189..f6eeb6fa16d4a 100644 --- a/x-pack/plugins/ml/server/routes/trained_models.ts +++ b/x-pack/plugins/ml/server/routes/trained_models.ts @@ -11,6 +11,7 @@ import type { ErrorType } from '@kbn/ml-error-utils'; import type { MlGetTrainedModelsRequest } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { type ElserVersion } from '@kbn/ml-trained-models-utils'; import type { CloudSetup } from '@kbn/cloud-plugin/server'; +import { isDefined } from '@kbn/ml-is-defined'; import { ML_INTERNAL_BASE_PATH } from '../../common/constants/app'; import type { MlFeatures, RouteInitialization } from '../types'; import { wrapError } from '../client/error_wrapper'; @@ -29,7 +30,10 @@ import { createIngestPipelineSchema, modelDownloadsQuery, } from './schemas/inference_schema'; -import type { TrainedModelConfigResponse } from '../../common/types/trained_models'; +import type { + PipelineDefinition, + TrainedModelConfigResponse, +} from '../../common/types/trained_models'; import { mlLog } from '../lib/log'; import { forceQuerySchema } from './schemas/anomaly_detectors_schema'; import { modelsProvider } from '../models/model_management'; @@ -84,9 +88,17 @@ export function trainedModelsRoutes( routeGuard.fullLicenseAPIGuard(async ({ client, mlClient, request, response }) => { try { const { modelId } = request.params; - const { with_pipelines: withPipelines, ...query } = request.query; + const { + with_pipelines: withPipelines, + with_indices: withIndicesRaw, + ...getTrainedModelsRequestParams + } = request.query; + + const withIndices = + request.query.with_indices === 'true' || request.query.with_indices === true; + const resp = await mlClient.getTrainedModels({ - ...query, + ...getTrainedModelsRequestParams, ...(modelId ? { model_id: modelId } : {}), size: DEFAULT_TRAINED_MODELS_PAGE_SIZE, } as MlGetTrainedModelsRequest); @@ -123,20 +135,54 @@ export function trainedModelsRoutes( ...Object.values(modelDeploymentsMap).flat(), ]) ); - - const pipelinesResponse = await modelsProvider(client).getModelsPipelines( - modelIdsAndAliases + const modelsClient = modelsProvider(client); + + const modelsPipelinesAndIndices = await Promise.all( + modelIdsAndAliases.map(async (modelIdOrAlias) => { + return { + modelIdOrAlias, + result: await modelsClient.getModelsPipelinesAndIndicesMap(modelIdOrAlias, { + withIndices, + }), + }; + }) ); + for (const model of result) { - model.pipelines = { - ...(pipelinesResponse.get(model.model_id) ?? {}), - ...(model.metadata?.model_aliases ?? []).reduce((acc, alias) => { - return Object.assign(acc, pipelinesResponse.get(alias) ?? {}); - }, {}), - ...(modelDeploymentsMap[model.model_id] ?? []).reduce((acc, deploymentId) => { - return Object.assign(acc, pipelinesResponse.get(deploymentId) ?? {}); - }, {}), - }; + const modelAliases = model.metadata?.model_aliases ?? []; + const modelMap = modelsPipelinesAndIndices.find( + (d) => d.modelIdOrAlias === model.model_id + )?.result; + + const allRelatedModels = modelsPipelinesAndIndices + .filter( + (m) => + [ + model.model_id, + ...modelAliases, + ...(modelDeploymentsMap[model.model_id] ?? []), + ].findIndex((alias) => alias === m.modelIdOrAlias) > -1 + ) + .map((r) => r?.result) + .filter(isDefined); + const ingestPipelinesFromModelAliases = allRelatedModels + .map((r) => r?.ingestPipelines) + .filter(isDefined) as Array>>; + + model.pipelines = ingestPipelinesFromModelAliases.reduce< + Record + >((allPipelines, modelsToPipelines) => { + for (const [, pipelinesObj] of modelsToPipelines?.entries()) { + Object.entries(pipelinesObj).forEach(([pipelineId, pipelineInfo]) => { + allPipelines[pipelineId] = pipelineInfo; + }); + } + return allPipelines; + }, {}); + + if (modelMap && withIndices) { + model.indices = modelMap.indices; + } } } } catch (e) { diff --git a/x-pack/plugins/ml/tsconfig.json b/x-pack/plugins/ml/tsconfig.json index 2532a6b7824ee..7962e2dd27296 100644 --- a/x-pack/plugins/ml/tsconfig.json +++ b/x-pack/plugins/ml/tsconfig.json @@ -105,5 +105,6 @@ "@kbn/presentation-util-plugin", "@kbn/react-kibana-mount", "@kbn/core-http-browser", + "@kbn/data-view-editor-plugin", ], } diff --git a/x-pack/plugins/security_solution_serverless/public/navigation/links/constants.ts b/x-pack/plugins/security_solution_serverless/public/navigation/links/constants.ts index 520cbdd192ae4..565b2d2c97c80 100644 --- a/x-pack/plugins/security_solution_serverless/public/navigation/links/constants.ts +++ b/x-pack/plugins/security_solution_serverless/public/navigation/links/constants.ts @@ -51,7 +51,7 @@ export enum ExternalPageName { mlNodes = 'ml:nodes', mlFileUpload = 'ml:fileUpload', mlIndexDataVisualizer = 'ml:indexDataVisualizer', - mlDataComparison = 'ml:dataComparison', + mlDataDrift = 'ml:dataDrift', mlExplainLogRateSpikes = 'ml:logRateAnalysis', mlLogPatternAnalysis = 'ml:logPatternAnalysis', mlChangePointDetections = 'ml:changePointDetections', diff --git a/x-pack/plugins/security_solution_serverless/public/navigation/links/sections/ml_links.ts b/x-pack/plugins/security_solution_serverless/public/navigation/links/sections/ml_links.ts index 32c7587097616..34a5c8530fb25 100644 --- a/x-pack/plugins/security_solution_serverless/public/navigation/links/sections/ml_links.ts +++ b/x-pack/plugins/security_solution_serverless/public/navigation/links/sections/ml_links.ts @@ -81,7 +81,7 @@ export const mlNavCategories: ProjectLinkCategory[] = [ linkIds: [ ExternalPageName.mlFileUpload, ExternalPageName.mlIndexDataVisualizer, - ExternalPageName.mlDataComparison, + ExternalPageName.mlDataDrift, ], }, { @@ -176,10 +176,10 @@ export const mlNavLinks: ProjectNavigationLink[] = [ description: i18n.INDEX_DATA_VISUALIZER_DESC, }, { - id: ExternalPageName.mlDataComparison, - title: i18n.DATA_COMPARISON_TITLE, + id: ExternalPageName.mlDataDrift, + title: i18n.DATA_DRIFT_TITLE, landingIcon: IconRapidBarGraphLazy, - description: i18n.DATA_COMPARISON_DESC, + description: i18n.DATA_DRIFT_TITLE, }, { id: ExternalPageName.mlExplainLogRateSpikes, diff --git a/x-pack/plugins/security_solution_serverless/public/navigation/links/sections/ml_translations.ts b/x-pack/plugins/security_solution_serverless/public/navigation/links/sections/ml_translations.ts index 36a28d561bda5..18baed686b5b2 100644 --- a/x-pack/plugins/security_solution_serverless/public/navigation/links/sections/ml_translations.ts +++ b/x-pack/plugins/security_solution_serverless/public/navigation/links/sections/ml_translations.ts @@ -213,16 +213,16 @@ export const INDEX_DATA_VISUALIZER_DESC = i18n.translate( defaultMessage: 'Data view data visualizer page', } ); -export const DATA_COMPARISON_TITLE = i18n.translate( - 'xpack.securitySolutionServerless.navLinks.ml.datComparison.title', +export const DATA_DRIFT_TITLE = i18n.translate( + 'xpack.securitySolutionServerless.navLinks.ml.dataDrift.title', { - defaultMessage: 'Data comparison', + defaultMessage: 'Data drift', } ); export const DATA_COMPARISON_DESC = i18n.translate( - 'xpack.securitySolutionServerless.navLinks.ml.datComparison.desc', + 'xpack.securitySolutionServerless.navLinks.ml.dataDrift.desc', { - defaultMessage: 'Data comparison page', + defaultMessage: 'Data drift page', } ); export const LOG_RATE_ANALYSIS_TITLE = i18n.translate( diff --git a/x-pack/plugins/translations/translations/fr-FR.json b/x-pack/plugins/translations/translations/fr-FR.json index 0b350d50056b6..1e8ea9f239326 100644 --- a/x-pack/plugins/translations/translations/fr-FR.json +++ b/x-pack/plugins/translations/translations/fr-FR.json @@ -11626,7 +11626,6 @@ "xpack.dataVisualizer.nameCollisionMsg": "\"{name}\" existe déjà, veuillez fournir un nom unique", "xpack.dataVisualizer.randomSamplerSettingsPopUp.probabilityLabel": "Probabilité utilisée : {samplingProbability} %", "xpack.dataVisualizer.searchPanel.ofFieldsTotal": "sur un total de {totalCount}", - "xpack.dataVisualizer.searchPanel.totalDocCountLabel": "Total des documents : {prepend}{strongTotalCount}", "xpack.dataVisualizer.searchPanel.totalDocCountNumber": "{totalCount, plural, one {#} many {#} other {#}}", "xpack.dataVisualizer.addCombinedFieldsLabel": "Ajouter un champ combiné", "xpack.dataVisualizer.chrome.help.appName": "Data Visualizer (Visualiseur de données)", diff --git a/x-pack/plugins/translations/translations/ja-JP.json b/x-pack/plugins/translations/translations/ja-JP.json index c6948a329c948..73d492e7031d1 100644 --- a/x-pack/plugins/translations/translations/ja-JP.json +++ b/x-pack/plugins/translations/translations/ja-JP.json @@ -11640,7 +11640,6 @@ "xpack.dataVisualizer.nameCollisionMsg": "「{name}」はすでに存在します。一意の名前を入力してください。", "xpack.dataVisualizer.randomSamplerSettingsPopUp.probabilityLabel": "使用された確率:{samplingProbability}%", "xpack.dataVisualizer.searchPanel.ofFieldsTotal": "合計{totalCount}中", - "xpack.dataVisualizer.searchPanel.totalDocCountLabel": "合計ドキュメント数:{prepend}{strongTotalCount}", "xpack.dataVisualizer.searchPanel.totalDocCountNumber": "{totalCount, plural, other {#}}", "xpack.dataVisualizer.addCombinedFieldsLabel": "結合されたフィールドを追加", "xpack.dataVisualizer.chrome.help.appName": "データビジュアライザー", diff --git a/x-pack/plugins/translations/translations/zh-CN.json b/x-pack/plugins/translations/translations/zh-CN.json index 491e2870c636d..3a87fc2238ee0 100644 --- a/x-pack/plugins/translations/translations/zh-CN.json +++ b/x-pack/plugins/translations/translations/zh-CN.json @@ -11640,7 +11640,6 @@ "xpack.dataVisualizer.nameCollisionMsg": "“{name}”已存在,请提供唯一名称", "xpack.dataVisualizer.randomSamplerSettingsPopUp.probabilityLabel": "使用的概率:{samplingProbability}%", "xpack.dataVisualizer.searchPanel.ofFieldsTotal": ",共 {totalCount} 个", - "xpack.dataVisualizer.searchPanel.totalDocCountLabel": "总文档数:{prepend}{strongTotalCount}", "xpack.dataVisualizer.searchPanel.totalDocCountNumber": "{totalCount, plural, other {#}}", "xpack.dataVisualizer.addCombinedFieldsLabel": "添加组合字段", "xpack.dataVisualizer.chrome.help.appName": "数据可视化工具", diff --git a/x-pack/test/api_integration/apis/ml/trained_models/get_models.ts b/x-pack/test/api_integration/apis/ml/trained_models/get_models.ts index 2633423b5855e..0c1c90751b55d 100644 --- a/x-pack/test/api_integration/apis/ml/trained_models/get_models.ts +++ b/x-pack/test/api_integration/apis/ml/trained_models/get_models.ts @@ -13,6 +13,7 @@ import { getCommonRequestHeader } from '../../../../functional/services/ml/commo export default ({ getService }: FtrProviderContext) => { const supertest = getService('supertestWithoutAuth'); const ml = getService('ml'); + const esDeleteAllIndices = getService('esDeleteAllIndices'); describe('GET trained_models', () => { let testModelIds: string[] = []; @@ -23,6 +24,11 @@ export default ({ getService }: FtrProviderContext) => { testModelIds = await ml.api.createTestTrainedModels('regression', 5, true); await ml.api.createModelAlias('dfa_regression_model_n_0', 'dfa_regression_model_alias'); await ml.api.createIngestPipeline('dfa_regression_model_alias'); + + // Creating an indices that are tied to modelId: dfa_regression_model_n_1 + await ml.api.createIndex(`user-index_dfa_regression_model_n_1`, undefined, { + index: { default_pipeline: `pipeline_dfa_regression_model_n_1` }, + }); }); after(async () => { @@ -34,6 +40,8 @@ export default ({ getService }: FtrProviderContext) => { ); await ml.api.cleanMlIndices(); await ml.testResources.cleanMLSavedObjects(); + + await esDeleteAllIndices('user-index_dfa*'); }); it('returns all trained models with associated pipelines including aliases', async () => { @@ -47,12 +55,13 @@ export default ({ getService }: FtrProviderContext) => { expect(body.length).to.eql(6); const sampleModel = body.find((v: any) => v.model_id === 'dfa_regression_model_n_0'); + expect(Object.keys(sampleModel.pipelines).length).to.eql(2); }); it('returns models without pipeline in case user does not have required permission', async () => { const { body, status } = await supertest - .get(`/internal/ml/trained_models?with_pipelines=true`) + .get(`/internal/ml/trained_models?with_pipelines=true&with_indices=true`) .auth(USER.ML_VIEWER, ml.securityCommon.getPasswordForUser(USER.ML_VIEWER)) .set(getCommonRequestHeader('1')); ml.api.assertResponseStatusCode(200, status, body); @@ -60,6 +69,7 @@ export default ({ getService }: FtrProviderContext) => { // Created models + system model expect(body.length).to.eql(6); const sampleModel = body.find((v: any) => v.model_id === 'dfa_regression_model_n_0'); + expect(sampleModel.pipelines).to.eql(undefined); }); @@ -71,7 +81,61 @@ export default ({ getService }: FtrProviderContext) => { ml.api.assertResponseStatusCode(200, status, body); expect(body.length).to.eql(1); - expect(body[0].model_id).to.eql('dfa_regression_model_n_1'); + + const sampleModel = body[0]; + expect(sampleModel.model_id).to.eql('dfa_regression_model_n_1'); + expect(sampleModel.pipelines).to.eql(undefined); + expect(sampleModel.indices).to.eql(undefined); + }); + + it('returns trained model by id with_pipelines=true,with_indices=false', async () => { + const { body, status } = await supertest + .get( + `/internal/ml/trained_models/dfa_regression_model_n_1?with_pipelines=true&with_indices=false` + ) + .auth(USER.ML_POWERUSER, ml.securityCommon.getPasswordForUser(USER.ML_POWERUSER)) + .set(getCommonRequestHeader('1')); + ml.api.assertResponseStatusCode(200, status, body); + + expect(body.length).to.eql(1); + const sampleModel = body[0]; + + expect(sampleModel.model_id).to.eql('dfa_regression_model_n_1'); + expect(Object.keys(sampleModel.pipelines).length).to.eql( + 1, + `Expected number of pipelines for dfa_regression_model_n_1 to be ${1} (got ${ + Object.keys(sampleModel.pipelines).length + })` + ); + expect(sampleModel.indices).to.eql( + undefined, + `Expected indices for dfa_regression_model_n_1 to be undefined (got ${sampleModel.indices})` + ); + }); + + it('returns trained model by id with_pipelines=true,with_indices=true', async () => { + const { body, status } = await supertest + .get( + `/internal/ml/trained_models/dfa_regression_model_n_1?with_pipelines=true&with_indices=true` + ) + .auth(USER.ML_POWERUSER, ml.securityCommon.getPasswordForUser(USER.ML_POWERUSER)) + .set(getCommonRequestHeader('1')); + ml.api.assertResponseStatusCode(200, status, body); + + const sampleModel = body[0]; + expect(sampleModel.model_id).to.eql('dfa_regression_model_n_1'); + expect(Object.keys(sampleModel.pipelines).length).to.eql( + 1, + `Expected number of pipelines for dfa_regression_model_n_1 to be ${1} (got ${ + Object.keys(sampleModel.pipelines).length + })` + ); + expect(sampleModel.indices.length).to.eql( + 1, + `Expected number of indices for dfa_regression_model_n_1 to be ${1} (got ${ + sampleModel.indices.length + })` + ); }); it('returns 404 if requested trained model does not exist', async () => { diff --git a/x-pack/test/functional/apps/ml/data_visualizer/data_drift.ts b/x-pack/test/functional/apps/ml/data_visualizer/data_drift.ts new file mode 100644 index 0000000000000..2eb579c1720d8 --- /dev/null +++ b/x-pack/test/functional/apps/ml/data_visualizer/data_drift.ts @@ -0,0 +1,111 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { FtrProviderContext } from '../../../ftr_provider_context'; +import { farequoteDataViewTestDataWithQuery } from '../../aiops/test_data'; +import { TestData } from '../../aiops/types'; + +export default function ({ getService, getPageObjects }: FtrProviderContext) { + const ml = getService('ml'); + const PageObjects = getPageObjects(['common', 'console', 'header', 'home', 'security']); + const elasticChart = getService('elasticChart'); + const esArchiver = getService('esArchiver'); + + function runTests(testData: TestData) { + it(`${testData.suiteTitle} loads the source data in data drift`, async () => { + await elasticChart.setNewChartUiDebugFlag(true); + + await ml.testExecution.logTestStep( + `${testData.suiteTitle} loads the saved search selection page` + ); + await ml.navigation.navigateToDataDrift(); + + await ml.testExecution.logTestStep( + `${testData.suiteTitle} loads the data drift index or saved search select page` + ); + await ml.jobSourceSelection.selectSourceForDataDrift(testData.sourceIndexOrSavedSearch); + }); + + it(`${testData.suiteTitle} displays index details`, async () => { + await ml.testExecution.logTestStep(`${testData.suiteTitle} displays the time range step`); + await ml.dataDrift.assertTimeRangeSelectorSectionExists(); + + await ml.testExecution.logTestStep(`${testData.suiteTitle} loads data for full time range`); + await ml.dataDrift.clickUseFullDataButton(); + + await ml.dataDrift.setRandomSamplingOption('Reference', 'dvRandomSamplerOptionOff'); + await ml.dataDrift.setRandomSamplingOption('Comparison', 'dvRandomSamplerOptionOff'); + + await PageObjects.header.waitUntilLoadingHasFinished(); + + await ml.testExecution.logTestStep( + `${testData.suiteTitle} displays elements in the doc count panel correctly` + ); + await ml.dataDrift.assertPrimarySearchBarExists(); + await ml.dataDrift.assertReferenceDocCountContent(); + await ml.dataDrift.assertComparisonDocCountContent(); + + await ml.testExecution.logTestStep( + `${testData.suiteTitle} displays elements in the page correctly` + ); + await ml.dataDrift.assertNoWindowParametersEmptyPromptExists(); + + await ml.testExecution.logTestStep('clicks the document count chart to start analysis'); + await ml.dataDrift.clickDocumentCountChart( + 'dataDriftDocCountChart-Reference', + testData.chartClickCoordinates + ); + await ml.dataDrift.runAnalysis(); + }); + } + + describe('data drift', async function () { + for (const testData of [farequoteDataViewTestDataWithQuery]) { + describe(`with '${testData.sourceIndexOrSavedSearch}'`, function () { + before(async () => { + await esArchiver.loadIfNeeded('x-pack/test/functional/es_archives/ml/farequote'); + + await ml.testResources.createIndexPatternIfNeeded( + testData.sourceIndexOrSavedSearch, + '@timestamp' + ); + + await ml.testResources.setKibanaTimeZoneToUTC(); + + if (testData.dataGenerator === 'kibana_sample_data_logs') { + await PageObjects.security.login('elastic', 'changeme', { + expectSuccess: true, + }); + + await PageObjects.common.navigateToUrl('home', '/tutorial_directory/sampleData', { + useActualUrl: true, + }); + await PageObjects.header.waitUntilLoadingHasFinished(); + await PageObjects.home.addSampleDataSet('logs'); + await PageObjects.header.waitUntilLoadingHasFinished(); + } else { + await ml.securityUI.loginAsMlPowerUser(); + } + }); + + after(async () => { + await elasticChart.setNewChartUiDebugFlag(false); + await ml.testResources.deleteIndexPatternByTitle(testData.sourceIndexOrSavedSearch); + await esArchiver.unload('x-pack/test/functional/es_archives/ml/farequote'); + }); + + it(`${testData.suiteTitle} loads the ml page`, async () => { + // Start navigation from the base of the ML app. + await ml.navigation.navigateToMl(); + await elasticChart.setNewChartUiDebugFlag(true); + }); + + runTests(testData); + }); + } + }); +} diff --git a/x-pack/test/functional/apps/ml/data_visualizer/index.ts b/x-pack/test/functional/apps/ml/data_visualizer/index.ts index 13ed76a002ca6..2145267edcc39 100644 --- a/x-pack/test/functional/apps/ml/data_visualizer/index.ts +++ b/x-pack/test/functional/apps/ml/data_visualizer/index.ts @@ -40,5 +40,6 @@ export default function ({ getService, loadTestFile }: FtrProviderContext) { loadTestFile(require.resolve('./index_data_visualizer_actions_panel')); loadTestFile(require.resolve('./index_data_visualizer_data_view_management')); loadTestFile(require.resolve('./file_data_visualizer')); + loadTestFile(require.resolve('./data_drift')); }); } diff --git a/x-pack/test/functional/services/ml/api.ts b/x-pack/test/functional/services/ml/api.ts index 2536ec0bc564a..d8dad778fa03e 100644 --- a/x-pack/test/functional/services/ml/api.ts +++ b/x-pack/test/functional/services/ml/api.ts @@ -223,7 +223,8 @@ export function MachineLearningAPIProvider({ getService }: FtrProviderContext) { async createIndex( indices: string, - mappings?: Record | estypes.MappingTypeMapping + mappings?: Record | estypes.MappingTypeMapping, + settings?: Record | estypes.IndicesIndexSettings ) { log.debug(`Creating indices: '${indices}'...`); if ((await es.indices.exists({ index: indices, allow_no_indices: false })) === true) { @@ -233,7 +234,10 @@ export function MachineLearningAPIProvider({ getService }: FtrProviderContext) { const body = await es.indices.create({ index: indices, - ...(mappings ? { body: { mappings } } : {}), + body: { + ...(mappings ? { mappings } : {}), + ...(settings ? { settings } : {}), + }, }); expect(body) .to.have.property('acknowledged') @@ -1494,7 +1498,7 @@ export function MachineLearningAPIProvider({ getService }: FtrProviderContext) { }); this.assertResponseStatusCode(200, status, ingestPipeline); - log.debug('> Ingest pipeline crated'); + log.debug('> Ingest pipeline created'); return ingestPipeline; }, @@ -1503,7 +1507,8 @@ export function MachineLearningAPIProvider({ getService }: FtrProviderContext) { const { body, status } = await esSupertest.delete( `/_ingest/pipeline/${usePrefix ? 'pipeline_' : ''}${modelId}` ); - this.assertResponseStatusCode(200, status, body); + // @todo + // this.assertResponseStatusCode(200, status, body); log.debug('> Ingest pipeline deleted'); }, diff --git a/x-pack/test/functional/services/ml/data_drift.ts b/x-pack/test/functional/services/ml/data_drift.ts new file mode 100644 index 0000000000000..2e0eec6f0e10e --- /dev/null +++ b/x-pack/test/functional/services/ml/data_drift.ts @@ -0,0 +1,214 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import expect from '@kbn/expect'; +import { FtrProviderContext } from '../../ftr_provider_context'; + +export function MachineLearningDataDriftProvider({ + getService, + getPageObjects, +}: FtrProviderContext) { + const testSubjects = getService('testSubjects'); + const retry = getService('retry'); + const PageObjects = getPageObjects(['discover', 'header']); + const elasticChart = getService('elasticChart'); + const browser = getService('browser'); + + type RandomSamplerOption = + | 'dvRandomSamplerOptionOnAutomatic' + | 'dvRandomSamplerOptionOnManual' + | 'dvRandomSamplerOptionOff'; + + return { + getDataTestSubject(testSubject: string, id?: string) { + if (!id) return testSubject; + return `${testSubject}-${id}`; + }, + + async assertTimeRangeSelectorSectionExists() { + await testSubjects.existOrFail('dataComparisonTimeRangeSelectorSection'); + }, + + async assertTotalDocumentCount(selector: string, expectedFormattedTotalDocCount: string) { + await retry.tryForTime(5000, async () => { + const docCount = await testSubjects.getVisibleText(selector); + expect(docCount).to.eql( + expectedFormattedTotalDocCount, + `Expected total document count to be '${expectedFormattedTotalDocCount}' (got '${docCount}')` + ); + }); + }, + + async assertRandomSamplingOptionsButtonExists(id: string) { + await testSubjects.existOrFail( + this.getDataTestSubject('aiopsRandomSamplerOptionsButton', id) + ); + }, + + async assertNoWindowParametersEmptyPromptExists() { + await retry.tryForTime(5000, async () => { + await testSubjects.existOrFail('dataDriftNoWindowParametersEmptyPrompt'); + }); + }, + + async assertRandomSamplingOption( + id: string, + expectedOption: RandomSamplerOption, + expectedProbability?: number + ) { + await retry.tryForTime(20000, async () => { + await browser.pressKeys(browser.keys.ESCAPE); + await testSubjects.clickWhenNotDisabled( + this.getDataTestSubject('aiopsRandomSamplerOptionsButton', id) + ); + await testSubjects.existOrFail( + this.getDataTestSubject('aiopsRandomSamplerOptionsPopover', id) + ); + + if (expectedOption === 'dvRandomSamplerOptionOff') { + await testSubjects.existOrFail('dvRandomSamplerOptionOff', { timeout: 1000 }); + await testSubjects.missingOrFail('dvRandomSamplerProbabilityRange', { timeout: 1000 }); + await testSubjects.missingOrFail('dvRandomSamplerProbabilityUsedMsg', { + timeout: 1000, + }); + } + + if (expectedOption === 'dvRandomSamplerOptionOnManual') { + await testSubjects.existOrFail('dvRandomSamplerOptionOnManual', { timeout: 1000 }); + await testSubjects.existOrFail('dvRandomSamplerProbabilityRange', { timeout: 1000 }); + if (expectedProbability !== undefined) { + const probability = await testSubjects.getAttribute( + 'dvRandomSamplerProbabilityRange', + 'value' + ); + expect(probability).to.eql( + `${expectedProbability}`, + `Expected probability to be ${expectedProbability}, got ${probability}` + ); + } + } + + if (expectedOption === 'dvRandomSamplerOptionOnAutomatic') { + await testSubjects.existOrFail('dvRandomSamplerOptionOnAutomatic', { timeout: 1000 }); + await testSubjects.existOrFail('dvRandomSamplerProbabilityUsedMsg', { + timeout: 1000, + }); + + if (expectedProbability !== undefined) { + const probabilityText = await testSubjects.getVisibleText( + 'dvRandomSamplerProbabilityUsedMsg' + ); + expect(probabilityText).to.contain( + `${expectedProbability}`, + `Expected probability text to contain ${expectedProbability}, got ${probabilityText}` + ); + } + } + }); + }, + + async setRandomSamplingOption(id: string, option: RandomSamplerOption) { + await retry.tryForTime(20000, async () => { + // escape popover + await browser.pressKeys(browser.keys.ESCAPE); + await this.assertRandomSamplingOptionsButtonExists(id); + await testSubjects.clickWhenNotDisabled( + this.getDataTestSubject('aiopsRandomSamplerOptionsButton', id) + ); + await testSubjects.existOrFail( + this.getDataTestSubject('aiopsRandomSamplerOptionsPopover', id), + { timeout: 1000 } + ); + + await testSubjects.clickWhenNotDisabled( + this.getDataTestSubject('aiopsRandomSamplerOptionsSelect', id) + ); + + await testSubjects.existOrFail('dvRandomSamplerOptionOff', { timeout: 1000 }); + await testSubjects.existOrFail('dvRandomSamplerOptionOnManual', { timeout: 1000 }); + await testSubjects.existOrFail('dvRandomSamplerOptionOnAutomatic', { timeout: 1000 }); + + await testSubjects.click(option); + + await this.assertRandomSamplingOption(id, option); + }); + }, + + async clickUseFullDataButton() { + await retry.tryForTime(30 * 1000, async () => { + await testSubjects.clickWhenNotDisabledWithoutRetry('mlDatePickerButtonUseFullData'); + await testSubjects.clickWhenNotDisabledWithoutRetry('superDatePickerApplyTimeButton'); + await PageObjects.header.waitUntilLoadingHasFinished(); + }); + }, + + async assertPrimarySearchBarExists() { + await retry.tryForTime(5000, async () => { + await testSubjects.existOrFail(`dataVisualizerQueryInput`); + }); + }, + async assertDocCountContent(id: string) { + await retry.tryForTime(5000, async () => { + await testSubjects.existOrFail(this.getDataTestSubject(`dataDriftTotalDocCountHeader`, id)); + await testSubjects.existOrFail(this.getDataTestSubject(`dataDriftDocCountChart`, id)); + + const parent = await testSubjects.find( + this.getDataTestSubject(`dataDriftTotalDocCountHeader`, id) + ); + const subQueryBar = await testSubjects.findDescendant(`globalQueryBar`, parent); + expect(subQueryBar).not.eql( + undefined, + `Expected secondary query bar exists inside ${this.getDataTestSubject( + `dataDriftTotalDocCountHeader`, + id + )}, got ${subQueryBar}` + ); + }); + }, + + async assertReferenceDocCountContent() { + await this.assertDocCountContent('Reference'); + }, + + async assertComparisonDocCountContent() { + await this.assertDocCountContent('Comparison'); + }, + + async assertHistogramBrushesExist() { + await retry.tryForTime(5000, async () => { + await testSubjects.existOrFail(`aiopsHistogramBrushes`); + // As part of the interface for the histogram brushes, the button to clear the selection should be present + await testSubjects.existOrFail(`aiopsClearSelectionBadge`); + }); + }, + + async clickDocumentCountChart(dataTestSubj: string, chartClickCoordinates: [number, number]) { + await elasticChart.waitForRenderComplete(); + const el = await elasticChart.getCanvas(dataTestSubj); + + await browser + .getActions() + .move({ x: chartClickCoordinates[0], y: chartClickCoordinates[1], origin: el._webElement }) + .click() + .perform(); + + await this.assertHistogramBrushesExist(); + }, + + async assertDataDriftTableExists() { + await testSubjects.existOrFail(`mlDataDriftTable`); + }, + + async runAnalysis() { + await retry.tryForTime(5000, async () => { + await testSubjects.click(`aiopsRerunAnalysisButton`); + // As part of the interface for the histogram brushes, the button to clear the selection should be present + await this.assertDataDriftTableExists(); + }); + }, + }; +} diff --git a/x-pack/test/functional/services/ml/index.ts b/x-pack/test/functional/services/ml/index.ts index ba36b3be3858f..19f4233ca1540 100644 --- a/x-pack/test/functional/services/ml/index.ts +++ b/x-pack/test/functional/services/ml/index.ts @@ -65,7 +65,7 @@ import { AnomalyChartsProvider } from './anomaly_charts'; import { NotificationsProvider } from './notifications'; import { MlTableServiceProvider } from './common_table_service'; import { MachineLearningFieldStatsFlyoutProvider } from './field_stats_flyout'; - +import { MachineLearningDataDriftProvider } from './data_drift'; export function MachineLearningProvider(context: FtrProviderContext) { const commonAPI = MachineLearningCommonAPIProvider(context); const commonUI = MachineLearningCommonUIProvider(context); @@ -85,6 +85,8 @@ export function MachineLearningProvider(context: FtrProviderContext) { dashboardJobSelectionTable ); + const dataDrift = MachineLearningDataDriftProvider(context); + const dataFrameAnalytics = MachineLearningDataFrameAnalyticsProvider(context, api); const dataFrameAnalyticsCreation = MachineLearningDataFrameAnalyticsCreationProvider( context, @@ -180,6 +182,7 @@ export function MachineLearningProvider(context: FtrProviderContext) { customUrls, dashboardJobSelectionTable, dashboardEmbeddables, + dataDrift, dataFrameAnalytics, dataFrameAnalyticsCreation, dataFrameAnalyticsEdit, diff --git a/x-pack/test/functional/services/ml/job_source_selection.ts b/x-pack/test/functional/services/ml/job_source_selection.ts index b43757cd7105c..4a58be75bc376 100644 --- a/x-pack/test/functional/services/ml/job_source_selection.ts +++ b/x-pack/test/functional/services/ml/job_source_selection.ts @@ -39,6 +39,10 @@ export function MachineLearningJobSourceSelectionProvider({ getService }: FtrPro await this.selectSource(sourceName, 'mlAnalyticsCreationContainer'); }, + async selectSourceForDataDrift(sourceName: string) { + await this.selectSource(sourceName, 'mlPageDataDrift'); + }, + async selectSourceForIndexBasedDataVisualizer(sourceName: string) { await this.selectSource(sourceName, 'dataVisualizerIndexPage'); }, diff --git a/x-pack/test/functional/services/ml/navigation.ts b/x-pack/test/functional/services/ml/navigation.ts index bc05cfd6a9bc3..e0136a7c311a2 100644 --- a/x-pack/test/functional/services/ml/navigation.ts +++ b/x-pack/test/functional/services/ml/navigation.ts @@ -200,6 +200,10 @@ export function MachineLearningNavigationProvider({ await this.navigateToArea('~mlMainTab & ~dataVisualizer', 'mlPageDataVisualizerSelector'); }, + async navigateToDataDrift() { + await this.navigateToArea('~mlMainTab & ~dataDrift', 'mlPageDataDrift'); + }, + async navigateToJobManagement() { await this.navigateToAnomalyDetection(); }, From 6e97ef8fc7c73985610df26b40358da9db9e04d4 Mon Sep 17 00:00:00 2001 From: Brad White Date: Tue, 26 Sep 2023 16:38:22 -0600 Subject: [PATCH 17/26] Pick EUI upgrade from #166813 (#167358) ## Summary We're breaking https://github.com/elastic/kibana/pull/166813 up into smaller PRs in the interest of getting PRs through sooner for type fixes. These are the changes related to syncing EUI deps. --- package.json | 4 ++-- yarn.lock | 18 +++++++++--------- 2 files changed, 11 insertions(+), 11 deletions(-) diff --git a/package.json b/package.json index 90d9f8aa5d2d7..e908c931fce58 100644 --- a/package.json +++ b/package.json @@ -938,7 +938,7 @@ "maplibre-gl": "3.1.0", "markdown-it": "^12.3.2", "md5": "^2.1.0", - "mdast-util-to-hast": "10.0.1", + "mdast-util-to-hast": "10.2.0", "memoize-one": "^6.0.0", "mime": "^2.4.4", "mime-types": "^2.1.27", @@ -1042,7 +1042,7 @@ "type-detect": "^4.0.8", "typescript-fsa": "^3.0.0", "typescript-fsa-reducers": "^1.2.2", - "unified": "^9.2.1", + "unified": "9.2.2", "use-resize-observer": "^9.1.0", "usng.js": "^0.4.5", "utility-types": "^3.10.0", diff --git a/yarn.lock b/yarn.lock index 6a4f80236417c..ac82dfdfe47dd 100644 --- a/yarn.lock +++ b/yarn.lock @@ -21736,7 +21736,7 @@ mdast-util-to-hast@10.0.1, mdast-util-to-hast@^10.0.0: unist-util-position "^3.0.0" unist-util-visit "^2.0.0" -mdast-util-to-hast@^10.2.0: +mdast-util-to-hast@10.2.0, mdast-util-to-hast@^10.2.0: version "10.2.0" resolved "https://registry.yarnpkg.com/mdast-util-to-hast/-/mdast-util-to-hast-10.2.0.tgz#61875526a017d8857b71abc9333942700b2d3604" integrity sha512-JoPBfJ3gBnHZ18icCwHR50orC9kNH81tiR1gs01D8Q5YpV6adHNO9nKNuFBCJQ941/32PT1a63UF/DitmS3amQ== @@ -29483,10 +29483,10 @@ unified@9.2.0: trough "^1.0.0" vfile "^4.0.0" -unified@^9.0.0, unified@^9.2.1: - version "9.2.1" - resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.1.tgz#ae18d5674c114021bfdbdf73865ca60f410215a3" - integrity sha512-juWjuI8Z4xFg8pJbnEZ41b5xjGUWGHqXALmBZ3FC3WX0PIx1CZBIIJ6mXbYMcf6Yw4Fi0rFUTA1cdz/BglbOhA== +unified@9.2.2, unified@^9.2.2: + version "9.2.2" + resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.2.tgz#67649a1abfc3ab85d2969502902775eb03146975" + integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== dependencies: bail "^1.0.0" extend "^3.0.0" @@ -29495,10 +29495,10 @@ unified@^9.0.0, unified@^9.2.1: trough "^1.0.0" vfile "^4.0.0" -unified@^9.2.2: - version "9.2.2" - resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.2.tgz#67649a1abfc3ab85d2969502902775eb03146975" - integrity sha512-Sg7j110mtefBD+qunSLO1lqOEKdrwBFBrR6Qd8f4uwkhWNlbkaqwHse6e7QvD3AP/MNoJdEDLaf8OxYyoWgorQ== +unified@^9.0.0: + version "9.2.1" + resolved "https://registry.yarnpkg.com/unified/-/unified-9.2.1.tgz#ae18d5674c114021bfdbdf73865ca60f410215a3" + integrity sha512-juWjuI8Z4xFg8pJbnEZ41b5xjGUWGHqXALmBZ3FC3WX0PIx1CZBIIJ6mXbYMcf6Yw4Fi0rFUTA1cdz/BglbOhA== dependencies: bail "^1.0.0" extend "^3.0.0" From dc3d59811508060c1a6bada034face681b64fc89 Mon Sep 17 00:00:00 2001 From: Brad White Date: Tue, 26 Sep 2023 16:41:36 -0600 Subject: [PATCH 18/26] Pick KBN presentation from #166813 (#167361) ## Summary We're breaking https://github.com/elastic/kibana/pull/166813 up into smaller PRs in the interest of getting PRs through sooner for type fixes. These are the changes for Kibana Presenation. --- test/functional/apps/dashboard/group3/copy_panel_to.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/test/functional/apps/dashboard/group3/copy_panel_to.ts b/test/functional/apps/dashboard/group3/copy_panel_to.ts index dbafa5d68b5e8..3c6fa6d790eaf 100644 --- a/test/functional/apps/dashboard/group3/copy_panel_to.ts +++ b/test/functional/apps/dashboard/group3/copy_panel_to.ts @@ -14,7 +14,6 @@ export default function ({ getService, getPageObjects }: FtrProviderContext) { const dashboardPanelActions = getService('dashboardPanelActions'); const testSubjects = getService('testSubjects'); const kibanaServer = getService('kibanaServer'); - const find = getService('find'); const PageObjects = getPageObjects([ 'header', From ed8225f7bcb9f8d16b2241c8de26cd8103fcb942 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Tue, 26 Sep 2023 18:46:35 -0400 Subject: [PATCH 19/26] skip failing test suite (#167071) --- x-pack/test/functional/apps/infra/home_page.ts | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/x-pack/test/functional/apps/infra/home_page.ts b/x-pack/test/functional/apps/infra/home_page.ts index d5d2ad2cb8b84..a6dc2754de359 100644 --- a/x-pack/test/functional/apps/infra/home_page.ts +++ b/x-pack/test/functional/apps/infra/home_page.ts @@ -30,7 +30,8 @@ export default ({ getPageObjects, getService }: FtrProviderContext) => { return !!currentUrl.match(path); }); - describe('Home page', function () { + // Failing: See https://github.com/elastic/kibana/issues/167071 + describe.skip('Home page', function () { this.tags('includeFirefox'); before(async () => { await kibanaServer.savedObjects.cleanStandardList(); From 7b3a8f842f009a5eecbe91ed53b759a2c01b0ff0 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Tue, 26 Sep 2023 20:32:26 -0600 Subject: [PATCH 20/26] [inspector] clusters tab MVP (#166025) Closes https://github.com/elastic/kibana/issues/166021 Closes https://github.com/elastic/kibana/issues/163381 This PR adds inspector cluster tab MVP This PR does not: 1) include all UI elements in design. These will be added at later dates. 2) show clusters tab when request fails. Somewhere between kibana server elasticsearch request and the client, the raw response is getting removed for failed requests. This will have to be sorted out in a separate PR. 3) Opening clusters tab from "incomplete data" warnings ### Test setup 1. Start remote elasticsearch by running: `yarn es snapshot -E transport.port=9500 -E http.port=9201 -E path.data=../remote1` 2. Install sample data to remote cluster 1. Add `elasticsearch.hosts: ["http://localhost:9201"]` to kibana.dev.yml. **Note** create `config/kibana.dev.yml` if one does not exist. kibana.dev.yml is not managed by git so it has to be created the first time you add values. 2. run `yarn start` to start kibana process 3. install sample web logs data set on home page 4. install sample flight data set on home page 5. stop kibana process 6. remove `elasticsearch.hosts` from kibana.dev.yml 3. Start local elasticsearch by running: `yarn es snapshot -E path.data=../local1` 4. Start kibana 5. Add remote cluster under "Stack management -> Remote clusters" 1. Set **Name** to "remote1" 2. Set **Seed nodes** to "localhost:9500" 3. Enable **Skip if unavailable** 5. install sample web logs data set 6. install sample flights data set 7. Create data view. 1. Set **Index pattern** to `kibana_sample_data*,remote1:kibana_sample_data*` 2. Set **Time field** to `timestamp` ### Local cluster (status=successful) 1) Open discover 2) Select "Kibana sample data logs" data view 3) Open inspector 4) Open clusters tab Screen Shot 2023-09-22 at 9 38 38 AM ### Remote cluster (status=successful) 1) Open discover 2) Select "kibana_sample_data*,remote1:kibana_sample_data*" data view 3) Open inspector 4) Open clusters tab Screen Shot 2023-09-22 at 9 47 08 AM ### Remote cluster (status=partial, failed shard) 1) Open discover 2) Select "kibana_sample_data*,remote1:kibana_sample_data*" data view 3) Add filter ``` { "error_query": { "indices": [ { "error_type": "exception", "message": "local shard failure message 123", "name": "remote1:kibana_sample_data_logs", "shard_ids": [ 0 ] } ] } } ``` 3) Open inspector 4) Open clusters tab Screen Shot 2023-09-22 at 9 50 49 AM Screen Shot 2023-09-22 at 9 51 12 AM ### Remote cluster (status=skipped, all shards fail) 1) Open discover 2) Select "kibana_sample_data*,remote1:kibana_sample_data*" data view 3) Add filter ``` { "error_query": { "indices": [ { "error_type": "exception", "message": "local shard failure message 123", "name": "remote1:*", "shard_ids": [ 0 ] } ] } } ``` 3) Open inspector 4) Open clusters tab Screen Shot 2023-09-22 at 9 52 49 AM ### Remote cluster (status=skipped, no remote) 1) Open discover 2) Kill process running remote1 elasticsearch 3) Select "kibana_sample_data*,remote1:kibana_sample_data*" data view 4) Open inspector 5) Open clusters tab Screen Shot 2023-09-22 at 9 55 45 AM --------- Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../__snapshots__/clusters_view.test.tsx.snap | 115 ++++++++++++ .../clusters_health/cluster_health.tsx | 56 ++++++ .../clusters_health/clusters_health.tsx | 87 +++++++++ .../clusters_health/gradient.test.ts | 23 +++ .../clusters_view/clusters_health/gradient.ts | 51 ++++++ .../clusters_view/clusters_health/index.ts | 10 ++ .../__snapshots__/cluster_view.test.tsx.snap | 165 ++++++++++++++++++ .../clusters_table/cluster_view.test.tsx | 162 +++++++++++++++++ .../clusters_table/cluster_view.tsx | 65 +++++++ .../clusters_table/clusters_table.tsx | 126 +++++++++++++ .../clusters_view/clusters_table/index.ts | 9 + .../__snapshots__/shards_view.test.tsx.snap | 89 ++++++++++ .../clusters_table/shards_view/index.ts | 10 ++ .../open_shard_failure_flyout_button.tsx | 50 ++++++ .../shards_view/shard_failure_details.tsx | 77 ++++++++ .../shards_view/shard_failure_flyout.tsx | 57 ++++++ .../shards_view/shard_failure_table.tsx | 117 +++++++++++++ .../shards_view/shards_view.test.tsx | 43 +++++ .../shards_view/shards_view.tsx | 60 +++++++ .../clusters_view/clusters_view.test.tsx | 116 ++++++++++++ .../details/clusters_view/clusters_view.tsx | 52 ++++++ .../components/details/clusters_view/index.ts | 9 + .../details/clusters_view/local_cluster.ts | 39 +++++ .../clusters_view/local_clusters.test.ts | 76 ++++++++ .../requests/components/details/index.ts | 1 + .../requests/components/request_details.tsx | 14 +- src/plugins/inspector/tsconfig.json | 3 + 27 files changed, 1681 insertions(+), 1 deletion(-) create mode 100644 src/plugins/inspector/public/views/requests/components/details/clusters_view/__snapshots__/clusters_view.test.tsx.snap create mode 100644 src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_health/cluster_health.tsx create mode 100644 src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_health/clusters_health.tsx create mode 100644 src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_health/gradient.test.ts create mode 100644 src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_health/gradient.ts create mode 100644 src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_health/index.ts create mode 100644 src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/__snapshots__/cluster_view.test.tsx.snap create mode 100644 src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/cluster_view.test.tsx create mode 100644 src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/cluster_view.tsx create mode 100644 src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/clusters_table.tsx create mode 100644 src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/index.ts create mode 100644 src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/shards_view/__snapshots__/shards_view.test.tsx.snap create mode 100644 src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/shards_view/index.ts create mode 100644 src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/shards_view/open_shard_failure_flyout_button.tsx create mode 100644 src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/shards_view/shard_failure_details.tsx create mode 100644 src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/shards_view/shard_failure_flyout.tsx create mode 100644 src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/shards_view/shard_failure_table.tsx create mode 100644 src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/shards_view/shards_view.test.tsx create mode 100644 src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/shards_view/shards_view.tsx create mode 100644 src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_view.test.tsx create mode 100644 src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_view.tsx create mode 100644 src/plugins/inspector/public/views/requests/components/details/clusters_view/index.ts create mode 100644 src/plugins/inspector/public/views/requests/components/details/clusters_view/local_cluster.ts create mode 100644 src/plugins/inspector/public/views/requests/components/details/clusters_view/local_clusters.test.ts diff --git a/src/plugins/inspector/public/views/requests/components/details/clusters_view/__snapshots__/clusters_view.test.tsx.snap b/src/plugins/inspector/public/views/requests/components/details/clusters_view/__snapshots__/clusters_view.test.tsx.snap new file mode 100644 index 0000000000000..4d4b46507925d --- /dev/null +++ b/src/plugins/inspector/public/views/requests/components/details/clusters_view/__snapshots__/clusters_view.test.tsx.snap @@ -0,0 +1,115 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`render should render local and remote cluster details from _clusters 1`] = ` + + + + + +`; + +exports[`render should render local cluster details from _shards 1`] = ` + + + + + +`; diff --git a/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_health/cluster_health.tsx b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_health/cluster_health.tsx new file mode 100644 index 0000000000000..4e4e57f5284c7 --- /dev/null +++ b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_health/cluster_health.tsx @@ -0,0 +1,56 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React from 'react'; +import { i18n } from '@kbn/i18n'; +import { EuiHealth, EuiText } from '@elastic/eui'; +import { HEALTH_HEX_CODES } from './gradient'; + +interface Props { + count?: number; + status: string; +} + +export function ClusterHealth({ count, status }: Props) { + if (typeof count === 'number' && count === 0) { + return null; + } + + let color = 'subdued'; + let statusLabel = status; + if (status === 'successful') { + color = HEALTH_HEX_CODES.successful; + statusLabel = i18n.translate('inspector.requests.clusters.successfulLabel', { + defaultMessage: 'successful', + }); + } else if (status === 'partial') { + color = HEALTH_HEX_CODES.partial; + statusLabel = i18n.translate('inspector.requests.clusters.partialLabel', { + defaultMessage: 'partial', + }); + } else if (status === 'skipped') { + color = HEALTH_HEX_CODES.skipped; + statusLabel = i18n.translate('inspector.requests.clusters.skippedLabel', { + defaultMessage: 'skipped', + }); + } else if (status === 'failed') { + color = HEALTH_HEX_CODES.failed; + statusLabel = i18n.translate('inspector.requests.clusters.failedLabel', { + defaultMessage: 'failed', + }); + } + + const label = typeof count === 'number' ? `${count} ${statusLabel}` : statusLabel; + return ( + + + {label} + + + ); +} diff --git a/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_health/clusters_health.tsx b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_health/clusters_health.tsx new file mode 100644 index 0000000000000..088e28c5e5787 --- /dev/null +++ b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_health/clusters_health.tsx @@ -0,0 +1,87 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { css } from '@emotion/react'; +import { euiThemeVars } from '@kbn/ui-theme'; +import { i18n } from '@kbn/i18n'; +import type { ClusterDetails } from '@kbn/es-types'; +import { EuiFlexGroup, EuiFlexItem, EuiText } from '@elastic/eui'; +import { ClusterHealth } from './cluster_health'; +import { getHeathBarLinearGradient } from './gradient'; + +interface Props { + clusters: Record; +} + +export function ClustersHealth({ clusters }: Props) { + let successful = 0; + let partial = 0; + let skipped = 0; + let failed = 0; + Object.values(clusters).forEach((clusterDetails) => { + if (clusterDetails.status === 'successful') { + successful++; + } else if (clusterDetails.status === 'partial') { + partial++; + } else if (clusterDetails.status === 'skipped') { + skipped++; + } else if (clusterDetails.status === 'failed') { + failed++; + } + }); + + return ( + <> + + + + {i18n.translate('inspector.requests.clusters.totalClustersLabel', { + defaultMessage: '{total} {total, plural, one {cluster} other {clusters}}', + values: { total: Object.keys(clusters).length }, + })} + + + + {successful > 0 ? ( + + + + ) : null} + + {partial > 0 ? ( + + + + ) : null} + + {skipped > 0 ? ( + + + + ) : null} + + {failed > 0 ? ( + + + + ) : null} + + +
+ + ); +} diff --git a/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_health/gradient.test.ts b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_health/gradient.test.ts new file mode 100644 index 0000000000000..fba44c72998ea --- /dev/null +++ b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_health/gradient.test.ts @@ -0,0 +1,23 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import { getHeathBarLinearGradient, HEALTH_HEX_CODES } from './gradient'; + +describe('getHeathBarLinearGradient', () => { + test('should return linear-gradient with percentages for each status', () => { + expect(getHeathBarLinearGradient(5, 1, 1, 2)).toBe( + `linear-gradient(to right, ${HEALTH_HEX_CODES.successful} 0% 56%, ${HEALTH_HEX_CODES.partial} 56% 67%, ${HEALTH_HEX_CODES.skipped} 67% 78%, ${HEALTH_HEX_CODES.failed} 78% 100%)` + ); + }); + + test('should return linear-gradient with percentages for each status with count above zero', () => { + expect(getHeathBarLinearGradient(5, 0, 0, 2)).toBe( + `linear-gradient(to right, ${HEALTH_HEX_CODES.successful} 0% 71%, ${HEALTH_HEX_CODES.failed} 71% 100%)` + ); + }); +}); diff --git a/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_health/gradient.ts b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_health/gradient.ts new file mode 100644 index 0000000000000..671819e31b3a7 --- /dev/null +++ b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_health/gradient.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 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 { euiThemeVars } from '@kbn/ui-theme'; + +export const HEALTH_HEX_CODES = { + successful: euiThemeVars.euiColorSuccess, + partial: euiThemeVars.euiColorWarning, + skipped: '#DA8B45', + failed: euiThemeVars.euiColorDanger, +}; + +export function getHeathBarLinearGradient( + successful: number, + partial: number, + skipped: number, + failed: number +) { + const total = successful + partial + skipped + failed; + const stops: string[] = []; + let startPercent: number = 0; + + function addStop(value: number, color: string) { + if (value <= 0) { + return; + } + + const percent = Math.round((value / total) * 100); + const endPercent = startPercent + percent; + stops.push(`${color} ${startPercent}% ${endPercent}%`); + startPercent = endPercent; + } + + addStop(successful, HEALTH_HEX_CODES.successful); + addStop(partial, HEALTH_HEX_CODES.partial); + addStop(skipped, HEALTH_HEX_CODES.skipped); + addStop(failed, HEALTH_HEX_CODES.failed); + + const printedStops = stops + .map((stop, index) => { + return index === stops.length - 1 ? stop : stop + ', '; + }) + .join(''); + + return `linear-gradient(to right, ${printedStops})`; +} diff --git a/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_health/index.ts b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_health/index.ts new file mode 100644 index 0000000000000..d821f0b9f7b10 --- /dev/null +++ b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_health/index.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export { ClustersHealth } from './clusters_health'; +export { ClusterHealth } from './cluster_health'; diff --git a/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/__snapshots__/cluster_view.test.tsx.snap b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/__snapshots__/cluster_view.test.tsx.snap new file mode 100644 index 0000000000000..66f1352ce8aab --- /dev/null +++ b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/__snapshots__/cluster_view.test.tsx.snap @@ -0,0 +1,165 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`render partial should display callout when request timed out 1`] = ` + + + + +`; + +exports[`render partial should show view shard failure button when there are shard failures 1`] = ` + + + +`; + +exports[`render should display success 1`] = ` + + + +`; + +exports[`render skipped or failed should display callout when cluster is unavailable 1`] = ` + + +

+ no_such_remote_cluster_exception: "no such remote cluster: [remote1]" +

+
+ +
+`; + +exports[`render skipped or failed should display callout with view failed shards button when all shards fail 1`] = ` + + +

+ search_phase_execution_exception: "all shards failed" +

+ +
+ +
+`; diff --git a/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/cluster_view.test.tsx b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/cluster_view.test.tsx new file mode 100644 index 0000000000000..762896bfb20d7 --- /dev/null +++ b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/cluster_view.test.tsx @@ -0,0 +1,162 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React from 'react'; +import { shallow } from 'enzyme'; +import type { ClusterDetails } from '@kbn/es-types'; +import { ClusterView } from './cluster_view'; + +describe('render', () => { + test('should display success', () => { + const clusterDetails = { + status: 'successful', + indices: 'kibana_sample_data*', + took: 10005, + timed_out: false, + _shards: { + total: 3, + successful: 3, + skipped: 0, + failed: 0, + }, + } as ClusterDetails; + const wrapper = shallow(); + expect(wrapper).toMatchSnapshot(); + }); + + describe('partial', () => { + test('should show view shard failure button when there are shard failures', () => { + const clusterDetails = { + status: 'partial', + indices: 'kibana_sample_data_logs,kibana_sample_data_flights', + took: 5, + timed_out: false, + _shards: { + total: 2, + successful: 1, + skipped: 0, + failed: 1, + }, + failures: [ + { + shard: 0, + index: 'remote1:.ds-kibana_sample_data_logs-2023.08.21-000001', + node: 'NVzFRd6SS4qT9o0k2vIzlg', + reason: { + type: 'query_shard_exception', + reason: + 'failed to create query: [.ds-kibana_sample_data_logs-2023.08.21-000001][0] local shard failure message 123', + index_uuid: 'z1sPO8E4TdWcijNgsL_BxQ', + index: 'remote1:.ds-kibana_sample_data_logs-2023.08.21-000001', + caused_by: { + type: 'runtime_exception', + reason: + 'runtime_exception: [.ds-kibana_sample_data_logs-2023.08.21-000001][0] local shard failure message 123', + }, + }, + }, + ], + } as ClusterDetails; + + const wrapper = shallow(); + expect(wrapper).toMatchSnapshot(); + }); + + test('should display callout when request timed out', () => { + const clusterDetails = { + status: 'partial', + indices: 'kibana_sample_data*', + took: 10005, + timed_out: true, + _shards: { + total: 3, + successful: 3, + skipped: 0, + failed: 0, + }, + } as ClusterDetails; + const wrapper = shallow(); + expect(wrapper).toMatchSnapshot(); + }); + }); + + describe('skipped or failed', () => { + test('should display callout when cluster is unavailable', () => { + const clusterDetails = { + status: 'skipped', + indices: 'kibana_sample_data*', + timed_out: false, + failures: [ + { + shard: -1, + index: null, + reason: { + type: 'no_such_remote_cluster_exception', + reason: 'no such remote cluster: [remote1]', + }, + }, + ], + } as unknown as ClusterDetails; + const wrapper = shallow(); + expect(wrapper).toMatchSnapshot(); + }); + + test('should display callout with view failed shards button when all shards fail', () => { + const clusterDetails = { + status: 'skipped', + indices: 'kibana_sample_data*', + timed_out: false, + failures: [ + { + shard: -1, + index: null, + reason: { + type: 'search_phase_execution_exception', + reason: 'all shards failed', + phase: 'query', + grouped: true, + failed_shards: [ + { + shard: 0, + index: 'remote1:.ds-kibana_sample_data_logs-2023.09.21-000001', + node: '_JVoOnN5QKidGGXFJAlgpA', + reason: { + type: 'query_shard_exception', + reason: + 'failed to create query: [.ds-kibana_sample_data_logs-2023.09.21-000001][0] local shard failure message 123', + index_uuid: 'PAa7v-dKRIyo4kv6b8dxkQ', + index: 'remote1:.ds-kibana_sample_data_logs-2023.09.21-000001', + caused_by: { + type: 'runtime_exception', + reason: + 'runtime_exception: [.ds-kibana_sample_data_logs-2023.09.21-000001][0] local shard failure message 123', + }, + }, + }, + ], + caused_by: { + type: 'query_shard_exception', + reason: + 'failed to create query: [.ds-kibana_sample_data_logs-2023.09.21-000001][0] local shard failure message 123', + index_uuid: 'PAa7v-dKRIyo4kv6b8dxkQ', + index: 'remote1:.ds-kibana_sample_data_logs-2023.09.21-000001', + caused_by: { + type: 'runtime_exception', + reason: + 'runtime_exception: [.ds-kibana_sample_data_logs-2023.09.21-000001][0] local shard failure message 123', + }, + }, + }, + }, + ], + } as unknown as ClusterDetails; + const wrapper = shallow(); + expect(wrapper).toMatchSnapshot(); + }); + }); +}); diff --git a/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/cluster_view.tsx b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/cluster_view.tsx new file mode 100644 index 0000000000000..ef0509110153e --- /dev/null +++ b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/cluster_view.tsx @@ -0,0 +1,65 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { i18n } from '@kbn/i18n'; +import type { ClusterDetails } from '@kbn/es-types'; +import { EuiCallOut, EuiText } from '@elastic/eui'; +import { ShardsView } from './shards_view'; +import { OpenShardFailureFlyoutButton } from './shards_view'; + +interface Props { + clusterDetails: ClusterDetails; +} + +export function ClusterView({ clusterDetails }: Props) { + const clusterFailure = (clusterDetails.failures ?? []).find((failure) => { + return failure.shard < 0; + }); + const shardFailures = (clusterDetails.failures ?? []).filter((failure) => { + return failure.shard >= 0; + }); + + return ( + + {clusterDetails.timed_out ? ( + + ) : null} + + {clusterFailure ? ( + +

+ {clusterFailure.reason.reason + ? `${clusterFailure.reason.type}: "${clusterFailure.reason.reason}"` + : clusterFailure.reason.type} +

+ {clusterFailure.reason.failed_shards ? ( + + ) : null} +
+ ) : null} + + +
+ ); +} diff --git a/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/clusters_table.tsx b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/clusters_table.tsx new file mode 100644 index 0000000000000..c9fea1a470f49 --- /dev/null +++ b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/clusters_table.tsx @@ -0,0 +1,126 @@ +/* + * Copyright 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, { useState, ReactNode } from 'react'; +import type { ClusterDetails } from '@kbn/es-types'; +import { i18n } from '@kbn/i18n'; +import { EuiBasicTable, type EuiBasicTableColumn, EuiButtonIcon, EuiText } from '@elastic/eui'; +import { ClusterView } from './cluster_view'; +import { ClusterHealth } from '../clusters_health'; +import { LOCAL_CLUSTER_KEY } from '../local_cluster'; + +function getInitialExpandedRow(clusters: Record) { + const clusterNames = Object.keys(clusters); + return clusterNames.length === 1 + ? { [clusterNames[0]]: } + : {}; +} + +interface ClusterColumn { + name: string; + status: string; + responseTime?: number; +} + +interface Props { + clusters: Record; +} + +export function ClustersTable({ clusters }: Props) { + const [expandedRows, setExpandedRows] = useState>( + getInitialExpandedRow(clusters) + ); + + const toggleDetails = (name: string) => { + const nextExpandedRows = { ...expandedRows }; + if (name in nextExpandedRows) { + delete nextExpandedRows[name]; + } else { + nextExpandedRows[name] = ; + } + setExpandedRows(nextExpandedRows); + }; + + const columns: Array> = [ + { + field: 'name', + name: i18n.translate('inspector.requests.clusters.table.nameLabel', { + defaultMessage: 'Name', + }), + render: (name: string) => { + return ( + <> + toggleDetails(name)} + aria-label={ + name in expandedRows + ? i18n.translate('inspector.requests.clusters.table.collapseRow', { + defaultMessage: 'Collapse table row to hide cluster details', + }) + : i18n.translate('inspector.requests.clusters.table.expandRow', { + defaultMessage: 'Expand table row to view cluster details', + }) + } + iconType={name in expandedRows ? 'arrowDown' : 'arrowRight'} + /> + + {name === LOCAL_CLUSTER_KEY + ? i18n.translate('inspector.requests.clusters.table.localClusterDisplayName', { + defaultMessage: 'Local cluster', + }) + : name} + + + ); + }, + width: '60%', + }, + { + field: 'status', + name: i18n.translate('inspector.requests.clusters.table.statusLabel', { + defaultMessage: 'Status', + }), + render: (status: string) => { + return ; + }, + }, + { + align: 'right' as 'right', + field: 'responseTime', + name: i18n.translate('inspector.requests.clusters.table.responseTimeLabel', { + defaultMessage: 'Response time', + }), + render: (responseTime: number | undefined) => ( + + {responseTime + ? i18n.translate('inspector.requests.clusters.table.responseTimeInMilliseconds', { + defaultMessage: '{responseTime}ms', + values: { responseTime }, + }) + : null} + + ), + }, + ]; + + return ( + { + return { + name: key, + status: clusters[key].status, + responseTime: clusters[key].took, + }; + })} + isExpandable={true} + itemIdToExpandedRowMap={expandedRows} + itemId="name" + columns={columns} + /> + ); +} diff --git a/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/index.ts b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/index.ts new file mode 100644 index 0000000000000..33825ff4adda2 --- /dev/null +++ b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/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 { ClustersTable } from './clusters_table'; diff --git a/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/shards_view/__snapshots__/shards_view.test.tsx.snap b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/shards_view/__snapshots__/shards_view.test.tsx.snap new file mode 100644 index 0000000000000..d361437fd8e91 --- /dev/null +++ b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/shards_view/__snapshots__/shards_view.test.tsx.snap @@ -0,0 +1,89 @@ +// Jest Snapshot v1, https://goo.gl/fbAQLP + +exports[`render should not render when no shard details are provided 1`] = `""`; + +exports[`render should render with failures 1`] = ` + + + + +

+ Shards +

+
+
+ + + +
+ + + 2 total shards + + + 1 of 2 successful + + +
+`; + +exports[`render should render with no failures 1`] = ` + + + + +

+ Shards +

+
+
+ + + +
+ + + 2 total shards + + + 2 of 2 successful + + +
+`; diff --git a/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/shards_view/index.ts b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/shards_view/index.ts new file mode 100644 index 0000000000000..5c3988d6ce091 --- /dev/null +++ b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/shards_view/index.ts @@ -0,0 +1,10 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +export { ShardsView } from './shards_view'; +export { OpenShardFailureFlyoutButton } from './open_shard_failure_flyout_button'; diff --git a/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/shards_view/open_shard_failure_flyout_button.tsx b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/shards_view/open_shard_failure_flyout_button.tsx new file mode 100644 index 0000000000000..dc90a1873b59b --- /dev/null +++ b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/shards_view/open_shard_failure_flyout_button.tsx @@ -0,0 +1,50 @@ +/* + * Copyright 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, { useState } from 'react'; +import { estypes } from '@elastic/elasticsearch'; +import { i18n } from '@kbn/i18n'; +import { EuiButtonEmpty } from '@elastic/eui'; +import { ShardFailureFlyout } from './shard_failure_flyout'; + +interface Props { + failures: estypes.ShardFailure[]; +} + +export function OpenShardFailureFlyoutButton({ failures }: Props) { + const [showFailures, setShowFailures] = useState(false); + + return ( + <> + {failures.length ? ( + { + setShowFailures(!showFailures); + }} + size="xs" + > + {i18n.translate('inspector.requests.clusters.shards.openShardFailureFlyoutButtonLabel', { + defaultMessage: + 'View {failedShardCount} failed {failedShardCount, plural, one {shard} other {shards}}', + values: { failedShardCount: failures.length }, + })} + + ) : null} + + {showFailures ? ( + { + setShowFailures(false); + }} + /> + ) : null} + + ); +} diff --git a/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/shards_view/shard_failure_details.tsx b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/shards_view/shard_failure_details.tsx new file mode 100644 index 0000000000000..e6f767f5d9d7a --- /dev/null +++ b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/shards_view/shard_failure_details.tsx @@ -0,0 +1,77 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { estypes } from '@elastic/elasticsearch'; +import { i18n } from '@kbn/i18n'; +import { EuiDescriptionList, EuiCodeBlock, EuiText } from '@elastic/eui'; +import { getFlattenedObject } from '@kbn/std'; + +/** + * Provides pretty formatting of a given key string + * e.g. formats "this_key.is_nice" to "This key is nice" + * @param key + */ +export function formatKey(key: string): string { + const nameCapitalized = key.charAt(0).toUpperCase() + key.slice(1); + return nameCapitalized.replace(/[\._]/g, ' '); +} +/** + * Adds a EuiCodeBlock to values of `script` and `script_stack` key + * Values of other keys are handled a strings + * @param value + * @param key + */ +export function formatValueByKey(value: unknown, key: string): JSX.Element { + if (key === 'script' || key === 'script_stack') { + const valueScript = Array.isArray(value) ? value.join('\n') : String(value); + return ( + + {valueScript} + + ); + } + + return {String(value)}; +} + +interface Props { + failure: estypes.ShardFailure; +} + +export function ShardFailureDetails({ failure }: Props) { + const flattendReason = getFlattenedObject(failure.reason); + + const reasonItems = Object.entries(flattendReason) + .filter(([key]) => key !== 'type') + .map(([key, value]) => ({ + title: formatKey(key), + description: formatValueByKey(value, key), + })); + + const items = [ + { + title: i18n.translate('inspector.requests.clusters.shards.details.nodeLabel', { + defaultMessage: 'Node', + }), + description: formatValueByKey(failure.node, 'node'), + }, + ...reasonItems, + ]; + + return ( + + + + ); +} diff --git a/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/shards_view/shard_failure_flyout.tsx b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/shards_view/shard_failure_flyout.tsx new file mode 100644 index 0000000000000..8749f9764fe74 --- /dev/null +++ b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/shards_view/shard_failure_flyout.tsx @@ -0,0 +1,57 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React from 'react'; +import { estypes } from '@elastic/elasticsearch'; +import { i18n } from '@kbn/i18n'; +import { + EuiButtonIcon, + EuiButtonEmpty, + EuiFlyout, + EuiFlyoutBody, + EuiFlyoutFooter, + EuiFlyoutHeader, + EuiTitle, +} from '@elastic/eui'; +import { ShardFailureTable } from './shard_failure_table'; + +interface Props { + failures: estypes.ShardFailure[]; + onClose: () => void; +} + +export function ShardFailureFlyout({ failures, onClose }: Props) { + return ( + + + +

+ + {i18n.translate('inspector.requests.clusters.shards.flyoutTitle', { + defaultMessage: + '{failedShardCount} failured {failedShardCount, plural, one {shard} other {shards}}', + values: { failedShardCount: failures.length }, + })} +

+
+
+ + + + + + + + {i18n.translate('inspector.requests.clusters.shards.backButtonLabel', { + defaultMessage: 'Back', + })} + + +
+ ); +} diff --git a/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/shards_view/shard_failure_table.tsx b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/shards_view/shard_failure_table.tsx new file mode 100644 index 0000000000000..344b17b38a741 --- /dev/null +++ b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/shards_view/shard_failure_table.tsx @@ -0,0 +1,117 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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, { useState, ReactNode } from 'react'; +import { estypes } from '@elastic/elasticsearch'; +import { i18n } from '@kbn/i18n'; +import { EuiBasicTable, type EuiBasicTableColumn, EuiButtonIcon, EuiText } from '@elastic/eui'; +import { ShardFailureDetails } from './shard_failure_details'; + +function getRowId(failure: estypes.ShardFailure) { + return `${failure.shard}${failure.index}`; +} + +interface ShardRow { + rowId: string; + shard: number; + index?: string; + failureType: string; +} + +interface Props { + failures: estypes.ShardFailure[]; +} + +export function ShardFailureTable({ failures }: Props) { + const [expandedRows, setExpandedRows] = useState>({}); + + const toggleDetails = (rowId: string) => { + const nextExpandedRows = { ...expandedRows }; + if (rowId in nextExpandedRows) { + delete nextExpandedRows[rowId]; + } else { + const shardFailure = failures.find((failure) => rowId === getRowId(failure)); + nextExpandedRows[rowId] = shardFailure ? ( + + ) : null; + } + setExpandedRows(nextExpandedRows); + }; + + const columns: Array> = [ + { + field: 'shard', + name: i18n.translate('inspector.requests.clusters.shards.table.shardLabel', { + defaultMessage: 'Shard', + }), + render: (shard: number, item: ShardRow) => { + return ( + <> + toggleDetails(item.rowId)} + aria-label={ + item.rowId in expandedRows + ? i18n.translate('inspector.requests.clusters.shards.table.collapseRow', { + defaultMessage: 'Collapse table row to hide shard details', + }) + : i18n.translate('inspector.requests.clusters.shards.table.expandRow', { + defaultMessage: 'Expand table row to view shard details', + }) + } + iconType={item.rowId in expandedRows ? 'arrowDown' : 'arrowRight'} + /> + + {shard} + + + ); + }, + width: '20%', + }, + { + field: 'index', + name: i18n.translate('inspector.requests.clusters.shards.table.indexLabel', { + defaultMessage: 'Index', + }), + render: (index?: string) => + index ? ( + + {index} + + ) : null, + }, + { + field: 'failureType', + name: i18n.translate('inspector.requests.clusters.shards.table.failureTypeLabel', { + defaultMessage: 'Failure type', + }), + render: (failureType: string) => ( + + {failureType} + + ), + }, + ]; + + return ( + { + return { + rowId: getRowId(failure), + shard: failure.shard, + index: failure.index, + failureType: failure.reason.type, + }; + })} + isExpandable={true} + itemIdToExpandedRowMap={expandedRows} + itemId="rowId" + columns={columns} + /> + ); +} diff --git a/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/shards_view/shards_view.test.tsx b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/shards_view/shards_view.test.tsx new file mode 100644 index 0000000000000..14a69c03269f1 --- /dev/null +++ b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/shards_view/shards_view.test.tsx @@ -0,0 +1,43 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React from 'react'; +import { estypes } from '@elastic/elasticsearch'; +import { shallow } from 'enzyme'; +import { ShardsView } from './shards_view'; + +describe('render', () => { + test('should render with no failures', () => { + const shardStats = { + total: 2, + successful: 2, + skipped: 0, + failed: 0, + }; + const wrapper = shallow(); + expect(wrapper).toMatchSnapshot(); + }); + + test('should render with failures', () => { + const shardStats = { + total: 2, + successful: 1, + skipped: 0, + failed: 1, + }; + const wrapper = shallow( + + ); + expect(wrapper).toMatchSnapshot(); + }); + + test('should not render when no shard details are provided', () => { + const wrapper = shallow(); + expect(wrapper).toMatchSnapshot(); + }); +}); diff --git a/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/shards_view/shards_view.tsx b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/shards_view/shards_view.tsx new file mode 100644 index 0000000000000..479a71817d96c --- /dev/null +++ b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_table/shards_view/shards_view.tsx @@ -0,0 +1,60 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 and the Server Side Public License, v 1; you may not use this file except + * in compliance with, at your election, the Elastic License 2.0 or the Server + * Side Public License, v 1. + */ + +import React from 'react'; +import { estypes } from '@elastic/elasticsearch'; +import { i18n } from '@kbn/i18n'; +import { EuiFlexGroup, EuiFlexItem, EuiTitle } from '@elastic/eui'; +import { OpenShardFailureFlyoutButton } from './open_shard_failure_flyout_button'; + +interface Props { + failures: estypes.ShardFailure[]; + shardStats?: estypes.ShardStatistics; +} + +export function ShardsView({ failures, shardStats }: Props) { + return !shardStats && failures.length === 0 ? null : ( + <> + + + +

+ {i18n.translate('inspector.requests.clusters.shards.shardsTitle', { + defaultMessage: 'Shards', + })} +

+
+
+ + + + +
+ + {shardStats ? ( + + + {i18n.translate('inspector.requests.clusters.shards.totalShardsLabel', { + defaultMessage: '{total} total shards', + values: { total: shardStats.total }, + })} + + + {i18n.translate('inspector.requests.clusters.shards.successfulShardsLabel', { + defaultMessage: '{successful} of {total} successful', + values: { + successful: shardStats.successful, + total: shardStats.total, + }, + })} + + + ) : null} + + ); +} diff --git a/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_view.test.tsx b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_view.test.tsx new file mode 100644 index 0000000000000..971c3bad5bef8 --- /dev/null +++ b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_view.test.tsx @@ -0,0 +1,116 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { shallow } from 'enzyme'; +import { ClustersView } from './clusters_view'; +import { Request } from '../../../../../../common/adapters/request/types'; + +describe('shouldShow', () => { + test('should return true when response contains _shards', () => { + const request = { + response: { + json: { + rawResponse: { + _shards: {}, + }, + }, + }, + } as unknown as Request; + expect(ClustersView.shouldShow(request)).toBe(true); + }); + + test('should return true when response contains _clusters', () => { + const request = { + response: { + json: { + rawResponse: { + _clusters: {}, + }, + }, + }, + } as unknown as Request; + expect(ClustersView.shouldShow(request)).toBe(true); + }); + + test('should return false when response does not contains _shards or _clusters', () => { + const request = { + response: { + json: { + rawResponse: {}, + }, + }, + } as unknown as Request; + expect(ClustersView.shouldShow(request)).toBe(false); + }); +}); + +describe('render', () => { + test('should render local cluster details from _shards', () => { + const request = { + response: { + json: { + rawResponse: { + _shards: { + total: 2, + successful: 2, + skipped: 0, + failed: 0, + }, + }, + }, + }, + } as unknown as Request; + const wrapper = shallow(); + expect(wrapper).toMatchSnapshot(); + }); + + test('should render local and remote cluster details from _clusters', () => { + const request = { + response: { + json: { + rawResponse: { + _clusters: { + total: 2, + successful: 2, + skipped: 0, + details: { + '(local)': { + status: 'successful', + indices: 'kibana_sample_data_logs,kibana_sample_data_flights', + took: 0, + timed_out: false, + _shards: { + total: 2, + successful: 2, + skipped: 0, + failed: 0, + }, + }, + remote1: { + status: 'successful', + indices: 'kibana_sample_data_logs,kibana_sample_data_flights', + took: 1, + timed_out: false, + _shards: { + total: 2, + successful: 2, + skipped: 0, + failed: 0, + }, + }, + }, + }, + }, + }, + }, + } as unknown as Request; + const wrapper = shallow(); + expect(wrapper).toMatchSnapshot(); + }); +}); diff --git a/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_view.tsx b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_view.tsx new file mode 100644 index 0000000000000..7621bbf842c8d --- /dev/null +++ b/src/plugins/inspector/public/views/requests/components/details/clusters_view/clusters_view.tsx @@ -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 React, { Component } from 'react'; +import { estypes } from '@elastic/elasticsearch'; +import { EuiSpacer } from '@elastic/eui'; +import type { ClusterDetails } from '@kbn/es-types'; +import { Request } from '../../../../../../common/adapters/request/types'; +import type { RequestDetailsProps } from '../../types'; +import { getLocalClusterDetails, LOCAL_CLUSTER_KEY } from './local_cluster'; +import { ClustersHealth } from './clusters_health'; +import { ClustersTable } from './clusters_table'; + +export class ClustersView extends Component { + static shouldShow = (request: Request) => + Boolean( + (request.response?.json as { rawResponse?: estypes.SearchResponse })?.rawResponse?._shards || + (request.response?.json as { rawResponse?: estypes.SearchResponse })?.rawResponse?._clusters + ); + + render() { + const rawResponse = ( + this.props.request.response?.json as { rawResponse?: estypes.SearchResponse } + )?.rawResponse; + if (!rawResponse) { + return null; + } + + const clusters = rawResponse._clusters + ? ( + rawResponse._clusters as estypes.ClusterStatistics & { + details: Record; + } + ).details + : { + [LOCAL_CLUSTER_KEY]: getLocalClusterDetails(rawResponse), + }; + + return this.props.request.response?.json ? ( + <> + + + + + ) : null; + } +} diff --git a/src/plugins/inspector/public/views/requests/components/details/clusters_view/index.ts b/src/plugins/inspector/public/views/requests/components/details/clusters_view/index.ts new file mode 100644 index 0000000000000..f3eb2d611b0d7 --- /dev/null +++ b/src/plugins/inspector/public/views/requests/components/details/clusters_view/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 { ClustersView } from './clusters_view'; diff --git a/src/plugins/inspector/public/views/requests/components/details/clusters_view/local_cluster.ts b/src/plugins/inspector/public/views/requests/components/details/clusters_view/local_cluster.ts new file mode 100644 index 0000000000000..aac2266500bab --- /dev/null +++ b/src/plugins/inspector/public/views/requests/components/details/clusters_view/local_cluster.ts @@ -0,0 +1,39 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0 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 { estypes } from '@elastic/elasticsearch'; +import type { ClusterDetails } from '@kbn/es-types'; + +export const LOCAL_CLUSTER_KEY = '(local)'; + +function getLocalClusterStatus(rawResponse: estypes.SearchResponse): ClusterDetails['status'] { + if (rawResponse._shards?.successful === 0) { + return 'failed'; + } + + if (rawResponse.timed_out || rawResponse._shards.failed) { + return 'partial'; + } + + return 'successful'; +} + +export function getLocalClusterDetails(rawResponse: estypes.SearchResponse) { + const shards = { + ...rawResponse._shards, + }; + delete shards.failures; + return { + status: getLocalClusterStatus(rawResponse), + indices: '', + took: rawResponse.took, + timed_out: rawResponse.timed_out, + _shards: shards, + failures: rawResponse._shards.failures, + }; +} diff --git a/src/plugins/inspector/public/views/requests/components/details/clusters_view/local_clusters.test.ts b/src/plugins/inspector/public/views/requests/components/details/clusters_view/local_clusters.test.ts new file mode 100644 index 0000000000000..9ef80260b3a3f --- /dev/null +++ b/src/plugins/inspector/public/views/requests/components/details/clusters_view/local_clusters.test.ts @@ -0,0 +1,76 @@ +/* + * Copyright 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 { estypes } from '@elastic/elasticsearch'; +import { getLocalClusterDetails } from './local_cluster'; + +describe('getLocalClusterDetails', () => { + test('should convert local cluster SearchResponseBody into ClusterDetails', () => { + expect( + getLocalClusterDetails({ + took: 14, + timed_out: false, + _shards: { + total: 2, + successful: 1, + skipped: 0, + failed: 1, + failures: [ + { + shard: 0, + index: '.ds-kibana_sample_data_logs-2023.09.20-000001', + node: 'tGUEVPsHR4uhEAdL0oANsA', + reason: { + type: 'query_shard_exception', + reason: + 'failed to create query: [.ds-kibana_sample_data_logs-2023.09.20-000001][0] local shard failure message 123', + index_uuid: 'z31al9BiSk2prpzZED-hTA', + index: '.ds-kibana_sample_data_logs-2023.09.20-000001', + caused_by: { + type: 'runtime_exception', + reason: + '[.ds-kibana_sample_data_logs-2023.09.20-000001][0] local shard failure message 123', + }, + }, + }, + ], + }, + } as unknown as estypes.SearchResponse) + ).toEqual({ + _shards: { + failed: 1, + skipped: 0, + successful: 1, + total: 2, + }, + failures: [ + { + index: '.ds-kibana_sample_data_logs-2023.09.20-000001', + node: 'tGUEVPsHR4uhEAdL0oANsA', + reason: { + caused_by: { + reason: + '[.ds-kibana_sample_data_logs-2023.09.20-000001][0] local shard failure message 123', + type: 'runtime_exception', + }, + index: '.ds-kibana_sample_data_logs-2023.09.20-000001', + index_uuid: 'z31al9BiSk2prpzZED-hTA', + reason: + 'failed to create query: [.ds-kibana_sample_data_logs-2023.09.20-000001][0] local shard failure message 123', + type: 'query_shard_exception', + }, + shard: 0, + }, + ], + indices: '', + status: 'partial', + timed_out: false, + took: 14, + }); + }); +}); diff --git a/src/plugins/inspector/public/views/requests/components/details/index.ts b/src/plugins/inspector/public/views/requests/components/details/index.ts index 61bc021873e6a..49356d695f47d 100644 --- a/src/plugins/inspector/public/views/requests/components/details/index.ts +++ b/src/plugins/inspector/public/views/requests/components/details/index.ts @@ -9,3 +9,4 @@ export { RequestDetailsRequest } from './req_details_request'; export { RequestDetailsResponse } from './req_details_response'; export { RequestDetailsStats } from './req_details_stats'; +export { ClustersView } from './clusters_view'; diff --git a/src/plugins/inspector/public/views/requests/components/request_details.tsx b/src/plugins/inspector/public/views/requests/components/request_details.tsx index 7292456f848df..6130e9e33390a 100644 --- a/src/plugins/inspector/public/views/requests/components/request_details.tsx +++ b/src/plugins/inspector/public/views/requests/components/request_details.tsx @@ -11,7 +11,12 @@ import PropTypes from 'prop-types'; import { i18n } from '@kbn/i18n'; import { EuiTab, EuiTabs } from '@elastic/eui'; -import { RequestDetailsRequest, RequestDetailsResponse, RequestDetailsStats } from './details'; +import { + ClustersView, + RequestDetailsRequest, + RequestDetailsResponse, + RequestDetailsStats, +} from './details'; import { RequestDetailsProps } from './types'; interface RequestDetailsState { @@ -33,6 +38,13 @@ const DETAILS: DetailViewData[] = [ }), component: RequestDetailsStats, }, + { + name: 'clusters', + label: i18n.translate('inspector.requests.clustersTabLabel', { + defaultMessage: 'Clusters', + }), + component: ClustersView, + }, { name: 'Request', label: i18n.translate('inspector.requests.requestTabLabel', { diff --git a/src/plugins/inspector/tsconfig.json b/src/plugins/inspector/tsconfig.json index 3417096596015..9c5654be26249 100644 --- a/src/plugins/inspector/tsconfig.json +++ b/src/plugins/inspector/tsconfig.json @@ -14,6 +14,9 @@ "@kbn/monaco", "@kbn/core-ui-settings-browser-mocks", "@kbn/core-ui-settings-browser", + "@kbn/std", + "@kbn/es-types", + "@kbn/ui-theme" ], "exclude": [ "target/**/*", From f5705f3668675728fe69ba2c327aa251d48e84f2 Mon Sep 17 00:00:00 2001 From: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 27 Sep 2023 00:39:42 -0400 Subject: [PATCH 21/26] [api-docs] 2023-09-27 Daily api_docs build (#167364) Generated by https://buildkite.com/elastic/kibana-api-docs-daily/builds/473 --- api_docs/actions.mdx | 2 +- api_docs/advanced_settings.mdx | 2 +- api_docs/aiops.mdx | 2 +- api_docs/alerting.devdocs.json | 24 +- api_docs/alerting.mdx | 4 +- api_docs/apm.devdocs.json | 36 +- api_docs/apm.mdx | 2 +- api_docs/apm_data_access.mdx | 2 +- api_docs/asset_manager.mdx | 2 +- api_docs/banners.mdx | 2 +- api_docs/bfetch.mdx | 2 +- api_docs/canvas.mdx | 2 +- api_docs/cases.mdx | 2 +- api_docs/charts.mdx | 2 +- api_docs/cloud.mdx | 2 +- api_docs/cloud_chat.mdx | 2 +- api_docs/cloud_chat_provider.mdx | 2 +- api_docs/cloud_data_migration.mdx | 2 +- api_docs/cloud_defend.mdx | 2 +- api_docs/cloud_experiments.mdx | 2 +- api_docs/cloud_security_posture.mdx | 2 +- api_docs/console.mdx | 2 +- api_docs/content_management.mdx | 2 +- api_docs/controls.mdx | 2 +- api_docs/custom_integrations.mdx | 2 +- api_docs/dashboard.mdx | 2 +- api_docs/dashboard_enhanced.mdx | 2 +- api_docs/data.devdocs.json | 20 +- api_docs/data.mdx | 2 +- api_docs/data_query.mdx | 2 +- api_docs/data_search.mdx | 2 +- api_docs/data_view_editor.devdocs.json | 328 +++++++++++++++++- api_docs/data_view_editor.mdx | 7 +- api_docs/data_view_field_editor.mdx | 2 +- api_docs/data_view_management.mdx | 2 +- api_docs/data_views.devdocs.json | 24 +- api_docs/data_views.mdx | 2 +- api_docs/data_visualizer.devdocs.json | 16 +- api_docs/data_visualizer.mdx | 2 +- api_docs/deprecations_by_api.mdx | 16 +- api_docs/deprecations_by_plugin.mdx | 12 +- api_docs/deprecations_by_team.mdx | 2 +- api_docs/dev_tools.mdx | 2 +- api_docs/discover.mdx | 2 +- api_docs/discover_enhanced.mdx | 2 +- api_docs/ecs_data_quality_dashboard.mdx | 2 +- api_docs/elastic_assistant.mdx | 2 +- api_docs/embeddable.devdocs.json | 14 + api_docs/embeddable.mdx | 4 +- api_docs/embeddable_enhanced.mdx | 2 +- api_docs/encrypted_saved_objects.mdx | 2 +- api_docs/enterprise_search.devdocs.json | 22 +- api_docs/enterprise_search.mdx | 5 +- api_docs/es_ui_shared.mdx | 2 +- api_docs/event_annotation.mdx | 2 +- api_docs/event_annotation_listing.mdx | 2 +- api_docs/event_log.mdx | 2 +- api_docs/exploratory_view.mdx | 2 +- api_docs/expression_error.mdx | 2 +- api_docs/expression_gauge.mdx | 2 +- api_docs/expression_heatmap.mdx | 2 +- api_docs/expression_image.mdx | 2 +- api_docs/expression_legacy_metric_vis.mdx | 2 +- api_docs/expression_metric.mdx | 2 +- api_docs/expression_metric_vis.mdx | 2 +- api_docs/expression_partition_vis.mdx | 2 +- api_docs/expression_repeat_image.mdx | 2 +- api_docs/expression_reveal_image.mdx | 2 +- api_docs/expression_shape.mdx | 2 +- api_docs/expression_tagcloud.mdx | 2 +- api_docs/expression_x_y.mdx | 2 +- api_docs/expressions.mdx | 2 +- api_docs/features.mdx | 2 +- api_docs/field_formats.mdx | 2 +- api_docs/file_upload.mdx | 2 +- api_docs/files.mdx | 2 +- api_docs/files_management.mdx | 2 +- api_docs/fleet.mdx | 2 +- api_docs/global_search.mdx | 2 +- api_docs/guided_onboarding.mdx | 2 +- api_docs/home.mdx | 2 +- api_docs/image_embeddable.mdx | 2 +- api_docs/index_lifecycle_management.mdx | 2 +- api_docs/index_management.mdx | 2 +- api_docs/infra.mdx | 2 +- api_docs/inspector.mdx | 2 +- api_docs/interactive_setup.mdx | 2 +- api_docs/kbn_ace.mdx | 2 +- api_docs/kbn_aiops_components.devdocs.json | 32 ++ api_docs/kbn_aiops_components.mdx | 4 +- api_docs/kbn_aiops_utils.mdx | 2 +- .../kbn_alerting_api_integration_helpers.mdx | 2 +- api_docs/kbn_alerting_state_types.mdx | 2 +- api_docs/kbn_alerts_as_data_utils.mdx | 2 +- api_docs/kbn_alerts_ui_shared.mdx | 2 +- api_docs/kbn_analytics.mdx | 2 +- api_docs/kbn_analytics_client.devdocs.json | 8 + api_docs/kbn_analytics_client.mdx | 2 +- ..._analytics_shippers_elastic_v3_browser.mdx | 2 +- ...n_analytics_shippers_elastic_v3_common.mdx | 2 +- ...n_analytics_shippers_elastic_v3_server.mdx | 2 +- api_docs/kbn_analytics_shippers_fullstory.mdx | 2 +- api_docs/kbn_analytics_shippers_gainsight.mdx | 2 +- api_docs/kbn_apm_config_loader.mdx | 2 +- api_docs/kbn_apm_synthtrace.mdx | 2 +- api_docs/kbn_apm_synthtrace_client.mdx | 2 +- api_docs/kbn_apm_utils.mdx | 2 +- api_docs/kbn_axe_config.mdx | 2 +- api_docs/kbn_cases_components.mdx | 2 +- api_docs/kbn_cell_actions.mdx | 2 +- api_docs/kbn_chart_expressions_common.mdx | 2 +- api_docs/kbn_chart_icons.mdx | 2 +- api_docs/kbn_ci_stats_core.mdx | 2 +- api_docs/kbn_ci_stats_performance_metrics.mdx | 2 +- api_docs/kbn_ci_stats_reporter.mdx | 2 +- api_docs/kbn_cli_dev_mode.mdx | 2 +- api_docs/kbn_code_editor.mdx | 2 +- api_docs/kbn_code_editor_mocks.mdx | 2 +- api_docs/kbn_coloring.mdx | 2 +- api_docs/kbn_config.mdx | 2 +- api_docs/kbn_config_mocks.mdx | 2 +- api_docs/kbn_config_schema.mdx | 2 +- .../kbn_content_management_content_editor.mdx | 2 +- ...tent_management_tabbed_table_list_view.mdx | 2 +- ...kbn_content_management_table_list_view.mdx | 2 +- ...ntent_management_table_list_view_table.mdx | 2 +- api_docs/kbn_content_management_utils.mdx | 2 +- api_docs/kbn_core_analytics_browser.mdx | 2 +- .../kbn_core_analytics_browser_internal.mdx | 2 +- api_docs/kbn_core_analytics_browser_mocks.mdx | 2 +- api_docs/kbn_core_analytics_server.mdx | 2 +- .../kbn_core_analytics_server_internal.mdx | 2 +- api_docs/kbn_core_analytics_server_mocks.mdx | 2 +- api_docs/kbn_core_application_browser.mdx | 2 +- .../kbn_core_application_browser_internal.mdx | 2 +- .../kbn_core_application_browser_mocks.mdx | 2 +- api_docs/kbn_core_application_common.mdx | 2 +- api_docs/kbn_core_apps_browser_internal.mdx | 2 +- api_docs/kbn_core_apps_browser_mocks.mdx | 2 +- api_docs/kbn_core_apps_server_internal.mdx | 2 +- api_docs/kbn_core_base_browser_mocks.mdx | 2 +- api_docs/kbn_core_base_common.mdx | 2 +- api_docs/kbn_core_base_server_internal.mdx | 2 +- api_docs/kbn_core_base_server_mocks.mdx | 2 +- .../kbn_core_capabilities_browser_mocks.mdx | 2 +- api_docs/kbn_core_capabilities_common.mdx | 2 +- api_docs/kbn_core_capabilities_server.mdx | 2 +- .../kbn_core_capabilities_server_mocks.mdx | 2 +- api_docs/kbn_core_chrome_browser.mdx | 2 +- api_docs/kbn_core_chrome_browser_mocks.mdx | 2 +- api_docs/kbn_core_config_server_internal.mdx | 2 +- api_docs/kbn_core_custom_branding_browser.mdx | 2 +- ..._core_custom_branding_browser_internal.mdx | 2 +- ...kbn_core_custom_branding_browser_mocks.mdx | 2 +- api_docs/kbn_core_custom_branding_common.mdx | 2 +- api_docs/kbn_core_custom_branding_server.mdx | 2 +- ...n_core_custom_branding_server_internal.mdx | 2 +- .../kbn_core_custom_branding_server_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_browser.mdx | 2 +- ...kbn_core_deprecations_browser_internal.mdx | 2 +- .../kbn_core_deprecations_browser_mocks.mdx | 2 +- api_docs/kbn_core_deprecations_common.mdx | 2 +- api_docs/kbn_core_deprecations_server.mdx | 2 +- .../kbn_core_deprecations_server_internal.mdx | 2 +- .../kbn_core_deprecations_server_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_browser.mdx | 2 +- api_docs/kbn_core_doc_links_browser_mocks.mdx | 2 +- api_docs/kbn_core_doc_links_server.mdx | 2 +- api_docs/kbn_core_doc_links_server_mocks.mdx | 2 +- ...e_elasticsearch_client_server_internal.mdx | 2 +- ...core_elasticsearch_client_server_mocks.mdx | 2 +- api_docs/kbn_core_elasticsearch_server.mdx | 2 +- ...kbn_core_elasticsearch_server_internal.mdx | 2 +- .../kbn_core_elasticsearch_server_mocks.mdx | 2 +- .../kbn_core_environment_server_internal.mdx | 2 +- .../kbn_core_environment_server_mocks.mdx | 2 +- .../kbn_core_execution_context_browser.mdx | 2 +- ...ore_execution_context_browser_internal.mdx | 2 +- ...n_core_execution_context_browser_mocks.mdx | 2 +- .../kbn_core_execution_context_common.mdx | 2 +- .../kbn_core_execution_context_server.mdx | 2 +- ...core_execution_context_server_internal.mdx | 2 +- ...bn_core_execution_context_server_mocks.mdx | 2 +- api_docs/kbn_core_fatal_errors_browser.mdx | 2 +- .../kbn_core_fatal_errors_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_browser.mdx | 2 +- api_docs/kbn_core_http_browser_internal.mdx | 2 +- api_docs/kbn_core_http_browser_mocks.mdx | 2 +- api_docs/kbn_core_http_common.mdx | 2 +- .../kbn_core_http_context_server_mocks.mdx | 2 +- ...re_http_request_handler_context_server.mdx | 2 +- api_docs/kbn_core_http_resources_server.mdx | 2 +- ...bn_core_http_resources_server_internal.mdx | 2 +- .../kbn_core_http_resources_server_mocks.mdx | 2 +- .../kbn_core_http_router_server_internal.mdx | 2 +- .../kbn_core_http_router_server_mocks.mdx | 2 +- api_docs/kbn_core_http_server.devdocs.json | 34 +- api_docs/kbn_core_http_server.mdx | 2 +- api_docs/kbn_core_http_server_internal.mdx | 2 +- api_docs/kbn_core_http_server_mocks.mdx | 2 +- api_docs/kbn_core_i18n_browser.mdx | 2 +- api_docs/kbn_core_i18n_browser_mocks.mdx | 2 +- api_docs/kbn_core_i18n_server.mdx | 2 +- api_docs/kbn_core_i18n_server_internal.mdx | 2 +- api_docs/kbn_core_i18n_server_mocks.mdx | 2 +- ...n_core_injected_metadata_browser_mocks.mdx | 2 +- ...kbn_core_integrations_browser_internal.mdx | 2 +- .../kbn_core_integrations_browser_mocks.mdx | 2 +- .../kbn_core_lifecycle_browser.devdocs.json | 4 - api_docs/kbn_core_lifecycle_browser.mdx | 2 +- api_docs/kbn_core_lifecycle_browser_mocks.mdx | 2 +- api_docs/kbn_core_lifecycle_server.mdx | 2 +- api_docs/kbn_core_lifecycle_server_mocks.mdx | 2 +- api_docs/kbn_core_logging_browser_mocks.mdx | 2 +- api_docs/kbn_core_logging_common_internal.mdx | 2 +- api_docs/kbn_core_logging_server.mdx | 2 +- api_docs/kbn_core_logging_server_internal.mdx | 2 +- api_docs/kbn_core_logging_server_mocks.mdx | 2 +- ...ore_metrics_collectors_server_internal.mdx | 2 +- ...n_core_metrics_collectors_server_mocks.mdx | 2 +- api_docs/kbn_core_metrics_server.mdx | 2 +- api_docs/kbn_core_metrics_server_internal.mdx | 2 +- api_docs/kbn_core_metrics_server_mocks.mdx | 2 +- api_docs/kbn_core_mount_utils_browser.mdx | 2 +- api_docs/kbn_core_node_server.mdx | 2 +- api_docs/kbn_core_node_server_internal.mdx | 2 +- api_docs/kbn_core_node_server_mocks.mdx | 2 +- api_docs/kbn_core_notifications_browser.mdx | 2 +- ...otifications_browser_internal.devdocs.json | 12 +- ...bn_core_notifications_browser_internal.mdx | 2 +- .../kbn_core_notifications_browser_mocks.mdx | 2 +- api_docs/kbn_core_overlays_browser.mdx | 2 +- .../kbn_core_overlays_browser_internal.mdx | 2 +- api_docs/kbn_core_overlays_browser_mocks.mdx | 2 +- api_docs/kbn_core_plugins_browser.mdx | 2 +- api_docs/kbn_core_plugins_browser_mocks.mdx | 2 +- api_docs/kbn_core_plugins_server.mdx | 2 +- api_docs/kbn_core_plugins_server_mocks.mdx | 2 +- api_docs/kbn_core_preboot_server.mdx | 2 +- api_docs/kbn_core_preboot_server_mocks.mdx | 2 +- api_docs/kbn_core_rendering_browser_mocks.mdx | 2 +- .../kbn_core_rendering_server_internal.mdx | 2 +- api_docs/kbn_core_rendering_server_mocks.mdx | 2 +- api_docs/kbn_core_root_server_internal.mdx | 2 +- ...ore_saved_objects_api_browser.devdocs.json | 16 - .../kbn_core_saved_objects_api_browser.mdx | 2 +- .../kbn_core_saved_objects_api_server.mdx | 2 +- ...bn_core_saved_objects_api_server_mocks.mdx | 2 +- ...ore_saved_objects_base_server_internal.mdx | 2 +- ...n_core_saved_objects_base_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_browser.mdx | 2 +- ...bn_core_saved_objects_browser_internal.mdx | 2 +- .../kbn_core_saved_objects_browser_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_common.mdx | 2 +- ..._objects_import_export_server_internal.mdx | 2 +- ...ved_objects_import_export_server_mocks.mdx | 2 +- ...aved_objects_migration_server_internal.mdx | 2 +- ...e_saved_objects_migration_server_mocks.mdx | 2 +- api_docs/kbn_core_saved_objects_server.mdx | 2 +- ...kbn_core_saved_objects_server_internal.mdx | 2 +- .../kbn_core_saved_objects_server_mocks.mdx | 2 +- .../kbn_core_saved_objects_utils_server.mdx | 2 +- api_docs/kbn_core_status_common.mdx | 2 +- api_docs/kbn_core_status_common_internal.mdx | 2 +- api_docs/kbn_core_status_server.mdx | 2 +- api_docs/kbn_core_status_server_internal.mdx | 2 +- api_docs/kbn_core_status_server_mocks.mdx | 2 +- ...core_test_helpers_deprecations_getters.mdx | 2 +- ...n_core_test_helpers_http_setup_browser.mdx | 2 +- api_docs/kbn_core_test_helpers_kbn_server.mdx | 2 +- ...n_core_test_helpers_so_type_serializer.mdx | 2 +- api_docs/kbn_core_test_helpers_test_utils.mdx | 2 +- api_docs/kbn_core_theme_browser.mdx | 2 +- api_docs/kbn_core_theme_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_browser.mdx | 2 +- .../kbn_core_ui_settings_browser_internal.mdx | 2 +- .../kbn_core_ui_settings_browser_mocks.mdx | 2 +- api_docs/kbn_core_ui_settings_common.mdx | 2 +- api_docs/kbn_core_ui_settings_server.mdx | 2 +- .../kbn_core_ui_settings_server_internal.mdx | 2 +- .../kbn_core_ui_settings_server_mocks.mdx | 2 +- api_docs/kbn_core_usage_data_server.mdx | 2 +- .../kbn_core_usage_data_server_internal.mdx | 2 +- api_docs/kbn_core_usage_data_server_mocks.mdx | 2 +- api_docs/kbn_core_user_settings_server.mdx | 2 +- ...kbn_core_user_settings_server_internal.mdx | 2 +- .../kbn_core_user_settings_server_mocks.mdx | 2 +- api_docs/kbn_crypto.mdx | 2 +- api_docs/kbn_crypto_browser.mdx | 2 +- api_docs/kbn_custom_integrations.mdx | 2 +- api_docs/kbn_cypress_config.mdx | 2 +- api_docs/kbn_data_service.mdx | 2 +- api_docs/kbn_datemath.mdx | 2 +- api_docs/kbn_deeplinks_analytics.mdx | 2 +- api_docs/kbn_deeplinks_devtools.mdx | 2 +- api_docs/kbn_deeplinks_management.mdx | 2 +- api_docs/kbn_deeplinks_ml.devdocs.json | 2 +- api_docs/kbn_deeplinks_ml.mdx | 2 +- api_docs/kbn_deeplinks_observability.mdx | 2 +- api_docs/kbn_deeplinks_search.mdx | 2 +- api_docs/kbn_default_nav_analytics.mdx | 2 +- api_docs/kbn_default_nav_devtools.mdx | 2 +- api_docs/kbn_default_nav_management.mdx | 2 +- api_docs/kbn_default_nav_ml.devdocs.json | 2 +- api_docs/kbn_default_nav_ml.mdx | 2 +- api_docs/kbn_dev_cli_errors.mdx | 2 +- api_docs/kbn_dev_cli_runner.mdx | 2 +- api_docs/kbn_dev_proc_runner.mdx | 2 +- api_docs/kbn_dev_utils.mdx | 2 +- api_docs/kbn_discover_utils.mdx | 2 +- api_docs/kbn_doc_links.mdx | 2 +- api_docs/kbn_docs_utils.mdx | 2 +- api_docs/kbn_dom_drag_drop.mdx | 2 +- api_docs/kbn_ebt_tools.mdx | 2 +- api_docs/kbn_ecs.mdx | 2 +- api_docs/kbn_ecs_data_quality_dashboard.mdx | 2 +- api_docs/kbn_elastic_assistant.mdx | 2 +- api_docs/kbn_es.mdx | 2 +- api_docs/kbn_es_archiver.mdx | 2 +- api_docs/kbn_es_errors.mdx | 2 +- api_docs/kbn_es_query.mdx | 2 +- api_docs/kbn_es_types.mdx | 2 +- api_docs/kbn_eslint_plugin_imports.mdx | 2 +- api_docs/kbn_event_annotation_common.mdx | 2 +- api_docs/kbn_event_annotation_components.mdx | 2 +- api_docs/kbn_expandable_flyout.mdx | 2 +- api_docs/kbn_field_types.mdx | 2 +- api_docs/kbn_find_used_node_modules.mdx | 2 +- .../kbn_ftr_common_functional_services.mdx | 2 +- api_docs/kbn_generate.mdx | 2 +- api_docs/kbn_generate_console_definitions.mdx | 2 +- api_docs/kbn_generate_csv.mdx | 2 +- api_docs/kbn_generate_csv_types.mdx | 2 +- api_docs/kbn_guided_onboarding.mdx | 2 +- api_docs/kbn_handlebars.mdx | 2 +- api_docs/kbn_hapi_mocks.mdx | 2 +- api_docs/kbn_health_gateway_server.mdx | 2 +- api_docs/kbn_home_sample_data_card.mdx | 2 +- api_docs/kbn_home_sample_data_tab.mdx | 2 +- api_docs/kbn_i18n.mdx | 2 +- api_docs/kbn_i18n_react.mdx | 2 +- api_docs/kbn_import_resolver.mdx | 2 +- api_docs/kbn_infra_forge.mdx | 2 +- api_docs/kbn_interpreter.mdx | 2 +- api_docs/kbn_io_ts_utils.mdx | 2 +- api_docs/kbn_jest_serializers.mdx | 2 +- api_docs/kbn_journeys.mdx | 2 +- api_docs/kbn_json_ast.mdx | 2 +- api_docs/kbn_kibana_manifest_schema.mdx | 2 +- .../kbn_language_documentation_popover.mdx | 2 +- api_docs/kbn_lens_embeddable_utils.mdx | 2 +- api_docs/kbn_logging.mdx | 2 +- api_docs/kbn_logging_mocks.mdx | 2 +- api_docs/kbn_managed_vscode_config.mdx | 2 +- api_docs/kbn_management_cards_navigation.mdx | 2 +- ...gement_settings_components_field_input.mdx | 2 +- ...nagement_settings_components_field_row.mdx | 2 +- ...ment_settings_components_form.devdocs.json | 221 ++++++++++++ ...bn_management_settings_components_form.mdx | 33 ++ ...ent_settings_field_definition.devdocs.json | 18 +- ...n_management_settings_field_definition.mdx | 2 +- api_docs/kbn_management_settings_ids.mdx | 2 +- ...n_management_settings_section_registry.mdx | 2 +- api_docs/kbn_management_settings_types.mdx | 2 +- .../kbn_management_settings_utilities.mdx | 2 +- api_docs/kbn_management_storybook_config.mdx | 2 +- api_docs/kbn_mapbox_gl.mdx | 2 +- api_docs/kbn_maps_vector_tile_utils.mdx | 2 +- api_docs/kbn_ml_agg_utils.mdx | 2 +- api_docs/kbn_ml_anomaly_utils.mdx | 2 +- api_docs/kbn_ml_category_validator.mdx | 2 +- .../kbn_ml_data_frame_analytics_utils.mdx | 2 +- api_docs/kbn_ml_data_grid.mdx | 2 +- api_docs/kbn_ml_date_picker.mdx | 2 +- api_docs/kbn_ml_date_utils.mdx | 2 +- api_docs/kbn_ml_error_utils.mdx | 2 +- api_docs/kbn_ml_in_memory_table.mdx | 2 +- api_docs/kbn_ml_is_defined.mdx | 2 +- api_docs/kbn_ml_is_populated_object.mdx | 2 +- api_docs/kbn_ml_kibana_theme.mdx | 2 +- api_docs/kbn_ml_local_storage.mdx | 2 +- api_docs/kbn_ml_nested_property.mdx | 2 +- api_docs/kbn_ml_number_utils.mdx | 2 +- api_docs/kbn_ml_query_utils.mdx | 2 +- .../kbn_ml_random_sampler_utils.devdocs.json | 20 +- api_docs/kbn_ml_random_sampler_utils.mdx | 2 +- api_docs/kbn_ml_route_utils.mdx | 2 +- api_docs/kbn_ml_runtime_field_utils.mdx | 2 +- api_docs/kbn_ml_string_hash.mdx | 2 +- api_docs/kbn_ml_trained_models_utils.mdx | 2 +- api_docs/kbn_ml_url_state.mdx | 2 +- api_docs/kbn_monaco.mdx | 2 +- api_docs/kbn_object_versioning.mdx | 2 +- api_docs/kbn_observability_alert_details.mdx | 2 +- api_docs/kbn_openapi_generator.mdx | 2 +- api_docs/kbn_optimizer.mdx | 2 +- api_docs/kbn_optimizer_webpack_helpers.mdx | 2 +- api_docs/kbn_osquery_io_ts_types.mdx | 2 +- ..._performance_testing_dataset_extractor.mdx | 2 +- api_docs/kbn_plugin_generator.mdx | 2 +- api_docs/kbn_plugin_helpers.mdx | 2 +- api_docs/kbn_profiling_utils.mdx | 2 +- api_docs/kbn_random_sampling.mdx | 2 +- api_docs/kbn_react_field.mdx | 2 +- api_docs/kbn_react_kibana_context_common.mdx | 2 +- api_docs/kbn_react_kibana_context_render.mdx | 2 +- api_docs/kbn_react_kibana_context_root.mdx | 2 +- api_docs/kbn_react_kibana_context_styled.mdx | 2 +- api_docs/kbn_react_kibana_context_theme.mdx | 2 +- api_docs/kbn_react_kibana_mount.mdx | 2 +- api_docs/kbn_repo_file_maps.mdx | 2 +- api_docs/kbn_repo_linter.mdx | 2 +- api_docs/kbn_repo_path.mdx | 2 +- api_docs/kbn_repo_source_classifier.mdx | 2 +- api_docs/kbn_reporting_common.mdx | 2 +- api_docs/kbn_rison.mdx | 2 +- api_docs/kbn_rrule.mdx | 2 +- api_docs/kbn_rule_data_utils.mdx | 2 +- api_docs/kbn_saved_objects_settings.mdx | 2 +- api_docs/kbn_search_api_panels.mdx | 2 +- api_docs/kbn_search_connectors.mdx | 2 +- api_docs/kbn_search_response_warnings.mdx | 2 +- api_docs/kbn_security_solution_features.mdx | 2 +- api_docs/kbn_security_solution_navigation.mdx | 2 +- api_docs/kbn_security_solution_side_nav.mdx | 2 +- ...kbn_security_solution_storybook_config.mdx | 2 +- .../kbn_securitysolution_autocomplete.mdx | 2 +- api_docs/kbn_securitysolution_data_table.mdx | 2 +- api_docs/kbn_securitysolution_ecs.mdx | 2 +- api_docs/kbn_securitysolution_es_utils.mdx | 2 +- ...ritysolution_exception_list_components.mdx | 2 +- api_docs/kbn_securitysolution_grouping.mdx | 2 +- api_docs/kbn_securitysolution_hook_utils.mdx | 2 +- ..._securitysolution_io_ts_alerting_types.mdx | 2 +- .../kbn_securitysolution_io_ts_list_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_types.mdx | 2 +- api_docs/kbn_securitysolution_io_ts_utils.mdx | 2 +- api_docs/kbn_securitysolution_list_api.mdx | 2 +- .../kbn_securitysolution_list_constants.mdx | 2 +- api_docs/kbn_securitysolution_list_hooks.mdx | 2 +- api_docs/kbn_securitysolution_list_utils.mdx | 2 +- api_docs/kbn_securitysolution_rules.mdx | 2 +- api_docs/kbn_securitysolution_t_grid.mdx | 2 +- api_docs/kbn_securitysolution_utils.mdx | 2 +- api_docs/kbn_server_http_tools.mdx | 2 +- api_docs/kbn_server_route_repository.mdx | 2 +- api_docs/kbn_serverless_common_settings.mdx | 2 +- .../kbn_serverless_observability_settings.mdx | 2 +- api_docs/kbn_serverless_project_switcher.mdx | 2 +- api_docs/kbn_serverless_search_settings.mdx | 2 +- api_docs/kbn_serverless_security_settings.mdx | 2 +- api_docs/kbn_serverless_storybook_config.mdx | 2 +- api_docs/kbn_shared_svg.mdx | 2 +- api_docs/kbn_shared_ux_avatar_solution.mdx | 2 +- ...ared_ux_avatar_user_profile_components.mdx | 2 +- .../kbn_shared_ux_button_exit_full_screen.mdx | 2 +- ...hared_ux_button_exit_full_screen_mocks.mdx | 2 +- api_docs/kbn_shared_ux_button_toolbar.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data.mdx | 2 +- api_docs/kbn_shared_ux_card_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_chrome_navigation.mdx | 2 +- api_docs/kbn_shared_ux_file_context.mdx | 2 +- api_docs/kbn_shared_ux_file_image.mdx | 2 +- api_docs/kbn_shared_ux_file_image_mocks.mdx | 2 +- api_docs/kbn_shared_ux_file_mocks.mdx | 2 +- api_docs/kbn_shared_ux_file_picker.mdx | 2 +- api_docs/kbn_shared_ux_file_types.mdx | 2 +- api_docs/kbn_shared_ux_file_upload.mdx | 2 +- api_docs/kbn_shared_ux_file_util.mdx | 2 +- api_docs/kbn_shared_ux_link_redirect_app.mdx | 2 +- .../kbn_shared_ux_link_redirect_app_mocks.mdx | 2 +- api_docs/kbn_shared_ux_markdown.mdx | 2 +- api_docs/kbn_shared_ux_markdown_mocks.mdx | 2 +- .../kbn_shared_ux_page_analytics_no_data.mdx | 2 +- ...shared_ux_page_analytics_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_page_kibana_no_data.mdx | 2 +- ...bn_shared_ux_page_kibana_no_data_mocks.mdx | 2 +- .../kbn_shared_ux_page_kibana_template.mdx | 2 +- ...n_shared_ux_page_kibana_template_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data.mdx | 2 +- .../kbn_shared_ux_page_no_data_config.mdx | 2 +- ...bn_shared_ux_page_no_data_config_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_no_data_mocks.mdx | 2 +- api_docs/kbn_shared_ux_page_solution_nav.mdx | 2 +- .../kbn_shared_ux_prompt_no_data_views.mdx | 2 +- ...n_shared_ux_prompt_no_data_views_mocks.mdx | 2 +- api_docs/kbn_shared_ux_prompt_not_found.mdx | 2 +- api_docs/kbn_shared_ux_router.mdx | 2 +- api_docs/kbn_shared_ux_router_mocks.mdx | 2 +- api_docs/kbn_shared_ux_storybook_config.mdx | 2 +- api_docs/kbn_shared_ux_storybook_mock.mdx | 2 +- api_docs/kbn_shared_ux_utility.mdx | 2 +- api_docs/kbn_slo_schema.mdx | 2 +- api_docs/kbn_some_dev_log.mdx | 2 +- api_docs/kbn_std.mdx | 2 +- api_docs/kbn_stdio_dev_helpers.mdx | 2 +- api_docs/kbn_storybook.mdx | 2 +- api_docs/kbn_subscription_tracking.mdx | 2 +- api_docs/kbn_telemetry_tools.mdx | 2 +- api_docs/kbn_test.mdx | 2 +- api_docs/kbn_test_jest_helpers.mdx | 2 +- api_docs/kbn_test_subj_selector.mdx | 2 +- api_docs/kbn_text_based_editor.mdx | 2 +- api_docs/kbn_tooling_log.mdx | 2 +- api_docs/kbn_ts_projects.mdx | 2 +- api_docs/kbn_typed_react_router_config.mdx | 2 +- api_docs/kbn_ui_actions_browser.mdx | 2 +- api_docs/kbn_ui_shared_deps_src.mdx | 2 +- api_docs/kbn_ui_theme.mdx | 2 +- api_docs/kbn_unified_data_table.devdocs.json | 21 +- api_docs/kbn_unified_data_table.mdx | 4 +- api_docs/kbn_unified_doc_viewer.mdx | 2 +- api_docs/kbn_unified_field_list.mdx | 2 +- api_docs/kbn_url_state.mdx | 2 +- api_docs/kbn_use_tracked_promise.mdx | 2 +- api_docs/kbn_user_profile_components.mdx | 2 +- api_docs/kbn_utility_types.mdx | 2 +- api_docs/kbn_utility_types_jest.mdx | 2 +- api_docs/kbn_utils.mdx | 2 +- api_docs/kbn_visualization_ui_components.mdx | 2 +- api_docs/kbn_xstate_utils.mdx | 2 +- api_docs/kbn_yarn_lock_validator.mdx | 2 +- api_docs/kibana_overview.mdx | 2 +- api_docs/kibana_react.devdocs.json | 26 +- api_docs/kibana_react.mdx | 2 +- api_docs/kibana_utils.mdx | 2 +- api_docs/kubernetes_security.mdx | 2 +- api_docs/lens.mdx | 2 +- api_docs/license_api_guard.mdx | 2 +- api_docs/license_management.mdx | 2 +- api_docs/licensing.mdx | 2 +- api_docs/lists.mdx | 2 +- api_docs/log_explorer.mdx | 2 +- api_docs/logs_shared.mdx | 2 +- api_docs/management.mdx | 2 +- api_docs/maps.mdx | 2 +- api_docs/maps_ems.mdx | 2 +- api_docs/metrics_data_access.mdx | 2 +- api_docs/ml.devdocs.json | 6 +- api_docs/ml.mdx | 2 +- api_docs/monitoring.mdx | 2 +- api_docs/monitoring_collection.mdx | 2 +- api_docs/navigation.mdx | 2 +- api_docs/newsfeed.mdx | 2 +- api_docs/no_data_page.mdx | 2 +- api_docs/notifications.mdx | 2 +- api_docs/observability.mdx | 2 +- api_docs/observability_a_i_assistant.mdx | 2 +- .../observability_log_explorer.devdocs.json | 75 +++- api_docs/observability_log_explorer.mdx | 7 +- api_docs/observability_onboarding.mdx | 2 +- api_docs/observability_shared.mdx | 2 +- api_docs/osquery.mdx | 2 +- api_docs/painless_lab.mdx | 2 +- api_docs/plugin_directory.mdx | 21 +- api_docs/presentation_util.devdocs.json | 115 +----- api_docs/presentation_util.mdx | 4 +- api_docs/profiling.mdx | 2 +- api_docs/profiling_data_access.mdx | 2 +- api_docs/remote_clusters.mdx | 2 +- api_docs/reporting.mdx | 2 +- api_docs/rollup.mdx | 2 +- api_docs/rule_registry.mdx | 2 +- api_docs/runtime_fields.mdx | 2 +- api_docs/saved_objects.mdx | 2 +- api_docs/saved_objects_finder.mdx | 2 +- api_docs/saved_objects_management.mdx | 2 +- api_docs/saved_objects_tagging.mdx | 2 +- api_docs/saved_objects_tagging_oss.mdx | 2 +- api_docs/saved_search.mdx | 2 +- api_docs/screenshot_mode.mdx | 2 +- api_docs/screenshotting.mdx | 2 +- api_docs/security.mdx | 2 +- api_docs/security_solution.mdx | 2 +- api_docs/security_solution_ess.mdx | 2 +- api_docs/security_solution_serverless.mdx | 2 +- api_docs/serverless.mdx | 2 +- api_docs/serverless_observability.mdx | 2 +- api_docs/serverless_search.mdx | 2 +- api_docs/session_view.mdx | 2 +- api_docs/share.mdx | 2 +- api_docs/snapshot_restore.mdx | 2 +- api_docs/spaces.mdx | 2 +- api_docs/stack_alerts.mdx | 2 +- api_docs/stack_connectors.mdx | 2 +- api_docs/task_manager.mdx | 2 +- api_docs/telemetry.mdx | 2 +- api_docs/telemetry_collection_manager.mdx | 2 +- api_docs/telemetry_collection_xpack.mdx | 2 +- api_docs/telemetry_management_section.mdx | 2 +- api_docs/text_based_languages.mdx | 2 +- api_docs/threat_intelligence.mdx | 2 +- api_docs/timelines.mdx | 2 +- api_docs/transform.mdx | 2 +- api_docs/triggers_actions_ui.mdx | 2 +- api_docs/ui_actions.mdx | 2 +- api_docs/ui_actions_enhanced.mdx | 2 +- api_docs/unified_doc_viewer.mdx | 2 +- api_docs/unified_histogram.mdx | 2 +- api_docs/unified_search.mdx | 2 +- api_docs/unified_search_autocomplete.mdx | 2 +- api_docs/uptime.mdx | 2 +- api_docs/url_forwarding.mdx | 2 +- api_docs/usage_collection.mdx | 2 +- api_docs/ux.mdx | 2 +- api_docs/vis_default_editor.mdx | 2 +- api_docs/vis_type_gauge.mdx | 2 +- api_docs/vis_type_heatmap.mdx | 2 +- api_docs/vis_type_pie.mdx | 2 +- api_docs/vis_type_table.mdx | 2 +- api_docs/vis_type_timelion.mdx | 2 +- api_docs/vis_type_timeseries.mdx | 2 +- api_docs/vis_type_vega.mdx | 2 +- api_docs/vis_type_vislib.mdx | 2 +- api_docs/vis_type_xy.mdx | 2 +- api_docs/visualizations.mdx | 2 +- 616 files changed, 1485 insertions(+), 892 deletions(-) create mode 100644 api_docs/kbn_management_settings_components_form.devdocs.json create mode 100644 api_docs/kbn_management_settings_components_form.mdx diff --git a/api_docs/actions.mdx b/api_docs/actions.mdx index ec6acc7abe98d..12b91c8371bb1 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-09-26 +date: 2023-09-27 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 529e5f913ac7e..e3214171faf71 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-09-26 +date: 2023-09-27 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 97cc1d7cb21de..2e4a76b9141af 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-09-26 +date: 2023-09-27 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 5e72f84f48ad8..da3be79e6776e 100644 --- a/api_docs/alerting.devdocs.json +++ b/api_docs/alerting.devdocs.json @@ -4846,27 +4846,9 @@ "section": "def-common.IExecutionErrorsResult", "text": "IExecutionErrorsResult" }, - ">; bulkDeleteRules: (options: ", - "BulkOptions", - ") => Promise<{ errors: ", - { - "pluginId": "alerting", - "scope": "server", - "docId": "kibAlertingPluginApi", - "section": "def-server.BulkOperationError", - "text": "BulkOperationError" - }, - "[]; total: number; rules: (", - { - "pluginId": "alerting", - "scope": "common", - "docId": "kibAlertingPluginApi", - "section": "def-common.Rule", - "text": "Rule" - }, - " | ", - "RuleWithLegacyId", - ")[]; taskIdsFailedToBeDeleted: string[]; }>; bulkEdit: ; bulkDeleteRules: (options: Readonly<{ filter?: string | undefined; ids?: string[] | undefined; } & {}>) => Promise<", + "BulkDeleteRulesResult", + ">>; bulkEdit: ; query: ", + "IntersectionC", + "<[", "TypeC", "<{ start: ", "Type", "; end: ", "Type", - "; }>; }> | undefined; handler: ({}: ", + "; }>, ", + "TypeC", + "<{ environment: ", + "UnionC", + "<[", + "LiteralC", + "<\"ENVIRONMENT_NOT_DEFINED\">, ", + "LiteralC", + "<\"ENVIRONMENT_ALL\">, ", + "BrandC", + "<", + "StringC", + ", ", + { + "pluginId": "@kbn/io-ts-utils", + "scope": "common", + "docId": "kibKbnIoTsUtilsPluginApi", + "section": "def-common.NonEmptyStringBrand", + "text": "NonEmptyStringBrand" + }, + ">]>; }>]>; }> | undefined; handler: ({}: ", "APMRouteHandlerResources", - " & { params: { path: { serviceName: string; }; query: { start: number; end: number; }; }; }) => Promise<", + " & { params: { path: { serviceName: string; }; query: { start: number; end: number; } & { environment: \"ENVIRONMENT_NOT_DEFINED\" | \"ENVIRONMENT_ALL\" | ", + "Branded", + "; }; }; }) => Promise<", "ServiceMetadataDetails", ">; } & ", "APMRouteCreateOptions", diff --git a/api_docs/apm.mdx b/api_docs/apm.mdx index 0c90cf79c9974..2e853b562576e 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apm'] --- import apmObj from './apm.devdocs.json'; diff --git a/api_docs/apm_data_access.mdx b/api_docs/apm_data_access.mdx index 00c1bdefa5cfb..3c7d9c1c1c4ff 100644 --- a/api_docs/apm_data_access.mdx +++ b/api_docs/apm_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/apmDataAccess title: "apmDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the apmDataAccess plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'apmDataAccess'] --- import apmDataAccessObj from './apm_data_access.devdocs.json'; diff --git a/api_docs/asset_manager.mdx b/api_docs/asset_manager.mdx index 11fb62a7fde7d..e267a02213734 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-09-26 +date: 2023-09-27 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 a9cbbab0920e2..00cd00b3d8b7c 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-09-26 +date: 2023-09-27 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 421ac4b1bdfc6..b76a791d57864 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-09-26 +date: 2023-09-27 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 8c71da99962b1..973968148c9e2 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'canvas'] --- import canvasObj from './canvas.devdocs.json'; diff --git a/api_docs/cases.mdx b/api_docs/cases.mdx index b26e5fdc1bec6..40e94f9c574a0 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cases'] --- import casesObj from './cases.devdocs.json'; diff --git a/api_docs/charts.mdx b/api_docs/charts.mdx index d6edcef304cfa..68cb43f4cdcf8 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-09-26 +date: 2023-09-27 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 8770378fa7713..723d476304190 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-09-26 +date: 2023-09-27 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 d3be97d80040a..10ea75521a594 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudChat'] --- import cloudChatObj from './cloud_chat.devdocs.json'; diff --git a/api_docs/cloud_chat_provider.mdx b/api_docs/cloud_chat_provider.mdx index bd056a9cab82c..b144fc2eccc4c 100644 --- a/api_docs/cloud_chat_provider.mdx +++ b/api_docs/cloud_chat_provider.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/cloudChatProvider title: "cloudChatProvider" image: https://source.unsplash.com/400x175/?github description: API docs for the cloudChatProvider plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'cloudChatProvider'] --- import cloudChatProviderObj from './cloud_chat_provider.devdocs.json'; diff --git a/api_docs/cloud_data_migration.mdx b/api_docs/cloud_data_migration.mdx index 15e2cb08a1348..6582ca6dafac6 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-09-26 +date: 2023-09-27 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 b67cc1ca1c15b..039ccab8b05b7 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-09-26 +date: 2023-09-27 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 1934cb490d159..297e9465c0dbc 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-09-26 +date: 2023-09-27 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 da9f05b588386..e0f9d6a8153af 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-09-26 +date: 2023-09-27 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 4474707f4dd51..7f2fad0fdbbca 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-09-26 +date: 2023-09-27 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 8155448ed0693..9bd36e0692027 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-09-26 +date: 2023-09-27 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 635d1eb9d7dc1..9ffbb619fc035 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'controls'] --- import controlsObj from './controls.devdocs.json'; diff --git a/api_docs/custom_integrations.mdx b/api_docs/custom_integrations.mdx index 1437ef65bd31f..bde1fee9211b4 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'customIntegrations'] --- import customIntegrationsObj from './custom_integrations.devdocs.json'; diff --git a/api_docs/dashboard.mdx b/api_docs/dashboard.mdx index a4df4f9d5b629..8e0d9fe3a3f8f 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-09-26 +date: 2023-09-27 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 8e2207a743ba8..6a9123356ad83 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-09-26 +date: 2023-09-27 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 c472d757594f5..372461cf97e4e 100644 --- a/api_docs/data.devdocs.json +++ b/api_docs/data.devdocs.json @@ -12848,6 +12848,10 @@ "plugin": "dataVisualizer", "path": "x-pack/plugins/data_visualizer/public/application/common/components/stats_table/components/field_data_expanded_row/choropleth_map.tsx" }, + { + "plugin": "dataVisualizer", + "path": "x-pack/plugins/data_visualizer/public/application/data_drift/charts/default_value_formatter.ts" + }, { "plugin": "stackAlerts", "path": "x-pack/plugins/stack_alerts/public/rule_types/threshold/expression.tsx" @@ -13808,6 +13812,10 @@ "plugin": "canvas", "path": "x-pack/plugins/canvas/public/components/datasource/datasource_component.js" }, + { + "plugin": "presentationUtil", + "path": "src/plugins/presentation_util/public/services/data_views/data_views.story.ts" + }, { "plugin": "enterpriseSearch", "path": "x-pack/plugins/enterprise_search/public/applications/analytics/utils/find_or_create_data_view.ts" @@ -14012,10 +14020,6 @@ "plugin": "inputControlVis", "path": "src/plugins/input_control_vis/public/test_utils/get_index_pattern_mock.ts" }, - { - "plugin": "presentationUtil", - "path": "src/plugins/presentation_util/public/services/data_views/data_views.story.ts" - }, { "plugin": "visTypeTimelion", "path": "src/plugins/vis_types/timelion/public/helpers/arg_value_suggestions.ts" @@ -21553,6 +21557,10 @@ "plugin": "canvas", "path": "x-pack/plugins/canvas/public/components/datasource/datasource_component.js" }, + { + "plugin": "presentationUtil", + "path": "src/plugins/presentation_util/public/services/data_views/data_views.story.ts" + }, { "plugin": "enterpriseSearch", "path": "x-pack/plugins/enterprise_search/public/applications/analytics/utils/find_or_create_data_view.ts" @@ -21757,10 +21765,6 @@ "plugin": "inputControlVis", "path": "src/plugins/input_control_vis/public/test_utils/get_index_pattern_mock.ts" }, - { - "plugin": "presentationUtil", - "path": "src/plugins/presentation_util/public/services/data_views/data_views.story.ts" - }, { "plugin": "visTypeTimelion", "path": "src/plugins/vis_types/timelion/public/helpers/arg_value_suggestions.ts" diff --git a/api_docs/data.mdx b/api_docs/data.mdx index 556287b22aa60..c821f234780e6 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data'] --- import dataObj from './data.devdocs.json'; diff --git a/api_docs/data_query.mdx b/api_docs/data_query.mdx index 644aec8b976e2..84ff30a00dfaa 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.query'] --- import dataQueryObj from './data_query.devdocs.json'; diff --git a/api_docs/data_search.mdx b/api_docs/data_search.mdx index 853e83d7d02d6..36a9790b3c52c 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'data.search'] --- import dataSearchObj from './data_search.devdocs.json'; diff --git a/api_docs/data_view_editor.devdocs.json b/api_docs/data_view_editor.devdocs.json index bc40d7a29ec62..ce62a71b7b210 100644 --- a/api_docs/data_view_editor.devdocs.json +++ b/api_docs/data_view_editor.devdocs.json @@ -1,7 +1,309 @@ { "id": "dataViewEditor", "client": { - "classes": [], + "classes": [ + { + "parentPluginId": "dataViewEditor", + "id": "def-public.DataViewEditorService", + "type": "Class", + "tags": [], + "label": "DataViewEditorService", + "description": [], + "path": "src/plugins/data_view_editor/public/data_view_editor_service.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dataViewEditor", + "id": "def-public.DataViewEditorService.Unnamed", + "type": "Function", + "tags": [], + "label": "Constructor", + "description": [], + "signature": [ + "any" + ], + "path": "src/plugins/data_view_editor/public/data_view_editor_service.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dataViewEditor", + "id": "def-public.DataViewEditorService.Unnamed.$1", + "type": "Object", + "tags": [], + "label": "{\n services: { http, dataViews },\n initialValues: {\n type: initialType = INDEX_PATTERN_TYPE.DEFAULT,\n indexPattern: initialIndexPattern = '',\n name: initialName = '',\n },\n requireTimestampField = false,\n }", + "description": [], + "signature": [ + "DataViewEditorServiceConstructorArgs" + ], + "path": "src/plugins/data_view_editor/public/data_view_editor_service.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "dataViewEditor", + "id": "def-public.DataViewEditorService.dataViewNames$", + "type": "Object", + "tags": [], + "label": "dataViewNames$", + "description": [], + "signature": [ + "Observable", + "" + ], + "path": "src/plugins/data_view_editor/public/data_view_editor_service.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "dataViewEditor", + "id": "def-public.DataViewEditorService.rollupIndicesCaps$", + "type": "Object", + "tags": [], + "label": "rollupIndicesCaps$", + "description": [], + "signature": [ + "Observable", + "<", + "RollupIndicesCapsResponse", + ">" + ], + "path": "src/plugins/data_view_editor/public/data_view_editor_service.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "dataViewEditor", + "id": "def-public.DataViewEditorService.isLoadingSources$", + "type": "Object", + "tags": [], + "label": "isLoadingSources$", + "description": [], + "signature": [ + "Observable", + "" + ], + "path": "src/plugins/data_view_editor/public/data_view_editor_service.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "dataViewEditor", + "id": "def-public.DataViewEditorService.loadingTimestampFields$", + "type": "Object", + "tags": [], + "label": "loadingTimestampFields$", + "description": [], + "signature": [ + "Observable", + "" + ], + "path": "src/plugins/data_view_editor/public/data_view_editor_service.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "dataViewEditor", + "id": "def-public.DataViewEditorService.timestampFieldOptions$", + "type": "Object", + "tags": [], + "label": "timestampFieldOptions$", + "description": [], + "signature": [ + "Observable", + "<", + "TimestampOption", + "[]>" + ], + "path": "src/plugins/data_view_editor/public/data_view_editor_service.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "dataViewEditor", + "id": "def-public.DataViewEditorService.rollupIndex$", + "type": "Object", + "tags": [], + "label": "rollupIndex$", + "description": [], + "signature": [ + "Observable", + "" + ], + "path": "src/plugins/data_view_editor/public/data_view_editor_service.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "dataViewEditor", + "id": "def-public.DataViewEditorService.matchedIndices$", + "type": "Object", + "tags": [], + "label": "matchedIndices$", + "description": [], + "signature": [ + "Observable", + "<", + "MatchedIndicesSet", + ">" + ], + "path": "src/plugins/data_view_editor/public/data_view_editor_service.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "dataViewEditor", + "id": "def-public.DataViewEditorService.setIndexPattern", + "type": "Function", + "tags": [], + "label": "setIndexPattern", + "description": [], + "signature": [ + "(indexPattern: string) => void" + ], + "path": "src/plugins/data_view_editor/public/data_view_editor_service.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dataViewEditor", + "id": "def-public.DataViewEditorService.setIndexPattern.$1", + "type": "string", + "tags": [], + "label": "indexPattern", + "description": [], + "signature": [ + "string" + ], + "path": "src/plugins/data_view_editor/public/data_view_editor_service.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "dataViewEditor", + "id": "def-public.DataViewEditorService.setAllowHidden", + "type": "Function", + "tags": [], + "label": "setAllowHidden", + "description": [], + "signature": [ + "(allowHidden: boolean) => void" + ], + "path": "src/plugins/data_view_editor/public/data_view_editor_service.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dataViewEditor", + "id": "def-public.DataViewEditorService.setAllowHidden.$1", + "type": "boolean", + "tags": [], + "label": "allowHidden", + "description": [], + "signature": [ + "boolean" + ], + "path": "src/plugins/data_view_editor/public/data_view_editor_service.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "dataViewEditor", + "id": "def-public.DataViewEditorService.setType", + "type": "Function", + "tags": [], + "label": "setType", + "description": [], + "signature": [ + "(type: ", + { + "pluginId": "dataViews", + "scope": "public", + "docId": "kibDataViewsPluginApi", + "section": "def-public.INDEX_PATTERN_TYPE", + "text": "INDEX_PATTERN_TYPE" + }, + ") => void" + ], + "path": "src/plugins/data_view_editor/public/data_view_editor_service.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "dataViewEditor", + "id": "def-public.DataViewEditorService.setType.$1", + "type": "Enum", + "tags": [], + "label": "type", + "description": [], + "signature": [ + { + "pluginId": "dataViews", + "scope": "public", + "docId": "kibDataViewsPluginApi", + "section": "def-public.INDEX_PATTERN_TYPE", + "text": "INDEX_PATTERN_TYPE" + } + ], + "path": "src/plugins/data_view_editor/public/data_view_editor_service.ts", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [] + }, + { + "parentPluginId": "dataViewEditor", + "id": "def-public.DataViewEditorService.indexPatternValidationProvider", + "type": "Function", + "tags": [], + "label": "indexPatternValidationProvider", + "description": [], + "signature": [ + "() => Promise<{ rollupIndex: string | null | undefined; matchedIndices: ", + "MatchedIndicesSet", + "; }>" + ], + "path": "src/plugins/data_view_editor/public/data_view_editor_service.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + }, + { + "parentPluginId": "dataViewEditor", + "id": "def-public.DataViewEditorService.destroy", + "type": "Function", + "tags": [], + "label": "destroy", + "description": [], + "signature": [ + "() => void" + ], + "path": "src/plugins/data_view_editor/public/data_view_editor_service.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [] + } + ], + "initialIsOpen": false + } + ], "functions": [], "interfaces": [ { @@ -298,6 +600,28 @@ "path": "src/plugins/data_view_editor/public/types.ts", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "dataViewEditor", + "id": "def-public.PluginStart.dataViewEditorServiceFactory", + "type": "Function", + "tags": [], + "label": "dataViewEditorServiceFactory", + "description": [ + "\nHelper method to generate a new data view editor service." + ], + "signature": [ + "() => Promise" + ], + "path": "src/plugins/data_view_editor/public/types.ts", + "deprecated": false, + "trackAdoption": false, + "children": [], + "returnComment": [ + "DataViewEditorService" + ] } ], "lifecycle": "start", @@ -320,4 +644,4 @@ "misc": [], "objects": [] } -} +} \ No newline at end of file diff --git a/api_docs/data_view_editor.mdx b/api_docs/data_view_editor.mdx index 10ad3cbc15742..9faca8b31e54f 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViewEditor'] --- import dataViewEditorObj from './data_view_editor.devdocs.json'; @@ -21,13 +21,16 @@ Contact [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/k | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 16 | 0 | 7 | 0 | +| 35 | 0 | 25 | 5 | ## Client ### Start +### Classes + + ### Interfaces diff --git a/api_docs/data_view_field_editor.mdx b/api_docs/data_view_field_editor.mdx index 10c172ab937ec..8bcfd4d30daad 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-09-26 +date: 2023-09-27 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 84cd5b94c54f4..3eb4fe4a74a2f 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-09-26 +date: 2023-09-27 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 1d36021b83042..d975cfb1c8826 100644 --- a/api_docs/data_views.devdocs.json +++ b/api_docs/data_views.devdocs.json @@ -575,6 +575,10 @@ "plugin": "canvas", "path": "x-pack/plugins/canvas/public/components/datasource/datasource_component.js" }, + { + "plugin": "presentationUtil", + "path": "src/plugins/presentation_util/public/services/data_views/data_views.story.ts" + }, { "plugin": "enterpriseSearch", "path": "x-pack/plugins/enterprise_search/public/applications/analytics/utils/find_or_create_data_view.ts" @@ -779,10 +783,6 @@ "plugin": "inputControlVis", "path": "src/plugins/input_control_vis/public/test_utils/get_index_pattern_mock.ts" }, - { - "plugin": "presentationUtil", - "path": "src/plugins/presentation_util/public/services/data_views/data_views.story.ts" - }, { "plugin": "visTypeTimelion", "path": "src/plugins/vis_types/timelion/public/helpers/arg_value_suggestions.ts" @@ -8568,6 +8568,10 @@ "plugin": "canvas", "path": "x-pack/plugins/canvas/public/components/datasource/datasource_component.js" }, + { + "plugin": "presentationUtil", + "path": "src/plugins/presentation_util/public/services/data_views/data_views.story.ts" + }, { "plugin": "enterpriseSearch", "path": "x-pack/plugins/enterprise_search/public/applications/analytics/utils/find_or_create_data_view.ts" @@ -8772,10 +8776,6 @@ "plugin": "inputControlVis", "path": "src/plugins/input_control_vis/public/test_utils/get_index_pattern_mock.ts" }, - { - "plugin": "presentationUtil", - "path": "src/plugins/presentation_util/public/services/data_views/data_views.story.ts" - }, { "plugin": "visTypeTimelion", "path": "src/plugins/vis_types/timelion/public/helpers/arg_value_suggestions.ts" @@ -15622,6 +15622,10 @@ "plugin": "canvas", "path": "x-pack/plugins/canvas/public/components/datasource/datasource_component.js" }, + { + "plugin": "presentationUtil", + "path": "src/plugins/presentation_util/public/services/data_views/data_views.story.ts" + }, { "plugin": "enterpriseSearch", "path": "x-pack/plugins/enterprise_search/public/applications/analytics/utils/find_or_create_data_view.ts" @@ -15826,10 +15830,6 @@ "plugin": "inputControlVis", "path": "src/plugins/input_control_vis/public/test_utils/get_index_pattern_mock.ts" }, - { - "plugin": "presentationUtil", - "path": "src/plugins/presentation_util/public/services/data_views/data_views.story.ts" - }, { "plugin": "visTypeTimelion", "path": "src/plugins/vis_types/timelion/public/helpers/arg_value_suggestions.ts" diff --git a/api_docs/data_views.mdx b/api_docs/data_views.mdx index 1e0f35b08fd89..5c7c7d91590af 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'dataViews'] --- import dataViewsObj from './data_views.devdocs.json'; diff --git a/api_docs/data_visualizer.devdocs.json b/api_docs/data_visualizer.devdocs.json index d583f8f3d85b7..058013cc04b0f 100644 --- a/api_docs/data_visualizer.devdocs.json +++ b/api_docs/data_visualizer.devdocs.json @@ -302,24 +302,24 @@ "misc": [ { "parentPluginId": "dataVisualizer", - "id": "def-public.DataComparisonSpec", + "id": "def-public.DataDriftSpec", "type": "Type", "tags": [], - "label": "DataComparisonSpec", + "label": "DataDriftSpec", "description": [], "signature": [ "React.FunctionComponent<", - "DataComparisonDetectionAppStateProps", + "DataDriftDetectionAppStateProps", ">" ], - "path": "x-pack/plugins/data_visualizer/public/application/data_comparison/data_comparison_app_state.tsx", + "path": "x-pack/plugins/data_visualizer/public/application/data_drift/data_drift_app_state.tsx", "deprecated": false, "trackAdoption": false, "returnComment": [], "children": [ { "parentPluginId": "dataVisualizer", - "id": "def-public.DataComparisonSpec.$1", + "id": "def-public.DataDriftSpec.$1", "type": "CompoundType", "tags": [], "label": "props", @@ -333,7 +333,7 @@ }, { "parentPluginId": "dataVisualizer", - "id": "def-public.DataComparisonSpec.$2", + "id": "def-public.DataDriftSpec.$2", "type": "Any", "tags": [], "label": "context", @@ -481,8 +481,8 @@ "label": "DataVisualizerPluginStart", "description": [], "signature": [ - "{ getFileDataVisualizerComponent: () => Promise<() => React.FC>; getIndexDataVisualizerComponent: () => Promise<() => React.FC>; getDataComparisonComponent: () => Promise<() => React.FC<", - "DataComparisonDetectionAppStateProps", + "{ getFileDataVisualizerComponent: () => Promise<() => React.FC>; getIndexDataVisualizerComponent: () => Promise<() => React.FC>; getDataDriftComponent: () => Promise<() => React.FC<", + "DataDriftDetectionAppStateProps", ">>; getMaxBytesFormatted: () => string; }" ], "path": "x-pack/plugins/data_visualizer/public/plugin.ts", diff --git a/api_docs/data_visualizer.mdx b/api_docs/data_visualizer.mdx index 03205c22a0910..b26b5722348b6 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-09-26 +date: 2023-09-27 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 3977a95f479c1..02d5eca6f24b7 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -18,14 +18,14 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | ---------------|-----------|-----------| | | ml, stackAlerts | - | | | ruleRegistry, ml, securitySolution, observability, infra, monitoring, stackAlerts, synthetics, transform, uptime | - | -| | @kbn/es-query, @kbn/visualization-ui-components, securitySolution, observability, timelines, lists, threatIntelligence, savedSearch, dataViews, logsShared, savedObjectsManagement, unifiedSearch, controls, @kbn/unified-field-list, lens, triggersActionsUi, dataVisualizer, ml, apm, exploratoryView, fleet, stackAlerts, infra, canvas, enterpriseSearch, graph, visTypeTimeseries, transform, upgradeAssistant, uptime, ux, maps, dataViewManagement, eventAnnotationListing, inputControlVis, visDefaultEditor, presentationUtil, visTypeTimelion, visTypeVega, data | - | -| | @kbn/es-query, @kbn/visualization-ui-components, securitySolution, observability, timelines, lists, threatIntelligence, savedSearch, dataViews, logsShared, savedObjectsManagement, unifiedSearch, controls, @kbn/unified-field-list, lens, triggersActionsUi, dataVisualizer, ml, apm, exploratoryView, fleet, stackAlerts, infra, canvas, enterpriseSearch, graph, visTypeTimeseries, transform, upgradeAssistant, uptime, ux, maps, dataViewManagement, eventAnnotationListing, inputControlVis, visDefaultEditor, presentationUtil, visTypeTimelion, visTypeVega, data | - | -| | @kbn/es-query, @kbn/visualization-ui-components, securitySolution, observability, timelines, lists, threatIntelligence, savedSearch, data, logsShared, savedObjectsManagement, unifiedSearch, controls, @kbn/unified-field-list, lens, triggersActionsUi, dataVisualizer, ml, apm, exploratoryView, fleet, stackAlerts, infra, canvas, enterpriseSearch, graph, visTypeTimeseries, transform, upgradeAssistant, uptime, ux, maps, dataViewManagement, eventAnnotationListing, inputControlVis, visDefaultEditor, presentationUtil, visTypeTimelion, visTypeVega | - | +| | @kbn/es-query, @kbn/visualization-ui-components, securitySolution, observability, timelines, lists, threatIntelligence, savedSearch, dataViews, logsShared, savedObjectsManagement, unifiedSearch, controls, @kbn/unified-field-list, lens, triggersActionsUi, dataVisualizer, ml, apm, exploratoryView, fleet, stackAlerts, infra, canvas, presentationUtil, enterpriseSearch, graph, visTypeTimeseries, transform, upgradeAssistant, uptime, ux, maps, dataViewManagement, eventAnnotationListing, inputControlVis, visDefaultEditor, visTypeTimelion, visTypeVega, data | - | +| | @kbn/es-query, @kbn/visualization-ui-components, securitySolution, observability, timelines, lists, threatIntelligence, savedSearch, dataViews, logsShared, savedObjectsManagement, unifiedSearch, controls, @kbn/unified-field-list, lens, triggersActionsUi, dataVisualizer, ml, apm, exploratoryView, fleet, stackAlerts, infra, canvas, presentationUtil, enterpriseSearch, graph, visTypeTimeseries, transform, upgradeAssistant, uptime, ux, maps, dataViewManagement, eventAnnotationListing, inputControlVis, visDefaultEditor, visTypeTimelion, visTypeVega, data | - | +| | @kbn/es-query, @kbn/visualization-ui-components, securitySolution, observability, timelines, lists, threatIntelligence, savedSearch, data, logsShared, savedObjectsManagement, unifiedSearch, controls, @kbn/unified-field-list, lens, triggersActionsUi, dataVisualizer, ml, apm, exploratoryView, fleet, stackAlerts, infra, canvas, presentationUtil, enterpriseSearch, graph, visTypeTimeseries, transform, upgradeAssistant, uptime, ux, maps, dataViewManagement, eventAnnotationListing, inputControlVis, visDefaultEditor, visTypeTimelion, visTypeVega | - | | | home, data, esUiShared, savedObjectsManagement, ml, exploratoryView, fleet, observability, apm, indexLifecycleManagement, observabilityOnboarding, synthetics, upgradeAssistant, uptime, ux, kibanaOverview | - | -| | share, uiActions, guidedOnboarding, home, serverless, management, spaces, security, savedObjects, indexManagement, visualizations, controls, dashboard, savedObjectsTagging, expressionXY, lens, expressionMetricVis, expressionGauge, alerting, triggersActionsUi, cases, licenseManagement, advancedSettings, maps, dataVisualizer, aiops, ml, exploratoryView, fleet, observability, infra, profiling, apm, expressionImage, expressionMetric, expressionError, expressionRevealImage, expressionRepeatImage, expressionShape, crossClusterReplication, enterpriseSearch, globalSearchBar, graph, grokdebugger, indexLifecycleManagement, ingestPipelines, logstash, monitoring, observabilityOnboarding, osquery, devTools, painlessLab, remoteClusters, rollup, searchprofiler, newsfeed, securitySolution, snapshotRestore, synthetics, transform, upgradeAssistant, uptime, ux, watcher, cloudDataMigration, console, filesManagement, kibanaOverview, visDefaultEditor, expressionHeatmap, expressionLegacyMetricVis, expressionPartitionVis, expressionTagcloud, visTypeTable, visTypeTimelion, visTypeTimeseries, visTypeVega, visTypeVislib | - | +| | share, uiActions, guidedOnboarding, home, serverless, management, spaces, security, savedObjects, indexManagement, visualizations, controls, dashboard, savedObjectsTagging, expressionXY, lens, expressionMetricVis, expressionGauge, alerting, triggersActionsUi, cases, licenseManagement, advancedSettings, maps, dataVisualizer, aiops, ml, exploratoryView, fleet, infra, profiling, apm, expressionImage, expressionMetric, expressionError, expressionRevealImage, expressionRepeatImage, expressionShape, crossClusterReplication, enterpriseSearch, globalSearchBar, graph, grokdebugger, indexLifecycleManagement, ingestPipelines, logstash, monitoring, observabilityOnboarding, osquery, devTools, painlessLab, remoteClusters, rollup, searchprofiler, newsfeed, securitySolution, snapshotRestore, synthetics, transform, upgradeAssistant, uptime, ux, watcher, cloudDataMigration, console, filesManagement, kibanaOverview, visDefaultEditor, expressionHeatmap, expressionLegacyMetricVis, expressionPartitionVis, expressionTagcloud, visTypeTable, visTypeTimelion, visTypeTimeseries, visTypeVega, visTypeVislib | - | | | encryptedSavedObjects, actions, data, ml, securitySolution, logstash, cloudChat | - | | | actions, ml, savedObjectsTagging, enterpriseSearch | - | -| | @kbn/core-saved-objects-browser-internal, @kbn/core, savedObjects, presentationUtil, visualizations, dataVisualizer, ml, aiops, dashboardEnhanced, graph, lens, securitySolution, eventAnnotation, @kbn/core-saved-objects-browser-mocks | - | +| | @kbn/core-saved-objects-browser-internal, @kbn/core, savedObjects, visualizations, dataVisualizer, ml, aiops, dashboardEnhanced, graph, lens, securitySolution, eventAnnotation, @kbn/core-saved-objects-browser-mocks | - | | | @kbn/core, ml, savedObjects, embeddable, visualizations, canvas, graph, @kbn/core-saved-objects-common, @kbn/core-saved-objects-server, actions, alerting, securitySolution, savedSearch, enterpriseSearch, taskManager, @kbn/core-saved-objects-server-internal, @kbn/core-saved-objects-api-server | - | | | stackAlerts, alerting, securitySolution, inputControlVis | - | | | stackAlerts, infra, graph, inputControlVis, securitySolution, savedObjects | - | @@ -60,7 +60,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | securitySolution | - | | | monitoring | - | | | dataVisualizer, exploratoryView, fleet, cloudSecurityPosture, discoverEnhanced, osquery, synthetics | - | -| | @kbn/core-plugins-browser-internal, @kbn/core-root-browser-internal, home, savedObjects, unifiedSearch, presentationUtil, visualizations, fileUpload, dashboardEnhanced, transform, discover, dataVisualizer | - | +| | @kbn/core-plugins-browser-internal, @kbn/core-root-browser-internal, home, savedObjects, unifiedSearch, visualizations, fileUpload, dashboardEnhanced, transform, discover, dataVisualizer | - | | | @kbn/core, @kbn/core-lifecycle-browser, @kbn/core-saved-objects-browser-internal, visualizations, exploratoryView, transform, @kbn/core-saved-objects-browser-mocks | - | | | actions, alerting | - | | | discover | - | @@ -76,7 +76,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | home, @kbn/core-saved-objects-browser-mocks, @kbn/core-saved-objects-browser-internal | - | | | @kbn/core-saved-objects-browser-internal, savedObjects, visualizations, @kbn/core-saved-objects-browser-mocks | - | | | @kbn/core-saved-objects-browser-mocks, @kbn/core-saved-objects-browser-internal | - | -| | savedObjects, presentationUtil, @kbn/core-saved-objects-browser-mocks, dashboardEnhanced, @kbn/core-saved-objects-browser-internal | - | +| | savedObjects, @kbn/core-saved-objects-browser-mocks, dashboardEnhanced, @kbn/core-saved-objects-browser-internal | - | | | savedObjects, @kbn/core-saved-objects-browser-mocks, dashboardEnhanced, @kbn/core-saved-objects-browser-internal | - | | | @kbn/core-saved-objects-browser-mocks, savedObjects, @kbn/core-saved-objects-browser-internal | - | | | @kbn/core-saved-objects-browser-mocks, @kbn/core-saved-objects-browser-internal | - | diff --git a/api_docs/deprecations_by_plugin.mdx b/api_docs/deprecations_by_plugin.mdx index 71e6a906296dc..ae4b936e62054 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- @@ -535,7 +535,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| | | [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/services/data/types.ts#:~:text=fieldFormats), [data_service.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/services/data/data_service.ts#:~:text=fieldFormats) | - | -| | [show_settings.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/embeddable/api/show_settings.tsx#:~:text=toMountPoint), [show_settings.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/embeddable/api/show_settings.tsx#:~:text=toMountPoint), [confirm_overlays.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_listing/confirm_overlays.tsx#:~:text=toMountPoint), [confirm_overlays.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_listing/confirm_overlays.tsx#:~:text=toMountPoint), [dashboard_no_match.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_app/listing_page/dashboard_no_match.tsx#:~:text=toMountPoint), [dashboard_no_match.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_app/listing_page/dashboard_no_match.tsx#:~:text=toMountPoint), [dashboard_listing.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_listing/dashboard_listing.tsx#:~:text=toMountPoint), [dashboard_listing.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_listing/dashboard_listing.tsx#:~:text=toMountPoint), [open_replace_panel_flyout.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_actions/open_replace_panel_flyout.tsx#:~:text=toMountPoint), [open_replace_panel_flyout.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_actions/open_replace_panel_flyout.tsx#:~:text=toMountPoint)+ 4 more | - | +| | [show_settings.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/embeddable/api/show_settings.tsx#:~:text=toMountPoint), [show_settings.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/embeddable/api/show_settings.tsx#:~:text=toMountPoint), [confirm_overlays.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_listing/confirm_overlays.tsx#:~:text=toMountPoint), [confirm_overlays.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_listing/confirm_overlays.tsx#:~:text=toMountPoint), [dashboard_no_match.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_app/listing_page/dashboard_no_match.tsx#:~:text=toMountPoint), [dashboard_no_match.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_app/listing_page/dashboard_no_match.tsx#:~:text=toMountPoint), [dashboard_listing.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_listing/dashboard_listing.tsx#:~:text=toMountPoint), [dashboard_listing.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_listing/dashboard_listing.tsx#:~:text=toMountPoint), [open_replace_panel_flyout.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_actions/open_replace_panel_flyout.tsx#:~:text=toMountPoint), [open_replace_panel_flyout.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_actions/open_replace_panel_flyout.tsx#:~:text=toMountPoint)+ 2 more | - | | | [dashboard_container.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx#:~:text=KibanaThemeProvider), [dashboard_container.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx#:~:text=KibanaThemeProvider), [dashboard_container.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/embeddable/dashboard_container.tsx#:~:text=KibanaThemeProvider), [dashboard_router.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_app/dashboard_router.tsx#:~:text=KibanaThemeProvider), [dashboard_router.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_app/dashboard_router.tsx#:~:text=KibanaThemeProvider), [dashboard_router.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_app/dashboard_router.tsx#:~:text=KibanaThemeProvider) | - | | | [save_modal.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/embeddable/api/overlays/save_modal.tsx#:~:text=SavedObjectSaveModal), [save_modal.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/public/dashboard_container/embeddable/api/overlays/save_modal.tsx#:~:text=SavedObjectSaveModal) | 8.8.0 | | | [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/common/bwc/types.ts#:~:text=SavedObjectReference), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/dashboard/common/bwc/types.ts#:~:text=SavedObjectReference) | - | @@ -630,12 +630,12 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Deprecated API | Reference location(s) | Remove By | | ---------------|-----------|-----------| -| | [document_stats.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/components/field_data_row/document_stats.tsx#:~:text=fieldFormats), [top_values.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/top_values/top_values.tsx#:~:text=fieldFormats), [choropleth_map.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/components/field_data_expanded_row/choropleth_map.tsx#:~:text=fieldFormats) | - | +| | [document_stats.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/components/field_data_row/document_stats.tsx#:~:text=fieldFormats), [top_values.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/top_values/top_values.tsx#:~:text=fieldFormats), [choropleth_map.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/stats_table/components/field_data_expanded_row/choropleth_map.tsx#:~:text=fieldFormats), [default_value_formatter.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/data_drift/charts/default_value_formatter.ts#:~:text=fieldFormats) | - | | | [use_data_visualizer_grid_data.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/use_data_visualizer_grid_data.ts#:~:text=title), [use_data_visualizer_grid_data.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/use_data_visualizer_grid_data.ts#:~:text=title) | - | | | [use_data_visualizer_grid_data.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/use_data_visualizer_grid_data.ts#:~:text=title), [use_data_visualizer_grid_data.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/use_data_visualizer_grid_data.ts#:~:text=title) | - | | | [use_data_visualizer_grid_data.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/hooks/use_data_visualizer_grid_data.ts#:~:text=title) | - | | | [results_links.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/common/components/results_links/results_links.tsx#:~:text=indexPatternId), [actions_panel.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/components/actions_panel/actions_panel.tsx#:~:text=indexPatternId) | - | -| | [file_data_visualizer.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/file_data_visualizer.tsx#:~:text=KibanaThemeProvider), [file_data_visualizer.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/file_data_visualizer.tsx#:~:text=KibanaThemeProvider), [file_data_visualizer.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/file_data_visualizer.tsx#:~:text=KibanaThemeProvider), [grid_embeddable.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/embeddables/grid_embeddable/grid_embeddable.tsx#:~:text=KibanaThemeProvider), [grid_embeddable.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/embeddables/grid_embeddable/grid_embeddable.tsx#:~:text=KibanaThemeProvider), [grid_embeddable.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/embeddables/grid_embeddable/grid_embeddable.tsx#:~:text=KibanaThemeProvider), [index_data_visualizer.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/index_data_visualizer.tsx#:~:text=KibanaThemeProvider), [index_data_visualizer.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/index_data_visualizer.tsx#:~:text=KibanaThemeProvider), [index_data_visualizer.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/index_data_visualizer.tsx#:~:text=KibanaThemeProvider), [data_comparison_app_state.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/data_comparison/data_comparison_app_state.tsx#:~:text=KibanaThemeProvider)+ 2 more | - | +| | [file_data_visualizer.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/file_data_visualizer.tsx#:~:text=KibanaThemeProvider), [file_data_visualizer.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/file_data_visualizer.tsx#:~:text=KibanaThemeProvider), [file_data_visualizer.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/file_data_visualizer/file_data_visualizer.tsx#:~:text=KibanaThemeProvider), [grid_embeddable.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/embeddables/grid_embeddable/grid_embeddable.tsx#:~:text=KibanaThemeProvider), [grid_embeddable.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/embeddables/grid_embeddable/grid_embeddable.tsx#:~:text=KibanaThemeProvider), [grid_embeddable.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/embeddables/grid_embeddable/grid_embeddable.tsx#:~:text=KibanaThemeProvider), [index_data_visualizer.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/index_data_visualizer.tsx#:~:text=KibanaThemeProvider), [index_data_visualizer.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/index_data_visualizer.tsx#:~:text=KibanaThemeProvider), [index_data_visualizer.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/index_data_visualizer.tsx#:~:text=KibanaThemeProvider), [data_drift_app_state.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/data_drift/data_drift_app_state.tsx#:~:text=KibanaThemeProvider)+ 2 more | - | | | [index_data_visualizer.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/public/application/index_data_visualizer/index_data_visualizer.tsx#:~:text=savedObjects) | - | | | [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/common/types/index.ts#:~:text=SimpleSavedObject), [index.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/data_visualizer/common/types/index.ts#:~:text=SimpleSavedObject) | - | @@ -1237,7 +1237,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [use_metrics_explorer_data.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/custom_threshold/hooks/use_metrics_explorer_data.ts#:~:text=title), [use_metrics_explorer_data.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/custom_threshold/hooks/use_metrics_explorer_data.ts#:~:text=title), [use_metrics_explorer_data.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/custom_threshold/hooks/use_metrics_explorer_data.ts#:~:text=title), [use_metrics_explorer_data.ts](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/custom_threshold/hooks/use_metrics_explorer_data.ts#:~:text=title), [custom_threshold_rule_expression.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/custom_threshold/custom_threshold_rule_expression.tsx#:~:text=title), [alert_details_app_section.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/custom_threshold/components/alert_details_app_section.tsx#:~:text=title) | - | | | [header_menu_portal.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/pages/overview/components/header_menu/header_menu_portal.tsx#:~:text=toMountPoint), [header_menu_portal.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/pages/overview/components/header_menu/header_menu_portal.tsx#:~:text=toMountPoint) | - | | | [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/application/index.tsx#:~:text=RedirectAppLinks), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/application/index.tsx#:~:text=RedirectAppLinks), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/application/index.tsx#:~:text=RedirectAppLinks) | - | -| | [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/application/index.tsx#:~:text=KibanaThemeProvider), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/application/index.tsx#:~:text=KibanaThemeProvider), [index.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/application/index.tsx#:~:text=KibanaThemeProvider) | - | | | [render_cell_value.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/alerts_table/render_cell_value.tsx#:~:text=DeprecatedCellValueElementProps), [render_cell_value.tsx](https://github.com/elastic/kibana/tree/main/x-pack/plugins/observability/public/components/alerts_table/render_cell_value.tsx#:~:text=DeprecatedCellValueElementProps) | - | @@ -1290,9 +1289,6 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [data_views.story.ts](https://github.com/elastic/kibana/tree/main/src/plugins/presentation_util/public/services/data_views/data_views.story.ts#:~:text=title), [data_views.story.ts](https://github.com/elastic/kibana/tree/main/src/plugins/presentation_util/public/services/data_views/data_views.story.ts#:~:text=title) | - | | | [data_views.story.ts](https://github.com/elastic/kibana/tree/main/src/plugins/presentation_util/public/services/data_views/data_views.story.ts#:~:text=title) | - | | | [saved_object_save_modal_dashboard.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/presentation_util/public/components/saved_object_save_modal_dashboard.tsx#:~:text=SavedObjectSaveModal), [saved_object_save_modal_dashboard.tsx](https://github.com/elastic/kibana/tree/main/src/plugins/presentation_util/public/components/saved_object_save_modal_dashboard.tsx#:~:text=SavedObjectSaveModal) | 8.8.0 | -| | [dashboards_service.ts](https://github.com/elastic/kibana/tree/main/src/plugins/presentation_util/public/services/dashboards/dashboards_service.ts#:~:text=savedObjects) | - | -| | [dashboards_service.ts](https://github.com/elastic/kibana/tree/main/src/plugins/presentation_util/public/services/dashboards/dashboards_service.ts#:~:text=find) | - | -| | [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/presentation_util/public/services/dashboards/types.ts#:~:text=SimpleSavedObject), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/presentation_util/public/services/dashboards/types.ts#:~:text=SimpleSavedObject), [types.ts](https://github.com/elastic/kibana/tree/main/src/plugins/presentation_util/public/services/dashboards/types.ts#:~:text=SimpleSavedObject) | - | diff --git a/api_docs/deprecations_by_team.mdx b/api_docs/deprecations_by_team.mdx index 81ecaa3b56c29..33493d3e7c5fe 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana'] --- diff --git a/api_docs/dev_tools.mdx b/api_docs/dev_tools.mdx index f4c8a663168f7..e164309adfc17 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'devTools'] --- import devToolsObj from './dev_tools.devdocs.json'; diff --git a/api_docs/discover.mdx b/api_docs/discover.mdx index 9470adde29441..502e441a59e12 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'discover'] --- import discoverObj from './discover.devdocs.json'; diff --git a/api_docs/discover_enhanced.mdx b/api_docs/discover_enhanced.mdx index ca1aa13a7a575..0707de8d80f73 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-09-26 +date: 2023-09-27 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 92763c877c9a8..a43391dfdd605 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'ecsDataQualityDashboard'] --- import ecsDataQualityDashboardObj from './ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/elastic_assistant.mdx b/api_docs/elastic_assistant.mdx index 02d6d501b1700..9516628c66de8 100644 --- a/api_docs/elastic_assistant.mdx +++ b/api_docs/elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/elasticAssistant title: "elasticAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the elasticAssistant plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'elasticAssistant'] --- import elasticAssistantObj from './elastic_assistant.devdocs.json'; diff --git a/api_docs/embeddable.devdocs.json b/api_docs/embeddable.devdocs.json index e0099830f1f89..10b115cf08932 100644 --- a/api_docs/embeddable.devdocs.json +++ b/api_docs/embeddable.devdocs.json @@ -7338,6 +7338,20 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "embeddable", + "id": "def-public.EmbeddablePackageState.size", + "type": "Object", + "tags": [], + "label": "size", + "description": [], + "signature": [ + "{ width?: number | undefined; height?: number | undefined; } | undefined" + ], + "path": "src/plugins/embeddable/public/lib/state_transfer/types.ts", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "embeddable", "id": "def-public.EmbeddablePackageState.searchSessionId", diff --git a/api_docs/embeddable.mdx b/api_docs/embeddable.mdx index 78fa7d6fbef6b..b967fd6551708 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'embeddable'] --- import embeddableObj from './embeddable.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kib | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 534 | 1 | 434 | 7 | +| 535 | 1 | 435 | 7 | ## Client diff --git a/api_docs/embeddable_enhanced.mdx b/api_docs/embeddable_enhanced.mdx index 6b4f362298339..fe5578c5872b1 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-09-26 +date: 2023-09-27 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 db61a703d2915..d8bd4252fc105 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-09-26 +date: 2023-09-27 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 aa4cff43ad780..3d9074b3bc9ca 100644 --- a/api_docs/enterprise_search.devdocs.json +++ b/api_docs/enterprise_search.devdocs.json @@ -5,14 +5,30 @@ "functions": [], "interfaces": [], "enums": [], - "misc": [], + "misc": [ + { + "parentPluginId": "enterpriseSearch", + "id": "def-public.EnterpriseSearchPublicStart", + "type": "Type", + "tags": [], + "label": "EnterpriseSearchPublicStart", + "description": [], + "signature": [ + "Promise" + ], + "path": "x-pack/plugins/enterprise_search/public/plugin.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], "objects": [], "start": { "parentPluginId": "enterpriseSearch", - "id": "def-public.EnterpriseSearchPublicStart", + "id": "def-public.EnterpriseSearchPublicSetup", "type": "Type", "tags": [], - "label": "EnterpriseSearchPublicStart", + "label": "EnterpriseSearchPublicSetup", "description": [], "signature": [ "void" diff --git a/api_docs/enterprise_search.mdx b/api_docs/enterprise_search.mdx index e23ffd9c0e090..a1feaa96c7262 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'enterpriseSearch'] --- import enterpriseSearchObj from './enterprise_search.devdocs.json'; @@ -28,6 +28,9 @@ Contact [@elastic/enterprise-search-frontend](https://github.com/orgs/elastic/te ### Start +### Consts, variables and types + + ## Server ### Objects diff --git a/api_docs/es_ui_shared.mdx b/api_docs/es_ui_shared.mdx index 3d88e82266b09..e1de23125551e 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-09-26 +date: 2023-09-27 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 67a2fa95c3019..8612928b4d897 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotation'] --- import eventAnnotationObj from './event_annotation.devdocs.json'; diff --git a/api_docs/event_annotation_listing.mdx b/api_docs/event_annotation_listing.mdx index d7f54f483495f..86825377b6cc1 100644 --- a/api_docs/event_annotation_listing.mdx +++ b/api_docs/event_annotation_listing.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/eventAnnotationListing title: "eventAnnotationListing" image: https://source.unsplash.com/400x175/?github description: API docs for the eventAnnotationListing plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'eventAnnotationListing'] --- import eventAnnotationListingObj from './event_annotation_listing.devdocs.json'; diff --git a/api_docs/event_log.mdx b/api_docs/event_log.mdx index ca37dcdc39e72..d262a795e9dfc 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-09-26 +date: 2023-09-27 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 3d41811601ad1..3534c64c75114 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-09-26 +date: 2023-09-27 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 5ed1bbfab229c..d8f8ce4777c0f 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-09-26 +date: 2023-09-27 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 ad2dfe5486f85..9c8be61eab7e3 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-09-26 +date: 2023-09-27 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 c77732e6854be..abbc24ecd3dc1 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-09-26 +date: 2023-09-27 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 f4efc14efc855..4d7e8563ded55 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-09-26 +date: 2023-09-27 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 991a3ccc2ecfd..a9676a6672dcb 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-09-26 +date: 2023-09-27 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 3616b76fc9b8d..cb4d694a4799f 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-09-26 +date: 2023-09-27 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 ef0d0acf0cfa6..4fb5d3de6ab64 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-09-26 +date: 2023-09-27 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 7d8b20f7423b3..c0cc747d57361 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-09-26 +date: 2023-09-27 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 70d9fe0be3f65..32b4ba7b8e1be 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-09-26 +date: 2023-09-27 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 f206257eb990f..4072d1d65a171 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-09-26 +date: 2023-09-27 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 fa40bf6fefc1b..0241361493e48 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-09-26 +date: 2023-09-27 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 9bc625fef6886..427994f18cc4f 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-09-26 +date: 2023-09-27 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 58134a1646421..b625cb5fea8da 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-09-26 +date: 2023-09-27 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 2beb233b9c7bd..3cb09730248db 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-09-26 +date: 2023-09-27 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 0a4a09158b8da..d319a8e453d2f 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-09-26 +date: 2023-09-27 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 ba867d77d18db..acea1c1b4dc23 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-09-26 +date: 2023-09-27 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 7c30ad8b84139..c1306492e6e9c 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'fileUpload'] --- import fileUploadObj from './file_upload.devdocs.json'; diff --git a/api_docs/files.mdx b/api_docs/files.mdx index 8472065eba41d..52a957d804bb4 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'files'] --- import filesObj from './files.devdocs.json'; diff --git a/api_docs/files_management.mdx b/api_docs/files_management.mdx index c29a23abef03d..18046b81816fe 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'filesManagement'] --- import filesManagementObj from './files_management.devdocs.json'; diff --git a/api_docs/fleet.mdx b/api_docs/fleet.mdx index 2c2ae86b9c9d4..2581af68b9cb5 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-09-26 +date: 2023-09-27 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 df980b8e1e648..34fa9db21d736 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-09-26 +date: 2023-09-27 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 8c8db8cda054b..b9ada15f3ffcf 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-09-26 +date: 2023-09-27 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 03efc5f145f50..bf2a070742443 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-09-26 +date: 2023-09-27 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 d580d7279dca1..4029b9f116b8c 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-09-26 +date: 2023-09-27 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 37ffce58d2121..de6dc19aaaae6 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-09-26 +date: 2023-09-27 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 b9e6e34026aa3..7de9acbd42123 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'indexManagement'] --- import indexManagementObj from './index_management.devdocs.json'; diff --git a/api_docs/infra.mdx b/api_docs/infra.mdx index 537827b5f495f..76744edfef6fa 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'infra'] --- import infraObj from './infra.devdocs.json'; diff --git a/api_docs/inspector.mdx b/api_docs/inspector.mdx index f5a8d45c50692..9825df29f4a7f 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-09-26 +date: 2023-09-27 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 202e64cb65007..9534753171845 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-09-26 +date: 2023-09-27 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 d04cba38b65e6..ffa2697b5764f 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ace'] --- import kbnAceObj from './kbn_ace.devdocs.json'; diff --git a/api_docs/kbn_aiops_components.devdocs.json b/api_docs/kbn_aiops_components.devdocs.json index 702a63d266bef..dffa211061c67 100644 --- a/api_docs/kbn_aiops_components.devdocs.json +++ b/api_docs/kbn_aiops_components.devdocs.json @@ -360,6 +360,22 @@ "deprecated": false, "trackAdoption": false }, + { + "parentPluginId": "@kbn/aiops-components", + "id": "def-common.DocumentCountChartProps.height", + "type": "number", + "tags": [], + "label": "height", + "description": [ + "Optional chart height" + ], + "signature": [ + "number | undefined" + ], + "path": "x-pack/packages/ml/aiops_components/src/document_count_chart/document_count_chart.tsx", + "deprecated": false, + "trackAdoption": false + }, { "parentPluginId": "@kbn/aiops-components", "id": "def-common.DocumentCountChartProps.chartPoints", @@ -589,6 +605,22 @@ "path": "x-pack/packages/ml/aiops_components/src/document_count_chart/document_count_chart.tsx", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/aiops-components", + "id": "def-common.DocumentCountChartProps.dataTestSubj", + "type": "string", + "tags": [], + "label": "dataTestSubj", + "description": [ + "Optional data-test-subject" + ], + "signature": [ + "string | undefined" + ], + "path": "x-pack/packages/ml/aiops_components/src/document_count_chart/document_count_chart.tsx", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/kbn_aiops_components.mdx b/api_docs/kbn_aiops_components.mdx index e453c0eefb68a..3e9add987aa65 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-components'] --- import kbnAiopsComponentsObj from './kbn_aiops_components.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) for questi | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 33 | 0 | 0 | 0 | +| 35 | 0 | 0 | 0 | ## Common diff --git a/api_docs/kbn_aiops_utils.mdx b/api_docs/kbn_aiops_utils.mdx index e385fd4517c2c..5c24f9e78cb6f 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/aiops-utils'] --- import kbnAiopsUtilsObj from './kbn_aiops_utils.devdocs.json'; diff --git a/api_docs/kbn_alerting_api_integration_helpers.mdx b/api_docs/kbn_alerting_api_integration_helpers.mdx index 42704e94f816d..d52e7cc4fa8cd 100644 --- a/api_docs/kbn_alerting_api_integration_helpers.mdx +++ b/api_docs/kbn_alerting_api_integration_helpers.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-alerting-api-integration-helpers title: "@kbn/alerting-api-integration-helpers" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/alerting-api-integration-helpers plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-api-integration-helpers'] --- import kbnAlertingApiIntegrationHelpersObj from './kbn_alerting_api_integration_helpers.devdocs.json'; diff --git a/api_docs/kbn_alerting_state_types.mdx b/api_docs/kbn_alerting_state_types.mdx index e322ca58e9426..69e289a1fd58b 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/alerting-state-types'] --- import kbnAlertingStateTypesObj from './kbn_alerting_state_types.devdocs.json'; diff --git a/api_docs/kbn_alerts_as_data_utils.mdx b/api_docs/kbn_alerts_as_data_utils.mdx index 50486c8ad807f..4ce8b147a1c2c 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-09-26 +date: 2023-09-27 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 648f53b3d0e06..9b493b17c6f90 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-09-26 +date: 2023-09-27 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 7f17d6c2e675f..b21b2bccbf7f7 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/analytics'] --- import kbnAnalyticsObj from './kbn_analytics.devdocs.json'; diff --git a/api_docs/kbn_analytics_client.devdocs.json b/api_docs/kbn_analytics_client.devdocs.json index adbb90ee01e6e..b207525eeca92 100644 --- a/api_docs/kbn_analytics_client.devdocs.json +++ b/api_docs/kbn_analytics_client.devdocs.json @@ -662,6 +662,14 @@ "plugin": "@kbn/core-root-server-internal", "path": "packages/core/root/core-root-server-internal/src/server.ts" }, + { + "plugin": "@kbn/core-notifications-browser-internal", + "path": "packages/core/notifications/core-notifications-browser-internal/src/toasts/telemetry/event_reporter.ts" + }, + { + "plugin": "@kbn/core-notifications-browser-internal", + "path": "packages/core/notifications/core-notifications-browser-internal/src/toasts/telemetry/event_reporter.ts" + }, { "plugin": "@kbn/core-analytics-browser-internal", "path": "packages/core/analytics/core-analytics-browser-internal/src/track_clicks.ts" diff --git a/api_docs/kbn_analytics_client.mdx b/api_docs/kbn_analytics_client.mdx index 8dc81b42cacd3..f93c4814632a7 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-09-26 +date: 2023-09-27 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 e9450ce0f465c..f0072b2e611b8 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-09-26 +date: 2023-09-27 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 1789d7c2204b8..bda4aa4744c45 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-09-26 +date: 2023-09-27 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 944c658d43ed1..d6f992237079e 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-09-26 +date: 2023-09-27 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 f99f5d6067e73..77ddc29edf664 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-09-26 +date: 2023-09-27 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 05f6b5377964c..e0560f560a3a0 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-09-26 +date: 2023-09-27 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 1df6fc7694cc6..5fafe6c839ebf 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-09-26 +date: 2023-09-27 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 e7655fe80551e..8952dace68b2f 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/apm-synthtrace'] --- import kbnApmSynthtraceObj from './kbn_apm_synthtrace.devdocs.json'; diff --git a/api_docs/kbn_apm_synthtrace_client.mdx b/api_docs/kbn_apm_synthtrace_client.mdx index cb95b018fd98f..06014e0459115 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-09-26 +date: 2023-09-27 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 8f3fb9d5b7ed2..90a8fed671909 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-09-26 +date: 2023-09-27 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 cd10d689c2b4e..f7c71f7bb6952 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-09-26 +date: 2023-09-27 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 1431068c738ec..460e14f064547 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-09-26 +date: 2023-09-27 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 203243d1243ef..eb1ccf888893f 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-09-26 +date: 2023-09-27 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 10fc0677fd070..34646553e760d 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-09-26 +date: 2023-09-27 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 9b3b38d498a71..8347d9d58f645 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-09-26 +date: 2023-09-27 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 29e1f6b487ed4..b0cbb5ea164a5 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-09-26 +date: 2023-09-27 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 516cb6f154c35..f36300aedeec9 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-09-26 +date: 2023-09-27 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 5e4b65df6617b..e7320e039faff 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-09-26 +date: 2023-09-27 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 7ea9623fbede0..e4e9fcfe8e60e 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-09-26 +date: 2023-09-27 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 6568dcfb4ebfb..58edce24c43e2 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-09-26 +date: 2023-09-27 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 13934919915a6..080999aa9e01a 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-09-26 +date: 2023-09-27 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 81c1e78cdb4ed..b960b02b89b2d 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-09-26 +date: 2023-09-27 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 923d802e14cf3..e110d29f3a44f 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-09-26 +date: 2023-09-27 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 892bb885b03e3..02a6840e68f62 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-09-26 +date: 2023-09-27 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 7f75356ee1249..038758b00f6f8 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-09-26 +date: 2023-09-27 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 fbdfdaa40559a..709b7ce69ee92 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-content-editor'] --- import kbnContentManagementContentEditorObj from './kbn_content_management_content_editor.devdocs.json'; diff --git a/api_docs/kbn_content_management_tabbed_table_list_view.mdx b/api_docs/kbn_content_management_tabbed_table_list_view.mdx index b6197f9bb8f6d..2cc9e3616b0df 100644 --- a/api_docs/kbn_content_management_tabbed_table_list_view.mdx +++ b/api_docs/kbn_content_management_tabbed_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-tabbed-table-list-view title: "@kbn/content-management-tabbed-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-tabbed-table-list-view plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-tabbed-table-list-view'] --- import kbnContentManagementTabbedTableListViewObj from './kbn_content_management_tabbed_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view.mdx b/api_docs/kbn_content_management_table_list_view.mdx index ec7f4781572a2..9267f6416b0fc 100644 --- a/api_docs/kbn_content_management_table_list_view.mdx +++ b/api_docs/kbn_content_management_table_list_view.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view title: "@kbn/content-management-table-list-view" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view'] --- import kbnContentManagementTableListViewObj from './kbn_content_management_table_list_view.devdocs.json'; diff --git a/api_docs/kbn_content_management_table_list_view_table.mdx b/api_docs/kbn_content_management_table_list_view_table.mdx index 1961fd018bf23..7ee1c9185b7fc 100644 --- a/api_docs/kbn_content_management_table_list_view_table.mdx +++ b/api_docs/kbn_content_management_table_list_view_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-content-management-table-list-view-table title: "@kbn/content-management-table-list-view-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/content-management-table-list-view-table plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-table-list-view-table'] --- import kbnContentManagementTableListViewTableObj from './kbn_content_management_table_list_view_table.devdocs.json'; diff --git a/api_docs/kbn_content_management_utils.mdx b/api_docs/kbn_content_management_utils.mdx index ea1ddac1acccb..10d45333c71bd 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/content-management-utils'] --- import kbnContentManagementUtilsObj from './kbn_content_management_utils.devdocs.json'; diff --git a/api_docs/kbn_core_analytics_browser.mdx b/api_docs/kbn_core_analytics_browser.mdx index 556d8f62a9e15..64a880c014f5d 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-09-26 +date: 2023-09-27 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 6d148521ea8d1..471633511b6ff 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-09-26 +date: 2023-09-27 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 cc3dd8e056844..3e5e0a21393c8 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-09-26 +date: 2023-09-27 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 b07a9786502f7..a7b0d9808c5c3 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-09-26 +date: 2023-09-27 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 5fea29f4e0e1d..11a1428b58491 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-09-26 +date: 2023-09-27 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 7c82f557d2a87..df98a0e6edb27 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-09-26 +date: 2023-09-27 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 312d72590a91d..e44c288783f90 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-09-26 +date: 2023-09-27 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 a59ca46e539c7..e7fb15a08db41 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-09-26 +date: 2023-09-27 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 cf1cc04345fd3..870ea5a8ed97c 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-09-26 +date: 2023-09-27 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 c29a0840b354e..fc23b6d499462 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-09-26 +date: 2023-09-27 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 e2049a9a65f2e..698ce102960b2 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-09-26 +date: 2023-09-27 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 5bac2e0c37f33..2ec632e026073 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-09-26 +date: 2023-09-27 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 43d3f144856b9..eafbbbbfb7e2c 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-09-26 +date: 2023-09-27 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 8b9af9a5144a5..7725f53b100b2 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-09-26 +date: 2023-09-27 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 7c01dd0d69165..63d9aef51ba3e 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-09-26 +date: 2023-09-27 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 478da40a47462..bb56162d70dd6 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-09-26 +date: 2023-09-27 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 15194a6f8e001..a515fcb18dff8 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-09-26 +date: 2023-09-27 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 30ee4c3ab88e0..2857bb8d30e30 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-09-26 +date: 2023-09-27 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 188e1264b1550..39fa8b6558162 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-09-26 +date: 2023-09-27 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 c29fe430ddf70..da8e0297172b9 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-09-26 +date: 2023-09-27 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 c59f5ee00abc1..8ab9f727a7462 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-09-26 +date: 2023-09-27 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 c51888c62a08a..264d9d1e80a2f 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-09-26 +date: 2023-09-27 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 0397d0752b446..fcd4fcef062ce 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-09-26 +date: 2023-09-27 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 a50657c6e38b3..88dd1c7a98093 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-09-26 +date: 2023-09-27 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 5d8c66c15b68f..fe62791fa9db9 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-09-26 +date: 2023-09-27 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 cd5e0c9b6441c..354d0881fb28d 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-09-26 +date: 2023-09-27 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 e16a6ab16a3e6..439d757353ac9 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-09-26 +date: 2023-09-27 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 d481eadb89a3a..9f5687f9bf4ce 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-09-26 +date: 2023-09-27 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 92f2d33e83085..dacf337e259b0 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-09-26 +date: 2023-09-27 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 4ceec404db480..25d2c6e975fe9 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-09-26 +date: 2023-09-27 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 386c20d007458..44e4973ecac28 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-09-26 +date: 2023-09-27 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 8b13822bbdb7e..bfb85d80fcaa4 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-09-26 +date: 2023-09-27 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 b21cb7e2b2e64..8b3fc320f82e9 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-09-26 +date: 2023-09-27 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 bc244a60c7b76..e514fb26d44fc 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-09-26 +date: 2023-09-27 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 c8d25f2ac6a48..27ee7dbdce221 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-09-26 +date: 2023-09-27 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 5aea0dcc2c8ea..aa07083270e39 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-09-26 +date: 2023-09-27 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 b398cd35681fa..77a68b1e88b76 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-09-26 +date: 2023-09-27 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 a95ec4902fe1e..2a63618fc65af 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-09-26 +date: 2023-09-27 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 62f1a86399f76..07eb8e6b3c4cf 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-09-26 +date: 2023-09-27 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 e45675783de06..df37f26a04f3e 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-09-26 +date: 2023-09-27 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 9e6579bb6e920..f7e305048e64f 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-09-26 +date: 2023-09-27 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 ab219e38cb272..4762e16754e44 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-09-26 +date: 2023-09-27 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 55e1290c8aaff..2d3e1a1a1bda7 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-internal'] --- import kbnCoreElasticsearchClientServerInternalObj from './kbn_core_elasticsearch_client_server_internal.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx b/api_docs/kbn_core_elasticsearch_client_server_mocks.mdx index e4b22cfe3cff8..e541b9fc65349 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-client-server-mocks'] --- import kbnCoreElasticsearchClientServerMocksObj from './kbn_core_elasticsearch_client_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server.mdx b/api_docs/kbn_core_elasticsearch_server.mdx index 70e9af49d4432..426ec9451ed87 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-elasticsearch-server'] --- import kbnCoreElasticsearchServerObj from './kbn_core_elasticsearch_server.devdocs.json'; diff --git a/api_docs/kbn_core_elasticsearch_server_internal.mdx b/api_docs/kbn_core_elasticsearch_server_internal.mdx index 12da90107a28b..7e9cd9324b3ff 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-09-26 +date: 2023-09-27 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 3ffa742445af2..3d41fa16a952b 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-09-26 +date: 2023-09-27 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 c157f6abb8cdf..3b75bd44a33a0 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-09-26 +date: 2023-09-27 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 b518d18415957..f3a5a6c0f144d 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-09-26 +date: 2023-09-27 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 329e48bf6c67f..5c4357e365dde 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-09-26 +date: 2023-09-27 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 5a59259a19c5f..8cf0ca4234707 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-09-26 +date: 2023-09-27 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 010a58f8d3182..f89f870cf1a91 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-09-26 +date: 2023-09-27 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 726886a22b67d..b4666e03843bb 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-09-26 +date: 2023-09-27 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 e28c4a5234f62..bf811a0ebdb7c 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-09-26 +date: 2023-09-27 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 20731a0e92ae2..1fa83dadeb6ca 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-09-26 +date: 2023-09-27 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 fc51d7010efea..4a58ea937f2e4 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-09-26 +date: 2023-09-27 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 ce04788d2cb9b..c2e252a36883c 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-09-26 +date: 2023-09-27 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 53269aa7bb8f1..bd8a13595ee89 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-09-26 +date: 2023-09-27 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 a728eb94d98bb..1e39e17f6eea1 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-09-26 +date: 2023-09-27 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 9d505dced37d1..13b0341a011eb 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-09-26 +date: 2023-09-27 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 fba13f8a6b625..82980f9246303 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-09-26 +date: 2023-09-27 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 8df1fc093ea8c..09122b26b22be 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-09-26 +date: 2023-09-27 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 4b39d024f5f5f..e752f460319b5 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-09-26 +date: 2023-09-27 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 f2b5b9831a416..8a72477f0a7a3 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-09-26 +date: 2023-09-27 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 8b11a57de5e2a..c4bd2938980f3 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-09-26 +date: 2023-09-27 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 21a50d0c8c885..d954beadc3508 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-09-26 +date: 2023-09-27 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 e5f89cb8a7c5b..f9d6da194067d 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-09-26 +date: 2023-09-27 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 7d3812b5e8ba7..6ee60c96f2ad2 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-09-26 +date: 2023-09-27 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 c71280ba59305..de8c19412e2bf 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-09-26 +date: 2023-09-27 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 904971793ae04..bba55956eb84e 100644 --- a/api_docs/kbn_core_http_server.devdocs.json +++ b/api_docs/kbn_core_http_server.devdocs.json @@ -8607,7 +8607,7 @@ }, { "plugin": "alerting", - "path": "x-pack/plugins/alerting/server/routes/bulk_delete_rules.ts" + "path": "x-pack/plugins/alerting/server/routes/rule/apis/bulk_delete/bulk_delete_rules_route.ts" }, { "plugin": "alerting", @@ -8665,22 +8665,6 @@ "plugin": "@kbn/core-http-router-server-mocks", "path": "packages/core/http/core-http-router-server-mocks/src/router.mock.ts" }, - { - "plugin": "alerting", - "path": "x-pack/plugins/alerting/server/routes/bulk_delete_rules.test.ts" - }, - { - "plugin": "alerting", - "path": "x-pack/plugins/alerting/server/routes/bulk_delete_rules.test.ts" - }, - { - "plugin": "alerting", - "path": "x-pack/plugins/alerting/server/routes/bulk_delete_rules.test.ts" - }, - { - "plugin": "alerting", - "path": "x-pack/plugins/alerting/server/routes/bulk_delete_rules.test.ts" - }, { "plugin": "alerting", "path": "x-pack/plugins/alerting/server/routes/bulk_disable_rules.test.ts" @@ -8725,6 +8709,22 @@ "plugin": "ruleRegistry", "path": "x-pack/plugins/rule_registry/server/routes/__mocks__/server.ts" }, + { + "plugin": "alerting", + "path": "x-pack/plugins/alerting/server/routes/rule/apis/bulk_delete/bulk_delete_rules_route.test.ts" + }, + { + "plugin": "alerting", + "path": "x-pack/plugins/alerting/server/routes/rule/apis/bulk_delete/bulk_delete_rules_route.test.ts" + }, + { + "plugin": "alerting", + "path": "x-pack/plugins/alerting/server/routes/rule/apis/bulk_delete/bulk_delete_rules_route.test.ts" + }, + { + "plugin": "alerting", + "path": "x-pack/plugins/alerting/server/routes/rule/apis/bulk_delete/bulk_delete_rules_route.test.ts" + }, { "plugin": "indexManagement", "path": "x-pack/plugins/index_management/server/test/helpers/router_mock.ts" diff --git a/api_docs/kbn_core_http_server.mdx b/api_docs/kbn_core_http_server.mdx index 7a4c2393c5718..2ba536265757d 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-09-26 +date: 2023-09-27 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 50c42a9c5cf35..b8232593e40c2 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-09-26 +date: 2023-09-27 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 3cc4f242d7e11..5f6150e7fb007 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-09-26 +date: 2023-09-27 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 2209c106c63a8..954266d219cd3 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-09-26 +date: 2023-09-27 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 56b8936b3f716..7564b892fdec1 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-09-26 +date: 2023-09-27 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 838f8ff2263f6..04bd666a92b4b 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-09-26 +date: 2023-09-27 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 0cc05510a1ffa..98706c3e780d8 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-09-26 +date: 2023-09-27 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 f9a71a2b62db9..efce31e852a4a 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-09-26 +date: 2023-09-27 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 b0e3c5ba93dee..65954d6124e41 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-09-26 +date: 2023-09-27 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 3051546888669..323aef102549e 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-09-26 +date: 2023-09-27 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 7e7161430198b..b837a3b92545f 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-09-26 +date: 2023-09-27 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 fce341ae312bd..802c3d212231f 100644 --- a/api_docs/kbn_core_lifecycle_browser.devdocs.json +++ b/api_docs/kbn_core_lifecycle_browser.devdocs.json @@ -573,10 +573,6 @@ "plugin": "unifiedSearch", "path": "src/plugins/unified_search/public/types.ts" }, - { - "plugin": "presentationUtil", - "path": "src/plugins/presentation_util/public/services/dashboards/dashboards_service.ts" - }, { "plugin": "visualizations", "path": "src/plugins/visualizations/public/plugin.ts" diff --git a/api_docs/kbn_core_lifecycle_browser.mdx b/api_docs/kbn_core_lifecycle_browser.mdx index 5b15ca47b8ba0..a741c13fa5ace 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-09-26 +date: 2023-09-27 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 0a0b09c8badd2..daed976b33d3b 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-09-26 +date: 2023-09-27 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 e94a160c1fc75..e3670b884edb9 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-09-26 +date: 2023-09-27 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 910e75060fc09..8ae0c649273fd 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-09-26 +date: 2023-09-27 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 5523472f15956..a7fcc770e5d58 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-09-26 +date: 2023-09-27 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 cef0f65f3a6fd..44f8b0f80bd5d 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-09-26 +date: 2023-09-27 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 da9b23df4180d..719ca58cbb71e 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-09-26 +date: 2023-09-27 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 19294db4223bd..b27036817417d 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-09-26 +date: 2023-09-27 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 053a7eabc85bc..85080709f8303 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-09-26 +date: 2023-09-27 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 518f82123b971..5a4c1a95a06c7 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-09-26 +date: 2023-09-27 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 b122c49584404..0a5a0899a03a3 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-09-26 +date: 2023-09-27 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 766cd857349d8..dcaebf6fe8729 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-09-26 +date: 2023-09-27 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 7cc522ab4fd71..c63d7b7d37470 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-09-26 +date: 2023-09-27 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 4393db1b67188..82b1c21928b74 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-09-26 +date: 2023-09-27 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 6ff8192a33ffb..c09a8f3a694a4 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-09-26 +date: 2023-09-27 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 48ed61324dcea..44c0112beb0ac 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-09-26 +date: 2023-09-27 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 c6b0583a49400..5af0664859220 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-09-26 +date: 2023-09-27 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 2353acde456b1..d015938118703 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-09-26 +date: 2023-09-27 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 7457690f913bb..87514d840bd90 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-09-26 +date: 2023-09-27 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.devdocs.json b/api_docs/kbn_core_notifications_browser_internal.devdocs.json index f77222a80fcd1..4d6a55c60b3a3 100644 --- a/api_docs/kbn_core_notifications_browser_internal.devdocs.json +++ b/api_docs/kbn_core_notifications_browser_internal.devdocs.json @@ -53,7 +53,7 @@ "label": "setup", "description": [], "signature": [ - "({ uiSettings }: ", + "({ uiSettings, analytics }: ", "SetupDeps", ") => ", { @@ -73,7 +73,7 @@ "id": "def-common.NotificationsService.setup.$1", "type": "Object", "tags": [], - "label": "{ uiSettings }", + "label": "{ uiSettings, analytics }", "description": [], "signature": [ "SetupDeps" @@ -94,7 +94,7 @@ "label": "start", "description": [], "signature": [ - "({ i18n: i18nDep, overlays, theme, targetDomElement, }: ", + "({ analytics, i18n: i18nDep, overlays, theme, targetDomElement, }: ", "StartDeps", ") => ", { @@ -114,7 +114,7 @@ "id": "def-common.NotificationsService.start.$1", "type": "Object", "tags": [], - "label": "{\n i18n: i18nDep,\n overlays,\n theme,\n targetDomElement,\n }", + "label": "{\n analytics,\n i18n: i18nDep,\n overlays,\n theme,\n targetDomElement,\n }", "description": [], "signature": [ "StartDeps" @@ -820,7 +820,7 @@ "label": "NotificationsServiceContract", "description": [], "signature": [ - "{ start: ({ i18n: i18nDep, overlays, theme, targetDomElement, }: ", + "{ start: ({ analytics, i18n: i18nDep, overlays, theme, targetDomElement, }: ", "StartDeps", ") => ", { @@ -830,7 +830,7 @@ "section": "def-common.NotificationsStart", "text": "NotificationsStart" }, - "; setup: ({ uiSettings }: ", + "; setup: ({ uiSettings, analytics }: ", "SetupDeps", ") => ", { diff --git a/api_docs/kbn_core_notifications_browser_internal.mdx b/api_docs/kbn_core_notifications_browser_internal.mdx index 40b1f8be7dfe9..9b08ad8a037d3 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-09-26 +date: 2023-09-27 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 287c8a74fad4b..a6c1accb9d2a3 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-09-26 +date: 2023-09-27 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 5b1e3101a2ffa..5d6c2bcf06b08 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-09-26 +date: 2023-09-27 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 dd64cfe29323b..8a559023beee9 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-09-26 +date: 2023-09-27 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 0fb419fdcb733..82572885bc362 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-09-26 +date: 2023-09-27 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 3ba18684a44f7..2d64edbcad3af 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-09-26 +date: 2023-09-27 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 994dafc58a4d8..d22d98abcac8f 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-09-26 +date: 2023-09-27 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 5dd09363bf9e3..e1e076e60c441 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-09-26 +date: 2023-09-27 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 b067e04e1ec6c..7b16754cc7f91 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-09-26 +date: 2023-09-27 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 3eec8d4274255..5a8432763f9ce 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-09-26 +date: 2023-09-27 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 192e03884a75b..6d46e36846cf9 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-09-26 +date: 2023-09-27 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 4b9a512bc8fcb..eb63fe9367a21 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-09-26 +date: 2023-09-27 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 10af856edf809..df6d0304e3f1c 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-09-26 +date: 2023-09-27 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 4afbd0e98e994..6133ed94bf32e 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-09-26 +date: 2023-09-27 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 badce6d9b916d..fbbf5d902cf47 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-09-26 +date: 2023-09-27 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 a1ce0b5950132..30d81791476eb 100644 --- a/api_docs/kbn_core_saved_objects_api_browser.devdocs.json +++ b/api_docs/kbn_core_saved_objects_api_browser.devdocs.json @@ -1627,10 +1627,6 @@ "plugin": "savedObjects", "path": "src/plugins/saved_objects/public/saved_object/helpers/find_object_by_title.ts" }, - { - "plugin": "presentationUtil", - "path": "src/plugins/presentation_util/public/services/dashboards/dashboards_service.ts" - }, { "plugin": "@kbn/core-saved-objects-browser-mocks", "path": "packages/core/saved-objects/core-saved-objects-browser-mocks/src/saved_objects_service.mock.ts" @@ -2983,18 +2979,6 @@ "plugin": "savedObjects", "path": "src/plugins/saved_objects/public/saved_object/helpers/find_object_by_title.ts" }, - { - "plugin": "presentationUtil", - "path": "src/plugins/presentation_util/public/services/dashboards/types.ts" - }, - { - "plugin": "presentationUtil", - "path": "src/plugins/presentation_util/public/services/dashboards/types.ts" - }, - { - "plugin": "presentationUtil", - "path": "src/plugins/presentation_util/public/services/dashboards/types.ts" - }, { "plugin": "visualizations", "path": "src/plugins/visualizations/public/vis_types/vis_type_alias_registry.ts" diff --git a/api_docs/kbn_core_saved_objects_api_browser.mdx b/api_docs/kbn_core_saved_objects_api_browser.mdx index 4d1ade84be9b0..06f37273aa76e 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-09-26 +date: 2023-09-27 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 a683ee120aba9..68009380ec9be 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-api-server'] --- import kbnCoreSavedObjectsApiServerObj from './kbn_core_saved_objects_api_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_api_server_mocks.mdx b/api_docs/kbn_core_saved_objects_api_server_mocks.mdx index 0a5441e6c55b2..44d858a0ea2ca 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-09-26 +date: 2023-09-27 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 d29fa9e4483f7..0a958f0a9ed22 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-09-26 +date: 2023-09-27 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 697262b71b7ba..d671e5d248009 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-09-26 +date: 2023-09-27 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 dffbe045e0cd6..844c5039b54c5 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-09-26 +date: 2023-09-27 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 9cffeee08182d..338c47d45fb10 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-09-26 +date: 2023-09-27 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 cc0757aee2f95..48323a986ec9a 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-browser-mocks'] --- import kbnCoreSavedObjectsBrowserMocksObj from './kbn_core_saved_objects_browser_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_common.mdx b/api_docs/kbn_core_saved_objects_common.mdx index a8084f14ffd3b..fa9373d45ea17 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-common'] --- import kbnCoreSavedObjectsCommonObj from './kbn_core_saved_objects_common.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx b/api_docs/kbn_core_saved_objects_import_export_server_internal.mdx index 3802848464e71..571e864de7d12 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-09-26 +date: 2023-09-27 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 dcc24edc9c5f5..9d525035b72e6 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-import-export-server-mocks'] --- import kbnCoreSavedObjectsImportExportServerMocksObj from './kbn_core_saved_objects_import_export_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_migration_server_internal.mdx b/api_docs/kbn_core_saved_objects_migration_server_internal.mdx index 0eb4e9216130b..d0ab744e471e5 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-09-26 +date: 2023-09-27 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 951d86ad2df82..9b870df3d006d 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-migration-server-mocks'] --- import kbnCoreSavedObjectsMigrationServerMocksObj from './kbn_core_saved_objects_migration_server_mocks.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server.mdx b/api_docs/kbn_core_saved_objects_server.mdx index 5e110d387a563..092e2372e11dd 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-saved-objects-server'] --- import kbnCoreSavedObjectsServerObj from './kbn_core_saved_objects_server.devdocs.json'; diff --git a/api_docs/kbn_core_saved_objects_server_internal.mdx b/api_docs/kbn_core_saved_objects_server_internal.mdx index 529b309fdd3c7..536df1203a13b 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-09-26 +date: 2023-09-27 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 980928616a6da..d8b957e20efcb 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-09-26 +date: 2023-09-27 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 32433cc490bee..4114737bc417a 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-09-26 +date: 2023-09-27 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 647d18c24abcf..9745ed2c76005 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-09-26 +date: 2023-09-27 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 a5f5932e17a7d..a4378e0939307 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-09-26 +date: 2023-09-27 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 fc88feddaebb5..d8ee2308081cf 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-09-26 +date: 2023-09-27 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 c481d0b18d2f1..6638fb740dea7 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-09-26 +date: 2023-09-27 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 7883b70038955..edb94631e1768 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-09-26 +date: 2023-09-27 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 72d0967423861..c6ce0c4fd2c6a 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-09-26 +date: 2023-09-27 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 f28ebd232b777..c1ad9beeeccb8 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-09-26 +date: 2023-09-27 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 5731cb092af07..095a6edb5f0b7 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-09-26 +date: 2023-09-27 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 34a71628f265a..49bc099779a62 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-09-26 +date: 2023-09-27 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 0ed075823dc18..ad1e5d907f693 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-09-26 +date: 2023-09-27 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 22d14e0a6a2fa..e33c1dd221118 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/core-theme-browser'] --- import kbnCoreThemeBrowserObj from './kbn_core_theme_browser.devdocs.json'; diff --git a/api_docs/kbn_core_theme_browser_mocks.mdx b/api_docs/kbn_core_theme_browser_mocks.mdx index 7409f81e1e498..7b0ffda6e3633 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-09-26 +date: 2023-09-27 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 92afe9eb9d7e5..2bbb1fbc8a517 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-09-26 +date: 2023-09-27 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 f40b0a1777c3f..9c2c62dd80034 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-09-26 +date: 2023-09-27 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 f6b53dd7d2044..962b4001f57d0 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-09-26 +date: 2023-09-27 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 07eca64b58269..3b33e0af61ad8 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-09-26 +date: 2023-09-27 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 f11b058e08bad..9b4af9a0986e3 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-09-26 +date: 2023-09-27 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 49ac9e4aa3f1d..b09a457320651 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-09-26 +date: 2023-09-27 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 893693c710eb0..c2e28091ddb86 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-09-26 +date: 2023-09-27 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 5c834c7985fe6..1c5dbe324c8f5 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-09-26 +date: 2023-09-27 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 9ac271c76b048..b4ffb257425cb 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-09-26 +date: 2023-09-27 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 61cd48548beee..94e13c484e000 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-09-26 +date: 2023-09-27 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 1ffabd4d5826e..60b85eceb6b41 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-09-26 +date: 2023-09-27 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 12ddaf035fc2e..ff1f1c5188303 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-09-26 +date: 2023-09-27 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 2e04904075c70..5757ab3fcd7f3 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-09-26 +date: 2023-09-27 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 4355166d2051c..7fbc1a1c6bfbc 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-09-26 +date: 2023-09-27 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 1f3f864739cab..cdc77fe7c1f77 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/crypto-browser'] --- import kbnCryptoBrowserObj from './kbn_crypto_browser.devdocs.json'; diff --git a/api_docs/kbn_custom_integrations.mdx b/api_docs/kbn_custom_integrations.mdx index c81fd5690455e..426f9a238f8af 100644 --- a/api_docs/kbn_custom_integrations.mdx +++ b/api_docs/kbn_custom_integrations.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-custom-integrations title: "@kbn/custom-integrations" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/custom-integrations plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/custom-integrations'] --- import kbnCustomIntegrationsObj from './kbn_custom_integrations.devdocs.json'; diff --git a/api_docs/kbn_cypress_config.mdx b/api_docs/kbn_cypress_config.mdx index 4c4642432b108..7372b306e47bb 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/cypress-config'] --- import kbnCypressConfigObj from './kbn_cypress_config.devdocs.json'; diff --git a/api_docs/kbn_data_service.mdx b/api_docs/kbn_data_service.mdx index afa7dd603786e..2a5c4641ddf03 100644 --- a/api_docs/kbn_data_service.mdx +++ b/api_docs/kbn_data_service.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-data-service title: "@kbn/data-service" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/data-service plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/data-service'] --- import kbnDataServiceObj from './kbn_data_service.devdocs.json'; diff --git a/api_docs/kbn_datemath.mdx b/api_docs/kbn_datemath.mdx index 808aa13b21c1d..7082fdc9b0862 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/datemath'] --- import kbnDatemathObj from './kbn_datemath.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_analytics.mdx b/api_docs/kbn_deeplinks_analytics.mdx index 4c6e93acbd52f..fc85743970e1c 100644 --- a/api_docs/kbn_deeplinks_analytics.mdx +++ b/api_docs/kbn_deeplinks_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-analytics title: "@kbn/deeplinks-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-analytics plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-analytics'] --- import kbnDeeplinksAnalyticsObj from './kbn_deeplinks_analytics.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_devtools.mdx b/api_docs/kbn_deeplinks_devtools.mdx index 37e74fc743a49..7301f58ed382c 100644 --- a/api_docs/kbn_deeplinks_devtools.mdx +++ b/api_docs/kbn_deeplinks_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-devtools title: "@kbn/deeplinks-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-devtools plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-devtools'] --- import kbnDeeplinksDevtoolsObj from './kbn_deeplinks_devtools.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_management.mdx b/api_docs/kbn_deeplinks_management.mdx index 2f80038899710..5774c855128a3 100644 --- a/api_docs/kbn_deeplinks_management.mdx +++ b/api_docs/kbn_deeplinks_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-management title: "@kbn/deeplinks-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-management plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-management'] --- import kbnDeeplinksManagementObj from './kbn_deeplinks_management.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_ml.devdocs.json b/api_docs/kbn_deeplinks_ml.devdocs.json index d15d3e61bc630..8ba46143a88f3 100644 --- a/api_docs/kbn_deeplinks_ml.devdocs.json +++ b/api_docs/kbn_deeplinks_ml.devdocs.json @@ -70,4 +70,4 @@ ], "objects": [] } -} +} \ No newline at end of file diff --git a/api_docs/kbn_deeplinks_ml.mdx b/api_docs/kbn_deeplinks_ml.mdx index fa818712486d1..799b85e273841 100644 --- a/api_docs/kbn_deeplinks_ml.mdx +++ b/api_docs/kbn_deeplinks_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-ml title: "@kbn/deeplinks-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-ml plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-ml'] --- import kbnDeeplinksMlObj from './kbn_deeplinks_ml.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_observability.mdx b/api_docs/kbn_deeplinks_observability.mdx index e337c7d60eb51..5e0185faae6c8 100644 --- a/api_docs/kbn_deeplinks_observability.mdx +++ b/api_docs/kbn_deeplinks_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-observability title: "@kbn/deeplinks-observability" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-observability plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-observability'] --- import kbnDeeplinksObservabilityObj from './kbn_deeplinks_observability.devdocs.json'; diff --git a/api_docs/kbn_deeplinks_search.mdx b/api_docs/kbn_deeplinks_search.mdx index d741f660e745b..cf5eec20cc9d0 100644 --- a/api_docs/kbn_deeplinks_search.mdx +++ b/api_docs/kbn_deeplinks_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-deeplinks-search title: "@kbn/deeplinks-search" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/deeplinks-search plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/deeplinks-search'] --- import kbnDeeplinksSearchObj from './kbn_deeplinks_search.devdocs.json'; diff --git a/api_docs/kbn_default_nav_analytics.mdx b/api_docs/kbn_default_nav_analytics.mdx index 63387d4038d79..f07d943d41190 100644 --- a/api_docs/kbn_default_nav_analytics.mdx +++ b/api_docs/kbn_default_nav_analytics.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-analytics title: "@kbn/default-nav-analytics" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-analytics plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-analytics'] --- import kbnDefaultNavAnalyticsObj from './kbn_default_nav_analytics.devdocs.json'; diff --git a/api_docs/kbn_default_nav_devtools.mdx b/api_docs/kbn_default_nav_devtools.mdx index 550b249527f10..c67e9ca453b3e 100644 --- a/api_docs/kbn_default_nav_devtools.mdx +++ b/api_docs/kbn_default_nav_devtools.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-devtools title: "@kbn/default-nav-devtools" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-devtools plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-devtools'] --- import kbnDefaultNavDevtoolsObj from './kbn_default_nav_devtools.devdocs.json'; diff --git a/api_docs/kbn_default_nav_management.mdx b/api_docs/kbn_default_nav_management.mdx index 11472edda4b09..a91426fa70370 100644 --- a/api_docs/kbn_default_nav_management.mdx +++ b/api_docs/kbn_default_nav_management.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-management title: "@kbn/default-nav-management" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-management plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-management'] --- import kbnDefaultNavManagementObj from './kbn_default_nav_management.devdocs.json'; diff --git a/api_docs/kbn_default_nav_ml.devdocs.json b/api_docs/kbn_default_nav_ml.devdocs.json index 1c99e5a71cbbd..8124cde80d96f 100644 --- a/api_docs/kbn_default_nav_ml.devdocs.json +++ b/api_docs/kbn_default_nav_ml.devdocs.json @@ -172,7 +172,7 @@ "label": "children", "description": [], "signature": [ - "[{ title: string; id: \"root\"; children: [{ link: \"ml:overview\"; }, { link: \"ml:notifications\"; }]; }, { title: string; id: \"anomaly_detection\"; children: [{ title: string; link: \"ml:anomalyDetection\"; }, { link: \"ml:anomalyExplorer\"; }, { link: \"ml:singleMetricViewer\"; }, { link: \"ml:settings\"; }]; }, { id: \"data_frame_analytics\"; title: string; children: [{ title: string; link: \"ml:dataFrameAnalytics\"; }, { link: \"ml:resultExplorer\"; }, { link: \"ml:analyticsMap\"; }]; }, { id: \"model_management\"; title: string; children: [{ link: \"ml:nodesOverview\"; }, { link: \"ml:nodes\"; }]; }, { id: \"data_visualizer\"; title: string; children: [{ title: string; link: \"ml:fileUpload\"; }, { title: string; link: \"ml:indexDataVisualizer\"; }, { title: string; link: \"ml:dataComparison\"; }]; }, { id: \"aiops_labs\"; title: string; children: [{ link: \"ml:logRateAnalysis\"; }, { link: \"ml:logPatternAnalysis\"; }, { link: \"ml:changePointDetections\"; }]; }]" + "[{ title: string; id: \"root\"; children: [{ link: \"ml:overview\"; }, { link: \"ml:notifications\"; }]; }, { title: string; id: \"anomaly_detection\"; children: [{ title: string; link: \"ml:anomalyDetection\"; }, { link: \"ml:anomalyExplorer\"; }, { link: \"ml:singleMetricViewer\"; }, { link: \"ml:settings\"; }]; }, { id: \"data_frame_analytics\"; title: string; children: [{ title: string; link: \"ml:dataFrameAnalytics\"; }, { link: \"ml:resultExplorer\"; }, { link: \"ml:analyticsMap\"; }]; }, { id: \"model_management\"; title: string; children: [{ link: \"ml:nodesOverview\"; }, { link: \"ml:nodes\"; }]; }, { id: \"data_visualizer\"; title: string; children: [{ title: string; link: \"ml:fileUpload\"; }, { title: string; link: \"ml:indexDataVisualizer\"; }, { title: string; link: \"ml:dataDrift\"; }]; }, { id: \"aiops_labs\"; title: string; children: [{ link: \"ml:logRateAnalysis\"; }, { link: \"ml:logPatternAnalysis\"; }, { link: \"ml:changePointDetections\"; }]; }]" ], "path": "packages/default-nav/ml/default_navigation.ts", "deprecated": false, diff --git a/api_docs/kbn_default_nav_ml.mdx b/api_docs/kbn_default_nav_ml.mdx index 316dbc402e87e..6fa579a768910 100644 --- a/api_docs/kbn_default_nav_ml.mdx +++ b/api_docs/kbn_default_nav_ml.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-default-nav-ml title: "@kbn/default-nav-ml" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/default-nav-ml plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/default-nav-ml'] --- import kbnDefaultNavMlObj from './kbn_default_nav_ml.devdocs.json'; diff --git a/api_docs/kbn_dev_cli_errors.mdx b/api_docs/kbn_dev_cli_errors.mdx index f4cd437be43a8..26e6a05b71bc3 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-09-26 +date: 2023-09-27 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 18864e112a8e5..4563b143cc984 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-09-26 +date: 2023-09-27 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 266bd9d69b271..f5572fe15612d 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-09-26 +date: 2023-09-27 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 f8c2db7bc8c17..5641d1562c156 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/dev-utils'] --- import kbnDevUtilsObj from './kbn_dev_utils.devdocs.json'; diff --git a/api_docs/kbn_discover_utils.mdx b/api_docs/kbn_discover_utils.mdx index 8f3e1fcfd9aff..824c794f8aa70 100644 --- a/api_docs/kbn_discover_utils.mdx +++ b/api_docs/kbn_discover_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-discover-utils title: "@kbn/discover-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/discover-utils plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/discover-utils'] --- import kbnDiscoverUtilsObj from './kbn_discover_utils.devdocs.json'; diff --git a/api_docs/kbn_doc_links.mdx b/api_docs/kbn_doc_links.mdx index 329b929061274..384d01d5cbef8 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-09-26 +date: 2023-09-27 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 a3a33f34de78c..e17aa330e079e 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-09-26 +date: 2023-09-27 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 0873b2073c433..53a36a4b41977 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-09-26 +date: 2023-09-27 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 7663d904509cd..f7373e425b562 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-09-26 +date: 2023-09-27 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 08ec7b97c2eae..315bcc5959825 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-09-26 +date: 2023-09-27 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 1f2c875379748..62309375a0b44 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ecs-data-quality-dashboard'] --- import kbnEcsDataQualityDashboardObj from './kbn_ecs_data_quality_dashboard.devdocs.json'; diff --git a/api_docs/kbn_elastic_assistant.mdx b/api_docs/kbn_elastic_assistant.mdx index 5186c443dde7d..35ef19e267a85 100644 --- a/api_docs/kbn_elastic_assistant.mdx +++ b/api_docs/kbn_elastic_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-elastic-assistant title: "@kbn/elastic-assistant" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/elastic-assistant plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/elastic-assistant'] --- import kbnElasticAssistantObj from './kbn_elastic_assistant.devdocs.json'; diff --git a/api_docs/kbn_es.mdx b/api_docs/kbn_es.mdx index 03cf418521b1f..859a91626e767 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-09-26 +date: 2023-09-27 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 df9c1e659614e..0dcf8b73ff21d 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-09-26 +date: 2023-09-27 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 c99a216c06111..33f053b421a64 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/es-errors'] --- import kbnEsErrorsObj from './kbn_es_errors.devdocs.json'; diff --git a/api_docs/kbn_es_query.mdx b/api_docs/kbn_es_query.mdx index 6190afdd38eb5..8d11b2cb7c7fa 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-09-26 +date: 2023-09-27 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 5dce4a1a3a937..6a83b5a69bf67 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-09-26 +date: 2023-09-27 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 e8dd0c0e4700e..d929ffa5ce38c 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/eslint-plugin-imports'] --- import kbnEslintPluginImportsObj from './kbn_eslint_plugin_imports.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_common.mdx b/api_docs/kbn_event_annotation_common.mdx index 12445d95a71b1..48d3a939dc309 100644 --- a/api_docs/kbn_event_annotation_common.mdx +++ b/api_docs/kbn_event_annotation_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-common title: "@kbn/event-annotation-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-common plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-common'] --- import kbnEventAnnotationCommonObj from './kbn_event_annotation_common.devdocs.json'; diff --git a/api_docs/kbn_event_annotation_components.mdx b/api_docs/kbn_event_annotation_components.mdx index 69242c24cafca..a73e13aac9e7c 100644 --- a/api_docs/kbn_event_annotation_components.mdx +++ b/api_docs/kbn_event_annotation_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-event-annotation-components title: "@kbn/event-annotation-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/event-annotation-components plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/event-annotation-components'] --- import kbnEventAnnotationComponentsObj from './kbn_event_annotation_components.devdocs.json'; diff --git a/api_docs/kbn_expandable_flyout.mdx b/api_docs/kbn_expandable_flyout.mdx index 4533a7a3ef6e5..05dbf3774eba9 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-09-26 +date: 2023-09-27 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 90537ba6a0ff8..3f373d1ccbd6d 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-09-26 +date: 2023-09-27 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 602c4c33e88c5..3a3aa627686dd 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-09-26 +date: 2023-09-27 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 77bcf8ba462e6..e6b99ec4178ce 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-09-26 +date: 2023-09-27 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 60e59baa20675..d43128fc05055 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate'] --- import kbnGenerateObj from './kbn_generate.devdocs.json'; diff --git a/api_docs/kbn_generate_console_definitions.mdx b/api_docs/kbn_generate_console_definitions.mdx index fc3e4876cffc2..82994f46fd7ab 100644 --- a/api_docs/kbn_generate_console_definitions.mdx +++ b/api_docs/kbn_generate_console_definitions.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-generate-console-definitions title: "@kbn/generate-console-definitions" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/generate-console-definitions plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/generate-console-definitions'] --- import kbnGenerateConsoleDefinitionsObj from './kbn_generate_console_definitions.devdocs.json'; diff --git a/api_docs/kbn_generate_csv.mdx b/api_docs/kbn_generate_csv.mdx index 37db79322e58d..252fa6a0d2557 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-09-26 +date: 2023-09-27 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 b1132b6103bce..243dcdff9977d 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-09-26 +date: 2023-09-27 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 e55278db4e551..d91455f06bc14 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-09-26 +date: 2023-09-27 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 4c6e2effb0139..a8ba0be4125d7 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-09-26 +date: 2023-09-27 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 8401ace9d2657..7b20e948dcc04 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-09-26 +date: 2023-09-27 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 a085749f4b626..14db74c00e93e 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-09-26 +date: 2023-09-27 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 891f0c2d37a24..49e84102eea63 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-09-26 +date: 2023-09-27 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 f75c0ab8043bd..8957d6d55e193 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-09-26 +date: 2023-09-27 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 7a89bc6590ade..f2f3e0d2c5e84 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-09-26 +date: 2023-09-27 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 cca6dcbacf292..125217e69bcc1 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-09-26 +date: 2023-09-27 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 2aefadf71cbe7..23f1b09b8adc6 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/import-resolver'] --- import kbnImportResolverObj from './kbn_import_resolver.devdocs.json'; diff --git a/api_docs/kbn_infra_forge.mdx b/api_docs/kbn_infra_forge.mdx index a5880533eb557..2a1fed54f342c 100644 --- a/api_docs/kbn_infra_forge.mdx +++ b/api_docs/kbn_infra_forge.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-infra-forge title: "@kbn/infra-forge" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/infra-forge plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/infra-forge'] --- import kbnInfraForgeObj from './kbn_infra_forge.devdocs.json'; diff --git a/api_docs/kbn_interpreter.mdx b/api_docs/kbn_interpreter.mdx index 66a6a08c5fdb4..16f67a571b475 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-09-26 +date: 2023-09-27 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 0bb6c8b7a09ba..b3609a476b3aa 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-09-26 +date: 2023-09-27 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 36be9a0e48ca6..86de7b3ef0fad 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-09-26 +date: 2023-09-27 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 a63fc46f0313e..e11e02d06c7f3 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-09-26 +date: 2023-09-27 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 54e12b071a7e6..32b836d76b668 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-09-26 +date: 2023-09-27 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 75c46c9c8179c..7c4909f3683ff 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-09-26 +date: 2023-09-27 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 1487d68d7a125..3f1803d50dcd6 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/language-documentation-popover'] --- import kbnLanguageDocumentationPopoverObj from './kbn_language_documentation_popover.devdocs.json'; diff --git a/api_docs/kbn_lens_embeddable_utils.mdx b/api_docs/kbn_lens_embeddable_utils.mdx index 175b0011e3d19..da2f861a57d27 100644 --- a/api_docs/kbn_lens_embeddable_utils.mdx +++ b/api_docs/kbn_lens_embeddable_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-lens-embeddable-utils title: "@kbn/lens-embeddable-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/lens-embeddable-utils plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/lens-embeddable-utils'] --- import kbnLensEmbeddableUtilsObj from './kbn_lens_embeddable_utils.devdocs.json'; diff --git a/api_docs/kbn_logging.mdx b/api_docs/kbn_logging.mdx index b8558845daaaa..5601414cdbf3d 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-09-26 +date: 2023-09-27 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 d384c6aadec78..59c4b7b589d04 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-09-26 +date: 2023-09-27 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 f96b5a18b902d..fe6f47de8bc01 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/managed-vscode-config'] --- import kbnManagedVscodeConfigObj from './kbn_managed_vscode_config.devdocs.json'; diff --git a/api_docs/kbn_management_cards_navigation.mdx b/api_docs/kbn_management_cards_navigation.mdx index 9aa3f098d4c82..e9adeb65ea66f 100644 --- a/api_docs/kbn_management_cards_navigation.mdx +++ b/api_docs/kbn_management_cards_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-cards-navigation title: "@kbn/management-cards-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-cards-navigation plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-cards-navigation'] --- import kbnManagementCardsNavigationObj from './kbn_management_cards_navigation.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_input.mdx b/api_docs/kbn_management_settings_components_field_input.mdx index 0bb2d8ba4a0bd..36d7fa77ab318 100644 --- a/api_docs/kbn_management_settings_components_field_input.mdx +++ b/api_docs/kbn_management_settings_components_field_input.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-input title: "@kbn/management-settings-components-field-input" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-input plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-input'] --- import kbnManagementSettingsComponentsFieldInputObj from './kbn_management_settings_components_field_input.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_field_row.mdx b/api_docs/kbn_management_settings_components_field_row.mdx index b583ce8dcc6db..52efaac0bdf96 100644 --- a/api_docs/kbn_management_settings_components_field_row.mdx +++ b/api_docs/kbn_management_settings_components_field_row.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-components-field-row title: "@kbn/management-settings-components-field-row" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-components-field-row plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-field-row'] --- import kbnManagementSettingsComponentsFieldRowObj from './kbn_management_settings_components_field_row.devdocs.json'; diff --git a/api_docs/kbn_management_settings_components_form.devdocs.json b/api_docs/kbn_management_settings_components_form.devdocs.json new file mode 100644 index 0000000000000..a3dedb3eb86b6 --- /dev/null +++ b/api_docs/kbn_management_settings_components_form.devdocs.json @@ -0,0 +1,221 @@ +{ + "id": "@kbn/management-settings-components-form", + "client": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "server": { + "classes": [], + "functions": [], + "interfaces": [], + "enums": [], + "misc": [], + "objects": [] + }, + "common": { + "classes": [], + "functions": [ + { + "parentPluginId": "@kbn/management-settings-components-form", + "id": "def-common.Form", + "type": "Function", + "tags": [], + "label": "Form", + "description": [ + "\nComponent for displaying a set of {@link FieldRow} in a form." + ], + "signature": [ + "(props: ", + "FormProps", + ") => JSX.Element" + ], + "path": "packages/kbn-management/settings/components/form/form.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-components-form", + "id": "def-common.Form.$1", + "type": "Object", + "tags": [], + "label": "props", + "description": [ + "The {@link FormProps } for the {@link Form } component." + ], + "signature": [ + "FormProps" + ], + "path": "packages/kbn-management/settings/components/form/form.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-components-form", + "id": "def-common.FormKibanaProvider", + "type": "Function", + "tags": [], + "label": "FormKibanaProvider", + "description": [ + "\nKibana-specific Provider that maps Kibana plugins and services to a {@link FormProvider}." + ], + "signature": [ + "({ children, ...deps }: React.PropsWithChildren<", + { + "pluginId": "@kbn/management-settings-components-form", + "scope": "common", + "docId": "kibKbnManagementSettingsComponentsFormPluginApi", + "section": "def-common.FormKibanaDependencies", + "text": "FormKibanaDependencies" + }, + ">) => JSX.Element" + ], + "path": "packages/kbn-management/settings/components/form/services.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-components-form", + "id": "def-common.FormKibanaProvider.$1", + "type": "CompoundType", + "tags": [], + "label": "{ children, ...deps }", + "description": [], + "signature": [ + "React.PropsWithChildren<", + { + "pluginId": "@kbn/management-settings-components-form", + "scope": "common", + "docId": "kibKbnManagementSettingsComponentsFormPluginApi", + "section": "def-common.FormKibanaDependencies", + "text": "FormKibanaDependencies" + }, + ">" + ], + "path": "packages/kbn-management/settings/components/form/services.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-components-form", + "id": "def-common.FormProvider", + "type": "Function", + "tags": [], + "label": "FormProvider", + "description": [ + "\nReact Provider that provides services to a {@link Form} component and its dependents." + ], + "signature": [ + "({ children, ...services }: ", + "FormProviderProps", + ") => JSX.Element" + ], + "path": "packages/kbn-management/settings/components/form/services.tsx", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "@kbn/management-settings-components-form", + "id": "def-common.FormProvider.$1", + "type": "Object", + "tags": [], + "label": "{ children, ...services }", + "description": [], + "signature": [ + "FormProviderProps" + ], + "path": "packages/kbn-management/settings/components/form/services.tsx", + "deprecated": false, + "trackAdoption": false, + "isRequired": true + } + ], + "returnComment": [], + "initialIsOpen": false + } + ], + "interfaces": [], + "enums": [], + "misc": [ + { + "parentPluginId": "@kbn/management-settings-components-form", + "id": "def-common.FormKibanaDependencies", + "type": "Type", + "tags": [], + "label": "FormKibanaDependencies", + "description": [ + "\nAn interface containing a collection of Kibana plugins and services required to\nrender a {@link Form} component and its dependents." + ], + "signature": [ + "KibanaDependencies & ", + { + "pluginId": "@kbn/management-settings-components-field-row", + "scope": "common", + "docId": "kibKbnManagementSettingsComponentsFieldRowPluginApi", + "section": "def-common.KibanaDependencies", + "text": "KibanaDependencies" + }, + " & ", + { + "pluginId": "@kbn/management-settings-components-field-input", + "scope": "common", + "docId": "kibKbnManagementSettingsComponentsFieldInputPluginApi", + "section": "def-common.FieldInputKibanaDependencies", + "text": "FieldInputKibanaDependencies" + } + ], + "path": "packages/kbn-management/settings/components/form/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + }, + { + "parentPluginId": "@kbn/management-settings-components-form", + "id": "def-common.FormServices", + "type": "Type", + "tags": [], + "label": "FormServices", + "description": [ + "\nContextual services used by a {@link Form} component and its dependents." + ], + "signature": [ + { + "pluginId": "@kbn/management-settings-components-field-input", + "scope": "common", + "docId": "kibKbnManagementSettingsComponentsFieldInputPluginApi", + "section": "def-common.FieldInputServices", + "text": "FieldInputServices" + }, + " & ", + { + "pluginId": "@kbn/management-settings-components-field-row", + "scope": "common", + "docId": "kibKbnManagementSettingsComponentsFieldRowPluginApi", + "section": "def-common.Services", + "text": "Services" + }, + " & ", + "Services" + ], + "path": "packages/kbn-management/settings/components/form/types.ts", + "deprecated": false, + "trackAdoption": false, + "initialIsOpen": false + } + ], + "objects": [] + } +} \ No newline at end of file diff --git a/api_docs/kbn_management_settings_components_form.mdx b/api_docs/kbn_management_settings_components_form.mdx new file mode 100644 index 0000000000000..e6162d473c8df --- /dev/null +++ b/api_docs/kbn_management_settings_components_form.mdx @@ -0,0 +1,33 @@ +--- +#### +#### This document is auto-generated and is meant to be viewed inside our experimental, new docs system. +#### Reach out in #docs-engineering for more info. +#### +id: kibKbnManagementSettingsComponentsFormPluginApi +slug: /kibana-dev-docs/api/kbn-management-settings-components-form +title: "@kbn/management-settings-components-form" +image: https://source.unsplash.com/400x175/?github +description: API docs for the @kbn/management-settings-components-form plugin +date: 2023-09-27 +tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-components-form'] +--- +import kbnManagementSettingsComponentsFormObj from './kbn_management_settings_components_form.devdocs.json'; + + + +Contact [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) for questions regarding this plugin. + +**Code health stats** + +| Public API count | Any count | Items lacking comments | Missing exports | +|-------------------|-----------|------------------------|-----------------| +| 8 | 0 | 2 | 3 | + +## Common + +### Functions + + +### Consts, variables and types + + diff --git a/api_docs/kbn_management_settings_field_definition.devdocs.json b/api_docs/kbn_management_settings_field_definition.devdocs.json index d51791adc595a..e59cf26132890 100644 --- a/api_docs/kbn_management_settings_field_definition.devdocs.json +++ b/api_docs/kbn_management_settings_field_definition.devdocs.json @@ -106,15 +106,7 @@ "section": "def-common.UiSettingsType", "text": "UiSettingsType" }, - ", string | number | boolean | (string | number)[] | null | undefined>>, client: ", - { - "pluginId": "@kbn/core-ui-settings-browser", - "scope": "common", - "docId": "kibKbnCoreUiSettingsBrowserPluginApi", - "section": "def-common.IUiSettingsClient", - "text": "IUiSettingsClient" - }, - ") => ", + ", string | number | boolean | (string | number)[] | null | undefined>>, client: SettingsClient) => ", { "pluginId": "@kbn/management-settings-types", "scope": "common", @@ -179,13 +171,7 @@ "The client itself, used to determine if a setting is custom or overridden." ], "signature": [ - { - "pluginId": "@kbn/core-ui-settings-browser", - "scope": "common", - "docId": "kibKbnCoreUiSettingsBrowserPluginApi", - "section": "def-common.IUiSettingsClient", - "text": "IUiSettingsClient" - } + "SettingsClient" ], "path": "packages/kbn-management/settings/field_definition/get_definitions.ts", "deprecated": false, diff --git a/api_docs/kbn_management_settings_field_definition.mdx b/api_docs/kbn_management_settings_field_definition.mdx index bd67c35e89736..51a1a7e25788a 100644 --- a/api_docs/kbn_management_settings_field_definition.mdx +++ b/api_docs/kbn_management_settings_field_definition.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-field-definition title: "@kbn/management-settings-field-definition" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-field-definition plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-field-definition'] --- import kbnManagementSettingsFieldDefinitionObj from './kbn_management_settings_field_definition.devdocs.json'; diff --git a/api_docs/kbn_management_settings_ids.mdx b/api_docs/kbn_management_settings_ids.mdx index 76fec3f21812f..e9bbfbb080329 100644 --- a/api_docs/kbn_management_settings_ids.mdx +++ b/api_docs/kbn_management_settings_ids.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-ids title: "@kbn/management-settings-ids" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-ids plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-ids'] --- import kbnManagementSettingsIdsObj from './kbn_management_settings_ids.devdocs.json'; diff --git a/api_docs/kbn_management_settings_section_registry.mdx b/api_docs/kbn_management_settings_section_registry.mdx index 9b1d2a0ceed39..80da205287a5b 100644 --- a/api_docs/kbn_management_settings_section_registry.mdx +++ b/api_docs/kbn_management_settings_section_registry.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-section-registry title: "@kbn/management-settings-section-registry" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-section-registry plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-section-registry'] --- import kbnManagementSettingsSectionRegistryObj from './kbn_management_settings_section_registry.devdocs.json'; diff --git a/api_docs/kbn_management_settings_types.mdx b/api_docs/kbn_management_settings_types.mdx index 0056c1744c93d..bd8d4a29c4df3 100644 --- a/api_docs/kbn_management_settings_types.mdx +++ b/api_docs/kbn_management_settings_types.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-types title: "@kbn/management-settings-types" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-types plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-types'] --- import kbnManagementSettingsTypesObj from './kbn_management_settings_types.devdocs.json'; diff --git a/api_docs/kbn_management_settings_utilities.mdx b/api_docs/kbn_management_settings_utilities.mdx index ebe1ee0e883a9..74a24e7dad5c9 100644 --- a/api_docs/kbn_management_settings_utilities.mdx +++ b/api_docs/kbn_management_settings_utilities.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-settings-utilities title: "@kbn/management-settings-utilities" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-settings-utilities plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-settings-utilities'] --- import kbnManagementSettingsUtilitiesObj from './kbn_management_settings_utilities.devdocs.json'; diff --git a/api_docs/kbn_management_storybook_config.mdx b/api_docs/kbn_management_storybook_config.mdx index 46f63c66d97f4..61410de80c13e 100644 --- a/api_docs/kbn_management_storybook_config.mdx +++ b/api_docs/kbn_management_storybook_config.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-management-storybook-config title: "@kbn/management-storybook-config" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/management-storybook-config plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/management-storybook-config'] --- import kbnManagementStorybookConfigObj from './kbn_management_storybook_config.devdocs.json'; diff --git a/api_docs/kbn_mapbox_gl.mdx b/api_docs/kbn_mapbox_gl.mdx index d5e8f5242d84e..3007888a03abb 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/mapbox-gl'] --- import kbnMapboxGlObj from './kbn_mapbox_gl.devdocs.json'; diff --git a/api_docs/kbn_maps_vector_tile_utils.mdx b/api_docs/kbn_maps_vector_tile_utils.mdx index 8d8c184651886..2e0889fc10fe6 100644 --- a/api_docs/kbn_maps_vector_tile_utils.mdx +++ b/api_docs/kbn_maps_vector_tile_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-maps-vector-tile-utils title: "@kbn/maps-vector-tile-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/maps-vector-tile-utils plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/maps-vector-tile-utils'] --- import kbnMapsVectorTileUtilsObj from './kbn_maps_vector_tile_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_agg_utils.mdx b/api_docs/kbn_ml_agg_utils.mdx index bd774233e0d5b..e8b7ff4e2b1a8 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-agg-utils'] --- import kbnMlAggUtilsObj from './kbn_ml_agg_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_anomaly_utils.mdx b/api_docs/kbn_ml_anomaly_utils.mdx index 98b498f4e6caa..3287e6a0e3daf 100644 --- a/api_docs/kbn_ml_anomaly_utils.mdx +++ b/api_docs/kbn_ml_anomaly_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-anomaly-utils title: "@kbn/ml-anomaly-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-anomaly-utils plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-anomaly-utils'] --- import kbnMlAnomalyUtilsObj from './kbn_ml_anomaly_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_category_validator.mdx b/api_docs/kbn_ml_category_validator.mdx index f61c556d391c2..6500398277e66 100644 --- a/api_docs/kbn_ml_category_validator.mdx +++ b/api_docs/kbn_ml_category_validator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-category-validator title: "@kbn/ml-category-validator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-category-validator plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-category-validator'] --- import kbnMlCategoryValidatorObj from './kbn_ml_category_validator.devdocs.json'; diff --git a/api_docs/kbn_ml_data_frame_analytics_utils.mdx b/api_docs/kbn_ml_data_frame_analytics_utils.mdx index 1c460b72b9076..e529c52caf1a9 100644 --- a/api_docs/kbn_ml_data_frame_analytics_utils.mdx +++ b/api_docs/kbn_ml_data_frame_analytics_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-frame-analytics-utils title: "@kbn/ml-data-frame-analytics-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-frame-analytics-utils plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-frame-analytics-utils'] --- import kbnMlDataFrameAnalyticsUtilsObj from './kbn_ml_data_frame_analytics_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_data_grid.mdx b/api_docs/kbn_ml_data_grid.mdx index ce7198cc744ae..afbafb7b587ad 100644 --- a/api_docs/kbn_ml_data_grid.mdx +++ b/api_docs/kbn_ml_data_grid.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-data-grid title: "@kbn/ml-data-grid" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-data-grid plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-data-grid'] --- import kbnMlDataGridObj from './kbn_ml_data_grid.devdocs.json'; diff --git a/api_docs/kbn_ml_date_picker.mdx b/api_docs/kbn_ml_date_picker.mdx index 4b608ad59ead6..a67fa215506be 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-picker'] --- import kbnMlDatePickerObj from './kbn_ml_date_picker.devdocs.json'; diff --git a/api_docs/kbn_ml_date_utils.mdx b/api_docs/kbn_ml_date_utils.mdx index 023b1ed66e570..15b3d91b13d51 100644 --- a/api_docs/kbn_ml_date_utils.mdx +++ b/api_docs/kbn_ml_date_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-date-utils title: "@kbn/ml-date-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-date-utils plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-date-utils'] --- import kbnMlDateUtilsObj from './kbn_ml_date_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_error_utils.mdx b/api_docs/kbn_ml_error_utils.mdx index d893b4e63f288..90bbb7a1d27e3 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-error-utils'] --- import kbnMlErrorUtilsObj from './kbn_ml_error_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_in_memory_table.mdx b/api_docs/kbn_ml_in_memory_table.mdx index 07ff44c50e48d..1891292f4ed1e 100644 --- a/api_docs/kbn_ml_in_memory_table.mdx +++ b/api_docs/kbn_ml_in_memory_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-in-memory-table title: "@kbn/ml-in-memory-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-in-memory-table plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-in-memory-table'] --- import kbnMlInMemoryTableObj from './kbn_ml_in_memory_table.devdocs.json'; diff --git a/api_docs/kbn_ml_is_defined.mdx b/api_docs/kbn_ml_is_defined.mdx index 5f3d421739ee4..89ce3a96a258b 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-09-26 +date: 2023-09-27 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 7a1d61a31a821..a8eb4837cf39a 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-is-populated-object'] --- import kbnMlIsPopulatedObjectObj from './kbn_ml_is_populated_object.devdocs.json'; diff --git a/api_docs/kbn_ml_kibana_theme.mdx b/api_docs/kbn_ml_kibana_theme.mdx index e850a70fa8fbd..74e783b979411 100644 --- a/api_docs/kbn_ml_kibana_theme.mdx +++ b/api_docs/kbn_ml_kibana_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-kibana-theme title: "@kbn/ml-kibana-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-kibana-theme plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-kibana-theme'] --- import kbnMlKibanaThemeObj from './kbn_ml_kibana_theme.devdocs.json'; diff --git a/api_docs/kbn_ml_local_storage.mdx b/api_docs/kbn_ml_local_storage.mdx index 6ed106a6ff05e..0d5bc3917d252 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-09-26 +date: 2023-09-27 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 57378e46c6142..d7679099893e1 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-09-26 +date: 2023-09-27 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 ff04eac99a8a2..f372e630c4e5e 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-09-26 +date: 2023-09-27 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 dd27f6e0603e1..efb092b933acb 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-09-26 +date: 2023-09-27 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.devdocs.json b/api_docs/kbn_ml_random_sampler_utils.devdocs.json index 857500e0b30e7..e0073eca3670d 100644 --- a/api_docs/kbn_ml_random_sampler_utils.devdocs.json +++ b/api_docs/kbn_ml_random_sampler_utils.devdocs.json @@ -63,12 +63,13 @@ "docId": "kibKbnMlRandomSamplerUtilsPluginApi", "section": "def-common.RandomSamplerOption", "text": "RandomSamplerOption" - } + }, + " | undefined" ], "path": "x-pack/packages/ml/random_sampler_utils/src/random_sampler_manager.ts", "deprecated": false, "trackAdoption": false, - "isRequired": true + "isRequired": false }, { "parentPluginId": "@kbn/ml-random-sampler-utils", @@ -80,7 +81,7 @@ "- callback to be called when random sampler mode is set" ], "signature": [ - "(mode: ", + "((mode: ", { "pluginId": "@kbn/ml-random-sampler-utils", "scope": "common", @@ -88,12 +89,12 @@ "section": "def-common.RandomSamplerOption", "text": "RandomSamplerOption" }, - ") => void" + ") => void) | undefined" ], "path": "x-pack/packages/ml/random_sampler_utils/src/random_sampler_manager.ts", "deprecated": false, "trackAdoption": false, - "isRequired": true + "isRequired": false }, { "parentPluginId": "@kbn/ml-random-sampler-utils", @@ -111,7 +112,8 @@ "docId": "kibKbnMlRandomSamplerUtilsPluginApi", "section": "def-common.RandomSamplerProbability", "text": "RandomSamplerProbability" - } + }, + " | undefined" ], "path": "x-pack/packages/ml/random_sampler_utils/src/random_sampler_manager.ts", "deprecated": false, @@ -128,7 +130,7 @@ "- initial setter for random sampler probability" ], "signature": [ - "(prob: ", + "((prob: ", { "pluginId": "@kbn/ml-random-sampler-utils", "scope": "common", @@ -136,12 +138,12 @@ "section": "def-common.RandomSamplerProbability", "text": "RandomSamplerProbability" }, - ") => void" + ") => void) | undefined" ], "path": "x-pack/packages/ml/random_sampler_utils/src/random_sampler_manager.ts", "deprecated": false, "trackAdoption": false, - "isRequired": true + "isRequired": false } ], "returnComment": [] diff --git a/api_docs/kbn_ml_random_sampler_utils.mdx b/api_docs/kbn_ml_random_sampler_utils.mdx index beb2b1d7d1704..c9924cbc05cdf 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-09-26 +date: 2023-09-27 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 308331aafb6a9..e417dddd1500e 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-route-utils'] --- import kbnMlRouteUtilsObj from './kbn_ml_route_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_runtime_field_utils.mdx b/api_docs/kbn_ml_runtime_field_utils.mdx index 8d3d359d9ee8a..20bff84eeddea 100644 --- a/api_docs/kbn_ml_runtime_field_utils.mdx +++ b/api_docs/kbn_ml_runtime_field_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-ml-runtime-field-utils title: "@kbn/ml-runtime-field-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/ml-runtime-field-utils plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ml-runtime-field-utils'] --- import kbnMlRuntimeFieldUtilsObj from './kbn_ml_runtime_field_utils.devdocs.json'; diff --git a/api_docs/kbn_ml_string_hash.mdx b/api_docs/kbn_ml_string_hash.mdx index 987ef40c0498a..ad6a5e21e80dc 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-09-26 +date: 2023-09-27 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 826487526b1a4..25cafd41b82b0 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-09-26 +date: 2023-09-27 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 df893a97873fa..053d481c11e53 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-09-26 +date: 2023-09-27 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 fd7f4ab280191..2005f4fc00f43 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-09-26 +date: 2023-09-27 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 a1f05e9ce3468..c7714e82de827 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-09-26 +date: 2023-09-27 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 0fd0d346fb57b..5881d6c4fb628 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/observability-alert-details'] --- import kbnObservabilityAlertDetailsObj from './kbn_observability_alert_details.devdocs.json'; diff --git a/api_docs/kbn_openapi_generator.mdx b/api_docs/kbn_openapi_generator.mdx index f02eb69948148..219dcf71679ed 100644 --- a/api_docs/kbn_openapi_generator.mdx +++ b/api_docs/kbn_openapi_generator.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-openapi-generator title: "@kbn/openapi-generator" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/openapi-generator plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/openapi-generator'] --- import kbnOpenapiGeneratorObj from './kbn_openapi_generator.devdocs.json'; diff --git a/api_docs/kbn_optimizer.mdx b/api_docs/kbn_optimizer.mdx index 7e481ccde5b12..547c155ee1cef 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-09-26 +date: 2023-09-27 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 ba9ddba74cf0f..9ff131a7535bd 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-09-26 +date: 2023-09-27 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 1aa5700cf7f06..6f378f89bd741 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-09-26 +date: 2023-09-27 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 239fbcac319dc..f36ba0465f8f5 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-09-26 +date: 2023-09-27 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 595ee7d2e7bef..285b1089dbacd 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-09-26 +date: 2023-09-27 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 da6040e368280..04191a7624fc0 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/plugin-helpers'] --- import kbnPluginHelpersObj from './kbn_plugin_helpers.devdocs.json'; diff --git a/api_docs/kbn_profiling_utils.mdx b/api_docs/kbn_profiling_utils.mdx index 31ca69386bd82..417b481388307 100644 --- a/api_docs/kbn_profiling_utils.mdx +++ b/api_docs/kbn_profiling_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-profiling-utils title: "@kbn/profiling-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/profiling-utils plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/profiling-utils'] --- import kbnProfilingUtilsObj from './kbn_profiling_utils.devdocs.json'; diff --git a/api_docs/kbn_random_sampling.mdx b/api_docs/kbn_random_sampling.mdx index c7da703a0e30b..b27456b36309e 100644 --- a/api_docs/kbn_random_sampling.mdx +++ b/api_docs/kbn_random_sampling.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-random-sampling title: "@kbn/random-sampling" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/random-sampling plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/random-sampling'] --- import kbnRandomSamplingObj from './kbn_random_sampling.devdocs.json'; diff --git a/api_docs/kbn_react_field.mdx b/api_docs/kbn_react_field.mdx index 90931f67f40ca..16acacdcea488 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-field'] --- import kbnReactFieldObj from './kbn_react_field.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_common.mdx b/api_docs/kbn_react_kibana_context_common.mdx index 4098bb11f2af2..e26c8e12273f0 100644 --- a/api_docs/kbn_react_kibana_context_common.mdx +++ b/api_docs/kbn_react_kibana_context_common.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-common title: "@kbn/react-kibana-context-common" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-common plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-common'] --- import kbnReactKibanaContextCommonObj from './kbn_react_kibana_context_common.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_render.mdx b/api_docs/kbn_react_kibana_context_render.mdx index 12b1dd9e31b23..75ffb92c6eca5 100644 --- a/api_docs/kbn_react_kibana_context_render.mdx +++ b/api_docs/kbn_react_kibana_context_render.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-render title: "@kbn/react-kibana-context-render" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-render plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-render'] --- import kbnReactKibanaContextRenderObj from './kbn_react_kibana_context_render.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_root.mdx b/api_docs/kbn_react_kibana_context_root.mdx index ccb60475d5cac..f64b81f56443f 100644 --- a/api_docs/kbn_react_kibana_context_root.mdx +++ b/api_docs/kbn_react_kibana_context_root.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-root title: "@kbn/react-kibana-context-root" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-root plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-root'] --- import kbnReactKibanaContextRootObj from './kbn_react_kibana_context_root.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_styled.mdx b/api_docs/kbn_react_kibana_context_styled.mdx index 6ddfd7eb25515..3fd5e175a3a2b 100644 --- a/api_docs/kbn_react_kibana_context_styled.mdx +++ b/api_docs/kbn_react_kibana_context_styled.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-styled title: "@kbn/react-kibana-context-styled" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-styled plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-styled'] --- import kbnReactKibanaContextStyledObj from './kbn_react_kibana_context_styled.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_context_theme.mdx b/api_docs/kbn_react_kibana_context_theme.mdx index b446bab101000..a87c6120b8b6e 100644 --- a/api_docs/kbn_react_kibana_context_theme.mdx +++ b/api_docs/kbn_react_kibana_context_theme.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-context-theme title: "@kbn/react-kibana-context-theme" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-context-theme plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-context-theme'] --- import kbnReactKibanaContextThemeObj from './kbn_react_kibana_context_theme.devdocs.json'; diff --git a/api_docs/kbn_react_kibana_mount.mdx b/api_docs/kbn_react_kibana_mount.mdx index ec5ba4a464554..296dca6f00452 100644 --- a/api_docs/kbn_react_kibana_mount.mdx +++ b/api_docs/kbn_react_kibana_mount.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-react-kibana-mount title: "@kbn/react-kibana-mount" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/react-kibana-mount plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/react-kibana-mount'] --- import kbnReactKibanaMountObj from './kbn_react_kibana_mount.devdocs.json'; diff --git a/api_docs/kbn_repo_file_maps.mdx b/api_docs/kbn_repo_file_maps.mdx index e912a795d439b..afc47b50c0524 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-09-26 +date: 2023-09-27 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 9ce023a023749..6cf2ecf79c791 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-09-26 +date: 2023-09-27 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 234244470fb24..39a66eeadb825 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-09-26 +date: 2023-09-27 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 42e035a7cc161..035be841006a2 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-09-26 +date: 2023-09-27 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 fc7399a3ea66f..f16e80a6a006d 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-09-26 +date: 2023-09-27 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 973ac3b76a18b..b7a71a784b7bd 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rison'] --- import kbnRisonObj from './kbn_rison.devdocs.json'; diff --git a/api_docs/kbn_rrule.mdx b/api_docs/kbn_rrule.mdx index 36ea0c9911914..1d2daea227c93 100644 --- a/api_docs/kbn_rrule.mdx +++ b/api_docs/kbn_rrule.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-rrule title: "@kbn/rrule" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/rrule plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/rrule'] --- import kbnRruleObj from './kbn_rrule.devdocs.json'; diff --git a/api_docs/kbn_rule_data_utils.mdx b/api_docs/kbn_rule_data_utils.mdx index 6c3bade371c46..9457d7b39e621 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-09-26 +date: 2023-09-27 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 4579bddeb82c0..d331b779ebc78 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/saved-objects-settings'] --- import kbnSavedObjectsSettingsObj from './kbn_saved_objects_settings.devdocs.json'; diff --git a/api_docs/kbn_search_api_panels.mdx b/api_docs/kbn_search_api_panels.mdx index 9711d47b79032..86f2f7b04a67d 100644 --- a/api_docs/kbn_search_api_panels.mdx +++ b/api_docs/kbn_search_api_panels.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-api-panels title: "@kbn/search-api-panels" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-api-panels plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-api-panels'] --- import kbnSearchApiPanelsObj from './kbn_search_api_panels.devdocs.json'; diff --git a/api_docs/kbn_search_connectors.mdx b/api_docs/kbn_search_connectors.mdx index 3d6c3b3dd1629..df1c293d4ac71 100644 --- a/api_docs/kbn_search_connectors.mdx +++ b/api_docs/kbn_search_connectors.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-connectors title: "@kbn/search-connectors" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-connectors plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-connectors'] --- import kbnSearchConnectorsObj from './kbn_search_connectors.devdocs.json'; diff --git a/api_docs/kbn_search_response_warnings.mdx b/api_docs/kbn_search_response_warnings.mdx index 720bb8c947728..6738831cc0ddd 100644 --- a/api_docs/kbn_search_response_warnings.mdx +++ b/api_docs/kbn_search_response_warnings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-search-response-warnings title: "@kbn/search-response-warnings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/search-response-warnings plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/search-response-warnings'] --- import kbnSearchResponseWarningsObj from './kbn_search_response_warnings.devdocs.json'; diff --git a/api_docs/kbn_security_solution_features.mdx b/api_docs/kbn_security_solution_features.mdx index 3a7b9fb7b29bd..2be45374fbd1b 100644 --- a/api_docs/kbn_security_solution_features.mdx +++ b/api_docs/kbn_security_solution_features.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-features title: "@kbn/security-solution-features" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-features plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-features'] --- import kbnSecuritySolutionFeaturesObj from './kbn_security_solution_features.devdocs.json'; diff --git a/api_docs/kbn_security_solution_navigation.mdx b/api_docs/kbn_security_solution_navigation.mdx index 53d952c672703..dec912eed480f 100644 --- a/api_docs/kbn_security_solution_navigation.mdx +++ b/api_docs/kbn_security_solution_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-security-solution-navigation title: "@kbn/security-solution-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/security-solution-navigation plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/security-solution-navigation'] --- import kbnSecuritySolutionNavigationObj from './kbn_security_solution_navigation.devdocs.json'; diff --git a/api_docs/kbn_security_solution_side_nav.mdx b/api_docs/kbn_security_solution_side_nav.mdx index 90e955c0398cf..e6bae75fac7a2 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-09-26 +date: 2023-09-27 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 74bc95eff08d9..36161e9ab0224 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-09-26 +date: 2023-09-27 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 4c9fd276f9248..37a4b7de0228b 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-09-26 +date: 2023-09-27 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 5877e8165caf6..b896b9a51f10e 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-09-26 +date: 2023-09-27 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 056eb207c1d71..21d23f73aff57 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-ecs'] --- import kbnSecuritysolutionEcsObj from './kbn_securitysolution_ecs.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_es_utils.mdx b/api_docs/kbn_securitysolution_es_utils.mdx index 7901693345840..e7f8138610840 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-09-26 +date: 2023-09-27 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 3df432c6d4b1b..9df0aef9aae3b 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/securitysolution-exception-list-components'] --- import kbnSecuritysolutionExceptionListComponentsObj from './kbn_securitysolution_exception_list_components.devdocs.json'; diff --git a/api_docs/kbn_securitysolution_grouping.mdx b/api_docs/kbn_securitysolution_grouping.mdx index e8e5890f5a424..33f6edde074e5 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-09-26 +date: 2023-09-27 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 704206a5e81da..465ee9a5a8a25 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-09-26 +date: 2023-09-27 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 f4ae78b50f948..4ec29cc06ee0c 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-09-26 +date: 2023-09-27 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 e24913c491538..94abe89c8af85 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-09-26 +date: 2023-09-27 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 9b0af46ef301e..368e0101c0502 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-09-26 +date: 2023-09-27 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 36af13ef15e2e..a530d1f08faf7 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-09-26 +date: 2023-09-27 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 9bccdca6b75ed..a09fbb9f9535e 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-09-26 +date: 2023-09-27 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 a9d1d761bce2d..0b682e3ae24e2 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-09-26 +date: 2023-09-27 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 a2aeb16601dac..8ee5dd0ba9a7d 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-09-26 +date: 2023-09-27 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 307be0497b63d..b2dcabe57b8b0 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-09-26 +date: 2023-09-27 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 c29cdd6f9a2f5..17225817fd2c3 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-09-26 +date: 2023-09-27 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 1fb6dfa5772c7..aedf825af213c 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-09-26 +date: 2023-09-27 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 a81b9227eb674..67266fccb4a0e 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-09-26 +date: 2023-09-27 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 4736c892fecd6..756df4ed8a01f 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-09-26 +date: 2023-09-27 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 fbe170ca6eaab..587b6e8653344 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-09-26 +date: 2023-09-27 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_common_settings.mdx b/api_docs/kbn_serverless_common_settings.mdx index 4b15af859119c..1d04f6475bec5 100644 --- a/api_docs/kbn_serverless_common_settings.mdx +++ b/api_docs/kbn_serverless_common_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-common-settings title: "@kbn/serverless-common-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-common-settings plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-common-settings'] --- import kbnServerlessCommonSettingsObj from './kbn_serverless_common_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_observability_settings.mdx b/api_docs/kbn_serverless_observability_settings.mdx index de67dd9e9c3b8..0679a0d7ef956 100644 --- a/api_docs/kbn_serverless_observability_settings.mdx +++ b/api_docs/kbn_serverless_observability_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-observability-settings title: "@kbn/serverless-observability-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-observability-settings plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-observability-settings'] --- import kbnServerlessObservabilitySettingsObj from './kbn_serverless_observability_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_project_switcher.mdx b/api_docs/kbn_serverless_project_switcher.mdx index e8eb38e131743..d4b6052be73f9 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-project-switcher'] --- import kbnServerlessProjectSwitcherObj from './kbn_serverless_project_switcher.devdocs.json'; diff --git a/api_docs/kbn_serverless_search_settings.mdx b/api_docs/kbn_serverless_search_settings.mdx index 49ab83e831293..eeeb24440cddc 100644 --- a/api_docs/kbn_serverless_search_settings.mdx +++ b/api_docs/kbn_serverless_search_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-search-settings title: "@kbn/serverless-search-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-search-settings plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-search-settings'] --- import kbnServerlessSearchSettingsObj from './kbn_serverless_search_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_security_settings.mdx b/api_docs/kbn_serverless_security_settings.mdx index e0102e31918e9..74cd48bb9f1c8 100644 --- a/api_docs/kbn_serverless_security_settings.mdx +++ b/api_docs/kbn_serverless_security_settings.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-serverless-security-settings title: "@kbn/serverless-security-settings" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/serverless-security-settings plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/serverless-security-settings'] --- import kbnServerlessSecuritySettingsObj from './kbn_serverless_security_settings.devdocs.json'; diff --git a/api_docs/kbn_serverless_storybook_config.mdx b/api_docs/kbn_serverless_storybook_config.mdx index f589fe3a43148..59e8cdba5c0fb 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-09-26 +date: 2023-09-27 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 e69c952cb8c06..e0c8eec4af2c8 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-09-26 +date: 2023-09-27 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 e385bb4a450f7..99320011304da 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-09-26 +date: 2023-09-27 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 37949233d55c1..12c4d3068feec 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-09-26 +date: 2023-09-27 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 97d11af89f2ae..fbce9b8fae864 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-09-26 +date: 2023-09-27 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 80c0df35833f3..016fca3d9b34f 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-09-26 +date: 2023-09-27 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 5da0cc1bc0c60..7f436b3e1b0ce 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-09-26 +date: 2023-09-27 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 476f5f18dafd0..b42333e9a8394 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-09-26 +date: 2023-09-27 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 72aa8e0e21208..8eb9170b4a107 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-card-no-data-mocks'] --- import kbnSharedUxCardNoDataMocksObj from './kbn_shared_ux_card_no_data_mocks.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_chrome_navigation.mdx b/api_docs/kbn_shared_ux_chrome_navigation.mdx index 65ed3565e0465..ee119af49d920 100644 --- a/api_docs/kbn_shared_ux_chrome_navigation.mdx +++ b/api_docs/kbn_shared_ux_chrome_navigation.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-shared-ux-chrome-navigation title: "@kbn/shared-ux-chrome-navigation" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/shared-ux-chrome-navigation plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/shared-ux-chrome-navigation'] --- import kbnSharedUxChromeNavigationObj from './kbn_shared_ux_chrome_navigation.devdocs.json'; diff --git a/api_docs/kbn_shared_ux_file_context.mdx b/api_docs/kbn_shared_ux_file_context.mdx index 658a1dbe91557..385531c829f1a 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-09-26 +date: 2023-09-27 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 bcf101c671ca4..c4fb767bd84b2 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-09-26 +date: 2023-09-27 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 ed66d0331c888..06da3942b1772 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-09-26 +date: 2023-09-27 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 a74922902f315..cf233599761f9 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-09-26 +date: 2023-09-27 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 b03ccf59eef5d..9a62b1176d6ae 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-09-26 +date: 2023-09-27 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 2bcca3b05366e..614153b8bbe7c 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-09-26 +date: 2023-09-27 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 2c6a16374de12..2c9fad240a92f 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-09-26 +date: 2023-09-27 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 a5415ec9b6453..b6b1ceb6a166a 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-09-26 +date: 2023-09-27 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 843da95efe757..17e4eb4556b4c 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-09-26 +date: 2023-09-27 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 5cb1f502ef67b..2a1292c9b521f 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-09-26 +date: 2023-09-27 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 af7fa58f27fc5..485ce8950b3ca 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-09-26 +date: 2023-09-27 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 85cb82f82d02e..774bb039c7588 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-09-26 +date: 2023-09-27 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 83522bfac5e48..9fa3f52b99257 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-09-26 +date: 2023-09-27 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 54b092c36805d..2be08369a35e1 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-09-26 +date: 2023-09-27 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 926c9fc114f5d..bdb8928d0c5ba 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-09-26 +date: 2023-09-27 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 90730706d3392..f6f63c303c821 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-09-26 +date: 2023-09-27 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 7084c7474d7d8..a0eb735153a16 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-09-26 +date: 2023-09-27 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 0c1b2a9dc76e3..d65f98c2e3e78 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-09-26 +date: 2023-09-27 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 cbb042a03d20d..b558dd4d0dc0a 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-09-26 +date: 2023-09-27 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 c5036666f90a2..32f465acd6578 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-09-26 +date: 2023-09-27 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 5c1f54e51a457..24f6eaff630a5 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-09-26 +date: 2023-09-27 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 0dff4a89ab264..0be4859618c22 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-09-26 +date: 2023-09-27 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 e95c3324ca75b..0bac9cb042e0e 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-09-26 +date: 2023-09-27 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 6143dd8dd5a60..8a653a8cbd33e 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-09-26 +date: 2023-09-27 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 86b14b43344ee..04c8b99f0abad 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-09-26 +date: 2023-09-27 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 f54c6b45d677a..286d0c6b4b1e0 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-09-26 +date: 2023-09-27 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 58b331aef29e0..42ea3c53d71f1 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-09-26 +date: 2023-09-27 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 927af6b280e90..97ff70d8cdc96 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-09-26 +date: 2023-09-27 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 cff8f6bdce99e..e8e2e12ef753e 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-09-26 +date: 2023-09-27 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 673bf477f0aa3..1e03c2c77b2d6 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-09-26 +date: 2023-09-27 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 f015df67f02f2..22b4a0cf54d9d 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-09-26 +date: 2023-09-27 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 6696a39762379..cfb7e2d5ca1b4 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-09-26 +date: 2023-09-27 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 3e19ef1f56218..30943d85fac58 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-09-26 +date: 2023-09-27 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 d2be8a25605de..485368b747e3b 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-09-26 +date: 2023-09-27 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 8068a5438d3ad..84d799396462e 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-09-26 +date: 2023-09-27 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 b0c6496e11050..1e3e5152b75e1 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/storybook'] --- import kbnStorybookObj from './kbn_storybook.devdocs.json'; diff --git a/api_docs/kbn_subscription_tracking.mdx b/api_docs/kbn_subscription_tracking.mdx index 2ea59be675b21..4ff262df0845e 100644 --- a/api_docs/kbn_subscription_tracking.mdx +++ b/api_docs/kbn_subscription_tracking.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-subscription-tracking title: "@kbn/subscription-tracking" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/subscription-tracking plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/subscription-tracking'] --- import kbnSubscriptionTrackingObj from './kbn_subscription_tracking.devdocs.json'; diff --git a/api_docs/kbn_telemetry_tools.mdx b/api_docs/kbn_telemetry_tools.mdx index a5e88c3cc7c11..c4997d5cdea90 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-09-26 +date: 2023-09-27 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 0fe13e901c073..f99a93978c439 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-09-26 +date: 2023-09-27 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 8a8a3cd816bf8..98d00486ae836 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-09-26 +date: 2023-09-27 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 76b43765a11de..72d508123f3b3 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/test-subj-selector'] --- import kbnTestSubjSelectorObj from './kbn_test_subj_selector.devdocs.json'; diff --git a/api_docs/kbn_text_based_editor.mdx b/api_docs/kbn_text_based_editor.mdx index 7cf0c03435829..fa6d8ef818008 100644 --- a/api_docs/kbn_text_based_editor.mdx +++ b/api_docs/kbn_text_based_editor.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-text-based-editor title: "@kbn/text-based-editor" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/text-based-editor plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/text-based-editor'] --- import kbnTextBasedEditorObj from './kbn_text_based_editor.devdocs.json'; diff --git a/api_docs/kbn_tooling_log.mdx b/api_docs/kbn_tooling_log.mdx index 4988da7e7c52e..fe3bd91009795 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-09-26 +date: 2023-09-27 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 d4926ccf78095..d4f5fd6be2b84 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-09-26 +date: 2023-09-27 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 194d913445df0..9477aa1003fe1 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-09-26 +date: 2023-09-27 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 5a5605d090214..fe9f513f152ab 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-09-26 +date: 2023-09-27 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 1d0a8d3a08a83..17f7ff4fc1644 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-09-26 +date: 2023-09-27 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 d05ea8cb8136a..7688303dd24d2 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/ui-theme'] --- import kbnUiThemeObj from './kbn_ui_theme.devdocs.json'; diff --git a/api_docs/kbn_unified_data_table.devdocs.json b/api_docs/kbn_unified_data_table.devdocs.json index 66f136070b569..389bc17f1352a 100644 --- a/api_docs/kbn_unified_data_table.devdocs.json +++ b/api_docs/kbn_unified_data_table.devdocs.json @@ -276,7 +276,7 @@ "label": "UnifiedDataTable", "description": [], "signature": [ - "({ ariaLabelledBy, columns, controlColumnIds, dataView, loadingState, onFilter, onResize, onSetColumns, onSort, rows, sampleSize, searchDescription, searchTitle, settings, showTimeCol, showFullScreenButton, sort, useNewFieldsApi, isSortEnabled, isPaginationEnabled, cellActionsTriggerId, className, rowHeightState, onUpdateRowHeight, isPlainRecord, rowsPerPageState, onUpdateRowsPerPage, onFieldEdited, services, renderCustomGridBody, trailingControlColumns, totalHits, onFetchMoreRecords, renderDocumentView, setExpandedDoc, expandedDoc, configRowHeight, showMultiFields, maxDocFieldsDisplayed, externalControlColumns, externalAdditionalControls, rowsPerPageOptions, visibleCellActions, externalCustomRenderers, consumer, componentsTourSteps, }: ", + "({ ariaLabelledBy, columns, controlColumnIds, dataView, loadingState, onFilter, onResize, onSetColumns, onSort, rows, sampleSize, searchDescription, searchTitle, settings, showTimeCol, showFullScreenButton, sort, useNewFieldsApi, isSortEnabled, isPaginationEnabled, cellActionsTriggerId, className, rowHeightState, onUpdateRowHeight, isPlainRecord, rowsPerPageState, onUpdateRowsPerPage, onFieldEdited, services, renderCustomGridBody, trailingControlColumns, totalHits, onFetchMoreRecords, renderDocumentView, setExpandedDoc, expandedDoc, configRowHeight, showMultiFields, maxDocFieldsDisplayed, externalControlColumns, externalAdditionalControls, rowsPerPageOptions, visibleCellActions, externalCustomRenderers, consumer, componentsTourSteps, gridStyleOverride, }: ", { "pluginId": "@kbn/unified-data-table", "scope": "common", @@ -295,7 +295,7 @@ "id": "def-common.UnifiedDataTable.$1", "type": "Object", "tags": [], - "label": "{\n ariaLabelledBy,\n columns,\n controlColumnIds = CONTROL_COLUMN_IDS_DEFAULT,\n dataView,\n loadingState,\n onFilter,\n onResize,\n onSetColumns,\n onSort,\n rows,\n sampleSize,\n searchDescription,\n searchTitle,\n settings,\n showTimeCol,\n showFullScreenButton = true,\n sort,\n useNewFieldsApi,\n isSortEnabled = true,\n isPaginationEnabled = true,\n cellActionsTriggerId,\n className,\n rowHeightState,\n onUpdateRowHeight,\n isPlainRecord = false,\n rowsPerPageState,\n onUpdateRowsPerPage,\n onFieldEdited,\n services,\n renderCustomGridBody,\n trailingControlColumns,\n totalHits,\n onFetchMoreRecords,\n renderDocumentView,\n setExpandedDoc,\n expandedDoc,\n configRowHeight,\n showMultiFields = true,\n maxDocFieldsDisplayed = 50,\n externalControlColumns,\n externalAdditionalControls,\n rowsPerPageOptions,\n visibleCellActions,\n externalCustomRenderers,\n consumer = 'discover',\n componentsTourSteps,\n}", + "label": "{\n ariaLabelledBy,\n columns,\n controlColumnIds = CONTROL_COLUMN_IDS_DEFAULT,\n dataView,\n loadingState,\n onFilter,\n onResize,\n onSetColumns,\n onSort,\n rows,\n sampleSize,\n searchDescription,\n searchTitle,\n settings,\n showTimeCol,\n showFullScreenButton = true,\n sort,\n useNewFieldsApi,\n isSortEnabled = true,\n isPaginationEnabled = true,\n cellActionsTriggerId,\n className,\n rowHeightState,\n onUpdateRowHeight,\n isPlainRecord = false,\n rowsPerPageState,\n onUpdateRowsPerPage,\n onFieldEdited,\n services,\n renderCustomGridBody,\n trailingControlColumns,\n totalHits,\n onFetchMoreRecords,\n renderDocumentView,\n setExpandedDoc,\n expandedDoc,\n configRowHeight,\n showMultiFields = true,\n maxDocFieldsDisplayed = 50,\n externalControlColumns,\n externalAdditionalControls,\n rowsPerPageOptions,\n visibleCellActions,\n externalCustomRenderers,\n consumer = 'discover',\n componentsTourSteps,\n gridStyleOverride,\n}", "description": [], "signature": [ { @@ -1438,6 +1438,23 @@ "path": "packages/kbn-unified-data-table/src/components/data_table.tsx", "deprecated": false, "trackAdoption": false + }, + { + "parentPluginId": "@kbn/unified-data-table", + "id": "def-common.UnifiedDataTableProps.gridStyleOverride", + "type": "Object", + "tags": [], + "label": "gridStyleOverride", + "description": [ + "\nOptional gridStyle override." + ], + "signature": [ + "EuiDataGridStyle", + " | undefined" + ], + "path": "packages/kbn-unified-data-table/src/components/data_table.tsx", + "deprecated": false, + "trackAdoption": false } ], "initialIsOpen": false diff --git a/api_docs/kbn_unified_data_table.mdx b/api_docs/kbn_unified_data_table.mdx index e58baed74563f..964df8b7e4bd1 100644 --- a/api_docs/kbn_unified_data_table.mdx +++ b/api_docs/kbn_unified_data_table.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-data-table title: "@kbn/unified-data-table" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-data-table plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-data-table'] --- import kbnUnifiedDataTableObj from './kbn_unified_data_table.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 | |-------------------|-----------|------------------------|-----------------| -| 92 | 0 | 42 | 1 | +| 93 | 0 | 42 | 1 | ## Common diff --git a/api_docs/kbn_unified_doc_viewer.mdx b/api_docs/kbn_unified_doc_viewer.mdx index b9d36b0b3e3e9..5d9ea1b472bc4 100644 --- a/api_docs/kbn_unified_doc_viewer.mdx +++ b/api_docs/kbn_unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-doc-viewer title: "@kbn/unified-doc-viewer" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-doc-viewer plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-doc-viewer'] --- import kbnUnifiedDocViewerObj from './kbn_unified_doc_viewer.devdocs.json'; diff --git a/api_docs/kbn_unified_field_list.mdx b/api_docs/kbn_unified_field_list.mdx index c9b1ffbe83185..fe9b7b3dca9d5 100644 --- a/api_docs/kbn_unified_field_list.mdx +++ b/api_docs/kbn_unified_field_list.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-unified-field-list title: "@kbn/unified-field-list" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/unified-field-list plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/unified-field-list'] --- import kbnUnifiedFieldListObj from './kbn_unified_field_list.devdocs.json'; diff --git a/api_docs/kbn_url_state.mdx b/api_docs/kbn_url_state.mdx index 72d2e88165371..3cdae17bba528 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/url-state'] --- import kbnUrlStateObj from './kbn_url_state.devdocs.json'; diff --git a/api_docs/kbn_use_tracked_promise.mdx b/api_docs/kbn_use_tracked_promise.mdx index 46a24601095a9..695f1cd9c419b 100644 --- a/api_docs/kbn_use_tracked_promise.mdx +++ b/api_docs/kbn_use_tracked_promise.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-use-tracked-promise title: "@kbn/use-tracked-promise" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/use-tracked-promise plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/use-tracked-promise'] --- import kbnUseTrackedPromiseObj from './kbn_use_tracked_promise.devdocs.json'; diff --git a/api_docs/kbn_user_profile_components.mdx b/api_docs/kbn_user_profile_components.mdx index a37a7120f0012..108a9cea1cf74 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-09-26 +date: 2023-09-27 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 76c7071cea896..101cfc47c066f 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-09-26 +date: 2023-09-27 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 7554c601f4451..d8323dc1f5d55 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-09-26 +date: 2023-09-27 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 e5e5d58fc6ebc..81e02ed89ced1 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/utils'] --- import kbnUtilsObj from './kbn_utils.devdocs.json'; diff --git a/api_docs/kbn_visualization_ui_components.mdx b/api_docs/kbn_visualization_ui_components.mdx index bccdfdf3ee83d..005fc460fdc09 100644 --- a/api_docs/kbn_visualization_ui_components.mdx +++ b/api_docs/kbn_visualization_ui_components.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-visualization-ui-components title: "@kbn/visualization-ui-components" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/visualization-ui-components plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/visualization-ui-components'] --- import kbnVisualizationUiComponentsObj from './kbn_visualization_ui_components.devdocs.json'; diff --git a/api_docs/kbn_xstate_utils.mdx b/api_docs/kbn_xstate_utils.mdx index 6d5e19f2e26b1..d2da9c3b44a9c 100644 --- a/api_docs/kbn_xstate_utils.mdx +++ b/api_docs/kbn_xstate_utils.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/kbn-xstate-utils title: "@kbn/xstate-utils" image: https://source.unsplash.com/400x175/?github description: API docs for the @kbn/xstate-utils plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', '@kbn/xstate-utils'] --- import kbnXstateUtilsObj from './kbn_xstate_utils.devdocs.json'; diff --git a/api_docs/kbn_yarn_lock_validator.mdx b/api_docs/kbn_yarn_lock_validator.mdx index 29b6a1a2dcb96..32f540c0cf8c7 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-09-26 +date: 2023-09-27 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 ad97e1b790831..65680f2090af1 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'kibanaOverview'] --- import kibanaOverviewObj from './kibana_overview.devdocs.json'; diff --git a/api_docs/kibana_react.devdocs.json b/api_docs/kibana_react.devdocs.json index 9ab84b03192f2..bf5d418cd5014 100644 --- a/api_docs/kibana_react.devdocs.json +++ b/api_docs/kibana_react.devdocs.json @@ -1253,15 +1253,15 @@ }, { "plugin": "dataVisualizer", - "path": "x-pack/plugins/data_visualizer/public/application/data_comparison/data_comparison_app_state.tsx" + "path": "x-pack/plugins/data_visualizer/public/application/data_drift/data_drift_app_state.tsx" }, { "plugin": "dataVisualizer", - "path": "x-pack/plugins/data_visualizer/public/application/data_comparison/data_comparison_app_state.tsx" + "path": "x-pack/plugins/data_visualizer/public/application/data_drift/data_drift_app_state.tsx" }, { "plugin": "dataVisualizer", - "path": "x-pack/plugins/data_visualizer/public/application/data_comparison/data_comparison_app_state.tsx" + "path": "x-pack/plugins/data_visualizer/public/application/data_drift/data_drift_app_state.tsx" }, { "plugin": "aiops", @@ -1359,18 +1359,6 @@ "plugin": "fleet", "path": "x-pack/plugins/fleet/public/applications/fleet/app.tsx" }, - { - "plugin": "observability", - "path": "x-pack/plugins/observability/public/application/index.tsx" - }, - { - "plugin": "observability", - "path": "x-pack/plugins/observability/public/application/index.tsx" - }, - { - "plugin": "observability", - "path": "x-pack/plugins/observability/public/application/index.tsx" - }, { "plugin": "infra", "path": "x-pack/plugins/infra/public/apps/common_providers.tsx" @@ -3221,14 +3209,6 @@ "plugin": "dashboard", "path": "src/plugins/dashboard/public/dashboard_actions/open_replace_panel_flyout.tsx" }, - { - "plugin": "dashboard", - "path": "src/plugins/dashboard/public/dashboard_actions/copy_to_dashboard_action.tsx" - }, - { - "plugin": "dashboard", - "path": "src/plugins/dashboard/public/dashboard_actions/copy_to_dashboard_action.tsx" - }, { "plugin": "dashboard", "path": "src/plugins/dashboard/public/dashboard_listing/dashboard_listing_table.tsx" diff --git a/api_docs/kibana_react.mdx b/api_docs/kibana_react.mdx index 6eeeeb13e6137..ae753a890a1f4 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-09-26 +date: 2023-09-27 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 feb9e32872e7b..6527ea3309bb9 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-09-26 +date: 2023-09-27 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 eccfadbdaf9f2..b2c25bb409539 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-09-26 +date: 2023-09-27 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 b5f54ff609de0..3fa0988c2fb33 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-09-26 +date: 2023-09-27 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 636a2313f6a2a..70a18fffb91a3 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-09-26 +date: 2023-09-27 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 b9ff4a017eb87..688c84e40aa36 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-09-26 +date: 2023-09-27 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 4f63fe8ba1dec..ac9cc0338f35f 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'licensing'] --- import licensingObj from './licensing.devdocs.json'; diff --git a/api_docs/lists.mdx b/api_docs/lists.mdx index f8646a9bb9e07..b60626798977c 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'lists'] --- import listsObj from './lists.devdocs.json'; diff --git a/api_docs/log_explorer.mdx b/api_docs/log_explorer.mdx index a15d894df5f2e..af2135ccfcaf7 100644 --- a/api_docs/log_explorer.mdx +++ b/api_docs/log_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logExplorer title: "logExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the logExplorer plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logExplorer'] --- import logExplorerObj from './log_explorer.devdocs.json'; diff --git a/api_docs/logs_shared.mdx b/api_docs/logs_shared.mdx index 5ceb15dcff473..757e7215310eb 100644 --- a/api_docs/logs_shared.mdx +++ b/api_docs/logs_shared.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/logsShared title: "logsShared" image: https://source.unsplash.com/400x175/?github description: API docs for the logsShared plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'logsShared'] --- import logsSharedObj from './logs_shared.devdocs.json'; diff --git a/api_docs/management.mdx b/api_docs/management.mdx index f80ac97b8542c..f86ef3a3d878a 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-09-26 +date: 2023-09-27 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 ab28fa9dc9afb..5a50700863979 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-09-26 +date: 2023-09-27 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 c194c05150afa..89c1765d8c65f 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'mapsEms'] --- import mapsEmsObj from './maps_ems.devdocs.json'; diff --git a/api_docs/metrics_data_access.mdx b/api_docs/metrics_data_access.mdx index 8db11685ae7d4..a2f19223b80a8 100644 --- a/api_docs/metrics_data_access.mdx +++ b/api_docs/metrics_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/metricsDataAccess title: "metricsDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the metricsDataAccess plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'metricsDataAccess'] --- import metricsDataAccessObj from './metrics_data_access.devdocs.json'; diff --git a/api_docs/ml.devdocs.json b/api_docs/ml.devdocs.json index a4e074b85b960..53365227f427c 100644 --- a/api_docs/ml.devdocs.json +++ b/api_docs/ml.devdocs.json @@ -185,8 +185,6 @@ "signature": [ "(ml: { locator: ", "MlLocator", - " | undefined; elasticModels: ", - "ElasticModels", " | undefined; } | undefined, basePath: string | undefined, params: ", "MlLocatorParams", ", dependencies?: React.DependencyList | undefined) => string" @@ -205,8 +203,6 @@ "signature": [ "{ locator: ", "MlLocator", - " | undefined; elasticModels: ", - "ElasticModels", " | undefined; } | undefined" ], "path": "x-pack/plugins/ml/public/locator/use_ml_href.ts", @@ -1029,7 +1025,7 @@ "label": "ML_PAGES", "description": [], "signature": [ - "{ readonly ANOMALY_DETECTION_JOBS_MANAGE: \"jobs\"; readonly ANOMALY_EXPLORER: \"explorer\"; readonly SINGLE_METRIC_VIEWER: \"timeseriesexplorer\"; readonly DATA_FRAME_ANALYTICS_JOBS_MANAGE: \"data_frame_analytics\"; readonly DATA_FRAME_ANALYTICS_SOURCE_SELECTION: \"data_frame_analytics/source_selection\"; readonly DATA_FRAME_ANALYTICS_CREATE_JOB: \"data_frame_analytics/new_job\"; readonly TRAINED_MODELS_MANAGE: \"trained_models\"; readonly DATA_COMPARISON_INDEX_SELECT: \"data_comparison_index_select\"; readonly DATA_COMPARISON: \"data_comparison\"; readonly NODES: \"nodes\"; readonly MEMORY_USAGE: \"memory_usage\"; readonly DATA_FRAME_ANALYTICS_EXPLORATION: \"data_frame_analytics/exploration\"; readonly DATA_FRAME_ANALYTICS_MAP: \"data_frame_analytics/map\"; readonly DATA_VISUALIZER: \"datavisualizer\"; readonly DATA_VISUALIZER_INDEX_SELECT: \"datavisualizer_index_select\"; readonly DATA_VISUALIZER_FILE: \"filedatavisualizer\"; readonly DATA_VISUALIZER_INDEX_VIEWER: \"jobs/new_job/datavisualizer\"; readonly ANOMALY_DETECTION_CREATE_JOB: \"jobs/new_job\"; readonly ANOMALY_DETECTION_CREATE_JOB_RECOGNIZER: \"jobs/new_job/recognize\"; readonly ANOMALY_DETECTION_CREATE_JOB_SINGLE_METRIC: \"jobs/new_job/single_metric\"; readonly ANOMALY_DETECTION_CREATE_JOB_MULTI_METRIC: \"jobs/new_job/multi_metric\"; readonly ANOMALY_DETECTION_CREATE_JOB_CONVERT_TO_MULTI_METRIC: \"jobs/new_job/convert_to_multi_metric\"; readonly ANOMALY_DETECTION_CREATE_JOB_ADVANCED: \"jobs/new_job/advanced\"; readonly ANOMALY_DETECTION_CREATE_JOB_POPULATION: \"jobs/new_job/population\"; readonly ANOMALY_DETECTION_CREATE_JOB_CATEGORIZATION: \"jobs/new_job/categorization\"; readonly ANOMALY_DETECTION_CREATE_JOB_RARE: \"jobs/new_job/rare\"; readonly ANOMALY_DETECTION_CREATE_JOB_GEO: \"jobs/new_job/geo\"; readonly ANOMALY_DETECTION_CREATE_JOB_CONVERT_TO_ADVANCED: \"jobs/new_job/convert_to_advanced\"; readonly ANOMALY_DETECTION_CREATE_JOB_SELECT_TYPE: \"jobs/new_job/step/job_type\"; readonly ANOMALY_DETECTION_CREATE_JOB_SELECT_INDEX: \"jobs/new_job/step/index_or_search\"; readonly ANOMALY_DETECTION_CREATE_JOB_FROM_LENS: \"jobs/new_job/from_lens\"; readonly ANOMALY_DETECTION_CREATE_JOB_FROM_MAP: \"jobs/new_job/from_map\"; readonly ANOMALY_DETECTION_MODULES_VIEW_OR_CREATE: \"modules/check_view_or_create\"; readonly SETTINGS: \"settings\"; readonly CALENDARS_MANAGE: \"settings/calendars_list\"; readonly CALENDARS_NEW: \"settings/calendars_list/new_calendar\"; readonly CALENDARS_EDIT: \"settings/calendars_list/edit_calendar\"; readonly FILTER_LISTS_MANAGE: \"settings/filter_lists\"; readonly FILTER_LISTS_NEW: \"settings/filter_lists/new_filter_list\"; readonly FILTER_LISTS_EDIT: \"settings/filter_lists/edit_filter_list\"; readonly OVERVIEW: \"overview\"; readonly NOTIFICATIONS: \"notifications\"; readonly AIOPS: \"aiops\"; readonly AIOPS_EXPLAIN_LOG_RATE_SPIKES: \"aiops/explain_log_rate_spikes\"; readonly AIOPS_EXPLAIN_LOG_RATE_SPIKES_INDEX_SELECT: \"aiops/explain_log_rate_spikes_index_select\"; readonly AIOPS_LOG_RATE_ANALYSIS: \"aiops/log_rate_analysis\"; readonly AIOPS_LOG_RATE_ANALYSIS_INDEX_SELECT: \"aiops/log_rate_analysis_index_select\"; readonly AIOPS_LOG_CATEGORIZATION: \"aiops/log_categorization\"; readonly AIOPS_LOG_CATEGORIZATION_INDEX_SELECT: \"aiops/log_categorization_index_select\"; readonly AIOPS_CHANGE_POINT_DETECTION: \"aiops/change_point_detection\"; readonly AIOPS_CHANGE_POINT_DETECTION_INDEX_SELECT: \"aiops/change_point_detection_index_select\"; }" + "{ readonly ANOMALY_DETECTION_JOBS_MANAGE: \"jobs\"; readonly ANOMALY_EXPLORER: \"explorer\"; readonly SINGLE_METRIC_VIEWER: \"timeseriesexplorer\"; readonly DATA_FRAME_ANALYTICS_JOBS_MANAGE: \"data_frame_analytics\"; readonly DATA_FRAME_ANALYTICS_SOURCE_SELECTION: \"data_frame_analytics/source_selection\"; readonly DATA_FRAME_ANALYTICS_CREATE_JOB: \"data_frame_analytics/new_job\"; readonly TRAINED_MODELS_MANAGE: \"trained_models\"; readonly DATA_DRIFT_INDEX_SELECT: \"data_drift_index_select\"; readonly DATA_DRIFT_CUSTOM: \"data_drift_custom\"; readonly DATA_DRIFT: \"data_drift\"; readonly NODES: \"nodes\"; readonly MEMORY_USAGE: \"memory_usage\"; readonly DATA_FRAME_ANALYTICS_EXPLORATION: \"data_frame_analytics/exploration\"; readonly DATA_FRAME_ANALYTICS_MAP: \"data_frame_analytics/map\"; readonly DATA_VISUALIZER: \"datavisualizer\"; readonly DATA_VISUALIZER_INDEX_SELECT: \"datavisualizer_index_select\"; readonly DATA_VISUALIZER_FILE: \"filedatavisualizer\"; readonly DATA_VISUALIZER_INDEX_VIEWER: \"jobs/new_job/datavisualizer\"; readonly ANOMALY_DETECTION_CREATE_JOB: \"jobs/new_job\"; readonly ANOMALY_DETECTION_CREATE_JOB_RECOGNIZER: \"jobs/new_job/recognize\"; readonly ANOMALY_DETECTION_CREATE_JOB_SINGLE_METRIC: \"jobs/new_job/single_metric\"; readonly ANOMALY_DETECTION_CREATE_JOB_MULTI_METRIC: \"jobs/new_job/multi_metric\"; readonly ANOMALY_DETECTION_CREATE_JOB_CONVERT_TO_MULTI_METRIC: \"jobs/new_job/convert_to_multi_metric\"; readonly ANOMALY_DETECTION_CREATE_JOB_ADVANCED: \"jobs/new_job/advanced\"; readonly ANOMALY_DETECTION_CREATE_JOB_POPULATION: \"jobs/new_job/population\"; readonly ANOMALY_DETECTION_CREATE_JOB_CATEGORIZATION: \"jobs/new_job/categorization\"; readonly ANOMALY_DETECTION_CREATE_JOB_RARE: \"jobs/new_job/rare\"; readonly ANOMALY_DETECTION_CREATE_JOB_GEO: \"jobs/new_job/geo\"; readonly ANOMALY_DETECTION_CREATE_JOB_CONVERT_TO_ADVANCED: \"jobs/new_job/convert_to_advanced\"; readonly ANOMALY_DETECTION_CREATE_JOB_SELECT_TYPE: \"jobs/new_job/step/job_type\"; readonly ANOMALY_DETECTION_CREATE_JOB_SELECT_INDEX: \"jobs/new_job/step/index_or_search\"; readonly ANOMALY_DETECTION_CREATE_JOB_FROM_LENS: \"jobs/new_job/from_lens\"; readonly ANOMALY_DETECTION_CREATE_JOB_FROM_MAP: \"jobs/new_job/from_map\"; readonly ANOMALY_DETECTION_MODULES_VIEW_OR_CREATE: \"modules/check_view_or_create\"; readonly SETTINGS: \"settings\"; readonly CALENDARS_MANAGE: \"settings/calendars_list\"; readonly CALENDARS_NEW: \"settings/calendars_list/new_calendar\"; readonly CALENDARS_EDIT: \"settings/calendars_list/edit_calendar\"; readonly FILTER_LISTS_MANAGE: \"settings/filter_lists\"; readonly FILTER_LISTS_NEW: \"settings/filter_lists/new_filter_list\"; readonly FILTER_LISTS_EDIT: \"settings/filter_lists/edit_filter_list\"; readonly OVERVIEW: \"overview\"; readonly NOTIFICATIONS: \"notifications\"; readonly AIOPS: \"aiops\"; readonly AIOPS_EXPLAIN_LOG_RATE_SPIKES: \"aiops/explain_log_rate_spikes\"; readonly AIOPS_EXPLAIN_LOG_RATE_SPIKES_INDEX_SELECT: \"aiops/explain_log_rate_spikes_index_select\"; readonly AIOPS_LOG_RATE_ANALYSIS: \"aiops/log_rate_analysis\"; readonly AIOPS_LOG_RATE_ANALYSIS_INDEX_SELECT: \"aiops/log_rate_analysis_index_select\"; readonly AIOPS_LOG_CATEGORIZATION: \"aiops/log_categorization\"; readonly AIOPS_LOG_CATEGORIZATION_INDEX_SELECT: \"aiops/log_categorization_index_select\"; readonly AIOPS_CHANGE_POINT_DETECTION: \"aiops/change_point_detection\"; readonly AIOPS_CHANGE_POINT_DETECTION_INDEX_SELECT: \"aiops/change_point_detection_index_select\"; }" ], "path": "x-pack/plugins/ml/common/constants/locator.ts", "deprecated": false, diff --git a/api_docs/ml.mdx b/api_docs/ml.mdx index 9eb82115f70ea..26a245078de3f 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-09-26 +date: 2023-09-27 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 d467c48032470..819f9ca32c504 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-09-26 +date: 2023-09-27 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 f371df08341ca..3a6fa6bddc91d 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-09-26 +date: 2023-09-27 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 d4d7ca7074123..1b44a46e5975e 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-09-26 +date: 2023-09-27 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 5121b52917317..3ceab43574501 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'newsfeed'] --- import newsfeedObj from './newsfeed.devdocs.json'; diff --git a/api_docs/no_data_page.mdx b/api_docs/no_data_page.mdx index 01dad688b62e2..2a232ef347c54 100644 --- a/api_docs/no_data_page.mdx +++ b/api_docs/no_data_page.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/noDataPage title: "noDataPage" image: https://source.unsplash.com/400x175/?github description: API docs for the noDataPage plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'noDataPage'] --- import noDataPageObj from './no_data_page.devdocs.json'; diff --git a/api_docs/notifications.mdx b/api_docs/notifications.mdx index 5d6253604f38f..edd59f5b7cd02 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'notifications'] --- import notificationsObj from './notifications.devdocs.json'; diff --git a/api_docs/observability.mdx b/api_docs/observability.mdx index 67c8970bcd528..d39114b7d63bb 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observability'] --- import observabilityObj from './observability.devdocs.json'; diff --git a/api_docs/observability_a_i_assistant.mdx b/api_docs/observability_a_i_assistant.mdx index b8584211bc96d..f7af2bdf4e8cc 100644 --- a/api_docs/observability_a_i_assistant.mdx +++ b/api_docs/observability_a_i_assistant.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityAIAssistant title: "observabilityAIAssistant" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityAIAssistant plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityAIAssistant'] --- import observabilityAIAssistantObj from './observability_a_i_assistant.devdocs.json'; diff --git a/api_docs/observability_log_explorer.devdocs.json b/api_docs/observability_log_explorer.devdocs.json index d800417b5e917..d469ec56d4cd1 100644 --- a/api_docs/observability_log_explorer.devdocs.json +++ b/api_docs/observability_log_explorer.devdocs.json @@ -284,7 +284,80 @@ } ], "functions": [], - "interfaces": [], + "interfaces": [ + { + "parentPluginId": "observabilityLogExplorer", + "id": "def-common.ObservabilityLogExplorerLocators", + "type": "Interface", + "tags": [], + "label": "ObservabilityLogExplorerLocators", + "description": [], + "path": "x-pack/plugins/observability_log_explorer/common/locators/index.ts", + "deprecated": false, + "trackAdoption": false, + "children": [ + { + "parentPluginId": "observabilityLogExplorer", + "id": "def-common.ObservabilityLogExplorerLocators.allDatasetsLocator", + "type": "Object", + "tags": [], + "label": "allDatasetsLocator", + "description": [], + "signature": [ + { + "pluginId": "share", + "scope": "common", + "docId": "kibSharePluginApi", + "section": "def-common.LocatorPublic", + "text": "LocatorPublic" + }, + "<", + { + "pluginId": "@kbn/deeplinks-observability", + "scope": "common", + "docId": "kibKbnDeeplinksObservabilityPluginApi", + "section": "def-common.LogExplorerNavigationParams", + "text": "LogExplorerNavigationParams" + }, + ">" + ], + "path": "x-pack/plugins/observability_log_explorer/common/locators/index.ts", + "deprecated": false, + "trackAdoption": false + }, + { + "parentPluginId": "observabilityLogExplorer", + "id": "def-common.ObservabilityLogExplorerLocators.singleDatasetLocator", + "type": "Object", + "tags": [], + "label": "singleDatasetLocator", + "description": [], + "signature": [ + { + "pluginId": "share", + "scope": "common", + "docId": "kibSharePluginApi", + "section": "def-common.LocatorPublic", + "text": "LocatorPublic" + }, + "<", + { + "pluginId": "@kbn/deeplinks-observability", + "scope": "common", + "docId": "kibKbnDeeplinksObservabilityPluginApi", + "section": "def-common.SingleDatasetLocatorParams", + "text": "SingleDatasetLocatorParams" + }, + ">" + ], + "path": "x-pack/plugins/observability_log_explorer/common/locators/index.ts", + "deprecated": false, + "trackAdoption": false + } + ], + "initialIsOpen": false + } + ], "enums": [], "misc": [], "objects": [] diff --git a/api_docs/observability_log_explorer.mdx b/api_docs/observability_log_explorer.mdx index c5361488c7433..3c160b04f3a6b 100644 --- a/api_docs/observability_log_explorer.mdx +++ b/api_docs/observability_log_explorer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/observabilityLogExplorer title: "observabilityLogExplorer" image: https://source.unsplash.com/400x175/?github description: API docs for the observabilityLogExplorer plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'observabilityLogExplorer'] --- import observabilityLogExplorerObj from './observability_log_explorer.devdocs.json'; @@ -21,10 +21,13 @@ Contact [@elastic/infra-monitoring-ui](https://github.com/orgs/elastic/teams/inf | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 12 | 0 | 12 | 1 | +| 15 | 0 | 15 | 1 | ## Common ### Classes +### Interfaces + + diff --git a/api_docs/observability_onboarding.mdx b/api_docs/observability_onboarding.mdx index 065c3bc1b4521..744e090e99b99 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-09-26 +date: 2023-09-27 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 70af23bfc6961..5cbe15c8c43b6 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-09-26 +date: 2023-09-27 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 a6aeb1b261a39..5981f286ef712 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'osquery'] --- import osqueryObj from './osquery.devdocs.json'; diff --git a/api_docs/painless_lab.mdx b/api_docs/painless_lab.mdx index da7ed9bf51767..3508ef25f48b2 100644 --- a/api_docs/painless_lab.mdx +++ b/api_docs/painless_lab.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/painlessLab title: "painlessLab" image: https://source.unsplash.com/400x175/?github description: API docs for the painlessLab plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'painlessLab'] --- import painlessLabObj from './painless_lab.devdocs.json'; diff --git a/api_docs/plugin_directory.mdx b/api_docs/plugin_directory.mdx index 2854a4c0cc913..73f6b5f2567f0 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-09-26 +date: 2023-09-27 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 | |--------------|----------|------------------------| -| 692 | 584 | 42 | +| 693 | 585 | 42 | ### Public API health stats | API Count | Any Count | Missing comments | Missing exports | |--------------|----------|-----------------|--------| -| 74981 | 223 | 63957 | 1538 | +| 75009 | 223 | 63975 | 1546 | ## Plugin Directory @@ -30,7 +30,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 269 | 0 | 263 | 31 | | | [@elastic/appex-sharedux @elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 17 | 1 | 15 | 2 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | AIOps plugin maintained by ML team. | 66 | 1 | 4 | 1 | -| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 772 | 1 | 741 | 50 | +| | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 772 | 1 | 741 | 51 | | | [@elastic/apm-ui](https://github.com/orgs/elastic/teams/apm-ui) | The user interface for Elastic APM | 29 | 0 | 29 | 119 | | | [@elastic/apm-ui](https://github.com/orgs/elastic/teams/apm-ui) | - | 9 | 0 | 9 | 0 | | | [@elastic/infra-monitoring-ui](https://github.com/orgs/elastic/teams/infra-monitoring-ui) | Asset manager plugin for entity assets (inventory, topology, etc) | 2 | 0 | 2 | 0 | @@ -58,7 +58,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds the Dashboard app to Kibana | 101 | 0 | 98 | 9 | | | [@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. | 3310 | 33 | 2575 | 24 | -| | [@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) | This plugin provides the ability to create data views via a modal flyout inside Kibana apps | 35 | 0 | 25 | 5 | | | [@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. | 1037 | 0 | 257 | 2 | @@ -68,7 +68,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@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/security-solution](https://github.com/orgs/elastic/teams/security-solution) | Server APIs for the Elastic AI Assistant | 4 | 0 | 2 | 0 | -| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds embeddables service to Kibana | 534 | 1 | 434 | 7 | +| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | Adds embeddables service to Kibana | 535 | 1 | 435 | 7 | | | [@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. | 5 | 0 | 5 | 0 | @@ -139,12 +139,12 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 2 | 0 | 2 | 1 | | | [@elastic/actionable-observability](https://github.com/orgs/elastic/teams/actionable-observability) | - | 546 | 2 | 537 | 14 | | | [@elastic/obs-ai-assistant](https://github.com/orgs/elastic/teams/obs-ai-assistant) | - | 42 | 0 | 39 | 7 | -| | [@elastic/infra-monitoring-ui](https://github.com/orgs/elastic/teams/infra-monitoring-ui) | This plugin exposes and registers observability log consumption features. | 12 | 0 | 12 | 1 | +| | [@elastic/infra-monitoring-ui](https://github.com/orgs/elastic/teams/infra-monitoring-ui) | This plugin exposes and registers observability log consumption features. | 15 | 0 | 15 | 1 | | | [@elastic/apm-ui](https://github.com/orgs/elastic/teams/apm-ui) | - | 14 | 0 | 14 | 0 | | | [@elastic/observability-ui](https://github.com/orgs/elastic/teams/observability-ui) | - | 287 | 1 | 284 | 15 | | | [@elastic/security-defend-workflows](https://github.com/orgs/elastic/teams/security-defend-workflows) | - | 24 | 0 | 24 | 7 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 2 | 0 | 2 | 0 | -| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | The Presentation Utility Plugin is a set of common, shared components and toolkits for solutions within the Presentation space, (e.g. Dashboards, Canvas). | 218 | 2 | 164 | 11 | +| | [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kibana-presentation) | The Presentation Utility Plugin is a set of common, shared components and toolkits for solutions within the Presentation space, (e.g. Dashboards, Canvas). | 212 | 2 | 158 | 10 | | | [@elastic/profiling-ui](https://github.com/orgs/elastic/teams/profiling-ui) | - | 16 | 1 | 16 | 0 | | | [@elastic/profiling-ui](https://github.com/orgs/elastic/teams/profiling-ui) | - | 21 | 0 | 21 | 6 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 4 | 0 | 4 | 0 | @@ -218,7 +218,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | Package name           | Maintaining team | Description | API Cnt | Any Cnt | Missing
comments | Missing
exports | |--------------|----------------|-----------|--------------|----------|---------------|--------| | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 11 | 5 | 11 | 0 | -| | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 33 | 0 | 0 | 0 | +| | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 35 | 0 | 0 | 0 | | | [@elastic/ml-ui](https://github.com/orgs/elastic/teams/ml-ui) | - | 20 | 0 | 0 | 0 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 24 | 3 | 24 | 0 | | | [@elastic/response-ops](https://github.com/orgs/elastic/teams/response-ops) | - | 23 | 0 | 22 | 0 | @@ -479,6 +479,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 10 | 0 | 10 | 1 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 20 | 0 | 5 | 0 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 26 | 0 | 7 | 0 | +| | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 8 | 0 | 2 | 3 | | | [@elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/platform-deployment-management) | - | 45 | 0 | 0 | 0 | | | [@elastic/appex-sharedux @elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 127 | 0 | 127 | 0 | | | [@elastic/appex-sharedux @elastic/platform-deployment-management](https://github.com/orgs/elastic/teams/appex-sharedux ) | - | 20 | 0 | 11 | 0 | @@ -627,7 +628,7 @@ tags: ['contributor', 'dev', 'apidocs', 'kibana'] | | [@elastic/appex-sharedux](https://github.com/orgs/elastic/teams/appex-sharedux) | - | 49 | 0 | 35 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 52 | 0 | 43 | 0 | | | [@elastic/kibana-operations](https://github.com/orgs/elastic/teams/kibana-operations) | - | 7 | 0 | 6 | 0 | -| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Contains functionality for the unified data table which can be integrated into apps | 92 | 0 | 42 | 1 | +| | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Contains functionality for the unified data table which can be integrated into apps | 93 | 0 | 42 | 1 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | - | 10 | 0 | 7 | 6 | | | [@elastic/kibana-data-discovery](https://github.com/orgs/elastic/teams/kibana-data-discovery) | Contains functionality for the field list and field stats which can be integrated into apps | 303 | 0 | 276 | 9 | | | [@elastic/security-threat-hunting-investigations](https://github.com/orgs/elastic/teams/security-threat-hunting-investigations) | - | 4 | 0 | 0 | 0 | diff --git a/api_docs/presentation_util.devdocs.json b/api_docs/presentation_util.devdocs.json index 9582e337fbb17..4700637a57fa0 100644 --- a/api_docs/presentation_util.devdocs.json +++ b/api_docs/presentation_util.devdocs.json @@ -688,7 +688,7 @@ "signature": [ "React.ExoticComponent<", "DashboardPickerProps", - "> & { readonly _result: (props: ", + "> & { readonly _result: ({ isDisabled, onChange, idsToOmit }: ", "DashboardPickerProps", ") => JSX.Element; }" ], @@ -1490,119 +1490,6 @@ ], "initialIsOpen": false }, - { - "parentPluginId": "presentationUtil", - "id": "def-public.PresentationDashboardsService", - "type": "Interface", - "tags": [], - "label": "PresentationDashboardsService", - "description": [], - "path": "src/plugins/presentation_util/public/services/dashboards/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "presentationUtil", - "id": "def-public.PresentationDashboardsService.findDashboards", - "type": "Function", - "tags": [], - "label": "findDashboards", - "description": [], - "signature": [ - "(query: string, fields: string[]) => Promise<", - { - "pluginId": "@kbn/core-saved-objects-api-browser", - "scope": "common", - "docId": "kibKbnCoreSavedObjectsApiBrowserPluginApi", - "section": "def-common.SimpleSavedObject", - "text": "SimpleSavedObject" - }, - "<", - "PartialDashboardAttributes", - ">[]>" - ], - "path": "src/plugins/presentation_util/public/services/dashboards/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "presentationUtil", - "id": "def-public.PresentationDashboardsService.findDashboards.$1", - "type": "string", - "tags": [], - "label": "query", - "description": [], - "signature": [ - "string" - ], - "path": "src/plugins/presentation_util/public/services/dashboards/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - }, - { - "parentPluginId": "presentationUtil", - "id": "def-public.PresentationDashboardsService.findDashboards.$2", - "type": "Array", - "tags": [], - "label": "fields", - "description": [], - "signature": [ - "string[]" - ], - "path": "src/plugins/presentation_util/public/services/dashboards/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] - }, - { - "parentPluginId": "presentationUtil", - "id": "def-public.PresentationDashboardsService.findDashboardsByTitle", - "type": "Function", - "tags": [], - "label": "findDashboardsByTitle", - "description": [], - "signature": [ - "(title: string) => Promise<", - { - "pluginId": "@kbn/core-saved-objects-api-browser", - "scope": "common", - "docId": "kibKbnCoreSavedObjectsApiBrowserPluginApi", - "section": "def-common.SimpleSavedObject", - "text": "SimpleSavedObject" - }, - "<", - "PartialDashboardAttributes", - ">[]>" - ], - "path": "src/plugins/presentation_util/public/services/dashboards/types.ts", - "deprecated": false, - "trackAdoption": false, - "children": [ - { - "parentPluginId": "presentationUtil", - "id": "def-public.PresentationDashboardsService.findDashboardsByTitle.$1", - "type": "string", - "tags": [], - "label": "title", - "description": [], - "signature": [ - "string" - ], - "path": "src/plugins/presentation_util/public/services/dashboards/types.ts", - "deprecated": false, - "trackAdoption": false, - "isRequired": true - } - ], - "returnComment": [] - } - ], - "initialIsOpen": false - }, { "parentPluginId": "presentationUtil", "id": "def-public.PresentationLabsService", diff --git a/api_docs/presentation_util.mdx b/api_docs/presentation_util.mdx index d7b492ff54066..791f9b3b4f2a4 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'presentationUtil'] --- import presentationUtilObj from './presentation_util.devdocs.json'; @@ -21,7 +21,7 @@ Contact [@elastic/kibana-presentation](https://github.com/orgs/elastic/teams/kib | Public API count | Any count | Items lacking comments | Missing exports | |-------------------|-----------|------------------------|-----------------| -| 218 | 2 | 164 | 11 | +| 212 | 2 | 158 | 10 | ## Client diff --git a/api_docs/profiling.mdx b/api_docs/profiling.mdx index 9ef2e27dd7756..9410922b057cc 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profiling'] --- import profilingObj from './profiling.devdocs.json'; diff --git a/api_docs/profiling_data_access.mdx b/api_docs/profiling_data_access.mdx index 5a79e4f5054ea..7947dfe27f5f8 100644 --- a/api_docs/profiling_data_access.mdx +++ b/api_docs/profiling_data_access.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/profilingDataAccess title: "profilingDataAccess" image: https://source.unsplash.com/400x175/?github description: API docs for the profilingDataAccess plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'profilingDataAccess'] --- import profilingDataAccessObj from './profiling_data_access.devdocs.json'; diff --git a/api_docs/remote_clusters.mdx b/api_docs/remote_clusters.mdx index b1e3eeec11aab..fcc76a685f052 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-09-26 +date: 2023-09-27 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 32c6085ed7987..2b970580b02ab 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-09-26 +date: 2023-09-27 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 c951948e798df..8d6008e6384eb 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-09-26 +date: 2023-09-27 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 fb682878de661..5c125651e82b7 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-09-26 +date: 2023-09-27 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 aed7a39727ab0..b36b693fca08b 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-09-26 +date: 2023-09-27 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 98301ae5da2be..9f57802b6ae10 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-09-26 +date: 2023-09-27 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 52cc877c8727d..29c0562a76496 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'savedObjectsFinder'] --- import savedObjectsFinderObj from './saved_objects_finder.devdocs.json'; diff --git a/api_docs/saved_objects_management.mdx b/api_docs/saved_objects_management.mdx index 9c191aa176a6a..14c68fed21844 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-09-26 +date: 2023-09-27 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 7313cdcd0d8b7..2047ad21430fd 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-09-26 +date: 2023-09-27 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 115ba3370474b..23b14aad816fc 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-09-26 +date: 2023-09-27 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 45828377b6b31..60911c7f32c65 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-09-26 +date: 2023-09-27 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 ff6bd17c5503d..615dfe4d73c3a 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-09-26 +date: 2023-09-27 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 da03e80963f9e..b53a5a29a32ef 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-09-26 +date: 2023-09-27 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 32d50ac6e42d8..f17c24e21b966 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-09-26 +date: 2023-09-27 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 8b26f3c4e928d..ed04a04d8be82 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolution'] --- import securitySolutionObj from './security_solution.devdocs.json'; diff --git a/api_docs/security_solution_ess.mdx b/api_docs/security_solution_ess.mdx index 713e3bc175b32..a33f35f1acf57 100644 --- a/api_docs/security_solution_ess.mdx +++ b/api_docs/security_solution_ess.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionEss title: "securitySolutionEss" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionEss plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionEss'] --- import securitySolutionEssObj from './security_solution_ess.devdocs.json'; diff --git a/api_docs/security_solution_serverless.mdx b/api_docs/security_solution_serverless.mdx index e520082f856b0..76f719cd70989 100644 --- a/api_docs/security_solution_serverless.mdx +++ b/api_docs/security_solution_serverless.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/securitySolutionServerless title: "securitySolutionServerless" image: https://source.unsplash.com/400x175/?github description: API docs for the securitySolutionServerless plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'securitySolutionServerless'] --- import securitySolutionServerlessObj from './security_solution_serverless.devdocs.json'; diff --git a/api_docs/serverless.mdx b/api_docs/serverless.mdx index 078d0d12d34a5..a2f09274f67f6 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverless'] --- import serverlessObj from './serverless.devdocs.json'; diff --git a/api_docs/serverless_observability.mdx b/api_docs/serverless_observability.mdx index e13f8bdee1cee..ff25a06f6415a 100644 --- a/api_docs/serverless_observability.mdx +++ b/api_docs/serverless_observability.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessObservability title: "serverlessObservability" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessObservability plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessObservability'] --- import serverlessObservabilityObj from './serverless_observability.devdocs.json'; diff --git a/api_docs/serverless_search.mdx b/api_docs/serverless_search.mdx index 0137fbc3b99ed..fa845f8af50f8 100644 --- a/api_docs/serverless_search.mdx +++ b/api_docs/serverless_search.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/serverlessSearch title: "serverlessSearch" image: https://source.unsplash.com/400x175/?github description: API docs for the serverlessSearch plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'serverlessSearch'] --- import serverlessSearchObj from './serverless_search.devdocs.json'; diff --git a/api_docs/session_view.mdx b/api_docs/session_view.mdx index 990d781dcd778..440269f83ad9b 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-09-26 +date: 2023-09-27 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 3d246a4cf0c76..59300742f12fc 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-09-26 +date: 2023-09-27 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 d78a24c2ab160..77ecc0baa4b99 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-09-26 +date: 2023-09-27 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 9cfa673edc64c..27a90cbded66a 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-09-26 +date: 2023-09-27 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 906e62d9f0ac2..ac2f75dd7a96a 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-09-26 +date: 2023-09-27 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 4f2b54a1925a6..8f159ced0ce76 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-09-26 +date: 2023-09-27 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 5db4c79809e60..ef3037033a3ae 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-09-26 +date: 2023-09-27 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 d78fcb461a8f5..84f1bc29113c7 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetry'] --- import telemetryObj from './telemetry.devdocs.json'; diff --git a/api_docs/telemetry_collection_manager.mdx b/api_docs/telemetry_collection_manager.mdx index e34eddbdef694..b5c292a9be03b 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-09-26 +date: 2023-09-27 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 0be6e03857399..5b329e76140d8 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-09-26 +date: 2023-09-27 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 fe66b6a93fea0..52dc85ee981cd 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'telemetryManagementSection'] --- import telemetryManagementSectionObj from './telemetry_management_section.devdocs.json'; diff --git a/api_docs/text_based_languages.mdx b/api_docs/text_based_languages.mdx index 4225392065de1..563a67a77822e 100644 --- a/api_docs/text_based_languages.mdx +++ b/api_docs/text_based_languages.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/textBasedLanguages title: "textBasedLanguages" image: https://source.unsplash.com/400x175/?github description: API docs for the textBasedLanguages plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'textBasedLanguages'] --- import textBasedLanguagesObj from './text_based_languages.devdocs.json'; diff --git a/api_docs/threat_intelligence.mdx b/api_docs/threat_intelligence.mdx index 14b879c5117a3..24dd5e08c8343 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'threatIntelligence'] --- import threatIntelligenceObj from './threat_intelligence.devdocs.json'; diff --git a/api_docs/timelines.mdx b/api_docs/timelines.mdx index fbf37cdfd2c28..190a31ae3d43f 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-09-26 +date: 2023-09-27 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 474c42fe42811..700bc8d8b59bf 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'transform'] --- import transformObj from './transform.devdocs.json'; diff --git a/api_docs/triggers_actions_ui.mdx b/api_docs/triggers_actions_ui.mdx index 509e4f6ac6055..a5b984a43b611 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-09-26 +date: 2023-09-27 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 ab4dc0626aceb..cc11ce629e9bd 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-09-26 +date: 2023-09-27 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 d2ac48d5b2cf7..b532bc93621cc 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uiActionsEnhanced'] --- import uiActionsEnhancedObj from './ui_actions_enhanced.devdocs.json'; diff --git a/api_docs/unified_doc_viewer.mdx b/api_docs/unified_doc_viewer.mdx index 73ef1bfd0fad5..faf4b23b3d9fe 100644 --- a/api_docs/unified_doc_viewer.mdx +++ b/api_docs/unified_doc_viewer.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/unifiedDocViewer title: "unifiedDocViewer" image: https://source.unsplash.com/400x175/?github description: API docs for the unifiedDocViewer plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedDocViewer'] --- import unifiedDocViewerObj from './unified_doc_viewer.devdocs.json'; diff --git a/api_docs/unified_histogram.mdx b/api_docs/unified_histogram.mdx index b92bf316eee55..14319346a7eb5 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-09-26 +date: 2023-09-27 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 9f6b9c0cba07f..2b7f06029b40c 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-09-26 +date: 2023-09-27 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 f65133a07c62c..fb3330c1361a6 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'unifiedSearch.autocomplete'] --- import unifiedSearchAutocompleteObj from './unified_search_autocomplete.devdocs.json'; diff --git a/api_docs/uptime.mdx b/api_docs/uptime.mdx index 35caa52836dbe..9c5a16baca248 100644 --- a/api_docs/uptime.mdx +++ b/api_docs/uptime.mdx @@ -8,7 +8,7 @@ slug: /kibana-dev-docs/api/uptime title: "uptime" image: https://source.unsplash.com/400x175/?github description: API docs for the uptime plugin -date: 2023-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'uptime'] --- import uptimeObj from './uptime.devdocs.json'; diff --git a/api_docs/url_forwarding.mdx b/api_docs/url_forwarding.mdx index a6308c5cd7fa8..8b211dbf99cbb 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'urlForwarding'] --- import urlForwardingObj from './url_forwarding.devdocs.json'; diff --git a/api_docs/usage_collection.mdx b/api_docs/usage_collection.mdx index 46bd23e945816..4debc821f93bb 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-09-26 +date: 2023-09-27 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 1691005a61bfe..84583a6deca75 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-09-26 +date: 2023-09-27 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 e884419d9c22e..6a368ddec6b39 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-09-26 +date: 2023-09-27 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 5b692b69164cc..dd5f73b06abe0 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-09-26 +date: 2023-09-27 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 08e1dbc25d94d..701b599ae799d 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-09-26 +date: 2023-09-27 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 b246d688749dd..b366f8dbd26aa 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-09-26 +date: 2023-09-27 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 7870c03d8aacc..0844a32fd547a 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-09-26 +date: 2023-09-27 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 80dc7190498e2..029cfb8069ef5 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-09-26 +date: 2023-09-27 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 a697c1614530e..747207bf1322a 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-09-26 +date: 2023-09-27 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 68588ef9609e4..030fa0683409d 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-09-26 +date: 2023-09-27 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 b23f402737a4d..40e8a2004914d 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-09-26 +date: 2023-09-27 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 956c3d1bcf162..34a87031ad777 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visTypeXy'] --- import visTypeXyObj from './vis_type_xy.devdocs.json'; diff --git a/api_docs/visualizations.mdx b/api_docs/visualizations.mdx index 2d749827cb5c2..d13512e36d768 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-09-26 +date: 2023-09-27 tags: ['contributor', 'dev', 'apidocs', 'kibana', 'visualizations'] --- import visualizationsObj from './visualizations.devdocs.json'; From 26873aff87a62ed7c7f1681284a9e1be79d43079 Mon Sep 17 00:00:00 2001 From: Jan Monschke Date: Wed, 27 Sep 2023 08:25:45 +0200 Subject: [PATCH 22/26] [SecuritySolution] Fix TypeScript errors (#167147) Co-authored-by: Tomasz Ciecierski Co-authored-by: kibanamachine <42973632+kibanamachine@users.noreply.github.com> --- .../security-solution/upselling/service/index.ts | 1 + .../components/markdown_editor/plugins/index.ts | 16 +++++++--------- .../public/flyout/left/components/test_ids.ts | 1 + .../roles/complete_with_endpoint_roles.cy.ts | 4 ++-- .../roles/essentials_with_endpoint.roles.cy.ts | 10 ++++++---- .../public/management/cypress/tasks/login.ts | 1 - .../public/common/__mocks__/services.mock.ts | 2 ++ .../upselling/hooks/use_product_type_by_pli.ts | 4 ++-- .../pages/osquery_automated_response_actions.tsx | 9 ++++----- .../pages/threat_intelligence_paywall.tsx | 4 ++-- .../cypress/e2e/inspect/inspect_button.cy.ts | 8 +++++--- .../e2e/investigations/alerts/navigation.cy.ts | 2 +- .../investigations/timelines/row_renderers.cy.ts | 8 +++++--- .../cypress/tasks/login.ts | 5 +++-- .../test_suites/security/cypress/tasks/login.ts | 7 ++++--- 15 files changed, 45 insertions(+), 37 deletions(-) diff --git a/x-pack/packages/security-solution/upselling/service/index.ts b/x-pack/packages/security-solution/upselling/service/index.ts index 6a71fd9dde2ca..75ae1a0f109bf 100644 --- a/x-pack/packages/security-solution/upselling/service/index.ts +++ b/x-pack/packages/security-solution/upselling/service/index.ts @@ -6,6 +6,7 @@ */ export { UpsellingService } from './upselling_service'; export type { + MessageUpsellings, PageUpsellings, SectionUpsellings, UpsellingSectionId, diff --git a/x-pack/plugins/security_solution/public/common/components/markdown_editor/plugins/index.ts b/x-pack/plugins/security_solution/public/common/components/markdown_editor/plugins/index.ts index ed2c60ea2e961..9de05fcd47b8e 100644 --- a/x-pack/plugins/security_solution/public/common/components/markdown_editor/plugins/index.ts +++ b/x-pack/plugins/security_solution/public/common/components/markdown_editor/plugins/index.ts @@ -5,6 +5,8 @@ * 2.0. */ +// TODO: This import can be removed, once https://github.com/elastic/eui/pull/7221 made its way into Kibana main +import type { DefaultEuiMarkdownProcessingPlugins } from '@elastic/eui/src/components/markdown_editor/plugins/markdown_default_plugins/processing_plugins'; import { getDefaultEuiMarkdownParsingPlugins, getDefaultEuiMarkdownProcessingPlugins, @@ -14,15 +16,11 @@ import * as timelineMarkdownPlugin from './timeline'; import * as osqueryMarkdownPlugin from './osquery'; import * as insightMarkdownPlugin from './insight'; -export const { - uiPlugins: nonStatefulUiPlugins, - parsingPlugins, - processingPlugins, -} = { - uiPlugins: getDefaultEuiMarkdownUiPlugins(), - parsingPlugins: getDefaultEuiMarkdownParsingPlugins(), - processingPlugins: getDefaultEuiMarkdownProcessingPlugins(), -}; +export const nonStatefulUiPlugins = getDefaultEuiMarkdownUiPlugins(); +export const parsingPlugins = getDefaultEuiMarkdownParsingPlugins(); +// TODO: This explicit type can be removed, once https://github.com/elastic/eui/pull/7221 made its way into Kibana main +export const processingPlugins: DefaultEuiMarkdownProcessingPlugins = + getDefaultEuiMarkdownProcessingPlugins(); export const platinumOnlyPluginTokens = [insightMarkdownPlugin.insightPrefix]; diff --git a/x-pack/plugins/security_solution/public/flyout/left/components/test_ids.ts b/x-pack/plugins/security_solution/public/flyout/left/components/test_ids.ts index fc152e34d5074..5832ddda60c6d 100644 --- a/x-pack/plugins/security_solution/public/flyout/left/components/test_ids.ts +++ b/x-pack/plugins/security_solution/public/flyout/left/components/test_ids.ts @@ -11,6 +11,7 @@ import { PREFIX } from '../../shared/test_ids'; export const ANALYZER_GRAPH_TEST_ID = `${PREFIX}AnalyzerGraph` as const; export const SESSION_VIEW_TEST_ID = `${PREFIX}SessionView` as const; +export const SESSION_VIEW_ERROR_TEST_ID = `${PREFIX}SessionViewError` as const; /* Insights tab */ diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/serverless/roles/complete_with_endpoint_roles.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/serverless/roles/complete_with_endpoint_roles.cy.ts index 534b681c2aeb4..7d872de49062d 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/serverless/roles/complete_with_endpoint_roles.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/serverless/roles/complete_with_endpoint_roles.cy.ts @@ -63,7 +63,7 @@ describe( }); // roles `t1_analyst` and `t2_analyst` are very similar with exception of one page - (['t1_analyst', `t2_analyst`] as ROLE[]).forEach((roleName) => { + [ROLE.t1_analyst, ROLE.t2_analyst].forEach((roleName) => { describe(`for role: ${roleName}`, () => { const deniedPages = allPages.filter((page) => page.id !== 'endpointList'); @@ -350,7 +350,7 @@ describe( }); }); - (['platform_engineer', 'endpoint_policy_manager'] as ROLE[]).forEach((roleName) => { + [ROLE.platform_engineer, ROLE.endpoint_policy_manager].forEach((roleName) => { describe(`for role: ${roleName}`, () => { const artifactPagesFullAccess = [ pageById.trustedApps, diff --git a/x-pack/plugins/security_solution/public/management/cypress/e2e/serverless/roles/essentials_with_endpoint.roles.cy.ts b/x-pack/plugins/security_solution/public/management/cypress/e2e/serverless/roles/essentials_with_endpoint.roles.cy.ts index 6cf3ab727980a..dec6018bddc3c 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/e2e/serverless/roles/essentials_with_endpoint.roles.cy.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/e2e/serverless/roles/essentials_with_endpoint.roles.cy.ts @@ -55,7 +55,7 @@ describe( }); // roles `t1_analyst` and `t2_analyst` are the same as far as endpoint access - (['t1_analyst', `t2_analyst`] as ROLE[]).forEach((roleName) => { + [ROLE.t1_analyst, ROLE.t2_analyst].forEach((roleName) => { describe(`for role: ${roleName}`, () => { const deniedPages = allPages.filter((page) => page.id !== 'endpointList'); @@ -237,9 +237,11 @@ describe( }); // Endpoint Operations Manager, Endpoint Policy Manager and Platform Engineer currently have the same level of access - ( - ['platform_engineer', `endpoint_operations_analyst`, 'endpoint_policy_manager'] as ROLE[] - ).forEach((roleName) => { + [ + ROLE.platform_engineer, + ROLE.endpoint_operations_analyst, + ROLE.endpoint_policy_manager, + ].forEach((roleName) => { describe(`for role: ${roleName}`, () => { const artifactPagesFullAccess = [ pageById.trustedApps, diff --git a/x-pack/plugins/security_solution/public/management/cypress/tasks/login.ts b/x-pack/plugins/security_solution/public/management/cypress/tasks/login.ts index 8ac78b508d084..77987b5fd76ed 100644 --- a/x-pack/plugins/security_solution/public/management/cypress/tasks/login.ts +++ b/x-pack/plugins/security_solution/public/management/cypress/tasks/login.ts @@ -94,7 +94,6 @@ const sendApiLoginRequest = ( const basicProvider = loginState.body.selector.providers.find( (provider) => provider.type === 'basic' ); - return request({ url: loginUrl, method: 'POST', diff --git a/x-pack/plugins/security_solution_ess/public/common/__mocks__/services.mock.ts b/x-pack/plugins/security_solution_ess/public/common/__mocks__/services.mock.ts index 9e9909b45894b..d75069dfb2bc0 100644 --- a/x-pack/plugins/security_solution_ess/public/common/__mocks__/services.mock.ts +++ b/x-pack/plugins/security_solution_ess/public/common/__mocks__/services.mock.ts @@ -7,9 +7,11 @@ import { coreMock } from '@kbn/core/public/mocks'; import { securitySolutionMock } from '@kbn/security-solution-plugin/public/mocks'; +import { licensingMock } from '@kbn/licensing-plugin/public/mocks'; import type { Services } from '../services'; export const mockServices: Services = { ...coreMock.createStart(), securitySolution: securitySolutionMock.createStart(), + licensing: licensingMock.createStart(), }; diff --git a/x-pack/plugins/security_solution_serverless/public/upselling/hooks/use_product_type_by_pli.ts b/x-pack/plugins/security_solution_serverless/public/upselling/hooks/use_product_type_by_pli.ts index dc5d7debb2954..7704a7059cb24 100644 --- a/x-pack/plugins/security_solution_serverless/public/upselling/hooks/use_product_type_by_pli.ts +++ b/x-pack/plugins/security_solution_serverless/public/upselling/hooks/use_product_type_by_pli.ts @@ -5,10 +5,10 @@ * 2.0. */ -import type { AppFeatureKey } from '@kbn/security-solution-plugin/common'; +import type { AppFeatureKeyType } from '@kbn/security-solution-features'; import { PLI_APP_FEATURES } from '../../../common/pli/pli_config'; -export const getProductTypeByPLI = (requiredPLI: AppFeatureKey): string | null => { +export const getProductTypeByPLI = (requiredPLI: AppFeatureKeyType): string | null => { if (PLI_APP_FEATURES.security.essentials.includes(requiredPLI)) { return 'Security Essentials'; } diff --git a/x-pack/plugins/security_solution_serverless/public/upselling/pages/osquery_automated_response_actions.tsx b/x-pack/plugins/security_solution_serverless/public/upselling/pages/osquery_automated_response_actions.tsx index 2168390eb31a2..3097d41819058 100644 --- a/x-pack/plugins/security_solution_serverless/public/upselling/pages/osquery_automated_response_actions.tsx +++ b/x-pack/plugins/security_solution_serverless/public/upselling/pages/osquery_automated_response_actions.tsx @@ -8,11 +8,11 @@ import { EuiEmptyPrompt, EuiIcon } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import React from 'react'; -import type { AppFeatureKey } from '@kbn/security-solution-plugin/common'; +import type { AppFeatureKeyType } from '@kbn/security-solution-features'; import { getProductTypeByPLI } from '../hooks/use_product_type_by_pli'; -const OsqueryResponseActionsUpsellingSection: React.FC<{ requiredPLI: AppFeatureKey }> = React.memo( - ({ requiredPLI }) => { +const OsqueryResponseActionsUpsellingSection: React.FC<{ requiredPLI: AppFeatureKeyType }> = + React.memo(({ requiredPLI }) => { const productTypeRequired = getProductTypeByPLI(requiredPLI); return ( @@ -38,8 +38,7 @@ const OsqueryResponseActionsUpsellingSection: React.FC<{ requiredPLI: AppFeature } /> ); - } -); + }); OsqueryResponseActionsUpsellingSection.displayName = 'OsqueryResponseActionsUpsellingSection'; diff --git a/x-pack/plugins/security_solution_serverless/public/upselling/pages/threat_intelligence_paywall.tsx b/x-pack/plugins/security_solution_serverless/public/upselling/pages/threat_intelligence_paywall.tsx index 984b4ac74ca79..b2b3c11198d1f 100644 --- a/x-pack/plugins/security_solution_serverless/public/upselling/pages/threat_intelligence_paywall.tsx +++ b/x-pack/plugins/security_solution_serverless/public/upselling/pages/threat_intelligence_paywall.tsx @@ -8,11 +8,11 @@ import React from 'react'; import { EuiEmptyPrompt, EuiIcon } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; -import type { AppFeatureKey } from '@kbn/security-solution-plugin/common'; +import type { AppFeatureKeyType } from '@kbn/security-solution-features'; import { KibanaPageTemplate } from '@kbn/shared-ux-page-kibana-template'; import { getProductTypeByPLI } from '../hooks/use_product_type_by_pli'; -const ThreatIntelligencePaywall: React.FC<{ requiredPLI: AppFeatureKey }> = React.memo( +const ThreatIntelligencePaywall: React.FC<{ requiredPLI: AppFeatureKeyType }> = React.memo( function PaywallComponent({ requiredPLI }) { const productTypeRequired = getProductTypeByPLI(requiredPLI); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/inspect/inspect_button.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/inspect/inspect_button.cy.ts index dbd593f15e1ac..78ead35a49327 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/inspect/inspect_button.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/inspect/inspect_button.cy.ts @@ -47,9 +47,11 @@ describe('Inspect Explore pages', { tags: ['@ess', '@serverless', '@brokenInServ login(); visit(url, { - onLoad: () => { - waitForWelcomePanelToBeLoaded(); - selectDataView(DATA_VIEW); + visitOptions: { + onLoad: () => { + waitForWelcomePanelToBeLoaded(); + selectDataView(DATA_VIEW); + }, }, }); diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/navigation.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/navigation.cy.ts index f8107e92cc64b..d61ba89fa90b2 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/navigation.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/alerts/navigation.cy.ts @@ -9,7 +9,7 @@ import { expandFirstAlert, waitForAlerts } from '../../../tasks/alerts'; import { createRule } from '../../../tasks/api_calls/rules'; import { cleanKibana } from '../../../tasks/common'; import { login } from '../../../tasks/login'; -import { visit } from '../../../tasks/navigation'; +import { visit, visitWithTimeRange } from '../../../tasks/navigation'; import { getNewRule } from '../../../objects/rule'; diff --git a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/row_renderers.cy.ts b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/row_renderers.cy.ts index 8abcac5843cfa..60af66a577b23 100644 --- a/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/row_renderers.cy.ts +++ b/x-pack/test/security_solution_cypress/cypress/e2e/investigations/timelines/row_renderers.cy.ts @@ -34,9 +34,11 @@ describe('Row renderers', { tags: ['@ess', '@serverless'] }, () => { deleteTimelines(); login(); visitWithTimeRange(hostsUrl('allHosts'), { - onLoad: () => { - waitForWelcomePanelToBeLoaded(); - waitForAllHostsToBeLoaded(); + visitOptions: { + onLoad: () => { + waitForWelcomePanelToBeLoaded(); + waitForAllHostsToBeLoaded(); + }, }, }); openTimelineUsingToggle(); diff --git a/x-pack/test/security_solution_cypress/cypress/tasks/login.ts b/x-pack/test/security_solution_cypress/cypress/tasks/login.ts index 34312b3bd5876..e01b80e7c1f06 100644 --- a/x-pack/test/security_solution_cypress/cypress/tasks/login.ts +++ b/x-pack/test/security_solution_cypress/cypress/tasks/login.ts @@ -142,13 +142,14 @@ const loginWithUsernameAndPassword = (username: string, password: string) => { const basicProvider = loginState.body.selector.providers.find( (provider) => provider.type === 'basic' ); + return cy.request({ url: `${baseUrl}/internal/security/login`, method: 'POST', headers, body: { - providerType: basicProvider.type, - providerName: basicProvider.name, + providerType: basicProvider?.type, + providerName: basicProvider?.name, currentURL: '/', params: { username, password }, }, diff --git a/x-pack/test_serverless/functional/test_suites/security/cypress/tasks/login.ts b/x-pack/test_serverless/functional/test_suites/security/cypress/tasks/login.ts index de79a7a94f275..89ca14ec0c28f 100644 --- a/x-pack/test_serverless/functional/test_suites/security/cypress/tasks/login.ts +++ b/x-pack/test_serverless/functional/test_suites/security/cypress/tasks/login.ts @@ -8,6 +8,7 @@ import { request } from '@kbn/security-solution-plugin/public/management/cypress/tasks/common'; import { LoginState } from '@kbn/security-plugin/common/login_state'; import type { ServerlessRoleName } from '../../../../../shared/lib'; +import { ServerlessRoleName as RoleName } from '../../../../../shared/lib/security/types'; import { STANDARD_HTTP_HEADERS } from '../../../../../shared/lib/security/default_http_headers'; /** @@ -36,8 +37,8 @@ const sendApiLoginRequest = ( method: 'POST', headers, body: { - providerType: basicProvider.type, - providerName: basicProvider.name, + providerType: basicProvider?.type, + providerName: basicProvider?.name, currentURL: '/', params: { username, password }, }, @@ -64,7 +65,7 @@ interface CyLoginTask { * @param user Defaults to `soc_manager` */ export const login: CyLoginTask = ( - user: ServerlessRoleName | 'elastic' = 'soc_manager' + user: ServerlessRoleName | 'elastic' = RoleName.SOC_MANAGER ): ReturnType => { let username = Cypress.env('KIBANA_USERNAME'); let password = Cypress.env('KIBANA_PASSWORD'); From 7a87c3615d5ba98f7af371ca89117dc9085a6fd5 Mon Sep 17 00:00:00 2001 From: Brad White Date: Wed, 27 Sep 2023 01:19:11 -0600 Subject: [PATCH 23/26] Fix some type issues for APM UI (#167347) ## Summary We're breaking https://github.com/elastic/kibana/pull/166813 up into smaller PRs in the interest of getting PRs through sooner for type fixes. These are the changes for APM UI. --- .../assistant_functions/get_apm_service_summary/index.ts | 1 + .../components/app/custom_logs/install_elastic_agent.tsx | 4 ++-- x-pack/plugins/observability_onboarding/public/index.ts | 2 +- .../public/locators/onboarding_locator/locator_definition.ts | 2 ++ .../public/locators/onboarding_locator/types.ts | 1 + 5 files changed, 7 insertions(+), 3 deletions(-) diff --git a/x-pack/plugins/apm/server/routes/assistant_functions/get_apm_service_summary/index.ts b/x-pack/plugins/apm/server/routes/assistant_functions/get_apm_service_summary/index.ts index 92eafdf0b4ee7..64035f0373cfb 100644 --- a/x-pack/plugins/apm/server/routes/assistant_functions/get_apm_service_summary/index.ts +++ b/x-pack/plugins/apm/server/routes/assistant_functions/get_apm_service_summary/index.ts @@ -275,6 +275,7 @@ export async function getApmServiceSummary({ start, end, serviceName, + environment, }), getAnomalies({ serviceName, diff --git a/x-pack/plugins/observability_onboarding/public/components/app/custom_logs/install_elastic_agent.tsx b/x-pack/plugins/observability_onboarding/public/components/app/custom_logs/install_elastic_agent.tsx index aea68cdd6711c..5b6db7f900b79 100644 --- a/x-pack/plugins/observability_onboarding/public/components/app/custom_logs/install_elastic_agent.tsx +++ b/x-pack/plugins/observability_onboarding/public/components/app/custom_logs/install_elastic_agent.tsx @@ -63,7 +63,7 @@ export function InstallElasticAgent() { useState('linux-tar'); const enforcedDatasetName = - integration === dataset ? dataset : `${integration}.${dataset}`; + (integration === dataset ? dataset : `${integration}.${dataset}`) || ''; async function onContinue() { await singleDatasetLocator!.navigate({ @@ -113,7 +113,7 @@ export function InstallElasticAgent() { return callApi('POST /internal/observability_onboarding/logs/flow', { params: { body: { - name: datasetName, + name: datasetName || '', type: 'logFiles', state: { datasetName, diff --git a/x-pack/plugins/observability_onboarding/public/index.ts b/x-pack/plugins/observability_onboarding/public/index.ts index b83c5b6d5cad0..2b8271bb5c8ed 100644 --- a/x-pack/plugins/observability_onboarding/public/index.ts +++ b/x-pack/plugins/observability_onboarding/public/index.ts @@ -17,7 +17,7 @@ import { ObservabilityOnboardingPluginStart, } from './plugin'; -export { OBSERVABILITY_ONBOARDING_LOCATOR } from './locators/onboarding_locator/locator_definition'; +export type { OBSERVABILITY_ONBOARDING_LOCATOR } from './locators/onboarding_locator/locator_definition'; export type { ObservabilityOnboardingLocatorParams } from './locators/onboarding_locator/types'; export interface ConfigSchema { diff --git a/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/locator_definition.ts b/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/locator_definition.ts index a4f8965dda5a3..58b506ca4fa04 100644 --- a/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/locator_definition.ts +++ b/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/locator_definition.ts @@ -11,6 +11,8 @@ import { OBSERVABILITY_ONBOARDING_LOCATOR, } from '@kbn/deeplinks-observability/locators'; +export type { OBSERVABILITY_ONBOARDING_LOCATOR } from '@kbn/deeplinks-observability/locators'; + export class ObservabilityOnboardingLocatorDefinition implements LocatorDefinition { diff --git a/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/types.ts b/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/types.ts index 61f6d923db49d..5dfe136624d95 100644 --- a/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/types.ts +++ b/x-pack/plugins/observability_onboarding/public/locators/onboarding_locator/types.ts @@ -8,5 +8,6 @@ import type { LocatorPublic } from '@kbn/share-plugin/public'; import type { ObservabilityOnboardingLocatorParams } from '@kbn/deeplinks-observability/locators'; +export type { ObservabilityOnboardingLocatorParams } from '@kbn/deeplinks-observability/locators'; export type ObservabilityOnboardingLocator = LocatorPublic; From 784411d45d323c4cf938ed28f7269beb486756ba Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Wed, 27 Sep 2023 10:56:45 +0300 Subject: [PATCH 24/26] [Lens] Inline editing of lens panels on a dashboard or canvas (#166169) ## Summary Closes https://github.com/elastic/kibana/issues/166833 Closes https://github.com/elastic/kibana/issues/167063 This PR allows the inline editing of Lens panels in canvas and dashboards. ![inline_editing](https://github.com/elastic/kibana/assets/17003240/8abb636b-7b5a-4d35-9f91-a1bf2ff963f2) ### Changes #### Discover - The basic UI change in Discover flyout is that we add the Cancel button in the flyout footer (resets to the state before the flyout changes). - It also solves (with passing the embeddableOutput observable to the flyout) the bug that is more prominent in this PR ([first bullet](https://github.com/elastic/kibana/pull/162389#discussion_r1322645626)) #### Dashboard - All Lens panels have an Edit visualization panel action - The Edit Lens action is now hidden - A flyout opens (in the header there is a link where the users can go to the editor) - The by reference panels change to by value as long as the users are editing. On apply and close, we save to the SO - All tests have changed to accomodate this navigation change. All the existing ones test the editor (as they used to do). I have added new tests for testing the inline experience #### Known issues - If a user is currently editing a by reference visualization, doesn't click Cancel or Apply and navigate away, the panel stays as by value panel. The users can always go back and reset the changes and we could not find an easy fix with Devon. We consider it as a nice to have and a non-blocking behavior. #### Missing These 2 features are missing to give the full set of capabilities of the editor to the flyout. Both are missing from ESQL editing too and are going to be added on a follow up PR - Chart switcher - Suggestions (as icons and not previews) #### Flaky tests runner https://buildkite.com/elastic/kibana-flaky-test-suite-runner/builds/3182 (100 times) #### Panel focus This PR will look even better when this is merged! https://github.com/elastic/kibana/pull/165417 ### Checklist - [x] Any text added follows [EUI's writing guidelines](https://elastic.github.io/eui/#/guidelines/writing), uses sentence case text and includes [i18n support](https://github.com/elastic/kibana/blob/main/packages/kbn-i18n/README.md) - [x] [Documentation](https://www.elastic.co/guide/en/kibana/master/development-documentation.html) was added for features that require explanation or tutorials - [x] [Unit or functional tests](https://www.elastic.co/guide/en/kibana/master/development-tests.html) were updated or added to match the most common scenarios - [x] Any UI touched in this PR is usable by keyboard only (learn more about [keyboard accessibility](https://webaim.org/techniques/keyboard/)) - [x] Any UI touched in this PR does not create any new axe failures (run axe in browser: [FF](https://addons.mozilla.org/en-US/firefox/addon/axe-devtools/), [Chrome](https://chrome.google.com/webstore/detail/axe-web-accessibility-tes/lhdoppojpmngadmnindnejefpokejbdd?hl=en-US)) - [x] This renders correctly on smaller devices using a responsive layout. (You can test this [in your browser](https://www.browserstack.com/guide/responsive-testing-on-local-server)) - [x] This was checked for [cross-browser compatibility](https://www.elastic.co/support/matrix#matrix_browsers) --------- Co-authored-by: Marco Liberati --- .../edit_panel_action/edit_panel_action.ts | 1 + .../public/lib/embeddables/i_embeddable.ts | 2 + .../public/__mocks__/lens_adapters.ts | 45 +++ .../public/__mocks__/lens_table_adapter.ts | 40 --- .../unified_histogram/public/chart/chart.tsx | 18 +- .../public/chart/chart_config_panel.test.tsx | 4 +- .../public/chart/chart_config_panel.tsx | 35 +- .../public/chart/histogram.test.tsx | 10 +- .../public/chart/histogram.tsx | 14 +- .../container/hooks/use_state_props.test.ts | 249 +++++++------- .../public/container/hooks/use_state_props.ts | 15 +- .../container/services/state_service.test.ts | 11 +- .../container/services/state_service.ts | 29 +- .../public/container/utils/state_selectors.ts | 4 +- .../public/layout/layout.tsx | 13 +- src/plugins/unified_histogram/public/types.ts | 8 +- .../services/dashboard/panel_actions.ts | 57 +++- .../analytics/hoc/with_lens_data.tsx | 4 +- .../lens/public/app_plugin/mounter.tsx | 2 + .../get_edit_lens_configuration.tsx | 49 ++- .../lens_configuration_flyout.test.tsx | 54 ++- .../lens_configuration_flyout.tsx | 314 ++++++++++++++++-- .../plugins/lens/public/app_plugin/types.ts | 2 + .../datasources/form_based/form_based.tsx | 8 + .../text_based/text_based_languages.tsx | 7 +- .../config_panel/config_panel.tsx | 1 + .../config_panel/dimension_container.tsx | 1 + .../editor_frame/config_panel/layer_panel.tsx | 9 + .../editor_frame/config_panel/types.ts | 1 + .../public/embeddable/embeddable.test.tsx | 4 +- .../lens/public/embeddable/embeddable.tsx | 88 ++++- x-pack/plugins/lens/public/index.ts | 7 +- .../lens/public/mocks/services_mock.tsx | 2 + .../shared_components/flyout_container.tsx | 81 +++-- .../init_middleware/load_initial.ts | 12 +- .../public/state_management/lens_slice.ts | 2 + .../open_lens_config/action.test.tsx | 27 +- .../open_lens_config/helpers.ts | 4 +- x-pack/plugins/lens/public/types.ts | 3 + .../public/visualizations/xy/add_layer.tsx | 3 + .../xy/load_annotation_library_flyout.tsx | 3 + .../apps/canvas/embeddables/lens.ts | 2 +- .../lens_migration_smoke_test.ts | 2 +- .../lens/group3/dashboard_inline_editing.ts | 208 ++++++++++++ .../test/functional/apps/lens/group3/index.ts | 1 + .../test/functional/page_objects/lens_page.ts | 3 +- 46 files changed, 1135 insertions(+), 324 deletions(-) create mode 100644 src/plugins/unified_histogram/public/__mocks__/lens_adapters.ts delete mode 100644 src/plugins/unified_histogram/public/__mocks__/lens_table_adapter.ts create mode 100644 x-pack/test/functional/apps/lens/group3/dashboard_inline_editing.ts diff --git a/src/plugins/embeddable/public/embeddable_panel/panel_actions/edit_panel_action/edit_panel_action.ts b/src/plugins/embeddable/public/embeddable_panel/panel_actions/edit_panel_action/edit_panel_action.ts index 942830da96e60..3f465f2d37439 100644 --- a/src/plugins/embeddable/public/embeddable_panel/panel_actions/edit_panel_action/edit_panel_action.ts +++ b/src/plugins/embeddable/public/embeddable_panel/panel_actions/edit_panel_action/edit_panel_action.ts @@ -75,6 +75,7 @@ export class EditPanelAction implements Action { const canEditEmbeddable = Boolean( embeddable && embeddable.getOutput().editable && + !embeddable.getOutput().inlineEditable && (embeddable.getOutput().editUrl || (embeddable.getOutput().editApp && embeddable.getOutput().editPath) || embeddable.getOutput().editableWithExplicitInput) diff --git a/src/plugins/embeddable/public/lib/embeddables/i_embeddable.ts b/src/plugins/embeddable/public/lib/embeddables/i_embeddable.ts index 4f82e21440163..f371208271623 100644 --- a/src/plugins/embeddable/public/lib/embeddables/i_embeddable.ts +++ b/src/plugins/embeddable/public/lib/embeddables/i_embeddable.ts @@ -30,6 +30,8 @@ export interface EmbeddableOutput { title?: string; description?: string; editable?: boolean; + // set this to true if the embeddable allows inline editing + inlineEditable?: boolean; // Whether the embeddable can be edited inline by re-requesting the explicit input from the user editableWithExplicitInput?: boolean; savedObjectId?: string; diff --git a/src/plugins/unified_histogram/public/__mocks__/lens_adapters.ts b/src/plugins/unified_histogram/public/__mocks__/lens_adapters.ts new file mode 100644 index 0000000000000..87e7f782f1bd8 --- /dev/null +++ b/src/plugins/unified_histogram/public/__mocks__/lens_adapters.ts @@ -0,0 +1,45 @@ +/* + * Copyright 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 { UnifiedHistogramChartLoadEvent } from '../types'; + +export const lensAdaptersMock = { + tables: { + tables: { + default: { + columns: [ + { + id: 'col-0-1', + meta: { + dimensionName: 'Slice size', + type: 'number', + }, + name: 'Field 1', + }, + { + id: 'col-0-2', + meta: { + dimensionName: 'Slice', + type: 'number', + }, + name: 'Field 2', + }, + ], + rows: [ + { + 'col-0-1': 0, + 'col-0-2': 0, + 'col-0-3': 0, + 'col-0-4': 0, + }, + ], + type: 'datatable', + }, + }, + }, +} as unknown as UnifiedHistogramChartLoadEvent['adapters']; diff --git a/src/plugins/unified_histogram/public/__mocks__/lens_table_adapter.ts b/src/plugins/unified_histogram/public/__mocks__/lens_table_adapter.ts deleted file mode 100644 index 60e38fecbbfae..0000000000000 --- a/src/plugins/unified_histogram/public/__mocks__/lens_table_adapter.ts +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the Elastic License - * 2.0 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 { Datatable } from '@kbn/expressions-plugin/common'; - -export const lensTablesAdapterMock: Record = { - default: { - columns: [ - { - id: 'col-0-1', - meta: { - dimensionName: 'Slice size', - type: 'number', - }, - name: 'Field 1', - }, - { - id: 'col-0-2', - meta: { - dimensionName: 'Slice', - type: 'number', - }, - name: 'Field 2', - }, - ], - rows: [ - { - 'col-0-1': 0, - 'col-0-2': 0, - 'col-0-3': 0, - 'col-0-4': 0, - }, - ], - type: 'datatable', - }, -}; diff --git a/src/plugins/unified_histogram/public/chart/chart.tsx b/src/plugins/unified_histogram/public/chart/chart.tsx index 56b6ed223df2b..42f3d56584789 100644 --- a/src/plugins/unified_histogram/public/chart/chart.tsx +++ b/src/plugins/unified_histogram/public/chart/chart.tsx @@ -7,6 +7,7 @@ */ import React, { ReactElement, useMemo, useState, useEffect, useCallback, memo } from 'react'; +import type { Observable } from 'rxjs'; import { EuiButtonIcon, EuiContextMenu, @@ -17,8 +18,11 @@ import { EuiProgress, } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import type { EmbeddableComponentProps, Suggestion } from '@kbn/lens-plugin/public'; -import type { Datatable } from '@kbn/expressions-plugin/common'; +import type { + EmbeddableComponentProps, + Suggestion, + LensEmbeddableOutput, +} from '@kbn/lens-plugin/public'; import { DataView, DataViewField, DataViewType } from '@kbn/data-views-plugin/public'; import type { LensEmbeddableInput } from '@kbn/lens-plugin/public'; import type { AggregateQuery, Filter, Query, TimeRange } from '@kbn/es-query'; @@ -69,7 +73,8 @@ export interface ChartProps { disableTriggers?: LensEmbeddableInput['disableTriggers']; disabledActions?: LensEmbeddableInput['disabledActions']; input$?: UnifiedHistogramInput$; - lensTablesAdapter?: Record; + lensAdapters?: UnifiedHistogramChartLoadEvent['adapters']; + lensEmbeddableOutput$?: Observable; isOnHistogramMode?: boolean; isChartLoading?: boolean; onResetChartHeight?: () => void; @@ -107,7 +112,8 @@ export function Chart({ disableTriggers, disabledActions, input$: originalInput$, - lensTablesAdapter, + lensAdapters, + lensEmbeddableOutput$, isOnHistogramMode, isChartLoading, onResetChartHeight, @@ -463,8 +469,8 @@ export function Chart({ {...{ services, lensAttributesContext, - dataView, - lensTablesAdapter, + lensAdapters, + lensEmbeddableOutput$, currentSuggestion, isFlyoutVisible, setIsFlyoutVisible, diff --git a/src/plugins/unified_histogram/public/chart/chart_config_panel.test.tsx b/src/plugins/unified_histogram/public/chart/chart_config_panel.test.tsx index ef673826672ea..5238fc0ac12bb 100644 --- a/src/plugins/unified_histogram/public/chart/chart_config_panel.test.tsx +++ b/src/plugins/unified_histogram/public/chart/chart_config_panel.test.tsx @@ -13,7 +13,7 @@ import { act } from 'react-dom/test-utils'; import { setTimeout } from 'timers/promises'; import { dataViewWithTimefieldMock } from '../__mocks__/data_view_with_timefield'; import { unifiedHistogramServicesMock } from '../__mocks__/services'; -import { lensTablesAdapterMock } from '../__mocks__/lens_table_adapter'; +import { lensAdaptersMock } from '../__mocks__/lens_adapters'; import { ChartConfigPanel } from './chart_config_panel'; import type { LensAttributesContext } from './utils/get_lens_attributes'; @@ -34,7 +34,7 @@ describe('ChartConfigPanel', () => { isFlyoutVisible: true, setIsFlyoutVisible: jest.fn(), isPlainRecord: true, - lensTablesAdapter: lensTablesAdapterMock, + lensAdapters: lensAdaptersMock, query: { esql: 'from test', }, diff --git a/src/plugins/unified_histogram/public/chart/chart_config_panel.tsx b/src/plugins/unified_histogram/public/chart/chart_config_panel.tsx index c3faacd5b9a40..486ea7da79872 100644 --- a/src/plugins/unified_histogram/public/chart/chart_config_panel.tsx +++ b/src/plugins/unified_histogram/public/chart/chart_config_panel.tsx @@ -6,20 +6,20 @@ * Side Public License, v 1. */ import React, { useCallback, useEffect, useRef, useState } from 'react'; +import type { Observable } from 'rxjs'; import type { AggregateQuery, Query } from '@kbn/es-query'; import { isEqual } from 'lodash'; -import type { Suggestion } from '@kbn/lens-plugin/public'; -import type { DataView } from '@kbn/data-views-plugin/public'; +import type { LensEmbeddableOutput, Suggestion } from '@kbn/lens-plugin/public'; import type { Datatable } from '@kbn/expressions-plugin/common'; -import type { UnifiedHistogramServices } from '../types'; +import type { UnifiedHistogramServices, UnifiedHistogramChartLoadEvent } from '../types'; import type { LensAttributesContext } from './utils/get_lens_attributes'; export function ChartConfigPanel({ services, lensAttributesContext, - dataView, - lensTablesAdapter, + lensAdapters, + lensEmbeddableOutput$, currentSuggestion, isFlyoutVisible, setIsFlyoutVisible, @@ -29,10 +29,10 @@ export function ChartConfigPanel({ }: { services: UnifiedHistogramServices; lensAttributesContext: LensAttributesContext; - dataView: DataView; isFlyoutVisible: boolean; setIsFlyoutVisible: (flag: boolean) => void; - lensTablesAdapter?: Record; + lensAdapters?: UnifiedHistogramChartLoadEvent['adapters']; + lensEmbeddableOutput$?: Observable; currentSuggestion?: Suggestion; isPlainRecord?: boolean; query?: Query | AggregateQuery; @@ -49,26 +49,25 @@ export function ChartConfigPanel({ ...(datasourceState && { datasourceState }), ...(visualizationState && { visualizationState }), } as Suggestion; - if (!isEqual(updatedSuggestion, currentSuggestion)) { - onSuggestionChange?.(updatedSuggestion); - } + onSuggestionChange?.(updatedSuggestion); }, [currentSuggestion, onSuggestionChange] ); useEffect(() => { + const tablesAdapters = lensAdapters?.tables?.tables; const dataHasChanged = - Boolean(lensTablesAdapter) && - !isEqual(previousAdapters.current, lensTablesAdapter) && + Boolean(tablesAdapters) && + !isEqual(previousAdapters.current, tablesAdapters) && query !== previousQuery?.current; async function fetchLensConfigComponent() { const Component = await services.lens.EditLensConfigPanelApi(); const panel = ( { setIsFlyoutVisible(false); }} @@ -78,7 +77,7 @@ export function ChartConfigPanel({ ); setEditLensConfigPanel(panel); previousSuggestion.current = currentSuggestion; - previousAdapters.current = lensTablesAdapter; + previousAdapters.current = tablesAdapters; if (dataHasChanged) { previousQuery.current = query; } @@ -92,14 +91,14 @@ export function ChartConfigPanel({ }, [ lensAttributesContext.attributes, services.lens, - dataView, updateSuggestion, isPlainRecord, currentSuggestion, query, isFlyoutVisible, - lensTablesAdapter, setIsFlyoutVisible, + lensAdapters, + lensEmbeddableOutput$, ]); return isPlainRecord ? editLensConfigPanel : null; diff --git a/src/plugins/unified_histogram/public/chart/histogram.test.tsx b/src/plugins/unified_histogram/public/chart/histogram.test.tsx index 78f06687a0e7e..8fd749051f2ce 100644 --- a/src/plugins/unified_histogram/public/chart/histogram.test.tsx +++ b/src/plugins/unified_histogram/public/chart/histogram.test.tsx @@ -8,6 +8,7 @@ import { mountWithIntl } from '@kbn/test-jest-helpers'; import { Histogram } from './histogram'; import React from 'react'; +import { of } from 'rxjs'; import { unifiedHistogramServicesMock } from '../__mocks__/services'; import { dataViewWithTimefieldMock } from '../__mocks__/data_view_with_timefield'; import { createDefaultInspectorAdapters } from '@kbn/expressions-plugin/common'; @@ -166,24 +167,25 @@ describe('Histogram', () => { jest .spyOn(adapters.requests, 'getRequests') .mockReturnValue([{ response: { json: { rawResponse } } } as any]); - onLoad(true, undefined); + const embeddableOutput$ = jest.fn().mockReturnValue(of('output$')); + onLoad(true, undefined, embeddableOutput$); expect(props.onTotalHitsChange).toHaveBeenLastCalledWith( UnifiedHistogramFetchStatus.loading, undefined ); - expect(props.onChartLoad).toHaveBeenLastCalledWith({ adapters: {} }); + expect(props.onChartLoad).toHaveBeenLastCalledWith({ adapters: {}, embeddableOutput$ }); expect(buildBucketInterval.buildBucketInterval).not.toHaveBeenCalled(); expect(useTimeRange.useTimeRange).toHaveBeenLastCalledWith( expect.objectContaining({ bucketInterval: undefined }) ); act(() => { - onLoad(false, adapters); + onLoad(false, adapters, embeddableOutput$); }); expect(props.onTotalHitsChange).toHaveBeenLastCalledWith( UnifiedHistogramFetchStatus.complete, 100 ); - expect(props.onChartLoad).toHaveBeenLastCalledWith({ adapters }); + expect(props.onChartLoad).toHaveBeenLastCalledWith({ adapters, embeddableOutput$ }); expect(buildBucketInterval.buildBucketInterval).toHaveBeenCalled(); expect(useTimeRange.useTimeRange).toHaveBeenLastCalledWith( expect.objectContaining({ bucketInterval: mockBucketInterval }) diff --git a/src/plugins/unified_histogram/public/chart/histogram.tsx b/src/plugins/unified_histogram/public/chart/histogram.tsx index 0046e0b6a87bd..1d91b2a505174 100644 --- a/src/plugins/unified_histogram/public/chart/histogram.tsx +++ b/src/plugins/unified_histogram/public/chart/histogram.tsx @@ -14,7 +14,11 @@ import type { DefaultInspectorAdapters, Datatable } from '@kbn/expressions-plugi import type { IKibanaSearchResponse } from '@kbn/data-plugin/public'; import type { estypes } from '@elastic/elasticsearch'; import type { TimeRange } from '@kbn/es-query'; -import type { EmbeddableComponentProps, LensEmbeddableInput } from '@kbn/lens-plugin/public'; +import type { + EmbeddableComponentProps, + LensEmbeddableInput, + LensEmbeddableOutput, +} from '@kbn/lens-plugin/public'; import { RequestStatus } from '@kbn/inspector-plugin/public'; import type { Observable } from 'rxjs'; import { @@ -118,7 +122,11 @@ export function Histogram({ }, [attributes, containerHeight, containerWidth]); const onLoad = useStableCallback( - (isLoading: boolean, adapters: Partial | undefined) => { + ( + isLoading: boolean, + adapters: Partial | undefined, + lensEmbeddableOutput$?: Observable + ) => { const lensRequest = adapters?.requests?.getRequests()[0]; const requestFailed = lensRequest?.status === RequestStatus.ERROR; const json = lensRequest?.response?.json as @@ -155,7 +163,7 @@ export function Histogram({ setBucketInterval(newBucketInterval); } - onChartLoad?.({ adapters: adapters ?? {} }); + onChartLoad?.({ adapters: adapters ?? {}, embeddableOutput$: lensEmbeddableOutput$ }); } ); diff --git a/src/plugins/unified_histogram/public/container/hooks/use_state_props.test.ts b/src/plugins/unified_histogram/public/container/hooks/use_state_props.test.ts index c9ab0d5220aed..d32235f06f356 100644 --- a/src/plugins/unified_histogram/public/container/hooks/use_state_props.test.ts +++ b/src/plugins/unified_histogram/public/container/hooks/use_state_props.test.ts @@ -5,7 +5,6 @@ * in compliance with, at your election, the Elastic License 2.0 or the Server * Side Public License, v 1. */ - import { DataView, DataViewField, DataViewType } from '@kbn/data-views-plugin/common'; import { RequestAdapter } from '@kbn/inspector-plugin/common'; import { Suggestion } from '@kbn/lens-plugin/public'; @@ -15,7 +14,7 @@ import { UnifiedHistogramFetchStatus } from '../../types'; import { dataViewMock } from '../../__mocks__/data_view'; import { dataViewWithTimefieldMock } from '../../__mocks__/data_view_with_timefield'; import { currentSuggestionMock } from '../../__mocks__/suggestions'; -import { lensTablesAdapterMock } from '../../__mocks__/lens_table_adapter'; +import { lensAdaptersMock } from '../../__mocks__/lens_adapters'; import { unifiedHistogramServicesMock } from '../../__mocks__/services'; import { createStateService, @@ -29,7 +28,7 @@ describe('useStateProps', () => { breakdownField: 'bytes', chartHidden: false, lensRequestAdapter: new RequestAdapter(), - lensTablesAdapter: lensTablesAdapterMock, + lensAdapters: lensAdaptersMock, timeInterval: 'auto', topPanelHeight: 100, totalHitsStatus: UnifiedHistogramFetchStatus.uninitialized, @@ -84,37 +83,42 @@ describe('useStateProps', () => { "total": undefined, }, "isPlainRecord": false, - "lensTablesAdapter": Object { - "default": Object { - "columns": Array [ - Object { - "id": "col-0-1", - "meta": Object { - "dimensionName": "Slice size", - "type": "number", - }, - "name": "Field 1", - }, - Object { - "id": "col-0-2", - "meta": Object { - "dimensionName": "Slice", - "type": "number", - }, - "name": "Field 2", - }, - ], - "rows": Array [ - Object { - "col-0-1": 0, - "col-0-2": 0, - "col-0-3": 0, - "col-0-4": 0, + "lensAdapters": Object { + "tables": Object { + "tables": Object { + "default": Object { + "columns": Array [ + Object { + "id": "col-0-1", + "meta": Object { + "dimensionName": "Slice size", + "type": "number", + }, + "name": "Field 1", + }, + Object { + "id": "col-0-2", + "meta": Object { + "dimensionName": "Slice", + "type": "number", + }, + "name": "Field 2", + }, + ], + "rows": Array [ + Object { + "col-0-1": 0, + "col-0-2": 0, + "col-0-3": 0, + "col-0-4": 0, + }, + ], + "type": "datatable", }, - ], - "type": "datatable", + }, }, }, + "lensEmbeddableOutput$": undefined, "onBreakdownFieldChange": [Function], "onChartHiddenChange": [Function], "onChartLoad": [Function], @@ -159,37 +163,42 @@ describe('useStateProps', () => { "total": undefined, }, "isPlainRecord": true, - "lensTablesAdapter": Object { - "default": Object { - "columns": Array [ - Object { - "id": "col-0-1", - "meta": Object { - "dimensionName": "Slice size", - "type": "number", - }, - "name": "Field 1", - }, - Object { - "id": "col-0-2", - "meta": Object { - "dimensionName": "Slice", - "type": "number", - }, - "name": "Field 2", - }, - ], - "rows": Array [ - Object { - "col-0-1": 0, - "col-0-2": 0, - "col-0-3": 0, - "col-0-4": 0, + "lensAdapters": Object { + "tables": Object { + "tables": Object { + "default": Object { + "columns": Array [ + Object { + "id": "col-0-1", + "meta": Object { + "dimensionName": "Slice size", + "type": "number", + }, + "name": "Field 1", + }, + Object { + "id": "col-0-2", + "meta": Object { + "dimensionName": "Slice", + "type": "number", + }, + "name": "Field 2", + }, + ], + "rows": Array [ + Object { + "col-0-1": 0, + "col-0-2": 0, + "col-0-3": 0, + "col-0-4": 0, + }, + ], + "type": "datatable", }, - ], - "type": "datatable", + }, }, }, + "lensEmbeddableOutput$": undefined, "onBreakdownFieldChange": [Function], "onChartHiddenChange": [Function], "onChartLoad": [Function], @@ -255,37 +264,42 @@ describe('useStateProps', () => { "total": undefined, }, "isPlainRecord": false, - "lensTablesAdapter": Object { - "default": Object { - "columns": Array [ - Object { - "id": "col-0-1", - "meta": Object { - "dimensionName": "Slice size", - "type": "number", - }, - "name": "Field 1", + "lensAdapters": Object { + "tables": Object { + "tables": Object { + "default": Object { + "columns": Array [ + Object { + "id": "col-0-1", + "meta": Object { + "dimensionName": "Slice size", + "type": "number", + }, + "name": "Field 1", + }, + Object { + "id": "col-0-2", + "meta": Object { + "dimensionName": "Slice", + "type": "number", + }, + "name": "Field 2", + }, + ], + "rows": Array [ + Object { + "col-0-1": 0, + "col-0-2": 0, + "col-0-3": 0, + "col-0-4": 0, + }, + ], + "type": "datatable", }, - Object { - "id": "col-0-2", - "meta": Object { - "dimensionName": "Slice", - "type": "number", - }, - "name": "Field 2", - }, - ], - "rows": Array [ - Object { - "col-0-1": 0, - "col-0-2": 0, - "col-0-3": 0, - "col-0-4": 0, - }, - ], - "type": "datatable", + }, }, }, + "lensEmbeddableOutput$": undefined, "onBreakdownFieldChange": [Function], "onChartHiddenChange": [Function], "onChartLoad": [Function], @@ -327,37 +341,42 @@ describe('useStateProps', () => { "total": undefined, }, "isPlainRecord": false, - "lensTablesAdapter": Object { - "default": Object { - "columns": Array [ - Object { - "id": "col-0-1", - "meta": Object { - "dimensionName": "Slice size", - "type": "number", - }, - "name": "Field 1", - }, - Object { - "id": "col-0-2", - "meta": Object { - "dimensionName": "Slice", - "type": "number", - }, - "name": "Field 2", - }, - ], - "rows": Array [ - Object { - "col-0-1": 0, - "col-0-2": 0, - "col-0-3": 0, - "col-0-4": 0, + "lensAdapters": Object { + "tables": Object { + "tables": Object { + "default": Object { + "columns": Array [ + Object { + "id": "col-0-1", + "meta": Object { + "dimensionName": "Slice size", + "type": "number", + }, + "name": "Field 1", + }, + Object { + "id": "col-0-2", + "meta": Object { + "dimensionName": "Slice", + "type": "number", + }, + "name": "Field 2", + }, + ], + "rows": Array [ + Object { + "col-0-1": 0, + "col-0-2": 0, + "col-0-3": 0, + "col-0-4": 0, + }, + ], + "type": "datatable", }, - ], - "type": "datatable", + }, }, }, + "lensEmbeddableOutput$": undefined, "onBreakdownFieldChange": [Function], "onChartHiddenChange": [Function], "onChartLoad": [Function], diff --git a/src/plugins/unified_histogram/public/container/hooks/use_state_props.ts b/src/plugins/unified_histogram/public/container/hooks/use_state_props.ts index a5845731cf12e..d78afc50c15f5 100644 --- a/src/plugins/unified_histogram/public/container/hooks/use_state_props.ts +++ b/src/plugins/unified_histogram/public/container/hooks/use_state_props.ts @@ -23,7 +23,8 @@ import { timeIntervalSelector, totalHitsResultSelector, totalHitsStatusSelector, - lensTablesAdapterSelector, + lensAdaptersSelector, + lensEmbeddableOutputSelector$, } from '../utils/state_selectors'; import { useStateSelector } from '../utils/use_state_selector'; @@ -45,7 +46,11 @@ export const useStateProps = ({ const timeInterval = useStateSelector(stateService?.state$, timeIntervalSelector); const totalHitsResult = useStateSelector(stateService?.state$, totalHitsResultSelector); const totalHitsStatus = useStateSelector(stateService?.state$, totalHitsStatusSelector); - const lensTablesAdapter = useStateSelector(stateService?.state$, lensTablesAdapterSelector); + const lensAdapters = useStateSelector(stateService?.state$, lensAdaptersSelector); + const lensEmbeddableOutput$ = useStateSelector( + stateService?.state$, + lensEmbeddableOutputSelector$ + ); /** * Contexts */ @@ -140,7 +145,8 @@ export const useStateProps = ({ (event: UnifiedHistogramChartLoadEvent) => { // We need to store the Lens request adapter in order to inspect its requests stateService?.setLensRequestAdapter(event.adapters.requests); - stateService?.setLensTablesAdapter(event.adapters.tables?.tables); + stateService?.setLensAdapters(event.adapters); + stateService?.setLensEmbeddableOutput$(event.embeddableOutput$); }, [stateService] ); @@ -176,7 +182,8 @@ export const useStateProps = ({ breakdown, request, isPlainRecord, - lensTablesAdapter, + lensAdapters, + lensEmbeddableOutput$, onTopPanelHeightChange, onTimeIntervalChange, onTotalHitsChange, diff --git a/src/plugins/unified_histogram/public/container/services/state_service.test.ts b/src/plugins/unified_histogram/public/container/services/state_service.test.ts index eb7232e889037..73a493e167c19 100644 --- a/src/plugins/unified_histogram/public/container/services/state_service.test.ts +++ b/src/plugins/unified_histogram/public/container/services/state_service.test.ts @@ -9,7 +9,7 @@ import { RequestAdapter } from '@kbn/inspector-plugin/common'; import { UnifiedHistogramFetchStatus } from '../..'; import { unifiedHistogramServicesMock } from '../../__mocks__/services'; -import { lensTablesAdapterMock } from '../../__mocks__/lens_table_adapter'; +import { lensAdaptersMock } from '../../__mocks__/lens_adapters'; import { getChartHidden, getTopPanelHeight, @@ -47,7 +47,7 @@ describe('UnifiedHistogramStateService', () => { breakdownField: 'bytes', chartHidden: false, lensRequestAdapter: new RequestAdapter(), - lensTablesAdapter: lensTablesAdapterMock, + lensAdapters: lensAdaptersMock, timeInterval: 'auto', topPanelHeight: 100, totalHitsStatus: UnifiedHistogramFetchStatus.uninitialized, @@ -136,8 +136,11 @@ describe('UnifiedHistogramStateService', () => { expect(state).toEqual(newState); stateService.setLensRequestAdapter(undefined); newState = { ...newState, lensRequestAdapter: undefined }; - stateService.setLensTablesAdapter(undefined); - newState = { ...newState, lensTablesAdapter: undefined }; + stateService.setLensAdapters(undefined); + newState = { ...newState, lensAdapters: undefined }; + expect(state).toEqual(newState); + stateService.setLensEmbeddableOutput$(undefined); + newState = { ...newState, lensEmbeddableOutput$: undefined }; expect(state).toEqual(newState); stateService.setTotalHits({ totalHitsStatus: UnifiedHistogramFetchStatus.complete, diff --git a/src/plugins/unified_histogram/public/container/services/state_service.ts b/src/plugins/unified_histogram/public/container/services/state_service.ts index 4cb2950763094..f96a4b5b7b033 100644 --- a/src/plugins/unified_histogram/public/container/services/state_service.ts +++ b/src/plugins/unified_histogram/public/container/services/state_service.ts @@ -7,11 +7,10 @@ */ import type { RequestAdapter } from '@kbn/inspector-plugin/common'; -import type { Suggestion } from '@kbn/lens-plugin/public'; -import type { Datatable } from '@kbn/expressions-plugin/common'; +import type { LensEmbeddableOutput, Suggestion } from '@kbn/lens-plugin/public'; import { BehaviorSubject, Observable } from 'rxjs'; import { UnifiedHistogramFetchStatus } from '../..'; -import type { UnifiedHistogramServices } from '../../types'; +import type { UnifiedHistogramServices, UnifiedHistogramChartLoadEvent } from '../../types'; import { getBreakdownField, getChartHidden, @@ -42,9 +41,13 @@ export interface UnifiedHistogramState { */ lensRequestAdapter: RequestAdapter | undefined; /** - * The current Lens request table + * The current Lens adapters */ - lensTablesAdapter?: Record; + lensAdapters?: UnifiedHistogramChartLoadEvent['adapters']; + /** + * Lens embeddable output observable + */ + lensEmbeddableOutput$?: Observable; /** * The current time interval of the chart */ @@ -114,9 +117,12 @@ export interface UnifiedHistogramStateService { */ setLensRequestAdapter: (lensRequestAdapter: RequestAdapter | undefined) => void; /** - * Sets the current Lens tables + * Sets the current Lens adapters */ - setLensTablesAdapter: (lensTablesAdapter: Record | undefined) => void; + setLensAdapters: (lensAdapters: UnifiedHistogramChartLoadEvent['adapters'] | undefined) => void; + setLensEmbeddableOutput$: ( + lensEmbeddableOutput$: Observable | undefined + ) => void; /** * Sets the current total hits status and result */ @@ -198,8 +204,13 @@ export const createStateService = ( updateState({ lensRequestAdapter }); }, - setLensTablesAdapter: (lensTablesAdapter: Record | undefined) => { - updateState({ lensTablesAdapter }); + setLensAdapters: (lensAdapters: UnifiedHistogramChartLoadEvent['adapters'] | undefined) => { + updateState({ lensAdapters }); + }, + setLensEmbeddableOutput$: ( + lensEmbeddableOutput$: Observable | undefined + ) => { + updateState({ lensEmbeddableOutput$ }); }, setTotalHits: (totalHits: { diff --git a/src/plugins/unified_histogram/public/container/utils/state_selectors.ts b/src/plugins/unified_histogram/public/container/utils/state_selectors.ts index 80e809f4fc38f..f0707cdbe747e 100644 --- a/src/plugins/unified_histogram/public/container/utils/state_selectors.ts +++ b/src/plugins/unified_histogram/public/container/utils/state_selectors.ts @@ -15,4 +15,6 @@ export const topPanelHeightSelector = (state: UnifiedHistogramState) => state.to export const totalHitsResultSelector = (state: UnifiedHistogramState) => state.totalHitsResult; export const totalHitsStatusSelector = (state: UnifiedHistogramState) => state.totalHitsStatus; export const currentSuggestionSelector = (state: UnifiedHistogramState) => state.currentSuggestion; -export const lensTablesAdapterSelector = (state: UnifiedHistogramState) => state.lensTablesAdapter; +export const lensAdaptersSelector = (state: UnifiedHistogramState) => state.lensAdapters; +export const lensEmbeddableOutputSelector$ = (state: UnifiedHistogramState) => + state.lensEmbeddableOutput$; diff --git a/src/plugins/unified_histogram/public/layout/layout.tsx b/src/plugins/unified_histogram/public/layout/layout.tsx index e3c80679c5c3f..014495427f30a 100644 --- a/src/plugins/unified_histogram/public/layout/layout.tsx +++ b/src/plugins/unified_histogram/public/layout/layout.tsx @@ -9,13 +9,15 @@ import { EuiSpacer, useEuiTheme, useIsWithinBreakpoints } from '@elastic/eui'; import { PropsWithChildren, ReactElement, RefObject } from 'react'; import React, { useMemo } from 'react'; +import { Observable } from 'rxjs'; import { createHtmlPortalNode, InPortal, OutPortal } from 'react-reverse-portal'; import { css } from '@emotion/css'; -import type { Datatable, DatatableColumn } from '@kbn/expressions-plugin/common'; +import type { DatatableColumn } from '@kbn/expressions-plugin/common'; import type { DataView, DataViewField } from '@kbn/data-views-plugin/public'; import type { EmbeddableComponentProps, LensEmbeddableInput, + LensEmbeddableOutput, LensSuggestionsApi, Suggestion, } from '@kbn/lens-plugin/public'; @@ -83,7 +85,8 @@ export interface UnifiedHistogramLayoutProps extends PropsWithChildren * Context object for the hits count -- leave undefined to hide the hits count */ hits?: UnifiedHistogramHitsContext; - lensTablesAdapter?: Record; + lensAdapters?: UnifiedHistogramChartLoadEvent['adapters']; + lensEmbeddableOutput$?: Observable; /** * Context object for the chart -- leave undefined to hide the chart */ @@ -185,7 +188,8 @@ export const UnifiedHistogramLayout = ({ columns, request, hits, - lensTablesAdapter, + lensAdapters, + lensEmbeddableOutput$, chart: originalChart, breakdown, resizeRef, @@ -294,7 +298,8 @@ export const UnifiedHistogramLayout = ({ onChartLoad={onChartLoad} onFilter={onFilter} onBrushEnd={onBrushEnd} - lensTablesAdapter={lensTablesAdapter} + lensAdapters={lensAdapters} + lensEmbeddableOutput$={lensEmbeddableOutput$} isOnHistogramMode={isOnHistogramMode} withDefaultActions={withDefaultActions} /> diff --git a/src/plugins/unified_histogram/public/types.ts b/src/plugins/unified_histogram/public/types.ts index 803c74304a3a6..3ba27f7c5b26e 100644 --- a/src/plugins/unified_histogram/public/types.ts +++ b/src/plugins/unified_histogram/public/types.ts @@ -9,11 +9,11 @@ import type { IUiSettingsClient, Capabilities } from '@kbn/core/public'; import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; import type { FieldFormatsStart } from '@kbn/field-formats-plugin/public'; -import type { LensPublicStart } from '@kbn/lens-plugin/public'; +import type { LensEmbeddableOutput, LensPublicStart } from '@kbn/lens-plugin/public'; import type { DataViewField } from '@kbn/data-views-plugin/public'; import type { RequestAdapter } from '@kbn/inspector-plugin/public'; import type { DefaultInspectorAdapters } from '@kbn/expressions-plugin/common'; -import type { Subject } from 'rxjs'; +import type { Observable, Subject } from 'rxjs'; import type { UiActionsStart } from '@kbn/ui-actions-plugin/public'; import type { Storage } from '@kbn/kibana-utils-plugin/public'; import type { ExpressionsStart } from '@kbn/expressions-plugin/public'; @@ -65,6 +65,10 @@ export interface UnifiedHistogramChartLoadEvent { * Inspector adapters for the request */ adapters: UnifiedHistogramAdapters; + /** + * Observable of the lens embeddable output + */ + embeddableOutput$?: Observable; } /** diff --git a/test/functional/services/dashboard/panel_actions.ts b/test/functional/services/dashboard/panel_actions.ts index f81ddf9d69bb5..65e5904f14f80 100644 --- a/test/functional/services/dashboard/panel_actions.ts +++ b/test/functional/services/dashboard/panel_actions.ts @@ -11,6 +11,8 @@ import { FtrService } from '../../ftr_provider_context'; const REMOVE_PANEL_DATA_TEST_SUBJ = 'embeddablePanelAction-deletePanel'; const EDIT_PANEL_DATA_TEST_SUBJ = 'embeddablePanelAction-editPanel'; +const INLINE_EDIT_PANEL_DATA_TEST_SUBJ = 'embeddablePanelAction-ACTION_CONFIGURE_IN_LENS'; +const EDIT_IN_LENS_EDITOR_DATA_TEST_SUBJ = 'navigateToLensEditorLink'; const REPLACE_PANEL_DATA_TEST_SUBJ = 'embeddablePanelAction-replacePanel'; const CLONE_PANEL_DATA_TEST_SUBJ = 'embeddablePanelAction-clonePanel'; const TOGGLE_EXPAND_PANEL_DATA_TEST_SUBJ = 'embeddablePanelAction-togglePanel'; @@ -87,16 +89,53 @@ export class DashboardPanelActionsService extends FtrService { await this.clickContextMenuMoreItem(); } + private async navigateToEditorFromFlyout() { + await this.testSubjects.clickWhenNotDisabledWithoutRetry(INLINE_EDIT_PANEL_DATA_TEST_SUBJ); + await this.header.waitUntilLoadingHasFinished(); + await this.testSubjects.click(EDIT_IN_LENS_EDITOR_DATA_TEST_SUBJ); + const isConfirmModalVisible = await this.testSubjects.exists('confirmModalConfirmButton'); + if (isConfirmModalVisible) { + await this.testSubjects.click('confirmModalConfirmButton', 20000); + } + } + + async clickInlineEdit() { + this.log.debug('clickInlineEditAction'); + await this.expectContextMenuToBeOpen(); + const isInlineEditingActionVisible = await this.testSubjects.exists( + INLINE_EDIT_PANEL_DATA_TEST_SUBJ + ); + if (!isInlineEditingActionVisible) await this.clickContextMenuMoreItem(); + await this.testSubjects.clickWhenNotDisabledWithoutRetry(INLINE_EDIT_PANEL_DATA_TEST_SUBJ); + await this.header.waitUntilLoadingHasFinished(); + await this.common.waitForTopNavToBeVisible(); + } + + /** The dashboard/canvas panels can be either edited on their editor or inline. + * The inline editing panels allow the navigation to the editor after the flyout opens + */ async clickEdit() { this.log.debug('clickEdit'); await this.expectContextMenuToBeOpen(); const isActionVisible = await this.testSubjects.exists(EDIT_PANEL_DATA_TEST_SUBJ); - if (!isActionVisible) await this.clickContextMenuMoreItem(); - await this.testSubjects.clickWhenNotDisabledWithoutRetry(EDIT_PANEL_DATA_TEST_SUBJ); + const isInlineEditingActionVisible = await this.testSubjects.exists( + INLINE_EDIT_PANEL_DATA_TEST_SUBJ + ); + if (!isActionVisible && !isInlineEditingActionVisible) await this.clickContextMenuMoreItem(); + // navigate to the editor + if (await this.testSubjects.exists(EDIT_PANEL_DATA_TEST_SUBJ)) { + await this.testSubjects.clickWhenNotDisabledWithoutRetry(EDIT_PANEL_DATA_TEST_SUBJ); + // open the flyout and then navigate to the editor + } else { + await this.navigateToEditorFromFlyout(); + } await this.header.waitUntilLoadingHasFinished(); await this.common.waitForTopNavToBeVisible(); } + /** The dashboard/canvas panels can be either edited on their editor or inline. + * The inline editing panels allow the navigation to the editor after the flyout opens + */ async editPanelByTitle(title?: string) { this.log.debug(`editPanelByTitle(${title})`); if (title) { @@ -105,7 +144,11 @@ export class DashboardPanelActionsService extends FtrService { } else { await this.openContextMenu(); } - await this.testSubjects.clickWhenNotDisabledWithoutRetry(EDIT_PANEL_DATA_TEST_SUBJ); + if (await this.testSubjects.exists(EDIT_PANEL_DATA_TEST_SUBJ)) { + await this.testSubjects.clickWhenNotDisabledWithoutRetry(EDIT_PANEL_DATA_TEST_SUBJ); + } else { + await this.navigateToEditorFromFlyout(); + } } async clickExpandPanelToggle() { @@ -266,9 +309,13 @@ export class DashboardPanelActionsService extends FtrService { await this.expectExistsPanelAction(REMOVE_PANEL_DATA_TEST_SUBJ); } - async expectExistsEditPanelAction(title?: string) { + async expectExistsEditPanelAction(title?: string, allowsInlineEditing?: boolean) { this.log.debug('expectExistsEditPanelAction'); - await this.expectExistsPanelAction(EDIT_PANEL_DATA_TEST_SUBJ, title); + let testSubj = EDIT_PANEL_DATA_TEST_SUBJ; + if (allowsInlineEditing) { + testSubj = INLINE_EDIT_PANEL_DATA_TEST_SUBJ; + } + await this.expectExistsPanelAction(testSubj, title); } async expectExistsReplacePanelAction() { diff --git a/x-pack/plugins/enterprise_search/public/applications/analytics/hoc/with_lens_data.tsx b/x-pack/plugins/enterprise_search/public/applications/analytics/hoc/with_lens_data.tsx index 64df74a011c88..010ef0e7f496c 100644 --- a/x-pack/plugins/enterprise_search/public/applications/analytics/hoc/with_lens_data.tsx +++ b/x-pack/plugins/enterprise_search/public/applications/analytics/hoc/with_lens_data.tsx @@ -96,9 +96,9 @@ export const withLensData = ( attributes={attributes} searchSessionId={props?.searchSessionId} onBrushEnd={handleBrushEnd} - onLoad={(...args) => { + onLoad={(isLoading, adapters) => { if (dataLoadTransform) { - setData(dataLoadTransform(...args)); + setData(dataLoadTransform(isLoading, adapters)); } }} /> diff --git a/x-pack/plugins/lens/public/app_plugin/mounter.tsx b/x-pack/plugins/lens/public/app_plugin/mounter.tsx index 7531dbc35c0f1..77c0685e2858c 100644 --- a/x-pack/plugins/lens/public/app_plugin/mounter.tsx +++ b/x-pack/plugins/lens/public/app_plugin/mounter.tsx @@ -102,6 +102,7 @@ export async function getLensServices( share, unifiedSearch, serverless, + contentManagement, } = startDependencies; const storage = new Storage(localStorage); @@ -114,6 +115,7 @@ export async function getLensServices( storage, inspector: getLensInspectorService(inspector), navigation, + contentManagement, fieldFormats, stateTransfer, usageCollection, diff --git a/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/get_edit_lens_configuration.tsx b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/get_edit_lens_configuration.tsx index 18213c0bec4c0..fc6511b66ec15 100644 --- a/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/get_edit_lens_configuration.tsx +++ b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/get_edit_lens_configuration.tsx @@ -5,7 +5,7 @@ * 2.0. */ -import React from 'react'; +import React, { useCallback } from 'react'; import { EuiFlyout, EuiLoadingSpinner, EuiOverlayMask } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; import { Provider } from 'react-redux'; @@ -29,12 +29,13 @@ import { LensEditConfigurationFlyout, type EditConfigPanelProps, } from './lens_configuration_flyout'; +import { SavedObjectIndexStore, type Document } from '../../../persistence'; +import { DOC_TYPE } from '../../../../common/constants'; export type EditLensConfigurationProps = Omit< EditConfigPanelProps, - 'startDependencies' | 'coreStart' | 'visualizationMap' | 'datasourceMap' + 'startDependencies' | 'coreStart' | 'visualizationMap' | 'datasourceMap' | 'saveByRef' >; - function LoadingSpinnerWithOverlay() { return ( @@ -86,17 +87,36 @@ export async function getEditLensConfiguration( return ({ attributes, - dataView, - updateAll, + updatePanelState, closeFlyout, wrapInFlyout, datasourceId, - adaptersTables, panelId, + savedObjectId, + output$, + lensAdapters, + updateByRefInput, + navigateToLensEditor, + displayFlyoutHeader, }: EditLensConfigurationProps) => { - if (!lensServices || !datasourceMap || !visualizationMap || !dataView.id) { + if (!lensServices || !datasourceMap || !visualizationMap) { return ; } + /** + * During inline editing of a by reference panel, the panel is converted to a by value one. + * When the user applies the changes we save them to the Lens SO + */ + const saveByRef = useCallback( + async (attrs: Document) => { + const savedObjectStore = new SavedObjectIndexStore(lensServices.contentManagement); + await savedObjectStore.save({ + ...attrs, + savedObjectId, + type: DOC_TYPE, + }); + }, + [savedObjectId] + ); const datasourceState = attributes.state.datasourceStates[datasourceId]; const storeDeps = { lensServices, @@ -110,7 +130,7 @@ export async function getEditLensConfiguration( const lensStore: LensRootStore = makeConfigureStore( storeDeps, undefined, - updatingMiddleware(updateAll) + updatingMiddleware(updatePanelState) ); lensStore.dispatch( loadInitial({ @@ -118,6 +138,7 @@ export async function getEditLensConfiguration( attributes, id: panelId ?? generateId(), }, + inlineEditing: true, }) ); @@ -136,7 +157,6 @@ export async function getEditLensConfiguration( size="s" hideCloseButton css={css` - background: none; clip-path: polygon(-100% 0, 100% 0, 100% 100%, -100% 100%); `} > @@ -150,15 +170,20 @@ export async function getEditLensConfiguration( const configPanelProps = { attributes, - dataView, - updateAll, + updatePanelState, closeFlyout, datasourceId, - adaptersTables, coreStart, startDependencies, visualizationMap, + output$, + lensAdapters, datasourceMap, + saveByRef, + savedObjectId, + updateByRefInput, + navigateToLensEditor, + displayFlyoutHeader, }; return getWrapper( diff --git a/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/lens_configuration_flyout.test.tsx b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/lens_configuration_flyout.test.tsx index 24c8ced2a7e5f..a2173491a1d28 100644 --- a/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/lens_configuration_flyout.test.tsx +++ b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/lens_configuration_flyout.test.tsx @@ -8,7 +8,6 @@ import React from 'react'; import { EuiFlyoutBody } from '@elastic/eui'; import { mountWithProvider } from '../../../mocks'; import type { Query, AggregateQuery } from '@kbn/es-query'; -import type { DataView } from '@kbn/data-views-plugin/public'; import { coreMock } from '@kbn/core/public/mocks'; import { mockVisualizationMap, @@ -111,11 +110,9 @@ describe('LensEditConfigurationFlyout', () => { references: [], } as unknown as TypedLensByValueInput['attributes']; - const dataView = { id: 'index1', isPersisted: () => true } as unknown as DataView; return { attributes: lensAttributes, - dataView, - updateAll: jest.fn(), + updatePanelState: jest.fn(), coreStart: coreMock.createStart(), startDependencies, visualizationMap, @@ -125,7 +122,21 @@ describe('LensEditConfigurationFlyout', () => { } as unknown as EditConfigPanelProps; } - it('should call the closeFlyout callback if collapse button is clicked', async () => { + it('should display the header and the link to editor if necessary props are given', async () => { + const navigateToLensEditorSpy = jest.fn(); + const props = getDefaultProps(); + const newProps = { + ...props, + displayFlyoutHeader: true, + navigateToLensEditor: navigateToLensEditorSpy, + }; + const { instance } = await prepareAndMountComponent(newProps); + expect(instance.find('[data-test-subj="editFlyoutHeader"]').exists()).toBe(true); + instance.find('[data-test-subj="navigateToLensEditorLink"]').at(1).simulate('click'); + expect(navigateToLensEditorSpy).toHaveBeenCalled(); + }); + + it('should call the closeFlyout callback if cancel button is clicked', async () => { const closeFlyoutSpy = jest.fn(); const props = getDefaultProps(); const newProps = { @@ -134,10 +145,41 @@ describe('LensEditConfigurationFlyout', () => { }; const { instance } = await prepareAndMountComponent(newProps); expect(instance.find(EuiFlyoutBody).exists()).toBe(true); - instance.find('[data-test-subj="collapseFlyoutButton"]').at(1).simulate('click'); + instance.find('[data-test-subj="cancelFlyoutButton"]').at(1).simulate('click'); expect(closeFlyoutSpy).toHaveBeenCalled(); }); + it('should call the updateByRefInput callback if cancel button is clicked and savedObjectId exists', async () => { + const updateByRefInputSpy = jest.fn(); + const props = getDefaultProps(); + const newProps = { + ...props, + closeFlyout: jest.fn(), + updateByRefInput: updateByRefInputSpy, + savedObjectId: 'id', + }; + const { instance } = await prepareAndMountComponent(newProps); + instance.find('[data-test-subj="cancelFlyoutButton"]').at(1).simulate('click'); + expect(updateByRefInputSpy).toHaveBeenCalled(); + }); + + it('should call the saveByRef callback if apply button is clicked and savedObjectId exists', async () => { + const updateByRefInputSpy = jest.fn(); + const saveByRefSpy = jest.fn(); + const props = getDefaultProps(); + const newProps = { + ...props, + closeFlyout: jest.fn(), + updateByRefInput: updateByRefInputSpy, + savedObjectId: 'id', + saveByRef: saveByRefSpy, + }; + const { instance } = await prepareAndMountComponent(newProps); + instance.find('[data-test-subj="applyFlyoutButton"]').at(2).simulate('click'); + expect(updateByRefInputSpy).toHaveBeenCalled(); + expect(saveByRefSpy).toHaveBeenCalled(); + }); + it('should compute the frame public api correctly', async () => { const props = getDefaultProps(); const { instance } = await prepareAndMountComponent(props); diff --git a/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/lens_configuration_flyout.tsx b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/lens_configuration_flyout.tsx index c1c34ad868c9d..a60e3df063aaa 100644 --- a/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/lens_configuration_flyout.tsx +++ b/x-pack/plugins/lens/public/app_plugin/shared/edit_on_the_fly/lens_configuration_flyout.tsx @@ -5,73 +5,234 @@ * 2.0. */ -import React, { useMemo } from 'react'; +import React, { useMemo, useCallback, useRef, useEffect, useState } from 'react'; import { EuiButtonEmpty, + EuiButton, EuiFlyoutBody, EuiFlyoutFooter, + EuiTitle, + EuiLink, + EuiIcon, + EuiToolTip, EuiSpacer, EuiFlexGroup, EuiFlexItem, useEuiTheme, EuiCallOut, } from '@elastic/eui'; +import { isEqual } from 'lodash'; +import type { Observable } from 'rxjs'; import { euiThemeVars } from '@kbn/ui-theme'; import { i18n } from '@kbn/i18n'; import { FormattedMessage } from '@kbn/i18n-react'; import { css } from '@emotion/react'; import type { CoreStart } from '@kbn/core/public'; import type { Datatable } from '@kbn/expressions-plugin/public'; -import type { DataView } from '@kbn/data-views-plugin/public'; import type { LensPluginStartDependencies } from '../../../plugin'; -import { useLensSelector, selectFramePublicAPI } from '../../../state_management'; +import { + useLensSelector, + selectFramePublicAPI, + useLensDispatch, + updateIndexPatterns, +} from '../../../state_management'; +import { replaceIndexpattern } from '../../../state_management/lens_slice'; import { VisualizationToolbar } from '../../../editor_frame_service/editor_frame/workspace_panel'; import type { DatasourceMap, VisualizationMap } from '../../../types'; import type { TypedLensByValueInput } from '../../../embeddable/embeddable_component'; +import type { LensEmbeddableOutput } from '../../../embeddable'; +import type { LensInspector } from '../../../lens_inspector_service'; import { ConfigPanelWrapper } from '../../../editor_frame_service/editor_frame/config_panel/config_panel'; +import { extractReferencesFromState } from '../../../utils'; +import type { Document } from '../../../persistence'; +import { createIndexPatternService } from '../../../data_views_service/service'; export interface EditConfigPanelProps { - attributes: TypedLensByValueInput['attributes']; - dataView: DataView; - updateAll: (datasourceState: unknown, visualizationState: unknown) => void; coreStart: CoreStart; startDependencies: LensPluginStartDependencies; visualizationMap: VisualizationMap; datasourceMap: DatasourceMap; + /** The attributes of the Lens embeddable */ + attributes: TypedLensByValueInput['attributes']; + /** Callback for updating the visualization and datasources state */ + updatePanelState: (datasourceState: unknown, visualizationState: unknown) => void; + /** Lens visualizations can be either created from ESQL (textBased) or from dataviews (formBased) */ + datasourceId: 'formBased' | 'textBased'; + /** Embeddable output observable, useful for dashboard flyout */ + output$?: Observable; + /** Contains the active data, necessary for some panel configuration such as coloring */ + lensAdapters?: LensInspector['adapters']; + /** Optional callback called when updating the by reference embeddable */ + updateByRefInput?: (soId: string) => void; + /** Callback for closing the edit flyout */ closeFlyout?: () => void; + /** Boolean used for adding a flyout wrapper */ wrapInFlyout?: boolean; + /** Optional parameter for panel identification + * If not given, Lens generates a new one + */ panelId?: string; - datasourceId: 'formBased' | 'textBased'; - adaptersTables?: Record; + /** Optional parameter for saved object id + * Should be given if the lens embeddable is a by reference one + * (saved in the library) + */ + savedObjectId?: string; + /** Callback for saving the embeddable as a SO */ + saveByRef?: (attrs: Document) => void; + /** Optional callback for navigation from the header of the flyout */ + navigateToLensEditor?: () => void; + /** If set to true it displays a header on the flyout */ + displayFlyoutHeader?: boolean; } export function LensEditConfigurationFlyout({ attributes, - dataView, coreStart, startDependencies, visualizationMap, datasourceMap, datasourceId, - updateAll, + updatePanelState, closeFlyout, - adaptersTables, + saveByRef, + savedObjectId, + updateByRefInput, + output$, + lensAdapters, + navigateToLensEditor, + displayFlyoutHeader, }: EditConfigPanelProps) { + const previousAttributes = useRef(attributes); const datasourceState = attributes.state.datasourceStates[datasourceId]; const activeVisualization = visualizationMap[attributes.visualizationType]; const activeDatasource = datasourceMap[datasourceId]; + const [isInlineFooterVisible, setIsInlineFlyoutFooterVisible] = useState(true); const { euiTheme } = useEuiTheme(); - + const { datasourceStates, visualization, isLoading } = useLensSelector((state) => state.lens); + const dispatch = useLensDispatch(); const activeData: Record = useMemo(() => { return {}; }, []); - const layers = activeDatasource.getLayers(datasourceState); - layers.forEach((layer) => { - if (adaptersTables) { - activeData[layer] = Object.values(adaptersTables)[0]; + useEffect(() => { + const s = output$?.subscribe(() => { + const layers = activeDatasource.getLayers(datasourceState); + const adaptersTables = lensAdapters?.tables?.tables as Record; + const [table] = Object.values(adaptersTables || {}); + layers.forEach((layer) => { + if (table) { + activeData[layer] = table; + } + }); + }); + return () => s?.unsubscribe(); + }, [activeDatasource, lensAdapters, datasourceState, output$, activeData]); + + const attributesChanged: boolean = useMemo(() => { + const previousAttrs = previousAttributes.current; + + const datasourceStatesAreSame = + datasourceStates[datasourceId].state && previousAttrs.state.datasourceStates[datasourceId] + ? datasourceMap[datasourceId].isEqual( + previousAttrs.state.datasourceStates[datasourceId], + previousAttrs.references, + datasourceStates[datasourceId].state, + attributes.references + ) + : false; + + const visualizationState = visualization.state; + return ( + !isEqual(visualizationState, previousAttrs.state.visualization) || !datasourceStatesAreSame + ); + }, [attributes.references, datasourceId, datasourceMap, datasourceStates, visualization.state]); + + const onCancel = useCallback(() => { + const previousAttrs = previousAttributes.current; + + if (attributesChanged) { + const currentDatasourceState = datasourceMap[datasourceId].injectReferencesToLayers + ? datasourceMap[datasourceId]?.injectReferencesToLayers?.( + previousAttrs.state.datasourceStates[datasourceId], + previousAttrs.references + ) + : previousAttrs.state.datasourceStates[datasourceId]; + updatePanelState?.(currentDatasourceState, previousAttrs.state.visualization); + if (savedObjectId) { + updateByRefInput?.(savedObjectId); + } } - }); + closeFlyout?.(); + }, [ + attributesChanged, + savedObjectId, + closeFlyout, + datasourceMap, + datasourceId, + updatePanelState, + updateByRefInput, + ]); + + const onApply = useCallback(() => { + if (savedObjectId) { + const dsStates = Object.fromEntries( + Object.entries(datasourceStates).map(([id, ds]) => { + const dsState = ds.state; + return [id, dsState]; + }) + ); + const references = extractReferencesFromState({ + activeDatasources: Object.keys(datasourceStates).reduce( + (acc, id) => ({ + ...acc, + [id]: datasourceMap[id], + }), + {} + ), + datasourceStates, + visualizationState: visualization.state, + activeVisualization, + }); + const attrs = { + ...attributes, + state: { + ...attributes.state, + visualization: visualization.state, + datasourceStates: dsStates, + }, + references, + }; + saveByRef?.(attrs); + updateByRefInput?.(savedObjectId); + } + closeFlyout?.(); + }, [ + savedObjectId, + closeFlyout, + datasourceStates, + visualization.state, + activeVisualization, + attributes, + saveByRef, + updateByRefInput, + datasourceMap, + ]); + + const indexPatternService = useMemo( + () => + createIndexPatternService({ + dataViews: startDependencies.dataViews, + uiActions: startDependencies.uiActions, + core: coreStart, + updateIndexPatterns: (newIndexPatternsState, options) => { + dispatch(updateIndexPatterns(newIndexPatternsState)); + }, + replaceIndexPattern: (newIndexPattern, oldId, options) => { + dispatch(replaceIndexpattern({ newIndexPattern, oldId })); + }, + }), + [coreStart, dispatch, startDependencies.dataViews, startDependencies.uiActions] + ); const framePublicAPI = useLensSelector((state) => { const newState = { @@ -83,7 +244,6 @@ export function LensEditConfigurationFlyout({ }; return selectFramePublicAPI(newState, datasourceMap); }); - const { isLoading } = useLensSelector((state) => state.lens); if (isLoading) return null; const layerPanelsProps = { @@ -94,6 +254,8 @@ export function LensEditConfigurationFlyout({ dataViews: startDependencies.dataViews, uiActions: startDependencies.uiActions, hideLayerHeader: datasourceId === 'textBased', + indexPatternService, + setIsInlineFlyoutFooterVisible, }; return ( <> @@ -104,7 +266,7 @@ export function LensEditConfigurationFlyout({ overflow-y: auto; padding-left: ${euiThemeVars.euiFormMaxWidth}; margin-left: -${euiThemeVars.euiFormMaxWidth}; - pointer-events: none !important; + pointer-events: none; .euiFlyoutBody__overflow { padding-left: inherit; margin-left: inherit; @@ -113,12 +275,62 @@ export function LensEditConfigurationFlyout({ } } .euiFlyoutBody__overflowContent { - padding: ${euiTheme.size.s}; + padding: 0; } `} > - - + + {displayFlyoutHeader && ( + + + + + + +

+ {i18n.translate('xpack.lens.config.editVisualizationLabel', { + defaultMessage: 'Edit visualization', + })} +

+
+
+ + + + + +
+
+ {navigateToLensEditor && ( + + + {i18n.translate('xpack.lens.config.editLinkLabel', { + defaultMessage: 'Edit in Lens', + })} + + + )} +
+
+ )} + {datasourceId === 'textBased' && ( - +
- - - - - + {isInlineFooterVisible && ( + + + + + + + + + + + + + + + )} ); } diff --git a/x-pack/plugins/lens/public/app_plugin/types.ts b/x-pack/plugins/lens/public/app_plugin/types.ts index 263794db96c87..4e53b66a3244f 100644 --- a/x-pack/plugins/lens/public/app_plugin/types.ts +++ b/x-pack/plugins/lens/public/app_plugin/types.ts @@ -32,6 +32,7 @@ import type { DashboardFeatureFlagConfig } from '@kbn/dashboard-plugin/public'; import type { SavedObjectTaggingPluginStart } from '@kbn/saved-objects-tagging-plugin/public'; import type { IndexPatternFieldEditorStart } from '@kbn/data-view-field-editor-plugin/public'; import type { DataViewEditorStart } from '@kbn/data-view-editor-plugin/public'; +import { ContentManagementPublicStart } from '@kbn/content-management-plugin/public'; import { VisualizeFieldContext, ACTION_VISUALIZE_LENS_FIELD, @@ -161,6 +162,7 @@ export interface LensAppServices { stateTransfer: EmbeddableStateTransfer; navigation: NavigationPublicPluginStart; attributeService: LensAttributeService; + contentManagement: ContentManagementPublicStart; savedObjectsTagging?: SavedObjectTaggingPluginStart; getOriginatingAppName: () => string | undefined; presentationUtil: PresentationUtilPluginStart; diff --git a/x-pack/plugins/lens/public/datasources/form_based/form_based.tsx b/x-pack/plugins/lens/public/datasources/form_based/form_based.tsx index 88f6c67113bce..eee18d41b49a7 100644 --- a/x-pack/plugins/lens/public/datasources/form_based/form_based.tsx +++ b/x-pack/plugins/lens/public/datasources/form_based/form_based.tsx @@ -858,6 +858,14 @@ export function getFormBasedDatasource({ getUsedDataViews: (state) => { return Object.values(state.layers).map(({ indexPatternId }) => indexPatternId); }, + injectReferencesToLayers: (state, references) => { + const layers = + references && state ? injectReferences(state, references).layers : state?.layers; + return { + ...state, + layers, + }; + }, getDatasourceInfo: async (state, references, dataViewsService) => { const layers = references ? injectReferences(state, references).layers : state.layers; diff --git a/x-pack/plugins/lens/public/datasources/text_based/text_based_languages.tsx b/x-pack/plugins/lens/public/datasources/text_based/text_based_languages.tsx index a76e2edd623b0..43d971caf24a9 100644 --- a/x-pack/plugins/lens/public/datasources/text_based/text_based_languages.tsx +++ b/x-pack/plugins/lens/public/datasources/text_based/text_based_languages.tsx @@ -604,7 +604,12 @@ export function getTextBasedDatasource({ getDatasourceSuggestionsForVisualizeField: getSuggestionsForVisualizeField, getDatasourceSuggestionsFromCurrentState: getSuggestionsForState, getDatasourceSuggestionsForVisualizeCharts: getSuggestionsForState, - isEqual: () => true, + isEqual: ( + persistableState1: TextBasedPersistedState, + references1: SavedObjectReference[], + persistableState2: TextBasedPersistedState, + references2: SavedObjectReference[] + ) => isEqual(persistableState1, persistableState2), getDatasourceInfo: async (state, references, dataViewsService) => { const indexPatterns: DataView[] = []; for (const { index } of Object.values(state.layers)) { diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/config_panel.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/config_panel.tsx index 5627916036bf3..41184d2212c45 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/config_panel.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/config_panel.tsx @@ -370,6 +370,7 @@ export function LayerPanels( } }, registerLibraryAnnotationGroup: registerLibraryAnnotationGroupFunction, + isInlineEditing: Boolean(props?.setIsInlineFlyoutFooterVisible), })} ); diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/dimension_container.tsx b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/dimension_container.tsx index 5a109a6ad36a9..6afc4069ec7ee 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/dimension_container.tsx +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/dimension_container.tsx @@ -20,6 +20,7 @@ export function DimensionContainer({ groupLabel: string; isFullscreen: boolean; panelRef: (el: HTMLDivElement) => void; + isInlineEditing?: boolean; }) { return {panel}; } 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 6472c41a79e02..bd5cf0b78b20f 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 @@ -95,6 +95,7 @@ export function LayerPanel( indexPatternService?: IndexPatternServiceAPI; getUserMessages?: UserMessagesGetter; displayLayerSettings: boolean; + setIsInlineFlyoutFooterVisible?: (status: boolean) => void; } ) { const [activeDimension, setActiveDimension] = useState( @@ -135,6 +136,12 @@ export function LayerPanel( setActiveDimension(initialActiveDimensionState); }, [activeVisualization.id]); + useEffect(() => { + // is undefined when the dimension panel is closed + const activeDimensionId = activeDimension.activeId; + props?.setIsInlineFlyoutFooterVisible?.(!Boolean(activeDimensionId)); + }, [activeDimension.activeId, activeVisualization.id, props]); + const panelRef = useRef(null); const settingsPanelRef = useRef(null); @@ -668,6 +675,7 @@ export function LayerPanel( setPanelSettingsOpen(false); return true; }} + isInlineEditing={Boolean(props?.setIsInlineFlyoutFooterVisible)} >
@@ -736,6 +744,7 @@ export function LayerPanel( isOpen={isDimensionPanelOpen} isFullscreen={isFullscreen} groupLabel={activeGroup?.dimensionEditorGroupLabel ?? (activeGroup?.groupLabel || '')} + isInlineEditing={Boolean(props?.setIsInlineFlyoutFooterVisible)} handleClose={() => { if (layerDatasource) { if (layerDatasource.updateStateOnCloseDimension) { diff --git a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/types.ts b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/types.ts index 9b1ed7fde9382..6d06dfb7e6aac 100644 --- a/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/types.ts +++ b/x-pack/plugins/lens/public/editor_frame_service/editor_frame/config_panel/types.ts @@ -29,6 +29,7 @@ export interface ConfigPanelWrapperProps { uiActions: UiActionsStart; getUserMessages?: UserMessagesGetter; hideLayerHeader?: boolean; + setIsInlineFlyoutFooterVisible?: (status: boolean) => void; } export interface LayerPanelProps { diff --git a/x-pack/plugins/lens/public/embeddable/embeddable.test.tsx b/x-pack/plugins/lens/public/embeddable/embeddable.test.tsx index 67d7c86e30921..50ddd1f6cffa1 100644 --- a/x-pack/plugins/lens/public/embeddable/embeddable.test.tsx +++ b/x-pack/plugins/lens/public/embeddable/embeddable.test.tsx @@ -679,7 +679,7 @@ describe('embeddable', () => { // loading should become false expect(onLoad).toHaveBeenCalledTimes(2); - expect(onLoad).toHaveBeenNthCalledWith(2, false, adapters); + expect(onLoad).toHaveBeenNthCalledWith(2, false, adapters, embeddable.getOutput$()); expect(expressionRenderer).toHaveBeenCalledTimes(1); @@ -698,7 +698,7 @@ describe('embeddable', () => { // loading should again become false expect(onLoad).toHaveBeenCalledTimes(4); - expect(onLoad).toHaveBeenNthCalledWith(4, false, adapters); + expect(onLoad).toHaveBeenNthCalledWith(4, false, adapters, embeddable.getOutput$()); }); it('should call onFilter event on filter call ', async () => { diff --git a/x-pack/plugins/lens/public/embeddable/embeddable.tsx b/x-pack/plugins/lens/public/embeddable/embeddable.tsx index b4bdb5783591b..0150d922c481f 100644 --- a/x-pack/plugins/lens/public/embeddable/embeddable.tsx +++ b/x-pack/plugins/lens/public/embeddable/embeddable.tsx @@ -7,6 +7,7 @@ import { partition, uniqBy } from 'lodash'; import React from 'react'; +import type { Observable } from 'rxjs'; import { css } from '@emotion/react'; import { i18n } from '@kbn/i18n'; import { render, unmountComponentAtNode } from 'react-dom'; @@ -45,6 +46,7 @@ import { import { VIS_EVENT_TO_TRIGGER } from '@kbn/visualizations-plugin/public'; import { + EmbeddableStateTransfer, Embeddable as AbstractEmbeddable, EmbeddableInput, EmbeddableOutput, @@ -109,7 +111,7 @@ import type { AllowedGaugeOverrides, AllowedXYOverrides, } from '../../common/types'; -import { getEditPath, DOC_TYPE } from '../../common/constants'; +import { getEditPath, DOC_TYPE, APP_ID } from '../../common/constants'; import { LensAttributeService } from '../lens_attribute_service'; import type { TableInspectorAdapter } from '../editor_frame_service/types'; import { getLensInspectorService, LensInspector } from '../lens_inspector_service'; @@ -163,7 +165,11 @@ interface LensBaseEmbeddableInput extends EmbeddableInput { className?: string; noPadding?: boolean; onBrushEnd?: (data: Simplify) => void; - onLoad?: (isLoading: boolean, adapters?: Partial) => void; + onLoad?: ( + isLoading: boolean, + adapters?: Partial, + output$?: Observable + ) => void; onFilter?: ( data: Simplify<(ClickTriggerEvent['data'] | MultiClickTriggerEvent['data']) & PreventableEvent> ) => void; @@ -595,7 +601,6 @@ export class Embeddable public getUserMessages: UserMessagesGetter = (locationId, filters) => { const userMessages: UserMessage[] = []; - userMessages.push( ...getApplicationUserMessages({ visualizationType: this.savedVis?.visualizationType, @@ -732,6 +737,10 @@ export class Embeddable return String(language).toUpperCase(); } + /** + * Gets the Lens embeddable's datasource and visualization states + * updates the embeddable input + */ async updateVisualization(datasourceState: unknown, visualizationState: unknown) { const viz = this.savedVis; const activeDatasourceId = (this.activeDatasourceId ?? @@ -766,10 +775,58 @@ export class Embeddable }, references, }; - this.updateInput({ attributes: attrs }); + + /** + * SavedObjectId is undefined for by value panels and defined for the by reference ones. + * Here we are converting the by reference panels to by value when user is inline editing + */ + this.updateInput({ attributes: attrs, savedObjectId: undefined }); + /** + * Should load again the user messages, + * otherwise the embeddable state is stuck in an error state + */ + this.renderUserMessages(); + } + } + + /** + * Callback which allows the navigation to the editor. + * Used for the Edit in Lens link inside the inline editing flyout. + */ + private async navigateToLensEditor() { + const executionContext = this.getExecutionContext(); + /** + * The origininating app variable is very important for the Save and Return button + * of the editor to work properly. + * The best way to get it dynamically is from the execution context but for the dashboard + * it needs to be pluralized + */ + const transferState = { + originatingApp: + executionContext?.type === 'dashboard' + ? 'dashboards' + : executionContext?.type ?? 'dashboards', + valueInput: this.getExplicitInput(), + embeddableId: this.id, + searchSessionId: this.getInput().searchSessionId, + }; + const transfer = new EmbeddableStateTransfer( + this.deps.coreStart.application.navigateToApp, + this.deps.coreStart.application.currentAppId$ + ); + if (transfer) { + await transfer.navigateToEditor(APP_ID, { + path: this.output.editPath, + state: transferState, + }); } } + public updateByRefInput(savedObjectId: string) { + const attrs = this.savedVis; + this.updateInput({ attributes: attrs, savedObjectId }); + } + async openConfingPanel(startDependencies: LensPluginStartDependencies) { const { getEditLensConfiguration } = await import('../async_services'); const Component = await getEditLensConfiguration( @@ -783,16 +840,21 @@ export class Embeddable 'formBased') as EditLensConfigurationProps['datasourceId']; const attributes = this.savedVis as TypedLensByValueInput['attributes']; - const dataView = this.dataViews[0]; if (attributes) { return ( ); } @@ -881,7 +943,7 @@ export class Embeddable private updateActiveData: ExpressionWrapperProps['onData$'] = (data, adapters) => { if (this.input.onLoad) { // once onData$ is get's called from expression renderer, loading becomes false - this.input.onLoad(false, adapters); + this.input.onLoad(false, adapters, this.getOutput$()); } const { type, error } = data as { type: string; error: ErrorLike }; @@ -1404,7 +1466,11 @@ export class Embeddable this.updateOutput({ defaultTitle: this.savedVis.title, defaultDescription: this.savedVis.description, - editable: this.getIsEditable() && !this.isTextBasedLanguage(), + /** lens visualizations allow inline editing action + * navigation to the editor is allowed through the flyout + */ + editable: this.getIsEditable(), + inlineEditable: true, title, description, editPath: getEditPath(savedObjectId), @@ -1413,7 +1479,7 @@ export class Embeddable }); } - private getIsEditable() { + public getIsEditable() { return ( this.deps.capabilities.canSaveVisualizations || (!this.inputIsRefType(this.getInput()) && diff --git a/x-pack/plugins/lens/public/index.ts b/x-pack/plugins/lens/public/index.ts index ebf64a1915a43..9d2b409a678d3 100644 --- a/x-pack/plugins/lens/public/index.ts +++ b/x-pack/plugins/lens/public/index.ts @@ -105,7 +105,12 @@ export type { ReferenceLineLayerConfig, } from '@kbn/expression-xy-plugin/common'; -export type { LensEmbeddableInput, LensSavedObjectAttributes, Embeddable } from './embeddable'; +export type { + LensEmbeddableInput, + LensSavedObjectAttributes, + Embeddable, + LensEmbeddableOutput, +} from './embeddable'; export type { ChartInfo } from './chart_info_api'; diff --git a/x-pack/plugins/lens/public/mocks/services_mock.tsx b/x-pack/plugins/lens/public/mocks/services_mock.tsx index 8b3cd2e618a68..2f91d6b24c702 100644 --- a/x-pack/plugins/lens/public/mocks/services_mock.tsx +++ b/x-pack/plugins/lens/public/mocks/services_mock.tsx @@ -16,6 +16,7 @@ import { inspectorPluginMock } from '@kbn/inspector-plugin/public/mocks'; import { spacesPluginMock } from '@kbn/spaces-plugin/public/mocks'; import { dashboardPluginMock } from '@kbn/dashboard-plugin/public/mocks'; import { dataViewPluginMocks } from '@kbn/data-views-plugin/public/mocks'; +import { contentManagementMock } from '@kbn/content-management-plugin/public/mocks'; import { chartPluginMock } from '@kbn/charts-plugin/public/mocks'; import { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; import { unifiedSearchPluginMock } from '@kbn/unified-search-plugin/public/mocks'; @@ -185,6 +186,7 @@ export function makeDefaultServices( dataViewEditor: indexPatternEditorPluginMock.createStartContract(), unifiedSearch: unifiedSearchPluginMock.createStartContract(), docLinks: startMock.docLinks, + contentManagement: contentManagementMock.createStartContract(), eventAnnotationService: {} as EventAnnotationServiceType, }; } diff --git a/x-pack/plugins/lens/public/shared_components/flyout_container.tsx b/x-pack/plugins/lens/public/shared_components/flyout_container.tsx index 46a5c5ca39706..d06c9babed5c5 100644 --- a/x-pack/plugins/lens/public/shared_components/flyout_container.tsx +++ b/x-pack/plugins/lens/public/shared_components/flyout_container.tsx @@ -8,6 +8,7 @@ import './flyout_container.scss'; import React, { useState, useEffect, useCallback } from 'react'; +import { css } from '@emotion/react'; import { EuiFlyoutHeader, EuiFlyoutFooter, @@ -47,6 +48,7 @@ export function FlyoutContainer({ panelContainerRef, children, customFooter, + isInlineEditing, }: { isOpen: boolean; handleClose: () => boolean; @@ -56,6 +58,7 @@ export function FlyoutContainer({ panelRef?: (el: HTMLDivElement) => void; panelContainerRef?: (el: HTMLDivElement) => void; customFooter?: React.ReactElement; + isInlineEditing?: boolean; }) { const [focusTrapIsEnabled, setFocusTrapIsEnabled] = useState(false); @@ -68,14 +71,16 @@ export function FlyoutContainer({ }, [handleClose]); useEffect(() => { - document.body.classList.toggle('lnsBody--overflowHidden', isOpen); - return () => { - if (isOpen) { - setFocusTrapIsEnabled(false); - } - document.body.classList.remove('lnsBody--overflowHidden'); - }; - }, [isOpen]); + if (!isInlineEditing) { + document.body.classList.toggle('lnsBody--overflowHidden', isOpen); + return () => { + if (isOpen) { + setFocusTrapIsEnabled(false); + } + document.body.classList.remove('lnsBody--overflowHidden'); + }; + } + }, [isInlineEditing, isOpen]); if (!isOpen) { return null; @@ -99,16 +104,34 @@ export function FlyoutContainer({ role="dialog" aria-labelledby="lnsDimensionContainerTitle" className="lnsDimensionContainer" + css={css` + box-shadow: ${isInlineEditing ? 'none !important' : 'inherit'}; + `} onAnimationEnd={() => { if (isOpen) { // EuiFocusTrap interferes with animating elements with absolute position: - // running this onAnimationEnd, otherwise the flyout pushes content when animating - setFocusTrapIsEnabled(true); + // running this onAnimationEnd, otherwise the flyout pushes content when animating. + // The EuiFocusTrap is disabled when inline editing as it causes bugs with comboboxes + setFocusTrapIsEnabled(!Boolean(isInlineEditing)); } }} > + {isInlineEditing && ( + + + + )}

- - - + {!isInlineEditing && ( + + + + )} @@ -147,13 +172,17 @@ export function FlyoutContainer({ - {i18n.translate('xpack.lens.dimensionContainer.close', { - defaultMessage: 'Close', - })} + {isInlineEditing + ? i18n.translate('xpack.lens.dimensionContainer.back', { + defaultMessage: 'Back', + }) + : i18n.translate('xpack.lens.dimensionContainer.close', { + defaultMessage: 'Close', + })} )} diff --git a/x-pack/plugins/lens/public/state_management/init_middleware/load_initial.ts b/x-pack/plugins/lens/public/state_management/init_middleware/load_initial.ts index c33ed7dd07ba2..418fcc2308e7e 100644 --- a/x-pack/plugins/lens/public/state_management/init_middleware/load_initial.ts +++ b/x-pack/plugins/lens/public/state_management/init_middleware/load_initial.ts @@ -91,10 +91,12 @@ export function loadInitial( redirectCallback, initialInput, history, + inlineEditing, }: { redirectCallback?: (savedObjectId?: string) => void; initialInput?: LensEmbeddableInput; history?: History; + inlineEditing?: boolean; }, autoApplyDisabled: boolean ) { @@ -291,9 +293,13 @@ export function loadInitial( {} ); - const filters = data.query.filterManager.inject(doc.state.filters, doc.references); - // Don't overwrite any pinned filters - data.query.filterManager.setAppFilters(filters); + // when the embeddable is initialized from the dashboard we don't want to inject the filters + // as this will replace the parent application filters (such as a dashboard) + if (!Boolean(inlineEditing)) { + const filters = data.query.filterManager.inject(doc.state.filters, doc.references); + // Don't overwrite any pinned filters + data.query.filterManager.setAppFilters(filters); + } const docVisualizationState = { activeId: doc.visualizationType, diff --git a/x-pack/plugins/lens/public/state_management/lens_slice.ts b/x-pack/plugins/lens/public/state_management/lens_slice.ts index 8d24cf00d1d70..df3564958111b 100644 --- a/x-pack/plugins/lens/public/state_management/lens_slice.ts +++ b/x-pack/plugins/lens/public/state_management/lens_slice.ts @@ -203,6 +203,7 @@ export const loadInitial = createAction<{ initialInput?: LensEmbeddableInput; redirectCallback?: (savedObjectId?: string) => void; history?: History; + inlineEditing?: boolean; }>('lens/loadInitial'); export const initEmpty = createAction( 'initEmpty', @@ -846,6 +847,7 @@ export const makeLensReducer = (storeDeps: LensStoreDeps) => { initialInput?: LensEmbeddableInput; redirectCallback?: (savedObjectId?: string) => void; history?: History; + inlineEditing?: boolean; }> ) => state, [initEmpty.type]: ( diff --git a/x-pack/plugins/lens/public/trigger_actions/open_lens_config/action.test.tsx b/x-pack/plugins/lens/public/trigger_actions/open_lens_config/action.test.tsx index 6c3d98fb3637d..d8dbc219c6c17 100644 --- a/x-pack/plugins/lens/public/trigger_actions/open_lens_config/action.test.tsx +++ b/x-pack/plugins/lens/public/trigger_actions/open_lens_config/action.test.tsx @@ -24,6 +24,11 @@ describe('open config panel action', () => { const embeddable = { type: 'NOT_LENS', isTextBasedLanguage: () => true, + getInput: () => { + return { + viewMode: 'edit', + }; + }, } as unknown as IEmbeddable; const configurablePanelAction = new ConfigureInLensPanelAction( mockStartDependencies, @@ -38,10 +43,14 @@ describe('open config panel action', () => { expect(isCompatible).toBeFalsy(); }); - it('is incompatible with non text based language embeddable', async () => { + it('is incompatible with input view mode', async () => { const embeddable = { - type: DOC_TYPE, - isTextBasedLanguage: () => false, + type: 'NOT_LENS', + getInput: () => { + return { + viewMode: 'view', + }; + }, } as unknown as IEmbeddable; const configurablePanelAction = new ConfigureInLensPanelAction( mockStartDependencies, @@ -60,6 +69,12 @@ describe('open config panel action', () => { const embeddable = { type: DOC_TYPE, isTextBasedLanguage: () => true, + getInput: () => { + return { + viewMode: 'edit', + }; + }, + getIsEditable: () => true, } as unknown as IEmbeddable; const configurablePanelAction = new ConfigureInLensPanelAction( mockStartDependencies, @@ -79,6 +94,12 @@ describe('open config panel action', () => { const embeddable = { type: DOC_TYPE, isTextBasedLanguage: () => true, + getInput: () => { + return { + viewMode: 'edit', + }; + }, + getIsEditable: () => true, openConfingPanel: jest.fn().mockResolvedValue(Lens Config Panel Component), getRoot: () => { return { diff --git a/x-pack/plugins/lens/public/trigger_actions/open_lens_config/helpers.ts b/x-pack/plugins/lens/public/trigger_actions/open_lens_config/helpers.ts index 80156ae1442aa..b1647876581fd 100644 --- a/x-pack/plugins/lens/public/trigger_actions/open_lens_config/helpers.ts +++ b/x-pack/plugins/lens/public/trigger_actions/open_lens_config/helpers.ts @@ -21,7 +21,9 @@ interface Context { } export async function isActionCompatible(embeddable: IEmbeddable) { - return Boolean(isLensEmbeddable(embeddable) && embeddable.isTextBasedLanguage()); + // display the action only if dashboard is on editable mode + const inDashboardEditMode = embeddable.getInput().viewMode === 'edit'; + return Boolean(isLensEmbeddable(embeddable) && embeddable.getIsEditable() && inDashboardEditMode); } export async function executeAction({ embeddable, startDependencies, overlays, theme }: Context) { diff --git a/x-pack/plugins/lens/public/types.ts b/x-pack/plugins/lens/public/types.ts index 13651c3bc5e69..d549fbb71bdcf 100644 --- a/x-pack/plugins/lens/public/types.ts +++ b/x-pack/plugins/lens/public/types.ts @@ -507,6 +507,8 @@ export interface Datasource { references?: SavedObjectReference[], dataViewsService?: DataViewsPublicPluginStart ) => Promise; + + injectReferencesToLayers?: (state: T, references?: SavedObjectReference[]) => T; } export interface DatasourceFixAction { @@ -1009,6 +1011,7 @@ interface AddLayerButtonProps { addLayer: AddLayerFunction; ensureIndexPattern: (specOrId: DataViewSpec | string) => Promise; registerLibraryAnnotationGroup: RegisterLibraryAnnotationGroupFunction; + isInlineEditing?: boolean; } export interface Visualization { diff --git a/x-pack/plugins/lens/public/visualizations/xy/add_layer.tsx b/x-pack/plugins/lens/public/visualizations/xy/add_layer.tsx index c522badb5b96d..3e4ecfd0d5bfe 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/add_layer.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/add_layer.tsx @@ -26,12 +26,14 @@ interface AddLayerButtonProps { supportedLayers: VisualizationLayerDescription[]; addLayer: AddLayerFunction; eventAnnotationService: EventAnnotationServiceType; + isInlineEditing?: boolean; } export function AddLayerButton({ supportedLayers, addLayer, eventAnnotationService, + isInlineEditing, }: AddLayerButtonProps) { const [showLayersChoice, toggleLayersChoice] = useState(false); @@ -162,6 +164,7 @@ export function AddLayerButton({ isLoadLibraryVisible={isLoadLibraryVisible} setLoadLibraryFlyoutVisible={setLoadLibraryFlyoutVisible} eventAnnotationService={eventAnnotationService} + isInlineEditing={isInlineEditing} addLayer={(extraArg) => { addLayer(LayerTypes.ANNOTATIONS, extraArg); }} diff --git a/x-pack/plugins/lens/public/visualizations/xy/load_annotation_library_flyout.tsx b/x-pack/plugins/lens/public/visualizations/xy/load_annotation_library_flyout.tsx index cb9521b42e0a6..098d76e7f9ad4 100644 --- a/x-pack/plugins/lens/public/visualizations/xy/load_annotation_library_flyout.tsx +++ b/x-pack/plugins/lens/public/visualizations/xy/load_annotation_library_flyout.tsx @@ -19,11 +19,13 @@ export function LoadAnnotationLibraryFlyout({ isLoadLibraryVisible, setLoadLibraryFlyoutVisible, addLayer, + isInlineEditing, }: { isLoadLibraryVisible: boolean; setLoadLibraryFlyoutVisible: (visible: boolean) => void; eventAnnotationService: EventAnnotationServiceType; addLayer: (argument?: ExtraAppendLayerArg) => void; + isInlineEditing?: boolean; }) { const { renderEventAnnotationGroupSavedObjectFinder: EventAnnotationGroupSavedObjectFinder, @@ -66,6 +68,7 @@ export function LoadAnnotationLibraryFlyout({ setLoadLibraryFlyoutVisible(false); return true; }} + isInlineEditing={isInlineEditing} >
{ + await PageObjects.visualize.navigateToNewVisualization(); + await PageObjects.visualize.clickVisType('lens'); + await PageObjects.lens.goToTimeRange(); + + await PageObjects.lens.configureDimension({ + dimension: 'lnsXY_yDimensionPanel > lns-empty-dimension', + operation: 'average', + field: 'bytes', + }); + + await PageObjects.lens.switchToVisualization('lnsMetric'); + await PageObjects.lens.waitForVisualization('mtrVis'); + }; + + const loadExistingLens = async () => { + await PageObjects.visualize.gotoVisualizationLandingPage(); + await listingTable.searchForItemWithName('lnsXYvis'); + await PageObjects.lens.clickVisualizeListItemTitle('lnsXYvis'); + await PageObjects.lens.goToTimeRange(); + await PageObjects.lens.waitForVisualization('xyVisChart'); + }; + + describe('lens inline editing tests', () => { + it('should allow inline editing of a by value visualization', async () => { + await createNewLens(); + await PageObjects.lens.save('New Lens from Modal', false, false, false, 'new'); + + await PageObjects.dashboard.waitForRenderComplete(); + await dashboardPanelActions.openContextMenu(); + await dashboardPanelActions.clickInlineEdit(); + + log.debug('Adds a secondary dimension'); + + await PageObjects.lens.configureDimension({ + dimension: 'lnsMetric_secondaryMetricDimensionPanel > lns-empty-dimension', + operation: 'max', + field: 'bytes', + keepOpen: true, + }); + await PageObjects.lens.closeDimensionEditor(); + await testSubjects.click('applyFlyoutButton'); + await PageObjects.dashboard.waitForRenderComplete(); + const data = await PageObjects.lens.getMetricVisualizationData(); + const expectedData = [ + { + title: 'Average of bytes', + subtitle: undefined, + extraText: 'Maximum of bytes 19,986', + value: '5,727.322', + color: 'rgba(245, 247, 250, 1)', + showingTrendline: false, + showingBar: false, + }, + ]; + + log.debug(data); + expect(data).to.eql(expectedData); + + await PageObjects.timeToVisualize.resetNewDashboard(); + }); + + it('should allow inline editing of a by reference visualization', async () => { + await loadExistingLens(); + await PageObjects.lens.save('xyVisChart Copy', true, false, false, 'new'); + + await PageObjects.dashboard.waitForRenderComplete(); + await elasticChart.setNewChartUiDebugFlag(true); + + await dashboardPanelActions.saveToLibrary('My by reference visualization'); + + await dashboardPanelActions.openContextMenu(); + await dashboardPanelActions.clickInlineEdit(); + + log.debug('Removes breakdown dimension'); + + await PageObjects.lens.removeDimension('lnsXY_splitDimensionPanel'); + + await testSubjects.click('applyFlyoutButton'); + await PageObjects.dashboard.waitForRenderComplete(); + + const data = await PageObjects.lens.getCurrentChartDebugStateForVizType('xyVisChart'); + expect(data?.axes?.y.length).to.eql(1); + await PageObjects.timeToVisualize.resetNewDashboard(); + }); + + it('should reset changes made to the previous state', async () => { + await createNewLens(); + await PageObjects.lens.save('New Lens from Modal', false, false, false, 'new'); + + await PageObjects.dashboard.waitForRenderComplete(); + await dashboardPanelActions.openContextMenu(); + await dashboardPanelActions.clickInlineEdit(); + + log.debug('Adds a secondary dimension'); + + await PageObjects.lens.configureDimension({ + dimension: 'lnsMetric_secondaryMetricDimensionPanel > lns-empty-dimension', + operation: 'max', + field: 'bytes', + keepOpen: true, + }); + + log.debug('Cancels the changes'); + await PageObjects.lens.closeDimensionEditor(); + await testSubjects.click('cancelFlyoutButton'); + await PageObjects.dashboard.waitForRenderComplete(); + + const data = await PageObjects.lens.getMetricVisualizationData(); + const expectedData = [ + { + title: 'Average of bytes', + subtitle: undefined, + extraText: '', + value: '5,727.322', + color: 'rgba(245, 247, 250, 1)', + showingTrendline: false, + showingBar: false, + }, + ]; + + expect(data).to.eql(expectedData); + await PageObjects.timeToVisualize.resetNewDashboard(); + }); + + it('should allow adding an annotation', async () => { + await loadExistingLens(); + await PageObjects.lens.save('xyVisChart Copy', true, false, false, 'new'); + + await PageObjects.dashboard.waitForRenderComplete(); + await elasticChart.setNewChartUiDebugFlag(true); + + await dashboardPanelActions.openContextMenu(); + await dashboardPanelActions.clickInlineEdit(); + + log.debug('Adds annotation'); + + await PageObjects.lens.createLayer('annotations'); + + expect((await find.allByCssSelector(`[data-test-subj^="lns-layerPanel-"]`)).length).to.eql(2); + expect( + await ( + await testSubjects.find('lnsXY_xAnnotationsPanel > lns-dimensionTrigger') + ).getVisibleText() + ).to.eql('Event'); + + await testSubjects.click('applyFlyoutButton'); + await PageObjects.dashboard.waitForRenderComplete(); + await testSubjects.existOrFail('xyVisAnnotationIcon'); + await PageObjects.timeToVisualize.resetNewDashboard(); + }); + + it('should allow adding a reference line', async () => { + await loadExistingLens(); + await PageObjects.lens.save('xyVisChart Copy', true, false, false, 'new'); + + await PageObjects.dashboard.waitForRenderComplete(); + await elasticChart.setNewChartUiDebugFlag(true); + + await dashboardPanelActions.openContextMenu(); + await dashboardPanelActions.clickInlineEdit(); + + log.debug('Adds reference line'); + + await PageObjects.lens.createLayer('referenceLine'); + + await PageObjects.lens.configureDimension({ + dimension: 'lns-layerPanel-1 > lnsXY_yReferenceLineLeftPanel > lns-dimensionTrigger', + operation: 'formula', + formula: `count()`, + keepOpen: true, + }); + + await PageObjects.lens.selectOptionFromComboBox('lns-icon-select', 'bell'); + await PageObjects.lens.closeDimensionEditor(); + await testSubjects.click('applyFlyoutButton'); + await PageObjects.dashboard.waitForRenderComplete(); + + await testSubjects.existOrFail('xyVisAnnotationIcon'); + + await PageObjects.timeToVisualize.resetNewDashboard(); + }); + }); +} diff --git a/x-pack/test/functional/apps/lens/group3/index.ts b/x-pack/test/functional/apps/lens/group3/index.ts index aa2112f248f71..f82b409b7ba58 100644 --- a/x-pack/test/functional/apps/lens/group3/index.ts +++ b/x-pack/test/functional/apps/lens/group3/index.ts @@ -76,5 +76,6 @@ export default ({ getService, loadTestFile, getPageObjects }: FtrProviderContext loadTestFile(require.resolve('./runtime_fields')); // 1m loadTestFile(require.resolve('./terms')); // 1m 35s loadTestFile(require.resolve('./epoch_millis')); // 30s + loadTestFile(require.resolve('./dashboard_inline_editing')); }); }; diff --git a/x-pack/test/functional/page_objects/lens_page.ts b/x-pack/test/functional/page_objects/lens_page.ts index 6880a3ab46ff5..493977e7fc735 100644 --- a/x-pack/test/functional/page_objects/lens_page.ts +++ b/x-pack/test/functional/page_objects/lens_page.ts @@ -1472,7 +1472,8 @@ export function LensPageProvider({ getService, getPageObjects }: FtrProviderCont } if (!opts.keepOpen) { - await testSubjects.click('collapseFlyoutButton'); + await this.closeDimensionEditor(); + await testSubjects.click('applyFlyoutButton'); } }, From e522f0a178b5060ca72bef97518b4dba5e7fef70 Mon Sep 17 00:00:00 2001 From: Brad White Date: Wed, 27 Sep 2023 02:14:43 -0600 Subject: [PATCH 25/26] Pick AppEx SharedUX from #166813 (#167356) ## Summary We're breaking https://github.com/elastic/kibana/pull/166813 up into smaller PRs in the interest of getting PRs through sooner for type fixes. These are the changes for AppEx SharedUX. --- packages/shared-ux/markdown/mocks/storybook.ts | 2 +- x-pack/plugins/reporting/server/lib/store/store.ts | 3 +-- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/packages/shared-ux/markdown/mocks/storybook.ts b/packages/shared-ux/markdown/mocks/storybook.ts index 3ed41273764ed..74c865365583b 100644 --- a/packages/shared-ux/markdown/mocks/storybook.ts +++ b/packages/shared-ux/markdown/mocks/storybook.ts @@ -82,7 +82,7 @@ export class MarkdownStorybookMock extends AbstractStorybookMock< }; } - getServices() { + getServices(): MarkdownProps { return { ...this.getProps() }; } } diff --git a/x-pack/plugins/reporting/server/lib/store/store.ts b/x-pack/plugins/reporting/server/lib/store/store.ts index 1a0dcbf16a893..d4907d43bc490 100644 --- a/x-pack/plugins/reporting/server/lib/store/store.ts +++ b/x-pack/plugins/reporting/server/lib/store/store.ts @@ -86,7 +86,6 @@ export class ReportingStore { private readonly indexPrefix: string; // config setting of index prefix in system index name private readonly indexInterval: string; // config setting of index prefix: how often to poll for pending work private client?: ElasticsearchClient; - private ilmPolicyManager?: IlmPolicyManager; config: ReportingCore['config']; constructor(private reportingCore: ReportingCore, private logger: Logger) { @@ -107,7 +106,7 @@ export class ReportingStore { private async getIlmPolicyManager() { const client = await this.getClient(); - return (this.ilmPolicyManager = IlmPolicyManager.create({ client })); + return IlmPolicyManager.create({ client }); } private async createIndex(indexName: string) { From c18513e23da91e64a1b0802af185551b590862c6 Mon Sep 17 00:00:00 2001 From: James Gowdy Date: Wed, 27 Sep 2023 09:32:17 +0100 Subject: [PATCH 26/26] [ML] Removing global isServerless flag (#166651) Removed `isServerless` flag which lived in our global context and had to be passed about to the various components which create their own version of the context using `getMlGlobalServices` This PR adds a new context which contains flags for all of the features which can be toggled when in serverless mode. Flags added: ``` showNodeInfo showMLNavMenu showLicenseInfo isADEnabled isDFAEnabled isNLPEnabled ``` The enabled features flags are now read from the config file client side, rather than using capabilities. Additional changes: - Changes the wording of the awaiting ML node callout in serverless. - In the search project, the default ML page is the trained models list and not Overview - Reenables the Memory Usage page for all projects --------- Co-authored-by: Kibana Machine <42973632+kibanamachine@users.noreply.github.com> --- .../test_suites/core_plugins/rendering.ts | 3 + .../components/full_time_range_selector.tsx | 18 +-- .../src/hooks/use_date_picker_context.tsx | 4 +- .../change_point_detection_root.tsx | 6 +- .../log_categorization_app_state.tsx | 6 +- .../log_rate_analysis_app_state.tsx | 6 +- .../log_rate_analysis_content_wrapper.tsx | 5 +- .../index_data_visualizer.tsx | 9 +- x-pack/plugins/ml/common/constants/app.ts | 20 +++ .../aiops/change_point_detection.tsx | 7 +- .../application/aiops/log_categorization.tsx | 7 +- .../application/aiops/log_rate_analysis.tsx | 7 +- x-pack/plugins/ml/public/application/app.tsx | 26 ++-- .../export_jobs_flyout/export_jobs_flyout.tsx | 4 +- .../import_jobs_flyout/import_jobs_flyout.tsx | 4 +- .../components/job_messages/job_messages.tsx | 8 +- .../components/job_spaces_sync/sync_list.tsx | 4 +- .../jobs_awaiting_node_warning.tsx | 6 +- .../new_job_awaiting_node.tsx | 32 ++--- .../ml_entity_selector/ml_entity_selector.tsx | 8 +- .../components/ml_page/ml_page.tsx | 7 +- .../application/contexts/kibana/index.ts | 1 - .../contexts/kibana/use_is_serverless.ts | 12 -- .../public/application/contexts/ml/index.ts | 1 + .../contexts/ml/serverless_context.tsx | 57 ++++++++ .../pages/job_map/components/controls.tsx | 10 +- .../index_based/index_data_visualizer.tsx | 7 +- .../jobs_list_view/jobs_list_view.js | 6 +- .../jobs_stats_bar/jobs_stats_bar.js | 14 +- .../application/jobs/jobs_list/jobs.tsx | 8 +- .../components/time_range_step/time_range.tsx | 4 +- .../ml/public/application/management/index.ts | 6 +- .../jobs_list_page/jobs_list_page.tsx | 127 +++++++++--------- .../space_management/space_management.tsx | 8 +- .../application/management/jobs_list/index.ts | 7 +- .../memory_usage/memory_tree_map/tree_map.tsx | 8 +- .../memory_usage/memory_usage_page.tsx | 6 +- .../model_management/expanded_row.tsx | 20 +-- .../model_management/models_list.tsx | 4 +- .../components/notifications_list.tsx | 8 +- .../anomaly_detection_panel.tsx | 7 +- .../anomaly_detection_panel/utils.ts | 12 +- .../overview/components/content.tsx | 4 +- .../routing/routes/memory_usage.tsx | 11 +- .../application/routing/routes/overview.tsx | 9 ++ .../anomaly_charts_embeddable_factory.test.ts | 2 +- .../anomaly_charts_embeddable_factory.ts | 5 +- .../anomaly_charts_setup_flyout.tsx | 3 +- ...omaly_swimlane_embeddable_factory.test.tsx | 2 +- .../anomaly_swimlane_embeddable_factory.ts | 5 +- .../anomaly_swimlane_setup_flyout.tsx | 3 +- .../common/resolve_job_selection.tsx | 5 +- x-pack/plugins/ml/public/embeddables/index.ts | 14 +- .../job_creation/common/create_flyout.tsx | 3 +- .../job_creation/lens/show_flyout.tsx | 4 +- .../job_creation/map/show_flyout.tsx | 13 +- x-pack/plugins/ml/public/plugin.ts | 31 +++-- .../register_search_links.ts | 4 +- .../search_deep_links.ts | 10 +- .../edit_anomaly_charts_panel_action.tsx | 4 +- .../ui_actions/edit_swimlane_panel_action.tsx | 9 +- x-pack/plugins/ml/public/ui_actions/index.ts | 15 +-- .../ui_actions/open_vis_in_ml_action.tsx | 22 +-- x-pack/plugins/ml/server/config_schema.ts | 4 +- x-pack/plugins/ml/server/index.ts | 8 +- .../server/lib/alerts/register_ml_alerts.ts | 2 +- .../lib/capabilities/capabilities_switcher.ts | 2 +- .../plugins/ml/server/lib/register_cases.ts | 2 +- .../lib/register_sample_data_set_links.ts | 2 +- .../data_frame_analytics/analytics_manager.ts | 2 +- .../models/model_management/memory_usage.ts | 2 +- .../notifications_service_provider.ts | 2 +- x-pack/plugins/ml/server/plugin.ts | 26 ++-- .../ml/server/routes/data_frame_analytics.ts | 4 +- .../ml/server/routes/trained_models.ts | 9 +- x-pack/plugins/ml/server/types.ts | 3 +- 76 files changed, 398 insertions(+), 378 deletions(-) delete mode 100644 x-pack/plugins/ml/public/application/contexts/kibana/use_is_serverless.ts create mode 100644 x-pack/plugins/ml/public/application/contexts/ml/serverless_context.tsx diff --git a/test/plugin_functional/test_suites/core_plugins/rendering.ts b/test/plugin_functional/test_suites/core_plugins/rendering.ts index f3f6d8b8ac4e9..f47b019176eed 100644 --- a/test/plugin_functional/test_suites/core_plugins/rendering.ts +++ b/test/plugin_functional/test_suites/core_plugins/rendering.ts @@ -258,6 +258,9 @@ export default function ({ getService }: PluginFunctionalProviderContext) { 'xpack.license_management.ui.enabled (boolean)', 'xpack.maps.preserveDrawingBuffer (boolean)', 'xpack.maps.showMapsInspectorAdapter (boolean)', + 'xpack.ml.ad.enabled (boolean)', + 'xpack.ml.dfa.enabled (boolean)', + 'xpack.ml.nlp.enabled (boolean)', 'xpack.osquery.actionEnabled (boolean)', 'xpack.remote_clusters.ui.enabled (boolean)', /** diff --git a/x-pack/packages/ml/date_picker/src/components/full_time_range_selector.tsx b/x-pack/packages/ml/date_picker/src/components/full_time_range_selector.tsx index fcf4622e87cc0..20e4ca43e233b 100644 --- a/x-pack/packages/ml/date_picker/src/components/full_time_range_selector.tsx +++ b/x-pack/packages/ml/date_picker/src/components/full_time_range_selector.tsx @@ -72,10 +72,6 @@ export interface FullTimeRangeSelectorProps { * @param value - The time field range response. */ apiPath?: SetFullTimeRangeApiPath; - /** - * Optional flag to disable the frozen data tier choice. - */ - hideFrozenDataTierChoice?: boolean; } /** @@ -96,13 +92,12 @@ export const FullTimeRangeSelector: FC = (props) => disabled, callback, apiPath, - hideFrozenDataTierChoice = false, } = props; const { http, notifications: { toasts }, - isServerless, + showFrozenDataTierChoice, } = useDatePickerContext(); // wrapper around setFullTimeRange to allow for the calling of the optional callBack prop @@ -114,9 +109,7 @@ export const FullTimeRangeSelector: FC = (props) => toasts, http, query, - isServerless || hideFrozenDataTierChoice - ? false - : frozenDataPreference === FROZEN_TIER_PREFERENCE.EXCLUDE, + showFrozenDataTierChoice ? frozenDataPreference === FROZEN_TIER_PREFERENCE.EXCLUDE : false, apiPath ); if (typeof callback === 'function' && fullTimeRange !== undefined) { @@ -138,8 +131,7 @@ export const FullTimeRangeSelector: FC = (props) => toasts, http, query, - isServerless, - hideFrozenDataTierChoice, + showFrozenDataTierChoice, frozenDataPreference, apiPath, callback, @@ -230,7 +222,7 @@ export const FullTimeRangeSelector: FC = (props) => /> - {isServerless || hideFrozenDataTierChoice ? null : ( + {showFrozenDataTierChoice ? ( = (props) => {popoverContent} - )} + ) : null} ); }; diff --git a/x-pack/packages/ml/date_picker/src/hooks/use_date_picker_context.tsx b/x-pack/packages/ml/date_picker/src/hooks/use_date_picker_context.tsx index 60b1c66f95984..49b090ef58983 100644 --- a/x-pack/packages/ml/date_picker/src/hooks/use_date_picker_context.tsx +++ b/x-pack/packages/ml/date_picker/src/hooks/use_date_picker_context.tsx @@ -45,9 +45,9 @@ export interface DatePickerDependencies { */ i18n: I18nStart; /** - * Optional flag to indicate whether kibana is running in serverless + * Optional flag to disable the frozen data tier choice. */ - isServerless?: boolean; + showFrozenDataTierChoice?: boolean; } /** diff --git a/x-pack/plugins/aiops/public/components/change_point_detection/change_point_detection_root.tsx b/x-pack/plugins/aiops/public/components/change_point_detection/change_point_detection_root.tsx index c18764e45797d..414e214fd1fe7 100644 --- a/x-pack/plugins/aiops/public/components/change_point_detection/change_point_detection_root.tsx +++ b/x-pack/plugins/aiops/public/components/change_point_detection/change_point_detection_root.tsx @@ -51,19 +51,19 @@ export interface ChangePointDetectionAppStateProps { /** App dependencies */ appDependencies: AiopsAppDependencies; /** Optional flag to indicate whether kibana is running in serverless */ - isServerless?: boolean; + showFrozenDataTierChoice?: boolean; } export const ChangePointDetectionAppState: FC = ({ dataView, savedSearch, appDependencies, - isServerless = false, + showFrozenDataTierChoice = true, }) => { const datePickerDeps: DatePickerDependencies = { ...pick(appDependencies, ['data', 'http', 'notifications', 'theme', 'uiSettings', 'i18n']), uiSettingsKeys: UI_SETTINGS, - isServerless, + showFrozenDataTierChoice, }; const warning = timeSeriesDataViewWarning(dataView, 'change_point_detection'); diff --git a/x-pack/plugins/aiops/public/components/log_categorization/log_categorization_app_state.tsx b/x-pack/plugins/aiops/public/components/log_categorization/log_categorization_app_state.tsx index 5ddf65d5b938d..c6e2600b7e4f4 100644 --- a/x-pack/plugins/aiops/public/components/log_categorization/log_categorization_app_state.tsx +++ b/x-pack/plugins/aiops/public/components/log_categorization/log_categorization_app_state.tsx @@ -36,14 +36,14 @@ export interface LogCategorizationAppStateProps { /** App dependencies */ appDependencies: AiopsAppDependencies; /** Optional flag to indicate whether kibana is running in serverless */ - isServerless?: boolean; + showFrozenDataTierChoice?: boolean; } export const LogCategorizationAppState: FC = ({ dataView, savedSearch, appDependencies, - isServerless = false, + showFrozenDataTierChoice = true, }) => { if (!dataView) return null; @@ -56,7 +56,7 @@ export const LogCategorizationAppState: FC = ({ const datePickerDeps: DatePickerDependencies = { ...pick(appDependencies, ['data', 'http', 'notifications', 'theme', 'uiSettings', 'i18n']), uiSettingsKeys: UI_SETTINGS, - isServerless, + showFrozenDataTierChoice, }; return ( diff --git a/x-pack/plugins/aiops/public/components/log_rate_analysis/log_rate_analysis_app_state.tsx b/x-pack/plugins/aiops/public/components/log_rate_analysis/log_rate_analysis_app_state.tsx index 0a41900feb9fb..daa717b4fd410 100644 --- a/x-pack/plugins/aiops/public/components/log_rate_analysis/log_rate_analysis_app_state.tsx +++ b/x-pack/plugins/aiops/public/components/log_rate_analysis/log_rate_analysis_app_state.tsx @@ -41,7 +41,7 @@ export interface LogRateAnalysisAppStateProps { /** Option to make main histogram sticky */ stickyHistogram?: boolean; /** Optional flag to indicate whether kibana is running in serverless */ - isServerless?: boolean; + showFrozenDataTierChoice?: boolean; } export const LogRateAnalysisAppState: FC = ({ @@ -49,7 +49,7 @@ export const LogRateAnalysisAppState: FC = ({ savedSearch, appDependencies, stickyHistogram, - isServerless = false, + showFrozenDataTierChoice = true, }) => { if (!dataView) return null; @@ -62,7 +62,7 @@ export const LogRateAnalysisAppState: FC = ({ const datePickerDeps: DatePickerDependencies = { ...pick(appDependencies, ['data', 'http', 'notifications', 'theme', 'uiSettings', 'i18n']), uiSettingsKeys: UI_SETTINGS, - isServerless, + showFrozenDataTierChoice, }; return ( diff --git a/x-pack/plugins/aiops/public/components/log_rate_analysis/log_rate_analysis_content/log_rate_analysis_content_wrapper.tsx b/x-pack/plugins/aiops/public/components/log_rate_analysis/log_rate_analysis_content/log_rate_analysis_content_wrapper.tsx index b19e72e7c4b5a..806dc7f0e2cb2 100644 --- a/x-pack/plugins/aiops/public/components/log_rate_analysis/log_rate_analysis_content/log_rate_analysis_content_wrapper.tsx +++ b/x-pack/plugins/aiops/public/components/log_rate_analysis/log_rate_analysis_content/log_rate_analysis_content_wrapper.tsx @@ -58,7 +58,7 @@ export interface LogRateAnalysisContentWrapperProps { */ onAnalysisCompleted?: (d: LogRateAnalysisResultsData) => void; /** Optional flag to indicate whether kibana is running in serverless */ - isServerless?: boolean; + showFrozenDataTierChoice?: boolean; } export const LogRateAnalysisContentWrapper: FC = ({ @@ -72,7 +72,7 @@ export const LogRateAnalysisContentWrapper: FC { if (!dataView) return null; @@ -85,6 +85,7 @@ export const LogRateAnalysisContentWrapper: FC = ({ getAdditionalLinks, isServerless = false }) => { +export const IndexDataVisualizer: FC = ({ + getAdditionalLinks, + showFrozenDataTierChoice = true, +}) => { const coreStart = getCoreStart(); const { data, @@ -302,7 +305,7 @@ export const IndexDataVisualizer: FC = ({ getAdditionalLinks, isServerles const datePickerDeps: DatePickerDependencies = { ...pick(services, ['data', 'http', 'notifications', 'theme', 'uiSettings', 'i18n']), uiSettingsKeys: UI_SETTINGS, - isServerless, + showFrozenDataTierChoice, }; return ( diff --git a/x-pack/plugins/ml/common/constants/app.ts b/x-pack/plugins/ml/common/constants/app.ts index 00f6fa7a42d05..3c7aabbedea24 100644 --- a/x-pack/plugins/ml/common/constants/app.ts +++ b/x-pack/plugins/ml/common/constants/app.ts @@ -16,3 +16,23 @@ export const ML_APP_NAME = i18n.translate('xpack.ml.navMenu.mlAppNameText', { export const ML_APP_ROUTE = '/app/ml'; export const ML_INTERNAL_BASE_PATH = '/internal/ml'; export const ML_EXTERNAL_BASE_PATH = '/api/ml'; + +export type MlFeatures = Record<'ad' | 'dfa' | 'nlp', boolean>; + +export interface ConfigSchema { + ad?: { enabled: boolean }; + dfa?: { enabled: boolean }; + nlp?: { enabled: boolean }; +} + +export function initEnabledFeatures(enabledFeatures: MlFeatures, config: ConfigSchema) { + if (config.ad?.enabled !== undefined) { + enabledFeatures.ad = config.ad.enabled; + } + if (config.dfa?.enabled !== undefined) { + enabledFeatures.dfa = config.dfa.enabled; + } + if (config.nlp?.enabled !== undefined) { + enabledFeatures.nlp = config.nlp.enabled; + } +} diff --git a/x-pack/plugins/ml/public/application/aiops/change_point_detection.tsx b/x-pack/plugins/ml/public/application/aiops/change_point_detection.tsx index e0c1728d893a5..774c3ac6f9d2d 100644 --- a/x-pack/plugins/ml/public/application/aiops/change_point_detection.tsx +++ b/x-pack/plugins/ml/public/application/aiops/change_point_detection.tsx @@ -15,15 +15,16 @@ import { ChangePointDetection } from '@kbn/aiops-plugin/public'; import { useDataSource } from '../contexts/ml/data_source_context'; import { useFieldStatsTrigger, FieldStatsFlyoutProvider } from '../components/field_stats_flyout'; -import { useMlKibana, useIsServerless } from '../contexts/kibana'; +import { useMlKibana } from '../contexts/kibana'; import { HelpMenu } from '../components/help_menu'; import { TechnicalPreviewBadge } from '../components/technical_preview_badge'; import { MlPageHeader } from '../components/page_header'; +import { useEnabledFeatures } from '../contexts/ml/serverless_context'; export const ChangePointDetectionPage: FC = () => { const { services } = useMlKibana(); - const isServerless = useIsServerless(); + const { showNodeInfo } = useEnabledFeatures(); const { selectedDataView: dataView, selectedSavedSearch: savedSearch } = useDataSource(); @@ -46,7 +47,7 @@ export const ChangePointDetectionPage: FC = () => { { const { services } = useMlKibana(); - const isServerless = useIsServerless(); + const { showNodeInfo } = useEnabledFeatures(); const { selectedDataView: dataView, selectedSavedSearch: savedSearch } = useDataSource(); @@ -41,7 +42,7 @@ export const LogCategorizationPage: FC = () => { { const { services } = useMlKibana(); - const isServerless = useIsServerless(); + const { showNodeInfo } = useEnabledFeatures(); const { selectedDataView: dataView, selectedSavedSearch: savedSearch } = useDataSource(); @@ -44,7 +45,7 @@ export const LogRateAnalysisPage: FC = () => { stickyHistogram={false} dataView={dataView} savedSearch={savedSearch} - isServerless={isServerless} + showFrozenDataTierChoice={showNodeInfo} appDependencies={pick(services, [ 'application', 'data', diff --git a/x-pack/plugins/ml/public/application/app.tsx b/x-pack/plugins/ml/public/application/app.tsx index 5acc519f242a7..e403222815b9a 100644 --- a/x-pack/plugins/ml/public/application/app.tsx +++ b/x-pack/plugins/ml/public/application/app.tsx @@ -19,6 +19,7 @@ import { KibanaContextProvider, KibanaThemeProvider } from '@kbn/kibana-react-pl import { StorageContextProvider } from '@kbn/ml-local-storage'; import useLifecycles from 'react-use/lib/useLifecycles'; import useObservable from 'react-use/lib/useObservable'; +import type { MlFeatures } from '../../common/constants/app'; import { MlLicense } from '../../common/license'; import { MlCapabilitiesService } from './capabilities/check_capabilities'; import { ML_STORAGE_KEYS } from '../../common/types/storage'; @@ -30,6 +31,7 @@ import { MlRouter } from './routing'; import { mlApiServicesProvider } from './services/ml_api_service'; import { HttpService } from './services/http_service'; import type { PageDependencies } from './routing/router'; +import { EnabledFeaturesContextProvider } from './contexts/ml'; export type MlDependencies = Omit< MlSetupDependencies, @@ -42,6 +44,7 @@ interface AppProps { deps: MlDependencies; appMountParams: AppMountParameters; isServerless: boolean; + mlFeatures: MlFeatures; } const localStorage = new Storage(window.localStorage); @@ -49,11 +52,7 @@ const localStorage = new Storage(window.localStorage); /** * Provides global services available across the entire ML app. */ -export function getMlGlobalServices( - httpStart: HttpStart, - isServerless: boolean, - usageCollection?: UsageCollectionSetup -) { +export function getMlGlobalServices(httpStart: HttpStart, usageCollection?: UsageCollectionSetup) { const httpService = new HttpService(httpStart); const mlApiServices = mlApiServicesProvider(httpService); @@ -63,7 +62,6 @@ export function getMlGlobalServices( mlUsageCollection: mlUsageCollectionProvider(usageCollection), mlCapabilities: new MlCapabilitiesService(mlApiServices), mlLicense: new MlLicense(), - isServerless, }; } @@ -73,7 +71,7 @@ export interface MlServicesContext { export type MlGlobalServices = ReturnType; -const App: FC = ({ coreStart, deps, appMountParams, isServerless }) => { +const App: FC = ({ coreStart, deps, appMountParams, isServerless, mlFeatures }) => { const pageDeps: PageDependencies = { history: appMountParams.history, setHeaderActionMenu: appMountParams.setHeaderActionMenu, @@ -106,9 +104,9 @@ const App: FC = ({ coreStart, deps, appMountParams, isServerless }) => contentManagement: deps.contentManagement, presentationUtil: deps.presentationUtil, ...coreStart, - mlServices: getMlGlobalServices(coreStart.http, isServerless, deps.usageCollection), + mlServices: getMlGlobalServices(coreStart.http, deps.usageCollection), }; - }, [deps, coreStart, isServerless]); + }, [deps, coreStart]); useLifecycles( function setupLicenseOnMount() { @@ -132,7 +130,7 @@ const App: FC = ({ coreStart, deps, appMountParams, isServerless }) => const datePickerDeps: DatePickerDependencies = { ...pick(services, ['data', 'http', 'notifications', 'theme', 'uiSettings', 'i18n']), uiSettingsKeys: UI_SETTINGS, - isServerless, + showFrozenDataTierChoice: !isServerless, }; const I18nContext = coreStart.i18n.Context; @@ -146,7 +144,9 @@ const App: FC = ({ coreStart, deps, appMountParams, isServerless }) => - + + + @@ -160,7 +160,8 @@ export const renderApp = ( coreStart: CoreStart, deps: MlDependencies, appMountParams: AppMountParameters, - isServerless: boolean + isServerless: boolean, + mlFeatures: MlFeatures ) => { setDependencyCache({ timefilter: deps.data.query.timefilter, @@ -194,6 +195,7 @@ export const renderApp = ( deps={deps} appMountParams={appMountParams} isServerless={isServerless} + mlFeatures={mlFeatures} />, appMountParams.element ); diff --git a/x-pack/plugins/ml/public/application/components/import_export_jobs/export_jobs_flyout/export_jobs_flyout.tsx b/x-pack/plugins/ml/public/application/components/import_export_jobs/export_jobs_flyout/export_jobs_flyout.tsx index 5bf0e73b2cee1..396f2d000290c 100644 --- a/x-pack/plugins/ml/public/application/components/import_export_jobs/export_jobs_flyout/export_jobs_flyout.tsx +++ b/x-pack/plugins/ml/public/application/components/import_export_jobs/export_jobs_flyout/export_jobs_flyout.tsx @@ -32,7 +32,7 @@ import { JobsExportService } from './jobs_export_service'; import type { JobDependencies } from './jobs_export_service'; import { toastNotificationServiceProvider } from '../../../services/toast_notification_service'; import type { JobType } from '../../../../../common/types/saved_objects'; -import { usePermissionCheck } from '../../../capabilities/check_capabilities'; +import { useEnabledFeatures } from '../../../contexts/ml'; interface Props { isDisabled: boolean; @@ -68,7 +68,7 @@ export const ExportJobsFlyout: FC = ({ isDisabled, currentTab }) => { () => toastNotificationServiceProvider(toasts), [toasts] ); - const [isADEnabled, isDFAEnabled] = usePermissionCheck(['isADEnabled', 'isDFAEnabled']); + const { isADEnabled, isDFAEnabled } = useEnabledFeatures(); const [jobDependencies, setJobDependencies] = useState([]); const [selectedJobDependencies, setSelectedJobDependencies] = useState([]); diff --git a/x-pack/plugins/ml/public/application/components/import_export_jobs/import_jobs_flyout/import_jobs_flyout.tsx b/x-pack/plugins/ml/public/application/components/import_export_jobs/import_jobs_flyout/import_jobs_flyout.tsx index 61e6df17676cb..d6f616bed93ef 100644 --- a/x-pack/plugins/ml/public/application/components/import_export_jobs/import_jobs_flyout/import_jobs_flyout.tsx +++ b/x-pack/plugins/ml/public/application/components/import_export_jobs/import_jobs_flyout/import_jobs_flyout.tsx @@ -40,7 +40,7 @@ import { toastNotificationServiceProvider } from '../../../services/toast_notifi import { JobImportService } from './jobs_import_service'; import { useValidateIds } from './validate'; import type { ImportedAdJob, JobIdObject, SkippedJobs } from './jobs_import_service'; -import { usePermissionCheck } from '../../../capabilities/check_capabilities'; +import { useEnabledFeatures } from '../../../contexts/ml'; interface Props { isDisabled: boolean; @@ -82,7 +82,7 @@ export const ImportJobsFlyout: FC = ({ isDisabled }) => { () => toastNotificationServiceProvider(toasts), [toasts] ); - const [isADEnabled, isDFAEnabled] = usePermissionCheck(['isADEnabled', 'isDFAEnabled']); + const { isADEnabled, isDFAEnabled } = useEnabledFeatures(); const [validateIds] = useValidateIds( jobType, diff --git a/x-pack/plugins/ml/public/application/components/job_messages/job_messages.tsx b/x-pack/plugins/ml/public/application/components/job_messages/job_messages.tsx index 20faeaf0bdfd2..c5a7826ac0ee9 100644 --- a/x-pack/plugins/ml/public/application/components/job_messages/job_messages.tsx +++ b/x-pack/plugins/ml/public/application/components/job_messages/job_messages.tsx @@ -25,7 +25,7 @@ import { JobMessage } from '../../../../common/types/audit_message'; import { blurButtonOnClick } from '../../util/component_utils'; import { JobIcon } from '../job_message_icon'; -import { useIsServerless } from '../../contexts/kibana'; +import { useEnabledFeatures } from '../../contexts/ml'; interface JobMessagesProps { messages: JobMessage[]; @@ -46,7 +46,7 @@ export const JobMessages: FC = ({ refreshMessage, actionHandler, }) => { - const isServerless = useIsServerless(); + const { showNodeInfo } = useEnabledFeatures(); const columns: Array> = useMemo(() => { const cols = [ { @@ -90,7 +90,7 @@ export const JobMessages: FC = ({ }, ]; - if (isServerless === false) { + if (showNodeInfo) { cols.splice(2, 0, { field: 'node_name', name: i18n.translate('xpack.ml.jobMessages.nodeLabel', { @@ -101,7 +101,7 @@ export const JobMessages: FC = ({ } return cols; - }, [isServerless, refreshMessage]); + }, [showNodeInfo, refreshMessage]); if (typeof actionHandler === 'function') { columns.push({ diff --git a/x-pack/plugins/ml/public/application/components/job_spaces_sync/sync_list.tsx b/x-pack/plugins/ml/public/application/components/job_spaces_sync/sync_list.tsx index 211dc1aa8c57b..550b93deb5e5e 100644 --- a/x-pack/plugins/ml/public/application/components/job_spaces_sync/sync_list.tsx +++ b/x-pack/plugins/ml/public/application/components/job_spaces_sync/sync_list.tsx @@ -18,10 +18,10 @@ import { } from '@elastic/eui'; import type { SyncSavedObjectResponse, SyncResult } from '../../../../common/types/saved_objects'; -import { usePermissionCheck } from '../../capabilities/check_capabilities'; +import { useEnabledFeatures } from '../../contexts/ml'; export const SyncList: FC<{ syncItems: SyncSavedObjectResponse | null }> = ({ syncItems }) => { - const [isADEnabled] = usePermissionCheck(['isADEnabled']); + const { isADEnabled } = useEnabledFeatures(); if (syncItems === null) { return null; diff --git a/x-pack/plugins/ml/public/application/components/jobs_awaiting_node_warning/jobs_awaiting_node_warning.tsx b/x-pack/plugins/ml/public/application/components/jobs_awaiting_node_warning/jobs_awaiting_node_warning.tsx index a85776aeacc82..336e707c32499 100644 --- a/x-pack/plugins/ml/public/application/components/jobs_awaiting_node_warning/jobs_awaiting_node_warning.tsx +++ b/x-pack/plugins/ml/public/application/components/jobs_awaiting_node_warning/jobs_awaiting_node_warning.tsx @@ -10,15 +10,15 @@ import React, { FC } from 'react'; import { EuiCallOut, EuiSpacer } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { lazyMlNodesAvailable } from '../../ml_nodes_check'; -import { useIsServerless } from '../../contexts/kibana'; +import { useEnabledFeatures } from '../../contexts/ml'; interface Props { jobCount: number; } export const JobsAwaitingNodeWarning: FC = ({ jobCount }) => { - const isServerless = useIsServerless(); - if (isServerless || lazyMlNodesAvailable() === false || jobCount === 0) { + const { showNodeInfo } = useEnabledFeatures(); + if (showNodeInfo === false || lazyMlNodesAvailable() === false || jobCount === 0) { return null; } diff --git a/x-pack/plugins/ml/public/application/components/jobs_awaiting_node_warning/new_job_awaiting_node.tsx b/x-pack/plugins/ml/public/application/components/jobs_awaiting_node_warning/new_job_awaiting_node.tsx index 5055efad210f0..e120a068d0ddd 100644 --- a/x-pack/plugins/ml/public/application/components/jobs_awaiting_node_warning/new_job_awaiting_node.tsx +++ b/x-pack/plugins/ml/public/application/components/jobs_awaiting_node_warning/new_job_awaiting_node.tsx @@ -11,30 +11,37 @@ import { EuiCallOut, EuiSpacer } from '@elastic/eui'; import { FormattedMessage } from '@kbn/i18n-react'; import { JobType } from '../../../../common/types/saved_objects'; import { lazyMlNodesAvailable } from '../../ml_nodes_check'; -import { useIsServerless } from '../../contexts/kibana'; +import { useEnabledFeatures } from '../../contexts/ml'; interface Props { jobType: JobType; } export const NewJobAwaitingNodeWarning: FC = () => { - const isServerless = useIsServerless(); + const { showNodeInfo } = useEnabledFeatures(); if (lazyMlNodesAvailable() === false) { return null; } - return isServerless ? ( + return showNodeInfo ? ( <> } color="primary" iconType="iInCircle" - /> + > +
+ +
+
) : ( @@ -42,20 +49,13 @@ export const NewJobAwaitingNodeWarning: FC = () => { } color="primary" iconType="iInCircle" - > -
- -
-
+ /> ); diff --git a/x-pack/plugins/ml/public/application/components/ml_entity_selector/ml_entity_selector.tsx b/x-pack/plugins/ml/public/application/components/ml_entity_selector/ml_entity_selector.tsx index 22c14ff7d72a9..a23daa689e447 100644 --- a/x-pack/plugins/ml/public/application/components/ml_entity_selector/ml_entity_selector.tsx +++ b/x-pack/plugins/ml/public/application/components/ml_entity_selector/ml_entity_selector.tsx @@ -17,7 +17,7 @@ import { countBy } from 'lodash'; import useMount from 'react-use/lib/useMount'; import { useMlApiContext } from '../../contexts/kibana'; import { useToastNotificationService } from '../../services/toast_notification_service'; -import { usePermissionCheck } from '../../capabilities/check_capabilities'; +import { useEnabledFeatures } from '../../contexts/ml'; type EntityType = 'anomaly_detector' | 'data_frame_analytics' | 'trained_models'; @@ -61,11 +61,7 @@ export const MlEntitySelector: FC = ({ onSelectionChange, handleDuplicates = false, }) => { - const [isADEnabled, isDFAEnabled, isNLPEnabled] = usePermissionCheck([ - 'isADEnabled', - 'isDFAEnabled', - 'isNLPEnabled', - ]); + const { isADEnabled, isDFAEnabled, isNLPEnabled } = useEnabledFeatures(); const { jobs: jobsApi, trainedModels, dataFrameAnalytics } = useMlApiContext(); const { displayErrorToast } = useToastNotificationService(); const visColorsBehindText = euiPaletteColorBlindBehindText(); diff --git a/x-pack/plugins/ml/public/application/components/ml_page/ml_page.tsx b/x-pack/plugins/ml/public/application/components/ml_page/ml_page.tsx index 3eb1deb83e7ae..982ee749cc834 100644 --- a/x-pack/plugins/ml/public/application/components/ml_page/ml_page.tsx +++ b/x-pack/plugins/ml/public/application/components/ml_page/ml_page.tsx @@ -20,7 +20,7 @@ import { DatePickerWrapper } from '@kbn/ml-date-picker'; import * as routes from '../../routing/routes'; import { MlPageWrapper } from '../../routing/ml_page_wrapper'; -import { useMlKibana, useNavigateToPath, useIsServerless } from '../../contexts/kibana'; +import { useMlKibana, useNavigateToPath } from '../../contexts/kibana'; import type { MlRoute, PageDependencies } from '../../routing/router'; import { useActiveRoute } from '../../routing/use_active_route'; import { useDocTitle } from '../../routing/use_doc_title'; @@ -28,6 +28,7 @@ import { useDocTitle } from '../../routing/use_doc_title'; import { MlPageHeaderRenderer } from '../page_header/page_header'; import { useSideNavItems } from './side_nav'; +import { useEnabledFeatures } from '../../contexts/ml'; const ML_APP_SELECTOR = '[data-test-subj="mlApp"]'; @@ -55,7 +56,7 @@ export const MlPage: FC<{ pageDeps: PageDependencies }> = React.memo(({ pageDeps mlServices: { httpService }, }, } = useMlKibana(); - const isServerless = useIsServerless(); + const { showMLNavMenu } = useEnabledFeatures(); const headerPortalNode = useMemo(() => createHtmlPortalNode(), []); const [isHeaderMounted, setIsHeaderMounted] = useState(false); @@ -127,7 +128,7 @@ export const MlPage: FC<{ pageDeps: PageDependencies }> = React.memo(({ pageDeps data-test-subj={'mlApp'} restrictWidth={false} solutionNav={ - isServerless === false + showMLNavMenu ? { name: i18n.translate('xpack.ml.plugin.title', { defaultMessage: 'Machine Learning', diff --git a/x-pack/plugins/ml/public/application/contexts/kibana/index.ts b/x-pack/plugins/ml/public/application/contexts/kibana/index.ts index afedbdef15b6c..e8696e9b49068 100644 --- a/x-pack/plugins/ml/public/application/contexts/kibana/index.ts +++ b/x-pack/plugins/ml/public/application/contexts/kibana/index.ts @@ -16,4 +16,3 @@ export { useMlApiContext } from './use_ml_api_context'; export { useFieldFormatter } from './use_field_formatter'; export { useCurrentThemeVars } from './use_current_theme'; export { useMlLicenseInfo } from './use_ml_license'; -export { useIsServerless } from './use_is_serverless'; diff --git a/x-pack/plugins/ml/public/application/contexts/kibana/use_is_serverless.ts b/x-pack/plugins/ml/public/application/contexts/kibana/use_is_serverless.ts deleted file mode 100644 index ca98dd44c17ce..0000000000000 --- a/x-pack/plugins/ml/public/application/contexts/kibana/use_is_serverless.ts +++ /dev/null @@ -1,12 +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 { useMlKibana } from './kibana_context'; - -export function useIsServerless(): boolean { - return useMlKibana().services.mlServices.isServerless; -} diff --git a/x-pack/plugins/ml/public/application/contexts/ml/index.ts b/x-pack/plugins/ml/public/application/contexts/ml/index.ts index eb51ff6186fe6..d5935bdc2ad97 100644 --- a/x-pack/plugins/ml/public/application/contexts/ml/index.ts +++ b/x-pack/plugins/ml/public/application/contexts/ml/index.ts @@ -6,3 +6,4 @@ */ export { DataSourceContextProvider, useDataSource } from './data_source_context'; +export { EnabledFeaturesContextProvider, useEnabledFeatures } from './serverless_context'; diff --git a/x-pack/plugins/ml/public/application/contexts/ml/serverless_context.tsx b/x-pack/plugins/ml/public/application/contexts/ml/serverless_context.tsx new file mode 100644 index 0000000000000..3662a817a03da --- /dev/null +++ b/x-pack/plugins/ml/public/application/contexts/ml/serverless_context.tsx @@ -0,0 +1,57 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import React, { createContext, FC, useContext, useMemo } from 'react'; +import type { MlFeatures } from '../../../../common/constants/app'; + +export interface EnabledFeatures { + showNodeInfo: boolean; + showMLNavMenu: boolean; + showLicenseInfo: boolean; + isADEnabled: boolean; + isDFAEnabled: boolean; + isNLPEnabled: boolean; +} +export const EnabledFeaturesContext = createContext({ + showNodeInfo: true, + showMLNavMenu: true, + showLicenseInfo: true, + isADEnabled: true, + isDFAEnabled: true, + isNLPEnabled: true, +}); + +interface Props { + isServerless: boolean; + mlFeatures: MlFeatures; +} + +export const EnabledFeaturesContextProvider: FC = ({ + children, + isServerless, + mlFeatures, +}) => { + const features: EnabledFeatures = { + showNodeInfo: !isServerless, + showMLNavMenu: !isServerless, + showLicenseInfo: !isServerless, + isADEnabled: mlFeatures.ad, + isDFAEnabled: mlFeatures.dfa, + isNLPEnabled: mlFeatures.nlp, + }; + + return ( + {children} + ); +}; + +export function useEnabledFeatures() { + const context = useContext(EnabledFeaturesContext); + return useMemo(() => { + return context; + }, [context]); +} diff --git a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/components/controls.tsx b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/components/controls.tsx index 1df5180934fc4..82695b39e0066 100644 --- a/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/components/controls.tsx +++ b/x-pack/plugins/ml/public/application/data_frame_analytics/pages/job_map/components/controls.tsx @@ -37,8 +37,8 @@ import { useNotifications, useNavigateToPath, useMlKibana, - useIsServerless, } from '../../../../contexts/kibana'; +import { useEnabledFeatures } from '../../../../contexts/ml'; import { getDataViewIdFromName } from '../../../../util/index_utils'; import { useNavigateToWizardWithClonedJob } from '../../analytics_management/components/action_clone/clone_action_name'; import { @@ -55,9 +55,9 @@ interface Props { refreshJobsCallback: () => void; } -function getListItemsFactory(isServerless: boolean) { +function getListItemsFactory(showLicenseInfo: boolean) { return (details: Record): EuiDescriptionListProps['listItems'] => { - if (isServerless) { + if (showLicenseInfo === false) { delete details.license_level; } @@ -94,8 +94,8 @@ export const Controls: FC = React.memo( const canCreateDataFrameAnalytics: boolean = usePermissionCheck('canCreateDataFrameAnalytics'); const canDeleteDataFrameAnalytics: boolean = usePermissionCheck('canDeleteDataFrameAnalytics'); const deleteAction = useDeleteAction(canDeleteDataFrameAnalytics); - const isServerless = useIsServerless(); - const getListItems = useMemo(() => getListItemsFactory(isServerless), [isServerless]); + const { showLicenseInfo } = useEnabledFeatures(); + const getListItems = useMemo(() => getListItemsFactory(showLicenseInfo), [showLicenseInfo]); const { closeDeleteJobCheckModal, diff --git a/x-pack/plugins/ml/public/application/datavisualizer/index_based/index_data_visualizer.tsx b/x-pack/plugins/ml/public/application/datavisualizer/index_based/index_data_visualizer.tsx index 3debbda8021c3..69c034738cf5f 100644 --- a/x-pack/plugins/ml/public/application/datavisualizer/index_based/index_data_visualizer.tsx +++ b/x-pack/plugins/ml/public/application/datavisualizer/index_based/index_data_visualizer.tsx @@ -15,13 +15,14 @@ import type { GetAdditionalLinksParams, } from '@kbn/data-visualizer-plugin/public'; import { useTimefilter } from '@kbn/ml-date-picker'; -import { useMlKibana, useMlLocator, useIsServerless } from '../../contexts/kibana'; +import { useMlKibana, useMlLocator } from '../../contexts/kibana'; import { HelpMenu } from '../../components/help_menu'; import { ML_PAGES } from '../../../../common/constants/locator'; import { isFullLicense } from '../../license'; import { mlNodesAvailable, getMlNodeCount } from '../../ml_nodes_check/check_ml_nodes'; import { checkPermission } from '../../capabilities/check_capabilities'; import { MlPageHeader } from '../../components/page_header'; +import { useEnabledFeatures } from '../../contexts/ml'; export const IndexDataVisualizerPage: FC = () => { useTimefilter({ timeRangeSelector: false, autoRefreshSelector: false }); @@ -37,7 +38,7 @@ export const IndexDataVisualizerPage: FC = () => { }, }, } = useMlKibana(); - const isServerless = useIsServerless(); + const { showNodeInfo } = useEnabledFeatures(); const mlLocator = useMlLocator()!; const mlFeaturesDisabled = !isFullLicense(); getMlNodeCount(); @@ -191,7 +192,7 @@ export const IndexDataVisualizerPage: FC = () => { ) : null} diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/jobs_list_view/jobs_list_view.js b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/jobs_list_view/jobs_list_view.js index dcecda5575d87..23d20bf6aa529 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/jobs_list_view/jobs_list_view.js +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/jobs_list_view/jobs_list_view.js @@ -137,7 +137,7 @@ export class JobsListView extends Component { loadFullJob(jobId) .then((job) => { const fullJobsList = { ...this.state.fullJobsList }; - if (this.props.isServerless) { + if (this.props.showNodeInfo === false) { job = removeNodeInfo(job); } fullJobsList[jobId] = job; @@ -318,7 +318,7 @@ export class JobsListView extends Component { const fullJobsList = {}; const jobsSummaryList = jobs.map((job) => { if (job.fullJob !== undefined) { - if (this.props.isServerless) { + if (this.props.showNodeInfo === false) { job.fullJob = removeNodeInfo(job.fullJob); } fullJobsList[job.id] = job.fullJob; @@ -417,7 +417,7 @@ export class JobsListView extends Component { diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/jobs_stats_bar/jobs_stats_bar.js b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/jobs_stats_bar/jobs_stats_bar.js index c8b2868267d80..bebb342b2939b 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/components/jobs_stats_bar/jobs_stats_bar.js +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/components/jobs_stats_bar/jobs_stats_bar.js @@ -12,11 +12,9 @@ import PropTypes from 'prop-types'; import React from 'react'; import { i18n } from '@kbn/i18n'; -function createJobStats(jobsSummaryList, isServerless) { - const displayNodeInfo = isServerless === false; - +function createJobStats(jobsSummaryList, showNodeInfo) { const jobStats = { - ...(displayNodeInfo + ...(showNodeInfo ? { activeNodes: { label: i18n.translate('xpack.ml.jobsList.statsBar.activeMLNodesLabel', { @@ -100,20 +98,20 @@ function createJobStats(jobsSummaryList, isServerless) { jobStats.failed.show = false; } - if (displayNodeInfo) { + if (showNodeInfo) { jobStats.activeNodes.value = Object.keys(mlNodes).length; } return jobStats; } -export const JobStatsBar = ({ jobsSummaryList, isServerless }) => { - const jobStats = createJobStats(jobsSummaryList, isServerless); +export const JobStatsBar = ({ jobsSummaryList, showNodeInfo }) => { + const jobStats = createJobStats(jobsSummaryList, showNodeInfo); return ; }; JobStatsBar.propTypes = { jobsSummaryList: PropTypes.array.isRequired, - isServerless: PropTypes.bool.isRequired, + showNodeInfo: PropTypes.bool.isRequired, }; diff --git a/x-pack/plugins/ml/public/application/jobs/jobs_list/jobs.tsx b/x-pack/plugins/ml/public/application/jobs/jobs_list/jobs.tsx index f413b97cb3602..a34ed51eab0ad 100644 --- a/x-pack/plugins/ml/public/application/jobs/jobs_list/jobs.tsx +++ b/x-pack/plugins/ml/public/application/jobs/jobs_list/jobs.tsx @@ -12,10 +12,11 @@ import { JobsListView } from './components/jobs_list_view'; import { ML_PAGES } from '../../../../common/constants/locator'; import { ListingPageUrlState } from '../../../../common/types/common'; import { HelpMenu } from '../../components/help_menu'; -import { useIsServerless, useMlKibana } from '../../contexts/kibana'; +import { useMlKibana } from '../../contexts/kibana'; import { MlPageHeader } from '../../components/page_header'; import { HeaderMenuPortal } from '../../components/header_menu_portal'; import { JobsActionMenu } from '../components/jobs_action_menu'; +import { useEnabledFeatures } from '../../contexts/ml'; interface PageUrlState { pageKey: typeof ML_PAGES.ANOMALY_DETECTION_JOBS_MANAGE; @@ -42,7 +43,8 @@ export const JobsPage: FC = ({ isMlEnabledInSpace, lastRefresh }) const { services: { docLinks }, } = useMlKibana(); - const isServerless = useIsServerless(); + + const { showNodeInfo } = useEnabledFeatures(); const helpLink = docLinks.links.ml.anomalyDetection; return ( <> @@ -57,7 +59,7 @@ export const JobsPage: FC = ({ isMlEnabledInSpace, lastRefresh }) lastRefresh={lastRefresh} jobsViewState={pageState} onJobsViewStateUpdate={setPageState} - isServerless={isServerless} + showNodeInfo={showNodeInfo} /> diff --git a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/time_range_step/time_range.tsx b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/time_range_step/time_range.tsx index d9fa9e542c0c5..d93eb690c31d9 100644 --- a/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/time_range_step/time_range.tsx +++ b/x-pack/plugins/ml/public/application/jobs/new_job/pages/components/time_range_step/time_range.tsx @@ -22,7 +22,7 @@ import { EventRateChart } from '../charts/event_rate_chart'; import { LineChartPoint } from '../../../common/chart_loader'; import { JOB_TYPE } from '../../../../../../../common/constants/new_job'; import { TimeRangePicker, TimeRange } from '../../../common/components'; -import { useMlKibana, useIsServerless } from '../../../../../contexts/kibana'; +import { useMlKibana } from '../../../../../contexts/kibana'; import { ML_FROZEN_TIER_PREFERENCE, type MlStorageKey, @@ -33,7 +33,6 @@ export const TimeRangeStep: FC = ({ setCurrentStep, isCurrentStep }) const timefilter = useTimefilter(); const { services } = useMlKibana(); const dataSourceContext = useDataSource(); - const isServerless = useIsServerless(); const { jobCreator, jobCreatorUpdate, jobCreatorUpdated, chartLoader, chartInterval } = useContext(JobCreatorContext); @@ -138,7 +137,6 @@ export const TimeRangeStep: FC = ({ setCurrentStep, isCurrentStep }) callback={fullTimeRangeCallback} timefilter={timefilter} apiPath={`${ML_INTERNAL_BASE_PATH}/fields_service/time_field_range`} - hideFrozenDataTierChoice={isServerless} /> diff --git a/x-pack/plugins/ml/public/application/management/index.ts b/x-pack/plugins/ml/public/application/management/index.ts index dea3ba6cd8afa..7f8030f4e7ddb 100644 --- a/x-pack/plugins/ml/public/application/management/index.ts +++ b/x-pack/plugins/ml/public/application/management/index.ts @@ -11,13 +11,15 @@ import type { CoreSetup } from '@kbn/core/public'; import type { ManagementSetup } from '@kbn/management-plugin/public'; import type { UsageCollectionSetup } from '@kbn/usage-collection-plugin/public'; import type { ManagementAppMountParams } from '@kbn/management-plugin/public'; +import type { MlFeatures } from '../../../common/constants/app'; import type { MlStartDependencies } from '../../plugin'; export function registerManagementSection( management: ManagementSetup, core: CoreSetup, deps: { usageCollection?: UsageCollectionSetup }, - isServerless: boolean + isServerless: boolean, + mlFeatures: MlFeatures ) { return management.sections.section.insightsAndAlerting.registerApp({ id: 'jobsListLink', @@ -27,7 +29,7 @@ export function registerManagementSection( order: 4, async mount(params: ManagementAppMountParams) { const { mountApp } = await import('./jobs_list'); - return mountApp(core, params, deps, isServerless); + return mountApp(core, params, deps, isServerless, mlFeatures); }, }); } diff --git a/x-pack/plugins/ml/public/application/management/jobs_list/components/jobs_list_page/jobs_list_page.tsx b/x-pack/plugins/ml/public/application/management/jobs_list/components/jobs_list_page/jobs_list_page.tsx index 2cf92278cfa63..1627fbc13e497 100644 --- a/x-pack/plugins/ml/public/application/management/jobs_list/components/jobs_list_page/jobs_list_page.tsx +++ b/x-pack/plugins/ml/public/application/management/jobs_list/components/jobs_list_page/jobs_list_page.tsx @@ -30,7 +30,8 @@ import { import type { SharePluginStart } from '@kbn/share-plugin/public'; import type { SpacesContextProps, SpacesPluginStart } from '@kbn/spaces-plugin/public'; import type { FieldFormatsStart } from '@kbn/field-formats-plugin/public'; -import { PLUGIN_ID } from '../../../../../../common/constants/app'; +import { EnabledFeaturesContextProvider } from '../../../../contexts/ml'; +import { type MlFeatures, PLUGIN_ID } from '../../../../../../common/constants/app'; import { checkGetManagementMlJobsResolver } from '../../../../capabilities/check_capabilities'; @@ -46,7 +47,7 @@ import { DocsLink } from './docs_link'; const getEmptyFunctionComponent: React.FC = ({ children }) => <>{children}; -export const JobsListPage: FC<{ +interface Props { coreStart: CoreStart; share: SharePluginStart; history: ManagementAppMountParams['history']; @@ -55,7 +56,10 @@ export const JobsListPage: FC<{ usageCollection?: UsageCollectionSetup; fieldFormats: FieldFormatsStart; isServerless: boolean; -}> = ({ + mlFeatures: MlFeatures; +} + +export const JobsListPage: FC = ({ coreStart, share, history, @@ -64,6 +68,7 @@ export const JobsListPage: FC<{ usageCollection, fieldFormats, isServerless, + mlFeatures, }) => { const [initialized, setInitialized] = useState(false); const [accessDenied, setAccessDenied] = useState(false); @@ -74,8 +79,8 @@ export const JobsListPage: FC<{ const theme$ = coreStart.theme.theme$; const mlServices = useMemo( - () => getMlGlobalServices(coreStart.http, isServerless, usageCollection), - [coreStart.http, isServerless, usageCollection] + () => getMlGlobalServices(coreStart.http, usageCollection), + [coreStart.http, usageCollection] ); const check = async () => { @@ -134,62 +139,64 @@ export const JobsListPage: FC<{ }} > - - - } - description={ - - } - rightSideItems={[]} - bottomBorder - paddingSize={'none'} - /> - - - - - - - <> - setShowSyncFlyout(true)} - data-test-subj="mlStackMgmtSyncButton" - > - {i18n.translate('xpack.ml.management.jobsList.syncFlyoutButton', { - defaultMessage: 'Synchronize saved objects', - })} - - {showSyncFlyout && } - - - - - + + + } + description={ + - - - - - - - - + } + rightSideItems={[]} + bottomBorder + paddingSize={'none'} + /> + + + + + + + <> + setShowSyncFlyout(true)} + data-test-subj="mlStackMgmtSyncButton" + > + {i18n.translate('xpack.ml.management.jobsList.syncFlyoutButton', { + defaultMessage: 'Synchronize saved objects', + })} + + {showSyncFlyout && } + + + + + + + + + + + + + + diff --git a/x-pack/plugins/ml/public/application/management/jobs_list/components/jobs_list_page/space_management/space_management.tsx b/x-pack/plugins/ml/public/application/management/jobs_list/components/jobs_list_page/space_management/space_management.tsx index bb21b971a8c12..afd59431e3734 100644 --- a/x-pack/plugins/ml/public/application/management/jobs_list/components/jobs_list_page/space_management/space_management.tsx +++ b/x-pack/plugins/ml/public/application/management/jobs_list/components/jobs_list_page/space_management/space_management.tsx @@ -21,7 +21,7 @@ import { import type { SpacesPluginStart } from '@kbn/spaces-plugin/public'; import { useTableState } from '@kbn/ml-in-memory-table'; -import { usePermissionCheck } from '../../../../../capabilities/check_capabilities'; +import { useEnabledFeatures } from '../../../../../contexts/ml'; import type { JobType, MlSavedObjectType } from '../../../../../../../common/types/saved_objects'; import type { ManagementListResponse, @@ -46,11 +46,7 @@ export const SpaceManagement: FC = ({ spacesApi, setCurrentTab }) => { const [filters, setFilters] = useState(); const [isLoading, setIsLoading] = useState(false); - const [isADEnabled, isDFAEnabled, isNLPEnabled] = usePermissionCheck([ - 'isADEnabled', - 'isDFAEnabled', - 'isNLPEnabled', - ]); + const { isADEnabled, isDFAEnabled, isNLPEnabled } = useEnabledFeatures(); const { onTableChange, pagination, sorting, setPageIndex } = useTableState( items ?? [], diff --git a/x-pack/plugins/ml/public/application/management/jobs_list/index.ts b/x-pack/plugins/ml/public/application/management/jobs_list/index.ts index 2e512e2d708bf..2c4c3bef4e1c5 100644 --- a/x-pack/plugins/ml/public/application/management/jobs_list/index.ts +++ b/x-pack/plugins/ml/public/application/management/jobs_list/index.ts @@ -14,6 +14,7 @@ import type { ManagementAppMountParams } from '@kbn/management-plugin/public'; import type { SharePluginStart } from '@kbn/share-plugin/public'; import type { SpacesPluginStart } from '@kbn/spaces-plugin/public'; import type { FieldFormatsStart } from '@kbn/field-formats-plugin/public'; +import type { MlFeatures } from '../../../../common/constants/app'; import type { MlStartDependencies } from '../../../plugin'; import { JobsListPage } from './components'; import { getJobsListBreadcrumbs } from '../breadcrumbs'; @@ -26,6 +27,7 @@ const renderApp = ( data: DataPublicPluginStart, fieldFormats: FieldFormatsStart, isServerless: boolean, + mlFeatures: MlFeatures, spacesApi?: SpacesPluginStart, usageCollection?: UsageCollectionSetup ) => { @@ -39,6 +41,7 @@ const renderApp = ( usageCollection, fieldFormats, isServerless, + mlFeatures, }), element ); @@ -51,7 +54,8 @@ export async function mountApp( core: CoreSetup, params: ManagementAppMountParams, deps: { usageCollection?: UsageCollectionSetup }, - isServerless: boolean + isServerless: boolean, + mlFeatures: MlFeatures ) { const [coreStart, pluginsStart] = await core.getStartServices(); @@ -64,6 +68,7 @@ export async function mountApp( pluginsStart.data, pluginsStart.fieldFormats, isServerless, + mlFeatures, pluginsStart.spaces, deps.usageCollection ); diff --git a/x-pack/plugins/ml/public/application/memory_usage/memory_tree_map/tree_map.tsx b/x-pack/plugins/ml/public/application/memory_usage/memory_tree_map/tree_map.tsx index f134b2e5fbb83..b236e2cb33a83 100644 --- a/x-pack/plugins/ml/public/application/memory_usage/memory_tree_map/tree_map.tsx +++ b/x-pack/plugins/ml/public/application/memory_usage/memory_tree_map/tree_map.tsx @@ -29,7 +29,7 @@ import { useFieldFormatter, useMlKibana } from '../../contexts/kibana'; import { useRefresh } from '../../routing/use_refresh'; import { getMemoryItemColor } from '../memory_item_colors'; import { useToastNotificationService } from '../../services/toast_notification_service'; -import { usePermissionCheck } from '../../capabilities/check_capabilities'; +import { useEnabledFeatures } from '../../contexts/ml'; interface Props { node?: string; @@ -73,11 +73,7 @@ export const JobMemoryTreeMap: FC = ({ node, type, height }) => { [isDarkTheme] ); - const [isADEnabled, isDFAEnabled, isNLPEnabled] = usePermissionCheck([ - 'isADEnabled', - 'isDFAEnabled', - 'isNLPEnabled', - ]); + const { isADEnabled, isDFAEnabled, isNLPEnabled } = useEnabledFeatures(); const bytesFormatter = useFieldFormatter(FIELD_FORMAT_IDS.BYTES); const { displayErrorToast } = useToastNotificationService(); diff --git a/x-pack/plugins/ml/public/application/memory_usage/memory_usage_page.tsx b/x-pack/plugins/ml/public/application/memory_usage/memory_usage_page.tsx index 249d9c959809d..5d03fb8315c53 100644 --- a/x-pack/plugins/ml/public/application/memory_usage/memory_usage_page.tsx +++ b/x-pack/plugins/ml/public/application/memory_usage/memory_usage_page.tsx @@ -13,7 +13,7 @@ import { NodesList } from './nodes_overview'; import { MlPageHeader } from '../components/page_header'; import { MemoryPage, JobMemoryTreeMap } from './memory_tree_map'; import { SavedObjectsWarning } from '../components/saved_objects_warning'; -import { useIsServerless } from '../contexts/kibana'; +import { useEnabledFeatures } from '../contexts/ml'; enum TAB { NODES, @@ -24,7 +24,7 @@ export const MemoryUsagePage: FC = () => { const [selectedTab, setSelectedTab] = useState(TAB.NODES); useTimefilter({ timeRangeSelector: false, autoRefreshSelector: true }); - const isServerless = useIsServerless(); + const { showNodeInfo } = useEnabledFeatures(); const refresh = useCallback(() => { mlTimefilterRefresh$.next({ @@ -47,7 +47,7 @@ export const MemoryUsagePage: FC = () => { - {isServerless === false ? ( + {showNodeInfo ? ( <> = ({ item }) => { const formatToListItems = useListItemsFormatter(); - const isServerless = useIsServerless(); + const { showLicenseInfo, showNodeInfo } = useEnabledFeatures(); const { inference_config: inferenceConfig, @@ -151,17 +151,17 @@ export const ExpandedRow: FC = ({ item }) => { estimated_operations, estimated_heap_memory_usage_bytes, default_field_map, - ...(isServerless ? {} : { license_level }), + ...(showLicenseInfo ? { license_level } : {}), }; }, [ - default_field_map, description, - estimated_heap_memory_usage_bytes, - estimated_operations, - license_level, tags, version, - isServerless, + estimated_operations, + estimated_heap_memory_usage_bytes, + default_field_map, + showLicenseInfo, + license_level, ]); const deploymentStatItems: AllocatedModel[] = useMemo(() => { @@ -200,8 +200,8 @@ export const ExpandedRow: FC = ({ item }) => { }, [stats]); const hideColumns = useMemo(() => { - return isServerless ? ['model_id', 'node_name'] : ['model_id']; - }, [isServerless]); + return showNodeInfo ? ['model_id'] : ['model_id', 'node_name']; + }, [showNodeInfo]); const tabs = useMemo(() => { return [ diff --git a/x-pack/plugins/ml/public/application/model_management/models_list.tsx b/x-pack/plugins/ml/public/application/model_management/models_list.tsx index 1ce6fa18fbc3f..b959c1e234064 100644 --- a/x-pack/plugins/ml/public/application/model_management/models_list.tsx +++ b/x-pack/plugins/ml/public/application/model_management/models_list.tsx @@ -63,7 +63,7 @@ import { useRefresh } from '../routing/use_refresh'; import { SavedObjectsWarning } from '../components/saved_objects_warning'; import { TestTrainedModelFlyout } from './test_models'; import { AddInferencePipelineFlyout } from '../components/ml_inference'; -import { usePermissionCheck } from '../capabilities/check_capabilities'; +import { useEnabledFeatures } from '../contexts/ml'; type Stats = Omit; @@ -105,7 +105,7 @@ export const ModelsList: FC = ({ }, } = useMlKibana(); - const [isNLPEnabled] = usePermissionCheck(['isNLPEnabled']); + const { isNLPEnabled } = useEnabledFeatures(); useTimefilter({ timeRangeSelector: false, autoRefreshSelector: true }); diff --git a/x-pack/plugins/ml/public/application/notifications/components/notifications_list.tsx b/x-pack/plugins/ml/public/application/notifications/components/notifications_list.tsx index 5edd19f4d8119..850ce45fde123 100644 --- a/x-pack/plugins/ml/public/application/notifications/components/notifications_list.tsx +++ b/x-pack/plugins/ml/public/application/notifications/components/notifications_list.tsx @@ -40,7 +40,7 @@ import type { NotificationItem, } from '../../../../common/types/notifications'; import { useMlKibana } from '../../contexts/kibana'; -import { usePermissionCheck } from '../../capabilities/check_capabilities'; +import { useEnabledFeatures } from '../../contexts/ml'; const levelBadgeMap: Record = { [ML_NOTIFICATIONS_MESSAGE_LEVEL.ERROR]: 'danger', @@ -67,11 +67,7 @@ export const NotificationsList: FC = () => { }, } = useMlKibana(); - const [isADEnabled, isDFAEnabled, isNLPEnabled] = usePermissionCheck([ - 'isADEnabled', - 'isDFAEnabled', - 'isNLPEnabled', - ]); + const { isADEnabled, isDFAEnabled, isNLPEnabled } = useEnabledFeatures(); const { displayErrorToast } = useToastNotificationService(); diff --git a/x-pack/plugins/ml/public/application/overview/components/anomaly_detection_panel/anomaly_detection_panel.tsx b/x-pack/plugins/ml/public/application/overview/components/anomaly_detection_panel/anomaly_detection_panel.tsx index 9707515deb800..8cb97d75c9c3a 100644 --- a/x-pack/plugins/ml/public/application/overview/components/anomaly_detection_panel/anomaly_detection_panel.tsx +++ b/x-pack/plugins/ml/public/application/overview/components/anomaly_detection_panel/anomaly_detection_panel.tsx @@ -19,7 +19,7 @@ import { import { ML_PAGES } from '../../../../../common/constants/locator'; import { OverviewStatsBar } from '../../../components/collapsible_panel/collapsible_panel'; import { CollapsiblePanel } from '../../../components/collapsible_panel'; -import { useMlKibana, useMlLink, useIsServerless } from '../../../contexts/kibana'; +import { useMlKibana, useMlLink } from '../../../contexts/kibana'; import { AnomalyDetectionTable } from './table'; import { ml } from '../../../services/ml_api_service'; import { getGroupsFromJobs, getStatsBarData } from './utils'; @@ -31,6 +31,7 @@ import { AnomalyTimelineService } from '../../../services/anomaly_timeline_servi import type { OverallSwimlaneData } from '../../../explorer/explorer_utils'; import { AnomalyDetectionEmptyState } from '../../../jobs/jobs_list/components/anomaly_detection_empty_state'; import { overviewPanelDefaultState } from '../../overview_page'; +import { useEnabledFeatures } from '../../../contexts/ml'; export type GroupsDictionary = Dictionary; @@ -57,7 +58,7 @@ export const AnomalyDetectionPanel: FC = ({ anomalyTimelineService, setLa } = useMlKibana(); const { displayErrorToast } = useToastNotificationService(); - const isServerless = useIsServerless(); + const { showNodeInfo } = useEnabledFeatures(); const refresh = useRefresh(); @@ -92,7 +93,7 @@ export const AnomalyDetectionPanel: FC = ({ anomalyTimelineService, setLa return job; }); const { groups: jobsGroups, count } = getGroupsFromJobs(jobsSummaryList); - const stats = getStatsBarData(jobsSummaryList, isServerless); + const stats = getStatsBarData(jobsSummaryList, showNodeInfo); const statGroups = groupBy( Object.entries(stats) diff --git a/x-pack/plugins/ml/public/application/overview/components/anomaly_detection_panel/utils.ts b/x-pack/plugins/ml/public/application/overview/components/anomaly_detection_panel/utils.ts index 3e46b258c3a05..edc993f324bab 100644 --- a/x-pack/plugins/ml/public/application/overview/components/anomaly_detection_panel/utils.ts +++ b/x-pack/plugins/ml/public/application/overview/components/anomaly_detection_panel/utils.ts @@ -74,7 +74,7 @@ export function getGroupsFromJobs(jobs: MlSummaryJobs): { return { groups, count }; } -export function getStatsBarData(jobsList: MlSummaryJob[] | undefined, isServerless: boolean) { +export function getStatsBarData(jobsList: MlSummaryJob[] | undefined, showNodeInfo: boolean) { const jobStats = { total: { label: i18n.translate('xpack.ml.overviewJobsList.statsBar.totalJobsLabel', { @@ -108,9 +108,8 @@ export function getStatsBarData(jobsList: MlSummaryJob[] | undefined, isServerle show: false, group: 0, }, - ...(isServerless - ? {} - : { + ...(showNodeInfo + ? { activeNodes: { label: i18n.translate('xpack.ml.overviewJobsList.statsBar.activeMLNodesLabel', { defaultMessage: 'Active ML nodes', @@ -119,7 +118,8 @@ export function getStatsBarData(jobsList: MlSummaryJob[] | undefined, isServerle show: true, group: 1, }, - }), + } + : {}), activeDatafeeds: { label: i18n.translate('xpack.ml.jobsList.statsBar.activeDatafeedsLabel', { defaultMessage: 'Active datafeeds', @@ -166,7 +166,7 @@ export function getStatsBarData(jobsList: MlSummaryJob[] | undefined, isServerle jobStats.failed.show = false; } - if (isServerless === false) { + if (showNodeInfo) { jobStats.activeNodes!.value = Object.keys(mlNodes).length; } diff --git a/x-pack/plugins/ml/public/application/overview/components/content.tsx b/x-pack/plugins/ml/public/application/overview/components/content.tsx index 15998b9f58b93..1d0db5c6b9632 100644 --- a/x-pack/plugins/ml/public/application/overview/components/content.tsx +++ b/x-pack/plugins/ml/public/application/overview/components/content.tsx @@ -13,7 +13,7 @@ import { AnalyticsPanel } from './analytics_panel'; import { AnomalyTimelineService } from '../../services/anomaly_timeline_service'; import { mlResultsServiceProvider } from '../../services/results_service'; import { useMlKibana } from '../../contexts/kibana'; -import { usePermissionCheck } from '../../capabilities/check_capabilities'; +import { useEnabledFeatures } from '../../contexts/ml'; interface Props { createAnomalyDetectionJobDisabled: boolean; @@ -33,7 +33,7 @@ export const OverviewContent: FC = ({ }, } = useMlKibana(); - const [isADEnabled, isDFAEnabled] = usePermissionCheck(['isADEnabled', 'isDFAEnabled']); + const { isADEnabled, isDFAEnabled } = useEnabledFeatures(); const timefilter = useTimefilter(); diff --git a/x-pack/plugins/ml/public/application/routing/routes/memory_usage.tsx b/x-pack/plugins/ml/public/application/routing/routes/memory_usage.tsx index dce72c080e94f..c1a309736eece 100644 --- a/x-pack/plugins/ml/public/application/routing/routes/memory_usage.tsx +++ b/x-pack/plugins/ml/public/application/routing/routes/memory_usage.tsx @@ -36,16 +36,7 @@ export const nodesListRouteFactory = ( }); const PageWrapper: FC = () => { - const { context } = useRouteResolver( - 'full', - // only enabled in non-serverless mode - // if a serverless project ever contains all three features - // this check will have to be changed to an - // explicit isServerless check which will probably - // require a change in useRouteResolver - ['isADEnabled', 'isDFAEnabled', 'isNLPEnabled'], - basicResolvers() - ); + const { context } = useRouteResolver('full', [], basicResolvers()); return ( diff --git a/x-pack/plugins/ml/public/application/routing/routes/overview.tsx b/x-pack/plugins/ml/public/application/routing/routes/overview.tsx index 33346b0d0fe72..77242b9155715 100644 --- a/x-pack/plugins/ml/public/application/routing/routes/overview.tsx +++ b/x-pack/plugins/ml/public/application/routing/routes/overview.tsx @@ -11,6 +11,7 @@ import React, { FC, Suspense } from 'react'; import { Redirect } from 'react-router-dom'; import { ML_PAGES } from '../../../locator'; import type { NavigateToPath } from '../../contexts/kibana'; +import { useEnabledFeatures } from '../../contexts/ml/serverless_context'; import { getMlNodeCount } from '../../ml_nodes_check'; import { loadMlServerInfo } from '../../services/ml_server_info'; import { getBreadcrumbWithUrlForApp } from '../breadcrumbs'; @@ -67,5 +68,13 @@ export const appRootRouteFactory = (navigateToPath: NavigateToPath, basePath: st }); const Page: FC = () => { + const { isADEnabled, isDFAEnabled, isNLPEnabled } = useEnabledFeatures(); + if (isADEnabled === false && isDFAEnabled === false && isNLPEnabled === true) { + // if only NLP is enabled, redirect to the trained models page. + // in the search serverless project, the overview page is blank, so we + // need to redirect to the trained models page instead + return ; + } + return ; }; diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_charts/anomaly_charts_embeddable_factory.test.ts b/x-pack/plugins/ml/public/embeddables/anomaly_charts/anomaly_charts_embeddable_factory.test.ts index 4e1771c25d0ef..dd7408287cbf4 100644 --- a/x-pack/plugins/ml/public/embeddables/anomaly_charts/anomaly_charts_embeddable_factory.test.ts +++ b/x-pack/plugins/ml/public/embeddables/anomaly_charts/anomaly_charts_embeddable_factory.test.ts @@ -27,7 +27,7 @@ describe('AnomalyChartsEmbeddableFactory', () => { const [coreStart, pluginsStart] = await getStartServices(); // act - const factory = new AnomalyChartsEmbeddableFactory(getStartServices, false); + const factory = new AnomalyChartsEmbeddableFactory(getStartServices); await factory.create({ jobIds: ['test-job'], diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_charts/anomaly_charts_embeddable_factory.ts b/x-pack/plugins/ml/public/embeddables/anomaly_charts/anomaly_charts_embeddable_factory.ts index a6056e84a87be..e502d03bcd964 100644 --- a/x-pack/plugins/ml/public/embeddables/anomaly_charts/anomaly_charts_embeddable_factory.ts +++ b/x-pack/plugins/ml/public/embeddables/anomaly_charts/anomaly_charts_embeddable_factory.ts @@ -35,8 +35,7 @@ export class AnomalyChartsEmbeddableFactory ]; constructor( - private getStartServices: StartServicesAccessor, - private isServerless: boolean + private getStartServices: StartServicesAccessor ) {} public async isEditable() { @@ -62,7 +61,7 @@ export class AnomalyChartsEmbeddableFactory const { resolveEmbeddableAnomalyChartsUserInput } = await import( './anomaly_charts_setup_flyout' ); - return await resolveEmbeddableAnomalyChartsUserInput(coreStart, this.isServerless); + return await resolveEmbeddableAnomalyChartsUserInput(coreStart); } catch (e) { return Promise.reject(); } diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_charts/anomaly_charts_setup_flyout.tsx b/x-pack/plugins/ml/public/embeddables/anomaly_charts/anomaly_charts_setup_flyout.tsx index 13849c8e6064c..92aea068c5b15 100644 --- a/x-pack/plugins/ml/public/embeddables/anomaly_charts/anomaly_charts_setup_flyout.tsx +++ b/x-pack/plugins/ml/public/embeddables/anomaly_charts/anomaly_charts_setup_flyout.tsx @@ -19,7 +19,6 @@ import { mlApiServicesProvider } from '../../application/services/ml_api_service export async function resolveEmbeddableAnomalyChartsUserInput( coreStart: CoreStart, - isServerless: boolean, input?: AnomalyChartsEmbeddableInput ): Promise> { const { http, overlays, theme, i18n } = coreStart; @@ -28,7 +27,7 @@ export async function resolveEmbeddableAnomalyChartsUserInput( return new Promise(async (resolve, reject) => { try { - const { jobIds } = await resolveJobSelection(coreStart, isServerless, input?.jobIds); + const { jobIds } = await resolveJobSelection(coreStart, input?.jobIds); const title = input?.title ?? getDefaultExplorerChartsPanelTitle(jobIds); const { jobs } = await getJobs({ jobId: jobIds.join(',') }); const influencers = extractInfluencers(jobs); diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable_factory.test.tsx b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable_factory.test.tsx index 2b75202095e3f..cb759f6783b46 100644 --- a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable_factory.test.tsx +++ b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable_factory.test.tsx @@ -27,7 +27,7 @@ describe('AnomalySwimlaneEmbeddableFactory', () => { const [coreStart, pluginsStart] = await getStartServices(); // act - const factory = new AnomalySwimlaneEmbeddableFactory(getStartServices, false); + const factory = new AnomalySwimlaneEmbeddableFactory(getStartServices); await factory.create({ jobIds: ['test-job'], diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable_factory.ts b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable_factory.ts index 421d12193e56f..3e7f958ea778e 100644 --- a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable_factory.ts +++ b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_embeddable_factory.ts @@ -35,8 +35,7 @@ export class AnomalySwimlaneEmbeddableFactory ]; constructor( - private getStartServices: StartServicesAccessor, - private isServerless: boolean + private getStartServices: StartServicesAccessor ) {} public async isEditable() { @@ -60,7 +59,7 @@ export class AnomalySwimlaneEmbeddableFactory try { const { resolveAnomalySwimlaneUserInput } = await import('./anomaly_swimlane_setup_flyout'); - return await resolveAnomalySwimlaneUserInput(coreStart, this.isServerless); + return await resolveAnomalySwimlaneUserInput(coreStart); } catch (e) { return Promise.reject(); } diff --git a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_setup_flyout.tsx b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_setup_flyout.tsx index 2c0e6c5e2d963..dc2ca931cc805 100644 --- a/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_setup_flyout.tsx +++ b/x-pack/plugins/ml/public/embeddables/anomaly_swimlane/anomaly_swimlane_setup_flyout.tsx @@ -19,7 +19,6 @@ import { mlApiServicesProvider } from '../../application/services/ml_api_service export async function resolveAnomalySwimlaneUserInput( coreStart: CoreStart, - isServerless: boolean, input?: AnomalySwimlaneEmbeddableInput ): Promise> { const { http, overlays, theme, i18n } = coreStart; @@ -28,7 +27,7 @@ export async function resolveAnomalySwimlaneUserInput( return new Promise(async (resolve, reject) => { try { - const { jobIds } = await resolveJobSelection(coreStart, isServerless, input?.jobIds); + const { jobIds } = await resolveJobSelection(coreStart, input?.jobIds); const title = input?.title ?? getDefaultSwimlanePanelTitle(jobIds); const { jobs } = await getJobs({ jobId: jobIds.join(',') }); const influencers = extractInfluencers(jobs); diff --git a/x-pack/plugins/ml/public/embeddables/common/resolve_job_selection.tsx b/x-pack/plugins/ml/public/embeddables/common/resolve_job_selection.tsx index 3cd49afd8c361..00c4a02d4e929 100644 --- a/x-pack/plugins/ml/public/embeddables/common/resolve_job_selection.tsx +++ b/x-pack/plugins/ml/public/embeddables/common/resolve_job_selection.tsx @@ -26,7 +26,6 @@ import { JobSelectorFlyout } from './components/job_selector_flyout'; */ export async function resolveJobSelection( coreStart: CoreStart, - isServerless: boolean, selectedJobIds?: JobId[] ): Promise<{ jobIds: string[]; groups: Array<{ groupId: string; jobIds: string[] }> }> { const { @@ -70,9 +69,7 @@ export async function resolveJobSelection( const flyoutSession = coreStart.overlays.openFlyout( toMountPoint( - + { const { @@ -54,7 +53,7 @@ export function createFlyout( data, lens, dashboardService, - mlServices: getMlGlobalServices(http, isServerless), + mlServices: getMlGlobalServices(http), }} > { return createFlyout( LensLayerSelectionFlyout, @@ -30,7 +29,6 @@ export async function showLensVisToADJobFlyout( share, data, dashboardService, - isServerless, lens ); } diff --git a/x-pack/plugins/ml/public/embeddables/job_creation/map/show_flyout.tsx b/x-pack/plugins/ml/public/embeddables/job_creation/map/show_flyout.tsx index da2d8bb2e0d4c..5380513f1dc97 100644 --- a/x-pack/plugins/ml/public/embeddables/job_creation/map/show_flyout.tsx +++ b/x-pack/plugins/ml/public/embeddables/job_creation/map/show_flyout.tsx @@ -19,16 +19,7 @@ export async function showMapVisToADJobFlyout( coreStart: CoreStart, share: SharePluginStart, data: DataPublicPluginStart, - dashboardService: DashboardStart, - isServerless: boolean + dashboardService: DashboardStart ): Promise { - return createFlyout( - GeoJobFlyout, - embeddable, - coreStart, - share, - data, - dashboardService, - isServerless - ); + return createFlyout(GeoJobFlyout, embeddable, coreStart, share, data, dashboardService); } diff --git a/x-pack/plugins/ml/public/plugin.ts b/x-pack/plugins/ml/public/plugin.ts index 140ac875ed8f3..725bf422c58c6 100644 --- a/x-pack/plugins/ml/public/plugin.ts +++ b/x-pack/plugins/ml/public/plugin.ts @@ -58,7 +58,14 @@ import { MlLocatorDefinition, type MlLocator } from './locator'; import { setDependencyCache } from './application/util/dependency_cache'; import { registerHomeFeature } from './register_home_feature'; import { isFullLicense, isMlEnabled } from '../common/license'; -import { ML_APP_ROUTE, PLUGIN_ICON_SOLUTION, PLUGIN_ID } from '../common/constants/app'; +import { + initEnabledFeatures, + type MlFeatures, + ML_APP_ROUTE, + PLUGIN_ICON_SOLUTION, + PLUGIN_ID, + type ConfigSchema, +} from '../common/constants/app'; import type { MlCapabilities } from './shared'; export interface MlStartDependencies { @@ -113,9 +120,15 @@ export class MlPlugin implements Plugin { private sharedMlServices: MlSharedServices | undefined; private isServerless: boolean = false; + private enabledFeatures: MlFeatures = { + ad: true, + dfa: true, + nlp: true, + }; - constructor(private initializerContext: PluginInitializerContext) { + constructor(private initializerContext: PluginInitializerContext) { this.isServerless = initializerContext.env.packageInfo.buildFlavor === 'serverless'; + initEnabledFeatures(this.enabledFeatures, initializerContext.config.get()); } setup(core: MlCoreSetup, pluginsSetup: MlSetupDependencies) { @@ -164,7 +177,8 @@ export class MlPlugin implements Plugin { presentationUtil: pluginsStart.presentationUtil, }, params, - this.isServerless + this.isServerless, + this.enabledFeatures ); }, }); @@ -180,7 +194,8 @@ export class MlPlugin implements Plugin { { usageCollection: pluginsSetup.usageCollection, }, - this.isServerless + this.isServerless, + this.enabledFeatures ).enable(); } @@ -208,13 +223,13 @@ export class MlPlugin implements Plugin { registerMapExtension, registerCasesAttachments, } = await import('./register_helper'); - registerSearchLinks(this.appUpdater$, fullLicense, mlCapabilities, this.isServerless); + registerSearchLinks(this.appUpdater$, fullLicense, mlCapabilities, !this.isServerless); if (fullLicense) { - registerMlUiActions(pluginsSetup.uiActions, core, this.isServerless); + registerMlUiActions(pluginsSetup.uiActions, core); - if (mlCapabilities.isADEnabled) { - registerEmbeddables(pluginsSetup.embeddable, core, this.isServerless); + if (this.enabledFeatures.ad) { + registerEmbeddables(pluginsSetup.embeddable, core); if (pluginsSetup.cases) { registerCasesAttachments(pluginsSetup.cases, coreStart, pluginStart); diff --git a/x-pack/plugins/ml/public/register_helper/register_search_links/register_search_links.ts b/x-pack/plugins/ml/public/register_helper/register_search_links/register_search_links.ts index 6b7f10103b440..7e0a4dd593c64 100644 --- a/x-pack/plugins/ml/public/register_helper/register_search_links/register_search_links.ts +++ b/x-pack/plugins/ml/public/register_helper/register_search_links/register_search_links.ts @@ -16,7 +16,7 @@ export function registerSearchLinks( appUpdater: BehaviorSubject, isFullLicense: boolean, mlCapabilities: MlCapabilities, - isServerless: boolean + showMLNavMenu: boolean ) { appUpdater.next(() => ({ keywords: [ @@ -24,6 +24,6 @@ export function registerSearchLinks( defaultMessage: 'ML', }), ], - deepLinks: getDeepLinks(isFullLicense, mlCapabilities, isServerless), + deepLinks: getDeepLinks(isFullLicense, mlCapabilities, showMLNavMenu), })); } diff --git a/x-pack/plugins/ml/public/register_helper/register_search_links/search_deep_links.ts b/x-pack/plugins/ml/public/register_helper/register_search_links/search_deep_links.ts index 9b9642a8a982a..ca48b8a2a4075 100644 --- a/x-pack/plugins/ml/public/register_helper/register_search_links/search_deep_links.ts +++ b/x-pack/plugins/ml/public/register_helper/register_search_links/search_deep_links.ts @@ -15,13 +15,13 @@ import type { MlCapabilities } from '../../shared'; function createDeepLinks( mlCapabilities: MlCapabilities, isFullLicense: boolean, - isServerless: boolean + showMLNavMenu: boolean ) { function getNavStatus( visible: boolean, showInServerless: boolean = true ): AppNavLinkStatus | undefined { - if (isServerless) { + if (showMLNavMenu === false) { // in serverless the status needs to be "visible" rather than "default" // for the links to appear in the nav menu. return showInServerless && visible ? AppNavLinkStatus.visible : AppNavLinkStatus.hidden; @@ -145,7 +145,7 @@ function createDeepLinks( defaultMessage: 'Memory Usage', }), path: `/${ML_PAGES.MEMORY_USAGE}`, - navLinkStatus: getNavStatus(isFullLicense, false), + navLinkStatus: getNavStatus(isFullLicense, true), }; }, @@ -279,8 +279,8 @@ function createDeepLinks( export function getDeepLinks( isFullLicense: boolean, mlCapabilities: MlCapabilities, - isServerless: boolean + showMLNavMenu: boolean ) { - const links = createDeepLinks(mlCapabilities, isFullLicense, isServerless); + const links = createDeepLinks(mlCapabilities, isFullLicense, showMLNavMenu); return Object.values(links).map((link) => link()); } diff --git a/x-pack/plugins/ml/public/ui_actions/edit_anomaly_charts_panel_action.tsx b/x-pack/plugins/ml/public/ui_actions/edit_anomaly_charts_panel_action.tsx index e4f765f87c598..d79c897958554 100644 --- a/x-pack/plugins/ml/public/ui_actions/edit_anomaly_charts_panel_action.tsx +++ b/x-pack/plugins/ml/public/ui_actions/edit_anomaly_charts_panel_action.tsx @@ -17,8 +17,7 @@ import { export const EDIT_ANOMALY_CHARTS_PANEL_ACTION = 'editAnomalyChartsPanelAction'; export function createEditAnomalyChartsPanelAction( - getStartServices: MlCoreSetup['getStartServices'], - isServerless: boolean + getStartServices: MlCoreSetup['getStartServices'] ): UiActionsActionDefinition { return { id: 'edit-anomaly-charts', @@ -44,7 +43,6 @@ export function createEditAnomalyChartsPanelAction( const result = await resolveEmbeddableAnomalyChartsUserInput( coreStart, - isServerless, embeddable.getInput() ); embeddable.updateInput(result); diff --git a/x-pack/plugins/ml/public/ui_actions/edit_swimlane_panel_action.tsx b/x-pack/plugins/ml/public/ui_actions/edit_swimlane_panel_action.tsx index 5070862023598..4352dc2df89bf 100644 --- a/x-pack/plugins/ml/public/ui_actions/edit_swimlane_panel_action.tsx +++ b/x-pack/plugins/ml/public/ui_actions/edit_swimlane_panel_action.tsx @@ -14,8 +14,7 @@ import { ANOMALY_SWIMLANE_EMBEDDABLE_TYPE, EditSwimlanePanelContext } from '../e export const EDIT_SWIMLANE_PANEL_ACTION = 'editSwimlanePanelAction'; export function createEditSwimlanePanelAction( - getStartServices: MlCoreSetup['getStartServices'], - isServerless: boolean + getStartServices: MlCoreSetup['getStartServices'] ): UiActionsActionDefinition { return { id: 'edit-anomaly-swimlane', @@ -39,11 +38,7 @@ export function createEditSwimlanePanelAction( '../embeddables/anomaly_swimlane/anomaly_swimlane_setup_flyout' ); - const result = await resolveAnomalySwimlaneUserInput( - coreStart, - isServerless, - embeddable.getInput() - ); + const result = await resolveAnomalySwimlaneUserInput(coreStart, embeddable.getInput()); embeddable.updateInput(result); } catch (e) { return Promise.reject(); diff --git a/x-pack/plugins/ml/public/ui_actions/index.ts b/x-pack/plugins/ml/public/ui_actions/index.ts index f08f5bcd886bc..4067547e08956 100644 --- a/x-pack/plugins/ml/public/ui_actions/index.ts +++ b/x-pack/plugins/ml/public/ui_actions/index.ts @@ -34,24 +34,17 @@ export { SWIM_LANE_SELECTION_TRIGGER }; */ export function registerMlUiActions( uiActions: UiActionsSetup, - core: CoreSetup, - isServerless: boolean + core: CoreSetup ) { // Initialize actions - const editSwimlanePanelAction = createEditSwimlanePanelAction( - core.getStartServices, - isServerless - ); + const editSwimlanePanelAction = createEditSwimlanePanelAction(core.getStartServices); const openInExplorerAction = createOpenInExplorerAction(core.getStartServices); const applyInfluencerFiltersAction = createApplyInfluencerFiltersAction(core.getStartServices); const applyEntityFieldFilterAction = createApplyEntityFieldFiltersAction(core.getStartServices); const applyTimeRangeSelectionAction = createApplyTimeRangeSelectionAction(core.getStartServices); const clearSelectionAction = createClearSelectionAction(core.getStartServices); - const editExplorerPanelAction = createEditAnomalyChartsPanelAction( - core.getStartServices, - isServerless - ); - const visToAdJobAction = createVisToADJobAction(core.getStartServices, isServerless); + const editExplorerPanelAction = createEditAnomalyChartsPanelAction(core.getStartServices); + const visToAdJobAction = createVisToADJobAction(core.getStartServices); // Register actions uiActions.registerAction(editSwimlanePanelAction); diff --git a/x-pack/plugins/ml/public/ui_actions/open_vis_in_ml_action.tsx b/x-pack/plugins/ml/public/ui_actions/open_vis_in_ml_action.tsx index 3e06b6175d61e..fb0aa38e44d90 100644 --- a/x-pack/plugins/ml/public/ui_actions/open_vis_in_ml_action.tsx +++ b/x-pack/plugins/ml/public/ui_actions/open_vis_in_ml_action.tsx @@ -15,8 +15,7 @@ import { isLensEmbeddable, isMapEmbeddable } from '../application/jobs/new_job/j export const CREATE_LENS_VIS_TO_ML_AD_JOB_ACTION = 'createMLADJobAction'; export function createVisToADJobAction( - getStartServices: MlCoreSetup['getStartServices'], - isServerless: boolean + getStartServices: MlCoreSetup['getStartServices'] ): UiActionsActionDefinition<{ embeddable: Embeddable | MapEmbeddable }> { return { id: 'create-ml-ad-job-action', @@ -40,26 +39,11 @@ export function createVisToADJobAction( if (lens === undefined) { return; } - await showLensVisToADJobFlyout( - embeddable, - coreStart, - share, - data, - lens, - dashboard, - isServerless - ); + await showLensVisToADJobFlyout(embeddable, coreStart, share, data, lens, dashboard); } else if (isMapEmbeddable(embeddable)) { const [{ showMapVisToADJobFlyout }, [coreStart, { share, data, dashboard }]] = await Promise.all([import('../embeddables/job_creation/map'), getStartServices()]); - await showMapVisToADJobFlyout( - embeddable, - coreStart, - share, - data, - dashboard, - isServerless - ); + await showMapVisToADJobFlyout(embeddable, coreStart, share, data, dashboard); } } catch (e) { return Promise.reject(); diff --git a/x-pack/plugins/ml/server/config_schema.ts b/x-pack/plugins/ml/server/config_schema.ts index 16db0505cc4e0..cc00b6a836d54 100644 --- a/x-pack/plugins/ml/server/config_schema.ts +++ b/x-pack/plugins/ml/server/config_schema.ts @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import { schema, type TypeOf } from '@kbn/config-schema'; +import { schema } from '@kbn/config-schema'; const enabledSchema = schema.maybe( schema.object({ @@ -17,5 +17,3 @@ export const configSchema = schema.object({ dfa: enabledSchema, nlp: enabledSchema, }); - -export type ConfigSchema = TypeOf; diff --git a/x-pack/plugins/ml/server/index.ts b/x-pack/plugins/ml/server/index.ts index 53c5b81ec9591..232df4ae7f1df 100644 --- a/x-pack/plugins/ml/server/index.ts +++ b/x-pack/plugins/ml/server/index.ts @@ -6,6 +6,8 @@ */ import type { PluginConfigDescriptor, PluginInitializerContext } from '@kbn/core/server'; +import { type ConfigSchema } from '../common/constants/app'; +import { configSchema } from './config_schema'; import { MlServerPlugin } from './plugin'; export type { MlPluginSetup, MlPluginStart } from './plugin'; export type { @@ -26,10 +28,14 @@ export { InsufficientMLCapabilities, MLPrivilegesUninitialized, } from './shared'; -import { configSchema, type ConfigSchema } from './config_schema'; export const config: PluginConfigDescriptor = { schema: configSchema, + exposeToBrowser: { + ad: true, + dfa: true, + nlp: true, + }, }; export const plugin = (ctx: PluginInitializerContext) => new MlServerPlugin(ctx); diff --git a/x-pack/plugins/ml/server/lib/alerts/register_ml_alerts.ts b/x-pack/plugins/ml/server/lib/alerts/register_ml_alerts.ts index 582676b61928b..d6f0260778ea2 100644 --- a/x-pack/plugins/ml/server/lib/alerts/register_ml_alerts.ts +++ b/x-pack/plugins/ml/server/lib/alerts/register_ml_alerts.ts @@ -7,11 +7,11 @@ import type { Logger } from '@kbn/core/server'; import type { AlertingPlugin } from '@kbn/alerting-plugin/server'; +import type { MlFeatures } from '../../../common/constants/app'; import { registerAnomalyDetectionAlertType } from './register_anomaly_detection_alert_type'; import type { SharedServices } from '../../shared_services'; import { registerJobsMonitoringRuleType } from './register_jobs_monitoring_rule_type'; import type { MlServicesProviders } from '../../shared_services/shared_services'; -import type { MlFeatures } from '../../types'; export interface RegisterAlertParams { alerting: AlertingPlugin['setup']; diff --git a/x-pack/plugins/ml/server/lib/capabilities/capabilities_switcher.ts b/x-pack/plugins/ml/server/lib/capabilities/capabilities_switcher.ts index dadb15b8a46b8..ba08ab5066701 100644 --- a/x-pack/plugins/ml/server/lib/capabilities/capabilities_switcher.ts +++ b/x-pack/plugins/ml/server/lib/capabilities/capabilities_switcher.ts @@ -9,13 +9,13 @@ import { cloneDeep } from 'lodash'; import { firstValueFrom, Observable } from 'rxjs'; import type { CapabilitiesSwitcher, CoreSetup, Logger } from '@kbn/core/server'; import type { ILicense } from '@kbn/licensing-plugin/common/types'; +import type { MlFeatures } from '../../../common/constants/app'; import { isFullLicense, isMinimumLicense, isMlEnabled } from '../../../common/license'; import { type MlCapabilities, basicLicenseMlCapabilities, featureCapabilities, } from '../../../common/types/capabilities'; -import type { MlFeatures } from '../../types'; export const setupCapabilitiesSwitcher = ( coreSetup: CoreSetup, diff --git a/x-pack/plugins/ml/server/lib/register_cases.ts b/x-pack/plugins/ml/server/lib/register_cases.ts index a9644638e11dc..b8a226afd9bc8 100644 --- a/x-pack/plugins/ml/server/lib/register_cases.ts +++ b/x-pack/plugins/ml/server/lib/register_cases.ts @@ -6,11 +6,11 @@ */ import type { CasesSetup } from '@kbn/cases-plugin/server'; +import type { MlFeatures } from '../../common/constants/app'; import { CASE_ATTACHMENT_TYPE_ID_ANOMALY_EXPLORER_CHARTS, CASE_ATTACHMENT_TYPE_ID_ANOMALY_SWIMLANE, } from '../../common/constants/cases'; -import type { MlFeatures } from '../types'; export function registerCasesPersistableState(cases: CasesSetup, enabledFeatures: MlFeatures) { if (enabledFeatures.ad === true) { diff --git a/x-pack/plugins/ml/server/lib/register_sample_data_set_links.ts b/x-pack/plugins/ml/server/lib/register_sample_data_set_links.ts index b4aa199a55a0a..8f79966ac64db 100644 --- a/x-pack/plugins/ml/server/lib/register_sample_data_set_links.ts +++ b/x-pack/plugins/ml/server/lib/register_sample_data_set_links.ts @@ -7,7 +7,7 @@ import { i18n } from '@kbn/i18n'; import type { HomeServerPluginSetup } from '@kbn/home-plugin/server'; -import type { MlFeatures } from '../types'; +import type { MlFeatures } from '../../common/constants/app'; export function registerSampleDataSetLinks( home: HomeServerPluginSetup, diff --git a/x-pack/plugins/ml/server/models/data_frame_analytics/analytics_manager.ts b/x-pack/plugins/ml/server/models/data_frame_analytics/analytics_manager.ts index bee696f02de81..27e0bd893a53d 100644 --- a/x-pack/plugins/ml/server/models/data_frame_analytics/analytics_manager.ts +++ b/x-pack/plugins/ml/server/models/data_frame_analytics/analytics_manager.ts @@ -19,6 +19,7 @@ import { type MapElements, } from '@kbn/ml-data-frame-analytics-utils'; import { isPopulatedObject } from '@kbn/ml-is-populated-object'; +import type { MlFeatures } from '../../../common/constants/app'; import type { ModelService } from '../model_management/models_provider'; import { modelsProvider } from '../model_management'; import { @@ -36,7 +37,6 @@ import { isTransformLinkReturnType, } from './types'; import type { MlClient } from '../../lib/ml_client'; -import type { MlFeatures } from '../../types'; import { DEFAULT_TRAINED_MODELS_PAGE_SIZE } from '../../routes/trained_models'; export class AnalyticsManager { diff --git a/x-pack/plugins/ml/server/models/model_management/memory_usage.ts b/x-pack/plugins/ml/server/models/model_management/memory_usage.ts index cd665c387302f..6d81062dfd84d 100644 --- a/x-pack/plugins/ml/server/models/model_management/memory_usage.ts +++ b/x-pack/plugins/ml/server/models/model_management/memory_usage.ts @@ -9,6 +9,7 @@ import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import numeral from '@elastic/numeral'; import { pick } from 'lodash'; import { isDefined } from '@kbn/ml-is-defined'; +import type { MlFeatures } from '../../../common/constants/app'; import type { MemoryUsageInfo, TrainedModelStatsResponse, @@ -22,7 +23,6 @@ import type { NodeDeploymentStatsResponse, NodesOverviewResponse, } from '../../../common/types/trained_models'; -import type { MlFeatures } from '../../types'; // @ts-expect-error numeral missing value const AD_EXTRA_MEMORY = numeral('10MB').value(); diff --git a/x-pack/plugins/ml/server/models/notifications_service/notifications_service_provider.ts b/x-pack/plugins/ml/server/models/notifications_service/notifications_service_provider.ts index 981b7ba6be7e6..95c32d8f1d21f 100644 --- a/x-pack/plugins/ml/server/models/notifications_service/notifications_service_provider.ts +++ b/x-pack/plugins/ml/server/models/notifications_service/notifications_service_provider.ts @@ -7,6 +7,7 @@ import { IScopedClusterClient } from '@kbn/core/server'; import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; +import type { MlFeatures } from '../../../common/constants/app'; import type { MLSavedObjectService } from '../../saved_objects'; import type { NotificationItem, NotificationSource } from '../../../common/types/notifications'; import { ML_NOTIFICATION_INDEX_PATTERN } from '../../../common/constants/index_patterns'; @@ -19,7 +20,6 @@ import type { NotificationsCountResponse, NotificationsSearchResponse, } from '../../../common/types/notifications'; -import type { MlFeatures } from '../../types'; const MAX_NOTIFICATIONS_SIZE = 10000; diff --git a/x-pack/plugins/ml/server/plugin.ts b/x-pack/plugins/ml/server/plugin.ts index dcd97acabcbd8..962a9cff24b59 100644 --- a/x-pack/plugins/ml/server/plugin.ts +++ b/x-pack/plugins/ml/server/plugin.ts @@ -25,12 +25,16 @@ import type { SpacesPluginSetup } from '@kbn/spaces-plugin/server'; import type { FieldFormatsStart } from '@kbn/field-formats-plugin/server'; import type { HomeServerPluginSetup } from '@kbn/home-plugin/server'; import type { CasesSetup } from '@kbn/cases-plugin/server'; -import type { MlFeatures, PluginsSetup, PluginsStart, RouteInitialization } from './types'; +import type { PluginsSetup, PluginsStart, RouteInitialization } from './types'; import type { MlCapabilities } from '../common/types/capabilities'; -import type { ConfigSchema } from './config_schema'; import { jsonSchemaRoutes } from './routes/json_schema'; import { notificationsRoutes } from './routes/notifications'; -import { PLUGIN_ID } from '../common/constants/app'; +import { + type MlFeatures, + PLUGIN_ID, + type ConfigSchema, + initEnabledFeatures, +} from '../common/constants/app'; import { initMlServerLog } from './lib/log'; import { annotationRoutes } from './routes/annotations'; import { calendars } from './routes/calendars'; @@ -102,7 +106,7 @@ export class MlServerPlugin this.mlLicense = new MlLicense(); this.isMlReady = new Promise((resolve) => (this.setMlReady = resolve)); this.savedObjectsSyncService = new SavedObjectsSyncService(this.log); - this.initEnabledFeatures(ctx.config.get()); + initEnabledFeatures(this.enabledFeatures, ctx.config.get()); } public setup(coreSetup: CoreSetup, plugins: PluginsSetup): MlPluginSetup { @@ -240,11 +244,11 @@ export class MlServerPlugin // Register Trained Model Management routes if (this.enabledFeatures.dfa || this.enabledFeatures.nlp) { - modelManagementRoutes(routeInit); trainedModelsRoutes(routeInit, plugins.cloud); } // Register Miscellaneous routes + modelManagementRoutes(routeInit); dataVisualizerRoutes(routeInit); fieldsService(routeInit); indicesRoutes(routeInit); @@ -332,16 +336,4 @@ export class MlServerPlugin public stop() { this.mlLicense.unsubscribe(); } - - private initEnabledFeatures(config: ConfigSchema) { - if (config.ad?.enabled !== undefined) { - this.enabledFeatures.ad = config.ad.enabled; - } - if (config.dfa?.enabled !== undefined) { - this.enabledFeatures.dfa = config.dfa.enabled; - } - if (config.nlp?.enabled !== undefined) { - this.enabledFeatures.nlp = config.nlp.enabled; - } - } } diff --git a/x-pack/plugins/ml/server/routes/data_frame_analytics.ts b/x-pack/plugins/ml/server/routes/data_frame_analytics.ts index fb5eca48d8fa1..0914500341424 100644 --- a/x-pack/plugins/ml/server/routes/data_frame_analytics.ts +++ b/x-pack/plugins/ml/server/routes/data_frame_analytics.ts @@ -12,10 +12,10 @@ import { JOB_MAP_NODE_TYPES, type DeleteDataFrameAnalyticsWithIndexStatus, } from '@kbn/ml-data-frame-analytics-utils'; -import { ML_INTERNAL_BASE_PATH } from '../../common/constants/app'; +import { type MlFeatures, ML_INTERNAL_BASE_PATH } from '../../common/constants/app'; import { wrapError } from '../client/error_wrapper'; import { analyticsAuditMessagesProvider } from '../models/data_frame_analytics/analytics_audit_messages'; -import type { MlFeatures, RouteInitialization } from '../types'; +import type { RouteInitialization } from '../types'; import { dataAnalyticsJobConfigSchema, dataAnalyticsJobUpdateSchema, diff --git a/x-pack/plugins/ml/server/routes/trained_models.ts b/x-pack/plugins/ml/server/routes/trained_models.ts index f6eeb6fa16d4a..7c9f0c14ec6b4 100644 --- a/x-pack/plugins/ml/server/routes/trained_models.ts +++ b/x-pack/plugins/ml/server/routes/trained_models.ts @@ -8,12 +8,11 @@ import type * as estypes from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; import { schema } from '@kbn/config-schema'; import type { ErrorType } from '@kbn/ml-error-utils'; -import type { MlGetTrainedModelsRequest } from '@elastic/elasticsearch/lib/api/typesWithBodyKey'; -import { type ElserVersion } from '@kbn/ml-trained-models-utils'; import type { CloudSetup } from '@kbn/cloud-plugin/server'; +import type { ElserVersion } from '@kbn/ml-trained-models-utils'; import { isDefined } from '@kbn/ml-is-defined'; -import { ML_INTERNAL_BASE_PATH } from '../../common/constants/app'; -import type { MlFeatures, RouteInitialization } from '../types'; +import { type MlFeatures, ML_INTERNAL_BASE_PATH } from '../../common/constants/app'; +import type { RouteInitialization } from '../types'; import { wrapError } from '../client/error_wrapper'; import { deleteTrainedModelQuerySchema, @@ -101,7 +100,7 @@ export function trainedModelsRoutes( ...getTrainedModelsRequestParams, ...(modelId ? { model_id: modelId } : {}), size: DEFAULT_TRAINED_MODELS_PAGE_SIZE, - } as MlGetTrainedModelsRequest); + } as estypes.MlGetTrainedModelsRequest); // model_type is missing // @ts-ignore const result = resp.trained_model_configs as TrainedModelConfigResponse[]; diff --git a/x-pack/plugins/ml/server/types.ts b/x-pack/plugins/ml/server/types.ts index 302df71df5f38..17f5c5a60a1a9 100644 --- a/x-pack/plugins/ml/server/types.ts +++ b/x-pack/plugins/ml/server/types.ts @@ -30,6 +30,7 @@ import type { CasesSetup } from '@kbn/cases-plugin/server'; import type { RouteGuard } from './lib/route_guard'; import type { ResolveMlCapabilities } from '../common/types/capabilities'; import type { MlLicense } from '../common/license'; +import type { MlFeatures } from '../common/constants/app'; export interface LicenseCheckResult { isAvailable: boolean; @@ -82,5 +83,3 @@ export interface RouteInitialization { routeGuard: RouteGuard; getEnabledFeatures: () => MlFeatures; } - -export type MlFeatures = Record<'ad' | 'dfa' | 'nlp', boolean>;