feat: Show delete button based on workflow permissions (#4686)

This commit is contained in:
Alex Grozav 2022-11-22 13:40:20 +02:00 committed by GitHub
parent 6f8d0de55d
commit 4f64e26a83
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
2 changed files with 25 additions and 11 deletions

View file

@ -113,7 +113,7 @@ import SaveButton from "@/components/SaveButton.vue";
import TagsDropdown from "@/components/TagsDropdown.vue"; import TagsDropdown from "@/components/TagsDropdown.vue";
import InlineTextEdit from "@/components/InlineTextEdit.vue"; import InlineTextEdit from "@/components/InlineTextEdit.vue";
import BreakpointsObserver from "@/components/BreakpointsObserver.vue"; import BreakpointsObserver from "@/components/BreakpointsObserver.vue";
import { IWorkflowDataUpdate, IWorkflowToShare } from "@/Interface"; import {IWorkflowDataUpdate, IWorkflowDb, IWorkflowToShare} from "@/Interface";
import { saveAs } from 'file-saver'; import { saveAs } from 'file-saver';
import { titleChange } from "../mixins/titleChange"; import { titleChange } from "../mixins/titleChange";
@ -124,6 +124,8 @@ import { useSettingsStore } from "@/stores/settings";
import { useWorkflowsStore } from "@/stores/workflows"; import { useWorkflowsStore } from "@/stores/workflows";
import { useRootStore } from "@/stores/n8nRootStore"; import { useRootStore } from "@/stores/n8nRootStore";
import { useTagsStore } from "@/stores/tags"; import { useTagsStore } from "@/stores/tags";
import {getWorkflowPermissions, IPermissions} from "@/permissions";
import {useUsersStore} from "@/stores/users";
const hasChanged = (prev: string[], curr: string[]) => { const hasChanged = (prev: string[], curr: string[]) => {
if (prev.length !== curr.length) { if (prev.length !== curr.length) {
@ -164,6 +166,7 @@ export default mixins(workflowHelpers, titleChange).extend({
useSettingsStore, useSettingsStore,
useUIStore, useUIStore,
useWorkflowsStore, useWorkflowsStore,
useUsersStore,
), ),
isWorkflowActive(): boolean { isWorkflowActive(): boolean {
return this.workflowsStore.isWorkflowActive; return this.workflowsStore.isWorkflowActive;
@ -183,6 +186,9 @@ export default mixins(workflowHelpers, titleChange).extend({
isWorkflowSaving(): boolean { isWorkflowSaving(): boolean {
return this.uiStore.isActionActive('workflowSaving'); return this.uiStore.isActionActive('workflowSaving');
}, },
workflow(): IWorkflowDb {
return this.workflowsStore.workflow;
},
currentWorkflowId(): string { currentWorkflowId(): string {
return this.workflowsStore.workflowId; return this.workflowsStore.workflowId;
}, },
@ -192,6 +198,9 @@ export default mixins(workflowHelpers, titleChange).extend({
onExecutionsTab(): boolean { onExecutionsTab(): boolean {
return [ VIEWS.EXECUTION_HOME.toString(), VIEWS.EXECUTIONS.toString(), VIEWS.EXECUTION_PREVIEW ].includes(this.$route.name || ''); return [ VIEWS.EXECUTION_HOME.toString(), VIEWS.EXECUTIONS.toString(), VIEWS.EXECUTION_PREVIEW ].includes(this.$route.name || '');
}, },
workflowPermissions(): IPermissions {
return getWorkflowPermissions(this.usersStore.currentUser, this.workflow);
},
workflowMenuItems(): Array<{}> { workflowMenuItems(): Array<{}> {
return [ return [
{ {
@ -219,13 +228,15 @@ export default mixins(workflowHelpers, titleChange).extend({
label: this.$locale.baseText('generic.settings'), label: this.$locale.baseText('generic.settings'),
disabled: !this.onWorkflowPage || this.isNewWorkflow, disabled: !this.onWorkflowPage || this.isNewWorkflow,
}, },
{ ...(this.workflowPermissions.delete ? [
id: WORKFLOW_MENU_ACTIONS.DELETE, {
label: this.$locale.baseText('menuActions.delete'), id: WORKFLOW_MENU_ACTIONS.DELETE,
disabled: !this.onWorkflowPage || this.isNewWorkflow, label: this.$locale.baseText('menuActions.delete'),
customClass: this.$style.deleteItem, disabled: !this.onWorkflowPage || this.isNewWorkflow,
divided: true, customClass: this.$style.deleteItem,
}, divided: true,
},
] : []),
]; ];
}, },
}, },

View file

@ -55,8 +55,10 @@ export const parsePermissionsTable = (user: IUser | null, table: IPermissionsTab
export const getCredentialPermissions = (user: IUser | null, credential: ICredentialsResponse) => { export const getCredentialPermissions = (user: IUser | null, credential: ICredentialsResponse) => {
const settingsStore = useSettingsStore(); const settingsStore = useSettingsStore();
const isSharingEnabled = settingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.Sharing);
const table: IPermissionsTable = [ const table: IPermissionsTable = [
{ name: UserRole.ResourceOwner, test: () => !!(credential && credential.ownedBy && credential.ownedBy.id === user?.id) || !settingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.Sharing) }, { name: UserRole.ResourceOwner, test: () => !!(credential && credential.ownedBy && credential.ownedBy.id === user?.id) || !isSharingEnabled },
{ name: UserRole.ResourceReader, test: () => !!(credential && credential.sharedWith && credential.sharedWith.find((sharee) => sharee.id === user?.id)) }, { name: UserRole.ResourceReader, test: () => !!(credential && credential.sharedWith && credential.sharedWith.find((sharee) => sharee.id === user?.id)) },
{ name: 'read', test: [UserRole.ResourceOwner, UserRole.InstanceOwner, UserRole.ResourceReader] }, { name: 'read', test: [UserRole.ResourceOwner, UserRole.InstanceOwner, UserRole.ResourceReader] },
{ name: 'save', test: [UserRole.ResourceOwner, UserRole.InstanceOwner] }, { name: 'save', test: [UserRole.ResourceOwner, UserRole.InstanceOwner] },
@ -73,10 +75,11 @@ export const getCredentialPermissions = (user: IUser | null, credential: ICreden
export const getWorkflowPermissions = (user: IUser | null, workflow: IWorkflowDb) => { export const getWorkflowPermissions = (user: IUser | null, workflow: IWorkflowDb) => {
const settingsStore = useSettingsStore(); const settingsStore = useSettingsStore();
const isSharingEnabled = settingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.WorkflowSharing);
const isNewWorkflow = workflow.id === PLACEHOLDER_EMPTY_WORKFLOW_ID; const isNewWorkflow = workflow.id === PLACEHOLDER_EMPTY_WORKFLOW_ID;
const table: IPermissionsTable = [ const table: IPermissionsTable = [
{ name: UserRole.ResourceOwner, test: () => !!(isNewWorkflow || workflow && workflow.ownedBy && workflow.ownedBy.id === user?.id) || !settingsStore.isEnterpriseFeatureEnabled(EnterpriseEditionFeature.WorkflowSharing) }, { name: UserRole.ResourceOwner, test: () => !!(isNewWorkflow || workflow && workflow.ownedBy && workflow.ownedBy.id === user?.id) || !isSharingEnabled },
{ name: UserRole.ResourceReader, test: () => !!(workflow && workflow.sharedWith && workflow.sharedWith.find((sharee) => sharee.id === user?.id)) }, { name: UserRole.ResourceReader, test: () => !!(workflow && workflow.sharedWith && workflow.sharedWith.find((sharee) => sharee.id === user?.id)) },
{ name: 'read', test: [UserRole.ResourceOwner, UserRole.InstanceOwner, UserRole.ResourceReader] }, { name: 'read', test: [UserRole.ResourceOwner, UserRole.InstanceOwner, UserRole.ResourceReader] },
{ name: 'save', test: [UserRole.ResourceOwner, UserRole.InstanceOwner] }, { name: 'save', test: [UserRole.ResourceOwner, UserRole.InstanceOwner] },
@ -85,7 +88,7 @@ export const getWorkflowPermissions = (user: IUser | null, workflow: IWorkflowDb
{ name: 'updateSharing', test: [UserRole.ResourceOwner] }, { name: 'updateSharing', test: [UserRole.ResourceOwner] },
{ name: 'updateNodeAccess', test: [UserRole.ResourceOwner] }, { name: 'updateNodeAccess', test: [UserRole.ResourceOwner] },
{ name: 'delete', test: [UserRole.ResourceOwner, UserRole.InstanceOwner] }, { name: 'delete', test: [UserRole.ResourceOwner, UserRole.InstanceOwner] },
{ name: 'use', test: [UserRole.ResourceOwner, UserRole.ResourceReader] }, { name: 'use', test: [UserRole.ResourceOwner, UserRole.InstanceOwner, UserRole.ResourceReader] },
]; ];
return parsePermissionsTable(user, table); return parsePermissionsTable(user, table);