gantt-task-react-powern 0.6.39 → 0.6.41

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sources":["../src/types/public-types.ts","../src/helpers/date-helper.ts","../src/components/task-list/task-list-header.tsx","../src/components/task-list/task-list-table.tsx","../src/components/other/tooltip.tsx","../src/components/other/vertical-scroll.tsx","../src/components/task-list/task-list-columns.ts","../src/components/task-list/task-list.tsx","../src/helpers/calendar-helper.ts","../src/components/grid/grid-body.tsx","../src/components/grid/grid.tsx","../src/components/calendar/top-part-of-calendar.tsx","../src/components/calendar/calendar.tsx","../node_modules/babel-plugin-transform-async-to-promises/helpers.mjs","../src/components/other/arrow.tsx","../src/helpers/bar-helper.ts","../src/helpers/other-helper.ts","../src/components/task-item/bar/bar-display.tsx","../src/components/task-item/bar/bar-date-handle.tsx","../src/components/task-item/bar/bar-progress-handle.tsx","../src/components/task-item/bar/bar.tsx","../src/components/task-item/bar/bar-small.tsx","../src/components/task-item/milestone/milestone.tsx","../src/components/task-item/project/project.tsx","../src/components/task-item/task-item.tsx","../src/components/gantt/task-gantt-content.tsx","../src/components/gantt/task-gantt.tsx","../src/components/other/horizontal-scroll.tsx","../src/components/gantt/gantt.tsx"],"sourcesContent":["export interface CalendarDefinition {\n name: string;\n day_start: string;\n day_end: string;\n week_start: number;\n quarter_start: number;\n shifts: [string, string][];\n off_days: number[];\n holidays: string[];\n}\n\nexport enum ViewMode {\n Hour = \"Hour\",\n QuarterDay = \"Quarter Day\",\n HalfDay = \"Half Day\",\n Day = \"Day\",\n /** ISO-8601 week */\n Week = \"Week\",\n Month = \"Month\",\n Quarter = \"Quarter\",\n Year = \"Year\",\n}\nexport type TaskType = \"task\" | \"milestone\" | \"project\";\nexport type Dependency = \"SS\" | \"SF\" | \"FS\" | \"FF\";\n\nexport declare type DependencyType = {\n id: string;\n type: Dependency;\n};\nexport interface Task {\n id: string;\n optionalId?: string | null;\n type: TaskType;\n name: string;\n start: Date;\n end: Date;\n /**\n * From 0 to 100\n */\n progress: number;\n actualStart: Date;\n actualEnd: Date;\n criticalPathArrows?: Array<{ taskId: string; arrowColor: string ; criticalPathType: string }>;\n styles?: {\n taskProgressColor?: string;\n backgroundColor?: string;\n backgroundSelectedColor?: string;\n progressColor?: string;\n progressSelectedColor?: string;\n criticalPathColor?: string;\n };\n percentComplete?: number | null;\n plannedDuration?: number | null;\n remainingDuration?: number | null;\n actualDuration?: number | null;\n durationType?: string | null;\n depth: number;\n isDisabled?: boolean;\n project?: string;\n dependencies?: DependencyType[];\n hideChildren?: boolean;\n displayOrder?: number;\n childrenCount?: number;\n calendar?: CalendarDefinition;\n}\n\nexport interface EventOption {\n /**\n * Time step value for date changes.\n */\n timeStep?: number;\n /**\n * Invokes on bar select on unselect.\n */\n onSelect?: (task: Task, isSelected: boolean) => void;\n /**\n * Invokes on bar double click.\n */\n onDoubleClick?: (task: Task) => void;\n /**\n * Invokes on bar click.\n */\n onClick?: (task: Task) => void;\n /**\n * Invokes on end and start time change. Chart undoes operation if method return false or error.\n */\n onDateChange?: (\n task: Task,\n children: Task[]\n ) => void | boolean | Promise<void> | Promise<boolean>;\n /**\n * Invokes on progress change. Chart undoes operation if method return false or error.\n */\n onProgressChange?: (\n task: Task,\n children: Task[]\n ) => void | boolean | Promise<void> | Promise<boolean>;\n /**\n * Invokes on delete selected task. Chart undoes operation if method return false or error.\n */\n onDelete?: (task: Task) => void | boolean | Promise<void> | Promise<boolean>;\n /**\n * Invokes on expander on task list\n */\n onExpanderClick?: (task: Task) => void;\n /**\n * Invokes when tasks are multi-selected via checkboxes\n */\n onMultiSelect?: (tasks: Task[]) => void;\n onCalendarError?: (task: Task, reason: string) => void;\n}\n\nexport interface DisplayOption {\n viewMode?: ViewMode;\n viewDate?: Date;\n preStepsCount?: number;\n /**\n * Specifies the month name language. Able formats: ISO 639-2, Java Locale\n */\n locale?: string;\n rtl?: boolean;\n}\n\nexport interface StylingOption {\n headerHeight?: number;\n columnWidth?: number;\n listCellWidth?: string;\n rowHeight?: number;\n ganttHeight?: number;\n barCornerRadius?: number;\n handleWidth?: number;\n fontFamily?: string;\n fontSize?: string;\n /**\n * How many of row width can be taken by task.\n * From 0 to 100\n */\n barFill?: number;\n barProgressColor?: string;\n barProgressSelectedColor?: string;\n barBackgroundColor?: string;\n barBackgroundSelectedColor?: string;\n projectProgressColor?: string;\n projectProgressSelectedColor?: string;\n projectBackgroundColor?: string;\n projectBackgroundSelectedColor?: string;\n milestoneBackgroundColor?: string;\n milestoneBackgroundSelectedColor?: string;\n arrowColor?: string;\n arrowIndent?: number;\n todayColor?: string;\n weekendColor?: string;\n TooltipContent?: React.FC<{\n task: Task;\n fontSize: string;\n fontFamily: string;\n }>;\n TaskListHeader?: React.FC<{\n headerHeight: number;\n rowWidth: string;\n fontFamily: string;\n fontSize: string;\n }>;\n TaskListTable?: React.FC<{\n rowHeight: number;\n rowWidth: string;\n fontFamily: string;\n fontSize: string;\n locale: string;\n tasks: Task[];\n selectedTaskId: string;\n /**\n * Sets selected task by id\n */\n setSelectedTask: (taskId: string) => void;\n onExpanderClick: (task: Task) => void;\n }>;\n taskLabelRenderer?: (Task: Task) => React.ReactNode;\n taskProgressColor?: string;\n delayToRender?: number;\n shouldNotShowLoadingOverlay?: boolean;\n}\n\nexport interface GanttProps extends EventOption, DisplayOption, StylingOption {\n tasks: Task[];\n primaryPath: Task[];\n secondaryPath: Task[];\n leafTasks?: Task[];\n scheduleType: string;\n startDate?: Date;\n endDate?: Date;\n projectCalendar?: CalendarDefinition;\n sliderTime?: number;\n}\n","import { Task, ViewMode } from \"../types/public-types\";\nimport DateTimeFormatOptions = Intl.DateTimeFormatOptions;\nimport DateTimeFormat = Intl.DateTimeFormat;\n\ntype DateHelperScales =\n | \"year\"\n | \"quarter\"\n | \"month\"\n | \"day\"\n | \"hour\"\n | \"minute\"\n | \"second\"\n | \"millisecond\";\n\nconst intlDTCache = {};\nexport const getCachedDateTimeFormat = (\n locString: string | string[],\n opts: DateTimeFormatOptions = {}\n): DateTimeFormat => {\n const key = JSON.stringify([locString, opts]);\n let dtf = intlDTCache[key];\n if (!dtf) {\n dtf = new Intl.DateTimeFormat(locString, opts);\n intlDTCache[key] = dtf;\n }\n return dtf;\n};\n\nexport const addToDate = (\n date: Date,\n quantity: number,\n scale: DateHelperScales\n) => {\n const newDate = new Date(\n date.getFullYear() + (scale === \"year\" ? quantity : 0),\n date.getMonth() + (scale === \"month\" ? quantity : 0),\n date.getDate() + (scale === \"day\" ? quantity : 0),\n date.getHours() + (scale === \"hour\" ? quantity : 0),\n date.getMinutes() + (scale === \"minute\" ? quantity : 0),\n date.getSeconds() + (scale === \"second\" ? quantity : 0),\n date.getMilliseconds() + (scale === \"millisecond\" ? quantity : 0)\n );\n return newDate;\n};\n\nexport const startOfDate = (date: Date, scale: DateHelperScales) => {\n const scores = [\n \"millisecond\",\n \"second\",\n \"minute\",\n \"hour\",\n \"day\",\n \"month\",\n \"quarter\",\n \"year\",\n ];\n\n const shouldReset = (_scale: DateHelperScales) => {\n const maxScore = scores.indexOf(scale);\n return scores.indexOf(_scale) <= maxScore;\n };\n const newDate = new Date(\n date.getFullYear(),\n shouldReset(\"year\") ? 0 : date.getMonth(),\n shouldReset(\"month\") ? 1 : date.getDate(),\n shouldReset(\"day\") ? 0 : date.getHours(),\n shouldReset(\"hour\") ? 0 : date.getMinutes(),\n shouldReset(\"minute\") ? 0 : date.getSeconds(),\n shouldReset(\"second\") ? 0 : date.getMilliseconds()\n );\n return newDate;\n};\n\n/**\n * Returns the start date (midnight) of the fiscal quarter containing `date`.\n * @param quarterStart 0-indexed month that begins Q1 (0=Jan, 4=May, etc.)\n */\nconst getFiscalQuarterStartDate = (date: Date, quarterStart: number): Date => {\n const month = date.getMonth();\n const offset = (month - quarterStart + 12) % 12;\n const qStartMonth = (quarterStart + Math.floor(offset / 3) * 3) % 12;\n let year = date.getFullYear();\n if (qStartMonth > month) year -= 1; // quarter started in the previous calendar year\n return new Date(year, qStartMonth, 1);\n};\n\n/**\n * Default number of columns the chart aims to render across the chart pane\n * for each view mode. The Gantt component sizes columns so that this many\n * fit at the current pane width when the view mode is selected.\n *\n * Modes not listed (Hour / QuarterDay / HalfDay / Year) fall through to the\n * legacy `columnWidth` default.\n */\nexport const VIEW_MODE_DEFAULT_VISIBLE_COUNT: Partial<Record<ViewMode, number>> = {\n [ViewMode.Day]: 14,\n [ViewMode.Week]: 6,\n [ViewMode.Month]: 6,\n [ViewMode.Quarter]: 4,\n};\n\n/**\n * Maximum number of columns the chart will show at once, even when the user\n * widens the chart pane with the resize bar. The Gantt component clamps\n * column width upward so visible count never exceeds this — overflow becomes\n * horizontal scroll.\n */\nexport const VIEW_MODE_MAX_VISIBLE_COUNT: Partial<Record<ViewMode, number>> = {\n [ViewMode.Day]: 30,\n [ViewMode.Week]: 13,\n [ViewMode.Month]: 12,\n [ViewMode.Quarter]: 8,\n};\n\nexport const ganttDateRange = (\n tasks: Task[],\n viewMode: ViewMode,\n preStepsCount: number,\n quarterStart: number = 0\n) => {\n let newStartDate: Date =\n tasks[0]?.start.getTime() !== 0\n ? tasks[0]?.start || new Date()\n : new Date();\n let newEndDate: Date =\n tasks[0]?.end.getTime() !== 0 ? tasks[0]?.end || new Date() : new Date();\n\n for (const task of tasks) {\n if (task.start && task.start.getTime() !== 0 && task.start < newStartDate) {\n newStartDate = task.start;\n }\n if (task.end && task.end.getTime() !== 0 && task.end > newEndDate) {\n newEndDate = task.end;\n }\n if (\n task.actualStart &&\n task.actualStart.getTime() !== 0 &&\n task.actualStart < newStartDate\n ) {\n newStartDate = task.actualStart;\n }\n if (\n task.actualEnd &&\n task.actualEnd.getTime() !== 0 &&\n task.actualEnd > newEndDate\n ) {\n newEndDate = task.actualEnd;\n }\n }\n\n switch (viewMode) {\n case ViewMode.Year:\n newStartDate = addToDate(newStartDate, -1, \"year\");\n newStartDate = startOfDate(newStartDate, \"year\");\n newEndDate = addToDate(newEndDate, 1, \"year\");\n newEndDate = startOfDate(newEndDate, \"year\");\n break;\n case ViewMode.Quarter: {\n newStartDate = addToDate(newStartDate, -1 * preStepsCount, \"year\");\n newStartDate = getFiscalQuarterStartDate(newStartDate, quarterStart);\n newEndDate = addToDate(newEndDate, 1, \"year\");\n const endQStart = getFiscalQuarterStartDate(newEndDate, quarterStart);\n newEndDate =\n endQStart < newEndDate ? addToDate(endQStart, 3, \"month\") : endQStart;\n break;\n }\n case ViewMode.Month:\n newStartDate = addToDate(newStartDate, -1 * preStepsCount, \"month\");\n newStartDate = startOfDate(newStartDate, \"month\");\n newEndDate = addToDate(newEndDate, 1, \"year\");\n newEndDate = startOfDate(newEndDate, \"year\");\n break;\n case ViewMode.Week:\n newStartDate = startOfDate(newStartDate, \"day\");\n newStartDate = addToDate(\n getMonday(newStartDate),\n -7 * preStepsCount,\n \"day\"\n );\n newEndDate = startOfDate(newEndDate, \"day\");\n newEndDate = addToDate(newEndDate, 1.5, \"month\");\n break;\n case ViewMode.Day:\n newStartDate = startOfDate(newStartDate, \"day\");\n newStartDate = addToDate(newStartDate, -1 * preStepsCount, \"day\");\n newEndDate = startOfDate(newEndDate, \"day\");\n newEndDate = addToDate(newEndDate, 19, \"day\");\n break;\n case ViewMode.QuarterDay:\n newStartDate = startOfDate(newStartDate, \"day\");\n newStartDate = addToDate(newStartDate, -1 * preStepsCount, \"day\");\n newEndDate = startOfDate(newEndDate, \"day\");\n newEndDate = addToDate(newEndDate, 66, \"hour\"); // 24(1 day)*3 - 6\n break;\n case ViewMode.HalfDay:\n newStartDate = startOfDate(newStartDate, \"day\");\n newStartDate = addToDate(newStartDate, -1 * preStepsCount, \"day\");\n newEndDate = startOfDate(newEndDate, \"day\");\n newEndDate = addToDate(newEndDate, 108, \"hour\"); // 24(1 day)*5 - 12\n break;\n case ViewMode.Hour:\n newStartDate = startOfDate(newStartDate, \"hour\");\n newStartDate = addToDate(newStartDate, -1 * preStepsCount, \"hour\");\n newEndDate = startOfDate(newEndDate, \"day\");\n newEndDate = addToDate(newEndDate, 1, \"day\");\n break;\n }\n return [newStartDate, newEndDate];\n};\n\nexport const seedDates = (\n startDate: Date,\n endDate: Date,\n viewMode: ViewMode\n) => {\n let currentDate: Date = new Date(startDate);\n const dates: Date[] = [currentDate];\n while (currentDate < endDate) {\n switch (viewMode) {\n case ViewMode.Year:\n currentDate = addToDate(currentDate, 1, \"year\");\n break;\n case ViewMode.Quarter:\n currentDate = addToDate(currentDate, 3, \"month\");\n break;\n case ViewMode.Month:\n currentDate = addToDate(currentDate, 1, \"month\");\n break;\n case ViewMode.Week:\n currentDate = addToDate(currentDate, 7, \"day\");\n break;\n case ViewMode.Day:\n currentDate = addToDate(currentDate, 1, \"day\");\n break;\n case ViewMode.HalfDay:\n currentDate = addToDate(currentDate, 12, \"hour\");\n break;\n case ViewMode.QuarterDay:\n currentDate = addToDate(currentDate, 6, \"hour\");\n break;\n case ViewMode.Hour:\n currentDate = addToDate(currentDate, 1, \"hour\");\n break;\n }\n dates.push(currentDate);\n }\n return dates;\n};\n\nexport const getLocaleMonth = (date: Date, locale: string) => {\n let bottomValue = getCachedDateTimeFormat(locale, {\n month: \"long\",\n }).format(date);\n bottomValue = bottomValue.replace(\n bottomValue[0],\n bottomValue[0].toLocaleUpperCase()\n );\n return bottomValue;\n};\n\nexport const getLocalDayOfWeek = (\n date: Date,\n locale: string,\n format?: \"long\" | \"short\" | \"narrow\" | undefined\n) => {\n let bottomValue = getCachedDateTimeFormat(locale, {\n weekday: format,\n }).format(date);\n bottomValue = bottomValue.replace(\n bottomValue[0],\n bottomValue[0].toLocaleUpperCase()\n );\n return bottomValue;\n};\n\n/**\n * Returns monday of current week\n * @param date date for modify\n */\nconst getMonday = (date: Date) => {\n const day = date.getDay();\n const diff = date.getDate() - day + (day === 0 ? -6 : 1); // adjust when day is sunday\n return new Date(date.setDate(diff));\n};\n\nexport const getWeekNumberISO8601 = (date: Date) => {\n const tmpDate = new Date(date.valueOf());\n const dayNumber = (tmpDate.getDay() + 6) % 7;\n tmpDate.setDate(tmpDate.getDate() - dayNumber + 3);\n const firstThursday = tmpDate.valueOf();\n tmpDate.setMonth(0, 1);\n if (tmpDate.getDay() !== 4) {\n tmpDate.setMonth(0, 1 + ((4 - tmpDate.getDay() + 7) % 7));\n }\n const weekNumber = (\n 1 + Math.ceil((firstThursday - tmpDate.valueOf()) / 604800000)\n ).toString();\n\n if (weekNumber.length === 1) {\n return `0${weekNumber}`;\n } else {\n return weekNumber;\n }\n};\n\nexport const getDaysInMonth = (month: number, year: number) => {\n return new Date(year, month + 1, 0).getDate();\n};\n","import React from \"react\";\nimport styles from \"./task-list-header.module.css\";\n\nexport const TaskListHeaderDefault: React.FC<{\n headerHeight: number;\n rowWidth: string;\n fontFamily: string;\n fontSize: string;\n scheduleType: string;\n allSelected?: boolean;\n onSelectAll?: (selected: boolean) => void;\n columnWidths?: Record<string, number>;\n onColumnResize?: (colId: string, width: number) => void;\n}> = ({\n headerHeight,\n fontFamily,\n fontSize,\n rowWidth,\n scheduleType,\n allSelected,\n onSelectAll,\n columnWidths,\n onColumnResize,\n}) => {\n const widthOf = (colId: string, factor: number) =>\n columnWidths?.[colId] ?? parseInt(rowWidth) * factor;\n\n // Begin a column-resize drag. Mirrors the panel resizer in gantt.tsx:\n // record the start X + width, then update the column width on each mousemove.\n const startResize =\n (colId: string, startWidth: number) => (e: React.MouseEvent) => {\n if (!onColumnResize) return;\n e.preventDefault();\n e.stopPropagation();\n const startX = e.clientX;\n const onMove = (ev: MouseEvent) => {\n onColumnResize(colId, startWidth + (ev.clientX - startX));\n };\n const onUp = () => {\n document.removeEventListener(\"mousemove\", onMove);\n document.removeEventListener(\"mouseup\", onUp);\n };\n document.addEventListener(\"mousemove\", onMove);\n document.addEventListener(\"mouseup\", onUp);\n };\n\n const cell = (\n colId: string,\n factor: number,\n content: React.ReactNode,\n opts: { title?: string; resizable?: boolean } = {}\n ) => {\n const { title, resizable = true } = opts;\n const width = widthOf(colId, factor);\n return (\n <div\n className={styles.ganttTable_HeaderItem}\n style={{ minWidth: width, maxWidth: width, position: \"relative\" }}\n title={title}\n >\n <div className={styles.ganttTable_HeaderItemText}>{content}</div>\n {resizable && onColumnResize && (\n <div\n className={styles.ganttTable_HeaderResizeHandle}\n style={{ height: headerHeight - 2 }}\n onMouseDown={startResize(colId, width)}\n />\n )}\n </div>\n );\n };\n\n return (\n <div\n className={styles.ganttTable}\n style={{\n fontFamily: fontFamily,\n fontSize: fontSize,\n }}\n >\n <div\n className={styles.ganttTable_Header}\n style={{\n height: headerHeight - 2,\n }}\n >\n {onSelectAll &&\n cell(\n \"select\",\n 0.3,\n <input\n type=\"checkbox\"\n checked={allSelected}\n onChange={e => onSelectAll(e.target.checked)}\n />,\n { resizable: false }\n )}\n {cell(\"id\", 0.8, \"ID\")}\n {cell(\"wbs\", 0.8, \"WBS Code / Activity ID\")}\n {cell(\"name\", 1.8, \"IM TESTING\")}\n {cell(\"plannedStart\", 0.6, \"Planned Start\", { title: \"Planned Start\" })}\n {cell(\"plannedEnd\", 0.6, \"Planned End\", { title: \"Planned End\" })}\n {scheduleType === \"lookAhead\" && (\n <React.Fragment>\n {cell(\"actualStart\", 0.6, \"Actual Start\", { title: \"Actual Start\" })}\n {cell(\"actualEnd\", 0.6, \"Actual End\", { title: \"Actual End\" })}\n </React.Fragment>\n )}\n {scheduleType === \"main\" && (\n <React.Fragment>\n {cell(\"percentComplete\", 0.6, \"% Complete\", { title: \"% Complete\" })}\n {cell(\"plannedDuration\", 0.6, \"Planned Duration\", {\n title: \"Planned Duration\",\n })}\n {cell(\"remainingDuration\", 0.7, \"Remaining Duration\", {\n title: \"Remaining Duration\",\n })}\n {cell(\"actualDuration\", 0.6, \"Actual Duration\", {\n title: \"Actual Duration\",\n })}\n {cell(\"durationType\", 0.8, \"Duration Type\", {\n title: \"Duration Type\",\n })}\n </React.Fragment>\n )}\n </div>\n </div>\n );\n};\n","import React, { useMemo } from \"react\";\nimport { VirtualItem } from \"@tanstack/react-virtual\";\nimport styles from \"./task-list-table.module.css\";\nimport { Task } from \"../../types/public-types\";\nimport { getParentWbs } from \"../gantt/gantt\";\n\nconst localeDateStringCache = {};\nconst toLocaleDateStringFactory =\n (locale: string) =>\n (date: Date, dateTimeOptions: Intl.DateTimeFormatOptions): string => {\n if (!date || date.getTime() === 0) return \"\"; // Handle invalid dates\n const key = date.toString();\n let lds = localeDateStringCache[key];\n if (!lds) {\n lds = date.toLocaleDateString(locale, dateTimeOptions);\n localeDateStringCache[key] = lds;\n }\n return lds;\n };\nconst dateTimeOptions: Intl.DateTimeFormatOptions = {\n year: \"numeric\",\n month: \"numeric\",\n day: \"numeric\",\n};\n\nexport const TaskListTableDefault: React.FC<{\n rowHeight: number;\n rowWidth: string;\n fontFamily: string;\n fontSize: string;\n locale: string;\n tasks: Task[];\n scheduleType: string;\n leafTasks: Task[];\n selectedTaskId: string;\n setSelectedTask: (taskId: string) => void;\n onExpanderClick: (task: Task) => void;\n selectedTasks?: string[];\n onTaskSelect?: (taskId: string, selected: boolean) => void;\n taskLabelRenderer?: (Task: Task) => React.ReactNode;\n virtualItems?: VirtualItem[];\n columnWidths?: Record<string, number>;\n}> = ({\n rowHeight,\n rowWidth,\n tasks,\n scheduleType,\n leafTasks,\n fontFamily,\n fontSize,\n locale,\n onExpanderClick,\n selectedTasks = [],\n onTaskSelect,\n taskLabelRenderer = t => \" \" + t.name,\n virtualItems,\n columnWidths,\n}) => {\n // Per-column widths shared with the header (so resize stays in sync); falls\n // back to the default factor × rowWidth when no width has been set.\n const widthOf = (colId: string, factor: number) =>\n columnWidths?.[colId] ?? parseInt(rowWidth) * factor;\n const toLocaleDateString = useMemo(\n () => toLocaleDateStringFactory(locale),\n [locale]\n );\n const leafTaskIds = useMemo(\n () => new Set(leafTasks.map(t => t.id)),\n [leafTasks]\n );\n\n // Checks if the task has a selected ancestor by traversing the WBS hierarchy\n const hasSelectedAncestor = (taskId: string, selectedSet: Set<string>, allTasks: Task[]): boolean => {\n const task = allTasks.find(t => t.id === taskId);\n if (!task) return false;\n const parentWbs = getParentWbs(task.id);\n if (!parentWbs) return false;\n if (selectedSet.has(parentWbs)) return true;\n return hasSelectedAncestor(parentWbs, selectedSet, allTasks);\n };\n\n const itemsToRender = virtualItems || tasks.map((_, index) => ({ index, start: index * rowHeight, size: rowHeight, key: index, end: (index + 1) * rowHeight, lane: 0, measureElement: () => {} }));\n\n return (\n <div\n className={styles.taskListWrapper}\n style={{\n fontFamily: fontFamily,\n fontSize: fontSize,\n }}\n >\n {itemsToRender.map(vi => {\n const t = tasks[vi.index];\n let expanderSymbol = \"\";\n if (!(leafTaskIds.has(t.id) || t.type=== \"milestone\")) {\n if (t.hideChildren === false) {\n expanderSymbol = \"▼\";\n } else if (t.hideChildren === true) {\n expanderSymbol = \"►\";\n }\n }\n\n const isSelected = selectedTasks.includes(t.id);\n const isAncestorSelected = hasSelectedAncestor(t.id, new Set(selectedTasks), tasks);\n\n return (\n <div\n key={`${vi.key}`}\n data-index={vi.index}\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n width: \"100%\",\n height: `${vi.size}px`,\n transform: `translateY(${vi.start}px)`,\n }}\n >\n <div\n className={\n t.type === \"milestone\"\n ? styles.taskListMilestoneRow\n : scheduleType === \"lookAhead\"\n ? styles.taskListLookAheadRow\n : styles.taskListTableRow\n }\n style={{ height: rowHeight }}\n key={`${t.id}row`}\n >\n {onTaskSelect && (\n <div\n className={styles.taskListCell}\n style={{\n minWidth: widthOf(\"select\", 0.3),\n maxWidth: widthOf(\"select\", 0.3),\n }}\n >\n <div className={styles.taskListText} style={{ \n display: \"flex\", \n justifyContent: \"center\", \n alignItems: \"center\",\n height: \"100%\",\n paddingLeft: \"0\",\n paddingRight: \"0\"\n }}>\n <input \n type=\"checkbox\" \n checked={isSelected}\n disabled={isAncestorSelected}\n onChange={(e) => onTaskSelect(t.id, e.target.checked)}\n />\n </div>\n </div>\n )}\n <div\n className={styles.taskListCell}\n style={{\n minWidth: widthOf(\"id\", 0.8),\n maxWidth: widthOf(\"id\", 0.8),\n }}\n title={t.id}\n >\n <div\n className={styles.taskListNameWrapper}\n style={{ paddingLeft: `${t.depth * 4}px` }}\n >\n {!(leafTaskIds.has(t.id) || t.type=== \"milestone\") ? (\n <div\n className={styles.taskListExpander}\n onClick={() => onExpanderClick(t)}\n >\n \n {expanderSymbol}\n </div>\n ) : (\n <div className={styles.taskListExpanderPlaceholder}></div>\n )}\n <div className={styles.taskListText}>\n {t.id}{\" \"}\n {t.actualEnd.getTime() > 0 &&\n t.actualEnd.getTime() < Date.now() ? (\n <span\n title=\"Task Complete\"\n style={{ color: \"limegreen\", fontSize: \"16px\" }}\n >\n ✔\n </span>\n ) : (\n \"\"\n )}\n </div>\n </div>\n </div>\n <div\n className={styles.taskListCell}\n style={{\n minWidth: widthOf(\"wbs\", 0.8),\n maxWidth: widthOf(\"wbs\", 0.8),\n }}\n title={t.optionalId?t.optionalId:\"\"}\n >\n {t.optionalId}\n </div>\n <div\n className={styles.taskListCell}\n style={{\n minWidth: widthOf(\"name\", 1.8),\n maxWidth: widthOf(\"name\", 1.8),\n }}\n title={t.name}\n >\n <div className={styles.taskListText}>{taskLabelRenderer(t)}</div>\n </div>\n <div\n className={styles.taskListCell}\n style={{\n minWidth: widthOf(\"plannedStart\", 0.6),\n maxWidth: widthOf(\"plannedStart\", 0.6),\n }}\n >\n <div className={styles.taskListText}>\n &nbsp;{toLocaleDateString(t.start, dateTimeOptions)}\n </div>\n </div>\n <div\n className={styles.taskListCell}\n style={{\n minWidth: widthOf(\"plannedEnd\", 0.6),\n maxWidth: widthOf(\"plannedEnd\", 0.6),\n }}\n >\n <div className={styles.taskListText}>\n &nbsp;{toLocaleDateString(t.end, dateTimeOptions)}\n </div>\n </div>\n {scheduleType === \"lookAhead\" && (\n <div\n className={styles.taskListCell}\n style={{\n minWidth: widthOf(\"actualStart\", 0.6),\n maxWidth: widthOf(\"actualStart\", 0.6),\n }}\n >\n <div className={styles.taskListText}>\n &nbsp;{toLocaleDateString(t.actualStart, dateTimeOptions)}\n </div>\n </div>\n )}\n {scheduleType === \"lookAhead\" && (\n <div\n className={styles.taskListCell}\n style={{\n minWidth: widthOf(\"actualEnd\", 0.6),\n maxWidth: widthOf(\"actualEnd\", 0.6),\n }}\n >\n <div className={styles.taskListText}>\n &nbsp;{toLocaleDateString(t.actualEnd, dateTimeOptions)}\n </div>\n </div>\n )}\n {scheduleType === \"main\" && (() => {\n const percentComplete = t.percentComplete != null ? t.percentComplete : (t.progress ?? 0);\n const plannedDuration = t.plannedDuration != null ? t.plannedDuration : null;\n const remainingDuration = plannedDuration != null\n ? Math.max(Math.round(plannedDuration - (plannedDuration * (percentComplete / 100))), 0)\n : null;\n const actualDuration = (() => {\n if (!t.actualStart || t.actualStart.getTime() === 0) return null;\n const endRef = (t.actualEnd && t.actualEnd.getTime() > 0) ? t.actualEnd : new Date();\n return Math.ceil((endRef.getTime() - t.actualStart.getTime()) / (1000 * 60 * 60 * 24));\n })();\n return (\n <React.Fragment>\n <div\n className={styles.taskListCell}\n style={{\n minWidth: widthOf(\"percentComplete\", 0.6),\n maxWidth: widthOf(\"percentComplete\", 0.6),\n }}\n >\n <div className={styles.taskListText}>\n &nbsp;{percentComplete != null ? `${percentComplete}%` : \"\"}\n </div>\n </div>\n <div\n className={styles.taskListCell}\n style={{\n minWidth: widthOf(\"plannedDuration\", 0.6),\n maxWidth: widthOf(\"plannedDuration\", 0.6),\n }}\n >\n <div className={styles.taskListText}>\n &nbsp;{plannedDuration != null ? plannedDuration : \"\"}\n </div>\n </div>\n <div\n className={styles.taskListCell}\n style={{\n minWidth: widthOf(\"remainingDuration\", 0.7),\n maxWidth: widthOf(\"remainingDuration\", 0.7),\n }}\n >\n <div className={styles.taskListText}>\n &nbsp;{remainingDuration != null ? remainingDuration : \"\"}\n </div>\n </div>\n <div\n className={styles.taskListCell}\n style={{\n minWidth: widthOf(\"actualDuration\", 0.6),\n maxWidth: widthOf(\"actualDuration\", 0.6),\n }}\n >\n <div className={styles.taskListText}>\n &nbsp;{actualDuration != null ? actualDuration : \"\"}\n </div>\n </div>\n <div\n className={styles.taskListCell}\n style={{\n minWidth: widthOf(\"durationType\", 0.8),\n maxWidth: widthOf(\"durationType\", 0.8),\n }}\n >\n <div className={styles.taskListText}>\n &nbsp;{t.durationType ?? \"Activity Calendar\"}\n </div>\n </div>\n </React.Fragment>\n );\n })()}\n </div>\n </div>\n );\n })}\n </div>\n );\n};","import React, { useRef, useEffect, useState } from \"react\";\nimport { Task } from \"../../types/public-types\";\nimport { BarTask } from \"../../types/bar-task\";\nimport styles from \"./tooltip.module.css\";\n\nexport type TooltipProps = {\n task: BarTask;\n type: string;\n arrowIndent: number;\n rtl: boolean;\n svgContainerHeight: number;\n svgContainerWidth: number;\n svgWidth: number;\n headerHeight: number;\n taskListWidth: number;\n scrollX: number;\n scrollY: number;\n rowHeight: number;\n fontSize: string;\n fontFamily: string;\n TooltipContent: React.FC<{\n task: Task;\n fontSize: string;\n fontFamily: string;\n type: string;\n }>;\n isDragging?: boolean;\n};\nexport const Tooltip: React.FC<TooltipProps> = ({\n task,\n type,\n rowHeight,\n rtl,\n svgContainerHeight,\n svgContainerWidth,\n scrollX,\n scrollY,\n arrowIndent,\n fontSize,\n fontFamily,\n headerHeight,\n taskListWidth,\n TooltipContent,\n isDragging,\n}) => {\n const tooltipRef = useRef<HTMLDivElement | null>(null);\n const [relatedY, setRelatedY] = useState(0);\n const [relatedX, setRelatedX] = useState(0);\n useEffect(() => {\n if (tooltipRef.current) {\n const tooltipHeight = tooltipRef.current.offsetHeight * 1.1;\n const tooltipWidth = tooltipRef.current.offsetWidth * 1.1;\n\n let newRelatedY = task.index * rowHeight - scrollY + headerHeight;\n let newRelatedX: number;\n\n // During drag: pin to top-right corner of chart area so it never blocks the bar\n if (isDragging) {\n newRelatedX = taskListWidth + svgContainerWidth - tooltipWidth - 10;\n newRelatedY = headerHeight + 5;\n setRelatedY(newRelatedY);\n setRelatedX(newRelatedX);\n return;\n }\n\n if (rtl) {\n newRelatedX = task.x1 - arrowIndent * 1.5 - tooltipWidth - scrollX;\n if (newRelatedX < 0) {\n newRelatedX = task.x2 + arrowIndent * 1.5 - scrollX;\n }\n const tooltipLeftmostPoint = tooltipWidth + newRelatedX;\n if (tooltipLeftmostPoint > svgContainerWidth) {\n newRelatedX = svgContainerWidth - tooltipWidth;\n newRelatedY += rowHeight;\n }\n } else {\n newRelatedX =\n type == \"planned\"\n ? task.x2 + arrowIndent * 1.5 + taskListWidth - scrollX\n : task.actualx2 + arrowIndent * 1.5 + taskListWidth - scrollX;\n const tooltipLeftmostPoint = tooltipWidth + newRelatedX;\n const fullChartWidth = taskListWidth + svgContainerWidth;\n if (tooltipLeftmostPoint > fullChartWidth) {\n newRelatedX =\n type == \"planned\"\n ? task.x1 +\n taskListWidth -\n arrowIndent * 1.5 -\n scrollX -\n tooltipWidth\n : task.actualx1 +\n taskListWidth -\n arrowIndent * 1.5 -\n scrollX -\n tooltipWidth;\n }\n if (newRelatedX < taskListWidth) {\n newRelatedX = svgContainerWidth + taskListWidth - tooltipWidth;\n newRelatedY += rowHeight;\n }\n }\n\n const tooltipLowerPoint = tooltipHeight + newRelatedY - scrollY;\n if (tooltipLowerPoint > svgContainerHeight - scrollY) {\n newRelatedY = svgContainerHeight - tooltipHeight;\n }\n setRelatedY(newRelatedY);\n setRelatedX(newRelatedX);\n }\n }, [\n tooltipRef,\n task,\n arrowIndent,\n scrollX,\n scrollY,\n headerHeight,\n taskListWidth,\n rowHeight,\n svgContainerHeight,\n svgContainerWidth,\n rtl,\n isDragging,\n ]);\n\n return (\n <div\n ref={tooltipRef}\n className={\n relatedX\n ? styles.tooltipDetailsContainer\n : styles.tooltipDetailsContainerHidden\n }\n style={{ left: relatedX, top: relatedY }}\n >\n <TooltipContent\n task={task}\n fontSize={fontSize}\n fontFamily={fontFamily}\n type={type}\n />\n </div>\n );\n};\n\n// Function used to calculate the off time (combination of off days and holidays) for a given task\nfunction getOffTime(task: any, taskStart: any, taskEnd: any, _message: any) {\n\n let start = taskStart.getTime();\n let end = taskEnd.getTime();\n\n // Figure out which weeks the task starts and ends on using some unix timestamp math\n // Convert time from milliseconds to days, add 4 to get to first sunday (0 represents a Thursday in unix time), then floor divide by 0 to get the week number\n let startWeek = Math.floor(((start / 86400000) + 4) / 7);\n let endWeek = Math.floor(((end / 86400000) + 4) / 7);\n let offTime = 0;\n\n // Get off time for each child. If task has no calendar, off time is naturally 0\n if (task.calendar) {\n\n // Off Day Calculation\n if (task.calendar.off_days && task.calendar.off_days.length) {\n for (let d = 0; d < task.calendar.off_days.length || 0; d++) {\n for (let w = startWeek; w <= endWeek; w++) {\n let dayOfTheWeek = task.calendar.off_days[d];\n // Check each week to see if an off day is within duration\n // Notice this is the inverse operation of the milliseconds to week operation performed above\n let offDay = 86400000 * ((7 * w - 4) + dayOfTheWeek);\n // If so...\n if (offDay >= start && offDay <= end) {\n // ...mark a day's worth of time to be subtracted from total duration\n offTime += 86400000;\n }\n }\n }\n }\n\n // Holiday Calculation\n if (task.calendar.holidays && task.calendar.holidays.length) {\n // console.debug(task.calendar.holidays);\n for (let h = 0; h < task.calendar.holidays.length || 0; h++) {\n // Check each holiday to see if it is within duration\n let holiday = task.calendar.holidays[h];\n let holiday_timestamp = new Date(holiday).getTime()\n // If so...\n if (holiday_timestamp >= start && holiday_timestamp <= end) {\n // ...mark a day's worth of time to be subtracted from total duration\n offTime += 86400000;\n }\n }\n }\n }\n\n return offTime;\n}\n\nexport const StandardTooltipContent: React.FC<{\n task: Task;\n fontSize: string;\n fontFamily: string;\n type: string;\n}> = ({ task, fontSize, fontFamily, type }) => {\n const style = {\n fontSize,\n fontFamily,\n };\n\n // Compute duration dynamically from the current dates (updated in real-time during drag)\n const computedPlannedDuration =\n task.start && task.end && task.end.getTime() - task.start.getTime() > 0\n ? Math.max(1, Math.round((task.end.getTime() - task.start.getTime() - getOffTime(task, task.start, task.end, \"planned\")) / (1000 * 60 * 60 * 24)))\n : task.plannedDuration ?? 0;\n\n const computedActualDuration =\n task.actualStart && task.actualEnd && task.actualEnd.getTime() - task.actualStart.getTime() > 0\n ? Math.max(1, Math.round((task.actualEnd.getTime() - task.actualStart.getTime() - getOffTime(task, task.actualStart, task.actualEnd, \"actual\")) / (1000 * 60 * 60 * 24)))\n : task.actualDuration ?? 0;\n\n if (type == \"planned\")\n return (\n <div className={styles.tooltipDefaultContainer} style={style}>\n <b\n style={{ fontSize: fontSize + 6 }}\n >{`${task.name}: Planned dates: `}</b>\n <b>{`${\n task.start.getMonth() + 1\n }/${task.start.getDate()}/${task.start.getFullYear()} - ${\n task.end.getMonth() + 1\n }/${task.end.getDate()}/${task.end.getFullYear()}`}</b>\n {task.end.getTime() - task.start.getTime() !== 0 && (\n <p\n className={styles.tooltipDefaultContainerParagraph}\n >{`Duration: ${computedPlannedDuration} day(s)`}</p>\n )}\n\n <p className={styles.tooltipDefaultContainerParagraph}>\n {!!task.progress && `Progress: ${task.progress} %`}\n </p>\n </div>\n );\n else\n return (\n <div className={styles.tooltipDefaultContainer} style={style}>\n <b\n style={{ fontSize: fontSize + 6 }}\n >{`${task.name}: Actual dates: `}</b>\n <b>{`${\n task.actualStart.getMonth() + 1\n }/${task.actualStart.getDate()}/${task.actualStart.getFullYear()} - ${\n task.actualEnd.getMonth() + 1\n }/${task.actualEnd.getDate()}/${task.actualEnd.getFullYear()}`}</b>\n {task.actualEnd.getTime() - task.actualStart.getTime() !== 0 && (\n <p\n className={styles.tooltipDefaultContainerParagraph}\n >{`Duration: ${computedActualDuration} day(s)`}</p>\n )}\n\n <p className={styles.tooltipDefaultContainerParagraph}>\n {!!task.progress && `Progress: ${task.progress} %`}\n </p>\n </div>\n );\n};\n","import React, { SyntheticEvent, useRef, useEffect } from \"react\";\nimport styles from \"./vertical-scroll.module.css\";\n\nexport const VerticalScroll: React.FC<{\n scroll: number;\n ganttHeight: number;\n ganttFullHeight: number;\n headerHeight: number;\n rtl: boolean;\n onScroll: (event: SyntheticEvent<HTMLDivElement>) => void;\n}> = ({\n scroll,\n ganttHeight,\n ganttFullHeight,\n headerHeight,\n rtl,\n onScroll,\n}) => {\n const scrollRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (scrollRef.current) {\n scrollRef.current.scrollTop = scroll;\n }\n }, [scroll]);\n\n return (\n <div\n style={{\n height: ganttHeight,\n marginTop: headerHeight,\n marginLeft: rtl ? \"\" : \"-1rem\",\n marginRight: \"1rem\",\n }}\n className={styles.scroll}\n onScroll={onScroll}\n ref={scrollRef}\n >\n <div style={{ height: ganttFullHeight, width: 1 }} />\n </div>\n );\n};\n","/**\n * Single source of truth for the left task-list columns: their stable ids and\n * default width factors (multiplied by `parseInt(rowWidth)`). Both the header\n * and the table read these ids when looking up per-column widths so resizing a\n * column keeps the two in sync.\n */\nexport type TaskListColumn = {\n id: string;\n factor: number;\n};\n\nexport function getTaskListColumns(\n scheduleType: string,\n hasCheckbox: boolean\n): TaskListColumn[] {\n const columns: TaskListColumn[] = [];\n\n if (hasCheckbox) columns.push({ id: \"select\", factor: 0.3 });\n\n columns.push(\n { id: \"id\", factor: 0.8 },\n { id: \"wbs\", factor: 0.8 },\n { id: \"name\", factor: 1.8 },\n { id: \"plannedStart\", factor: 0.6 },\n { id: \"plannedEnd\", factor: 0.6 }\n );\n\n if (scheduleType === \"lookAhead\") {\n columns.push(\n { id: \"actualStart\", factor: 0.6 },\n { id: \"actualEnd\", factor: 0.6 }\n );\n }\n\n if (scheduleType === \"main\") {\n columns.push(\n { id: \"percentComplete\", factor: 0.6 },\n { id: \"plannedDuration\", factor: 0.6 },\n { id: \"remainingDuration\", factor: 0.7 },\n { id: \"actualDuration\", factor: 0.6 },\n { id: \"durationType\", factor: 0.8 }\n );\n }\n\n return columns;\n}\n\n/** Minimum width (px) a column can be dragged down to. */\nexport const MIN_COLUMN_WIDTH = 40;\n\n/** Build the default width map (px) for the current column set. */\nexport function buildDefaultColumnWidths(\n scheduleType: string,\n hasCheckbox: boolean,\n rowWidth: string\n): Record<string, number> {\n const base = parseInt(rowWidth) || 0;\n const widths: Record<string, number> = {};\n for (const col of getTaskListColumns(scheduleType, hasCheckbox)) {\n widths[col.id] = base * col.factor;\n }\n return widths;\n}\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useVirtualizer, VirtualItem } from \"@tanstack/react-virtual\";\nimport { EventOption } from \"../../types/public-types\";\nimport { BarTask } from \"../../types/bar-task\";\nimport { Task } from \"../../types/public-types\";\nimport { getParentWbs } from \"../gantt/gantt\";\nimport { buildDefaultColumnWidths, MIN_COLUMN_WIDTH } from \"./task-list-columns\";\nimport styles from \"./task-list.module.css\";\n\nexport type TaskListProps = {\n headerHeight: number;\n rowWidth: string;\n fontFamily: string;\n fontSize: string;\n rowHeight: number;\n ganttHeight: number;\n scrollY: number;\n locale: string;\n tasks: Task[];\n scheduleType: string;\n leafTasks: Task[];\n taskListRef: React.RefObject<HTMLDivElement>;\n horizontalContainerClass?: string;\n selectedTask: BarTask | undefined;\n setSelectedTask: (task: string) => void;\n onExpanderClick: (task: Task) => void;\n taskLabelRenderer?: (Task: Task) => React.ReactNode;\n TaskListHeader: React.FC<{\n headerHeight: number;\n rowWidth: string;\n fontFamily: string;\n fontSize: string;\n scheduleType: string;\n allSelected?: boolean;\n onSelectAll?: (selected: boolean) => void;\n columnWidths?: Record<string, number>;\n onColumnResize?: (colId: string, width: number) => void;\n }>;\n TaskListTable: React.FC<{\n rowHeight: number;\n rowWidth: string;\n fontFamily: string;\n fontSize: string;\n locale: string;\n tasks: Task[];\n scheduleType: string;\n leafTasks: Task[];\n selectedTaskId: string;\n setSelectedTask: (taskId: string) => void;\n onExpanderClick: (task: Task) => void;\n selectedTasks?: string[];\n onTaskSelect?: (taskId: string, selected: boolean) => void;\n taskLabelRenderer?: (Task: Task) => React.ReactNode;\n virtualItems?: VirtualItem[];\n columnWidths?: Record<string, number>;\n }>;\n containerWidth?: number;\n containerMaxWidth?: number;\n onContentWidthChange?: (width: number) => void;\n innerScrollRef?: React.RefObject<HTMLDivElement>;\n horizontalContainerRef?: React.RefObject<HTMLDivElement>;\n} & EventOption;\n\nexport const TaskList: React.FC<TaskListProps> = ({\n headerHeight,\n fontFamily,\n fontSize,\n rowWidth,\n rowHeight,\n scrollY,\n tasks,\n scheduleType,\n leafTasks,\n selectedTask,\n setSelectedTask,\n onExpanderClick,\n locale,\n ganttHeight,\n taskListRef,\n horizontalContainerClass,\n TaskListHeader,\n TaskListTable,\n taskLabelRenderer,\n onMultiSelect,\n containerWidth,\n containerMaxWidth,\n onContentWidthChange,\n innerScrollRef,\n horizontalContainerRef: externalHorizontalContainerRef,\n}) => {\n const internalHorizontalContainerRef = useRef<HTMLDivElement>(null);\n const horizontalContainerRef = externalHorizontalContainerRef ?? internalHorizontalContainerRef;\n const headerScrollRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const rowsEl = horizontalContainerRef.current;\n if (!rowsEl) return;\n const onScroll = () => {\n if (headerScrollRef.current) {\n headerScrollRef.current.scrollLeft = rowsEl.scrollLeft;\n }\n };\n rowsEl.addEventListener(\"scroll\", onScroll);\n return () => rowsEl.removeEventListener(\"scroll\", onScroll);\n }, [horizontalContainerRef]);\n const [selectedTasks, setSelectedTasks] = useState<string[]>([]);\n\n // Per-column widths (px), shared by the header and table so resizing a column\n // keeps both in sync. Seeded from the column factors × rowWidth.\n const hasCheckbox = !!onMultiSelect;\n const [columnWidths, setColumnWidths] = useState<Record<string, number>>(() =>\n buildDefaultColumnWidths(scheduleType, hasCheckbox, rowWidth)\n );\n\n // Re-seed only when the column SET changes (scheduleType / multiselect adds or\n // removes a column), preserving widths the user already set for columns that\n // persist. Returning `prev` when the set is unchanged avoids needless renders.\n useEffect(() => {\n const defaults = buildDefaultColumnWidths(scheduleType, hasCheckbox, rowWidth);\n setColumnWidths(prev => {\n const ids = Object.keys(defaults);\n const sameSet =\n ids.length === Object.keys(prev).length && ids.every(id => id in prev);\n if (sameSet) return prev;\n const next: Record<string, number> = {};\n for (const id of ids) next[id] = prev[id] ?? defaults[id];\n return next;\n });\n }, [scheduleType, hasCheckbox, rowWidth]);\n\n const handleColumnResize = (colId: string, width: number) => {\n setColumnWidths(prev => ({\n ...prev,\n [colId]: Math.max(MIN_COLUMN_WIDTH, width),\n }));\n };\n\n // True total width of all columns. Reported up so the parent can cap the table\n // at its content (no white space past the last column) and size the horizontal\n // scrollbar exactly — both without relying on a laggy scrollWidth measurement.\n const contentWidth = useMemo(\n () => Object.values(columnWidths).reduce((sum, w) => sum + w, 0),\n [columnWidths]\n );\n useEffect(() => {\n onContentWidthChange?.(contentWidth);\n }, [contentWidth, onContentWidthChange]);\n\n const [pendingTaskSelect, setPendingTaskSelect] = useState<{ taskId: string; selected: boolean }[]>([]);\n const prevSelectedTasksRef = useRef<string[]>([]);\n const expandedTasks = useRef(new Set<string>());\n\n // Selection walks parent/child links for every selected task, so index them\n // once per `tasks` instead of scanning and splitting ids on each lookup.\n const taskIndex = useMemo(() => {\n const byId = new Map<string, Task>();\n const childrenOf = new Map<string, string[]>();\n const roots: string[] = [];\n tasks.forEach(task => byId.set(task.id, task));\n tasks.forEach(task => {\n const parent = getParentWbs(task.id);\n if (parent === undefined) {\n roots.push(task.id);\n return;\n }\n const siblings = childrenOf.get(parent);\n if (siblings) siblings.push(task.id);\n else childrenOf.set(parent, [task.id]);\n });\n return { byId, childrenOf, roots };\n }, [tasks]);\n\n const sameIds = (a: string[], b: string[]) =>\n a.length === b.length && a.every((id, i) => id === b[i]);\n\n const virtualizer = useVirtualizer({\n count: tasks.length,\n getScrollElement: () => horizontalContainerRef.current,\n estimateSize: () => rowHeight,\n overscan: 10\n });\n\n useEffect(() => {\n if (horizontalContainerRef.current) {\n horizontalContainerRef.current.scrollTop = scrollY;\n }\n }, [scrollY]);\n\n useEffect(() => {\n if (!onMultiSelect || sameIds(prevSelectedTasksRef.current, selectedTasks)) {\n return;\n }\n const selected = new Set(selectedTasks);\n prevSelectedTasksRef.current = selectedTasks;\n onMultiSelect(tasks.filter(task => selected.has(task.id)));\n }, [selectedTasks, tasks, onMultiSelect]);\n\n\n\n // process pending task selections\n useEffect(() => {\n if (pendingTaskSelect.length === 0) return;\n\n const newSelected = new Set(selectedTasks);\n pendingTaskSelect.forEach(({ taskId, selected }) => {\n if (selected) {\n // Expand the task and its children first\n recursiveOpen(taskId);\n // Collect descendants after expansion\n const descendants = getDescendants(taskId);\n newSelected.add(taskId);\n descendants.forEach(d => newSelected.add(d));\n } else {\n const descendants = getDescendants(taskId);\n newSelected.delete(taskId);\n descendants.forEach(d => newSelected.delete(d));\n }\n });\n\n setSelectedTasks(Array.from(newSelected));\n setPendingTaskSelect([]);\n }, [pendingTaskSelect]);\n\n // Handle tasks prop changes to update descendants of selected tasks\n useEffect(() => {\n expandedTasks.current.forEach(id => {\n const task = taskIndex.byId.get(id);\n if (!task || task.hideChildren) expandedTasks.current.delete(id);\n });\n if (selectedTasks.length === 0) return;\n\n const newSelected = new Set<string>();\n selectedTasks.forEach(taskId => {\n // Only include tasks that still exist\n if (!taskIndex.byId.has(taskId)) return;\n recursiveOpen(taskId); // Ensure task is expanded\n newSelected.add(taskId);\n getDescendants(taskId).forEach(d => newSelected.add(d));\n });\n\n const newSelectedArray = Array.from(newSelected);\n if (!sameIds(newSelectedArray, selectedTasks)) {\n setSelectedTasks(newSelectedArray);\n }\n }, [tasks.length]);\n\n // Descendant ids in depth-first order, via the index.\n const getDescendants = (taskId: string): string[] => {\n if (!taskIndex.byId.has(taskId)) return [];\n const out: string[] = [];\n const stack = [...(taskIndex.childrenOf.get(taskId) ?? [])].reverse();\n while (stack.length) {\n const id = stack.pop()!;\n out.push(id);\n const children = taskIndex.childrenOf.get(id);\n if (children) stack.push(...[...children].reverse());\n }\n return out;\n };\n\n // Expands collapsed nodes down the subtree. Leaves are skipped: expanding one\n // is a no-op, and on a flat schedule it fired onExpanderClick once per task.\n const recursiveOpen = (taskId: string) => {\n const stack = [taskId];\n while (stack.length) {\n const id = stack.pop()!;\n const task = taskIndex.byId.get(id);\n const children = taskIndex.childrenOf.get(id);\n if (!task || !children) continue;\n if (task.hideChildren && !expandedTasks.current.has(id)) {\n onExpanderClick(task);\n expandedTasks.current.add(id);\n }\n stack.push(...children);\n }\n };\n\n const handleTaskSelect = (taskId: string, selected: boolean) => {\n setPendingTaskSelect(prev => [...prev, { taskId, selected }]);\n };\n\n const handleSelectAll = (selected: boolean) => {\n if (selected) {\n setPendingTaskSelect(\n taskIndex.roots.map(taskId => ({ taskId, selected: true }))\n );\n } else {\n setSelectedTasks([]);\n setPendingTaskSelect([]);\n }\n };\n\n const headerProps = {\n headerHeight,\n fontFamily,\n fontSize,\n rowWidth,\n scheduleType,\n allSelected: tasks.length > 0 && selectedTasks.length === tasks.length,\n onSelectAll: onMultiSelect ? handleSelectAll : undefined,\n columnWidths,\n onColumnResize: handleColumnResize,\n };\n const selectedTaskId = selectedTask ? selectedTask.id : \"\";\n\n const tableProps = {\n rowHeight,\n rowWidth,\n fontFamily,\n fontSize,\n tasks,\n leafTasks,\n scheduleType,\n locale,\n selectedTaskId: selectedTaskId,\n setSelectedTask,\n onExpanderClick,\n selectedTasks: onMultiSelect ? selectedTasks : undefined,\n onTaskSelect: onMultiSelect ? handleTaskSelect : undefined,\n taskLabelRenderer,\n virtualItems: virtualizer.getVirtualItems(),\n columnWidths,\n };\n\n return (\n <div\n ref={taskListRef}\n style={\n containerWidth != null || containerMaxWidth != null\n ? {\n ...(containerWidth != null ? { width: containerWidth } : {}),\n ...(containerMaxWidth != null ? { maxWidth: containerMaxWidth } : {}),\n overflow: \"hidden\",\n flexShrink: 0,\n }\n : {}\n }\n >\n <div\n ref={innerScrollRef}\n className={styles.hideScrollbar}\n style={{ overflowX: \"hidden\" }}\n >\n <div ref={headerScrollRef} style={{ overflow: \"hidden\" }}>\n <TaskListHeader {...headerProps} />\n </div>\n <div\n ref={horizontalContainerRef}\n className={horizontalContainerClass}\n style={ganttHeight ? { height: ganttHeight } : {}}\n >\n <div\n style={{\n height: `${virtualizer.getTotalSize()}px`,\n width: \"100%\",\n position: \"relative\",\n }}\n >\n <TaskListTable {...tableProps} />\n </div>\n </div>\n </div>\n </div>\n );\n};\n","import { CalendarDefinition } from \"../types/public-types\";\n\n/** Parse \"HH:MM\" or \"HH:MM:SS\" into minutes since midnight. */\nexport function parseTimeToMinutes(t: string): number {\n const parts = t.split(\":\").map(Number);\n return parts[0] * 60 + parts[1] + (parts[2] ? parts[2] / 60 : 0);\n}\n\n/** Format a \"YYYY-MM-DD\" string from a Date (local). */\nfunction toDateString(date: Date): string {\n const y = date.getFullYear();\n const m = String(date.getMonth() + 1).padStart(2, \"0\");\n const d = String(date.getDate()).padStart(2, \"0\");\n return `${y}-${m}-${d}`;\n}\n\n/** True if the date falls on a calendar holiday. */\nexport function isHoliday(date: Date, cal: CalendarDefinition): boolean {\n if (cal.holidays && cal.holidays.length > 0) {\n return cal.holidays.includes(toDateString(date));\n } else {\n return false;\n }\n}\n\n/** True if the date's weekday is in off_days or is a holiday. */\nexport function isOffDay(date: Date, cal: CalendarDefinition): boolean {\n if (cal.off_days && cal.off_days.length > 0) {\n return cal.off_days.includes(date.getDay()) || isHoliday(date, cal);\n } else {\n return false;\n }\n}\n\n/** True if the date is a regular working day (not off_day, not holiday). */\nexport function isWorkingDay(date: Date, cal: CalendarDefinition): boolean {\n return !isOffDay(date, cal);\n}\n\n/**\n * Returns the shift windows (in minutes since midnight) for a given date.\n * Returns [] for off days / holidays.\n */\n// getWorkingIntervals walks day by day per task, so both halves of this are hit\n// millions of times on a large schedule. Shifts do not vary by day, and off-day\n// results repeat across every task covering that date, so cache both per calendar.\nconst parsedShiftsCache = new WeakMap<\n CalendarDefinition,\n Array<{ start: number; end: number }>\n>();\nconst offDayCache = new WeakMap<CalendarDefinition, Map<number, boolean>>();\n\nfunction parsedShifts(cal: CalendarDefinition) {\n let shifts = parsedShiftsCache.get(cal);\n if (!shifts) {\n shifts = (cal.shifts ?? []).map(([s, e]) => ({\n start: parseTimeToMinutes(s),\n end: parseTimeToMinutes(e),\n }));\n parsedShiftsCache.set(cal, shifts);\n }\n return shifts;\n}\n\nfunction isOffDayCached(date: Date, cal: CalendarDefinition): boolean {\n let perCal = offDayCache.get(cal);\n if (!perCal) {\n perCal = new Map();\n offDayCache.set(cal, perCal);\n }\n const key =\n date.getFullYear() * 10000 + (date.getMonth() + 1) * 100 + date.getDate();\n let off = perCal.get(key);\n if (off === undefined) {\n off = isOffDay(date, cal);\n perCal.set(key, off);\n }\n return off;\n}\n\nconst NO_SHIFTS: Array<{ start: number; end: number }> = [];\n\nexport function getShiftsForDay(\n date: Date,\n cal: CalendarDefinition\n): Array<{ start: number; end: number }> {\n if (!cal.shifts || isOffDayCached(date, cal)) return NO_SHIFTS;\n return parsedShifts(cal);\n}\n\n/**\n * Returns all working time intervals between start and end, respecting:\n * - off days and holidays (entire day skipped)\n * - shift windows (multiple shifts per day are supported)\n * - partial first/last days clipped to the actual start/end time\n */\nexport function getWorkingIntervals(\n start: Date,\n end: Date,\n cal: CalendarDefinition\n): Array<{ start: Date; end: Date }> {\n if (start >= end) return [];\n const intervals: Array<{ start: Date; end: Date }> = [];\n\n // Iterate day by day\n const cursor = new Date(start);\n cursor.setHours(0, 0, 0, 0);\n\n while (cursor <= end) {\n const shifts = getShiftsForDay(cursor, cal);\n\n for (const shift of shifts) {\n // Build shift start/end as Date objects for this day\n const shiftStart = new Date(cursor);\n shiftStart.setHours(\n Math.floor(shift.start / 60),\n Math.floor(shift.start % 60),\n Math.round((shift.start % 1) * 60),\n 0\n );\n const shiftEnd = new Date(cursor);\n shiftEnd.setHours(\n Math.floor(shift.end / 60),\n Math.floor(shift.end % 60),\n Math.round((shift.end % 1) * 60),\n 0\n );\n\n // Clip to [start, end]\n const intervalStart = shiftStart < start ? start : shiftStart;\n const intervalEnd = shiftEnd > end ? end : shiftEnd;\n\n if (intervalStart < intervalEnd) {\n intervals.push({ start: intervalStart, end: intervalEnd });\n }\n }\n\n // Advance to the next day\n cursor.setDate(cursor.getDate() + 1);\n }\n\n return intervals;\n}\n\n/**\n * Snaps a date to the nearest valid working moment.\n * direction \"forward\" → move forward until inside a shift\n * direction \"backward\" → move backward until inside a shift\n * Searches up to 60 days to avoid infinite loops.\n */\nexport function snapToWorkingTime(\n date: Date,\n cal: CalendarDefinition,\n direction: \"forward\" | \"backward\"\n): Date {\n const MAX_DAYS = 60;\n const result = new Date(date);\n\n for (let attempt = 0; attempt < MAX_DAYS * 24 * 60; attempt++) {\n const dayStart = new Date(result);\n dayStart.setHours(0, 0, 0, 0);\n const shifts = getShiftsForDay(dayStart, cal);\n\n if (shifts.length > 0) {\n if (direction === \"forward\") {\n // Find first shift window that contains or is after result\n const currentMins =\n result.getHours() * 60 +\n result.getMinutes() +\n result.getSeconds() / 60;\n for (const shift of shifts) {\n if (currentMins <= shift.end) {\n // Snap to start of shift if before it\n if (currentMins < shift.start) {\n result.setHours(\n Math.floor(shift.start / 60),\n Math.round(shift.start % 60),\n 0,\n 0\n );\n }\n return result;\n }\n }\n // All shifts passed — move to next day's first shift\n result.setDate(result.getDate() + 1);\n result.setHours(0, 0, 0, 0);\n } else {\n // direction === \"backward\"\n const currentMins =\n result.getHours() * 60 +\n result.getMinutes() +\n result.getSeconds() / 60;\n // Find last shift window that contains or is before result\n for (let i = shifts.length - 1; i >= 0; i--) {\n if (currentMins >= shifts[i].start) {\n if (currentMins > shifts[i].end) {\n result.setHours(\n Math.floor(shifts[i].end / 60),\n Math.round(shifts[i].end % 60),\n 0,\n 0\n );\n }\n return result;\n }\n }\n // All shifts ahead — move to previous day's last shift\n result.setDate(result.getDate() - 1);\n result.setHours(23, 59, 59, 0);\n }\n } else {\n // Off day — move to boundary\n if (direction === \"forward\") {\n result.setDate(result.getDate() + 1);\n result.setHours(0, 0, 0, 0);\n } else {\n result.setDate(result.getDate() - 1);\n result.setHours(23, 59, 59, 0);\n }\n }\n }\n\n // Fallback: return original if no valid time found\n return date;\n}\n\n/**\n * Returns the most recent week-start date on or before the given date,\n * where weekStartDay is a JS day index (0=Sun, 1=Mon, ..., 6=Sat).\n */\nexport function getWeekStartDate(date: Date, weekStartDay: number): Date {\n const d = new Date(date);\n d.setHours(0, 0, 0, 0);\n const dayOfWeek = d.getDay(); // 0–6\n const diff = (dayOfWeek - weekStartDay + 7) % 7;\n d.setDate(d.getDate() - diff);\n return d;\n}\n\n/**\n * Returns the quarter number (1–4) for a date, given a fiscal quarterStart month (0–11, 0=Jan).\n * e.g. quarterStart=4 means Q1 starts in May.\n */\nexport function getQuarterNumber(\n date: Date,\n quarterStart: number\n): number {\n const month = date.getMonth(); // 0–11\n // Offset month relative to quarter start\n const offset = ((month - quarterStart + 12) % 12);\n return Math.floor(offset / 3) + 1;\n}\n\n/**\n * Returns the quarter start month (0-11) for a given date and fiscal quarterStart (0-indexed).\n * Useful for labeling (e.g. Q1 starting in May → returns 4).\n */\nexport function getQuarterStartMonth(\n date: Date,\n quarterStart: number\n): number {\n const q = getQuarterNumber(date, quarterStart);\n // q=1 → month = quarterStart, q=2 → +3, q=3 → +6, q=4 → +9\n return (quarterStart + (q - 1) * 3) % 12; // 0-indexed\n}\n","import React from \"react\";\nimport { VirtualItem } from \"@tanstack/react-virtual\";\nimport { CalendarDefinition, Task, ViewMode } from \"../../types/public-types\";\nimport { addToDate } from \"../../helpers/date-helper\";\nimport { isOffDay } from \"../../helpers/calendar-helper\";\nimport styles from \"./grid.module.css\";\n\nexport type GridBodyProps = {\n tasks: Task[];\n scheduleType: string;\n dates: Date[];\n svgWidth: number;\n rowHeight: number;\n columnWidth: number;\n todayColor: string;\n weekendColor: string;\n rtl: boolean;\n virtualItems?: VirtualItem[];\n visibleStartY: number;\n visibleEndY: number;\n projectCalendar?: CalendarDefinition;\n viewMode?: ViewMode;\n};\n\nexport const GridBody: React.FC<GridBodyProps> = ({\n tasks,\n scheduleType,\n dates,\n rowHeight,\n svgWidth,\n columnWidth,\n todayColor,\n weekendColor,\n rtl,\n virtualItems = [],\n visibleStartY,\n visibleEndY,\n projectCalendar,\n viewMode,\n}) => {\n const visibleHeight = visibleEndY - visibleStartY;\n const now = new Date();\n\n // === Virtual row calculation ===\n const items =\n virtualItems ??\n tasks.map((_, i) => ({\n index: i,\n start: i * rowHeight,\n end: (i + 1) * rowHeight,\n size: rowHeight,\n key: i,\n }));\n\n const isDayOff = (date: Date): boolean => {\n if (projectCalendar) return isOffDay(date, projectCalendar);\n const d = date.getDay();\n return d === 0 || d === 6;\n };\n\n const isTodayColumn = (i: number) => {\n const date = dates[i];\n const next = dates[i + 1];\n if (next && date <= now && next > now) return true;\n if (!next && date <= now) {\n // Estimate this (last) column's end by extrapolating the previous step.\n // A single-column range has no previous date, so fall back to one day\n // instead of dereferencing dates[-1].\n const prev = dates[i - 1];\n const step = prev ? date.getTime() - prev.getTime() : 86400000;\n const end = addToDate(date, step, \"millisecond\");\n return end > now;\n }\n return false;\n };\n\n // === Today, Off-Day, and Weekend Rects ===\n const todayRects: React.ReactNode[] = [];\n const offDayRects: React.ReactNode[] = [];\n const weekStartDay = projectCalendar?.week_start ?? 1;\n\n for (let i = 0, x = 0; i < dates.length; i++, x += columnWidth) {\n if (isTodayColumn(i)) {\n todayRects.push(\n <rect\n key={`today-${i}`}\n x={rtl ? x + columnWidth : x}\n y={visibleStartY}\n width={columnWidth}\n height={visibleHeight}\n fill={todayColor}\n />\n );\n }\n // Proportional off-day shading: Day=full column, Week=slivers; Month/Quarter excluded\n if (viewMode !== ViewMode.Month && viewMode !== ViewMode.Quarter) {\n const pEnd = dates[i + 1] ?? addToDate(dates[i], 1, \"day\");\n const periodMs = pEnd.getTime() - dates[i].getTime();\n if (periodMs > 0) {\n const cursor = new Date(dates[i]);\n cursor.setHours(0, 0, 0, 0);\n while (cursor.getTime() < pEnd.getTime()) {\n if (isDayOff(cursor)) {\n const ds = cursor.getTime() - dates[i].getTime();\n const de = ds + 86400000;\n const startFrac = Math.max(0, ds) / periodMs;\n const endFrac = Math.min(periodMs, de) / periodMs;\n const rw = (endFrac - startFrac) * columnWidth;\n if (rw > 0.5) {\n offDayRects.push(\n <rect\n key={`offday-${i}-${cursor.getTime()}`}\n x={x + startFrac * columnWidth}\n y={visibleStartY}\n width={rw}\n height={visibleHeight}\n fill={weekendColor}\n />\n );\n }\n }\n cursor.setDate(cursor.getDate() + 1);\n }\n }\n }\n }\n\n // === Vertical Tick Lines — only Day & Week views get the darker week-start\n // line; Day also dashes the intra-week days, every other view uses the light\n // default tick. ===\n const isDayView = viewMode === ViewMode.Day;\n const isWeekView = viewMode === ViewMode.Week;\n const tickLines = dates.map((date, i) => {\n let tickClass = styles.gridTick;\n if (isDayView) {\n tickClass =\n date.getDay() === weekStartDay\n ? styles.gridTickWeekStart\n : styles.gridTickDashed;\n } else if (isWeekView) {\n tickClass = styles.gridTickWeekStart;\n }\n return (\n <line\n key={`tick-${i}`}\n x1={i * columnWidth}\n y1={visibleStartY}\n x2={i * columnWidth}\n y2={visibleEndY}\n className={tickClass}\n />\n );\n });\n\n // === Horizontal Rows & Lines ===\n const rowBackgrounds: React.ReactNode[] = [];\n const rowLines: React.ReactNode[] = [];\n // Per-row overlay layer: erases chart-wide off-day shading inside task rows\n // (so the project calendar never affects task rendering), then re-applies\n // each task's own off-day shading from its linked calendar (task.calendar).\n const rowOverlays: React.ReactNode[] = [];\n\n // Top border\n rowLines.push(\n <line\n key=\"top-line\"\n x1={0}\n y1={visibleStartY}\n x2={svgWidth}\n y2={visibleStartY}\n className={styles.gridRowLine}\n />\n );\n\n const showPerRowOffDays =\n viewMode !== ViewMode.Month && viewMode !== ViewMode.Quarter;\n\n for (const vi of items) {\n const task = tasks[vi.index];\n if (!task) break;\n\n const y = vi.start;\n const isMilestone = task.type === \"milestone\";\n\n const rowClass = isMilestone\n ? styles.darkerGridRow\n : scheduleType === \"lookAhead\"\n ? styles.gridRowLookAhead\n : styles.gridRow;\n\n rowBackgrounds.push(\n <rect\n key={`bg-${vi.key}`}\n x={0}\n y={y}\n width={svgWidth}\n height={rowHeight}\n className={rowClass}\n />\n );\n\n rowLines.push(\n <line\n key={`line-${vi.key}`}\n x1={0}\n y1={y + rowHeight}\n x2={svgWidth}\n y2={y + rowHeight}\n className={styles.gridRowLine}\n />\n );\n\n if (showPerRowOffDays) {\n // 1) Erase chart-wide project off-day shading inside this row.\n // nth-child won't match in a sibling <g>, so compute the same fill\n // explicitly (matches grid.module.css: gridRow alternates #fff/#f5f5f5).\n const rowEven = vi.index % 2 === 1;\n const rowFill = isMilestone\n ? \"#e6e4e4\"\n : scheduleType === \"lookAhead\"\n ? \"#fff\"\n : rowEven\n ? \"#f5f5f5\"\n : \"#fff\";\n rowOverlays.push(\n <rect\n key={`row-clean-${vi.key}`}\n x={0}\n y={y}\n width={svgWidth}\n height={rowHeight}\n fill={rowFill}\n />\n );\n\n // 2) Render this task's own off-days/holidays (if it has a calendar).\n const cal = task.calendar;\n if (cal) {\n for (let i = 0, x = 0; i < dates.length; i++, x += columnWidth) {\n const pEnd = dates[i + 1] ?? addToDate(dates[i], 1, \"day\");\n const periodMs = pEnd.getTime() - dates[i].getTime();\n if (periodMs <= 0) continue;\n const cursor = new Date(dates[i]);\n cursor.setHours(0, 0, 0, 0);\n while (cursor.getTime() < pEnd.getTime()) {\n if (isOffDay(cursor, cal)) {\n const ds = cursor.getTime() - dates[i].getTime();\n const de = ds + 86400000;\n const startFrac = Math.max(0, ds) / periodMs;\n const endFrac = Math.min(periodMs, de) / periodMs;\n const rw = (endFrac - startFrac) * columnWidth;\n if (rw > 0.5) {\n rowOverlays.push(\n <rect\n key={`row-offday-${vi.key}-${cursor.getTime()}`}\n x={rtl ? x + columnWidth - (startFrac * columnWidth + rw) : x + startFrac * columnWidth}\n y={y}\n width={rw}\n height={rowHeight}\n fill={weekendColor}\n />\n );\n }\n }\n cursor.setDate(cursor.getDate() + 1);\n }\n }\n }\n }\n }\n\n return (\n <g className=\"gridBody\">\n <g className=\"rows\">{rowBackgrounds}</g>\n <g className=\"rowLines\">{rowLines}</g>\n <g className=\"offdays\">{offDayRects}</g>\n <g className=\"rowOverlays\">{rowOverlays}</g>\n <g className=\"ticks\">{tickLines}</g>\n <g className=\"today\">{todayRects}</g>\n </g>\n );\n};\n","import React from \"react\";\nimport { GridBody, GridBodyProps } from \"./grid-body\";\n\nexport type GridProps = GridBodyProps;\nexport const Grid: React.FC<GridProps> = props => {\n return (\n <g className=\"grid\" >\n <GridBody {...props} />\n </g>\n );\n};\n","import React from \"react\";\nimport styles from \"./calendar.module.css\";\n\ntype TopPartOfCalendarProps = {\n value: string;\n x1Line: number;\n y1Line: number;\n y2Line: number;\n xText: number;\n yText: number;\n textAnchor?: \"start\" | \"middle\" | \"end\";\n};\n\nexport const TopPartOfCalendar: React.FC<TopPartOfCalendarProps> = ({\n value,\n x1Line,\n y1Line,\n y2Line,\n xText,\n yText,\n textAnchor = \"middle\",\n}) => {\n const textAnchorClass =\n textAnchor === \"start\"\n ? styles.textAnchorStart\n : textAnchor === \"middle\"\n ? styles.textAnchorMiddle\n : styles.textAnchorEnd;\n return (\n <g className=\"calendarTop\">\n <line\n x1={x1Line}\n y1={y1Line}\n x2={x1Line}\n y2={y2Line}\n className={styles.calendarTopTick}\n key={value + \"line\"}\n />\n <text\n key={value + \"text\"}\n y={yText}\n x={xText}\n className={`${styles.calendarTopText} ${textAnchorClass}`}\n >\n {value}\n </text>\n </g>\n );\n};\n","import React, { ReactChild } from \"react\";\nimport { CalendarDefinition, ViewMode } from \"../../types/public-types\";\nimport { TopPartOfCalendar } from \"./top-part-of-calendar\";\nimport {\n getCachedDateTimeFormat,\n getLocalDayOfWeek,\n addToDate,\n} from \"../../helpers/date-helper\";\nimport {\n getQuarterNumber,\n isOffDay,\n} from \"../../helpers/calendar-helper\";\nimport { DateSetup } from \"../../types/date-setup\";\nimport styles from \"./calendar.module.css\";\n\nexport type CalendarProps = {\n dateSetup: DateSetup;\n locale: string;\n viewMode: ViewMode;\n rtl: boolean;\n headerHeight: number;\n columnWidth: number;\n fontFamily: string;\n fontSize: string;\n projectCalendar?: CalendarDefinition;\n weekendColor: string;\n};\n\nexport const Calendar: React.FC<CalendarProps> = ({\n dateSetup,\n locale,\n viewMode,\n rtl,\n headerHeight,\n columnWidth,\n fontFamily,\n fontSize,\n projectCalendar,\n weekendColor,\n}) => {\n /** Off-day test — mirrors GridBody.isDayOff so header shading matches the body. */\n const isDayOff = (date: Date): boolean => {\n if (projectCalendar) return isOffDay(date, projectCalendar);\n \n return false; // default to no off days if no calendar provided, to avoid false positives on custom view modes like Hourly\n };\n /** Helper: 3-letter month abbreviation */\n const shortMonth = (date: Date) =>\n date.toLocaleString(locale, { month: \"short\" });\n\n const getCalendarValuesForYear = () => {\n const topValues: ReactChild[] = [];\n const bottomValues: ReactChild[] = [];\n const topDefaultHeight = headerHeight * 0.5;\n for (let i = 0; i < dateSetup.dates.length; i++) {\n const date = dateSetup.dates[i];\n const bottomValue = date.getFullYear();\n bottomValues.push(\n <text\n key={date.getFullYear()}\n y={headerHeight * 0.8}\n x={columnWidth * i + columnWidth * 0.5}\n className={styles.calendarBottomText}\n >\n {bottomValue}\n </text>\n );\n if (\n i === 0 ||\n date.getFullYear() !== dateSetup.dates[i - 1].getFullYear()\n ) {\n const topValue = date.getFullYear().toString();\n let xText: number;\n if (rtl) {\n xText = (6 + i + date.getFullYear() + 1) * columnWidth;\n } else {\n xText = (6 + i - date.getFullYear()) * columnWidth;\n }\n topValues.push(\n <TopPartOfCalendar\n key={topValue}\n value={topValue}\n x1Line={columnWidth * i}\n y1Line={0}\n y2Line={headerHeight}\n xText={xText}\n yText={topDefaultHeight * 0.9}\n />\n );\n }\n }\n return [topValues, bottomValues];\n };\n\n /**\n * QUARTER view — 3-row header: Year (top) | Qtr label (middle) | Month abbr (bottom)\n */\n const getCalendarValuesForQuarter = () => {\n const topValues: ReactChild[] = [];\n const bottomValues: ReactChild[] = [];\n const offDayRects: ReactChild[] = [];\n const quarterStart = projectCalendar?.quarter_start ?? 0;\n const rowH = headerHeight / 3;\n\n for (let i = 0; i < dateSetup.dates.length; i++) {\n const date = dateSetup.dates[i];\n const qNum = getQuarterNumber(date, quarterStart);\n\n // Bottom row: 3 month abbreviations within each quarter column\n for (let m = 0; m < 3; m++) {\n const monthDate = addToDate(date, m, \"month\");\n bottomValues.push(\n <text\n key={`qmonth-${i}-${m}`}\n y={headerHeight * 0.9}\n x={columnWidth * i + columnWidth * (m * 2 + 1) / 6}\n className={`${styles.calendarTopText} ${styles.textAnchorMiddle}`}\n >\n {shortMonth(monthDate)}\n </text>\n );\n }\n\n // Middle row: quarter label centered on column\n bottomValues.push(\n <text\n key={`qlabel-${i}`}\n y={rowH * 1.6}\n x={columnWidth * i + columnWidth * 0.5}\n className={`${styles.calendarTopText} ${styles.textAnchorMiddle}`}\n >\n {`Qtr ${qNum}`}\n </text>\n );\n\n // Vertical separator at start of each column\n bottomValues.push(\n <line\n key={`qsep-${i}`}\n x1={columnWidth * i}\n y1={rowH}\n x2={columnWidth * i}\n y2={headerHeight}\n className={styles.calendarTopTick}\n />\n );\n\n // Horizontal separator between rows\n if (i === 0) {\n bottomValues.push(\n <line\n key=\"qhsep1\"\n x1={0}\n y1={rowH}\n x2={columnWidth * dateSetup.dates.length}\n y2={rowH}\n className={styles.calendarTopTick}\n />\n );\n bottomValues.push(\n <line\n key=\"qhsep2\"\n x1={0}\n y1={rowH * 2}\n x2={columnWidth * dateSetup.dates.length}\n y2={rowH * 2}\n className={styles.calendarTopTick}\n />\n );\n }\n\n // Top row: year label — new group when year changes\n if (\n i === 0 ||\n date.getFullYear() !== dateSetup.dates[i - 1].getFullYear()\n ) {\n const topValue = date.getFullYear().toString();\n // Find span end for xText calculation\n let span = 0;\n for (let j = i; j < dateSetup.dates.length && dateSetup.dates[j].getFullYear() === date.getFullYear(); j++) {\n span++;\n }\n const xText = columnWidth * i + (columnWidth * span) / 2;\n topValues.push(\n <TopPartOfCalendar\n key={topValue + i}\n value={topValue}\n x1Line={columnWidth * i}\n y1Line={0}\n y2Line={rowH}\n xText={xText}\n yText={rowH * 0.7}\n textAnchor=\"middle\"\n />\n );\n }\n }\n\n return [topValues, bottomValues, offDayRects];\n };\n\n /**\n * MONTH view — top row shows Quarter labels, bottom row shows 3-letter months.\n */\n const getCalendarValuesForMonth = () => {\n const topValues: ReactChild[] = [];\n const bottomValues: ReactChild[] = [];\n const offDayRects: ReactChild[] = [];\n const topDefaultHeight = headerHeight * 0.5;\n const quarterStart = projectCalendar?.quarter_start ?? 0;\n\n for (let i = 0; i < dateSetup.dates.length; i++) {\n const date = dateSetup.dates[i];\n const bottomValue = shortMonth(date);\n bottomValues.push(\n <text\n key={bottomValue + date.getFullYear() + i}\n y={headerHeight * 0.8}\n x={columnWidth * i + columnWidth * 0.5}\n className={`${styles.calendarTopText} ${styles.textAnchorMiddle}`}\n >\n {bottomValue}\n </text>\n );\n\n // Top row: quarter label — new group when quarter or year changes\n const qNum = getQuarterNumber(date, quarterStart);\n const prevDate = i > 0 ? dateSetup.dates[i - 1] : null;\n const prevQNum = prevDate ? getQuarterNumber(prevDate, quarterStart) : -1;\n const isNewQuarter =\n i === 0 ||\n qNum !== prevQNum ||\n date.getFullYear() !== (prevDate ? prevDate.getFullYear() : -1);\n\n if (isNewQuarter) {\n const topValue = `Qtr ${qNum}, ${date.getFullYear()}`;\n // Find how many months in this quarter-year group for xText centering\n let span = 0;\n for (\n let j = i;\n j < dateSetup.dates.length &&\n getQuarterNumber(dateSetup.dates[j], quarterStart) === qNum &&\n dateSetup.dates[j].getFullYear() === date.getFullYear();\n j++\n ) {\n span++;\n }\n const xText = rtl\n ? columnWidth * i + columnWidth * span * 0.5 + columnWidth\n : columnWidth * i + (columnWidth * span) / 2;\n\n topValues.push(\n <TopPartOfCalendar\n key={topValue + i}\n value={topValue}\n x1Line={columnWidth * i}\n y1Line={0}\n y2Line={topDefaultHeight}\n xText={xText}\n yText={topDefaultHeight * 0.7}\n textAnchor=\"middle\"\n />\n );\n // Extend the quarter-boundary tick through the bottom half of the header\n if (i > 0) {\n bottomValues.push(\n <line\n key={`qbound-${i}`}\n x1={columnWidth * i}\n y1={topDefaultHeight}\n x2={columnWidth * i}\n y2={headerHeight}\n className={styles.calendarTopTick}\n />\n );\n }\n }\n }\n return [topValues, bottomValues, offDayRects];\n };\n\n /**\n * WEEK view — top row: \"Mmm YYYY\", bottom row: day-number of week start.\n */\n const getCalendarValuesForWeek = () => {\n const topValues: ReactChild[] = [];\n const bottomValues: ReactChild[] = [];\n const offDayRects: ReactChild[] = [];\n let weeksCount: number = 1;\n const topDefaultHeight = headerHeight * 0.5;\n const dates = dateSetup.dates;\n for (let i = dates.length - 1; i >= 0; i--) {\n const date = dates[i];\n let topValue = \"\";\n if (i === 0 || date.getMonth() !== dates[i - 1].getMonth()) {\n // Use 3-letter month abbreviation\n topValue = `${shortMonth(date)} ${date.getFullYear()}`;\n }\n // Bottom: day number of the week-start date\n const bottomValue = date.getDate().toString();\n\n bottomValues.push(\n <text\n key={date.getTime()}\n y={headerHeight * 0.8}\n x={columnWidth * (i + +rtl)}\n className={`${styles.calendarTopText} ${styles.textAnchorStart}`}\n >\n {bottomValue}\n </text>\n );\n\n if (topValue) {\n if (i !== dates.length - 1) {\n topValues.push(\n <TopPartOfCalendar\n key={topValue + i}\n value={topValue}\n x1Line={columnWidth * i + weeksCount * columnWidth}\n y1Line={0}\n y2Line={topDefaultHeight}\n xText={columnWidth * i + columnWidth * weeksCount * 0.5}\n yText={topDefaultHeight * 0.9}\n textAnchor=\"start\"\n />\n );\n }\n weeksCount = 0;\n }\n weeksCount++;\n }\n return [topValues, bottomValues, offDayRects];\n };\n\n /**\n * DAY view — top row: \"Mmm YYYY\" per month, bottom: day labels.\n * Off days shaded gray. Solid tick for week-start day, dashed for others.\n */\n const getCalendarValuesForDay = () => {\n const topValues: ReactChild[] = [];\n const bottomValues: ReactChild[] = [];\n const offDayRects: ReactChild[] = [];\n const tickLines: ReactChild[] = [];\n const topDefaultHeight = headerHeight * 0.5;\n const dates = dateSetup.dates;\n const weekStartDay = projectCalendar?.week_start ?? 1; // default Monday\n\n for (let i = 0; i < dates.length; i++) {\n const date = dates[i];\n\n // Off-day shading on the day-number row (bottom band of the header).\n // Drawn into extraValues, which renders before tickLines so the solid\n // week-start line stays on top of the gray. Matches the grid body shading.\n if (isDayOff(date)) {\n offDayRects.push(\n <rect\n key={`offday-header-${i}`}\n x={columnWidth * i}\n y={topDefaultHeight}\n width={columnWidth}\n height={headerHeight - topDefaultHeight}\n fill={weekendColor}\n />\n );\n }\n\n // Per-day separator tick lines\n const isWeekStart = date.getDay() === weekStartDay;\n tickLines.push(\n <line\n key={`tick-day-${i}`}\n x1={columnWidth * i}\n y1={topDefaultHeight}\n x2={columnWidth * i}\n y2={headerHeight}\n className={isWeekStart ? styles.calendarTickSolid : styles.calendarTickDashed}\n />\n );\n\n // Bottom: day label\n const bottomValue =\n columnWidth > 55\n ? `${getLocalDayOfWeek(date, locale, \"short\")}, ${date.getDate()}`\n : `${getLocalDayOfWeek(date, locale, \"narrow\")},${date.getDate()}`;\n bottomValues.push(\n <text\n key={date.getTime()}\n y={headerHeight * 0.8}\n x={columnWidth * i + columnWidth * 0.5}\n className={`${styles.calendarTopText} ${styles.textAnchorMiddle}`}\n >\n {bottomValue}\n </text>\n );\n\n // Top: month boundary labels using 3-letter abbreviation\n if (\n i + 1 !== dates.length &&\n date.getMonth() !== dates[i + 1].getMonth()\n ) {\n const topValue = `${shortMonth(date)} ${date.getFullYear()}`;\n topValues.push(\n <TopPartOfCalendar\n key={topValue + i}\n value={topValue}\n x1Line={columnWidth * (i + 1)}\n y1Line={0}\n y2Line={topDefaultHeight}\n xText={\n topValues.length === 0\n ? columnWidth * (i + 1) * 0.5\n : columnWidth * (i + 1) - date.getDate() * columnWidth * 0.5\n }\n yText={topDefaultHeight * 0.9}\n />\n );\n }\n if (i + 1 === dates.length) {\n const topValue = `${shortMonth(date)} ${date.getFullYear()}`;\n topValues.push(\n <TopPartOfCalendar\n key={topValue + \"last\"}\n value={topValue}\n x1Line={columnWidth * (i + 1)}\n y1Line={0}\n y2Line={topDefaultHeight}\n xText={columnWidth * (i + 1) - date.getDate() * columnWidth * 0.5}\n yText={topDefaultHeight * 0.9}\n />\n );\n }\n }\n return [topValues, bottomValues, offDayRects, tickLines];\n };\n\n const getCalendarValuesForPartOfDay = () => {\n const topValues: ReactChild[] = [];\n const bottomValues: ReactChild[] = [];\n const ticks = viewMode === ViewMode.HalfDay ? 2 : 4;\n const topDefaultHeight = headerHeight * 0.5;\n const dates = dateSetup.dates;\n for (let i = 0; i < dates.length; i++) {\n const date = dates[i];\n const bottomValue = getCachedDateTimeFormat(locale, {\n hour: \"numeric\",\n }).format(date);\n\n bottomValues.push(\n <text\n key={date.getTime()}\n y={headerHeight * 0.8}\n x={columnWidth * (i + +rtl)}\n className={`${styles.calendarTopText} ${styles.textAnchorMiddle}`}\n fontFamily={fontFamily}\n >\n {bottomValue}\n </text>\n );\n if (i === 0 || date.getDate() !== dates[i - 1].getDate()) {\n const topValue = `${getLocalDayOfWeek(date, locale, \"short\")}, ${date.getDate()} ${shortMonth(date)}`;\n topValues.push(\n <TopPartOfCalendar\n key={topValue + date.getFullYear()}\n value={topValue}\n x1Line={columnWidth * i + ticks * columnWidth}\n y1Line={0}\n y2Line={topDefaultHeight}\n xText={columnWidth * i + ticks * columnWidth * 0.5}\n yText={topDefaultHeight * 0.9}\n />\n );\n }\n }\n\n return [topValues, bottomValues];\n };\n\n const getCalendarValuesForHour = () => {\n const topValues: ReactChild[] = [];\n const bottomValues: ReactChild[] = [];\n const topDefaultHeight = headerHeight * 0.5;\n const dates = dateSetup.dates;\n for (let i = 0; i < dates.length; i++) {\n const date = dates[i];\n const bottomValue = getCachedDateTimeFormat(locale, {\n hour: \"numeric\",\n }).format(date);\n\n bottomValues.push(\n <text\n key={date.getTime()}\n y={headerHeight * 0.8}\n x={columnWidth * (i + +rtl)}\n className={styles.calendarBottomText}\n fontFamily={fontFamily}\n >\n {bottomValue}\n </text>\n );\n if (i !== 0 && date.getDate() !== dates[i - 1].getDate()) {\n const displayDate = dates[i - 1];\n const topValue = `${getLocalDayOfWeek(displayDate, locale, \"long\")}, ${displayDate.getDate()} ${shortMonth(displayDate)}`;\n const topPosition = (date.getHours() - 24) / 2;\n topValues.push(\n <TopPartOfCalendar\n key={topValue + displayDate.getFullYear()}\n value={topValue}\n x1Line={columnWidth * i}\n y1Line={0}\n y2Line={topDefaultHeight}\n xText={columnWidth * (i + topPosition)}\n yText={topDefaultHeight * 0.9}\n />\n );\n }\n }\n\n return [topValues, bottomValues];\n };\n\n let topValues: ReactChild[] = [];\n let bottomValues: ReactChild[] = [];\n let extraValues: ReactChild[] = [];\n let tickLines: ReactChild[] = [];\n\n switch (dateSetup.viewMode) {\n case ViewMode.Year:\n [topValues, bottomValues] = getCalendarValuesForYear();\n break;\n case ViewMode.Quarter: {\n const r = getCalendarValuesForQuarter();\n topValues = r[0]; bottomValues = r[1]; extraValues = r[2] || [];\n break;\n }\n case ViewMode.Month: {\n const r = getCalendarValuesForMonth();\n topValues = r[0]; bottomValues = r[1]; extraValues = r[2] || [];\n break;\n }\n case ViewMode.Week: {\n const r = getCalendarValuesForWeek();\n topValues = r[0]; bottomValues = r[1]; extraValues = r[2] || [];\n break;\n }\n case ViewMode.Day: {\n const result = getCalendarValuesForDay();\n topValues = result[0];\n bottomValues = result[1];\n extraValues = result[2];\n tickLines = result[3];\n break;\n }\n case ViewMode.QuarterDay:\n case ViewMode.HalfDay:\n [topValues, bottomValues] = getCalendarValuesForPartOfDay();\n break;\n case ViewMode.Hour:\n [topValues, bottomValues] = getCalendarValuesForHour();\n }\n return (\n <g\n className=\"calendar\"\n fontSize={fontSize}\n fontFamily={fontFamily}\n width={columnWidth * dateSetup.dates.length}\n >\n <rect\n x={0}\n y={0}\n width={columnWidth * dateSetup.dates.length}\n height={headerHeight}\n className={styles.calendarHeader}\n />\n {extraValues}\n {tickLines}\n {bottomValues}\n {topValues}\n </g>\n );\n};\n","// A type of promise-like that resolves synchronously and supports only one observer\nexport const _Pact = /*#__PURE__*/(function() {\n\tfunction _Pact() {}\n\t_Pact.prototype.then = function(onFulfilled, onRejected) {\n\t\tconst result = new _Pact();\n\t\tconst state = this.s;\n\t\tif (state) {\n\t\t\tconst callback = state & 1 ? onFulfilled : onRejected;\n\t\t\tif (callback) {\n\t\t\t\ttry {\n\t\t\t\t\t_settle(result, 1, callback(this.v));\n\t\t\t\t} catch (e) {\n\t\t\t\t\t_settle(result, 2, e);\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t} else {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}\n\t\tthis.o = function(_this) {\n\t\t\ttry {\n\t\t\t\tconst value = _this.v;\n\t\t\t\tif (_this.s & 1) {\n\t\t\t\t\t_settle(result, 1, onFulfilled ? onFulfilled(value) : value);\n\t\t\t\t} else if (onRejected) {\n\t\t\t\t\t_settle(result, 1, onRejected(value));\n\t\t\t\t} else {\n\t\t\t\t\t_settle(result, 2, value);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t_settle(result, 2, e);\n\t\t\t}\n\t\t};\n\t\treturn result;\n\t}\n\treturn _Pact;\n})();\n\n// Settles a pact synchronously\nexport function _settle(pact, state, value) {\n\tif (!pact.s) {\n\t\tif (value instanceof _Pact) {\n\t\t\tif (value.s) {\n\t\t\t\tif (state & 1) {\n\t\t\t\t\tstate = value.s;\n\t\t\t\t}\n\t\t\t\tvalue = value.v;\n\t\t\t} else {\n\t\t\t\tvalue.o = _settle.bind(null, pact, state);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tif (value && value.then) {\n\t\t\tvalue.then(_settle.bind(null, pact, state), _settle.bind(null, pact, 2));\n\t\t\treturn;\n\t\t}\n\t\tpact.s = state;\n\t\tpact.v = value;\n\t\tconst observer = pact.o;\n\t\tif (observer) {\n\t\t\tobserver(pact);\n\t\t}\n\t}\n}\n\nexport function _isSettledPact(thenable) {\n\treturn thenable instanceof _Pact && thenable.s & 1;\n}\n\n// Converts argument to a function that always returns a Promise\nexport function _async(f) {\n\treturn function() {\n\t\tfor (var args = [], i = 0; i < arguments.length; i++) {\n\t\t\targs[i] = arguments[i];\n\t\t}\n\t\ttry {\n\t\t\treturn Promise.resolve(f.apply(this, args));\n\t\t} catch(e) {\n\t\t\treturn Promise.reject(e);\n\t\t}\n\t}\n}\n\n// Awaits on a value that may or may not be a Promise (equivalent to the await keyword in ES2015, with continuations passed explicitly)\nexport function _await(value, then, direct) {\n\tif (direct) {\n\t\treturn then ? then(value) : value;\n\t}\n\tif (!value || !value.then) {\n\t\tvalue = Promise.resolve(value);\n\t}\n\treturn then ? value.then(then) : value;\n}\n\n// Awaits on a value that may or may not be a Promise, then ignores it\nexport function _awaitIgnored(value, direct) {\n\tif (!direct) {\n\t\treturn value && value.then ? value.then(_empty) : Promise.resolve();\n\t}\n}\n\n// Proceeds after a value has resolved, or proceeds immediately if the value is not thenable\nexport function _continue(value, then) {\n\treturn value && value.then ? value.then(then) : then(value);\n}\n\n// Proceeds after a value has resolved, or proceeds immediately if the value is not thenable\nexport function _continueIgnored(value) {\n\tif (value && value.then) {\n\t\treturn value.then(_empty);\n\t}\n}\n\n// Asynchronously iterate through an object that has a length property, passing the index as the first argument to the callback (even as the length property changes)\nexport function _forTo(array, body, check) {\n\tvar i = -1, pact, reject;\n\tfunction _cycle(result) {\n\t\ttry {\n\t\t\twhile (++i < array.length && (!check || !check())) {\n\t\t\t\tresult = body(i);\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\t\tresult = result.v;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult.then(_cycle, reject || (reject = _settle.bind(null, pact = new _Pact(), 2)));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pact) {\n\t\t\t\t_settle(pact, 1, result);\n\t\t\t} else {\n\t\t\t\tpact = result;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t_settle(pact || (pact = new _Pact()), 2, e);\n\t\t}\n\t}\n\t_cycle();\n\treturn pact;\n}\n\n// Asynchronously iterate through an object's properties (including properties inherited from the prototype)\n// Uses a snapshot of the object's properties\nexport function _forIn(target, body, check) {\n\tvar keys = [];\n\tfor (var key in target) {\n\t\tkeys.push(key);\n\t}\n\treturn _forTo(keys, function(i) { return body(keys[i]); }, check);\n}\n\n// Asynchronously iterate through an object's own properties (excluding properties inherited from the prototype)\n// Uses a snapshot of the object's properties\nexport function _forOwn(target, body, check) {\n\tvar keys = [];\n\tfor (var key in target) {\n\t\tif (Object.prototype.hasOwnProperty.call(target, key)) {\n\t\t\tkeys.push(key);\n\t\t}\n\t}\n\treturn _forTo(keys, function(i) { return body(keys[i]); }, check);\n}\n\nexport const _iteratorSymbol = /*#__PURE__*/ typeof Symbol !== \"undefined\" ? (Symbol.iterator || (Symbol.iterator = Symbol(\"Symbol.iterator\"))) : \"@@iterator\";\n\n// Asynchronously iterate through an object's values\n// Uses for...of if the runtime supports it, otherwise iterates until length on a copy\nexport function _forOf(target, body, check) {\n\tif (typeof target[_iteratorSymbol] === \"function\") {\n\t\tvar iterator = target[_iteratorSymbol](), step, pact, reject;\n\t\tfunction _cycle(result) {\n\t\t\ttry {\n\t\t\t\twhile (!(step = iterator.next()).done && (!check || !check())) {\n\t\t\t\t\tresult = body(step.value);\n\t\t\t\t\tif (result && result.then) {\n\t\t\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\t\t\tresult = result.v;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresult.then(_cycle, reject || (reject = _settle.bind(null, pact = new _Pact(), 2)));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (pact) {\n\t\t\t\t\t_settle(pact, 1, result);\n\t\t\t\t} else {\n\t\t\t\t\tpact = result;\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t_settle(pact || (pact = new _Pact()), 2, e);\n\t\t\t}\n\t\t}\n\t\t_cycle();\n\t\tif (iterator.return) {\n\t\t\tvar _fixup = function(value) {\n\t\t\t\ttry {\n\t\t\t\t\tif (!step.done) {\n\t\t\t\t\t\titerator.return();\n\t\t\t\t\t}\n\t\t\t\t} catch(e) {\n\t\t\t\t}\n\t\t\t\treturn value;\n\t\t\t}\n\t\t\tif (pact && pact.then) {\n\t\t\t\treturn pact.then(_fixup, function(e) {\n\t\t\t\t\tthrow _fixup(e);\n\t\t\t\t});\n\t\t\t}\n\t\t\t_fixup();\n\t\t}\n\t\treturn pact;\n\t}\n\t// No support for Symbol.iterator\n\tif (!(\"length\" in target)) {\n\t\tthrow new TypeError(\"Object is not iterable\");\n\t}\n\t// Handle live collections properly\n\tvar values = [];\n\tfor (var i = 0; i < target.length; i++) {\n\t\tvalues.push(target[i]);\n\t}\n\treturn _forTo(values, function(i) { return body(values[i]); }, check);\n}\n\nexport const _asyncIteratorSymbol = /*#__PURE__*/ typeof Symbol !== \"undefined\" ? (Symbol.asyncIterator || (Symbol.asyncIterator = Symbol(\"Symbol.asyncIterator\"))) : \"@@asyncIterator\";\n\n// Asynchronously iterate on a value using it's async iterator if present, or its synchronous iterator if missing\nexport function _forAwaitOf(target, body, check) {\n\tif (typeof target[_asyncIteratorSymbol] === \"function\") {\n\t\tvar pact = new _Pact();\n\t\tvar iterator = target[_asyncIteratorSymbol]();\n\t\titerator.next().then(_resumeAfterNext).then(void 0, _reject);\n\t\treturn pact;\n\t\tfunction _resumeAfterBody(result) {\n\t\t\tif (check && check()) {\n\t\t\t\treturn _settle(pact, 1, iterator.return ? iterator.return().then(function() { return result; }) : result);\n\t\t\t}\n\t\t\titerator.next().then(_resumeAfterNext).then(void 0, _reject);\n\t\t}\n\t\tfunction _resumeAfterNext(step) {\n\t\t\tif (step.done) {\n\t\t\t\t_settle(pact, 1);\n\t\t\t} else {\n\t\t\t\tPromise.resolve(body(step.value)).then(_resumeAfterBody).then(void 0, _reject);\n\t\t\t}\n\t\t}\n\t\tfunction _reject(error) {\n\t\t\t_settle(pact, 2, iterator.return ? iterator.return().then(function() { return error; }) : error);\n\t\t}\n\t}\n\treturn Promise.resolve(_forOf(target, function(value) { return Promise.resolve(value).then(body); }, check));\n}\n\n// Asynchronously implement a generic for loop\nexport function _for(test, update, body) {\n\tvar stage;\n\tfor (;;) {\n\t\tvar shouldContinue = test();\n\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\tshouldContinue = shouldContinue.v;\n\t\t}\n\t\tif (!shouldContinue) {\n\t\t\treturn result;\n\t\t}\n\t\tif (shouldContinue.then) {\n\t\t\tstage = 0;\n\t\t\tbreak;\n\t\t}\n\t\tvar result = body();\n\t\tif (result && result.then) {\n\t\t\tif (_isSettledPact(result)) {\n\t\t\t\tresult = result.s;\n\t\t\t} else {\n\t\t\t\tstage = 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (update) {\n\t\t\tvar updateValue = update();\n\t\t\tif (updateValue && updateValue.then && !_isSettledPact(updateValue)) {\n\t\t\t\tstage = 2;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tvar pact = new _Pact();\n\tvar reject = _settle.bind(null, pact, 2);\n\t(stage === 0 ? shouldContinue.then(_resumeAfterTest) : stage === 1 ? result.then(_resumeAfterBody) : updateValue.then(_resumeAfterUpdate)).then(void 0, reject);\n\treturn pact;\n\tfunction _resumeAfterBody(value) {\n\t\tresult = value;\n\t\tdo {\n\t\t\tif (update) {\n\t\t\t\tupdateValue = update();\n\t\t\t\tif (updateValue && updateValue.then && !_isSettledPact(updateValue)) {\n\t\t\t\t\tupdateValue.then(_resumeAfterUpdate).then(void 0, reject);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tshouldContinue = test();\n\t\t\tif (!shouldContinue || (_isSettledPact(shouldContinue) && !shouldContinue.v)) {\n\t\t\t\t_settle(pact, 1, result);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (shouldContinue.then) {\n\t\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresult = body();\n\t\t\tif (_isSettledPact(result)) {\n\t\t\t\tresult = result.v;\n\t\t\t}\n\t\t} while (!result || !result.then);\n\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t}\n\tfunction _resumeAfterTest(shouldContinue) {\n\t\tif (shouldContinue) {\n\t\t\tresult = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t} else {\n\t\t\t\t_resumeAfterBody(result);\n\t\t\t}\n\t\t} else {\n\t\t\t_settle(pact, 1, result);\n\t\t}\n\t}\n\tfunction _resumeAfterUpdate() {\n\t\tif (shouldContinue = test()) {\n\t\t\tif (shouldContinue.then) {\n\t\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t} else {\n\t\t\t\t_resumeAfterTest(shouldContinue);\n\t\t\t}\n\t\t} else {\n\t\t\t_settle(pact, 1, result);\n\t\t}\n\t}\n}\n\n// Asynchronously implement a do ... while loop\nexport function _do(body, test) {\n\tvar awaitBody;\n\tdo {\n\t\tvar result = body();\n\t\tif (result && result.then) {\n\t\t\tif (_isSettledPact(result)) {\n\t\t\t\tresult = result.v;\n\t\t\t} else {\n\t\t\t\tawaitBody = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tvar shouldContinue = test();\n\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\tshouldContinue = shouldContinue.v;\n\t\t}\n\t\tif (!shouldContinue) {\n\t\t\treturn result;\n\t\t}\n\t} while (!shouldContinue.then);\n\tconst pact = new _Pact();\n\tconst reject = _settle.bind(null, pact, 2);\n\t(awaitBody ? result.then(_resumeAfterBody) : shouldContinue.then(_resumeAfterTest)).then(void 0, reject);\n\treturn pact;\n\tfunction _resumeAfterBody(value) {\n\t\tresult = value;\n\t\tfor (;;) {\n\t\t\tshouldContinue = test();\n\t\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\t\tshouldContinue = shouldContinue.v;\n\t\t\t}\n\t\t\tif (!shouldContinue) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (shouldContinue.then) {\n\t\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresult = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\tresult = result.v;\n\t\t\t\t} else {\n\t\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t_settle(pact, 1, result);\n\t}\n\tfunction _resumeAfterTest(shouldContinue) {\n\t\tif (shouldContinue) {\n\t\t\tdo {\n\t\t\t\tresult = body();\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\t\tresult = result.v;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tshouldContinue = test();\n\t\t\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\t\t\tshouldContinue = shouldContinue.v;\n\t\t\t\t}\n\t\t\t\tif (!shouldContinue) {\n\t\t\t\t\t_settle(pact, 1, result);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} while (!shouldContinue.then);\n\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t} else {\n\t\t\t_settle(pact, 1, result);\n\t\t}\n\t}\n}\n\n// Asynchronously implement a switch statement\nexport function _switch(discriminant, cases) {\n\tvar dispatchIndex = -1;\n\tvar awaitBody;\n\touter: {\n\t\tfor (var i = 0; i < cases.length; i++) {\n\t\t\tvar test = cases[i][0];\n\t\t\tif (test) {\n\t\t\t\tvar testValue = test();\n\t\t\t\tif (testValue && testValue.then) {\n\t\t\t\t\tbreak outer;\n\t\t\t\t}\n\t\t\t\tif (testValue === discriminant) {\n\t\t\t\t\tdispatchIndex = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Found the default case, set it as the pending dispatch case\n\t\t\t\tdispatchIndex = i;\n\t\t\t}\n\t\t}\n\t\tif (dispatchIndex !== -1) {\n\t\t\tdo {\n\t\t\t\tvar body = cases[dispatchIndex][1];\n\t\t\t\twhile (!body) {\n\t\t\t\t\tdispatchIndex++;\n\t\t\t\t\tbody = cases[dispatchIndex][1];\n\t\t\t\t}\n\t\t\t\tvar result = body();\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tawaitBody = true;\n\t\t\t\t\tbreak outer;\n\t\t\t\t}\n\t\t\t\tvar fallthroughCheck = cases[dispatchIndex][2];\n\t\t\t\tdispatchIndex++;\n\t\t\t} while (fallthroughCheck && !fallthroughCheck());\n\t\t\treturn result;\n\t\t}\n\t}\n\tconst pact = new _Pact();\n\tconst reject = _settle.bind(null, pact, 2);\n\t(awaitBody ? result.then(_resumeAfterBody) : testValue.then(_resumeAfterTest)).then(void 0, reject);\n\treturn pact;\n\tfunction _resumeAfterTest(value) {\n\t\tfor (;;) {\n\t\t\tif (value === discriminant) {\n\t\t\t\tdispatchIndex = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (++i === cases.length) {\n\t\t\t\tif (dispatchIndex !== -1) {\n\t\t\t\t\tbreak;\n\t\t\t\t} else {\n\t\t\t\t\t_settle(pact, 1, result);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\ttest = cases[i][0];\n\t\t\tif (test) {\n\t\t\t\tvalue = test();\n\t\t\t\tif (value && value.then) {\n\t\t\t\t\tvalue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdispatchIndex = i;\n\t\t\t}\n\t\t}\n\t\tdo {\n\t\t\tvar body = cases[dispatchIndex][1];\n\t\t\twhile (!body) {\n\t\t\t\tdispatchIndex++;\n\t\t\t\tbody = cases[dispatchIndex][1];\n\t\t\t}\n\t\t\tvar result = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar fallthroughCheck = cases[dispatchIndex][2];\n\t\t\tdispatchIndex++;\n\t\t} while (fallthroughCheck && !fallthroughCheck());\n\t\t_settle(pact, 1, result);\n\t}\n\tfunction _resumeAfterBody(result) {\n\t\tfor (;;) {\n\t\t\tvar fallthroughCheck = cases[dispatchIndex][2];\n\t\t\tif (!fallthroughCheck || fallthroughCheck()) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdispatchIndex++;\n\t\t\tvar body = cases[dispatchIndex][1];\n\t\t\twhile (!body) {\n\t\t\t\tdispatchIndex++;\n\t\t\t\tbody = cases[dispatchIndex][1];\n\t\t\t}\n\t\t\tresult = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t_settle(pact, 1, result);\n\t}\n}\n\n// Asynchronously call a function and pass the result to explicitly passed continuations\nexport function _call(body, then, direct) {\n\tif (direct) {\n\t\treturn then ? then(body()) : body();\n\t}\n\ttry {\n\t\tvar result = Promise.resolve(body());\n\t\treturn then ? result.then(then) : result;\n\t} catch (e) {\n\t\treturn Promise.reject(e);\n\t}\n}\n\n// Asynchronously call a function and swallow the result\nexport function _callIgnored(body, direct) {\n\treturn _call(body, _empty, direct);\n}\n\n// Asynchronously call a function and pass the result to explicitly passed continuations\nexport function _invoke(body, then) {\n\tvar result = body();\n\tif (result && result.then) {\n\t\treturn result.then(then);\n\t}\n\treturn then(result);\n}\n\n// Asynchronously call a function and swallow the result\nexport function _invokeIgnored(body) {\n\tvar result = body();\n\tif (result && result.then) {\n\t\treturn result.then(_empty);\n\t}\n}\n\n// Asynchronously call a function and send errors to recovery continuation\nexport function _catch(body, recover) {\n\ttry {\n\t\tvar result = body();\n\t} catch(e) {\n\t\treturn recover(e);\n\t}\n\tif (result && result.then) {\n\t\treturn result.then(void 0, recover);\n\t}\n\treturn result;\n}\n\n// Asynchronously await a promise and pass the result to a finally continuation\nexport function _finallyRethrows(body, finalizer) {\n\ttry {\n\t\tvar result = body();\n\t} catch (e) {\n\t\treturn finalizer(true, e);\n\t}\n\tif (result && result.then) {\n\t\treturn result.then(finalizer.bind(null, false), finalizer.bind(null, true));\n\t}\n\treturn finalizer(false, result);\n}\n\n// Asynchronously await a promise and invoke a finally continuation that always overrides the result\nexport function _finally(body, finalizer) {\n\ttry {\n\t\tvar result = body();\n\t} catch (e) {\n\t\treturn finalizer();\n\t}\n\tif (result && result.then) {\n\t\treturn result.then(finalizer, finalizer);\n\t}\n\treturn finalizer();\n}\n\n// Rethrow or return a value from a finally continuation\nexport function _rethrow(thrown, value) {\n\tif (thrown)\n\t\tthrow value;\n\treturn value;\n}\n\n// Empty function to implement break and other control flow that ignores asynchronous results\nexport function _empty() {\n}\n\n// Sentinel value for early returns in generators \nexport const _earlyReturn = /*#__PURE__*/ {};\n\n// Asynchronously call a function and send errors to recovery continuation, skipping early returns\nexport function _catchInGenerator(body, recover) {\n\treturn _catch(body, function(e) {\n\t\tif (e === _earlyReturn) {\n\t\t\tthrow e;\n\t\t}\n\t\treturn recover(e);\n\t});\n}\n\n// Asynchronous generator class; accepts the entrypoint of the generator, to which it passes itself when the generator should start\nexport const _AsyncGenerator = /*#__PURE__*/(function() {\n\tfunction _AsyncGenerator(entry) {\n\t\tthis._entry = entry;\n\t\tthis._pact = null;\n\t\tthis._resolve = null;\n\t\tthis._return = null;\n\t\tthis._promise = null;\n\t}\n\n\tfunction _wrapReturnedValue(value) {\n\t\treturn { value: value, done: true };\n\t}\n\tfunction _wrapYieldedValue(value) {\n\t\treturn { value: value, done: false };\n\t}\n\n\t_AsyncGenerator.prototype._yield = function(value) {\n\t\t// Yield the value to the pending next call\n\t\tthis._resolve(value && value.then ? value.then(_wrapYieldedValue) : _wrapYieldedValue(value));\n\t\t// Return a pact for an upcoming next/return/throw call\n\t\treturn this._pact = new _Pact();\n\t};\n\t_AsyncGenerator.prototype.next = function(value) {\n\t\t// Advance the generator, starting it if it has yet to be started\n\t\tconst _this = this;\n\t\treturn _this._promise = new Promise(function (resolve) {\n\t\t\tconst _pact = _this._pact;\n\t\t\tif (_pact === null) {\n\t\t\t\tconst _entry = _this._entry;\n\t\t\t\tif (_entry === null) {\n\t\t\t\t\t// Generator is started, but not awaiting a yield expression\n\t\t\t\t\t// Abandon the next call!\n\t\t\t\t\treturn resolve(_this._promise);\n\t\t\t\t}\n\t\t\t\t// Start the generator\n\t\t\t\t_this._entry = null;\n\t\t\t\t_this._resolve = resolve;\n\t\t\t\tfunction returnValue(value) {\n\t\t\t\t\t_this._resolve(value && value.then ? value.then(_wrapReturnedValue) : _wrapReturnedValue(value));\n\t\t\t\t\t_this._pact = null;\n\t\t\t\t\t_this._resolve = null;\n\t\t\t\t}\n\t\t\t\tvar result = _entry(_this);\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tresult.then(returnValue, function(error) {\n\t\t\t\t\t\tif (error === _earlyReturn) {\n\t\t\t\t\t\t\treturnValue(_this._return);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst pact = new _Pact();\n\t\t\t\t\t\t\t_this._resolve(pact);\n\t\t\t\t\t\t\t_this._pact = null;\n\t\t\t\t\t\t\t_this._resolve = null;\n\t\t\t\t\t\t\t_resolve(pact, 2, error);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturnValue(result);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Generator is started and a yield expression is pending, settle it\n\t\t\t\t_this._pact = null;\n\t\t\t\t_this._resolve = resolve;\n\t\t\t\t_settle(_pact, 1, value);\n\t\t\t}\n\t\t});\n\t};\n\t_AsyncGenerator.prototype.return = function(value) {\n\t\t// Early return from the generator if started, otherwise abandons the generator\n\t\tconst _this = this;\n\t\treturn _this._promise = new Promise(function (resolve) {\n\t\t\tconst _pact = _this._pact;\n\t\t\tif (_pact === null) {\n\t\t\t\tif (_this._entry === null) {\n\t\t\t\t\t// Generator is started, but not awaiting a yield expression\n\t\t\t\t\t// Abandon the return call!\n\t\t\t\t\treturn resolve(_this._promise);\n\t\t\t\t}\n\t\t\t\t// Generator is not started, abandon it and return the specified value\n\t\t\t\t_this._entry = null;\n\t\t\t\treturn resolve(value && value.then ? value.then(_wrapReturnedValue) : _wrapReturnedValue(value));\n\t\t\t}\n\t\t\t// Settle the yield expression with a rejected \"early return\" value\n\t\t\t_this._return = value;\n\t\t\t_this._resolve = resolve;\n\t\t\t_this._pact = null;\n\t\t\t_settle(_pact, 2, _earlyReturn);\n\t\t});\n\t};\n\t_AsyncGenerator.prototype.throw = function(error) {\n\t\t// Inject an exception into the pending yield expression\n\t\tconst _this = this;\n\t\treturn _this._promise = new Promise(function (resolve, reject) {\n\t\t\tconst _pact = _this._pact;\n\t\t\tif (_pact === null) {\n\t\t\t\tif (_this._entry === null) {\n\t\t\t\t\t// Generator is started, but not awaiting a yield expression\n\t\t\t\t\t// Abandon the throw call!\n\t\t\t\t\treturn resolve(_this._promise);\n\t\t\t\t}\n\t\t\t\t// Generator is not started, abandon it and return a rejected Promise containing the error\n\t\t\t\t_this._entry = null;\n\t\t\t\treturn reject(error);\n\t\t\t}\n\t\t\t// Settle the yield expression with the value as a rejection\n\t\t\t_this._resolve = resolve;\n\t\t\t_this._pact = null;\n\t\t\t_settle(_pact, 2, error);\n\t\t});\n\t};\n\n\t_AsyncGenerator.prototype[_asyncIteratorSymbol] = function() {\n\t\treturn this;\n\t};\n\t\n\treturn _AsyncGenerator;\n})();\n","import React from \"react\";\nimport { BarTask } from \"../../types/bar-task\";\nimport { Dependency } from \"../../types/public-types\";\n\ntype ArrowProps = {\n taskFrom: BarTask;\n taskTo: BarTask;\n rowHeight: number;\n taskHeight: number;\n arrowIndent: number;\n arrowColor: string;\n dependencyType: Dependency;\n};\n\nexport const Arrow: React.FC<ArrowProps> = ({\n taskFrom,\n taskTo,\n rowHeight,\n taskHeight,\n arrowIndent,\n arrowColor,\n dependencyType,\n}) => {\n let [path, trianglePoints] = drawPathAndTriangle(\n taskFrom,\n taskTo,\n rowHeight,\n taskHeight,\n arrowIndent,\n dependencyType\n );\n\n return (\n <g className=\"arrow\">\n <path strokeWidth=\"1.5\" d={path} fill=\"none\" stroke={arrowColor} />\n <polygon points={trianglePoints} fill={arrowColor} />\n </g>\n );\n};\n\nconst drawPathAndTriangle = (\n taskFrom: BarTask,\n taskTo: BarTask,\n rowHeight: number,\n taskHeight: number,\n arrowIndent: number,\n dependencyType: Dependency\n) => {\n const indexCompare = taskFrom.index > taskTo.index ? -1 : 1;\n const taskToEndY = taskTo.y + taskHeight / 2;\n const verticalOffset = indexCompare * (rowHeight / 2);\n\n // 1️⃣ Pick start/end x-points based on dependency type\n const minX = (t: BarTask) => {\n // Use visual segment edge when available (correct for working-time bars in day view)\n if (t.plannedSegments && t.plannedSegments.length > 0) {\n const p = t.plannedSegments[0].x1;\n if (t.actualSegments && t.actualSegments.length > 0) return Math.min(p, t.actualSegments[0].x1);\n return p;\n }\n if (t.actualSegments && t.actualSegments.length > 0) return t.actualSegments[0].x1;\n // Only blend a coord when that bar actually exists (positive width). A bar\n // whose dates are the 1970 epoch sentinel clamps its x-coords to 0 (the\n // chart's left edge); a `>= 0` check would let that 0 drag the endpoint left.\n const candidates: number[] = [];\n if (t.x2 > t.x1) candidates.push(t.x1);\n if (t.actualx2 > t.actualx1) candidates.push(t.actualx1);\n return candidates.length > 0 ? Math.min(...candidates) : 0;\n };\n const maxX = (t: BarTask) => {\n if (t.plannedSegments && t.plannedSegments.length > 0) {\n const p = t.plannedSegments[t.plannedSegments.length - 1].x2;\n if (t.actualSegments && t.actualSegments.length > 0) return Math.max(p, t.actualSegments[t.actualSegments.length - 1].x2);\n return p;\n }\n if (t.actualSegments && t.actualSegments.length > 0) return t.actualSegments[t.actualSegments.length - 1].x2;\n // Mirror minX: only blend a coord when that bar actually exists (positive\n // width), so a 1970-epoch sentinel bar (x-coords clamped to 0) can't apply.\n const candidates: number[] = [];\n if (t.x2 > t.x1) candidates.push(t.x2);\n if (t.actualx2 > t.actualx1) candidates.push(t.actualx2);\n return candidates.length > 0 ? Math.max(...candidates) : 0;\n };\n\n let fromPoint: number, toPoint: number;\n switch (dependencyType) {\n case \"SS\":\n fromPoint = minX(taskFrom);\n toPoint = minX(taskTo);\n break;\n case \"SF\":\n fromPoint = minX(taskFrom);\n toPoint = maxX(taskTo);\n break;\n case \"FS\":\n fromPoint = maxX(taskFrom);\n toPoint = minX(taskTo);\n break;\n case \"FF\":\n fromPoint = maxX(taskFrom);\n toPoint = maxX(taskTo);\n break;\n }\n\n // 2️⃣ Helper for arrowhead points\n const arrowPoints = (x: number, y: number, right = true) =>\n right\n ? `${x},${y} ${x - 5},${y - 5} ${x - 5},${y + 5}` // Right\n : `${x},${y} ${x + 5},${y - 5} ${x + 5},${y + 5}`; // Left\n\n let path: string;\n let trianglePoints: string;\n\n // 3️⃣ Routing based on type\n switch (dependencyType) {\n case \"SS\":\n path = `M ${fromPoint} ${taskFrom.y + taskHeight / 2}\n H ${\n fromPoint + Math.min(toPoint - fromPoint, 0) - 2 * arrowIndent\n }\n V ${taskToEndY}\n H ${toPoint - 5}`;\n trianglePoints = arrowPoints(toPoint, taskToEndY, true);\n break;\n\n case \"SF\":\n path = `M ${fromPoint} ${taskFrom.y + taskHeight / 2}\n H ${fromPoint - 2 * arrowIndent}\n V ${taskFrom.y + taskHeight / 2 + verticalOffset}\n ${\n fromPoint - toPoint > 4 * arrowIndent\n ? \"\"\n : `H ${toPoint + 2 * arrowIndent}`\n }\n V ${taskToEndY}\n H ${toPoint + 5}`;\n trianglePoints = arrowPoints(toPoint, taskToEndY, false);\n break;\n\n case \"FS\":\n path = `M ${fromPoint} ${taskFrom.y + taskHeight / 2}\n H ${fromPoint + 2 * arrowIndent}\n V ${taskFrom.y + taskHeight / 2 + verticalOffset}\n ${\n toPoint - fromPoint > 4 * arrowIndent\n ? \"\"\n : `H ${toPoint - 2 * arrowIndent}`\n }\n V ${taskToEndY}\n H ${toPoint - 5}`;\n trianglePoints = arrowPoints(toPoint, taskToEndY, true);\n break;\n\n case \"FF\":\n path = `M ${fromPoint} ${taskFrom.y + taskHeight / 2}\n H ${\n fromPoint + Math.max(toPoint - fromPoint, 0) + 2 * arrowIndent\n }\n V ${taskToEndY}\n H ${toPoint + 5}`;\n trianglePoints = arrowPoints(toPoint, taskToEndY, false);\n break;\n }\n\n return [path, trianglePoints];\n};\n","import { Task } from \"../types/public-types\";\nimport { BarTask, TaskTypeInternal } from \"../types/bar-task\";\nimport { BarMoveAction } from \"../types/gantt-task-actions\";\nimport { getWorkingIntervals } from \"./calendar-helper\";\nimport { startOfDate, addToDate } from \"./date-helper\";\n\nexport const convertToBarTasks = (\n tasks: Task[],\n dates: Date[],\n columnWidth: number,\n rowHeight: number,\n taskHeight: number,\n barCornerRadius: number,\n handleWidth: number,\n rtl: boolean,\n barProgressColor: string,\n barProgressSelectedColor: string,\n barBackgroundColor: string,\n barBackgroundSelectedColor: string,\n projectProgressColor: string,\n projectProgressSelectedColor: string,\n projectBackgroundColor: string,\n projectBackgroundSelectedColor: string,\n milestoneBackgroundColor: string,\n milestoneBackgroundSelectedColor: string\n) => {\n let barTasks = tasks.map((t, i) => {\n return convertToBarTask(\n t,\n i,\n dates,\n columnWidth,\n rowHeight,\n taskHeight,\n barCornerRadius,\n handleWidth,\n rtl,\n barProgressColor,\n barProgressSelectedColor,\n barBackgroundColor,\n barBackgroundSelectedColor,\n projectProgressColor,\n projectProgressSelectedColor,\n projectBackgroundColor,\n projectBackgroundSelectedColor,\n milestoneBackgroundColor,\n milestoneBackgroundSelectedColor\n );\n });\n\n // id->index map: findIndex here was O(tasks x deps).\n const indexById = new Map<string, number>();\n for (let i = 0; i < barTasks.length; i++) {\n indexById.set(barTasks[i].id, i);\n }\n barTasks = barTasks.map(task => {\n const dependencies = task.dependencies || [];\n for (let j = 0; j < dependencies.length; j++) {\n const dependence = indexById.get(dependencies[j].id);\n if (\n dependence !== undefined &&\n task.start.getTime() > 0 &&\n task.end.getTime() > 0\n ) {\n const barchild = { ...task, dependencyType: dependencies[j].type };\n barTasks[dependence].barChildren.push(barchild);\n }\n }\n return task;\n });\n\n return barTasks;\n};\n\nconst convertToBarTask = (\n task: Task,\n index: number,\n dates: Date[],\n columnWidth: number,\n rowHeight: number,\n taskHeight: number,\n barCornerRadius: number,\n handleWidth: number,\n rtl: boolean,\n barProgressColor: string,\n barProgressSelectedColor: string,\n barBackgroundColor: string,\n barBackgroundSelectedColor: string,\n projectProgressColor: string,\n projectProgressSelectedColor: string,\n projectBackgroundColor: string,\n projectBackgroundSelectedColor: string,\n milestoneBackgroundColor: string,\n milestoneBackgroundSelectedColor: string\n): BarTask => {\n let barTask: BarTask;\n switch (task.type) {\n case \"milestone\":\n barTask = convertToMilestone(\n task,\n index,\n dates,\n columnWidth,\n rowHeight,\n taskHeight,\n barCornerRadius,\n handleWidth,\n milestoneBackgroundColor,\n milestoneBackgroundSelectedColor\n );\n break;\n case \"project\":\n barTask = convertToBar(\n task,\n index,\n dates,\n columnWidth,\n rowHeight,\n taskHeight,\n barCornerRadius,\n handleWidth,\n rtl,\n projectProgressColor,\n projectProgressSelectedColor,\n projectBackgroundColor,\n projectBackgroundSelectedColor\n );\n break;\n default:\n barTask = convertToBar(\n task,\n index,\n dates,\n columnWidth,\n rowHeight,\n taskHeight,\n barCornerRadius,\n handleWidth,\n rtl,\n barProgressColor,\n barProgressSelectedColor,\n barBackgroundColor,\n barBackgroundSelectedColor\n );\n break;\n }\n return barTask;\n};\n\nconst convertToBar = (\n task: Task,\n index: number,\n dates: Date[],\n columnWidth: number,\n rowHeight: number,\n taskHeight: number,\n barCornerRadius: number,\n handleWidth: number,\n rtl: boolean,\n barProgressColor: string,\n barProgressSelectedColor: string,\n barBackgroundColor: string,\n barBackgroundSelectedColor: string\n): BarTask => {\n let x1: number;\n let x2: number;\n let actualx1: number;\n let actualx2: number;\n let progressStartWidth: number;\n let progressEndWidth: number;\n if (rtl) {\n x2 = task.start ? taskXCoordinateRTL(task.start, dates, columnWidth) : -1;\n x1 = task.end ? taskXCoordinateRTL(task.end, dates, columnWidth) : -1;\n actualx1 = task.actualStart\n ? taskXCoordinateRTL(task.actualStart, dates, columnWidth)\n : -1;\n actualx2 = task.actualEnd\n ? taskXCoordinateRTL(task.actualEnd, dates, columnWidth)\n : -1;\n } else {\n x1 = task.start ? taskXCoordinate(startOfDate(task.start, \"day\"), dates, columnWidth) : -1;\n x2 = task.end ? taskXCoordinate(addToDate(startOfDate(task.end, \"day\"), 1, \"day\"), dates, columnWidth) : -1;\n actualx1 = task.actualStart\n ? taskXCoordinate(startOfDate(task.actualStart, \"day\"), dates, columnWidth)\n : -1;\n actualx2 = task.actualEnd\n ? taskXCoordinate(addToDate(startOfDate(task.actualEnd, \"day\"), 1, \"day\"), dates, columnWidth)\n : -1;\n }\n\n progressStartWidth = actualx1 && x1 ? Math.abs(actualx1 - x1) : -1;\n progressEndWidth = actualx2 && x2 ? Math.abs(actualx2 - x2) : -1;\n\n let typeInternal: TaskTypeInternal = task.type;\n // if (x1 && x2) {\n // if (typeInternal === \"task\" && x2 - x1 < handleWidth * 2) {\n // typeInternal = \"smalltask\";\n // x2 = x1 + handleWidth * 2;\n // }\n // }\n const [progressWidth, progressX] = progressWithByParams(\n actualx1,\n actualx2,\n task.progress,\n rtl\n );\n\n const y = taskYCoordinate(index, rowHeight, taskHeight);\n //const hideChildren = task.type === \"project\" ? task.hideChildren : undefined;\n const hideChildren = task.hideChildren || false; //allows tasks to have chldren. benjamin\n\n // Compute working-time segments if the task has a calendar\n let plannedSegments: Array<{ x1: number; x2: number }> | undefined;\n let actualSegments: Array<{ x1: number; x2: number }> | undefined;\n\n if (task.calendar && task.start && task.end && task.start.getTime() > 0) {\n const planEnd = addToDate(startOfDate(task.end, \"day\"), 1, \"day\");\n const intervals = getWorkingIntervals(task.start, planEnd, task.calendar);\n const segs = intervals\n .map(iv => ({\n x1: taskXCoordinate(iv.start, dates, columnWidth),\n x2: taskXCoordinate(iv.end, dates, columnWidth),\n }))\n .filter(s => s.x2 > s.x1);\n if (segs.length > 0) plannedSegments = segs;\n }\n\n if (\n task.calendar &&\n task.actualStart &&\n task.actualEnd &&\n task.actualStart.getTime() > 0\n ) {\n const actEnd = addToDate(startOfDate(task.actualEnd, \"day\"), 1, \"day\");\n const intervals = getWorkingIntervals(\n task.actualStart,\n actEnd,\n task.calendar\n );\n const segs = intervals\n .map(iv => ({\n x1: taskXCoordinate(iv.start, dates, columnWidth),\n x2: taskXCoordinate(iv.end, dates, columnWidth),\n }))\n .filter(s => s.x2 > s.x1);\n if (segs.length > 0) actualSegments = segs;\n }\n\n const styles = {\n backgroundColor: barBackgroundColor,\n backgroundSelectedColor: barBackgroundSelectedColor,\n progressColor: barProgressColor,\n progressSelectedColor: barProgressSelectedColor,\n ...task.styles,\n };\n return {\n ...task,\n typeInternal,\n x1,\n x2,\n actualx1,\n actualx2,\n progressStartWidth,\n progressEndWidth,\n y,\n index,\n progressX,\n progressWidth,\n barCornerRadius,\n handleWidth,\n hideChildren,\n height: taskHeight,\n barChildren: [],\n styles,\n plannedSegments,\n actualSegments,\n };\n};\n\nconst convertToMilestone = (\n task: Task,\n index: number,\n dates: Date[],\n columnWidth: number,\n rowHeight: number,\n taskHeight: number,\n barCornerRadius: number,\n handleWidth: number,\n milestoneBackgroundColor: string,\n milestoneBackgroundSelectedColor: string\n): BarTask => {\n const x =\n task.start && task.end\n ? taskXCoordinate(task.end, dates, columnWidth)\n : 0;\n const y = taskYCoordinate(index, rowHeight, taskHeight);\n\n const x1 = task.start && task.end ? x - taskHeight * 0.5 : 0;\n const x2 = task.start && task.end ? x + taskHeight * 0.5 : 0;\n\n const rotatedHeight = taskHeight / 1.414;\n const styles = {\n backgroundColor: milestoneBackgroundColor,\n backgroundSelectedColor: milestoneBackgroundSelectedColor,\n progressColor: \"\",\n progressSelectedColor: \"\",\n ...task.styles,\n };\n return {\n ...task,\n x1,\n x2,\n actualx1: x1,\n actualx2: x2,\n progressStartWidth: 0,\n progressEndWidth: 0,\n y,\n index,\n progressX: 0,\n progressWidth: 0,\n barCornerRadius,\n handleWidth,\n typeInternal: task.type,\n progress: 0,\n height: rotatedHeight,\n hideChildren: undefined,\n barChildren: [],\n styles,\n };\n};\n\n// Timestamps cached by array identity, rebuilt only when `dates` changes.\nconst dateTimesCache = new WeakMap<Date[], number[]>();\nconst getDateTimes = (dates: Date[]) => {\n let times = dateTimesCache.get(dates);\n if (!times) {\n times = dates.map(d => d.getTime());\n dateTimesCache.set(dates, times);\n }\n return times;\n};\n\nexport const taskXCoordinate = (xDate: Date, dates: Date[], columnWidth: number) => {\n // Binary search: runs 4x per bar, and `dates` reaches ~11k in Hour view.\n const times = getDateTimes(dates);\n const target = xDate.getTime();\n let lo = 0;\n let hi = times.length - 1;\n while (lo <= hi) {\n const mid = (lo + hi) >> 1;\n if (times[mid] >= target) hi = mid - 1;\n else lo = mid + 1;\n }\n // Nothing >= target: mirror findIndex's -1 for the branch below.\n const index = (lo === times.length ? -1 : lo) - 1;\n if (index < 0) {\n if (dates[dates.length - 1].getTime() <= xDate.getTime()) {\n return dates.length * columnWidth;\n } else {\n return 0;\n }\n }\n const remainderMillis = xDate.getTime() - dates[index].getTime();\n const percentOfInterval =\n remainderMillis / (dates[index + 1].getTime() - dates[index].getTime());\n const x = index * columnWidth + percentOfInterval * columnWidth;\n return x;\n};\nconst taskXCoordinateRTL = (\n xDate: Date,\n dates: Date[],\n columnWidth: number\n) => {\n let x = taskXCoordinate(xDate, dates, columnWidth);\n x += columnWidth;\n return x;\n};\nconst taskYCoordinate = (\n index: number,\n rowHeight: number,\n taskHeight: number\n) => {\n const y = index * rowHeight + (rowHeight - taskHeight) / 2;\n return y;\n};\n\nexport const progressWithByParams = (\n taskX1: number,\n taskX2: number,\n progress: number,\n rtl: boolean\n) => {\n const progressWidth =\n taskX2 > 0 && taskX1 > 0 ? (taskX2 - taskX1) * progress * 0.01 : 0;\n let progressX: number;\n if (rtl) {\n progressX = taskX2 > 0 ? taskX2 - progressWidth : 0;\n } else {\n progressX = taskX1 > 0 ? taskX1 : 0;\n }\n return [progressWidth, progressX];\n};\n\nexport const progressByProgressWidth = (\n progressWidth: number,\n barTask: BarTask\n) => {\n const barWidth = barTask.x2 - barTask.x1;\n const progressPercent = Math.round((progressWidth * 100) / barWidth);\n if (progressPercent >= 100) return 100;\n else if (progressPercent <= 0) return 0;\n else return progressPercent;\n};\n\n// const progressByX = (x: number, task: BarTask) => {\n// if (x >= task.x2) return 100;\n// else if (x <= task.x1) return 0;\n// else {\n// const barWidth = task.x2 - task.x1;\n// const progressPercent = Math.round(((x - task.x1) * 100) / barWidth);\n// return progressPercent;\n// }\n// };\n// const progressByXRTL = (x: number, task: BarTask) => {\n// if (x >= task.x2) return 0;\n// else if (x <= task.x1) return 100;\n// else {\n// const barWidth = task.x2 - task.x1;\n// const progressPercent = Math.round(((task.x2 - x) * 100) / barWidth);\n// return progressPercent;\n// }\n// };\n\nexport const getProgressPoint = (\n progressX: number,\n taskY: number,\n taskHeight: number\n) => {\n const point = [\n progressX - 5,\n taskY + taskHeight,\n progressX + 5,\n taskY + taskHeight,\n progressX,\n taskY + taskHeight - 8.66,\n ];\n return point.join(\",\");\n};\n\nconst startByX = (x: number, xStep: number, task: BarTask) => {\n if (x >= task.x2 - task.handleWidth * 2) {\n x = task.x2 - task.handleWidth * 2;\n }\n const steps = Math.round((x - task.x1) / xStep);\n const additionalXValue = steps * xStep;\n const newX = task.x1 + additionalXValue;\n return newX;\n};\n\nconst startByActualX = (x: number, xStep: number, task: BarTask) => {\n if (x >= task.actualx2 - task.handleWidth * 2) {\n x = task.actualx2 - task.handleWidth * 2;\n }\n const steps = Math.round((x - task.actualx1) / xStep);\n const additionalXValue = steps * xStep;\n const newX = task.actualx1 + additionalXValue;\n return newX;\n};\n\nconst endByX = (x: number, xStep: number, task: BarTask) => {\n if (x <= task.x1 + task.handleWidth * 2) {\n x = task.x1 + task.handleWidth * 2;\n }\n const steps = Math.round((x - task.x2) / xStep);\n const additionalXValue = steps * xStep;\n const newX = task.x2 + additionalXValue;\n return newX;\n};\n\nconst endByActualX = (x: number, xStep: number, task: BarTask) => {\n if (x <= task.actualx1 + task.handleWidth * 2) {\n x = task.actualx1 + task.handleWidth * 2;\n }\n const steps = Math.round((x - task.actualx2) / xStep);\n const additionalXValue = steps * xStep;\n const newX = task.actualx2 + additionalXValue;\n return newX;\n};\n\nconst moveByX = (x: number, xStep: number, task: BarTask) => {\n const steps = Math.round((x - task.x1) / xStep);\n const additionalXValue = steps * xStep;\n const newX1 = task.x1 + additionalXValue;\n const newX2 = newX1 + task.x2 - task.x1;\n return [newX1, newX2];\n};\n\nconst moveByActualX = (x: number, xStep: number, task: BarTask) => {\n const steps = Math.round((x - task.actualx1) / xStep);\n const additionalXValue = steps * xStep;\n const newX1 = task.actualx1 + additionalXValue;\n const newX2 = newX1 + task.actualx2 - task.actualx1;\n return [newX1, newX2];\n};\n\nconst dateByX = (\n x: number,\n taskX: number,\n taskDate: Date,\n xStep: number,\n timeStep: number\n) => {\n let newDate = new Date(((x - taskX) / xStep) * timeStep + taskDate.getTime());\n newDate = new Date(\n newDate.getTime() +\n (newDate.getTimezoneOffset() - taskDate.getTimezoneOffset()) * 60000\n );\n return newDate;\n};\n\n/**\n * Method handles event in real time(mousemove) and on finish(mouseup)\n */\nexport const handleTaskBySVGMouseEvent = (\n svgX: number,\n action: BarMoveAction,\n selectedTask: BarTask,\n type: string,\n xStep: number,\n timeStep: number,\n initEventX1Delta: number,\n rtl: boolean\n): { isChanged: boolean; changedTask: BarTask } => {\n let result: { isChanged: boolean; changedTask: BarTask };\n switch (selectedTask.type) {\n case \"milestone\":\n result = handleTaskBySVGMouseEventForMilestone(\n svgX,\n action,\n selectedTask,\n xStep,\n timeStep,\n initEventX1Delta\n );\n break;\n default:\n result = handleTaskBySVGMouseEventForBar(\n svgX,\n action,\n selectedTask,\n type,\n xStep,\n timeStep,\n initEventX1Delta,\n rtl\n );\n break;\n }\n return result;\n};\n\nconst handleTaskBySVGMouseEventForBar = (\n svgX: number,\n action: BarMoveAction,\n selectedTask: BarTask,\n type: string,\n xStep: number,\n timeStep: number,\n initEventX1Delta: number,\n rtl: boolean\n): { isChanged: boolean; changedTask: BarTask } => {\n const changedTask: BarTask = { ...selectedTask };\n let isChanged = false;\n switch (action) {\n // case \"progress\":\n // if (rtl) {\n // changedTask.progress = progressByXRTL(svgX, selectedTask);\n // } else {\n // changedTask.progress = progressByX(svgX, selectedTask);\n // }\n // isChanged = changedTask.progress !== selectedTask.progress;\n // if (isChanged) {\n // const [progressWidth, progressX] = progressWithByParams(\n // changedTask.x1,\n // changedTask.x2,\n // changedTask.progress,\n // rtl\n // );\n // changedTask.progressWidth = progressWidth;\n // changedTask.progressX = progressX;\n // }\n // break;\n case \"start\": {\n const newX1 =\n type == \"planned\"\n ? startByX(svgX, xStep, selectedTask)\n : startByActualX(svgX, xStep, selectedTask);\n if (type == \"planned\") changedTask.x1 = newX1;\n else if (type == \"actual\") changedTask.actualx1 = newX1;\n isChanged =\n changedTask.x1 !== selectedTask.x1 ||\n changedTask.actualx1 !== selectedTask.actualx1;\n if (isChanged) {\n if (rtl) {\n if (type == \"planned\")\n changedTask.end = dateByX(\n newX1,\n selectedTask.x1,\n selectedTask.end,\n xStep,\n timeStep\n );\n if (type == \"actual\")\n changedTask.actualEnd = dateByX(\n newX1,\n selectedTask.actualx1,\n selectedTask.actualEnd,\n xStep,\n timeStep\n );\n } else {\n if (type == \"planned\")\n changedTask.start = dateByX(\n newX1,\n selectedTask.x1,\n selectedTask.start,\n xStep,\n timeStep\n );\n if (type == \"actual\")\n changedTask.actualStart = dateByX(\n newX1,\n selectedTask.actualx1,\n selectedTask.actualStart,\n xStep,\n timeStep\n );\n }\n const [progressWidth, progressX] = progressWithByParams(\n changedTask.x1,\n changedTask.x2,\n changedTask.progress,\n rtl\n );\n changedTask.progressWidth = progressWidth;\n changedTask.progressX = progressX;\n }\n break;\n }\n case \"end\": {\n const newX2 =\n type == \"planned\"\n ? endByX(svgX, xStep, selectedTask)\n : endByActualX(svgX, xStep, selectedTask);\n if (type == \"planned\") changedTask.x2 = newX2;\n else if (type == \"actual\") changedTask.actualx2 = newX2;\n isChanged =\n changedTask.x2 !== selectedTask.x2 ||\n changedTask.actualx2 !== selectedTask.actualx2;\n if (isChanged) {\n if (rtl) {\n if (type == \"planned\")\n changedTask.start = dateByX(\n newX2,\n selectedTask.x2,\n selectedTask.start,\n xStep,\n timeStep\n );\n if (type == \"actual\")\n changedTask.actualStart = dateByX(\n newX2,\n selectedTask.actualx2,\n selectedTask.actualStart,\n xStep,\n timeStep\n );\n } else {\n if (type == \"planned\")\n changedTask.end = dateByX(\n newX2,\n selectedTask.x2,\n selectedTask.end,\n xStep,\n timeStep\n );\n if (type == \"actual\")\n changedTask.actualEnd = dateByX(\n newX2,\n selectedTask.actualx2,\n selectedTask.actualEnd,\n xStep,\n timeStep\n );\n }\n const [progressWidth, progressX] = progressWithByParams(\n changedTask.x1,\n changedTask.x2,\n changedTask.progress,\n rtl\n );\n changedTask.progressWidth = progressWidth;\n changedTask.progressX = progressX;\n }\n break;\n }\n case \"move\": {\n const [newMoveX1, newMoveX2] =\n type == \"planned\"\n ? moveByX(svgX - initEventX1Delta, xStep, selectedTask)\n : moveByActualX(svgX - initEventX1Delta, xStep, selectedTask);\n if (type == \"planned\") isChanged = newMoveX1 !== selectedTask.x1;\n if (type == \"actual\") isChanged = newMoveX1 !== selectedTask.actualx1;\n if (isChanged) {\n if (type == \"planned\") {\n changedTask.start = dateByX(\n newMoveX1,\n selectedTask.x1,\n selectedTask.start,\n xStep,\n timeStep\n );\n changedTask.end = dateByX(\n newMoveX2,\n selectedTask.x2,\n selectedTask.end,\n xStep,\n timeStep\n );\n changedTask.x1 = newMoveX1;\n changedTask.x2 = newMoveX2;\n }\n if (type == \"actual\") {\n changedTask.actualStart = dateByX(\n newMoveX1,\n selectedTask.actualx1,\n selectedTask.actualStart,\n xStep,\n timeStep\n );\n changedTask.actualEnd = dateByX(\n newMoveX2,\n selectedTask.actualx2,\n selectedTask.actualEnd,\n xStep,\n timeStep\n );\n changedTask.actualx1 = newMoveX1;\n changedTask.actualx2 = newMoveX2;\n }\n\n // const [progressWidth, progressX] = progressWithByParams(\n // changedTask.x1,\n // changedTask.x2,\n // changedTask.progress,\n // rtl\n // );\n // changedTask.progressWidth = progressWidth;\n // changedTask.progressX = progressX;\n }\n break;\n }\n }\n return { isChanged, changedTask };\n};\n\nconst handleTaskBySVGMouseEventForMilestone = (\n svgX: number,\n action: BarMoveAction,\n selectedTask: BarTask,\n xStep: number,\n timeStep: number,\n initEventX1Delta: number\n): { isChanged: boolean; changedTask: BarTask } => {\n const changedTask: BarTask = { ...selectedTask };\n let isChanged = false;\n switch (action) {\n case \"move\": {\n const [newMoveX1, newMoveX2] = moveByX(\n svgX - initEventX1Delta,\n xStep,\n selectedTask\n );\n isChanged = newMoveX1 !== selectedTask.x1;\n if (isChanged) {\n changedTask.start = dateByX(\n newMoveX1,\n selectedTask.x1,\n selectedTask.start,\n xStep,\n timeStep\n );\n changedTask.end = changedTask.start;\n changedTask.x1 = newMoveX1;\n changedTask.x2 = newMoveX2;\n }\n break;\n }\n }\n return { isChanged, changedTask };\n};\n","import { BarTask } from \"../types/bar-task\";\nimport { Task } from \"../types/public-types\";\n\nexport function isKeyboardEvent(\n event: React.MouseEvent | React.KeyboardEvent | React.FocusEvent\n): event is React.KeyboardEvent {\n return (event as React.KeyboardEvent).key !== undefined;\n}\n\nexport function isMouseEvent(\n event: React.MouseEvent | React.KeyboardEvent | React.FocusEvent\n): event is React.MouseEvent {\n return (event as React.MouseEvent).clientX !== undefined;\n}\n\nexport function isBarTask(task: Task | BarTask): task is BarTask {\n return (task as BarTask).x1 !== undefined;\n}\n\nexport function removeHiddenTasks(tasks: Task[]) {\n const groupedTasks = tasks.filter(\n t => t.hideChildren && t.type === \"project\"\n );\n if (groupedTasks.length > 0) {\n for (let i = 0; groupedTasks.length > i; i++) {\n const groupedTask = groupedTasks[i];\n const children = getChildren(tasks, groupedTask);\n tasks = tasks.filter(t => children.indexOf(t) === -1);\n }\n }\n return tasks;\n}\n\nfunction getChildren(taskList: Task[], task: Task) {\n let tasks: Task[] = [];\n if (task.type !== \"project\") {\n tasks = taskList.filter(\n t =>\n t.dependencies &&\n t.dependencies.map(({ id }) => id).indexOf(task.id) !== -1\n );\n } else {\n tasks = taskList.filter(t => t.project && t.project === task.id);\n }\n var taskChildren: Task[] = [];\n tasks.forEach(t => {\n taskChildren.push(...getChildren(taskList, t));\n });\n tasks = tasks.concat(tasks, taskChildren);\n return tasks;\n}\n\nexport const sortTasks = (taskA: Task, taskB: Task) => {\n const orderA = taskA.displayOrder || Number.MAX_VALUE;\n const orderB = taskB.displayOrder || Number.MAX_VALUE;\n if (orderA > orderB) {\n return 1;\n } else if (orderA < orderB) {\n return -1;\n } else {\n return 0;\n }\n};\n","import React from \"react\";\n// import style from \"./bar.module.css\";\n\ntype BarDisplayProps = {\n x: number;\n y: number;\n type: string;\n startProgressWidth: number;\n endProgressWidth: number;\n width: number;\n height: number;\n isSelected: boolean;\n /* progress start point */\n progressX: number;\n progressWidth: number;\n barCornerRadius: number;\n criticalPathArrows?: Array<{taskId: string, arrowColor: string}>\n segments?: Array<{ x1: number; x2: number }>;\n styles: {\n taskProgressColor?: string;\n backgroundColor: string;\n backgroundSelectedColor: string;\n progressColor: string;\n progressSelectedColor: string;\n criticalPathColor?: string;\n };\n onMouseDown: (event: React.MouseEvent<SVGPolygonElement, MouseEvent>) => void;\n};\nexport const BarDisplay: React.FC<BarDisplayProps> = ({\n x,\n y,\n type,\n width,\n height,\n isSelected,\n progressX,\n progressWidth,\n barCornerRadius,\n styles,\n segments,\n onMouseDown,\n}) => {\n const getProcessColor = () => {\n return isSelected ? styles.progressSelectedColor : styles.progressColor;\n };\n\n const getBarColor = () => {\n return isSelected ? styles.backgroundSelectedColor : styles.backgroundColor;\n };\n\n if (type === \"planned\") {\n if (segments && segments.length > 0) {\n // Multi-segment rendering: one rect per working interval\n const totalWidth = width;\n return (\n <g onMouseDown={onMouseDown}>\n {segments.map((seg, idx) => (\n <rect\n key={`seg-${idx}`}\n x={seg.x1}\n width={seg.x2 - seg.x1}\n y={y}\n height={height}\n ry={barCornerRadius}\n rx={barCornerRadius}\n fill={getBarColor()}\n strokeWidth={2}\n stroke={styles.criticalPathColor}\n />\n ))}\n {/* Progress overlay: distribute progressWidth proportionally */}\n {progressWidth > 0 && (() => {\n const rects: React.ReactNode[] = [];\n let remaining = progressWidth;\n for (const seg of segments) {\n if (remaining <= 0) break;\n const segW = seg.x2 - seg.x1;\n const ratio = totalWidth > 0 ? segW / totalWidth : 0;\n const pw = Math.min(remaining, progressWidth * ratio);\n if (pw > 0) {\n rects.push(\n <rect\n key={`prog-${seg.x1}`}\n x={seg.x1}\n width={pw}\n y={y}\n height={height}\n ry={barCornerRadius}\n rx={barCornerRadius}\n fill={getProcessColor()}\n />\n );\n remaining -= pw;\n }\n }\n return rects;\n })()}\n </g>\n );\n }\n return (\n <g onMouseDown={onMouseDown}>\n <rect\n x={x}\n width={width}\n y={y}\n height={height}\n ry={barCornerRadius}\n rx={barCornerRadius}\n fill={getBarColor()}\n strokeWidth={2}\n stroke={styles.criticalPathColor}\n />\n <rect\n x={progressX}\n width={progressWidth}\n y={y}\n height={height}\n ry={barCornerRadius}\n rx={barCornerRadius}\n fill={getProcessColor()}\n />\n </g>\n );\n } else {\n if (segments && segments.length > 0) {\n return (\n <g onMouseDown={onMouseDown}>\n {segments.map((seg, idx) => (\n <rect\n key={`aseg-${idx}`}\n x={seg.x1}\n width={seg.x2 - seg.x1}\n y={y}\n height={height}\n ry={barCornerRadius}\n rx={barCornerRadius}\n fill={styles.taskProgressColor}\n />\n ))}\n <rect\n x={progressX}\n width={progressWidth}\n y={y}\n height={height}\n ry={barCornerRadius}\n rx={barCornerRadius}\n fill={getProcessColor()}\n />\n </g>\n );\n }\n return (\n <g onMouseDown={onMouseDown}>\n <rect\n x={x}\n width={width}\n y={y}\n height={height}\n ry={barCornerRadius}\n rx={barCornerRadius}\n fill={styles.taskProgressColor}\n />\n <rect\n x={progressX}\n width={progressWidth}\n y={y}\n height={height}\n ry={barCornerRadius}\n rx={barCornerRadius}\n fill={getProcessColor()}\n />\n </g>\n );\n }\n};\n","import React from \"react\";\nimport styles from \"./bar.module.css\";\n\ntype BarDateHandleProps = {\n x: number;\n y: number;\n width: number;\n height: number;\n barCornerRadius: number;\n onMouseDown: (event: React.MouseEvent<SVGRectElement, MouseEvent>) => void;\n};\nexport const BarDateHandle: React.FC<BarDateHandleProps> = ({\n x,\n y,\n width,\n height,\n barCornerRadius,\n onMouseDown,\n}) => {\n return (\n <rect\n x={x}\n y={y}\n width={width}\n height={height}\n className={styles.barHandle}\n ry={barCornerRadius}\n rx={barCornerRadius}\n onMouseDown={onMouseDown}\n />\n );\n};\n","import React from \"react\";\n// import styles from \"./bar.module.css\";\n\ntype BarProgressHandleProps = {\n progressPoint: string;\n onMouseDown: (event: React.MouseEvent<SVGPolygonElement, MouseEvent>) => void;\n};\nexport const BarProgressHandle: React.FC<BarProgressHandleProps> = (\n {\n // progressPoint,\n // onMouseDown,\n }\n) => {\n return (\n <div />\n // <polygon\n // className={styles.barHandle}\n // points={progressPoint}\n // onMouseDown={onMouseDown}\n // />\n );\n};\n","import React from \"react\";\nimport { getProgressPoint } from \"../../../helpers/bar-helper\";\nimport { BarDisplay } from \"./bar-display\";\nimport { BarDateHandle } from \"./bar-date-handle\";\nimport { BarProgressHandle } from \"./bar-progress-handle\";\nimport { TaskItemProps } from \"../task-item\";\nimport styles from \"./bar.module.css\";\n\nexport const Bar: React.FC<TaskItemProps> = ({\n task,\n isProgressChangeable,\n isDateChangeable,\n rtl,\n type,\n onEventStart,\n isSelected,\n}) => {\n const progressPoint = getProgressPoint(\n +!rtl * task.progressWidth + task.progressX,\n task.y,\n task.height\n );\n const handleHeight = task.height / 2 - 1;\n\n // When segments exist (calendar with off-days/holidays), snap handles to the\n // nearest colored-bar boundary so they remain visible and usable even when the\n // task's declared start/end dates fall on off-days.\n const plannedSegs = task.plannedSegments;\n const plannedLeftHandleX = plannedSegs?.length\n ? plannedSegs[0].x1\n : task.x1;\n const plannedRightHandleX = plannedSegs?.length\n ? plannedSegs[plannedSegs.length - 1].x2\n : task.x2;\n\n const actualSegs = task.actualSegments;\n const actualLeftHandleX = actualSegs?.length\n ? actualSegs[0].x1\n : task.actualx1;\n const actualRightHandleX = actualSegs?.length\n ? actualSegs[actualSegs.length - 1].x2\n : task.actualx2;\n\n if (type == \"planned\") {\n if (task?.x1 >= 0 && task?.x2 >= 0 && task.x2 - task.x1 >= 0)\n return (\n <g className={styles.barWrapper} tabIndex={0}>\n {/* Transparent hit area ensures hover stays active across segment gaps */}\n <rect x={task.x1} y={task.y} width={task.x2 - task.x1} height={task.height / 2} fill=\"transparent\" />\n <BarDisplay\n x={task.x1}\n y={task.y}\n type={type as string}\n startProgressWidth={task.progressStartWidth}\n endProgressWidth={task.progressEndWidth}\n width={task.x2 - task.x1}\n height={task.height / 2}\n progressX={task.progressX}\n progressWidth={task.progressWidth}\n barCornerRadius={task.barCornerRadius}\n styles={task.styles}\n isSelected={isSelected}\n segments={task.plannedSegments}\n onMouseDown={e => {\n isDateChangeable && onEventStart(\"move\", task, e, \"planned\");\n }}\n />\n <g className=\"handleGroup\">\n {isDateChangeable && (\n <g>\n {/* left — anchored to first segment so it stays on the colored bar\n even when the declared start date falls on an off-day/holiday */}\n <BarDateHandle\n x={plannedLeftHandleX + 1}\n y={task.y + 1}\n width={task.handleWidth}\n height={handleHeight}\n barCornerRadius={task.barCornerRadius}\n onMouseDown={e => {\n onEventStart(\"start\", task, e, \"planned\");\n }}\n />\n {/* right — anchored to last segment */}\n <BarDateHandle\n x={plannedRightHandleX - task.handleWidth - 1}\n y={task.y + 1}\n width={task.handleWidth}\n height={handleHeight}\n barCornerRadius={task.barCornerRadius}\n onMouseDown={e => {\n onEventStart(\"end\", task, e, \"planned\");\n }}\n />\n </g>\n )}\n {isProgressChangeable && (\n <BarProgressHandle\n progressPoint={progressPoint}\n onMouseDown={e => {\n onEventStart(\"progress\", task, e, \"planned\");\n }}\n />\n )}\n </g>\n </g>\n );\n else return <g className={styles.barWrapper} tabIndex={0}></g>;\n } else if (task?.actualx1 >= 0 && task?.actualx2 >= 0 && task.actualx2 - task.actualx1 >= 0) {\n return (\n <g className={styles.barWrapper} tabIndex={0}>\n {/* Transparent hit area ensures hover stays active across segment gaps */}\n <rect x={task.actualx1} y={task.y + task.height / 2} width={task.actualx2 - task.actualx1} height={task.height / 2} fill=\"transparent\" />\n <BarDisplay\n x={task.actualx1}\n y={task.y + task.height / 2}\n type={type as string}\n startProgressWidth={task.progressStartWidth}\n endProgressWidth={task.progressEndWidth}\n width={task.actualx2 - task.actualx1}\n height={task.height / 2}\n progressX={task.progressX}\n progressWidth={task.progressWidth}\n barCornerRadius={task.barCornerRadius}\n styles={task.styles}\n isSelected={isSelected}\n segments={task.actualSegments}\n onMouseDown={e => {\n isDateChangeable && onEventStart(\"move\", task, e, \"actual\");\n }}\n />\n <g className=\"handleGroup\">\n {isDateChangeable && (\n <g>\n {/* left — anchored to first actual segment */}\n <BarDateHandle\n x={actualLeftHandleX + 1}\n y={task.y + task.height / 2 + 1}\n width={task.handleWidth}\n height={handleHeight}\n barCornerRadius={task.barCornerRadius}\n onMouseDown={e => {\n onEventStart(\"start\", task, e, \"actual\");\n }}\n />\n {/* right — anchored to last actual segment */}\n <BarDateHandle\n x={actualRightHandleX - task.handleWidth - 1}\n y={task.y + task.height / 2 + 1}\n width={task.handleWidth}\n height={handleHeight}\n barCornerRadius={task.barCornerRadius}\n onMouseDown={e => {\n onEventStart(\"end\", task, e, \"actual\");\n }}\n />\n </g>\n )}\n {isProgressChangeable && (\n <BarProgressHandle\n progressPoint={progressPoint}\n onMouseDown={e => {\n onEventStart(\"progress\", task, e, \"actual\");\n }}\n />\n )}\n </g>\n </g>\n );\n } else {\n return <g className={styles.barWrapper} tabIndex={0}></g>;\n }\n};\n","import React from \"react\";\nimport { getProgressPoint } from \"../../../helpers/bar-helper\";\nimport { BarDisplay } from \"./bar-display\";\nimport { BarProgressHandle } from \"./bar-progress-handle\";\nimport { TaskItemProps } from \"../task-item\";\nimport styles from \"./bar.module.css\";\n\nexport const BarSmall: React.FC<TaskItemProps> = ({\n task,\n type,\n isProgressChangeable,\n isDateChangeable,\n onEventStart,\n isSelected,\n}) => {\n const progressPoint = getProgressPoint(\n task.progressWidth + task.x1,\n task.y,\n task.height\n );\n return (\n <g className={styles.barWrapper} tabIndex={0}>\n <BarDisplay\n x={task.x1}\n y={task.y}\n type={type as string}\n // actualX1={task.actualx1}\n // actualX2={task.actualx2}\n startProgressWidth={task.progressStartWidth}\n endProgressWidth={task.progressEndWidth}\n width={task.x2 - task.x1}\n height={task.height}\n progressX={task.progressX}\n progressWidth={task.progressWidth}\n barCornerRadius={task.barCornerRadius}\n styles={task.styles}\n isSelected={isSelected}\n onMouseDown={e => {\n isDateChangeable && onEventStart(\"move\", task, e);\n }}\n />\n <g className=\"handleGroup\">\n {isProgressChangeable && (\n <BarProgressHandle\n progressPoint={progressPoint}\n onMouseDown={e => {\n onEventStart(\"progress\", task, e);\n }}\n />\n )}\n </g>\n </g>\n );\n};\n","import React from \"react\";\nimport { TaskItemProps } from \"../task-item\";\nimport styles from \"./milestone.module.css\";\n\nexport const Milestone: React.FC<TaskItemProps> = ({\n task,\n isDateChangeable,\n onEventStart,\n isSelected,\n}) => {\n const transform = `rotate(45 ${task.x1 + task.height * 0.356} \n ${task.y + task.height * 0.85})`;\n const getBarColor = () => {\n return isSelected\n ? task.styles.backgroundSelectedColor\n : task.styles.backgroundColor;\n };\n\n return (\n <g tabIndex={0} className={styles.milestoneWrapper}>\n <rect\n fill={getBarColor()}\n x={task.x1}\n width={task.height}\n y={task.y}\n height={task.height}\n rx={task.barCornerRadius}\n ry={task.barCornerRadius}\n transform={transform}\n className={styles.milestoneBackground}\n onMouseDown={e => {\n isDateChangeable && onEventStart(\"move\", task, e,\"planned\");\n }}\n onDoubleClick={e => {\n onEventStart(\"dblclick\", task, e);\n }}\n />\n </g>\n );\n};\n","import React from \"react\";\nimport { TaskItemProps } from \"../task-item\";\nimport styles from \"./project.module.css\";\n\nexport const Project: React.FC<TaskItemProps> = ({ task, isSelected }) => {\n const barColor = isSelected\n ? task.styles.backgroundSelectedColor\n : task.styles.backgroundColor;\n const processColor = isSelected\n ? task.styles.progressSelectedColor\n : task.styles.progressColor;\n const projectWith = task.x2 - task.x1;\n\n const projectLeftTriangle = [\n task.x1,\n task.y + task.height / 2 - 1,\n task.x1,\n task.y + task.height,\n task.x1 + 15,\n task.y + task.height / 2 - 1,\n ].join(\",\");\n const projectRightTriangle = [\n task.x2,\n task.y + task.height / 2 - 1,\n task.x2,\n task.y + task.height,\n task.x2 - 15,\n task.y + task.height / 2 - 1,\n ].join(\",\");\n\n return (\n <g tabIndex={0} className={styles.projectWrapper}>\n <rect\n fill={barColor}\n x={task.x1}\n width={projectWith}\n y={task.y}\n height={task.height}\n rx={task.barCornerRadius}\n ry={task.barCornerRadius}\n className={styles.projectBackground}\n />\n <rect\n x={task.progressX}\n width={task.progressWidth}\n y={task.y}\n height={task.height}\n ry={task.barCornerRadius}\n rx={task.barCornerRadius}\n fill={processColor}\n />\n <rect\n fill={barColor}\n x={task.x1}\n width={projectWith}\n y={task.y}\n height={task.height / 2}\n rx={task.barCornerRadius}\n ry={task.barCornerRadius}\n className={styles.projectTop}\n />\n <polygon\n className={styles.projectTop}\n points={projectLeftTriangle}\n fill={barColor}\n />\n <polygon\n className={styles.projectTop}\n points={projectRightTriangle}\n fill={barColor}\n />\n </g>\n );\n};\n","import React, { useEffect, useState } from \"react\";\nimport { BarTask } from \"../../types/bar-task\";\nimport { GanttContentMoveAction } from \"../../types/gantt-task-actions\";\nimport { Bar } from \"./bar/bar\";\nimport { BarSmall } from \"./bar/bar-small\";\nimport { Milestone } from \"./milestone/milestone\";\nimport { Project } from \"./project/project\";\n// import style from \"./task-list.module.css\";\n\nexport type TaskItemProps = {\n task: BarTask;\n arrowIndent: number;\n taskHeight: number;\n isProgressChangeable: boolean;\n isDateChangeable: boolean;\n isDelete: boolean;\n isSelected: boolean;\n rtl: boolean;\n type?: string;\n onEventStart: (\n action: GanttContentMoveAction,\n selectedTask: BarTask,\n event?: React.MouseEvent | React.KeyboardEvent,\n type?: string\n ) => any;\n};\n\nexport const TaskItem: React.FC<TaskItemProps> = props => {\n const {\n task,\n // arrowIndent,\n isDelete,\n // taskHeight,\n isSelected,\n // rtl,\n onEventStart,\n } = {\n ...props,\n };\n // const textRef = useRef<SVGTextElement>(null);\n const [taskItem, setTaskItem] = useState<JSX.Element[]>([<div />]);\n // const [isTextInside, setIsTextInside] = useState(true);\n\n useEffect(() => {\n switch (task.typeInternal) {\n case \"milestone\":\n if (task.x1 >= 0 && task.actualx1 >= 0)\n setTaskItem([<Milestone {...props} />]);\n else setTaskItem([]);\n break;\n case \"project\":\n if (\n task?.x1 >= 0 &&\n task?.x2 >= 0 &&\n task.x2 > task.x1 &&\n task?.actualx1 >= 0 &&\n task?.actualx2 >= 0 &&\n task.actualx2 > task.actualx1\n )\n setTaskItem([<Project {...props} />]);\n else setTaskItem([]);\n break;\n case \"smalltask\":\n setTaskItem([<BarSmall {...props} />]);\n break;\n default:\n {\n let taskItem = [];\n if (task?.x1 >= 0 && task?.x2 >= 0) {\n taskItem.push(<Bar {...props} type={\"planned\"} />);\n }\n if (task?.actualx1 >= 0 && task?.actualx2 >= 0) {\n taskItem.push(<Bar {...props} type={\"actual\"} />);\n }\n setTaskItem(taskItem);\n }\n break;\n }\n }, [task, isSelected]);\n\n // useEffect(() => {\n // if (textRef.current) {\n // setIsTextInside(textRef.current.getBBox().width < task.x2 - task.x1);\n // }\n // }, [textRef, task]);\n\n // const getX = () => {\n // const width = task.x2 - task.x1;\n // const hasChild = task.barChildren.length > 0;\n // if (isTextInside) {\n // return task.x1 + width * 0.5;\n // }\n // if (rtl && textRef.current) {\n // return (\n // task.x1 -\n // textRef.current.getBBox().width -\n // arrowIndent * +hasChild -\n // arrowIndent * 0.2\n // );\n // } else {\n // return task.x1 + width + arrowIndent * +hasChild + arrowIndent * 0.2;\n // }\n // };\n\n return (\n <g>\n <g\n onKeyDown={e => {\n switch (e.key) {\n case \"Delete\": {\n if (isDelete) onEventStart(\"delete\", task, e, \"planned\");\n break;\n }\n }\n e.stopPropagation();\n }}\n onMouseEnter={e => {\n onEventStart(\"mouseenter\", task, e, \"planned\");\n }}\n onMouseLeave={e => {\n onEventStart(\"mouseleave\", task, e, \"planned\");\n }}\n onDoubleClick={e => {\n onEventStart(\"dblclick\", task, e, \"planned\");\n }}\n onClick={e => {\n onEventStart(\"click\", task, e, \"planned\");\n }}\n // onFocus={() => {\n // onEventStart(\"select\", task);\n // }}\n >\n {taskItem[0]}\n </g>\n <g\n onKeyDown={e => {\n switch (e.key) {\n case \"Delete\": {\n if (isDelete) onEventStart(\"delete\", task, e, \"actual\");\n break;\n }\n }\n e.stopPropagation();\n }}\n onMouseEnter={e => {\n onEventStart(\"mouseenter\", task, e, \"actual\");\n }}\n onMouseLeave={e => {\n onEventStart(\"mouseleave\", task, e, \"actual\");\n }}\n onDoubleClick={e => {\n onEventStart(\"dblclick\", task, e, \"actual\");\n }}\n onClick={e => {\n onEventStart(\"click\", task, e, \"actual\");\n }}\n // onFocus={() => {\n // onEventStart(\"select\", task);\n // }}\n >\n {taskItem[1]}\n </g>\n </g>\n );\n};\n","import React, { useEffect, useState } from \"react\";\nimport { VirtualItem } from \"@tanstack/react-virtual\";\nimport { CalendarDefinition, Dependency, EventOption } from \"../../types/public-types\";\nimport { BarTask } from \"../../types/bar-task\";\nimport { Arrow } from \"../other/arrow\";\nimport { handleTaskBySVGMouseEvent, taskXCoordinate } from \"../../helpers/bar-helper\";\nimport { isKeyboardEvent } from \"../../helpers/other-helper\";\nimport { TaskItem } from \"../task-item/task-item\";\nimport {\n BarMoveAction,\n GanttContentMoveAction,\n GanttEvent,\n} from \"../../types/gantt-task-actions\";\nimport { Milestone } from \"../task-item/milestone/milestone\";\nimport { snapToWorkingTime, getWorkingIntervals } from \"../../helpers/calendar-helper\";\nimport { startOfDate, addToDate } from \"../../helpers/date-helper\";\n\nexport type TaskGanttContentProps = {\n tasks: BarTask[];\n dates: Date[];\n ganttEvent: GanttEvent;\n selectedTask: BarTask | undefined;\n rowHeight: number;\n columnWidth: number;\n timeStep: number;\n svg?: React.RefObject<SVGSVGElement>;\n svgWidth: number;\n taskHeight: number;\n arrowColor: string;\n arrowIndent: number;\n fontSize: string;\n fontFamily: string;\n rtl: boolean;\n virtualItems?: VirtualItem[];\n visibleStartY: number;\n visibleEndY: number;\n projectCalendar?: CalendarDefinition;\n setGanttEvent: (value: GanttEvent) => void;\n setFailedTask: (value: BarTask | null) => void;\n setSelectedTask: (taskId: string) => void;\n onBarTasksUpdate?: (task: BarTask) => void;\n sliderTime?: number;\n} & EventOption;\n\nexport const TaskGanttContent: React.FC<TaskGanttContentProps> = ({\n tasks,\n dates,\n ganttEvent,\n selectedTask,\n rowHeight,\n columnWidth,\n timeStep,\n svg,\n taskHeight,\n arrowIndent,\n fontFamily,\n fontSize,\n rtl,\n virtualItems = [],\n setGanttEvent,\n setFailedTask,\n setSelectedTask,\n onBarTasksUpdate,\n onDateChange,\n onProgressChange,\n onDoubleClick,\n onClick,\n onDelete,\n onCalendarError,\n projectCalendar,\n visibleStartY,\n visibleEndY,\n sliderTime,\n}) => {\n const point = svg?.current?.createSVGPoint();\n const [xStep, setXStep] = useState(0);\n const [initEventX1Delta, setInitEventX1Delta] = useState(0);\n const [isMoving, setIsMoving] = useState(false);\n\n // create xStep\n useEffect(() => {\n if (dates.length < 2) {\n // Degenerate single-column range (e.g. lookAhead with start === end):\n // there's no second date to derive the column span from, so assume a\n // one-day column instead of dereferencing dates[1].\n setXStep((timeStep * columnWidth) / 86400000);\n return;\n }\n const dateDelta =\n dates[1].getTime() -\n dates[0].getTime() -\n dates[1].getTimezoneOffset() * 60 * 1000 +\n dates[0].getTimezoneOffset() * 60 * 1000;\n const newXStep = (timeStep * columnWidth) / dateDelta;\n setXStep(newXStep);\n }, [columnWidth, dates, timeStep]);\n\n useEffect(() => {\n const handleMouseMove = async (event: MouseEvent) => {\n if (!ganttEvent.changedTask || !point || !svg?.current) return;\n event.preventDefault();\n\n point.x = event.clientX;\n const cursor = point.matrixTransform(\n svg?.current.getScreenCTM()?.inverse()\n );\n const { isChanged, changedTask } = handleTaskBySVGMouseEvent(\n cursor.x,\n ganttEvent.action as BarMoveAction,\n ganttEvent.changedTask,\n ganttEvent.type as string,\n xStep,\n timeStep,\n initEventX1Delta,\n rtl\n );\n if (isChanged) {\n let finalTask = { ...changedTask };\n const dragType = ganttEvent.type as string;\n if (\n changedTask.calendar &&\n (ganttEvent.action === \"end\" ||\n ganttEvent.action === \"start\" ||\n ganttEvent.action === \"move\")\n ) {\n const cal = finalTask.calendar!;\n if (dragType === \"actual\") {\n // --- Actual bar snapping ---\n if (ganttEvent.action === \"end\") {\n const snapped = snapToWorkingTime(finalTask.actualEnd, cal, \"forward\");\n finalTask.actualEnd = snapped;\n finalTask.actualx2 = taskXCoordinate(snapped, dates, columnWidth);\n } else if (ganttEvent.action === \"start\") {\n const snapped = snapToWorkingTime(finalTask.actualStart, cal, \"forward\");\n finalTask.actualStart = snapped;\n finalTask.actualx1 = taskXCoordinate(snapped, dates, columnWidth);\n } else {\n const snapped = snapToWorkingTime(finalTask.actualStart, cal, \"forward\");\n const delta = snapped.getTime() - finalTask.actualStart.getTime();\n finalTask.actualStart = snapped;\n finalTask.actualEnd = new Date(finalTask.actualEnd.getTime() + delta);\n finalTask.actualx1 = taskXCoordinate(finalTask.actualStart, dates, columnWidth);\n finalTask.actualx2 = taskXCoordinate(finalTask.actualEnd, dates, columnWidth);\n }\n // Recompute actual segments\n const actEnd = addToDate(startOfDate(finalTask.actualEnd, \"day\"), 1, \"day\");\n const actIntervals = getWorkingIntervals(finalTask.actualStart, actEnd, cal);\n const actSegs = actIntervals\n .map(iv => ({ x1: taskXCoordinate(iv.start, dates, columnWidth), x2: taskXCoordinate(iv.end, dates, columnWidth) }))\n .filter(s => s.x2 > s.x1);\n finalTask.actualSegments = actSegs.length > 0 ? actSegs : undefined;\n // Compute actual duration in real time\n const actDays = Math.max(1, Math.round((finalTask.actualEnd.getTime() - finalTask.actualStart.getTime()) / (1000 * 60 * 60 * 24)));\n finalTask.actualDuration = actDays;\n } else {\n // --- Planned bar snapping ---\n if (ganttEvent.action === \"end\") {\n const snapped = snapToWorkingTime(finalTask.end, cal, \"forward\");\n finalTask.end = snapped;\n finalTask.x2 = taskXCoordinate(snapped, dates, columnWidth);\n } else if (ganttEvent.action === \"start\") {\n const snapped = snapToWorkingTime(finalTask.start, cal, \"forward\");\n finalTask.start = snapped;\n finalTask.x1 = taskXCoordinate(snapped, dates, columnWidth);\n } else {\n const snapped = snapToWorkingTime(finalTask.start, cal, \"forward\");\n const delta = snapped.getTime() - finalTask.start.getTime();\n finalTask.start = snapped;\n finalTask.end = new Date(finalTask.end.getTime() + delta);\n finalTask.x1 = taskXCoordinate(finalTask.start, dates, columnWidth);\n finalTask.x2 = taskXCoordinate(finalTask.end, dates, columnWidth);\n }\n // Recompute planned segments\n const planEnd = addToDate(startOfDate(finalTask.end, \"day\"), 1, \"day\");\n const planIntervals = getWorkingIntervals(finalTask.start, planEnd, cal);\n const planSegs = planIntervals\n .map(iv => ({ x1: taskXCoordinate(iv.start, dates, columnWidth), x2: taskXCoordinate(iv.end, dates, columnWidth) }))\n .filter(s => s.x2 > s.x1);\n finalTask.plannedSegments = planSegs.length > 0 ? planSegs : undefined;\n // Compute planned duration in real time\n const planDays = Math.max(1, Math.round((finalTask.end.getTime() - finalTask.start.getTime()) / (1000 * 60 * 60 * 24)));\n finalTask.plannedDuration = planDays;\n }\n } else {\n // No calendar — still compute duration dynamically\n if (dragType === \"actual\") {\n const actDays = Math.max(1, Math.round((finalTask.actualEnd.getTime() - finalTask.actualStart.getTime()) / (1000 * 60 * 60 * 24)));\n finalTask.actualDuration = actDays;\n } else {\n const planDays = Math.max(1, Math.round((finalTask.end.getTime() - finalTask.start.getTime()) / (1000 * 60 * 60 * 24)));\n finalTask.plannedDuration = planDays;\n }\n }\n setGanttEvent({ action: ganttEvent.action, changedTask: finalTask, type: dragType });\n }\n };\n\n const handleMouseUp = async (event: MouseEvent) => {\n const { action, originalSelectedTask, changedTask, type } = ganttEvent;\n if (!changedTask || !point || !svg?.current || !originalSelectedTask)\n return;\n event.preventDefault();\n\n point.x = event.clientX;\n const cursor = point.matrixTransform(\n svg?.current.getScreenCTM()?.inverse()\n );\n const { changedTask: newChangedTask } = handleTaskBySVGMouseEvent(\n cursor.x,\n action as BarMoveAction,\n changedTask,\n type as string,\n xStep,\n timeStep,\n initEventX1Delta,\n rtl\n );\n\n const isNotLikeOriginal =\n originalSelectedTask.start !== newChangedTask.start ||\n originalSelectedTask.end !== newChangedTask.end ||\n originalSelectedTask.actualStart !== newChangedTask.actualStart ||\n originalSelectedTask.actualEnd !== newChangedTask.actualEnd ||\n originalSelectedTask.progress !== newChangedTask.progress;\n\n // Calendar snap: snap to nearest working time based on action direction\n const dropType = type as string;\n if (\n newChangedTask.calendar &&\n (action === \"move\" || action === \"end\" || action === \"start\")\n ) {\n const cal = newChangedTask.calendar;\n if (dropType === \"actual\") {\n // --- Actual bar snapping on drop ---\n if (action === \"end\") {\n const snappedEnd = snapToWorkingTime(newChangedTask.actualEnd, cal, \"forward\");\n newChangedTask.actualEnd = snappedEnd;\n newChangedTask.actualx2 = taskXCoordinate(snappedEnd, dates, columnWidth);\n } else if (action === \"start\") {\n const snappedStart = snapToWorkingTime(newChangedTask.actualStart, cal, \"forward\");\n if (snappedStart >= newChangedTask.actualEnd) {\n setFailedTask(originalSelectedTask);\n onCalendarError?.(newChangedTask, \"No working time in selected range\");\n setGanttEvent({ action: \"\" });\n setIsMoving(false);\n svg.current.removeEventListener(\"mousemove\", handleMouseMove);\n svg.current.removeEventListener(\"mouseup\", handleMouseUp);\n return;\n }\n newChangedTask.actualStart = snappedStart;\n newChangedTask.actualx1 = taskXCoordinate(snappedStart, dates, columnWidth);\n } else {\n const snappedStart = snapToWorkingTime(newChangedTask.actualStart, cal, \"forward\");\n const delta = snappedStart.getTime() - newChangedTask.actualStart.getTime();\n newChangedTask.actualStart = snappedStart;\n newChangedTask.actualEnd = new Date(newChangedTask.actualEnd.getTime() + delta);\n newChangedTask.actualx1 = taskXCoordinate(snappedStart, dates, columnWidth);\n newChangedTask.actualx2 = taskXCoordinate(newChangedTask.actualEnd, dates, columnWidth);\n }\n const actEnd = addToDate(startOfDate(newChangedTask.actualEnd, \"day\"), 1, \"day\");\n const actIntervals = getWorkingIntervals(newChangedTask.actualStart, actEnd, cal);\n const actSegs = actIntervals\n .map(iv => ({ x1: taskXCoordinate(iv.start, dates, columnWidth), x2: taskXCoordinate(iv.end, dates, columnWidth) }))\n .filter(s => s.x2 > s.x1);\n newChangedTask.actualSegments = actSegs.length > 0 ? actSegs : undefined;\n // Compute actual duration\n const actDays = Math.max(1, Math.round((newChangedTask.actualEnd.getTime() - newChangedTask.actualStart.getTime()) / (1000 * 60 * 60 * 24)));\n newChangedTask.actualDuration = actDays;\n } else {\n // --- Planned bar snapping on drop ---\n if (action === \"end\") {\n const snappedEnd = snapToWorkingTime(newChangedTask.end, cal, \"forward\");\n newChangedTask.end = snappedEnd;\n newChangedTask.x2 = taskXCoordinate(snappedEnd, dates, columnWidth);\n } else if (action === \"start\") {\n const snappedStart = snapToWorkingTime(newChangedTask.start, cal, \"forward\");\n if (snappedStart >= newChangedTask.end) {\n setFailedTask(originalSelectedTask);\n onCalendarError?.(newChangedTask, \"No working time in selected range\");\n setGanttEvent({ action: \"\" });\n setIsMoving(false);\n svg.current.removeEventListener(\"mousemove\", handleMouseMove);\n svg.current.removeEventListener(\"mouseup\", handleMouseUp);\n return;\n }\n newChangedTask.start = snappedStart;\n newChangedTask.x1 = taskXCoordinate(snappedStart, dates, columnWidth);\n } else {\n const snappedStart = snapToWorkingTime(newChangedTask.start, cal, \"forward\");\n const delta = snappedStart.getTime() - newChangedTask.start.getTime();\n newChangedTask.start = snappedStart;\n newChangedTask.end = new Date(newChangedTask.end.getTime() + delta);\n newChangedTask.x1 = taskXCoordinate(snappedStart, dates, columnWidth);\n newChangedTask.x2 = taskXCoordinate(newChangedTask.end, dates, columnWidth);\n }\n const planEnd = addToDate(startOfDate(newChangedTask.end, \"day\"), 1, \"day\");\n const planIntervals = getWorkingIntervals(newChangedTask.start, planEnd, cal);\n const planSegs = planIntervals\n .map(iv => ({ x1: taskXCoordinate(iv.start, dates, columnWidth), x2: taskXCoordinate(iv.end, dates, columnWidth) }))\n .filter(s => s.x2 > s.x1);\n newChangedTask.plannedSegments = planSegs.length > 0 ? planSegs : undefined;\n // Compute planned duration\n const planDays = Math.max(1, Math.round((newChangedTask.end.getTime() - newChangedTask.start.getTime()) / (1000 * 60 * 60 * 24)));\n newChangedTask.plannedDuration = planDays;\n }\n } else if (action === \"move\" || action === \"end\" || action === \"start\") {\n // No calendar — still compute duration on drop\n if (dropType === \"actual\") {\n const actDays = Math.max(1, Math.round((newChangedTask.actualEnd.getTime() - newChangedTask.actualStart.getTime()) / (1000 * 60 * 60 * 24)));\n newChangedTask.actualDuration = actDays;\n } else {\n const planDays = Math.max(1, Math.round((newChangedTask.end.getTime() - newChangedTask.start.getTime()) / (1000 * 60 * 60 * 24)));\n newChangedTask.plannedDuration = planDays;\n }\n }\n\n // remove listeners\n svg.current.removeEventListener(\"mousemove\", handleMouseMove);\n svg.current.removeEventListener(\"mouseup\", handleMouseUp);\n\n // Sync barTasks to final drag position BEFORE clearing ganttEvent (prevents reset flash)\n if (onBarTasksUpdate && isNotLikeOriginal) {\n onBarTasksUpdate(newChangedTask);\n }\n setGanttEvent({ action: \"\" });\n setIsMoving(false);\n\n // custom operation start\n let operationSuccess = true;\n if (\n (action === \"move\" || action === \"end\" || action === \"start\") &&\n onDateChange &&\n isNotLikeOriginal\n ) {\n try {\n const result = await onDateChange(\n newChangedTask,\n newChangedTask.barChildren\n );\n if (result !== undefined) {\n operationSuccess = result;\n }\n } catch (error) {\n operationSuccess = false;\n }\n } else if (onProgressChange && isNotLikeOriginal) {\n try {\n const result = await onProgressChange(\n newChangedTask,\n newChangedTask.barChildren\n );\n if (result !== undefined) {\n operationSuccess = result;\n }\n } catch (error) {\n operationSuccess = false;\n }\n }\n\n // If operation is failed - return old state\n if (!operationSuccess) {\n setFailedTask(originalSelectedTask);\n }\n };\n\n if (\n !isMoving &&\n (ganttEvent.action === \"move\" ||\n ganttEvent.action === \"end\" ||\n ganttEvent.action === \"start\" ||\n ganttEvent.action === \"progress\") &&\n svg?.current\n ) {\n svg.current.addEventListener(\"mousemove\", handleMouseMove);\n svg.current.addEventListener(\"mouseup\", handleMouseUp);\n setIsMoving(true);\n }\n }, [\n ganttEvent,\n xStep,\n initEventX1Delta,\n onProgressChange,\n timeStep,\n onDateChange,\n onCalendarError,\n projectCalendar,\n svg,\n isMoving,\n point,\n rtl,\n setFailedTask,\n setGanttEvent,\n onBarTasksUpdate,\n dates,\n columnWidth,\n ]);\n\n /**\n * Entry point for taskbar interaction events\n * (select, delete, drag/move start, click, double-click, hover, etc.).\n */\n const handleBarEventStart = async (\n action: GanttContentMoveAction,\n task: BarTask,\n event?: React.MouseEvent | React.KeyboardEvent,\n type?: string\n ) => {\n if (!event) {\n if (action === \"select\") {\n setSelectedTask(task.id);\n }\n }\n // Keyboard events\n else if (isKeyboardEvent(event)) {\n if (action === \"delete\") {\n if (onDelete) {\n try {\n const result = await onDelete(task);\n if (result !== undefined && result) {\n setGanttEvent({ action, changedTask: task });\n }\n } catch (error) {\n console.error(\"Error on Delete. \" + error);\n }\n }\n }\n }\n // Mouse Events\n else if (action === \"mouseenter\") {\n if (!ganttEvent.action) {\n setGanttEvent({\n action,\n changedTask: task,\n originalSelectedTask: task,\n type: type,\n });\n }\n } else if (action === \"mouseleave\") {\n if (ganttEvent.action === \"mouseenter\") {\n setGanttEvent({ action: \"\" });\n }\n } else if (action === \"dblclick\") {\n !!onDoubleClick && onDoubleClick(task);\n } else if (action === \"click\") {\n !!onClick && onClick(task);\n }\n // Change task event start\n else if (action === \"move\") {\n if (!svg?.current || !point) return;\n point.x = event.clientX;\n const cursor = point.matrixTransform(\n svg.current.getScreenCTM()?.inverse()\n );\n if (type == \"planned\") setInitEventX1Delta(cursor.x - task.x1);\n else if (type == \"actual\") setInitEventX1Delta(cursor.x - task.actualx1);\n setGanttEvent({\n action,\n changedTask: task,\n originalSelectedTask: task,\n type: type,\n });\n } else {\n setGanttEvent({\n action,\n changedTask: task,\n originalSelectedTask: task,\n type: type,\n });\n }\n };\n\n // Indexed once per barTasks change; getArrows runs 3x per render and used to\n // walk every task. Row y is drag-stable, so minY/maxY can be precomputed.\n const arrowIndex = React.useMemo(() => {\n const entries: {\n from: number;\n to: number;\n minY: number;\n maxY: number;\n dependencyType: Dependency;\n }[] = [];\n for (let i = 0; i < tasks.length; i++) {\n const task = tasks[i];\n const yFrom = task.y + taskHeight / 2;\n for (const child of task.barChildren) {\n const taskTo = tasks[child.index];\n if (!taskTo) continue;\n const yTo = taskTo.y + taskHeight / 2;\n entries.push({\n from: i,\n to: child.index,\n minY: Math.min(yFrom, yTo),\n maxY: Math.max(yFrom, yTo),\n dependencyType: child.dependencyType as Dependency,\n });\n }\n }\n return entries;\n }, [tasks, taskHeight]);\n\n const getArrows = (isCritical: boolean, criticalPathType?: string) => {\n const out: JSX.Element[] = [];\n const a = ganttEvent.action;\n const dragging =\n (a === \"move\" || a === \"start\" || a === \"end\" || a === \"progress\") &&\n !!ganttEvent.changedTask;\n\n for (const e of arrowIndex) {\n if (e.maxY < visibleStartY || e.minY > visibleEndY) continue;\n\n const _task = tasks[e.from];\n // Live preview only while actively dragged, not on hover; changedTask.y is 0.\n const task =\n dragging && ganttEvent.changedTask!.id === _task.id\n ? { ...ganttEvent.changedTask!, y: _task.y }\n : _task;\n if (!(task.start.getTime() > 0 && task.end.getTime() > 0)) continue;\n\n const taskTo = tasks[e.to];\n // Both ends need an in-range bar; clamped x-coords would fling the arrow.\n const fromDrawable = task.x2 > task.x1 || task.actualx2 > task.actualx1;\n const toDrawable =\n taskTo.x2 > taskTo.x1 || taskTo.actualx2 > taskTo.actualx1;\n if (!fromDrawable || !toDrawable) continue;\n\n const criticalTask = task.criticalPathArrows?.find(\n arrow =>\n arrow.taskId === taskTo.id &&\n (!!arrow.criticalPathType\n ? arrow.criticalPathType === criticalPathType\n : !criticalPathType)\n );\n\n if (!!criticalTask !== isCritical) continue;\n\n out.push(\n <Arrow\n key={`Arrow from ${task.id} to ${taskTo.id}${\n isCritical ? \"-critical\" : \"\"\n }`}\n taskFrom={task}\n taskTo={taskTo}\n rowHeight={rowHeight}\n dependencyType={e.dependencyType}\n taskHeight={taskHeight}\n arrowIndent={arrowIndent}\n arrowColor={criticalTask?.arrowColor || \"#808080\"}\n />\n );\n }\n return out;\n };\n\n // Calculate x position for the vertical line from sliderTime\n const lineX = sliderTime !== undefined ? taskXCoordinate(new Date(sliderTime), dates, columnWidth) : null;\n const totalHeight = tasks.length * rowHeight;\n\n\n\n\n return (\n <g className=\"content\">\n {/* Vertical blue line for the slider-time marker */}\n {lineX !== null && lineX > 0 && (\n <line\n x1={lineX}\n y1={0}\n x2={lineX}\n y2={totalHeight}\n stroke=\"blue\"\n strokeWidth={2}\n pointerEvents=\"none\"\n opacity={0.8}\n />\n )}\n <g className=\"arrows\">\n {/* Render non-critical arrows first */}\n {getArrows(false)}\n {/* Render secondary critical path arrows on top */}\n {getArrows(true, \"secondary\")}\n {/* Render primary critical path arrows on top */}\n {getArrows(true, \"primary\")}\n </g>\n <g className=\"bar\" fontFamily={fontFamily} fontSize={fontSize}>\n {virtualItems.map(vi => {\n const _task = tasks[vi.index];\n // Use live drag preview for instant smooth updates (1 render/mousemove instead of 2)\n const task =\n ganttEvent.changedTask && ganttEvent.changedTask.id === _task.id\n ? { ...ganttEvent.changedTask, y: 0 }\n : { ..._task, y: 0 };\n if (!task && _task.typeInternal === \"milestone\") {\n return (\n <g key={_task.id} transform={`translate(0, ${vi.start})`}>\n <Milestone\n task={task}\n arrowIndent={arrowIndent}\n taskHeight={taskHeight}\n isProgressChangeable={false}\n isDateChangeable={false}\n isDelete={!_task.isDisabled}\n onEventStart={handleBarEventStart}\n isSelected={!!selectedTask && _task.id === selectedTask.id}\n rtl={rtl}\n />\n </g>\n );\n }\n if (!task) {\n return (\n <g\n key={_task.id}\n transform={`translate(0, ${vi.start})`}\n style={{ height: taskHeight }}\n />\n );\n }\n return (\n <g key={task.id} transform={`translate(0, ${vi.start})`}>\n <TaskItem\n task={task}\n arrowIndent={arrowIndent}\n taskHeight={taskHeight}\n isProgressChangeable={!!onProgressChange && !task.isDisabled}\n isDateChangeable={!!onDateChange && !task.isDisabled}\n isDelete={!task.isDisabled}\n onEventStart={handleBarEventStart}\n isSelected={!!selectedTask && task.id === selectedTask.id}\n rtl={rtl}\n />\n </g>\n );\n })}\n </g>\n </g>\n );\n};\n","import React, { useEffect, useRef } from \"react\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport { GridProps, Grid } from \"../grid/grid\";\nimport { CalendarProps, Calendar } from \"../calendar/calendar\";\nimport { TaskGanttContentProps, TaskGanttContent } from \"./task-gantt-content\";\nimport styles from \"./gantt.module.css\";\n\nexport type TaskGanttProps = {\n gridProps: GridProps;\n calendarProps: CalendarProps;\n barProps: TaskGanttContentProps;\n ganttHeight: number;\n scrollY: number;\n scrollX: number;\n};\nexport const TaskGantt: React.FC<TaskGanttProps> = ({\n gridProps,\n calendarProps,\n barProps,\n ganttHeight,\n scrollY,\n scrollX,\n}) => {\n const ganttSVGRef = useRef<SVGSVGElement>(null);\n const horizontalContainerRef = useRef<HTMLDivElement>(null);\n const verticalGanttContainerRef = useRef<HTMLDivElement>(null);\n const newBarProps = { ...barProps, svg: ganttSVGRef, ganttHeight, scrollY };\n\n const buffer = barProps.rowHeight * 10;\n const visibleStartY = scrollY - buffer;\n const visibleEndY = scrollY + ganttHeight + buffer;\n\n const virtualizer = useVirtualizer({\n count: barProps.tasks.length,\n getScrollElement: () => horizontalContainerRef.current,\n estimateSize: () => barProps.rowHeight,\n overscan: 10\n });\n\n useEffect(() => {\n if (horizontalContainerRef.current) {\n horizontalContainerRef.current.scrollTop = scrollY;\n }\n }, [scrollY]);\n\n useEffect(() => {\n if (verticalGanttContainerRef.current) {\n verticalGanttContainerRef.current.scrollLeft = scrollX;\n }\n }, [scrollX]);\n\n return (\n <div\n className={styles.ganttVerticalContainer}\n ref={verticalGanttContainerRef}\n dir=\"ltr\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={gridProps.svgWidth}\n height={calendarProps.headerHeight}\n fontFamily={barProps.fontFamily}\n >\n <Calendar {...calendarProps} />\n </svg>\n <div\n ref={horizontalContainerRef}\n className={styles.horizontalContainer}\n style={\n ganttHeight\n ? { height: ganttHeight, width: gridProps.svgWidth }\n : { width: gridProps.svgWidth }\n }\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={gridProps.svgWidth}\n height={virtualizer.getTotalSize()}\n fontFamily={barProps.fontFamily}\n ref={ganttSVGRef}\n >\n <Grid\n {...gridProps}\n virtualItems={virtualizer.getVirtualItems()}\n visibleStartY={visibleStartY}\n visibleEndY={visibleEndY}\n />\n <TaskGanttContent\n {...newBarProps}\n visibleStartY={visibleStartY}\n visibleEndY={visibleEndY}\n virtualItems={virtualizer.getVirtualItems()}\n />\n </svg>\n </div>\n </div>\n );\n};\n","import React, { SyntheticEvent, useRef, useEffect } from \"react\";\nimport styles from \"./horizontal-scroll.module.css\";\n\nexport const HorizontalScroll: React.FC<{\n scroll: number;\n svgWidth: number;\n taskListWidth: number;\n rtl: boolean;\n onScroll: (event: SyntheticEvent<HTMLDivElement>) => void;\n}> = ({ scroll, svgWidth, taskListWidth, rtl, onScroll }) => {\n const scrollRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (scrollRef.current) {\n scrollRef.current.scrollLeft = scroll;\n }\n }, [scroll]);\n\n return (\n <div\n dir=\"ltr\"\n style={{\n margin: rtl\n ? `0px ${taskListWidth}px 0px 0px`\n : `0px 0px 0px ${taskListWidth}px`,\n }}\n className={styles.scrollWrapper}\n onScroll={onScroll}\n ref={scrollRef}\n >\n <div style={{ width: svgWidth }} className={styles.scroll} />\n </div>\n );\n};\n","import React, {\n useState,\n SyntheticEvent,\n useRef,\n useEffect,\n useMemo,\n} from \"react\";\nimport { ViewMode, GanttProps, Task } from \"../../types/public-types\";\nimport { GridProps } from \"../grid/grid\";\nimport {\n ganttDateRange,\n seedDates,\n VIEW_MODE_DEFAULT_VISIBLE_COUNT,\n VIEW_MODE_MAX_VISIBLE_COUNT,\n} from \"../../helpers/date-helper\";\nimport { CalendarProps } from \"../calendar/calendar\";\nimport { TaskGanttContentProps } from \"./task-gantt-content\";\nimport { TaskListHeaderDefault } from \"../task-list/task-list-header\";\nimport { TaskListTableDefault } from \"../task-list/task-list-table\";\nimport { StandardTooltipContent, Tooltip } from \"../other/tooltip\";\nimport { VerticalScroll } from \"../other/vertical-scroll\";\nimport { TaskListProps, TaskList } from \"../task-list/task-list\";\nimport { TaskGantt } from \"./task-gantt\";\nimport { BarTask } from \"../../types/bar-task\";\nimport { convertToBarTasks } from \"../../helpers/bar-helper\";\nimport { GanttEvent } from \"../../types/gantt-task-actions\";\nimport { DateSetup } from \"../../types/date-setup\";\nimport { HorizontalScroll } from \"../other/horizontal-scroll\";\nimport hScrollStyles from \"../other/horizontal-scroll.module.css\";\nimport { removeHiddenTasks, sortTasks } from \"../../helpers/other-helper\";\nimport styles from \"./gantt.module.css\";\n\n// Minimum share of the wrapper width reserved for the Gantt chart. The task-list\n// table is capped at the remaining width; past that the table scrolls horizontally\n// instead of shrinking the chart below this floor.\nconst GANTT_MIN_WIDTH_RATIO = 0.4;\n// Width (px) of the column-resize divider rendered between the table and chart.\nconst TABLE_GANTT_DIVIDER_WIDTH = 20;\n\nexport const Gantt: React.FunctionComponent<GanttProps> = ({\n tasks,\n primaryPath,\n secondaryPath,\n leafTasks = [],\n scheduleType = \"main\",\n startDate = new Date(),\n endDate = new Date(),\n headerHeight = 50,\n columnWidth: columnWidthProp,\n listCellWidth = \"155px\",\n rowHeight = 50,\n ganttHeight = 0,\n viewMode = ViewMode.Day,\n preStepsCount = 1,\n locale = \"en-US\",\n barFill = 60,\n barCornerRadius = 3,\n barProgressColor = \"#a3a3ff\",\n barProgressSelectedColor = \"#8282f5\",\n barBackgroundColor = \"#b8c2cc\",\n barBackgroundSelectedColor = \"#aeb8c2\",\n projectProgressColor = \"#7db59a\",\n projectProgressSelectedColor = \"#59a985\",\n projectBackgroundColor = \"#fac465\",\n projectBackgroundSelectedColor = \"#f7bb53\",\n milestoneBackgroundColor = \"#f1c453\",\n milestoneBackgroundSelectedColor = \"#f29e4c\",\n rtl = false,\n handleWidth = 8,\n timeStep = 300000,\n arrowColor = \"grey\",\n fontFamily = \"Arial, Roboto, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue\",\n fontSize = \"14px\",\n arrowIndent = 20,\n todayColor = \"rgba(252, 248, 227, 0.5)\",\n weekendColor = \"#e6e4e4\",\n viewDate,\n TooltipContent = StandardTooltipContent,\n TaskListHeader = TaskListHeaderDefault,\n TaskListTable = TaskListTableDefault,\n onDateChange,\n onProgressChange,\n onDoubleClick,\n onClick,\n onDelete,\n onSelect,\n onExpanderClick,\n onMultiSelect,\n taskLabelRenderer,\n delayToRender = 500,\n shouldNotShowLoadingOverlay=true,\n projectCalendar,\n onCalendarError,\n sliderTime,\n}) => {\n // console.debug(\"child\", tasks.length);\n const wrapperRef = useRef<HTMLDivElement>(null);\n const taskListRef = useRef<HTMLDivElement>(null);\n const isDraggingTable = useRef(false);\n // True once the user has dragged the resize bar — after that, columnWidth\n // is locked so pane resizing grows the visible count instead of fattening cols.\n const userResizedRef = useRef(false);\n const dragStartX = useRef(0);\n const dragStartWidth = useRef(0);\n const dragMaxWidth = useRef<number>(Infinity);\n const [tableContainerWidth, setTableContainerWidth] = useState<number | null>(null);\n const tableInnerScrollRef = useRef<HTMLDivElement>(null);\n const tableHorizontalContainerRef = useRef<HTMLDivElement>(null);\n const tableHScrollRef = useRef<HTMLDivElement>(null);\n // True total width of the table's columns, reported up by TaskList. Drives both\n // the table width cap (no white space) and the horizontal scrollbar extent.\n const [tableContentWidth, setTableContentWidth] = useState(0);\n const [dateSetup, setDateSetup] = useState<DateSetup>(() => {\n const [startDateRange, endDateRange] = tasks ? ganttDateRange(\n tasks,\n viewMode,\n preStepsCount\n ) : [new Date(), new Date()];\n if (scheduleType === \"lookAhead\") {\n return { viewMode, dates: seedDates(startDate, endDate, viewMode) };\n }\n return {\n viewMode,\n dates: seedDates(startDateRange, endDateRange, viewMode),\n };\n });\n const [currentViewDate, setCurrentViewDate] = useState<Date | undefined>(\n undefined\n );\n\n const [taskListWidth, setTaskListWidth] = useState(0);\n const [wrapperWidth, setWrapperWidth] = useState(0);\n\n // Cap the table at the wrapper width minus the chart's reserved minimum share\n // (and the resize divider). Infinity until the wrapper has been measured.\n const maxTableWidth =\n wrapperWidth > 0\n ? Math.max(\n 100,\n wrapperWidth * (1 - GANTT_MIN_WIDTH_RATIO) - TABLE_GANTT_DIVIDER_WIDTH\n )\n : Infinity;\n\n // The table may never be wider than its columns (no white space past the last\n // column) nor wider than maxTableWidth (chart keeps its 40% floor).\n const tableCap = Math.min(\n maxTableWidth,\n tableContentWidth > 0 ? tableContentWidth : Infinity\n );\n\n const handleTableResizeMouseDown = (e: React.MouseEvent) => {\n isDraggingTable.current = true;\n userResizedRef.current = true;\n dragStartX.current = e.clientX;\n dragStartWidth.current = tableContainerWidth ?? (taskListRef.current?.offsetWidth ?? 0);\n // Never let a drag exceed the columns' total width or shrink the chart below\n // its floor — both captured by tableCap.\n dragMaxWidth.current = tableCap;\n e.preventDefault();\n };\n\n useEffect(() => {\n const onMouseMove = (e: MouseEvent) => {\n if (!isDraggingTable.current) return;\n const newWidth = Math.min(dragMaxWidth.current, Math.max(100, dragStartWidth.current + (e.clientX - dragStartX.current)));\n setTableContainerWidth(newWidth);\n setTaskListWidth(newWidth);\n };\n const onMouseUp = () => {\n isDraggingTable.current = false;\n };\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseUp);\n return () => {\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseUp);\n };\n }, []);\n const [svgContainerWidth, setSvgContainerWidth] = useState(0);\n const [svgContainerHeight, setSvgContainerHeight] = useState(ganttHeight);\n const [barTasks, setBarTasks] = useState<BarTask[]>([]);\n const debounceRef = useRef<NodeJS.Timeout | null>(null);\n const [ganttEvent, setGanttEvent] = useState<GanttEvent>({\n action: \"\",\n });\n\n // Directly update a single bar task — called from TaskGanttContent on drag end\n // to sync barTasks to the final drag position before ganttEvent is cleared\n const handleBarTasksUpdate = (task: BarTask) => {\n setBarTasks(prev => prev.map(t => (t.id === task.id ? task : t)));\n };\n const taskHeight = useMemo(\n () => (rowHeight * barFill) / 100,\n [rowHeight, barFill]\n );\n\n const [selectedTask, setSelectedTask] = useState<BarTask>();\n const [failedTask, setFailedTask] = useState<BarTask | null>(null);\n\n // Auto-size columns per view-mode so the spec'd default count fits the\n // current chart pane. Keep re-snapping against svgContainerWidth while the\n // initial layout settles; once the user drags the resize bar (or the view\n // mode is settled), stop re-snapping so pane resizing grows the visible\n // count instead of fattening the columns.\n const [computedColumnWidth, setComputedColumnWidth] = useState<number | null>(null);\n const computedForViewModeRef = useRef<ViewMode | null>(null);\n useEffect(() => {\n if (columnWidthProp != null) return;\n if (svgContainerWidth <= 0) return;\n const minVisible = VIEW_MODE_DEFAULT_VISIBLE_COUNT[viewMode];\n if (!minVisible) return;\n const maxVisible = VIEW_MODE_MAX_VISIBLE_COUNT[viewMode];\n\n // View switch: carry the *relative* zoom across the switch instead of\n // snapping to whichever edge the carried-over width violates. Measure where\n // the previous view's visible count sat within its own [default..max] band\n // (t in [0,1]) and remap that same fraction onto the new view's band, then\n // convert the target visible count back to a column width. e.g. a Month view\n // sitting halfway between its default and max maps to a Day view sitting\n // halfway between its default and max. Mark it user-resized so the settling\n // branch below doesn't re-snap it back to the default count on the next render.\n const prevViewMode = computedForViewModeRef.current;\n if (\n prevViewMode != null &&\n prevViewMode !== viewMode &&\n computedColumnWidth != null\n ) {\n const visible = svgContainerWidth / computedColumnWidth;\n const oldMin = VIEW_MODE_DEFAULT_VISIBLE_COUNT[prevViewMode];\n const oldMax = VIEW_MODE_MAX_VISIBLE_COUNT[prevViewMode];\n\n let next = computedColumnWidth;\n if (maxVisible && oldMin != null && oldMax != null && oldMax > oldMin) {\n // Fraction through the old band: 0 = at its default count, 1 = at its max.\n const t = Math.min(1, Math.max(0, (visible - oldMin) / (oldMax - oldMin)));\n const targetVisible = minVisible + t * (maxVisible - minVisible);\n next = Math.floor(svgContainerWidth / targetVisible);\n } else if (visible < minVisible) {\n // Fallback (old view has no band): snap to the violated edge.\n next = Math.floor(svgContainerWidth / minVisible);\n } else if (maxVisible && visible > maxVisible) {\n next = Math.ceil(svgContainerWidth / maxVisible);\n }\n next = Math.max(20, next);\n computedForViewModeRef.current = viewMode;\n userResizedRef.current = true;\n if (next !== computedColumnWidth) {\n setComputedColumnWidth(next);\n }\n return;\n }\n\n // First computation / same-view settling: auto-size columns so the default\n // count fits, until the user drags the resize bar.\n const alreadySnappedForView =\n computedForViewModeRef.current === viewMode && computedColumnWidth != null;\n if (userResizedRef.current && alreadySnappedForView) return;\n const next = Math.max(20, Math.floor(svgContainerWidth / minVisible));\n computedForViewModeRef.current = viewMode;\n if (next !== computedColumnWidth) {\n setComputedColumnWidth(next);\n }\n }, [viewMode, svgContainerWidth, columnWidthProp, computedColumnWidth]);\n const columnWidth = columnWidthProp ?? computedColumnWidth ?? 60;\n\n // effectiveColumnWidth has two modes:\n // 1. Consumer supplied columnWidth → keep legacy fill-viewport stretch so\n // content never leaves a gap on the right edge.\n // 2. Library-computed columnWidth → enforce the per-mode max-visible cap\n // by lifting column width when the pane is wider than (max * columnWidth),\n // so visible count never exceeds VIEW_MODE_MAX_VISIBLE_COUNT.\n // Math.ceil keeps svgWidth >= svgContainerWidth so there is no pixel gap on the right edge\n const effectiveColumnWidth = useMemo(() => {\n if (svgContainerWidth <= 0 || dateSetup.dates.length <= 0) return columnWidth;\n if (columnWidthProp == null) {\n const maxVisible = VIEW_MODE_MAX_VISIBLE_COUNT[viewMode];\n if (maxVisible) {\n return Math.max(columnWidth, Math.ceil(svgContainerWidth / maxVisible));\n }\n return columnWidth;\n }\n return Math.max(columnWidth, Math.ceil(svgContainerWidth / dateSetup.dates.length));\n }, [columnWidth, columnWidthProp, viewMode, svgContainerWidth, dateSetup.dates.length]);\n\n const svgWidth =\n effectiveColumnWidth < 55\n ? (dateSetup.dates.length + 0.5) * effectiveColumnWidth\n : dateSetup.dates.length * effectiveColumnWidth;\n const ganttFullHeight = useMemo(() => barTasks.length * rowHeight, [barTasks.length, rowHeight]);\n\n const [scrollY, setScrollY] = useState(0);\n const [scrollX, setScrollX] = useState(-1);\n const [ignoreScrollEvent, setIgnoreScrollEvent] = useState(false);\n const [lastTouchX, setLastTouchX] = useState(0);\n const [lastTouchY, setLastTouchY] = useState(0);\n const [isProcessing, setIsProcessing] = useState(false);\n\n const buffer = rowHeight * 10;\n const visibleStartY = scrollY - buffer;\n const visibleEndY = scrollY + ganttHeight + buffer;\n useEffect(() => {\n if (scheduleType === \"lookAhead\" && startDate && endDate) {\n setDateSetup({\n viewMode,\n dates: seedDates(startDate, endDate, viewMode),\n });\n }\n }, [startDate, endDate]);\n // task change events\n useEffect(() => {\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n }\n if(!shouldNotShowLoadingOverlay){ \n setIsProcessing(true);\n }\n debounceRef.current = setTimeout(() => {\n let filteredTasks: Task[];\n // if (onExpanderClick) {\n\n // console.log(\"[gantt-perf][lib] tasks in\", tasks.length);\n // console.time(\"[gantt-perf][lib] 1.removeHidden\");\n filteredTasks = removeHiddenTasks(tasks);\n // console.timeEnd(\"[gantt-perf][lib] 1.removeHidden\");\n // console.time(\"[gantt-perf][lib] 2.sort\");\n filteredTasks = filteredTasks.sort(sortTasks);\n // console.timeEnd(\"[gantt-perf][lib] 2.sort\");\n // console.time(\"[gantt-perf][lib] 3.dateRange\");\n const [startDateRange, endDateRange] = ganttDateRange(\n filteredTasks,\n viewMode,\n preStepsCount,\n projectCalendar?.quarter_start ?? 0\n );\n // console.timeEnd(\"[gantt-perf][lib] 3.dateRange\");\n // console.time(\"[gantt-perf][lib] 4.seedDates\");\n let newDates = seedDates(startDateRange, endDateRange, viewMode);\n // console.timeEnd(\"[gantt-perf][lib] 4.seedDates\");\n // console.log(\"[gantt-perf][lib] date columns\", newDates.length);\n if (scheduleType === \"lookAhead\") {\n newDates = seedDates(startDate, endDate, viewMode);\n }\n if (rtl) {\n newDates = newDates.reverse();\n if (scrollX === -1) {\n setScrollX(newDates.length * effectiveColumnWidth);\n }\n }\n if (scheduleType !== \"lookAhead\") {\n // console.time(\"[gantt-perf][lib] 5.seedDates(again)\");\n setDateSetup({\n dates: seedDates(startDateRange, endDateRange, viewMode),\n viewMode,\n });\n // console.timeEnd(\"[gantt-perf][lib] 5.seedDates(again)\");\n }\n\n // // This is now handled by backend\n // let [primaryPath, secondaryPath] = getCriticalPaths(leafTasks);\n\n // Color the paths.\n // uncolorAll(tasks);\n // console.time(\"[gantt-perf][lib] 6.uncolorAll\");\n uncolorAll(tasks);\n // console.timeEnd(\"[gantt-perf][lib] 6.uncolorAll\");\n // console.time(\"[gantt-perf][lib] 7.colorPath\");\n if (scheduleType !== \"lookAhead\") {\n // colorPath(secondaryPath, \"#00ff00\", tasks, \"secondary\");\n // colorPath(primaryPath, \"#ff0000\", tasks, \"primary\");\n colorPath(secondaryPath, \"#00ff00\", tasks, \"secondary\");\n colorPath(primaryPath, \"#ff0000\", tasks, \"primary\");\n }\n // console.timeEnd(\"[gantt-perf][lib] 7.colorPath\");\n // console.time(\"[gantt-perf][lib] 8a.convert(compute)\");\n const nextBarTasks = convertToBarTasks(\n filteredTasks,\n newDates,\n effectiveColumnWidth,\n rowHeight,\n taskHeight,\n barCornerRadius,\n handleWidth,\n rtl,\n barProgressColor,\n barProgressSelectedColor,\n barBackgroundColor,\n barBackgroundSelectedColor,\n projectProgressColor,\n projectProgressSelectedColor,\n projectBackgroundColor,\n projectBackgroundSelectedColor,\n milestoneBackgroundColor,\n milestoneBackgroundSelectedColor\n );\n // console.timeEnd(\"[gantt-perf][lib] 8a.convert(compute)\");\n // console.time(\"[gantt-perf][lib] 8b.setBarTasks(sync render)\");\n setBarTasks(nextBarTasks);\n // console.timeEnd(\"[gantt-perf][lib] 8b.setBarTasks(sync render)\");\n setIsProcessing(false);\n }, delayToRender);\n }, [\n // tasks,\n tasks,\n viewMode,\n preStepsCount,\n rowHeight,\n barCornerRadius,\n taskHeight,\n handleWidth,\n barProgressColor,\n barProgressSelectedColor,\n barBackgroundColor,\n barBackgroundSelectedColor,\n projectProgressColor,\n projectProgressSelectedColor,\n projectBackgroundColor,\n projectBackgroundSelectedColor,\n milestoneBackgroundColor,\n milestoneBackgroundSelectedColor,\n rtl,\n shouldNotShowLoadingOverlay,\n effectiveColumnWidth,\n projectCalendar,\n ]);\n // clear the pending debounce timer on unmount\n useEffect(() => {\n return () => {\n clearTimeout(debounceRef.current!);\n };\n }, []);\n\n useEffect(() => {\n if (\n viewMode === dateSetup.viewMode &&\n ((viewDate && !currentViewDate) ||\n (viewDate && currentViewDate?.valueOf() !== viewDate.valueOf()))\n ) {\n const dates = dateSetup.dates;\n const index = dates.findIndex(\n (d, i) =>\n viewDate.valueOf() >= d.valueOf() &&\n i + 1 !== dates.length &&\n viewDate.valueOf() < dates[i + 1].valueOf()\n );\n if (index === -1) {\n return;\n }\n setCurrentViewDate(viewDate);\n setScrollX(effectiveColumnWidth * index);\n }\n }, [\n viewDate,\n effectiveColumnWidth,\n dateSetup.dates,\n dateSetup.viewMode,\n viewMode,\n currentViewDate,\n setCurrentViewDate,\n ]);\n\n useEffect(() => {\n const { changedTask, action } = ganttEvent;\n if (changedTask) {\n if (action === \"delete\") {\n setGanttEvent({ action: \"\" });\n setBarTasks(barTasks.filter(t => t.id !== changedTask.id));\n }\n // \"move\" / \"start\" / \"end\" / \"progress\": barTasks is updated on drag end\n // via onBarTasksUpdate callback (called from TaskGanttContent handleMouseUp).\n // During drag, task-gantt-content renders directly from ganttEvent.changedTask\n // for instant real-time updates without the extra render cycle.\n }\n }, [ganttEvent, barTasks]);\n\n useEffect(() => {\n if (failedTask) {\n setBarTasks(barTasks.map(t => (t.id !== failedTask.id ? t : failedTask)));\n setFailedTask(null);\n }\n }, [failedTask, barTasks]);\n\n useEffect(() => {\n if (!listCellWidth) {\n setTaskListWidth(0);\n }\n if (taskListRef.current) {\n setTaskListWidth(taskListRef.current.offsetWidth);\n }\n }, [taskListRef, listCellWidth]);\n\n // Keep the chart offset in sync when the task list's rendered width changes —\n // e.g. after a per-column resize. The effects above only re-run on listCellWidth,\n // so without this a column resize would leave svgContainerWidth stale. (The\n // scrollbar extent comes from tableContentWidth, reported by TaskList.)\n useEffect(() => {\n if (!listCellWidth || !taskListRef.current) return;\n if (typeof ResizeObserver === \"undefined\") return;\n const measure = () => {\n if (taskListRef.current) {\n setTaskListWidth(taskListRef.current.offsetWidth);\n }\n };\n const observer = new ResizeObserver(measure);\n observer.observe(taskListRef.current);\n measure();\n return () => observer.disconnect();\n }, [listCellWidth, scheduleType]);\n\n useEffect(() => {\n if (wrapperRef.current) {\n // Subtract the 20px column-resize divider so the gantt SVG fills the remaining space exactly\n setSvgContainerWidth(wrapperRef.current.offsetWidth - taskListWidth - 20);\n }\n }, [wrapperRef, taskListWidth, wrapperWidth]);\n\n // Track the wrapper's own width so the table cap (maxTableWidth) follows window\n // / container resizes, not just task-list changes.\n useEffect(() => {\n const node = wrapperRef.current;\n if (!node) return;\n if (typeof ResizeObserver === \"undefined\") {\n setWrapperWidth(node.offsetWidth);\n return;\n }\n const measure = () => setWrapperWidth(node.offsetWidth);\n const observer = new ResizeObserver(measure);\n observer.observe(node);\n measure();\n return () => observer.disconnect();\n }, []);\n\n useEffect(() => {\n if (ganttHeight) {\n setSvgContainerHeight(ganttHeight + headerHeight);\n } else {\n // setSvgContainerHeight(tasks.length * rowHeight + headerHeight);\n setSvgContainerHeight(tasks.length * rowHeight + headerHeight);\n }\n // }, [ganttHeight, tasks, headerHeight, rowHeight]);\n }, [ganttHeight, tasks, headerHeight, rowHeight]);\n\n // scroll events\n useEffect(() => {\n const handleWheel = (event: WheelEvent) => {\n if (event.shiftKey || event.deltaX) {\n const scrollMove = event.deltaX ? event.deltaX : event.deltaY;\n let newScrollX = scrollX + scrollMove;\n if (newScrollX < 0) {\n newScrollX = 0;\n } else if (newScrollX > svgWidth) {\n newScrollX = svgWidth;\n }\n setScrollX(newScrollX);\n event.preventDefault();\n } else if (ganttHeight) {\n let newScrollY = scrollY + event.deltaY;\n if (newScrollY < 0) {\n newScrollY = 0;\n } else if (newScrollY > ganttFullHeight - ganttHeight) {\n newScrollY = ganttFullHeight - ganttHeight;\n }\n if (newScrollY !== scrollY) {\n setScrollY(newScrollY);\n event.preventDefault();\n }\n }\n\n setIgnoreScrollEvent(true);\n };\n\n const handleLogTouch = (event: TouchEvent) => {\n if (event) {\n setLastTouchX(event.changedTouches[0].pageX);\n setLastTouchY(event.changedTouches[0].pageY);\n }\n };\n\n const handleTouch = (event: TouchEvent) => {\n if (event.changedTouches[0].pageX || event.changedTouches[0].pageY) {\n let deltaX = event.changedTouches[0].pageX - lastTouchX;\n let deltaY = event.changedTouches[0].pageY - lastTouchY;\n\n // if (lastTouchX > 0 && lastTouchY > 0) {\n if (Math.abs(deltaX) > Math.abs(deltaY)) {\n let newScrollX = scrollX - deltaX / 3;\n if (newScrollX > 0 && newScrollX < 1600) {\n setScrollX(newScrollX);\n } else if (newScrollX < 0) {\n setScrollX(0);\n } else {\n setScrollX(1600);\n }\n } else {\n let newScrollY = scrollY - deltaY;\n if (newScrollY > 0 && newScrollY < 1600) {\n setScrollY(newScrollY);\n } else if (newScrollY < 0) {\n setScrollY(0);\n } else {\n setScrollY(1600);\n }\n }\n // }\n\n setLastTouchX(event.changedTouches[0].pageX);\n setLastTouchY(event.changedTouches[0].pageY);\n }\n\n // if (event.changedTouches[0].pageX) {\n // const scrollMove = event.changedTouches[0].pageX ? event.changedTouches[0].pageX : event.changedTouches[0].pageY;\n // let newScrollX = scrollX + scrollMove;\n // if (newScrollX < 0) {\n // newScrollX = 0;\n // } else if (newScrollX > svgWidth) {\n // newScrollX = svgWidth;\n // }\n // setScrollX(newScrollX);\n // event.preventDefault();\n // } else if (ganttHeight) {\n // let newScrollY = scrollY + event.changedTouches[0].pageY;\n // if (newScrollY < 0) {\n // newScrollY = 0;\n // } else if (newScrollY > ganttFullHeight - ganttHeight) {\n // newScrollY = ganttFullHeight - ganttHeight;\n // }\n // if (newScrollY !== scrollY) {\n // setScrollY(newScrollY);\n // event.preventDefault();\n // }\n // }\n\n setIgnoreScrollEvent(true);\n };\n\n // subscribe if scroll is necessary\n wrapperRef.current?.addEventListener(\"wheel\", handleWheel, {\n passive: false,\n });\n wrapperRef.current?.addEventListener(\"touchmove\", handleTouch, {\n passive: false,\n });\n wrapperRef.current?.addEventListener(\"touchstart\", handleLogTouch, {\n passive: false,\n });\n wrapperRef.current?.addEventListener(\"touchend\", handleLogTouch, {\n passive: false,\n });\n return () => {\n wrapperRef.current?.removeEventListener(\"wheel\", handleWheel);\n wrapperRef.current?.removeEventListener(\"touchmove\", handleTouch);\n wrapperRef.current?.removeEventListener(\"touchend\", handleLogTouch);\n wrapperRef.current?.removeEventListener(\"touchend\", handleLogTouch);\n };\n }, [\n wrapperRef,\n scrollY,\n scrollX,\n ganttHeight,\n svgWidth,\n rtl,\n ganttFullHeight,\n ]);\n\n const handleScrollY = (event: SyntheticEvent<HTMLDivElement>) => {\n if (scrollY !== event.currentTarget.scrollTop && !ignoreScrollEvent) {\n setScrollY(event.currentTarget.scrollTop);\n setIgnoreScrollEvent(true);\n } else {\n setIgnoreScrollEvent(false);\n }\n };\n\n const handleScrollX = (event: SyntheticEvent<HTMLDivElement>) => {\n if (scrollX !== event.currentTarget.scrollLeft && !ignoreScrollEvent) {\n setScrollX(event.currentTarget.scrollLeft);\n setIgnoreScrollEvent(true);\n } else {\n setIgnoreScrollEvent(false);\n }\n };\n\n\n /**\n * Handles arrow keys events and transform it to new scroll\n */\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n event.preventDefault();\n let newScrollY = scrollY;\n let newScrollX = scrollX;\n let isX = true;\n switch (event.key) {\n case \"Down\": // IE/Edge specific value\n case \"ArrowDown\":\n newScrollY += rowHeight;\n isX = false;\n break;\n case \"Up\": // IE/Edge specific value\n case \"ArrowUp\":\n newScrollY -= rowHeight;\n isX = false;\n break;\n case \"Left\":\n case \"ArrowLeft\":\n newScrollX -= effectiveColumnWidth;\n break;\n case \"Right\": // IE/Edge specific value\n case \"ArrowRight\":\n newScrollX += effectiveColumnWidth;\n break;\n }\n if (isX) {\n if (newScrollX < 0) {\n newScrollX = 0;\n } else if (newScrollX > svgWidth) {\n newScrollX = svgWidth;\n }\n setScrollX(newScrollX);\n } else {\n if (newScrollY < 0) {\n newScrollY = 0;\n } else if (newScrollY > ganttFullHeight - ganttHeight) {\n newScrollY = ganttFullHeight - ganttHeight;\n }\n setScrollY(newScrollY);\n }\n setIgnoreScrollEvent(true);\n };\n\n /**\n * Task select event\n */\n const handleSelectedTask = (taskId: string) => {\n const newSelectedTask = barTasks.find(t => t.id === taskId);\n const oldSelectedTask = barTasks.find(\n t => !!selectedTask && t.id === selectedTask.id\n );\n if (onSelect) {\n if (oldSelectedTask) {\n onSelect(oldSelectedTask, false);\n }\n if (newSelectedTask) {\n onSelect(newSelectedTask, true);\n }\n }\n setSelectedTask(newSelectedTask);\n };\n const handleExpanderClick = (task: Task) => {\n if (onExpanderClick && task.hideChildren !== undefined) {\n onExpanderClick({ ...task, hideChildren: !task.hideChildren });\n }\n };\n const gridProps: GridProps = {\n columnWidth: effectiveColumnWidth,\n svgWidth,\n tasks: tasks,\n scheduleType: scheduleType,\n rowHeight,\n dates: dateSetup.dates,\n todayColor,\n weekendColor,\n rtl,\n visibleStartY,\n visibleEndY,\n projectCalendar,\n viewMode,\n };\n const calendarProps: CalendarProps = {\n dateSetup,\n locale,\n viewMode,\n headerHeight,\n columnWidth: effectiveColumnWidth,\n fontFamily,\n fontSize,\n rtl,\n projectCalendar,\n weekendColor,\n };\n const barProps: TaskGanttContentProps = {\n tasks: barTasks,\n dates: dateSetup.dates,\n ganttEvent,\n selectedTask,\n rowHeight,\n taskHeight,\n columnWidth: effectiveColumnWidth,\n arrowColor,\n timeStep,\n fontFamily,\n fontSize,\n arrowIndent,\n svgWidth,\n rtl,\n setGanttEvent,\n setFailedTask,\n setSelectedTask: handleSelectedTask,\n onBarTasksUpdate: handleBarTasksUpdate,\n onDateChange,\n onProgressChange,\n onDoubleClick,\n onClick,\n onDelete,\n onCalendarError,\n projectCalendar,\n visibleStartY,\n visibleEndY,\n sliderTime,\n };\n\n const tableTasks = useMemo(() => {\n return ganttEvent.changedTask\n ? barTasks.map(t => (t.id === ganttEvent.changedTask!.id ? ganttEvent.changedTask! : t))\n : barTasks;\n }, [barTasks, ganttEvent.changedTask]);\n\n const tableProps: TaskListProps = {\n rowHeight,\n rowWidth: listCellWidth,\n fontFamily,\n fontSize,\n tasks: tableTasks,\n leafTasks,\n scheduleType,\n locale,\n headerHeight,\n scrollY,\n ganttHeight,\n horizontalContainerClass: styles.horizontalContainer,\n selectedTask,\n taskListRef,\n setSelectedTask: handleSelectedTask,\n onExpanderClick: handleExpanderClick,\n onDoubleClick,\n TaskListHeader,\n TaskListTable,\n taskLabelRenderer,\n onMultiSelect,\n // Only pin a fixed width once the user has dragged the divider; otherwise let\n // the table size to its content under the cap. tableCap bounds both at the\n // columns' total width (no white space) and the 40% Gantt floor.\n containerWidth:\n userResizedRef.current && tableContainerWidth != null\n ? Math.min(tableContainerWidth, tableCap)\n : undefined,\n containerMaxWidth: tableCap === Infinity ? undefined : tableCap,\n onContentWidthChange: setTableContentWidth,\n innerScrollRef: tableInnerScrollRef,\n horizontalContainerRef: tableHorizontalContainerRef,\n };\n\n return (\n <div style={{ position: \"relative\" }}>\n <div\n className={styles.wrapper}\n onKeyDown={handleKeyDown}\n tabIndex={0}\n ref={wrapperRef}\n >\n {listCellWidth && <TaskList {...tableProps} />}\n {listCellWidth && scheduleType === \"main\" && (\n <div\n style={{\n width: \"20px\",\n cursor: \"col-resize\",\n backgroundColor: \"#e0e0e0\",\n flexShrink: 0,\n zIndex: 1,\n alignSelf: \"stretch\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n userSelect: \"none\",\n fontSize: \"10px\",\n color: \"#666\",\n letterSpacing: \"-1px\",\n }}\n onMouseDown={handleTableResizeMouseDown}\n >\n &#9668;|&#9658;\n </div>\n )}\n <TaskGantt\n gridProps={gridProps}\n calendarProps={calendarProps}\n barProps={barProps}\n ganttHeight={ganttHeight}\n scrollY={scrollY}\n scrollX={scrollX}\n />\n {ganttEvent.changedTask && (\n <Tooltip\n arrowIndent={arrowIndent}\n rowHeight={rowHeight}\n svgContainerHeight={svgContainerHeight}\n svgContainerWidth={svgContainerWidth}\n fontFamily={fontFamily}\n fontSize={fontSize}\n scrollX={scrollX}\n scrollY={scrollY}\n task={ganttEvent.changedTask}\n type={ganttEvent.type as string}\n headerHeight={headerHeight}\n taskListWidth={taskListWidth}\n TooltipContent={TooltipContent}\n rtl={rtl}\n svgWidth={svgWidth}\n isDragging={\n ganttEvent.action === \"move\" ||\n ganttEvent.action === \"start\" ||\n ganttEvent.action === \"end\" ||\n ganttEvent.action === \"progress\"\n }\n />\n )}\n <VerticalScroll\n ganttFullHeight={ganttFullHeight}\n ganttHeight={ganttHeight}\n headerHeight={headerHeight}\n scroll={scrollY}\n onScroll={handleScrollY}\n rtl={rtl}\n />\n </div>\n {isProcessing && (\n <div\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: \"rgba(255, 255, 255, 0.95)\",\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n gap: \"20px\",\n zIndex: 9999,\n pointerEvents: \"none\", // ← allows scrolling & interaction underneath!\n borderRadius: \"8px\",\n }}\n >\n <span\n style={{\n fontSize: \"24px\",\n fontWeight: \"600\",\n color: \"#cc0404\",\n fontFamily: \"Arial, sans-serif\",\n }}\n >\n Loading...\n </span>\n <div className={styles.spinner} />\n </div>\n )}\n <div style={{ display: \"flex\" }}>\n {listCellWidth && (\n <div\n ref={tableHScrollRef}\n className={hScrollStyles.scrollWrapper}\n style={{ width: taskListWidth + 4, flexShrink: 0 }}\n onScroll={(e: SyntheticEvent<HTMLDivElement>) => {\n if (tableHorizontalContainerRef.current) {\n tableHorizontalContainerRef.current.scrollLeft = e.currentTarget.scrollLeft;\n }\n }}\n >\n <div style={{ width: tableContentWidth }} />\n </div>\n )}\n <div style={{ flex: 1, minWidth: 0 }}>\n <HorizontalScroll\n svgWidth={svgWidth}\n taskListWidth={0}\n scroll={scrollX}\n rtl={rtl}\n onScroll={handleScrollX}\n />\n </div>\n </div>\n </div>\n );\n}\n\n// This is based on the visit function from https://en.wikipedia.org/wiki/Topological_sorting#Depth-first_search\nexport function topologicalOrderingHelper(\n taskID: string,\n taskMap: {},\n sortedTaskList: string[]\n) {\n if (!taskMap[taskID]) return true; // dependency pointed to an ID not present in leafTasks. ignore the dependency\n if (taskMap[taskID].finished) return true;\n if (taskMap[taskID].started) {\n console.log(\"Cycle involving \" + taskID);\n return false; // Error: dependencies made a cycle\n }\n\n taskMap[taskID].started = true;\n\n let task: Task = taskMap[taskID].task;\n if (task.dependencies)\n for (let i = 0; i < task.dependencies.length; i++) {\n let successVal = topologicalOrderingHelper(\n task.dependencies[i].id,\n taskMap,\n sortedTaskList\n );\n if (!successVal) return false; // Error: an error came from deeper recursive call\n }\n\n taskMap[taskID].finished = true;\n\n sortedTaskList.push(taskID);\n return true;\n}\nexport function getCriticalPaths(leafTasks: Task[]) {\n // Exclude tasks that must not sit on a critical path:\n // - Milestones: zero-duration markers, not work; they also frequently have an\n // unset (date-0) start that injects a bogus multi-decade span.\n // - Phantom tasks with no real schedule: a zero-length bar whose start sits at\n // the epoch (date 0 = unset). As a predecessor of a long successor they\n // inherit its full span with no overlap to cancel it, falsely dominating.\n // Bars still render from `tasks`; this only excludes them from path computation.\n leafTasks = leafTasks.filter(\n t =>\n t.type !== \"milestone\" &&\n (t.start.getTime() !== 0 || t.end.getTime() !== 0)\n );\n\n // Map ids to tasks for faster access.\n // O(n) space, O(n) time to add all from list, O(1) time for each access.\n let taskMap = {};\n for (let i = 0; i < leafTasks.length; i++)\n taskMap[leafTasks[i].id] = { task: leafTasks[i] };\n\n // Sort the tasks so each dependent is listed after its dependencies.\n // O(num vertices + num edges)\n let sortedTaskList: string[] = [];\n for (let i = 0; i < leafTasks.length; i++) {\n let successVal = topologicalOrderingHelper(\n leafTasks[i].id,\n taskMap,\n sortedTaskList\n );\n if (!successVal) return [[], []]; // Abort: there was a cycle\n }\n\n // Map tasks to their dependents for faster access.\n // Dependencies are already easy enough to access, but not dependents.\n // O(num vertices + num edges)\n for (let i = 0; i < leafTasks.length; i++)\n taskMap[leafTasks[i].id].dependents = [];\n for (let i = 0; i < leafTasks.length; i++) {\n let task = leafTasks[i];\n if (task.dependencies)\n for (let j = 0; j < task.dependencies.length; j++)\n taskMap[task.dependencies[j].id]?.dependents.push(task.id);\n }\n\n // Compute critical paths, in reverse order to handle dependents before dependencies.\n // O(num vertices + num edges)\n for (let i = sortedTaskList?.length - 1; i >= 0; i--)\n computeCriticalPath(sortedTaskList[i], taskMap);\n\n // Now each task has a list of all possible paths and their lengths\n // We want to combine and sort all these entries so we can trace any number\n // of critical paths by following the best available chain\n // O(num tasks)\n let taskChainList = [];\n for (let i = 0; i < sortedTaskList?.length; i++) {\n for (let j = 0; j < taskMap[sortedTaskList[i]].paths.length; j++) {\n taskChainList.push(taskMap[sortedTaskList[i]].paths[j]);\n }\n }\n\n // const printedList = taskChainList.map((elem) => {\n // const newElem = { ...elem };\n // newElem.duration = Math.round(elem.duration / 86400000);\n // return newElem;\n // })\n\n // console.debug(printedList);\n\n if (taskChainList.length > 0) {\n\n // Sort by duration (descending)\n // O(n log n)\n taskChainList.sort((a, b) => b.duration - a.duration);\n console.debug(taskChainList);\n\n // Select the best next option to build the best path\n let primaryLeaf = taskChainList[0].parent;\n let primaryPath = [];\n\n while (primaryLeaf !== undefined) {\n\n // Add this task to the primary path\n primaryPath.push(taskMap[primaryLeaf].task);\n\n // If this task has no dependents, it is a leaf and the primary path ends here\n if (taskMap[primaryLeaf].paths.length === 0) {\n primaryLeaf = undefined;\n break;\n }\n\n // Check all of this task's paths and select longest duration as next\n let primaryDuration = taskMap[primaryLeaf].paths[0].duration;\n let nextPath = taskMap[primaryLeaf].paths[0];\n for (let i = 1; i < taskMap[primaryLeaf].paths.length; i++) {\n let newDuration = taskMap[primaryLeaf].paths[i].duration;\n if (newDuration > primaryDuration) {\n nextPath = taskMap[primaryLeaf].paths[i]\n primaryDuration = newDuration;\n }\n }\n\n // Disqualify this path from being selected by second best path.\n nextPath.visited = true;\n\n // Follow this path down to the next task\n primaryLeaf = nextPath.task;\n\n }\n\n\n // Select the best next option from the unvisited tasks to build the second best path\n let secondaryLeaf = taskChainList[0].parent;\n\n for (let i = 0; i < taskChainList.length; i++) {\n if (!taskChainList[i].visited) {\n secondaryLeaf = taskChainList[i].parent;\n break;\n }\n }\n\n let secondaryPath = [];\n\n while (secondaryLeaf !== undefined) {\n\n // Add this task to the secondary path\n secondaryPath.push(taskMap[secondaryLeaf].task);\n\n // If this task has no dependents, it is a leaf and the secondary path ends here\n if (taskMap[secondaryLeaf].paths.length === 0) {\n secondaryLeaf = undefined;\n break;\n }\n\n // Check all of this task's paths and select longest duration as next\n let secondaryDuration = taskMap[secondaryLeaf].paths[0].duration;\n let nextPath = taskMap[secondaryLeaf].paths[0];\n\n // If default path has already been visited, discredit it\n if (nextPath.visited) secondaryDuration = 0;\n\n for (let i = 1; i < taskMap[secondaryLeaf].paths.length; i++) {\n let newDuration = taskMap[secondaryLeaf].paths[i].duration;\n // Extra check here to ensure path has not already been used\n if (newDuration > secondaryDuration && !taskMap[secondaryLeaf].paths[i].visited) {\n nextPath = taskMap[secondaryLeaf].paths[i]\n secondaryDuration = newDuration;\n }\n }\n\n // If path we ended up with has already been visited, this task is a leaf node\n if (nextPath.visited) {\n break;\n }\n\n // Disqualify this path from being selected by third best path.\n nextPath.visited = true;\n\n // Follow this path down to the next task\n secondaryLeaf = nextPath.task;\n\n }\n\n console.debug(\"Primary \", primaryPath);\n console.debug(\"Secondary \", secondaryPath);\n\n return [primaryPath, secondaryPath];\n }\n\n return [[], []];\n}\n\n// Function used to calculate the off time (combination of off days and holidays) for a given task in the task map\nfunction getOffTime(tIndex: string, taskMap: {}, start: number, end: number) {\n\n // Figure out which weeks the task starts and ends on using some unix timestamp math\n // Convert time from milliseconds to days, add 4 to get to first sunday (0 represents a Thursday in unix time), then floor divide by 0 to get the week number\n let startWeek = Math.floor(((start / 86400000) + 4) / 7);\n let endWeek = Math.floor(((end / 86400000) + 4) / 7);\n let offTime: number[] = [];\n\n // Get off time for each child. If task has no calendar, off time is naturally 0\n if (taskMap[tIndex].task.calendar) {\n\n // Off Day Calculation\n if (taskMap[tIndex].task.calendar.off_days && taskMap[tIndex].task.calendar.off_days.length) {\n for (let d = 0; d < taskMap[tIndex].task.calendar.off_days.length || 0; d++) {\n for (let w = startWeek; w <= endWeek; w++) {\n let dayOfTheWeek = taskMap[tIndex].task.calendar.off_days[d];\n // Check each week to see if an off day is within duration\n // Notice this is the inverse operation of the milliseconds to week operation performed above\n let offDay = 86400000 * ((7 * w - 4) + dayOfTheWeek);\n // If so (and time isn't part of overlap with parent, which will be accounted for later), ...\n if (offDay >= start && offDay <= end) {\n // ...mark a day's worth of time to be subtracted from total duration\n // console.debug(\"off_day\", tIndex, dayOfTheWeek, offDay);\n offTime.push(offDay);\n }\n }\n }\n }\n\n // Holiday Calculation\n if (taskMap[tIndex].task.calendar.holidays && taskMap[tIndex].task.calendar.holidays.length) {\n // console.debug(taskMap[tindex].task.calendar.holidays);\n for (let h = 0; h < taskMap[tIndex].task.calendar.holidays.length || 0; h++) {\n // Check each holiday to see if it is within duration\n let holiday = taskMap[tIndex].task.calendar.holidays[h];\n let holiday_timestamp = new Date(holiday).getTime()\n // If so (and time isn't part of overlap with parent, which will be accounted for later), ...\n if (holiday_timestamp >= start && holiday_timestamp <= end) {\n // ...mark a day's worth of time to be subtracted from total duration\n // console.debug(\"holiday\", tIndex, holiday, holiday_timestamp);\n offTime.push(holiday_timestamp);\n }\n }\n }\n }\n\n // offTime will be returned as an array of timestamps\n // This is so we can compare the exact off days of multiple tasks to identify and remove any overlap\n // If we didn't do this, overlapping off days would be counted twice\n return offTime;\n}\n\nexport function computeCriticalPath(taskID: string, taskMap: {}) {\n let task: Task = taskMap[taskID].task;\n let dependents = taskMap[taskID].dependents;\n\n taskMap[taskID].start = task.start.getTime();\n taskMap[taskID].end = task.end.getTime();\n taskMap[taskID].paths = []; // Each task will track length of all dep paths\n\n // Get offtime of parent task\n let parent_off_time = getOffTime(taskID, taskMap, taskMap[taskID].start, taskMap[taskID].end);\n\n // console.debug(taskID, taskMap[taskID].start, taskMap[taskID].end, parent_off_time.length, (taskMap[taskID].end - taskMap[taskID].start - (parent_off_time.length * 86400000)) / 86400000);\n\n // Iterate through all the dependents of the current task\n for (let j = 0; j < dependents.length; j++) {\n\n let depStart = taskMap[dependents[j]].task.start.getTime();\n let depEnd = taskMap[dependents[j]].task.end.getTime();\n\n // Get the duration and off time of the dep task\n let depDuration = depEnd - depStart;\n let child_off_time = getOffTime(dependents[j], taskMap, depStart, depEnd);\n\n // console.debug(dependents[j], depStart, depEnd, child_off_time.length, (depDuration - (child_off_time.length * 86400000)) / 86400000);\n\n // subtracting any overlap in duration days between parent and child\n let overlap = Math.max((taskMap[taskID].end - depStart), 0);\n\n // subtracting any overlap in off time days between parent and child\n // we'll use the parent task's list as the source of truth\n for (let t = 0; t < parent_off_time.length; t++) {\n if (child_off_time.includes(parent_off_time[t])) {\n parent_off_time.splice(t, 1);\n t -= 1;\n }\n }\n\n let offTime = parent_off_time.length + child_off_time.length;\n\n // console.debug(taskID, dependents[j], offTime, parent_off_time, child_off_time);\n\n // Inherit all paths known by dep task, adding this task's length to the tracked lengths\n let paths = taskMap[dependents[j]].paths;\n if (paths && paths.length) {\n for (let k = 0; k < paths.length; k++) {\n\n // To address potential overlap in off time, only consider the parent's off time. \n // This is why we spliced from its list instead of the child's list earlier\n let totalDuration = taskMap[taskID].end - taskMap[taskID].start - overlap - (parent_off_time.length * 86400000) + paths[k].duration\n\n // console.debug(taskID, dependents[j], totalDuration / 86400000, (taskMap[taskID].end - taskMap[taskID].start) / 86400000, overlap / 86400000, parent_off_time.length, paths[k].duration / 86400000);\n\n // For performance reasons, each path list only keeps track of its two longest path and discards all others\n // If we want to consider more than just primary and secondary paths in the future, this code can easily be expanded\n if (taskMap[taskID].paths.length < 2) {\n taskMap[taskID].paths.push({\n duration: totalDuration,\n task: dependents[j],\n parent: taskID,\n visited: false\n });\n // This logic is formatted to guarantee paths remain auto-sorted\n } else if (totalDuration > taskMap[taskID].paths[0].duration) {\n taskMap[taskID].paths[0].duration = totalDuration;\n taskMap[taskID].paths[0].task = dependents[j];\n taskMap[taskID].paths[0].parent = taskID;\n taskMap[taskID].paths[0].visited = false;\n } else if (totalDuration > taskMap[taskID].paths[1].duration) {\n taskMap[taskID].paths[1].duration = totalDuration;\n taskMap[taskID].paths[1].task = dependents[j];\n taskMap[taskID].paths[1].parent = taskID;\n taskMap[taskID].paths[1].visited = false;\n }\n\n }\n } else {\n // Dep has no paths of its own (it's a terminal leaf) → seed an immediate\n // child path ending at this dep.\n let immediateChildDuration = taskMap[taskID].end - taskMap[taskID].start + depDuration - overlap - (offTime * 86400000);\n\n // console.debug(taskID, dependents[j], immediateChildDuration / 86400000, (taskMap[taskID].end - taskMap[taskID].start) / 86400000, depDuration / 86400000, overlap / 86400000, offTime);\n\n // Create a new path that ends at the immediate dep task\n // For performance reasons, each path list only keeps track of its two longest path and discards all others\n // If we want to consider more than just primary and secondary paths in the future, this code can easily be expanded\n if (taskMap[taskID].paths.length < 2) {\n taskMap[taskID].paths.push({\n duration: immediateChildDuration,\n task: dependents[j],\n parent: taskID,\n visited: false\n });\n // This logic is formatted to guarantee paths remain auto-sorted\n } else if (immediateChildDuration > taskMap[taskID].paths[0].duration) {\n taskMap[taskID].paths[0].duration = immediateChildDuration;\n taskMap[taskID].paths[0].task = dependents[j];\n taskMap[taskID].paths[0].parent = taskID;\n taskMap[taskID].paths[0].visited = false;\n } else if (immediateChildDuration > taskMap[taskID].paths[1].duration) {\n taskMap[taskID].paths[1].duration = immediateChildDuration;\n taskMap[taskID].paths[1].task = dependents[j];\n taskMap[taskID].paths[1].parent = taskID;\n taskMap[taskID].paths[1].visited = false;\n }\n }\n }\n}\n\nexport function uncolorAll(tasks: Task[]) {\n tasks.forEach(task => {\n if (task.styles) delete task.styles.criticalPathColor;\n delete task.criticalPathArrows;\n });\n}\n\nexport function colorPath(path: Task[], color: string, tasks: Task[],criticalPathType: string) {\n const byId = new Map<string, Task>();\n for (const task of tasks) byId.set(task.id, task);\n\n // Nearest ancestor by walking wbs segments, rather than scanning every task.\n const nearest = (id: string) => {\n const exact = byId.get(id);\n if (exact) return exact;\n for (let cut = id.lastIndexOf(\".\"); cut > 0; cut = id.lastIndexOf(\".\", cut - 1)) {\n const ancestor = byId.get(id.slice(0, cut));\n if (ancestor) return ancestor;\n }\n return undefined;\n };\n\n // Color boxes\n for (let i = 0; i < path.length; i++) {\n const longestTask = nearest(path[i].id);\n if (longestTask) {\n let styles = longestTask.styles ?? {};\n styles.criticalPathColor = color;\n longestTask.styles = styles;\n }\n }\n // Color arrows\n for (let i = 0; i + 1 < path.length; i++) {\n // Items in the critical paths came from leafTasks, but we need to change the versions from tasks instead.\n const taskFromTasks = byId.get(path[i].id);\n if (taskFromTasks) {\n let arrows = taskFromTasks.criticalPathArrows;\n // Create the arrows list if it does not exist.\n if (!arrows) arrows = [];\n // If the arrow is already colored, replace its color in the list.\n let arrow = arrows.find(arrow => arrow.taskId === path[i + 1].id);\n if (arrow) {\n arrow.arrowColor = color;\n arrow.criticalPathType = criticalPathType;\n }\n // Else, add the new colored arrow to the list.\n else arrows.push({ taskId: path[i + 1].id, arrowColor: color, criticalPathType: criticalPathType });\n taskFromTasks.criticalPathArrows = arrows;\n }\n }\n}\nexport const getParentWbs = (wbs: string): string | undefined => {\n const segments = wbs.split('.');\n if (segments.length <= 1) return undefined; // Top-level task has no parent\n return segments.slice(0, -1).join('.'); // Remove last segment\n};\n"],"names":["ViewMode","intlDTCache","getCachedDateTimeFormat","locString","opts","key","JSON","stringify","dtf","Intl","DateTimeFormat","addToDate","date","quantity","scale","newDate","Date","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","getMilliseconds","startOfDate","scores","shouldReset","_scale","maxScore","indexOf","getFiscalQuarterStartDate","quarterStart","month","offset","qStartMonth","Math","floor","year","VIEW_MODE_DEFAULT_VISIBLE_COUNT","Day","Week","Month","Quarter","VIEW_MODE_MAX_VISIBLE_COUNT","ganttDateRange","tasks","viewMode","preStepsCount","newStartDate","start","getTime","newEndDate","end","task","actualStart","actualEnd","Year","endQStart","getMonday","QuarterDay","HalfDay","Hour","seedDates","startDate","endDate","currentDate","dates","push","getLocalDayOfWeek","locale","format","bottomValue","weekday","replace","toLocaleUpperCase","day","getDay","diff","setDate","TaskListHeaderDefault","headerHeight","fontFamily","fontSize","rowWidth","scheduleType","allSelected","onSelectAll","columnWidths","onColumnResize","widthOf","colId","factor","parseInt","startResize","startWidth","e","preventDefault","stopPropagation","startX","clientX","onMove","ev","onUp","document","removeEventListener","addEventListener","cell","content","title","resizable","width","React","className","styles","ganttTable_HeaderItem","style","minWidth","maxWidth","position","ganttTable_HeaderItemText","ganttTable_HeaderResizeHandle","height","onMouseDown","ganttTable","ganttTable_Header","type","checked","onChange","target","Fragment","localeDateStringCache","toLocaleDateStringFactory","dateTimeOptions","toString","lds","toLocaleDateString","TaskListTableDefault","rowHeight","leafTasks","onExpanderClick","selectedTasks","onTaskSelect","taskLabelRenderer","t","name","virtualItems","useMemo","leafTaskIds","Set","map","id","hasSelectedAncestor","taskId","selectedSet","allTasks","find","parentWbs","getParentWbs","has","itemsToRender","_","index","size","lane","measureElement","taskListWrapper","vi","expanderSymbol","hideChildren","isSelected","includes","isAncestorSelected","top","left","transform","taskListMilestoneRow","taskListLookAheadRow","taskListTableRow","taskListCell","taskListText","display","justifyContent","alignItems","paddingLeft","paddingRight","disabled","taskListNameWrapper","depth","taskListExpander","onClick","taskListExpanderPlaceholder","now","color","optionalId","percentComplete","progress","plannedDuration","remainingDuration","max","round","actualDuration","endRef","ceil","durationType","Tooltip","rtl","svgContainerHeight","svgContainerWidth","scrollX","scrollY","arrowIndent","taskListWidth","TooltipContent","isDragging","tooltipRef","useRef","useState","relatedY","setRelatedY","relatedX","setRelatedX","useEffect","current","tooltipHeight","offsetHeight","tooltipWidth","offsetWidth","newRelatedY","newRelatedX","x1","x2","tooltipLeftmostPoint","actualx2","fullChartWidth","actualx1","tooltipLowerPoint","ref","tooltipDetailsContainer","tooltipDetailsContainerHidden","getOffTime","taskStart","taskEnd","_message","startWeek","endWeek","offTime","calendar","off_days","length","d","w","dayOfTheWeek","offDay","holidays","h","holiday","holiday_timestamp","StandardTooltipContent","computedPlannedDuration","computedActualDuration","tooltipDefaultContainer","tooltipDefaultContainerParagraph","VerticalScroll","scroll","ganttHeight","ganttFullHeight","onScroll","scrollRef","scrollTop","marginTop","marginLeft","marginRight","getTaskListColumns","hasCheckbox","columns","MIN_COLUMN_WIDTH","buildDefaultColumnWidths","base","widths","col","TaskList","selectedTask","setSelectedTask","taskListRef","horizontalContainerClass","TaskListHeader","TaskListTable","onMultiSelect","containerWidth","containerMaxWidth","onContentWidthChange","innerScrollRef","externalHorizontalContainerRef","horizontalContainerRef","internalHorizontalContainerRef","headerScrollRef","rowsEl","scrollLeft","setSelectedTasks","setColumnWidths","defaults","prev","ids","Object","keys","sameSet","every","next","handleColumnResize","contentWidth","values","reduce","sum","pendingTaskSelect","setPendingTaskSelect","prevSelectedTasksRef","expandedTasks","taskIndex","byId","Map","childrenOf","roots","forEach","set","parent","undefined","siblings","get","sameIds","a","b","i","virtualizer","useVirtualizer","count","getScrollElement","estimateSize","overscan","selected","filter","newSelected","recursiveOpen","descendants","getDescendants","add","Array","from","newSelectedArray","out","stack","reverse","pop","children","handleTaskSelect","handleSelectAll","headerProps","selectedTaskId","tableProps","getVirtualItems","overflow","flexShrink","hideScrollbar","overflowX","getTotalSize","parseTimeToMinutes","parts","split","Number","toDateString","y","m","String","padStart","isHoliday","cal","isOffDay","parsedShiftsCache","WeakMap","offDayCache","parsedShifts","shifts","s","isOffDayCached","perCal","off","NO_SHIFTS","getShiftsForDay","getWorkingIntervals","intervals","cursor","setHours","shift","shiftStart","shiftEnd","intervalStart","intervalEnd","snapToWorkingTime","direction","MAX_DAYS","result","attempt","dayStart","currentMins","getQuarterNumber","GridBody","svgWidth","columnWidth","todayColor","weekendColor","visibleStartY","visibleEndY","projectCalendar","visibleHeight","items","isDayOff","isTodayColumn","step","todayRects","offDayRects","weekStartDay","week_start","x","fill","pEnd","periodMs","ds","de","startFrac","endFrac","min","rw","isDayView","isWeekView","tickLines","tickClass","gridTick","gridTickWeekStart","gridTickDashed","y1","y2","rowBackgrounds","rowLines","rowOverlays","gridRowLine","showPerRowOffDays","isMilestone","rowClass","darkerGridRow","gridRowLookAhead","gridRow","rowEven","rowFill","Grid","props","TopPartOfCalendar","value","x1Line","y1Line","y2Line","xText","yText","textAnchor","textAnchorClass","textAnchorStart","textAnchorMiddle","textAnchorEnd","calendarTopTick","calendarTopText","Calendar","dateSetup","shortMonth","toLocaleString","getCalendarValuesForYear","topValues","bottomValues","topDefaultHeight","calendarBottomText","topValue","getCalendarValuesForQuarter","quarter_start","rowH","qNum","monthDate","span","j","getCalendarValuesForMonth","prevDate","prevQNum","isNewQuarter","getCalendarValuesForWeek","weeksCount","getCalendarValuesForDay","isWeekStart","calendarTickSolid","calendarTickDashed","getCalendarValuesForPartOfDay","ticks","hour","getCalendarValuesForHour","displayDate","topPosition","extraValues","r","calendarHeader","Arrow","taskFrom","taskTo","taskHeight","arrowColor","dependencyType","drawPathAndTriangle","path","trianglePoints","strokeWidth","stroke","points","indexCompare","taskToEndY","verticalOffset","minX","plannedSegments","p","actualSegments","candidates","maxX","fromPoint","toPoint","arrowPoints","right","convertToBarTasks","barCornerRadius","handleWidth","barProgressColor","barProgressSelectedColor","barBackgroundColor","barBackgroundSelectedColor","projectProgressColor","projectProgressSelectedColor","projectBackgroundColor","projectBackgroundSelectedColor","milestoneBackgroundColor","milestoneBackgroundSelectedColor","barTasks","convertToBarTask","indexById","dependencies","dependence","barchild","barChildren","barTask","convertToMilestone","convertToBar","progressStartWidth","progressEndWidth","taskXCoordinateRTL","taskXCoordinate","abs","typeInternal","progressWithByParams","progressWidth","progressX","taskYCoordinate","planEnd","segs","iv","actEnd","backgroundColor","backgroundSelectedColor","progressColor","progressSelectedColor","rotatedHeight","dateTimesCache","getDateTimes","times","xDate","lo","hi","mid","remainderMillis","percentOfInterval","taskX1","taskX2","getProgressPoint","taskY","point","join","startByX","xStep","steps","additionalXValue","newX","startByActualX","endByX","endByActualX","moveByX","newX1","newX2","moveByActualX","dateByX","taskX","taskDate","timeStep","getTimezoneOffset","handleTaskBySVGMouseEvent","svgX","action","initEventX1Delta","handleTaskBySVGMouseEventForMilestone","handleTaskBySVGMouseEventForBar","changedTask","isChanged","newMoveX1","newMoveX2","isKeyboardEvent","event","removeHiddenTasks","groupedTasks","groupedTask","getChildren","taskList","project","taskChildren","concat","sortTasks","taskA","taskB","orderA","displayOrder","MAX_VALUE","orderB","BarDisplay","segments","getProcessColor","getBarColor","totalWidth","seg","idx","ry","rx","criticalPathColor","rects","remaining","segW","ratio","pw","taskProgressColor","BarDateHandle","barHandle","BarProgressHandle","Bar","isProgressChangeable","isDateChangeable","onEventStart","progressPoint","handleHeight","plannedSegs","plannedLeftHandleX","plannedRightHandleX","actualSegs","actualLeftHandleX","actualRightHandleX","barWrapper","tabIndex","startProgressWidth","endProgressWidth","BarSmall","Milestone","milestoneWrapper","milestoneBackground","onDoubleClick","Project","barColor","processColor","projectWith","projectLeftTriangle","projectRightTriangle","projectWrapper","projectBackground","projectTop","TaskItem","isDelete","taskItem","setTaskItem","onKeyDown","onMouseEnter","onMouseLeave","TaskGanttContent","ganttEvent","svg","setGanttEvent","setFailedTask","onBarTasksUpdate","onDateChange","onProgressChange","onDelete","onCalendarError","sliderTime","createSVGPoint","setXStep","setInitEventX1Delta","isMoving","setIsMoving","dateDelta","newXStep","handleMouseMove","matrixTransform","getScreenCTM","inverse","finalTask","dragType","snapped","delta","actIntervals","actSegs","actDays","planIntervals","planSegs","planDays","handleMouseUp","operationSuccess","originalSelectedTask","newChangedTask","isNotLikeOriginal","dropType","snappedEnd","snappedStart","handleBarEventStart","error","console","arrowIndex","entries","yFrom","child","yTo","to","minY","maxY","getArrows","isCritical","criticalPathType","dragging","_task","fromDrawable","toDrawable","criticalTask","criticalPathArrows","arrow","lineX","totalHeight","pointerEvents","opacity","isDisabled","TaskGantt","gridProps","calendarProps","barProps","ganttSVGRef","verticalGanttContainerRef","newBarProps","buffer","ganttVerticalContainer","dir","xmlns","horizontalContainer","HorizontalScroll","margin","scrollWrapper","GANTT_MIN_WIDTH_RATIO","TABLE_GANTT_DIVIDER_WIDTH","Gantt","primaryPath","secondaryPath","columnWidthProp","listCellWidth","barFill","viewDate","onSelect","delayToRender","shouldNotShowLoadingOverlay","wrapperRef","isDraggingTable","userResizedRef","dragStartX","dragStartWidth","dragMaxWidth","Infinity","tableContainerWidth","setTableContainerWidth","tableInnerScrollRef","tableHorizontalContainerRef","tableHScrollRef","tableContentWidth","setTableContentWidth","startDateRange","endDateRange","setDateSetup","currentViewDate","setCurrentViewDate","setTaskListWidth","wrapperWidth","setWrapperWidth","maxTableWidth","tableCap","handleTableResizeMouseDown","onMouseMove","newWidth","onMouseUp","setSvgContainerWidth","setSvgContainerHeight","setBarTasks","debounceRef","handleBarTasksUpdate","failedTask","computedColumnWidth","setComputedColumnWidth","computedForViewModeRef","minVisible","maxVisible","prevViewMode","visible","oldMin","oldMax","targetVisible","alreadySnappedForView","effectiveColumnWidth","setScrollY","setScrollX","ignoreScrollEvent","setIgnoreScrollEvent","lastTouchX","setLastTouchX","lastTouchY","setLastTouchY","isProcessing","setIsProcessing","clearTimeout","setTimeout","filteredTasks","sort","newDates","uncolorAll","colorPath","nextBarTasks","valueOf","findIndex","ResizeObserver","measure","observer","observe","disconnect","node","handleWheel","shiftKey","deltaX","scrollMove","deltaY","newScrollX","newScrollY","handleLogTouch","changedTouches","pageX","pageY","handleTouch","passive","handleScrollY","currentTarget","handleScrollX","handleKeyDown","isX","handleSelectedTask","newSelectedTask","oldSelectedTask","handleExpanderClick","tableTasks","wrapper","zIndex","alignSelf","userSelect","letterSpacing","bottom","gap","borderRadius","fontWeight","spinner","hScrollStyles","flex","topologicalOrderingHelper","taskID","taskMap","sortedTaskList","finished","started","log","successVal","getCriticalPaths","dependents","computeCriticalPath","taskChainList","paths","duration","debug","primaryLeaf","primaryDuration","nextPath","newDuration","visited","secondaryLeaf","secondaryDuration","tIndex","parent_off_time","depStart","depEnd","depDuration","child_off_time","overlap","splice","k","totalDuration","immediateChildDuration","nearest","exact","cut","lastIndexOf","ancestor","slice","longestTask","taskFromTasks","arrows","wbs"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sources":["../src/types/public-types.ts","../src/helpers/date-helper.ts","../src/components/task-list/task-list-header.tsx","../src/components/task-list/task-list-table.tsx","../src/components/other/tooltip.tsx","../src/components/other/vertical-scroll.tsx","../src/components/task-list/task-list-columns.ts","../src/components/task-list/task-list.tsx","../src/helpers/calendar-helper.ts","../src/components/grid/grid-body.tsx","../src/components/grid/grid.tsx","../src/components/calendar/top-part-of-calendar.tsx","../src/components/calendar/calendar.tsx","../node_modules/babel-plugin-transform-async-to-promises/helpers.mjs","../src/components/other/arrow.tsx","../src/helpers/bar-helper.ts","../src/helpers/other-helper.ts","../src/components/task-item/bar/bar-display.tsx","../src/components/task-item/bar/bar-date-handle.tsx","../src/components/task-item/bar/bar-progress-handle.tsx","../src/components/task-item/bar/bar.tsx","../src/components/task-item/bar/bar-small.tsx","../src/components/task-item/milestone/milestone.tsx","../src/components/task-item/project/project.tsx","../src/components/task-item/task-item.tsx","../src/components/gantt/task-gantt-content.tsx","../src/components/gantt/task-gantt.tsx","../src/components/other/horizontal-scroll.tsx","../src/components/gantt/gantt.tsx"],"sourcesContent":["export interface CalendarDefinition {\n name: string;\n day_start: string;\n day_end: string;\n week_start: number;\n quarter_start: number;\n shifts: [string, string][];\n off_days: number[];\n holidays: string[];\n}\n\nexport enum ViewMode {\n Hour = \"Hour\",\n QuarterDay = \"Quarter Day\",\n HalfDay = \"Half Day\",\n Day = \"Day\",\n /** ISO-8601 week */\n Week = \"Week\",\n Month = \"Month\",\n Quarter = \"Quarter\",\n Year = \"Year\",\n}\nexport type TaskType = \"task\" | \"milestone\" | \"project\";\nexport type Dependency = \"SS\" | \"SF\" | \"FS\" | \"FF\";\n\nexport declare type DependencyType = {\n id: string;\n type: Dependency;\n};\nexport interface Task {\n id: string;\n optionalId?: string | null;\n type: TaskType;\n name: string;\n start: Date;\n end: Date;\n /**\n * From 0 to 100\n */\n progress: number;\n actualStart: Date;\n actualEnd: Date;\n criticalPathArrows?: Array<{ taskId: string; arrowColor: string ; criticalPathType: string }>;\n styles?: {\n taskProgressColor?: string;\n backgroundColor?: string;\n backgroundSelectedColor?: string;\n progressColor?: string;\n progressSelectedColor?: string;\n criticalPathColor?: string;\n };\n percentComplete?: number | null;\n plannedDuration?: number | null;\n remainingDuration?: number | null;\n actualDuration?: number | null;\n durationType?: string | null;\n depth: number;\n isDisabled?: boolean;\n project?: string;\n dependencies?: DependencyType[];\n hideChildren?: boolean;\n displayOrder?: number;\n childrenCount?: number;\n calendar?: CalendarDefinition;\n}\n\nexport interface EventOption {\n /**\n * Time step value for date changes.\n */\n timeStep?: number;\n /**\n * Invokes on bar select on unselect.\n */\n onSelect?: (task: Task, isSelected: boolean) => void;\n /**\n * Invokes on bar double click.\n */\n onDoubleClick?: (task: Task) => void;\n /**\n * Invokes on bar click.\n */\n onClick?: (task: Task) => void;\n /**\n * Invokes on end and start time change. Chart undoes operation if method return false or error.\n */\n onDateChange?: (\n task: Task,\n children: Task[]\n ) => void | boolean | Promise<void> | Promise<boolean>;\n /**\n * Invokes on progress change. Chart undoes operation if method return false or error.\n */\n onProgressChange?: (\n task: Task,\n children: Task[]\n ) => void | boolean | Promise<void> | Promise<boolean>;\n /**\n * Invokes on delete selected task. Chart undoes operation if method return false or error.\n */\n onDelete?: (task: Task) => void | boolean | Promise<void> | Promise<boolean>;\n /**\n * Invokes on expander on task list\n */\n onExpanderClick?: (task: Task) => void;\n /**\n * Invokes when tasks are multi-selected via checkboxes\n */\n onMultiSelect?: (tasks: Task[]) => void;\n onCalendarError?: (task: Task, reason: string) => void;\n}\n\nexport interface DisplayOption {\n viewMode?: ViewMode;\n viewDate?: Date;\n preStepsCount?: number;\n /**\n * Specifies the month name language. Able formats: ISO 639-2, Java Locale\n */\n locale?: string;\n rtl?: boolean;\n}\n\nexport interface StylingOption {\n headerHeight?: number;\n columnWidth?: number;\n listCellWidth?: string;\n rowHeight?: number;\n ganttHeight?: number;\n barCornerRadius?: number;\n handleWidth?: number;\n fontFamily?: string;\n fontSize?: string;\n /**\n * How many of row width can be taken by task.\n * From 0 to 100\n */\n barFill?: number;\n barProgressColor?: string;\n barProgressSelectedColor?: string;\n barBackgroundColor?: string;\n barBackgroundSelectedColor?: string;\n projectProgressColor?: string;\n projectProgressSelectedColor?: string;\n projectBackgroundColor?: string;\n projectBackgroundSelectedColor?: string;\n milestoneBackgroundColor?: string;\n milestoneBackgroundSelectedColor?: string;\n arrowColor?: string;\n arrowIndent?: number;\n todayColor?: string;\n weekendColor?: string;\n TooltipContent?: React.FC<{\n task: Task;\n fontSize: string;\n fontFamily: string;\n }>;\n TaskListHeader?: React.FC<{\n headerHeight: number;\n rowWidth: string;\n fontFamily: string;\n fontSize: string;\n }>;\n TaskListTable?: React.FC<{\n rowHeight: number;\n rowWidth: string;\n fontFamily: string;\n fontSize: string;\n locale: string;\n tasks: Task[];\n selectedTaskId: string;\n /**\n * Sets selected task by id\n */\n setSelectedTask: (taskId: string) => void;\n onExpanderClick: (task: Task) => void;\n }>;\n taskLabelRenderer?: (Task: Task) => React.ReactNode;\n taskProgressColor?: string;\n delayToRender?: number;\n shouldNotShowLoadingOverlay?: boolean;\n}\n\nexport interface GanttProps extends EventOption, DisplayOption, StylingOption {\n tasks: Task[];\n primaryPath: Task[];\n secondaryPath: Task[];\n leafTasks?: Task[];\n scheduleType: string;\n startDate?: Date;\n endDate?: Date;\n projectCalendar?: CalendarDefinition;\n sliderTime?: number;\n}\n","import { Task, ViewMode } from \"../types/public-types\";\nimport DateTimeFormatOptions = Intl.DateTimeFormatOptions;\nimport DateTimeFormat = Intl.DateTimeFormat;\n\ntype DateHelperScales =\n | \"year\"\n | \"quarter\"\n | \"month\"\n | \"day\"\n | \"hour\"\n | \"minute\"\n | \"second\"\n | \"millisecond\";\n\nconst intlDTCache = {};\nexport const getCachedDateTimeFormat = (\n locString: string | string[],\n opts: DateTimeFormatOptions = {}\n): DateTimeFormat => {\n const key = JSON.stringify([locString, opts]);\n let dtf = intlDTCache[key];\n if (!dtf) {\n dtf = new Intl.DateTimeFormat(locString, opts);\n intlDTCache[key] = dtf;\n }\n return dtf;\n};\n\nexport const addToDate = (\n date: Date,\n quantity: number,\n scale: DateHelperScales\n) => {\n const newDate = new Date(\n date.getFullYear() + (scale === \"year\" ? quantity : 0),\n date.getMonth() + (scale === \"month\" ? quantity : 0),\n date.getDate() + (scale === \"day\" ? quantity : 0),\n date.getHours() + (scale === \"hour\" ? quantity : 0),\n date.getMinutes() + (scale === \"minute\" ? quantity : 0),\n date.getSeconds() + (scale === \"second\" ? quantity : 0),\n date.getMilliseconds() + (scale === \"millisecond\" ? quantity : 0)\n );\n return newDate;\n};\n\nexport const startOfDate = (date: Date, scale: DateHelperScales) => {\n const scores = [\n \"millisecond\",\n \"second\",\n \"minute\",\n \"hour\",\n \"day\",\n \"month\",\n \"quarter\",\n \"year\",\n ];\n\n const shouldReset = (_scale: DateHelperScales) => {\n const maxScore = scores.indexOf(scale);\n return scores.indexOf(_scale) <= maxScore;\n };\n const newDate = new Date(\n date.getFullYear(),\n shouldReset(\"year\") ? 0 : date.getMonth(),\n shouldReset(\"month\") ? 1 : date.getDate(),\n shouldReset(\"day\") ? 0 : date.getHours(),\n shouldReset(\"hour\") ? 0 : date.getMinutes(),\n shouldReset(\"minute\") ? 0 : date.getSeconds(),\n shouldReset(\"second\") ? 0 : date.getMilliseconds()\n );\n return newDate;\n};\n\n/**\n * Returns the start date (midnight) of the fiscal quarter containing `date`.\n * @param quarterStart 0-indexed month that begins Q1 (0=Jan, 4=May, etc.)\n */\nconst getFiscalQuarterStartDate = (date: Date, quarterStart: number): Date => {\n const month = date.getMonth();\n const offset = (month - quarterStart + 12) % 12;\n const qStartMonth = (quarterStart + Math.floor(offset / 3) * 3) % 12;\n let year = date.getFullYear();\n if (qStartMonth > month) year -= 1; // quarter started in the previous calendar year\n return new Date(year, qStartMonth, 1);\n};\n\n/**\n * Default number of columns the chart aims to render across the chart pane\n * for each view mode. The Gantt component sizes columns so that this many\n * fit at the current pane width when the view mode is selected.\n *\n * Modes not listed (Hour / QuarterDay / HalfDay / Year) fall through to the\n * legacy `columnWidth` default.\n */\nexport const VIEW_MODE_DEFAULT_VISIBLE_COUNT: Partial<Record<ViewMode, number>> = {\n [ViewMode.Day]: 14,\n [ViewMode.Week]: 6,\n [ViewMode.Month]: 6,\n [ViewMode.Quarter]: 4,\n};\n\n/**\n * Maximum number of columns the chart will show at once, even when the user\n * widens the chart pane with the resize bar. The Gantt component clamps\n * column width upward so visible count never exceeds this — overflow becomes\n * horizontal scroll.\n */\nexport const VIEW_MODE_MAX_VISIBLE_COUNT: Partial<Record<ViewMode, number>> = {\n [ViewMode.Day]: 30,\n [ViewMode.Week]: 13,\n [ViewMode.Month]: 12,\n [ViewMode.Quarter]: 8,\n};\n\nexport const ganttDateRange = (\n tasks: Task[],\n viewMode: ViewMode,\n preStepsCount: number,\n quarterStart: number = 0\n) => {\n let newStartDate: Date =\n tasks[0]?.start.getTime() !== 0\n ? tasks[0]?.start || new Date()\n : new Date();\n let newEndDate: Date =\n tasks[0]?.end.getTime() !== 0 ? tasks[0]?.end || new Date() : new Date();\n\n for (const task of tasks) {\n if (task.start && task.start.getTime() !== 0 && task.start < newStartDate) {\n newStartDate = task.start;\n }\n if (task.end && task.end.getTime() !== 0 && task.end > newEndDate) {\n newEndDate = task.end;\n }\n if (\n task.actualStart &&\n task.actualStart.getTime() !== 0 &&\n task.actualStart < newStartDate\n ) {\n newStartDate = task.actualStart;\n }\n if (\n task.actualEnd &&\n task.actualEnd.getTime() !== 0 &&\n task.actualEnd > newEndDate\n ) {\n newEndDate = task.actualEnd;\n }\n }\n\n switch (viewMode) {\n case ViewMode.Year:\n newStartDate = addToDate(newStartDate, -1, \"year\");\n newStartDate = startOfDate(newStartDate, \"year\");\n newEndDate = addToDate(newEndDate, 1, \"year\");\n newEndDate = startOfDate(newEndDate, \"year\");\n break;\n case ViewMode.Quarter: {\n newStartDate = addToDate(newStartDate, -1 * preStepsCount, \"year\");\n newStartDate = getFiscalQuarterStartDate(newStartDate, quarterStart);\n newEndDate = addToDate(newEndDate, 1, \"year\");\n const endQStart = getFiscalQuarterStartDate(newEndDate, quarterStart);\n newEndDate =\n endQStart < newEndDate ? addToDate(endQStart, 3, \"month\") : endQStart;\n break;\n }\n case ViewMode.Month:\n newStartDate = addToDate(newStartDate, -1 * preStepsCount, \"month\");\n newStartDate = startOfDate(newStartDate, \"month\");\n newEndDate = addToDate(newEndDate, 1, \"year\");\n newEndDate = startOfDate(newEndDate, \"year\");\n break;\n case ViewMode.Week:\n newStartDate = startOfDate(newStartDate, \"day\");\n newStartDate = addToDate(\n getMonday(newStartDate),\n -7 * preStepsCount,\n \"day\"\n );\n newEndDate = startOfDate(newEndDate, \"day\");\n newEndDate = addToDate(newEndDate, 1.5, \"month\");\n break;\n case ViewMode.Day:\n newStartDate = startOfDate(newStartDate, \"day\");\n newStartDate = addToDate(newStartDate, -1 * preStepsCount, \"day\");\n newEndDate = startOfDate(newEndDate, \"day\");\n newEndDate = addToDate(newEndDate, 19, \"day\");\n break;\n case ViewMode.QuarterDay:\n newStartDate = startOfDate(newStartDate, \"day\");\n newStartDate = addToDate(newStartDate, -1 * preStepsCount, \"day\");\n newEndDate = startOfDate(newEndDate, \"day\");\n newEndDate = addToDate(newEndDate, 66, \"hour\"); // 24(1 day)*3 - 6\n break;\n case ViewMode.HalfDay:\n newStartDate = startOfDate(newStartDate, \"day\");\n newStartDate = addToDate(newStartDate, -1 * preStepsCount, \"day\");\n newEndDate = startOfDate(newEndDate, \"day\");\n newEndDate = addToDate(newEndDate, 108, \"hour\"); // 24(1 day)*5 - 12\n break;\n case ViewMode.Hour:\n newStartDate = startOfDate(newStartDate, \"hour\");\n newStartDate = addToDate(newStartDate, -1 * preStepsCount, \"hour\");\n newEndDate = startOfDate(newEndDate, \"day\");\n newEndDate = addToDate(newEndDate, 1, \"day\");\n break;\n }\n return [newStartDate, newEndDate];\n};\n\nexport const seedDates = (\n startDate: Date,\n endDate: Date,\n viewMode: ViewMode\n) => {\n let currentDate: Date = new Date(startDate);\n const dates: Date[] = [currentDate];\n while (currentDate < endDate) {\n switch (viewMode) {\n case ViewMode.Year:\n currentDate = addToDate(currentDate, 1, \"year\");\n break;\n case ViewMode.Quarter:\n currentDate = addToDate(currentDate, 3, \"month\");\n break;\n case ViewMode.Month:\n currentDate = addToDate(currentDate, 1, \"month\");\n break;\n case ViewMode.Week:\n currentDate = addToDate(currentDate, 7, \"day\");\n break;\n case ViewMode.Day:\n currentDate = addToDate(currentDate, 1, \"day\");\n break;\n case ViewMode.HalfDay:\n currentDate = addToDate(currentDate, 12, \"hour\");\n break;\n case ViewMode.QuarterDay:\n currentDate = addToDate(currentDate, 6, \"hour\");\n break;\n case ViewMode.Hour:\n currentDate = addToDate(currentDate, 1, \"hour\");\n break;\n }\n dates.push(currentDate);\n }\n return dates;\n};\n\nexport const getLocaleMonth = (date: Date, locale: string) => {\n let bottomValue = getCachedDateTimeFormat(locale, {\n month: \"long\",\n }).format(date);\n bottomValue = bottomValue.replace(\n bottomValue[0],\n bottomValue[0].toLocaleUpperCase()\n );\n return bottomValue;\n};\n\nexport const getLocalDayOfWeek = (\n date: Date,\n locale: string,\n format?: \"long\" | \"short\" | \"narrow\" | undefined\n) => {\n let bottomValue = getCachedDateTimeFormat(locale, {\n weekday: format,\n }).format(date);\n bottomValue = bottomValue.replace(\n bottomValue[0],\n bottomValue[0].toLocaleUpperCase()\n );\n return bottomValue;\n};\n\n/**\n * Returns monday of current week\n * @param date date for modify\n */\nconst getMonday = (date: Date) => {\n const day = date.getDay();\n const diff = date.getDate() - day + (day === 0 ? -6 : 1); // adjust when day is sunday\n return new Date(date.setDate(diff));\n};\n\nexport const getWeekNumberISO8601 = (date: Date) => {\n const tmpDate = new Date(date.valueOf());\n const dayNumber = (tmpDate.getDay() + 6) % 7;\n tmpDate.setDate(tmpDate.getDate() - dayNumber + 3);\n const firstThursday = tmpDate.valueOf();\n tmpDate.setMonth(0, 1);\n if (tmpDate.getDay() !== 4) {\n tmpDate.setMonth(0, 1 + ((4 - tmpDate.getDay() + 7) % 7));\n }\n const weekNumber = (\n 1 + Math.ceil((firstThursday - tmpDate.valueOf()) / 604800000)\n ).toString();\n\n if (weekNumber.length === 1) {\n return `0${weekNumber}`;\n } else {\n return weekNumber;\n }\n};\n\nexport const getDaysInMonth = (month: number, year: number) => {\n return new Date(year, month + 1, 0).getDate();\n};\n","import React from \"react\";\nimport styles from \"./task-list-header.module.css\";\n\nexport const TaskListHeaderDefault: React.FC<{\n headerHeight: number;\n rowWidth: string;\n fontFamily: string;\n fontSize: string;\n scheduleType: string;\n allSelected?: boolean;\n onSelectAll?: (selected: boolean) => void;\n columnWidths?: Record<string, number>;\n onColumnResize?: (colId: string, width: number) => void;\n}> = ({\n headerHeight,\n fontFamily,\n fontSize,\n rowWidth,\n scheduleType,\n allSelected,\n onSelectAll,\n columnWidths,\n onColumnResize,\n}) => {\n const widthOf = (colId: string, factor: number) =>\n columnWidths?.[colId] ?? parseInt(rowWidth) * factor;\n\n // Begin a column-resize drag. Mirrors the panel resizer in gantt.tsx:\n // record the start X + width, then update the column width on each mousemove.\n const startResize =\n (colId: string, startWidth: number) => (e: React.MouseEvent) => {\n if (!onColumnResize) return;\n e.preventDefault();\n e.stopPropagation();\n const startX = e.clientX;\n const onMove = (ev: MouseEvent) => {\n onColumnResize(colId, startWidth + (ev.clientX - startX));\n };\n const onUp = () => {\n document.removeEventListener(\"mousemove\", onMove);\n document.removeEventListener(\"mouseup\", onUp);\n };\n document.addEventListener(\"mousemove\", onMove);\n document.addEventListener(\"mouseup\", onUp);\n };\n\n const cell = (\n colId: string,\n factor: number,\n content: React.ReactNode,\n opts: { title?: string; resizable?: boolean } = {}\n ) => {\n const { title, resizable = true } = opts;\n const width = widthOf(colId, factor);\n return (\n <div\n className={styles.ganttTable_HeaderItem}\n style={{ minWidth: width, maxWidth: width, position: \"relative\" }}\n title={title}\n >\n <div className={styles.ganttTable_HeaderItemText}>{content}</div>\n {resizable && onColumnResize && (\n <div\n className={styles.ganttTable_HeaderResizeHandle}\n style={{ height: headerHeight - 2 }}\n onMouseDown={startResize(colId, width)}\n />\n )}\n </div>\n );\n };\n\n return (\n <div\n className={styles.ganttTable}\n style={{\n fontFamily: fontFamily,\n fontSize: fontSize,\n }}\n >\n <div\n className={styles.ganttTable_Header}\n style={{\n height: headerHeight - 2,\n }}\n >\n {onSelectAll &&\n cell(\n \"select\",\n 0.3,\n <input\n type=\"checkbox\"\n checked={allSelected}\n onChange={e => onSelectAll(e.target.checked)}\n />,\n { resizable: false }\n )}\n {cell(\"id\", 0.8, \"ID\")}\n {cell(\"wbs\", 0.8, \"WBS Code / Activity ID\")}\n {cell(\"name\", 1.8, \"Task\")}\n {cell(\"plannedStart\", 0.6, \"Planned Start\", { title: \"Planned Start\" })}\n {cell(\"plannedEnd\", 0.6, \"Planned End\", { title: \"Planned End\" })}\n {scheduleType === \"lookAhead\" && (\n <React.Fragment>\n {cell(\"actualStart\", 0.6, \"Actual Start\", { title: \"Actual Start\" })}\n {cell(\"actualEnd\", 0.6, \"Actual End\", { title: \"Actual End\" })}\n </React.Fragment>\n )}\n {scheduleType === \"main\" && (\n <React.Fragment>\n {cell(\"percentComplete\", 0.6, \"% Complete\", { title: \"% Complete\" })}\n {cell(\"plannedDuration\", 0.6, \"Planned Duration\", {\n title: \"Planned Duration\",\n })}\n {cell(\"remainingDuration\", 0.7, \"Remaining Duration\", {\n title: \"Remaining Duration\",\n })}\n {cell(\"actualDuration\", 0.6, \"Actual Duration\", {\n title: \"Actual Duration\",\n })}\n {cell(\"durationType\", 0.8, \"Duration Type\", {\n title: \"Duration Type\",\n })}\n </React.Fragment>\n )}\n </div>\n </div>\n );\n};\n","import React, { useMemo } from \"react\";\nimport { VirtualItem } from \"@tanstack/react-virtual\";\nimport styles from \"./task-list-table.module.css\";\nimport { Task } from \"../../types/public-types\";\nimport { getParentWbs } from \"../gantt/gantt\";\n\nconst localeDateStringCache = {};\nconst toLocaleDateStringFactory =\n (locale: string) =>\n (date: Date, dateTimeOptions: Intl.DateTimeFormatOptions): string => {\n if (!date || date.getTime() === 0) return \"\"; // Handle invalid dates\n const key = date.toString();\n let lds = localeDateStringCache[key];\n if (!lds) {\n lds = date.toLocaleDateString(locale, dateTimeOptions);\n localeDateStringCache[key] = lds;\n }\n return lds;\n };\nconst dateTimeOptions: Intl.DateTimeFormatOptions = {\n year: \"numeric\",\n month: \"numeric\",\n day: \"numeric\",\n};\n\nexport const TaskListTableDefault: React.FC<{\n rowHeight: number;\n rowWidth: string;\n fontFamily: string;\n fontSize: string;\n locale: string;\n tasks: Task[];\n scheduleType: string;\n leafTasks: Task[];\n selectedTaskId: string;\n setSelectedTask: (taskId: string) => void;\n onExpanderClick: (task: Task) => void;\n selectedTasks?: string[];\n onTaskSelect?: (taskId: string, selected: boolean) => void;\n taskLabelRenderer?: (Task: Task) => React.ReactNode;\n virtualItems?: VirtualItem[];\n columnWidths?: Record<string, number>;\n}> = ({\n rowHeight,\n rowWidth,\n tasks,\n scheduleType,\n leafTasks,\n fontFamily,\n fontSize,\n locale,\n onExpanderClick,\n selectedTasks = [],\n onTaskSelect,\n taskLabelRenderer = t => \" \" + t.name,\n virtualItems,\n columnWidths,\n}) => {\n // Per-column widths shared with the header (so resize stays in sync); falls\n // back to the default factor × rowWidth when no width has been set.\n const widthOf = (colId: string, factor: number) =>\n columnWidths?.[colId] ?? parseInt(rowWidth) * factor;\n const toLocaleDateString = useMemo(\n () => toLocaleDateStringFactory(locale),\n [locale]\n );\n const leafTaskIds = useMemo(\n () => new Set(leafTasks.map(t => t.id)),\n [leafTasks]\n );\n\n // Checks if the task has a selected ancestor by traversing the WBS hierarchy\n const hasSelectedAncestor = (taskId: string, selectedSet: Set<string>, allTasks: Task[]): boolean => {\n const task = allTasks.find(t => t.id === taskId);\n if (!task) return false;\n const parentWbs = getParentWbs(task.id);\n if (!parentWbs) return false;\n if (selectedSet.has(parentWbs)) return true;\n return hasSelectedAncestor(parentWbs, selectedSet, allTasks);\n };\n\n const itemsToRender = virtualItems || tasks.map((_, index) => ({ index, start: index * rowHeight, size: rowHeight, key: index, end: (index + 1) * rowHeight, lane: 0, measureElement: () => {} }));\n\n return (\n <div\n className={styles.taskListWrapper}\n style={{\n fontFamily: fontFamily,\n fontSize: fontSize,\n }}\n >\n {itemsToRender.map(vi => {\n const t = tasks[vi.index];\n let expanderSymbol = \"\";\n if (!(leafTaskIds.has(t.id) || t.type=== \"milestone\")) {\n if (t.hideChildren === false) {\n expanderSymbol = \"▼\";\n } else if (t.hideChildren === true) {\n expanderSymbol = \"►\";\n }\n }\n\n const isSelected = selectedTasks.includes(t.id);\n const isAncestorSelected = hasSelectedAncestor(t.id, new Set(selectedTasks), tasks);\n\n return (\n <div\n key={`${vi.key}`}\n data-index={vi.index}\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n width: \"100%\",\n height: `${vi.size}px`,\n transform: `translateY(${vi.start}px)`,\n }}\n >\n <div\n className={\n t.type === \"milestone\"\n ? styles.taskListMilestoneRow\n : scheduleType === \"lookAhead\"\n ? styles.taskListLookAheadRow\n : styles.taskListTableRow\n }\n style={{ height: rowHeight }}\n key={`${t.id}row`}\n >\n {onTaskSelect && (\n <div\n className={styles.taskListCell}\n style={{\n minWidth: widthOf(\"select\", 0.3),\n maxWidth: widthOf(\"select\", 0.3),\n }}\n >\n <div className={styles.taskListText} style={{ \n display: \"flex\", \n justifyContent: \"center\", \n alignItems: \"center\",\n height: \"100%\",\n paddingLeft: \"0\",\n paddingRight: \"0\"\n }}>\n <input \n type=\"checkbox\" \n checked={isSelected}\n disabled={isAncestorSelected}\n onChange={(e) => onTaskSelect(t.id, e.target.checked)}\n />\n </div>\n </div>\n )}\n <div\n className={styles.taskListCell}\n style={{\n minWidth: widthOf(\"id\", 0.8),\n maxWidth: widthOf(\"id\", 0.8),\n }}\n title={t.id}\n >\n <div\n className={styles.taskListNameWrapper}\n style={{ paddingLeft: `${t.depth * 4}px` }}\n >\n {!(leafTaskIds.has(t.id) || t.type=== \"milestone\") ? (\n <div\n className={styles.taskListExpander}\n onClick={() => onExpanderClick(t)}\n >\n \n {expanderSymbol}\n </div>\n ) : (\n <div className={styles.taskListExpanderPlaceholder}></div>\n )}\n <div className={styles.taskListText}>\n {t.id}{\" \"}\n {t.actualEnd.getTime() > 0 &&\n t.actualEnd.getTime() < Date.now() ? (\n <span\n title=\"Task Complete\"\n style={{ color: \"limegreen\", fontSize: \"16px\" }}\n >\n ✔\n </span>\n ) : (\n \"\"\n )}\n </div>\n </div>\n </div>\n <div\n className={styles.taskListCell}\n style={{\n minWidth: widthOf(\"wbs\", 0.8),\n maxWidth: widthOf(\"wbs\", 0.8),\n }}\n title={t.optionalId?t.optionalId:\"\"}\n >\n {t.optionalId}\n </div>\n <div\n className={styles.taskListCell}\n style={{\n minWidth: widthOf(\"name\", 1.8),\n maxWidth: widthOf(\"name\", 1.8),\n }}\n title={t.name}\n >\n <div className={styles.taskListText}>{taskLabelRenderer(t)}</div>\n </div>\n <div\n className={styles.taskListCell}\n style={{\n minWidth: widthOf(\"plannedStart\", 0.6),\n maxWidth: widthOf(\"plannedStart\", 0.6),\n }}\n >\n <div className={styles.taskListText}>\n &nbsp;{toLocaleDateString(t.start, dateTimeOptions)}\n </div>\n </div>\n <div\n className={styles.taskListCell}\n style={{\n minWidth: widthOf(\"plannedEnd\", 0.6),\n maxWidth: widthOf(\"plannedEnd\", 0.6),\n }}\n >\n <div className={styles.taskListText}>\n &nbsp;{toLocaleDateString(t.end, dateTimeOptions)}\n </div>\n </div>\n {scheduleType === \"lookAhead\" && (\n <div\n className={styles.taskListCell}\n style={{\n minWidth: widthOf(\"actualStart\", 0.6),\n maxWidth: widthOf(\"actualStart\", 0.6),\n }}\n >\n <div className={styles.taskListText}>\n &nbsp;{toLocaleDateString(t.actualStart, dateTimeOptions)}\n </div>\n </div>\n )}\n {scheduleType === \"lookAhead\" && (\n <div\n className={styles.taskListCell}\n style={{\n minWidth: widthOf(\"actualEnd\", 0.6),\n maxWidth: widthOf(\"actualEnd\", 0.6),\n }}\n >\n <div className={styles.taskListText}>\n &nbsp;{toLocaleDateString(t.actualEnd, dateTimeOptions)}\n </div>\n </div>\n )}\n {scheduleType === \"main\" && (() => {\n const percentComplete = t.percentComplete != null ? t.percentComplete : (t.progress ?? 0);\n const plannedDuration = t.plannedDuration != null ? t.plannedDuration : null;\n const remainingDuration = plannedDuration != null\n ? Math.max(Math.round(plannedDuration - (plannedDuration * (percentComplete / 100))), 0)\n : null;\n const actualDuration = (() => {\n if (!t.actualStart || t.actualStart.getTime() === 0) return null;\n const endRef = (t.actualEnd && t.actualEnd.getTime() > 0) ? t.actualEnd : new Date();\n return Math.ceil((endRef.getTime() - t.actualStart.getTime()) / (1000 * 60 * 60 * 24));\n })();\n return (\n <React.Fragment>\n <div\n className={styles.taskListCell}\n style={{\n minWidth: widthOf(\"percentComplete\", 0.6),\n maxWidth: widthOf(\"percentComplete\", 0.6),\n }}\n >\n <div className={styles.taskListText}>\n &nbsp;{percentComplete != null ? `${percentComplete}%` : \"\"}\n </div>\n </div>\n <div\n className={styles.taskListCell}\n style={{\n minWidth: widthOf(\"plannedDuration\", 0.6),\n maxWidth: widthOf(\"plannedDuration\", 0.6),\n }}\n >\n <div className={styles.taskListText}>\n &nbsp;{plannedDuration != null ? plannedDuration : \"\"}\n </div>\n </div>\n <div\n className={styles.taskListCell}\n style={{\n minWidth: widthOf(\"remainingDuration\", 0.7),\n maxWidth: widthOf(\"remainingDuration\", 0.7),\n }}\n >\n <div className={styles.taskListText}>\n &nbsp;{remainingDuration != null ? remainingDuration : \"\"}\n </div>\n </div>\n <div\n className={styles.taskListCell}\n style={{\n minWidth: widthOf(\"actualDuration\", 0.6),\n maxWidth: widthOf(\"actualDuration\", 0.6),\n }}\n >\n <div className={styles.taskListText}>\n &nbsp;{actualDuration != null ? actualDuration : \"\"}\n </div>\n </div>\n <div\n className={styles.taskListCell}\n style={{\n minWidth: widthOf(\"durationType\", 0.8),\n maxWidth: widthOf(\"durationType\", 0.8),\n }}\n >\n <div className={styles.taskListText}>\n &nbsp;{t.durationType ?? \"Activity Calendar\"}\n </div>\n </div>\n </React.Fragment>\n );\n })()}\n </div>\n </div>\n );\n })}\n </div>\n );\n};","import React, { useRef, useEffect, useState } from \"react\";\nimport { Task } from \"../../types/public-types\";\nimport { BarTask } from \"../../types/bar-task\";\nimport styles from \"./tooltip.module.css\";\n\nexport type TooltipProps = {\n task: BarTask;\n type: string;\n arrowIndent: number;\n rtl: boolean;\n svgContainerHeight: number;\n svgContainerWidth: number;\n svgWidth: number;\n headerHeight: number;\n taskListWidth: number;\n scrollX: number;\n scrollY: number;\n rowHeight: number;\n fontSize: string;\n fontFamily: string;\n TooltipContent: React.FC<{\n task: Task;\n fontSize: string;\n fontFamily: string;\n type: string;\n }>;\n isDragging?: boolean;\n};\nexport const Tooltip: React.FC<TooltipProps> = ({\n task,\n type,\n rowHeight,\n rtl,\n svgContainerHeight,\n svgContainerWidth,\n scrollX,\n scrollY,\n arrowIndent,\n fontSize,\n fontFamily,\n headerHeight,\n taskListWidth,\n TooltipContent,\n isDragging,\n}) => {\n const tooltipRef = useRef<HTMLDivElement | null>(null);\n const [relatedY, setRelatedY] = useState(0);\n const [relatedX, setRelatedX] = useState(0);\n useEffect(() => {\n if (tooltipRef.current) {\n const tooltipHeight = tooltipRef.current.offsetHeight * 1.1;\n const tooltipWidth = tooltipRef.current.offsetWidth * 1.1;\n\n let newRelatedY = task.index * rowHeight - scrollY + headerHeight;\n let newRelatedX: number;\n\n // During drag: pin to top-right corner of chart area so it never blocks the bar\n if (isDragging) {\n newRelatedX = taskListWidth + svgContainerWidth - tooltipWidth - 10;\n newRelatedY = headerHeight + 5;\n setRelatedY(newRelatedY);\n setRelatedX(newRelatedX);\n return;\n }\n\n if (rtl) {\n newRelatedX = task.x1 - arrowIndent * 1.5 - tooltipWidth - scrollX;\n if (newRelatedX < 0) {\n newRelatedX = task.x2 + arrowIndent * 1.5 - scrollX;\n }\n const tooltipLeftmostPoint = tooltipWidth + newRelatedX;\n if (tooltipLeftmostPoint > svgContainerWidth) {\n newRelatedX = svgContainerWidth - tooltipWidth;\n newRelatedY += rowHeight;\n }\n } else {\n newRelatedX =\n type == \"planned\"\n ? task.x2 + arrowIndent * 1.5 + taskListWidth - scrollX\n : task.actualx2 + arrowIndent * 1.5 + taskListWidth - scrollX;\n const tooltipLeftmostPoint = tooltipWidth + newRelatedX;\n const fullChartWidth = taskListWidth + svgContainerWidth;\n if (tooltipLeftmostPoint > fullChartWidth) {\n newRelatedX =\n type == \"planned\"\n ? task.x1 +\n taskListWidth -\n arrowIndent * 1.5 -\n scrollX -\n tooltipWidth\n : task.actualx1 +\n taskListWidth -\n arrowIndent * 1.5 -\n scrollX -\n tooltipWidth;\n }\n if (newRelatedX < taskListWidth) {\n newRelatedX = svgContainerWidth + taskListWidth - tooltipWidth;\n newRelatedY += rowHeight;\n }\n }\n\n const tooltipLowerPoint = tooltipHeight + newRelatedY - scrollY;\n if (tooltipLowerPoint > svgContainerHeight - scrollY) {\n newRelatedY = svgContainerHeight - tooltipHeight;\n }\n setRelatedY(newRelatedY);\n setRelatedX(newRelatedX);\n }\n }, [\n tooltipRef,\n task,\n arrowIndent,\n scrollX,\n scrollY,\n headerHeight,\n taskListWidth,\n rowHeight,\n svgContainerHeight,\n svgContainerWidth,\n rtl,\n isDragging,\n ]);\n\n return (\n <div\n ref={tooltipRef}\n className={\n relatedX\n ? styles.tooltipDetailsContainer\n : styles.tooltipDetailsContainerHidden\n }\n style={{ left: relatedX, top: relatedY }}\n >\n <TooltipContent\n task={task}\n fontSize={fontSize}\n fontFamily={fontFamily}\n type={type}\n />\n </div>\n );\n};\n\n// Function used to calculate the off time (combination of off days and holidays) for a given task\nfunction getOffTime(task: any, taskStart: any, taskEnd: any, _message: any) {\n\n let start = taskStart.getTime();\n let end = taskEnd.getTime();\n\n // Figure out which weeks the task starts and ends on using some unix timestamp math\n // Convert time from milliseconds to days, add 4 to get to first sunday (0 represents a Thursday in unix time), then floor divide by 0 to get the week number\n let startWeek = Math.floor(((start / 86400000) + 4) / 7);\n let endWeek = Math.floor(((end / 86400000) + 4) / 7);\n let offTime = 0;\n\n // Get off time for each child. If task has no calendar, off time is naturally 0\n if (task.calendar) {\n\n // Off Day Calculation\n if (task.calendar.off_days && task.calendar.off_days.length) {\n for (let d = 0; d < task.calendar.off_days.length || 0; d++) {\n for (let w = startWeek; w <= endWeek; w++) {\n let dayOfTheWeek = task.calendar.off_days[d];\n // Check each week to see if an off day is within duration\n // Notice this is the inverse operation of the milliseconds to week operation performed above\n let offDay = 86400000 * ((7 * w - 4) + dayOfTheWeek);\n // If so...\n if (offDay >= start && offDay <= end) {\n // ...mark a day's worth of time to be subtracted from total duration\n offTime += 86400000;\n }\n }\n }\n }\n\n // Holiday Calculation\n if (task.calendar.holidays && task.calendar.holidays.length) {\n // console.debug(task.calendar.holidays);\n for (let h = 0; h < task.calendar.holidays.length || 0; h++) {\n // Check each holiday to see if it is within duration\n let holiday = task.calendar.holidays[h];\n let holiday_timestamp = new Date(holiday).getTime()\n // If so...\n if (holiday_timestamp >= start && holiday_timestamp <= end) {\n // ...mark a day's worth of time to be subtracted from total duration\n offTime += 86400000;\n }\n }\n }\n }\n\n return offTime;\n}\n\nexport const StandardTooltipContent: React.FC<{\n task: Task;\n fontSize: string;\n fontFamily: string;\n type: string;\n}> = ({ task, fontSize, fontFamily, type }) => {\n const style = {\n fontSize,\n fontFamily,\n };\n\n // Compute duration dynamically from the current dates (updated in real-time during drag)\n const computedPlannedDuration =\n task.start && task.end && task.end.getTime() - task.start.getTime() > 0\n ? Math.max(1, Math.round((task.end.getTime() - task.start.getTime() - getOffTime(task, task.start, task.end, \"planned\")) / (1000 * 60 * 60 * 24)))\n : task.plannedDuration ?? 0;\n\n const computedActualDuration =\n task.actualStart && task.actualEnd && task.actualEnd.getTime() - task.actualStart.getTime() > 0\n ? Math.max(1, Math.round((task.actualEnd.getTime() - task.actualStart.getTime() - getOffTime(task, task.actualStart, task.actualEnd, \"actual\")) / (1000 * 60 * 60 * 24)))\n : task.actualDuration ?? 0;\n\n if (type == \"planned\")\n return (\n <div className={styles.tooltipDefaultContainer} style={style}>\n <b\n style={{ fontSize: fontSize + 6 }}\n >{`${task.name}: Planned dates: `}</b>\n <b>{`${\n task.start.getMonth() + 1\n }/${task.start.getDate()}/${task.start.getFullYear()} - ${\n task.end.getMonth() + 1\n }/${task.end.getDate()}/${task.end.getFullYear()}`}</b>\n {task.end.getTime() - task.start.getTime() !== 0 && (\n <p\n className={styles.tooltipDefaultContainerParagraph}\n >{`Duration: ${computedPlannedDuration} day(s)`}</p>\n )}\n\n <p className={styles.tooltipDefaultContainerParagraph}>\n {!!task.progress && `Progress: ${task.progress} %`}\n </p>\n </div>\n );\n else\n return (\n <div className={styles.tooltipDefaultContainer} style={style}>\n <b\n style={{ fontSize: fontSize + 6 }}\n >{`${task.name}: Actual dates: `}</b>\n <b>{`${\n task.actualStart.getMonth() + 1\n }/${task.actualStart.getDate()}/${task.actualStart.getFullYear()} - ${\n task.actualEnd.getMonth() + 1\n }/${task.actualEnd.getDate()}/${task.actualEnd.getFullYear()}`}</b>\n {task.actualEnd.getTime() - task.actualStart.getTime() !== 0 && (\n <p\n className={styles.tooltipDefaultContainerParagraph}\n >{`Duration: ${computedActualDuration} day(s)`}</p>\n )}\n\n <p className={styles.tooltipDefaultContainerParagraph}>\n {!!task.progress && `Progress: ${task.progress} %`}\n </p>\n </div>\n );\n};\n","import React, { SyntheticEvent, useRef, useEffect } from \"react\";\nimport styles from \"./vertical-scroll.module.css\";\n\nexport const VerticalScroll: React.FC<{\n scroll: number;\n ganttHeight: number;\n ganttFullHeight: number;\n headerHeight: number;\n rtl: boolean;\n onScroll: (event: SyntheticEvent<HTMLDivElement>) => void;\n}> = ({\n scroll,\n ganttHeight,\n ganttFullHeight,\n headerHeight,\n rtl,\n onScroll,\n}) => {\n const scrollRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (scrollRef.current) {\n scrollRef.current.scrollTop = scroll;\n }\n }, [scroll]);\n\n return (\n <div\n style={{\n height: ganttHeight,\n marginTop: headerHeight,\n marginLeft: rtl ? \"\" : \"-1rem\",\n marginRight: \"1rem\",\n }}\n className={styles.scroll}\n onScroll={onScroll}\n ref={scrollRef}\n >\n <div style={{ height: ganttFullHeight, width: 1 }} />\n </div>\n );\n};\n","/**\n * Single source of truth for the left task-list columns: their stable ids and\n * default width factors (multiplied by `parseInt(rowWidth)`). Both the header\n * and the table read these ids when looking up per-column widths so resizing a\n * column keeps the two in sync.\n */\nexport type TaskListColumn = {\n id: string;\n factor: number;\n};\n\nexport function getTaskListColumns(\n scheduleType: string,\n hasCheckbox: boolean\n): TaskListColumn[] {\n const columns: TaskListColumn[] = [];\n\n if (hasCheckbox) columns.push({ id: \"select\", factor: 0.3 });\n\n columns.push(\n { id: \"id\", factor: 0.8 },\n { id: \"wbs\", factor: 0.8 },\n { id: \"name\", factor: 1.8 },\n { id: \"plannedStart\", factor: 0.6 },\n { id: \"plannedEnd\", factor: 0.6 }\n );\n\n if (scheduleType === \"lookAhead\") {\n columns.push(\n { id: \"actualStart\", factor: 0.6 },\n { id: \"actualEnd\", factor: 0.6 }\n );\n }\n\n if (scheduleType === \"main\") {\n columns.push(\n { id: \"percentComplete\", factor: 0.6 },\n { id: \"plannedDuration\", factor: 0.6 },\n { id: \"remainingDuration\", factor: 0.7 },\n { id: \"actualDuration\", factor: 0.6 },\n { id: \"durationType\", factor: 0.8 }\n );\n }\n\n return columns;\n}\n\n/** Minimum width (px) a column can be dragged down to. */\nexport const MIN_COLUMN_WIDTH = 40;\n\n/** Build the default width map (px) for the current column set. */\nexport function buildDefaultColumnWidths(\n scheduleType: string,\n hasCheckbox: boolean,\n rowWidth: string\n): Record<string, number> {\n const base = parseInt(rowWidth) || 0;\n const widths: Record<string, number> = {};\n for (const col of getTaskListColumns(scheduleType, hasCheckbox)) {\n widths[col.id] = base * col.factor;\n }\n return widths;\n}\n","import React, { useEffect, useMemo, useRef, useState } from \"react\";\nimport { useVirtualizer, VirtualItem } from \"@tanstack/react-virtual\";\nimport { EventOption } from \"../../types/public-types\";\nimport { BarTask } from \"../../types/bar-task\";\nimport { Task } from \"../../types/public-types\";\nimport { getParentWbs } from \"../gantt/gantt\";\nimport { buildDefaultColumnWidths, MIN_COLUMN_WIDTH } from \"./task-list-columns\";\nimport styles from \"./task-list.module.css\";\n\nexport type TaskListProps = {\n headerHeight: number;\n rowWidth: string;\n fontFamily: string;\n fontSize: string;\n rowHeight: number;\n ganttHeight: number;\n scrollY: number;\n locale: string;\n tasks: Task[];\n scheduleType: string;\n leafTasks: Task[];\n taskListRef: React.RefObject<HTMLDivElement>;\n horizontalContainerClass?: string;\n selectedTask: BarTask | undefined;\n setSelectedTask: (task: string) => void;\n onExpanderClick: (task: Task) => void;\n taskLabelRenderer?: (Task: Task) => React.ReactNode;\n TaskListHeader: React.FC<{\n headerHeight: number;\n rowWidth: string;\n fontFamily: string;\n fontSize: string;\n scheduleType: string;\n allSelected?: boolean;\n onSelectAll?: (selected: boolean) => void;\n columnWidths?: Record<string, number>;\n onColumnResize?: (colId: string, width: number) => void;\n }>;\n TaskListTable: React.FC<{\n rowHeight: number;\n rowWidth: string;\n fontFamily: string;\n fontSize: string;\n locale: string;\n tasks: Task[];\n scheduleType: string;\n leafTasks: Task[];\n selectedTaskId: string;\n setSelectedTask: (taskId: string) => void;\n onExpanderClick: (task: Task) => void;\n selectedTasks?: string[];\n onTaskSelect?: (taskId: string, selected: boolean) => void;\n taskLabelRenderer?: (Task: Task) => React.ReactNode;\n virtualItems?: VirtualItem[];\n columnWidths?: Record<string, number>;\n }>;\n containerWidth?: number;\n containerMaxWidth?: number;\n onContentWidthChange?: (width: number) => void;\n innerScrollRef?: React.RefObject<HTMLDivElement>;\n horizontalContainerRef?: React.RefObject<HTMLDivElement>;\n} & EventOption;\n\nexport const TaskList: React.FC<TaskListProps> = ({\n headerHeight,\n fontFamily,\n fontSize,\n rowWidth,\n rowHeight,\n scrollY,\n tasks,\n scheduleType,\n leafTasks,\n selectedTask,\n setSelectedTask,\n onExpanderClick,\n locale,\n ganttHeight,\n taskListRef,\n horizontalContainerClass,\n TaskListHeader,\n TaskListTable,\n taskLabelRenderer,\n onMultiSelect,\n containerWidth,\n containerMaxWidth,\n onContentWidthChange,\n innerScrollRef,\n horizontalContainerRef: externalHorizontalContainerRef,\n}) => {\n const internalHorizontalContainerRef = useRef<HTMLDivElement>(null);\n const horizontalContainerRef = externalHorizontalContainerRef ?? internalHorizontalContainerRef;\n const headerScrollRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n const rowsEl = horizontalContainerRef.current;\n if (!rowsEl) return;\n const onScroll = () => {\n if (headerScrollRef.current) {\n headerScrollRef.current.scrollLeft = rowsEl.scrollLeft;\n }\n };\n rowsEl.addEventListener(\"scroll\", onScroll);\n return () => rowsEl.removeEventListener(\"scroll\", onScroll);\n }, [horizontalContainerRef]);\n const [selectedTasks, setSelectedTasks] = useState<string[]>([]);\n\n // Per-column widths (px), shared by the header and table so resizing a column\n // keeps both in sync. Seeded from the column factors × rowWidth.\n const hasCheckbox = !!onMultiSelect;\n const [columnWidths, setColumnWidths] = useState<Record<string, number>>(() =>\n buildDefaultColumnWidths(scheduleType, hasCheckbox, rowWidth)\n );\n\n // Re-seed only when the column SET changes (scheduleType / multiselect adds or\n // removes a column), preserving widths the user already set for columns that\n // persist. Returning `prev` when the set is unchanged avoids needless renders.\n useEffect(() => {\n const defaults = buildDefaultColumnWidths(scheduleType, hasCheckbox, rowWidth);\n setColumnWidths(prev => {\n const ids = Object.keys(defaults);\n const sameSet =\n ids.length === Object.keys(prev).length && ids.every(id => id in prev);\n if (sameSet) return prev;\n const next: Record<string, number> = {};\n for (const id of ids) next[id] = prev[id] ?? defaults[id];\n return next;\n });\n }, [scheduleType, hasCheckbox, rowWidth]);\n\n const handleColumnResize = (colId: string, width: number) => {\n setColumnWidths(prev => ({\n ...prev,\n [colId]: Math.max(MIN_COLUMN_WIDTH, width),\n }));\n };\n\n // True total width of all columns. Reported up so the parent can cap the table\n // at its content (no white space past the last column) and size the horizontal\n // scrollbar exactly — both without relying on a laggy scrollWidth measurement.\n const contentWidth = useMemo(\n () => Object.values(columnWidths).reduce((sum, w) => sum + w, 0),\n [columnWidths]\n );\n useEffect(() => {\n onContentWidthChange?.(contentWidth);\n }, [contentWidth, onContentWidthChange]);\n\n const [pendingTaskSelect, setPendingTaskSelect] = useState<{ taskId: string; selected: boolean }[]>([]);\n const prevSelectedTasksRef = useRef<string[]>([]);\n const expandedTasks = useRef(new Set<string>());\n\n // Selection walks parent/child links for every selected task, so index them\n // once per `tasks` instead of scanning and splitting ids on each lookup.\n const taskIndex = useMemo(() => {\n const byId = new Map<string, Task>();\n const childrenOf = new Map<string, string[]>();\n const roots: string[] = [];\n tasks.forEach(task => byId.set(task.id, task));\n tasks.forEach(task => {\n const parent = getParentWbs(task.id);\n if (parent === undefined) {\n roots.push(task.id);\n return;\n }\n const siblings = childrenOf.get(parent);\n if (siblings) siblings.push(task.id);\n else childrenOf.set(parent, [task.id]);\n });\n return { byId, childrenOf, roots };\n }, [tasks]);\n\n const sameIds = (a: string[], b: string[]) =>\n a.length === b.length && a.every((id, i) => id === b[i]);\n\n const virtualizer = useVirtualizer({\n count: tasks.length,\n getScrollElement: () => horizontalContainerRef.current,\n estimateSize: () => rowHeight,\n overscan: 10\n });\n\n useEffect(() => {\n if (horizontalContainerRef.current) {\n horizontalContainerRef.current.scrollTop = scrollY;\n }\n }, [scrollY]);\n\n useEffect(() => {\n if (!onMultiSelect || sameIds(prevSelectedTasksRef.current, selectedTasks)) {\n return;\n }\n const selected = new Set(selectedTasks);\n prevSelectedTasksRef.current = selectedTasks;\n onMultiSelect(tasks.filter(task => selected.has(task.id)));\n }, [selectedTasks, tasks, onMultiSelect]);\n\n\n\n // process pending task selections\n useEffect(() => {\n if (pendingTaskSelect.length === 0) return;\n\n const newSelected = new Set(selectedTasks);\n pendingTaskSelect.forEach(({ taskId, selected }) => {\n if (selected) {\n // Expand the task and its children first\n recursiveOpen(taskId);\n // Collect descendants after expansion\n const descendants = getDescendants(taskId);\n newSelected.add(taskId);\n descendants.forEach(d => newSelected.add(d));\n } else {\n const descendants = getDescendants(taskId);\n newSelected.delete(taskId);\n descendants.forEach(d => newSelected.delete(d));\n }\n });\n\n setSelectedTasks(Array.from(newSelected));\n setPendingTaskSelect([]);\n }, [pendingTaskSelect]);\n\n // Handle tasks prop changes to update descendants of selected tasks\n useEffect(() => {\n expandedTasks.current.forEach(id => {\n const task = taskIndex.byId.get(id);\n if (!task || task.hideChildren) expandedTasks.current.delete(id);\n });\n if (selectedTasks.length === 0) return;\n\n const newSelected = new Set<string>();\n selectedTasks.forEach(taskId => {\n // Only include tasks that still exist\n if (!taskIndex.byId.has(taskId)) return;\n recursiveOpen(taskId); // Ensure task is expanded\n newSelected.add(taskId);\n getDescendants(taskId).forEach(d => newSelected.add(d));\n });\n\n const newSelectedArray = Array.from(newSelected);\n if (!sameIds(newSelectedArray, selectedTasks)) {\n setSelectedTasks(newSelectedArray);\n }\n }, [tasks.length]);\n\n // Descendant ids in depth-first order, via the index.\n const getDescendants = (taskId: string): string[] => {\n if (!taskIndex.byId.has(taskId)) return [];\n const out: string[] = [];\n const stack = [...(taskIndex.childrenOf.get(taskId) ?? [])].reverse();\n while (stack.length) {\n const id = stack.pop()!;\n out.push(id);\n const children = taskIndex.childrenOf.get(id);\n if (children) stack.push(...[...children].reverse());\n }\n return out;\n };\n\n // Expands collapsed nodes down the subtree. Leaves are skipped: expanding one\n // is a no-op, and on a flat schedule it fired onExpanderClick once per task.\n const recursiveOpen = (taskId: string) => {\n const stack = [taskId];\n while (stack.length) {\n const id = stack.pop()!;\n const task = taskIndex.byId.get(id);\n const children = taskIndex.childrenOf.get(id);\n if (!task || !children) continue;\n if (task.hideChildren && !expandedTasks.current.has(id)) {\n onExpanderClick(task);\n expandedTasks.current.add(id);\n }\n stack.push(...children);\n }\n };\n\n const handleTaskSelect = (taskId: string, selected: boolean) => {\n setPendingTaskSelect(prev => [...prev, { taskId, selected }]);\n };\n\n const handleSelectAll = (selected: boolean) => {\n if (selected) {\n setPendingTaskSelect(\n taskIndex.roots.map(taskId => ({ taskId, selected: true }))\n );\n } else {\n setSelectedTasks([]);\n setPendingTaskSelect([]);\n }\n };\n\n const headerProps = {\n headerHeight,\n fontFamily,\n fontSize,\n rowWidth,\n scheduleType,\n allSelected: tasks.length > 0 && selectedTasks.length === tasks.length,\n onSelectAll: onMultiSelect ? handleSelectAll : undefined,\n columnWidths,\n onColumnResize: handleColumnResize,\n };\n const selectedTaskId = selectedTask ? selectedTask.id : \"\";\n\n const tableProps = {\n rowHeight,\n rowWidth,\n fontFamily,\n fontSize,\n tasks,\n leafTasks,\n scheduleType,\n locale,\n selectedTaskId: selectedTaskId,\n setSelectedTask,\n onExpanderClick,\n selectedTasks: onMultiSelect ? selectedTasks : undefined,\n onTaskSelect: onMultiSelect ? handleTaskSelect : undefined,\n taskLabelRenderer,\n virtualItems: virtualizer.getVirtualItems(),\n columnWidths,\n };\n\n return (\n <div\n ref={taskListRef}\n style={\n containerWidth != null || containerMaxWidth != null\n ? {\n ...(containerWidth != null ? { width: containerWidth } : {}),\n ...(containerMaxWidth != null ? { maxWidth: containerMaxWidth } : {}),\n overflow: \"hidden\",\n flexShrink: 0,\n }\n : {}\n }\n >\n <div\n ref={innerScrollRef}\n className={styles.hideScrollbar}\n style={{ overflowX: \"hidden\" }}\n >\n <div ref={headerScrollRef} style={{ overflow: \"hidden\" }}>\n <TaskListHeader {...headerProps} />\n </div>\n <div\n ref={horizontalContainerRef}\n className={horizontalContainerClass}\n style={ganttHeight ? { height: ganttHeight } : {}}\n >\n <div\n style={{\n height: `${virtualizer.getTotalSize()}px`,\n width: \"100%\",\n position: \"relative\",\n }}\n >\n <TaskListTable {...tableProps} />\n </div>\n </div>\n </div>\n </div>\n );\n};\n","import { CalendarDefinition } from \"../types/public-types\";\n\n/** Parse \"HH:MM\" or \"HH:MM:SS\" into minutes since midnight. */\nexport function parseTimeToMinutes(t: string): number {\n const parts = t.split(\":\").map(Number);\n return parts[0] * 60 + parts[1] + (parts[2] ? parts[2] / 60 : 0);\n}\n\n/** Format a \"YYYY-MM-DD\" string from a Date (local). */\nfunction toDateString(date: Date): string {\n const y = date.getFullYear();\n const m = String(date.getMonth() + 1).padStart(2, \"0\");\n const d = String(date.getDate()).padStart(2, \"0\");\n return `${y}-${m}-${d}`;\n}\n\n/** True if the date falls on a calendar holiday. */\nexport function isHoliday(date: Date, cal: CalendarDefinition): boolean {\n if (cal.holidays && cal.holidays.length > 0) {\n return cal.holidays.includes(toDateString(date));\n } else {\n return false;\n }\n}\n\n/** True if the date's weekday is in off_days or is a holiday. */\nexport function isOffDay(date: Date, cal: CalendarDefinition): boolean {\n if (cal.off_days && cal.off_days.length > 0) {\n return cal.off_days.includes(date.getDay()) || isHoliday(date, cal);\n } else {\n return false;\n }\n}\n\n/** True if the date is a regular working day (not off_day, not holiday). */\nexport function isWorkingDay(date: Date, cal: CalendarDefinition): boolean {\n return !isOffDay(date, cal);\n}\n\n/**\n * Returns the shift windows (in minutes since midnight) for a given date.\n * Returns [] for off days / holidays.\n */\n// getWorkingIntervals walks day by day per task, so both halves of this are hit\n// millions of times on a large schedule. Shifts do not vary by day, and off-day\n// results repeat across every task covering that date, so cache both per calendar.\nconst parsedShiftsCache = new WeakMap<\n CalendarDefinition,\n Array<{ start: number; end: number }>\n>();\nconst offDayCache = new WeakMap<CalendarDefinition, Map<number, boolean>>();\n\nfunction parsedShifts(cal: CalendarDefinition) {\n let shifts = parsedShiftsCache.get(cal);\n if (!shifts) {\n shifts = (cal.shifts ?? []).map(([s, e]) => ({\n start: parseTimeToMinutes(s),\n end: parseTimeToMinutes(e),\n }));\n parsedShiftsCache.set(cal, shifts);\n }\n return shifts;\n}\n\nfunction isOffDayCached(date: Date, cal: CalendarDefinition): boolean {\n let perCal = offDayCache.get(cal);\n if (!perCal) {\n perCal = new Map();\n offDayCache.set(cal, perCal);\n }\n const key =\n date.getFullYear() * 10000 + (date.getMonth() + 1) * 100 + date.getDate();\n let off = perCal.get(key);\n if (off === undefined) {\n off = isOffDay(date, cal);\n perCal.set(key, off);\n }\n return off;\n}\n\nconst NO_SHIFTS: Array<{ start: number; end: number }> = [];\n\nexport function getShiftsForDay(\n date: Date,\n cal: CalendarDefinition\n): Array<{ start: number; end: number }> {\n if (!cal.shifts || isOffDayCached(date, cal)) return NO_SHIFTS;\n return parsedShifts(cal);\n}\n\n/**\n * Returns all working time intervals between start and end, respecting:\n * - off days and holidays (entire day skipped)\n * - shift windows (multiple shifts per day are supported)\n * - partial first/last days clipped to the actual start/end time\n */\nexport function getWorkingIntervals(\n start: Date,\n end: Date,\n cal: CalendarDefinition\n): Array<{ start: Date; end: Date }> {\n if (start >= end) return [];\n const intervals: Array<{ start: Date; end: Date }> = [];\n\n // Iterate day by day\n const cursor = new Date(start);\n cursor.setHours(0, 0, 0, 0);\n\n while (cursor <= end) {\n const shifts = getShiftsForDay(cursor, cal);\n\n for (const shift of shifts) {\n // Build shift start/end as Date objects for this day\n const shiftStart = new Date(cursor);\n shiftStart.setHours(\n Math.floor(shift.start / 60),\n Math.floor(shift.start % 60),\n Math.round((shift.start % 1) * 60),\n 0\n );\n const shiftEnd = new Date(cursor);\n shiftEnd.setHours(\n Math.floor(shift.end / 60),\n Math.floor(shift.end % 60),\n Math.round((shift.end % 1) * 60),\n 0\n );\n\n // Clip to [start, end]\n const intervalStart = shiftStart < start ? start : shiftStart;\n const intervalEnd = shiftEnd > end ? end : shiftEnd;\n\n if (intervalStart < intervalEnd) {\n intervals.push({ start: intervalStart, end: intervalEnd });\n }\n }\n\n // Advance to the next day\n cursor.setDate(cursor.getDate() + 1);\n }\n\n return intervals;\n}\n\n/**\n * Snaps a date to the nearest valid working moment.\n * direction \"forward\" → move forward until inside a shift\n * direction \"backward\" → move backward until inside a shift\n * Searches up to 60 days to avoid infinite loops.\n */\nexport function snapToWorkingTime(\n date: Date,\n cal: CalendarDefinition,\n direction: \"forward\" | \"backward\"\n): Date {\n const MAX_DAYS = 60;\n const result = new Date(date);\n\n for (let attempt = 0; attempt < MAX_DAYS * 24 * 60; attempt++) {\n const dayStart = new Date(result);\n dayStart.setHours(0, 0, 0, 0);\n const shifts = getShiftsForDay(dayStart, cal);\n\n if (shifts.length > 0) {\n if (direction === \"forward\") {\n // Find first shift window that contains or is after result\n const currentMins =\n result.getHours() * 60 +\n result.getMinutes() +\n result.getSeconds() / 60;\n for (const shift of shifts) {\n if (currentMins <= shift.end) {\n // Snap to start of shift if before it\n if (currentMins < shift.start) {\n result.setHours(\n Math.floor(shift.start / 60),\n Math.round(shift.start % 60),\n 0,\n 0\n );\n }\n return result;\n }\n }\n // All shifts passed — move to next day's first shift\n result.setDate(result.getDate() + 1);\n result.setHours(0, 0, 0, 0);\n } else {\n // direction === \"backward\"\n const currentMins =\n result.getHours() * 60 +\n result.getMinutes() +\n result.getSeconds() / 60;\n // Find last shift window that contains or is before result\n for (let i = shifts.length - 1; i >= 0; i--) {\n if (currentMins >= shifts[i].start) {\n if (currentMins > shifts[i].end) {\n result.setHours(\n Math.floor(shifts[i].end / 60),\n Math.round(shifts[i].end % 60),\n 0,\n 0\n );\n }\n return result;\n }\n }\n // All shifts ahead — move to previous day's last shift\n result.setDate(result.getDate() - 1);\n result.setHours(23, 59, 59, 0);\n }\n } else {\n // Off day — move to boundary\n if (direction === \"forward\") {\n result.setDate(result.getDate() + 1);\n result.setHours(0, 0, 0, 0);\n } else {\n result.setDate(result.getDate() - 1);\n result.setHours(23, 59, 59, 0);\n }\n }\n }\n\n // Fallback: return original if no valid time found\n return date;\n}\n\n/**\n * Returns the most recent week-start date on or before the given date,\n * where weekStartDay is a JS day index (0=Sun, 1=Mon, ..., 6=Sat).\n */\nexport function getWeekStartDate(date: Date, weekStartDay: number): Date {\n const d = new Date(date);\n d.setHours(0, 0, 0, 0);\n const dayOfWeek = d.getDay(); // 0–6\n const diff = (dayOfWeek - weekStartDay + 7) % 7;\n d.setDate(d.getDate() - diff);\n return d;\n}\n\n/**\n * Returns the quarter number (1–4) for a date, given a fiscal quarterStart month (0–11, 0=Jan).\n * e.g. quarterStart=4 means Q1 starts in May.\n */\nexport function getQuarterNumber(\n date: Date,\n quarterStart: number\n): number {\n const month = date.getMonth(); // 0–11\n // Offset month relative to quarter start\n const offset = ((month - quarterStart + 12) % 12);\n return Math.floor(offset / 3) + 1;\n}\n\n/**\n * Returns the quarter start month (0-11) for a given date and fiscal quarterStart (0-indexed).\n * Useful for labeling (e.g. Q1 starting in May → returns 4).\n */\nexport function getQuarterStartMonth(\n date: Date,\n quarterStart: number\n): number {\n const q = getQuarterNumber(date, quarterStart);\n // q=1 → month = quarterStart, q=2 → +3, q=3 → +6, q=4 → +9\n return (quarterStart + (q - 1) * 3) % 12; // 0-indexed\n}\n","import React from \"react\";\nimport { VirtualItem } from \"@tanstack/react-virtual\";\nimport { CalendarDefinition, Task, ViewMode } from \"../../types/public-types\";\nimport { addToDate } from \"../../helpers/date-helper\";\nimport { isOffDay } from \"../../helpers/calendar-helper\";\nimport styles from \"./grid.module.css\";\n\nexport type GridBodyProps = {\n tasks: Task[];\n scheduleType: string;\n dates: Date[];\n svgWidth: number;\n rowHeight: number;\n columnWidth: number;\n todayColor: string;\n weekendColor: string;\n rtl: boolean;\n virtualItems?: VirtualItem[];\n visibleStartY: number;\n visibleEndY: number;\n projectCalendar?: CalendarDefinition;\n viewMode?: ViewMode;\n};\n\nexport const GridBody: React.FC<GridBodyProps> = ({\n tasks,\n scheduleType,\n dates,\n rowHeight,\n svgWidth,\n columnWidth,\n todayColor,\n weekendColor,\n rtl,\n virtualItems = [],\n visibleStartY,\n visibleEndY,\n projectCalendar,\n viewMode,\n}) => {\n const visibleHeight = visibleEndY - visibleStartY;\n const now = new Date();\n\n // === Virtual row calculation ===\n const items =\n virtualItems ??\n tasks.map((_, i) => ({\n index: i,\n start: i * rowHeight,\n end: (i + 1) * rowHeight,\n size: rowHeight,\n key: i,\n }));\n\n const isDayOff = (date: Date): boolean => {\n if (projectCalendar) return isOffDay(date, projectCalendar);\n const d = date.getDay();\n return d === 0 || d === 6;\n };\n\n const isTodayColumn = (i: number) => {\n const date = dates[i];\n const next = dates[i + 1];\n if (next && date <= now && next > now) return true;\n if (!next && date <= now) {\n // Estimate this (last) column's end by extrapolating the previous step.\n // A single-column range has no previous date, so fall back to one day\n // instead of dereferencing dates[-1].\n const prev = dates[i - 1];\n const step = prev ? date.getTime() - prev.getTime() : 86400000;\n const end = addToDate(date, step, \"millisecond\");\n return end > now;\n }\n return false;\n };\n\n // === Today, Off-Day, and Weekend Rects ===\n const todayRects: React.ReactNode[] = [];\n const offDayRects: React.ReactNode[] = [];\n const weekStartDay = projectCalendar?.week_start ?? 1;\n\n for (let i = 0, x = 0; i < dates.length; i++, x += columnWidth) {\n if (isTodayColumn(i)) {\n todayRects.push(\n <rect\n key={`today-${i}`}\n x={rtl ? x + columnWidth : x}\n y={visibleStartY}\n width={columnWidth}\n height={visibleHeight}\n fill={todayColor}\n />\n );\n }\n // Proportional off-day shading: Day=full column, Week=slivers; Month/Quarter excluded\n if (viewMode !== ViewMode.Month && viewMode !== ViewMode.Quarter) {\n const pEnd = dates[i + 1] ?? addToDate(dates[i], 1, \"day\");\n const periodMs = pEnd.getTime() - dates[i].getTime();\n if (periodMs > 0) {\n const cursor = new Date(dates[i]);\n cursor.setHours(0, 0, 0, 0);\n while (cursor.getTime() < pEnd.getTime()) {\n if (isDayOff(cursor)) {\n const ds = cursor.getTime() - dates[i].getTime();\n const de = ds + 86400000;\n const startFrac = Math.max(0, ds) / periodMs;\n const endFrac = Math.min(periodMs, de) / periodMs;\n const rw = (endFrac - startFrac) * columnWidth;\n if (rw > 0.5) {\n offDayRects.push(\n <rect\n key={`offday-${i}-${cursor.getTime()}`}\n x={x + startFrac * columnWidth}\n y={visibleStartY}\n width={rw}\n height={visibleHeight}\n fill={weekendColor}\n />\n );\n }\n }\n cursor.setDate(cursor.getDate() + 1);\n }\n }\n }\n }\n\n // === Vertical Tick Lines — only Day & Week views get the darker week-start\n // line; Day also dashes the intra-week days, every other view uses the light\n // default tick. ===\n const isDayView = viewMode === ViewMode.Day;\n const isWeekView = viewMode === ViewMode.Week;\n const tickLines = dates.map((date, i) => {\n let tickClass = styles.gridTick;\n if (isDayView) {\n tickClass =\n date.getDay() === weekStartDay\n ? styles.gridTickWeekStart\n : styles.gridTickDashed;\n } else if (isWeekView) {\n tickClass = styles.gridTickWeekStart;\n }\n return (\n <line\n key={`tick-${i}`}\n x1={i * columnWidth}\n y1={visibleStartY}\n x2={i * columnWidth}\n y2={visibleEndY}\n className={tickClass}\n />\n );\n });\n\n // === Horizontal Rows & Lines ===\n const rowBackgrounds: React.ReactNode[] = [];\n const rowLines: React.ReactNode[] = [];\n // Per-row overlay layer: erases chart-wide off-day shading inside task rows\n // (so the project calendar never affects task rendering), then re-applies\n // each task's own off-day shading from its linked calendar (task.calendar).\n const rowOverlays: React.ReactNode[] = [];\n\n // Top border\n rowLines.push(\n <line\n key=\"top-line\"\n x1={0}\n y1={visibleStartY}\n x2={svgWidth}\n y2={visibleStartY}\n className={styles.gridRowLine}\n />\n );\n\n const showPerRowOffDays =\n viewMode !== ViewMode.Month && viewMode !== ViewMode.Quarter;\n\n for (const vi of items) {\n const task = tasks[vi.index];\n if (!task) break;\n\n const y = vi.start;\n const isMilestone = task.type === \"milestone\";\n\n const rowClass = isMilestone\n ? styles.darkerGridRow\n : scheduleType === \"lookAhead\"\n ? styles.gridRowLookAhead\n : styles.gridRow;\n\n rowBackgrounds.push(\n <rect\n key={`bg-${vi.key}`}\n x={0}\n y={y}\n width={svgWidth}\n height={rowHeight}\n className={rowClass}\n />\n );\n\n rowLines.push(\n <line\n key={`line-${vi.key}`}\n x1={0}\n y1={y + rowHeight}\n x2={svgWidth}\n y2={y + rowHeight}\n className={styles.gridRowLine}\n />\n );\n\n if (showPerRowOffDays) {\n // 1) Erase chart-wide project off-day shading inside this row.\n // nth-child won't match in a sibling <g>, so compute the same fill\n // explicitly (matches grid.module.css: gridRow alternates #fff/#f5f5f5).\n const rowEven = vi.index % 2 === 1;\n const rowFill = isMilestone\n ? \"#e6e4e4\"\n : scheduleType === \"lookAhead\"\n ? \"#fff\"\n : rowEven\n ? \"#f5f5f5\"\n : \"#fff\";\n rowOverlays.push(\n <rect\n key={`row-clean-${vi.key}`}\n x={0}\n y={y}\n width={svgWidth}\n height={rowHeight}\n fill={rowFill}\n />\n );\n\n // 2) Render this task's own off-days/holidays (if it has a calendar).\n const cal = task.calendar;\n if (cal) {\n for (let i = 0, x = 0; i < dates.length; i++, x += columnWidth) {\n const pEnd = dates[i + 1] ?? addToDate(dates[i], 1, \"day\");\n const periodMs = pEnd.getTime() - dates[i].getTime();\n if (periodMs <= 0) continue;\n const cursor = new Date(dates[i]);\n cursor.setHours(0, 0, 0, 0);\n while (cursor.getTime() < pEnd.getTime()) {\n if (isOffDay(cursor, cal)) {\n const ds = cursor.getTime() - dates[i].getTime();\n const de = ds + 86400000;\n const startFrac = Math.max(0, ds) / periodMs;\n const endFrac = Math.min(periodMs, de) / periodMs;\n const rw = (endFrac - startFrac) * columnWidth;\n if (rw > 0.5) {\n rowOverlays.push(\n <rect\n key={`row-offday-${vi.key}-${cursor.getTime()}`}\n x={rtl ? x + columnWidth - (startFrac * columnWidth + rw) : x + startFrac * columnWidth}\n y={y}\n width={rw}\n height={rowHeight}\n fill={weekendColor}\n />\n );\n }\n }\n cursor.setDate(cursor.getDate() + 1);\n }\n }\n }\n }\n }\n\n return (\n <g className=\"gridBody\">\n <g className=\"rows\">{rowBackgrounds}</g>\n <g className=\"rowLines\">{rowLines}</g>\n <g className=\"offdays\">{offDayRects}</g>\n <g className=\"rowOverlays\">{rowOverlays}</g>\n <g className=\"ticks\">{tickLines}</g>\n <g className=\"today\">{todayRects}</g>\n </g>\n );\n};\n","import React from \"react\";\nimport { GridBody, GridBodyProps } from \"./grid-body\";\n\nexport type GridProps = GridBodyProps;\nexport const Grid: React.FC<GridProps> = props => {\n return (\n <g className=\"grid\" >\n <GridBody {...props} />\n </g>\n );\n};\n","import React from \"react\";\nimport styles from \"./calendar.module.css\";\n\ntype TopPartOfCalendarProps = {\n value: string;\n x1Line: number;\n y1Line: number;\n y2Line: number;\n xText: number;\n yText: number;\n textAnchor?: \"start\" | \"middle\" | \"end\";\n};\n\nexport const TopPartOfCalendar: React.FC<TopPartOfCalendarProps> = ({\n value,\n x1Line,\n y1Line,\n y2Line,\n xText,\n yText,\n textAnchor = \"middle\",\n}) => {\n const textAnchorClass =\n textAnchor === \"start\"\n ? styles.textAnchorStart\n : textAnchor === \"middle\"\n ? styles.textAnchorMiddle\n : styles.textAnchorEnd;\n return (\n <g className=\"calendarTop\">\n <line\n x1={x1Line}\n y1={y1Line}\n x2={x1Line}\n y2={y2Line}\n className={styles.calendarTopTick}\n key={value + \"line\"}\n />\n <text\n key={value + \"text\"}\n y={yText}\n x={xText}\n className={`${styles.calendarTopText} ${textAnchorClass}`}\n >\n {value}\n </text>\n </g>\n );\n};\n","import React, { ReactChild } from \"react\";\nimport { CalendarDefinition, ViewMode } from \"../../types/public-types\";\nimport { TopPartOfCalendar } from \"./top-part-of-calendar\";\nimport {\n getCachedDateTimeFormat,\n getLocalDayOfWeek,\n addToDate,\n} from \"../../helpers/date-helper\";\nimport {\n getQuarterNumber,\n isOffDay,\n} from \"../../helpers/calendar-helper\";\nimport { DateSetup } from \"../../types/date-setup\";\nimport styles from \"./calendar.module.css\";\n\nexport type CalendarProps = {\n dateSetup: DateSetup;\n locale: string;\n viewMode: ViewMode;\n rtl: boolean;\n headerHeight: number;\n columnWidth: number;\n fontFamily: string;\n fontSize: string;\n projectCalendar?: CalendarDefinition;\n weekendColor: string;\n};\n\nexport const Calendar: React.FC<CalendarProps> = ({\n dateSetup,\n locale,\n viewMode,\n rtl,\n headerHeight,\n columnWidth,\n fontFamily,\n fontSize,\n projectCalendar,\n weekendColor,\n}) => {\n /** Off-day test — mirrors GridBody.isDayOff so header shading matches the body. */\n const isDayOff = (date: Date): boolean => {\n if (projectCalendar) return isOffDay(date, projectCalendar);\n \n return false; // default to no off days if no calendar provided, to avoid false positives on custom view modes like Hourly\n };\n /** Helper: 3-letter month abbreviation */\n const shortMonth = (date: Date) =>\n date.toLocaleString(locale, { month: \"short\" });\n\n const getCalendarValuesForYear = () => {\n const topValues: ReactChild[] = [];\n const bottomValues: ReactChild[] = [];\n const topDefaultHeight = headerHeight * 0.5;\n for (let i = 0; i < dateSetup.dates.length; i++) {\n const date = dateSetup.dates[i];\n const bottomValue = date.getFullYear();\n bottomValues.push(\n <text\n key={date.getFullYear()}\n y={headerHeight * 0.8}\n x={columnWidth * i + columnWidth * 0.5}\n className={styles.calendarBottomText}\n >\n {bottomValue}\n </text>\n );\n if (\n i === 0 ||\n date.getFullYear() !== dateSetup.dates[i - 1].getFullYear()\n ) {\n const topValue = date.getFullYear().toString();\n let xText: number;\n if (rtl) {\n xText = (6 + i + date.getFullYear() + 1) * columnWidth;\n } else {\n xText = (6 + i - date.getFullYear()) * columnWidth;\n }\n topValues.push(\n <TopPartOfCalendar\n key={topValue}\n value={topValue}\n x1Line={columnWidth * i}\n y1Line={0}\n y2Line={headerHeight}\n xText={xText}\n yText={topDefaultHeight * 0.9}\n />\n );\n }\n }\n return [topValues, bottomValues];\n };\n\n /**\n * QUARTER view — 3-row header: Year (top) | Qtr label (middle) | Month abbr (bottom)\n */\n const getCalendarValuesForQuarter = () => {\n const topValues: ReactChild[] = [];\n const bottomValues: ReactChild[] = [];\n const offDayRects: ReactChild[] = [];\n const quarterStart = projectCalendar?.quarter_start ?? 0;\n const rowH = headerHeight / 3;\n\n for (let i = 0; i < dateSetup.dates.length; i++) {\n const date = dateSetup.dates[i];\n const qNum = getQuarterNumber(date, quarterStart);\n\n // Bottom row: 3 month abbreviations within each quarter column\n for (let m = 0; m < 3; m++) {\n const monthDate = addToDate(date, m, \"month\");\n bottomValues.push(\n <text\n key={`qmonth-${i}-${m}`}\n y={headerHeight * 0.9}\n x={columnWidth * i + columnWidth * (m * 2 + 1) / 6}\n className={`${styles.calendarTopText} ${styles.textAnchorMiddle}`}\n >\n {shortMonth(monthDate)}\n </text>\n );\n }\n\n // Middle row: quarter label centered on column\n bottomValues.push(\n <text\n key={`qlabel-${i}`}\n y={rowH * 1.6}\n x={columnWidth * i + columnWidth * 0.5}\n className={`${styles.calendarTopText} ${styles.textAnchorMiddle}`}\n >\n {`Qtr ${qNum}`}\n </text>\n );\n\n // Vertical separator at start of each column\n bottomValues.push(\n <line\n key={`qsep-${i}`}\n x1={columnWidth * i}\n y1={rowH}\n x2={columnWidth * i}\n y2={headerHeight}\n className={styles.calendarTopTick}\n />\n );\n\n // Horizontal separator between rows\n if (i === 0) {\n bottomValues.push(\n <line\n key=\"qhsep1\"\n x1={0}\n y1={rowH}\n x2={columnWidth * dateSetup.dates.length}\n y2={rowH}\n className={styles.calendarTopTick}\n />\n );\n bottomValues.push(\n <line\n key=\"qhsep2\"\n x1={0}\n y1={rowH * 2}\n x2={columnWidth * dateSetup.dates.length}\n y2={rowH * 2}\n className={styles.calendarTopTick}\n />\n );\n }\n\n // Top row: year label — new group when year changes\n if (\n i === 0 ||\n date.getFullYear() !== dateSetup.dates[i - 1].getFullYear()\n ) {\n const topValue = date.getFullYear().toString();\n // Find span end for xText calculation\n let span = 0;\n for (let j = i; j < dateSetup.dates.length && dateSetup.dates[j].getFullYear() === date.getFullYear(); j++) {\n span++;\n }\n const xText = columnWidth * i + (columnWidth * span) / 2;\n topValues.push(\n <TopPartOfCalendar\n key={topValue + i}\n value={topValue}\n x1Line={columnWidth * i}\n y1Line={0}\n y2Line={rowH}\n xText={xText}\n yText={rowH * 0.7}\n textAnchor=\"middle\"\n />\n );\n }\n }\n\n return [topValues, bottomValues, offDayRects];\n };\n\n /**\n * MONTH view — top row shows Quarter labels, bottom row shows 3-letter months.\n */\n const getCalendarValuesForMonth = () => {\n const topValues: ReactChild[] = [];\n const bottomValues: ReactChild[] = [];\n const offDayRects: ReactChild[] = [];\n const topDefaultHeight = headerHeight * 0.5;\n const quarterStart = projectCalendar?.quarter_start ?? 0;\n\n for (let i = 0; i < dateSetup.dates.length; i++) {\n const date = dateSetup.dates[i];\n const bottomValue = shortMonth(date);\n bottomValues.push(\n <text\n key={bottomValue + date.getFullYear() + i}\n y={headerHeight * 0.8}\n x={columnWidth * i + columnWidth * 0.5}\n className={`${styles.calendarTopText} ${styles.textAnchorMiddle}`}\n >\n {bottomValue}\n </text>\n );\n\n // Top row: quarter label — new group when quarter or year changes\n const qNum = getQuarterNumber(date, quarterStart);\n const prevDate = i > 0 ? dateSetup.dates[i - 1] : null;\n const prevQNum = prevDate ? getQuarterNumber(prevDate, quarterStart) : -1;\n const isNewQuarter =\n i === 0 ||\n qNum !== prevQNum ||\n date.getFullYear() !== (prevDate ? prevDate.getFullYear() : -1);\n\n if (isNewQuarter) {\n const topValue = `Qtr ${qNum}, ${date.getFullYear()}`;\n // Find how many months in this quarter-year group for xText centering\n let span = 0;\n for (\n let j = i;\n j < dateSetup.dates.length &&\n getQuarterNumber(dateSetup.dates[j], quarterStart) === qNum &&\n dateSetup.dates[j].getFullYear() === date.getFullYear();\n j++\n ) {\n span++;\n }\n const xText = rtl\n ? columnWidth * i + columnWidth * span * 0.5 + columnWidth\n : columnWidth * i + (columnWidth * span) / 2;\n\n topValues.push(\n <TopPartOfCalendar\n key={topValue + i}\n value={topValue}\n x1Line={columnWidth * i}\n y1Line={0}\n y2Line={topDefaultHeight}\n xText={xText}\n yText={topDefaultHeight * 0.7}\n textAnchor=\"middle\"\n />\n );\n // Extend the quarter-boundary tick through the bottom half of the header\n if (i > 0) {\n bottomValues.push(\n <line\n key={`qbound-${i}`}\n x1={columnWidth * i}\n y1={topDefaultHeight}\n x2={columnWidth * i}\n y2={headerHeight}\n className={styles.calendarTopTick}\n />\n );\n }\n }\n }\n return [topValues, bottomValues, offDayRects];\n };\n\n /**\n * WEEK view — top row: \"Mmm YYYY\", bottom row: day-number of week start.\n */\n const getCalendarValuesForWeek = () => {\n const topValues: ReactChild[] = [];\n const bottomValues: ReactChild[] = [];\n const offDayRects: ReactChild[] = [];\n let weeksCount: number = 1;\n const topDefaultHeight = headerHeight * 0.5;\n const dates = dateSetup.dates;\n for (let i = dates.length - 1; i >= 0; i--) {\n const date = dates[i];\n let topValue = \"\";\n if (i === 0 || date.getMonth() !== dates[i - 1].getMonth()) {\n // Use 3-letter month abbreviation\n topValue = `${shortMonth(date)} ${date.getFullYear()}`;\n }\n // Bottom: day number of the week-start date\n const bottomValue = date.getDate().toString();\n\n bottomValues.push(\n <text\n key={date.getTime()}\n y={headerHeight * 0.8}\n x={columnWidth * (i + +rtl)}\n className={`${styles.calendarTopText} ${styles.textAnchorStart}`}\n >\n {bottomValue}\n </text>\n );\n\n if (topValue) {\n if (i !== dates.length - 1) {\n topValues.push(\n <TopPartOfCalendar\n key={topValue + i}\n value={topValue}\n x1Line={columnWidth * i + weeksCount * columnWidth}\n y1Line={0}\n y2Line={topDefaultHeight}\n xText={columnWidth * i + columnWidth * weeksCount * 0.5}\n yText={topDefaultHeight * 0.9}\n textAnchor=\"start\"\n />\n );\n }\n weeksCount = 0;\n }\n weeksCount++;\n }\n return [topValues, bottomValues, offDayRects];\n };\n\n /**\n * DAY view — top row: \"Mmm YYYY\" per month, bottom: day labels.\n * Off days shaded gray. Solid tick for week-start day, dashed for others.\n */\n const getCalendarValuesForDay = () => {\n const topValues: ReactChild[] = [];\n const bottomValues: ReactChild[] = [];\n const offDayRects: ReactChild[] = [];\n const tickLines: ReactChild[] = [];\n const topDefaultHeight = headerHeight * 0.5;\n const dates = dateSetup.dates;\n const weekStartDay = projectCalendar?.week_start ?? 1; // default Monday\n\n for (let i = 0; i < dates.length; i++) {\n const date = dates[i];\n\n // Off-day shading on the day-number row (bottom band of the header).\n // Drawn into extraValues, which renders before tickLines so the solid\n // week-start line stays on top of the gray. Matches the grid body shading.\n if (isDayOff(date)) {\n offDayRects.push(\n <rect\n key={`offday-header-${i}`}\n x={columnWidth * i}\n y={topDefaultHeight}\n width={columnWidth}\n height={headerHeight - topDefaultHeight}\n fill={weekendColor}\n />\n );\n }\n\n // Per-day separator tick lines\n const isWeekStart = date.getDay() === weekStartDay;\n tickLines.push(\n <line\n key={`tick-day-${i}`}\n x1={columnWidth * i}\n y1={topDefaultHeight}\n x2={columnWidth * i}\n y2={headerHeight}\n className={isWeekStart ? styles.calendarTickSolid : styles.calendarTickDashed}\n />\n );\n\n // Bottom: day label\n const bottomValue =\n columnWidth > 55\n ? `${getLocalDayOfWeek(date, locale, \"short\")}, ${date.getDate()}`\n : `${getLocalDayOfWeek(date, locale, \"narrow\")},${date.getDate()}`;\n bottomValues.push(\n <text\n key={date.getTime()}\n y={headerHeight * 0.8}\n x={columnWidth * i + columnWidth * 0.5}\n className={`${styles.calendarTopText} ${styles.textAnchorMiddle}`}\n >\n {bottomValue}\n </text>\n );\n\n // Top: month boundary labels using 3-letter abbreviation\n if (\n i + 1 !== dates.length &&\n date.getMonth() !== dates[i + 1].getMonth()\n ) {\n const topValue = `${shortMonth(date)} ${date.getFullYear()}`;\n topValues.push(\n <TopPartOfCalendar\n key={topValue + i}\n value={topValue}\n x1Line={columnWidth * (i + 1)}\n y1Line={0}\n y2Line={topDefaultHeight}\n xText={\n topValues.length === 0\n ? columnWidth * (i + 1) * 0.5\n : columnWidth * (i + 1) - date.getDate() * columnWidth * 0.5\n }\n yText={topDefaultHeight * 0.9}\n />\n );\n }\n if (i + 1 === dates.length) {\n const topValue = `${shortMonth(date)} ${date.getFullYear()}`;\n topValues.push(\n <TopPartOfCalendar\n key={topValue + \"last\"}\n value={topValue}\n x1Line={columnWidth * (i + 1)}\n y1Line={0}\n y2Line={topDefaultHeight}\n xText={columnWidth * (i + 1) - date.getDate() * columnWidth * 0.5}\n yText={topDefaultHeight * 0.9}\n />\n );\n }\n }\n return [topValues, bottomValues, offDayRects, tickLines];\n };\n\n const getCalendarValuesForPartOfDay = () => {\n const topValues: ReactChild[] = [];\n const bottomValues: ReactChild[] = [];\n const ticks = viewMode === ViewMode.HalfDay ? 2 : 4;\n const topDefaultHeight = headerHeight * 0.5;\n const dates = dateSetup.dates;\n for (let i = 0; i < dates.length; i++) {\n const date = dates[i];\n const bottomValue = getCachedDateTimeFormat(locale, {\n hour: \"numeric\",\n }).format(date);\n\n bottomValues.push(\n <text\n key={date.getTime()}\n y={headerHeight * 0.8}\n x={columnWidth * (i + +rtl)}\n className={`${styles.calendarTopText} ${styles.textAnchorMiddle}`}\n fontFamily={fontFamily}\n >\n {bottomValue}\n </text>\n );\n if (i === 0 || date.getDate() !== dates[i - 1].getDate()) {\n const topValue = `${getLocalDayOfWeek(date, locale, \"short\")}, ${date.getDate()} ${shortMonth(date)}`;\n topValues.push(\n <TopPartOfCalendar\n key={topValue + date.getFullYear()}\n value={topValue}\n x1Line={columnWidth * i + ticks * columnWidth}\n y1Line={0}\n y2Line={topDefaultHeight}\n xText={columnWidth * i + ticks * columnWidth * 0.5}\n yText={topDefaultHeight * 0.9}\n />\n );\n }\n }\n\n return [topValues, bottomValues];\n };\n\n const getCalendarValuesForHour = () => {\n const topValues: ReactChild[] = [];\n const bottomValues: ReactChild[] = [];\n const topDefaultHeight = headerHeight * 0.5;\n const dates = dateSetup.dates;\n for (let i = 0; i < dates.length; i++) {\n const date = dates[i];\n const bottomValue = getCachedDateTimeFormat(locale, {\n hour: \"numeric\",\n }).format(date);\n\n bottomValues.push(\n <text\n key={date.getTime()}\n y={headerHeight * 0.8}\n x={columnWidth * (i + +rtl)}\n className={styles.calendarBottomText}\n fontFamily={fontFamily}\n >\n {bottomValue}\n </text>\n );\n if (i !== 0 && date.getDate() !== dates[i - 1].getDate()) {\n const displayDate = dates[i - 1];\n const topValue = `${getLocalDayOfWeek(displayDate, locale, \"long\")}, ${displayDate.getDate()} ${shortMonth(displayDate)}`;\n const topPosition = (date.getHours() - 24) / 2;\n topValues.push(\n <TopPartOfCalendar\n key={topValue + displayDate.getFullYear()}\n value={topValue}\n x1Line={columnWidth * i}\n y1Line={0}\n y2Line={topDefaultHeight}\n xText={columnWidth * (i + topPosition)}\n yText={topDefaultHeight * 0.9}\n />\n );\n }\n }\n\n return [topValues, bottomValues];\n };\n\n let topValues: ReactChild[] = [];\n let bottomValues: ReactChild[] = [];\n let extraValues: ReactChild[] = [];\n let tickLines: ReactChild[] = [];\n\n switch (dateSetup.viewMode) {\n case ViewMode.Year:\n [topValues, bottomValues] = getCalendarValuesForYear();\n break;\n case ViewMode.Quarter: {\n const r = getCalendarValuesForQuarter();\n topValues = r[0]; bottomValues = r[1]; extraValues = r[2] || [];\n break;\n }\n case ViewMode.Month: {\n const r = getCalendarValuesForMonth();\n topValues = r[0]; bottomValues = r[1]; extraValues = r[2] || [];\n break;\n }\n case ViewMode.Week: {\n const r = getCalendarValuesForWeek();\n topValues = r[0]; bottomValues = r[1]; extraValues = r[2] || [];\n break;\n }\n case ViewMode.Day: {\n const result = getCalendarValuesForDay();\n topValues = result[0];\n bottomValues = result[1];\n extraValues = result[2];\n tickLines = result[3];\n break;\n }\n case ViewMode.QuarterDay:\n case ViewMode.HalfDay:\n [topValues, bottomValues] = getCalendarValuesForPartOfDay();\n break;\n case ViewMode.Hour:\n [topValues, bottomValues] = getCalendarValuesForHour();\n }\n return (\n <g\n className=\"calendar\"\n fontSize={fontSize}\n fontFamily={fontFamily}\n width={columnWidth * dateSetup.dates.length}\n >\n <rect\n x={0}\n y={0}\n width={columnWidth * dateSetup.dates.length}\n height={headerHeight}\n className={styles.calendarHeader}\n />\n {extraValues}\n {tickLines}\n {bottomValues}\n {topValues}\n </g>\n );\n};\n","// A type of promise-like that resolves synchronously and supports only one observer\nexport const _Pact = /*#__PURE__*/(function() {\n\tfunction _Pact() {}\n\t_Pact.prototype.then = function(onFulfilled, onRejected) {\n\t\tconst result = new _Pact();\n\t\tconst state = this.s;\n\t\tif (state) {\n\t\t\tconst callback = state & 1 ? onFulfilled : onRejected;\n\t\t\tif (callback) {\n\t\t\t\ttry {\n\t\t\t\t\t_settle(result, 1, callback(this.v));\n\t\t\t\t} catch (e) {\n\t\t\t\t\t_settle(result, 2, e);\n\t\t\t\t}\n\t\t\t\treturn result;\n\t\t\t} else {\n\t\t\t\treturn this;\n\t\t\t}\n\t\t}\n\t\tthis.o = function(_this) {\n\t\t\ttry {\n\t\t\t\tconst value = _this.v;\n\t\t\t\tif (_this.s & 1) {\n\t\t\t\t\t_settle(result, 1, onFulfilled ? onFulfilled(value) : value);\n\t\t\t\t} else if (onRejected) {\n\t\t\t\t\t_settle(result, 1, onRejected(value));\n\t\t\t\t} else {\n\t\t\t\t\t_settle(result, 2, value);\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t_settle(result, 2, e);\n\t\t\t}\n\t\t};\n\t\treturn result;\n\t}\n\treturn _Pact;\n})();\n\n// Settles a pact synchronously\nexport function _settle(pact, state, value) {\n\tif (!pact.s) {\n\t\tif (value instanceof _Pact) {\n\t\t\tif (value.s) {\n\t\t\t\tif (state & 1) {\n\t\t\t\t\tstate = value.s;\n\t\t\t\t}\n\t\t\t\tvalue = value.v;\n\t\t\t} else {\n\t\t\t\tvalue.o = _settle.bind(null, pact, state);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\tif (value && value.then) {\n\t\t\tvalue.then(_settle.bind(null, pact, state), _settle.bind(null, pact, 2));\n\t\t\treturn;\n\t\t}\n\t\tpact.s = state;\n\t\tpact.v = value;\n\t\tconst observer = pact.o;\n\t\tif (observer) {\n\t\t\tobserver(pact);\n\t\t}\n\t}\n}\n\nexport function _isSettledPact(thenable) {\n\treturn thenable instanceof _Pact && thenable.s & 1;\n}\n\n// Converts argument to a function that always returns a Promise\nexport function _async(f) {\n\treturn function() {\n\t\tfor (var args = [], i = 0; i < arguments.length; i++) {\n\t\t\targs[i] = arguments[i];\n\t\t}\n\t\ttry {\n\t\t\treturn Promise.resolve(f.apply(this, args));\n\t\t} catch(e) {\n\t\t\treturn Promise.reject(e);\n\t\t}\n\t}\n}\n\n// Awaits on a value that may or may not be a Promise (equivalent to the await keyword in ES2015, with continuations passed explicitly)\nexport function _await(value, then, direct) {\n\tif (direct) {\n\t\treturn then ? then(value) : value;\n\t}\n\tif (!value || !value.then) {\n\t\tvalue = Promise.resolve(value);\n\t}\n\treturn then ? value.then(then) : value;\n}\n\n// Awaits on a value that may or may not be a Promise, then ignores it\nexport function _awaitIgnored(value, direct) {\n\tif (!direct) {\n\t\treturn value && value.then ? value.then(_empty) : Promise.resolve();\n\t}\n}\n\n// Proceeds after a value has resolved, or proceeds immediately if the value is not thenable\nexport function _continue(value, then) {\n\treturn value && value.then ? value.then(then) : then(value);\n}\n\n// Proceeds after a value has resolved, or proceeds immediately if the value is not thenable\nexport function _continueIgnored(value) {\n\tif (value && value.then) {\n\t\treturn value.then(_empty);\n\t}\n}\n\n// Asynchronously iterate through an object that has a length property, passing the index as the first argument to the callback (even as the length property changes)\nexport function _forTo(array, body, check) {\n\tvar i = -1, pact, reject;\n\tfunction _cycle(result) {\n\t\ttry {\n\t\t\twhile (++i < array.length && (!check || !check())) {\n\t\t\t\tresult = body(i);\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\t\tresult = result.v;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult.then(_cycle, reject || (reject = _settle.bind(null, pact = new _Pact(), 2)));\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t}\n\t\t\tif (pact) {\n\t\t\t\t_settle(pact, 1, result);\n\t\t\t} else {\n\t\t\t\tpact = result;\n\t\t\t}\n\t\t} catch (e) {\n\t\t\t_settle(pact || (pact = new _Pact()), 2, e);\n\t\t}\n\t}\n\t_cycle();\n\treturn pact;\n}\n\n// Asynchronously iterate through an object's properties (including properties inherited from the prototype)\n// Uses a snapshot of the object's properties\nexport function _forIn(target, body, check) {\n\tvar keys = [];\n\tfor (var key in target) {\n\t\tkeys.push(key);\n\t}\n\treturn _forTo(keys, function(i) { return body(keys[i]); }, check);\n}\n\n// Asynchronously iterate through an object's own properties (excluding properties inherited from the prototype)\n// Uses a snapshot of the object's properties\nexport function _forOwn(target, body, check) {\n\tvar keys = [];\n\tfor (var key in target) {\n\t\tif (Object.prototype.hasOwnProperty.call(target, key)) {\n\t\t\tkeys.push(key);\n\t\t}\n\t}\n\treturn _forTo(keys, function(i) { return body(keys[i]); }, check);\n}\n\nexport const _iteratorSymbol = /*#__PURE__*/ typeof Symbol !== \"undefined\" ? (Symbol.iterator || (Symbol.iterator = Symbol(\"Symbol.iterator\"))) : \"@@iterator\";\n\n// Asynchronously iterate through an object's values\n// Uses for...of if the runtime supports it, otherwise iterates until length on a copy\nexport function _forOf(target, body, check) {\n\tif (typeof target[_iteratorSymbol] === \"function\") {\n\t\tvar iterator = target[_iteratorSymbol](), step, pact, reject;\n\t\tfunction _cycle(result) {\n\t\t\ttry {\n\t\t\t\twhile (!(step = iterator.next()).done && (!check || !check())) {\n\t\t\t\t\tresult = body(step.value);\n\t\t\t\t\tif (result && result.then) {\n\t\t\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\t\t\tresult = result.v;\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tresult.then(_cycle, reject || (reject = _settle.bind(null, pact = new _Pact(), 2)));\n\t\t\t\t\t\t\treturn;\n\t\t\t\t\t\t}\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tif (pact) {\n\t\t\t\t\t_settle(pact, 1, result);\n\t\t\t\t} else {\n\t\t\t\t\tpact = result;\n\t\t\t\t}\n\t\t\t} catch (e) {\n\t\t\t\t_settle(pact || (pact = new _Pact()), 2, e);\n\t\t\t}\n\t\t}\n\t\t_cycle();\n\t\tif (iterator.return) {\n\t\t\tvar _fixup = function(value) {\n\t\t\t\ttry {\n\t\t\t\t\tif (!step.done) {\n\t\t\t\t\t\titerator.return();\n\t\t\t\t\t}\n\t\t\t\t} catch(e) {\n\t\t\t\t}\n\t\t\t\treturn value;\n\t\t\t}\n\t\t\tif (pact && pact.then) {\n\t\t\t\treturn pact.then(_fixup, function(e) {\n\t\t\t\t\tthrow _fixup(e);\n\t\t\t\t});\n\t\t\t}\n\t\t\t_fixup();\n\t\t}\n\t\treturn pact;\n\t}\n\t// No support for Symbol.iterator\n\tif (!(\"length\" in target)) {\n\t\tthrow new TypeError(\"Object is not iterable\");\n\t}\n\t// Handle live collections properly\n\tvar values = [];\n\tfor (var i = 0; i < target.length; i++) {\n\t\tvalues.push(target[i]);\n\t}\n\treturn _forTo(values, function(i) { return body(values[i]); }, check);\n}\n\nexport const _asyncIteratorSymbol = /*#__PURE__*/ typeof Symbol !== \"undefined\" ? (Symbol.asyncIterator || (Symbol.asyncIterator = Symbol(\"Symbol.asyncIterator\"))) : \"@@asyncIterator\";\n\n// Asynchronously iterate on a value using it's async iterator if present, or its synchronous iterator if missing\nexport function _forAwaitOf(target, body, check) {\n\tif (typeof target[_asyncIteratorSymbol] === \"function\") {\n\t\tvar pact = new _Pact();\n\t\tvar iterator = target[_asyncIteratorSymbol]();\n\t\titerator.next().then(_resumeAfterNext).then(void 0, _reject);\n\t\treturn pact;\n\t\tfunction _resumeAfterBody(result) {\n\t\t\tif (check && check()) {\n\t\t\t\treturn _settle(pact, 1, iterator.return ? iterator.return().then(function() { return result; }) : result);\n\t\t\t}\n\t\t\titerator.next().then(_resumeAfterNext).then(void 0, _reject);\n\t\t}\n\t\tfunction _resumeAfterNext(step) {\n\t\t\tif (step.done) {\n\t\t\t\t_settle(pact, 1);\n\t\t\t} else {\n\t\t\t\tPromise.resolve(body(step.value)).then(_resumeAfterBody).then(void 0, _reject);\n\t\t\t}\n\t\t}\n\t\tfunction _reject(error) {\n\t\t\t_settle(pact, 2, iterator.return ? iterator.return().then(function() { return error; }) : error);\n\t\t}\n\t}\n\treturn Promise.resolve(_forOf(target, function(value) { return Promise.resolve(value).then(body); }, check));\n}\n\n// Asynchronously implement a generic for loop\nexport function _for(test, update, body) {\n\tvar stage;\n\tfor (;;) {\n\t\tvar shouldContinue = test();\n\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\tshouldContinue = shouldContinue.v;\n\t\t}\n\t\tif (!shouldContinue) {\n\t\t\treturn result;\n\t\t}\n\t\tif (shouldContinue.then) {\n\t\t\tstage = 0;\n\t\t\tbreak;\n\t\t}\n\t\tvar result = body();\n\t\tif (result && result.then) {\n\t\t\tif (_isSettledPact(result)) {\n\t\t\t\tresult = result.s;\n\t\t\t} else {\n\t\t\t\tstage = 1;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tif (update) {\n\t\t\tvar updateValue = update();\n\t\t\tif (updateValue && updateValue.then && !_isSettledPact(updateValue)) {\n\t\t\t\tstage = 2;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t}\n\tvar pact = new _Pact();\n\tvar reject = _settle.bind(null, pact, 2);\n\t(stage === 0 ? shouldContinue.then(_resumeAfterTest) : stage === 1 ? result.then(_resumeAfterBody) : updateValue.then(_resumeAfterUpdate)).then(void 0, reject);\n\treturn pact;\n\tfunction _resumeAfterBody(value) {\n\t\tresult = value;\n\t\tdo {\n\t\t\tif (update) {\n\t\t\t\tupdateValue = update();\n\t\t\t\tif (updateValue && updateValue.then && !_isSettledPact(updateValue)) {\n\t\t\t\t\tupdateValue.then(_resumeAfterUpdate).then(void 0, reject);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\tshouldContinue = test();\n\t\t\tif (!shouldContinue || (_isSettledPact(shouldContinue) && !shouldContinue.v)) {\n\t\t\t\t_settle(pact, 1, result);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tif (shouldContinue.then) {\n\t\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresult = body();\n\t\t\tif (_isSettledPact(result)) {\n\t\t\t\tresult = result.v;\n\t\t\t}\n\t\t} while (!result || !result.then);\n\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t}\n\tfunction _resumeAfterTest(shouldContinue) {\n\t\tif (shouldContinue) {\n\t\t\tresult = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t} else {\n\t\t\t\t_resumeAfterBody(result);\n\t\t\t}\n\t\t} else {\n\t\t\t_settle(pact, 1, result);\n\t\t}\n\t}\n\tfunction _resumeAfterUpdate() {\n\t\tif (shouldContinue = test()) {\n\t\t\tif (shouldContinue.then) {\n\t\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t} else {\n\t\t\t\t_resumeAfterTest(shouldContinue);\n\t\t\t}\n\t\t} else {\n\t\t\t_settle(pact, 1, result);\n\t\t}\n\t}\n}\n\n// Asynchronously implement a do ... while loop\nexport function _do(body, test) {\n\tvar awaitBody;\n\tdo {\n\t\tvar result = body();\n\t\tif (result && result.then) {\n\t\t\tif (_isSettledPact(result)) {\n\t\t\t\tresult = result.v;\n\t\t\t} else {\n\t\t\t\tawaitBody = true;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t}\n\t\tvar shouldContinue = test();\n\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\tshouldContinue = shouldContinue.v;\n\t\t}\n\t\tif (!shouldContinue) {\n\t\t\treturn result;\n\t\t}\n\t} while (!shouldContinue.then);\n\tconst pact = new _Pact();\n\tconst reject = _settle.bind(null, pact, 2);\n\t(awaitBody ? result.then(_resumeAfterBody) : shouldContinue.then(_resumeAfterTest)).then(void 0, reject);\n\treturn pact;\n\tfunction _resumeAfterBody(value) {\n\t\tresult = value;\n\t\tfor (;;) {\n\t\t\tshouldContinue = test();\n\t\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\t\tshouldContinue = shouldContinue.v;\n\t\t\t}\n\t\t\tif (!shouldContinue) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (shouldContinue.then) {\n\t\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tresult = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\tresult = result.v;\n\t\t\t\t} else {\n\t\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\t_settle(pact, 1, result);\n\t}\n\tfunction _resumeAfterTest(shouldContinue) {\n\t\tif (shouldContinue) {\n\t\t\tdo {\n\t\t\t\tresult = body();\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tif (_isSettledPact(result)) {\n\t\t\t\t\t\tresult = result.v;\n\t\t\t\t\t} else {\n\t\t\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\t\t\treturn;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t\tshouldContinue = test();\n\t\t\t\tif (_isSettledPact(shouldContinue)) {\n\t\t\t\t\tshouldContinue = shouldContinue.v;\n\t\t\t\t}\n\t\t\t\tif (!shouldContinue) {\n\t\t\t\t\t_settle(pact, 1, result);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} while (!shouldContinue.then);\n\t\t\tshouldContinue.then(_resumeAfterTest).then(void 0, reject);\n\t\t} else {\n\t\t\t_settle(pact, 1, result);\n\t\t}\n\t}\n}\n\n// Asynchronously implement a switch statement\nexport function _switch(discriminant, cases) {\n\tvar dispatchIndex = -1;\n\tvar awaitBody;\n\touter: {\n\t\tfor (var i = 0; i < cases.length; i++) {\n\t\t\tvar test = cases[i][0];\n\t\t\tif (test) {\n\t\t\t\tvar testValue = test();\n\t\t\t\tif (testValue && testValue.then) {\n\t\t\t\t\tbreak outer;\n\t\t\t\t}\n\t\t\t\tif (testValue === discriminant) {\n\t\t\t\t\tdispatchIndex = i;\n\t\t\t\t\tbreak;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Found the default case, set it as the pending dispatch case\n\t\t\t\tdispatchIndex = i;\n\t\t\t}\n\t\t}\n\t\tif (dispatchIndex !== -1) {\n\t\t\tdo {\n\t\t\t\tvar body = cases[dispatchIndex][1];\n\t\t\t\twhile (!body) {\n\t\t\t\t\tdispatchIndex++;\n\t\t\t\t\tbody = cases[dispatchIndex][1];\n\t\t\t\t}\n\t\t\t\tvar result = body();\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tawaitBody = true;\n\t\t\t\t\tbreak outer;\n\t\t\t\t}\n\t\t\t\tvar fallthroughCheck = cases[dispatchIndex][2];\n\t\t\t\tdispatchIndex++;\n\t\t\t} while (fallthroughCheck && !fallthroughCheck());\n\t\t\treturn result;\n\t\t}\n\t}\n\tconst pact = new _Pact();\n\tconst reject = _settle.bind(null, pact, 2);\n\t(awaitBody ? result.then(_resumeAfterBody) : testValue.then(_resumeAfterTest)).then(void 0, reject);\n\treturn pact;\n\tfunction _resumeAfterTest(value) {\n\t\tfor (;;) {\n\t\t\tif (value === discriminant) {\n\t\t\t\tdispatchIndex = i;\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tif (++i === cases.length) {\n\t\t\t\tif (dispatchIndex !== -1) {\n\t\t\t\t\tbreak;\n\t\t\t\t} else {\n\t\t\t\t\t_settle(pact, 1, result);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t}\n\t\t\ttest = cases[i][0];\n\t\t\tif (test) {\n\t\t\t\tvalue = test();\n\t\t\t\tif (value && value.then) {\n\t\t\t\t\tvalue.then(_resumeAfterTest).then(void 0, reject);\n\t\t\t\t\treturn;\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\tdispatchIndex = i;\n\t\t\t}\n\t\t}\n\t\tdo {\n\t\t\tvar body = cases[dispatchIndex][1];\n\t\t\twhile (!body) {\n\t\t\t\tdispatchIndex++;\n\t\t\t\tbody = cases[dispatchIndex][1];\n\t\t\t}\n\t\t\tvar result = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t\tvar fallthroughCheck = cases[dispatchIndex][2];\n\t\t\tdispatchIndex++;\n\t\t} while (fallthroughCheck && !fallthroughCheck());\n\t\t_settle(pact, 1, result);\n\t}\n\tfunction _resumeAfterBody(result) {\n\t\tfor (;;) {\n\t\t\tvar fallthroughCheck = cases[dispatchIndex][2];\n\t\t\tif (!fallthroughCheck || fallthroughCheck()) {\n\t\t\t\tbreak;\n\t\t\t}\n\t\t\tdispatchIndex++;\n\t\t\tvar body = cases[dispatchIndex][1];\n\t\t\twhile (!body) {\n\t\t\t\tdispatchIndex++;\n\t\t\t\tbody = cases[dispatchIndex][1];\n\t\t\t}\n\t\t\tresult = body();\n\t\t\tif (result && result.then) {\n\t\t\t\tresult.then(_resumeAfterBody).then(void 0, reject);\n\t\t\t\treturn;\n\t\t\t}\n\t\t}\n\t\t_settle(pact, 1, result);\n\t}\n}\n\n// Asynchronously call a function and pass the result to explicitly passed continuations\nexport function _call(body, then, direct) {\n\tif (direct) {\n\t\treturn then ? then(body()) : body();\n\t}\n\ttry {\n\t\tvar result = Promise.resolve(body());\n\t\treturn then ? result.then(then) : result;\n\t} catch (e) {\n\t\treturn Promise.reject(e);\n\t}\n}\n\n// Asynchronously call a function and swallow the result\nexport function _callIgnored(body, direct) {\n\treturn _call(body, _empty, direct);\n}\n\n// Asynchronously call a function and pass the result to explicitly passed continuations\nexport function _invoke(body, then) {\n\tvar result = body();\n\tif (result && result.then) {\n\t\treturn result.then(then);\n\t}\n\treturn then(result);\n}\n\n// Asynchronously call a function and swallow the result\nexport function _invokeIgnored(body) {\n\tvar result = body();\n\tif (result && result.then) {\n\t\treturn result.then(_empty);\n\t}\n}\n\n// Asynchronously call a function and send errors to recovery continuation\nexport function _catch(body, recover) {\n\ttry {\n\t\tvar result = body();\n\t} catch(e) {\n\t\treturn recover(e);\n\t}\n\tif (result && result.then) {\n\t\treturn result.then(void 0, recover);\n\t}\n\treturn result;\n}\n\n// Asynchronously await a promise and pass the result to a finally continuation\nexport function _finallyRethrows(body, finalizer) {\n\ttry {\n\t\tvar result = body();\n\t} catch (e) {\n\t\treturn finalizer(true, e);\n\t}\n\tif (result && result.then) {\n\t\treturn result.then(finalizer.bind(null, false), finalizer.bind(null, true));\n\t}\n\treturn finalizer(false, result);\n}\n\n// Asynchronously await a promise and invoke a finally continuation that always overrides the result\nexport function _finally(body, finalizer) {\n\ttry {\n\t\tvar result = body();\n\t} catch (e) {\n\t\treturn finalizer();\n\t}\n\tif (result && result.then) {\n\t\treturn result.then(finalizer, finalizer);\n\t}\n\treturn finalizer();\n}\n\n// Rethrow or return a value from a finally continuation\nexport function _rethrow(thrown, value) {\n\tif (thrown)\n\t\tthrow value;\n\treturn value;\n}\n\n// Empty function to implement break and other control flow that ignores asynchronous results\nexport function _empty() {\n}\n\n// Sentinel value for early returns in generators \nexport const _earlyReturn = /*#__PURE__*/ {};\n\n// Asynchronously call a function and send errors to recovery continuation, skipping early returns\nexport function _catchInGenerator(body, recover) {\n\treturn _catch(body, function(e) {\n\t\tif (e === _earlyReturn) {\n\t\t\tthrow e;\n\t\t}\n\t\treturn recover(e);\n\t});\n}\n\n// Asynchronous generator class; accepts the entrypoint of the generator, to which it passes itself when the generator should start\nexport const _AsyncGenerator = /*#__PURE__*/(function() {\n\tfunction _AsyncGenerator(entry) {\n\t\tthis._entry = entry;\n\t\tthis._pact = null;\n\t\tthis._resolve = null;\n\t\tthis._return = null;\n\t\tthis._promise = null;\n\t}\n\n\tfunction _wrapReturnedValue(value) {\n\t\treturn { value: value, done: true };\n\t}\n\tfunction _wrapYieldedValue(value) {\n\t\treturn { value: value, done: false };\n\t}\n\n\t_AsyncGenerator.prototype._yield = function(value) {\n\t\t// Yield the value to the pending next call\n\t\tthis._resolve(value && value.then ? value.then(_wrapYieldedValue) : _wrapYieldedValue(value));\n\t\t// Return a pact for an upcoming next/return/throw call\n\t\treturn this._pact = new _Pact();\n\t};\n\t_AsyncGenerator.prototype.next = function(value) {\n\t\t// Advance the generator, starting it if it has yet to be started\n\t\tconst _this = this;\n\t\treturn _this._promise = new Promise(function (resolve) {\n\t\t\tconst _pact = _this._pact;\n\t\t\tif (_pact === null) {\n\t\t\t\tconst _entry = _this._entry;\n\t\t\t\tif (_entry === null) {\n\t\t\t\t\t// Generator is started, but not awaiting a yield expression\n\t\t\t\t\t// Abandon the next call!\n\t\t\t\t\treturn resolve(_this._promise);\n\t\t\t\t}\n\t\t\t\t// Start the generator\n\t\t\t\t_this._entry = null;\n\t\t\t\t_this._resolve = resolve;\n\t\t\t\tfunction returnValue(value) {\n\t\t\t\t\t_this._resolve(value && value.then ? value.then(_wrapReturnedValue) : _wrapReturnedValue(value));\n\t\t\t\t\t_this._pact = null;\n\t\t\t\t\t_this._resolve = null;\n\t\t\t\t}\n\t\t\t\tvar result = _entry(_this);\n\t\t\t\tif (result && result.then) {\n\t\t\t\t\tresult.then(returnValue, function(error) {\n\t\t\t\t\t\tif (error === _earlyReturn) {\n\t\t\t\t\t\t\treturnValue(_this._return);\n\t\t\t\t\t\t} else {\n\t\t\t\t\t\t\tconst pact = new _Pact();\n\t\t\t\t\t\t\t_this._resolve(pact);\n\t\t\t\t\t\t\t_this._pact = null;\n\t\t\t\t\t\t\t_this._resolve = null;\n\t\t\t\t\t\t\t_resolve(pact, 2, error);\n\t\t\t\t\t\t}\n\t\t\t\t\t});\n\t\t\t\t} else {\n\t\t\t\t\treturnValue(result);\n\t\t\t\t}\n\t\t\t} else {\n\t\t\t\t// Generator is started and a yield expression is pending, settle it\n\t\t\t\t_this._pact = null;\n\t\t\t\t_this._resolve = resolve;\n\t\t\t\t_settle(_pact, 1, value);\n\t\t\t}\n\t\t});\n\t};\n\t_AsyncGenerator.prototype.return = function(value) {\n\t\t// Early return from the generator if started, otherwise abandons the generator\n\t\tconst _this = this;\n\t\treturn _this._promise = new Promise(function (resolve) {\n\t\t\tconst _pact = _this._pact;\n\t\t\tif (_pact === null) {\n\t\t\t\tif (_this._entry === null) {\n\t\t\t\t\t// Generator is started, but not awaiting a yield expression\n\t\t\t\t\t// Abandon the return call!\n\t\t\t\t\treturn resolve(_this._promise);\n\t\t\t\t}\n\t\t\t\t// Generator is not started, abandon it and return the specified value\n\t\t\t\t_this._entry = null;\n\t\t\t\treturn resolve(value && value.then ? value.then(_wrapReturnedValue) : _wrapReturnedValue(value));\n\t\t\t}\n\t\t\t// Settle the yield expression with a rejected \"early return\" value\n\t\t\t_this._return = value;\n\t\t\t_this._resolve = resolve;\n\t\t\t_this._pact = null;\n\t\t\t_settle(_pact, 2, _earlyReturn);\n\t\t});\n\t};\n\t_AsyncGenerator.prototype.throw = function(error) {\n\t\t// Inject an exception into the pending yield expression\n\t\tconst _this = this;\n\t\treturn _this._promise = new Promise(function (resolve, reject) {\n\t\t\tconst _pact = _this._pact;\n\t\t\tif (_pact === null) {\n\t\t\t\tif (_this._entry === null) {\n\t\t\t\t\t// Generator is started, but not awaiting a yield expression\n\t\t\t\t\t// Abandon the throw call!\n\t\t\t\t\treturn resolve(_this._promise);\n\t\t\t\t}\n\t\t\t\t// Generator is not started, abandon it and return a rejected Promise containing the error\n\t\t\t\t_this._entry = null;\n\t\t\t\treturn reject(error);\n\t\t\t}\n\t\t\t// Settle the yield expression with the value as a rejection\n\t\t\t_this._resolve = resolve;\n\t\t\t_this._pact = null;\n\t\t\t_settle(_pact, 2, error);\n\t\t});\n\t};\n\n\t_AsyncGenerator.prototype[_asyncIteratorSymbol] = function() {\n\t\treturn this;\n\t};\n\t\n\treturn _AsyncGenerator;\n})();\n","import React from \"react\";\nimport { BarTask } from \"../../types/bar-task\";\nimport { Dependency } from \"../../types/public-types\";\n\ntype ArrowProps = {\n taskFrom: BarTask;\n taskTo: BarTask;\n rowHeight: number;\n taskHeight: number;\n arrowIndent: number;\n arrowColor: string;\n dependencyType: Dependency;\n};\n\nexport const Arrow: React.FC<ArrowProps> = ({\n taskFrom,\n taskTo,\n rowHeight,\n taskHeight,\n arrowIndent,\n arrowColor,\n dependencyType,\n}) => {\n let [path, trianglePoints] = drawPathAndTriangle(\n taskFrom,\n taskTo,\n rowHeight,\n taskHeight,\n arrowIndent,\n dependencyType\n );\n\n return (\n <g className=\"arrow\">\n <path strokeWidth=\"1.5\" d={path} fill=\"none\" stroke={arrowColor} />\n <polygon points={trianglePoints} fill={arrowColor} />\n </g>\n );\n};\n\nconst drawPathAndTriangle = (\n taskFrom: BarTask,\n taskTo: BarTask,\n rowHeight: number,\n taskHeight: number,\n arrowIndent: number,\n dependencyType: Dependency\n) => {\n const indexCompare = taskFrom.index > taskTo.index ? -1 : 1;\n const taskToEndY = taskTo.y + taskHeight / 2;\n const verticalOffset = indexCompare * (rowHeight / 2);\n\n // 1️⃣ Pick start/end x-points based on dependency type\n const minX = (t: BarTask) => {\n // Use visual segment edge when available (correct for working-time bars in day view)\n if (t.plannedSegments && t.plannedSegments.length > 0) {\n const p = t.plannedSegments[0].x1;\n if (t.actualSegments && t.actualSegments.length > 0) return Math.min(p, t.actualSegments[0].x1);\n return p;\n }\n if (t.actualSegments && t.actualSegments.length > 0) return t.actualSegments[0].x1;\n // Only blend a coord when that bar actually exists (positive width). A bar\n // whose dates are the 1970 epoch sentinel clamps its x-coords to 0 (the\n // chart's left edge); a `>= 0` check would let that 0 drag the endpoint left.\n const candidates: number[] = [];\n if (t.x2 > t.x1) candidates.push(t.x1);\n if (t.actualx2 > t.actualx1) candidates.push(t.actualx1);\n return candidates.length > 0 ? Math.min(...candidates) : 0;\n };\n const maxX = (t: BarTask) => {\n if (t.plannedSegments && t.plannedSegments.length > 0) {\n const p = t.plannedSegments[t.plannedSegments.length - 1].x2;\n if (t.actualSegments && t.actualSegments.length > 0) return Math.max(p, t.actualSegments[t.actualSegments.length - 1].x2);\n return p;\n }\n if (t.actualSegments && t.actualSegments.length > 0) return t.actualSegments[t.actualSegments.length - 1].x2;\n // Mirror minX: only blend a coord when that bar actually exists (positive\n // width), so a 1970-epoch sentinel bar (x-coords clamped to 0) can't apply.\n const candidates: number[] = [];\n if (t.x2 > t.x1) candidates.push(t.x2);\n if (t.actualx2 > t.actualx1) candidates.push(t.actualx2);\n return candidates.length > 0 ? Math.max(...candidates) : 0;\n };\n\n let fromPoint: number, toPoint: number;\n switch (dependencyType) {\n case \"SS\":\n fromPoint = minX(taskFrom);\n toPoint = minX(taskTo);\n break;\n case \"SF\":\n fromPoint = minX(taskFrom);\n toPoint = maxX(taskTo);\n break;\n case \"FS\":\n fromPoint = maxX(taskFrom);\n toPoint = minX(taskTo);\n break;\n case \"FF\":\n fromPoint = maxX(taskFrom);\n toPoint = maxX(taskTo);\n break;\n }\n\n // 2️⃣ Helper for arrowhead points\n const arrowPoints = (x: number, y: number, right = true) =>\n right\n ? `${x},${y} ${x - 5},${y - 5} ${x - 5},${y + 5}` // Right\n : `${x},${y} ${x + 5},${y - 5} ${x + 5},${y + 5}`; // Left\n\n let path: string;\n let trianglePoints: string;\n\n // 3️⃣ Routing based on type\n switch (dependencyType) {\n case \"SS\":\n path = `M ${fromPoint} ${taskFrom.y + taskHeight / 2}\n H ${\n fromPoint + Math.min(toPoint - fromPoint, 0) - 2 * arrowIndent\n }\n V ${taskToEndY}\n H ${toPoint - 5}`;\n trianglePoints = arrowPoints(toPoint, taskToEndY, true);\n break;\n\n case \"SF\":\n path = `M ${fromPoint} ${taskFrom.y + taskHeight / 2}\n H ${fromPoint - 2 * arrowIndent}\n V ${taskFrom.y + taskHeight / 2 + verticalOffset}\n ${\n fromPoint - toPoint > 4 * arrowIndent\n ? \"\"\n : `H ${toPoint + 2 * arrowIndent}`\n }\n V ${taskToEndY}\n H ${toPoint + 5}`;\n trianglePoints = arrowPoints(toPoint, taskToEndY, false);\n break;\n\n case \"FS\":\n path = `M ${fromPoint} ${taskFrom.y + taskHeight / 2}\n H ${fromPoint + 2 * arrowIndent}\n V ${taskFrom.y + taskHeight / 2 + verticalOffset}\n ${\n toPoint - fromPoint > 4 * arrowIndent\n ? \"\"\n : `H ${toPoint - 2 * arrowIndent}`\n }\n V ${taskToEndY}\n H ${toPoint - 5}`;\n trianglePoints = arrowPoints(toPoint, taskToEndY, true);\n break;\n\n case \"FF\":\n path = `M ${fromPoint} ${taskFrom.y + taskHeight / 2}\n H ${\n fromPoint + Math.max(toPoint - fromPoint, 0) + 2 * arrowIndent\n }\n V ${taskToEndY}\n H ${toPoint + 5}`;\n trianglePoints = arrowPoints(toPoint, taskToEndY, false);\n break;\n }\n\n return [path, trianglePoints];\n};\n","import { Task } from \"../types/public-types\";\nimport { BarTask, TaskTypeInternal } from \"../types/bar-task\";\nimport { BarMoveAction } from \"../types/gantt-task-actions\";\nimport { getWorkingIntervals } from \"./calendar-helper\";\nimport { startOfDate, addToDate } from \"./date-helper\";\n\nexport const convertToBarTasks = (\n tasks: Task[],\n dates: Date[],\n columnWidth: number,\n rowHeight: number,\n taskHeight: number,\n barCornerRadius: number,\n handleWidth: number,\n rtl: boolean,\n barProgressColor: string,\n barProgressSelectedColor: string,\n barBackgroundColor: string,\n barBackgroundSelectedColor: string,\n projectProgressColor: string,\n projectProgressSelectedColor: string,\n projectBackgroundColor: string,\n projectBackgroundSelectedColor: string,\n milestoneBackgroundColor: string,\n milestoneBackgroundSelectedColor: string\n) => {\n let barTasks = tasks.map((t, i) => {\n return convertToBarTask(\n t,\n i,\n dates,\n columnWidth,\n rowHeight,\n taskHeight,\n barCornerRadius,\n handleWidth,\n rtl,\n barProgressColor,\n barProgressSelectedColor,\n barBackgroundColor,\n barBackgroundSelectedColor,\n projectProgressColor,\n projectProgressSelectedColor,\n projectBackgroundColor,\n projectBackgroundSelectedColor,\n milestoneBackgroundColor,\n milestoneBackgroundSelectedColor\n );\n });\n\n // id->index map: findIndex here was O(tasks x deps).\n const indexById = new Map<string, number>();\n for (let i = 0; i < barTasks.length; i++) {\n indexById.set(barTasks[i].id, i);\n }\n barTasks = barTasks.map(task => {\n const dependencies = task.dependencies || [];\n for (let j = 0; j < dependencies.length; j++) {\n const dependence = indexById.get(dependencies[j].id);\n if (\n dependence !== undefined &&\n task.start.getTime() > 0 &&\n task.end.getTime() > 0\n ) {\n const barchild = { ...task, dependencyType: dependencies[j].type };\n barTasks[dependence].barChildren.push(barchild);\n }\n }\n return task;\n });\n\n return barTasks;\n};\n\nconst convertToBarTask = (\n task: Task,\n index: number,\n dates: Date[],\n columnWidth: number,\n rowHeight: number,\n taskHeight: number,\n barCornerRadius: number,\n handleWidth: number,\n rtl: boolean,\n barProgressColor: string,\n barProgressSelectedColor: string,\n barBackgroundColor: string,\n barBackgroundSelectedColor: string,\n projectProgressColor: string,\n projectProgressSelectedColor: string,\n projectBackgroundColor: string,\n projectBackgroundSelectedColor: string,\n milestoneBackgroundColor: string,\n milestoneBackgroundSelectedColor: string\n): BarTask => {\n let barTask: BarTask;\n switch (task.type) {\n case \"milestone\":\n barTask = convertToMilestone(\n task,\n index,\n dates,\n columnWidth,\n rowHeight,\n taskHeight,\n barCornerRadius,\n handleWidth,\n milestoneBackgroundColor,\n milestoneBackgroundSelectedColor\n );\n break;\n case \"project\":\n barTask = convertToBar(\n task,\n index,\n dates,\n columnWidth,\n rowHeight,\n taskHeight,\n barCornerRadius,\n handleWidth,\n rtl,\n projectProgressColor,\n projectProgressSelectedColor,\n projectBackgroundColor,\n projectBackgroundSelectedColor\n );\n break;\n default:\n barTask = convertToBar(\n task,\n index,\n dates,\n columnWidth,\n rowHeight,\n taskHeight,\n barCornerRadius,\n handleWidth,\n rtl,\n barProgressColor,\n barProgressSelectedColor,\n barBackgroundColor,\n barBackgroundSelectedColor\n );\n break;\n }\n return barTask;\n};\n\nconst convertToBar = (\n task: Task,\n index: number,\n dates: Date[],\n columnWidth: number,\n rowHeight: number,\n taskHeight: number,\n barCornerRadius: number,\n handleWidth: number,\n rtl: boolean,\n barProgressColor: string,\n barProgressSelectedColor: string,\n barBackgroundColor: string,\n barBackgroundSelectedColor: string\n): BarTask => {\n let x1: number;\n let x2: number;\n let actualx1: number;\n let actualx2: number;\n let progressStartWidth: number;\n let progressEndWidth: number;\n if (rtl) {\n x2 = task.start ? taskXCoordinateRTL(task.start, dates, columnWidth) : -1;\n x1 = task.end ? taskXCoordinateRTL(task.end, dates, columnWidth) : -1;\n actualx1 = task.actualStart\n ? taskXCoordinateRTL(task.actualStart, dates, columnWidth)\n : -1;\n actualx2 = task.actualEnd\n ? taskXCoordinateRTL(task.actualEnd, dates, columnWidth)\n : -1;\n } else {\n x1 = task.start ? taskXCoordinate(startOfDate(task.start, \"day\"), dates, columnWidth) : -1;\n x2 = task.end ? taskXCoordinate(addToDate(startOfDate(task.end, \"day\"), 1, \"day\"), dates, columnWidth) : -1;\n actualx1 = task.actualStart\n ? taskXCoordinate(startOfDate(task.actualStart, \"day\"), dates, columnWidth)\n : -1;\n actualx2 = task.actualEnd\n ? taskXCoordinate(addToDate(startOfDate(task.actualEnd, \"day\"), 1, \"day\"), dates, columnWidth)\n : -1;\n }\n\n progressStartWidth = actualx1 && x1 ? Math.abs(actualx1 - x1) : -1;\n progressEndWidth = actualx2 && x2 ? Math.abs(actualx2 - x2) : -1;\n\n let typeInternal: TaskTypeInternal = task.type;\n // if (x1 && x2) {\n // if (typeInternal === \"task\" && x2 - x1 < handleWidth * 2) {\n // typeInternal = \"smalltask\";\n // x2 = x1 + handleWidth * 2;\n // }\n // }\n const [progressWidth, progressX] = progressWithByParams(\n actualx1,\n actualx2,\n task.progress,\n rtl\n );\n\n const y = taskYCoordinate(index, rowHeight, taskHeight);\n //const hideChildren = task.type === \"project\" ? task.hideChildren : undefined;\n const hideChildren = task.hideChildren || false; //allows tasks to have chldren. benjamin\n\n // Compute working-time segments if the task has a calendar\n let plannedSegments: Array<{ x1: number; x2: number }> | undefined;\n let actualSegments: Array<{ x1: number; x2: number }> | undefined;\n\n if (task.calendar && task.start && task.end && task.start.getTime() > 0) {\n const planEnd = addToDate(startOfDate(task.end, \"day\"), 1, \"day\");\n const intervals = getWorkingIntervals(task.start, planEnd, task.calendar);\n const segs = intervals\n .map(iv => ({\n x1: taskXCoordinate(iv.start, dates, columnWidth),\n x2: taskXCoordinate(iv.end, dates, columnWidth),\n }))\n .filter(s => s.x2 > s.x1);\n if (segs.length > 0) plannedSegments = segs;\n }\n\n if (\n task.calendar &&\n task.actualStart &&\n task.actualEnd &&\n task.actualStart.getTime() > 0\n ) {\n const actEnd = addToDate(startOfDate(task.actualEnd, \"day\"), 1, \"day\");\n const intervals = getWorkingIntervals(\n task.actualStart,\n actEnd,\n task.calendar\n );\n const segs = intervals\n .map(iv => ({\n x1: taskXCoordinate(iv.start, dates, columnWidth),\n x2: taskXCoordinate(iv.end, dates, columnWidth),\n }))\n .filter(s => s.x2 > s.x1);\n if (segs.length > 0) actualSegments = segs;\n }\n\n const styles = {\n backgroundColor: barBackgroundColor,\n backgroundSelectedColor: barBackgroundSelectedColor,\n progressColor: barProgressColor,\n progressSelectedColor: barProgressSelectedColor,\n ...task.styles,\n };\n return {\n ...task,\n typeInternal,\n x1,\n x2,\n actualx1,\n actualx2,\n progressStartWidth,\n progressEndWidth,\n y,\n index,\n progressX,\n progressWidth,\n barCornerRadius,\n handleWidth,\n hideChildren,\n height: taskHeight,\n barChildren: [],\n styles,\n plannedSegments,\n actualSegments,\n };\n};\n\nconst convertToMilestone = (\n task: Task,\n index: number,\n dates: Date[],\n columnWidth: number,\n rowHeight: number,\n taskHeight: number,\n barCornerRadius: number,\n handleWidth: number,\n milestoneBackgroundColor: string,\n milestoneBackgroundSelectedColor: string\n): BarTask => {\n const x =\n task.start && task.end\n ? taskXCoordinate(task.end, dates, columnWidth)\n : 0;\n const y = taskYCoordinate(index, rowHeight, taskHeight);\n\n const x1 = task.start && task.end ? x - taskHeight * 0.5 : 0;\n const x2 = task.start && task.end ? x + taskHeight * 0.5 : 0;\n\n const rotatedHeight = taskHeight / 1.414;\n const styles = {\n backgroundColor: milestoneBackgroundColor,\n backgroundSelectedColor: milestoneBackgroundSelectedColor,\n progressColor: \"\",\n progressSelectedColor: \"\",\n ...task.styles,\n };\n return {\n ...task,\n x1,\n x2,\n actualx1: x1,\n actualx2: x2,\n progressStartWidth: 0,\n progressEndWidth: 0,\n y,\n index,\n progressX: 0,\n progressWidth: 0,\n barCornerRadius,\n handleWidth,\n typeInternal: task.type,\n progress: 0,\n height: rotatedHeight,\n hideChildren: undefined,\n barChildren: [],\n styles,\n };\n};\n\n// Timestamps cached by array identity, rebuilt only when `dates` changes.\nconst dateTimesCache = new WeakMap<Date[], number[]>();\nconst getDateTimes = (dates: Date[]) => {\n let times = dateTimesCache.get(dates);\n if (!times) {\n times = dates.map(d => d.getTime());\n dateTimesCache.set(dates, times);\n }\n return times;\n};\n\nexport const taskXCoordinate = (xDate: Date, dates: Date[], columnWidth: number) => {\n // Binary search: runs 4x per bar, and `dates` reaches ~11k in Hour view.\n const times = getDateTimes(dates);\n const target = xDate.getTime();\n let lo = 0;\n let hi = times.length - 1;\n while (lo <= hi) {\n const mid = (lo + hi) >> 1;\n if (times[mid] >= target) hi = mid - 1;\n else lo = mid + 1;\n }\n // Nothing >= target: mirror findIndex's -1 for the branch below.\n const index = (lo === times.length ? -1 : lo) - 1;\n if (index < 0) {\n if (dates[dates.length - 1].getTime() <= xDate.getTime()) {\n return dates.length * columnWidth;\n } else {\n return 0;\n }\n }\n const remainderMillis = xDate.getTime() - dates[index].getTime();\n const percentOfInterval =\n remainderMillis / (dates[index + 1].getTime() - dates[index].getTime());\n const x = index * columnWidth + percentOfInterval * columnWidth;\n return x;\n};\nconst taskXCoordinateRTL = (\n xDate: Date,\n dates: Date[],\n columnWidth: number\n) => {\n let x = taskXCoordinate(xDate, dates, columnWidth);\n x += columnWidth;\n return x;\n};\nconst taskYCoordinate = (\n index: number,\n rowHeight: number,\n taskHeight: number\n) => {\n const y = index * rowHeight + (rowHeight - taskHeight) / 2;\n return y;\n};\n\nexport const progressWithByParams = (\n taskX1: number,\n taskX2: number,\n progress: number,\n rtl: boolean\n) => {\n const progressWidth =\n taskX2 > 0 && taskX1 > 0 ? (taskX2 - taskX1) * progress * 0.01 : 0;\n let progressX: number;\n if (rtl) {\n progressX = taskX2 > 0 ? taskX2 - progressWidth : 0;\n } else {\n progressX = taskX1 > 0 ? taskX1 : 0;\n }\n return [progressWidth, progressX];\n};\n\nexport const progressByProgressWidth = (\n progressWidth: number,\n barTask: BarTask\n) => {\n const barWidth = barTask.x2 - barTask.x1;\n const progressPercent = Math.round((progressWidth * 100) / barWidth);\n if (progressPercent >= 100) return 100;\n else if (progressPercent <= 0) return 0;\n else return progressPercent;\n};\n\n// const progressByX = (x: number, task: BarTask) => {\n// if (x >= task.x2) return 100;\n// else if (x <= task.x1) return 0;\n// else {\n// const barWidth = task.x2 - task.x1;\n// const progressPercent = Math.round(((x - task.x1) * 100) / barWidth);\n// return progressPercent;\n// }\n// };\n// const progressByXRTL = (x: number, task: BarTask) => {\n// if (x >= task.x2) return 0;\n// else if (x <= task.x1) return 100;\n// else {\n// const barWidth = task.x2 - task.x1;\n// const progressPercent = Math.round(((task.x2 - x) * 100) / barWidth);\n// return progressPercent;\n// }\n// };\n\nexport const getProgressPoint = (\n progressX: number,\n taskY: number,\n taskHeight: number\n) => {\n const point = [\n progressX - 5,\n taskY + taskHeight,\n progressX + 5,\n taskY + taskHeight,\n progressX,\n taskY + taskHeight - 8.66,\n ];\n return point.join(\",\");\n};\n\nconst startByX = (x: number, xStep: number, task: BarTask) => {\n if (x >= task.x2 - task.handleWidth * 2) {\n x = task.x2 - task.handleWidth * 2;\n }\n const steps = Math.round((x - task.x1) / xStep);\n const additionalXValue = steps * xStep;\n const newX = task.x1 + additionalXValue;\n return newX;\n};\n\nconst startByActualX = (x: number, xStep: number, task: BarTask) => {\n if (x >= task.actualx2 - task.handleWidth * 2) {\n x = task.actualx2 - task.handleWidth * 2;\n }\n const steps = Math.round((x - task.actualx1) / xStep);\n const additionalXValue = steps * xStep;\n const newX = task.actualx1 + additionalXValue;\n return newX;\n};\n\nconst endByX = (x: number, xStep: number, task: BarTask) => {\n if (x <= task.x1 + task.handleWidth * 2) {\n x = task.x1 + task.handleWidth * 2;\n }\n const steps = Math.round((x - task.x2) / xStep);\n const additionalXValue = steps * xStep;\n const newX = task.x2 + additionalXValue;\n return newX;\n};\n\nconst endByActualX = (x: number, xStep: number, task: BarTask) => {\n if (x <= task.actualx1 + task.handleWidth * 2) {\n x = task.actualx1 + task.handleWidth * 2;\n }\n const steps = Math.round((x - task.actualx2) / xStep);\n const additionalXValue = steps * xStep;\n const newX = task.actualx2 + additionalXValue;\n return newX;\n};\n\nconst moveByX = (x: number, xStep: number, task: BarTask) => {\n const steps = Math.round((x - task.x1) / xStep);\n const additionalXValue = steps * xStep;\n const newX1 = task.x1 + additionalXValue;\n const newX2 = newX1 + task.x2 - task.x1;\n return [newX1, newX2];\n};\n\nconst moveByActualX = (x: number, xStep: number, task: BarTask) => {\n const steps = Math.round((x - task.actualx1) / xStep);\n const additionalXValue = steps * xStep;\n const newX1 = task.actualx1 + additionalXValue;\n const newX2 = newX1 + task.actualx2 - task.actualx1;\n return [newX1, newX2];\n};\n\nconst dateByX = (\n x: number,\n taskX: number,\n taskDate: Date,\n xStep: number,\n timeStep: number\n) => {\n let newDate = new Date(((x - taskX) / xStep) * timeStep + taskDate.getTime());\n newDate = new Date(\n newDate.getTime() +\n (newDate.getTimezoneOffset() - taskDate.getTimezoneOffset()) * 60000\n );\n return newDate;\n};\n\n/**\n * Method handles event in real time(mousemove) and on finish(mouseup)\n */\nexport const handleTaskBySVGMouseEvent = (\n svgX: number,\n action: BarMoveAction,\n selectedTask: BarTask,\n type: string,\n xStep: number,\n timeStep: number,\n initEventX1Delta: number,\n rtl: boolean\n): { isChanged: boolean; changedTask: BarTask } => {\n let result: { isChanged: boolean; changedTask: BarTask };\n switch (selectedTask.type) {\n case \"milestone\":\n result = handleTaskBySVGMouseEventForMilestone(\n svgX,\n action,\n selectedTask,\n xStep,\n timeStep,\n initEventX1Delta\n );\n break;\n default:\n result = handleTaskBySVGMouseEventForBar(\n svgX,\n action,\n selectedTask,\n type,\n xStep,\n timeStep,\n initEventX1Delta,\n rtl\n );\n break;\n }\n return result;\n};\n\nconst handleTaskBySVGMouseEventForBar = (\n svgX: number,\n action: BarMoveAction,\n selectedTask: BarTask,\n type: string,\n xStep: number,\n timeStep: number,\n initEventX1Delta: number,\n rtl: boolean\n): { isChanged: boolean; changedTask: BarTask } => {\n const changedTask: BarTask = { ...selectedTask };\n let isChanged = false;\n switch (action) {\n // case \"progress\":\n // if (rtl) {\n // changedTask.progress = progressByXRTL(svgX, selectedTask);\n // } else {\n // changedTask.progress = progressByX(svgX, selectedTask);\n // }\n // isChanged = changedTask.progress !== selectedTask.progress;\n // if (isChanged) {\n // const [progressWidth, progressX] = progressWithByParams(\n // changedTask.x1,\n // changedTask.x2,\n // changedTask.progress,\n // rtl\n // );\n // changedTask.progressWidth = progressWidth;\n // changedTask.progressX = progressX;\n // }\n // break;\n case \"start\": {\n const newX1 =\n type == \"planned\"\n ? startByX(svgX, xStep, selectedTask)\n : startByActualX(svgX, xStep, selectedTask);\n if (type == \"planned\") changedTask.x1 = newX1;\n else if (type == \"actual\") changedTask.actualx1 = newX1;\n isChanged =\n changedTask.x1 !== selectedTask.x1 ||\n changedTask.actualx1 !== selectedTask.actualx1;\n if (isChanged) {\n if (rtl) {\n if (type == \"planned\")\n changedTask.end = dateByX(\n newX1,\n selectedTask.x1,\n selectedTask.end,\n xStep,\n timeStep\n );\n if (type == \"actual\")\n changedTask.actualEnd = dateByX(\n newX1,\n selectedTask.actualx1,\n selectedTask.actualEnd,\n xStep,\n timeStep\n );\n } else {\n if (type == \"planned\")\n changedTask.start = dateByX(\n newX1,\n selectedTask.x1,\n selectedTask.start,\n xStep,\n timeStep\n );\n if (type == \"actual\")\n changedTask.actualStart = dateByX(\n newX1,\n selectedTask.actualx1,\n selectedTask.actualStart,\n xStep,\n timeStep\n );\n }\n const [progressWidth, progressX] = progressWithByParams(\n changedTask.x1,\n changedTask.x2,\n changedTask.progress,\n rtl\n );\n changedTask.progressWidth = progressWidth;\n changedTask.progressX = progressX;\n }\n break;\n }\n case \"end\": {\n const newX2 =\n type == \"planned\"\n ? endByX(svgX, xStep, selectedTask)\n : endByActualX(svgX, xStep, selectedTask);\n if (type == \"planned\") changedTask.x2 = newX2;\n else if (type == \"actual\") changedTask.actualx2 = newX2;\n isChanged =\n changedTask.x2 !== selectedTask.x2 ||\n changedTask.actualx2 !== selectedTask.actualx2;\n if (isChanged) {\n if (rtl) {\n if (type == \"planned\")\n changedTask.start = dateByX(\n newX2,\n selectedTask.x2,\n selectedTask.start,\n xStep,\n timeStep\n );\n if (type == \"actual\")\n changedTask.actualStart = dateByX(\n newX2,\n selectedTask.actualx2,\n selectedTask.actualStart,\n xStep,\n timeStep\n );\n } else {\n if (type == \"planned\")\n changedTask.end = dateByX(\n newX2,\n selectedTask.x2,\n selectedTask.end,\n xStep,\n timeStep\n );\n if (type == \"actual\")\n changedTask.actualEnd = dateByX(\n newX2,\n selectedTask.actualx2,\n selectedTask.actualEnd,\n xStep,\n timeStep\n );\n }\n const [progressWidth, progressX] = progressWithByParams(\n changedTask.x1,\n changedTask.x2,\n changedTask.progress,\n rtl\n );\n changedTask.progressWidth = progressWidth;\n changedTask.progressX = progressX;\n }\n break;\n }\n case \"move\": {\n const [newMoveX1, newMoveX2] =\n type == \"planned\"\n ? moveByX(svgX - initEventX1Delta, xStep, selectedTask)\n : moveByActualX(svgX - initEventX1Delta, xStep, selectedTask);\n if (type == \"planned\") isChanged = newMoveX1 !== selectedTask.x1;\n if (type == \"actual\") isChanged = newMoveX1 !== selectedTask.actualx1;\n if (isChanged) {\n if (type == \"planned\") {\n changedTask.start = dateByX(\n newMoveX1,\n selectedTask.x1,\n selectedTask.start,\n xStep,\n timeStep\n );\n changedTask.end = dateByX(\n newMoveX2,\n selectedTask.x2,\n selectedTask.end,\n xStep,\n timeStep\n );\n changedTask.x1 = newMoveX1;\n changedTask.x2 = newMoveX2;\n }\n if (type == \"actual\") {\n changedTask.actualStart = dateByX(\n newMoveX1,\n selectedTask.actualx1,\n selectedTask.actualStart,\n xStep,\n timeStep\n );\n changedTask.actualEnd = dateByX(\n newMoveX2,\n selectedTask.actualx2,\n selectedTask.actualEnd,\n xStep,\n timeStep\n );\n changedTask.actualx1 = newMoveX1;\n changedTask.actualx2 = newMoveX2;\n }\n\n // const [progressWidth, progressX] = progressWithByParams(\n // changedTask.x1,\n // changedTask.x2,\n // changedTask.progress,\n // rtl\n // );\n // changedTask.progressWidth = progressWidth;\n // changedTask.progressX = progressX;\n }\n break;\n }\n }\n return { isChanged, changedTask };\n};\n\nconst handleTaskBySVGMouseEventForMilestone = (\n svgX: number,\n action: BarMoveAction,\n selectedTask: BarTask,\n xStep: number,\n timeStep: number,\n initEventX1Delta: number\n): { isChanged: boolean; changedTask: BarTask } => {\n const changedTask: BarTask = { ...selectedTask };\n let isChanged = false;\n switch (action) {\n case \"move\": {\n const [newMoveX1, newMoveX2] = moveByX(\n svgX - initEventX1Delta,\n xStep,\n selectedTask\n );\n isChanged = newMoveX1 !== selectedTask.x1;\n if (isChanged) {\n changedTask.start = dateByX(\n newMoveX1,\n selectedTask.x1,\n selectedTask.start,\n xStep,\n timeStep\n );\n changedTask.end = changedTask.start;\n changedTask.x1 = newMoveX1;\n changedTask.x2 = newMoveX2;\n }\n break;\n }\n }\n return { isChanged, changedTask };\n};\n","import { BarTask } from \"../types/bar-task\";\nimport { Task } from \"../types/public-types\";\n\nexport function isKeyboardEvent(\n event: React.MouseEvent | React.KeyboardEvent | React.FocusEvent\n): event is React.KeyboardEvent {\n return (event as React.KeyboardEvent).key !== undefined;\n}\n\nexport function isMouseEvent(\n event: React.MouseEvent | React.KeyboardEvent | React.FocusEvent\n): event is React.MouseEvent {\n return (event as React.MouseEvent).clientX !== undefined;\n}\n\nexport function isBarTask(task: Task | BarTask): task is BarTask {\n return (task as BarTask).x1 !== undefined;\n}\n\nexport function removeHiddenTasks(tasks: Task[]) {\n const groupedTasks = tasks.filter(\n t => t.hideChildren && t.type === \"project\"\n );\n if (groupedTasks.length > 0) {\n for (let i = 0; groupedTasks.length > i; i++) {\n const groupedTask = groupedTasks[i];\n const children = getChildren(tasks, groupedTask);\n tasks = tasks.filter(t => children.indexOf(t) === -1);\n }\n }\n return tasks;\n}\n\nfunction getChildren(taskList: Task[], task: Task) {\n let tasks: Task[] = [];\n if (task.type !== \"project\") {\n tasks = taskList.filter(\n t =>\n t.dependencies &&\n t.dependencies.map(({ id }) => id).indexOf(task.id) !== -1\n );\n } else {\n tasks = taskList.filter(t => t.project && t.project === task.id);\n }\n var taskChildren: Task[] = [];\n tasks.forEach(t => {\n taskChildren.push(...getChildren(taskList, t));\n });\n tasks = tasks.concat(tasks, taskChildren);\n return tasks;\n}\n\nexport const sortTasks = (taskA: Task, taskB: Task) => {\n const orderA = taskA.displayOrder || Number.MAX_VALUE;\n const orderB = taskB.displayOrder || Number.MAX_VALUE;\n if (orderA > orderB) {\n return 1;\n } else if (orderA < orderB) {\n return -1;\n } else {\n return 0;\n }\n};\n","import React from \"react\";\n// import style from \"./bar.module.css\";\n\ntype BarDisplayProps = {\n x: number;\n y: number;\n type: string;\n startProgressWidth: number;\n endProgressWidth: number;\n width: number;\n height: number;\n isSelected: boolean;\n /* progress start point */\n progressX: number;\n progressWidth: number;\n barCornerRadius: number;\n criticalPathArrows?: Array<{taskId: string, arrowColor: string}>\n segments?: Array<{ x1: number; x2: number }>;\n styles: {\n taskProgressColor?: string;\n backgroundColor: string;\n backgroundSelectedColor: string;\n progressColor: string;\n progressSelectedColor: string;\n criticalPathColor?: string;\n };\n onMouseDown: (event: React.MouseEvent<SVGPolygonElement, MouseEvent>) => void;\n};\nexport const BarDisplay: React.FC<BarDisplayProps> = ({\n x,\n y,\n type,\n width,\n height,\n isSelected,\n progressX,\n progressWidth,\n barCornerRadius,\n styles,\n segments,\n onMouseDown,\n}) => {\n const getProcessColor = () => {\n return isSelected ? styles.progressSelectedColor : styles.progressColor;\n };\n\n const getBarColor = () => {\n return isSelected ? styles.backgroundSelectedColor : styles.backgroundColor;\n };\n\n if (type === \"planned\") {\n if (segments && segments.length > 0) {\n // Multi-segment rendering: one rect per working interval\n const totalWidth = width;\n return (\n <g onMouseDown={onMouseDown}>\n {segments.map((seg, idx) => (\n <rect\n key={`seg-${idx}`}\n x={seg.x1}\n width={seg.x2 - seg.x1}\n y={y}\n height={height}\n ry={barCornerRadius}\n rx={barCornerRadius}\n fill={getBarColor()}\n strokeWidth={2}\n stroke={styles.criticalPathColor}\n />\n ))}\n {/* Progress overlay: distribute progressWidth proportionally */}\n {progressWidth > 0 && (() => {\n const rects: React.ReactNode[] = [];\n let remaining = progressWidth;\n for (const seg of segments) {\n if (remaining <= 0) break;\n const segW = seg.x2 - seg.x1;\n const ratio = totalWidth > 0 ? segW / totalWidth : 0;\n const pw = Math.min(remaining, progressWidth * ratio);\n if (pw > 0) {\n rects.push(\n <rect\n key={`prog-${seg.x1}`}\n x={seg.x1}\n width={pw}\n y={y}\n height={height}\n ry={barCornerRadius}\n rx={barCornerRadius}\n fill={getProcessColor()}\n />\n );\n remaining -= pw;\n }\n }\n return rects;\n })()}\n </g>\n );\n }\n return (\n <g onMouseDown={onMouseDown}>\n <rect\n x={x}\n width={width}\n y={y}\n height={height}\n ry={barCornerRadius}\n rx={barCornerRadius}\n fill={getBarColor()}\n strokeWidth={2}\n stroke={styles.criticalPathColor}\n />\n <rect\n x={progressX}\n width={progressWidth}\n y={y}\n height={height}\n ry={barCornerRadius}\n rx={barCornerRadius}\n fill={getProcessColor()}\n />\n </g>\n );\n } else {\n if (segments && segments.length > 0) {\n return (\n <g onMouseDown={onMouseDown}>\n {segments.map((seg, idx) => (\n <rect\n key={`aseg-${idx}`}\n x={seg.x1}\n width={seg.x2 - seg.x1}\n y={y}\n height={height}\n ry={barCornerRadius}\n rx={barCornerRadius}\n fill={styles.taskProgressColor}\n />\n ))}\n <rect\n x={progressX}\n width={progressWidth}\n y={y}\n height={height}\n ry={barCornerRadius}\n rx={barCornerRadius}\n fill={getProcessColor()}\n />\n </g>\n );\n }\n return (\n <g onMouseDown={onMouseDown}>\n <rect\n x={x}\n width={width}\n y={y}\n height={height}\n ry={barCornerRadius}\n rx={barCornerRadius}\n fill={styles.taskProgressColor}\n />\n <rect\n x={progressX}\n width={progressWidth}\n y={y}\n height={height}\n ry={barCornerRadius}\n rx={barCornerRadius}\n fill={getProcessColor()}\n />\n </g>\n );\n }\n};\n","import React from \"react\";\nimport styles from \"./bar.module.css\";\n\ntype BarDateHandleProps = {\n x: number;\n y: number;\n width: number;\n height: number;\n barCornerRadius: number;\n onMouseDown: (event: React.MouseEvent<SVGRectElement, MouseEvent>) => void;\n};\nexport const BarDateHandle: React.FC<BarDateHandleProps> = ({\n x,\n y,\n width,\n height,\n barCornerRadius,\n onMouseDown,\n}) => {\n return (\n <rect\n x={x}\n y={y}\n width={width}\n height={height}\n className={styles.barHandle}\n ry={barCornerRadius}\n rx={barCornerRadius}\n onMouseDown={onMouseDown}\n />\n );\n};\n","import React from \"react\";\n// import styles from \"./bar.module.css\";\n\ntype BarProgressHandleProps = {\n progressPoint: string;\n onMouseDown: (event: React.MouseEvent<SVGPolygonElement, MouseEvent>) => void;\n};\nexport const BarProgressHandle: React.FC<BarProgressHandleProps> = (\n {\n // progressPoint,\n // onMouseDown,\n }\n) => {\n return (\n <div />\n // <polygon\n // className={styles.barHandle}\n // points={progressPoint}\n // onMouseDown={onMouseDown}\n // />\n );\n};\n","import React from \"react\";\nimport { getProgressPoint } from \"../../../helpers/bar-helper\";\nimport { BarDisplay } from \"./bar-display\";\nimport { BarDateHandle } from \"./bar-date-handle\";\nimport { BarProgressHandle } from \"./bar-progress-handle\";\nimport { TaskItemProps } from \"../task-item\";\nimport styles from \"./bar.module.css\";\n\nexport const Bar: React.FC<TaskItemProps> = ({\n task,\n isProgressChangeable,\n isDateChangeable,\n rtl,\n type,\n onEventStart,\n isSelected,\n}) => {\n const progressPoint = getProgressPoint(\n +!rtl * task.progressWidth + task.progressX,\n task.y,\n task.height\n );\n const handleHeight = task.height / 2 - 1;\n\n // When segments exist (calendar with off-days/holidays), snap handles to the\n // nearest colored-bar boundary so they remain visible and usable even when the\n // task's declared start/end dates fall on off-days.\n const plannedSegs = task.plannedSegments;\n const plannedLeftHandleX = plannedSegs?.length\n ? plannedSegs[0].x1\n : task.x1;\n const plannedRightHandleX = plannedSegs?.length\n ? plannedSegs[plannedSegs.length - 1].x2\n : task.x2;\n\n const actualSegs = task.actualSegments;\n const actualLeftHandleX = actualSegs?.length\n ? actualSegs[0].x1\n : task.actualx1;\n const actualRightHandleX = actualSegs?.length\n ? actualSegs[actualSegs.length - 1].x2\n : task.actualx2;\n\n if (type == \"planned\") {\n if (task?.x1 >= 0 && task?.x2 >= 0 && task.x2 - task.x1 >= 0)\n return (\n <g className={styles.barWrapper} tabIndex={0}>\n {/* Transparent hit area ensures hover stays active across segment gaps */}\n <rect x={task.x1} y={task.y} width={task.x2 - task.x1} height={task.height / 2} fill=\"transparent\" />\n <BarDisplay\n x={task.x1}\n y={task.y}\n type={type as string}\n startProgressWidth={task.progressStartWidth}\n endProgressWidth={task.progressEndWidth}\n width={task.x2 - task.x1}\n height={task.height / 2}\n progressX={task.progressX}\n progressWidth={task.progressWidth}\n barCornerRadius={task.barCornerRadius}\n styles={task.styles}\n isSelected={isSelected}\n segments={task.plannedSegments}\n onMouseDown={e => {\n isDateChangeable && onEventStart(\"move\", task, e, \"planned\");\n }}\n />\n <g className=\"handleGroup\">\n {isDateChangeable && (\n <g>\n {/* left — anchored to first segment so it stays on the colored bar\n even when the declared start date falls on an off-day/holiday */}\n <BarDateHandle\n x={plannedLeftHandleX + 1}\n y={task.y + 1}\n width={task.handleWidth}\n height={handleHeight}\n barCornerRadius={task.barCornerRadius}\n onMouseDown={e => {\n onEventStart(\"start\", task, e, \"planned\");\n }}\n />\n {/* right — anchored to last segment */}\n <BarDateHandle\n x={plannedRightHandleX - task.handleWidth - 1}\n y={task.y + 1}\n width={task.handleWidth}\n height={handleHeight}\n barCornerRadius={task.barCornerRadius}\n onMouseDown={e => {\n onEventStart(\"end\", task, e, \"planned\");\n }}\n />\n </g>\n )}\n {isProgressChangeable && (\n <BarProgressHandle\n progressPoint={progressPoint}\n onMouseDown={e => {\n onEventStart(\"progress\", task, e, \"planned\");\n }}\n />\n )}\n </g>\n </g>\n );\n else return <g className={styles.barWrapper} tabIndex={0}></g>;\n } else if (task?.actualx1 >= 0 && task?.actualx2 >= 0 && task.actualx2 - task.actualx1 >= 0) {\n return (\n <g className={styles.barWrapper} tabIndex={0}>\n {/* Transparent hit area ensures hover stays active across segment gaps */}\n <rect x={task.actualx1} y={task.y + task.height / 2} width={task.actualx2 - task.actualx1} height={task.height / 2} fill=\"transparent\" />\n <BarDisplay\n x={task.actualx1}\n y={task.y + task.height / 2}\n type={type as string}\n startProgressWidth={task.progressStartWidth}\n endProgressWidth={task.progressEndWidth}\n width={task.actualx2 - task.actualx1}\n height={task.height / 2}\n progressX={task.progressX}\n progressWidth={task.progressWidth}\n barCornerRadius={task.barCornerRadius}\n styles={task.styles}\n isSelected={isSelected}\n segments={task.actualSegments}\n onMouseDown={e => {\n isDateChangeable && onEventStart(\"move\", task, e, \"actual\");\n }}\n />\n <g className=\"handleGroup\">\n {isDateChangeable && (\n <g>\n {/* left — anchored to first actual segment */}\n <BarDateHandle\n x={actualLeftHandleX + 1}\n y={task.y + task.height / 2 + 1}\n width={task.handleWidth}\n height={handleHeight}\n barCornerRadius={task.barCornerRadius}\n onMouseDown={e => {\n onEventStart(\"start\", task, e, \"actual\");\n }}\n />\n {/* right — anchored to last actual segment */}\n <BarDateHandle\n x={actualRightHandleX - task.handleWidth - 1}\n y={task.y + task.height / 2 + 1}\n width={task.handleWidth}\n height={handleHeight}\n barCornerRadius={task.barCornerRadius}\n onMouseDown={e => {\n onEventStart(\"end\", task, e, \"actual\");\n }}\n />\n </g>\n )}\n {isProgressChangeable && (\n <BarProgressHandle\n progressPoint={progressPoint}\n onMouseDown={e => {\n onEventStart(\"progress\", task, e, \"actual\");\n }}\n />\n )}\n </g>\n </g>\n );\n } else {\n return <g className={styles.barWrapper} tabIndex={0}></g>;\n }\n};\n","import React from \"react\";\nimport { getProgressPoint } from \"../../../helpers/bar-helper\";\nimport { BarDisplay } from \"./bar-display\";\nimport { BarProgressHandle } from \"./bar-progress-handle\";\nimport { TaskItemProps } from \"../task-item\";\nimport styles from \"./bar.module.css\";\n\nexport const BarSmall: React.FC<TaskItemProps> = ({\n task,\n type,\n isProgressChangeable,\n isDateChangeable,\n onEventStart,\n isSelected,\n}) => {\n const progressPoint = getProgressPoint(\n task.progressWidth + task.x1,\n task.y,\n task.height\n );\n return (\n <g className={styles.barWrapper} tabIndex={0}>\n <BarDisplay\n x={task.x1}\n y={task.y}\n type={type as string}\n // actualX1={task.actualx1}\n // actualX2={task.actualx2}\n startProgressWidth={task.progressStartWidth}\n endProgressWidth={task.progressEndWidth}\n width={task.x2 - task.x1}\n height={task.height}\n progressX={task.progressX}\n progressWidth={task.progressWidth}\n barCornerRadius={task.barCornerRadius}\n styles={task.styles}\n isSelected={isSelected}\n onMouseDown={e => {\n isDateChangeable && onEventStart(\"move\", task, e);\n }}\n />\n <g className=\"handleGroup\">\n {isProgressChangeable && (\n <BarProgressHandle\n progressPoint={progressPoint}\n onMouseDown={e => {\n onEventStart(\"progress\", task, e);\n }}\n />\n )}\n </g>\n </g>\n );\n};\n","import React from \"react\";\nimport { TaskItemProps } from \"../task-item\";\nimport styles from \"./milestone.module.css\";\n\nexport const Milestone: React.FC<TaskItemProps> = ({\n task,\n isDateChangeable,\n onEventStart,\n isSelected,\n}) => {\n const transform = `rotate(45 ${task.x1 + task.height * 0.356} \n ${task.y + task.height * 0.85})`;\n const getBarColor = () => {\n return isSelected\n ? task.styles.backgroundSelectedColor\n : task.styles.backgroundColor;\n };\n\n return (\n <g tabIndex={0} className={styles.milestoneWrapper}>\n <rect\n fill={getBarColor()}\n x={task.x1}\n width={task.height}\n y={task.y}\n height={task.height}\n rx={task.barCornerRadius}\n ry={task.barCornerRadius}\n transform={transform}\n className={styles.milestoneBackground}\n onMouseDown={e => {\n isDateChangeable && onEventStart(\"move\", task, e,\"planned\");\n }}\n onDoubleClick={e => {\n onEventStart(\"dblclick\", task, e);\n }}\n />\n </g>\n );\n};\n","import React from \"react\";\nimport { TaskItemProps } from \"../task-item\";\nimport styles from \"./project.module.css\";\n\nexport const Project: React.FC<TaskItemProps> = ({ task, isSelected }) => {\n const barColor = isSelected\n ? task.styles.backgroundSelectedColor\n : task.styles.backgroundColor;\n const processColor = isSelected\n ? task.styles.progressSelectedColor\n : task.styles.progressColor;\n const projectWith = task.x2 - task.x1;\n\n const projectLeftTriangle = [\n task.x1,\n task.y + task.height / 2 - 1,\n task.x1,\n task.y + task.height,\n task.x1 + 15,\n task.y + task.height / 2 - 1,\n ].join(\",\");\n const projectRightTriangle = [\n task.x2,\n task.y + task.height / 2 - 1,\n task.x2,\n task.y + task.height,\n task.x2 - 15,\n task.y + task.height / 2 - 1,\n ].join(\",\");\n\n return (\n <g tabIndex={0} className={styles.projectWrapper}>\n <rect\n fill={barColor}\n x={task.x1}\n width={projectWith}\n y={task.y}\n height={task.height}\n rx={task.barCornerRadius}\n ry={task.barCornerRadius}\n className={styles.projectBackground}\n />\n <rect\n x={task.progressX}\n width={task.progressWidth}\n y={task.y}\n height={task.height}\n ry={task.barCornerRadius}\n rx={task.barCornerRadius}\n fill={processColor}\n />\n <rect\n fill={barColor}\n x={task.x1}\n width={projectWith}\n y={task.y}\n height={task.height / 2}\n rx={task.barCornerRadius}\n ry={task.barCornerRadius}\n className={styles.projectTop}\n />\n <polygon\n className={styles.projectTop}\n points={projectLeftTriangle}\n fill={barColor}\n />\n <polygon\n className={styles.projectTop}\n points={projectRightTriangle}\n fill={barColor}\n />\n </g>\n );\n};\n","import React, { useEffect, useState } from \"react\";\nimport { BarTask } from \"../../types/bar-task\";\nimport { GanttContentMoveAction } from \"../../types/gantt-task-actions\";\nimport { Bar } from \"./bar/bar\";\nimport { BarSmall } from \"./bar/bar-small\";\nimport { Milestone } from \"./milestone/milestone\";\nimport { Project } from \"./project/project\";\n// import style from \"./task-list.module.css\";\n\nexport type TaskItemProps = {\n task: BarTask;\n arrowIndent: number;\n taskHeight: number;\n isProgressChangeable: boolean;\n isDateChangeable: boolean;\n isDelete: boolean;\n isSelected: boolean;\n rtl: boolean;\n type?: string;\n onEventStart: (\n action: GanttContentMoveAction,\n selectedTask: BarTask,\n event?: React.MouseEvent | React.KeyboardEvent,\n type?: string\n ) => any;\n};\n\nexport const TaskItem: React.FC<TaskItemProps> = props => {\n const {\n task,\n // arrowIndent,\n isDelete,\n // taskHeight,\n isSelected,\n // rtl,\n onEventStart,\n } = {\n ...props,\n };\n // const textRef = useRef<SVGTextElement>(null);\n const [taskItem, setTaskItem] = useState<JSX.Element[]>([<div />]);\n // const [isTextInside, setIsTextInside] = useState(true);\n\n useEffect(() => {\n switch (task.typeInternal) {\n case \"milestone\":\n if (task.x1 >= 0 && task.actualx1 >= 0)\n setTaskItem([<Milestone {...props} />]);\n else setTaskItem([]);\n break;\n case \"project\":\n if (\n task?.x1 >= 0 &&\n task?.x2 >= 0 &&\n task.x2 > task.x1 &&\n task?.actualx1 >= 0 &&\n task?.actualx2 >= 0 &&\n task.actualx2 > task.actualx1\n )\n setTaskItem([<Project {...props} />]);\n else setTaskItem([]);\n break;\n case \"smalltask\":\n setTaskItem([<BarSmall {...props} />]);\n break;\n default:\n {\n let taskItem = [];\n if (task?.x1 >= 0 && task?.x2 >= 0) {\n taskItem.push(<Bar {...props} type={\"planned\"} />);\n }\n if (task?.actualx1 >= 0 && task?.actualx2 >= 0) {\n taskItem.push(<Bar {...props} type={\"actual\"} />);\n }\n setTaskItem(taskItem);\n }\n break;\n }\n }, [task, isSelected]);\n\n // useEffect(() => {\n // if (textRef.current) {\n // setIsTextInside(textRef.current.getBBox().width < task.x2 - task.x1);\n // }\n // }, [textRef, task]);\n\n // const getX = () => {\n // const width = task.x2 - task.x1;\n // const hasChild = task.barChildren.length > 0;\n // if (isTextInside) {\n // return task.x1 + width * 0.5;\n // }\n // if (rtl && textRef.current) {\n // return (\n // task.x1 -\n // textRef.current.getBBox().width -\n // arrowIndent * +hasChild -\n // arrowIndent * 0.2\n // );\n // } else {\n // return task.x1 + width + arrowIndent * +hasChild + arrowIndent * 0.2;\n // }\n // };\n\n return (\n <g>\n <g\n onKeyDown={e => {\n switch (e.key) {\n case \"Delete\": {\n if (isDelete) onEventStart(\"delete\", task, e, \"planned\");\n break;\n }\n }\n e.stopPropagation();\n }}\n onMouseEnter={e => {\n onEventStart(\"mouseenter\", task, e, \"planned\");\n }}\n onMouseLeave={e => {\n onEventStart(\"mouseleave\", task, e, \"planned\");\n }}\n onDoubleClick={e => {\n onEventStart(\"dblclick\", task, e, \"planned\");\n }}\n onClick={e => {\n onEventStart(\"click\", task, e, \"planned\");\n }}\n // onFocus={() => {\n // onEventStart(\"select\", task);\n // }}\n >\n {taskItem[0]}\n </g>\n <g\n onKeyDown={e => {\n switch (e.key) {\n case \"Delete\": {\n if (isDelete) onEventStart(\"delete\", task, e, \"actual\");\n break;\n }\n }\n e.stopPropagation();\n }}\n onMouseEnter={e => {\n onEventStart(\"mouseenter\", task, e, \"actual\");\n }}\n onMouseLeave={e => {\n onEventStart(\"mouseleave\", task, e, \"actual\");\n }}\n onDoubleClick={e => {\n onEventStart(\"dblclick\", task, e, \"actual\");\n }}\n onClick={e => {\n onEventStart(\"click\", task, e, \"actual\");\n }}\n // onFocus={() => {\n // onEventStart(\"select\", task);\n // }}\n >\n {taskItem[1]}\n </g>\n </g>\n );\n};\n","import React, { useEffect, useState } from \"react\";\nimport { VirtualItem } from \"@tanstack/react-virtual\";\nimport { CalendarDefinition, Dependency, EventOption } from \"../../types/public-types\";\nimport { BarTask } from \"../../types/bar-task\";\nimport { Arrow } from \"../other/arrow\";\nimport { handleTaskBySVGMouseEvent, taskXCoordinate } from \"../../helpers/bar-helper\";\nimport { isKeyboardEvent } from \"../../helpers/other-helper\";\nimport { TaskItem } from \"../task-item/task-item\";\nimport {\n BarMoveAction,\n GanttContentMoveAction,\n GanttEvent,\n} from \"../../types/gantt-task-actions\";\nimport { Milestone } from \"../task-item/milestone/milestone\";\nimport { snapToWorkingTime, getWorkingIntervals } from \"../../helpers/calendar-helper\";\nimport { startOfDate, addToDate } from \"../../helpers/date-helper\";\n\nexport type TaskGanttContentProps = {\n tasks: BarTask[];\n dates: Date[];\n ganttEvent: GanttEvent;\n selectedTask: BarTask | undefined;\n rowHeight: number;\n columnWidth: number;\n timeStep: number;\n svg?: React.RefObject<SVGSVGElement>;\n svgWidth: number;\n taskHeight: number;\n arrowColor: string;\n arrowIndent: number;\n fontSize: string;\n fontFamily: string;\n rtl: boolean;\n virtualItems?: VirtualItem[];\n visibleStartY: number;\n visibleEndY: number;\n projectCalendar?: CalendarDefinition;\n setGanttEvent: (value: GanttEvent) => void;\n setFailedTask: (value: BarTask | null) => void;\n setSelectedTask: (taskId: string) => void;\n onBarTasksUpdate?: (task: BarTask) => void;\n sliderTime?: number;\n} & EventOption;\n\nexport const TaskGanttContent: React.FC<TaskGanttContentProps> = ({\n tasks,\n dates,\n ganttEvent,\n selectedTask,\n rowHeight,\n columnWidth,\n timeStep,\n svg,\n taskHeight,\n arrowIndent,\n fontFamily,\n fontSize,\n rtl,\n virtualItems = [],\n setGanttEvent,\n setFailedTask,\n setSelectedTask,\n onBarTasksUpdate,\n onDateChange,\n onProgressChange,\n onDoubleClick,\n onClick,\n onDelete,\n onCalendarError,\n projectCalendar,\n visibleStartY,\n visibleEndY,\n sliderTime,\n}) => {\n const point = svg?.current?.createSVGPoint();\n const [xStep, setXStep] = useState(0);\n const [initEventX1Delta, setInitEventX1Delta] = useState(0);\n const [isMoving, setIsMoving] = useState(false);\n\n // create xStep\n useEffect(() => {\n if (dates.length < 2) {\n // Degenerate single-column range (e.g. lookAhead with start === end):\n // there's no second date to derive the column span from, so assume a\n // one-day column instead of dereferencing dates[1].\n setXStep((timeStep * columnWidth) / 86400000);\n return;\n }\n const dateDelta =\n dates[1].getTime() -\n dates[0].getTime() -\n dates[1].getTimezoneOffset() * 60 * 1000 +\n dates[0].getTimezoneOffset() * 60 * 1000;\n const newXStep = (timeStep * columnWidth) / dateDelta;\n setXStep(newXStep);\n }, [columnWidth, dates, timeStep]);\n\n useEffect(() => {\n const handleMouseMove = async (event: MouseEvent) => {\n if (!ganttEvent.changedTask || !point || !svg?.current) return;\n event.preventDefault();\n\n point.x = event.clientX;\n const cursor = point.matrixTransform(\n svg?.current.getScreenCTM()?.inverse()\n );\n const { isChanged, changedTask } = handleTaskBySVGMouseEvent(\n cursor.x,\n ganttEvent.action as BarMoveAction,\n ganttEvent.changedTask,\n ganttEvent.type as string,\n xStep,\n timeStep,\n initEventX1Delta,\n rtl\n );\n if (isChanged) {\n let finalTask = { ...changedTask };\n const dragType = ganttEvent.type as string;\n if (\n changedTask.calendar &&\n (ganttEvent.action === \"end\" ||\n ganttEvent.action === \"start\" ||\n ganttEvent.action === \"move\")\n ) {\n const cal = finalTask.calendar!;\n if (dragType === \"actual\") {\n // --- Actual bar snapping ---\n if (ganttEvent.action === \"end\") {\n const snapped = snapToWorkingTime(finalTask.actualEnd, cal, \"forward\");\n finalTask.actualEnd = snapped;\n finalTask.actualx2 = taskXCoordinate(snapped, dates, columnWidth);\n } else if (ganttEvent.action === \"start\") {\n const snapped = snapToWorkingTime(finalTask.actualStart, cal, \"forward\");\n finalTask.actualStart = snapped;\n finalTask.actualx1 = taskXCoordinate(snapped, dates, columnWidth);\n } else {\n const snapped = snapToWorkingTime(finalTask.actualStart, cal, \"forward\");\n const delta = snapped.getTime() - finalTask.actualStart.getTime();\n finalTask.actualStart = snapped;\n finalTask.actualEnd = new Date(finalTask.actualEnd.getTime() + delta);\n finalTask.actualx1 = taskXCoordinate(finalTask.actualStart, dates, columnWidth);\n finalTask.actualx2 = taskXCoordinate(finalTask.actualEnd, dates, columnWidth);\n }\n // Recompute actual segments\n const actEnd = addToDate(startOfDate(finalTask.actualEnd, \"day\"), 1, \"day\");\n const actIntervals = getWorkingIntervals(finalTask.actualStart, actEnd, cal);\n const actSegs = actIntervals\n .map(iv => ({ x1: taskXCoordinate(iv.start, dates, columnWidth), x2: taskXCoordinate(iv.end, dates, columnWidth) }))\n .filter(s => s.x2 > s.x1);\n finalTask.actualSegments = actSegs.length > 0 ? actSegs : undefined;\n // Compute actual duration in real time\n const actDays = Math.max(1, Math.round((finalTask.actualEnd.getTime() - finalTask.actualStart.getTime()) / (1000 * 60 * 60 * 24)));\n finalTask.actualDuration = actDays;\n } else {\n // --- Planned bar snapping ---\n if (ganttEvent.action === \"end\") {\n const snapped = snapToWorkingTime(finalTask.end, cal, \"forward\");\n finalTask.end = snapped;\n finalTask.x2 = taskXCoordinate(snapped, dates, columnWidth);\n } else if (ganttEvent.action === \"start\") {\n const snapped = snapToWorkingTime(finalTask.start, cal, \"forward\");\n finalTask.start = snapped;\n finalTask.x1 = taskXCoordinate(snapped, dates, columnWidth);\n } else {\n const snapped = snapToWorkingTime(finalTask.start, cal, \"forward\");\n const delta = snapped.getTime() - finalTask.start.getTime();\n finalTask.start = snapped;\n finalTask.end = new Date(finalTask.end.getTime() + delta);\n finalTask.x1 = taskXCoordinate(finalTask.start, dates, columnWidth);\n finalTask.x2 = taskXCoordinate(finalTask.end, dates, columnWidth);\n }\n // Recompute planned segments\n const planEnd = addToDate(startOfDate(finalTask.end, \"day\"), 1, \"day\");\n const planIntervals = getWorkingIntervals(finalTask.start, planEnd, cal);\n const planSegs = planIntervals\n .map(iv => ({ x1: taskXCoordinate(iv.start, dates, columnWidth), x2: taskXCoordinate(iv.end, dates, columnWidth) }))\n .filter(s => s.x2 > s.x1);\n finalTask.plannedSegments = planSegs.length > 0 ? planSegs : undefined;\n // Compute planned duration in real time\n const planDays = Math.max(1, Math.round((finalTask.end.getTime() - finalTask.start.getTime()) / (1000 * 60 * 60 * 24)));\n finalTask.plannedDuration = planDays;\n }\n } else {\n // No calendar — still compute duration dynamically\n if (dragType === \"actual\") {\n const actDays = Math.max(1, Math.round((finalTask.actualEnd.getTime() - finalTask.actualStart.getTime()) / (1000 * 60 * 60 * 24)));\n finalTask.actualDuration = actDays;\n } else {\n const planDays = Math.max(1, Math.round((finalTask.end.getTime() - finalTask.start.getTime()) / (1000 * 60 * 60 * 24)));\n finalTask.plannedDuration = planDays;\n }\n }\n setGanttEvent({ action: ganttEvent.action, changedTask: finalTask, type: dragType });\n }\n };\n\n const handleMouseUp = async (event: MouseEvent) => {\n const { action, originalSelectedTask, changedTask, type } = ganttEvent;\n if (!changedTask || !point || !svg?.current || !originalSelectedTask)\n return;\n event.preventDefault();\n\n point.x = event.clientX;\n const cursor = point.matrixTransform(\n svg?.current.getScreenCTM()?.inverse()\n );\n const { changedTask: newChangedTask } = handleTaskBySVGMouseEvent(\n cursor.x,\n action as BarMoveAction,\n changedTask,\n type as string,\n xStep,\n timeStep,\n initEventX1Delta,\n rtl\n );\n\n const isNotLikeOriginal =\n originalSelectedTask.start !== newChangedTask.start ||\n originalSelectedTask.end !== newChangedTask.end ||\n originalSelectedTask.actualStart !== newChangedTask.actualStart ||\n originalSelectedTask.actualEnd !== newChangedTask.actualEnd ||\n originalSelectedTask.progress !== newChangedTask.progress;\n\n // Calendar snap: snap to nearest working time based on action direction\n const dropType = type as string;\n if (\n newChangedTask.calendar &&\n (action === \"move\" || action === \"end\" || action === \"start\")\n ) {\n const cal = newChangedTask.calendar;\n if (dropType === \"actual\") {\n // --- Actual bar snapping on drop ---\n if (action === \"end\") {\n const snappedEnd = snapToWorkingTime(newChangedTask.actualEnd, cal, \"forward\");\n newChangedTask.actualEnd = snappedEnd;\n newChangedTask.actualx2 = taskXCoordinate(snappedEnd, dates, columnWidth);\n } else if (action === \"start\") {\n const snappedStart = snapToWorkingTime(newChangedTask.actualStart, cal, \"forward\");\n if (snappedStart >= newChangedTask.actualEnd) {\n setFailedTask(originalSelectedTask);\n onCalendarError?.(newChangedTask, \"No working time in selected range\");\n setGanttEvent({ action: \"\" });\n setIsMoving(false);\n svg.current.removeEventListener(\"mousemove\", handleMouseMove);\n svg.current.removeEventListener(\"mouseup\", handleMouseUp);\n return;\n }\n newChangedTask.actualStart = snappedStart;\n newChangedTask.actualx1 = taskXCoordinate(snappedStart, dates, columnWidth);\n } else {\n const snappedStart = snapToWorkingTime(newChangedTask.actualStart, cal, \"forward\");\n const delta = snappedStart.getTime() - newChangedTask.actualStart.getTime();\n newChangedTask.actualStart = snappedStart;\n newChangedTask.actualEnd = new Date(newChangedTask.actualEnd.getTime() + delta);\n newChangedTask.actualx1 = taskXCoordinate(snappedStart, dates, columnWidth);\n newChangedTask.actualx2 = taskXCoordinate(newChangedTask.actualEnd, dates, columnWidth);\n }\n const actEnd = addToDate(startOfDate(newChangedTask.actualEnd, \"day\"), 1, \"day\");\n const actIntervals = getWorkingIntervals(newChangedTask.actualStart, actEnd, cal);\n const actSegs = actIntervals\n .map(iv => ({ x1: taskXCoordinate(iv.start, dates, columnWidth), x2: taskXCoordinate(iv.end, dates, columnWidth) }))\n .filter(s => s.x2 > s.x1);\n newChangedTask.actualSegments = actSegs.length > 0 ? actSegs : undefined;\n // Compute actual duration\n const actDays = Math.max(1, Math.round((newChangedTask.actualEnd.getTime() - newChangedTask.actualStart.getTime()) / (1000 * 60 * 60 * 24)));\n newChangedTask.actualDuration = actDays;\n } else {\n // --- Planned bar snapping on drop ---\n if (action === \"end\") {\n const snappedEnd = snapToWorkingTime(newChangedTask.end, cal, \"forward\");\n newChangedTask.end = snappedEnd;\n newChangedTask.x2 = taskXCoordinate(snappedEnd, dates, columnWidth);\n } else if (action === \"start\") {\n const snappedStart = snapToWorkingTime(newChangedTask.start, cal, \"forward\");\n if (snappedStart >= newChangedTask.end) {\n setFailedTask(originalSelectedTask);\n onCalendarError?.(newChangedTask, \"No working time in selected range\");\n setGanttEvent({ action: \"\" });\n setIsMoving(false);\n svg.current.removeEventListener(\"mousemove\", handleMouseMove);\n svg.current.removeEventListener(\"mouseup\", handleMouseUp);\n return;\n }\n newChangedTask.start = snappedStart;\n newChangedTask.x1 = taskXCoordinate(snappedStart, dates, columnWidth);\n } else {\n const snappedStart = snapToWorkingTime(newChangedTask.start, cal, \"forward\");\n const delta = snappedStart.getTime() - newChangedTask.start.getTime();\n newChangedTask.start = snappedStart;\n newChangedTask.end = new Date(newChangedTask.end.getTime() + delta);\n newChangedTask.x1 = taskXCoordinate(snappedStart, dates, columnWidth);\n newChangedTask.x2 = taskXCoordinate(newChangedTask.end, dates, columnWidth);\n }\n const planEnd = addToDate(startOfDate(newChangedTask.end, \"day\"), 1, \"day\");\n const planIntervals = getWorkingIntervals(newChangedTask.start, planEnd, cal);\n const planSegs = planIntervals\n .map(iv => ({ x1: taskXCoordinate(iv.start, dates, columnWidth), x2: taskXCoordinate(iv.end, dates, columnWidth) }))\n .filter(s => s.x2 > s.x1);\n newChangedTask.plannedSegments = planSegs.length > 0 ? planSegs : undefined;\n // Compute planned duration\n const planDays = Math.max(1, Math.round((newChangedTask.end.getTime() - newChangedTask.start.getTime()) / (1000 * 60 * 60 * 24)));\n newChangedTask.plannedDuration = planDays;\n }\n } else if (action === \"move\" || action === \"end\" || action === \"start\") {\n // No calendar — still compute duration on drop\n if (dropType === \"actual\") {\n const actDays = Math.max(1, Math.round((newChangedTask.actualEnd.getTime() - newChangedTask.actualStart.getTime()) / (1000 * 60 * 60 * 24)));\n newChangedTask.actualDuration = actDays;\n } else {\n const planDays = Math.max(1, Math.round((newChangedTask.end.getTime() - newChangedTask.start.getTime()) / (1000 * 60 * 60 * 24)));\n newChangedTask.plannedDuration = planDays;\n }\n }\n\n // remove listeners\n svg.current.removeEventListener(\"mousemove\", handleMouseMove);\n svg.current.removeEventListener(\"mouseup\", handleMouseUp);\n\n // Sync barTasks to final drag position BEFORE clearing ganttEvent (prevents reset flash)\n if (onBarTasksUpdate && isNotLikeOriginal) {\n onBarTasksUpdate(newChangedTask);\n }\n setGanttEvent({ action: \"\" });\n setIsMoving(false);\n\n // custom operation start\n let operationSuccess = true;\n if (\n (action === \"move\" || action === \"end\" || action === \"start\") &&\n onDateChange &&\n isNotLikeOriginal\n ) {\n try {\n const result = await onDateChange(\n newChangedTask,\n newChangedTask.barChildren\n );\n if (result !== undefined) {\n operationSuccess = result;\n }\n } catch (error) {\n operationSuccess = false;\n }\n } else if (onProgressChange && isNotLikeOriginal) {\n try {\n const result = await onProgressChange(\n newChangedTask,\n newChangedTask.barChildren\n );\n if (result !== undefined) {\n operationSuccess = result;\n }\n } catch (error) {\n operationSuccess = false;\n }\n }\n\n // If operation is failed - return old state\n if (!operationSuccess) {\n setFailedTask(originalSelectedTask);\n }\n };\n\n if (\n !isMoving &&\n (ganttEvent.action === \"move\" ||\n ganttEvent.action === \"end\" ||\n ganttEvent.action === \"start\" ||\n ganttEvent.action === \"progress\") &&\n svg?.current\n ) {\n svg.current.addEventListener(\"mousemove\", handleMouseMove);\n svg.current.addEventListener(\"mouseup\", handleMouseUp);\n setIsMoving(true);\n }\n }, [\n ganttEvent,\n xStep,\n initEventX1Delta,\n onProgressChange,\n timeStep,\n onDateChange,\n onCalendarError,\n projectCalendar,\n svg,\n isMoving,\n point,\n rtl,\n setFailedTask,\n setGanttEvent,\n onBarTasksUpdate,\n dates,\n columnWidth,\n ]);\n\n /**\n * Entry point for taskbar interaction events\n * (select, delete, drag/move start, click, double-click, hover, etc.).\n */\n const handleBarEventStart = async (\n action: GanttContentMoveAction,\n task: BarTask,\n event?: React.MouseEvent | React.KeyboardEvent,\n type?: string\n ) => {\n if (!event) {\n if (action === \"select\") {\n setSelectedTask(task.id);\n }\n }\n // Keyboard events\n else if (isKeyboardEvent(event)) {\n if (action === \"delete\") {\n if (onDelete) {\n try {\n const result = await onDelete(task);\n if (result !== undefined && result) {\n setGanttEvent({ action, changedTask: task });\n }\n } catch (error) {\n console.error(\"Error on Delete. \" + error);\n }\n }\n }\n }\n // Mouse Events\n else if (action === \"mouseenter\") {\n if (!ganttEvent.action) {\n setGanttEvent({\n action,\n changedTask: task,\n originalSelectedTask: task,\n type: type,\n });\n }\n } else if (action === \"mouseleave\") {\n if (ganttEvent.action === \"mouseenter\") {\n setGanttEvent({ action: \"\" });\n }\n } else if (action === \"dblclick\") {\n !!onDoubleClick && onDoubleClick(task);\n } else if (action === \"click\") {\n !!onClick && onClick(task);\n }\n // Change task event start\n else if (action === \"move\") {\n if (!svg?.current || !point) return;\n point.x = event.clientX;\n const cursor = point.matrixTransform(\n svg.current.getScreenCTM()?.inverse()\n );\n if (type == \"planned\") setInitEventX1Delta(cursor.x - task.x1);\n else if (type == \"actual\") setInitEventX1Delta(cursor.x - task.actualx1);\n setGanttEvent({\n action,\n changedTask: task,\n originalSelectedTask: task,\n type: type,\n });\n } else {\n setGanttEvent({\n action,\n changedTask: task,\n originalSelectedTask: task,\n type: type,\n });\n }\n };\n\n // Indexed once per barTasks change; getArrows runs 3x per render and used to\n // walk every task. Row y is drag-stable, so minY/maxY can be precomputed.\n const arrowIndex = React.useMemo(() => {\n const entries: {\n from: number;\n to: number;\n minY: number;\n maxY: number;\n dependencyType: Dependency;\n }[] = [];\n for (let i = 0; i < tasks.length; i++) {\n const task = tasks[i];\n const yFrom = task.y + taskHeight / 2;\n for (const child of task.barChildren) {\n const taskTo = tasks[child.index];\n if (!taskTo) continue;\n const yTo = taskTo.y + taskHeight / 2;\n entries.push({\n from: i,\n to: child.index,\n minY: Math.min(yFrom, yTo),\n maxY: Math.max(yFrom, yTo),\n dependencyType: child.dependencyType as Dependency,\n });\n }\n }\n return entries;\n }, [tasks, taskHeight]);\n\n const getArrows = (isCritical: boolean, criticalPathType?: string) => {\n const out: JSX.Element[] = [];\n const a = ganttEvent.action;\n const dragging =\n (a === \"move\" || a === \"start\" || a === \"end\" || a === \"progress\") &&\n !!ganttEvent.changedTask;\n\n for (const e of arrowIndex) {\n if (e.maxY < visibleStartY || e.minY > visibleEndY) continue;\n\n const _task = tasks[e.from];\n // Live preview only while actively dragged, not on hover; changedTask.y is 0.\n const task =\n dragging && ganttEvent.changedTask!.id === _task.id\n ? { ...ganttEvent.changedTask!, y: _task.y }\n : _task;\n if (!(task.start.getTime() > 0 && task.end.getTime() > 0)) continue;\n\n const taskTo = tasks[e.to];\n // Both ends need an in-range bar; clamped x-coords would fling the arrow.\n const fromDrawable = task.x2 > task.x1 || task.actualx2 > task.actualx1;\n const toDrawable =\n taskTo.x2 > taskTo.x1 || taskTo.actualx2 > taskTo.actualx1;\n if (!fromDrawable || !toDrawable) continue;\n\n const criticalTask = task.criticalPathArrows?.find(\n arrow =>\n arrow.taskId === taskTo.id &&\n (!!arrow.criticalPathType\n ? arrow.criticalPathType === criticalPathType\n : !criticalPathType)\n );\n\n if (!!criticalTask !== isCritical) continue;\n\n out.push(\n <Arrow\n key={`Arrow from ${task.id} to ${taskTo.id}${\n isCritical ? \"-critical\" : \"\"\n }`}\n taskFrom={task}\n taskTo={taskTo}\n rowHeight={rowHeight}\n dependencyType={e.dependencyType}\n taskHeight={taskHeight}\n arrowIndent={arrowIndent}\n arrowColor={criticalTask?.arrowColor || \"#808080\"}\n />\n );\n }\n return out;\n };\n\n // Calculate x position for the vertical line from sliderTime\n const lineX = sliderTime !== undefined ? taskXCoordinate(new Date(sliderTime), dates, columnWidth) : null;\n const totalHeight = tasks.length * rowHeight;\n\n\n\n\n return (\n <g className=\"content\">\n {/* Vertical blue line for the slider-time marker */}\n {lineX !== null && lineX > 0 && (\n <line\n x1={lineX}\n y1={0}\n x2={lineX}\n y2={totalHeight}\n stroke=\"blue\"\n strokeWidth={2}\n pointerEvents=\"none\"\n opacity={0.8}\n />\n )}\n <g className=\"arrows\">\n {/* Render non-critical arrows first */}\n {getArrows(false)}\n {/* Render secondary critical path arrows on top */}\n {getArrows(true, \"secondary\")}\n {/* Render primary critical path arrows on top */}\n {getArrows(true, \"primary\")}\n </g>\n <g className=\"bar\" fontFamily={fontFamily} fontSize={fontSize}>\n {virtualItems.map(vi => {\n const _task = tasks[vi.index];\n // Use live drag preview for instant smooth updates (1 render/mousemove instead of 2)\n const task =\n ganttEvent.changedTask && ganttEvent.changedTask.id === _task.id\n ? { ...ganttEvent.changedTask, y: 0 }\n : { ..._task, y: 0 };\n if (!task && _task.typeInternal === \"milestone\") {\n return (\n <g key={_task.id} transform={`translate(0, ${vi.start})`}>\n <Milestone\n task={task}\n arrowIndent={arrowIndent}\n taskHeight={taskHeight}\n isProgressChangeable={false}\n isDateChangeable={false}\n isDelete={!_task.isDisabled}\n onEventStart={handleBarEventStart}\n isSelected={!!selectedTask && _task.id === selectedTask.id}\n rtl={rtl}\n />\n </g>\n );\n }\n if (!task) {\n return (\n <g\n key={_task.id}\n transform={`translate(0, ${vi.start})`}\n style={{ height: taskHeight }}\n />\n );\n }\n return (\n <g key={task.id} transform={`translate(0, ${vi.start})`}>\n <TaskItem\n task={task}\n arrowIndent={arrowIndent}\n taskHeight={taskHeight}\n isProgressChangeable={!!onProgressChange && !task.isDisabled}\n isDateChangeable={!!onDateChange && !task.isDisabled}\n isDelete={!task.isDisabled}\n onEventStart={handleBarEventStart}\n isSelected={!!selectedTask && task.id === selectedTask.id}\n rtl={rtl}\n />\n </g>\n );\n })}\n </g>\n </g>\n );\n};\n","import React, { useEffect, useRef } from \"react\";\nimport { useVirtualizer } from \"@tanstack/react-virtual\";\nimport { GridProps, Grid } from \"../grid/grid\";\nimport { CalendarProps, Calendar } from \"../calendar/calendar\";\nimport { TaskGanttContentProps, TaskGanttContent } from \"./task-gantt-content\";\nimport styles from \"./gantt.module.css\";\n\nexport type TaskGanttProps = {\n gridProps: GridProps;\n calendarProps: CalendarProps;\n barProps: TaskGanttContentProps;\n ganttHeight: number;\n scrollY: number;\n scrollX: number;\n};\nexport const TaskGantt: React.FC<TaskGanttProps> = ({\n gridProps,\n calendarProps,\n barProps,\n ganttHeight,\n scrollY,\n scrollX,\n}) => {\n const ganttSVGRef = useRef<SVGSVGElement>(null);\n const horizontalContainerRef = useRef<HTMLDivElement>(null);\n const verticalGanttContainerRef = useRef<HTMLDivElement>(null);\n const newBarProps = { ...barProps, svg: ganttSVGRef, ganttHeight, scrollY };\n\n const buffer = barProps.rowHeight * 10;\n const visibleStartY = scrollY - buffer;\n const visibleEndY = scrollY + ganttHeight + buffer;\n\n const virtualizer = useVirtualizer({\n count: barProps.tasks.length,\n getScrollElement: () => horizontalContainerRef.current,\n estimateSize: () => barProps.rowHeight,\n overscan: 10\n });\n\n useEffect(() => {\n if (horizontalContainerRef.current) {\n horizontalContainerRef.current.scrollTop = scrollY;\n }\n }, [scrollY]);\n\n useEffect(() => {\n if (verticalGanttContainerRef.current) {\n verticalGanttContainerRef.current.scrollLeft = scrollX;\n }\n }, [scrollX]);\n\n return (\n <div\n className={styles.ganttVerticalContainer}\n ref={verticalGanttContainerRef}\n dir=\"ltr\"\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={gridProps.svgWidth}\n height={calendarProps.headerHeight}\n fontFamily={barProps.fontFamily}\n >\n <Calendar {...calendarProps} />\n </svg>\n <div\n ref={horizontalContainerRef}\n className={styles.horizontalContainer}\n style={\n ganttHeight\n ? { height: ganttHeight, width: gridProps.svgWidth }\n : { width: gridProps.svgWidth }\n }\n >\n <svg\n xmlns=\"http://www.w3.org/2000/svg\"\n width={gridProps.svgWidth}\n height={virtualizer.getTotalSize()}\n fontFamily={barProps.fontFamily}\n ref={ganttSVGRef}\n >\n <Grid\n {...gridProps}\n virtualItems={virtualizer.getVirtualItems()}\n visibleStartY={visibleStartY}\n visibleEndY={visibleEndY}\n />\n <TaskGanttContent\n {...newBarProps}\n visibleStartY={visibleStartY}\n visibleEndY={visibleEndY}\n virtualItems={virtualizer.getVirtualItems()}\n />\n </svg>\n </div>\n </div>\n );\n};\n","import React, { SyntheticEvent, useRef, useEffect } from \"react\";\nimport styles from \"./horizontal-scroll.module.css\";\n\nexport const HorizontalScroll: React.FC<{\n scroll: number;\n svgWidth: number;\n taskListWidth: number;\n rtl: boolean;\n onScroll: (event: SyntheticEvent<HTMLDivElement>) => void;\n}> = ({ scroll, svgWidth, taskListWidth, rtl, onScroll }) => {\n const scrollRef = useRef<HTMLDivElement>(null);\n\n useEffect(() => {\n if (scrollRef.current) {\n scrollRef.current.scrollLeft = scroll;\n }\n }, [scroll]);\n\n return (\n <div\n dir=\"ltr\"\n style={{\n margin: rtl\n ? `0px ${taskListWidth}px 0px 0px`\n : `0px 0px 0px ${taskListWidth}px`,\n }}\n className={styles.scrollWrapper}\n onScroll={onScroll}\n ref={scrollRef}\n >\n <div style={{ width: svgWidth }} className={styles.scroll} />\n </div>\n );\n};\n","import React, {\n useState,\n SyntheticEvent,\n useRef,\n useEffect,\n useMemo,\n} from \"react\";\nimport { ViewMode, GanttProps, Task } from \"../../types/public-types\";\nimport { GridProps } from \"../grid/grid\";\nimport {\n ganttDateRange,\n seedDates,\n VIEW_MODE_DEFAULT_VISIBLE_COUNT,\n VIEW_MODE_MAX_VISIBLE_COUNT,\n} from \"../../helpers/date-helper\";\nimport { CalendarProps } from \"../calendar/calendar\";\nimport { TaskGanttContentProps } from \"./task-gantt-content\";\nimport { TaskListHeaderDefault } from \"../task-list/task-list-header\";\nimport { TaskListTableDefault } from \"../task-list/task-list-table\";\nimport { StandardTooltipContent, Tooltip } from \"../other/tooltip\";\nimport { VerticalScroll } from \"../other/vertical-scroll\";\nimport { TaskListProps, TaskList } from \"../task-list/task-list\";\nimport { TaskGantt } from \"./task-gantt\";\nimport { BarTask } from \"../../types/bar-task\";\nimport { convertToBarTasks } from \"../../helpers/bar-helper\";\nimport { GanttEvent } from \"../../types/gantt-task-actions\";\nimport { DateSetup } from \"../../types/date-setup\";\nimport { HorizontalScroll } from \"../other/horizontal-scroll\";\nimport hScrollStyles from \"../other/horizontal-scroll.module.css\";\nimport { removeHiddenTasks, sortTasks } from \"../../helpers/other-helper\";\nimport styles from \"./gantt.module.css\";\n\n// Minimum share of the wrapper width reserved for the Gantt chart. The task-list\n// table is capped at the remaining width; past that the table scrolls horizontally\n// instead of shrinking the chart below this floor.\nconst GANTT_MIN_WIDTH_RATIO = 0.4;\n// Width (px) of the column-resize divider rendered between the table and chart.\nconst TABLE_GANTT_DIVIDER_WIDTH = 20;\n\nexport const Gantt: React.FunctionComponent<GanttProps> = ({\n tasks,\n primaryPath,\n secondaryPath,\n leafTasks = [],\n scheduleType = \"main\",\n startDate = new Date(),\n endDate = new Date(),\n headerHeight = 50,\n columnWidth: columnWidthProp,\n listCellWidth = \"155px\",\n rowHeight = 50,\n ganttHeight = 0,\n viewMode = ViewMode.Day,\n preStepsCount = 1,\n locale = \"en-US\",\n barFill = 60,\n barCornerRadius = 3,\n barProgressColor = \"#a3a3ff\",\n barProgressSelectedColor = \"#8282f5\",\n barBackgroundColor = \"#b8c2cc\",\n barBackgroundSelectedColor = \"#aeb8c2\",\n projectProgressColor = \"#7db59a\",\n projectProgressSelectedColor = \"#59a985\",\n projectBackgroundColor = \"#fac465\",\n projectBackgroundSelectedColor = \"#f7bb53\",\n milestoneBackgroundColor = \"#f1c453\",\n milestoneBackgroundSelectedColor = \"#f29e4c\",\n rtl = false,\n handleWidth = 8,\n timeStep = 300000,\n arrowColor = \"grey\",\n fontFamily = \"Arial, Roboto, Oxygen, Ubuntu, Cantarell, Fira Sans, Droid Sans, Helvetica Neue\",\n fontSize = \"14px\",\n arrowIndent = 20,\n todayColor = \"rgba(252, 248, 227, 0.5)\",\n weekendColor = \"#e6e4e4\",\n viewDate,\n TooltipContent = StandardTooltipContent,\n TaskListHeader = TaskListHeaderDefault,\n TaskListTable = TaskListTableDefault,\n onDateChange,\n onProgressChange,\n onDoubleClick,\n onClick,\n onDelete,\n onSelect,\n onExpanderClick,\n onMultiSelect,\n taskLabelRenderer,\n delayToRender = 500,\n shouldNotShowLoadingOverlay=true,\n projectCalendar,\n onCalendarError,\n sliderTime,\n}) => {\n // console.debug(\"child\", tasks.length);\n const wrapperRef = useRef<HTMLDivElement>(null);\n const taskListRef = useRef<HTMLDivElement>(null);\n const isDraggingTable = useRef(false);\n // True once the user has dragged the resize bar — after that, columnWidth\n // is locked so pane resizing grows the visible count instead of fattening cols.\n const userResizedRef = useRef(false);\n const dragStartX = useRef(0);\n const dragStartWidth = useRef(0);\n const dragMaxWidth = useRef<number>(Infinity);\n const [tableContainerWidth, setTableContainerWidth] = useState<number | null>(null);\n const tableInnerScrollRef = useRef<HTMLDivElement>(null);\n const tableHorizontalContainerRef = useRef<HTMLDivElement>(null);\n const tableHScrollRef = useRef<HTMLDivElement>(null);\n // True total width of the table's columns, reported up by TaskList. Drives both\n // the table width cap (no white space) and the horizontal scrollbar extent.\n const [tableContentWidth, setTableContentWidth] = useState(0);\n const [dateSetup, setDateSetup] = useState<DateSetup>(() => {\n const [startDateRange, endDateRange] = tasks ? ganttDateRange(\n tasks,\n viewMode,\n preStepsCount\n ) : [new Date(), new Date()];\n if (scheduleType === \"lookAhead\") {\n return { viewMode, dates: seedDates(startDate, endDate, viewMode) };\n }\n return {\n viewMode,\n dates: seedDates(startDateRange, endDateRange, viewMode),\n };\n });\n const [currentViewDate, setCurrentViewDate] = useState<Date | undefined>(\n undefined\n );\n\n const [taskListWidth, setTaskListWidth] = useState(0);\n const [wrapperWidth, setWrapperWidth] = useState(0);\n\n // Cap the table at the wrapper width minus the chart's reserved minimum share\n // (and the resize divider). Infinity until the wrapper has been measured.\n const maxTableWidth =\n wrapperWidth > 0\n ? Math.max(\n 100,\n wrapperWidth * (1 - GANTT_MIN_WIDTH_RATIO) - TABLE_GANTT_DIVIDER_WIDTH\n )\n : Infinity;\n\n // The table may never be wider than its columns (no white space past the last\n // column) nor wider than maxTableWidth (chart keeps its 40% floor).\n const tableCap = Math.min(\n maxTableWidth,\n tableContentWidth > 0 ? tableContentWidth : Infinity\n );\n\n const handleTableResizeMouseDown = (e: React.MouseEvent) => {\n isDraggingTable.current = true;\n userResizedRef.current = true;\n dragStartX.current = e.clientX;\n dragStartWidth.current = tableContainerWidth ?? (taskListRef.current?.offsetWidth ?? 0);\n // Never let a drag exceed the columns' total width or shrink the chart below\n // its floor — both captured by tableCap.\n dragMaxWidth.current = tableCap;\n e.preventDefault();\n };\n\n useEffect(() => {\n const onMouseMove = (e: MouseEvent) => {\n if (!isDraggingTable.current) return;\n const newWidth = Math.min(dragMaxWidth.current, Math.max(100, dragStartWidth.current + (e.clientX - dragStartX.current)));\n setTableContainerWidth(newWidth);\n setTaskListWidth(newWidth);\n };\n const onMouseUp = () => {\n isDraggingTable.current = false;\n };\n document.addEventListener(\"mousemove\", onMouseMove);\n document.addEventListener(\"mouseup\", onMouseUp);\n return () => {\n document.removeEventListener(\"mousemove\", onMouseMove);\n document.removeEventListener(\"mouseup\", onMouseUp);\n };\n }, []);\n const [svgContainerWidth, setSvgContainerWidth] = useState(0);\n const [svgContainerHeight, setSvgContainerHeight] = useState(ganttHeight);\n const [barTasks, setBarTasks] = useState<BarTask[]>([]);\n const debounceRef = useRef<NodeJS.Timeout | null>(null);\n const [ganttEvent, setGanttEvent] = useState<GanttEvent>({\n action: \"\",\n });\n\n // Directly update a single bar task — called from TaskGanttContent on drag end\n // to sync barTasks to the final drag position before ganttEvent is cleared\n const handleBarTasksUpdate = (task: BarTask) => {\n setBarTasks(prev => prev.map(t => (t.id === task.id ? task : t)));\n };\n const taskHeight = useMemo(\n () => (rowHeight * barFill) / 100,\n [rowHeight, barFill]\n );\n\n const [selectedTask, setSelectedTask] = useState<BarTask>();\n const [failedTask, setFailedTask] = useState<BarTask | null>(null);\n\n // Auto-size columns per view-mode so the spec'd default count fits the\n // current chart pane. Keep re-snapping against svgContainerWidth while the\n // initial layout settles; once the user drags the resize bar (or the view\n // mode is settled), stop re-snapping so pane resizing grows the visible\n // count instead of fattening the columns.\n const [computedColumnWidth, setComputedColumnWidth] = useState<number | null>(null);\n const computedForViewModeRef = useRef<ViewMode | null>(null);\n useEffect(() => {\n if (columnWidthProp != null) return;\n if (svgContainerWidth <= 0) return;\n const minVisible = VIEW_MODE_DEFAULT_VISIBLE_COUNT[viewMode];\n if (!minVisible) return;\n const maxVisible = VIEW_MODE_MAX_VISIBLE_COUNT[viewMode];\n\n // View switch: carry the *relative* zoom across the switch instead of\n // snapping to whichever edge the carried-over width violates. Measure where\n // the previous view's visible count sat within its own [default..max] band\n // (t in [0,1]) and remap that same fraction onto the new view's band, then\n // convert the target visible count back to a column width. e.g. a Month view\n // sitting halfway between its default and max maps to a Day view sitting\n // halfway between its default and max. Mark it user-resized so the settling\n // branch below doesn't re-snap it back to the default count on the next render.\n const prevViewMode = computedForViewModeRef.current;\n if (\n prevViewMode != null &&\n prevViewMode !== viewMode &&\n computedColumnWidth != null\n ) {\n const visible = svgContainerWidth / computedColumnWidth;\n const oldMin = VIEW_MODE_DEFAULT_VISIBLE_COUNT[prevViewMode];\n const oldMax = VIEW_MODE_MAX_VISIBLE_COUNT[prevViewMode];\n\n let next = computedColumnWidth;\n if (maxVisible && oldMin != null && oldMax != null && oldMax > oldMin) {\n // Fraction through the old band: 0 = at its default count, 1 = at its max.\n const t = Math.min(1, Math.max(0, (visible - oldMin) / (oldMax - oldMin)));\n const targetVisible = minVisible + t * (maxVisible - minVisible);\n next = Math.floor(svgContainerWidth / targetVisible);\n } else if (visible < minVisible) {\n // Fallback (old view has no band): snap to the violated edge.\n next = Math.floor(svgContainerWidth / minVisible);\n } else if (maxVisible && visible > maxVisible) {\n next = Math.ceil(svgContainerWidth / maxVisible);\n }\n next = Math.max(20, next);\n computedForViewModeRef.current = viewMode;\n userResizedRef.current = true;\n if (next !== computedColumnWidth) {\n setComputedColumnWidth(next);\n }\n return;\n }\n\n // First computation / same-view settling: auto-size columns so the default\n // count fits, until the user drags the resize bar.\n const alreadySnappedForView =\n computedForViewModeRef.current === viewMode && computedColumnWidth != null;\n if (userResizedRef.current && alreadySnappedForView) return;\n const next = Math.max(20, Math.floor(svgContainerWidth / minVisible));\n computedForViewModeRef.current = viewMode;\n if (next !== computedColumnWidth) {\n setComputedColumnWidth(next);\n }\n }, [viewMode, svgContainerWidth, columnWidthProp, computedColumnWidth]);\n const columnWidth = columnWidthProp ?? computedColumnWidth ?? 60;\n\n // effectiveColumnWidth has two modes:\n // 1. Consumer supplied columnWidth → keep legacy fill-viewport stretch so\n // content never leaves a gap on the right edge.\n // 2. Library-computed columnWidth → enforce the per-mode max-visible cap\n // by lifting column width when the pane is wider than (max * columnWidth),\n // so visible count never exceeds VIEW_MODE_MAX_VISIBLE_COUNT.\n // Math.ceil keeps svgWidth >= svgContainerWidth so there is no pixel gap on the right edge\n const effectiveColumnWidth = useMemo(() => {\n if (svgContainerWidth <= 0 || dateSetup.dates.length <= 0) return columnWidth;\n if (columnWidthProp == null) {\n const maxVisible = VIEW_MODE_MAX_VISIBLE_COUNT[viewMode];\n if (maxVisible) {\n return Math.max(columnWidth, Math.ceil(svgContainerWidth / maxVisible));\n }\n return columnWidth;\n }\n return Math.max(columnWidth, Math.ceil(svgContainerWidth / dateSetup.dates.length));\n }, [columnWidth, columnWidthProp, viewMode, svgContainerWidth, dateSetup.dates.length]);\n\n const svgWidth =\n effectiveColumnWidth < 55\n ? (dateSetup.dates.length + 0.5) * effectiveColumnWidth\n : dateSetup.dates.length * effectiveColumnWidth;\n const ganttFullHeight = useMemo(() => barTasks.length * rowHeight, [barTasks.length, rowHeight]);\n\n const [scrollY, setScrollY] = useState(0);\n const [scrollX, setScrollX] = useState(-1);\n const [ignoreScrollEvent, setIgnoreScrollEvent] = useState(false);\n const [lastTouchX, setLastTouchX] = useState(0);\n const [lastTouchY, setLastTouchY] = useState(0);\n const [isProcessing, setIsProcessing] = useState(false);\n\n const buffer = rowHeight * 10;\n const visibleStartY = scrollY - buffer;\n const visibleEndY = scrollY + ganttHeight + buffer;\n useEffect(() => {\n if (scheduleType === \"lookAhead\" && startDate && endDate) {\n setDateSetup({\n viewMode,\n dates: seedDates(startDate, endDate, viewMode),\n });\n }\n }, [startDate, endDate]);\n // task change events\n useEffect(() => {\n if (debounceRef.current) {\n clearTimeout(debounceRef.current);\n }\n if(!shouldNotShowLoadingOverlay){ \n setIsProcessing(true);\n }\n debounceRef.current = setTimeout(() => {\n let filteredTasks: Task[];\n // if (onExpanderClick) {\n\n filteredTasks = removeHiddenTasks(tasks);\n filteredTasks = filteredTasks.sort(sortTasks);\n const [startDateRange, endDateRange] = ganttDateRange(\n filteredTasks,\n viewMode,\n preStepsCount,\n projectCalendar?.quarter_start ?? 0\n );\n let newDates = seedDates(startDateRange, endDateRange, viewMode);\n if (scheduleType === \"lookAhead\") {\n newDates = seedDates(startDate, endDate, viewMode);\n }\n if (rtl) {\n newDates = newDates.reverse();\n if (scrollX === -1) {\n setScrollX(newDates.length * effectiveColumnWidth);\n }\n }\n if (scheduleType !== \"lookAhead\") {\n setDateSetup({\n dates: seedDates(startDateRange, endDateRange, viewMode),\n viewMode,\n });\n }\n\n // // This is now handled by backend\n // let [primaryPath, secondaryPath] = getCriticalPaths(leafTasks);\n\n // Color the paths.\n // uncolorAll(tasks);\n uncolorAll(tasks);\n if (scheduleType !== \"lookAhead\") {\n // colorPath(secondaryPath, \"#00ff00\", tasks, \"secondary\");\n // colorPath(primaryPath, \"#ff0000\", tasks, \"primary\");\n colorPath(secondaryPath, \"#00ff00\", tasks, \"secondary\");\n colorPath(primaryPath, \"#ff0000\", tasks, \"primary\");\n }\n setBarTasks(\n convertToBarTasks(\n filteredTasks,\n newDates,\n effectiveColumnWidth,\n rowHeight,\n taskHeight,\n barCornerRadius,\n handleWidth,\n rtl,\n barProgressColor,\n barProgressSelectedColor,\n barBackgroundColor,\n barBackgroundSelectedColor,\n projectProgressColor,\n projectProgressSelectedColor,\n projectBackgroundColor,\n projectBackgroundSelectedColor,\n milestoneBackgroundColor,\n milestoneBackgroundSelectedColor\n )\n );\n setIsProcessing(false);\n }, delayToRender);\n }, [\n // tasks,\n tasks,\n viewMode,\n preStepsCount,\n rowHeight,\n barCornerRadius,\n taskHeight,\n handleWidth,\n barProgressColor,\n barProgressSelectedColor,\n barBackgroundColor,\n barBackgroundSelectedColor,\n projectProgressColor,\n projectProgressSelectedColor,\n projectBackgroundColor,\n projectBackgroundSelectedColor,\n milestoneBackgroundColor,\n milestoneBackgroundSelectedColor,\n rtl,\n shouldNotShowLoadingOverlay,\n effectiveColumnWidth,\n projectCalendar,\n ]);\n // clear the pending debounce timer on unmount\n useEffect(() => {\n return () => {\n clearTimeout(debounceRef.current!);\n };\n }, []);\n\n useEffect(() => {\n if (\n viewMode === dateSetup.viewMode &&\n ((viewDate && !currentViewDate) ||\n (viewDate && currentViewDate?.valueOf() !== viewDate.valueOf()))\n ) {\n const dates = dateSetup.dates;\n const index = dates.findIndex(\n (d, i) =>\n viewDate.valueOf() >= d.valueOf() &&\n i + 1 !== dates.length &&\n viewDate.valueOf() < dates[i + 1].valueOf()\n );\n if (index === -1) {\n return;\n }\n setCurrentViewDate(viewDate);\n setScrollX(effectiveColumnWidth * index);\n }\n }, [\n viewDate,\n effectiveColumnWidth,\n dateSetup.dates,\n dateSetup.viewMode,\n viewMode,\n currentViewDate,\n setCurrentViewDate,\n ]);\n\n useEffect(() => {\n const { changedTask, action } = ganttEvent;\n if (changedTask) {\n if (action === \"delete\") {\n setGanttEvent({ action: \"\" });\n setBarTasks(barTasks.filter(t => t.id !== changedTask.id));\n }\n // \"move\" / \"start\" / \"end\" / \"progress\": barTasks is updated on drag end\n // via onBarTasksUpdate callback (called from TaskGanttContent handleMouseUp).\n // During drag, task-gantt-content renders directly from ganttEvent.changedTask\n // for instant real-time updates without the extra render cycle.\n }\n }, [ganttEvent, barTasks]);\n\n useEffect(() => {\n if (failedTask) {\n setBarTasks(barTasks.map(t => (t.id !== failedTask.id ? t : failedTask)));\n setFailedTask(null);\n }\n }, [failedTask, barTasks]);\n\n useEffect(() => {\n if (!listCellWidth) {\n setTaskListWidth(0);\n }\n if (taskListRef.current) {\n setTaskListWidth(taskListRef.current.offsetWidth);\n }\n }, [taskListRef, listCellWidth]);\n\n // Keep the chart offset in sync when the task list's rendered width changes —\n // e.g. after a per-column resize. The effects above only re-run on listCellWidth,\n // so without this a column resize would leave svgContainerWidth stale. (The\n // scrollbar extent comes from tableContentWidth, reported by TaskList.)\n useEffect(() => {\n if (!listCellWidth || !taskListRef.current) return;\n if (typeof ResizeObserver === \"undefined\") return;\n const measure = () => {\n if (taskListRef.current) {\n setTaskListWidth(taskListRef.current.offsetWidth);\n }\n };\n const observer = new ResizeObserver(measure);\n observer.observe(taskListRef.current);\n measure();\n return () => observer.disconnect();\n }, [listCellWidth, scheduleType]);\n\n useEffect(() => {\n if (wrapperRef.current) {\n // Subtract the 20px column-resize divider so the gantt SVG fills the remaining space exactly\n setSvgContainerWidth(wrapperRef.current.offsetWidth - taskListWidth - 20);\n }\n }, [wrapperRef, taskListWidth, wrapperWidth]);\n\n // Track the wrapper's own width so the table cap (maxTableWidth) follows window\n // / container resizes, not just task-list changes.\n useEffect(() => {\n const node = wrapperRef.current;\n if (!node) return;\n if (typeof ResizeObserver === \"undefined\") {\n setWrapperWidth(node.offsetWidth);\n return;\n }\n const measure = () => setWrapperWidth(node.offsetWidth);\n const observer = new ResizeObserver(measure);\n observer.observe(node);\n measure();\n return () => observer.disconnect();\n }, []);\n\n useEffect(() => {\n if (ganttHeight) {\n setSvgContainerHeight(ganttHeight + headerHeight);\n } else {\n // setSvgContainerHeight(tasks.length * rowHeight + headerHeight);\n setSvgContainerHeight(tasks.length * rowHeight + headerHeight);\n }\n // }, [ganttHeight, tasks, headerHeight, rowHeight]);\n }, [ganttHeight, tasks, headerHeight, rowHeight]);\n\n // scroll events\n useEffect(() => {\n const handleWheel = (event: WheelEvent) => {\n if (event.shiftKey || event.deltaX) {\n const scrollMove = event.deltaX ? event.deltaX : event.deltaY;\n let newScrollX = scrollX + scrollMove;\n if (newScrollX < 0) {\n newScrollX = 0;\n } else if (newScrollX > svgWidth) {\n newScrollX = svgWidth;\n }\n setScrollX(newScrollX);\n event.preventDefault();\n } else if (ganttHeight) {\n let newScrollY = scrollY + event.deltaY;\n if (newScrollY < 0) {\n newScrollY = 0;\n } else if (newScrollY > ganttFullHeight - ganttHeight) {\n newScrollY = ganttFullHeight - ganttHeight;\n }\n if (newScrollY !== scrollY) {\n setScrollY(newScrollY);\n event.preventDefault();\n }\n }\n\n setIgnoreScrollEvent(true);\n };\n\n const handleLogTouch = (event: TouchEvent) => {\n if (event) {\n setLastTouchX(event.changedTouches[0].pageX);\n setLastTouchY(event.changedTouches[0].pageY);\n }\n };\n\n const handleTouch = (event: TouchEvent) => {\n if (event.changedTouches[0].pageX || event.changedTouches[0].pageY) {\n let deltaX = event.changedTouches[0].pageX - lastTouchX;\n let deltaY = event.changedTouches[0].pageY - lastTouchY;\n\n // if (lastTouchX > 0 && lastTouchY > 0) {\n if (Math.abs(deltaX) > Math.abs(deltaY)) {\n let newScrollX = scrollX - deltaX / 3;\n if (newScrollX > 0 && newScrollX < 1600) {\n setScrollX(newScrollX);\n } else if (newScrollX < 0) {\n setScrollX(0);\n } else {\n setScrollX(1600);\n }\n } else {\n let newScrollY = scrollY - deltaY;\n if (newScrollY > 0 && newScrollY < 1600) {\n setScrollY(newScrollY);\n } else if (newScrollY < 0) {\n setScrollY(0);\n } else {\n setScrollY(1600);\n }\n }\n // }\n\n setLastTouchX(event.changedTouches[0].pageX);\n setLastTouchY(event.changedTouches[0].pageY);\n }\n\n // if (event.changedTouches[0].pageX) {\n // const scrollMove = event.changedTouches[0].pageX ? event.changedTouches[0].pageX : event.changedTouches[0].pageY;\n // let newScrollX = scrollX + scrollMove;\n // if (newScrollX < 0) {\n // newScrollX = 0;\n // } else if (newScrollX > svgWidth) {\n // newScrollX = svgWidth;\n // }\n // setScrollX(newScrollX);\n // event.preventDefault();\n // } else if (ganttHeight) {\n // let newScrollY = scrollY + event.changedTouches[0].pageY;\n // if (newScrollY < 0) {\n // newScrollY = 0;\n // } else if (newScrollY > ganttFullHeight - ganttHeight) {\n // newScrollY = ganttFullHeight - ganttHeight;\n // }\n // if (newScrollY !== scrollY) {\n // setScrollY(newScrollY);\n // event.preventDefault();\n // }\n // }\n\n setIgnoreScrollEvent(true);\n };\n\n // subscribe if scroll is necessary\n wrapperRef.current?.addEventListener(\"wheel\", handleWheel, {\n passive: false,\n });\n wrapperRef.current?.addEventListener(\"touchmove\", handleTouch, {\n passive: false,\n });\n wrapperRef.current?.addEventListener(\"touchstart\", handleLogTouch, {\n passive: false,\n });\n wrapperRef.current?.addEventListener(\"touchend\", handleLogTouch, {\n passive: false,\n });\n return () => {\n wrapperRef.current?.removeEventListener(\"wheel\", handleWheel);\n wrapperRef.current?.removeEventListener(\"touchmove\", handleTouch);\n wrapperRef.current?.removeEventListener(\"touchend\", handleLogTouch);\n wrapperRef.current?.removeEventListener(\"touchend\", handleLogTouch);\n };\n }, [\n wrapperRef,\n scrollY,\n scrollX,\n ganttHeight,\n svgWidth,\n rtl,\n ganttFullHeight,\n ]);\n\n const handleScrollY = (event: SyntheticEvent<HTMLDivElement>) => {\n if (scrollY !== event.currentTarget.scrollTop && !ignoreScrollEvent) {\n setScrollY(event.currentTarget.scrollTop);\n setIgnoreScrollEvent(true);\n } else {\n setIgnoreScrollEvent(false);\n }\n };\n\n const handleScrollX = (event: SyntheticEvent<HTMLDivElement>) => {\n if (scrollX !== event.currentTarget.scrollLeft && !ignoreScrollEvent) {\n setScrollX(event.currentTarget.scrollLeft);\n setIgnoreScrollEvent(true);\n } else {\n setIgnoreScrollEvent(false);\n }\n };\n\n\n /**\n * Handles arrow keys events and transform it to new scroll\n */\n const handleKeyDown = (event: React.KeyboardEvent<HTMLDivElement>) => {\n event.preventDefault();\n let newScrollY = scrollY;\n let newScrollX = scrollX;\n let isX = true;\n switch (event.key) {\n case \"Down\": // IE/Edge specific value\n case \"ArrowDown\":\n newScrollY += rowHeight;\n isX = false;\n break;\n case \"Up\": // IE/Edge specific value\n case \"ArrowUp\":\n newScrollY -= rowHeight;\n isX = false;\n break;\n case \"Left\":\n case \"ArrowLeft\":\n newScrollX -= effectiveColumnWidth;\n break;\n case \"Right\": // IE/Edge specific value\n case \"ArrowRight\":\n newScrollX += effectiveColumnWidth;\n break;\n }\n if (isX) {\n if (newScrollX < 0) {\n newScrollX = 0;\n } else if (newScrollX > svgWidth) {\n newScrollX = svgWidth;\n }\n setScrollX(newScrollX);\n } else {\n if (newScrollY < 0) {\n newScrollY = 0;\n } else if (newScrollY > ganttFullHeight - ganttHeight) {\n newScrollY = ganttFullHeight - ganttHeight;\n }\n setScrollY(newScrollY);\n }\n setIgnoreScrollEvent(true);\n };\n\n /**\n * Task select event\n */\n const handleSelectedTask = (taskId: string) => {\n const newSelectedTask = barTasks.find(t => t.id === taskId);\n const oldSelectedTask = barTasks.find(\n t => !!selectedTask && t.id === selectedTask.id\n );\n if (onSelect) {\n if (oldSelectedTask) {\n onSelect(oldSelectedTask, false);\n }\n if (newSelectedTask) {\n onSelect(newSelectedTask, true);\n }\n }\n setSelectedTask(newSelectedTask);\n };\n const handleExpanderClick = (task: Task) => {\n if (onExpanderClick && task.hideChildren !== undefined) {\n onExpanderClick({ ...task, hideChildren: !task.hideChildren });\n }\n };\n const gridProps: GridProps = {\n columnWidth: effectiveColumnWidth,\n svgWidth,\n tasks: tasks,\n scheduleType: scheduleType,\n rowHeight,\n dates: dateSetup.dates,\n todayColor,\n weekendColor,\n rtl,\n visibleStartY,\n visibleEndY,\n projectCalendar,\n viewMode,\n };\n const calendarProps: CalendarProps = {\n dateSetup,\n locale,\n viewMode,\n headerHeight,\n columnWidth: effectiveColumnWidth,\n fontFamily,\n fontSize,\n rtl,\n projectCalendar,\n weekendColor,\n };\n const barProps: TaskGanttContentProps = {\n tasks: barTasks,\n dates: dateSetup.dates,\n ganttEvent,\n selectedTask,\n rowHeight,\n taskHeight,\n columnWidth: effectiveColumnWidth,\n arrowColor,\n timeStep,\n fontFamily,\n fontSize,\n arrowIndent,\n svgWidth,\n rtl,\n setGanttEvent,\n setFailedTask,\n setSelectedTask: handleSelectedTask,\n onBarTasksUpdate: handleBarTasksUpdate,\n onDateChange,\n onProgressChange,\n onDoubleClick,\n onClick,\n onDelete,\n onCalendarError,\n projectCalendar,\n visibleStartY,\n visibleEndY,\n sliderTime,\n };\n\n const tableTasks = useMemo(() => {\n return ganttEvent.changedTask\n ? barTasks.map(t => (t.id === ganttEvent.changedTask!.id ? ganttEvent.changedTask! : t))\n : barTasks;\n }, [barTasks, ganttEvent.changedTask]);\n\n const tableProps: TaskListProps = {\n rowHeight,\n rowWidth: listCellWidth,\n fontFamily,\n fontSize,\n tasks: tableTasks,\n leafTasks,\n scheduleType,\n locale,\n headerHeight,\n scrollY,\n ganttHeight,\n horizontalContainerClass: styles.horizontalContainer,\n selectedTask,\n taskListRef,\n setSelectedTask: handleSelectedTask,\n onExpanderClick: handleExpanderClick,\n onDoubleClick,\n TaskListHeader,\n TaskListTable,\n taskLabelRenderer,\n onMultiSelect,\n // Only pin a fixed width once the user has dragged the divider; otherwise let\n // the table size to its content under the cap. tableCap bounds both at the\n // columns' total width (no white space) and the 40% Gantt floor.\n containerWidth:\n userResizedRef.current && tableContainerWidth != null\n ? Math.min(tableContainerWidth, tableCap)\n : undefined,\n containerMaxWidth: tableCap === Infinity ? undefined : tableCap,\n onContentWidthChange: setTableContentWidth,\n innerScrollRef: tableInnerScrollRef,\n horizontalContainerRef: tableHorizontalContainerRef,\n };\n\n return (\n <div style={{ position: \"relative\" }}>\n <div\n className={styles.wrapper}\n onKeyDown={handleKeyDown}\n tabIndex={0}\n ref={wrapperRef}\n >\n {listCellWidth && <TaskList {...tableProps} />}\n {listCellWidth && scheduleType === \"main\" && (\n <div\n style={{\n width: \"20px\",\n cursor: \"col-resize\",\n backgroundColor: \"#e0e0e0\",\n flexShrink: 0,\n zIndex: 1,\n alignSelf: \"stretch\",\n display: \"flex\",\n alignItems: \"center\",\n justifyContent: \"center\",\n userSelect: \"none\",\n fontSize: \"10px\",\n color: \"#666\",\n letterSpacing: \"-1px\",\n }}\n onMouseDown={handleTableResizeMouseDown}\n >\n &#9668;|&#9658;\n </div>\n )}\n <TaskGantt\n gridProps={gridProps}\n calendarProps={calendarProps}\n barProps={barProps}\n ganttHeight={ganttHeight}\n scrollY={scrollY}\n scrollX={scrollX}\n />\n {ganttEvent.changedTask && (\n <Tooltip\n arrowIndent={arrowIndent}\n rowHeight={rowHeight}\n svgContainerHeight={svgContainerHeight}\n svgContainerWidth={svgContainerWidth}\n fontFamily={fontFamily}\n fontSize={fontSize}\n scrollX={scrollX}\n scrollY={scrollY}\n task={ganttEvent.changedTask}\n type={ganttEvent.type as string}\n headerHeight={headerHeight}\n taskListWidth={taskListWidth}\n TooltipContent={TooltipContent}\n rtl={rtl}\n svgWidth={svgWidth}\n isDragging={\n ganttEvent.action === \"move\" ||\n ganttEvent.action === \"start\" ||\n ganttEvent.action === \"end\" ||\n ganttEvent.action === \"progress\"\n }\n />\n )}\n <VerticalScroll\n ganttFullHeight={ganttFullHeight}\n ganttHeight={ganttHeight}\n headerHeight={headerHeight}\n scroll={scrollY}\n onScroll={handleScrollY}\n rtl={rtl}\n />\n </div>\n {isProcessing && (\n <div\n style={{\n position: \"absolute\",\n top: 0,\n left: 0,\n right: 0,\n bottom: 0,\n backgroundColor: \"rgba(255, 255, 255, 0.95)\",\n display: \"flex\",\n justifyContent: \"center\",\n alignItems: \"center\",\n gap: \"20px\",\n zIndex: 9999,\n pointerEvents: \"none\", // ← allows scrolling & interaction underneath!\n borderRadius: \"8px\",\n }}\n >\n <span\n style={{\n fontSize: \"24px\",\n fontWeight: \"600\",\n color: \"#cc0404\",\n fontFamily: \"Arial, sans-serif\",\n }}\n >\n Loading...\n </span>\n <div className={styles.spinner} />\n </div>\n )}\n <div style={{ display: \"flex\" }}>\n {listCellWidth && (\n <div\n ref={tableHScrollRef}\n className={hScrollStyles.scrollWrapper}\n style={{ width: taskListWidth + 4, flexShrink: 0 }}\n onScroll={(e: SyntheticEvent<HTMLDivElement>) => {\n if (tableHorizontalContainerRef.current) {\n tableHorizontalContainerRef.current.scrollLeft = e.currentTarget.scrollLeft;\n }\n }}\n >\n <div style={{ width: tableContentWidth }} />\n </div>\n )}\n <div style={{ flex: 1, minWidth: 0 }}>\n <HorizontalScroll\n svgWidth={svgWidth}\n taskListWidth={0}\n scroll={scrollX}\n rtl={rtl}\n onScroll={handleScrollX}\n />\n </div>\n </div>\n </div>\n );\n}\n\n// This is based on the visit function from https://en.wikipedia.org/wiki/Topological_sorting#Depth-first_search\nexport function topologicalOrderingHelper(\n taskID: string,\n taskMap: {},\n sortedTaskList: string[]\n) {\n if (!taskMap[taskID]) return true; // dependency pointed to an ID not present in leafTasks. ignore the dependency\n if (taskMap[taskID].finished) return true;\n if (taskMap[taskID].started) {\n console.log(\"Cycle involving \" + taskID);\n return false; // Error: dependencies made a cycle\n }\n\n taskMap[taskID].started = true;\n\n let task: Task = taskMap[taskID].task;\n if (task.dependencies)\n for (let i = 0; i < task.dependencies.length; i++) {\n let successVal = topologicalOrderingHelper(\n task.dependencies[i].id,\n taskMap,\n sortedTaskList\n );\n if (!successVal) return false; // Error: an error came from deeper recursive call\n }\n\n taskMap[taskID].finished = true;\n\n sortedTaskList.push(taskID);\n return true;\n}\nexport function getCriticalPaths(leafTasks: Task[]) {\n // Exclude tasks that must not sit on a critical path:\n // - Milestones: zero-duration markers, not work; they also frequently have an\n // unset (date-0) start that injects a bogus multi-decade span.\n // - Phantom tasks with no real schedule: a zero-length bar whose start sits at\n // the epoch (date 0 = unset). As a predecessor of a long successor they\n // inherit its full span with no overlap to cancel it, falsely dominating.\n // Bars still render from `tasks`; this only excludes them from path computation.\n leafTasks = leafTasks.filter(\n t =>\n t.type !== \"milestone\" &&\n (t.start.getTime() !== 0 || t.end.getTime() !== 0)\n );\n\n // Map ids to tasks for faster access.\n // O(n) space, O(n) time to add all from list, O(1) time for each access.\n let taskMap = {};\n for (let i = 0; i < leafTasks.length; i++)\n taskMap[leafTasks[i].id] = { task: leafTasks[i] };\n\n // Sort the tasks so each dependent is listed after its dependencies.\n // O(num vertices + num edges)\n let sortedTaskList: string[] = [];\n for (let i = 0; i < leafTasks.length; i++) {\n let successVal = topologicalOrderingHelper(\n leafTasks[i].id,\n taskMap,\n sortedTaskList\n );\n if (!successVal) return [[], []]; // Abort: there was a cycle\n }\n\n // Map tasks to their dependents for faster access.\n // Dependencies are already easy enough to access, but not dependents.\n // O(num vertices + num edges)\n for (let i = 0; i < leafTasks.length; i++)\n taskMap[leafTasks[i].id].dependents = [];\n for (let i = 0; i < leafTasks.length; i++) {\n let task = leafTasks[i];\n if (task.dependencies)\n for (let j = 0; j < task.dependencies.length; j++)\n taskMap[task.dependencies[j].id]?.dependents.push(task.id);\n }\n\n // Compute critical paths, in reverse order to handle dependents before dependencies.\n // O(num vertices + num edges)\n for (let i = sortedTaskList?.length - 1; i >= 0; i--)\n computeCriticalPath(sortedTaskList[i], taskMap);\n\n // Now each task has a list of all possible paths and their lengths\n // We want to combine and sort all these entries so we can trace any number\n // of critical paths by following the best available chain\n // O(num tasks)\n let taskChainList = [];\n for (let i = 0; i < sortedTaskList?.length; i++) {\n for (let j = 0; j < taskMap[sortedTaskList[i]].paths.length; j++) {\n taskChainList.push(taskMap[sortedTaskList[i]].paths[j]);\n }\n }\n\n // const printedList = taskChainList.map((elem) => {\n // const newElem = { ...elem };\n // newElem.duration = Math.round(elem.duration / 86400000);\n // return newElem;\n // })\n\n // console.debug(printedList);\n\n if (taskChainList.length > 0) {\n\n // Sort by duration (descending)\n // O(n log n)\n taskChainList.sort((a, b) => b.duration - a.duration);\n console.debug(taskChainList);\n\n // Select the best next option to build the best path\n let primaryLeaf = taskChainList[0].parent;\n let primaryPath = [];\n\n while (primaryLeaf !== undefined) {\n\n // Add this task to the primary path\n primaryPath.push(taskMap[primaryLeaf].task);\n\n // If this task has no dependents, it is a leaf and the primary path ends here\n if (taskMap[primaryLeaf].paths.length === 0) {\n primaryLeaf = undefined;\n break;\n }\n\n // Check all of this task's paths and select longest duration as next\n let primaryDuration = taskMap[primaryLeaf].paths[0].duration;\n let nextPath = taskMap[primaryLeaf].paths[0];\n for (let i = 1; i < taskMap[primaryLeaf].paths.length; i++) {\n let newDuration = taskMap[primaryLeaf].paths[i].duration;\n if (newDuration > primaryDuration) {\n nextPath = taskMap[primaryLeaf].paths[i]\n primaryDuration = newDuration;\n }\n }\n\n // Disqualify this path from being selected by second best path.\n nextPath.visited = true;\n\n // Follow this path down to the next task\n primaryLeaf = nextPath.task;\n\n }\n\n\n // Select the best next option from the unvisited tasks to build the second best path\n let secondaryLeaf = taskChainList[0].parent;\n\n for (let i = 0; i < taskChainList.length; i++) {\n if (!taskChainList[i].visited) {\n secondaryLeaf = taskChainList[i].parent;\n break;\n }\n }\n\n let secondaryPath = [];\n\n while (secondaryLeaf !== undefined) {\n\n // Add this task to the secondary path\n secondaryPath.push(taskMap[secondaryLeaf].task);\n\n // If this task has no dependents, it is a leaf and the secondary path ends here\n if (taskMap[secondaryLeaf].paths.length === 0) {\n secondaryLeaf = undefined;\n break;\n }\n\n // Check all of this task's paths and select longest duration as next\n let secondaryDuration = taskMap[secondaryLeaf].paths[0].duration;\n let nextPath = taskMap[secondaryLeaf].paths[0];\n\n // If default path has already been visited, discredit it\n if (nextPath.visited) secondaryDuration = 0;\n\n for (let i = 1; i < taskMap[secondaryLeaf].paths.length; i++) {\n let newDuration = taskMap[secondaryLeaf].paths[i].duration;\n // Extra check here to ensure path has not already been used\n if (newDuration > secondaryDuration && !taskMap[secondaryLeaf].paths[i].visited) {\n nextPath = taskMap[secondaryLeaf].paths[i]\n secondaryDuration = newDuration;\n }\n }\n\n // If path we ended up with has already been visited, this task is a leaf node\n if (nextPath.visited) {\n break;\n }\n\n // Disqualify this path from being selected by third best path.\n nextPath.visited = true;\n\n // Follow this path down to the next task\n secondaryLeaf = nextPath.task;\n\n }\n\n console.debug(\"Primary \", primaryPath);\n console.debug(\"Secondary \", secondaryPath);\n\n return [primaryPath, secondaryPath];\n }\n\n return [[], []];\n}\n\n// Function used to calculate the off time (combination of off days and holidays) for a given task in the task map\nfunction getOffTime(tIndex: string, taskMap: {}, start: number, end: number) {\n\n // Figure out which weeks the task starts and ends on using some unix timestamp math\n // Convert time from milliseconds to days, add 4 to get to first sunday (0 represents a Thursday in unix time), then floor divide by 0 to get the week number\n let startWeek = Math.floor(((start / 86400000) + 4) / 7);\n let endWeek = Math.floor(((end / 86400000) + 4) / 7);\n let offTime: number[] = [];\n\n // Get off time for each child. If task has no calendar, off time is naturally 0\n if (taskMap[tIndex].task.calendar) {\n\n // Off Day Calculation\n if (taskMap[tIndex].task.calendar.off_days && taskMap[tIndex].task.calendar.off_days.length) {\n for (let d = 0; d < taskMap[tIndex].task.calendar.off_days.length || 0; d++) {\n for (let w = startWeek; w <= endWeek; w++) {\n let dayOfTheWeek = taskMap[tIndex].task.calendar.off_days[d];\n // Check each week to see if an off day is within duration\n // Notice this is the inverse operation of the milliseconds to week operation performed above\n let offDay = 86400000 * ((7 * w - 4) + dayOfTheWeek);\n // If so (and time isn't part of overlap with parent, which will be accounted for later), ...\n if (offDay >= start && offDay <= end) {\n // ...mark a day's worth of time to be subtracted from total duration\n // console.debug(\"off_day\", tIndex, dayOfTheWeek, offDay);\n offTime.push(offDay);\n }\n }\n }\n }\n\n // Holiday Calculation\n if (taskMap[tIndex].task.calendar.holidays && taskMap[tIndex].task.calendar.holidays.length) {\n // console.debug(taskMap[tindex].task.calendar.holidays);\n for (let h = 0; h < taskMap[tIndex].task.calendar.holidays.length || 0; h++) {\n // Check each holiday to see if it is within duration\n let holiday = taskMap[tIndex].task.calendar.holidays[h];\n let holiday_timestamp = new Date(holiday).getTime()\n // If so (and time isn't part of overlap with parent, which will be accounted for later), ...\n if (holiday_timestamp >= start && holiday_timestamp <= end) {\n // ...mark a day's worth of time to be subtracted from total duration\n // console.debug(\"holiday\", tIndex, holiday, holiday_timestamp);\n offTime.push(holiday_timestamp);\n }\n }\n }\n }\n\n // offTime will be returned as an array of timestamps\n // This is so we can compare the exact off days of multiple tasks to identify and remove any overlap\n // If we didn't do this, overlapping off days would be counted twice\n return offTime;\n}\n\nexport function computeCriticalPath(taskID: string, taskMap: {}) {\n let task: Task = taskMap[taskID].task;\n let dependents = taskMap[taskID].dependents;\n\n taskMap[taskID].start = task.start.getTime();\n taskMap[taskID].end = task.end.getTime();\n taskMap[taskID].paths = []; // Each task will track length of all dep paths\n\n // Get offtime of parent task\n let parent_off_time = getOffTime(taskID, taskMap, taskMap[taskID].start, taskMap[taskID].end);\n\n // console.debug(taskID, taskMap[taskID].start, taskMap[taskID].end, parent_off_time.length, (taskMap[taskID].end - taskMap[taskID].start - (parent_off_time.length * 86400000)) / 86400000);\n\n // Iterate through all the dependents of the current task\n for (let j = 0; j < dependents.length; j++) {\n\n let depStart = taskMap[dependents[j]].task.start.getTime();\n let depEnd = taskMap[dependents[j]].task.end.getTime();\n\n // Get the duration and off time of the dep task\n let depDuration = depEnd - depStart;\n let child_off_time = getOffTime(dependents[j], taskMap, depStart, depEnd);\n\n // console.debug(dependents[j], depStart, depEnd, child_off_time.length, (depDuration - (child_off_time.length * 86400000)) / 86400000);\n\n // subtracting any overlap in duration days between parent and child\n let overlap = Math.max((taskMap[taskID].end - depStart), 0);\n\n // subtracting any overlap in off time days between parent and child\n // we'll use the parent task's list as the source of truth\n for (let t = 0; t < parent_off_time.length; t++) {\n if (child_off_time.includes(parent_off_time[t])) {\n parent_off_time.splice(t, 1);\n t -= 1;\n }\n }\n\n let offTime = parent_off_time.length + child_off_time.length;\n\n // console.debug(taskID, dependents[j], offTime, parent_off_time, child_off_time);\n\n // Inherit all paths known by dep task, adding this task's length to the tracked lengths\n let paths = taskMap[dependents[j]].paths;\n if (paths && paths.length) {\n for (let k = 0; k < paths.length; k++) {\n\n // To address potential overlap in off time, only consider the parent's off time. \n // This is why we spliced from its list instead of the child's list earlier\n let totalDuration = taskMap[taskID].end - taskMap[taskID].start - overlap - (parent_off_time.length * 86400000) + paths[k].duration\n\n // console.debug(taskID, dependents[j], totalDuration / 86400000, (taskMap[taskID].end - taskMap[taskID].start) / 86400000, overlap / 86400000, parent_off_time.length, paths[k].duration / 86400000);\n\n // For performance reasons, each path list only keeps track of its two longest path and discards all others\n // If we want to consider more than just primary and secondary paths in the future, this code can easily be expanded\n if (taskMap[taskID].paths.length < 2) {\n taskMap[taskID].paths.push({\n duration: totalDuration,\n task: dependents[j],\n parent: taskID,\n visited: false\n });\n // This logic is formatted to guarantee paths remain auto-sorted\n } else if (totalDuration > taskMap[taskID].paths[0].duration) {\n taskMap[taskID].paths[0].duration = totalDuration;\n taskMap[taskID].paths[0].task = dependents[j];\n taskMap[taskID].paths[0].parent = taskID;\n taskMap[taskID].paths[0].visited = false;\n } else if (totalDuration > taskMap[taskID].paths[1].duration) {\n taskMap[taskID].paths[1].duration = totalDuration;\n taskMap[taskID].paths[1].task = dependents[j];\n taskMap[taskID].paths[1].parent = taskID;\n taskMap[taskID].paths[1].visited = false;\n }\n\n }\n } else {\n // Dep has no paths of its own (it's a terminal leaf) → seed an immediate\n // child path ending at this dep.\n let immediateChildDuration = taskMap[taskID].end - taskMap[taskID].start + depDuration - overlap - (offTime * 86400000);\n\n // console.debug(taskID, dependents[j], immediateChildDuration / 86400000, (taskMap[taskID].end - taskMap[taskID].start) / 86400000, depDuration / 86400000, overlap / 86400000, offTime);\n\n // Create a new path that ends at the immediate dep task\n // For performance reasons, each path list only keeps track of its two longest path and discards all others\n // If we want to consider more than just primary and secondary paths in the future, this code can easily be expanded\n if (taskMap[taskID].paths.length < 2) {\n taskMap[taskID].paths.push({\n duration: immediateChildDuration,\n task: dependents[j],\n parent: taskID,\n visited: false\n });\n // This logic is formatted to guarantee paths remain auto-sorted\n } else if (immediateChildDuration > taskMap[taskID].paths[0].duration) {\n taskMap[taskID].paths[0].duration = immediateChildDuration;\n taskMap[taskID].paths[0].task = dependents[j];\n taskMap[taskID].paths[0].parent = taskID;\n taskMap[taskID].paths[0].visited = false;\n } else if (immediateChildDuration > taskMap[taskID].paths[1].duration) {\n taskMap[taskID].paths[1].duration = immediateChildDuration;\n taskMap[taskID].paths[1].task = dependents[j];\n taskMap[taskID].paths[1].parent = taskID;\n taskMap[taskID].paths[1].visited = false;\n }\n }\n }\n}\n\nexport function uncolorAll(tasks: Task[]) {\n tasks.forEach(task => {\n if (task.styles) delete task.styles.criticalPathColor;\n delete task.criticalPathArrows;\n });\n}\n\nexport function colorPath(path: Task[], color: string, tasks: Task[],criticalPathType: string) {\n const byId = new Map<string, Task>();\n for (const task of tasks) byId.set(task.id, task);\n\n // Nearest ancestor by walking wbs segments, rather than scanning every task.\n const nearest = (id: string) => {\n const exact = byId.get(id);\n if (exact) return exact;\n for (let cut = id.lastIndexOf(\".\"); cut > 0; cut = id.lastIndexOf(\".\", cut - 1)) {\n const ancestor = byId.get(id.slice(0, cut));\n if (ancestor) return ancestor;\n }\n return undefined;\n };\n\n // Color boxes\n for (let i = 0; i < path.length; i++) {\n const longestTask = nearest(path[i].id);\n if (longestTask) {\n let styles = longestTask.styles ?? {};\n styles.criticalPathColor = color;\n longestTask.styles = styles;\n }\n }\n // Color arrows\n for (let i = 0; i + 1 < path.length; i++) {\n // Items in the critical paths came from leafTasks, but we need to change the versions from tasks instead.\n const taskFromTasks = byId.get(path[i].id);\n if (taskFromTasks) {\n let arrows = taskFromTasks.criticalPathArrows;\n // Create the arrows list if it does not exist.\n if (!arrows) arrows = [];\n // If the arrow is already colored, replace its color in the list.\n let arrow = arrows.find(arrow => arrow.taskId === path[i + 1].id);\n if (arrow) {\n arrow.arrowColor = color;\n arrow.criticalPathType = criticalPathType;\n }\n // Else, add the new colored arrow to the list.\n else arrows.push({ taskId: path[i + 1].id, arrowColor: color, criticalPathType: criticalPathType });\n taskFromTasks.criticalPathArrows = arrows;\n }\n }\n}\nexport const getParentWbs = (wbs: string): string | undefined => {\n const segments = wbs.split('.');\n if (segments.length <= 1) return undefined; // Top-level task has no parent\n return segments.slice(0, -1).join('.'); // Remove last segment\n};\n"],"names":["ViewMode","intlDTCache","getCachedDateTimeFormat","locString","opts","key","JSON","stringify","dtf","Intl","DateTimeFormat","addToDate","date","quantity","scale","newDate","Date","getFullYear","getMonth","getDate","getHours","getMinutes","getSeconds","getMilliseconds","startOfDate","scores","shouldReset","_scale","maxScore","indexOf","getFiscalQuarterStartDate","quarterStart","month","offset","qStartMonth","Math","floor","year","VIEW_MODE_DEFAULT_VISIBLE_COUNT","Day","Week","Month","Quarter","VIEW_MODE_MAX_VISIBLE_COUNT","ganttDateRange","tasks","viewMode","preStepsCount","newStartDate","start","getTime","newEndDate","end","task","actualStart","actualEnd","Year","endQStart","getMonday","QuarterDay","HalfDay","Hour","seedDates","startDate","endDate","currentDate","dates","push","getLocalDayOfWeek","locale","format","bottomValue","weekday","replace","toLocaleUpperCase","day","getDay","diff","setDate","TaskListHeaderDefault","headerHeight","fontFamily","fontSize","rowWidth","scheduleType","allSelected","onSelectAll","columnWidths","onColumnResize","widthOf","colId","factor","parseInt","startResize","startWidth","e","preventDefault","stopPropagation","startX","clientX","onMove","ev","onUp","document","removeEventListener","addEventListener","cell","content","title","resizable","width","React","className","styles","ganttTable_HeaderItem","style","minWidth","maxWidth","position","ganttTable_HeaderItemText","ganttTable_HeaderResizeHandle","height","onMouseDown","ganttTable","ganttTable_Header","type","checked","onChange","target","Fragment","localeDateStringCache","toLocaleDateStringFactory","dateTimeOptions","toString","lds","toLocaleDateString","TaskListTableDefault","rowHeight","leafTasks","onExpanderClick","selectedTasks","onTaskSelect","taskLabelRenderer","t","name","virtualItems","useMemo","leafTaskIds","Set","map","id","hasSelectedAncestor","taskId","selectedSet","allTasks","find","parentWbs","getParentWbs","has","itemsToRender","_","index","size","lane","measureElement","taskListWrapper","vi","expanderSymbol","hideChildren","isSelected","includes","isAncestorSelected","top","left","transform","taskListMilestoneRow","taskListLookAheadRow","taskListTableRow","taskListCell","taskListText","display","justifyContent","alignItems","paddingLeft","paddingRight","disabled","taskListNameWrapper","depth","taskListExpander","onClick","taskListExpanderPlaceholder","now","color","optionalId","percentComplete","progress","plannedDuration","remainingDuration","max","round","actualDuration","endRef","ceil","durationType","Tooltip","rtl","svgContainerHeight","svgContainerWidth","scrollX","scrollY","arrowIndent","taskListWidth","TooltipContent","isDragging","tooltipRef","useRef","useState","relatedY","setRelatedY","relatedX","setRelatedX","useEffect","current","tooltipHeight","offsetHeight","tooltipWidth","offsetWidth","newRelatedY","newRelatedX","x1","x2","tooltipLeftmostPoint","actualx2","fullChartWidth","actualx1","tooltipLowerPoint","ref","tooltipDetailsContainer","tooltipDetailsContainerHidden","getOffTime","taskStart","taskEnd","_message","startWeek","endWeek","offTime","calendar","off_days","length","d","w","dayOfTheWeek","offDay","holidays","h","holiday","holiday_timestamp","StandardTooltipContent","computedPlannedDuration","computedActualDuration","tooltipDefaultContainer","tooltipDefaultContainerParagraph","VerticalScroll","scroll","ganttHeight","ganttFullHeight","onScroll","scrollRef","scrollTop","marginTop","marginLeft","marginRight","getTaskListColumns","hasCheckbox","columns","MIN_COLUMN_WIDTH","buildDefaultColumnWidths","base","widths","col","TaskList","selectedTask","setSelectedTask","taskListRef","horizontalContainerClass","TaskListHeader","TaskListTable","onMultiSelect","containerWidth","containerMaxWidth","onContentWidthChange","innerScrollRef","externalHorizontalContainerRef","horizontalContainerRef","internalHorizontalContainerRef","headerScrollRef","rowsEl","scrollLeft","setSelectedTasks","setColumnWidths","defaults","prev","ids","Object","keys","sameSet","every","next","handleColumnResize","contentWidth","values","reduce","sum","pendingTaskSelect","setPendingTaskSelect","prevSelectedTasksRef","expandedTasks","taskIndex","byId","Map","childrenOf","roots","forEach","set","parent","undefined","siblings","get","sameIds","a","b","i","virtualizer","useVirtualizer","count","getScrollElement","estimateSize","overscan","selected","filter","newSelected","recursiveOpen","descendants","getDescendants","add","Array","from","newSelectedArray","out","stack","reverse","pop","children","handleTaskSelect","handleSelectAll","headerProps","selectedTaskId","tableProps","getVirtualItems","overflow","flexShrink","hideScrollbar","overflowX","getTotalSize","parseTimeToMinutes","parts","split","Number","toDateString","y","m","String","padStart","isHoliday","cal","isOffDay","parsedShiftsCache","WeakMap","offDayCache","parsedShifts","shifts","s","isOffDayCached","perCal","off","NO_SHIFTS","getShiftsForDay","getWorkingIntervals","intervals","cursor","setHours","shift","shiftStart","shiftEnd","intervalStart","intervalEnd","snapToWorkingTime","direction","MAX_DAYS","result","attempt","dayStart","currentMins","getQuarterNumber","GridBody","svgWidth","columnWidth","todayColor","weekendColor","visibleStartY","visibleEndY","projectCalendar","visibleHeight","items","isDayOff","isTodayColumn","step","todayRects","offDayRects","weekStartDay","week_start","x","fill","pEnd","periodMs","ds","de","startFrac","endFrac","min","rw","isDayView","isWeekView","tickLines","tickClass","gridTick","gridTickWeekStart","gridTickDashed","y1","y2","rowBackgrounds","rowLines","rowOverlays","gridRowLine","showPerRowOffDays","isMilestone","rowClass","darkerGridRow","gridRowLookAhead","gridRow","rowEven","rowFill","Grid","props","TopPartOfCalendar","value","x1Line","y1Line","y2Line","xText","yText","textAnchor","textAnchorClass","textAnchorStart","textAnchorMiddle","textAnchorEnd","calendarTopTick","calendarTopText","Calendar","dateSetup","shortMonth","toLocaleString","getCalendarValuesForYear","topValues","bottomValues","topDefaultHeight","calendarBottomText","topValue","getCalendarValuesForQuarter","quarter_start","rowH","qNum","monthDate","span","j","getCalendarValuesForMonth","prevDate","prevQNum","isNewQuarter","getCalendarValuesForWeek","weeksCount","getCalendarValuesForDay","isWeekStart","calendarTickSolid","calendarTickDashed","getCalendarValuesForPartOfDay","ticks","hour","getCalendarValuesForHour","displayDate","topPosition","extraValues","r","calendarHeader","Arrow","taskFrom","taskTo","taskHeight","arrowColor","dependencyType","drawPathAndTriangle","path","trianglePoints","strokeWidth","stroke","points","indexCompare","taskToEndY","verticalOffset","minX","plannedSegments","p","actualSegments","candidates","maxX","fromPoint","toPoint","arrowPoints","right","convertToBarTasks","barCornerRadius","handleWidth","barProgressColor","barProgressSelectedColor","barBackgroundColor","barBackgroundSelectedColor","projectProgressColor","projectProgressSelectedColor","projectBackgroundColor","projectBackgroundSelectedColor","milestoneBackgroundColor","milestoneBackgroundSelectedColor","barTasks","convertToBarTask","indexById","dependencies","dependence","barchild","barChildren","barTask","convertToMilestone","convertToBar","progressStartWidth","progressEndWidth","taskXCoordinateRTL","taskXCoordinate","abs","typeInternal","progressWithByParams","progressWidth","progressX","taskYCoordinate","planEnd","segs","iv","actEnd","backgroundColor","backgroundSelectedColor","progressColor","progressSelectedColor","rotatedHeight","dateTimesCache","getDateTimes","times","xDate","lo","hi","mid","remainderMillis","percentOfInterval","taskX1","taskX2","getProgressPoint","taskY","point","join","startByX","xStep","steps","additionalXValue","newX","startByActualX","endByX","endByActualX","moveByX","newX1","newX2","moveByActualX","dateByX","taskX","taskDate","timeStep","getTimezoneOffset","handleTaskBySVGMouseEvent","svgX","action","initEventX1Delta","handleTaskBySVGMouseEventForMilestone","handleTaskBySVGMouseEventForBar","changedTask","isChanged","newMoveX1","newMoveX2","isKeyboardEvent","event","removeHiddenTasks","groupedTasks","groupedTask","getChildren","taskList","project","taskChildren","concat","sortTasks","taskA","taskB","orderA","displayOrder","MAX_VALUE","orderB","BarDisplay","segments","getProcessColor","getBarColor","totalWidth","seg","idx","ry","rx","criticalPathColor","rects","remaining","segW","ratio","pw","taskProgressColor","BarDateHandle","barHandle","BarProgressHandle","Bar","isProgressChangeable","isDateChangeable","onEventStart","progressPoint","handleHeight","plannedSegs","plannedLeftHandleX","plannedRightHandleX","actualSegs","actualLeftHandleX","actualRightHandleX","barWrapper","tabIndex","startProgressWidth","endProgressWidth","BarSmall","Milestone","milestoneWrapper","milestoneBackground","onDoubleClick","Project","barColor","processColor","projectWith","projectLeftTriangle","projectRightTriangle","projectWrapper","projectBackground","projectTop","TaskItem","isDelete","taskItem","setTaskItem","onKeyDown","onMouseEnter","onMouseLeave","TaskGanttContent","ganttEvent","svg","setGanttEvent","setFailedTask","onBarTasksUpdate","onDateChange","onProgressChange","onDelete","onCalendarError","sliderTime","createSVGPoint","setXStep","setInitEventX1Delta","isMoving","setIsMoving","dateDelta","newXStep","handleMouseMove","matrixTransform","getScreenCTM","inverse","finalTask","dragType","snapped","delta","actIntervals","actSegs","actDays","planIntervals","planSegs","planDays","handleMouseUp","operationSuccess","originalSelectedTask","newChangedTask","isNotLikeOriginal","dropType","snappedEnd","snappedStart","handleBarEventStart","error","console","arrowIndex","entries","yFrom","child","yTo","to","minY","maxY","getArrows","isCritical","criticalPathType","dragging","_task","fromDrawable","toDrawable","criticalTask","criticalPathArrows","arrow","lineX","totalHeight","pointerEvents","opacity","isDisabled","TaskGantt","gridProps","calendarProps","barProps","ganttSVGRef","verticalGanttContainerRef","newBarProps","buffer","ganttVerticalContainer","dir","xmlns","horizontalContainer","HorizontalScroll","margin","scrollWrapper","GANTT_MIN_WIDTH_RATIO","TABLE_GANTT_DIVIDER_WIDTH","Gantt","primaryPath","secondaryPath","columnWidthProp","listCellWidth","barFill","viewDate","onSelect","delayToRender","shouldNotShowLoadingOverlay","wrapperRef","isDraggingTable","userResizedRef","dragStartX","dragStartWidth","dragMaxWidth","Infinity","tableContainerWidth","setTableContainerWidth","tableInnerScrollRef","tableHorizontalContainerRef","tableHScrollRef","tableContentWidth","setTableContentWidth","startDateRange","endDateRange","setDateSetup","currentViewDate","setCurrentViewDate","setTaskListWidth","wrapperWidth","setWrapperWidth","maxTableWidth","tableCap","handleTableResizeMouseDown","onMouseMove","newWidth","onMouseUp","setSvgContainerWidth","setSvgContainerHeight","setBarTasks","debounceRef","handleBarTasksUpdate","failedTask","computedColumnWidth","setComputedColumnWidth","computedForViewModeRef","minVisible","maxVisible","prevViewMode","visible","oldMin","oldMax","targetVisible","alreadySnappedForView","effectiveColumnWidth","setScrollY","setScrollX","ignoreScrollEvent","setIgnoreScrollEvent","lastTouchX","setLastTouchX","lastTouchY","setLastTouchY","isProcessing","setIsProcessing","clearTimeout","setTimeout","filteredTasks","sort","newDates","uncolorAll","colorPath","valueOf","findIndex","ResizeObserver","measure","observer","observe","disconnect","node","handleWheel","shiftKey","deltaX","scrollMove","deltaY","newScrollX","newScrollY","handleLogTouch","changedTouches","pageX","pageY","handleTouch","passive","handleScrollY","currentTarget","handleScrollX","handleKeyDown","isX","handleSelectedTask","newSelectedTask","oldSelectedTask","handleExpanderClick","tableTasks","wrapper","zIndex","alignSelf","userSelect","letterSpacing","bottom","gap","borderRadius","fontWeight","spinner","hScrollStyles","flex","topologicalOrderingHelper","taskID","taskMap","sortedTaskList","finished","started","log","successVal","getCriticalPaths","dependents","computeCriticalPath","taskChainList","paths","duration","debug","primaryLeaf","primaryDuration","nextPath","newDuration","visited","secondaryLeaf","secondaryDuration","tIndex","parent_off_time","depStart","depEnd","depDuration","child_off_time","overlap","splice","k","totalDuration","immediateChildDuration","nearest","exact","cut","lastIndexOf","ancestor","slice","longestTask","taskFromTasks","arrows","wbs"],"mappings":"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"}