import Add from "@mui/icons-material/Add"; import DeleteOutlineOutlined from "@mui/icons-material/DeleteOutlineOutlined"; import EditOutlined from "@mui/icons-material/EditOutlined"; import Inventory2Outlined from "@mui/icons-material/Inventory2Outlined"; import MenuItem from "@mui/material/MenuItem"; import TextField from "@mui/material/TextField"; import { useState } from "react"; import { AdminFormDialog, AdminFormFieldGrid, AdminFormSection } from "@/shared/ui/AdminFormDialog.jsx"; import { DataState } from "@/shared/ui/DataState.jsx"; import { DataTable } from "@/shared/ui/DataTable.jsx"; import { AdminActionIconButton, AdminFilterResetButton, AdminFilterSelect, AdminListBody, AdminListPage, AdminListToolbar, AdminRowActions, } from "@/shared/ui/AdminListLayout.jsx"; import { SideDrawer } from "@/shared/ui/SideDrawer.jsx"; import { achievementTypeLabels, achievementTypeOptions, collectionTypeFilterOptions, } from "@/features/achievements/constants.js"; import { useAchievementsPage } from "@/features/achievements/hooks/useAchievementsPage.js"; import styles from "@/features/achievements/achievements.module.css"; const baseColumns = [ { key: "badge", label: "徽章", width: "96px", }, { key: "title", label: "成就名称", width: "minmax(180px, 1fr)", render: (achievement) => {achievement.title || achievement.achievementId}, }, { key: "achievementType", label: "成就类型", width: "minmax(140px, 0.55fr)", render: (achievement) => ( {achievementTypeLabel(achievement.achievementType)} ), }, { key: "sortOrder", label: "排序", width: "96px", render: (achievement) => {achievement.sortOrder || 0}, }, { key: "description", label: "成就描述", width: "minmax(260px, 1.4fr)", render: (achievement) => achievement.description || 未填写, }, { key: "actions", label: "操作", width: "112px", }, ]; export function AchievementConfigPage() { const page = useAchievementsPage(); const items = page.data.items || []; const total = page.data.total || 0; const isEditing = page.activeAction === "edit"; const columns = baseColumns.map((column) => { if (column.key === "badge") { return { ...column, render: (achievement) => ( ), }; } if (column.key === "actions") { return { ...column, render: (achievement) => , }; } return column; }); return ( } actions={ page.abilities.canCreate ? ( ) : null } /> 0 ? { page: page.page, pageSize: page.data.pageSize || 50, total, onPageChange: page.setPage, } : undefined } rowKey={(achievement) => achievement.achievementId} /> ); } function AchievementRowActions({ achievement, page }) { return ( page.openEdit(achievement)} > page.deleteAchievement(achievement)} > ); } function AchievementFormDialog({ disabled, form, loading, mode, onClose, onSubmit, open, page }) { return ( page.setForm((current) => ({ ...current, primaryBadgeResourceId: value }))} /> {achievementTypeOptions.map(([value, label]) => ( {label} ))} ); } function BadgeCover({ id, resources }) { const resource = findResource(resources, id); const imageUrl = resourceImageUrl(resource); return ( {imageUrl ? : } ); } function BadgeResourceSelectField({ disabled, label, onChange, resources, value }) { const [open, setOpen] = useState(false); const normalizedValue = String(value || ""); const selected = findResource(resources, normalizedValue); const displayValue = selected ? resourceName(selected) : normalizedValue ? `资源 #${normalizedValue}` : ""; const options = withSelectedResource(resources, normalizedValue); const openDrawer = () => { if (!disabled) { setOpen(true); } }; const selectResource = (resourceId) => { onChange(String(resourceId || "")); setOpen(false); }; return ( <> { if (event.key === "Enter" || event.key === " ") { event.preventDefault(); openDrawer(); } }} /> setOpen(false)} >
{options.map((resource) => { const resourceValue = String(resource.resourceId); const selectedResource = resourceValue === normalizedValue; return ( ); })} {!options.length ?
当前无数据
: null}
); } function changeField(setter, key) { return (event) => { const value = event.target.value; setter((current) => ({ ...current, [key]: value })); }; } function withSelectedResource(resources, value) { const selectedId = Number(value || 0); if (!selectedId || resources.some((resource) => Number(resource.resourceId) === selectedId)) { return resources; } return [{ resourceId: selectedId, name: `资源 #${selectedId}` }, ...resources]; } function achievementTypeLabel(type) { return achievementTypeLabels[type] || type || "-"; } function findResource(resources, id) { return resources.find((item) => Number(item.resourceId) === Number(id)); } function resourceImageUrl(resource) { return resource?.previewUrl || resource?.assetUrl || resource?.animationUrl || ""; } function resourceName(resource) { return resource?.name || resource?.resourceCode || `资源 #${resource?.resourceId || "-"}`; }