import React, { useState, useEffect } from "react"; import { useMediaQuery, Box, Typography, Table, TableBody, TableCell, TableContainer, TableHead, TableRow, Paper, IconButton, Skeleton, Button, TextField, MenuItem, Dialog, DialogTitle, DialogContent, DialogActions, Menu, Chip, } from "@mui/material"; import { useTheme } from "@mui/material/styles"; import ArrowBackIosNewIcon from "@mui/icons-material/ArrowBackIosNew"; import ArrowForwardIosIcon from "@mui/icons-material/ArrowForwardIos"; import AddIcon from "@mui/icons-material/Add"; import SaveIcon from "@mui/icons-material/Save"; import DeleteOutlineIcon from "@mui/icons-material/DeleteOutline"; import TuneIcon from "@mui/icons-material/Tune"; import authService from "../../../services/authService"; const SimplePagination = ({ currentPage, pageCount, onChange }) => { const theme = useTheme(); const handlePrev = () => currentPage > 1 && onChange(currentPage - 1); const handleNext = () => currentPage < pageCount && onChange(currentPage + 1); return ( {currentPage} = pageCount} sx={{ borderRadius: "8px", backgroundColor: "#FFECE0", // "&:hover": { backgroundColor: "#FFD6B5" }, color: theme.palette.primary.main, // "&.Mui-disabled": { color: "#ccc", backgroundColor: "#FFF5E6" }, }} > ); }; const statusOptions = ["available", "unavailable"]; const TablesManager = ({ restaurantId }) => { const theme = useTheme(); const isMobile = useMediaQuery(theme.breakpoints.down("sm")); const itemsPerPage = 4; const [rows, setRows] = useState([]); const [currentPage, setCurrentPage] = useState(1); const [loading, setLoading] = useState(false); const [addingRow, setAddingRow] = useState(false); const [newRow, setNewRow] = useState({ restaurant_id: restaurantId, table_number: "", capacity: "", status: "available", }); const [confirmDeleteOpen, setConfirmDeleteOpen] = useState(false); const [rowToDelete, setRowToDelete] = useState(null); const [isSaving, setIsSaving] = useState(false); // فلتر const [filterAnchorEl, setFilterAnchorEl] = useState(null); const [statusFilter, setStatusFilter] = useState("all"); const fetchTables = async () => { setLoading(true); try { const result = await authService.getTablesByRestaurant(restaurantId); if (result.success) setRows(result.data); } catch (err) { console.error("❌ Error fetching tables:", err); } finally { setLoading(false); } }; useEffect(() => { if (restaurantId) fetchTables(); }, [restaurantId]); const handleSaveRow = async () => { if (!newRow.table_number || !newRow.capacity) return; try { const result = await authService.addTable(newRow); if (result.success) { setRows((prev) => [result.data, ...prev]); setAddingRow(false); setNewRow({ restaurant_id: restaurantId, table_number: "", capacity: "", status: "available", }); } } catch (err) { console.error("❌ Error adding table:", err); } }; const handleDeleteRow = (row) => { setRowToDelete(row); setConfirmDeleteOpen(true); }; const handleConfirmDelete = async () => { if (!rowToDelete) return; setIsSaving(true); try { const result = await authService.deleteTable(rowToDelete.id); if (result.success) setRows((prev) => prev.filter((r) => r.id !== rowToDelete.id)); } catch (err) { console.error(err); } finally { setIsSaving(false); setConfirmDeleteOpen(false); } }; const handleFilterClick = (event) => setFilterAnchorEl(event.currentTarget); const handleFilterClose = () => setFilterAnchorEl(null); const handleFilterSelect = (value) => { setStatusFilter(value); setFilterAnchorEl(null); }; const filteredRows = (statusFilter === "all" ? rows : rows.filter((r) => r.status === statusFilter)) .sort((a, b) => parseInt(a.table_number) - parseInt(b.table_number)); const pageCount = Math.ceil(filteredRows.length / itemsPerPage); const paginatedRows = filteredRows.slice( (currentPage - 1) * itemsPerPage, currentPage * itemsPerPage ); const getStatusChipProps = (status) => { switch (status?.toLowerCase()) { case "available": return { label: "Available", sx: { backgroundColor: "#E7F4EE", color: "#0D894F", fontWeight: 600, fontSize: "13px", minWidth: 90, }, }; case "unavailable": return { label: "Unavailable", sx: { backgroundColor: "#fde8e8ff", color: "#e41111ff", fontWeight: 600, fontSize: "13px", minWidth: 100, }, }; default: return { label: status, sx: { backgroundColor: "#FDF1E8", color: "#E46A11", fontWeight: 600, fontSize: "13px", minWidth: 80, }, }; } }; return ( {/* Header */} Tables {/* فلتر */} {/* Menu الفلاتر */} {["all", "available", "unavailable"].map((status) => ( handleFilterSelect(status)} sx={{ color: statusFilter === status ? "#FF914D" : "#4F5867", fontWeight: statusFilter === status ? 700 : 500, }} > {status.charAt(0).toUpperCase() + status.slice(1)} ))} {/* جدول */} Table Number Capacity Status Actions {loading ? Array.from({ length: itemsPerPage }).map((_, idx) => ( )) : ( <> {addingRow && ( setNewRow({ ...newRow, table_number: e.target.value })} /> setNewRow({ ...newRow, capacity: e.target.value })} /> )} {paginatedRows.map((row) => ( {row.table_number} {row.capacity} handleDeleteRow(row)}> ))} )}
{/* Pagination Footer */} Showing {(currentPage - 1) * itemsPerPage + 1} -{" "} {Math.min(currentPage * itemsPerPage, filteredRows.length)} of {filteredRows.length} {/* Dialog الحذف */} setConfirmDeleteOpen(false)}> Confirm Delete Are you sure you want to delete table "{rowToDelete?.table_number}"?
); }; export default TablesManager;