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)", }, };