Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
56 commits
Select commit Hold shift + click to select a range
d41b162
feat: add Guest workspace role
ShridharGoel Aug 2, 2026
66c9041
Merge branch 'main' into feat/guest-workspace-role
ShridharGoel Sep 29, 2026
4dd3681
Fix duplicate policy declaration, add Greek guest translations, apply…
ShridharGoel Sep 29, 2026
e5fd6a4
Updates
ShridharGoel Sep 29, 2026
6031a08
Fix WorkspaceMenuItem type widening in guest filter
ShridharGoel Sep 29, 2026
204e8c0
Restore main formatting on unrelated workflow files
ShridharGoel Sep 29, 2026
396eb71
Hide room description editing from guests
ShridharGoel Sep 29, 2026
46b0046
Extract shared getHighestPolicyRole for telemetry role tagging
ShridharGoel Sep 29, 2026
0bd0721
Update PolicyUtils.ts
ShridharGoel Sep 29, 2026
7cfd2d9
Add translations
ShridharGoel Sep 29, 2026
fa9a70c
Merge branch 'feat/guest-workspace-role' of github.com:ShridharGoel/E…
ShridharGoel Sep 29, 2026
f51dd0c
Include all workspace roles in telemetry role ranking
ShridharGoel Sep 29, 2026
6776ad8
Mock getHighestPolicyRole in TelemetrySynchronizer tests
ShridharGoel Sep 29, 2026
18c5176
Move getHighestPolicyRole to its own module and fix lint issues
ShridharGoel Sep 29, 2026
321138e
Fix type import and export style in getHighestPolicyRole
ShridharGoel Sep 29, 2026
c9eb8c9
Merge main into guest workspace role branch
ShridharGoel Sep 29, 2026
2e72e10
Use type imports and safe types in policyRolePermissions
ShridharGoel Sep 29, 2026
617d740
Merge remote-tracking branch 'origin/main' into feat/guest-workspace-…
ShridharGoel Sep 29, 2026
3dee4de
Hide description edit affordance when user cannot edit
ShridharGoel Sep 30, 2026
6c1ac06
Update WorkspaceInitialPage.tsx
ShridharGoel Sep 30, 2026
8066a40
Merge remote-tracking branch 'origin/main' into feat/guest-workspace-…
ShridharGoel Sep 30, 2026
70b1562
Merge remote-tracking branch 'fork/feat/guest-workspace-role' into fe…
ShridharGoel Sep 30, 2026
79ed6b4
Show room avatar to guests in report details
ShridharGoel Sep 30, 2026
2656713
Merge remote-tracking branch 'origin/main' into feat/guest-workspace-…
ShridharGoel Sep 30, 2026
c7d5df2
Address guest role review feedback
ShridharGoel Oct 1, 2026
c66ce65
Merge branch 'main' into feat/guest-workspace-role
ShridharGoel Oct 1, 2026
3ed58c8
Apply review fixes
ShridharGoel Oct 2, 2026
f7840b4
Merge remote branch
ShridharGoel Oct 2, 2026
c30b491
Add guests translation key to all languages
ShridharGoel Oct 2, 2026
64bfa77
Update translations
ShridharGoel Oct 2, 2026
c070eab
Merge branch 'main' into feat/guest-workspace-role
ShridharGoel Oct 3, 2026
4a4c4fd
Address review on guest permissions and rename
ShridharGoel Oct 5, 2026
d887a4a
Merge remote branch
ShridharGoel Oct 5, 2026
0f735d8
Fix CI failures from guest role changes
ShridharGoel Oct 5, 2026
e9d152f
Update translations
ShridharGoel Oct 5, 2026
5a1531b
Show rooms to guests via their own chats
ShridharGoel Oct 5, 2026
9124083
Reuse isPolicyGuest util for guest role checks
ShridharGoel Oct 5, 2026
1d77ae8
Merge branch 'main' into feat/guest-workspace-role
ShridharGoel Oct 6, 2026
fb435c4
Update guest supporting text and hide room create for guests
ShridharGoel Oct 6, 2026
1a3acef
Block guests from room create page via deeplink
ShridharGoel Oct 6, 2026
1d060a4
Hide room creation options for guest role users
ShridharGoel Oct 6, 2026
ca2266d
Trim redundant doc comment
ShridharGoel Oct 6, 2026
f8a1b89
Restore room tab in new chat selector
ShridharGoel Oct 6, 2026
bbb9cb0
Fix definition order for room creation helper
ShridharGoel Oct 6, 2026
1c64f84
Update translations
ShridharGoel Oct 6, 2026
8c54805
Update translations
ShridharGoel Oct 7, 2026
dccabae
Merge remote-tracking branch 'origin/main' into feat/guest-workspace-…
ShridharGoel Oct 7, 2026
d85e8d6
Move guest role utils into PolicyUtils folder
ShridharGoel Oct 7, 2026
b55d94c
Update translations
ShridharGoel Oct 6, 2026
719b448
Gate room creation behind the rooms policy feature
ShridharGoel Oct 7, 2026
a73b89f
Merge origin/main into feat/guest-workspace-role
ShridharGoel Oct 7, 2026
16b64bc
Let the server filter Rooms for guests
ShridharGoel Oct 7, 2026
3852912
Merge origin/main into feat/guest-workspace-role
ShridharGoel Oct 7, 2026
cd0ceef
Let all roles except guest create rooms
ShridharGoel Oct 8, 2026
c1a7df5
Allow auditors to write rooms in PolicyUtils test
ShridharGoel Oct 8, 2026
3f087b9
Hide members row in announce rooms for guests
ShridharGoel Oct 8, 2026
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions src/CONST/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4517,6 +4517,7 @@ const CONST = {
OWNER: 'owner',
ADMIN: 'admin',
AUDITOR: 'auditor',
GUEST: 'guest',
USER: 'user',
EDITOR: 'editor',
CARD_ADMIN: 'cardAdmin',
Expand All @@ -4534,6 +4535,7 @@ const CONST = {
POLICY_FEATURE: {
OVERVIEW: 'overview',
MEMBERS: 'members',
ROOMS: 'rooms',
ASSIGN_ELEVATED_ROLES: 'assignElevatedRoles',
WORKFLOWS: 'workflows',
WORKFLOWS_APPROVALS: 'workflowsApprovals',
Expand Down Expand Up @@ -4642,6 +4644,7 @@ const CONST = {
MAKE_MEMBER: 'makeMember',
MAKE_ADMIN: 'makeAdmin',
MAKE_AUDITOR: 'makeAuditor',
MAKE_GUEST: 'makeGuest',
MAKE_CARD_ADMIN: 'makeCardAdmin',
MAKE_PEOPLE_ADMIN: 'makePeopleAdmin',
MAKE_PAYMENTS_ADMIN: 'makePaymentsAdmin',
Expand Down
3 changes: 2 additions & 1 deletion src/components/RoomHeaderAvatars.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import useThemeStyles from '@hooks/useThemeStyles';
import {clearAvatarErrors, updatePolicyRoomAvatar} from '@libs/actions/Report';
import createDynamicRoute from '@libs/Navigation/helpers/dynamicRoutesUtils/createDynamicRoute';
import Navigation from '@libs/Navigation/Navigation';
import {isPolicyAuditor, isPolicyGuest} from '@libs/PolicyUtils';
import {isUserCreatedPolicyRoom} from '@libs/ReportUtils';
import {getAccountIDFromAvatarID, isDefaultAvatar} from '@libs/UserAvatarUtils';

Expand Down Expand Up @@ -50,7 +51,7 @@ function RoomHeaderAvatars({icons, report, policy, participants, currentUserAcco
const expensifyIcons = useMemoizedLazyExpensifyIcons(['Camera', 'FallbackAvatar', 'ImageCropSquareMask']);
const styles = useThemeStyles();
const StyleUtils = useStyleUtils();
const canEditRoomAvatar = isUserCreatedPolicyRoom(report) && participants.includes(currentUserAccountID) && !!policy && policy.role !== CONST.POLICY.ROLE.AUDITOR;
const canEditRoomAvatar = isUserCreatedPolicyRoom(report) && participants.includes(currentUserAccountID) && !!policy && !isPolicyAuditor(policy) && !isPolicyGuest(policy);

if (!icons.length) {
return null;
Expand Down
11 changes: 11 additions & 0 deletions src/components/Tables/WorkspaceMembersTable/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -64,6 +64,7 @@ const WORKSPACE_MEMBER_FILTER_VALUES = {
AUDITORS: 'auditors',
CARD_ADMINS: 'cardAdmins',
EDITORS: 'editors',
GUESTS: 'guests',
MEMBERS: 'members',
PAYMENTS_ADMINS: 'paymentsAdmins',
PEOPLE_ADMINS: 'peopleAdmins',
Expand Down Expand Up @@ -212,6 +213,11 @@ export default function WorkspaceMembersTable({
return true;
}

const isGuest = item.role === CONST.POLICY.ROLE.GUEST;
if (filterValues.includes(WORKSPACE_MEMBER_FILTER_VALUES.GUESTS) && isGuest) {
return true;
}

const isEditor = item.role === CONST.POLICY.ROLE.EDITOR;
if (filterValues.includes(WORKSPACE_MEMBER_FILTER_VALUES.EDITORS) && isEditor) {
return true;
Expand Down Expand Up @@ -262,6 +268,11 @@ export default function WorkspaceMembersTable({
label: translate('workspace.people.auditors'),
value: WORKSPACE_MEMBER_FILTER_VALUES.AUDITORS,
});

filterConfig.role.options.push({
label: translate('workspace.people.guests'),
value: WORKSPACE_MEMBER_FILTER_VALUES.GUESTS,
});
}

if (isSubmitPolicy(policy)) {
Expand Down
7 changes: 7 additions & 0 deletions src/components/WorkspaceMemberRoleList.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -66,6 +66,13 @@ function getAssignableWorkspaceMemberRoleItems(
isSelected: currentRole === CONST.POLICY.ROLE.AUDITOR,
keyForList: CONST.POLICY.ROLE.AUDITOR,
},
{
value: CONST.POLICY.ROLE.GUEST,
text: translate('workspace.common.roleName', CONST.POLICY.ROLE.GUEST),
alternateText: translate('workspace.common.guestAlternateText'),
isSelected: currentRole === CONST.POLICY.ROLE.GUEST,
keyForList: CONST.POLICY.ROLE.GUEST,
},
{
value: CONST.POLICY.ROLE.CARD_ADMIN,
text: translate('workspace.common.roleName', CONST.POLICY.ROLE.CARD_ADMIN),
Expand Down
12 changes: 10 additions & 2 deletions src/languages/de.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4846,20 +4846,23 @@ ${amount} für ${merchant} – ${date}`,
memberAlternateText: 'Berichte einreichen und freigeben.',
adminAlternateText: 'Berichte und Arbeitsbereichseinstellungen verwalten.',
auditorAlternateText: 'Berichte anzeigen und kommentieren.',
guestAlternateText: 'Berichte mit eingeschränkter Sichtbarkeit einreichen.',
roleName: (role?: string) => {
switch (role) {
case CONST.POLICY.ROLE.OWNER:
return 'Eigentümer';
case CONST.POLICY.ROLE.ADMIN:
return 'Workspace-Administrator';
return 'Workspace-Admin';
case CONST.POLICY.ROLE.AUDITOR:
return 'Prüfer';
case CONST.POLICY.ROLE.GUEST:
return 'Gast';
case CONST.POLICY.ROLE.EDITOR:
return 'Editor';
case CONST.POLICY.ROLE.CARD_ADMIN:
return 'Kartenverwaltung';
case CONST.POLICY.ROLE.PEOPLE_ADMIN:
return 'Personalverwaltung';
return 'Personenverwaltung';
case CONST.POLICY.ROLE.PAYMENTS_ADMIN:
return 'Zahlungsadministrator';
case CONST.POLICY.ROLE.USER:
Expand Down Expand Up @@ -7123,6 +7126,10 @@ Der Control-Tarif beginnt bei 9 $ pro aktivem Mitglied und Monat.`,
one: 'Zum Prüfer machen',
other: 'Prüfende hinzufügen',
}),
makeGuest: () => ({
one: 'Zur*m* Gast machen',
other: 'Zu Gästen machen',
}),
makePeopleAdmin: () => ({
one: 'Zum Personaladministrator machen',
other: 'Personaladministratoren festlegen',
Expand Down Expand Up @@ -7159,6 +7166,7 @@ Der Control-Tarif beginnt bei 9 $ pro aktivem Mitglied und Monat.`,
admins: 'Workspace-Administratoren',
approvers: 'Genehmigende',
auditors: 'Prüfer',
guests: 'Gäste',
editors: 'Bearbeiter',
emptyRoleFilter: {title: 'Keine Mitglieder entsprechen diesem Filter', subtitle: 'Laden Sie ein Mitglied ein oder ändern Sie den Filter oben.'},
configureHRSync: (providerName: string) => `Synchronisierung mit ${providerName} einrichten.`,
Expand Down
14 changes: 11 additions & 3 deletions src/languages/el.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4914,6 +4914,7 @@ ${amount} για ${merchant} - ${date}`,
memberAlternateText: 'Υποβάλετε και εγκρίνετε αναφορές.',
adminAlternateText: 'Διαχειριστείτε αναφορές και ρυθμίσεις χώρου εργασίας.',
auditorAlternateText: 'Προβολή και σχολιασμός αναφορών.',
guestAlternateText: 'Υποβάλετε αναφορές με περιορισμένη προβολή.',
cardAdminAlternateText: 'Διαχειριστείτε τις κάρτες χώρου εργασίας.',
peopleAdminAlternateText: 'Διαχειριστείτε μέλη και ροές έγκρισης.',
paymentsAdminAlternateText: 'Διαχειριστείτε τις πληρωμές ροής εργασιών.',
Expand All @@ -4925,19 +4926,21 @@ ${amount} για ${merchant} - ${date}`,
roleName: (role?: string) => {
switch (role) {
case CONST.POLICY.ROLE.OWNER:
return 'Κάτοχος';
return 'Ιδιοκτήτης';
case CONST.POLICY.ROLE.ADMIN:
return 'Διαχειριστής χώρου εργασίας';
case CONST.POLICY.ROLE.AUDITOR:
return 'Ελεγκτής';
case CONST.POLICY.ROLE.GUEST:
return 'Επισκέπτης';
case CONST.POLICY.ROLE.EDITOR:
return 'Επεξεργαστής';
case CONST.POLICY.ROLE.CARD_ADMIN:
return 'Διαχείριση κάρτας';
case CONST.POLICY.ROLE.PEOPLE_ADMIN:
return 'Διαχείριση προσώπων';
return 'Διαχείριση χρηστών';
case CONST.POLICY.ROLE.PAYMENTS_ADMIN:
return 'διαχείριση πληρωμών';
return 'Διαχείριση πληρωμών';
case CONST.POLICY.ROLE.USER:
return 'Μέλος';
default:
Expand Down Expand Up @@ -7248,6 +7251,10 @@ _Για πιο αναλυτικές οδηγίες, [επισκεφθείτε τ
one: 'Ορισμός ως ελεγκτής',
other: 'Δημιουργία ελεγκτών',
}),
makeGuest: () => ({
one: 'Κάντε επισκέπτη',
other: 'Κάντε επισκέπτες',
}),
makeCardAdmin: () => ({
one: 'Ορισμός διαχειριστή κάρτας',
other: 'Ορίστε διαχειριστές κάρτας',
Expand Down Expand Up @@ -7278,6 +7285,7 @@ _Για πιο αναλυτικές οδηγίες, [επισκεφθείτε τ
paymentsAdmins: 'Διαχειριστές πληρωμών',
approvers: 'Εγκρίνοντες',
auditors: 'Ελεγκτές',
guests: 'Επισκέπτες',
editors: 'Συντάκτες',
members: 'Μέλη',
emptyRoleFilter: {
Expand Down
8 changes: 8 additions & 0 deletions src/languages/en.ts
Original file line number Diff line number Diff line change
Expand Up @@ -5023,6 +5023,7 @@ const translations = {
memberAlternateText: 'Submit and approve reports.',
adminAlternateText: 'Manage reports and workspace settings.',
auditorAlternateText: 'View and comment on reports.',
guestAlternateText: 'Submit reports with limited visibility.',
cardAdminAlternateText: 'Manage workspace cards.',
peopleAdminAlternateText: 'Manage members and approval workflows.',
paymentsAdminAlternateText: 'Manage workflow payments.',
Expand All @@ -5039,6 +5040,8 @@ const translations = {
return 'Workspace admin';
case CONST.POLICY.ROLE.AUDITOR:
return 'Auditor';
case CONST.POLICY.ROLE.GUEST:
return 'Guest';
case CONST.POLICY.ROLE.EDITOR:
return 'Editor';
case CONST.POLICY.ROLE.CARD_ADMIN:
Expand Down Expand Up @@ -7466,6 +7469,10 @@ const translations = {
one: 'Make auditor',
other: 'Make auditors',
}),
makeGuest: () => ({
one: 'Make guest',
other: 'Make guests',
}),
makeCardAdmin: () => ({
one: 'Make card admin',
other: 'Make card admins',
Expand Down Expand Up @@ -7496,6 +7503,7 @@ const translations = {
paymentsAdmins: 'Payments Admins',
approvers: 'Approvers',
auditors: 'Auditors',
guests: 'Guests',
editors: 'Editors',
members: 'Members',
emptyRoleFilter: {
Expand Down
12 changes: 10 additions & 2 deletions src/languages/es.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4772,6 +4772,7 @@ ${amount} para ${merchant} - ${date}`,
memberAlternateText: 'Presentar y aprobar informes.',
adminAlternateText: 'Gestionar informes y configuración del área de trabajo.',
auditorAlternateText: 'Ver y comentar los informes.',
guestAlternateText: 'Envía informes con visibilidad limitada.',
reimbursementChoice: {
[CONST.POLICY.REIMBURSEMENT_CHOICES.REIMBURSEMENT_YES]: 'Directo',
[CONST.POLICY.REIMBURSEMENT_CHOICES.REIMBURSEMENT_NO]: 'Ninguno',
Expand All @@ -4785,12 +4786,14 @@ ${amount} para ${merchant} - ${date}`,
return 'Administrador del espacio de trabajo';
case CONST.POLICY.ROLE.AUDITOR:
return 'Auditor';
case CONST.POLICY.ROLE.GUEST:
return 'Invitado';
case CONST.POLICY.ROLE.EDITOR:
return 'Editor';
case CONST.POLICY.ROLE.CARD_ADMIN:
return 'Administrador de tarjeta';
return 'Administrador de tarjetas';
case CONST.POLICY.ROLE.PEOPLE_ADMIN:
return 'Administrador de personas';
return 'Administrar personas';
case CONST.POLICY.ROLE.PAYMENTS_ADMIN:
return 'Administrador de pagos';
case CONST.POLICY.ROLE.USER:
Expand Down Expand Up @@ -6989,6 +6992,10 @@ El plan Controlar empieza en 9 $ por miembro activo al mes.`,
one: 'Convertir en auditor',
other: 'Convertir en auditores',
}),
makeGuest: () => ({
one: 'Hacer invitado',
other: 'Hacer invitados',
}),
makePeopleAdmin: () => ({
one: 'Hacer administrador de personas',
other: 'Hacer administradores de personas',
Expand All @@ -7010,6 +7017,7 @@ El plan Controlar empieza en 9 $ por miembro activo al mes.`,
admins: 'Administradores del espacio de trabajo',
approvers: 'Aprobadores',
auditors: 'Auditores',
guests: 'Invitados',
editors: 'Editores',
emptyRoleFilter: {
title: 'Ningún miembro coincide con este filtro',
Expand Down
10 changes: 9 additions & 1 deletion src/languages/fr.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4852,6 +4852,7 @@ ${amount} pour ${merchant} - ${date}`,
memberAlternateText: 'Soumettre et approuver des notes de frais.',
adminAlternateText: 'Gérer les notes de frais et les paramètres de l’espace de travail.',
auditorAlternateText: 'Afficher et commenter les notes de frais.',
guestAlternateText: 'Soumettre des notes de frais avec une visibilité limitée.',
roleName: (role?: string) => {
switch (role) {
case CONST.POLICY.ROLE.OWNER:
Expand All @@ -4860,12 +4861,14 @@ ${amount} pour ${merchant} - ${date}`,
return 'Administrateur de l’espace de travail';
case CONST.POLICY.ROLE.AUDITOR:
return 'Auditeur';
case CONST.POLICY.ROLE.GUEST:
return 'Invité';
case CONST.POLICY.ROLE.EDITOR:
return 'Éditeur';
case CONST.POLICY.ROLE.CARD_ADMIN:
return 'Administrateur de carte';
case CONST.POLICY.ROLE.PEOPLE_ADMIN:
return 'Administration des personnes';
return 'Administrateur des personnes';
case CONST.POLICY.ROLE.PAYMENTS_ADMIN:
return 'Administrateur des paiements';
case CONST.POLICY.ROLE.USER:
Expand Down Expand Up @@ -7140,6 +7143,10 @@ Le forfait Control commence à 9 $ par Membre actif et par mois.`,
one: 'Nommer auditeur',
other: 'Créer des auditeurs',
}),
makeGuest: () => ({
one: 'Rendre invité',
other: 'Rendre invités',
}),
makePeopleAdmin: () => ({
one: 'Nommer administrateur des personnes',
other: 'Nommer des administrateurs des personnes',
Expand Down Expand Up @@ -7176,6 +7183,7 @@ Le forfait Control commence à 9 $ par Membre actif et par mois.`,
admins: 'Administrateurs de l’espace de travail',
approvers: 'Approbateurs',
auditors: 'Auditeurs',
guests: 'Invités',
editors: 'Éditeurs',
emptyRoleFilter: {title: 'Aucun membre ne correspond à ce filtre', subtitle: 'Invitez un membre ou modifiez le filtre ci-dessus.'},
configureHRSync: (providerName: string) => `Configurer la synchronisation ${providerName}.`,
Expand Down
16 changes: 12 additions & 4 deletions src/languages/it.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4815,22 +4815,25 @@ ${amount} per ${merchant} - ${date}`,
memberAlternateText: 'Invia e approva i report.',
adminAlternateText: 'Gestisci i report e le impostazioni dello spazio di lavoro.',
auditorAlternateText: 'Visualizza e commenta i report.',
guestAlternateText: 'Invia i report con visibilità limitata.',
roleName: (role?: string) => {
switch (role) {
case CONST.POLICY.ROLE.OWNER:
return 'Proprietario';
case CONST.POLICY.ROLE.ADMIN:
return 'Amministratore spazio di lavoro';
return 'Amministratore dello spazio di lavoro';
case CONST.POLICY.ROLE.AUDITOR:
return 'Revisore';
case CONST.POLICY.ROLE.GUEST:
return 'Ospite';
case CONST.POLICY.ROLE.EDITOR:
return 'Editor';
case CONST.POLICY.ROLE.CARD_ADMIN:
return 'Amministrazione carte';
return 'Amministrazione carta';
case CONST.POLICY.ROLE.PEOPLE_ADMIN:
return 'Amministrazione persone';
return 'Gestione persone';
case CONST.POLICY.ROLE.PAYMENTS_ADMIN:
return 'Amministrazione pagamenti';
return 'Amministratore pagamenti';
case CONST.POLICY.ROLE.USER:
return 'Membro';
default:
Expand Down Expand Up @@ -7081,6 +7084,10 @@ Il piano Control parte da 9 $ al mese per ogni membro attivo.`,
one: 'Rendi revisore',
other: 'Crea revisori',
}),
makeGuest: () => ({
one: 'Rendi ospite',
other: 'Rendi ospiti',
}),
makePeopleAdmin: () => ({
one: 'Rendi amministratore persone',
other: 'Rendi amministratori persone',
Expand Down Expand Up @@ -7117,6 +7124,7 @@ Il piano Control parte da 9 $ al mese per ogni membro attivo.`,
admins: 'Amministratori dello spazio di lavoro',
approvers: 'Approvatori',
auditors: 'Revisori',
guests: 'Ospiti',
editors: 'Editori',
emptyRoleFilter: {title: 'Nessun membro corrisponde a questo filtro', subtitle: 'Invita un membro o modifica il filtro qui sopra.'},
configureHRSync: (providerName: string) => `Configura la sincronizzazione di ${providerName}.`,
Expand Down
Loading
Loading