From 3b12c52fd3d95230abec21bab6e9df6b06b7cc8f Mon Sep 17 00:00:00 2001 From: Admin Date: Mon, 18 May 2026 12:50:25 +0330 Subject: [PATCH] bugfix: selecting past dates is now possible in appointment and treatment features. bur, add, edit and delete actions are disabled for past dates. --- .../src/app/(dashboard)/appointments/page.tsx | 1 - .../ui/shared/ScheduleDayPicker.tsx | 98 +++++-------------- .../ui/treatment/AppointmentsStrip.tsx | 4 - .../ui/treatment/TreatmentWorkspace.tsx | 37 ++++--- 4 files changed, 50 insertions(+), 90 deletions(-) diff --git a/frontend/src/app/(dashboard)/appointments/page.tsx b/frontend/src/app/(dashboard)/appointments/page.tsx index bbea8c0..b40d35e 100644 --- a/frontend/src/app/(dashboard)/appointments/page.tsx +++ b/frontend/src/app/(dashboard)/appointments/page.tsx @@ -285,7 +285,6 @@ export default function AppointmentsPage() {
setScheduleDate(startOfLocalDay(d))} /> {loadingSchedule && ( diff --git a/frontend/src/components/ui/shared/ScheduleDayPicker.tsx b/frontend/src/components/ui/shared/ScheduleDayPicker.tsx index 99518f5..1684f56 100644 --- a/frontend/src/components/ui/shared/ScheduleDayPicker.tsx +++ b/frontend/src/components/ui/shared/ScheduleDayPicker.tsx @@ -2,17 +2,11 @@ import { useEffect, useId, useRef, useState } from 'react'; import { ChevronDown, ChevronLeft, ChevronRight } from 'lucide-react'; -import { - addCalendarDays, - compareLocalDayStart, - startOfLocalDay, -} from '@/lib/appointmentTime'; +import { addCalendarDays, startOfLocalDay } from '@/lib/appointmentTime'; interface ScheduleDayPickerProps { value: Date; onChange: (day: Date) => void; - /** Optional lower bound for day selection and previous-day navigation. */ - minDate?: Date; label?: string; } @@ -39,27 +33,10 @@ function buildLocalDay(year: number, month: number, day: number): Date { return new Date(year, month, day, 0, 0, 0, 0); } -function clampToValidDay( - year: number, - month: number, - day: number, - min?: Date, -): Date { - const maxDay = daysInMonth(year, month); - let next = buildLocalDay(year, month, Math.min(Math.max(1, day), maxDay)); - if (min) { - const floor = startOfLocalDay(min); - if (compareLocalDayStart(next, floor) < 0) { - next = floor; - } - } - return next; -} - -function yearRange(min?: Date, anchor?: Date): number[] { - const now = new Date(); - const startYear = min ? min.getFullYear() : now.getFullYear() - 5; - const endYear = Math.max(now.getFullYear() + 2, anchor?.getFullYear() ?? now.getFullYear()); +function yearRange(anchor: Date): number[] { + const anchorYear = anchor.getFullYear(); + const startYear = anchorYear - 10; + const endYear = anchorYear + 2; const years: number[] = []; for (let y = startYear; y <= endYear; y += 1) { years.push(y); @@ -72,21 +49,18 @@ const selectClassName = ` bg-background-card/90 text-text-primary text-sm pl-2 pr-7 py-1.5 focus:outline-none focus:ring-2 focus:ring-primary/35 focus:border-border-strong - disabled:opacity-50 disabled:cursor-not-allowed `; -export function ScheduleDayPicker({ - value, - onChange, - minDate, - label = 'Schedule date', -}: ScheduleDayPickerProps) { +/** + * Calendar day navigator (arrows + year/month/day panel). + * Does not restrict past dates — parent pages enforce read-only vs editable for schedule grids/forms. + */ +export function ScheduleDayPicker({ value, onChange, label = 'Schedule date' }: ScheduleDayPickerProps) { const panelId = useId(); const rootRef = useRef(null); const [panelOpen, setPanelOpen] = useState(false); const normalizedValue = startOfLocalDay(value); - const normalizedMin = minDate ? startOfLocalDay(minDate) : undefined; const labelText = normalizedValue.toLocaleDateString(undefined, { weekday: 'short', @@ -95,28 +69,20 @@ export function ScheduleDayPicker({ year: 'numeric', }); - const previousDay = addCalendarDays(normalizedValue, -1); - const canGoPrevious = - !normalizedMin || compareLocalDayStart(previousDay, normalizedMin) >= 0; - - const years = yearRange(normalizedMin, normalizedValue); + const years = yearRange(normalizedValue); const selectedYear = normalizedValue.getFullYear(); const selectedMonth = normalizedValue.getMonth(); const selectedDay = normalizedValue.getDate(); const dayCount = daysInMonth(selectedYear, selectedMonth); function applyParts(year: number, month: number, day: number, closePanel = false) { - onChange(clampToValidDay(year, month, day, normalizedMin)); + const maxDay = daysInMonth(year, month); + onChange(buildLocalDay(year, month, Math.min(Math.max(1, day), maxDay))); if (closePanel) { setPanelOpen(false); } } - function handlePreviousDay() { - if (!canGoPrevious) return; - onChange(previousDay); - } - useEffect(() => { if (!panelOpen) return; @@ -146,9 +112,8 @@ export function ScheduleDayPicker({