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) => (
))}
setForm({ ...form, quantity: event.target.value })}
/>
setForm({ ...form, durationDays: event.target.value })}
/>
>
) : (
setForm({ ...form, groupId: event.target.value })}
>
{groupOptions.map((group) => (
))}
)}
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)}天`;
}