import DeleteOutlineOutlined from "@mui/icons-material/DeleteOutlineOutlined"; import EditOutlined from "@mui/icons-material/EditOutlined"; import MeetingRoomOutlined from "@mui/icons-material/MeetingRoomOutlined"; import TextField from "@mui/material/TextField"; import Tooltip from "@mui/material/Tooltip"; import { AdminFormDialog, AdminFormSection } from "@/shared/ui/AdminFormDialog.jsx"; import { AdminSwitch } from "@/shared/ui/AdminSwitch.jsx"; import { AdminUserIdentity } from "@/shared/ui/AdminUserIdentity.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, createUserIdentityColumnFilter } 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) => roomStatusLabels[room.status === "active" ? "active" : "closed"], }, { 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: "搜索房间 ID、短号、名称、房主靓号", value: page.query, onChange: page.changeQuery, }), render: (room) => page.openDetail(room)} />, } : column.key === "owner" ? { ...column, filter: createUserIdentityColumnFilter({ value: page.ownerFilter, onChange: page.changeOwnerFilter, }), } : 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 || 50, 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 })} /> page.setStatusForm({ ...page.statusForm, closeReason: 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 || {}; return ; } function RoomActions({ page, room }) { return ( {page.abilities.canUpdate ? ( page.openEdit(room)}> ) : null} {page.abilities.canDelete ? ( page.removeRoom(room)} > ) : null} ); } function RoomStatusSwitch({ page, room }) { const checked = room.status === "active"; return ( page.toggleRoomStatus(room, event.target.checked)} /> ); } 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 : "↕"} ); }