feat: move settings creation flows into dialogs
This commit is contained in:
@@ -4,7 +4,7 @@ import Link from "next/link";
|
||||
import { Badge } from "@/components/ui/badge";
|
||||
import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card";
|
||||
import { getCurrentAuthContext } from "@/modules/core/server/auth";
|
||||
import { hasPermission } from "@/modules/core/server/permissions";
|
||||
import { getRoleDefinitions, hasPermission } from "@/modules/core/server/permissions";
|
||||
import { readData } from "@/modules/core/server/store";
|
||||
import {
|
||||
OrganizationManagementClient,
|
||||
@@ -37,17 +37,29 @@ export default async function OrganizationsPage({ searchParams }: OrganizationsP
|
||||
);
|
||||
const pageCount = getPageCount(filteredOrganizations.length);
|
||||
const visibleOrganizations = paginate(filteredOrganizations, page);
|
||||
const canManageOrganizations = hasPermission(context.permissions, "organization:manage");
|
||||
const canInviteMembers = hasPermission(context.permissions, "account:manage");
|
||||
const organizationRoleGroups = await Promise.all(
|
||||
visibleOrganizations.map(async (organization) => ({
|
||||
organizationId: organization.id,
|
||||
roles: await getRoleDefinitions(organization.id),
|
||||
})),
|
||||
);
|
||||
const rolesByOrganizationId = new Map(
|
||||
organizationRoleGroups.map((group) => [group.organizationId, group.roles]),
|
||||
);
|
||||
|
||||
return (
|
||||
<div className="flex flex-col gap-5">
|
||||
<section>
|
||||
<Badge variant="success">Organizations</Badge>
|
||||
<h2 className="mt-3 text-xl font-semibold">机构管理</h2>
|
||||
<p className="mt-1 text-sm text-muted-foreground">多机构租户、启停状态和机构角色初始化。</p>
|
||||
<section className="flex flex-col gap-4 border-b pb-5 lg:flex-row lg:items-end lg:justify-between">
|
||||
<div>
|
||||
<Badge variant="success">Organizations</Badge>
|
||||
<h2 className="mt-3 text-xl font-semibold">机构管理</h2>
|
||||
<p className="mt-1 text-sm text-muted-foreground">多机构租户、启停状态、成员邀请和机构角色初始化。</p>
|
||||
</div>
|
||||
{canManageOrganizations ? <OrganizationManagementClient /> : null}
|
||||
</section>
|
||||
|
||||
{hasPermission(context.permissions, "organization:manage") ? <OrganizationManagementClient /> : null}
|
||||
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle>机构列表</CardTitle>
|
||||
@@ -89,7 +101,11 @@ export default async function OrganizationsPage({ searchParams }: OrganizationsP
|
||||
{new Date(organization.createdAt).toLocaleString("zh-CN")}
|
||||
</td>
|
||||
<td className="px-4 py-3">
|
||||
<OrganizationRowActions organization={organization} />
|
||||
<OrganizationRowActions
|
||||
canInvite={canInviteMembers}
|
||||
organization={organization}
|
||||
roles={rolesByOrganizationId.get(organization.id) ?? []}
|
||||
/>
|
||||
</td>
|
||||
</tr>
|
||||
))}
|
||||
|
||||
@@ -32,17 +32,19 @@ export default async function RolesPage({ searchParams }: RolesPageProps): Promi
|
||||
);
|
||||
const pageCount = getPageCount(filteredRoles.length);
|
||||
const visibleRoles = paginate(filteredRoles, page);
|
||||
const canManageRoles = hasPermission(context.permissions, "role:manage");
|
||||
|
||||
return (
|
||||
<div className="flex flex-col gap-5">
|
||||
<section>
|
||||
<Badge variant="success">RBAC</Badge>
|
||||
<h2 className="mt-3 text-xl font-semibold">角色权限</h2>
|
||||
<p className="mt-1 text-sm text-muted-foreground">系统权限点、内置角色和机构自定义角色。</p>
|
||||
<section className="flex flex-col gap-4 border-b pb-5 lg:flex-row lg:items-end lg:justify-between">
|
||||
<div>
|
||||
<Badge variant="success">RBAC</Badge>
|
||||
<h2 className="mt-3 text-xl font-semibold">角色权限</h2>
|
||||
<p className="mt-1 text-sm text-muted-foreground">系统权限点、内置角色和机构自定义角色。</p>
|
||||
</div>
|
||||
{canManageRoles ? <RoleManagementClient permissions={PERMISSION_DEFINITIONS} /> : null}
|
||||
</section>
|
||||
|
||||
{hasPermission(context.permissions, "role:manage") ? <RoleManagementClient permissions={PERMISSION_DEFINITIONS} /> : null}
|
||||
|
||||
<Card>
|
||||
<CardHeader>
|
||||
<CardTitle>角色列表</CardTitle>
|
||||
|
||||
@@ -69,7 +69,12 @@ export default async function UsersPage({ searchParams }: UsersPageProps): Promi
|
||||
<p className="mt-1 text-sm text-muted-foreground">账号创建、机构加入审批、角色分配和账号列表。</p>
|
||||
</section>
|
||||
|
||||
<UserManagementClient organizations={data.organizations} roles={roles} joinRequests={data.joinRequests} />
|
||||
<UserManagementClient
|
||||
canManageAccounts={hasPermission(context.permissions, "account:manage")}
|
||||
organizations={data.organizations}
|
||||
roles={roles}
|
||||
joinRequests={data.joinRequests}
|
||||
/>
|
||||
|
||||
<Card>
|
||||
<CardHeader>
|
||||
|
||||
Reference in New Issue
Block a user