diff --git a/packages/frontend/@n8n/i18n/src/locales/en.json b/packages/frontend/@n8n/i18n/src/locales/en.json
index 4dbce6c2b0..696d5b93b6 100644
--- a/packages/frontend/@n8n/i18n/src/locales/en.json
+++ b/packages/frontend/@n8n/i18n/src/locales/en.json
@@ -20,7 +20,13 @@
"user": "User",
"enabled": "Enabled",
"disabled": "Disabled",
- "type": "Type"
+ "type": "Type",
+ "role": "Role",
+ "roles": {
+ "admin": "Admin",
+ "editor": "Editor",
+ "viewer": "Viewer"
+ }
},
"_reusableDynamicText": {
"readMore": "Read more",
@@ -169,7 +175,7 @@
"auth.role": "Role",
"auth.roles.default": "Default",
"auth.roles.member": "Member",
- "auth.roles.admin": "Admin",
+ "auth.roles.admin": "@:_reusableBaseText.roles.admin",
"auth.roles.owner": "Owner",
"auth.agreement.label": "I want to receive security and product updates",
"auth.setup.next": "Next",
@@ -2741,8 +2747,8 @@
"workflows.shareModal.info.sharee.fallback": "the owner",
"workflows.shareModal.info.members": "This workflow is owned by the {projectName} project which currently has {members} with access to this workflow.",
"workflows.shareModal.info.members.number": "{number} member | {number} members",
- "workflows.shareModal.role.editor": "Editor",
- "workflows.roles.editor": "Editor",
+ "workflows.shareModal.role.editor": "@:_reusableBaseText.roles.editor",
+ "workflows.roles.editor": "@:_reusableBaseText.roles.editor",
"workflows.concurrentChanges.confirmMessage.title": "Workflow was changed by someone else",
"workflows.concurrentChanges.confirmMessage.message": "Someone saved this workflow while you were editing it. You can view their version (in new tab).
Overwrite their changes with yours?",
"workflows.concurrentChanges.confirmMessage.cancelButtonText": "Cancel",
@@ -3050,9 +3056,9 @@
"projects.settings.button.save": "@:_reusableBaseText.save",
"projects.settings.button.cancel": "@:_reusableBaseText.cancel",
"projects.settings.button.deleteProject": "Delete project",
- "projects.settings.role.admin": "Admin",
- "projects.settings.role.editor": "Editor",
- "projects.settings.role.viewer": "Viewer",
+ "projects.settings.role.admin": "@:_reusableBaseText.roles.admin",
+ "projects.settings.role.editor": "@:_reusableBaseText.roles.editor",
+ "projects.settings.role.viewer": "@:_reusableBaseText.roles.viewer",
"projects.settings.delete.title": "Delete \"{projectName}\" Project?",
"projects.settings.delete.message": "What should we do with the project data?",
"projects.settings.delete.message.empty": "There are no workflows or credentials in this project.",
@@ -3070,6 +3076,18 @@
"projects.settings.save.error.title": "An error occurred while saving the project",
"projects.settings.role.upgrade.title": "Upgrade to unlock additional roles",
"projects.settings.role.upgrade.message": "You're currently limited to {limit} on the {planName} plan and can only assign the admin role to users within this project. To create more projects and unlock additional roles, upgrade your plan.",
+ "projects.settings.table.header.user": "@:_reusableBaseText.user",
+ "projects.settings.table.header.role": "@:_reusableBaseText.role",
+ "projects.settings.table.row.removeUser": "Remove user",
+ "projects.settings.role.admin.description": "Can edit workflows, credentials, and project settings",
+ "projects.settings.role.editor.description": "Can edit workflows and credentials",
+ "projects.settings.role.viewer.description": "Can view workflows and executions",
+ "projects.settings.role.personalOwner": "Owner",
+ "projects.settings.members.search.placeholder": "Search members...",
+ "projects.settings.memberRole.updated.title": "Member role updated successfully",
+ "projects.settings.memberRole.update.error.title": "An error occurred while updating member role",
+ "projects.settings.member.removed.title": "Member removed successfully",
+ "projects.settings.member.remove.error.title": "An error occurred while removing member",
"projects.sharing.noMatchingProjects": "There are no available projects",
"projects.sharing.noMatchingUsers": "No matching users or projects",
"projects.sharing.select.placeholder": "Select project or user",
diff --git a/packages/frontend/editor-ui/src/components/Projects/ProjectMembersRoleCell.test.ts b/packages/frontend/editor-ui/src/components/Projects/ProjectMembersRoleCell.test.ts
new file mode 100644
index 0000000000..f581ce978c
--- /dev/null
+++ b/packages/frontend/editor-ui/src/components/Projects/ProjectMembersRoleCell.test.ts
@@ -0,0 +1,399 @@
+import { screen } from '@testing-library/vue';
+import userEvent from '@testing-library/user-event';
+import { vi } from 'vitest';
+import type { ProjectRole } from '@n8n/permissions';
+import type { ActionDropdownItem } from '@n8n/design-system';
+import ProjectMembersRoleCell from '@/components/Projects/ProjectMembersRoleCell.vue';
+import { createComponentRenderer } from '@/__tests__/render';
+import type { ProjectMemberData } from '@/types/projects.types';
+
+// Mock N8nActionDropdown and other design system components
+vi.mock('@n8n/design-system', async (importOriginal) => {
+ const original = await importOriginal