// User detail — header form + permission tabs (with checkbox grid).
// Modes: view (read-only) | edit | new
const PERM_TABS = [
{ id: "groups", label: "权限组" },
{ id: "customer", label: "客户查看权限" },
{ id: "supplier", label: "供应商查看权限" },
{ id: "staff", label: "人员查看权限" },
{ id: "process", label: "工序查看权限" },
{ id: "driver", label: "司机查看权限" },
];
const UserDetail = ({ user: initial, mode: initialMode, onSave, onDelete, onClose }) => {
const [mode, setMode] = React.useState(initialMode || "view");
const [user, setUser] = React.useState(initial);
const [tab, setTab] = React.useState("groups");
const [snapshot, setSnapshot] = React.useState(initial);
React.useEffect(() => {
setUser(initial);
setSnapshot(initial);
setMode(initialMode || "view");
}, [initial, initialMode]);
const set = (k, v) => setUser((s) => ({ ...s, [k]: v }));
const setPerm = (g, v) => setUser((s) => ({ ...s, permissions: { ...s.permissions, [g]: v } }));
const setTabPerm = (k, v) => setUser((s) => ({ ...s, tabPerms: { ...s.tabPerms, [k]: v } }));
const start = (m) => { setSnapshot(user); setMode(m); };
const save = () => { onSave && onSave(user); setSnapshot(user); setMode("view"); };
const cancel = () => { setUser(snapshot); setMode("view"); };
const disabled = mode === "view";
const isNew = mode === "new";
const checked = Object.values(user.permissions || {}).filter(Boolean).length;
return (
{/* Dark sub-toolbar */}
} onClick={() => start("new")} disabled={mode !== "view"}>新增
} onClick={() => start("edit")} disabled={mode !== "view"}>修改
} danger disabled={mode !== "view"} onClick={onDelete}>删除
} onClick={save} disabled={mode === "view"}>保存
} onClick={cancel} disabled={mode === "view"}>取消
}>功能
}>作废
}>重置密码
}>取消作废
已选权限:{checked} / {XLY.PERMISSION_GROUPS.length - 1}
{mode === "view" ? "只读" : mode === "new" ? "新增中" : "编辑中"}
{/* Header form (3 cols × 3 rows) */}
set("createdBy", v)} disabled={disabled} required />
set("employee", v)} disabled={disabled} required />
set("account", v)} disabled={disabled} required />
set("empNo", v)} disabled={disabled} required mono />
{/* Permission tabs */}
{PERM_TABS.map((t) => {
const active = t.id === tab;
return (
setTab(t.id)}
style={{
padding: "6px 14px", fontSize: 12, cursor: "pointer",
color: active ? "var(--accent-strong)" : "var(--text)",
background: active ? "var(--accent-soft)" : "transparent",
borderTop: active ? "2px solid var(--accent)" : "2px solid transparent",
borderRight: "1px solid var(--border)",
fontWeight: active ? 500 : 400,
}}
onMouseEnter={(e) => { if (!active) e.currentTarget.style.background = "var(--bg-row-hover)"; }}
onMouseLeave={(e) => { if (!active) e.currentTarget.style.background = "transparent"; }}
>
{t.label}
);
})}
{/* Tab content */}
{tab === "groups" ? (
) : (
)}
{/* Floating help */}
);
};
const PermissionGrid = ({ user, setPerm, disabled }) => {
const [filter, setFilter] = React.useState("");
const [hovered, setHovered] = React.useState(null);
return (
|
{
XLY.PERMISSION_GROUPS.forEach((g) => { if (g !== "权限分类") setPerm(g, v); });
}}
disabled={disabled}
/>
|
权限分类
setFilter(e.target.value)}
placeholder="过滤..."
style={{ height: 20, padding: "0 6px", border: "1px solid var(--border-input)", background: "#fff", fontSize: 11, width: 120, fontFamily: "inherit" }}
/>
|
{XLY.PERMISSION_GROUPS.filter((g) => g !== "权限分类" && (!filter || g.includes(filter))).map((g, i) => {
const isHover = hovered === g;
return (
setHovered(g)} onMouseLeave={() => setHovered(null)}
onClick={disabled ? undefined : () => setPerm(g, !user.permissions[g])}
style={{
background: isHover && !disabled ? "var(--bg-row-hover)"
: user.permissions[g] ? "var(--accent-soft)"
: i % 2 === 0 ? "#fff" : "var(--bg-row-zebra)",
cursor: disabled ? "default" : "pointer",
height: 24,
}}
>
|
setPerm(g, v)}
disabled={disabled}
/>
|
{g}
|
);
})}
);
};
const ScopeTab = ({ tabKey, user, setTabPerm, disabled }) => {
const map = {
customer: { label: "客户", items: ["上海印行包装", "锐尚文创", "京华彩印", "广印纸品", "万象图文", "联合包装", "鼎盛印刷", "九洲胶印"] },
supplier: { label: "供应商", items: ["华东油墨", "正信纸业", "宝洁化工", "日新油墨", "三鼎纸业", "鸿丰胶辊", "永利印材"] },
staff: { label: "人员", items: ["管广飞", "李斌", "孟威", "王宽明", "潘强", "杨柳"] },
process: { label: "工序", items: ["印前", "印刷", "覆膜", "模切", "装订", "胶装", "丝网", "烫金", "包装"] },
driver: { label: "司机", items: ["陈师傅", "李师傅", "王师傅", "钱师傅", "赵师傅"] },
};
const cfg = map[tabKey];
const [filter, setFilter] = React.useState("");
const enabled = !!user.tabPerms[tabKey];
return (
);
};
window.UserDetail = UserDetail;