import { useState } from "react"; import { useQuery, useMutation } from "@tanstack/react-query"; import { GuardWithCertifications, InsertGuard, InsertCertification } from "@shared/schema"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger } from "@/components/ui/dialog"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { Switch } from "@/components/ui/switch"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { insertGuardSchema, insertCertificationSchema } from "@shared/schema"; import { Plus, Shield, Check, X, AlertCircle, Pencil } from "lucide-react"; import { apiRequest, queryClient } from "@/lib/queryClient"; import { useToast } from "@/hooks/use-toast"; import { StatusBadge } from "@/components/status-badge"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { Badge } from "@/components/ui/badge"; import { Skeleton } from "@/components/ui/skeleton"; import { format } from "date-fns"; export default function Guards() { const { toast } = useToast(); const [isDialogOpen, setIsDialogOpen] = useState(false); const [editingGuard, setEditingGuard] = useState(null); const { data: guards, isLoading } = useQuery({ queryKey: ["/api/guards"], }); const form = useForm({ resolver: zodResolver(insertGuardSchema), defaultValues: { badgeNumber: "", phoneNumber: "", isArmed: false, hasFireSafety: false, hasFirstAid: false, hasDriverLicense: false, languages: [], }, }); const editForm = useForm({ resolver: zodResolver(insertGuardSchema), defaultValues: { badgeNumber: "", phoneNumber: "", isArmed: false, hasFireSafety: false, hasFirstAid: false, hasDriverLicense: false, languages: [], }, }); const createMutation = useMutation({ mutationFn: async (data: InsertGuard) => { return await apiRequest("POST", "/api/guards", data); }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["/api/guards"] }); toast({ title: "Guardia creata", description: "La guardia รจ stata aggiunta con successo", }); setIsDialogOpen(false); form.reset(); }, onError: (error) => { toast({ title: "Errore", description: error.message, variant: "destructive", }); }, }); const updateMutation = useMutation({ mutationFn: async ({ id, data }: { id: string; data: InsertGuard }) => { return await apiRequest("PATCH", `/api/guards/${id}`, data); }, onSuccess: () => { queryClient.invalidateQueries({ queryKey: ["/api/guards"] }); toast({ title: "Guardia aggiornata", description: "I dati della guardia sono stati aggiornati", }); setEditingGuard(null); editForm.reset(); }, onError: (error) => { toast({ title: "Errore", description: error.message, variant: "destructive", }); }, }); const onSubmit = (data: InsertGuard) => { createMutation.mutate(data); }; const onEditSubmit = (data: InsertGuard) => { if (editingGuard) { updateMutation.mutate({ id: editingGuard.id, data }); } }; const openEditDialog = (guard: GuardWithCertifications) => { setEditingGuard(guard); editForm.reset({ badgeNumber: guard.badgeNumber, phoneNumber: guard.phoneNumber || "", isArmed: guard.isArmed, hasFireSafety: guard.hasFireSafety, hasFirstAid: guard.hasFirstAid, hasDriverLicense: guard.hasDriverLicense, languages: guard.languages || [], }); }; return (

Gestione Guardie

Anagrafica guardie con competenze e certificazioni

Nuova Guardia Inserisci i dati della nuova guardia giurata
( Matricola )} /> ( Telefono )} />

Competenze

( Armato )} /> ( Antincendio )} /> ( Primo Soccorso )} /> ( Patente )} />
{/* Edit Guard Dialog */} !open && setEditingGuard(null)}> Modifica Guardia Modifica i dati della guardia {editingGuard?.user?.firstName} {editingGuard?.user?.lastName}
( Matricola )} /> ( Telefono )} />

Competenze

( Armato )} /> ( Antincendio )} /> ( Primo Soccorso )} /> ( Patente )} />
{isLoading ? (
) : guards && guards.length > 0 ? (
{guards.map((guard) => (
{guard.user?.firstName?.[0]}{guard.user?.lastName?.[0]}
{guard.user?.firstName} {guard.user?.lastName} {guard.badgeNumber}
{guard.isArmed && ( Armato )} {guard.hasFirstAid && ( Primo Soccorso )} {guard.hasFireSafety && ( Antincendio )} {guard.hasDriverLicense && ( Patente )}
{guard.certifications.length > 0 && (

Certificazioni

{guard.certifications.slice(0, 2).map((cert) => (
{cert.name} {cert.status === "valid" ? "Valido" : cert.status === "expiring_soon" ? "In scadenza" : "Scaduto"}
))}
)}
))}
) : (

Nessuna guardia presente

Inizia aggiungendo la prima guardia al sistema

)}
); }