mirror of
https://github.com/logto-io/logto.git
synced 2025-03-24 22:41:28 -05:00
refactor(console,phrases,core): reorg role details page (#4537)
This commit is contained in:
parent
a0b9d38992
commit
71f7977b9c
24 changed files with 515 additions and 43 deletions
|
@ -54,6 +54,7 @@ function SourceEntitiesBox<T extends User | Application>({
|
|||
...commonSearchParams,
|
||||
})
|
||||
: buildUrl(`api/applications`, {
|
||||
excludeRoleId: roleId,
|
||||
...commonSearchParams,
|
||||
'search.type': ApplicationType.MachineToMachine,
|
||||
'mode.type': 'exact',
|
||||
|
|
|
@ -28,6 +28,7 @@ export enum RoleDetailsTabs {
|
|||
Settings = 'settings',
|
||||
Permissions = 'permissions',
|
||||
Users = 'users',
|
||||
M2mApps = 'machine-to-machine-apps',
|
||||
}
|
||||
|
||||
export enum TenantSettingsTabs {
|
||||
|
|
|
@ -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() {
|
|||
<Route path={RoleDetailsTabs.Settings} element={<RoleSettings />} />
|
||||
<Route path={RoleDetailsTabs.Permissions} element={<RolePermissions />} />
|
||||
<Route path={RoleDetailsTabs.Users} element={<RoleUsers />} />
|
||||
<Route path={RoleDetailsTabs.M2mApps} element={<RoleApplications />} />
|
||||
</Route>
|
||||
</Route>
|
||||
<Route path="profile">
|
||||
|
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
|
@ -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<RoleDetailsOutletContext>();
|
||||
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<Application>();
|
||||
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 (
|
||||
<>
|
||||
<Table
|
||||
className={styles.applicationsTable}
|
||||
isLoading={isLoading}
|
||||
rowGroups={[{ key: 'applications', data: applications }]}
|
||||
rowIndexKey="id"
|
||||
columns={[
|
||||
{
|
||||
title: t('role_details.applications.app_column'),
|
||||
dataIndex: 'name',
|
||||
colSpan: 5,
|
||||
render: (application) => {
|
||||
return (
|
||||
<ItemPreview
|
||||
title={application.name}
|
||||
icon={
|
||||
theme === Theme.Light ? <MachineToMachineIcon /> : <MachineToMachineIconDark />
|
||||
}
|
||||
to={`/applications/${application.id}`}
|
||||
/>
|
||||
);
|
||||
},
|
||||
},
|
||||
{
|
||||
title: t('role_details.applications.description_column'),
|
||||
dataIndex: 'description',
|
||||
colSpan: 5,
|
||||
render: ({ description }) => <span>{conditional(description) ?? '-'}</span>,
|
||||
},
|
||||
{
|
||||
title: null,
|
||||
dataIndex: 'delete',
|
||||
colSpan: 1,
|
||||
render: (application) => (
|
||||
<Tooltip content={t('general.remove')}>
|
||||
<IconButton
|
||||
onClick={() => {
|
||||
setApplicationToBeDeleted(application);
|
||||
}}
|
||||
>
|
||||
<Delete />
|
||||
</IconButton>
|
||||
</Tooltip>
|
||||
),
|
||||
},
|
||||
]}
|
||||
filter={
|
||||
<div className={styles.filter}>
|
||||
<Search
|
||||
defaultValue={keyword}
|
||||
isClearable={Boolean(keyword)}
|
||||
placeholder={t('general.search_placeholder')}
|
||||
onSearch={(keyword) => {
|
||||
updateSearchParameters({ keyword, page: 1 });
|
||||
}}
|
||||
onClearSearch={() => {
|
||||
updateSearchParameters({ keyword: '', page: 1 });
|
||||
}}
|
||||
/>
|
||||
<Button
|
||||
title="role_details.applications.assign_button"
|
||||
type="primary"
|
||||
size="large"
|
||||
icon={<Plus />}
|
||||
onClick={() => {
|
||||
setIsAssignModalOpen(true);
|
||||
}}
|
||||
/>
|
||||
</div>
|
||||
}
|
||||
pagination={{
|
||||
page,
|
||||
pageSize,
|
||||
totalCount,
|
||||
onChange: (page) => {
|
||||
updateSearchParameters({ page });
|
||||
},
|
||||
}}
|
||||
placeholder={<EmptyDataPlaceholder />}
|
||||
/>
|
||||
{applicationToBeDeleted && (
|
||||
<ConfirmModal
|
||||
isOpen
|
||||
isLoading={isDeleting}
|
||||
confirmButtonText="general.remove"
|
||||
onCancel={() => {
|
||||
setApplicationToBeDeleted(undefined);
|
||||
}}
|
||||
onConfirm={handleDelete}
|
||||
>
|
||||
{t('role_details.applications.delete_description')}
|
||||
</ConfirmModal>
|
||||
)}
|
||||
{isAssignModalOpen && (
|
||||
<AssignRoleModal
|
||||
roleId={roleId}
|
||||
roleType={RoleType.MachineToMachine}
|
||||
onClose={(success) => {
|
||||
if (success) {
|
||||
void mutate();
|
||||
}
|
||||
setIsAssignModalOpen(false);
|
||||
}}
|
||||
/>
|
||||
)}
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
export default RoleApplications;
|
|
@ -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;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -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 ? (
|
||||
<UserRoleIconDark className={styles.icon} />
|
||||
) : (
|
||||
<UserRoleIcon className={styles.icon} />
|
||||
);
|
||||
}
|
||||
|
||||
return isDarkMode ? (
|
||||
<MachineToMachineIconDark className={styles.icon} />
|
||||
) : (
|
||||
<MachineToMachineIcon className={styles.icon} />
|
||||
);
|
||||
};
|
||||
|
||||
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<Role, RequestError>(id && `api/roles/${id}`);
|
||||
const { mutate: mutateGlobal } = useSWRConfig();
|
||||
|
@ -75,9 +101,18 @@ function RoleDetails() {
|
|||
{data && (
|
||||
<>
|
||||
<Card className={styles.header}>
|
||||
{getRoleIcon(data.type, theme === Theme.Dark)}
|
||||
<div className={styles.info}>
|
||||
<div className={styles.name}>{data.name}</div>
|
||||
<div className={styles.meta}>
|
||||
<Tag>
|
||||
{t(
|
||||
data.type === RoleType.User
|
||||
? 'role_details.type_user_role_tag'
|
||||
: 'role_details.type_m2m_role_tag'
|
||||
)}
|
||||
</Tag>
|
||||
<div className={styles.verticalBar} />
|
||||
<div className={styles.idText}>{t('role_details.identifier')}</div>
|
||||
<CopyToClipboard value={data.id} size="small" />
|
||||
</div>
|
||||
|
@ -115,8 +150,14 @@ function RoleDetails() {
|
|||
<TabNavItem href={`/roles/${data.id}/${RoleDetailsTabs.Permissions}`}>
|
||||
{t('role_details.permissions_tab')}
|
||||
</TabNavItem>
|
||||
<TabNavItem href={`/roles/${data.id}/${RoleDetailsTabs.Users}`}>
|
||||
{t('role_details.users_tab')}
|
||||
<TabNavItem
|
||||
href={`/roles/${data.id}/${
|
||||
data.type === RoleType.User ? RoleDetailsTabs.Users : RoleDetailsTabs.M2mApps
|
||||
}`}
|
||||
>
|
||||
{t(
|
||||
data.type === RoleType.User ? 'role_details.users_tab' : 'role_details.m2m_apps_tab'
|
||||
)}
|
||||
</TabNavItem>
|
||||
</TabNav>
|
||||
<Outlet
|
||||
|
|
|
@ -48,21 +48,36 @@ const buildConditionArray = (conditions: SqlSqlToken[]) => {
|
|||
};
|
||||
|
||||
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<Application>(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}`)}
|
||||
|
|
|
@ -40,8 +40,12 @@ export default function applicationRoutes<T extends AuthedRouter>(
|
|||
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<T extends AuthedRouter>(
|
|||
|
||||
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
|
||||
|
|
|
@ -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.',
|
||||
|
|
|
@ -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',
|
||||
|
|
|
@ -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.',
|
||||
|
|
|
@ -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.',
|
||||
|
|
|
@ -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.',
|
||||
|
|
|
@ -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.',
|
||||
|
|
|
@ -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.',
|
||||
|
|
|
@ -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.',
|
||||
|
|
|
@ -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.',
|
||||
|
|
|
@ -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.',
|
||||
|
|
|
@ -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.',
|
||||
|
|
|
@ -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.',
|
||||
|
|
|
@ -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.',
|
||||
|
|
|
@ -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.',
|
||||
|
|
|
@ -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.',
|
||||
|
|
Loading…
Add table
Reference in a new issue