Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

[Visualizations][Lens] Hide incompatible actions from the panels #156667

Merged
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
Expand Up @@ -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';

Expand Down Expand Up @@ -116,7 +122,8 @@ export class EditInLensAction implements Action<EditInLensContext> {

async isCompatible(context: ActionExecutionContext<EditInLensContext>) {
const { embeddable } = context;
if (!isVisualizeEmbeddable(embeddable)) {
const { visualize } = getCapabilities();
if (!isVisualizeEmbeddable(embeddable) || !visualize.show) {
return false;
}
const vis = embeddable.getVis();
Expand Down
Expand Up @@ -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(
Expand Down
Expand Up @@ -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;
}

Expand Down Expand Up @@ -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 });
}

Expand Down
27 changes: 27 additions & 0 deletions x-pack/plugins/lens/public/embeddable/embeddable.test.tsx
Expand Up @@ -166,6 +166,7 @@ describe('embeddable', () => {
capabilities: {
canSaveDashboards: true,
canSaveVisualizations: true,
canOpenVisualizations: true,
discover: {},
navLinks: {},
},
Expand Down Expand Up @@ -361,6 +362,7 @@ describe('embeddable', () => {
capabilities: {
canSaveDashboards: true,
canSaveVisualizations: true,
canOpenVisualizations: true,
discover: {},
navLinks: {},
},
Expand Down Expand Up @@ -413,6 +415,7 @@ describe('embeddable', () => {
capabilities: {
canSaveDashboards: true,
canSaveVisualizations: true,
canOpenVisualizations: true,
discover: {},
navLinks: {},
},
Expand Down Expand Up @@ -940,6 +943,7 @@ describe('embeddable', () => {
capabilities: {
canSaveDashboards: true,
canSaveVisualizations: true,
canOpenVisualizations: true,
discover: {},
navLinks: {},
},
Expand Down Expand Up @@ -1039,6 +1043,7 @@ describe('embeddable', () => {
capabilities: {
canSaveDashboards: true,
canSaveVisualizations: true,
canOpenVisualizations: true,
discover: {},
navLinks: {},
},
Expand Down Expand Up @@ -1135,6 +1140,7 @@ describe('embeddable', () => {
capabilities: {
canSaveDashboards: true,
canSaveVisualizations: true,
canOpenVisualizations: true,
discover: {},
navLinks: {},
},
Expand Down Expand Up @@ -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();
});
});
5 changes: 4 additions & 1 deletion x-pack/plugins/lens/public/embeddable/embeddable.tsx
Expand Up @@ -208,6 +208,7 @@ export interface LensEmbeddableDeps {
getTriggerCompatibleActions?: UiActionsStart['getTriggerCompatibleActions'];
capabilities: {
canSaveVisualizations: boolean;
canOpenVisualizations: boolean;
canSaveDashboards: boolean;
navLinks: Capabilities['navLinks'];
discover: Capabilities['discover'];
Expand Down Expand Up @@ -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)
);
}

Expand Down
Expand Up @@ -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,
},
Expand Down