import type { ActionFunctionArgs, LoaderFunctionArgs, MetaFunction } from "@remix-run/node"; import { json, redirect } from "@remix-run/node"; import { Form, useActionData, useLoaderData, useNavigation } from "@remix-run/react"; import { requireAuthLevel } from "~/utils/auth.server"; import DashboardLayout from "~/components/DashboardLayout"; import FormModal from "~/components/FormModal"; import Toast from "~/components/Toast"; import { useState, useEffect } from "react"; import { prisma } from "~/utils/db.server"; export const meta: MetaFunction = () => [{ title: "Areas Management - Alhaffer Reporting System" }]; export const loader = async ({ request }: LoaderFunctionArgs) => { const user = await requireAuthLevel(request, 2); const areas = await prisma.area.findMany({ orderBy: { name: 'asc' }, include: { _count: { select: { reports: true } } } }); return json({ user, areas }); }; export const action = async ({ request }: ActionFunctionArgs) => { await requireAuthLevel(request, 2); const formData = await request.formData(); const intent = formData.get("intent"); const id = formData.get("id"); const name = formData.get("name"); if (intent === "create") { if (typeof name !== "string" || name.length === 0) { return json({ errors: { name: "Name is required" } }, { status: 400 }); } try { await prisma.area.create({ data: { name } }); return json({ success: "Area created successfully!" }); } catch (error) { return json({ errors: { form: "Area name already exists" } }, { status: 400 }); } } if (intent === "update") { if (typeof name !== "string" || name.length === 0) { return json({ errors: { name: "Name is required" } }, { status: 400 }); } if (typeof id !== "string") { return json({ errors: { form: "Invalid area ID" } }, { status: 400 }); } try { await prisma.area.update({ where: { id: parseInt(id) }, data: { name } }); return json({ success: "Area updated successfully!" }); } catch (error) { return json({ errors: { form: "Area name already exists" } }, { status: 400 }); } } if (intent === "delete") { if (typeof id !== "string") { return json({ errors: { form: "Invalid area ID" } }, { status: 400 }); } try { await prisma.area.delete({ where: { id: parseInt(id) } }); return json({ success: "Area deleted successfully!" }); } catch (error) { return json({ errors: { form: "Cannot delete area with existing reports" } }, { status: 400 }); } } return json({ errors: { form: "Invalid action" } }, { status: 400 }); }; export default function Areas() { const { user, areas } = useLoaderData(); const actionData = useActionData(); const navigation = useNavigation(); const [editingArea, setEditingArea] = useState<{ id: number; name: string } | null>(null); const [showModal, setShowModal] = useState(false); const [toast, setToast] = useState<{ message: string; type: "success" | "error" } | null>(null); const isSubmitting = navigation.state === "submitting"; const isEditing = editingArea !== null; // Handle success/error messages useEffect(() => { if (actionData?.success) { setToast({ message: actionData.success, type: "success" }); setShowModal(false); setEditingArea(null); } else if (actionData?.errors?.form) { setToast({ message: actionData.errors.form, type: "error" }); } }, [actionData]); const handleEdit = (area: { id: number; name: string }) => { setEditingArea(area); setShowModal(true); }; const handleAdd = () => { setEditingArea(null); setShowModal(true); }; const handleCloseModal = () => { setShowModal(false); setEditingArea(null); }; return (

Areas Management

Manage operational areas for your reports

{/* Areas Table - Desktop */}
{areas.map((area, index) => ( ))}
Area Name Reports Count Actions
{area.name}
{/*
Area #{area.id}
*/}
{area._count.reports} reports
{/* Areas Cards - Mobile */}
{areas.map((area) => (
{area.name}
{area._count.reports} reports
))}
{areas.length === 0 && (

No areas

Get started by creating your first area.

)}
{/* Form Modal */} {/* Toast Notifications */} {toast && ( setToast(null)} /> )}
); }