gantt-task-react-powern 0.6.22 → 0.6.24

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.
@@ -721,7 +721,8 @@ var Tooltip = function Tooltip(_ref) {
721
721
  fontFamily = _ref.fontFamily,
722
722
  headerHeight = _ref.headerHeight,
723
723
  taskListWidth = _ref.taskListWidth,
724
- TooltipContent = _ref.TooltipContent;
724
+ TooltipContent = _ref.TooltipContent,
725
+ isDragging = _ref.isDragging;
725
726
  var tooltipRef = useRef(null);
726
727
 
727
728
  var _useState = useState(0),
@@ -739,6 +740,14 @@ var Tooltip = function Tooltip(_ref) {
739
740
  var newRelatedY = task.index * rowHeight - scrollY + headerHeight;
740
741
  var newRelatedX;
741
742
 
743
+ if (isDragging) {
744
+ newRelatedX = taskListWidth + svgContainerWidth - tooltipWidth - 10;
745
+ newRelatedY = headerHeight + 5;
746
+ setRelatedY(newRelatedY);
747
+ setRelatedX(newRelatedX);
748
+ return;
749
+ }
750
+
742
751
  if (rtl) {
743
752
  newRelatedX = task.x1 - arrowIndent * 1.5 - tooltipWidth - scrollX;
744
753
 
@@ -778,7 +787,7 @@ var Tooltip = function Tooltip(_ref) {
778
787
  setRelatedY(newRelatedY);
779
788
  setRelatedX(newRelatedX);
780
789
  }
781
- }, [tooltipRef, task, arrowIndent, scrollX, scrollY, headerHeight, taskListWidth, rowHeight, svgContainerHeight, svgContainerWidth, rtl]);
790
+ }, [tooltipRef, task, arrowIndent, scrollX, scrollY, headerHeight, taskListWidth, rowHeight, svgContainerHeight, svgContainerWidth, rtl, isDragging]);
782
791
  return React.createElement("div", {
783
792
  ref: tooltipRef,
784
793
  className: relatedX ? styles$2.tooltipDetailsContainer : styles$2.tooltipDetailsContainerHidden,
@@ -794,6 +803,8 @@ var Tooltip = function Tooltip(_ref) {
794
803
  }));
795
804
  };
796
805
  var StandardTooltipContent = function StandardTooltipContent(_ref2) {
806
+ var _task$plannedDuration, _task$actualDuration;
807
+
797
808
  var task = _ref2.task,
798
809
  fontSize = _ref2.fontSize,
799
810
  fontFamily = _ref2.fontFamily,
@@ -802,6 +813,8 @@ var StandardTooltipContent = function StandardTooltipContent(_ref2) {
802
813
  fontSize: fontSize,
803
814
  fontFamily: fontFamily
804
815
  };
816
+ var computedPlannedDuration = task.start && task.end && task.end.getTime() - task.start.getTime() > 0 ? Math.max(1, Math.round((task.end.getTime() - task.start.getTime()) / (1000 * 60 * 60 * 24))) : (_task$plannedDuration = task.plannedDuration) != null ? _task$plannedDuration : 0;
817
+ var computedActualDuration = task.actualStart && task.actualEnd && task.actualEnd.getTime() - task.actualStart.getTime() > 0 ? Math.max(1, Math.round((task.actualEnd.getTime() - task.actualStart.getTime()) / (1000 * 60 * 60 * 24))) : (_task$actualDuration = task.actualDuration) != null ? _task$actualDuration : 0;
805
818
  if (type == "planned") return React.createElement("div", {
806
819
  className: styles$2.tooltipDefaultContainer,
807
820
  style: style
@@ -811,7 +824,7 @@ var StandardTooltipContent = function StandardTooltipContent(_ref2) {
811
824
  }
812
825
  }, task.name + ": Planned dates: "), React.createElement("b", null, task.start.getMonth() + 1 + "/" + task.start.getDate() + "/" + task.start.getFullYear() + " - " + (task.end.getMonth() + 1) + "/" + task.end.getDate() + "/" + task.end.getFullYear()), task.end.getTime() - task.start.getTime() !== 0 && React.createElement("p", {
813
826
  className: styles$2.tooltipDefaultContainerParagraph
814
- }, "Duration: " + ~~Math.round((task.end.getTime() - task.start.getTime()) / (1000 * 60 * 60 * 24)) + " day(s)"), React.createElement("p", {
827
+ }, "Duration: " + computedPlannedDuration + " day(s)"), React.createElement("p", {
815
828
  className: styles$2.tooltipDefaultContainerParagraph
816
829
  }, !!task.progress && "Progress: " + task.progress + " %"));else return React.createElement("div", {
817
830
  className: styles$2.tooltipDefaultContainer,
@@ -822,7 +835,7 @@ var StandardTooltipContent = function StandardTooltipContent(_ref2) {
822
835
  }
823
836
  }, task.name + ": Actual dates: "), React.createElement("b", null, task.actualStart.getMonth() + 1 + "/" + task.actualStart.getDate() + "/" + task.actualStart.getFullYear() + " - " + (task.actualEnd.getMonth() + 1) + "/" + task.actualEnd.getDate() + "/" + task.actualEnd.getFullYear()), task.actualEnd.getTime() - task.actualStart.getTime() !== 0 && React.createElement("p", {
824
837
  className: styles$2.tooltipDefaultContainerParagraph
825
- }, "Duration: " + ~~Math.round((task.actualEnd.getTime() - task.actualStart.getTime()) / (1000 * 60 * 60 * 24)) + " day(s)"), React.createElement("p", {
838
+ }, "Duration: " + computedActualDuration + " day(s)"), React.createElement("p", {
826
839
  className: styles$2.tooltipDefaultContainerParagraph
827
840
  }, !!task.progress && "Progress: " + task.progress + " %"));
828
841
  };
@@ -3053,6 +3066,7 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
3053
3066
  setGanttEvent = _ref.setGanttEvent,
3054
3067
  setFailedTask = _ref.setFailedTask,
3055
3068
  setSelectedTask = _ref.setSelectedTask,
3069
+ onBarTasksUpdate = _ref.onBarTasksUpdate,
3056
3070
  onDateChange = _ref.onDateChange,
3057
3071
  onProgressChange = _ref.onProgressChange,
3058
3072
  onDoubleClick = _ref.onDoubleClick,
@@ -3061,7 +3075,8 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
3061
3075
  onCalendarError = _ref.onCalendarError,
3062
3076
  projectCalendar = _ref.projectCalendar,
3063
3077
  visibleStartY = _ref.visibleStartY,
3064
- visibleEndY = _ref.visibleEndY;
3078
+ visibleEndY = _ref.visibleEndY,
3079
+ sliderTime = _ref.sliderTime;
3065
3080
  var point = svg === null || svg === void 0 ? void 0 : (_svg$current = svg.current) === null || _svg$current === void 0 ? void 0 : _svg$current.createSVGPoint();
3066
3081
 
3067
3082
  var _useState = useState(0),
@@ -3096,35 +3111,98 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
3096
3111
  changedTask = _handleTaskBySVGMouse.changedTask;
3097
3112
 
3098
3113
  if (isChanged) {
3099
- var finalTask = changedTask;
3114
+ var finalTask = _extends({}, changedTask);
3115
+
3116
+ var dragType = ganttEvent.type;
3100
3117
 
3101
3118
  if (changedTask.calender && (ganttEvent.action === "end" || ganttEvent.action === "start" || ganttEvent.action === "move")) {
3102
- finalTask = _extends({}, changedTask);
3103
3119
  var cal = finalTask.calender;
3104
3120
 
3105
- if (ganttEvent.action === "end") {
3106
- var snapped = snapToWorkingTime(finalTask.end, cal, "forward");
3107
- finalTask.end = snapped;
3108
- finalTask.x2 = taskXCoordinate(snapped, dates, columnWidth);
3109
- } else if (ganttEvent.action === "start") {
3110
- var _snapped = snapToWorkingTime(finalTask.start, cal, "forward");
3121
+ if (dragType === "actual") {
3122
+ if (ganttEvent.action === "end") {
3123
+ var snapped = snapToWorkingTime(finalTask.actualEnd, cal, "forward");
3124
+ finalTask.actualEnd = snapped;
3125
+ finalTask.actualx2 = taskXCoordinate(snapped, dates, columnWidth);
3126
+ } else if (ganttEvent.action === "start") {
3127
+ var _snapped = snapToWorkingTime(finalTask.actualStart, cal, "forward");
3128
+
3129
+ finalTask.actualStart = _snapped;
3130
+ finalTask.actualx1 = taskXCoordinate(_snapped, dates, columnWidth);
3131
+ } else {
3132
+ var _snapped2 = snapToWorkingTime(finalTask.actualStart, cal, "forward");
3133
+
3134
+ var delta = _snapped2.getTime() - finalTask.actualStart.getTime();
3135
+ finalTask.actualStart = _snapped2;
3136
+ finalTask.actualEnd = new Date(finalTask.actualEnd.getTime() + delta);
3137
+ finalTask.actualx1 = taskXCoordinate(finalTask.actualStart, dates, columnWidth);
3138
+ finalTask.actualx2 = taskXCoordinate(finalTask.actualEnd, dates, columnWidth);
3139
+ }
3140
+
3141
+ var actEnd = addToDate(startOfDate(finalTask.actualEnd, "day"), 1, "day");
3142
+ var actIntervals = getWorkingIntervals(finalTask.actualStart, actEnd, cal);
3143
+ var actSegs = actIntervals.map(function (iv) {
3144
+ return {
3145
+ x1: taskXCoordinate(iv.start, dates, columnWidth),
3146
+ x2: taskXCoordinate(iv.end, dates, columnWidth)
3147
+ };
3148
+ }).filter(function (s) {
3149
+ return s.x2 > s.x1;
3150
+ });
3151
+ finalTask.actualSegments = actSegs.length > 0 ? actSegs : undefined;
3152
+ var actDays = Math.max(1, Math.round((finalTask.actualEnd.getTime() - finalTask.actualStart.getTime()) / (1000 * 60 * 60 * 24)));
3153
+ finalTask.actualDuration = actDays;
3154
+ } else {
3155
+ if (ganttEvent.action === "end") {
3156
+ var _snapped3 = snapToWorkingTime(finalTask.end, cal, "forward");
3157
+
3158
+ finalTask.end = _snapped3;
3159
+ finalTask.x2 = taskXCoordinate(_snapped3, dates, columnWidth);
3160
+ } else if (ganttEvent.action === "start") {
3161
+ var _snapped4 = snapToWorkingTime(finalTask.start, cal, "forward");
3162
+
3163
+ finalTask.start = _snapped4;
3164
+ finalTask.x1 = taskXCoordinate(_snapped4, dates, columnWidth);
3165
+ } else {
3166
+ var _snapped5 = snapToWorkingTime(finalTask.start, cal, "forward");
3167
+
3168
+ var _delta = _snapped5.getTime() - finalTask.start.getTime();
3169
+
3170
+ finalTask.start = _snapped5;
3171
+ finalTask.end = new Date(finalTask.end.getTime() + _delta);
3172
+ finalTask.x1 = taskXCoordinate(finalTask.start, dates, columnWidth);
3173
+ finalTask.x2 = taskXCoordinate(finalTask.end, dates, columnWidth);
3174
+ }
3175
+
3176
+ var planEnd = addToDate(startOfDate(finalTask.end, "day"), 1, "day");
3177
+ var planIntervals = getWorkingIntervals(finalTask.start, planEnd, cal);
3178
+ var planSegs = planIntervals.map(function (iv) {
3179
+ return {
3180
+ x1: taskXCoordinate(iv.start, dates, columnWidth),
3181
+ x2: taskXCoordinate(iv.end, dates, columnWidth)
3182
+ };
3183
+ }).filter(function (s) {
3184
+ return s.x2 > s.x1;
3185
+ });
3186
+ finalTask.plannedSegments = planSegs.length > 0 ? planSegs : undefined;
3187
+ var planDays = Math.max(1, Math.round((finalTask.end.getTime() - finalTask.start.getTime()) / (1000 * 60 * 60 * 24)));
3188
+ finalTask.plannedDuration = planDays;
3189
+ }
3190
+ } else {
3191
+ if (dragType === "actual") {
3192
+ var _actDays = Math.max(1, Math.round((finalTask.actualEnd.getTime() - finalTask.actualStart.getTime()) / (1000 * 60 * 60 * 24)));
3111
3193
 
3112
- finalTask.start = _snapped;
3113
- finalTask.x1 = taskXCoordinate(_snapped, dates, columnWidth);
3194
+ finalTask.actualDuration = _actDays;
3114
3195
  } else {
3115
- var _snapped2 = snapToWorkingTime(finalTask.start, cal, "forward");
3196
+ var _planDays = Math.max(1, Math.round((finalTask.end.getTime() - finalTask.start.getTime()) / (1000 * 60 * 60 * 24)));
3116
3197
 
3117
- var delta = _snapped2.getTime() - finalTask.start.getTime();
3118
- finalTask.start = _snapped2;
3119
- finalTask.end = new Date(finalTask.end.getTime() + delta);
3120
- finalTask.x1 = taskXCoordinate(finalTask.start, dates, columnWidth);
3121
- finalTask.x2 = taskXCoordinate(finalTask.end, dates, columnWidth);
3198
+ finalTask.plannedDuration = _planDays;
3122
3199
  }
3123
3200
  }
3124
3201
 
3125
3202
  setGanttEvent({
3126
3203
  action: ganttEvent.action,
3127
- changedTask: finalTask
3204
+ changedTask: finalTask,
3205
+ type: dragType
3128
3206
  });
3129
3207
  }
3130
3208
 
@@ -3157,56 +3235,123 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
3157
3235
  newChangedTask = _handleTaskBySVGMouse2.changedTask;
3158
3236
 
3159
3237
  var isNotLikeOriginal = originalSelectedTask.start !== newChangedTask.start || originalSelectedTask.end !== newChangedTask.end || originalSelectedTask.actualStart !== newChangedTask.actualStart || originalSelectedTask.actualEnd !== newChangedTask.actualEnd || originalSelectedTask.progress !== newChangedTask.progress;
3238
+ var dropType = type;
3160
3239
 
3161
3240
  if (newChangedTask.calender && (action === "move" || action === "end" || action === "start")) {
3162
3241
  var cal = newChangedTask.calender;
3163
3242
 
3164
- if (action === "end") {
3165
- var snappedEnd = snapToWorkingTime(newChangedTask.end, cal, "forward");
3166
- newChangedTask.end = snappedEnd;
3167
- newChangedTask.x2 = taskXCoordinate(snappedEnd, dates, columnWidth);
3168
- } else if (action === "start") {
3169
- var snappedStart = snapToWorkingTime(newChangedTask.start, cal, "forward");
3243
+ if (dropType === "actual") {
3244
+ if (action === "end") {
3245
+ var snappedEnd = snapToWorkingTime(newChangedTask.actualEnd, cal, "forward");
3246
+ newChangedTask.actualEnd = snappedEnd;
3247
+ newChangedTask.actualx2 = taskXCoordinate(snappedEnd, dates, columnWidth);
3248
+ } else if (action === "start") {
3249
+ var snappedStart = snapToWorkingTime(newChangedTask.actualStart, cal, "forward");
3250
+
3251
+ if (snappedStart >= newChangedTask.actualEnd) {
3252
+ setFailedTask(originalSelectedTask);
3253
+ onCalendarError === null || onCalendarError === void 0 ? void 0 : onCalendarError(newChangedTask, "No working time in selected range");
3254
+ setGanttEvent({
3255
+ action: ""
3256
+ });
3257
+ setIsMoving(false);
3258
+ svg.current.removeEventListener("mousemove", handleMouseMove);
3259
+ svg.current.removeEventListener("mouseup", handleMouseUp);
3260
+ return Promise.resolve();
3261
+ }
3170
3262
 
3171
- if (snappedStart >= newChangedTask.end) {
3172
- setFailedTask(originalSelectedTask);
3173
- onCalendarError === null || onCalendarError === void 0 ? void 0 : onCalendarError(newChangedTask, "No working time in selected range");
3174
- setGanttEvent({
3175
- action: ""
3176
- });
3177
- setIsMoving(false);
3178
- svg.current.removeEventListener("mousemove", handleMouseMove);
3179
- svg.current.removeEventListener("mouseup", handleMouseUp);
3180
- return Promise.resolve();
3263
+ newChangedTask.actualStart = snappedStart;
3264
+ newChangedTask.actualx1 = taskXCoordinate(snappedStart, dates, columnWidth);
3265
+ } else {
3266
+ var _snappedStart = snapToWorkingTime(newChangedTask.actualStart, cal, "forward");
3267
+
3268
+ var delta = _snappedStart.getTime() - newChangedTask.actualStart.getTime();
3269
+ newChangedTask.actualStart = _snappedStart;
3270
+ newChangedTask.actualEnd = new Date(newChangedTask.actualEnd.getTime() + delta);
3271
+ newChangedTask.actualx1 = taskXCoordinate(_snappedStart, dates, columnWidth);
3272
+ newChangedTask.actualx2 = taskXCoordinate(newChangedTask.actualEnd, dates, columnWidth);
3181
3273
  }
3182
3274
 
3183
- newChangedTask.start = snappedStart;
3184
- newChangedTask.x1 = taskXCoordinate(snappedStart, dates, columnWidth);
3275
+ var actEnd = addToDate(startOfDate(newChangedTask.actualEnd, "day"), 1, "day");
3276
+ var actIntervals = getWorkingIntervals(newChangedTask.actualStart, actEnd, cal);
3277
+ var actSegs = actIntervals.map(function (iv) {
3278
+ return {
3279
+ x1: taskXCoordinate(iv.start, dates, columnWidth),
3280
+ x2: taskXCoordinate(iv.end, dates, columnWidth)
3281
+ };
3282
+ }).filter(function (s) {
3283
+ return s.x2 > s.x1;
3284
+ });
3285
+ newChangedTask.actualSegments = actSegs.length > 0 ? actSegs : undefined;
3286
+ var actDays = Math.max(1, Math.round((newChangedTask.actualEnd.getTime() - newChangedTask.actualStart.getTime()) / (1000 * 60 * 60 * 24)));
3287
+ newChangedTask.actualDuration = actDays;
3185
3288
  } else {
3186
- var _snappedStart = snapToWorkingTime(newChangedTask.start, cal, "forward");
3289
+ if (action === "end") {
3290
+ var _snappedEnd = snapToWorkingTime(newChangedTask.end, cal, "forward");
3291
+
3292
+ newChangedTask.end = _snappedEnd;
3293
+ newChangedTask.x2 = taskXCoordinate(_snappedEnd, dates, columnWidth);
3294
+ } else if (action === "start") {
3295
+ var _snappedStart2 = snapToWorkingTime(newChangedTask.start, cal, "forward");
3296
+
3297
+ if (_snappedStart2 >= newChangedTask.end) {
3298
+ setFailedTask(originalSelectedTask);
3299
+ onCalendarError === null || onCalendarError === void 0 ? void 0 : onCalendarError(newChangedTask, "No working time in selected range");
3300
+ setGanttEvent({
3301
+ action: ""
3302
+ });
3303
+ setIsMoving(false);
3304
+ svg.current.removeEventListener("mousemove", handleMouseMove);
3305
+ svg.current.removeEventListener("mouseup", handleMouseUp);
3306
+ return Promise.resolve();
3307
+ }
3308
+
3309
+ newChangedTask.start = _snappedStart2;
3310
+ newChangedTask.x1 = taskXCoordinate(_snappedStart2, dates, columnWidth);
3311
+ } else {
3312
+ var _snappedStart3 = snapToWorkingTime(newChangedTask.start, cal, "forward");
3313
+
3314
+ var _delta2 = _snappedStart3.getTime() - newChangedTask.start.getTime();
3187
3315
 
3188
- var delta = _snappedStart.getTime() - newChangedTask.start.getTime();
3189
- newChangedTask.start = _snappedStart;
3190
- newChangedTask.end = new Date(newChangedTask.end.getTime() + delta);
3191
- newChangedTask.x1 = taskXCoordinate(_snappedStart, dates, columnWidth);
3192
- newChangedTask.x2 = taskXCoordinate(newChangedTask.end, dates, columnWidth);
3316
+ newChangedTask.start = _snappedStart3;
3317
+ newChangedTask.end = new Date(newChangedTask.end.getTime() + _delta2);
3318
+ newChangedTask.x1 = taskXCoordinate(_snappedStart3, dates, columnWidth);
3319
+ newChangedTask.x2 = taskXCoordinate(newChangedTask.end, dates, columnWidth);
3320
+ }
3321
+
3322
+ var planEnd = addToDate(startOfDate(newChangedTask.end, "day"), 1, "day");
3323
+ var planIntervals = getWorkingIntervals(newChangedTask.start, planEnd, cal);
3324
+ var planSegs = planIntervals.map(function (iv) {
3325
+ return {
3326
+ x1: taskXCoordinate(iv.start, dates, columnWidth),
3327
+ x2: taskXCoordinate(iv.end, dates, columnWidth)
3328
+ };
3329
+ }).filter(function (s) {
3330
+ return s.x2 > s.x1;
3331
+ });
3332
+ newChangedTask.plannedSegments = planSegs.length > 0 ? planSegs : undefined;
3333
+ var planDays = Math.max(1, Math.round((newChangedTask.end.getTime() - newChangedTask.start.getTime()) / (1000 * 60 * 60 * 24)));
3334
+ newChangedTask.plannedDuration = planDays;
3193
3335
  }
3336
+ } else if (action === "move" || action === "end" || action === "start") {
3337
+ if (dropType === "actual") {
3338
+ var _actDays2 = Math.max(1, Math.round((newChangedTask.actualEnd.getTime() - newChangedTask.actualStart.getTime()) / (1000 * 60 * 60 * 24)));
3194
3339
 
3195
- var snapEnd = addToDate(startOfDate(newChangedTask.end, "day"), 1, "day");
3196
- var newIntervals = getWorkingIntervals(newChangedTask.start, snapEnd, cal);
3197
- var segs = newIntervals.map(function (iv) {
3198
- return {
3199
- x1: taskXCoordinate(iv.start, dates, columnWidth),
3200
- x2: taskXCoordinate(iv.end, dates, columnWidth)
3201
- };
3202
- }).filter(function (s) {
3203
- return s.x2 > s.x1;
3204
- });
3205
- newChangedTask.plannedSegments = segs.length > 0 ? segs : undefined;
3340
+ newChangedTask.actualDuration = _actDays2;
3341
+ } else {
3342
+ var _planDays2 = Math.max(1, Math.round((newChangedTask.end.getTime() - newChangedTask.start.getTime()) / (1000 * 60 * 60 * 24)));
3343
+
3344
+ newChangedTask.plannedDuration = _planDays2;
3345
+ }
3206
3346
  }
3207
3347
 
3208
3348
  svg.current.removeEventListener("mousemove", handleMouseMove);
3209
3349
  svg.current.removeEventListener("mouseup", handleMouseUp);
3350
+
3351
+ if (onBarTasksUpdate && isNotLikeOriginal) {
3352
+ onBarTasksUpdate(newChangedTask);
3353
+ }
3354
+
3210
3355
  setGanttEvent({
3211
3356
  action: ""
3212
3357
  });
@@ -3258,7 +3403,7 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
3258
3403
  svg.current.addEventListener("mouseup", handleMouseUp);
3259
3404
  setIsMoving(true);
3260
3405
  }
3261
- }, [ganttEvent, xStep, initEventX1Delta, onProgressChange, timeStep, onDateChange, onCalendarError, projectCalendar, svg, isMoving, point, rtl, setFailedTask, setGanttEvent, dates, columnWidth]);
3406
+ }, [ganttEvent, xStep, initEventX1Delta, onProgressChange, timeStep, onDateChange, onCalendarError, projectCalendar, svg, isMoving, point, rtl, setFailedTask, setGanttEvent, onBarTasksUpdate, dates, columnWidth]);
3262
3407
 
3263
3408
  var handleBarEventStart = function handleBarEventStart(action, task, event, type) {
3264
3409
  try {
@@ -3344,7 +3489,9 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
3344
3489
 
3345
3490
  var getArrows = function getArrows(isCritical, criticalPathType) {
3346
3491
  return tasks.flatMap(function (_task) {
3347
- var task = _task.start.getTime() > 0 && _task.end.getTime() > 0 ? _task : undefined;
3492
+ var _live = ganttEvent.changedTask && ganttEvent.changedTask.id === _task.id ? ganttEvent.changedTask : _task;
3493
+
3494
+ var task = _live.start.getTime() > 0 && _live.end.getTime() > 0 ? _live : undefined;
3348
3495
 
3349
3496
  if (!task) {
3350
3497
  return [];
@@ -3386,9 +3533,32 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
3386
3533
  });
3387
3534
  };
3388
3535
 
3536
+ var lineX = sliderTime !== undefined ? taskXCoordinate(new Date(sliderTime), dates, columnWidth) : null;
3537
+ var totalHeight = tasks.length * rowHeight;
3538
+ useEffect(function () {
3539
+ if (sliderTime !== undefined) {
3540
+ console.log('Vertical line debug:', {
3541
+ sliderTime: new Date(sliderTime).toLocaleString(),
3542
+ lineX: lineX,
3543
+ totalHeight: totalHeight,
3544
+ tasksCount: tasks.length,
3545
+ columnWidth: columnWidth,
3546
+ datesRange: dates.length > 0 ? dates[0].toLocaleString() + " - " + dates[dates.length - 1].toLocaleString() : 'empty'
3547
+ });
3548
+ }
3549
+ }, [sliderTime, lineX, totalHeight, tasks.length, dates, columnWidth]);
3389
3550
  return React.createElement("g", {
3390
3551
  className: "content"
3391
- }, React.createElement("g", {
3552
+ }, lineX !== null && lineX > 0 && React.createElement("line", {
3553
+ x1: lineX,
3554
+ y1: 0,
3555
+ x2: lineX,
3556
+ y2: totalHeight,
3557
+ stroke: "red",
3558
+ strokeWidth: 2,
3559
+ pointerEvents: "none",
3560
+ opacity: 0.8
3561
+ }), React.createElement("g", {
3392
3562
  className: "arrows"
3393
3563
  }, getArrows(false), getArrows(true, "secondary"), getArrows(true, "primary")), React.createElement("g", {
3394
3564
  className: "bar",
@@ -3396,8 +3566,9 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
3396
3566
  fontSize: fontSize
3397
3567
  }, virtualItems.map(function (vi) {
3398
3568
  var _task = tasks[vi.index];
3399
-
3400
- var task = _extends({}, _task, {
3569
+ var task = ganttEvent.changedTask && ganttEvent.changedTask.id === _task.id ? _extends({}, ganttEvent.changedTask, {
3570
+ y: 0
3571
+ }) : _extends({}, _task, {
3401
3572
  y: 0
3402
3573
  });
3403
3574
 
@@ -3643,7 +3814,8 @@ var Gantt = function Gantt(_ref) {
3643
3814
  _ref$shouldNotShowLoa = _ref.shouldNotShowLoadingOverlay,
3644
3815
  shouldNotShowLoadingOverlay = _ref$shouldNotShowLoa === void 0 ? true : _ref$shouldNotShowLoa,
3645
3816
  projectCalendar = _ref.projectCalendar,
3646
- onCalendarError = _ref.onCalendarError;
3817
+ onCalendarError = _ref.onCalendarError,
3818
+ sliderTime = _ref.sliderTime;
3647
3819
  var effectiveCalendar = (_tasks$find$calender = (_tasks$find = tasks.find(function (t) {
3648
3820
  return t.calender;
3649
3821
  })) === null || _tasks$find === void 0 ? void 0 : _tasks$find.calender) != null ? _tasks$find$calender : projectCalendar;
@@ -3749,6 +3921,14 @@ var Gantt = function Gantt(_ref) {
3749
3921
  ganttEvent = _useState9[0],
3750
3922
  setGanttEvent = _useState9[1];
3751
3923
 
3924
+ var handleBarTasksUpdate = function handleBarTasksUpdate(task) {
3925
+ setBarTasks(function (prev) {
3926
+ return prev.map(function (t) {
3927
+ return t.id === task.id ? task : t;
3928
+ });
3929
+ });
3930
+ };
3931
+
3752
3932
  var taskHeight = useMemo(function () {
3753
3933
  return rowHeight * barFill / 100;
3754
3934
  }, [rowHeight, barFill]);
@@ -3893,17 +4073,6 @@ var Gantt = function Gantt(_ref) {
3893
4073
  setBarTasks(barTasks.filter(function (t) {
3894
4074
  return t.id !== changedTask.id;
3895
4075
  }));
3896
- } else if (action === "move" || action === "end" || action === "start" || action === "progress") {
3897
- var prevStateTask = barTasks.find(function (t) {
3898
- return t.id === changedTask.id;
3899
- });
3900
-
3901
- if (prevStateTask && (prevStateTask.start.getTime() >= 0 && prevStateTask.start.getTime() !== changedTask.start.getTime() || prevStateTask.end.getTime() >= 0 && prevStateTask.end.getTime() !== changedTask.end.getTime() || (prevStateTask.actualStart.getTime() >= 0 && prevStateTask.actualStart.getTime()) !== changedTask.actualStart.getTime() || prevStateTask.actualEnd.getTime() >= 0 && prevStateTask.actualEnd.getTime() !== changedTask.actualEnd.getTime() || prevStateTask.progress !== changedTask.progress)) {
3902
- var newTaskList = barTasks.map(function (t) {
3903
- return t.id === changedTask.id ? changedTask : t;
3904
- });
3905
- setBarTasks(newTaskList);
3906
- }
3907
4076
  }
3908
4077
  }
3909
4078
  }, [ganttEvent, barTasks]);
@@ -4175,6 +4344,7 @@ var Gantt = function Gantt(_ref) {
4175
4344
  setGanttEvent: setGanttEvent,
4176
4345
  setFailedTask: setFailedTask,
4177
4346
  setSelectedTask: handleSelectedTask,
4347
+ onBarTasksUpdate: handleBarTasksUpdate,
4178
4348
  onDateChange: onDateChange,
4179
4349
  onProgressChange: onProgressChange,
4180
4350
  onDoubleClick: onDoubleClick,
@@ -4183,14 +4353,20 @@ var Gantt = function Gantt(_ref) {
4183
4353
  onCalendarError: onCalendarError,
4184
4354
  projectCalendar: effectiveCalendar,
4185
4355
  visibleStartY: visibleStartY,
4186
- visibleEndY: visibleEndY
4356
+ visibleEndY: visibleEndY,
4357
+ sliderTime: sliderTime
4187
4358
  };
4359
+ var tableTasks = useMemo(function () {
4360
+ return ganttEvent.changedTask ? barTasks.map(function (t) {
4361
+ return t.id === ganttEvent.changedTask.id ? ganttEvent.changedTask : t;
4362
+ }) : barTasks;
4363
+ }, [barTasks, ganttEvent.changedTask]);
4188
4364
  var tableProps = {
4189
4365
  rowHeight: rowHeight,
4190
4366
  rowWidth: listCellWidth,
4191
4367
  fontFamily: fontFamily,
4192
4368
  fontSize: fontSize,
4193
- tasks: barTasks,
4369
+ tasks: tableTasks,
4194
4370
  leafTasks: leafTasks,
4195
4371
  scheduleType: scheduleType,
4196
4372
  locale: locale,
@@ -4258,7 +4434,8 @@ var Gantt = function Gantt(_ref) {
4258
4434
  taskListWidth: taskListWidth,
4259
4435
  TooltipContent: TooltipContent,
4260
4436
  rtl: rtl,
4261
- svgWidth: svgWidth
4437
+ svgWidth: svgWidth,
4438
+ isDragging: ganttEvent.action === "move" || ganttEvent.action === "start" || ganttEvent.action === "end" || ganttEvent.action === "progress"
4262
4439
  }), React.createElement(VerticalScroll, {
4263
4440
  ganttFullHeight: ganttFullHeight,
4264
4441
  ganttHeight: ganttHeight,
@@ -4468,12 +4645,41 @@ function computeCriticalPath(taskID, taskMap) {
4468
4645
  taskMap[taskID].paths = [];
4469
4646
 
4470
4647
  for (var j = 0; j < dependents.length; j++) {
4471
- var depDuration = taskMap[dependents[j]].task.end.getTime() - taskMap[dependents[j]].task.start.getTime();
4472
- var overlap = Math.max(taskMap[taskID].end - taskMap[dependents[j]].task.start.getTime(), 0);
4648
+ var depStart = taskMap[dependents[j]].task.start.getTime();
4649
+ var depEnd = taskMap[dependents[j]].task.end.getTime();
4650
+ var depDuration = depEnd - depStart;
4651
+ var startWeek = Math.floor((depStart / 86400000 + 4) / 7);
4652
+ var endWeek = Math.floor((depEnd / 86400000 + 4) / 7);
4653
+ var offTime = 0;
4654
+
4655
+ for (var d = 0; d < ((_taskMap$dependents$j = taskMap[dependents[j]].task.calendar) === null || _taskMap$dependents$j === void 0 ? void 0 : (_taskMap$dependents$j2 = _taskMap$dependents$j.off_days) === null || _taskMap$dependents$j2 === void 0 ? void 0 : _taskMap$dependents$j2.length) || 0; d++) {
4656
+ var _taskMap$dependents$j, _taskMap$dependents$j2;
4657
+
4658
+ for (var w = startWeek; w <= endWeek; w++) {
4659
+ var dayOfTheWeek = taskMap[dependents[j]].task.calendar.off_days[d];
4660
+ var offDay = 86400000 * (7 * w - 4 + dayOfTheWeek);
4661
+
4662
+ if (offDay >= depStart && offDay <= depEnd && (offDay > taskMap[taskID].end || taskMap[taskID].task.calendar.off_days.includes(dayOfTheWeek))) {
4663
+ offTime += 86400000;
4664
+ }
4665
+ }
4666
+ }
4667
+
4668
+ for (var h = 0; h < ((_taskMap$dependents$j3 = taskMap[dependents[j]].task.calendar) === null || _taskMap$dependents$j3 === void 0 ? void 0 : (_taskMap$dependents$j4 = _taskMap$dependents$j3.holidays) === null || _taskMap$dependents$j4 === void 0 ? void 0 : _taskMap$dependents$j4.length) || 0; h++) {
4669
+ var _taskMap$dependents$j3, _taskMap$dependents$j4;
4670
+
4671
+ var holiday = taskMap[dependents[j]].task.calendar.holidays[h];
4672
+
4673
+ if (holiday >= depStart && holiday <= depEnd) {
4674
+ offTime += 86400000;
4675
+ }
4676
+ }
4677
+
4678
+ var overlap = Math.max(taskMap[taskID].end - depStart, 0);
4473
4679
  var paths = taskMap[dependents[j]].paths;
4474
4680
 
4475
4681
  for (var k = 0; k < paths.length; k++) {
4476
- var totalDuration = taskMap[taskID].end - taskMap[taskID].start - overlap + paths[k].duration;
4682
+ var totalDuration = taskMap[taskID].end - taskMap[taskID].start - overlap - offTime + paths[k].duration;
4477
4683
 
4478
4684
  if (taskMap[taskID].paths.length < 2) {
4479
4685
  taskMap[taskID].paths.push({
@@ -4496,7 +4702,7 @@ function computeCriticalPath(taskID, taskMap) {
4496
4702
  }
4497
4703
 
4498
4704
  if (paths.length === 0) {
4499
- var immediateChildDuration = taskMap[taskID].end - taskMap[taskID].start + depDuration - overlap;
4705
+ var immediateChildDuration = taskMap[taskID].end - taskMap[taskID].start + depDuration - overlap - offTime;
4500
4706
 
4501
4707
  if (taskMap[taskID].paths.length < 2) {
4502
4708
  taskMap[taskID].paths.push({