gantt-lib 0.135.3 → 0.135.5

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.d.mts CHANGED
@@ -796,6 +796,8 @@ interface TaskRowProps {
796
796
  enableAutoSchedule?: boolean;
797
797
  /** Whether to disable constraint checking during drag */
798
798
  disableConstraints?: boolean;
799
+ /** Keep the dragged bar live but defer the cascade preview until drop. */
800
+ deferCascadePreview?: boolean;
799
801
  /** Position override for cascade preview — when set, overrides both static and drag position */
800
802
  overridePosition?: {
801
803
  left: number;
@@ -967,6 +969,7 @@ interface DragGuideLinesProps {
967
969
  left: number;
968
970
  width: number;
969
971
  totalHeight: number;
972
+ top?: number;
970
973
  }
971
974
  declare const DragGuideLines: React$1.FC<DragGuideLinesProps>;
972
975
 
@@ -1269,6 +1272,8 @@ interface UseTaskDragOptions {
1269
1272
  enableAutoSchedule?: boolean;
1270
1273
  /** When true, dependency constraint checking is skipped during drag (default: false) */
1271
1274
  disableConstraints?: boolean;
1275
+ /** Skip live cascade and parent scaling on large charts; drop semantics remain unchanged. */
1276
+ deferCascadePreview?: boolean;
1272
1277
  /** Callback for real-time cascade preview — called each RAF with non-dragged chain member positions */
1273
1278
  onCascadeProgress?: (overrides: Map<string, {
1274
1279
  left: number;
package/dist/index.d.ts CHANGED
@@ -796,6 +796,8 @@ interface TaskRowProps {
796
796
  enableAutoSchedule?: boolean;
797
797
  /** Whether to disable constraint checking during drag */
798
798
  disableConstraints?: boolean;
799
+ /** Keep the dragged bar live but defer the cascade preview until drop. */
800
+ deferCascadePreview?: boolean;
799
801
  /** Position override for cascade preview — when set, overrides both static and drag position */
800
802
  overridePosition?: {
801
803
  left: number;
@@ -967,6 +969,7 @@ interface DragGuideLinesProps {
967
969
  left: number;
968
970
  width: number;
969
971
  totalHeight: number;
972
+ top?: number;
970
973
  }
971
974
  declare const DragGuideLines: React$1.FC<DragGuideLinesProps>;
972
975
 
@@ -1269,6 +1272,8 @@ interface UseTaskDragOptions {
1269
1272
  enableAutoSchedule?: boolean;
1270
1273
  /** When true, dependency constraint checking is skipped during drag (default: false) */
1271
1274
  disableConstraints?: boolean;
1275
+ /** Skip live cascade and parent scaling on large charts; drop semantics remain unchanged. */
1276
+ deferCascadePreview?: boolean;
1272
1277
  /** Callback for real-time cascade preview — called each RAF with non-dragged chain member positions */
1273
1278
  onCascadeProgress?: (overrides: Map<string, {
1274
1279
  left: number;
package/dist/index.js CHANGED
@@ -3823,8 +3823,8 @@ function handleGlobalMouseMove(e) {
3823
3823
  if (draggedTask && isMilestoneTask(draggedTask)) {
3824
3824
  newWidth = dayWidth;
3825
3825
  }
3826
- const isParentResizePreview = draggedTask && (mode === "resize-left" || mode === "resize-right") && isTaskParent(activeDrag.taskId, allTasks);
3827
- if (isParentResizePreview && activeDrag.onCascadeProgress) {
3826
+ const isParentResizePreview = !activeDrag.deferCascadePreview && draggedTask && (mode === "resize-left" || mode === "resize-right") && isTaskParent(activeDrag.taskId, allTasks);
3827
+ if (!activeDrag.deferCascadePreview && isParentResizePreview && activeDrag.onCascadeProgress) {
3828
3828
  const { dayWidth: dw, monthStart: mStart } = activeDrag;
3829
3829
  const previewRange = resolveDragRangeForInteraction(activeDrag, draggedTask, mode, newLeft, newWidth);
3830
3830
  const anchor = mode === "resize-left" ? "end" : "start";
@@ -3875,7 +3875,7 @@ function handleGlobalMouseMove(e) {
3875
3875
  activeDrag.onCascadeProgress(liveOverrides, activeDrag.parentScalePreview.previewTasks);
3876
3876
  }
3877
3877
  }
3878
- if (!activeDrag.disableConstraints && activeDrag.onCascadeProgress && !isParentResizePreview) {
3878
+ if (!activeDrag.deferCascadePreview && !activeDrag.disableConstraints && activeDrag.onCascadeProgress && !isParentResizePreview) {
3879
3879
  const { dayWidth: dayWidth2, monthStart: mStart, taskId: dragId } = activeDrag;
3880
3880
  const originalDraggedTask = draggedTask ?? allTasks.find((t) => t.id === dragId);
3881
3881
  const previewRange = originalDraggedTask ? clampDateRangeForIncomingFS(
@@ -3999,6 +3999,7 @@ var useTaskDrag = (options) => {
3999
3999
  rowIndex,
4000
4000
  enableAutoSchedule = false,
4001
4001
  disableConstraints = false,
4002
+ deferCascadePreview = false,
4002
4003
  onCascadeProgress,
4003
4004
  onCascade,
4004
4005
  locked = false,
@@ -4336,13 +4337,14 @@ var useTaskDrag = (options) => {
4336
4337
  onCancel: handleCancel,
4337
4338
  allTasks,
4338
4339
  disableConstraints,
4340
+ deferCascadePreview,
4339
4341
  onCascadeProgress,
4340
4342
  businessDays,
4341
4343
  weekendPredicate,
4342
4344
  cascadeContext: shouldBuildCascadeContext ? createCascadeContext(allTasks) : void 0,
4343
4345
  scheduleIntentMode: Boolean(onScheduleIntent)
4344
4346
  };
4345
- }, [edgeZoneWidth, currentLeft, currentWidth, dayWidth, monthStart, taskId, onDragStateChange, handleProgress, handleComplete, handleCancel, allTasks, disableConstraints, onCascadeProgress, onCascade, effectiveLocked, viewMode]);
4347
+ }, [edgeZoneWidth, currentLeft, currentWidth, dayWidth, monthStart, taskId, onDragStateChange, handleProgress, handleComplete, handleCancel, allTasks, disableConstraints, deferCascadePreview, onCascadeProgress, onCascade, effectiveLocked, viewMode]);
4346
4348
  const handleMouseDown = (0, import_react2.useCallback)((e) => {
4347
4349
  startDrag(e);
4348
4350
  }, [startDrag]);
@@ -4400,10 +4402,10 @@ var useTaskDrag = (options) => {
4400
4402
  // src/components/TaskRow/TaskRow.tsx
4401
4403
  var import_jsx_runtime2 = require("react/jsx-runtime");
4402
4404
  var arePropsEqual = (prevProps, nextProps) => {
4403
- return prevProps.task.id === nextProps.task.id && prevProps.task.name === nextProps.task.name && prevProps.task.startDate === nextProps.task.startDate && prevProps.task.endDate === nextProps.task.endDate && prevProps.task.baselineStartDate === nextProps.task.baselineStartDate && prevProps.task.baselineEndDate === nextProps.task.baselineEndDate && prevProps.task.type === nextProps.task.type && prevProps.task.color === nextProps.task.color && prevProps.task.progress === nextProps.task.progress && prevProps.task.accepted === nextProps.task.accepted && prevProps.monthStart.getTime() === nextProps.monthStart.getTime() && prevProps.dayWidth === nextProps.dayWidth && prevProps.rowHeight === nextProps.rowHeight && prevProps.overridePosition?.left === nextProps.overridePosition?.left && prevProps.overridePosition?.width === nextProps.overridePosition?.width && prevProps.previewPositionStore === nextProps.previewPositionStore && prevProps.allTasks === nextProps.allTasks && prevProps.disableConstraints === nextProps.disableConstraints && prevProps.task.locked === nextProps.task.locked && prevProps.task.synced === nextProps.task.synced && prevProps.task.divider === nextProps.task.divider && prevProps.highlightExpiredTasks === nextProps.highlightExpiredTasks && prevProps.isCritical === nextProps.isCritical && prevProps.showBaseline === nextProps.showBaseline && prevProps.isFilterMatch === nextProps.isFilterMatch && prevProps.businessDays === nextProps.businessDays && prevProps.customDays === nextProps.customDays && prevProps.isWeekend === nextProps.isWeekend && prevProps.disableTaskDrag === nextProps.disableTaskDrag && prevProps.disableDependencyEditing === nextProps.disableDependencyEditing && prevProps.isDependencyDragActive === nextProps.isDependencyDragActive && prevProps.viewMode === nextProps.viewMode && prevProps.showTaskDateLabels === nextProps.showTaskDateLabels && prevProps.showTaskNames === nextProps.showTaskNames;
4405
+ return prevProps.task.id === nextProps.task.id && prevProps.task.name === nextProps.task.name && prevProps.task.startDate === nextProps.task.startDate && prevProps.task.endDate === nextProps.task.endDate && prevProps.task.baselineStartDate === nextProps.task.baselineStartDate && prevProps.task.baselineEndDate === nextProps.task.baselineEndDate && prevProps.task.type === nextProps.task.type && prevProps.task.color === nextProps.task.color && prevProps.task.progress === nextProps.task.progress && prevProps.task.accepted === nextProps.task.accepted && prevProps.monthStart.getTime() === nextProps.monthStart.getTime() && prevProps.dayWidth === nextProps.dayWidth && prevProps.rowHeight === nextProps.rowHeight && prevProps.overridePosition?.left === nextProps.overridePosition?.left && prevProps.overridePosition?.width === nextProps.overridePosition?.width && prevProps.previewPositionStore === nextProps.previewPositionStore && prevProps.allTasks === nextProps.allTasks && prevProps.disableConstraints === nextProps.disableConstraints && prevProps.deferCascadePreview === nextProps.deferCascadePreview && prevProps.task.locked === nextProps.task.locked && prevProps.task.synced === nextProps.task.synced && prevProps.task.divider === nextProps.task.divider && prevProps.highlightExpiredTasks === nextProps.highlightExpiredTasks && prevProps.isCritical === nextProps.isCritical && prevProps.showBaseline === nextProps.showBaseline && prevProps.isFilterMatch === nextProps.isFilterMatch && prevProps.businessDays === nextProps.businessDays && prevProps.customDays === nextProps.customDays && prevProps.isWeekend === nextProps.isWeekend && prevProps.disableTaskDrag === nextProps.disableTaskDrag && prevProps.disableDependencyEditing === nextProps.disableDependencyEditing && prevProps.isDependencyDragActive === nextProps.isDependencyDragActive && prevProps.viewMode === nextProps.viewMode && prevProps.showTaskDateLabels === nextProps.showTaskDateLabels && prevProps.showTaskNames === nextProps.showTaskNames;
4404
4406
  };
4405
4407
  var TaskRow = import_react3.default.memo(
4406
- ({ task, monthStart, dayWidth, rowHeight, onTasksChange, onScheduleIntent, onDragStateChange, rowIndex, allTasks, enableAutoSchedule, disableConstraints, overridePosition, previewPositionStore, onCascadeProgress, onCascade, divider, highlightExpiredTasks, isCritical = false, showBaseline = false, isFilterMatch = false, businessDays, customDays, isWeekend: isWeekend3, disableTaskDrag = false, disableDependencyEditing = false, onDependencyPortPointerDown, isDependencyDragActive = false, viewMode = "day", showTaskDateLabels = true, showTaskNames = true }) => {
4408
+ ({ task, monthStart, dayWidth, rowHeight, onTasksChange, onScheduleIntent, onDragStateChange, rowIndex, allTasks, enableAutoSchedule, disableConstraints, deferCascadePreview = false, overridePosition, previewPositionStore, onCascadeProgress, onCascade, divider, highlightExpiredTasks, isCritical = false, showBaseline = false, isFilterMatch = false, businessDays, customDays, isWeekend: isWeekend3, disableTaskDrag = false, disableDependencyEditing = false, onDependencyPortPointerDown, isDependencyDragActive = false, viewMode = "day", showTaskDateLabels = true, showTaskNames = true }) => {
4407
4409
  const defaultParentBarColor = "#782FC4";
4408
4410
  const { divider: taskDivider } = task;
4409
4411
  const normalizedTask = (0, import_react3.useMemo)(() => normalizeTaskDatesForType(task), [task]);
@@ -4525,6 +4527,7 @@ var TaskRow = import_react3.default.memo(
4525
4527
  rowIndex,
4526
4528
  enableAutoSchedule,
4527
4529
  disableConstraints,
4530
+ deferCascadePreview,
4528
4531
  locked: task.locked,
4529
4532
  disableTaskDrag,
4530
4533
  onCascadeProgress,
@@ -4948,7 +4951,8 @@ var DragGuideLines = ({
4948
4951
  dragMode,
4949
4952
  left,
4950
4953
  width,
4951
- totalHeight
4954
+ totalHeight,
4955
+ top = 0
4952
4956
  }) => {
4953
4957
  if (!isDragging || !dragMode) {
4954
4958
  return null;
@@ -4962,6 +4966,7 @@ var DragGuideLines = ({
4962
4966
  className: "gantt-dgl-guideLine",
4963
4967
  style: {
4964
4968
  left: `${left}px`,
4969
+ top: `${top}px`,
4965
4970
  height: `${totalHeight}px`
4966
4971
  }
4967
4972
  }
@@ -4972,6 +4977,7 @@ var DragGuideLines = ({
4972
4977
  className: "gantt-dgl-guideLine",
4973
4978
  style: {
4974
4979
  left: `${left + width}px`,
4980
+ top: `${top}px`,
4975
4981
  height: `${totalHeight}px`
4976
4982
  }
4977
4983
  }
@@ -15637,7 +15643,8 @@ function TaskGanttChartInner(props, ref) {
15637
15643
  dragMode: dragGuideLines.dragMode,
15638
15644
  left: dragGuideLines.left,
15639
15645
  width: dragGuideLines.width,
15640
- totalHeight: totalGridHeight
15646
+ totalHeight: Math.min(totalGridHeight, scrollViewport.viewportHeight),
15647
+ top: Math.max(0, scrollViewport.scrollTop)
15641
15648
  }
15642
15649
  ),
15643
15650
  renderedChartTasks.map(({ task, index }) => /* @__PURE__ */ (0, import_jsx_runtime21.jsx)(
@@ -15660,6 +15667,7 @@ function TaskGanttChartInner(props, ref) {
15660
15667
  onTasksChange: handleTaskChange,
15661
15668
  onDragStateChange: (state) => {
15662
15669
  if (state.isDragging) {
15670
+ if (normalizedTasks.length >= 1e3) return;
15663
15671
  setDragGuideLines((current) => current && current.isDragging === state.isDragging && current.dragMode === state.dragMode && current.left === state.left && current.width === state.width ? current : state);
15664
15672
  setDraggedTaskOverride((current) => current && current.taskId === task.id && current.left === state.left && current.width === state.width ? current : { taskId: task.id, left: state.left, width: state.width });
15665
15673
  } else {
@@ -15674,6 +15682,7 @@ function TaskGanttChartInner(props, ref) {
15674
15682
  allTasks: normalizedTasks,
15675
15683
  enableAutoSchedule: enableAutoSchedule ?? false,
15676
15684
  disableConstraints: disableConstraints ?? false,
15685
+ deferCascadePreview: normalizedTasks.length >= 1e3,
15677
15686
  previewPositionStore,
15678
15687
  onCascadeProgress: handleCascadeProgress,
15679
15688
  onCascade: handleCascade,