import Add from "@mui/icons-material/Add"; import EditOutlined from "@mui/icons-material/EditOutlined"; import { AdminSwitch } from "@/shared/ui/AdminSwitch.jsx"; import TextField from "@mui/material/TextField"; import Tooltip from "@mui/material/Tooltip"; import { formatMillis } from "@/shared/utils/time.js"; import { DataState } from "@/shared/ui/DataState.jsx"; import { IconButton } from "@/shared/ui/IconButton.jsx"; import { MultiValueAutocomplete } from "@/shared/ui/MultiValueAutocomplete.jsx"; import { regionStatusFilters } from "@/features/host-org/constants.js"; import { HostOrgActionModal } from "@/features/host-org/components/HostOrgActionModal.jsx"; import { HostOrgTable } from "@/features/host-org/components/HostOrgTable.jsx"; import { useHostRegionsPage } from "@/features/host-org/hooks/useHostRegionsPage.js"; import { createOptionsColumnFilter, createTextColumnFilter } from "@/shared/ui/tableFilters.js"; import styles from "@/features/host-org/host-org.module.css"; const baseRegionColumns = [ { key: "regionId", label: "区域 ID", width: "minmax(90px, 0.6fr)" }, { key: "regionCode", label: "区域编码", width: "minmax(110px, 0.8fr)" }, { key: "name", label: "区域名称", width: "minmax(150px, 1fr)" }, { key: "countries", label: "国家码", render: (item) => , width: "minmax(220px, 1.5fr)", }, { key: "sortOrder", label: "排序", width: "minmax(80px, 0.5fr)" }, { key: "updatedAtMs", label: "更新时间", render: (item) => formatMillis(item.updatedAtMs), width: "minmax(170px, 1fr)", }, ]; export function HostRegionsPage() { const page = useHostRegionsPage(); const createDisabled = !page.abilities.canCreate; const updateDisabled = !page.abilities.canUpdate; const items = page.data.items || []; const total = page.data.total || 0; const regionColumns = [ ...baseRegionColumns.slice(0, 3), { key: "status", label: "状态", render: (item) => , filter: createOptionsColumnFilter({ options: regionStatusFilters, placeholder: "搜索状态", value: page.status, onChange: page.changeStatus, }), width: "minmax(90px, 0.6fr)", }, ...baseRegionColumns.slice(3), ].map((column) => column.key === "regionCode" ? { ...column, filter: createTextColumnFilter({ placeholder: "搜索区域、国家码", value: page.query, onChange: page.changeQuery, }), } : column, ); const columns = page.abilities.canUpdate ? [ ...regionColumns, { key: "actions", label: "操作", render: (item) => , width: "minmax(80px, 0.5fr)", }, ] : regionColumns; return (
{page.abilities.canCreate ? (
) : null}
item.regionId} pagination={{ page: 1, pageSize: Math.max(items.length, 1), total }} />
page.setRegionForm({ ...page.regionForm, regionCode: event.target.value })} /> page.setRegionForm({ ...page.regionForm, name: event.target.value })} /> page.setRegionForm({ ...page.regionForm, sortOrder: event.target.value })} /> page.setRegionForm({ ...page.regionForm, countries })} />
); } function RegionActions({ item, page }) { if (item.regionCode === "GLOBAL") { return "-"; } return (
{page.abilities.canUpdate ? ( page.openEditRegion(item)}> ) : null}
); } function RegionStatusSwitch({ item, page }) { const checked = item.status === "active"; const isGlobal = item.regionCode === "GLOBAL"; return ( page.toggleRegion(item, event.target.checked)} /> ); } function CountryCodeSelect({ disabled, label, labels, loading, onChange, options, value }) { const selected = value || []; const mergedOptions = [...new Set([...options, ...selected])].sort(); return ( ); } function CountryCodes({ countries = [] }) { const items = Array.isArray(countries) ? countries : []; if (!items.length) { return "-"; } return (
{items.map((country) => ( {country} ))}
); } const primaryActionSx = { borderColor: "var(--primary)", backgroundColor: "var(--primary)", color: "var(--active-contrast)", "&:hover": { borderColor: "var(--primary-strong)", backgroundColor: "var(--primary-strong)", color: "var(--active-contrast)", }, };