import DeleteOutlineOutlined from "@mui/icons-material/DeleteOutlineOutlined"; import EditOutlined from "@mui/icons-material/EditOutlined"; import MeetingRoomOutlined from "@mui/icons-material/MeetingRoomOutlined"; import PersonOutlineOutlined from "@mui/icons-material/PersonOutlineOutlined"; import TextField from "@mui/material/TextField"; import Tooltip from "@mui/material/Tooltip"; import { AdminFormDialog, AdminFormSection } from "@/shared/ui/AdminFormDialog.jsx"; import { DataState } from "@/shared/ui/DataState.jsx"; import { DataTable } from "@/shared/ui/DataTable.jsx"; import { IconButton } from "@/shared/ui/IconButton.jsx"; import { RegionSelect } from "@/shared/ui/RegionSelect.jsx"; import { createRegionColumnFilter } from "@/shared/ui/RegionFilterControl.jsx"; import { createOptionsColumnFilter, createTextColumnFilter } from "@/shared/ui/tableFilters.js"; import { UploadField } from "@/shared/ui/UploadField.jsx"; import { formatMillis } from "@/shared/utils/time.js"; import { RoomDetailDrawer } from "@/features/rooms/components/RoomDetailDrawer.jsx"; import { roomStatusFilters, roomStatusLabels } from "@/features/rooms/constants.js"; import { useRoomsPage } from "@/features/rooms/hooks/useRoomsPage.js"; import styles from "@/features/rooms/rooms.module.css"; const columns = [ { key: "identity", label: "房间", width: "minmax(240px, 1.5fr)", render: (room) => , }, { key: "owner", label: "房主", width: "minmax(210px, 1.2fr)", render: (room) => , }, { key: "region", label: "区域", width: "minmax(140px, 0.8fr)", render: (room) => room.regionName || "-", }, { key: "onlineCount", label: "房间人数", width: "minmax(110px, 0.7fr)", render: (room) => `${formatNumber(room.onlineCount)} 人`, }, { key: "roomContribution", label: "房间贡献", width: "minmax(120px, 0.8fr)", render: (room) => formatNumber(roomContributionValue(room)), }, { key: "status", label: "状态", width: "minmax(100px, 0.7fr)", render: (room) => , }, { key: "time", label: "创建时间", width: "minmax(170px, 1fr)", render: (room) => formatMillis(room.createdAtMs), }, ]; export function RoomListPage() { const page = useRoomsPage(); const items = page.data.items || []; const total = page.data.total || 0; const tableColumns = [ ...columns.map((column) => column.key === "region" ? { ...column, filter: createRegionColumnFilter({ loading: page.loadingRegions, options: page.regionOptions, value: page.regionId, onChange: page.changeRegionId, }), } : column.key === "identity" ? { ...column, filter: createTextColumnFilter({ placeholder: "搜索房间、房主", value: page.query, onChange: page.changeQuery, }), render: (room) => page.openDetail(room)} />, } : column.key === "status" ? { ...column, filter: createOptionsColumnFilter({ options: roomStatusFilters, placeholder: "搜索状态", value: page.status, onChange: page.changeStatus, }), render: (room) => , } : column.key === "roomContribution" ? { ...column, header: ( ), } : column, ), { key: "actions", label: "操作", width: "minmax(104px, 0.6fr)", render: (room) => , }, ]; return ( 0 ? { page: page.page, pageSize: page.data.pageSize || 10, total, onPageChange: page.setPage, } : undefined } rowKey={(room) => room.roomId} /> page.setForm({ ...page.form, title: event.target.value })} /> page.setForm({ ...page.form, coverUrl })} /> page.setForm({ ...page.form, visibleRegionId })} /> page.setForm({ ...page.form, description: event.target.value })} /> ); } function RoomIdentity({ onClick, room }) { const content = ( {room.coverUrl ? : } {room.title || "-"} ); if (!onClick) { return content; } return ( {content} ); } function OwnerIdentity({ room }) { const owner = room.owner || {}; const ownerName = owner.username || "-"; const ownerDisplayId = ownerLongShortId(owner, room); return ( {owner.avatar ? : } {ownerName} {ownerDisplayId} ); } function RoomActions({ page, room }) { return ( {page.abilities.canUpdate ? ( page.openEdit(room)}> ) : null} {page.abilities.canDelete ? ( page.removeRoom(room)} > ) : null} ); } function RoomStatus({ status }) { const normalizedStatus = status === "active" ? "active" : "closed"; const tone = normalizedStatus === "active" ? "running" : "stopped"; return ( {roomStatusLabels[normalizedStatus]} ); } function ActionModal({ children, disabled, loading, onClose, onSubmit, open, sectionTitle = "基本信息", title }) { return ( {children} ); } function formatNumber(value) { return Number(value || 0).toLocaleString("zh-CN"); } function roomContributionValue(room) { return room.roomContribution ?? room.heat ?? 0; } function ContributionSortHeader({ direction, onClick }) { const active = direction === "asc" || direction === "desc"; const arrow = direction === "asc" ? "↑" : "↓"; return ( 房间贡献 {active ? arrow : "↕"} ); } function ownerLongShortId(owner, room) { const longId = owner.userId || room.ownerUserId || ""; const shortId = owner.displayUserId || ""; if (longId && shortId && longId !== shortId) { return `${longId}(${shortId})`; } return longId || shortId || "-"; }