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: "Foreman Management - Phosphat Report" }]; export const loader = async ({ request }: LoaderFunctionArgs) => { const user = await requireAuthLevel(request, 2); const foremen = await prisma.foreman.findMany({ orderBy: { name: 'asc' } }); return json({ user, foremen }); }; 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.foreman.create({ data: { name } }); return json({ success: "Foreman created successfully!" }); } catch (error) { return json({ errors: { form: "Failed to create foreman" } }, { 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 foreman ID" } }, { status: 400 }); } try { await prisma.foreman.update({ where: { id: parseInt(id) }, data: { name } }); return json({ success: "Foreman updated successfully!" }); } catch (error) { return json({ errors: { form: "Failed to update foreman" } }, { status: 400 }); } } if (intent === "delete") { if (typeof id !== "string") { return json({ errors: { form: "Invalid foreman ID" } }, { status: 400 }); } try { await prisma.foreman.delete({ where: { id: parseInt(id) } }); return json({ success: "Foreman deleted successfully!" }); } catch (error) { return json({ errors: { form: "Failed to delete foreman" } }, { status: 400 }); } } return json({ errors: { form: "Invalid action" } }, { status: 400 }); }; export default function Foreman() { const { user, foremen } = useLoaderData(); const actionData = useActionData(); const navigation = useNavigation(); const [editingForeman, setEditingForeman] = 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 = editingForeman !== null; // Handle success/error messages useEffect(() => { if (actionData?.success) { setToast({ message: actionData.success, type: "success" }); setShowModal(false); setEditingForeman(null); } else if (actionData?.errors?.form) { setToast({ message: actionData.errors.form, type: "error" }); } }, [actionData]); const handleEdit = (foreman: { id: number; name: string }) => { setEditingForeman(foreman); setShowModal(true); }; const handleAdd = () => { setEditingForeman(null); setShowModal(true); }; const handleCloseModal = () => { setShowModal(false); setEditingForeman(null); }; return (

Foreman Management

Manage site foremen and supervisors

{/* Foremen Table - Desktop */}
{foremen.map((foreman) => ( ))}
Foreman ID Actions
{foreman.name.charAt(0).toUpperCase()}
{foreman.name}
{/*
Site Foreman
*/}
#{foreman.id}
{/* Foremen Cards - Mobile */}
{foremen.map((foreman) => (
{foreman.name.charAt(0).toUpperCase()}
{foreman.name}
Site Foreman
#{foreman.id}
))}
{foremen.length === 0 && (

No foremen

Get started by adding your first foreman.

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