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: '一般',