Spaces:
Running
Running
| import { format, parseISO } from "date-fns"; | |
| export interface ProjectBarSegment { | |
| startIndex: number; | |
| endIndex: number; | |
| className: string; | |
| label: string; | |
| } | |
| export function buildProjectBarSegment( | |
| dayDates: Date[], | |
| startDate: string, | |
| endDate: string, | |
| name: string, | |
| tentative: boolean, | |
| showTentative: boolean, | |
| ): ProjectBarSegment | null { | |
| if (!showTentative && tentative) return null; | |
| const rangeStart = startDate; | |
| const rangeEnd = endDate; | |
| let startIndex = -1; | |
| let endIndex = -1; | |
| dayDates.forEach((day, index) => { | |
| const key = format(day, "yyyy-MM-dd"); | |
| if (key < rangeStart || key > rangeEnd) return; | |
| if (startIndex === -1) startIndex = index; | |
| endIndex = index; | |
| }); | |
| if (startIndex === -1) return null; | |
| return { | |
| startIndex, | |
| endIndex, | |
| className: tentative ? "project-bar tentative" : "project-bar", | |
| label: name, | |
| }; | |
| } | |
| export function projectBarStyle(segment: ProjectBarSegment, totalDays: number): { left: string; width: string } { | |
| const span = segment.endIndex - segment.startIndex + 1; | |
| return { | |
| left: `${(segment.startIndex / totalDays) * 100}%`, | |
| width: `${(span / totalDays) * 100}%`, | |
| }; | |
| } | |
| export function overlapsVisibleRange( | |
| startDate: string, | |
| endDate: string, | |
| viewStart: Date, | |
| viewEnd: Date, | |
| ): boolean { | |
| const projStart = parseISO(startDate); | |
| const projEnd = parseISO(endDate); | |
| return projStart < viewEnd && projEnd >= viewStart; | |
| } | |