import Add from "@mui/icons-material/Add"; import UndoOutlined from "@mui/icons-material/UndoOutlined"; import MenuItem from "@mui/material/MenuItem"; import TextField from "@mui/material/TextField"; import { AdminFormDialog, AdminFormFieldGrid, AdminFormSection } from "@/shared/ui/AdminFormDialog.jsx"; import { AdminUserIdentity } from "@/shared/ui/AdminUserIdentity.jsx"; import { DataState } from "@/shared/ui/DataState.jsx"; import { DataTable } from "@/shared/ui/DataTable.jsx"; import { AdminActionIconButton, AdminListBody, AdminListPage, AdminListToolbar, AdminRowActions, } from "@/shared/ui/AdminListLayout.jsx"; import { createOptionsColumnFilter, createTextColumnFilter } from "@/shared/ui/tableFilters.js"; import { formatMillis } from "@/shared/utils/time.js"; import { GiftResourceSelectField } from "@/features/resources/components/GiftResourceSelectDrawer.jsx"; 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: "用户信息", width: "minmax(240px, 1.1fr)", render: (grant) => , }, { key: "operator", label: "操作人", width: "minmax(180px, 1fr)", render: (grant) => , }, { 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; const columns = [ ...grantColumns.map((column) => { if (column.key === "target") { return { ...column, filter: createTextColumnFilter({ placeholder: "搜索用户 ID", value: page.query, onChange: page.changeQuery, }), }; } if (column.key === "status") { return { ...column, filter: createOptionsColumnFilter({ options: resourceGrantStatusFilters, placeholder: "搜索状态", value: page.status, onChange: page.changeStatus, }), }; } return column; }), { key: "actions", label: "操作", width: "minmax(88px, 0.45fr)", render: (grant) => , }, ]; return ( ) : null } /> 0 ? { page: page.page, pageSize: page.data.pageSize || 50, total, onPageChange: page.setPage, } : undefined } rowKey={(grant) => grant.grantId} /> ); } function ResourceGrantActions({ grant, page }) { const canRevoke = page.abilities.canRevokeGrant && grant?.status === "succeeded" && grant?.grantSubjectType === "resource_group"; if (!canRevoke) { return -; } return ( page.revokeGrant(grant)} > ); } function ResourceGrantDialog({ disabled, form, giftOptions, giftTypeOptions, groupOptions, loading, onClose, onSubmit, open, optionsLoading, resourceOptions, setForm, }) { const submitDisabled = disabled || loading || optionsLoading; return ( setForm({ ...form, targetUserId: event.target.value })} /> setForm({ ...form, groupId: "", resourceId: "", resourceIds: [], subjectType: event.target.value, }) } > 资源 资源组 {form.subjectType === "resource" ? ( <> setForm({ ...form, resourceId: resourceIds[0] || "", resourceIds }) } /> 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 grantStatusTone(status) { if (status === "revoked") { return "stopped"; } if (status === "failed") { return "danger"; } if (status === "pending") { return "warning"; } return status || "stopped"; } const dangerActionSx = { borderColor: "var(--danger-border)", color: "var(--danger)", "&:hover": { borderColor: "var(--danger-border-strong)", backgroundColor: "var(--danger-surface)", color: "var(--danger)", }, }; 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 GrantTargetUser({ grant }) { const user = grant.targetUser || grant.target_user || grant.user || {}; const userId = user.userId || user.user_id || grant.targetUserId; return ( ); } function GrantOperator({ grant }) { const operator = grant.operator || {}; const source = operator.source || grant.grantSource || ""; const operatorUserId = operator.userId || grant.operatorUserId; if (source === "manager_center") { return ( ); } if (source === "admin") { const name = operator.name || operator.username || (operatorUserId ? `Admin ${operatorUserId}` : "-"); return (
{name} {operator.username || operatorUserId || "-"}
); } if (!operatorUserId) { return "-"; } return (
{operatorUserId} {source || "-"}
); } function formatDuration(durationMs) { const days = Number(durationMs || 0) / (24 * 60 * 60 * 1000); return Number.isInteger(days) ? `${days}天` : `${days.toFixed(1)}天`; }