From 98b5cc9391c3bfbe3f861a06c7c042e8049f3a55 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Wed, 15 Jan 2025 14:51:44 -0700 Subject: [PATCH 01/13] move floating actions into controls plugin --- .../controls/public/control_group/components/control_panel.tsx | 2 +- .../public/control_group/components}/floating_actions.scss | 0 .../public/control_group/components}/floating_actions.tsx | 0 .../plugins/shared/controls/public/services/kibana_services.ts | 3 +++ .../shared/presentation_util/public/components/index.tsx | 2 -- .../shared/presentation_util/public/components/types.ts | 2 +- src/platform/plugins/shared/presentation_util/public/index.ts | 1 - 7 files changed, 5 insertions(+), 5 deletions(-) rename src/platform/plugins/shared/{presentation_util/public/components/floating_actions => controls/public/control_group/components}/floating_actions.scss (100%) rename src/platform/plugins/shared/{presentation_util/public/components/floating_actions => controls/public/control_group/components}/floating_actions.tsx (100%) diff --git a/src/platform/plugins/shared/controls/public/control_group/components/control_panel.tsx b/src/platform/plugins/shared/controls/public/control_group/components/control_panel.tsx index acff284eeba1f..9a21c28eb2f1d 100644 --- a/src/platform/plugins/shared/controls/public/control_group/components/control_panel.tsx +++ b/src/platform/plugins/shared/controls/public/control_group/components/control_panel.tsx @@ -27,7 +27,7 @@ import { apiPublishesViewMode, useBatchedOptionalPublishingSubjects, } from '@kbn/presentation-publishing'; -import { FloatingActions } from '@kbn/presentation-util-plugin/public'; +import { FloatingActions } from './floating_actions'; import { DEFAULT_CONTROL_GROW, DEFAULT_CONTROL_WIDTH } from '../../../common'; import { ControlPanelProps, DefaultControlApi } from '../../controls/types'; diff --git a/src/platform/plugins/shared/presentation_util/public/components/floating_actions/floating_actions.scss b/src/platform/plugins/shared/controls/public/control_group/components/floating_actions.scss similarity index 100% rename from src/platform/plugins/shared/presentation_util/public/components/floating_actions/floating_actions.scss rename to src/platform/plugins/shared/controls/public/control_group/components/floating_actions.scss diff --git a/src/platform/plugins/shared/presentation_util/public/components/floating_actions/floating_actions.tsx b/src/platform/plugins/shared/controls/public/control_group/components/floating_actions.tsx similarity index 100% rename from src/platform/plugins/shared/presentation_util/public/components/floating_actions/floating_actions.tsx rename to src/platform/plugins/shared/controls/public/control_group/components/floating_actions.tsx diff --git a/src/platform/plugins/shared/controls/public/services/kibana_services.ts b/src/platform/plugins/shared/controls/public/services/kibana_services.ts index b9e5fadcecaa0..c13a56c3826ad 100644 --- a/src/platform/plugins/shared/controls/public/services/kibana_services.ts +++ b/src/platform/plugins/shared/controls/public/services/kibana_services.ts @@ -12,12 +12,14 @@ import { BehaviorSubject } from 'rxjs'; import { CoreStart } from '@kbn/core/public'; import { DataPublicPluginStart } from '@kbn/data-plugin/public'; import { DataViewsPublicPluginStart } from '@kbn/data-views-plugin/public'; +import { UiActionsStart } from '@kbn/ui-actions-plugin/public'; import { ControlsPluginStartDeps } from '../types'; export let coreServices: CoreStart; export let dataService: DataPublicPluginStart; export let dataViewsService: DataViewsPublicPluginStart; +export let uiActionsService: UiActionsStart; const servicesReady$ = new BehaviorSubject(false); @@ -25,6 +27,7 @@ export const setKibanaServices = (kibanaCore: CoreStart, deps: ControlsPluginSta coreServices = kibanaCore; dataService = deps.data; dataViewsService = deps.dataViews; + uiActionsService = deps.uiActions; servicesReady$.next(true); }; diff --git a/src/platform/plugins/shared/presentation_util/public/components/index.tsx b/src/platform/plugins/shared/presentation_util/public/components/index.tsx index 80b8b22cd1d68..4195ef39f90b4 100644 --- a/src/platform/plugins/shared/presentation_util/public/components/index.tsx +++ b/src/platform/plugins/shared/presentation_util/public/components/index.tsx @@ -61,8 +61,6 @@ export { DEFAULT_DASHBOARD_DRILLDOWN_OPTIONS, } from './dashboard_drilldown_options/types'; -export { FloatingActions } from './floating_actions/floating_actions'; - /** * A lazily-loaded ExpressionInput component. */ diff --git a/src/platform/plugins/shared/presentation_util/public/components/types.ts b/src/platform/plugins/shared/presentation_util/public/components/types.ts index f7a479a58b2ef..64574bd7d0e82 100644 --- a/src/platform/plugins/shared/presentation_util/public/components/types.ts +++ b/src/platform/plugins/shared/presentation_util/public/components/types.ts @@ -13,7 +13,7 @@ import type { CSSProperties, HTMLAttributes } from 'react'; import type { ExpressionFunction } from '@kbn/expressions-plugin/common'; -import { OnSaveProps, SaveModalState } from '@kbn/saved-objects-plugin/public'; +import type { OnSaveProps, SaveModalState } from '@kbn/saved-objects-plugin/public'; interface SaveModalDocumentInfo { id?: string; diff --git a/src/platform/plugins/shared/presentation_util/public/index.ts b/src/platform/plugins/shared/presentation_util/public/index.ts index 76e7362c855ed..67790ec49f02a 100644 --- a/src/platform/plugins/shared/presentation_util/public/index.ts +++ b/src/platform/plugins/shared/presentation_util/public/index.ts @@ -24,7 +24,6 @@ export { withSuspense, LazyDataViewPicker, LazyFieldPicker, - FloatingActions, type DashboardDrilldownOptions, DashboardDrilldownOptionsComponent, DEFAULT_DASHBOARD_DRILLDOWN_OPTIONS, From 3363f7aafb7a8b3733b5be537b1a3f396bbf06c7 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Wed, 15 Jan 2025 15:00:10 -0700 Subject: [PATCH 02/13] controls module --- .../public/actions/clear_control_action.tsx | 2 +- .../public/actions/{index.ts => constants.ts} | 0 .../public/actions/delete_control_action.tsx | 2 +- .../public/actions/edit_control_action.tsx | 2 +- .../controls/public/actions/register_actions.ts | 0 .../register_options_list_control.ts | 2 +- .../register_range_slider_control.ts | 2 +- .../register_timeslider_control.ts | 2 +- .../shared/controls/public/controls_module.ts | 16 ++++++++++++++++ .../plugins/shared/controls/public/index.ts | 2 +- 10 files changed, 23 insertions(+), 7 deletions(-) rename src/platform/plugins/shared/controls/public/actions/{index.ts => constants.ts} (100%) create mode 100644 src/platform/plugins/shared/controls/public/actions/register_actions.ts create mode 100644 src/platform/plugins/shared/controls/public/controls_module.ts diff --git a/src/platform/plugins/shared/controls/public/actions/clear_control_action.tsx b/src/platform/plugins/shared/controls/public/actions/clear_control_action.tsx index 06f9b26c04ddc..b9cb4605e89b4 100644 --- a/src/platform/plugins/shared/controls/public/actions/clear_control_action.tsx +++ b/src/platform/plugins/shared/controls/public/actions/clear_control_action.tsx @@ -19,7 +19,7 @@ import { } from '@kbn/ui-actions-plugin/public'; import { isClearableControl } from '../types'; -import { ACTION_CLEAR_CONTROL } from '.'; +import { ACTION_CLEAR_CONTROL } from './constants'; export class ClearControlAction implements Action, FrequentCompatibilityChangeAction diff --git a/src/platform/plugins/shared/controls/public/actions/index.ts b/src/platform/plugins/shared/controls/public/actions/constants.ts similarity index 100% rename from src/platform/plugins/shared/controls/public/actions/index.ts rename to src/platform/plugins/shared/controls/public/actions/constants.ts diff --git a/src/platform/plugins/shared/controls/public/actions/delete_control_action.tsx b/src/platform/plugins/shared/controls/public/actions/delete_control_action.tsx index 7ee55ddd3da69..c8a12500c39ae 100644 --- a/src/platform/plugins/shared/controls/public/actions/delete_control_action.tsx +++ b/src/platform/plugins/shared/controls/public/actions/delete_control_action.tsx @@ -14,7 +14,7 @@ import { i18n } from '@kbn/i18n'; import type { HasUniqueId, EmbeddableApiContext } from '@kbn/presentation-publishing'; import { IncompatibleActionError, type Action } from '@kbn/ui-actions-plugin/public'; -import { ACTION_DELETE_CONTROL } from '.'; +import { ACTION_DELETE_CONTROL } from './constants'; import { coreServices } from '../services/kibana_services'; export class DeleteControlAction implements Action { diff --git a/src/platform/plugins/shared/controls/public/actions/edit_control_action.tsx b/src/platform/plugins/shared/controls/public/actions/edit_control_action.tsx index 0dec1a610d9d4..a7696500aebf9 100644 --- a/src/platform/plugins/shared/controls/public/actions/edit_control_action.tsx +++ b/src/platform/plugins/shared/controls/public/actions/edit_control_action.tsx @@ -14,7 +14,7 @@ import { i18n } from '@kbn/i18n'; import type { EmbeddableApiContext, HasUniqueId } from '@kbn/presentation-publishing'; import { IncompatibleActionError, type Action } from '@kbn/ui-actions-plugin/public'; -import { ACTION_EDIT_CONTROL } from '.'; +import { ACTION_EDIT_CONTROL } from './constants'; export class EditControlAction implements Action { public readonly type = ACTION_EDIT_CONTROL; diff --git a/src/platform/plugins/shared/controls/public/actions/register_actions.ts b/src/platform/plugins/shared/controls/public/actions/register_actions.ts new file mode 100644 index 0000000000000..e69de29bb2d1d diff --git a/src/platform/plugins/shared/controls/public/controls/data_controls/options_list_control/register_options_list_control.ts b/src/platform/plugins/shared/controls/public/controls/data_controls/options_list_control/register_options_list_control.ts index 45f430598fa50..b21864ec90546 100644 --- a/src/platform/plugins/shared/controls/public/controls/data_controls/options_list_control/register_options_list_control.ts +++ b/src/platform/plugins/shared/controls/public/controls/data_controls/options_list_control/register_options_list_control.ts @@ -14,7 +14,7 @@ import { registerControlFactory } from '../../../control_factory_registry'; export function registerOptionsListControl() { registerControlFactory(OPTIONS_LIST_CONTROL, async () => { const [{ getOptionsListControlFactory }] = await Promise.all([ - import('./get_options_list_control_factory'), + import('../../../controls_module'), untilPluginStartServicesReady(), ]); return getOptionsListControlFactory(); diff --git a/src/platform/plugins/shared/controls/public/controls/data_controls/range_slider/register_range_slider_control.ts b/src/platform/plugins/shared/controls/public/controls/data_controls/range_slider/register_range_slider_control.ts index 9f7af0ccae2c3..a2ee5f4822de8 100644 --- a/src/platform/plugins/shared/controls/public/controls/data_controls/range_slider/register_range_slider_control.ts +++ b/src/platform/plugins/shared/controls/public/controls/data_controls/range_slider/register_range_slider_control.ts @@ -14,7 +14,7 @@ import { registerControlFactory } from '../../../control_factory_registry'; export function registerRangeSliderControl() { registerControlFactory(RANGE_SLIDER_CONTROL, async () => { const [{ getRangesliderControlFactory }] = await Promise.all([ - import('./get_range_slider_control_factory'), + import('../../../controls_module'), untilPluginStartServicesReady(), ]); diff --git a/src/platform/plugins/shared/controls/public/controls/timeslider_control/register_timeslider_control.ts b/src/platform/plugins/shared/controls/public/controls/timeslider_control/register_timeslider_control.ts index 93f30fe4b07d3..2937ec322b56f 100644 --- a/src/platform/plugins/shared/controls/public/controls/timeslider_control/register_timeslider_control.ts +++ b/src/platform/plugins/shared/controls/public/controls/timeslider_control/register_timeslider_control.ts @@ -14,7 +14,7 @@ import { registerControlFactory } from '../../control_factory_registry'; export function registerTimeSliderControl() { registerControlFactory(TIME_SLIDER_CONTROL, async () => { const [{ getTimesliderControlFactory }] = await Promise.all([ - import('./get_timeslider_control_factory'), + import('../../controls_module'), untilPluginStartServicesReady(), ]); return getTimesliderControlFactory(); diff --git a/src/platform/plugins/shared/controls/public/controls_module.ts b/src/platform/plugins/shared/controls/public/controls_module.ts new file mode 100644 index 0000000000000..8d6102709da7c --- /dev/null +++ b/src/platform/plugins/shared/controls/public/controls_module.ts @@ -0,0 +1,16 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +export { ClearControlAction } from './actions/clear_control_action'; +export { DeleteControlAction } from './actions/delete_control_action'; +export { EditControlAction } from './actions/edit_control_action'; + +export { getOptionsListControlFactory } from './controls/data_controls/options_list_control/get_options_list_control_factory'; +export { getRangesliderControlFactory } from './controls/data_controls/range_slider/get_range_slider_control_factory'; +export { getTimesliderControlFactory } from './controls/timeslider_control/get_timeslider_control_factory'; \ No newline at end of file diff --git a/src/platform/plugins/shared/controls/public/index.ts b/src/platform/plugins/shared/controls/public/index.ts index eaa800387759b..bd76fd1835262 100644 --- a/src/platform/plugins/shared/controls/public/index.ts +++ b/src/platform/plugins/shared/controls/public/index.ts @@ -16,7 +16,7 @@ export { export type { ControlGroupApi, ControlStateTransform } from './control_group/types'; -export { ACTION_CLEAR_CONTROL, ACTION_DELETE_CONTROL, ACTION_EDIT_CONTROL } from './actions'; +export { ACTION_CLEAR_CONTROL, ACTION_DELETE_CONTROL, ACTION_EDIT_CONTROL } from './actions/constants'; export type { DataControlApi, DataControlFactory } from './controls/data_controls/types'; From a93a68e3e7a5e4ad4dfc04f2e343deb4d3a9e540 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Wed, 15 Jan 2025 15:08:26 -0700 Subject: [PATCH 03/13] async action registry --- .../public/actions/register_actions.ts | 32 +++++++++++++++++++ .../plugins/shared/controls/public/plugin.ts | 23 ++----------- 2 files changed, 35 insertions(+), 20 deletions(-) diff --git a/src/platform/plugins/shared/controls/public/actions/register_actions.ts b/src/platform/plugins/shared/controls/public/actions/register_actions.ts index e69de29bb2d1d..6a2f3f4d60ccd 100644 --- a/src/platform/plugins/shared/controls/public/actions/register_actions.ts +++ b/src/platform/plugins/shared/controls/public/actions/register_actions.ts @@ -0,0 +1,32 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { UiActionsStart } from "@kbn/ui-actions-plugin/public"; +import { ACTION_CLEAR_CONTROL, ACTION_DELETE_CONTROL, ACTION_EDIT_CONTROL } from "./constants"; +import { PANEL_HOVER_TRIGGER } from "@kbn/embeddable-plugin/public"; + +export function registerActions(uiActions: UiActionsStart) { + uiActions.registerActionAsync(ACTION_DELETE_CONTROL, async () => { + const { DeleteControlAction } = await import('../controls_module'); + return new DeleteControlAction(); + }); + uiActions.attachAction(PANEL_HOVER_TRIGGER, ACTION_DELETE_CONTROL); + + uiActions.registerActionAsync(ACTION_EDIT_CONTROL, async () => { + const { EditControlAction } = await import('../controls_module'); + return new EditControlAction(); + }); + uiActions.attachAction(PANEL_HOVER_TRIGGER, ACTION_EDIT_CONTROL); + + uiActions.registerActionAsync(ACTION_CLEAR_CONTROL, async () => { + const { ClearControlAction } = await import('../controls_module'); + return new ClearControlAction(); + }); + uiActions.attachAction(PANEL_HOVER_TRIGGER, ACTION_CLEAR_CONTROL); +} \ No newline at end of file diff --git a/src/platform/plugins/shared/controls/public/plugin.ts b/src/platform/plugins/shared/controls/public/plugin.ts index 3e915e958d111..7c6d1ae91ab6a 100644 --- a/src/platform/plugins/shared/controls/public/plugin.ts +++ b/src/platform/plugins/shared/controls/public/plugin.ts @@ -8,17 +8,13 @@ */ import type { CoreSetup, CoreStart, Plugin } from '@kbn/core/public'; -import { PANEL_HOVER_TRIGGER } from '@kbn/embeddable-plugin/public'; - -import { ClearControlAction } from './actions/clear_control_action'; -import { DeleteControlAction } from './actions/delete_control_action'; -import { EditControlAction } from './actions/edit_control_action'; import { registerControlGroupEmbeddable } from './control_group/register_control_group_embeddable'; import { registerOptionsListControl } from './controls/data_controls/options_list_control/register_options_list_control'; import { registerRangeSliderControl } from './controls/data_controls/range_slider/register_range_slider_control'; import { registerTimeSliderControl } from './controls/timeslider_control/register_timeslider_control'; -import { setKibanaServices, untilPluginStartServicesReady } from './services/kibana_services'; +import { setKibanaServices } from './services/kibana_services'; import type { ControlsPluginSetupDeps, ControlsPluginStartDeps } from './types'; +import { registerActions } from './actions/register_actions'; export class ControlsPlugin implements Plugin @@ -36,22 +32,9 @@ export class ControlsPlugin } public start(coreStart: CoreStart, startPlugins: ControlsPluginStartDeps) { - const { uiActions } = startPlugins; setKibanaServices(coreStart, startPlugins); - untilPluginStartServicesReady().then(() => { - const deleteControlAction = new DeleteControlAction(); - uiActions.registerAction(deleteControlAction); - uiActions.attachAction(PANEL_HOVER_TRIGGER, deleteControlAction.id); - - const editControlAction = new EditControlAction(); - uiActions.registerAction(editControlAction); - uiActions.attachAction(PANEL_HOVER_TRIGGER, editControlAction.id); - - const clearControlAction = new ClearControlAction(); - uiActions.registerAction(clearControlAction); - uiActions.attachAction(PANEL_HOVER_TRIGGER, clearControlAction.id); - }); + registerActions(startPlugins.uiActions); } public stop() {} From 00575c10a4443fbf283f0417449fdc8de22e49b0 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Wed, 15 Jan 2025 15:21:16 -0700 Subject: [PATCH 04/13] replace PANEL_HOVER_TRIGGER with CONTROL_HOVER_TRIGGER --- .../public/panel_actions/index.ts | 2 -- .../public/panel_actions/triggers.ts | 11 ---------- .../public/actions/controls_hover_trigger.ts | 22 +++++++++++++++++++ .../public/actions/register_actions.ts | 16 ++++++++------ .../components/floating_actions.tsx | 16 +++++++------- .../shared/controls/public/controls_module.ts | 2 +- .../plugins/shared/controls/public/index.ts | 6 ++++- .../plugins/shared/embeddable/public/index.ts | 2 -- .../public/ui_actions/register_triggers.ts | 2 -- .../embeddable/public/ui_actions/triggers.ts | 11 ---------- .../translations/translations/fr-FR.json | 4 ---- .../translations/translations/ja-JP.json | 4 ---- .../translations/translations/zh-CN.json | 4 ---- 13 files changed, 45 insertions(+), 57 deletions(-) create mode 100644 src/platform/plugins/shared/controls/public/actions/controls_hover_trigger.ts diff --git a/src/platform/plugins/private/presentation_panel/public/panel_actions/index.ts b/src/platform/plugins/private/presentation_panel/public/panel_actions/index.ts index 43a3ac116cf93..a9f14d09350ca 100644 --- a/src/platform/plugins/private/presentation_panel/public/panel_actions/index.ts +++ b/src/platform/plugins/private/presentation_panel/public/panel_actions/index.ts @@ -11,9 +11,7 @@ export { contextMenuTrigger, CONTEXT_MENU_TRIGGER, panelBadgeTrigger, - panelHoverTrigger, panelNotificationTrigger, PANEL_BADGE_TRIGGER, - PANEL_HOVER_TRIGGER, PANEL_NOTIFICATION_TRIGGER, } from './triggers'; diff --git a/src/platform/plugins/private/presentation_panel/public/panel_actions/triggers.ts b/src/platform/plugins/private/presentation_panel/public/panel_actions/triggers.ts index 18c98074486d9..79c1157ccecad 100644 --- a/src/platform/plugins/private/presentation_panel/public/panel_actions/triggers.ts +++ b/src/platform/plugins/private/presentation_panel/public/panel_actions/triggers.ts @@ -21,17 +21,6 @@ export const contextMenuTrigger: Trigger = { }), }; -export const PANEL_HOVER_TRIGGER = 'PANEL_HOVER_TRIGGER'; -export const panelHoverTrigger: Trigger = { - id: PANEL_HOVER_TRIGGER, - title: i18n.translate('presentationPanel.hoverTrigger.title', { - defaultMessage: 'Panel hover', - }), - description: i18n.translate('presentationPanel.hoverTrigger.description', { - defaultMessage: "A new action will be added to the panel's hover menu", - }), -}; - export const PANEL_BADGE_TRIGGER = 'PANEL_BADGE_TRIGGER'; export const panelBadgeTrigger: Trigger = { id: PANEL_BADGE_TRIGGER, diff --git a/src/platform/plugins/shared/controls/public/actions/controls_hover_trigger.ts b/src/platform/plugins/shared/controls/public/actions/controls_hover_trigger.ts new file mode 100644 index 0000000000000..d4f62495a656c --- /dev/null +++ b/src/platform/plugins/shared/controls/public/actions/controls_hover_trigger.ts @@ -0,0 +1,22 @@ +/* + * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one + * or more contributor license agreements. Licensed under the "Elastic License + * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public + * License v3.0 only", or the "Server Side Public License, v 1". + */ + +import { i18n } from '@kbn/i18n'; +import { Trigger } from '@kbn/ui-actions-plugin/public'; + +export const CONTROL_HOVER_TRIGGER = 'CONTROL_HOVER_TRIGGER'; +export const controlHoverTrigger: Trigger = { + id: CONTROL_HOVER_TRIGGER, + title: i18n.translate('controls.hoverTrigger.title', { + defaultMessage: 'Control hover', + }), + description: i18n.translate('controls.hoverTrigger.description', { + defaultMessage: "Add action to controls's hover menu", + }), +}; diff --git a/src/platform/plugins/shared/controls/public/actions/register_actions.ts b/src/platform/plugins/shared/controls/public/actions/register_actions.ts index 6a2f3f4d60ccd..0d6097759ea6a 100644 --- a/src/platform/plugins/shared/controls/public/actions/register_actions.ts +++ b/src/platform/plugins/shared/controls/public/actions/register_actions.ts @@ -7,26 +7,28 @@ * License v3.0 only", or the "Server Side Public License, v 1". */ -import { UiActionsStart } from "@kbn/ui-actions-plugin/public"; -import { ACTION_CLEAR_CONTROL, ACTION_DELETE_CONTROL, ACTION_EDIT_CONTROL } from "./constants"; -import { PANEL_HOVER_TRIGGER } from "@kbn/embeddable-plugin/public"; +import { UiActionsStart } from '@kbn/ui-actions-plugin/public'; +import { ACTION_CLEAR_CONTROL, ACTION_DELETE_CONTROL, ACTION_EDIT_CONTROL } from './constants'; +import { CONTROL_HOVER_TRIGGER, controlHoverTrigger } from './controls_hover_trigger'; export function registerActions(uiActions: UiActionsStart) { + uiActions.registerTrigger(controlHoverTrigger); + uiActions.registerActionAsync(ACTION_DELETE_CONTROL, async () => { const { DeleteControlAction } = await import('../controls_module'); return new DeleteControlAction(); }); - uiActions.attachAction(PANEL_HOVER_TRIGGER, ACTION_DELETE_CONTROL); + uiActions.attachAction(CONTROL_HOVER_TRIGGER, ACTION_DELETE_CONTROL); uiActions.registerActionAsync(ACTION_EDIT_CONTROL, async () => { const { EditControlAction } = await import('../controls_module'); return new EditControlAction(); }); - uiActions.attachAction(PANEL_HOVER_TRIGGER, ACTION_EDIT_CONTROL); + uiActions.attachAction(CONTROL_HOVER_TRIGGER, ACTION_EDIT_CONTROL); uiActions.registerActionAsync(ACTION_CLEAR_CONTROL, async () => { const { ClearControlAction } = await import('../controls_module'); return new ClearControlAction(); }); - uiActions.attachAction(PANEL_HOVER_TRIGGER, ACTION_CLEAR_CONTROL); -} \ No newline at end of file + uiActions.attachAction(CONTROL_HOVER_TRIGGER, ACTION_CLEAR_CONTROL); +} diff --git a/src/platform/plugins/shared/controls/public/control_group/components/floating_actions.tsx b/src/platform/plugins/shared/controls/public/control_group/components/floating_actions.tsx index 33d03058810c9..b6c51619eda0e 100644 --- a/src/platform/plugins/shared/controls/public/control_group/components/floating_actions.tsx +++ b/src/platform/plugins/shared/controls/public/control_group/components/floating_actions.tsx @@ -12,16 +12,13 @@ import React, { FC, ReactElement, useEffect, useState } from 'react'; import { v4 } from 'uuid'; import { Subscription } from 'rxjs'; -import { - PANEL_HOVER_TRIGGER, - panelHoverTrigger, - type ViewMode, -} from '@kbn/embeddable-plugin/public'; +import { type ViewMode } from '@kbn/embeddable-plugin/public'; import { apiHasUniqueId } from '@kbn/presentation-publishing'; import { Action } from '@kbn/ui-actions-plugin/public'; import { AnyApiAction } from '@kbn/presentation-panel-plugin/public/panel_actions/types'; import { uiActionsService } from '../../services/kibana_services'; import './floating_actions.scss'; +import { CONTROL_HOVER_TRIGGER, controlHoverTrigger } from '../../actions/controls_hover_trigger'; export interface FloatingActionsProps { children: ReactElement; @@ -53,7 +50,7 @@ export const FloatingActions: FC = ({ let canceled = false; const context = { embeddable: api, - trigger: panelHoverTrigger, + trigger: controlHoverTrigger, }; const sortByOrder = (a: Action | FloatingActionItem, b: Action | FloatingActionItem) => { @@ -62,7 +59,7 @@ export const FloatingActions: FC = ({ const getActions: () => Promise = async () => { const actions = ( - await uiActionsService.getTriggerCompatibleActions(PANEL_HOVER_TRIGGER, context) + await uiActionsService.getTriggerCompatibleActions(CONTROL_HOVER_TRIGGER, context) ) .filter((action) => { return action.MenuItem !== undefined && (disabledActions ?? []).indexOf(action.id) === -1; @@ -92,7 +89,10 @@ export const FloatingActions: FC = ({ setFloatingActions(actions); const frequentlyChangingActions = - await uiActionsService.getFrequentlyChangingActionsForTrigger(PANEL_HOVER_TRIGGER, context); + await uiActionsService.getFrequentlyChangingActionsForTrigger( + CONTROL_HOVER_TRIGGER, + context + ); if (canceled) return; for (const action of frequentlyChangingActions) { diff --git a/src/platform/plugins/shared/controls/public/controls_module.ts b/src/platform/plugins/shared/controls/public/controls_module.ts index 8d6102709da7c..834db1de9fb3d 100644 --- a/src/platform/plugins/shared/controls/public/controls_module.ts +++ b/src/platform/plugins/shared/controls/public/controls_module.ts @@ -13,4 +13,4 @@ export { EditControlAction } from './actions/edit_control_action'; export { getOptionsListControlFactory } from './controls/data_controls/options_list_control/get_options_list_control_factory'; export { getRangesliderControlFactory } from './controls/data_controls/range_slider/get_range_slider_control_factory'; -export { getTimesliderControlFactory } from './controls/timeslider_control/get_timeslider_control_factory'; \ No newline at end of file +export { getTimesliderControlFactory } from './controls/timeslider_control/get_timeslider_control_factory'; diff --git a/src/platform/plugins/shared/controls/public/index.ts b/src/platform/plugins/shared/controls/public/index.ts index bd76fd1835262..b87421053bd28 100644 --- a/src/platform/plugins/shared/controls/public/index.ts +++ b/src/platform/plugins/shared/controls/public/index.ts @@ -16,7 +16,11 @@ export { export type { ControlGroupApi, ControlStateTransform } from './control_group/types'; -export { ACTION_CLEAR_CONTROL, ACTION_DELETE_CONTROL, ACTION_EDIT_CONTROL } from './actions/constants'; +export { + ACTION_CLEAR_CONTROL, + ACTION_DELETE_CONTROL, + ACTION_EDIT_CONTROL, +} from './actions/constants'; export type { DataControlApi, DataControlFactory } from './controls/data_controls/types'; diff --git a/src/platform/plugins/shared/embeddable/public/index.ts b/src/platform/plugins/shared/embeddable/public/index.ts index 88dafd108e5ea..31da8691af17e 100644 --- a/src/platform/plugins/shared/embeddable/public/index.ts +++ b/src/platform/plugins/shared/embeddable/public/index.ts @@ -25,10 +25,8 @@ export { isValueClickTriggerContext, MULTI_VALUE_CLICK_TRIGGER, panelBadgeTrigger, - panelHoverTrigger, panelNotificationTrigger, PANEL_BADGE_TRIGGER, - PANEL_HOVER_TRIGGER, PANEL_NOTIFICATION_TRIGGER, SELECT_RANGE_TRIGGER, VALUE_CLICK_TRIGGER, diff --git a/src/platform/plugins/shared/embeddable/public/ui_actions/register_triggers.ts b/src/platform/plugins/shared/embeddable/public/ui_actions/register_triggers.ts index 97d2cf0f58399..b51dd18f6ec0a 100644 --- a/src/platform/plugins/shared/embeddable/public/ui_actions/register_triggers.ts +++ b/src/platform/plugins/shared/embeddable/public/ui_actions/register_triggers.ts @@ -16,12 +16,10 @@ import { selectRangeTrigger, valueClickTrigger, cellValueTrigger, - panelHoverTrigger, } from './triggers'; export const registerTriggers = (uiActions: UiActionsSetup) => { uiActions.registerTrigger(contextMenuTrigger); - uiActions.registerTrigger(panelHoverTrigger); uiActions.registerTrigger(panelBadgeTrigger); uiActions.registerTrigger(panelNotificationTrigger); uiActions.registerTrigger(selectRangeTrigger); diff --git a/src/platform/plugins/shared/embeddable/public/ui_actions/triggers.ts b/src/platform/plugins/shared/embeddable/public/ui_actions/triggers.ts index cdebc6129afb6..2eb67397a07f4 100644 --- a/src/platform/plugins/shared/embeddable/public/ui_actions/triggers.ts +++ b/src/platform/plugins/shared/embeddable/public/ui_actions/triggers.ts @@ -75,17 +75,6 @@ export const contextMenuTrigger: Trigger = { }), }; -export const PANEL_HOVER_TRIGGER = 'PANEL_HOVER_TRIGGER'; -export const panelHoverTrigger: Trigger = { - id: PANEL_HOVER_TRIGGER, - title: i18n.translate('embeddableApi.panelHoverTrigger.title', { - defaultMessage: 'Panel hover', - }), - description: i18n.translate('embeddableApi.panelHoverTrigger.description', { - defaultMessage: "A new action will be added to the panel's hover menu", - }), -}; - export const PANEL_BADGE_TRIGGER = 'PANEL_BADGE_TRIGGER'; export const panelBadgeTrigger: Trigger = { id: PANEL_BADGE_TRIGGER, diff --git a/x-pack/platform/plugins/private/translations/translations/fr-FR.json b/x-pack/platform/plugins/private/translations/translations/fr-FR.json index 2f78ae9f30e5d..b81a509971150 100644 --- a/x-pack/platform/plugins/private/translations/translations/fr-FR.json +++ b/x-pack/platform/plugins/private/translations/translations/fr-FR.json @@ -2766,8 +2766,6 @@ "embeddableApi.multiValueClickTrigger.title": "Clics multiples", "embeddableApi.panelBadgeTrigger.description": "Des actions apparaissent dans la barre de titre lorsqu'un élément pouvant être intégré est chargé dans un panneau.", "embeddableApi.panelBadgeTrigger.title": "Badges du panneau", - "embeddableApi.panelHoverTrigger.description": "Une nouvelle action sera ajoutée au menu flottant du panneau", - "embeddableApi.panelHoverTrigger.title": "Menu contextuel du panneau", "embeddableApi.panelNotificationTrigger.description": "Les actions apparaissent dans l’angle supérieur droit des panneaux.", "embeddableApi.panelNotificationTrigger.title": "Notifications du panneau", "embeddableApi.reactEmbeddable.factoryAlreadyExistsError": "Une usine incorporable pour le type : {key} est déjà enregistrée.", @@ -6221,8 +6219,6 @@ "presentationPanel.filters.filtersTitle": "Filtres", "presentationPanel.filters.queryTitle": "Recherche", "presentationPanel.header.titleAriaLabel": "Cliquez pour modifier le titre : {title}", - "presentationPanel.hoverTrigger.description": "Une nouvelle action sera ajoutée au menu flottant du panneau", - "presentationPanel.hoverTrigger.title": "Menu contextuel du panneau", "presentationPanel.notificationTrigger.description": "Les actions de notification apparaissent dans l'angle supérieur droit des panneaux.", "presentationPanel.notificationTrigger.title": "Notifications du panneau", "presentationPanel.placeholderTitle": "[Aucun titre]", diff --git a/x-pack/platform/plugins/private/translations/translations/ja-JP.json b/x-pack/platform/plugins/private/translations/translations/ja-JP.json index 14d0228dc959b..9c00033385bd8 100644 --- a/x-pack/platform/plugins/private/translations/translations/ja-JP.json +++ b/x-pack/platform/plugins/private/translations/translations/ja-JP.json @@ -2761,8 +2761,6 @@ "embeddableApi.multiValueClickTrigger.title": "マルチクリック", "embeddableApi.panelBadgeTrigger.description": "パネルに埋め込み可能なファイルが読み込まれるときに、アクションがタイトルバーに表示されます。", "embeddableApi.panelBadgeTrigger.title": "パネルバッジ", - "embeddableApi.panelHoverTrigger.description": "新しいアクションがパネルのマウスオーバーメニューに追加されます", - "embeddableApi.panelHoverTrigger.title": "パネルマウスオーバー", "embeddableApi.panelNotificationTrigger.description": "パネルの右上にアクションが表示されます。", "embeddableApi.panelNotificationTrigger.title": "パネル通知", "embeddableApi.reactEmbeddable.factoryAlreadyExistsError": "タイプ\"{key}\"の埋め込み可能ファクトリはすでに登録されています。", @@ -6215,8 +6213,6 @@ "presentationPanel.filters.filtersTitle": "フィルター", "presentationPanel.filters.queryTitle": "クエリー", "presentationPanel.header.titleAriaLabel": "クリックしてタイトルを編集:{title}", - "presentationPanel.hoverTrigger.description": "新しいアクションがパネルのマウスオーバーメニューに追加されます", - "presentationPanel.hoverTrigger.title": "パネルマウスオーバー", "presentationPanel.notificationTrigger.description": "パネルの右上に通知アクションが表示されます。", "presentationPanel.notificationTrigger.title": "パネル通知", "presentationPanel.placeholderTitle": "[タイトルなし]", diff --git a/x-pack/platform/plugins/private/translations/translations/zh-CN.json b/x-pack/platform/plugins/private/translations/translations/zh-CN.json index a5e3dcca2b3d8..6815baa002850 100644 --- a/x-pack/platform/plugins/private/translations/translations/zh-CN.json +++ b/x-pack/platform/plugins/private/translations/translations/zh-CN.json @@ -2755,8 +2755,6 @@ "embeddableApi.multiValueClickTrigger.title": "多次单击", "embeddableApi.panelBadgeTrigger.description": "可嵌入对象在面板加载后,操作便显示在标题栏中。", "embeddableApi.panelBadgeTrigger.title": "面板徽章", - "embeddableApi.panelHoverTrigger.description": "会将一个新操作添加到该面板的悬停菜单", - "embeddableApi.panelHoverTrigger.title": "面板悬停", "embeddableApi.panelNotificationTrigger.description": "操作显示在面板右上角。", "embeddableApi.panelNotificationTrigger.title": "面板通知", "embeddableApi.reactEmbeddable.factoryAlreadyExistsError": "已注册类型为 {key} 的可嵌入工厂。", @@ -6172,8 +6170,6 @@ "presentationPanel.filters.filtersTitle": "筛选", "presentationPanel.filters.queryTitle": "查询", "presentationPanel.header.titleAriaLabel": "单击可编辑标题:{title}", - "presentationPanel.hoverTrigger.description": "会将一个新操作添加到该面板的悬停菜单", - "presentationPanel.hoverTrigger.title": "面板悬停", "presentationPanel.notificationTrigger.description": "通知操作显示在面板右上角。", "presentationPanel.notificationTrigger.title": "面板通知", "presentationPanel.placeholderTitle": "[无标题]", From a566cdd35d1399795a86f6a3c62fcc9feed7c088 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Wed, 15 Jan 2025 15:25:16 -0700 Subject: [PATCH 05/13] remove export of action ides --- src/platform/plugins/shared/controls/public/index.ts | 6 ------ 1 file changed, 6 deletions(-) diff --git a/src/platform/plugins/shared/controls/public/index.ts b/src/platform/plugins/shared/controls/public/index.ts index b87421053bd28..441f8436a1c1a 100644 --- a/src/platform/plugins/shared/controls/public/index.ts +++ b/src/platform/plugins/shared/controls/public/index.ts @@ -16,12 +16,6 @@ export { export type { ControlGroupApi, ControlStateTransform } from './control_group/types'; -export { - ACTION_CLEAR_CONTROL, - ACTION_DELETE_CONTROL, - ACTION_EDIT_CONTROL, -} from './actions/constants'; - export type { DataControlApi, DataControlFactory } from './controls/data_controls/types'; export { From 77b9263a3c0a84c667cbf229e5a6aaff96eab631 Mon Sep 17 00:00:00 2001 From: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Date: Wed, 15 Jan 2025 22:36:06 +0000 Subject: [PATCH 06/13] [CI] Auto-commit changed files from 'node scripts/notice' --- src/platform/plugins/shared/presentation_util/tsconfig.json | 3 --- 1 file changed, 3 deletions(-) diff --git a/src/platform/plugins/shared/presentation_util/tsconfig.json b/src/platform/plugins/shared/presentation_util/tsconfig.json index 44f61e43b1c24..2be8e5c7ad207 100644 --- a/src/platform/plugins/shared/presentation_util/tsconfig.json +++ b/src/platform/plugins/shared/presentation_util/tsconfig.json @@ -15,7 +15,6 @@ "kbn_references": [ "@kbn/core", "@kbn/saved-objects-plugin", - "@kbn/embeddable-plugin", "@kbn/kibana-react-plugin", "@kbn/i18n", "@kbn/expressions-plugin", @@ -34,9 +33,7 @@ "@kbn/code-editor", "@kbn/calculate-width-from-char-count", "@kbn/field-utils", - "@kbn/presentation-publishing", "@kbn/core-ui-settings-browser", - "@kbn/presentation-panel-plugin", ], "exclude": ["target/**/*"] } From fde16bf44aa76841109d55e0f75848c7b54309cb Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Thu, 16 Jan 2025 11:35:03 -0700 Subject: [PATCH 07/13] remove async compatability code --- .../public/actions/clear_control_action.tsx | 26 ++++++++--- ...lear_control_action_compatibility_check.ts | 42 ------------------ .../public/actions/delete_control_action.tsx | 34 +++++++++++++-- ...lete_control_action_compatibility_check.ts | 42 ------------------ .../public/actions/edit_control_action.tsx | 35 +++++++++++++-- ...edit_control_action_compatibility_check.ts | 43 ------------------- .../plugins/shared/controls/public/index.ts | 6 +++ 7 files changed, 88 insertions(+), 140 deletions(-) delete mode 100644 src/platform/plugins/shared/controls/public/actions/clear_control_action_compatibility_check.ts delete mode 100644 src/platform/plugins/shared/controls/public/actions/delete_control_action_compatibility_check.ts delete mode 100644 src/platform/plugins/shared/controls/public/actions/edit_control_action_compatibility_check.ts diff --git a/src/platform/plugins/shared/controls/public/actions/clear_control_action.tsx b/src/platform/plugins/shared/controls/public/actions/clear_control_action.tsx index b9cb4605e89b4..85427b91552c1 100644 --- a/src/platform/plugins/shared/controls/public/actions/clear_control_action.tsx +++ b/src/platform/plugins/shared/controls/public/actions/clear_control_action.tsx @@ -11,15 +11,33 @@ import React, { SyntheticEvent } from 'react'; import { EuiButtonIcon, EuiToolTip } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import type { EmbeddableApiContext, HasUniqueId } from '@kbn/presentation-publishing'; +import { apiCanAccessViewMode, apiHasParentApi, apiHasType, apiHasUniqueId, apiIsOfType, HasParentApi, type EmbeddableApiContext, type HasUniqueId, HasType } from '@kbn/presentation-publishing'; import { IncompatibleActionError, FrequentCompatibilityChangeAction, type Action, } from '@kbn/ui-actions-plugin/public'; -import { isClearableControl } from '../types'; +import { CONTROL_GROUP_TYPE } from '../../common'; +import { CanClearSelections, isClearableControl } from '../types'; import { ACTION_CLEAR_CONTROL } from './constants'; +import { PresentationContainer, apiIsPresentationContainer } from '@kbn/presentation-containers'; + +type ClearControlActionApi = HasType & + HasUniqueId & + CanClearSelections & + HasParentApi; + +const compatibilityCheck = (api: unknown | null): api is ClearControlActionApi => + Boolean( + apiHasType(api) && + apiHasUniqueId(api) && + isClearableControl(api) && + apiHasParentApi(api) && + apiCanAccessViewMode(api.parentApi) && + apiIsOfType(api.parentApi, CONTROL_GROUP_TYPE) && + apiIsPresentationContainer(api.parentApi) + ); export class ClearControlAction implements Action, FrequentCompatibilityChangeAction @@ -73,12 +91,10 @@ export class ClearControlAction } public async isCompatible({ embeddable }: EmbeddableApiContext) { - const { isCompatible } = await import('./clear_control_action_compatibility_check'); - return isCompatible(embeddable); + return compatibilityCheck(embeddable); } public async execute({ embeddable }: EmbeddableApiContext) { - const { compatibilityCheck } = await import('./clear_control_action_compatibility_check'); if (!compatibilityCheck(embeddable)) throw new IncompatibleActionError(); embeddable.clearSelections(); diff --git a/src/platform/plugins/shared/controls/public/actions/clear_control_action_compatibility_check.ts b/src/platform/plugins/shared/controls/public/actions/clear_control_action_compatibility_check.ts deleted file mode 100644 index f04cb91bc9a3a..0000000000000 --- a/src/platform/plugins/shared/controls/public/actions/clear_control_action_compatibility_check.ts +++ /dev/null @@ -1,42 +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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import { PresentationContainer, apiIsPresentationContainer } from '@kbn/presentation-containers'; -import { - HasParentApi, - HasType, - HasUniqueId, - apiCanAccessViewMode, - apiHasParentApi, - apiHasType, - apiHasUniqueId, - apiIsOfType, -} from '@kbn/presentation-publishing'; -import { CONTROL_GROUP_TYPE } from '../../common'; -import { isClearableControl, type CanClearSelections } from '../types'; - -type ClearControlActionApi = HasType & - HasUniqueId & - CanClearSelections & - HasParentApi; - -export const compatibilityCheck = (api: unknown | null): api is ClearControlActionApi => - Boolean( - apiHasType(api) && - apiHasUniqueId(api) && - isClearableControl(api) && - apiHasParentApi(api) && - apiCanAccessViewMode(api.parentApi) && - apiIsOfType(api.parentApi, CONTROL_GROUP_TYPE) && - apiIsPresentationContainer(api.parentApi) - ); - -export function isCompatible(api: unknown) { - return compatibilityCheck(api); -} diff --git a/src/platform/plugins/shared/controls/public/actions/delete_control_action.tsx b/src/platform/plugins/shared/controls/public/actions/delete_control_action.tsx index c8a12500c39ae..5ef40e7443b63 100644 --- a/src/platform/plugins/shared/controls/public/actions/delete_control_action.tsx +++ b/src/platform/plugins/shared/controls/public/actions/delete_control_action.tsx @@ -11,12 +11,40 @@ import React from 'react'; import { EuiButtonIcon, EuiToolTip } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import type { HasUniqueId, EmbeddableApiContext } from '@kbn/presentation-publishing'; +import { + type HasUniqueId, + type EmbeddableApiContext, + type HasType, + type HasParentApi, + type PublishesViewMode, + apiHasType, + apiHasUniqueId, + apiHasParentApi, + apiCanAccessViewMode, + apiIsOfType, + getInheritedViewMode, +} from '@kbn/presentation-publishing'; import { IncompatibleActionError, type Action } from '@kbn/ui-actions-plugin/public'; +import { PresentationContainer, apiIsPresentationContainer } from '@kbn/presentation-containers'; +import { CONTROL_GROUP_TYPE } from '../../common'; import { ACTION_DELETE_CONTROL } from './constants'; import { coreServices } from '../services/kibana_services'; +type DeleteControlActionApi = HasType & + HasUniqueId & + HasParentApi; + +export const compatibilityCheck = (api: unknown | null): api is DeleteControlActionApi => + Boolean( + apiHasType(api) && + apiHasUniqueId(api) && + apiHasParentApi(api) && + apiCanAccessViewMode(api.parentApi) && + apiIsOfType(api.parentApi, CONTROL_GROUP_TYPE) && + apiIsPresentationContainer(api.parentApi) + ); + export class DeleteControlAction implements Action { public readonly type = ACTION_DELETE_CONTROL; public readonly id = ACTION_DELETE_CONTROL; @@ -49,12 +77,10 @@ export class DeleteControlAction implements Action { } public async isCompatible({ embeddable }: EmbeddableApiContext) { - const { isCompatible } = await import('./delete_control_action_compatibility_check'); - return isCompatible(embeddable); + return compatibilityCheck(embeddable) && getInheritedViewMode(embeddable.parentApi) === 'edit'; } public async execute({ embeddable }: EmbeddableApiContext) { - const { compatibilityCheck } = await import('./delete_control_action_compatibility_check'); if (!compatibilityCheck(embeddable)) throw new IncompatibleActionError(); coreServices.overlays diff --git a/src/platform/plugins/shared/controls/public/actions/delete_control_action_compatibility_check.ts b/src/platform/plugins/shared/controls/public/actions/delete_control_action_compatibility_check.ts deleted file mode 100644 index a09b3448b2fc1..0000000000000 --- a/src/platform/plugins/shared/controls/public/actions/delete_control_action_compatibility_check.ts +++ /dev/null @@ -1,42 +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", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import { ViewMode } from '@kbn/embeddable-plugin/public'; -import { PresentationContainer, apiIsPresentationContainer } from '@kbn/presentation-containers'; -import { - HasParentApi, - HasType, - HasUniqueId, - PublishesViewMode, - apiCanAccessViewMode, - apiHasParentApi, - apiHasType, - apiHasUniqueId, - apiIsOfType, - getInheritedViewMode, -} from '@kbn/presentation-publishing'; -import { CONTROL_GROUP_TYPE } from '../../common'; - -type DeleteControlActionApi = HasType & - HasUniqueId & - HasParentApi; - -export const compatibilityCheck = (api: unknown | null): api is DeleteControlActionApi => - Boolean( - apiHasType(api) && - apiHasUniqueId(api) && - apiHasParentApi(api) && - apiCanAccessViewMode(api.parentApi) && - apiIsOfType(api.parentApi, CONTROL_GROUP_TYPE) && - apiIsPresentationContainer(api.parentApi) - ); - -export function isCompatible(api: unknown) { - return compatibilityCheck(api) && getInheritedViewMode(api.parentApi) === ViewMode.EDIT; -} diff --git a/src/platform/plugins/shared/controls/public/actions/edit_control_action.tsx b/src/platform/plugins/shared/controls/public/actions/edit_control_action.tsx index a7696500aebf9..e8244f4229545 100644 --- a/src/platform/plugins/shared/controls/public/actions/edit_control_action.tsx +++ b/src/platform/plugins/shared/controls/public/actions/edit_control_action.tsx @@ -11,10 +11,35 @@ import React from 'react'; import { EuiButtonIcon, EuiToolTip } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import type { EmbeddableApiContext, HasUniqueId } from '@kbn/presentation-publishing'; +import { + apiHasType, + apiHasUniqueId, + hasEditCapabilities, + type EmbeddableApiContext, + type HasUniqueId, + apiHasParentApi, + apiCanAccessViewMode, + apiIsOfType, + getInheritedViewMode, +} from '@kbn/presentation-publishing'; import { IncompatibleActionError, type Action } from '@kbn/ui-actions-plugin/public'; +import { apiIsPresentationContainer } from '@kbn/presentation-containers'; +import { CONTROL_GROUP_TYPE } from '../../common'; import { ACTION_EDIT_CONTROL } from './constants'; +import { DataControlApi } from '../controls/data_controls/types'; + +const compatibilityCheck = (api: unknown): api is DataControlApi => { + return Boolean( + apiHasType(api) && + apiHasUniqueId(api) && + hasEditCapabilities(api) && + apiHasParentApi(api) && + apiCanAccessViewMode(api.parentApi) && + apiIsOfType(api.parentApi, CONTROL_GROUP_TYPE) && + apiIsPresentationContainer(api.parentApi) + ); +}; export class EditControlAction implements Action { public readonly type = ACTION_EDIT_CONTROL; @@ -48,12 +73,14 @@ export class EditControlAction implements Action { } public async isCompatible({ embeddable }: EmbeddableApiContext) { - const { isCompatible } = await import('./edit_control_action_compatibility_check'); - return isCompatible(embeddable); + return ( + compatibilityCheck(embeddable) && + getInheritedViewMode(embeddable.parentApi) === 'edit' && + embeddable.isEditingEnabled() + ); } public async execute({ embeddable }: EmbeddableApiContext) { - const { compatibilityCheck } = await import('./edit_control_action_compatibility_check'); if (!compatibilityCheck(embeddable)) throw new IncompatibleActionError(); await embeddable.onEdit(); } diff --git a/src/platform/plugins/shared/controls/public/actions/edit_control_action_compatibility_check.ts b/src/platform/plugins/shared/controls/public/actions/edit_control_action_compatibility_check.ts deleted file mode 100644 index 0af5a942dd032..0000000000000 --- a/src/platform/plugins/shared/controls/public/actions/edit_control_action_compatibility_check.ts +++ /dev/null @@ -1,43 +0,0 @@ -/* - * Copyright Elasticsearch B.V. and/or licensed to Elasticsearch B.V. under one - * or more contributor license agreements. Licensed under the "Elastic License - * 2.0", the "GNU Affero General Public License v3.0 only", 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", the "GNU Affero General Public - * License v3.0 only", or the "Server Side Public License, v 1". - */ - -import { ViewMode } from '@kbn/embeddable-plugin/public'; -import { apiIsPresentationContainer } from '@kbn/presentation-containers'; -import { - apiCanAccessViewMode, - apiHasParentApi, - apiHasType, - apiHasUniqueId, - apiIsOfType, - getInheritedViewMode, - hasEditCapabilities, -} from '@kbn/presentation-publishing'; - -import { CONTROL_GROUP_TYPE } from '../../common'; -import { DataControlApi } from '../controls/data_controls/types'; - -export const compatibilityCheck = (api: unknown): api is DataControlApi => { - return Boolean( - apiHasType(api) && - apiHasUniqueId(api) && - hasEditCapabilities(api) && - apiHasParentApi(api) && - apiCanAccessViewMode(api.parentApi) && - apiIsOfType(api.parentApi, CONTROL_GROUP_TYPE) && - apiIsPresentationContainer(api.parentApi) - ); -}; - -export function isCompatible(api: unknown) { - return ( - compatibilityCheck(api) && - getInheritedViewMode(api.parentApi) === ViewMode.EDIT && - api.isEditingEnabled() - ); -} diff --git a/src/platform/plugins/shared/controls/public/index.ts b/src/platform/plugins/shared/controls/public/index.ts index 441f8436a1c1a..6455c71e7b5f6 100644 --- a/src/platform/plugins/shared/controls/public/index.ts +++ b/src/platform/plugins/shared/controls/public/index.ts @@ -14,6 +14,12 @@ export { type ControlGroupStateBuilder, } from './control_group/utils/control_group_state_builder'; +export { + ACTION_CLEAR_CONTROL, + ACTION_DELETE_CONTROL, + ACTION_EDIT_CONTROL, +} from './actions/constants'; + export type { ControlGroupApi, ControlStateTransform } from './control_group/types'; export type { DataControlApi, DataControlFactory } from './controls/data_controls/types'; From 6937e77c439f377309955a21824088ad665c36b4 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Thu, 16 Jan 2025 11:39:50 -0700 Subject: [PATCH 08/13] consolidate chunks --- .../control_group_renderer/control_group_renderer_lazy.tsx | 2 +- .../public/control_group/register_control_group_embeddable.ts | 2 +- .../plugins/shared/controls/public/controls_module.ts | 4 ++++ 3 files changed, 6 insertions(+), 2 deletions(-) diff --git a/src/platform/plugins/shared/controls/public/control_group/control_group_renderer/control_group_renderer_lazy.tsx b/src/platform/plugins/shared/controls/public/control_group/control_group_renderer/control_group_renderer_lazy.tsx index e4bf8594ceb38..7ef526f6acd7c 100644 --- a/src/platform/plugins/shared/controls/public/control_group/control_group_renderer/control_group_renderer_lazy.tsx +++ b/src/platform/plugins/shared/controls/public/control_group/control_group_renderer/control_group_renderer_lazy.tsx @@ -12,7 +12,7 @@ import { dynamic } from '@kbn/shared-ux-utility'; import type { ControlGroupRendererProps } from './control_group_renderer'; const Component = dynamic(async () => { - const { ControlGroupRenderer } = await import('./control_group_renderer'); + const { ControlGroupRenderer } = await import('../../controls_module'); return { default: ControlGroupRenderer, }; diff --git a/src/platform/plugins/shared/controls/public/control_group/register_control_group_embeddable.ts b/src/platform/plugins/shared/controls/public/control_group/register_control_group_embeddable.ts index f93458ab6bc4a..8708efda5d830 100644 --- a/src/platform/plugins/shared/controls/public/control_group/register_control_group_embeddable.ts +++ b/src/platform/plugins/shared/controls/public/control_group/register_control_group_embeddable.ts @@ -14,7 +14,7 @@ import { untilPluginStartServicesReady } from '../services/kibana_services'; export function registerControlGroupEmbeddable(embeddableSetup: EmbeddableSetup) { embeddableSetup.registerReactEmbeddableFactory(CONTROL_GROUP_TYPE, async () => { const [{ getControlGroupEmbeddableFactory }] = await Promise.all([ - import('./get_control_group_factory'), + import('../controls_module'), untilPluginStartServicesReady(), ]); return getControlGroupEmbeddableFactory(); diff --git a/src/platform/plugins/shared/controls/public/controls_module.ts b/src/platform/plugins/shared/controls/public/controls_module.ts index 834db1de9fb3d..56103dffe7c3e 100644 --- a/src/platform/plugins/shared/controls/public/controls_module.ts +++ b/src/platform/plugins/shared/controls/public/controls_module.ts @@ -11,6 +11,10 @@ export { ClearControlAction } from './actions/clear_control_action'; export { DeleteControlAction } from './actions/delete_control_action'; export { EditControlAction } from './actions/edit_control_action'; +export { getControlGroupEmbeddableFactory } from './control_group/get_control_group_factory'; + export { getOptionsListControlFactory } from './controls/data_controls/options_list_control/get_options_list_control_factory'; export { getRangesliderControlFactory } from './controls/data_controls/range_slider/get_range_slider_control_factory'; export { getTimesliderControlFactory } from './controls/timeslider_control/get_timeslider_control_factory'; + +export { ControlGroupRenderer } from './control_group/control_group_renderer/control_group_renderer'; \ No newline at end of file From fccf72ba2491480a9fc1f5490a033137f58a46df Mon Sep 17 00:00:00 2001 From: kibanamachine <42973632+kibanamachine@users.noreply.github.com> Date: Thu, 16 Jan 2025 19:01:13 +0000 Subject: [PATCH 09/13] [CI] Auto-commit changed files from 'node scripts/eslint --no-cache --fix' --- .../public/actions/clear_control_action.tsx | 14 ++++++++++++-- .../shared/controls/public/controls_module.ts | 2 +- 2 files changed, 13 insertions(+), 3 deletions(-) diff --git a/src/platform/plugins/shared/controls/public/actions/clear_control_action.tsx b/src/platform/plugins/shared/controls/public/actions/clear_control_action.tsx index 85427b91552c1..f435f7e885c5b 100644 --- a/src/platform/plugins/shared/controls/public/actions/clear_control_action.tsx +++ b/src/platform/plugins/shared/controls/public/actions/clear_control_action.tsx @@ -11,17 +11,27 @@ import React, { SyntheticEvent } from 'react'; import { EuiButtonIcon, EuiToolTip } from '@elastic/eui'; import { i18n } from '@kbn/i18n'; -import { apiCanAccessViewMode, apiHasParentApi, apiHasType, apiHasUniqueId, apiIsOfType, HasParentApi, type EmbeddableApiContext, type HasUniqueId, HasType } from '@kbn/presentation-publishing'; +import { + apiCanAccessViewMode, + apiHasParentApi, + apiHasType, + apiHasUniqueId, + apiIsOfType, + HasParentApi, + type EmbeddableApiContext, + type HasUniqueId, + HasType, +} from '@kbn/presentation-publishing'; import { IncompatibleActionError, FrequentCompatibilityChangeAction, type Action, } from '@kbn/ui-actions-plugin/public'; +import { PresentationContainer, apiIsPresentationContainer } from '@kbn/presentation-containers'; import { CONTROL_GROUP_TYPE } from '../../common'; import { CanClearSelections, isClearableControl } from '../types'; import { ACTION_CLEAR_CONTROL } from './constants'; -import { PresentationContainer, apiIsPresentationContainer } from '@kbn/presentation-containers'; type ClearControlActionApi = HasType & HasUniqueId & diff --git a/src/platform/plugins/shared/controls/public/controls_module.ts b/src/platform/plugins/shared/controls/public/controls_module.ts index 56103dffe7c3e..3dbcdf910cccb 100644 --- a/src/platform/plugins/shared/controls/public/controls_module.ts +++ b/src/platform/plugins/shared/controls/public/controls_module.ts @@ -17,4 +17,4 @@ export { getOptionsListControlFactory } from './controls/data_controls/options_l export { getRangesliderControlFactory } from './controls/data_controls/range_slider/get_range_slider_control_factory'; export { getTimesliderControlFactory } from './controls/timeslider_control/get_timeslider_control_factory'; -export { ControlGroupRenderer } from './control_group/control_group_renderer/control_group_renderer'; \ No newline at end of file +export { ControlGroupRenderer } from './control_group/control_group_renderer/control_group_renderer'; From 33dd6bb01589808d0cacf5d7e8b9157865bd6978 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Thu, 16 Jan 2025 14:20:33 -0700 Subject: [PATCH 10/13] fix jest test --- .../public/control_group/components/control_panel.test.tsx | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/platform/plugins/shared/controls/public/control_group/components/control_panel.test.tsx b/src/platform/plugins/shared/controls/public/control_group/components/control_panel.test.tsx index 0f6d8b07b324a..df5d56dca7c3c 100644 --- a/src/platform/plugins/shared/controls/public/control_group/components/control_panel.test.tsx +++ b/src/platform/plugins/shared/controls/public/control_group/components/control_panel.test.tsx @@ -11,12 +11,13 @@ import React, { useImperativeHandle } from 'react'; import { BehaviorSubject } from 'rxjs'; import { setMockedPresentationUtilServices } from '@kbn/presentation-util-plugin/public/mocks'; -import { uiActionsService } from '@kbn/presentation-util-plugin/public/services/kibana_services'; import { render, waitFor } from '@testing-library/react'; +import { Action } from '@kbn/ui-actions-plugin/public'; import type { ControlLabelPosition, ControlWidth } from '../../../common'; +import { uiActionsService } from '../../services/kibana_services'; import { ControlPanel } from './control_panel'; -import { Action } from '@kbn/ui-actions-plugin/public'; + describe('render', () => { let mockApi = {}; From 223ab06e72b274324158a3e34d5d17a48344bece Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Thu, 16 Jan 2025 14:22:47 -0700 Subject: [PATCH 11/13] update limits.yml --- packages/kbn-optimizer/limits.yml | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/packages/kbn-optimizer/limits.yml b/packages/kbn-optimizer/limits.yml index 6f31687b36bac..be932ec7030b0 100644 --- a/packages/kbn-optimizer/limits.yml +++ b/packages/kbn-optimizer/limits.yml @@ -18,7 +18,7 @@ pageLoadAssetSize: cloudSecurityPosture: 34398 console: 61298 contentManagement: 16254 - controls: 60000 + controls: 12000 core: 564663 crossClusterReplication: 65408 customIntegrations: 22034 @@ -123,7 +123,7 @@ pageLoadAssetSize: osquery: 107090 painlessLab: 179748 presentationPanel: 11468 - presentationUtil: 33186 + presentationUtil: 25000 productDocBase: 22500 profiling: 36694 remoteClusters: 51327 From dcc5b3b86f36ea5117ec6ff619699c80d1d4a00c Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Thu, 16 Jan 2025 14:24:37 -0700 Subject: [PATCH 12/13] embeddable plugin limit --- packages/kbn-optimizer/limits.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/packages/kbn-optimizer/limits.yml b/packages/kbn-optimizer/limits.yml index be932ec7030b0..c4f46400dc464 100644 --- a/packages/kbn-optimizer/limits.yml +++ b/packages/kbn-optimizer/limits.yml @@ -37,7 +37,7 @@ pageLoadAssetSize: discover: 99999 discoverEnhanced: 42730 discoverShared: 17111 - embeddable: 87309 + embeddable: 24000 embeddableEnhanced: 22107 enterpriseSearch: 66810 entityManager: 17175 From 829764b814be3595dc7ede5c15f490674c8469c0 Mon Sep 17 00:00:00 2001 From: Nathan Reese Date: Thu, 16 Jan 2025 14:45:58 -0700 Subject: [PATCH 13/13] eslint --- .../public/control_group/components/control_panel.test.tsx | 1 - 1 file changed, 1 deletion(-) diff --git a/src/platform/plugins/shared/controls/public/control_group/components/control_panel.test.tsx b/src/platform/plugins/shared/controls/public/control_group/components/control_panel.test.tsx index df5d56dca7c3c..ad2a1461a1d5b 100644 --- a/src/platform/plugins/shared/controls/public/control_group/components/control_panel.test.tsx +++ b/src/platform/plugins/shared/controls/public/control_group/components/control_panel.test.tsx @@ -18,7 +18,6 @@ import type { ControlLabelPosition, ControlWidth } from '../../../common'; import { uiActionsService } from '../../services/kibana_services'; import { ControlPanel } from './control_panel'; - describe('render', () => { let mockApi = {}; const Component = React.forwardRef((_, ref) => {