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.
@@ -26,5 +26,7 @@ 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;
30
+ sliderTime?: number;
29
31
  } & EventOption;
30
32
  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,
@@ -3062,7 +3076,8 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
3062
3076
  onCalendarError = _ref.onCalendarError,
3063
3077
  projectCalendar = _ref.projectCalendar,
3064
3078
  visibleStartY = _ref.visibleStartY,
3065
- visibleEndY = _ref.visibleEndY;
3079
+ visibleEndY = _ref.visibleEndY,
3080
+ sliderTime = _ref.sliderTime;
3066
3081
  var point = svg === null || svg === void 0 ? void 0 : (_svg$current = svg.current) === null || _svg$current === void 0 ? void 0 : _svg$current.createSVGPoint();
3067
3082
 
3068
3083
  var _useState = React.useState(0),
@@ -3097,35 +3112,98 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
3097
3112
  changedTask = _handleTaskBySVGMouse.changedTask;
3098
3113
 
3099
3114
  if (isChanged) {
3100
- var finalTask = changedTask;
3115
+ var finalTask = _extends({}, changedTask);
3116
+
3117
+ var dragType = ganttEvent.type;
3101
3118
 
3102
3119
  if (changedTask.calender && (ganttEvent.action === "end" || ganttEvent.action === "start" || ganttEvent.action === "move")) {
3103
- finalTask = _extends({}, changedTask);
3104
3120
  var cal = finalTask.calender;
3105
3121
 
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");
3122
+ if (dragType === "actual") {
3123
+ if (ganttEvent.action === "end") {
3124
+ var snapped = snapToWorkingTime(finalTask.actualEnd, cal, "forward");
3125
+ finalTask.actualEnd = snapped;
3126
+ finalTask.actualx2 = taskXCoordinate(snapped, dates, columnWidth);
3127
+ } else if (ganttEvent.action === "start") {
3128
+ var _snapped = snapToWorkingTime(finalTask.actualStart, cal, "forward");
3129
+
3130
+ finalTask.actualStart = _snapped;
3131
+ finalTask.actualx1 = taskXCoordinate(_snapped, dates, columnWidth);
3132
+ } else {
3133
+ var _snapped2 = snapToWorkingTime(finalTask.actualStart, cal, "forward");
3134
+
3135
+ var delta = _snapped2.getTime() - finalTask.actualStart.getTime();
3136
+ finalTask.actualStart = _snapped2;
3137
+ finalTask.actualEnd = new Date(finalTask.actualEnd.getTime() + delta);
3138
+ finalTask.actualx1 = taskXCoordinate(finalTask.actualStart, dates, columnWidth);
3139
+ finalTask.actualx2 = taskXCoordinate(finalTask.actualEnd, dates, columnWidth);
3140
+ }
3141
+
3142
+ var actEnd = addToDate(startOfDate(finalTask.actualEnd, "day"), 1, "day");
3143
+ var actIntervals = getWorkingIntervals(finalTask.actualStart, actEnd, cal);
3144
+ var actSegs = actIntervals.map(function (iv) {
3145
+ return {
3146
+ x1: taskXCoordinate(iv.start, dates, columnWidth),
3147
+ x2: taskXCoordinate(iv.end, dates, columnWidth)
3148
+ };
3149
+ }).filter(function (s) {
3150
+ return s.x2 > s.x1;
3151
+ });
3152
+ finalTask.actualSegments = actSegs.length > 0 ? actSegs : undefined;
3153
+ var actDays = Math.max(1, Math.round((finalTask.actualEnd.getTime() - finalTask.actualStart.getTime()) / (1000 * 60 * 60 * 24)));
3154
+ finalTask.actualDuration = actDays;
3155
+ } else {
3156
+ if (ganttEvent.action === "end") {
3157
+ var _snapped3 = snapToWorkingTime(finalTask.end, cal, "forward");
3158
+
3159
+ finalTask.end = _snapped3;
3160
+ finalTask.x2 = taskXCoordinate(_snapped3, dates, columnWidth);
3161
+ } else if (ganttEvent.action === "start") {
3162
+ var _snapped4 = snapToWorkingTime(finalTask.start, cal, "forward");
3163
+
3164
+ finalTask.start = _snapped4;
3165
+ finalTask.x1 = taskXCoordinate(_snapped4, dates, columnWidth);
3166
+ } else {
3167
+ var _snapped5 = snapToWorkingTime(finalTask.start, cal, "forward");
3168
+
3169
+ var _delta = _snapped5.getTime() - finalTask.start.getTime();
3170
+
3171
+ finalTask.start = _snapped5;
3172
+ finalTask.end = new Date(finalTask.end.getTime() + _delta);
3173
+ finalTask.x1 = taskXCoordinate(finalTask.start, dates, columnWidth);
3174
+ finalTask.x2 = taskXCoordinate(finalTask.end, dates, columnWidth);
3175
+ }
3176
+
3177
+ var planEnd = addToDate(startOfDate(finalTask.end, "day"), 1, "day");
3178
+ var planIntervals = getWorkingIntervals(finalTask.start, planEnd, cal);
3179
+ var planSegs = planIntervals.map(function (iv) {
3180
+ return {
3181
+ x1: taskXCoordinate(iv.start, dates, columnWidth),
3182
+ x2: taskXCoordinate(iv.end, dates, columnWidth)
3183
+ };
3184
+ }).filter(function (s) {
3185
+ return s.x2 > s.x1;
3186
+ });
3187
+ finalTask.plannedSegments = planSegs.length > 0 ? planSegs : undefined;
3188
+ var planDays = Math.max(1, Math.round((finalTask.end.getTime() - finalTask.start.getTime()) / (1000 * 60 * 60 * 24)));
3189
+ finalTask.plannedDuration = planDays;
3190
+ }
3191
+ } else {
3192
+ if (dragType === "actual") {
3193
+ var _actDays = Math.max(1, Math.round((finalTask.actualEnd.getTime() - finalTask.actualStart.getTime()) / (1000 * 60 * 60 * 24)));
3112
3194
 
3113
- finalTask.start = _snapped;
3114
- finalTask.x1 = taskXCoordinate(_snapped, dates, columnWidth);
3195
+ finalTask.actualDuration = _actDays;
3115
3196
  } else {
3116
- var _snapped2 = snapToWorkingTime(finalTask.start, cal, "forward");
3197
+ var _planDays = Math.max(1, Math.round((finalTask.end.getTime() - finalTask.start.getTime()) / (1000 * 60 * 60 * 24)));
3117
3198
 
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);
3199
+ finalTask.plannedDuration = _planDays;
3123
3200
  }
3124
3201
  }
3125
3202
 
3126
3203
  setGanttEvent({
3127
3204
  action: ganttEvent.action,
3128
- changedTask: finalTask
3205
+ changedTask: finalTask,
3206
+ type: dragType
3129
3207
  });
3130
3208
  }
3131
3209
 
@@ -3158,56 +3236,123 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
3158
3236
  newChangedTask = _handleTaskBySVGMouse2.changedTask;
3159
3237
 
3160
3238
  var isNotLikeOriginal = originalSelectedTask.start !== newChangedTask.start || originalSelectedTask.end !== newChangedTask.end || originalSelectedTask.actualStart !== newChangedTask.actualStart || originalSelectedTask.actualEnd !== newChangedTask.actualEnd || originalSelectedTask.progress !== newChangedTask.progress;
3239
+ var dropType = type;
3161
3240
 
3162
3241
  if (newChangedTask.calender && (action === "move" || action === "end" || action === "start")) {
3163
3242
  var cal = newChangedTask.calender;
3164
3243
 
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");
3244
+ if (dropType === "actual") {
3245
+ if (action === "end") {
3246
+ var snappedEnd = snapToWorkingTime(newChangedTask.actualEnd, cal, "forward");
3247
+ newChangedTask.actualEnd = snappedEnd;
3248
+ newChangedTask.actualx2 = taskXCoordinate(snappedEnd, dates, columnWidth);
3249
+ } else if (action === "start") {
3250
+ var snappedStart = snapToWorkingTime(newChangedTask.actualStart, cal, "forward");
3251
+
3252
+ if (snappedStart >= newChangedTask.actualEnd) {
3253
+ setFailedTask(originalSelectedTask);
3254
+ onCalendarError === null || onCalendarError === void 0 ? void 0 : onCalendarError(newChangedTask, "No working time in selected range");
3255
+ setGanttEvent({
3256
+ action: ""
3257
+ });
3258
+ setIsMoving(false);
3259
+ svg.current.removeEventListener("mousemove", handleMouseMove);
3260
+ svg.current.removeEventListener("mouseup", handleMouseUp);
3261
+ return Promise.resolve();
3262
+ }
3171
3263
 
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();
3264
+ newChangedTask.actualStart = snappedStart;
3265
+ newChangedTask.actualx1 = taskXCoordinate(snappedStart, dates, columnWidth);
3266
+ } else {
3267
+ var _snappedStart = snapToWorkingTime(newChangedTask.actualStart, cal, "forward");
3268
+
3269
+ var delta = _snappedStart.getTime() - newChangedTask.actualStart.getTime();
3270
+ newChangedTask.actualStart = _snappedStart;
3271
+ newChangedTask.actualEnd = new Date(newChangedTask.actualEnd.getTime() + delta);
3272
+ newChangedTask.actualx1 = taskXCoordinate(_snappedStart, dates, columnWidth);
3273
+ newChangedTask.actualx2 = taskXCoordinate(newChangedTask.actualEnd, dates, columnWidth);
3182
3274
  }
3183
3275
 
3184
- newChangedTask.start = snappedStart;
3185
- newChangedTask.x1 = taskXCoordinate(snappedStart, dates, columnWidth);
3276
+ var actEnd = addToDate(startOfDate(newChangedTask.actualEnd, "day"), 1, "day");
3277
+ var actIntervals = getWorkingIntervals(newChangedTask.actualStart, actEnd, cal);
3278
+ var actSegs = actIntervals.map(function (iv) {
3279
+ return {
3280
+ x1: taskXCoordinate(iv.start, dates, columnWidth),
3281
+ x2: taskXCoordinate(iv.end, dates, columnWidth)
3282
+ };
3283
+ }).filter(function (s) {
3284
+ return s.x2 > s.x1;
3285
+ });
3286
+ newChangedTask.actualSegments = actSegs.length > 0 ? actSegs : undefined;
3287
+ var actDays = Math.max(1, Math.round((newChangedTask.actualEnd.getTime() - newChangedTask.actualStart.getTime()) / (1000 * 60 * 60 * 24)));
3288
+ newChangedTask.actualDuration = actDays;
3186
3289
  } else {
3187
- var _snappedStart = snapToWorkingTime(newChangedTask.start, cal, "forward");
3290
+ if (action === "end") {
3291
+ var _snappedEnd = snapToWorkingTime(newChangedTask.end, cal, "forward");
3292
+
3293
+ newChangedTask.end = _snappedEnd;
3294
+ newChangedTask.x2 = taskXCoordinate(_snappedEnd, dates, columnWidth);
3295
+ } else if (action === "start") {
3296
+ var _snappedStart2 = snapToWorkingTime(newChangedTask.start, cal, "forward");
3297
+
3298
+ if (_snappedStart2 >= newChangedTask.end) {
3299
+ setFailedTask(originalSelectedTask);
3300
+ onCalendarError === null || onCalendarError === void 0 ? void 0 : onCalendarError(newChangedTask, "No working time in selected range");
3301
+ setGanttEvent({
3302
+ action: ""
3303
+ });
3304
+ setIsMoving(false);
3305
+ svg.current.removeEventListener("mousemove", handleMouseMove);
3306
+ svg.current.removeEventListener("mouseup", handleMouseUp);
3307
+ return Promise.resolve();
3308
+ }
3309
+
3310
+ newChangedTask.start = _snappedStart2;
3311
+ newChangedTask.x1 = taskXCoordinate(_snappedStart2, dates, columnWidth);
3312
+ } else {
3313
+ var _snappedStart3 = snapToWorkingTime(newChangedTask.start, cal, "forward");
3314
+
3315
+ var _delta2 = _snappedStart3.getTime() - newChangedTask.start.getTime();
3188
3316
 
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);
3317
+ newChangedTask.start = _snappedStart3;
3318
+ newChangedTask.end = new Date(newChangedTask.end.getTime() + _delta2);
3319
+ newChangedTask.x1 = taskXCoordinate(_snappedStart3, dates, columnWidth);
3320
+ newChangedTask.x2 = taskXCoordinate(newChangedTask.end, dates, columnWidth);
3321
+ }
3322
+
3323
+ var planEnd = addToDate(startOfDate(newChangedTask.end, "day"), 1, "day");
3324
+ var planIntervals = getWorkingIntervals(newChangedTask.start, planEnd, cal);
3325
+ var planSegs = planIntervals.map(function (iv) {
3326
+ return {
3327
+ x1: taskXCoordinate(iv.start, dates, columnWidth),
3328
+ x2: taskXCoordinate(iv.end, dates, columnWidth)
3329
+ };
3330
+ }).filter(function (s) {
3331
+ return s.x2 > s.x1;
3332
+ });
3333
+ newChangedTask.plannedSegments = planSegs.length > 0 ? planSegs : undefined;
3334
+ var planDays = Math.max(1, Math.round((newChangedTask.end.getTime() - newChangedTask.start.getTime()) / (1000 * 60 * 60 * 24)));
3335
+ newChangedTask.plannedDuration = planDays;
3194
3336
  }
3337
+ } else if (action === "move" || action === "end" || action === "start") {
3338
+ if (dropType === "actual") {
3339
+ var _actDays2 = Math.max(1, Math.round((newChangedTask.actualEnd.getTime() - newChangedTask.actualStart.getTime()) / (1000 * 60 * 60 * 24)));
3195
3340
 
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;
3341
+ newChangedTask.actualDuration = _actDays2;
3342
+ } else {
3343
+ var _planDays2 = Math.max(1, Math.round((newChangedTask.end.getTime() - newChangedTask.start.getTime()) / (1000 * 60 * 60 * 24)));
3344
+
3345
+ newChangedTask.plannedDuration = _planDays2;
3346
+ }
3207
3347
  }
3208
3348
 
3209
3349
  svg.current.removeEventListener("mousemove", handleMouseMove);
3210
3350
  svg.current.removeEventListener("mouseup", handleMouseUp);
3351
+
3352
+ if (onBarTasksUpdate && isNotLikeOriginal) {
3353
+ onBarTasksUpdate(newChangedTask);
3354
+ }
3355
+
3211
3356
  setGanttEvent({
3212
3357
  action: ""
3213
3358
  });
@@ -3259,7 +3404,7 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
3259
3404
  svg.current.addEventListener("mouseup", handleMouseUp);
3260
3405
  setIsMoving(true);
3261
3406
  }
3262
- }, [ganttEvent, xStep, initEventX1Delta, onProgressChange, timeStep, onDateChange, onCalendarError, projectCalendar, svg, isMoving, point, rtl, setFailedTask, setGanttEvent, dates, columnWidth]);
3407
+ }, [ganttEvent, xStep, initEventX1Delta, onProgressChange, timeStep, onDateChange, onCalendarError, projectCalendar, svg, isMoving, point, rtl, setFailedTask, setGanttEvent, onBarTasksUpdate, dates, columnWidth]);
3263
3408
 
3264
3409
  var handleBarEventStart = function handleBarEventStart(action, task, event, type) {
3265
3410
  try {
@@ -3345,7 +3490,9 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
3345
3490
 
3346
3491
  var getArrows = function getArrows(isCritical, criticalPathType) {
3347
3492
  return tasks.flatMap(function (_task) {
3348
- var task = _task.start.getTime() > 0 && _task.end.getTime() > 0 ? _task : undefined;
3493
+ var _live = ganttEvent.changedTask && ganttEvent.changedTask.id === _task.id ? ganttEvent.changedTask : _task;
3494
+
3495
+ var task = _live.start.getTime() > 0 && _live.end.getTime() > 0 ? _live : undefined;
3349
3496
 
3350
3497
  if (!task) {
3351
3498
  return [];
@@ -3387,9 +3534,32 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
3387
3534
  });
3388
3535
  };
3389
3536
 
3537
+ var lineX = sliderTime !== undefined ? taskXCoordinate(new Date(sliderTime), dates, columnWidth) : null;
3538
+ var totalHeight = tasks.length * rowHeight;
3539
+ React.useEffect(function () {
3540
+ if (sliderTime !== undefined) {
3541
+ console.log('Vertical line debug:', {
3542
+ sliderTime: new Date(sliderTime).toLocaleString(),
3543
+ lineX: lineX,
3544
+ totalHeight: totalHeight,
3545
+ tasksCount: tasks.length,
3546
+ columnWidth: columnWidth,
3547
+ datesRange: dates.length > 0 ? dates[0].toLocaleString() + " - " + dates[dates.length - 1].toLocaleString() : 'empty'
3548
+ });
3549
+ }
3550
+ }, [sliderTime, lineX, totalHeight, tasks.length, dates, columnWidth]);
3390
3551
  return React__default.createElement("g", {
3391
3552
  className: "content"
3392
- }, React__default.createElement("g", {
3553
+ }, lineX !== null && lineX > 0 && React__default.createElement("line", {
3554
+ x1: lineX,
3555
+ y1: 0,
3556
+ x2: lineX,
3557
+ y2: totalHeight,
3558
+ stroke: "red",
3559
+ strokeWidth: 2,
3560
+ pointerEvents: "none",
3561
+ opacity: 0.8
3562
+ }), React__default.createElement("g", {
3393
3563
  className: "arrows"
3394
3564
  }, getArrows(false), getArrows(true, "secondary"), getArrows(true, "primary")), React__default.createElement("g", {
3395
3565
  className: "bar",
@@ -3397,8 +3567,9 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
3397
3567
  fontSize: fontSize
3398
3568
  }, virtualItems.map(function (vi) {
3399
3569
  var _task = tasks[vi.index];
3400
-
3401
- var task = _extends({}, _task, {
3570
+ var task = ganttEvent.changedTask && ganttEvent.changedTask.id === _task.id ? _extends({}, ganttEvent.changedTask, {
3571
+ y: 0
3572
+ }) : _extends({}, _task, {
3402
3573
  y: 0
3403
3574
  });
3404
3575
 
@@ -3644,7 +3815,8 @@ var Gantt = function Gantt(_ref) {
3644
3815
  _ref$shouldNotShowLoa = _ref.shouldNotShowLoadingOverlay,
3645
3816
  shouldNotShowLoadingOverlay = _ref$shouldNotShowLoa === void 0 ? true : _ref$shouldNotShowLoa,
3646
3817
  projectCalendar = _ref.projectCalendar,
3647
- onCalendarError = _ref.onCalendarError;
3818
+ onCalendarError = _ref.onCalendarError,
3819
+ sliderTime = _ref.sliderTime;
3648
3820
  var effectiveCalendar = (_tasks$find$calender = (_tasks$find = tasks.find(function (t) {
3649
3821
  return t.calender;
3650
3822
  })) === null || _tasks$find === void 0 ? void 0 : _tasks$find.calender) != null ? _tasks$find$calender : projectCalendar;
@@ -3750,6 +3922,14 @@ var Gantt = function Gantt(_ref) {
3750
3922
  ganttEvent = _useState9[0],
3751
3923
  setGanttEvent = _useState9[1];
3752
3924
 
3925
+ var handleBarTasksUpdate = function handleBarTasksUpdate(task) {
3926
+ setBarTasks(function (prev) {
3927
+ return prev.map(function (t) {
3928
+ return t.id === task.id ? task : t;
3929
+ });
3930
+ });
3931
+ };
3932
+
3753
3933
  var taskHeight = React.useMemo(function () {
3754
3934
  return rowHeight * barFill / 100;
3755
3935
  }, [rowHeight, barFill]);
@@ -3894,17 +4074,6 @@ var Gantt = function Gantt(_ref) {
3894
4074
  setBarTasks(barTasks.filter(function (t) {
3895
4075
  return t.id !== changedTask.id;
3896
4076
  }));
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
4077
  }
3909
4078
  }
3910
4079
  }, [ganttEvent, barTasks]);
@@ -4176,6 +4345,7 @@ var Gantt = function Gantt(_ref) {
4176
4345
  setGanttEvent: setGanttEvent,
4177
4346
  setFailedTask: setFailedTask,
4178
4347
  setSelectedTask: handleSelectedTask,
4348
+ onBarTasksUpdate: handleBarTasksUpdate,
4179
4349
  onDateChange: onDateChange,
4180
4350
  onProgressChange: onProgressChange,
4181
4351
  onDoubleClick: onDoubleClick,
@@ -4184,14 +4354,20 @@ var Gantt = function Gantt(_ref) {
4184
4354
  onCalendarError: onCalendarError,
4185
4355
  projectCalendar: effectiveCalendar,
4186
4356
  visibleStartY: visibleStartY,
4187
- visibleEndY: visibleEndY
4357
+ visibleEndY: visibleEndY,
4358
+ sliderTime: sliderTime
4188
4359
  };
4360
+ var tableTasks = React.useMemo(function () {
4361
+ return ganttEvent.changedTask ? barTasks.map(function (t) {
4362
+ return t.id === ganttEvent.changedTask.id ? ganttEvent.changedTask : t;
4363
+ }) : barTasks;
4364
+ }, [barTasks, ganttEvent.changedTask]);
4189
4365
  var tableProps = {
4190
4366
  rowHeight: rowHeight,
4191
4367
  rowWidth: listCellWidth,
4192
4368
  fontFamily: fontFamily,
4193
4369
  fontSize: fontSize,
4194
- tasks: barTasks,
4370
+ tasks: tableTasks,
4195
4371
  leafTasks: leafTasks,
4196
4372
  scheduleType: scheduleType,
4197
4373
  locale: locale,
@@ -4259,7 +4435,8 @@ var Gantt = function Gantt(_ref) {
4259
4435
  taskListWidth: taskListWidth,
4260
4436
  TooltipContent: TooltipContent,
4261
4437
  rtl: rtl,
4262
- svgWidth: svgWidth
4438
+ svgWidth: svgWidth,
4439
+ isDragging: ganttEvent.action === "move" || ganttEvent.action === "start" || ganttEvent.action === "end" || ganttEvent.action === "progress"
4263
4440
  }), React__default.createElement(VerticalScroll, {
4264
4441
  ganttFullHeight: ganttFullHeight,
4265
4442
  ganttHeight: ganttHeight,
@@ -4469,12 +4646,41 @@ function computeCriticalPath(taskID, taskMap) {
4469
4646
  taskMap[taskID].paths = [];
4470
4647
 
4471
4648
  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);
4649
+ var depStart = taskMap[dependents[j]].task.start.getTime();
4650
+ var depEnd = taskMap[dependents[j]].task.end.getTime();
4651
+ var depDuration = depEnd - depStart;
4652
+ var startWeek = Math.floor((depStart / 86400000 + 4) / 7);
4653
+ var endWeek = Math.floor((depEnd / 86400000 + 4) / 7);
4654
+ var offTime = 0;
4655
+
4656
+ 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++) {
4657
+ var _taskMap$dependents$j, _taskMap$dependents$j2;
4658
+
4659
+ for (var w = startWeek; w <= endWeek; w++) {
4660
+ var dayOfTheWeek = taskMap[dependents[j]].task.calendar.off_days[d];
4661
+ var offDay = 86400000 * (7 * w - 4 + dayOfTheWeek);
4662
+
4663
+ if (offDay >= depStart && offDay <= depEnd && (offDay > taskMap[taskID].end || taskMap[taskID].task.calendar.off_days.includes(dayOfTheWeek))) {
4664
+ offTime += 86400000;
4665
+ }
4666
+ }
4667
+ }
4668
+
4669
+ 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++) {
4670
+ var _taskMap$dependents$j3, _taskMap$dependents$j4;
4671
+
4672
+ var holiday = taskMap[dependents[j]].task.calendar.holidays[h];
4673
+
4674
+ if (holiday >= depStart && holiday <= depEnd) {
4675
+ offTime += 86400000;
4676
+ }
4677
+ }
4678
+
4679
+ var overlap = Math.max(taskMap[taskID].end - depStart, 0);
4474
4680
  var paths = taskMap[dependents[j]].paths;
4475
4681
 
4476
4682
  for (var k = 0; k < paths.length; k++) {
4477
- var totalDuration = taskMap[taskID].end - taskMap[taskID].start - overlap + paths[k].duration;
4683
+ var totalDuration = taskMap[taskID].end - taskMap[taskID].start - overlap - offTime + paths[k].duration;
4478
4684
 
4479
4685
  if (taskMap[taskID].paths.length < 2) {
4480
4686
  taskMap[taskID].paths.push({
@@ -4497,7 +4703,7 @@ function computeCriticalPath(taskID, taskMap) {
4497
4703
  }
4498
4704
 
4499
4705
  if (paths.length === 0) {
4500
- var immediateChildDuration = taskMap[taskID].end - taskMap[taskID].start + depDuration - overlap;
4706
+ var immediateChildDuration = taskMap[taskID].end - taskMap[taskID].start + depDuration - overlap - offTime;
4501
4707
 
4502
4708
  if (taskMap[taskID].paths.length < 2) {
4503
4709
  taskMap[taskID].paths.push({