import { useState } from "react";
import { useQuery, useMutation } from "@tanstack/react-query";
import { queryClient, apiRequest } from "@/lib/queryClient";
import type { TrainingCourse, Absence } from "@shared/schema";
import { Card, CardContent, CardHeader, CardTitle, CardDescription } from "@/components/ui/card";
import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs";
import { Button } from "@/components/ui/button";
import { Input } from "@/components/ui/input";
import { Label } from "@/components/ui/label";
import { Badge } from "@/components/ui/badge";
import {
Dialog,
DialogContent,
DialogHeader,
DialogTitle,
DialogTrigger,
DialogFooter,
} from "@/components/ui/dialog";
import {
Select,
SelectContent,
SelectItem,
SelectTrigger,
SelectValue,
} from "@/components/ui/select";
import { useToast } from "@/hooks/use-toast";
import { Calendar, GraduationCap, HeartPulse, PartyPopper, Plus, Trash2 } from "lucide-react";
import { format } from "date-fns";
import { it } from "date-fns/locale";
export default function PlanningPage() {
const { toast } = useToast();
const [activeTab, setActiveTab] = useState("training");
return (
Gestione Pianificazioni
Gestisci formazione, assenze e festività per ottimizzare la pianificazione turni
Formazione
Assenze
Festività
);
}
function TrainingTab() {
const { toast } = useToast();
const [isCreateOpen, setIsCreateOpen] = useState(false);
const { data: courses = [], isLoading } = useQuery({
queryKey: ["/api/training-courses"],
});
const createMutation = useMutation({
mutationFn: (data: any) => apiRequest("/api/training-courses", "POST", data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ["/api/training-courses"] });
toast({ title: "Corso creato con successo" });
setIsCreateOpen(false);
},
});
const deleteMutation = useMutation({
mutationFn: (id: string) => apiRequest(`/api/training-courses/${id}`, "DELETE"),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ["/api/training-courses"] });
toast({ title: "Corso eliminato" });
},
});
if (isLoading) {
return Caricamento corsi...
;
}
return (
{courses.map((course: any) => (
{course.courseName}
Programmato: {course.scheduledDate ? format(new Date(course.scheduledDate), "dd MMM yyyy", { locale: it }) : "N/D"}
{course.courseType === "mandatory" ? "Obbligatorio" : "Facoltativo"}
{course.status}
))}
{courses.length === 0 && (
Nessun corso di formazione programmato
)}
);
}
function AbsencesTab() {
const { toast } = useToast();
const [isCreateOpen, setIsCreateOpen] = useState(false);
const { data: absences = [], isLoading } = useQuery({
queryKey: ["/api/absences"],
});
const createMutation = useMutation({
mutationFn: (data: any) => apiRequest("/api/absences", "POST", data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ["/api/absences"] });
toast({ title: "Assenza registrata" });
setIsCreateOpen(false);
},
});
const deleteMutation = useMutation({
mutationFn: (id: string) => apiRequest(`/api/absences/${id}`, "DELETE"),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ["/api/absences"] });
toast({ title: "Assenza eliminata" });
},
});
if (isLoading) {
return Caricamento assenze...
;
}
return (
{absences.map((absence: any) => (
{absence.type === "sick_leave" && "Malattia"}
{absence.type === "vacation" && "Ferie"}
{absence.type === "personal_leave" && "Permesso"}
{absence.type === "injury" && "Infortunio"}
Dal {format(new Date(absence.startDate), "dd MMM", { locale: it })} al{" "}
{format(new Date(absence.endDate), "dd MMM yyyy", { locale: it })}
{absence.isApproved ? "Approvata" : "In attesa"}
))}
{absences.length === 0 && (
Nessuna assenza registrata
)}
);
}
function HolidaysTab() {
const { toast } = useToast();
const [isCreateOpen, setIsCreateOpen] = useState(false);
const currentYear = new Date().getFullYear();
const { data: holidays = [], isLoading } = useQuery({
queryKey: ["/api/holidays", currentYear],
queryFn: () => fetch(`/api/holidays?year=${currentYear}`).then((r) => r.json()),
});
const createMutation = useMutation({
mutationFn: (data: any) => apiRequest("/api/holidays", "POST", data),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ["/api/holidays", currentYear] });
toast({ title: "Festività creata" });
setIsCreateOpen(false);
},
});
const deleteMutation = useMutation({
mutationFn: (id: string) => apiRequest(`/api/holidays/${id}`, "DELETE"),
onSuccess: () => {
queryClient.invalidateQueries({ queryKey: ["/api/holidays", currentYear] });
toast({ title: "Festività eliminata" });
},
});
if (isLoading) {
return Caricamento festività...
;
}
return (
{holidays.map((holiday: any) => (
{holiday.name}
{format(new Date(holiday.date), "EEEE dd MMMM yyyy", { locale: it })}
{holiday.isNational ? "Nazionale" : "Regionale"}
))}
{holidays.length === 0 && (
Nessuna festività configurata per {currentYear}
)}
);
}