feat: 完成 R13/R14/R15/R16 小团队管理核心能力

这个提交包含在:
2026-03-21 20:31:34 +08:00
父节点 0826693a8f
当前提交 1e52f1c225
共修改 47 个文件,包含 4298 行新增和 306 行删除
@@ -32,6 +32,13 @@ export interface CreateUserDialogProps {
roleOptions: Array<{ code: string; label: string }>;
}
const ROLE_PRESETS = [
{ key: "owner", label: "老板", roles: ["ceo"] },
{ key: "admin", label: "管理员", roles: ["admin"] },
{ key: "employee", label: "员工", roles: ["employee"] },
{ key: "manager", label: "主管", roles: ["manager"] },
];
export function CreateUserDialog({
open,
onOpenChange,
@@ -204,6 +211,13 @@ export function CreateUserDialog({
<div className="grid gap-2">
<Label>角色</Label>
<div className="flex flex-wrap gap-2">
{ROLE_PRESETS.map((preset) => (
<Button key={preset.key} size="sm" variant="secondary" type="button" onClick={() => setCreateRoles(new Set(preset.roles))}>
预设:{preset.label}
</Button>
))}
</div>
<div className="flex flex-wrap gap-3 text-sm">
{roleOptions.map((item) => (
<label className="flex items-center gap-2" key={item.code}>
@@ -18,6 +18,13 @@ export interface UserRoleDialogProps {
isPending: boolean;
}
const ROLE_PRESETS = [
{ key: "owner", label: "老板", roles: ["ceo"] },
{ key: "admin", label: "管理员", roles: ["admin"] },
{ key: "employee", label: "员工", roles: ["employee"] },
{ key: "manager", label: "主管", roles: ["manager"] },
];
export function UserRoleDialog({
open,
onOpenChange,
@@ -57,7 +64,16 @@ export function UserRoleDialog({
</DialogDescription>
</DialogHeader>
<div className="flex flex-wrap gap-3 text-sm">
<div className="space-y-3">
<div className="flex flex-wrap gap-2">
{ROLE_PRESETS.map((preset) => (
<Button key={preset.key} size="sm" variant="secondary" type="button" onClick={() => setRoleDraft(new Set(preset.roles))}>
预设:{preset.label}
</Button>
))}
</div>
<div className="flex flex-wrap gap-3 text-sm">
{roleOptions.map((item) => (
<label className="flex items-center gap-2" key={item.code}>
<input
@@ -79,6 +95,7 @@ export function UserRoleDialog({
<span>{item.label}</span>
</label>
))}
</div>
</div>
<div className="flex justify-end gap-2">