diff --git a/src/app/page.tsx b/src/app/page.tsx index 3b453b8..da8c0f4 100644 --- a/src/app/page.tsx +++ b/src/app/page.tsx @@ -23,6 +23,7 @@ import { Badge } from "@/components/ui/badge" import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter } from "@/components/ui/dialog" import { Textarea } from "@/components/ui/textarea" import { Label } from "@/components/ui/label" +import { parseSprintEnd, parseSprintStart } from "@/lib/utils" import { generateAvatarDataUrl } from "@/lib/avatar" import { blobFromDataUrl, @@ -588,9 +589,9 @@ export default function Home() { const now = new Date() const currentSprint = sprints.find((s) => { if (s.status !== 'active') return false - const sprintEnd = new Date(s.endDate) - sprintEnd.setHours(23, 59, 59, 999) - return new Date(s.startDate) <= now && sprintEnd >= now + const sprintStart = parseSprintStart(s.startDate) + const sprintEnd = parseSprintEnd(s.endDate) + return sprintStart <= now && sprintEnd >= now }) // Filter tasks to only show current sprint tasks in Kanban (from ALL projects) @@ -618,8 +619,7 @@ export default function Home() { const now = new Date() const endedSprints = sprints.filter((s) => { if (s.status !== 'active') return false - const sprintEnd = new Date(s.endDate) - sprintEnd.setHours(23, 59, 59, 999) + const sprintEnd = parseSprintEnd(s.endDate) return sprintEnd < now }) diff --git a/src/components/BacklogView.tsx b/src/components/BacklogView.tsx index 36734ac..4a8da52 100644 --- a/src/components/BacklogView.tsx +++ b/src/components/BacklogView.tsx @@ -25,6 +25,7 @@ import { Badge } from "@/components/ui/badge" import { Button } from "@/components/ui/button" import { Plus, GripVertical, ChevronDown, ChevronRight, Calendar } from "lucide-react" import { format, isValid, parseISO } from "date-fns" +import { parseSprintEnd, parseSprintStart } from "@/lib/utils" import { generateAvatarDataUrl } from "@/lib/avatar" const priorityColors: Record = { @@ -310,9 +311,9 @@ export function BacklogView({ searchQuery = "" }: BacklogViewProps) { const now = new Date() const currentSprint = sprints.find((s) => { if (s.status !== "active") return false - const sprintEnd = new Date(s.endDate) - sprintEnd.setHours(23, 59, 59, 999) - return new Date(s.startDate) <= now && sprintEnd >= now + const sprintStart = parseSprintStart(s.startDate) + const sprintEnd = parseSprintEnd(s.endDate) + return sprintStart <= now && sprintEnd >= now }) // Get other sprints (not current) diff --git a/src/lib/utils.ts b/src/lib/utils.ts index bd0c391..635a16b 100644 --- a/src/lib/utils.ts +++ b/src/lib/utils.ts @@ -4,3 +4,30 @@ import { twMerge } from "tailwind-merge" export function cn(...inputs: ClassValue[]) { return twMerge(clsx(inputs)) } + +const DATE_ONLY_PATTERN = /^\d{4}-\d{2}-\d{2}$/ + +function parseDateParts(value: string): [number, number, number] { + const [year, month, day] = value.split("-").map(Number) + return [year, month, day] +} + +export function parseSprintStart(startDate: string): Date { + if (DATE_ONLY_PATTERN.test(startDate)) { + const [year, month, day] = parseDateParts(startDate) + return new Date(year, month - 1, day, 0, 0, 0, 0) + } + + return new Date(startDate) +} + +export function parseSprintEnd(endDate: string): Date { + if (DATE_ONLY_PATTERN.test(endDate)) { + const [year, month, day] = parseDateParts(endDate) + return new Date(year, month - 1, day, 23, 59, 59, 999) + } + + const parsed = new Date(endDate) + parsed.setHours(23, 59, 59, 999) + return parsed +}