diff --git a/src/plugins/embeddable/public/embeddable_panel/panel_header/use_embeddable_panel_badges.tsx b/src/plugins/embeddable/public/embeddable_panel/panel_header/use_embeddable_panel_badges.tsx index 0e8bcdd8ac9c79..7d8fa41a51158c 100644 --- a/src/plugins/embeddable/public/embeddable_panel/panel_header/use_embeddable_panel_badges.tsx +++ b/src/plugins/embeddable/public/embeddable_panel/panel_header/use_embeddable_panel_badges.tsx @@ -106,18 +106,30 @@ export const useEmbeddablePanelBadges = ( const badgeComponents = useMemo( () => - badges?.map((badge) => ( - badge.execute({ embeddable, trigger: panelBadgeTrigger })} - onClickAriaLabel={badge.getDisplayName({ embeddable, trigger: panelBadgeTrigger })} - data-test-subj={`embeddablePanelBadge-${badge.id}`} - > - {badge.getDisplayName({ embeddable, trigger: panelBadgeTrigger })} - - )), + badges?.map((badge) => { + const badgeComponent = ( + badge.execute({ embeddable, trigger: panelBadgeTrigger })} + onClickAriaLabel={badge.getDisplayName({ embeddable, trigger: panelBadgeTrigger })} + data-test-subj={`embeddablePanelBadge-${badge.id}`} + > + {badge.getDisplayName({ embeddable, trigger: panelBadgeTrigger })} + + ); + + const tooltip = badge.getDisplayNameTooltip + ? badge.getDisplayNameTooltip({ embeddable, trigger: panelBadgeTrigger }) + : ''; + + return tooltip ? ( + {badgeComponent} + ) : ( + badgeComponent + ); + }), [badges, embeddable] ); diff --git a/src/plugins/input_control_vis/kibana.jsonc b/src/plugins/input_control_vis/kibana.jsonc index c4a0df59b8e15a..129396f15ace68 100644 --- a/src/plugins/input_control_vis/kibana.jsonc +++ b/src/plugins/input_control_vis/kibana.jsonc @@ -12,10 +12,11 @@ "expressions", "visDefaultEditor", "visualizations", - "unifiedSearch" + "unifiedSearch", + "uiActions" ], "requiredBundles": [ - "kibanaReact" + "kibanaReact", "embeddable" ] } } diff --git a/src/plugins/input_control_vis/public/deprecation_badge.ts b/src/plugins/input_control_vis/public/deprecation_badge.ts new file mode 100644 index 00000000000000..5c65301066800b --- /dev/null +++ b/src/plugins/input_control_vis/public/deprecation_badge.ts @@ -0,0 +1,54 @@ +/* + * 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 { Action } from '@kbn/ui-actions-plugin/public'; + +import { Embeddable, ViewMode } from '@kbn/embeddable-plugin/public'; +import { i18n } from '@kbn/i18n'; +import { VisualizeInput } from '@kbn/visualizations-plugin/public'; + +export const ACTION_DEPRECATION_BADGE = 'ACTION_INPUT_CONTROL_DEPRECATION_BADGE'; + +export interface DeprecationBadgeActionContext { + embeddable: Embeddable; +} + +export class InputControlDeprecationBadge implements Action { + public id = ACTION_DEPRECATION_BADGE; + public type = ACTION_DEPRECATION_BADGE; + public disabled = true; + + public getDisplayName() { + return i18n.translate('inputControl.deprecationBadgeAction.deprecationBadgeLabel', { + defaultMessage: 'Deprecated', + }); + } + + public getIconType() { + return 'warning'; + } + + public getDisplayNameTooltip() { + return i18n.translate('inputControl.deprecationBadgeAction.deprecationWarningDescription', { + defaultMessage: + 'Input controls are deprecated and will be removed in a future release. Use the new Controls to filter and interact with your dashboard data.', + }); + } + + public async isCompatible({ embeddable }: DeprecationBadgeActionContext) { + return ( + embeddable.getInput().viewMode === ViewMode.EDIT && + embeddable.getInput()?.savedVis?.type === 'input_control_vis' + ); + } + + public async execute() { + // do nothing + return; + } +} diff --git a/src/plugins/input_control_vis/public/plugin.ts b/src/plugins/input_control_vis/public/plugin.ts index 07a71e450ac72f..3cd54c2596a299 100644 --- a/src/plugins/input_control_vis/public/plugin.ts +++ b/src/plugins/input_control_vis/public/plugin.ts @@ -15,10 +15,13 @@ import { } from '@kbn/unified-search-plugin/public'; import { Plugin as ExpressionsPublicPlugin } from '@kbn/expressions-plugin/public'; import { VisualizationsSetup, VisualizationsStart } from '@kbn/visualizations-plugin/public'; +import { UiActionsStart } from '@kbn/ui-actions-plugin/public'; +import { PANEL_BADGE_TRIGGER } from '@kbn/embeddable-plugin/public'; import { createInputControlVisFn } from './input_control_fn'; import { getInputControlVisRenderer } from './input_control_vis_renderer'; import { createInputControlVisTypeDefinition } from './input_control_vis_type'; import { InputControlPublicConfig } from '../config'; +import { InputControlDeprecationBadge } from './deprecation_badge'; type InputControlVisCoreSetup = CoreSetup; @@ -48,6 +51,7 @@ export interface InputControlVisPluginStartDependencies { visualizations: VisualizationsStart; data: DataPublicPluginStart; unifiedSearch: UnifiedSearchPublicPluginStart; + uiActions: UiActionsStart; } /** @internal */ @@ -78,5 +82,12 @@ export class InputControlVisPlugin implements Plugin { public start(core: CoreStart, deps: InputControlVisPluginStartDependencies) { // nothing to do here + const { uiActions } = deps; + + const deprecationBadge = new InputControlDeprecationBadge(); + + uiActions.addTriggerAction(PANEL_BADGE_TRIGGER, deprecationBadge); + + return {}; } } diff --git a/src/plugins/input_control_vis/tsconfig.json b/src/plugins/input_control_vis/tsconfig.json index dbe5d4e2f28d70..876a37b925391f 100644 --- a/src/plugins/input_control_vis/tsconfig.json +++ b/src/plugins/input_control_vis/tsconfig.json @@ -23,6 +23,8 @@ "@kbn/i18n-react", "@kbn/test-jest-helpers", "@kbn/config-schema", + "@kbn/ui-actions-plugin", + "@kbn/embeddable-plugin", ], "exclude": [ "target/**/*",