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.mjs CHANGED
@@ -2837,6 +2837,7 @@ var TaskRow = React2.memo(
2837
2837
  "div",
2838
2838
  {
2839
2839
  "data-filter-match": isFilterMatch ? "true" : "false",
2840
+ "data-gantt-task-row-id": task.id,
2840
2841
  className: `gantt-tr-row ${isFilterMatch ? "gantt-tr-row-filter-match" : ""}`,
2841
2842
  style: { height: `${rowHeight}px` },
2842
2843
  children: [
@@ -6177,6 +6178,7 @@ var TaskListRow = React9.memo(
6177
6178
  isParent ? "gantt-tl-row-parent" : ""
6178
6179
  ].filter(Boolean).join(" "),
6179
6180
  style: { minHeight: `${rowHeight}px`, position: "relative" },
6181
+ "data-gantt-task-row-id": task.id,
6180
6182
  onClick: handleRowClickInternal,
6181
6183
  onKeyDown: handleRowKeyDown,
6182
6184
  onDragOver: (e) => onDragOver?.(rowIndex, e),
@@ -9516,6 +9518,40 @@ function TaskGanttChartInner(props, ref) {
9516
9518
  const handleTaskSelect = useCallback8((taskId) => {
9517
9519
  setSelectedTaskId(taskId);
9518
9520
  }, []);
9521
+ const hoveredRowElementsRef = useRef9([]);
9522
+ const clearHoveredRows = useCallback8(() => {
9523
+ for (const element of hoveredRowElementsRef.current) {
9524
+ element.classList.remove("gantt-tl-row-hovered", "gantt-tr-row-hovered");
9525
+ }
9526
+ hoveredRowElementsRef.current = [];
9527
+ }, []);
9528
+ const applyHoveredRows = useCallback8((taskId) => {
9529
+ const root = scrollContentRef.current;
9530
+ if (!root) return;
9531
+ clearHoveredRows();
9532
+ const nextHoveredRows = Array.from(
9533
+ root.querySelectorAll("[data-gantt-task-row-id]")
9534
+ ).filter((element) => element.dataset.ganttTaskRowId === taskId);
9535
+ for (const element of nextHoveredRows) {
9536
+ if (element.classList.contains("gantt-tl-row")) {
9537
+ element.classList.add("gantt-tl-row-hovered");
9538
+ }
9539
+ if (element.classList.contains("gantt-tr-row")) {
9540
+ element.classList.add("gantt-tr-row-hovered");
9541
+ }
9542
+ }
9543
+ hoveredRowElementsRef.current = nextHoveredRows;
9544
+ }, [clearHoveredRows]);
9545
+ const handleSharedRowHover = useCallback8((event) => {
9546
+ const target = event.target;
9547
+ const row = target.closest("[data-gantt-task-row-id]");
9548
+ const taskId = row?.dataset.ganttTaskRowId;
9549
+ if (!taskId) return;
9550
+ if (hoveredRowElementsRef.current.some((element) => element.dataset.ganttTaskRowId === taskId)) {
9551
+ return;
9552
+ }
9553
+ applyHoveredRows(taskId);
9554
+ }, [applyHoveredRows]);
9519
9555
  const handleToggleCollapse = externalOnToggleCollapse ?? useCallback8((parentId) => {
9520
9556
  setInternalCollapsedParentIds((prev) => {
9521
9557
  const next = new Set(prev);
@@ -9748,157 +9784,166 @@ function TaskGanttChartInner(props, ref) {
9748
9784
  className: "gantt-scrollContainer",
9749
9785
  style: { height: containerHeight ?? "auto", cursor: "grab" },
9750
9786
  onMouseDown: handlePanStart,
9751
- children: /* @__PURE__ */ jsxs13("div", { ref: scrollContentRef, className: "gantt-scrollContent", children: [
9752
- /* @__PURE__ */ jsx16(
9753
- TaskList,
9754
- {
9755
- tasks: normalizedTasks,
9756
- rowHeight,
9757
- headerHeight,
9758
- taskListWidth,
9759
- onTasksChange: handleTaskChange,
9760
- selectedTaskId: selectedTaskId ?? void 0,
9761
- onTaskSelect: handleTaskSelect,
9762
- show: showTaskList,
9763
- hasRightShadow: taskListHasRightShadow,
9764
- disableTaskNameEditing,
9765
- disableDependencyEditing,
9766
- onScrollToTask: scrollToTask,
9767
- onSelectedChipChange: setSelectedChip,
9768
- onAdd,
9769
- onDelete: handleDelete,
9770
- onInsertAfter: handleInsertAfter,
9771
- onReorder: handleReorder,
9772
- editingTaskId,
9773
- enableAddTask,
9774
- defaultTaskDurationDays,
9775
- collapsedParentIds,
9776
- onToggleCollapse: handleToggleCollapse,
9777
- onPromoteTask: onPromoteTask ?? handlePromoteTask,
9778
- onDemoteTask: onDemoteTask ?? handleDemoteTask,
9779
- onUngroupTask: onUngroupTask ?? handleUngroupTask,
9780
- highlightedTaskIds: taskListHighlightedTaskIds,
9781
- customDays,
9782
- isWeekend: isWeekend3,
9783
- businessDays,
9784
- filterMode,
9785
- filteredTaskIds: matchedTaskIds,
9786
- isFilterActive: !!taskFilter,
9787
- additionalColumns,
9788
- hiddenTaskListColumns,
9789
- taskListMenuCommands
9790
- }
9791
- ),
9792
- /* @__PURE__ */ jsxs13(
9793
- "div",
9794
- {
9795
- className: showChart ? "gantt-chartSurface" : "gantt-chartSurface gantt-chart-hidden",
9796
- style: { minWidth: `${gridWidth}px`, flex: 1, display: showChart ? void 0 : "none" },
9797
- children: [
9798
- /* @__PURE__ */ jsx16(
9799
- "div",
9800
- {
9801
- className: "gantt-stickyHeader",
9802
- style: { width: `${gridWidth}px`, height: `${timelineHeaderHeight}px` },
9803
- children: /* @__PURE__ */ jsx16(
9804
- TimeScaleHeader_default,
9787
+ children: /* @__PURE__ */ jsxs13(
9788
+ "div",
9789
+ {
9790
+ ref: scrollContentRef,
9791
+ className: "gantt-scrollContent",
9792
+ onMouseOver: handleSharedRowHover,
9793
+ onMouseLeave: clearHoveredRows,
9794
+ children: [
9795
+ /* @__PURE__ */ jsx16(
9796
+ TaskList,
9797
+ {
9798
+ tasks: normalizedTasks,
9799
+ rowHeight,
9800
+ headerHeight,
9801
+ taskListWidth,
9802
+ onTasksChange: handleTaskChange,
9803
+ selectedTaskId: selectedTaskId ?? void 0,
9804
+ onTaskSelect: handleTaskSelect,
9805
+ show: showTaskList,
9806
+ hasRightShadow: taskListHasRightShadow,
9807
+ disableTaskNameEditing,
9808
+ disableDependencyEditing,
9809
+ onScrollToTask: scrollToTask,
9810
+ onSelectedChipChange: setSelectedChip,
9811
+ onAdd,
9812
+ onDelete: handleDelete,
9813
+ onInsertAfter: handleInsertAfter,
9814
+ onReorder: handleReorder,
9815
+ editingTaskId,
9816
+ enableAddTask,
9817
+ defaultTaskDurationDays,
9818
+ collapsedParentIds,
9819
+ onToggleCollapse: handleToggleCollapse,
9820
+ onPromoteTask: onPromoteTask ?? handlePromoteTask,
9821
+ onDemoteTask: onDemoteTask ?? handleDemoteTask,
9822
+ onUngroupTask: onUngroupTask ?? handleUngroupTask,
9823
+ highlightedTaskIds: taskListHighlightedTaskIds,
9824
+ customDays,
9825
+ isWeekend: isWeekend3,
9826
+ businessDays,
9827
+ filterMode,
9828
+ filteredTaskIds: matchedTaskIds,
9829
+ isFilterActive: !!taskFilter,
9830
+ additionalColumns,
9831
+ hiddenTaskListColumns,
9832
+ taskListMenuCommands
9833
+ }
9834
+ ),
9835
+ /* @__PURE__ */ jsxs13(
9836
+ "div",
9837
+ {
9838
+ className: showChart ? "gantt-chartSurface" : "gantt-chartSurface gantt-chart-hidden",
9839
+ style: { minWidth: `${gridWidth}px`, flex: 1, display: showChart ? void 0 : "none" },
9840
+ children: [
9841
+ /* @__PURE__ */ jsx16(
9842
+ "div",
9805
9843
  {
9806
- days: dateRange,
9807
- dayWidth,
9808
- headerHeight,
9809
- viewMode,
9810
- isCustomWeekend
9844
+ className: "gantt-stickyHeader",
9845
+ style: { width: `${gridWidth}px`, height: `${timelineHeaderHeight}px` },
9846
+ children: /* @__PURE__ */ jsx16(
9847
+ TimeScaleHeader_default,
9848
+ {
9849
+ days: dateRange,
9850
+ dayWidth,
9851
+ headerHeight,
9852
+ viewMode,
9853
+ isCustomWeekend
9854
+ }
9855
+ )
9811
9856
  }
9812
- )
9813
- }
9814
- ),
9815
- /* @__PURE__ */ jsxs13(
9816
- "div",
9817
- {
9818
- className: "gantt-taskArea",
9819
- style: {
9820
- position: "relative",
9821
- width: `${gridWidth}px`
9822
- },
9823
- children: [
9824
- /* @__PURE__ */ jsx16(
9825
- GridBackground_default,
9826
- {
9827
- dateRange,
9828
- dayWidth,
9829
- totalHeight: totalGridHeight,
9830
- viewMode,
9831
- isCustomWeekend
9832
- }
9833
- ),
9834
- todayInRange && /* @__PURE__ */ jsx16(TodayIndicator_default, { monthStart, dayWidth }),
9835
- /* @__PURE__ */ jsx16(
9836
- DependencyLines_default,
9837
- {
9838
- tasks: previewVisibleTasks,
9839
- allTasks: previewNormalizedTasks,
9840
- collapsedParentIds,
9841
- monthStart,
9842
- dayWidth,
9843
- rowHeight,
9844
- gridWidth,
9845
- dragOverrides: dependencyOverrides,
9846
- selectedDep: selectedChip,
9847
- businessDays,
9848
- weekendPredicate: isCustomWeekend
9849
- }
9850
- ),
9851
- dragGuideLines && /* @__PURE__ */ jsx16(
9852
- DragGuideLines_default,
9853
- {
9854
- isDragging: dragGuideLines.isDragging,
9855
- dragMode: dragGuideLines.dragMode,
9856
- left: dragGuideLines.left,
9857
- width: dragGuideLines.width,
9858
- totalHeight: totalGridHeight
9859
- }
9860
- ),
9861
- visibleTasks.map((task, index) => /* @__PURE__ */ jsx16(
9862
- TaskRow_default,
9863
- {
9864
- task,
9865
- monthStart,
9866
- dayWidth,
9867
- rowHeight,
9868
- onTasksChange: handleTaskChange,
9869
- onDragStateChange: (state) => {
9870
- if (state.isDragging) {
9871
- setDragGuideLines(state);
9872
- setDraggedTaskOverride({ taskId: task.id, left: state.left, width: state.width });
9873
- } else {
9874
- setDragGuideLines(null);
9875
- setDraggedTaskOverride(null);
9876
- }
9877
- },
9878
- rowIndex: index,
9879
- allTasks: normalizedTasks,
9880
- enableAutoSchedule: enableAutoSchedule ?? false,
9881
- disableConstraints: disableConstraints ?? false,
9882
- overridePosition: cascadeOverrides.get(task.id),
9883
- onCascadeProgress: handleCascadeProgress,
9884
- onCascade: handleCascade,
9885
- highlightExpiredTasks,
9886
- showBaseline,
9887
- isFilterMatch: filterMode === "highlight" ? matchedTaskIds.has(task.id) : false,
9888
- businessDays,
9889
- customDays,
9890
- isWeekend: isWeekend3,
9891
- disableTaskDrag
9857
+ ),
9858
+ /* @__PURE__ */ jsxs13(
9859
+ "div",
9860
+ {
9861
+ className: "gantt-taskArea",
9862
+ style: {
9863
+ position: "relative",
9864
+ width: `${gridWidth}px`
9892
9865
  },
9893
- task.id
9894
- ))
9895
- ]
9896
- }
9897
- )
9898
- ]
9899
- }
9900
- )
9901
- ] })
9866
+ children: [
9867
+ /* @__PURE__ */ jsx16(
9868
+ GridBackground_default,
9869
+ {
9870
+ dateRange,
9871
+ dayWidth,
9872
+ totalHeight: totalGridHeight,
9873
+ viewMode,
9874
+ isCustomWeekend
9875
+ }
9876
+ ),
9877
+ todayInRange && /* @__PURE__ */ jsx16(TodayIndicator_default, { monthStart, dayWidth }),
9878
+ /* @__PURE__ */ jsx16(
9879
+ DependencyLines_default,
9880
+ {
9881
+ tasks: previewVisibleTasks,
9882
+ allTasks: previewNormalizedTasks,
9883
+ collapsedParentIds,
9884
+ monthStart,
9885
+ dayWidth,
9886
+ rowHeight,
9887
+ gridWidth,
9888
+ dragOverrides: dependencyOverrides,
9889
+ selectedDep: selectedChip,
9890
+ businessDays,
9891
+ weekendPredicate: isCustomWeekend
9892
+ }
9893
+ ),
9894
+ dragGuideLines && /* @__PURE__ */ jsx16(
9895
+ DragGuideLines_default,
9896
+ {
9897
+ isDragging: dragGuideLines.isDragging,
9898
+ dragMode: dragGuideLines.dragMode,
9899
+ left: dragGuideLines.left,
9900
+ width: dragGuideLines.width,
9901
+ totalHeight: totalGridHeight
9902
+ }
9903
+ ),
9904
+ visibleTasks.map((task, index) => /* @__PURE__ */ jsx16(
9905
+ TaskRow_default,
9906
+ {
9907
+ task,
9908
+ monthStart,
9909
+ dayWidth,
9910
+ rowHeight,
9911
+ onTasksChange: handleTaskChange,
9912
+ onDragStateChange: (state) => {
9913
+ if (state.isDragging) {
9914
+ setDragGuideLines(state);
9915
+ setDraggedTaskOverride({ taskId: task.id, left: state.left, width: state.width });
9916
+ } else {
9917
+ setDragGuideLines(null);
9918
+ setDraggedTaskOverride(null);
9919
+ }
9920
+ },
9921
+ rowIndex: index,
9922
+ allTasks: normalizedTasks,
9923
+ enableAutoSchedule: enableAutoSchedule ?? false,
9924
+ disableConstraints: disableConstraints ?? false,
9925
+ overridePosition: cascadeOverrides.get(task.id),
9926
+ onCascadeProgress: handleCascadeProgress,
9927
+ onCascade: handleCascade,
9928
+ highlightExpiredTasks,
9929
+ showBaseline,
9930
+ isFilterMatch: filterMode === "highlight" ? matchedTaskIds.has(task.id) : false,
9931
+ businessDays,
9932
+ customDays,
9933
+ isWeekend: isWeekend3,
9934
+ disableTaskDrag
9935
+ },
9936
+ task.id
9937
+ ))
9938
+ ]
9939
+ }
9940
+ )
9941
+ ]
9942
+ }
9943
+ )
9944
+ ]
9945
+ }
9946
+ )
9902
9947
  }
9903
9948
  ) });
9904
9949
  }