import Add from "@mui/icons-material/Add"; import MenuItem from "@mui/material/MenuItem"; import TextField from "@mui/material/TextField"; import { AdminFormDialog } from "@/shared/ui/AdminFormDialog.jsx"; import { DataState } from "@/shared/ui/DataState.jsx"; import { DataTable } from "@/shared/ui/DataTable.jsx"; import { AdminActionIconButton, AdminFilterSelect, AdminListBody, AdminListPage, AdminListToolbar, AdminSearchBox, } from "@/shared/ui/AdminListLayout.jsx"; import { PaginationBar } from "@/shared/ui/PaginationBar.jsx"; import { formatMillis } from "@/shared/utils/time.js"; import { resourceGrantStatusFilters, resourceGrantStatusLabels, resourceGrantSubjectLabels, } from "@/features/resources/constants.js"; import { useResourceGrantListPage } from "@/features/resources/hooks/useResourcePages.js"; import styles from "@/features/resources/resources.module.css"; const grantColumns = [ { key: "grant", label: "赠送记录", width: "minmax(240px, 1.2fr)", render: (grant) => (
{grant.grantId || "-"} {grant.commandId || "-"}
), }, { key: "target", label: "用户 ID", width: "minmax(120px, 0.7fr)", render: (grant) => grant.targetUserId || "-", }, { key: "subject", label: "对象", width: "minmax(160px, 0.8fr)", render: (grant) => (
{resourceGrantSubjectLabels[grant.grantSubjectType] || grant.grantSubjectType || "-"} {grant.grantSubjectId || "-"}
), }, { key: "items", label: "发放内容", width: "minmax(180px, 1fr)", render: (grant) => , }, { key: "status", label: "状态", width: "minmax(100px, 0.55fr)", render: (grant) => ( {resourceGrantStatusLabels[grant.status] || grant.status || "-"} ), }, { key: "reason", label: "原因", width: "minmax(160px, 1fr)", render: (grant) => grant.reason || "-", }, { key: "time", label: "创建时间", width: "minmax(170px, 0.9fr)", render: (grant) => formatMillis(grant.createdAtMs), }, ]; export function ResourceGrantListPage() { const page = useResourceGrantListPage(); const items = page.data.items || []; const total = page.data.total || 0; return ( } actions={ page.abilities.canCreateGrant ? ( ) : null } /> grant.grantId} /> {total > 0 ? ( ) : null} ); } function ResourceGrantDialog({ disabled, form, groupOptions, loading, onClose, onSubmit, open, optionsLoading, resourceOptions, setForm, }) { const submitDisabled = disabled || loading || optionsLoading; return ( setForm({ ...form, targetUserId: event.target.value })} /> setForm({ ...form, groupId: "", resourceId: "", subjectType: event.target.value })} > 资源 资源组 {form.subjectType === "resource" ? ( <> setForm({ ...form, resourceId: event.target.value })} > {resourceOptions.map((resource) => ( {resource.name || resource.resourceCode || resource.resourceId} ))} setForm({ ...form, quantity: event.target.value })} /> setForm({ ...form, durationDays: event.target.value })} /> ) : ( setForm({ ...form, groupId: event.target.value })} > {groupOptions.map((group) => ( {group.name || group.groupCode || group.groupId} ))} )} setForm({ ...form, reason: event.target.value })} /> ); } function GrantItems({ grant }) { const items = grant.items || []; if (!items.length) { return "-"; } return (
{items.slice(0, 2).map((item) => ( {item.resourceId || "-"} / {item.quantity || 0} {item.durationMs ? ` / ${formatDuration(item.durationMs)}` : ""} ))} {items.length > 2 ? +{items.length - 2} : null}
); } function formatDuration(durationMs) { const days = Number(durationMs || 0) / (24 * 60 * 60 * 1000); return Number.isInteger(days) ? `${days}天` : `${days.toFixed(1)}天`; }