'use client'; import { useState, useEffect } from 'react'; import { Box, Typography, Button, Card, CardContent, TextField, Select, MenuItem, FormControl, InputLabel, Dialog, DialogTitle, DialogContent, DialogActions, Chip, IconButton, Breadcrumbs, Link, Alert } from '@mui/material'; import { Add as AddIcon, Edit as EditIcon, Delete as DeleteIcon, Visibility as ViewIcon, Home as HomeIcon, ArticleOutlined as PagesIcon, Public as PublicIcon, Navigation as NavigationIcon, Foundation as FooterIcon } from '@mui/icons-material'; import { DataGrid, GridColDef, GridActionsCellItem } from '@mui/x-data-grid'; import { PageEditor } from '@/components/admin/pages/page-editor'; interface Page { id: string; title: string; slug: string; status: 'DRAFT' | 'PUBLISHED' | 'ARCHIVED'; showInNavigation: boolean; showInFooter: boolean; createdAt: string; updatedAt: string; creator: { name: string; email: string }; updater: { name: string; email: string }; } export default function PagesManagement() { const [pages, setPages] = useState([]); const [loading, setLoading] = useState(true); const [selectedPage, setSelectedPage] = useState(null); const [editorOpen, setEditorOpen] = useState(false); const [deleteDialogOpen, setDeleteDialogOpen] = useState(false); const [pageToDelete, setPageToDelete] = useState(null); const [filterStatus, setFilterStatus] = useState('all'); const [searchQuery, setSearchQuery] = useState(''); const [error, setError] = useState(null); const [success, setSuccess] = useState(null); useEffect(() => { fetchPages(); }, [filterStatus, searchQuery]); const fetchPages = async () => { try { const token = localStorage.getItem('authToken'); const params = new URLSearchParams(); if (filterStatus !== 'all') params.append('status', filterStatus); if (searchQuery) params.append('search', searchQuery); const response = await fetch(`/api/admin/pages?${params.toString()}`, { headers: { 'Authorization': `Bearer ${token}` } }); if (!response.ok) { throw new Error('Failed to fetch pages'); } const data = await response.json(); setPages(data.data || []); } catch (error) { console.error('Error fetching pages:', error); setError('Failed to load pages'); } finally { setLoading(false); } }; const handleCreatePage = () => { setSelectedPage(null); setEditorOpen(true); }; const handleEditPage = (page: Page) => { setSelectedPage(page); setEditorOpen(true); }; const handleDeletePage = async (page: Page) => { setPageToDelete(page); setDeleteDialogOpen(true); }; const confirmDeletePage = async () => { if (!pageToDelete) return; try { const token = localStorage.getItem('authToken'); const response = await fetch(`/api/admin/pages/${pageToDelete.id}`, { method: 'DELETE', headers: { 'Authorization': `Bearer ${token}` } }); if (!response.ok) { throw new Error('Failed to delete page'); } setSuccess('Page deleted successfully'); fetchPages(); setDeleteDialogOpen(false); setPageToDelete(null); } catch (error) { console.error('Error deleting page:', error); setError('Failed to delete page'); } }; const handlePageSaved = () => { setSuccess('Page saved successfully'); setEditorOpen(false); fetchPages(); }; const getStatusColor = (status: string) => { switch (status) { case 'PUBLISHED': return 'success'; case 'DRAFT': return 'warning'; case 'ARCHIVED': return 'default'; default: return 'default'; } }; const columns: GridColDef[] = [ { field: 'title', headerName: 'Title', width: 300, renderCell: (params) => ( {params.value} /{params.row.slug} ) }, { field: 'status', headerName: 'Status', width: 120, renderCell: (params) => ( ) }, { field: 'showInNavigation', headerName: 'Navigation', width: 100, renderCell: (params) => ( params.value ? : null ) }, { field: 'showInFooter', headerName: 'Footer', width: 80, renderCell: (params) => ( params.value ? : null ) }, { field: 'creator', headerName: 'Created By', width: 150, renderCell: (params) => params.value?.name || params.value?.email }, { field: 'updatedAt', headerName: 'Last Updated', width: 150, renderCell: (params) => new Date(params.value).toLocaleDateString() }, { field: 'actions', type: 'actions', headerName: 'Actions', width: 120, getActions: (params) => [ } label="Edit" onClick={() => handleEditPage(params.row)} />, } label="View" onClick={() => window.open(`/pages/${params.row.slug}`, '_blank')} />, } label="Delete" onClick={() => handleDeletePage(params.row)} /> ] } ]; return ( {/* Breadcrumbs */} Admin Pages {/* Header */} Page Management Create and manage website pages for navigation and footer {/* Alerts */} {error && ( setError(null)} sx={{ mb: 2 }}> {error} )} {success && ( setSuccess(null)} sx={{ mb: 2 }}> {success} )} {/* Filters */} setSearchQuery(e.target.value)} sx={{ minWidth: 300 }} /> Status {/* Pages Table */} {/* Page Editor Dialog */} setEditorOpen(false)} page={selectedPage} onSave={handlePageSaved} /> {/* Delete Confirmation Dialog */} setDeleteDialogOpen(false)}> Delete Page Are you sure you want to delete "{pageToDelete?.title}"? This action cannot be undone. ); }