From 7826a3945677f8adc685e190b710e5dca1ad69bb Mon Sep 17 00:00:00 2001 From: Stratoula Kalafateli Date: Fri, 5 May 2023 12:42:11 +0300 Subject: [PATCH] [Visualizations][Lens] Hide incompatible actions from the panels (#156667) ## Summary Closes https://github.com/elastic/kibana/issues/156119 Closes https://github.com/elastic/kibana/issues/156114 This PR 1. Removes the convert to Lens action if visualize permissions are set to None image 2. Removes the edit actions if visualize permisions are set to None image ### 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 --- .../public/actions/edit_in_lens_action.tsx | 11 ++++++-- .../create_vis_embeddable_from_object.ts | 1 + .../embeddable/visualize_embeddable.tsx | 6 +++-- .../public/embeddable/embeddable.test.tsx | 27 +++++++++++++++++++ .../lens/public/embeddable/embeddable.tsx | 5 +++- .../public/embeddable/embeddable_factory.ts | 1 + 6 files changed, 46 insertions(+), 5 deletions(-) diff --git a/src/plugins/visualizations/public/actions/edit_in_lens_action.tsx b/src/plugins/visualizations/public/actions/edit_in_lens_action.tsx index 07268726359badd..b86e2b2dbb37a55 100644 --- a/src/plugins/visualizations/public/actions/edit_in_lens_action.tsx +++ b/src/plugins/visualizations/public/actions/edit_in_lens_action.tsx @@ -17,7 +17,13 @@ import { IEmbeddable, ViewMode } from '@kbn/embeddable-plugin/public'; import { Action } from '@kbn/ui-actions-plugin/public'; import { VisualizeEmbeddable } from '../embeddable'; import { DASHBOARD_VISUALIZATION_PANEL_TRIGGER } from '../triggers'; -import { getUiActions, getApplication, getEmbeddable, getUsageCollection } from '../services'; +import { + getUiActions, + getApplication, + getEmbeddable, + getUsageCollection, + getCapabilities, +} from '../services'; export const ACTION_EDIT_IN_LENS = 'ACTION_EDIT_IN_LENS'; @@ -116,7 +122,8 @@ export class EditInLensAction implements Action { async isCompatible(context: ActionExecutionContext) { const { embeddable } = context; - if (!isVisualizeEmbeddable(embeddable)) { + const { visualize } = getCapabilities(); + if (!isVisualizeEmbeddable(embeddable) || !visualize.show) { return false; } const vis = embeddable.getVis(); diff --git a/src/plugins/visualizations/public/embeddable/create_vis_embeddable_from_object.ts b/src/plugins/visualizations/public/embeddable/create_vis_embeddable_from_object.ts index 8fb107f827cd6a8..fdcdc25d21043ff 100644 --- a/src/plugins/visualizations/public/embeddable/create_vis_embeddable_from_object.ts +++ b/src/plugins/visualizations/public/embeddable/create_vis_embeddable_from_object.ts @@ -62,6 +62,7 @@ export const createVisEmbeddableFromObject = const capabilities = { visualizeSave: Boolean(getCapabilities().visualize.save), dashboardSave: Boolean(getCapabilities().dashboard?.showWriteControls), + visualizeOpen: Boolean(getCapabilities().visualize?.show), }; return createVisualizeEmbeddableAsync( diff --git a/src/plugins/visualizations/public/embeddable/visualize_embeddable.tsx b/src/plugins/visualizations/public/embeddable/visualize_embeddable.tsx index a4cf5466422b296..a8eaca1552cd071 100644 --- a/src/plugins/visualizations/public/embeddable/visualize_embeddable.tsx +++ b/src/plugins/visualizations/public/embeddable/visualize_embeddable.tsx @@ -62,7 +62,7 @@ export interface VisualizeEmbeddableConfiguration { indexPatterns?: DataView[]; editPath: string; editUrl: string; - capabilities: { visualizeSave: boolean; dashboardSave: boolean }; + capabilities: { visualizeSave: boolean; dashboardSave: boolean; visualizeOpen: boolean }; deps: VisualizeEmbeddableFactoryDeps; } @@ -171,7 +171,9 @@ export class VisualizeEmbeddable if (this.attributeService) { const isByValue = !this.inputIsRefType(initialInput); - const editable = capabilities.visualizeSave || (isByValue && capabilities.dashboardSave); + const editable = + capabilities.visualizeSave || + (isByValue && capabilities.dashboardSave && capabilities.visualizeOpen); this.updateOutput({ ...this.getOutput(), editable }); } diff --git a/x-pack/plugins/lens/public/embeddable/embeddable.test.tsx b/x-pack/plugins/lens/public/embeddable/embeddable.test.tsx index 5e48e1f46dd6381..1ab012ef8448358 100644 --- a/x-pack/plugins/lens/public/embeddable/embeddable.test.tsx +++ b/x-pack/plugins/lens/public/embeddable/embeddable.test.tsx @@ -166,6 +166,7 @@ describe('embeddable', () => { capabilities: { canSaveDashboards: true, canSaveVisualizations: true, + canOpenVisualizations: true, discover: {}, navLinks: {}, }, @@ -361,6 +362,7 @@ describe('embeddable', () => { capabilities: { canSaveDashboards: true, canSaveVisualizations: true, + canOpenVisualizations: true, discover: {}, navLinks: {}, }, @@ -413,6 +415,7 @@ describe('embeddable', () => { capabilities: { canSaveDashboards: true, canSaveVisualizations: true, + canOpenVisualizations: true, discover: {}, navLinks: {}, }, @@ -940,6 +943,7 @@ describe('embeddable', () => { capabilities: { canSaveDashboards: true, canSaveVisualizations: true, + canOpenVisualizations: true, discover: {}, navLinks: {}, }, @@ -1039,6 +1043,7 @@ describe('embeddable', () => { capabilities: { canSaveDashboards: true, canSaveVisualizations: true, + canOpenVisualizations: true, discover: {}, navLinks: {}, }, @@ -1135,6 +1140,7 @@ describe('embeddable', () => { capabilities: { canSaveDashboards: true, canSaveVisualizations: true, + canOpenVisualizations: true, discover: {}, navLinks: {}, }, @@ -1186,4 +1192,25 @@ describe('embeddable', () => { }) ); }); + + it('should not be editable for no visualize library privileges', async () => { + const embeddable = new Embeddable( + getEmbeddableProps({ + capabilities: { + canSaveDashboards: false, + canSaveVisualizations: true, + canOpenVisualizations: false, + discover: {}, + navLinks: {}, + }, + }), + { + timeRange: { + from: 'now-15m', + to: 'now', + }, + } as LensEmbeddableInput + ); + expect(embeddable.getOutput().editable).toBeUndefined(); + }); }); diff --git a/x-pack/plugins/lens/public/embeddable/embeddable.tsx b/x-pack/plugins/lens/public/embeddable/embeddable.tsx index 787200e53315b06..43a871ccf326f6f 100644 --- a/x-pack/plugins/lens/public/embeddable/embeddable.tsx +++ b/x-pack/plugins/lens/public/embeddable/embeddable.tsx @@ -208,6 +208,7 @@ export interface LensEmbeddableDeps { getTriggerCompatibleActions?: UiActionsStart['getTriggerCompatibleActions']; capabilities: { canSaveVisualizations: boolean; + canOpenVisualizations: boolean; canSaveDashboards: boolean; navLinks: Capabilities['navLinks']; discover: Capabilities['discover']; @@ -1353,7 +1354,9 @@ export class Embeddable private getIsEditable() { return ( this.deps.capabilities.canSaveVisualizations || - (!this.inputIsRefType(this.getInput()) && this.deps.capabilities.canSaveDashboards) + (!this.inputIsRefType(this.getInput()) && + this.deps.capabilities.canSaveDashboards && + this.deps.capabilities.canOpenVisualizations) ); } diff --git a/x-pack/plugins/lens/public/embeddable/embeddable_factory.ts b/x-pack/plugins/lens/public/embeddable/embeddable_factory.ts index f57e532bc138041..f31e8dd7dcad71c 100644 --- a/x-pack/plugins/lens/public/embeddable/embeddable_factory.ts +++ b/x-pack/plugins/lens/public/embeddable/embeddable_factory.ts @@ -140,6 +140,7 @@ export class EmbeddableFactory implements EmbeddableFactoryDefinition { capabilities: { canSaveDashboards: Boolean(capabilities.dashboard?.showWriteControls), canSaveVisualizations: Boolean(capabilities.visualize.save), + canOpenVisualizations: Boolean(capabilities.visualize.show), navLinks: capabilities.navLinks, discover: capabilities.discover, },