import Add from "@mui/icons-material/Add";
import DeleteOutlineOutlined from "@mui/icons-material/DeleteOutlineOutlined";
import PersonAddAlt1Outlined from "@mui/icons-material/PersonAddAlt1Outlined";
import { useEffect, useRef, useState } from "react";
import { AdminSwitch } from "@/shared/ui/AdminSwitch.jsx";
import TextField from "@mui/material/TextField";
import { formatMillis } from "@/shared/utils/time.js";
import { DataState } from "@/shared/ui/DataState.jsx";
import { AdminActionIconButton, AdminRowActions } from "@/shared/ui/AdminListLayout.jsx";
import { SideDrawer } from "@/shared/ui/SideDrawer.jsx";
import { HostOrgActionModal } from "@/features/host-org/components/HostOrgActionModal.jsx";
import { HostOrgStatus } from "@/features/host-org/components/HostOrgStatus.jsx";
import { HostOrgTable } from "@/features/host-org/components/HostOrgTable.jsx";
import { HostOrgToolbar } from "@/features/host-org/components/HostOrgToolbar.jsx";
import { useHostBdsPage } from "@/features/host-org/hooks/useHostBdsPage.js";
import styles from "@/features/host-org/host-org.module.css";
const bdLeaderBaseColumns = [
{
key: "user",
label: "用户",
render: (item) => ,
width: "minmax(220px, 1.25fr)",
},
{
key: "regionId",
label: "区域",
render: (item, _index, context) => regionName(item, context?.regionOptions),
width: "minmax(130px, 0.75fr)",
},
{
key: "positionAlias",
label: "职位别名",
render: (item, _index, context) => ,
width: "minmax(130px, 0.75fr)",
},
{
key: "status",
label: "状态",
render: (item, _index, context) => ,
width: "minmax(90px, 0.7fr)",
},
{
key: "createdByUserId",
label: "创建人",
render: (item) => ,
width: "minmax(180px, 1fr)",
},
{
key: "subBdCount",
label: "下级 BD 数量",
render: (item, _index, context) => ,
width: "minmax(130px, 0.75fr)",
},
{
key: "createdAtMs",
label: "创建时间",
render: (item) => formatMillis(item.createdAtMs),
width: "minmax(170px, 1fr)",
},
];
export function HostBdLeadersPage() {
const page = useHostBdsPage({ profileType: "leader" });
const createDisabled = !page.abilities.canCreate;
const items = page.data.items || [];
const total = page.data.total || 0;
const bdLeaderColumns = [
...bdLeaderBaseColumns,
page.abilities.canCreate || page.abilities.canUpdate
? {
key: "actions",
label: "操作",
render: (item) => ,
width: "minmax(118px, 0.7fr)",
}
: null,
].filter(Boolean);
const toolbarActions = page.abilities.canCreate
? [
{
icon: ,
label: "创建 BD Leader",
onClick: page.openBDLeaderForm,
variant: "primary",
},
]
: [];
return (
0
? {
page: page.page,
pageSize: page.data.pageSize || 50,
total,
onPageChange: page.setPage,
}
: undefined
}
rowKey={(item) => `bd-leader-${item.userId}`}
/>
page.setBDLeaderForm({ ...page.bdLeaderForm, targetUserId: event.target.value })
}
/>
page.setBDLeaderForm({ ...page.bdLeaderForm, positionAlias: event.target.value })
}
/>
page.setBDLeaderForm({ ...page.bdLeaderForm, reason: event.target.value })}
/>
page.setBDForm({ ...page.bdForm, targetUserId: event.target.value })}
/>
page.setBDForm({ ...page.bdForm, reason: event.target.value })}
/>
{(page.leaderBDs.items || []).length ? (
page.leaderBDs.items.map((item) => (
))
) : (
暂无下级 BD
)}
);
}
function PersonIdentity({ item }) {
const name = item.username || "-";
const meta = item.displayUserId || item.userId || "-";
return (
{item.avatar ? (

) : (
{String(name || meta)
.slice(0, 1)
.toUpperCase()}
)}
{name}
{meta}
);
}
function CreatorIdentity({ item }) {
if (!item.createdByUserId && !item.createdByDisplayUserId && !item.createdByUsername) {
return "-";
}
return (
);
}
function BDLeaderStatusSwitch({ item, page }) {
return (
page.toggleBDLeader(item, event.target.checked)}
/>
);
}
function PositionAliasCell({ item, page }) {
const inputRef = useRef(null);
const cancelSaveRef = useRef(false);
const originalValue = String(item.positionAlias || "").trim();
const [editing, setEditing] = useState(false);
const [saving, setSaving] = useState(false);
const [value, setValue] = useState(originalValue);
const canEdit = Boolean(page?.abilities.canUpdate);
useEffect(() => {
if (!editing) {
setValue(originalValue);
}
}, [editing, originalValue]);
useEffect(() => {
if (editing) {
inputRef.current?.focus();
inputRef.current?.select();
}
}, [editing]);
const save = async () => {
if (cancelSaveRef.current) {
cancelSaveRef.current = false;
setValue(originalValue);
setEditing(false);
return;
}
const nextValue = value.trim();
if (nextValue === originalValue) {
setValue(originalValue);
setEditing(false);
return;
}
setSaving(true);
try {
await page.saveBDLeaderPositionAlias(item, nextValue);
setEditing(false);
} catch {
setValue(originalValue);
setEditing(false);
} finally {
setSaving(false);
}
};
if (editing) {
return (
setValue(event.target.value)}
onKeyDown={(event) => {
if (event.key === "Enter") {
event.currentTarget.blur();
}
if (event.key === "Escape") {
cancelSaveRef.current = true;
setValue(originalValue);
setEditing(false);
}
}}
/>
);
}
if (!canEdit) {
return {originalValue || "-"};
}
return (
);
}
function SubBDCount({ item, page }) {
return (
);
}
function BDLeaderActions({ item, page }) {
return (
{page.abilities.canCreate ? (
page.openAddLeaderBD(item)}>
) : null}
{page.abilities.canUpdate ? (
page.removeBDLeader(item)}
>
) : null}
);
}
function UserLookupPreview({ keyword, lookup }) {
const hasKeyword = String(keyword || "").trim();
if (!hasKeyword) {
return 输入用户短 ID 后自动搜索用户
;
}
if (lookup.loading) {
return 搜索中...
;
}
if (lookup.error) {
return {lookup.error}
;
}
if (!lookup.user) {
return 未找到匹配用户,提交时后端会再次校验
;
}
return (
{lookup.user.regionName || "未分配区域"}
);
}
function regionName(item, regionOptions = []) {
if (item.regionName) {
return item.regionName;
}
const option = regionOptions.find((region) => String(region.value) === String(item.regionId));
return option?.name || item.regionId || "-";
}
const dangerActionSx = {
borderColor: "rgba(239, 68, 68, 0.3)",
backgroundColor: "rgba(239, 68, 68, 0.08)",
color: "var(--danger)",
"&:hover": {
borderColor: "rgba(239, 68, 68, 0.5)",
backgroundColor: "rgba(239, 68, 68, 0.14)",
color: "var(--danger)",
},
};