From 3eb364fba59e195e07460d36f0c13330faba0797 Mon Sep 17 00:00:00 2001 From: BOHA Date: Sun, 7 Jun 2026 00:50:01 +0200 Subject: [PATCH] =?UTF-8?q?feat(mui):=20migrate=20Attendance=20Create=20(V?= =?UTF-8?q?ytvo=C5=99it=20z=C3=A1znam)=20onto=20MUI=20kit?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Co-Authored-By: Claude Opus 4.8 (1M context) --- src/admin/pages/AttendanceCreate.tsx | 307 ++++++++++++++------------- 1 file changed, 165 insertions(+), 142 deletions(-) diff --git a/src/admin/pages/AttendanceCreate.tsx b/src/admin/pages/AttendanceCreate.tsx index ab6e8a7..9de2318 100644 --- a/src/admin/pages/AttendanceCreate.tsx +++ b/src/admin/pages/AttendanceCreate.tsx @@ -1,16 +1,28 @@ import { useState } from "react"; import { useQuery } from "@tanstack/react-query"; +import { Link as RouterLink } from "react-router-dom"; +import { useNavigate } from "react-router-dom"; +import Box from "@mui/material/Box"; +import { motion } from "framer-motion"; + 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 { useApiMutation } from "../lib/queries/mutations"; import { todayLocalStr } from "../utils/formatters"; +import { + Button, + Card, + DateField, + Field, + LoadingState, + PageHeader, + Select, + TextField, + TimeField, +} from "../ui"; + const API_BASE = "/api/admin"; interface CreateForm { @@ -102,89 +114,85 @@ export default function AttendanceCreate() { if (!hasPermission("attendance.manage")) return ; if (loading) { - return ( -
-
-
- ); + return ; } return ( -
+ -
-

Přidat záznam docházky

-
-
- - ← Zpět na správu - -
+ + ← Zpět na správu + + } + />
-
-
-
- - - setForm({ ...form, user_id: e.target.value }) - } - className="admin-form-select" - required - > - - {users.map((user) => ( - - ))} - - - - handleShiftDateChange(val)} - required + onChange={(val) => setForm({ ...form, user_id: val })} + options={[ + { value: "", label: "Vyberte zaměstnance" }, + ...users.map((u) => ({ + value: String(u.id), + label: u.name, + })), + ]} /> - -
+ + + handleShiftDateChange(val)} + /> + + - - - setForm({ ...form, leave_type: e.target.value }) - } - className="admin-form-select" - > - - - - - - + onChange={(val) => setForm({ ...form, leave_type: val })} + options={[ + { value: "work", label: "Práce" }, + { value: "vacation", label: "Dovolená" }, + { value: "sick", label: "Nemoc" }, + { value: "unpaid", label: "Neplacené volno" }, + ]} + /> + + {/* Leave hours — shown only for non-work types */} {!isWorkType && ( - - + @@ -193,132 +201,147 @@ export default function AttendanceCreate() { leave_hours: parseFloat(e.target.value), }) } - min="0.5" - max="24" - step="0.5" - className="admin-form-input" + slotProps={{ htmlInput: { min: 0.5, max: 24, step: 0.5 } }} /> - - Výchozí 8 hodin pro celý den - - + )} + {/* Work-type time fields */} {isWorkType && ( <> -
- - + + + onChange={(val) => setForm({ ...form, arrival_date: val }) } /> - - - + + + onChange={(val) => setForm({ ...form, arrival_time: val }) } /> - -
+ + -
- - + + + onChange={(val) => setForm({ ...form, break_start_date: val }) } /> - - - + + + onChange={(val) => setForm({ ...form, break_start_time: val }) } /> - -
+ + -
- - + + + onChange={(val) => setForm({ ...form, break_end_date: val }) } /> - - - + + + onChange={(val) => setForm({ ...form, break_end_time: val }) } /> - -
+ + -
- - + + + onChange={(val) => setForm({ ...form, departure_date: val }) } /> - - - + + + onChange={(val) => setForm({ ...form, departure_time: val }) } /> - -
+ + )} - -