'use client'; import { useMutation, useQuery, useQueryClient } from '@tanstack/react-query'; import { ExternalLink, Pencil, Trash2 } from 'lucide-react'; import Link from 'next/link'; import * as React from 'react'; import { Badge } from '@/components/ui/badge'; import { Button } from '@/components/ui/button'; import { Card, CardContent } from '@/components/ui/card'; import { Input } from '@/components/ui/input'; import { Select } from '@/components/ui/select'; import { industrialApi, PARK_STATUS_COLORS, PARK_STATUS_LABELS, REGION_LABELS, type IndustrialParkStatus, type SearchIndustrialParksParams, type VietnamRegion, } from '@/lib/khu-cong-nghiep-api'; const STATUS_OPTIONS: IndustrialParkStatus[] = [ 'PLANNING', 'UNDER_CONSTRUCTION', 'OPERATIONAL', 'FULL', ]; const REGION_OPTIONS: VietnamRegion[] = ['NORTH', 'CENTRAL', 'SOUTH']; interface FiltersState { q: string; province: string; status: IndustrialParkStatus | ''; region: VietnamRegion | ''; page: number; } const INITIAL_FILTERS: FiltersState = { q: '', province: '', status: '', region: '', page: 1, }; export default function IndustrialParksListPage() { const [filters, setFilters] = React.useState(INITIAL_FILTERS); const queryParams = React.useMemo(() => { const p: SearchIndustrialParksParams = { page: filters.page, limit: 12 }; if (filters.q) p.q = filters.q; if (filters.province) p.province = filters.province; if (filters.status) p.status = filters.status; if (filters.region) p.region = filters.region; return p; }, [filters]); const { data: result, isLoading } = useQuery({ queryKey: ['admin-industrial-parks', queryParams], queryFn: () => industrialApi.search(queryParams), staleTime: 30_000, }); const queryClient = useQueryClient(); const deleteMutation = useMutation({ mutationFn: (id: string) => industrialApi.deletePark(id), onSuccess: () => queryClient.invalidateQueries({ queryKey: ['admin-industrial-parks'] }), }); const handleDelete = (id: string, name: string) => { if (!window.confirm(`Xoá KCN "${name}"? Thao tác này không thể hoàn tác.`)) return; deleteMutation.mutate(id); }; const resetFilters = () => setFilters(INITIAL_FILTERS); return (
{/* Header */}

Quản lý KCN

Quản lý danh sách khu công nghiệp, chủ đầu tư và tình trạng lấp đầy

{/* Filters */}
setFilters((f) => ({ ...f, q: e.target.value, page: 1 }))} placeholder="Tìm theo tên, chủ đầu tư..." className="w-64" /> setFilters((f) => ({ ...f, province: e.target.value, page: 1 }))} placeholder="Tỉnh/Thành phố" className="w-48" />
{deleteMutation.isError && (

Không thể xoá KCN. Vui lòng thử lại.

)} {/* Content */} {isLoading ? (
) : !result || result.data.length === 0 ? (

Chưa có KCN nào

) : (
{result.data.map((park) => ( ))}
Tên KCN Chủ đầu tư Tỉnh Vùng Diện tích (ha) Tỉ lệ lấp đầy Trạng thái Thao tác
{park.name} {park.nameEn && (

{park.nameEn}

)}
{park.developer} {park.province} {REGION_LABELS[park.region]} {park.totalAreaHa.toLocaleString('vi-VN')} {park.occupancyRate.toFixed(1)}% {PARK_STATUS_LABELS[park.status]}
)} {/* Pagination */} {result && result.totalPages > 1 && (
Trang {result.page} / {result.totalPages}
)}
); }