diff --git a/packages/console/src/components/OrganizationRolePermissionsAssignmentModal/index.tsx b/packages/console/src/components/OrganizationRolePermissionsAssignmentModal/index.tsx
new file mode 100644
index 000000000000..a57702482d73
--- /dev/null
+++ b/packages/console/src/components/OrganizationRolePermissionsAssignmentModal/index.tsx
@@ -0,0 +1,125 @@
+import { type AdminConsoleKey } from '@logto/phrases';
+import { useCallback, useMemo } from 'react';
+import { useTranslation } from 'react-i18next';
+
+import ConfirmModal from '@/ds-components/ConfirmModal';
+import DataTransferBox from '@/ds-components/DataTransferBox';
+import TabNav, { TabNavItem } from '@/ds-components/TabNav';
+import TabWrapper from '@/ds-components/TabWrapper';
+
+import { PermissionType } from './types';
+import useOrganizationRolePermissionsAssignment from './use-organization-role-permissions-assignment';
+
+const permissionTabs = {
+ [PermissionType.Organization]: {
+ title: 'organization_role_details.permissions.organization_permissions',
+ key: PermissionType.Organization,
+ },
+ [PermissionType.Api]: {
+ title: 'organization_role_details.permissions.api_permissions',
+ key: PermissionType.Api,
+ },
+} satisfies {
+ [key in PermissionType]: {
+ title: AdminConsoleKey;
+ key: key;
+ };
+};
+
+type Props = {
+ organizationRoleId: string;
+ isOpen: boolean;
+ onClose: () => void;
+};
+
+function OrganizationRolePermissionsAssignmentModal({
+ organizationRoleId,
+ isOpen,
+ onClose,
+}: Props) {
+ const { t } = useTranslation(undefined, { keyPrefix: 'admin_console' });
+
+ const {
+ activeTab,
+ setActiveTab,
+ onSubmit,
+ organizationScopesAssignment,
+ resourceScopesAssignment,
+ clearSelectedData,
+ isLoading,
+ } = useOrganizationRolePermissionsAssignment(organizationRoleId);
+
+ const onCloseHandler = useCallback(() => {
+ onClose();
+ clearSelectedData();
+ setActiveTab(PermissionType.Organization);
+ }, [clearSelectedData, onClose, setActiveTab]);
+
+ const onSubmitHandler = useCallback(async () => {
+ await onSubmit();
+ onCloseHandler();
+ }, [onCloseHandler, onSubmit]);
+
+ const tabs = useMemo(
+ () =>
+ Object.values(permissionTabs).map(({ title, key }) => {
+ const selectedDataCount =
+ key === PermissionType.Organization
+ ? organizationScopesAssignment.selectedData.length
+ : resourceScopesAssignment.selectedData.length;
+
+ return (
+ {
+ setActiveTab(key);
+ }}
+ >
+ {`${t(title)}${selectedDataCount ? ` (${selectedDataCount})` : ''}`}
+
+ );
+ }),
+ [
+ activeTab,
+ organizationScopesAssignment.selectedData.length,
+ resourceScopesAssignment.selectedData.length,
+ setActiveTab,
+ t,
+ ]
+ );
+
+ return (
+
+ {tabs}
+
+
+
+
+
+
+
+ );
+}
+
+export default OrganizationRolePermissionsAssignmentModal;
diff --git a/packages/console/src/components/OrganizationRolePermissionsAssignmentModal/types.ts b/packages/console/src/components/OrganizationRolePermissionsAssignmentModal/types.ts
new file mode 100644
index 000000000000..dfed844c8fce
--- /dev/null
+++ b/packages/console/src/components/OrganizationRolePermissionsAssignmentModal/types.ts
@@ -0,0 +1,4 @@
+export enum PermissionType {
+ Organization = 'Organization',
+ Api = 'Api',
+}
diff --git a/packages/console/src/components/OrganizationRolePermissionsAssignmentModal/use-organization-role-permissions-assignment.ts b/packages/console/src/components/OrganizationRolePermissionsAssignmentModal/use-organization-role-permissions-assignment.ts
new file mode 100644
index 000000000000..41726d4c6092
--- /dev/null
+++ b/packages/console/src/components/OrganizationRolePermissionsAssignmentModal/use-organization-role-permissions-assignment.ts
@@ -0,0 +1,72 @@
+import { cond } from '@silverhand/essentials';
+import { useCallback, useState } from 'react';
+
+import useApi from '@/hooks/use-api';
+import useOrganizationRoleScopes from '@/pages/OrganizationRoleDetails/Permissions/use-organization-role-scopes';
+
+import { PermissionType } from './types';
+import useOrganizationScopesAssignment from './use-organization-scopes-assignment';
+import useResourceScopesAssignment from './use-resource-scopes-assignment';
+
+function useOrganizationRolePermissionsAssignment(organizationRoleId: string) {
+ const organizationRolePath = `api/organization-roles/${organizationRoleId}`;
+ const [activeTab, setActiveTab] = useState(PermissionType.Organization);
+ const [isLoading, setIsLoading] = useState(false);
+ const api = useApi();
+
+ const { organizationScopes, resourceScopes, mutate } =
+ useOrganizationRoleScopes(organizationRoleId);
+
+ const organizationScopesAssignment = useOrganizationScopesAssignment(organizationScopes);
+ const resourceScopesAssignment = useResourceScopesAssignment(resourceScopes);
+
+ const clearSelectedData = useCallback(() => {
+ organizationScopesAssignment.setSelectedData([]);
+ resourceScopesAssignment.setSelectedData([]);
+ }, [organizationScopesAssignment, resourceScopesAssignment]);
+
+ const onSubmit = useCallback(async () => {
+ setIsLoading(true);
+ const newOrganizationScopes = organizationScopesAssignment.selectedData.map(({ id }) => id);
+ const newResourceScopes = resourceScopesAssignment.selectedData.map(({ id }) => id);
+
+ await Promise.all(
+ [
+ cond(
+ newOrganizationScopes.length > 0 &&
+ api.post(`${organizationRolePath}/scopes`, {
+ json: { organizationScopeIds: newOrganizationScopes },
+ })
+ ),
+ cond(
+ newResourceScopes.length > 0 &&
+ api.post(`${organizationRolePath}/resource-scopes`, {
+ json: { scopeIds: newResourceScopes },
+ })
+ ),
+ ].filter(Boolean)
+ ).finally(() => {
+ setIsLoading(false);
+ });
+
+ mutate();
+ }, [
+ api,
+ mutate,
+ organizationRolePath,
+ organizationScopesAssignment.selectedData,
+ resourceScopesAssignment.selectedData,
+ ]);
+
+ return {
+ activeTab,
+ setActiveTab,
+ isLoading,
+ organizationScopesAssignment,
+ resourceScopesAssignment,
+ clearSelectedData,
+ onSubmit,
+ };
+}
+
+export default useOrganizationRolePermissionsAssignment;
diff --git a/packages/console/src/components/OrganizationRolePermissionsAssignmentModal/use-organization-scopes-assignment.ts b/packages/console/src/components/OrganizationRolePermissionsAssignmentModal/use-organization-scopes-assignment.ts
new file mode 100644
index 000000000000..6afff6f88815
--- /dev/null
+++ b/packages/console/src/components/OrganizationRolePermissionsAssignmentModal/use-organization-scopes-assignment.ts
@@ -0,0 +1,25 @@
+import { type OrganizationScope } from '@logto/schemas';
+import { useMemo, useState } from 'react';
+import useSWR from 'swr';
+
+function useOrganizationScopesAssignment(assignedScopes: OrganizationScope[] = []) {
+ const [selectedData, setSelectedData] = useState([]);
+
+ const { data: organizationScopes } = useSWR('api/organization-scopes');
+
+ const availableDataList = useMemo(
+ () =>
+ (organizationScopes ?? []).filter(
+ ({ id }) => !assignedScopes.some((scope) => scope.id === id)
+ ),
+ [organizationScopes, assignedScopes]
+ );
+
+ return {
+ selectedData,
+ setSelectedData,
+ availableDataList,
+ };
+}
+
+export default useOrganizationScopesAssignment;
diff --git a/packages/console/src/components/OrganizationRolePermissionsAssignmentModal/use-resource-scopes-assignment.ts b/packages/console/src/components/OrganizationRolePermissionsAssignmentModal/use-resource-scopes-assignment.ts
new file mode 100644
index 000000000000..3516a54423dd
--- /dev/null
+++ b/packages/console/src/components/OrganizationRolePermissionsAssignmentModal/use-resource-scopes-assignment.ts
@@ -0,0 +1,39 @@
+import { isManagementApi, type Scope, type ResourceResponse } from '@logto/schemas';
+import { useMemo, useState } from 'react';
+import useSWR from 'swr';
+
+import { type DataGroup } from '@/ds-components/DataTransferBox/type';
+
+function useResourceScopesAssignment(assignedScopes?: Scope[]) {
+ const [selectedData, setSelectedData] = useState([]);
+
+ const { data: allResources } = useSWR('api/resources?includeScopes=true');
+
+ const availableDataGroups: Array> = useMemo(() => {
+ if (!allResources) {
+ return [];
+ }
+
+ const resourcesWithScopes = allResources
+ // Filter out the management APIs
+ .filter((resource) => !isManagementApi(resource.indicator))
+ .map(({ name, scopes, id: resourceId }) => ({
+ groupId: resourceId,
+ groupName: name,
+ dataList: scopes
+ // Filter out the scopes that have been assigned
+ .filter(({ id: scopeId }) => !assignedScopes?.some((scope) => scope.id === scopeId)),
+ }));
+
+ // Filter out the resources that have no scopes
+ return resourcesWithScopes.filter(({ dataList }) => dataList.length > 0);
+ }, [allResources, assignedScopes]);
+
+ return {
+ selectedData,
+ setSelectedData,
+ availableDataGroups,
+ };
+}
+
+export default useResourceScopesAssignment;
diff --git a/packages/console/src/pages/OrganizationRoleDetails/Permissions/index.tsx b/packages/console/src/pages/OrganizationRoleDetails/Permissions/index.tsx
index ba7088f0500a..72cdfb76146a 100644
--- a/packages/console/src/pages/OrganizationRoleDetails/Permissions/index.tsx
+++ b/packages/console/src/pages/OrganizationRoleDetails/Permissions/index.tsx
@@ -8,6 +8,7 @@ import ActionsButton from '@/components/ActionsButton';
import Breakable from '@/components/Breakable';
import EditScopeModal, { type EditScopeData } from '@/components/EditScopeModal';
import EmptyDataPlaceholder from '@/components/EmptyDataPlaceholder';
+import OrganizationRolePermissionsAssignmentModal from '@/components/OrganizationRolePermissionsAssignmentModal';
import Button from '@/ds-components/Button';
import DynamicT from '@/ds-components/DynamicT';
import Search from '@/ds-components/Search';
@@ -77,6 +78,8 @@ function Permissions({ organizationRoleId }: Props) {
mutate();
};
+ const [isAssignScopesModalOpen, setIsAssignScopesModalOpen] = useState(false);
+
return (
<>
}
onClick={() => {
- // Todo @xiaoyijun Assign permissions to org role
+ setIsAssignScopesModalOpen(true);
}}
/>
@@ -199,6 +202,13 @@ function Permissions({ organizationRoleId }: Props) {
}}
/>
)}
+ {
+ setIsAssignScopesModalOpen(false);
+ }}
+ />
>
);
}
diff --git a/packages/console/src/pages/OrganizationTemplate/OrganizationRoles/CreateOrganizationRoleModal.tsx b/packages/console/src/pages/OrganizationTemplate/OrganizationRoles/CreateOrganizationRoleModal.tsx
index 6978a1f741f8..9d77f1b63892 100644
--- a/packages/console/src/pages/OrganizationTemplate/OrganizationRoles/CreateOrganizationRoleModal.tsx
+++ b/packages/console/src/pages/OrganizationTemplate/OrganizationRoles/CreateOrganizationRoleModal.tsx
@@ -1,4 +1,5 @@
import { type OrganizationRole } from '@logto/schemas';
+import { useCallback } from 'react';
import { useForm } from 'react-hook-form';
import { toast } from 'react-hot-toast';
import { useTranslation } from 'react-i18next';
@@ -15,18 +16,29 @@ import { trySubmitSafe } from '@/utils/form';
type FormData = Pick;
type Props = {
+ isOpen: boolean;
onClose: (createdOrganizationRole?: OrganizationRole) => void;
};
-function CreateOrganizationRoleModal({ onClose }: Props) {
+function CreateOrganizationRoleModal({ isOpen, onClose }: Props) {
const { t } = useTranslation(undefined, { keyPrefix: 'admin_console' });
const {
register,
formState: { errors, isSubmitting },
handleSubmit,
+ reset,
} = useForm();
+ const onCloseHandler = useCallback(
+ (createdData?: OrganizationRole) => {
+ // Reset form when modal is closed
+ reset();
+ onClose(createdData);
+ },
+ [onClose, reset]
+ );
+
const api = useApi();
const submit = handleSubmit(
@@ -37,17 +49,17 @@ function CreateOrganizationRoleModal({ onClose }: Props) {
toast.success(
t('organization_template.roles.create_modal.created', { name: createdData.name })
);
- onClose(createdData);
+ onCloseHandler(createdData);
})
);
return (
{
- onClose();
+ onCloseHandler();
}}
>
}
- onClose={onClose}
+ onClose={onCloseHandler}
>
();
return (
<>
@@ -150,14 +152,24 @@ function OrganizationRoles() {
errorMessage={error?.body?.message ?? error?.message}
onRetry={async () => mutate(undefined, true)}
/>
- {isCreateModalOpen && (
- {
- setIsCreateModalOpen(false);
- if (createdRole) {
- void mutate();
- navigate(createdRole.id);
- }
+ {
+ setIsCreateModalOpen(false);
+ if (createdRole) {
+ void mutate();
+ setCreatedRole({ ...createdRole, scopes: [], resourceScopes: [] });
+ }
+ }}
+ />
+ {createdRole && (
+ {
+ setCreatedRole(undefined);
+ navigate(createdRole.id);
+ void mutate();
}}
/>
)}
diff --git a/packages/phrases/src/locales/de/translation/admin-console/organization-role-details.ts b/packages/phrases/src/locales/de/translation/admin-console/organization-role-details.ts
index 9b3efadeb65b..5d9d9f20f793 100644
--- a/packages/phrases/src/locales/de/translation/admin-console/organization-role-details.ts
+++ b/packages/phrases/src/locales/de/translation/admin-console/organization-role-details.ts
@@ -19,6 +19,12 @@ const organization_role_details = {
remove_confirmation:
'Wenn diese Berechtigung entfernt wird, verliert der Benutzer mit dieser Organisationsrolle den Zugriff, der durch diese Berechtigung gewährt wurde.',
removed: 'Die Berechtigung {{name}} wurde erfolgreich aus dieser Organisationsrolle entfernt',
+ assign_description:
+ 'Weisen Sie Berechtigungen den Rollen innerhalb dieser Organisation zu. Diese können sowohl Organisationsberechtigungen als auch API-Berechtigungen umfassen.',
+ organization_permissions: 'Organisationsberechtigungen',
+ api_permissions: 'API-Berechtigungen',
+ assign_organization_permissions: 'Organisationsberechtigungen zuweisen',
+ assign_api_permissions: 'API-Berechtigungen zuweisen',
},
general: {
tab: 'Allgemein',
diff --git a/packages/phrases/src/locales/en/translation/admin-console/organization-role-details.ts b/packages/phrases/src/locales/en/translation/admin-console/organization-role-details.ts
index ce8357bf6485..1cf0815bcf33 100644
--- a/packages/phrases/src/locales/en/translation/admin-console/organization-role-details.ts
+++ b/packages/phrases/src/locales/en/translation/admin-console/organization-role-details.ts
@@ -19,6 +19,12 @@ const organization_role_details = {
remove_confirmation:
'If this permission is removed, the user with this organization role will lose the access granted by this permission.',
removed: 'The permission {{name}} was successfully removed from this organization role',
+ assign_description:
+ 'Assign permissions to the roles within this organization. These can include both organization permissions and API permissions.',
+ organization_permissions: 'Organization permissions',
+ api_permissions: 'API permissions',
+ assign_organization_permissions: 'Assign organization permissions',
+ assign_api_permissions: 'Assign API permissions',
},
general: {
tab: 'General',
diff --git a/packages/phrases/src/locales/es/translation/admin-console/organization-role-details.ts b/packages/phrases/src/locales/es/translation/admin-console/organization-role-details.ts
index 7c247cc811fd..945e8407703c 100644
--- a/packages/phrases/src/locales/es/translation/admin-console/organization-role-details.ts
+++ b/packages/phrases/src/locales/es/translation/admin-console/organization-role-details.ts
@@ -19,6 +19,12 @@ const organization_role_details = {
remove_confirmation:
'Si este permiso se elimina, el usuario con este rol de organización perderá el acceso otorgado por este permiso.',
removed: 'El permiso {{name}} se eliminó correctamente de este rol de organización',
+ assign_description:
+ 'Asigne permisos a los roles dentro de esta organización. Estos pueden incluir tanto permisos de organización como permisos de API.',
+ organization_permissions: 'Permisos de organización',
+ api_permissions: 'Permisos de API',
+ assign_organization_permissions: 'Asignar permisos de organización',
+ assign_api_permissions: 'Asignar permisos de API',
},
general: {
tab: 'General',
diff --git a/packages/phrases/src/locales/fr/translation/admin-console/organization-role-details.ts b/packages/phrases/src/locales/fr/translation/admin-console/organization-role-details.ts
index 101286ac50f5..47ca23d976fc 100644
--- a/packages/phrases/src/locales/fr/translation/admin-console/organization-role-details.ts
+++ b/packages/phrases/src/locales/fr/translation/admin-console/organization-role-details.ts
@@ -19,6 +19,12 @@ const organization_role_details = {
remove_confirmation:
"Si cette permission est supprimée, l'utilisateur avec ce rôle d'organisation perdra l'accès accordé par cette permission.",
removed: "La permission {{name}} a été supprimée avec succès de ce rôle d'organisation",
+ assign_description:
+ "Attribuez des autorisations aux rôles au sein de cette organisation. Celles-ci peuvent inclure à la fois des autorisations d'organisation et des autorisations d'API.",
+ organization_permissions: "Autorisations de l'organisation",
+ api_permissions: "Autorisations de l'API",
+ assign_organization_permissions: 'Attribuer des permissions d’organisation',
+ assign_api_permissions: 'Attribuer des permissions d’API',
},
general: {
tab: 'Général',
diff --git a/packages/phrases/src/locales/it/translation/admin-console/organization-role-details.ts b/packages/phrases/src/locales/it/translation/admin-console/organization-role-details.ts
index 071914d08459..f4cc9bb9022d 100644
--- a/packages/phrases/src/locales/it/translation/admin-console/organization-role-details.ts
+++ b/packages/phrases/src/locales/it/translation/admin-console/organization-role-details.ts
@@ -19,6 +19,12 @@ const organization_role_details = {
remove_confirmation:
"Se questo permesso viene rimosso, l'utente con questo ruolo organizzativo perderà l'accesso concessogli da questo permesso.",
removed: 'Il permesso {{name}} è stato rimosso con successo da questo ruolo organizzativo',
+ assign_description:
+ "Assegna le autorizzazioni ai ruoli all'interno di questa organizzazione. Queste possono includere sia autorizzazioni dell'organizzazione che autorizzazioni API.",
+ organization_permissions: "Autorizzazioni dell'organizzazione",
+ api_permissions: 'Autorizzazioni API',
+ assign_organization_permissions: 'Assegna permessi di organizzazione',
+ assign_api_permissions: 'Assegna permessi API',
},
general: {
tab: 'Generale',
diff --git a/packages/phrases/src/locales/ja/translation/admin-console/organization-role-details.ts b/packages/phrases/src/locales/ja/translation/admin-console/organization-role-details.ts
index 8d30264fd2da..f9f90e2ac942 100644
--- a/packages/phrases/src/locales/ja/translation/admin-console/organization-role-details.ts
+++ b/packages/phrases/src/locales/ja/translation/admin-console/organization-role-details.ts
@@ -19,6 +19,12 @@ const organization_role_details = {
remove_confirmation:
'この権限を削除すると、この組織の役割を持つユーザーはこの権限によって付与されたアクセスを失います。',
removed: 'この組織の役割から権限 {{name}} が正常に削除されました',
+ assign_description:
+ 'この組織内のロールに権限を割り当てます。これには組織の権限とAPIの権限の両方が含まれる場合があります。',
+ organization_permissions: '組織の権限',
+ api_permissions: 'APIの権限',
+ assign_organization_permissions: '組織の権限を割り当てる',
+ assign_api_permissions: 'APIの権限を割り当てる',
},
general: {
tab: '一般',
diff --git a/packages/phrases/src/locales/ko/translation/admin-console/organization-role-details.ts b/packages/phrases/src/locales/ko/translation/admin-console/organization-role-details.ts
index 52b4af000c10..c36c83ac3604 100644
--- a/packages/phrases/src/locales/ko/translation/admin-console/organization-role-details.ts
+++ b/packages/phrases/src/locales/ko/translation/admin-console/organization-role-details.ts
@@ -19,6 +19,12 @@ const organization_role_details = {
remove_confirmation:
'이 권한을 제거하면이 조직 역할을하는 사용자는이 권한으로 부여된 액세스를 잃게됩니다.',
removed: '권한 {{name}}이(가)이 조직 역할에서 성공적으로 제거되었습니다',
+ assign_description:
+ '이 조직 내의 역할에 권한을 할당합니다. 이는 조직 권한과 API 권한을 모두 포함할 수 있습니다.',
+ organization_permissions: '조직 권한',
+ api_permissions: 'API 권한',
+ assign_organization_permissions: '조직 권한 할당',
+ assign_api_permissions: 'API 권한 할당',
},
general: {
tab: '일반',
diff --git a/packages/phrases/src/locales/pl-pl/translation/admin-console/organization-role-details.ts b/packages/phrases/src/locales/pl-pl/translation/admin-console/organization-role-details.ts
index 8c73fdbb5a4a..a3c95baec35f 100644
--- a/packages/phrases/src/locales/pl-pl/translation/admin-console/organization-role-details.ts
+++ b/packages/phrases/src/locales/pl-pl/translation/admin-console/organization-role-details.ts
@@ -19,6 +19,12 @@ const organization_role_details = {
remove_confirmation:
'Jeśli to uprawnienie zostanie usunięte, użytkownik z tą rolą organizacyjną utraci dostęp udzielony przez to uprawnienie.',
removed: 'Uprawnienie {{name}} zostało pomyślnie usunięte z tej roli organizacyjnej',
+ assign_description:
+ 'Przypisz uprawnienia do ról w tej organizacji. Mogą one obejmować zarówno uprawnienia organizacyjne, jak i uprawnienia interfejsu API.',
+ organization_permissions: 'Uprawnienia organizacyjne',
+ api_permissions: 'Uprawnienia interfejsu API',
+ assign_organization_permissions: 'Przydziel uprawnienia organizacyjne',
+ assign_api_permissions: 'Przydziel uprawnienia API',
},
general: {
tab: 'Ogólne',
diff --git a/packages/phrases/src/locales/pt-br/translation/admin-console/organization-role-details.ts b/packages/phrases/src/locales/pt-br/translation/admin-console/organization-role-details.ts
index c07dabea9fe1..d34a8923db0c 100644
--- a/packages/phrases/src/locales/pt-br/translation/admin-console/organization-role-details.ts
+++ b/packages/phrases/src/locales/pt-br/translation/admin-console/organization-role-details.ts
@@ -19,6 +19,12 @@ const organization_role_details = {
remove_confirmation:
'Se esta permissão for removida, o usuário com essa função organizacional perderá o acesso concedido por esta permissão.',
removed: 'A permissão {{name}} foi removida com sucesso desta função organizacional',
+ assign_description:
+ 'Atribua permissões aos papéis dentro desta organização. Estas podem incluir tanto permissões de organização quanto permissões de API.',
+ organization_permissions: 'Permissões de organização',
+ api_permissions: 'Permissões de API',
+ assign_organization_permissions: 'Atribuir permissões de organização',
+ assign_api_permissions: 'Atribuir permissões de API',
},
general: {
tab: 'Geral',
diff --git a/packages/phrases/src/locales/pt-pt/translation/admin-console/organization-role-details.ts b/packages/phrases/src/locales/pt-pt/translation/admin-console/organization-role-details.ts
index fb73fb7228a3..6498e0341fc9 100644
--- a/packages/phrases/src/locales/pt-pt/translation/admin-console/organization-role-details.ts
+++ b/packages/phrases/src/locales/pt-pt/translation/admin-console/organization-role-details.ts
@@ -19,6 +19,12 @@ const organization_role_details = {
remove_confirmation:
'Se esta permissão for removida, o utilizador com esta função organizacional perderá o acesso concedido por esta permissão.',
removed: 'A permissão {{name}} foi removida com sucesso desta função organizacional',
+ assign_description:
+ 'Atribuir permissões aos cargos dentro desta organização. Estas podem incluir permissões de organização e permissões de API.',
+ organization_permissions: 'Permissões de organização',
+ api_permissions: 'Permissões de API',
+ assign_organization_permissions: 'Atribuir permissões de organização',
+ assign_api_permissions: 'Atribuir permissões de API',
},
general: {
tab: 'Geral',
diff --git a/packages/phrases/src/locales/ru/translation/admin-console/organization-role-details.ts b/packages/phrases/src/locales/ru/translation/admin-console/organization-role-details.ts
index e209d125778e..35c1aa99f838 100644
--- a/packages/phrases/src/locales/ru/translation/admin-console/organization-role-details.ts
+++ b/packages/phrases/src/locales/ru/translation/admin-console/organization-role-details.ts
@@ -19,6 +19,12 @@ const organization_role_details = {
remove_confirmation:
'Если это разрешение будет удалено, пользователь с этой организационной ролью потеряет доступ, предоставленный этим разрешением.',
removed: 'Разрешение {{name}} успешно удалено из этой организационной роли',
+ assign_description:
+ 'Назначьте разрешения ролям в этой организации. Они могут включать как организационные разрешения, так и разрешения API.',
+ organization_permissions: 'Организационные разрешения',
+ api_permissions: 'Разрешения API',
+ assign_organization_permissions: 'Назначить разрешения организации',
+ assign_api_permissions: 'Назначить разрешения API',
},
general: {
tab: 'Общее',
diff --git a/packages/phrases/src/locales/tr-tr/translation/admin-console/organization-role-details.ts b/packages/phrases/src/locales/tr-tr/translation/admin-console/organization-role-details.ts
index ad4c9626aa29..0f79dcb33502 100644
--- a/packages/phrases/src/locales/tr-tr/translation/admin-console/organization-role-details.ts
+++ b/packages/phrases/src/locales/tr-tr/translation/admin-console/organization-role-details.ts
@@ -19,6 +19,12 @@ const organization_role_details = {
remove_confirmation:
'Bu izin kaldırılırsa, bu organizasyon rolüne sahip kullanıcı bu izin tarafından verilen erişimi kaybeder.',
removed: '{{name}} izni bu organizasyon rolünden başarıyla kaldırıldı',
+ assign_description:
+ 'Bu organizasyon içindeki roller için izinleri atayın. Bunlar hem organizasyon izinlerini hem de API izinlerini içerebilir.',
+ organization_permissions: 'Organizasyon izinleri',
+ api_permissions: 'API izinleri',
+ assign_organization_permissions: 'Kuruluş izinleri ata',
+ assign_api_permissions: 'API izinleri ata',
},
general: {
tab: 'Genel',
diff --git a/packages/phrases/src/locales/zh-cn/translation/admin-console/organization-role-details.ts b/packages/phrases/src/locales/zh-cn/translation/admin-console/organization-role-details.ts
index 8e39fd588bd1..1ec1e480eb4a 100644
--- a/packages/phrases/src/locales/zh-cn/translation/admin-console/organization-role-details.ts
+++ b/packages/phrases/src/locales/zh-cn/translation/admin-console/organization-role-details.ts
@@ -18,6 +18,11 @@ const organization_role_details = {
remove_permission: '移除权限',
remove_confirmation: '如果移除此权限,拥有此组织角色的用户将失去此权限授予的访问权限。',
removed: '权限 {{name}} 已成功从此组织角色中移除',
+ assign_description: '为此组织中的角色分配权限。这些权限可以包括组织权限和 API 权限。',
+ organization_permissions: '组织权限',
+ api_permissions: 'API 权限',
+ assign_organization_permissions: '分配组织权限',
+ assign_api_permissions: '分配API权限',
},
general: {
tab: '常规',
diff --git a/packages/phrases/src/locales/zh-hk/translation/admin-console/organization-role-details.ts b/packages/phrases/src/locales/zh-hk/translation/admin-console/organization-role-details.ts
index 01610c0b00ae..02c9a82fed1d 100644
--- a/packages/phrases/src/locales/zh-hk/translation/admin-console/organization-role-details.ts
+++ b/packages/phrases/src/locales/zh-hk/translation/admin-console/organization-role-details.ts
@@ -18,6 +18,11 @@ const organization_role_details = {
remove_permission: '移除權限',
remove_confirmation: '如果移除此權限,擁有此組織角色的使用者將失去此權限所授予的存取權。',
removed: '權限 {{name}} 已成功從此組織角色中移除',
+ assign_description: '為此組織中的角色分配權限。這些可以包括組織權限和 API 權限。',
+ organization_permissions: '組織權限',
+ api_permissions: 'API 權限',
+ assign_organization_permissions: '分配組織權限',
+ assign_api_permissions: '分配API權限',
},
general: {
tab: '一般',
diff --git a/packages/phrases/src/locales/zh-tw/translation/admin-console/organization-role-details.ts b/packages/phrases/src/locales/zh-tw/translation/admin-console/organization-role-details.ts
index 5b84ca5fd68e..7951509fa4e9 100644
--- a/packages/phrases/src/locales/zh-tw/translation/admin-console/organization-role-details.ts
+++ b/packages/phrases/src/locales/zh-tw/translation/admin-console/organization-role-details.ts
@@ -18,6 +18,11 @@ const organization_role_details = {
remove_permission: '移除權限',
remove_confirmation: '如果移除此權限,擁有此組織角色的使用者將失去此權限所授予的存取權。',
removed: '權限 {{name}} 已成功從此組織角色中移除',
+ assign_description: '為此組織中的角色分配權限。這些可以包括組織權限和 API 權限。',
+ organization_permissions: '組織權限',
+ api_permissions: 'API 權限',
+ assign_organization_permissions: '分配組織權限',
+ assign_api_permissions: '分配API許可權',
},
general: {
tab: '一般',