import { useState } from "react"; import { useQuery } from "@tanstack/react-query"; import { userListOptions } from "../lib/queries/users"; import { useAlert } from "../context/AlertContext"; import { useAuth } from "../context/AuthContext"; import Forbidden from "../components/Forbidden"; import { useNavigate, Link } from "react-router-dom"; import { motion } from "framer-motion"; import AdminDatePicker from "../components/AdminDatePicker"; import FormField from "../components/FormField"; import apiFetch from "../utils/api"; import { Skeleton } from "boneyard-js/react"; import AttendanceCreateFixture from "../fixtures/AttendanceCreateFixture"; const API_BASE = "/api/admin"; interface User { id: number | string; name: string; } interface CreateForm { user_id: string; shift_date: string; leave_type: string; leave_hours: number; arrival_date: string; arrival_time: string; break_start_date: string; break_start_time: string; break_end_date: string; break_end_time: string; departure_date: string; departure_time: string; notes: string; } export default function AttendanceCreate() { const alert = useAlert(); const { hasPermission } = useAuth(); const navigate = useNavigate(); const { data: usersData, isPending: loading } = useQuery(userListOptions()); const users = (usersData as unknown as User[] | undefined) ?? []; const [submitting, setSubmitting] = useState(false); const [form, setForm] = useState(() => { const today = new Date().toISOString().split("T")[0]; return { user_id: "", shift_date: today, leave_type: "work", leave_hours: 8, arrival_date: today, arrival_time: "", break_start_date: today, break_start_time: "", break_end_date: today, break_end_time: "", departure_date: today, departure_time: "", notes: "", }; }); const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!form.user_id || !form.shift_date) { alert.error("Vyplňte zaměstnance a datum směny"); return; } setSubmitting(true); try { const response = await apiFetch(`${API_BASE}/attendance`, { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify(form), }); const result = await response.json(); if (result.success) { alert.success(result.message); navigate(`/attendance/admin?month=${form.shift_date.substring(0, 7)}`); } else { alert.error(result.error); } } catch { alert.error("Chyba připojení"); } finally { setSubmitting(false); } }; const handleShiftDateChange = (newDate: string) => { setForm({ ...form, shift_date: newDate, arrival_date: newDate, break_start_date: newDate, break_end_date: newDate, departure_date: newDate, }); }; const isWorkType = form.leave_type === "work"; if (!hasPermission("attendance.admin")) return ; return ( } >

Přidat záznam docházky

← Zpět na správu
handleShiftDateChange(val)} required />
{!isWorkType && ( setForm({ ...form, leave_hours: parseFloat(e.target.value), }) } min="0.5" max="24" step="0.5" className="admin-form-input" /> Výchozí 8 hodin pro celý den )} {isWorkType && ( <>
setForm({ ...form, arrival_date: val }) } /> setForm({ ...form, arrival_time: val }) } />
setForm({ ...form, break_start_date: val }) } /> setForm({ ...form, break_start_time: val }) } />
setForm({ ...form, break_end_date: val }) } /> setForm({ ...form, break_end_time: val }) } />
setForm({ ...form, departure_date: val }) } /> setForm({ ...form, departure_time: val }) } />
)}