diff --git a/packages/console/src/components/RoleEntitiesTransfer/components/SourceEntitiesBox/index.tsx b/packages/console/src/components/RoleEntitiesTransfer/components/SourceEntitiesBox/index.tsx index b68d22a2c..fd78779c6 100644 --- a/packages/console/src/components/RoleEntitiesTransfer/components/SourceEntitiesBox/index.tsx +++ b/packages/console/src/components/RoleEntitiesTransfer/components/SourceEntitiesBox/index.tsx @@ -54,6 +54,7 @@ function SourceEntitiesBox({ ...commonSearchParams, }) : buildUrl(`api/applications`, { + excludeRoleId: roleId, ...commonSearchParams, 'search.type': ApplicationType.MachineToMachine, 'mode.type': 'exact', diff --git a/packages/console/src/consts/page-tabs.ts b/packages/console/src/consts/page-tabs.ts index 812dc6505..cd87e64b1 100644 --- a/packages/console/src/consts/page-tabs.ts +++ b/packages/console/src/consts/page-tabs.ts @@ -28,6 +28,7 @@ export enum RoleDetailsTabs { Settings = 'settings', Permissions = 'permissions', Users = 'users', + M2mApps = 'machine-to-machine-apps', } export enum TenantSettingsTabs { diff --git a/packages/console/src/containers/ConsoleContent/index.tsx b/packages/console/src/containers/ConsoleContent/index.tsx index 056324365..bd64d5672 100644 --- a/packages/console/src/containers/ConsoleContent/index.tsx +++ b/packages/console/src/containers/ConsoleContent/index.tsx @@ -32,6 +32,7 @@ import LinkEmailModal from '@/pages/Profile/containers/LinkEmailModal'; import VerificationCodeModal from '@/pages/Profile/containers/VerificationCodeModal'; import VerifyPasswordModal from '@/pages/Profile/containers/VerifyPasswordModal'; import RoleDetails from '@/pages/RoleDetails'; +import RoleApplications from '@/pages/RoleDetails/RoleApplications'; import RolePermissions from '@/pages/RoleDetails/RolePermissions'; import RoleSettings from '@/pages/RoleDetails/RoleSettings'; import RoleUsers from '@/pages/RoleDetails/RoleUsers'; @@ -145,6 +146,7 @@ function ConsoleContent() { } /> } /> } /> + } /> diff --git a/packages/console/src/pages/RoleDetails/RoleApplications/index.module.scss b/packages/console/src/pages/RoleDetails/RoleApplications/index.module.scss new file mode 100644 index 000000000..b44cbfd54 --- /dev/null +++ b/packages/console/src/pages/RoleDetails/RoleApplications/index.module.scss @@ -0,0 +1,20 @@ +@use '@/scss/underscore' as _; + +.applicationsTable { + flex: 1; + margin-bottom: _.unit(6); + color: var(--color-text); + + .filter { + display: flex; + justify-content: space-between; + align-items: center; + } + + tbody { + td { + max-width: 100%; + @include _.text-ellipsis; + } + } +} diff --git a/packages/console/src/pages/RoleDetails/RoleApplications/index.tsx b/packages/console/src/pages/RoleDetails/RoleApplications/index.tsx new file mode 100644 index 000000000..4544c8722 --- /dev/null +++ b/packages/console/src/pages/RoleDetails/RoleApplications/index.tsx @@ -0,0 +1,193 @@ +import { type Application, RoleType, Theme } from '@logto/schemas'; +import { conditional } from '@silverhand/essentials'; +import { useState } from 'react'; +import { toast } from 'react-hot-toast'; +import { useTranslation } from 'react-i18next'; +import { useOutletContext } from 'react-router-dom'; +import useSWR from 'swr'; + +import Delete from '@/assets/icons/delete.svg'; +import MachineToMachineIconDark from '@/assets/icons/m2m-role-dark.svg'; +import MachineToMachineIcon from '@/assets/icons/m2m-role.svg'; +import Plus from '@/assets/icons/plus.svg'; +import EmptyDataPlaceholder from '@/components/EmptyDataPlaceholder'; +import ItemPreview from '@/components/ItemPreview'; +import { defaultPageSize } from '@/consts'; +import Button from '@/ds-components/Button'; +import ConfirmModal from '@/ds-components/ConfirmModal'; +import IconButton from '@/ds-components/IconButton'; +import Search from '@/ds-components/Search'; +import Table from '@/ds-components/Table'; +import { Tooltip } from '@/ds-components/Tip'; +import type { RequestError } from '@/hooks/use-api'; +import useApi from '@/hooks/use-api'; +import useSearchParametersWatcher from '@/hooks/use-search-parameters-watcher'; +import useTheme from '@/hooks/use-theme'; +import AssignRoleModal from '@/pages/Roles/components/AssignRoleModal'; +import { buildUrl, formatSearchKeyword } from '@/utils/url'; + +import type { RoleDetailsOutletContext } from '../types'; + +import * as styles from './index.module.scss'; + +const pageSize = defaultPageSize; + +function RoleApplications() { + const { + role: { id: roleId }, + } = useOutletContext(); + const theme = useTheme(); + + const { t } = useTranslation(undefined, { keyPrefix: 'admin_console' }); + + const [{ page, keyword }, updateSearchParameters] = useSearchParametersWatcher({ + page: 1, + keyword: '', + }); + + const { data, error, mutate } = useSWR<[Application[], number], RequestError>( + roleId && + buildUrl(`api/roles/${roleId}/applications`, { + page: String(page), + page_size: String(pageSize), + ...conditional(keyword && { search: formatSearchKeyword(keyword) }), + }) + ); + + const isLoading = !data && !error; + + const [applications, totalCount] = data ?? []; + + const [isAssignModalOpen, setIsAssignModalOpen] = useState(false); + const [applicationToBeDeleted, setApplicationToBeDeleted] = useState(); + const [isDeleting, setIsDeleting] = useState(false); + + const api = useApi(); + + const handleDelete = async () => { + if (!applicationToBeDeleted || isDeleting) { + return; + } + setIsDeleting(true); + + try { + await api.delete(`api/roles/${roleId}/applications/${applicationToBeDeleted.id}`); + toast.success(t('role_details.applications.deleted', { name: applicationToBeDeleted.name })); + await mutate(); + setApplicationToBeDeleted(undefined); + } finally { + setIsDeleting(false); + } + }; + + return ( + <> + { + return ( + : + } + to={`/applications/${application.id}`} + /> + ); + }, + }, + { + title: t('role_details.applications.description_column'), + dataIndex: 'description', + colSpan: 5, + render: ({ description }) => {conditional(description) ?? '-'}, + }, + { + title: null, + dataIndex: 'delete', + colSpan: 1, + render: (application) => ( + + { + setApplicationToBeDeleted(application); + }} + > + + + + ), + }, + ]} + filter={ +
+ { + updateSearchParameters({ keyword, page: 1 }); + }} + onClearSearch={() => { + updateSearchParameters({ keyword: '', page: 1 }); + }} + /> +
+ } + pagination={{ + page, + pageSize, + totalCount, + onChange: (page) => { + updateSearchParameters({ page }); + }, + }} + placeholder={} + /> + {applicationToBeDeleted && ( + { + setApplicationToBeDeleted(undefined); + }} + onConfirm={handleDelete} + > + {t('role_details.applications.delete_description')} + + )} + {isAssignModalOpen && ( + { + if (success) { + void mutate(); + } + setIsAssignModalOpen(false); + }} + /> + )} + + ); +} + +export default RoleApplications; diff --git a/packages/console/src/pages/RoleDetails/index.module.scss b/packages/console/src/pages/RoleDetails/index.module.scss index 7a56ead9c..5fcb55d99 100644 --- a/packages/console/src/pages/RoleDetails/index.module.scss +++ b/packages/console/src/pages/RoleDetails/index.module.scss @@ -10,7 +10,19 @@ align-items: center; padding: _.unit(6) _.unit(8); + > *:not(:first-child) { + margin-left: _.unit(6); + } + + .icon { + margin-left: _.unit(2); + width: 60px; + height: 60px; + } + .info { + flex: 1; + .name { font: var(--font-title-1); color: var(--color-text); @@ -20,10 +32,22 @@ display: flex; align-items: center; + > * { + display: inline-block; + } + + > :not(:first-child) { + margin-left: _.unit(2); + } + .idText { font: var(--font-label-2); color: var(--color-text-secondary); - margin-right: _.unit(1); + } + + .verticalBar { + @include _.vertical-bar; + height: 12px; } } } diff --git a/packages/console/src/pages/RoleDetails/index.tsx b/packages/console/src/pages/RoleDetails/index.tsx index 86e526d54..eaa4f9e51 100644 --- a/packages/console/src/pages/RoleDetails/index.tsx +++ b/packages/console/src/pages/RoleDetails/index.tsx @@ -1,5 +1,6 @@ import { withAppInsights } from '@logto/app-insights/react'; import type { Role } from '@logto/schemas'; +import { Theme, RoleType } from '@logto/schemas'; import classNames from 'classnames'; import { useEffect, useState } from 'react'; import { toast } from 'react-hot-toast'; @@ -8,7 +9,11 @@ import { Outlet, useLocation, useParams } from 'react-router-dom'; import useSWR, { useSWRConfig } from 'swr'; import Delete from '@/assets/icons/delete.svg'; +import MachineToMachineIconDark from '@/assets/icons/m2m-role-dark.svg'; +import MachineToMachineIcon from '@/assets/icons/m2m-role.svg'; import More from '@/assets/icons/more.svg'; +import UserRoleIconDark from '@/assets/icons/user-role-dark.svg'; +import UserRoleIcon from '@/assets/icons/user-role.svg'; import DetailsPage from '@/components/DetailsPage'; import { RoleDetailsTabs } from '@/consts/page-tabs'; import ActionMenu, { ActionMenuItem } from '@/ds-components/ActionMenu'; @@ -16,21 +21,42 @@ import Card from '@/ds-components/Card'; import ConfirmModal from '@/ds-components/ConfirmModal'; import CopyToClipboard from '@/ds-components/CopyToClipboard'; import TabNav, { TabNavItem } from '@/ds-components/TabNav'; +import Tag from '@/ds-components/Tag'; import type { RequestError } from '@/hooks/use-api'; import useApi from '@/hooks/use-api'; import useTenantPathname from '@/hooks/use-tenant-pathname'; +import useTheme from '@/hooks/use-theme'; import * as styles from './index.module.scss'; import { type RoleDetailsOutletContext } from './types'; +const getRoleIcon = (type: RoleType, isDarkMode: boolean) => { + if (type === RoleType.User) { + return isDarkMode ? ( + + ) : ( + + ); + } + + return isDarkMode ? ( + + ) : ( + + ); +}; + function RoleDetails() { const { pathname } = useLocation(); const { id } = useParams(); const { t } = useTranslation(undefined, { keyPrefix: 'admin_console' }); const { navigate } = useTenantPathname(); + const theme = useTheme(); const isPageHasTable = - pathname.endsWith(RoleDetailsTabs.Permissions) || pathname.endsWith(RoleDetailsTabs.Users); + pathname.endsWith(RoleDetailsTabs.Permissions) || + pathname.endsWith(RoleDetailsTabs.Users) || + pathname.endsWith(RoleDetailsTabs.M2mApps); const { data, error, mutate } = useSWR(id && `api/roles/${id}`); const { mutate: mutateGlobal } = useSWRConfig(); @@ -75,9 +101,18 @@ function RoleDetails() { {data && ( <> + {getRoleIcon(data.type, theme === Theme.Dark)}
{data.name}
+ + {t( + data.type === RoleType.User + ? 'role_details.type_user_role_tag' + : 'role_details.type_m2m_role_tag' + )} + +
{t('role_details.identifier')}
@@ -115,8 +150,14 @@ function RoleDetails() { {t('role_details.permissions_tab')} - - {t('role_details.users_tab')} + + {t( + data.type === RoleType.User ? 'role_details.users_tab' : 'role_details.m2m_apps_tab' + )} { }; export const createApplicationQueries = (pool: CommonQueryMethods) => { - const countApplications = async (search: Search) => { + const countApplications = async (search: Search, excludeApplicationIds: string[]) => { const { count } = await pool.one<{ count: string }>(sql` select count(*) from ${table} - ${buildConditionArray([buildApplicationConditions(search)])} + ${buildConditionArray([ + excludeApplicationIds.length > 0 + ? sql`${fields.id} not in (${sql.join(excludeApplicationIds, sql`, `)})` + : sql``, + buildApplicationConditions(search), + ])} `); return { count: Number(count) }; }; - const findApplications = async (search: Search, limit?: number, offset?: number) => + const findApplications = async ( + search: Search, + excludeApplicationIds: string[], + limit?: number, + offset?: number + ) => pool.any(sql` select ${sql.join(Object.values(fields), sql`, `)} from ${table} - ${buildConditionArray([buildApplicationConditions(search)])} + ${buildConditionArray([ + excludeApplicationIds.length > 0 + ? sql`${fields.id} not in (${sql.join(excludeApplicationIds, sql`, `)})` + : sql``, + buildApplicationConditions(search), + ])} order by ${fields.createdAt} desc ${conditionalSql(limit, (value) => sql`limit ${value}`)} ${conditionalSql(offset, (value) => sql`offset ${value}`)} diff --git a/packages/core/src/routes/application.ts b/packages/core/src/routes/application.ts index 64802620e..fc97602e7 100644 --- a/packages/core/src/routes/application.ts +++ b/packages/core/src/routes/application.ts @@ -40,8 +40,12 @@ export default function applicationRoutes( countApplications, findApplications, } = queries.applications; - const { findApplicationsRolesByApplicationId, insertApplicationsRoles, deleteApplicationRole } = - queries.applicationsRoles; + const { + findApplicationsRolesByApplicationId, + insertApplicationsRoles, + deleteApplicationRole, + findApplicationsRolesByRoleId, + } = queries.applicationsRoles; const { findRoleByRoleName } = queries.roles; router.get( @@ -57,15 +61,23 @@ export default function applicationRoutes( const search = parseSearchParamsForSearch(searchParams); + const excludeRoleId = searchParams.get('excludeRoleId'); + const excludeApplicationsRoles = excludeRoleId + ? await findApplicationsRolesByRoleId(excludeRoleId) + : []; + const excludeApplicationIds = excludeApplicationsRoles.map( + ({ applicationId }) => applicationId + ); + if (paginationDisabled) { - ctx.body = await findApplications(search); + ctx.body = await findApplications(search, excludeApplicationIds); return next(); } const [{ count }, applications] = await Promise.all([ - countApplications(search), - findApplications(search, limit, offset), + countApplications(search, excludeApplicationIds), + findApplications(search, excludeApplicationIds, limit, offset), ]); // Return totalCount to pagination middleware diff --git a/packages/phrases/src/locales/de/translation/admin-console/role-details.ts b/packages/phrases/src/locales/de/translation/admin-console/role-details.ts index 3366c6bf8..f4119d000 100644 --- a/packages/phrases/src/locales/de/translation/admin-console/role-details.ts +++ b/packages/phrases/src/locales/de/translation/admin-console/role-details.ts @@ -6,12 +6,18 @@ const role_details = { role_deleted: '{{name}} wurde erfolgreich gelöscht.', settings_tab: 'Einstellungen', users_tab: 'Benutzer', + /** UNTRANSLATED */ + m2m_apps_tab: 'Machine-to-machine apps', permissions_tab: 'Berechtigungen', settings: 'Einstellungen', settings_description: 'Rollen sind eine Gruppierung von Berechtigungen, die Benutzern zugewiesen werden können. Sie ermöglichen auch eine Zusammenfassung von Berechtigungen, die für verschiedene APIs definiert wurden, was es effizienter macht, Berechtigungen im Vergleich zur individuellen Zuweisung an Benutzer hinzuzufügen, zu entfernen oder zu ändern.', field_name: 'Name', field_description: 'Beschreibung', + /** UNTRANSLATED */ + type_m2m_role_tag: 'Machine-to-machine app role', + /** UNTRANSLATED */ + type_user_role_tag: 'User role', permission: { assign_button: 'Berechtigungen zuweisen', assign_title: 'Berechtigungen zuweisen', @@ -52,11 +58,16 @@ const role_details = { /** UNTRANSLATED */ name_column: 'Application', /** UNTRANSLATED */ - app_column: 'App', + app_column: 'Apps', + /** UNTRANSLATED */ + description_column: 'Description', + /** UNTRANSLATED */ + delete_description: + 'It will remain in your application pool but lose the authorization for this role.', /** UNTRANSLATED */ deleted: '{{name}} was successfully removed from this role', /** UNTRANSLATED */ - assign_title: 'Assign applications', + assign_title: 'Assign apps', /** UNTRANSLATED */ assign_subtitle: 'Assign applications to this role. Find appropriate applications by searching name, description or app ID.', diff --git a/packages/phrases/src/locales/en/translation/admin-console/role-details.ts b/packages/phrases/src/locales/en/translation/admin-console/role-details.ts index f6d9451ba..9d68b7438 100644 --- a/packages/phrases/src/locales/en/translation/admin-console/role-details.ts +++ b/packages/phrases/src/locales/en/translation/admin-console/role-details.ts @@ -6,12 +6,18 @@ const role_details = { role_deleted: '{{name}} was successfully deleted.', settings_tab: 'Settings', users_tab: 'Users', + /** UNTRANSLATED */ + m2m_apps_tab: 'Machine-to-machine apps', permissions_tab: 'Permissions', settings: 'Settings', settings_description: 'Roles are a grouping of permissions that can be assigned to users. They also provide a way to aggregate permissions defined for different APIs, making it more efficient to add, remove, or adjust permissions compared to assigning them individually to users.', field_name: 'Name', field_description: 'Description', + /** UNTRANSLATED */ + type_m2m_role_tag: 'Machine-to-machine app role', + /** UNTRANSLATED */ + type_user_role_tag: 'User role', permission: { assign_button: 'Assign Permissions', assign_title: 'Assign permissions', @@ -48,9 +54,12 @@ const role_details = { applications: { assign_button: 'Assign applications', name_column: 'Application', - app_column: 'App', + app_column: 'Apps', + description_column: 'Description', + delete_description: + 'It will remain in your application pool but lose the authorization for this role.', deleted: '{{name}} was successfully removed from this role', - assign_title: 'Assign applications', + assign_title: 'Assign apps', assign_subtitle: 'Assign applications to this role. Find appropriate applications by searching name, description or app ID.', assign_applications_field: 'Assign applications', diff --git a/packages/phrases/src/locales/es/translation/admin-console/role-details.ts b/packages/phrases/src/locales/es/translation/admin-console/role-details.ts index 22bbb73a1..e1617b83b 100644 --- a/packages/phrases/src/locales/es/translation/admin-console/role-details.ts +++ b/packages/phrases/src/locales/es/translation/admin-console/role-details.ts @@ -6,12 +6,18 @@ const role_details = { role_deleted: '{{name}} fue eliminado correctamente.', settings_tab: 'Configuración', users_tab: 'Usuarios', + /** UNTRANSLATED */ + m2m_apps_tab: 'Machine-to-machine apps', permissions_tab: 'Permisos', settings: 'Configuración', settings_description: 'Los roles son un agrupamiento de permisos que se pueden asignar a los usuarios. También proporcionan una manera de agregar permisos definidos para diferentes APIs, lo que hace más eficiente agregar, eliminar o ajustar permisos en comparación con asignarlos individualmente a los usuarios.', field_name: 'Nombre', field_description: 'Descripción', + /** UNTRANSLATED */ + type_m2m_role_tag: 'Machine-to-machine app role', + /** UNTRANSLATED */ + type_user_role_tag: 'User role', permission: { assign_button: 'Asignar permisos', assign_title: 'Asignar permisos', @@ -51,11 +57,16 @@ const role_details = { /** UNTRANSLATED */ name_column: 'Application', /** UNTRANSLATED */ - app_column: 'App', + app_column: 'Apps', + /** UNTRANSLATED */ + description_column: 'Description', + /** UNTRANSLATED */ + delete_description: + 'It will remain in your application pool but lose the authorization for this role.', /** UNTRANSLATED */ deleted: '{{name}} was successfully removed from this role', /** UNTRANSLATED */ - assign_title: 'Assign applications', + assign_title: 'Assign apps', /** UNTRANSLATED */ assign_subtitle: 'Assign applications to this role. Find appropriate applications by searching name, description or app ID.', diff --git a/packages/phrases/src/locales/fr/translation/admin-console/role-details.ts b/packages/phrases/src/locales/fr/translation/admin-console/role-details.ts index fc73ef107..e843c6fae 100644 --- a/packages/phrases/src/locales/fr/translation/admin-console/role-details.ts +++ b/packages/phrases/src/locales/fr/translation/admin-console/role-details.ts @@ -6,12 +6,18 @@ const role_details = { role_deleted: '{{name}} a été supprimé avec succès.', settings_tab: 'Paramètres', users_tab: 'Utilisateurs', + /** UNTRANSLATED */ + m2m_apps_tab: 'Machine-to-machine apps', permissions_tab: 'Autorisations', settings: 'Paramètres', settings_description: "Les rôles sont un regroupement d'autorisations qui peuvent être attribuées aux utilisateurs. Ils fournissent également un moyen d'agréger les autorisations définies pour différentes API, ce qui rend plus efficace l'ajout, la suppression ou l'ajustement des autorisations par rapport à leur attribution individuelle aux utilisateurs.", field_name: 'Nom', field_description: 'Description', + /** UNTRANSLATED */ + type_m2m_role_tag: 'Machine-to-machine app role', + /** UNTRANSLATED */ + type_user_role_tag: 'User role', permission: { assign_button: 'Attribuer des autorisations', assign_title: 'Attribuer des autorisations', @@ -51,11 +57,16 @@ const role_details = { /** UNTRANSLATED */ name_column: 'Application', /** UNTRANSLATED */ - app_column: 'App', + app_column: 'Apps', + /** UNTRANSLATED */ + description_column: 'Description', + /** UNTRANSLATED */ + delete_description: + 'It will remain in your application pool but lose the authorization for this role.', /** UNTRANSLATED */ deleted: '{{name}} was successfully removed from this role', /** UNTRANSLATED */ - assign_title: 'Assign applications', + assign_title: 'Assign apps', /** UNTRANSLATED */ assign_subtitle: 'Assign applications to this role. Find appropriate applications by searching name, description or app ID.', diff --git a/packages/phrases/src/locales/it/translation/admin-console/role-details.ts b/packages/phrases/src/locales/it/translation/admin-console/role-details.ts index 3422b5a0e..7660f4da0 100644 --- a/packages/phrases/src/locales/it/translation/admin-console/role-details.ts +++ b/packages/phrases/src/locales/it/translation/admin-console/role-details.ts @@ -6,12 +6,18 @@ const role_details = { role_deleted: '{{name}} è stato cancellato con successo.', settings_tab: 'Impostazioni', users_tab: 'Utenti', + /** UNTRANSLATED */ + m2m_apps_tab: 'Machine-to-machine apps', permissions_tab: 'Permessi', settings: 'Impostazioni', settings_description: "I ruoli sono un raggruppamento di autorizzazioni che possono essere assegnate agli utenti. Forniscono anche un modo per aggregare le autorizzazioni definite per diverse API, rendendo più efficiente l'aggiunta, la rimozione o la regolazione delle autorizzazioni rispetto all'assegnazione individuale agli utenti.", field_name: 'Nome', field_description: 'Descrizione', + /** UNTRANSLATED */ + type_m2m_role_tag: 'Machine-to-machine app role', + /** UNTRANSLATED */ + type_user_role_tag: 'User role', permission: { assign_button: 'Assegna permessi', assign_title: 'Assegna permessi', @@ -52,11 +58,16 @@ const role_details = { /** UNTRANSLATED */ name_column: 'Application', /** UNTRANSLATED */ - app_column: 'App', + app_column: 'Apps', + /** UNTRANSLATED */ + description_column: 'Description', + /** UNTRANSLATED */ + delete_description: + 'It will remain in your application pool but lose the authorization for this role.', /** UNTRANSLATED */ deleted: '{{name}} was successfully removed from this role', /** UNTRANSLATED */ - assign_title: 'Assign applications', + assign_title: 'Assign apps', /** UNTRANSLATED */ assign_subtitle: 'Assign applications to this role. Find appropriate applications by searching name, description or app ID.', diff --git a/packages/phrases/src/locales/ja/translation/admin-console/role-details.ts b/packages/phrases/src/locales/ja/translation/admin-console/role-details.ts index 09c95622e..222c7e7f7 100644 --- a/packages/phrases/src/locales/ja/translation/admin-console/role-details.ts +++ b/packages/phrases/src/locales/ja/translation/admin-console/role-details.ts @@ -6,12 +6,18 @@ const role_details = { role_deleted: '{{name}} は正常に削除されました。', settings_tab: '設定', users_tab: 'ユーザー', + /** UNTRANSLATED */ + m2m_apps_tab: 'Machine-to-machine apps', permissions_tab: '許可', settings: '設定', settings_description: 'ロールは、ユーザーに割り当てることができる許可のグループ化です。また、異なるAPIに対して定義された許可を集約する方法を提供し、ユーザーに個別に割り当てるよりも許可を追加、削除、または調整するのに効率的です。', field_name: '名前', field_description: '説明', + /** UNTRANSLATED */ + type_m2m_role_tag: 'Machine-to-machine app role', + /** UNTRANSLATED */ + type_user_role_tag: 'User role', permission: { assign_button: '許可を割り当てる', assign_title: '許可の割り当て', @@ -50,11 +56,16 @@ const role_details = { /** UNTRANSLATED */ name_column: 'Application', /** UNTRANSLATED */ - app_column: 'App', + app_column: 'Apps', + /** UNTRANSLATED */ + description_column: 'Description', + /** UNTRANSLATED */ + delete_description: + 'It will remain in your application pool but lose the authorization for this role.', /** UNTRANSLATED */ deleted: '{{name}} was successfully removed from this role', /** UNTRANSLATED */ - assign_title: 'Assign applications', + assign_title: 'Assign apps', /** UNTRANSLATED */ assign_subtitle: 'Assign applications to this role. Find appropriate applications by searching name, description or app ID.', diff --git a/packages/phrases/src/locales/ko/translation/admin-console/role-details.ts b/packages/phrases/src/locales/ko/translation/admin-console/role-details.ts index 2e6bdf9fa..13cdabbcc 100644 --- a/packages/phrases/src/locales/ko/translation/admin-console/role-details.ts +++ b/packages/phrases/src/locales/ko/translation/admin-console/role-details.ts @@ -6,12 +6,18 @@ const role_details = { role_deleted: '{{name}}이 성공적으로 삭제되었어요.', settings_tab: '설정', users_tab: '사용자', + /** UNTRANSLATED */ + m2m_apps_tab: 'Machine-to-machine apps', permissions_tab: '권한', settings: '설정', settings_description: '역할은 사용자에게 할당된 권한들의 모음이에요. 역할은 다양한 API에 정의된 권한들을 통합하는 방법을 제공하기 때문에, 사용자에게 개별적으로 할당하는 것보다 효율적으로 권한을 추가, 제거, 조정할 수 있어요.', field_name: '이름', field_description: '설명', + /** UNTRANSLATED */ + type_m2m_role_tag: 'Machine-to-machine app role', + /** UNTRANSLATED */ + type_user_role_tag: 'User role', permission: { assign_button: '권한 할당', assign_title: '권한 할당', @@ -50,11 +56,16 @@ const role_details = { /** UNTRANSLATED */ name_column: 'Application', /** UNTRANSLATED */ - app_column: 'App', + app_column: 'Apps', + /** UNTRANSLATED */ + description_column: 'Description', + /** UNTRANSLATED */ + delete_description: + 'It will remain in your application pool but lose the authorization for this role.', /** UNTRANSLATED */ deleted: '{{name}} was successfully removed from this role', /** UNTRANSLATED */ - assign_title: 'Assign applications', + assign_title: 'Assign apps', /** UNTRANSLATED */ assign_subtitle: 'Assign applications to this role. Find appropriate applications by searching name, description or app ID.', diff --git a/packages/phrases/src/locales/pl-pl/translation/admin-console/role-details.ts b/packages/phrases/src/locales/pl-pl/translation/admin-console/role-details.ts index 495528618..c46b78699 100644 --- a/packages/phrases/src/locales/pl-pl/translation/admin-console/role-details.ts +++ b/packages/phrases/src/locales/pl-pl/translation/admin-console/role-details.ts @@ -6,12 +6,18 @@ const role_details = { role_deleted: '{{name}} został pomyślnie usunięty.', settings_tab: 'Ustawienia', users_tab: 'Użytkownicy', + /** UNTRANSLATED */ + m2m_apps_tab: 'Machine-to-machine apps', permissions_tab: 'Uprawnienia', settings: 'Ustawienia', settings_description: 'Role to grupowanie uprawnień, które mogą być przypisywane do użytkowników. Zapewniają również sposób agregacji uprawnień zdefiniowanych dla różnych interfejsów API, co umożliwia bardziej efektywne dodawanie, usuwanie lub modyfikowanie uprawnień w porównaniu z przypisywaniem ich do użytkowników indywidualnie.', field_name: 'Nazwa', field_description: 'Opis', + /** UNTRANSLATED */ + type_m2m_role_tag: 'Machine-to-machine app role', + /** UNTRANSLATED */ + type_user_role_tag: 'User role', permission: { assign_button: 'Przypisz uprawnienia', assign_title: 'Przypisz uprawnienia', @@ -51,11 +57,16 @@ const role_details = { /** UNTRANSLATED */ name_column: 'Application', /** UNTRANSLATED */ - app_column: 'App', + app_column: 'Apps', + /** UNTRANSLATED */ + description_column: 'Description', + /** UNTRANSLATED */ + delete_description: + 'It will remain in your application pool but lose the authorization for this role.', /** UNTRANSLATED */ deleted: '{{name}} was successfully removed from this role', /** UNTRANSLATED */ - assign_title: 'Assign applications', + assign_title: 'Assign apps', /** UNTRANSLATED */ assign_subtitle: 'Assign applications to this role. Find appropriate applications by searching name, description or app ID.', diff --git a/packages/phrases/src/locales/pt-br/translation/admin-console/role-details.ts b/packages/phrases/src/locales/pt-br/translation/admin-console/role-details.ts index 904b5c9f8..71290591b 100644 --- a/packages/phrases/src/locales/pt-br/translation/admin-console/role-details.ts +++ b/packages/phrases/src/locales/pt-br/translation/admin-console/role-details.ts @@ -6,12 +6,18 @@ const role_details = { role_deleted: '{{name}} foi excluído com sucesso.', settings_tab: 'Configurações', users_tab: 'Usuários', + /** UNTRANSLATED */ + m2m_apps_tab: 'Machine-to-machine apps', permissions_tab: 'Permissões', settings: 'Configurações', settings_description: 'Os papéis são um agrupamento de permissões que podem ser atribuídas a usuários. Eles também fornecem uma maneira de agregar permissões definidas para diferentes APIs, tornando mais eficiente a adição, remoção ou ajuste de permissões em comparação com a atribuição individual a usuários.', field_name: 'Nome', field_description: 'Descrição', + /** UNTRANSLATED */ + type_m2m_role_tag: 'Machine-to-machine app role', + /** UNTRANSLATED */ + type_user_role_tag: 'User role', permission: { assign_button: 'Atribuir permissões', assign_title: 'Atribuir permissões', @@ -51,11 +57,16 @@ const role_details = { /** UNTRANSLATED */ name_column: 'Application', /** UNTRANSLATED */ - app_column: 'App', + app_column: 'Apps', + /** UNTRANSLATED */ + description_column: 'Description', + /** UNTRANSLATED */ + delete_description: + 'It will remain in your application pool but lose the authorization for this role.', /** UNTRANSLATED */ deleted: '{{name}} was successfully removed from this role', /** UNTRANSLATED */ - assign_title: 'Assign applications', + assign_title: 'Assign apps', /** UNTRANSLATED */ assign_subtitle: 'Assign applications to this role. Find appropriate applications by searching name, description or app ID.', diff --git a/packages/phrases/src/locales/pt-pt/translation/admin-console/role-details.ts b/packages/phrases/src/locales/pt-pt/translation/admin-console/role-details.ts index 5236b88c5..8119b7750 100644 --- a/packages/phrases/src/locales/pt-pt/translation/admin-console/role-details.ts +++ b/packages/phrases/src/locales/pt-pt/translation/admin-console/role-details.ts @@ -6,12 +6,18 @@ const role_details = { role_deleted: '{{name}} foi eliminada com sucesso.', settings_tab: 'Definições', users_tab: 'Utilizadores', + /** UNTRANSLATED */ + m2m_apps_tab: 'Machine-to-machine apps', permissions_tab: 'Permissões', settings: 'Definições', settings_description: 'As funções são um agrupamento de permissões que podem ser atribuídas aos utilizadores. Elas também proporcionam uma forma de agregar permissões definidas para diferentes APIs, tornando mais eficiente adicionar, remover ou ajustar permissões comparativamente à sua atribuição individual a utilizadores.', field_name: 'Nome', field_description: 'Descrição', + /** UNTRANSLATED */ + type_m2m_role_tag: 'Machine-to-machine app role', + /** UNTRANSLATED */ + type_user_role_tag: 'User role', permission: { assign_button: 'Atribuir Permissões', assign_title: 'Atribuir permissões', @@ -51,11 +57,16 @@ const role_details = { /** UNTRANSLATED */ name_column: 'Application', /** UNTRANSLATED */ - app_column: 'App', + app_column: 'Apps', + /** UNTRANSLATED */ + description_column: 'Description', + /** UNTRANSLATED */ + delete_description: + 'It will remain in your application pool but lose the authorization for this role.', /** UNTRANSLATED */ deleted: '{{name}} was successfully removed from this role', /** UNTRANSLATED */ - assign_title: 'Assign applications', + assign_title: 'Assign apps', /** UNTRANSLATED */ assign_subtitle: 'Assign applications to this role. Find appropriate applications by searching name, description or app ID.', diff --git a/packages/phrases/src/locales/ru/translation/admin-console/role-details.ts b/packages/phrases/src/locales/ru/translation/admin-console/role-details.ts index 9732fdd1e..422773a80 100644 --- a/packages/phrases/src/locales/ru/translation/admin-console/role-details.ts +++ b/packages/phrases/src/locales/ru/translation/admin-console/role-details.ts @@ -6,12 +6,18 @@ const role_details = { role_deleted: '{{name}} был успешно удален.', settings_tab: 'Настройки', users_tab: 'Пользователи', + /** UNTRANSLATED */ + m2m_apps_tab: 'Machine-to-machine apps', permissions_tab: 'Разрешения', settings: 'Настройки', settings_description: 'Роли - это группировка разрешений, которые могут быть назначены пользователям. Они также обеспечивают способ объединения разрешений, определенных для разных API, что делает более эффективным добавление, удаление или корректировку разрешений по сравнению с назначением их отдельно пользователям.', field_name: 'Имя', field_description: 'Описание', + /** UNTRANSLATED */ + type_m2m_role_tag: 'Machine-to-machine app role', + /** UNTRANSLATED */ + type_user_role_tag: 'User role', permission: { assign_button: 'Назначить Разрешения', assign_title: 'Назначить разрешения', @@ -51,11 +57,16 @@ const role_details = { /** UNTRANSLATED */ name_column: 'Application', /** UNTRANSLATED */ - app_column: 'App', + app_column: 'Apps', + /** UNTRANSLATED */ + description_column: 'Description', + /** UNTRANSLATED */ + delete_description: + 'It will remain in your application pool but lose the authorization for this role.', /** UNTRANSLATED */ deleted: '{{name}} was successfully removed from this role', /** UNTRANSLATED */ - assign_title: 'Assign applications', + assign_title: 'Assign apps', /** UNTRANSLATED */ assign_subtitle: 'Assign applications to this role. Find appropriate applications by searching name, description or app ID.', diff --git a/packages/phrases/src/locales/tr-tr/translation/admin-console/role-details.ts b/packages/phrases/src/locales/tr-tr/translation/admin-console/role-details.ts index b728b2a43..00e97de8a 100644 --- a/packages/phrases/src/locales/tr-tr/translation/admin-console/role-details.ts +++ b/packages/phrases/src/locales/tr-tr/translation/admin-console/role-details.ts @@ -6,12 +6,18 @@ const role_details = { role_deleted: '{{name}} başarıyla silindi.', settings_tab: 'Ayarlar', users_tab: 'Kullanıcılar', + /** UNTRANSLATED */ + m2m_apps_tab: 'Machine-to-machine apps', permissions_tab: 'İzinler', settings: 'Ayarlar', settings_description: "Roller, kullanıcılara atanabilen izinlerin bir gruplamasıdır. Ayrıca, farklı API'ler için tanımlanan izinleri biriktirmek için bir yol sağladıkları için, izinleri kullanıcılara bireysel olarak atamaktan daha verimli bir şekilde eklemek, kaldırmak veya ayarlamak için bir yoldur.", field_name: 'Adı', field_description: 'Açıklama', + /** UNTRANSLATED */ + type_m2m_role_tag: 'Machine-to-machine app role', + /** UNTRANSLATED */ + type_user_role_tag: 'User role', permission: { assign_button: 'İzinleri Ata', assign_title: 'İzinleri Ata', @@ -50,11 +56,16 @@ const role_details = { /** UNTRANSLATED */ name_column: 'Application', /** UNTRANSLATED */ - app_column: 'App', + app_column: 'Apps', + /** UNTRANSLATED */ + description_column: 'Description', + /** UNTRANSLATED */ + delete_description: + 'It will remain in your application pool but lose the authorization for this role.', /** UNTRANSLATED */ deleted: '{{name}} was successfully removed from this role', /** UNTRANSLATED */ - assign_title: 'Assign applications', + assign_title: 'Assign apps', /** UNTRANSLATED */ assign_subtitle: 'Assign applications to this role. Find appropriate applications by searching name, description or app ID.', diff --git a/packages/phrases/src/locales/zh-cn/translation/admin-console/role-details.ts b/packages/phrases/src/locales/zh-cn/translation/admin-console/role-details.ts index 549d3235d..46d02da6b 100644 --- a/packages/phrases/src/locales/zh-cn/translation/admin-console/role-details.ts +++ b/packages/phrases/src/locales/zh-cn/translation/admin-console/role-details.ts @@ -6,12 +6,18 @@ const role_details = { role_deleted: '{{name}} 已成功删除。', settings_tab: '设置', users_tab: '用户', + /** UNTRANSLATED */ + m2m_apps_tab: 'Machine-to-machine apps', permissions_tab: '权限', settings: '设置', settings_description: '角色是一组权限,可以分配给用户。它们还提供了一种聚合不同 API 定义的权限的方法,使得添加、删除或调整权限比将其单独分配给用户更有效率。', field_name: '名称', field_description: '描述', + /** UNTRANSLATED */ + type_m2m_role_tag: 'Machine-to-machine app role', + /** UNTRANSLATED */ + type_user_role_tag: 'User role', permission: { assign_button: '分配权限', assign_title: '分配权限', @@ -47,11 +53,16 @@ const role_details = { /** UNTRANSLATED */ name_column: 'Application', /** UNTRANSLATED */ - app_column: 'App', + app_column: 'Apps', + /** UNTRANSLATED */ + description_column: 'Description', + /** UNTRANSLATED */ + delete_description: + 'It will remain in your application pool but lose the authorization for this role.', /** UNTRANSLATED */ deleted: '{{name}} was successfully removed from this role', /** UNTRANSLATED */ - assign_title: 'Assign applications', + assign_title: 'Assign apps', /** UNTRANSLATED */ assign_subtitle: 'Assign applications to this role. Find appropriate applications by searching name, description or app ID.', diff --git a/packages/phrases/src/locales/zh-hk/translation/admin-console/role-details.ts b/packages/phrases/src/locales/zh-hk/translation/admin-console/role-details.ts index b71d5d30e..2742643dd 100644 --- a/packages/phrases/src/locales/zh-hk/translation/admin-console/role-details.ts +++ b/packages/phrases/src/locales/zh-hk/translation/admin-console/role-details.ts @@ -6,12 +6,18 @@ const role_details = { role_deleted: '{{name}} 已成功刪除。', settings_tab: '設置', users_tab: '用戶', + /** UNTRANSLATED */ + m2m_apps_tab: 'Machine-to-machine apps', permissions_tab: '權限', settings: '設置', settings_description: '角色是一組權限,可以分配給用戶。它們還提供了一種聚合不同 API 定義的權限的方法,使得添加、刪除或調整權限比將其單獨分配給用戶更有效率。', field_name: '名稱', field_description: '描述', + /** UNTRANSLATED */ + type_m2m_role_tag: 'Machine-to-machine app role', + /** UNTRANSLATED */ + type_user_role_tag: 'User role', permission: { assign_button: '分配權限', assign_title: '分配權限', @@ -47,11 +53,16 @@ const role_details = { /** UNTRANSLATED */ name_column: 'Application', /** UNTRANSLATED */ - app_column: 'App', + app_column: 'Apps', + /** UNTRANSLATED */ + description_column: 'Description', + /** UNTRANSLATED */ + delete_description: + 'It will remain in your application pool but lose the authorization for this role.', /** UNTRANSLATED */ deleted: '{{name}} was successfully removed from this role', /** UNTRANSLATED */ - assign_title: 'Assign applications', + assign_title: 'Assign apps', /** UNTRANSLATED */ assign_subtitle: 'Assign applications to this role. Find appropriate applications by searching name, description or app ID.', diff --git a/packages/phrases/src/locales/zh-tw/translation/admin-console/role-details.ts b/packages/phrases/src/locales/zh-tw/translation/admin-console/role-details.ts index 9859a7e8d..3debc57d7 100644 --- a/packages/phrases/src/locales/zh-tw/translation/admin-console/role-details.ts +++ b/packages/phrases/src/locales/zh-tw/translation/admin-console/role-details.ts @@ -6,12 +6,18 @@ const role_details = { role_deleted: '{{name}} 已成功刪除。', settings_tab: '設置', users_tab: '用戶', + /** UNTRANSLATED */ + m2m_apps_tab: 'Machine-to-machine apps', permissions_tab: '權限', settings: '設置', settings_description: '角色是一組權限,可以分配給用戶。它們還提供了一種聚合不同 API 定義的權限的方法,使得添加、刪除或調整權限比將其單獨分配給用戶更有效率。', field_name: '名稱', field_description: '描述', + /** UNTRANSLATED */ + type_m2m_role_tag: 'Machine-to-machine app role', + /** UNTRANSLATED */ + type_user_role_tag: 'User role', permission: { assign_button: '分配權限', assign_title: '分配權限', @@ -47,11 +53,16 @@ const role_details = { /** UNTRANSLATED */ name_column: 'Application', /** UNTRANSLATED */ - app_column: 'App', + app_column: 'Apps', + /** UNTRANSLATED */ + description_column: 'Description', + /** UNTRANSLATED */ + delete_description: + 'It will remain in your application pool but lose the authorization for this role.', /** UNTRANSLATED */ deleted: '{{name}} was successfully removed from this role', /** UNTRANSLATED */ - assign_title: 'Assign applications', + assign_title: 'Assign apps', /** UNTRANSLATED */ assign_subtitle: 'Assign applications to this role. Find appropriate applications by searching name, description or app ID.',