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.
@@ -26,5 +26,6 @@ export declare type TaskGanttContentProps = {
26
26
  setGanttEvent: (value: GanttEvent) => void;
27
27
  setFailedTask: (value: BarTask | null) => void;
28
28
  setSelectedTask: (taskId: string) => void;
29
+ onBarTasksUpdate?: (task: BarTask) => void;
29
30
  } & EventOption;
30
31
  export declare const TaskGanttContent: React.FC<TaskGanttContentProps>;
@@ -22,6 +22,7 @@ export declare type TooltipProps = {
22
22
  fontFamily: string;
23
23
  type: string;
24
24
  }>;
25
+ isDragging?: boolean;
25
26
  };
26
27
  export declare const Tooltip: React.FC<TooltipProps>;
27
28
  export declare const StandardTooltipContent: React.FC<{
package/dist/index.js CHANGED
@@ -722,7 +722,8 @@ var Tooltip = function Tooltip(_ref) {
722
722
  fontFamily = _ref.fontFamily,
723
723
  headerHeight = _ref.headerHeight,
724
724
  taskListWidth = _ref.taskListWidth,
725
- TooltipContent = _ref.TooltipContent;
725
+ TooltipContent = _ref.TooltipContent,
726
+ isDragging = _ref.isDragging;
726
727
  var tooltipRef = React.useRef(null);
727
728
 
728
729
  var _useState = React.useState(0),
@@ -740,6 +741,14 @@ var Tooltip = function Tooltip(_ref) {
740
741
  var newRelatedY = task.index * rowHeight - scrollY + headerHeight;
741
742
  var newRelatedX;
742
743
 
744
+ if (isDragging) {
745
+ newRelatedX = taskListWidth + svgContainerWidth - tooltipWidth - 10;
746
+ newRelatedY = headerHeight + 5;
747
+ setRelatedY(newRelatedY);
748
+ setRelatedX(newRelatedX);
749
+ return;
750
+ }
751
+
743
752
  if (rtl) {
744
753
  newRelatedX = task.x1 - arrowIndent * 1.5 - tooltipWidth - scrollX;
745
754
 
@@ -779,7 +788,7 @@ var Tooltip = function Tooltip(_ref) {
779
788
  setRelatedY(newRelatedY);
780
789
  setRelatedX(newRelatedX);
781
790
  }
782
- }, [tooltipRef, task, arrowIndent, scrollX, scrollY, headerHeight, taskListWidth, rowHeight, svgContainerHeight, svgContainerWidth, rtl]);
791
+ }, [tooltipRef, task, arrowIndent, scrollX, scrollY, headerHeight, taskListWidth, rowHeight, svgContainerHeight, svgContainerWidth, rtl, isDragging]);
783
792
  return React__default.createElement("div", {
784
793
  ref: tooltipRef,
785
794
  className: relatedX ? styles$2.tooltipDetailsContainer : styles$2.tooltipDetailsContainerHidden,
@@ -795,6 +804,8 @@ var Tooltip = function Tooltip(_ref) {
795
804
  }));
796
805
  };
797
806
  var StandardTooltipContent = function StandardTooltipContent(_ref2) {
807
+ var _task$plannedDuration, _task$actualDuration;
808
+
798
809
  var task = _ref2.task,
799
810
  fontSize = _ref2.fontSize,
800
811
  fontFamily = _ref2.fontFamily,
@@ -803,6 +814,8 @@ var StandardTooltipContent = function StandardTooltipContent(_ref2) {
803
814
  fontSize: fontSize,
804
815
  fontFamily: fontFamily
805
816
  };
817
+ 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;
818
+ 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;
806
819
  if (type == "planned") return React__default.createElement("div", {
807
820
  className: styles$2.tooltipDefaultContainer,
808
821
  style: style
@@ -812,7 +825,7 @@ var StandardTooltipContent = function StandardTooltipContent(_ref2) {
812
825
  }
813
826
  }, task.name + ": Planned dates: "), React__default.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__default.createElement("p", {
814
827
  className: styles$2.tooltipDefaultContainerParagraph
815
- }, "Duration: " + ~~Math.round((task.end.getTime() - task.start.getTime()) / (1000 * 60 * 60 * 24)) + " day(s)"), React__default.createElement("p", {
828
+ }, "Duration: " + computedPlannedDuration + " day(s)"), React__default.createElement("p", {
816
829
  className: styles$2.tooltipDefaultContainerParagraph
817
830
  }, !!task.progress && "Progress: " + task.progress + " %"));else return React__default.createElement("div", {
818
831
  className: styles$2.tooltipDefaultContainer,
@@ -823,7 +836,7 @@ var StandardTooltipContent = function StandardTooltipContent(_ref2) {
823
836
  }
824
837
  }, task.name + ": Actual dates: "), React__default.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__default.createElement("p", {
825
838
  className: styles$2.tooltipDefaultContainerParagraph
826
- }, "Duration: " + ~~Math.round((task.actualEnd.getTime() - task.actualStart.getTime()) / (1000 * 60 * 60 * 24)) + " day(s)"), React__default.createElement("p", {
839
+ }, "Duration: " + computedActualDuration + " day(s)"), React__default.createElement("p", {
827
840
  className: styles$2.tooltipDefaultContainerParagraph
828
841
  }, !!task.progress && "Progress: " + task.progress + " %"));
829
842
  };
@@ -3054,6 +3067,7 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
3054
3067
  setGanttEvent = _ref.setGanttEvent,
3055
3068
  setFailedTask = _ref.setFailedTask,
3056
3069
  setSelectedTask = _ref.setSelectedTask,
3070
+ onBarTasksUpdate = _ref.onBarTasksUpdate,
3057
3071
  onDateChange = _ref.onDateChange,
3058
3072
  onProgressChange = _ref.onProgressChange,
3059
3073
  onDoubleClick = _ref.onDoubleClick,
@@ -3097,35 +3111,98 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
3097
3111
  changedTask = _handleTaskBySVGMouse.changedTask;
3098
3112
 
3099
3113
  if (isChanged) {
3100
- var finalTask = changedTask;
3114
+ var finalTask = _extends({}, changedTask);
3115
+
3116
+ var dragType = ganttEvent.type;
3101
3117
 
3102
3118
  if (changedTask.calender && (ganttEvent.action === "end" || ganttEvent.action === "start" || ganttEvent.action === "move")) {
3103
- finalTask = _extends({}, changedTask);
3104
3119
  var cal = finalTask.calender;
3105
3120
 
3106
- if (ganttEvent.action === "end") {
3107
- var snapped = snapToWorkingTime(finalTask.end, cal, "forward");
3108
- finalTask.end = snapped;
3109
- finalTask.x2 = taskXCoordinate(snapped, dates, columnWidth);
3110
- } else if (ganttEvent.action === "start") {
3111
- 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)));
3112
3193
 
3113
- finalTask.start = _snapped;
3114
- finalTask.x1 = taskXCoordinate(_snapped, dates, columnWidth);
3194
+ finalTask.actualDuration = _actDays;
3115
3195
  } else {
3116
- 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)));
3117
3197
 
3118
- var delta = _snapped2.getTime() - finalTask.start.getTime();
3119
- finalTask.start = _snapped2;
3120
- finalTask.end = new Date(finalTask.end.getTime() + delta);
3121
- finalTask.x1 = taskXCoordinate(finalTask.start, dates, columnWidth);
3122
- finalTask.x2 = taskXCoordinate(finalTask.end, dates, columnWidth);
3198
+ finalTask.plannedDuration = _planDays;
3123
3199
  }
3124
3200
  }
3125
3201
 
3126
3202
  setGanttEvent({
3127
3203
  action: ganttEvent.action,
3128
- changedTask: finalTask
3204
+ changedTask: finalTask,
3205
+ type: dragType
3129
3206
  });
3130
3207
  }
3131
3208
 
@@ -3158,56 +3235,123 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
3158
3235
  newChangedTask = _handleTaskBySVGMouse2.changedTask;
3159
3236
 
3160
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;
3161
3239
 
3162
3240
  if (newChangedTask.calender && (action === "move" || action === "end" || action === "start")) {
3163
3241
  var cal = newChangedTask.calender;
3164
3242
 
3165
- if (action === "end") {
3166
- var snappedEnd = snapToWorkingTime(newChangedTask.end, cal, "forward");
3167
- newChangedTask.end = snappedEnd;
3168
- newChangedTask.x2 = taskXCoordinate(snappedEnd, dates, columnWidth);
3169
- } else if (action === "start") {
3170
- 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
+ }
3171
3262
 
3172
- if (snappedStart >= newChangedTask.end) {
3173
- setFailedTask(originalSelectedTask);
3174
- onCalendarError === null || onCalendarError === void 0 ? void 0 : onCalendarError(newChangedTask, "No working time in selected range");
3175
- setGanttEvent({
3176
- action: ""
3177
- });
3178
- setIsMoving(false);
3179
- svg.current.removeEventListener("mousemove", handleMouseMove);
3180
- svg.current.removeEventListener("mouseup", handleMouseUp);
3181
- 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);
3182
3273
  }
3183
3274
 
3184
- newChangedTask.start = snappedStart;
3185
- 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;
3186
3288
  } else {
3187
- 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
+ }
3188
3308
 
3189
- var delta = _snappedStart.getTime() - newChangedTask.start.getTime();
3190
- newChangedTask.start = _snappedStart;
3191
- newChangedTask.end = new Date(newChangedTask.end.getTime() + delta);
3192
- newChangedTask.x1 = taskXCoordinate(_snappedStart, dates, columnWidth);
3193
- newChangedTask.x2 = taskXCoordinate(newChangedTask.end, dates, columnWidth);
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();
3315
+
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;
3194
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)));
3195
3339
 
3196
- var snapEnd = addToDate(startOfDate(newChangedTask.end, "day"), 1, "day");
3197
- var newIntervals = getWorkingIntervals(newChangedTask.start, snapEnd, cal);
3198
- var segs = newIntervals.map(function (iv) {
3199
- return {
3200
- x1: taskXCoordinate(iv.start, dates, columnWidth),
3201
- x2: taskXCoordinate(iv.end, dates, columnWidth)
3202
- };
3203
- }).filter(function (s) {
3204
- return s.x2 > s.x1;
3205
- });
3206
- 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
+ }
3207
3346
  }
3208
3347
 
3209
3348
  svg.current.removeEventListener("mousemove", handleMouseMove);
3210
3349
  svg.current.removeEventListener("mouseup", handleMouseUp);
3350
+
3351
+ if (onBarTasksUpdate && isNotLikeOriginal) {
3352
+ onBarTasksUpdate(newChangedTask);
3353
+ }
3354
+
3211
3355
  setGanttEvent({
3212
3356
  action: ""
3213
3357
  });
@@ -3259,7 +3403,7 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
3259
3403
  svg.current.addEventListener("mouseup", handleMouseUp);
3260
3404
  setIsMoving(true);
3261
3405
  }
3262
- }, [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]);
3263
3407
 
3264
3408
  var handleBarEventStart = function handleBarEventStart(action, task, event, type) {
3265
3409
  try {
@@ -3345,7 +3489,9 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
3345
3489
 
3346
3490
  var getArrows = function getArrows(isCritical, criticalPathType) {
3347
3491
  return tasks.flatMap(function (_task) {
3348
- 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;
3349
3495
 
3350
3496
  if (!task) {
3351
3497
  return [];
@@ -3397,8 +3543,9 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
3397
3543
  fontSize: fontSize
3398
3544
  }, virtualItems.map(function (vi) {
3399
3545
  var _task = tasks[vi.index];
3400
-
3401
- var task = _extends({}, _task, {
3546
+ var task = ganttEvent.changedTask && ganttEvent.changedTask.id === _task.id ? _extends({}, ganttEvent.changedTask, {
3547
+ y: 0
3548
+ }) : _extends({}, _task, {
3402
3549
  y: 0
3403
3550
  });
3404
3551
 
@@ -3750,6 +3897,14 @@ var Gantt = function Gantt(_ref) {
3750
3897
  ganttEvent = _useState9[0],
3751
3898
  setGanttEvent = _useState9[1];
3752
3899
 
3900
+ var handleBarTasksUpdate = function handleBarTasksUpdate(task) {
3901
+ setBarTasks(function (prev) {
3902
+ return prev.map(function (t) {
3903
+ return t.id === task.id ? task : t;
3904
+ });
3905
+ });
3906
+ };
3907
+
3753
3908
  var taskHeight = React.useMemo(function () {
3754
3909
  return rowHeight * barFill / 100;
3755
3910
  }, [rowHeight, barFill]);
@@ -3894,17 +4049,6 @@ var Gantt = function Gantt(_ref) {
3894
4049
  setBarTasks(barTasks.filter(function (t) {
3895
4050
  return t.id !== changedTask.id;
3896
4051
  }));
3897
- } else if (action === "move" || action === "end" || action === "start" || action === "progress") {
3898
- var prevStateTask = barTasks.find(function (t) {
3899
- return t.id === changedTask.id;
3900
- });
3901
-
3902
- 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)) {
3903
- var newTaskList = barTasks.map(function (t) {
3904
- return t.id === changedTask.id ? changedTask : t;
3905
- });
3906
- setBarTasks(newTaskList);
3907
- }
3908
4052
  }
3909
4053
  }
3910
4054
  }, [ganttEvent, barTasks]);
@@ -4176,6 +4320,7 @@ var Gantt = function Gantt(_ref) {
4176
4320
  setGanttEvent: setGanttEvent,
4177
4321
  setFailedTask: setFailedTask,
4178
4322
  setSelectedTask: handleSelectedTask,
4323
+ onBarTasksUpdate: handleBarTasksUpdate,
4179
4324
  onDateChange: onDateChange,
4180
4325
  onProgressChange: onProgressChange,
4181
4326
  onDoubleClick: onDoubleClick,
@@ -4186,12 +4331,17 @@ var Gantt = function Gantt(_ref) {
4186
4331
  visibleStartY: visibleStartY,
4187
4332
  visibleEndY: visibleEndY
4188
4333
  };
4334
+ var tableTasks = React.useMemo(function () {
4335
+ return ganttEvent.changedTask ? barTasks.map(function (t) {
4336
+ return t.id === ganttEvent.changedTask.id ? ganttEvent.changedTask : t;
4337
+ }) : barTasks;
4338
+ }, [barTasks, ganttEvent.changedTask]);
4189
4339
  var tableProps = {
4190
4340
  rowHeight: rowHeight,
4191
4341
  rowWidth: listCellWidth,
4192
4342
  fontFamily: fontFamily,
4193
4343
  fontSize: fontSize,
4194
- tasks: barTasks,
4344
+ tasks: tableTasks,
4195
4345
  leafTasks: leafTasks,
4196
4346
  scheduleType: scheduleType,
4197
4347
  locale: locale,
@@ -4259,7 +4409,8 @@ var Gantt = function Gantt(_ref) {
4259
4409
  taskListWidth: taskListWidth,
4260
4410
  TooltipContent: TooltipContent,
4261
4411
  rtl: rtl,
4262
- svgWidth: svgWidth
4412
+ svgWidth: svgWidth,
4413
+ isDragging: ganttEvent.action === "move" || ganttEvent.action === "start" || ganttEvent.action === "end" || ganttEvent.action === "progress"
4263
4414
  }), React__default.createElement(VerticalScroll, {
4264
4415
  ganttFullHeight: ganttFullHeight,
4265
4416
  ganttHeight: ganttHeight,
@@ -4469,12 +4620,41 @@ function computeCriticalPath(taskID, taskMap) {
4469
4620
  taskMap[taskID].paths = [];
4470
4621
 
4471
4622
  for (var j = 0; j < dependents.length; j++) {
4472
- var depDuration = taskMap[dependents[j]].task.end.getTime() - taskMap[dependents[j]].task.start.getTime();
4473
- var overlap = Math.max(taskMap[taskID].end - taskMap[dependents[j]].task.start.getTime(), 0);
4623
+ var depStart = taskMap[dependents[j]].task.start.getTime();
4624
+ var depEnd = taskMap[dependents[j]].task.end.getTime();
4625
+ var depDuration = depEnd - depStart;
4626
+ var startWeek = Math.floor((depStart / 86400000 + 4) / 7);
4627
+ var endWeek = Math.floor((depEnd / 86400000 + 4) / 7);
4628
+ var offTime = 0;
4629
+
4630
+ 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++) {
4631
+ var _taskMap$dependents$j, _taskMap$dependents$j2;
4632
+
4633
+ for (var w = startWeek; w <= endWeek; w++) {
4634
+ var dayOfTheWeek = taskMap[dependents[j]].task.calendar.off_days[d];
4635
+ var offDay = 86400000 * (7 * w - 4 + dayOfTheWeek);
4636
+
4637
+ if (offDay >= depStart && offDay <= depEnd && (offDay > taskMap[taskID].end || taskMap[taskID].task.calendar.off_days.includes(dayOfTheWeek))) {
4638
+ offTime += 86400000;
4639
+ }
4640
+ }
4641
+ }
4642
+
4643
+ 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++) {
4644
+ var _taskMap$dependents$j3, _taskMap$dependents$j4;
4645
+
4646
+ var holiday = taskMap[dependents[j]].task.calendar.holidays[h];
4647
+
4648
+ if (holiday >= depStart && holiday <= depEnd) {
4649
+ offTime += 86400000;
4650
+ }
4651
+ }
4652
+
4653
+ var overlap = Math.max(taskMap[taskID].end - depStart, 0);
4474
4654
  var paths = taskMap[dependents[j]].paths;
4475
4655
 
4476
4656
  for (var k = 0; k < paths.length; k++) {
4477
- var totalDuration = taskMap[taskID].end - taskMap[taskID].start - overlap + paths[k].duration;
4657
+ var totalDuration = taskMap[taskID].end - taskMap[taskID].start - overlap - offTime + paths[k].duration;
4478
4658
 
4479
4659
  if (taskMap[taskID].paths.length < 2) {
4480
4660
  taskMap[taskID].paths.push({
@@ -4497,7 +4677,7 @@ function computeCriticalPath(taskID, taskMap) {
4497
4677
  }
4498
4678
 
4499
4679
  if (paths.length === 0) {
4500
- var immediateChildDuration = taskMap[taskID].end - taskMap[taskID].start + depDuration - overlap;
4680
+ var immediateChildDuration = taskMap[taskID].end - taskMap[taskID].start + depDuration - overlap - offTime;
4501
4681
 
4502
4682
  if (taskMap[taskID].paths.length < 2) {
4503
4683
  taskMap[taskID].paths.push({