feat: RBAC (#8922)

Signed-off-by: Oleg Ivaniv <me@olegivaniv.com>
Co-authored-by: Val <68596159+valya@users.noreply.github.com>
Co-authored-by: कारतोफ्फेलस्क्रिप्ट™ <aditya@netroy.in>
Co-authored-by: Valya Bullions <valya@n8n.io>
Co-authored-by: Danny Martini <danny@n8n.io>
Co-authored-by: Danny Martini <despair.blue@gmail.com>
Co-authored-by: Iván Ovejero <ivov.src@gmail.com>
Co-authored-by: Omar Ajoue <krynble@gmail.com>
Co-authored-by: oleg <me@olegivaniv.com>
Co-authored-by: Michael Kret <michael.k@radency.com>
Co-authored-by: Michael Kret <88898367+michael-radency@users.noreply.github.com>
Co-authored-by: Elias Meire <elias@meire.dev>
Co-authored-by: Giulio Andreini <andreini@netseven.it>
Co-authored-by: Giulio Andreini <g.andreini@gmail.com>
Co-authored-by: Ayato Hayashi <go12limchangyong@gmail.com>
This commit is contained in:
Csaba Tuncsik
2024-05-17 10:53:15 +02:00
committed by GitHub
parent b1f977ebd0
commit 596c472ecc
292 changed files with 14129 additions and 3989 deletions

View File

@@ -30,12 +30,7 @@
</div>
<template #append>
<div :class="$style.cardActions" @click.stop>
<enterprise-edition :features="[EnterpriseEditionFeature.Sharing]">
<n8n-badge v-if="workflowPermissions.isOwner" class="mr-xs" theme="tertiary" bold>
{{ $locale.baseText('workflows.item.owner') }}
</n8n-badge>
</enterprise-edition>
<ProjectCardBadge :resource="data" :personal-project="projectsStore.personalProject" />
<WorkflowActivator
class="mr-s"
:workflow-active="data.active"
@@ -56,17 +51,13 @@
<script lang="ts">
import { defineComponent } from 'vue';
import type { PropType } from 'vue';
import type { IWorkflowDb, IUser, ITag } from '@/Interface';
import {
DUPLICATE_MODAL_KEY,
EnterpriseEditionFeature,
MODAL_CONFIRM,
VIEWS,
WORKFLOW_SHARE_MODAL_KEY,
} from '@/constants';
import { DUPLICATE_MODAL_KEY, MODAL_CONFIRM, VIEWS, WORKFLOW_SHARE_MODAL_KEY } from '@/constants';
import { useMessage } from '@/composables/useMessage';
import { useToast } from '@/composables/useToast';
import type { IPermissions } from '@/permissions';
import type { PermissionsMap } from '@/permissions';
import type { WorkflowScope } from '@n8n/permissions';
import { getWorkflowPermissions } from '@/permissions';
import dateformat from 'dateformat';
import WorkflowActivator from '@/components/WorkflowActivator.vue';
@@ -76,6 +67,9 @@ import { useSettingsStore } from '@/stores/settings.store';
import { useUsersStore } from '@/stores/users.store';
import { useWorkflowsStore } from '@/stores/workflows.store';
import TimeAgo from '@/components/TimeAgo.vue';
import type { ProjectSharingData } from '@/features/projects/projects.types';
import { useProjectsStore } from '@/features/projects/projects.store';
import ProjectCardBadge from '@/features/projects/components/ProjectCardBadge.vue';
export const WORKFLOW_LIST_ITEM_ACTIONS = {
OPEN: 'open',
@@ -88,10 +82,11 @@ export default defineComponent({
components: {
TimeAgo,
WorkflowActivator,
ProjectCardBadge,
},
props: {
data: {
type: Object,
type: Object as PropType<IWorkflowDb>,
required: true,
default: (): IWorkflowDb => ({
id: '',
@@ -101,8 +96,8 @@ export default defineComponent({
connections: {},
nodes: [],
name: '',
sharedWith: [],
ownedBy: {} as IUser,
sharedWithProjects: [],
homeProject: {} as ProjectSharingData,
versionId: '',
}),
},
@@ -117,18 +112,13 @@ export default defineComponent({
...useMessage(),
};
},
data() {
return {
EnterpriseEditionFeature,
};
},
computed: {
...mapStores(useSettingsStore, useUIStore, useUsersStore, useWorkflowsStore),
...mapStores(useSettingsStore, useUIStore, useUsersStore, useWorkflowsStore, useProjectsStore),
currentUser(): IUser {
return this.usersStore.currentUser || ({} as IUser);
},
workflowPermissions(): IPermissions {
return getWorkflowPermissions(this.currentUser, this.data);
workflowPermissions(): PermissionsMap<WorkflowScope> {
return getWorkflowPermissions(this.data);
},
actions(): Array<{ label: string; value: string }> {
const actions = [
@@ -213,7 +203,7 @@ export default defineComponent({
this.$telemetry.track('User opened sharing modal', {
workflow_id: this.data.id,
user_id_sharer: this.currentUser.id,
sub_view: this.$route.name === VIEWS.WORKFLOWS ? 'Workflows listing' : 'Workflow editor',
sub_view: 'Workflows listing',
});
} else if (action === WORKFLOW_LIST_ITEM_ACTIONS.DELETE) {
const deleteConfirmed = await this.confirm(
@@ -270,6 +260,10 @@ export default defineComponent({
font-size: var(--font-size-s);
word-break: break-word;
padding: var(--spacing-s) 0 0 var(--spacing-s);
span {
color: var(--color-text-light);
}
}
.cardDescription {