diff --git a/src/admin/components/dashboard/DashQuickActions.tsx b/src/admin/components/dashboard/DashQuickActions.tsx index 89bc057..128d5c5 100644 --- a/src/admin/components/dashboard/DashQuickActions.tsx +++ b/src/admin/components/dashboard/DashQuickActions.tsx @@ -3,7 +3,7 @@ import { Link } from "react-router-dom"; import { motion, AnimatePresence } from "framer-motion"; import { useAuth } from "../../context/AuthContext"; import { useAlert } from "../../context/AlertContext"; -import { formatKm } from "../../utils/formatters"; +import { formatKm, todayLocalStr } from "../../utils/formatters"; import AdminDatePicker from "../AdminDatePicker"; import apiFetch from "../../utils/api"; import useModalLock from "../../hooks/useModalLock"; @@ -74,7 +74,7 @@ export default function DashQuickActions({ const openTripModal = async () => { setTripForm({ vehicle_id: "", - trip_date: new Date().toISOString().split("T")[0], + trip_date: todayLocalStr(), start_km: "", end_km: "", route_from: "", diff --git a/src/admin/pages/Attendance.tsx b/src/admin/pages/Attendance.tsx index 966ae55..00444f6 100644 --- a/src/admin/pages/Attendance.tsx +++ b/src/admin/pages/Attendance.tsx @@ -17,7 +17,7 @@ import Forbidden from "../components/Forbidden"; import apiFetch from "../utils/api"; import { jsonQuery } from "../lib/apiAdapter"; import { useApiMutation } from "../lib/queries/mutations"; -import { czechPlural } from "../utils/formatters"; +import { czechPlural, todayLocalStr } from "../utils/formatters"; const API_BASE = "/api/admin"; @@ -140,8 +140,8 @@ export default function Attendance() { const [isLeaveModalOpen, setIsLeaveModalOpen] = useState(false); const [leaveForm, setLeaveForm] = useState({ leave_type: "vacation", - date_from: new Date().toISOString().split("T")[0], - date_to: new Date().toISOString().split("T")[0], + date_from: todayLocalStr(), + date_to: todayLocalStr(), notes: "", }); const [requestSubmitting, setRequestSubmitting] = useState(false); @@ -334,8 +334,8 @@ export default function Attendance() { alert.success(result?.message || "Žádost odeslána"); setLeaveForm({ leave_type: "vacation", - date_from: new Date().toISOString().split("T")[0], - date_to: new Date().toISOString().split("T")[0], + date_from: todayLocalStr(), + date_to: todayLocalStr(), notes: "", }); } catch (e) { diff --git a/src/admin/pages/AttendanceCreate.tsx b/src/admin/pages/AttendanceCreate.tsx index 9f6e799..ab6e8a7 100644 --- a/src/admin/pages/AttendanceCreate.tsx +++ b/src/admin/pages/AttendanceCreate.tsx @@ -10,6 +10,7 @@ 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"; const API_BASE = "/api/admin"; interface CreateForm { @@ -46,7 +47,7 @@ export default function AttendanceCreate() { }); const [form, setForm] = useState(() => { - const today = new Date().toISOString().split("T")[0]; + const today = todayLocalStr(); return { user_id: "", shift_date: today, diff --git a/src/admin/pages/InvoiceDetail.tsx b/src/admin/pages/InvoiceDetail.tsx index b1ededa..cd4c3a6 100644 --- a/src/admin/pages/InvoiceDetail.tsx +++ b/src/admin/pages/InvoiceDetail.tsx @@ -48,7 +48,7 @@ import { import { offerCustomersOptions, type Customer } from "../lib/queries/offers"; import { bankAccountsOptions, type BankAccount } from "../lib/queries/common"; import { jsonQuery } from "../lib/apiAdapter"; -import { formatCurrency, formatDate } from "../utils/formatters"; +import { formatCurrency, formatDate, todayLocalStr } from "../utils/formatters"; const API_BASE = "/api/admin"; @@ -326,9 +326,9 @@ export default function InvoiceDetail() { customer_id: null, customer_name: "", order_id: fromOrderId ? Number(fromOrderId) : null, - issue_date: new Date().toISOString().split("T")[0], + issue_date: todayLocalStr(), due_date: new Date(Date.now() + 14 * 86400000).toISOString().split("T")[0], - tax_date: new Date().toISOString().split("T")[0], + tax_date: todayLocalStr(), currency: "CZK", apply_vat: 1, vat_rate: 21, diff --git a/src/admin/pages/OfferDetail.tsx b/src/admin/pages/OfferDetail.tsx index d53ee24..b0ec34a 100644 --- a/src/admin/pages/OfferDetail.tsx +++ b/src/admin/pages/OfferDetail.tsx @@ -56,7 +56,7 @@ import AdminDatePicker from "../components/AdminDatePicker"; import RichEditor from "../components/RichEditor"; import useDebounce from "../hooks/useDebounce"; import apiFetch from "../utils/api"; -import { formatCurrency } from "../utils/formatters"; +import { formatCurrency, todayLocalStr } from "../utils/formatters"; import { companySettingsOptions, type CompanySettingsData, @@ -101,7 +101,7 @@ const emptyForm: OfferForm = { project_code: "", customer_id: null, customer_name: "", - created_at: new Date().toISOString().split("T")[0], + created_at: todayLocalStr(), valid_until: "", currency: "CZK", language: "EN", diff --git a/src/admin/pages/Trips.tsx b/src/admin/pages/Trips.tsx index d7a766e..791cb7f 100644 --- a/src/admin/pages/Trips.tsx +++ b/src/admin/pages/Trips.tsx @@ -11,7 +11,7 @@ import FormModal from "../components/FormModal"; import FormField from "../components/FormField"; import Forbidden from "../components/Forbidden"; import { formatDate } from "../utils/attendanceHelpers"; -import { formatKm } from "../utils/formatters"; +import { formatKm, todayLocalStr } from "../utils/formatters"; import apiFetch from "../utils/api"; import { tripListOptions, @@ -53,7 +53,7 @@ export default function Trips() { }>({ show: false, tripId: null }); const [form, setForm] = useState({ vehicle_id: "", - trip_date: new Date().toISOString().split("T")[0], + trip_date: todayLocalStr(), start_km: "", end_km: "", route_from: "", @@ -117,10 +117,9 @@ export default function Trips() { const openCreateModal = () => { setEditingTrip(null); - const today = new Date().toISOString().split("T")[0]; setForm({ vehicle_id: "", - trip_date: today, + trip_date: todayLocalStr(), start_km: "", end_km: "", route_from: "", diff --git a/src/admin/utils/formatters.ts b/src/admin/utils/formatters.ts index 08388b2..b6edbb0 100644 --- a/src/admin/utils/formatters.ts +++ b/src/admin/utils/formatters.ts @@ -23,6 +23,19 @@ export function formatDate(dateStr: string | null | undefined): string { return d.toLocaleDateString("cs-CZ"); } +/** + * Today's date as `YYYY-MM-DD` in LOCAL (Prague) time — use this for + * date-input defaults. `new Date().toISOString().slice(0, 10)` gives the UTC + * date, which is a day behind the Czech date during the post-midnight window + * (Prague is UTC+1/+2), so a "today" default could land on yesterday. + */ +export function todayLocalStr(): string { + const d = new Date(); + const m = String(d.getMonth() + 1).padStart(2, "0"); + const day = String(d.getDate()).padStart(2, "0"); + return `${d.getFullYear()}-${m}-${day}`; +} + export function formatKm(km: number | string): string { return new Intl.NumberFormat("cs-CZ").format(Number(km) || 0); }