From 7256609f8cfc344a018a0a1bff76622144456ba9 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Wed, 3 Dec 2025 12:29:32 -0700 Subject: [PATCH 1/4] move field stats embeddable reference handling to server --- .../embeddables}/constants.ts | 0 .../common/embeddables/transform_in.ts | 33 +++++++++++++++++ .../common/embeddables/transform_out.ts | 24 +++++++++++++ .../common/embeddables/types.ts | 30 ++++++++++++++++ .../field_stats/field_stats_factory.tsx | 36 +++---------------- .../embeddables/field_stats/index.ts | 6 +++- .../embeddables/grid_embeddable/types.ts | 23 ++++-------- .../private/data_visualizer/server/plugin.ts | 9 +++++ .../data_visualizer/server/types/deps.ts | 2 ++ 9 files changed, 114 insertions(+), 49 deletions(-) rename x-pack/platform/plugins/private/data_visualizer/{public/application/index_data_visualizer/embeddables/field_stats => common/embeddables}/constants.ts (100%) create mode 100644 x-pack/platform/plugins/private/data_visualizer/common/embeddables/transform_in.ts create mode 100644 x-pack/platform/plugins/private/data_visualizer/common/embeddables/transform_out.ts create mode 100644 x-pack/platform/plugins/private/data_visualizer/common/embeddables/types.ts diff --git a/x-pack/platform/plugins/private/data_visualizer/public/application/index_data_visualizer/embeddables/field_stats/constants.ts b/x-pack/platform/plugins/private/data_visualizer/common/embeddables/constants.ts similarity index 100% rename from x-pack/platform/plugins/private/data_visualizer/public/application/index_data_visualizer/embeddables/field_stats/constants.ts rename to x-pack/platform/plugins/private/data_visualizer/common/embeddables/constants.ts diff --git a/x-pack/platform/plugins/private/data_visualizer/common/embeddables/transform_in.ts b/x-pack/platform/plugins/private/data_visualizer/common/embeddables/transform_in.ts new file mode 100644 index 0000000000000..8b1dfd06c6330 --- /dev/null +++ b/x-pack/platform/plugins/private/data_visualizer/common/embeddables/transform_in.ts @@ -0,0 +1,33 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import { DATA_VIEW_SAVED_OBJECT_TYPE } from '@kbn/data-views-plugin/common'; +import type { Reference } from '@kbn/content-management-utils'; +import type { + FieldStatisticsTableEmbeddableState, + StoredFieldStatisticsTableEmbeddableState, +} from './types'; +import { FIELD_STATS_DATA_VIEW_REF_NAME } from './constants'; + +export function transformIn(state: FieldStatisticsTableEmbeddableState): { + state: StoredFieldStatisticsTableEmbeddableState; + references: Reference[]; +} { + const { dataViewId, ...rest } = state; + return { + state: rest, + references: dataViewId + ? [ + { + type: DATA_VIEW_SAVED_OBJECT_TYPE, + name: FIELD_STATS_DATA_VIEW_REF_NAME, + id: dataViewId, + }, + ] + : [], + }; +} diff --git a/x-pack/platform/plugins/private/data_visualizer/common/embeddables/transform_out.ts b/x-pack/platform/plugins/private/data_visualizer/common/embeddables/transform_out.ts new file mode 100644 index 0000000000000..ba411ec2f75b2 --- /dev/null +++ b/x-pack/platform/plugins/private/data_visualizer/common/embeddables/transform_out.ts @@ -0,0 +1,24 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { Reference } from '@kbn/content-management-utils'; +import type { + FieldStatisticsTableEmbeddableState, + StoredFieldStatisticsTableEmbeddableState, +} from './types'; +import { FIELD_STATS_DATA_VIEW_REF_NAME } from './constants'; + +export function transformOut( + state: StoredFieldStatisticsTableEmbeddableState, + references?: Reference[] +): FieldStatisticsTableEmbeddableState { + const dataViewIdRef = references?.find((ref) => ref.name === FIELD_STATS_DATA_VIEW_REF_NAME); + return { + ...state, + dataViewId: dataViewIdRef?.id ?? '', + }; +} diff --git a/x-pack/platform/plugins/private/data_visualizer/common/embeddables/types.ts b/x-pack/platform/plugins/private/data_visualizer/common/embeddables/types.ts new file mode 100644 index 0000000000000..51674605cbae4 --- /dev/null +++ b/x-pack/platform/plugins/private/data_visualizer/common/embeddables/types.ts @@ -0,0 +1,30 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the Elastic License + * 2.0; you may not use this file except in compliance with the Elastic License + * 2.0. + */ + +import type { AggregateQuery } from '@kbn/es-query'; +import type { SerializedTimeRange } from '@kbn/presentation-publishing'; +import type { SerializedTitles } from '@kbn/presentation-publishing-schemas'; + +export enum FieldStatsInitializerViewType { + DATA_VIEW = 'dataview', + ESQL = 'esql', +} + +export interface FieldStatsInitialState { + dataViewId?: string; + viewType?: FieldStatsInitializerViewType; + query?: AggregateQuery; + showDistributions?: boolean; +} +export type FieldStatisticsTableEmbeddableState = FieldStatsInitialState & + SerializedTitles & + SerializedTimeRange & {}; + +export type StoredFieldStatisticsTableEmbeddableState = Omit< + FieldStatisticsTableEmbeddableState, + 'dataViewId' +>; diff --git a/x-pack/platform/plugins/private/data_visualizer/public/application/index_data_visualizer/embeddables/field_stats/field_stats_factory.tsx b/x-pack/platform/plugins/private/data_visualizer/public/application/index_data_visualizer/embeddables/field_stats/field_stats_factory.tsx index d8595208df989..1e3bbea36eeb3 100644 --- a/x-pack/platform/plugins/private/data_visualizer/public/application/index_data_visualizer/embeddables/field_stats/field_stats_factory.tsx +++ b/x-pack/platform/plugins/private/data_visualizer/public/application/index_data_visualizer/embeddables/field_stats/field_stats_factory.tsx @@ -4,7 +4,7 @@ * 2.0; you may not use this file except in compliance with the Elastic License * 2.0. */ -import type { Reference } from '@kbn/content-management-utils'; + import type { StartServicesAccessor } from '@kbn/core-lifecycle-browser'; import { APPLY_FILTER_TRIGGER, @@ -12,11 +12,9 @@ import { type DataPublicPluginStart, } from '@kbn/data-plugin/public'; import type { DataViewField } from '@kbn/data-views-plugin/common'; -import { DATA_VIEW_SAVED_OBJECT_TYPE } from '@kbn/data-views-plugin/common'; import type { EmbeddableFactory } from '@kbn/embeddable-plugin/public'; import { i18n } from '@kbn/i18n'; import { - type SerializedPanelState, apiHasExecutionContext, fetch$, initializeTimeRangeManager, @@ -27,7 +25,6 @@ import { timeRangeComparators, } from '@kbn/presentation-publishing'; import { initializeUnsavedChanges } from '@kbn/presentation-containers'; -import { cloneDeep } from 'lodash'; import React, { useEffect } from 'react'; import useObservable from 'react-use/lib/useObservable'; import { @@ -56,12 +53,12 @@ import type { DataVisualizerTableState } from '../../../../../common/types'; import type { DataVisualizerPluginStart } from '../../../../plugin'; import type { FieldStatisticsTableEmbeddableState } from '../grid_embeddable/types'; import { FieldStatsInitializerViewType } from '../grid_embeddable/types'; -import { FIELD_STATS_EMBEDDABLE_TYPE, FIELD_STATS_DATA_VIEW_REF_NAME } from './constants'; import { initializeFieldStatsControls } from './initialize_field_stats_controls'; import type { DataVisualizerStartDependencies } from '../../../common/types/data_visualizer_plugin'; import type { FieldStatisticsTableEmbeddableApi } from './types'; import { isESQLQuery } from '../../search_strategy/requests/esql_utils'; import { FieldStatsComponentType } from '../../constants/field_stats_component_type'; +import { FIELD_STATS_EMBEDDABLE_TYPE } from '../../../../../common/embeddables/constants'; export interface EmbeddableFieldStatsChartStartServices { data: DataPublicPluginStart; @@ -134,22 +131,7 @@ export const getFieldStatsChartEmbeddableFactory = ( const timeRangeManager = initializeTimeRangeManager(initialState.rawState); const titleManager = initializeTitleManager(initialState.rawState); - const deserializeState = ( - state: SerializedPanelState - ) => { - const serializedState = cloneDeep(state.rawState); - // inject the reference - const dataViewIdRef = state.references?.find( - (ref) => ref.name === FIELD_STATS_DATA_VIEW_REF_NAME - ); - // if the serializedState already contains a dataViewId, we don't want to overwrite it. (Unsaved state can cause this) - if (dataViewIdRef && serializedState && !serializedState.dataViewId) { - serializedState.dataViewId = dataViewIdRef?.id; - } - return serializedState; - }; - - const state = deserializeState(initialState); + const state = initialState.rawState; const { fieldStatsControlsApi, @@ -213,23 +195,13 @@ export const getFieldStatsChartEmbeddableFactory = ( const { toasts } = deps.notifications; const serializeState = () => { - const dataViewId = fieldStatsControlsApi.dataViewId$?.getValue(); - const references: Reference[] = dataViewId - ? [ - { - type: DATA_VIEW_SAVED_OBJECT_TYPE, - name: FIELD_STATS_DATA_VIEW_REF_NAME, - id: dataViewId, - }, - ] - : []; return { rawState: { ...titleManager.getLatestState(), ...timeRangeManager.getLatestState(), ...serializeFieldStatsChartState(), }, - references, + references: [], }; }; diff --git a/x-pack/platform/plugins/private/data_visualizer/public/application/index_data_visualizer/embeddables/field_stats/index.ts b/x-pack/platform/plugins/private/data_visualizer/public/application/index_data_visualizer/embeddables/field_stats/index.ts index d976e89af2c26..7d31380c0cacf 100644 --- a/x-pack/platform/plugins/private/data_visualizer/public/application/index_data_visualizer/embeddables/field_stats/index.ts +++ b/x-pack/platform/plugins/private/data_visualizer/public/application/index_data_visualizer/embeddables/field_stats/index.ts @@ -6,11 +6,15 @@ */ import type { EmbeddableSetup } from '@kbn/embeddable-plugin/public'; import type { DataVisualizerCoreSetup } from '../../../../plugin'; -import { FIELD_STATS_EMBEDDABLE_TYPE } from './constants'; +import { FIELD_STATS_EMBEDDABLE_TYPE } from '../../../../../common/embeddables/constants'; export const registerEmbeddables = (embeddable: EmbeddableSetup, core: DataVisualizerCoreSetup) => { embeddable.registerReactEmbeddableFactory(FIELD_STATS_EMBEDDABLE_TYPE, async () => { const { getFieldStatsChartEmbeddableFactory } = await import('./field_stats_factory'); return getFieldStatsChartEmbeddableFactory(core.getStartServices); }); + embeddable.registerLegacyURLTransform(FIELD_STATS_EMBEDDABLE_TYPE, async () => { + const { transformOut } = await import('../../../../../common/embeddables/transform_out'); + return transformOut; + }); }; diff --git a/x-pack/platform/plugins/private/data_visualizer/public/application/index_data_visualizer/embeddables/grid_embeddable/types.ts b/x-pack/platform/plugins/private/data_visualizer/public/application/index_data_visualizer/embeddables/grid_embeddable/types.ts index f6764a027dbaf..647a2feeab046 100644 --- a/x-pack/platform/plugins/private/data_visualizer/public/application/index_data_visualizer/embeddables/grid_embeddable/types.ts +++ b/x-pack/platform/plugins/private/data_visualizer/public/application/index_data_visualizer/embeddables/grid_embeddable/types.ts @@ -10,7 +10,6 @@ import type { Query } from '@kbn/es-query'; import type { DataView, DataViewField } from '@kbn/data-views-plugin/public'; import type { SavedSearch } from '@kbn/saved-search-plugin/public'; import type { BehaviorSubject, Observable } from 'rxjs'; -import type { SerializedTimeRange, SerializedTitles } from '@kbn/presentation-publishing'; import type { DataPublicPluginStart } from '@kbn/data-plugin/public'; import type { DataVisualizerTableState } from '../../../../../common/types'; import type { SamplingOption } from '../../../../../common/types/field_stats'; @@ -20,6 +19,13 @@ import type { DataVisualizerStartDependencies } from '../../../common/types/data import type { ESQLQuery } from '../../search_strategy/requests/esql_utils'; import type { DataVisualizerTableItem } from '../../../common/components/stats_table/types'; import type { FieldStatsComponentType } from '../../constants/field_stats_component_type'; +import type { FieldStatisticsTableEmbeddableState } from '../../../../../common/embeddables/types'; + +export { FieldStatsInitializerViewType } from '../../../../../common/embeddables/types'; +export type { + FieldStatsInitialState, + FieldStatisticsTableEmbeddableState, +} from '../../../../../common/embeddables/types'; export interface FieldStatisticTableEmbeddableProps { /** @@ -110,21 +116,6 @@ export type ESQLDataVisualizerGridEmbeddableState = Omit< 'query' > & { query?: ESQLQuery }; -export enum FieldStatsInitializerViewType { - DATA_VIEW = 'dataview', - ESQL = 'esql', -} - -export interface FieldStatsInitialState { - dataViewId?: string; - viewType?: FieldStatsInitializerViewType; - query?: AggregateQuery; - showDistributions?: boolean; -} -export type FieldStatisticsTableEmbeddableState = FieldStatsInitialState & - SerializedTitles & - SerializedTimeRange & {}; - export type OnAddFilter = (field: DataViewField | string, value: string, type: '+' | '-') => void; export interface FieldStatisticsTableEmbeddableParentApi { executionContext?: { value: string }; diff --git a/x-pack/platform/plugins/private/data_visualizer/server/plugin.ts b/x-pack/platform/plugins/private/data_visualizer/server/plugin.ts index fe4b4c1787814..334e67db6add6 100644 --- a/x-pack/platform/plugins/private/data_visualizer/server/plugin.ts +++ b/x-pack/platform/plugins/private/data_visualizer/server/plugin.ts @@ -16,6 +16,9 @@ import type { ConfigSchema } from '@kbn/file-upload-common'; import type { StartDeps, SetupDeps } from './types'; import { registerWithCustomIntegrations } from './register_custom_integration'; import { routes } from './routes'; +import { FIELD_STATS_EMBEDDABLE_TYPE } from '../common/embeddables/constants'; +import { transformIn } from '../common/embeddables/transform_in'; +import { transformOut } from '../common/embeddables/transform_out'; export class DataVisualizerPlugin implements Plugin { private readonly _logger: Logger; @@ -29,6 +32,12 @@ export class DataVisualizerPlugin implements Plugin Date: Wed, 3 Dec 2025 19:41:03 +0000 Subject: [PATCH 2/4] Changes from node scripts/lint_ts_projects --fix --- x-pack/platform/plugins/private/data_visualizer/tsconfig.json | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/platform/plugins/private/data_visualizer/tsconfig.json b/x-pack/platform/plugins/private/data_visualizer/tsconfig.json index 3ae7636d8687b..5b9cb656e3a28 100644 --- a/x-pack/platform/plugins/private/data_visualizer/tsconfig.json +++ b/x-pack/platform/plugins/private/data_visualizer/tsconfig.json @@ -85,6 +85,7 @@ "@kbn/file-upload", "@kbn/charts-theme", "@kbn/presentation-util", + "@kbn/presentation-publishing-schemas", ], "exclude": [ "target/**/*", From 2ada1e2ed144be9707031615ed2488a39ef487c4 Mon Sep 17 00:00:00 2001 From: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 3 Dec 2025 20:09:21 +0000 Subject: [PATCH 3/4] Changes from node scripts/regenerate_moon_projects.js --update --- x-pack/platform/plugins/private/data_visualizer/moon.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/x-pack/platform/plugins/private/data_visualizer/moon.yml b/x-pack/platform/plugins/private/data_visualizer/moon.yml index fdcdc7c69f28d..e2435cf9158b0 100644 --- a/x-pack/platform/plugins/private/data_visualizer/moon.yml +++ b/x-pack/platform/plugins/private/data_visualizer/moon.yml @@ -91,6 +91,7 @@ dependsOn: - '@kbn/file-upload' - '@kbn/charts-theme' - '@kbn/presentation-util' + - '@kbn/presentation-publishing-schemas' tags: - plugin - prod From 2fe4085705393a9c819299667d6c3868762840f0 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Wed, 3 Dec 2025 14:53:54 -0700 Subject: [PATCH 4/4] remove dataViews from requiredBundles --- x-pack/platform/plugins/private/data_visualizer/kibana.jsonc | 1 - 1 file changed, 1 deletion(-) diff --git a/x-pack/platform/plugins/private/data_visualizer/kibana.jsonc b/x-pack/platform/plugins/private/data_visualizer/kibana.jsonc index 72ba380fcec3b..8f7ebfb089204 100644 --- a/x-pack/platform/plugins/private/data_visualizer/kibana.jsonc +++ b/x-pack/platform/plugins/private/data_visualizer/kibana.jsonc @@ -33,7 +33,6 @@ "cloud" ], "requiredBundles": [ - "dataViews", "kibanaReact", "kibanaUtils", "maps",