gantt-task-react-powern 0.6.22 → 0.6.23

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,
@@ -3096,35 +3110,98 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
3096
3110
  changedTask = _handleTaskBySVGMouse.changedTask;
3097
3111
 
3098
3112
  if (isChanged) {
3099
- var finalTask = changedTask;
3113
+ var finalTask = _extends({}, changedTask);
3114
+
3115
+ var dragType = ganttEvent.type;
3100
3116
 
3101
3117
  if (changedTask.calender && (ganttEvent.action === "end" || ganttEvent.action === "start" || ganttEvent.action === "move")) {
3102
- finalTask = _extends({}, changedTask);
3103
3118
  var cal = finalTask.calender;
3104
3119
 
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");
3120
+ if (dragType === "actual") {
3121
+ if (ganttEvent.action === "end") {
3122
+ var snapped = snapToWorkingTime(finalTask.actualEnd, cal, "forward");
3123
+ finalTask.actualEnd = snapped;
3124
+ finalTask.actualx2 = taskXCoordinate(snapped, dates, columnWidth);
3125
+ } else if (ganttEvent.action === "start") {
3126
+ var _snapped = snapToWorkingTime(finalTask.actualStart, cal, "forward");
3127
+
3128
+ finalTask.actualStart = _snapped;
3129
+ finalTask.actualx1 = taskXCoordinate(_snapped, dates, columnWidth);
3130
+ } else {
3131
+ var _snapped2 = snapToWorkingTime(finalTask.actualStart, cal, "forward");
3132
+
3133
+ var delta = _snapped2.getTime() - finalTask.actualStart.getTime();
3134
+ finalTask.actualStart = _snapped2;
3135
+ finalTask.actualEnd = new Date(finalTask.actualEnd.getTime() + delta);
3136
+ finalTask.actualx1 = taskXCoordinate(finalTask.actualStart, dates, columnWidth);
3137
+ finalTask.actualx2 = taskXCoordinate(finalTask.actualEnd, dates, columnWidth);
3138
+ }
3139
+
3140
+ var actEnd = addToDate(startOfDate(finalTask.actualEnd, "day"), 1, "day");
3141
+ var actIntervals = getWorkingIntervals(finalTask.actualStart, actEnd, cal);
3142
+ var actSegs = actIntervals.map(function (iv) {
3143
+ return {
3144
+ x1: taskXCoordinate(iv.start, dates, columnWidth),
3145
+ x2: taskXCoordinate(iv.end, dates, columnWidth)
3146
+ };
3147
+ }).filter(function (s) {
3148
+ return s.x2 > s.x1;
3149
+ });
3150
+ finalTask.actualSegments = actSegs.length > 0 ? actSegs : undefined;
3151
+ var actDays = Math.max(1, Math.round((finalTask.actualEnd.getTime() - finalTask.actualStart.getTime()) / (1000 * 60 * 60 * 24)));
3152
+ finalTask.actualDuration = actDays;
3153
+ } else {
3154
+ if (ganttEvent.action === "end") {
3155
+ var _snapped3 = snapToWorkingTime(finalTask.end, cal, "forward");
3156
+
3157
+ finalTask.end = _snapped3;
3158
+ finalTask.x2 = taskXCoordinate(_snapped3, dates, columnWidth);
3159
+ } else if (ganttEvent.action === "start") {
3160
+ var _snapped4 = snapToWorkingTime(finalTask.start, cal, "forward");
3161
+
3162
+ finalTask.start = _snapped4;
3163
+ finalTask.x1 = taskXCoordinate(_snapped4, dates, columnWidth);
3164
+ } else {
3165
+ var _snapped5 = snapToWorkingTime(finalTask.start, cal, "forward");
3166
+
3167
+ var _delta = _snapped5.getTime() - finalTask.start.getTime();
3168
+
3169
+ finalTask.start = _snapped5;
3170
+ finalTask.end = new Date(finalTask.end.getTime() + _delta);
3171
+ finalTask.x1 = taskXCoordinate(finalTask.start, dates, columnWidth);
3172
+ finalTask.x2 = taskXCoordinate(finalTask.end, dates, columnWidth);
3173
+ }
3174
+
3175
+ var planEnd = addToDate(startOfDate(finalTask.end, "day"), 1, "day");
3176
+ var planIntervals = getWorkingIntervals(finalTask.start, planEnd, cal);
3177
+ var planSegs = planIntervals.map(function (iv) {
3178
+ return {
3179
+ x1: taskXCoordinate(iv.start, dates, columnWidth),
3180
+ x2: taskXCoordinate(iv.end, dates, columnWidth)
3181
+ };
3182
+ }).filter(function (s) {
3183
+ return s.x2 > s.x1;
3184
+ });
3185
+ finalTask.plannedSegments = planSegs.length > 0 ? planSegs : undefined;
3186
+ var planDays = Math.max(1, Math.round((finalTask.end.getTime() - finalTask.start.getTime()) / (1000 * 60 * 60 * 24)));
3187
+ finalTask.plannedDuration = planDays;
3188
+ }
3189
+ } else {
3190
+ if (dragType === "actual") {
3191
+ var _actDays = Math.max(1, Math.round((finalTask.actualEnd.getTime() - finalTask.actualStart.getTime()) / (1000 * 60 * 60 * 24)));
3111
3192
 
3112
- finalTask.start = _snapped;
3113
- finalTask.x1 = taskXCoordinate(_snapped, dates, columnWidth);
3193
+ finalTask.actualDuration = _actDays;
3114
3194
  } else {
3115
- var _snapped2 = snapToWorkingTime(finalTask.start, cal, "forward");
3195
+ var _planDays = Math.max(1, Math.round((finalTask.end.getTime() - finalTask.start.getTime()) / (1000 * 60 * 60 * 24)));
3116
3196
 
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);
3197
+ finalTask.plannedDuration = _planDays;
3122
3198
  }
3123
3199
  }
3124
3200
 
3125
3201
  setGanttEvent({
3126
3202
  action: ganttEvent.action,
3127
- changedTask: finalTask
3203
+ changedTask: finalTask,
3204
+ type: dragType
3128
3205
  });
3129
3206
  }
3130
3207
 
@@ -3157,56 +3234,123 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
3157
3234
  newChangedTask = _handleTaskBySVGMouse2.changedTask;
3158
3235
 
3159
3236
  var isNotLikeOriginal = originalSelectedTask.start !== newChangedTask.start || originalSelectedTask.end !== newChangedTask.end || originalSelectedTask.actualStart !== newChangedTask.actualStart || originalSelectedTask.actualEnd !== newChangedTask.actualEnd || originalSelectedTask.progress !== newChangedTask.progress;
3237
+ var dropType = type;
3160
3238
 
3161
3239
  if (newChangedTask.calender && (action === "move" || action === "end" || action === "start")) {
3162
3240
  var cal = newChangedTask.calender;
3163
3241
 
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");
3242
+ if (dropType === "actual") {
3243
+ if (action === "end") {
3244
+ var snappedEnd = snapToWorkingTime(newChangedTask.actualEnd, cal, "forward");
3245
+ newChangedTask.actualEnd = snappedEnd;
3246
+ newChangedTask.actualx2 = taskXCoordinate(snappedEnd, dates, columnWidth);
3247
+ } else if (action === "start") {
3248
+ var snappedStart = snapToWorkingTime(newChangedTask.actualStart, cal, "forward");
3249
+
3250
+ if (snappedStart >= newChangedTask.actualEnd) {
3251
+ setFailedTask(originalSelectedTask);
3252
+ onCalendarError === null || onCalendarError === void 0 ? void 0 : onCalendarError(newChangedTask, "No working time in selected range");
3253
+ setGanttEvent({
3254
+ action: ""
3255
+ });
3256
+ setIsMoving(false);
3257
+ svg.current.removeEventListener("mousemove", handleMouseMove);
3258
+ svg.current.removeEventListener("mouseup", handleMouseUp);
3259
+ return Promise.resolve();
3260
+ }
3170
3261
 
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();
3262
+ newChangedTask.actualStart = snappedStart;
3263
+ newChangedTask.actualx1 = taskXCoordinate(snappedStart, dates, columnWidth);
3264
+ } else {
3265
+ var _snappedStart = snapToWorkingTime(newChangedTask.actualStart, cal, "forward");
3266
+
3267
+ var delta = _snappedStart.getTime() - newChangedTask.actualStart.getTime();
3268
+ newChangedTask.actualStart = _snappedStart;
3269
+ newChangedTask.actualEnd = new Date(newChangedTask.actualEnd.getTime() + delta);
3270
+ newChangedTask.actualx1 = taskXCoordinate(_snappedStart, dates, columnWidth);
3271
+ newChangedTask.actualx2 = taskXCoordinate(newChangedTask.actualEnd, dates, columnWidth);
3181
3272
  }
3182
3273
 
3183
- newChangedTask.start = snappedStart;
3184
- newChangedTask.x1 = taskXCoordinate(snappedStart, dates, columnWidth);
3274
+ var actEnd = addToDate(startOfDate(newChangedTask.actualEnd, "day"), 1, "day");
3275
+ var actIntervals = getWorkingIntervals(newChangedTask.actualStart, actEnd, cal);
3276
+ var actSegs = actIntervals.map(function (iv) {
3277
+ return {
3278
+ x1: taskXCoordinate(iv.start, dates, columnWidth),
3279
+ x2: taskXCoordinate(iv.end, dates, columnWidth)
3280
+ };
3281
+ }).filter(function (s) {
3282
+ return s.x2 > s.x1;
3283
+ });
3284
+ newChangedTask.actualSegments = actSegs.length > 0 ? actSegs : undefined;
3285
+ var actDays = Math.max(1, Math.round((newChangedTask.actualEnd.getTime() - newChangedTask.actualStart.getTime()) / (1000 * 60 * 60 * 24)));
3286
+ newChangedTask.actualDuration = actDays;
3185
3287
  } else {
3186
- var _snappedStart = snapToWorkingTime(newChangedTask.start, cal, "forward");
3288
+ if (action === "end") {
3289
+ var _snappedEnd = snapToWorkingTime(newChangedTask.end, cal, "forward");
3290
+
3291
+ newChangedTask.end = _snappedEnd;
3292
+ newChangedTask.x2 = taskXCoordinate(_snappedEnd, dates, columnWidth);
3293
+ } else if (action === "start") {
3294
+ var _snappedStart2 = snapToWorkingTime(newChangedTask.start, cal, "forward");
3295
+
3296
+ if (_snappedStart2 >= newChangedTask.end) {
3297
+ setFailedTask(originalSelectedTask);
3298
+ onCalendarError === null || onCalendarError === void 0 ? void 0 : onCalendarError(newChangedTask, "No working time in selected range");
3299
+ setGanttEvent({
3300
+ action: ""
3301
+ });
3302
+ setIsMoving(false);
3303
+ svg.current.removeEventListener("mousemove", handleMouseMove);
3304
+ svg.current.removeEventListener("mouseup", handleMouseUp);
3305
+ return Promise.resolve();
3306
+ }
3187
3307
 
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);
3308
+ newChangedTask.start = _snappedStart2;
3309
+ newChangedTask.x1 = taskXCoordinate(_snappedStart2, dates, columnWidth);
3310
+ } else {
3311
+ var _snappedStart3 = snapToWorkingTime(newChangedTask.start, cal, "forward");
3312
+
3313
+ var _delta2 = _snappedStart3.getTime() - newChangedTask.start.getTime();
3314
+
3315
+ newChangedTask.start = _snappedStart3;
3316
+ newChangedTask.end = new Date(newChangedTask.end.getTime() + _delta2);
3317
+ newChangedTask.x1 = taskXCoordinate(_snappedStart3, dates, columnWidth);
3318
+ newChangedTask.x2 = taskXCoordinate(newChangedTask.end, dates, columnWidth);
3319
+ }
3320
+
3321
+ var planEnd = addToDate(startOfDate(newChangedTask.end, "day"), 1, "day");
3322
+ var planIntervals = getWorkingIntervals(newChangedTask.start, planEnd, cal);
3323
+ var planSegs = planIntervals.map(function (iv) {
3324
+ return {
3325
+ x1: taskXCoordinate(iv.start, dates, columnWidth),
3326
+ x2: taskXCoordinate(iv.end, dates, columnWidth)
3327
+ };
3328
+ }).filter(function (s) {
3329
+ return s.x2 > s.x1;
3330
+ });
3331
+ newChangedTask.plannedSegments = planSegs.length > 0 ? planSegs : undefined;
3332
+ var planDays = Math.max(1, Math.round((newChangedTask.end.getTime() - newChangedTask.start.getTime()) / (1000 * 60 * 60 * 24)));
3333
+ newChangedTask.plannedDuration = planDays;
3193
3334
  }
3335
+ } else if (action === "move" || action === "end" || action === "start") {
3336
+ if (dropType === "actual") {
3337
+ var _actDays2 = Math.max(1, Math.round((newChangedTask.actualEnd.getTime() - newChangedTask.actualStart.getTime()) / (1000 * 60 * 60 * 24)));
3194
3338
 
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;
3339
+ newChangedTask.actualDuration = _actDays2;
3340
+ } else {
3341
+ var _planDays2 = Math.max(1, Math.round((newChangedTask.end.getTime() - newChangedTask.start.getTime()) / (1000 * 60 * 60 * 24)));
3342
+
3343
+ newChangedTask.plannedDuration = _planDays2;
3344
+ }
3206
3345
  }
3207
3346
 
3208
3347
  svg.current.removeEventListener("mousemove", handleMouseMove);
3209
3348
  svg.current.removeEventListener("mouseup", handleMouseUp);
3349
+
3350
+ if (onBarTasksUpdate && isNotLikeOriginal) {
3351
+ onBarTasksUpdate(newChangedTask);
3352
+ }
3353
+
3210
3354
  setGanttEvent({
3211
3355
  action: ""
3212
3356
  });
@@ -3258,7 +3402,7 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
3258
3402
  svg.current.addEventListener("mouseup", handleMouseUp);
3259
3403
  setIsMoving(true);
3260
3404
  }
3261
- }, [ganttEvent, xStep, initEventX1Delta, onProgressChange, timeStep, onDateChange, onCalendarError, projectCalendar, svg, isMoving, point, rtl, setFailedTask, setGanttEvent, dates, columnWidth]);
3405
+ }, [ganttEvent, xStep, initEventX1Delta, onProgressChange, timeStep, onDateChange, onCalendarError, projectCalendar, svg, isMoving, point, rtl, setFailedTask, setGanttEvent, onBarTasksUpdate, dates, columnWidth]);
3262
3406
 
3263
3407
  var handleBarEventStart = function handleBarEventStart(action, task, event, type) {
3264
3408
  try {
@@ -3344,7 +3488,9 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
3344
3488
 
3345
3489
  var getArrows = function getArrows(isCritical, criticalPathType) {
3346
3490
  return tasks.flatMap(function (_task) {
3347
- var task = _task.start.getTime() > 0 && _task.end.getTime() > 0 ? _task : undefined;
3491
+ var _live = ganttEvent.changedTask && ganttEvent.changedTask.id === _task.id ? ganttEvent.changedTask : _task;
3492
+
3493
+ var task = _live.start.getTime() > 0 && _live.end.getTime() > 0 ? _live : undefined;
3348
3494
 
3349
3495
  if (!task) {
3350
3496
  return [];
@@ -3396,8 +3542,9 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
3396
3542
  fontSize: fontSize
3397
3543
  }, virtualItems.map(function (vi) {
3398
3544
  var _task = tasks[vi.index];
3399
-
3400
- var task = _extends({}, _task, {
3545
+ var task = ganttEvent.changedTask && ganttEvent.changedTask.id === _task.id ? _extends({}, ganttEvent.changedTask, {
3546
+ y: 0
3547
+ }) : _extends({}, _task, {
3401
3548
  y: 0
3402
3549
  });
3403
3550
 
@@ -3749,6 +3896,14 @@ var Gantt = function Gantt(_ref) {
3749
3896
  ganttEvent = _useState9[0],
3750
3897
  setGanttEvent = _useState9[1];
3751
3898
 
3899
+ var handleBarTasksUpdate = function handleBarTasksUpdate(task) {
3900
+ setBarTasks(function (prev) {
3901
+ return prev.map(function (t) {
3902
+ return t.id === task.id ? task : t;
3903
+ });
3904
+ });
3905
+ };
3906
+
3752
3907
  var taskHeight = useMemo(function () {
3753
3908
  return rowHeight * barFill / 100;
3754
3909
  }, [rowHeight, barFill]);
@@ -3893,17 +4048,6 @@ var Gantt = function Gantt(_ref) {
3893
4048
  setBarTasks(barTasks.filter(function (t) {
3894
4049
  return t.id !== changedTask.id;
3895
4050
  }));
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
4051
  }
3908
4052
  }
3909
4053
  }, [ganttEvent, barTasks]);
@@ -4175,6 +4319,7 @@ var Gantt = function Gantt(_ref) {
4175
4319
  setGanttEvent: setGanttEvent,
4176
4320
  setFailedTask: setFailedTask,
4177
4321
  setSelectedTask: handleSelectedTask,
4322
+ onBarTasksUpdate: handleBarTasksUpdate,
4178
4323
  onDateChange: onDateChange,
4179
4324
  onProgressChange: onProgressChange,
4180
4325
  onDoubleClick: onDoubleClick,
@@ -4185,12 +4330,17 @@ var Gantt = function Gantt(_ref) {
4185
4330
  visibleStartY: visibleStartY,
4186
4331
  visibleEndY: visibleEndY
4187
4332
  };
4333
+ var tableTasks = useMemo(function () {
4334
+ return ganttEvent.changedTask ? barTasks.map(function (t) {
4335
+ return t.id === ganttEvent.changedTask.id ? ganttEvent.changedTask : t;
4336
+ }) : barTasks;
4337
+ }, [barTasks, ganttEvent.changedTask]);
4188
4338
  var tableProps = {
4189
4339
  rowHeight: rowHeight,
4190
4340
  rowWidth: listCellWidth,
4191
4341
  fontFamily: fontFamily,
4192
4342
  fontSize: fontSize,
4193
- tasks: barTasks,
4343
+ tasks: tableTasks,
4194
4344
  leafTasks: leafTasks,
4195
4345
  scheduleType: scheduleType,
4196
4346
  locale: locale,
@@ -4258,7 +4408,8 @@ var Gantt = function Gantt(_ref) {
4258
4408
  taskListWidth: taskListWidth,
4259
4409
  TooltipContent: TooltipContent,
4260
4410
  rtl: rtl,
4261
- svgWidth: svgWidth
4411
+ svgWidth: svgWidth,
4412
+ isDragging: ganttEvent.action === "move" || ganttEvent.action === "start" || ganttEvent.action === "end" || ganttEvent.action === "progress"
4262
4413
  }), React.createElement(VerticalScroll, {
4263
4414
  ganttFullHeight: ganttFullHeight,
4264
4415
  ganttHeight: ganttHeight,
@@ -4468,12 +4619,41 @@ function computeCriticalPath(taskID, taskMap) {
4468
4619
  taskMap[taskID].paths = [];
4469
4620
 
4470
4621
  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);
4622
+ var depStart = taskMap[dependents[j]].task.start.getTime();
4623
+ var depEnd = taskMap[dependents[j]].task.end.getTime();
4624
+ var depDuration = depEnd - depStart;
4625
+ var startWeek = Math.floor((depStart / 86400000 + 4) / 7);
4626
+ var endWeek = Math.floor((depEnd / 86400000 + 4) / 7);
4627
+ var offTime = 0;
4628
+
4629
+ 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++) {
4630
+ var _taskMap$dependents$j, _taskMap$dependents$j2;
4631
+
4632
+ for (var w = startWeek; w <= endWeek; w++) {
4633
+ var dayOfTheWeek = taskMap[dependents[j]].task.calendar.off_days[d];
4634
+ var offDay = 86400000 * (7 * w - 4 + dayOfTheWeek);
4635
+
4636
+ if (offDay >= depStart && offDay <= depEnd && (offDay > taskMap[taskID].end || taskMap[taskID].task.calendar.off_days.includes(dayOfTheWeek))) {
4637
+ offTime += 86400000;
4638
+ }
4639
+ }
4640
+ }
4641
+
4642
+ 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++) {
4643
+ var _taskMap$dependents$j3, _taskMap$dependents$j4;
4644
+
4645
+ var holiday = taskMap[dependents[j]].task.calendar.holidays[h];
4646
+
4647
+ if (holiday >= depStart && holiday <= depEnd) {
4648
+ offTime += 86400000;
4649
+ }
4650
+ }
4651
+
4652
+ var overlap = Math.max(taskMap[taskID].end - depStart, 0);
4473
4653
  var paths = taskMap[dependents[j]].paths;
4474
4654
 
4475
4655
  for (var k = 0; k < paths.length; k++) {
4476
- var totalDuration = taskMap[taskID].end - taskMap[taskID].start - overlap + paths[k].duration;
4656
+ var totalDuration = taskMap[taskID].end - taskMap[taskID].start - overlap - offTime + paths[k].duration;
4477
4657
 
4478
4658
  if (taskMap[taskID].paths.length < 2) {
4479
4659
  taskMap[taskID].paths.push({
@@ -4496,7 +4676,7 @@ function computeCriticalPath(taskID, taskMap) {
4496
4676
  }
4497
4677
 
4498
4678
  if (paths.length === 0) {
4499
- var immediateChildDuration = taskMap[taskID].end - taskMap[taskID].start + depDuration - overlap;
4679
+ var immediateChildDuration = taskMap[taskID].end - taskMap[taskID].start + depDuration - overlap - offTime;
4500
4680
 
4501
4681
  if (taskMap[taskID].paths.length < 2) {
4502
4682
  taskMap[taskID].paths.push({