gantt-lib 0.86.0 → 0.86.1

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 CHANGED
@@ -2976,6 +2976,7 @@ var TaskRow = import_react3.default.memo(
2976
2976
  "div",
2977
2977
  {
2978
2978
  "data-filter-match": isFilterMatch ? "true" : "false",
2979
+ "data-gantt-task-row-id": task.id,
2979
2980
  className: `gantt-tr-row ${isFilterMatch ? "gantt-tr-row-filter-match" : ""}`,
2980
2981
  style: { height: `${rowHeight}px` },
2981
2982
  children: [
@@ -6292,6 +6293,7 @@ var TaskListRow = import_react10.default.memo(
6292
6293
  isParent ? "gantt-tl-row-parent" : ""
6293
6294
  ].filter(Boolean).join(" "),
6294
6295
  style: { minHeight: `${rowHeight}px`, position: "relative" },
6296
+ "data-gantt-task-row-id": task.id,
6295
6297
  onClick: handleRowClickInternal,
6296
6298
  onKeyDown: handleRowKeyDown,
6297
6299
  onDragOver: (e) => onDragOver?.(rowIndex, e),
@@ -9631,6 +9633,40 @@ function TaskGanttChartInner(props, ref) {
9631
9633
  const handleTaskSelect = (0, import_react15.useCallback)((taskId) => {
9632
9634
  setSelectedTaskId(taskId);
9633
9635
  }, []);
9636
+ const hoveredRowElementsRef = (0, import_react15.useRef)([]);
9637
+ const clearHoveredRows = (0, import_react15.useCallback)(() => {
9638
+ for (const element of hoveredRowElementsRef.current) {
9639
+ element.classList.remove("gantt-tl-row-hovered", "gantt-tr-row-hovered");
9640
+ }
9641
+ hoveredRowElementsRef.current = [];
9642
+ }, []);
9643
+ const applyHoveredRows = (0, import_react15.useCallback)((taskId) => {
9644
+ const root = scrollContentRef.current;
9645
+ if (!root) return;
9646
+ clearHoveredRows();
9647
+ const nextHoveredRows = Array.from(
9648
+ root.querySelectorAll("[data-gantt-task-row-id]")
9649
+ ).filter((element) => element.dataset.ganttTaskRowId === taskId);
9650
+ for (const element of nextHoveredRows) {
9651
+ if (element.classList.contains("gantt-tl-row")) {
9652
+ element.classList.add("gantt-tl-row-hovered");
9653
+ }
9654
+ if (element.classList.contains("gantt-tr-row")) {
9655
+ element.classList.add("gantt-tr-row-hovered");
9656
+ }
9657
+ }
9658
+ hoveredRowElementsRef.current = nextHoveredRows;
9659
+ }, [clearHoveredRows]);
9660
+ const handleSharedRowHover = (0, import_react15.useCallback)((event) => {
9661
+ const target = event.target;
9662
+ const row = target.closest("[data-gantt-task-row-id]");
9663
+ const taskId = row?.dataset.ganttTaskRowId;
9664
+ if (!taskId) return;
9665
+ if (hoveredRowElementsRef.current.some((element) => element.dataset.ganttTaskRowId === taskId)) {
9666
+ return;
9667
+ }
9668
+ applyHoveredRows(taskId);
9669
+ }, [applyHoveredRows]);
9634
9670
  const handleToggleCollapse = externalOnToggleCollapse ?? (0, import_react15.useCallback)((parentId) => {
9635
9671
  setInternalCollapsedParentIds((prev) => {
9636
9672
  const next = new Set(prev);
@@ -9863,157 +9899,166 @@ function TaskGanttChartInner(props, ref) {
9863
9899
  className: "gantt-scrollContainer",
9864
9900
  style: { height: containerHeight ?? "auto", cursor: "grab" },
9865
9901
  onMouseDown: handlePanStart,
9866
- children: /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)("div", { ref: scrollContentRef, className: "gantt-scrollContent", children: [
9867
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
9868
- TaskList,
9869
- {
9870
- tasks: normalizedTasks,
9871
- rowHeight,
9872
- headerHeight,
9873
- taskListWidth,
9874
- onTasksChange: handleTaskChange,
9875
- selectedTaskId: selectedTaskId ?? void 0,
9876
- onTaskSelect: handleTaskSelect,
9877
- show: showTaskList,
9878
- hasRightShadow: taskListHasRightShadow,
9879
- disableTaskNameEditing,
9880
- disableDependencyEditing,
9881
- onScrollToTask: scrollToTask,
9882
- onSelectedChipChange: setSelectedChip,
9883
- onAdd,
9884
- onDelete: handleDelete,
9885
- onInsertAfter: handleInsertAfter,
9886
- onReorder: handleReorder,
9887
- editingTaskId,
9888
- enableAddTask,
9889
- defaultTaskDurationDays,
9890
- collapsedParentIds,
9891
- onToggleCollapse: handleToggleCollapse,
9892
- onPromoteTask: onPromoteTask ?? handlePromoteTask,
9893
- onDemoteTask: onDemoteTask ?? handleDemoteTask,
9894
- onUngroupTask: onUngroupTask ?? handleUngroupTask,
9895
- highlightedTaskIds: taskListHighlightedTaskIds,
9896
- customDays,
9897
- isWeekend: isWeekend3,
9898
- businessDays,
9899
- filterMode,
9900
- filteredTaskIds: matchedTaskIds,
9901
- isFilterActive: !!taskFilter,
9902
- additionalColumns,
9903
- hiddenTaskListColumns,
9904
- taskListMenuCommands
9905
- }
9906
- ),
9907
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
9908
- "div",
9909
- {
9910
- className: showChart ? "gantt-chartSurface" : "gantt-chartSurface gantt-chart-hidden",
9911
- style: { minWidth: `${gridWidth}px`, flex: 1, display: showChart ? void 0 : "none" },
9912
- children: [
9913
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
9914
- "div",
9915
- {
9916
- className: "gantt-stickyHeader",
9917
- style: { width: `${gridWidth}px`, height: `${timelineHeaderHeight}px` },
9918
- children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
9919
- TimeScaleHeader_default,
9902
+ children: /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
9903
+ "div",
9904
+ {
9905
+ ref: scrollContentRef,
9906
+ className: "gantt-scrollContent",
9907
+ onMouseOver: handleSharedRowHover,
9908
+ onMouseLeave: clearHoveredRows,
9909
+ children: [
9910
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
9911
+ TaskList,
9912
+ {
9913
+ tasks: normalizedTasks,
9914
+ rowHeight,
9915
+ headerHeight,
9916
+ taskListWidth,
9917
+ onTasksChange: handleTaskChange,
9918
+ selectedTaskId: selectedTaskId ?? void 0,
9919
+ onTaskSelect: handleTaskSelect,
9920
+ show: showTaskList,
9921
+ hasRightShadow: taskListHasRightShadow,
9922
+ disableTaskNameEditing,
9923
+ disableDependencyEditing,
9924
+ onScrollToTask: scrollToTask,
9925
+ onSelectedChipChange: setSelectedChip,
9926
+ onAdd,
9927
+ onDelete: handleDelete,
9928
+ onInsertAfter: handleInsertAfter,
9929
+ onReorder: handleReorder,
9930
+ editingTaskId,
9931
+ enableAddTask,
9932
+ defaultTaskDurationDays,
9933
+ collapsedParentIds,
9934
+ onToggleCollapse: handleToggleCollapse,
9935
+ onPromoteTask: onPromoteTask ?? handlePromoteTask,
9936
+ onDemoteTask: onDemoteTask ?? handleDemoteTask,
9937
+ onUngroupTask: onUngroupTask ?? handleUngroupTask,
9938
+ highlightedTaskIds: taskListHighlightedTaskIds,
9939
+ customDays,
9940
+ isWeekend: isWeekend3,
9941
+ businessDays,
9942
+ filterMode,
9943
+ filteredTaskIds: matchedTaskIds,
9944
+ isFilterActive: !!taskFilter,
9945
+ additionalColumns,
9946
+ hiddenTaskListColumns,
9947
+ taskListMenuCommands
9948
+ }
9949
+ ),
9950
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
9951
+ "div",
9952
+ {
9953
+ className: showChart ? "gantt-chartSurface" : "gantt-chartSurface gantt-chart-hidden",
9954
+ style: { minWidth: `${gridWidth}px`, flex: 1, display: showChart ? void 0 : "none" },
9955
+ children: [
9956
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
9957
+ "div",
9920
9958
  {
9921
- days: dateRange,
9922
- dayWidth,
9923
- headerHeight,
9924
- viewMode,
9925
- isCustomWeekend
9959
+ className: "gantt-stickyHeader",
9960
+ style: { width: `${gridWidth}px`, height: `${timelineHeaderHeight}px` },
9961
+ children: /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
9962
+ TimeScaleHeader_default,
9963
+ {
9964
+ days: dateRange,
9965
+ dayWidth,
9966
+ headerHeight,
9967
+ viewMode,
9968
+ isCustomWeekend
9969
+ }
9970
+ )
9926
9971
  }
9927
- )
9928
- }
9929
- ),
9930
- /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
9931
- "div",
9932
- {
9933
- className: "gantt-taskArea",
9934
- style: {
9935
- position: "relative",
9936
- width: `${gridWidth}px`
9937
- },
9938
- children: [
9939
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
9940
- GridBackground_default,
9941
- {
9942
- dateRange,
9943
- dayWidth,
9944
- totalHeight: totalGridHeight,
9945
- viewMode,
9946
- isCustomWeekend
9947
- }
9948
- ),
9949
- todayInRange && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(TodayIndicator_default, { monthStart, dayWidth }),
9950
- /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
9951
- DependencyLines_default,
9952
- {
9953
- tasks: previewVisibleTasks,
9954
- allTasks: previewNormalizedTasks,
9955
- collapsedParentIds,
9956
- monthStart,
9957
- dayWidth,
9958
- rowHeight,
9959
- gridWidth,
9960
- dragOverrides: dependencyOverrides,
9961
- selectedDep: selectedChip,
9962
- businessDays,
9963
- weekendPredicate: isCustomWeekend
9964
- }
9965
- ),
9966
- dragGuideLines && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
9967
- DragGuideLines_default,
9968
- {
9969
- isDragging: dragGuideLines.isDragging,
9970
- dragMode: dragGuideLines.dragMode,
9971
- left: dragGuideLines.left,
9972
- width: dragGuideLines.width,
9973
- totalHeight: totalGridHeight
9974
- }
9975
- ),
9976
- visibleTasks.map((task, index) => /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
9977
- TaskRow_default,
9978
- {
9979
- task,
9980
- monthStart,
9981
- dayWidth,
9982
- rowHeight,
9983
- onTasksChange: handleTaskChange,
9984
- onDragStateChange: (state) => {
9985
- if (state.isDragging) {
9986
- setDragGuideLines(state);
9987
- setDraggedTaskOverride({ taskId: task.id, left: state.left, width: state.width });
9988
- } else {
9989
- setDragGuideLines(null);
9990
- setDraggedTaskOverride(null);
9991
- }
9992
- },
9993
- rowIndex: index,
9994
- allTasks: normalizedTasks,
9995
- enableAutoSchedule: enableAutoSchedule ?? false,
9996
- disableConstraints: disableConstraints ?? false,
9997
- overridePosition: cascadeOverrides.get(task.id),
9998
- onCascadeProgress: handleCascadeProgress,
9999
- onCascade: handleCascade,
10000
- highlightExpiredTasks,
10001
- showBaseline,
10002
- isFilterMatch: filterMode === "highlight" ? matchedTaskIds.has(task.id) : false,
10003
- businessDays,
10004
- customDays,
10005
- isWeekend: isWeekend3,
10006
- disableTaskDrag
9972
+ ),
9973
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsxs)(
9974
+ "div",
9975
+ {
9976
+ className: "gantt-taskArea",
9977
+ style: {
9978
+ position: "relative",
9979
+ width: `${gridWidth}px`
10007
9980
  },
10008
- task.id
10009
- ))
10010
- ]
10011
- }
10012
- )
10013
- ]
10014
- }
10015
- )
10016
- ] })
9981
+ children: [
9982
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
9983
+ GridBackground_default,
9984
+ {
9985
+ dateRange,
9986
+ dayWidth,
9987
+ totalHeight: totalGridHeight,
9988
+ viewMode,
9989
+ isCustomWeekend
9990
+ }
9991
+ ),
9992
+ todayInRange && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(TodayIndicator_default, { monthStart, dayWidth }),
9993
+ /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
9994
+ DependencyLines_default,
9995
+ {
9996
+ tasks: previewVisibleTasks,
9997
+ allTasks: previewNormalizedTasks,
9998
+ collapsedParentIds,
9999
+ monthStart,
10000
+ dayWidth,
10001
+ rowHeight,
10002
+ gridWidth,
10003
+ dragOverrides: dependencyOverrides,
10004
+ selectedDep: selectedChip,
10005
+ businessDays,
10006
+ weekendPredicate: isCustomWeekend
10007
+ }
10008
+ ),
10009
+ dragGuideLines && /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
10010
+ DragGuideLines_default,
10011
+ {
10012
+ isDragging: dragGuideLines.isDragging,
10013
+ dragMode: dragGuideLines.dragMode,
10014
+ left: dragGuideLines.left,
10015
+ width: dragGuideLines.width,
10016
+ totalHeight: totalGridHeight
10017
+ }
10018
+ ),
10019
+ visibleTasks.map((task, index) => /* @__PURE__ */ (0, import_jsx_runtime16.jsx)(
10020
+ TaskRow_default,
10021
+ {
10022
+ task,
10023
+ monthStart,
10024
+ dayWidth,
10025
+ rowHeight,
10026
+ onTasksChange: handleTaskChange,
10027
+ onDragStateChange: (state) => {
10028
+ if (state.isDragging) {
10029
+ setDragGuideLines(state);
10030
+ setDraggedTaskOverride({ taskId: task.id, left: state.left, width: state.width });
10031
+ } else {
10032
+ setDragGuideLines(null);
10033
+ setDraggedTaskOverride(null);
10034
+ }
10035
+ },
10036
+ rowIndex: index,
10037
+ allTasks: normalizedTasks,
10038
+ enableAutoSchedule: enableAutoSchedule ?? false,
10039
+ disableConstraints: disableConstraints ?? false,
10040
+ overridePosition: cascadeOverrides.get(task.id),
10041
+ onCascadeProgress: handleCascadeProgress,
10042
+ onCascade: handleCascade,
10043
+ highlightExpiredTasks,
10044
+ showBaseline,
10045
+ isFilterMatch: filterMode === "highlight" ? matchedTaskIds.has(task.id) : false,
10046
+ businessDays,
10047
+ customDays,
10048
+ isWeekend: isWeekend3,
10049
+ disableTaskDrag
10050
+ },
10051
+ task.id
10052
+ ))
10053
+ ]
10054
+ }
10055
+ )
10056
+ ]
10057
+ }
10058
+ )
10059
+ ]
10060
+ }
10061
+ )
10017
10062
  }
10018
10063
  ) });
10019
10064
  }