gantt-task-react-v 1.1.18 → 1.1.20

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.
@@ -30,6 +30,10 @@ export interface TaskGanttContentProps extends GanttTaskBarActions {
30
30
  selectTaskOnMouseDown: (taskId: string, event: MouseEvent) => void;
31
31
  selectedIdsMirror: Readonly<Record<string, true>>;
32
32
  onTooltipTask: (task: Task | null, element: Element | null) => void;
33
+ /**
34
+ * When true, disable interactive behaviors for task bars (drag, click, relations)
35
+ */
36
+ isLoading?: boolean;
33
37
  startColumnIndex: number;
34
38
  taskYOffset: number;
35
39
  visibleTasksMirror: Readonly<Record<string, true>>;
@@ -38,6 +38,10 @@ export type TaskListProps = {
38
38
  taskListContainerRef: RefObject<HTMLDivElement>;
39
39
  taskListRef: RefObject<HTMLDivElement>;
40
40
  tasks: readonly RenderTask[];
41
+ /**
42
+ * When true, disable user interactions on the task list (clicks, context menu)
43
+ */
44
+ isLoading?: boolean;
41
45
  onResizeColumn?: OnResizeColumn;
42
46
  tableBottom?: TableRenderBottomProps;
43
47
  };
@@ -10637,20 +10637,22 @@ const TaskListTableDefaultInner = ({
10637
10637
  );
10638
10638
  };
10639
10639
  const TaskListTable = memo(TaskListTableDefaultInner);
10640
- const taskListRoot = "_taskListRoot_yoz76_1";
10641
- const taskListHorizontalScroll = "_taskListHorizontalScroll_yoz76_19";
10642
- const taskListResizer = "_taskListResizer_yoz76_81";
10643
- const horizontalContainer$1 = "_horizontalContainer_yoz76_145";
10644
- const tableWrapper = "_tableWrapper_yoz76_159";
10645
- const scrollToTop = "_scrollToTop_yoz76_173";
10646
- const scrollToBottom = "_scrollToBottom_yoz76_189";
10647
- const hidden = "_hidden_yoz76_205";
10640
+ const taskListRoot = "_taskListRoot_6kpxi_1";
10641
+ const taskListHorizontalScroll = "_taskListHorizontalScroll_6kpxi_19";
10642
+ const taskListResizer = "_taskListResizer_6kpxi_81";
10643
+ const horizontalContainer$1 = "_horizontalContainer_6kpxi_145";
10644
+ const tableWrapper = "_tableWrapper_6kpxi_159";
10645
+ const loadingOverlayBody$1 = "_loadingOverlayBody_6kpxi_173";
10646
+ const scrollToTop = "_scrollToTop_6kpxi_195";
10647
+ const scrollToBottom = "_scrollToBottom_6kpxi_211";
10648
+ const hidden = "_hidden_6kpxi_227";
10648
10649
  const styles$d = {
10649
10650
  taskListRoot,
10650
10651
  taskListHorizontalScroll,
10651
10652
  taskListResizer,
10652
10653
  horizontalContainer: horizontalContainer$1,
10653
10654
  tableWrapper,
10655
+ loadingOverlayBody: loadingOverlayBody$1,
10654
10656
  scrollToTop,
10655
10657
  scrollToBottom,
10656
10658
  hidden
@@ -10700,6 +10702,7 @@ const TaskListInner = ({
10700
10702
  taskListHorizontalScrollRef,
10701
10703
  taskListRef,
10702
10704
  tasks,
10705
+ isLoading = false,
10703
10706
  onResizeColumn,
10704
10707
  canReorderTasks,
10705
10708
  tableBottom
@@ -10755,7 +10758,8 @@ const TaskListInner = ({
10755
10758
  onClick,
10756
10759
  onExpanderClick,
10757
10760
  scrollToTask,
10758
- selectTaskOnMouseDown,
10761
+ selectTaskOnMouseDown: isLoading ? () => {
10762
+ } : selectTaskOnMouseDown,
10759
10763
  task,
10760
10764
  depth
10761
10765
  };
@@ -10780,6 +10784,7 @@ const TaskListInner = ({
10780
10784
  onExpanderClick,
10781
10785
  scrollToTask,
10782
10786
  selectTaskOnMouseDown,
10787
+ isLoading,
10783
10788
  selectedIdsMirror
10784
10789
  ]
10785
10790
  );
@@ -10805,6 +10810,13 @@ const TaskListInner = ({
10805
10810
  }
10806
10811
  ),
10807
10812
  /* @__PURE__ */ jsxs("div", { className: styles$d.tableWrapper, children: [
10813
+ (isLoading || false) && /* @__PURE__ */ jsx(
10814
+ "div",
10815
+ {
10816
+ className: styles$d.loadingOverlayBody,
10817
+ "data-testid": "tasklist-loading-overlay"
10818
+ }
10819
+ ),
10808
10820
  /* @__PURE__ */ jsx(
10809
10821
  "div",
10810
10822
  {
@@ -10850,7 +10862,8 @@ const TaskListInner = ({
10850
10862
  handleMoveTaskBefore,
10851
10863
  handleMoveTaskAfter,
10852
10864
  handleMoveTasksInside,
10853
- handleOpenContextMenu,
10865
+ handleOpenContextMenu: isLoading ? () => {
10866
+ } : handleOpenContextMenu,
10854
10867
  icons,
10855
10868
  isShowTaskNumbers,
10856
10869
  mapTaskToNestedIndex,
@@ -12970,6 +12983,7 @@ const TaskGanttContentInner = (props) => {
12970
12983
  selectTaskOnMouseDown,
12971
12984
  selectedIdsMirror,
12972
12985
  onTooltipTask,
12986
+ isLoading = false,
12973
12987
  startColumnIndex,
12974
12988
  taskYOffset,
12975
12989
  taskHeight,
@@ -13098,17 +13112,17 @@ const TaskGanttContentInner = (props) => {
13098
13112
  distances,
13099
13113
  taskHeight,
13100
13114
  taskHalfHeight,
13101
- isProgressChangeable: (t) => isProgressChangeable(t) && !waitCommitTasks,
13115
+ isProgressChangeable: (t) => isProgressChangeable(t) && !waitCommitTasks && !isLoading,
13102
13116
  isDateChangeable: (t) => isDateChangeable(t) && !waitCommitTasks,
13103
- isRelationChangeable: (t) => isRelationChangeable(t) && !waitCommitTasks,
13117
+ isRelationChangeable: (t) => isRelationChangeable(t) && !waitCommitTasks && !isLoading,
13104
13118
  authorizedRelations,
13105
13119
  ganttRelationEvent,
13106
- canDelete: !task.isDisabled && !waitCommitTasks,
13107
- onDoubleClick,
13108
- onClick,
13109
- onEventStart: onTaskBarDragStart,
13120
+ canDelete: !task.isDisabled && !waitCommitTasks && !isLoading,
13121
+ onDoubleClick: isLoading ? void 0 : onDoubleClick,
13122
+ onClick: isLoading ? void 0 : onClick,
13123
+ onEventStart: isLoading ? void 0 : onTaskBarDragStart,
13110
13124
  onTooltipTask,
13111
- onRelationStart: onTaskBarRelationStart,
13125
+ onRelationStart: isLoading ? void 0 : onTaskBarRelationStart,
13112
13126
  isSelected: Boolean(selectedIdsMirror[taskId]),
13113
13127
  isCritical,
13114
13128
  rtl,
@@ -13328,7 +13342,8 @@ const TaskGanttContentInner = (props) => {
13328
13342
  visibleTasksMirror,
13329
13343
  onArrowDoubleClick,
13330
13344
  showProgress,
13331
- progressColor
13345
+ progressColor,
13346
+ isLoading
13332
13347
  ]);
13333
13348
  return /* @__PURE__ */ jsxs("g", { className: "content", children: [
13334
13349
  renderedSelectedTasks,
@@ -13363,15 +13378,19 @@ const TaskGanttContentInner = (props) => {
13363
13378
  ] });
13364
13379
  };
13365
13380
  const TaskGanttContent = memo(TaskGanttContentInner);
13366
- const ganttVerticalContainer = "_ganttVerticalContainer_1wr55_1";
13367
- const horizontalContainer = "_horizontalContainer_1wr55_73";
13368
- const wrapper = "_wrapper_1wr55_85";
13369
- const calendarDragging = "_calendarDragging_1wr55_109";
13381
+ const ganttVerticalContainer = "_ganttVerticalContainer_19ply_1";
13382
+ const horizontalContainer = "_horizontalContainer_19ply_73";
13383
+ const wrapper = "_wrapper_19ply_93";
13384
+ const calendarDragging = "_calendarDragging_19ply_117";
13385
+ const loadingOverlay = "_loadingOverlay_19ply_125";
13386
+ const loadingOverlayBody = "_loadingOverlayBody_19ply_141";
13370
13387
  const styles$2 = {
13371
13388
  ganttVerticalContainer,
13372
13389
  horizontalContainer,
13373
13390
  wrapper,
13374
- calendarDragging
13391
+ calendarDragging,
13392
+ loadingOverlay,
13393
+ loadingOverlayBody
13375
13394
  };
13376
13395
  const TaskGanttInner = (props) => {
13377
13396
  const {
@@ -13426,7 +13445,7 @@ const TaskGanttInner = (props) => {
13426
13445
  ]
13427
13446
  );
13428
13447
  useEffect(() => {
13429
- if (!contentRef.current) {
13448
+ if (!contentRef.current || barProps.isLoading) {
13430
13449
  return () => {
13431
13450
  };
13432
13451
  }
@@ -13496,7 +13515,12 @@ const TaskGanttInner = (props) => {
13496
13515
  contentContainer.removeEventListener("mouseup", onScrollEnd);
13497
13516
  contentContainer.removeEventListener("mouseout", onScrollEnd);
13498
13517
  };
13499
- }, [verticalScrollbarRef, horizontalContainerRef, verticalGanttContainerRef]);
13518
+ }, [
13519
+ verticalScrollbarRef,
13520
+ horizontalContainerRef,
13521
+ verticalGanttContainerRef,
13522
+ barProps.isLoading
13523
+ ]);
13500
13524
  return /* @__PURE__ */ jsxs(
13501
13525
  "div",
13502
13526
  {
@@ -13515,41 +13539,50 @@ const TaskGanttInner = (props) => {
13515
13539
  children: /* @__PURE__ */ jsx(Calendar, { scrollRef: verticalGanttContainerRef, ...calendarProps })
13516
13540
  }
13517
13541
  ),
13518
- /* @__PURE__ */ jsx(
13542
+ /* @__PURE__ */ jsxs(
13519
13543
  "div",
13520
13544
  {
13521
13545
  ref: horizontalContainerRef,
13522
13546
  className: styles$2.horizontalContainer,
13523
13547
  style: containerStyle,
13524
- children: /* @__PURE__ */ jsx("div", { style: gridStyle, children: /* @__PURE__ */ jsxs(
13525
- "svg",
13526
- {
13527
- xmlns: "http://www.w3.org/2000/svg",
13528
- width: fullSvgWidth,
13529
- height: ganttFullHeight,
13530
- fontFamily: "var(--gantt-font-family)",
13531
- ref: ganttSVGRef,
13532
- onContextMenu: (event) => {
13533
- event.preventDefault();
13534
- if (onOpenGanttContextMenu) {
13535
- onOpenGanttContextMenu(event.clientX, event.clientY);
13536
- }
13537
- },
13538
- children: [
13539
- /* @__PURE__ */ jsx(GanttToday, { ...ganttTodayProps }),
13540
- /* @__PURE__ */ jsx(
13541
- "rect",
13542
- {
13543
- ref: contentRef,
13544
- width: "100%",
13545
- height: "100%",
13546
- fill: "transparent"
13548
+ children: [
13549
+ barProps.isLoading && /* @__PURE__ */ jsx(
13550
+ "div",
13551
+ {
13552
+ className: styles$2.loadingOverlayBody,
13553
+ "data-testid": "gantt-loading-overlay-body"
13554
+ }
13555
+ ),
13556
+ /* @__PURE__ */ jsx("div", { style: gridStyle, children: /* @__PURE__ */ jsxs(
13557
+ "svg",
13558
+ {
13559
+ xmlns: "http://www.w3.org/2000/svg",
13560
+ width: fullSvgWidth,
13561
+ height: ganttFullHeight,
13562
+ fontFamily: "var(--gantt-font-family)",
13563
+ ref: ganttSVGRef,
13564
+ onContextMenu: (event) => {
13565
+ event.preventDefault();
13566
+ if (onOpenGanttContextMenu) {
13567
+ onOpenGanttContextMenu(event.clientX, event.clientY);
13547
13568
  }
13548
- ),
13549
- /* @__PURE__ */ jsx(TaskGanttContent, { ...barProps })
13550
- ]
13551
- }
13552
- ) })
13569
+ },
13570
+ children: [
13571
+ /* @__PURE__ */ jsx(GanttToday, { ...ganttTodayProps }),
13572
+ /* @__PURE__ */ jsx(
13573
+ "rect",
13574
+ {
13575
+ ref: contentRef,
13576
+ width: "100%",
13577
+ height: "100%",
13578
+ fill: "transparent"
13579
+ }
13580
+ ),
13581
+ /* @__PURE__ */ jsx(TaskGanttContent, { ...barProps })
13582
+ ]
13583
+ }
13584
+ ) })
13585
+ ]
13553
13586
  }
13554
13587
  )
13555
13588
  ]
@@ -18986,6 +19019,7 @@ const Gantt = (props) => {
18986
19019
  showProgress = true,
18987
19020
  progressColor
18988
19021
  } = props;
19022
+ const { isLoading = false } = props;
18989
19023
  const ganttSVGRef = useRef(null);
18990
19024
  const wrapperRef = useRef(null);
18991
19025
  const taskListRef = useRef(null);
@@ -19300,6 +19334,9 @@ const Gantt = (props) => {
19300
19334
  });
19301
19335
  const handleOpenGanttContextMenu = useCallback(
19302
19336
  (task, clientX, clientY) => {
19337
+ if (isLoading) {
19338
+ return;
19339
+ }
19303
19340
  const wrapperNode = wrapperRef.current;
19304
19341
  if (!wrapperNode) {
19305
19342
  return;
@@ -19312,7 +19349,7 @@ const Gantt = (props) => {
19312
19349
  y: clientY - top
19313
19350
  });
19314
19351
  },
19315
- [wrapperRef]
19352
+ [wrapperRef, isLoading]
19316
19353
  );
19317
19354
  const handleCloseGanttContextMenu = useCallback(() => {
19318
19355
  setGanttContextMenu({
@@ -19446,6 +19483,10 @@ const Gantt = (props) => {
19446
19483
  horizontalContainerRef
19447
19484
  ]);
19448
19485
  const handleKeyDown = (event) => {
19486
+ if (isLoading) {
19487
+ event.preventDefault();
19488
+ return;
19489
+ }
19449
19490
  const { columnWidth, rowHeight: rowHeight2 } = distances;
19450
19491
  let newScrollY = scrollY;
19451
19492
  let newScrollX = scrollX;
@@ -20111,6 +20152,9 @@ const Gantt = (props) => {
20111
20152
  }, [taskList.contextMenuOptions, locale]);
20112
20153
  const handleOpenContextMenuForRow = useCallback(
20113
20154
  (task, clientX, clientY) => {
20155
+ if (isLoading) {
20156
+ return;
20157
+ }
20114
20158
  try {
20115
20159
  if (onRowContextMenu && task) {
20116
20160
  onRowContextMenu(task);
@@ -20128,7 +20172,8 @@ const Gantt = (props) => {
20128
20172
  handleOpenContextMenu,
20129
20173
  selectTask,
20130
20174
  contextMenuOptions,
20131
- selectedIdsMirror
20175
+ selectedIdsMirror,
20176
+ isLoading
20132
20177
  ]
20133
20178
  );
20134
20179
  const ganttContextMenuOptions = useMemo(() => {
@@ -20262,6 +20307,7 @@ const Gantt = (props) => {
20262
20307
  onDeleteTask: (taskForDelete) => handleDeleteTasks([taskForDelete]),
20263
20308
  onTaskBarDragStart: handleTaskDragStart,
20264
20309
  onTooltipTask: onChangeTooltipTask,
20310
+ isLoading,
20265
20311
  mapGlobalRowIndexToTask,
20266
20312
  onArrowDoubleClick,
20267
20313
  renderedRowIndexes,
@@ -20314,7 +20360,8 @@ const Gantt = (props) => {
20314
20360
  changeInProgress == null ? void 0 : changeInProgress.action,
20315
20361
  handleDeleteTasks,
20316
20362
  showProgress,
20317
- progressColor
20363
+ progressColor,
20364
+ isLoading
20318
20365
  ]
20319
20366
  );
20320
20367
  const renderTaskListProps = useMemo(
@@ -20347,7 +20394,8 @@ const Gantt = (props) => {
20347
20394
  taskListContainerRef,
20348
20395
  taskListRef,
20349
20396
  tasks: visibleTasks,
20350
- ganttRef: wrapperRef
20397
+ ganttRef: wrapperRef,
20398
+ isLoading
20351
20399
  }),
20352
20400
  [
20353
20401
  childTasksMap,
@@ -20375,6 +20423,7 @@ const Gantt = (props) => {
20375
20423
  selectTaskOnMouseDown,
20376
20424
  selectedIdsMirror,
20377
20425
  taskList,
20426
+ isLoading,
20378
20427
  taskListContainerRef,
20379
20428
  visibleTasks
20380
20429
  ]
@@ -10654,20 +10654,22 @@
10654
10654
  );
10655
10655
  };
10656
10656
  const TaskListTable = React.memo(TaskListTableDefaultInner);
10657
- const taskListRoot = "_taskListRoot_yoz76_1";
10658
- const taskListHorizontalScroll = "_taskListHorizontalScroll_yoz76_19";
10659
- const taskListResizer = "_taskListResizer_yoz76_81";
10660
- const horizontalContainer$1 = "_horizontalContainer_yoz76_145";
10661
- const tableWrapper = "_tableWrapper_yoz76_159";
10662
- const scrollToTop = "_scrollToTop_yoz76_173";
10663
- const scrollToBottom = "_scrollToBottom_yoz76_189";
10664
- const hidden = "_hidden_yoz76_205";
10657
+ const taskListRoot = "_taskListRoot_6kpxi_1";
10658
+ const taskListHorizontalScroll = "_taskListHorizontalScroll_6kpxi_19";
10659
+ const taskListResizer = "_taskListResizer_6kpxi_81";
10660
+ const horizontalContainer$1 = "_horizontalContainer_6kpxi_145";
10661
+ const tableWrapper = "_tableWrapper_6kpxi_159";
10662
+ const loadingOverlayBody$1 = "_loadingOverlayBody_6kpxi_173";
10663
+ const scrollToTop = "_scrollToTop_6kpxi_195";
10664
+ const scrollToBottom = "_scrollToBottom_6kpxi_211";
10665
+ const hidden = "_hidden_6kpxi_227";
10665
10666
  const styles$d = {
10666
10667
  taskListRoot,
10667
10668
  taskListHorizontalScroll,
10668
10669
  taskListResizer,
10669
10670
  horizontalContainer: horizontalContainer$1,
10670
10671
  tableWrapper,
10672
+ loadingOverlayBody: loadingOverlayBody$1,
10671
10673
  scrollToTop,
10672
10674
  scrollToBottom,
10673
10675
  hidden
@@ -10717,6 +10719,7 @@
10717
10719
  taskListHorizontalScrollRef,
10718
10720
  taskListRef,
10719
10721
  tasks,
10722
+ isLoading = false,
10720
10723
  onResizeColumn,
10721
10724
  canReorderTasks,
10722
10725
  tableBottom
@@ -10772,7 +10775,8 @@
10772
10775
  onClick,
10773
10776
  onExpanderClick,
10774
10777
  scrollToTask,
10775
- selectTaskOnMouseDown,
10778
+ selectTaskOnMouseDown: isLoading ? () => {
10779
+ } : selectTaskOnMouseDown,
10776
10780
  task,
10777
10781
  depth
10778
10782
  };
@@ -10797,6 +10801,7 @@
10797
10801
  onExpanderClick,
10798
10802
  scrollToTask,
10799
10803
  selectTaskOnMouseDown,
10804
+ isLoading,
10800
10805
  selectedIdsMirror
10801
10806
  ]
10802
10807
  );
@@ -10822,6 +10827,13 @@
10822
10827
  }
10823
10828
  ),
10824
10829
  /* @__PURE__ */ jsxRuntime.jsxs("div", { className: styles$d.tableWrapper, children: [
10830
+ (isLoading || false) && /* @__PURE__ */ jsxRuntime.jsx(
10831
+ "div",
10832
+ {
10833
+ className: styles$d.loadingOverlayBody,
10834
+ "data-testid": "tasklist-loading-overlay"
10835
+ }
10836
+ ),
10825
10837
  /* @__PURE__ */ jsxRuntime.jsx(
10826
10838
  "div",
10827
10839
  {
@@ -10867,7 +10879,8 @@
10867
10879
  handleMoveTaskBefore,
10868
10880
  handleMoveTaskAfter,
10869
10881
  handleMoveTasksInside,
10870
- handleOpenContextMenu,
10882
+ handleOpenContextMenu: isLoading ? () => {
10883
+ } : handleOpenContextMenu,
10871
10884
  icons,
10872
10885
  isShowTaskNumbers,
10873
10886
  mapTaskToNestedIndex,
@@ -12987,6 +13000,7 @@
12987
13000
  selectTaskOnMouseDown,
12988
13001
  selectedIdsMirror,
12989
13002
  onTooltipTask,
13003
+ isLoading = false,
12990
13004
  startColumnIndex,
12991
13005
  taskYOffset,
12992
13006
  taskHeight,
@@ -13115,17 +13129,17 @@
13115
13129
  distances,
13116
13130
  taskHeight,
13117
13131
  taskHalfHeight,
13118
- isProgressChangeable: (t) => isProgressChangeable(t) && !waitCommitTasks,
13132
+ isProgressChangeable: (t) => isProgressChangeable(t) && !waitCommitTasks && !isLoading,
13119
13133
  isDateChangeable: (t) => isDateChangeable(t) && !waitCommitTasks,
13120
- isRelationChangeable: (t) => isRelationChangeable(t) && !waitCommitTasks,
13134
+ isRelationChangeable: (t) => isRelationChangeable(t) && !waitCommitTasks && !isLoading,
13121
13135
  authorizedRelations,
13122
13136
  ganttRelationEvent,
13123
- canDelete: !task.isDisabled && !waitCommitTasks,
13124
- onDoubleClick,
13125
- onClick,
13126
- onEventStart: onTaskBarDragStart,
13137
+ canDelete: !task.isDisabled && !waitCommitTasks && !isLoading,
13138
+ onDoubleClick: isLoading ? void 0 : onDoubleClick,
13139
+ onClick: isLoading ? void 0 : onClick,
13140
+ onEventStart: isLoading ? void 0 : onTaskBarDragStart,
13127
13141
  onTooltipTask,
13128
- onRelationStart: onTaskBarRelationStart,
13142
+ onRelationStart: isLoading ? void 0 : onTaskBarRelationStart,
13129
13143
  isSelected: Boolean(selectedIdsMirror[taskId]),
13130
13144
  isCritical,
13131
13145
  rtl,
@@ -13345,7 +13359,8 @@
13345
13359
  visibleTasksMirror,
13346
13360
  onArrowDoubleClick,
13347
13361
  showProgress,
13348
- progressColor
13362
+ progressColor,
13363
+ isLoading
13349
13364
  ]);
13350
13365
  return /* @__PURE__ */ jsxRuntime.jsxs("g", { className: "content", children: [
13351
13366
  renderedSelectedTasks,
@@ -13380,15 +13395,19 @@
13380
13395
  ] });
13381
13396
  };
13382
13397
  const TaskGanttContent = React.memo(TaskGanttContentInner);
13383
- const ganttVerticalContainer = "_ganttVerticalContainer_1wr55_1";
13384
- const horizontalContainer = "_horizontalContainer_1wr55_73";
13385
- const wrapper = "_wrapper_1wr55_85";
13386
- const calendarDragging = "_calendarDragging_1wr55_109";
13398
+ const ganttVerticalContainer = "_ganttVerticalContainer_19ply_1";
13399
+ const horizontalContainer = "_horizontalContainer_19ply_73";
13400
+ const wrapper = "_wrapper_19ply_93";
13401
+ const calendarDragging = "_calendarDragging_19ply_117";
13402
+ const loadingOverlay = "_loadingOverlay_19ply_125";
13403
+ const loadingOverlayBody = "_loadingOverlayBody_19ply_141";
13387
13404
  const styles$2 = {
13388
13405
  ganttVerticalContainer,
13389
13406
  horizontalContainer,
13390
13407
  wrapper,
13391
- calendarDragging
13408
+ calendarDragging,
13409
+ loadingOverlay,
13410
+ loadingOverlayBody
13392
13411
  };
13393
13412
  const TaskGanttInner = (props) => {
13394
13413
  const {
@@ -13443,7 +13462,7 @@
13443
13462
  ]
13444
13463
  );
13445
13464
  React.useEffect(() => {
13446
- if (!contentRef.current) {
13465
+ if (!contentRef.current || barProps.isLoading) {
13447
13466
  return () => {
13448
13467
  };
13449
13468
  }
@@ -13513,7 +13532,12 @@
13513
13532
  contentContainer.removeEventListener("mouseup", onScrollEnd);
13514
13533
  contentContainer.removeEventListener("mouseout", onScrollEnd);
13515
13534
  };
13516
- }, [verticalScrollbarRef, horizontalContainerRef, verticalGanttContainerRef]);
13535
+ }, [
13536
+ verticalScrollbarRef,
13537
+ horizontalContainerRef,
13538
+ verticalGanttContainerRef,
13539
+ barProps.isLoading
13540
+ ]);
13517
13541
  return /* @__PURE__ */ jsxRuntime.jsxs(
13518
13542
  "div",
13519
13543
  {
@@ -13532,41 +13556,50 @@
13532
13556
  children: /* @__PURE__ */ jsxRuntime.jsx(Calendar, { scrollRef: verticalGanttContainerRef, ...calendarProps })
13533
13557
  }
13534
13558
  ),
13535
- /* @__PURE__ */ jsxRuntime.jsx(
13559
+ /* @__PURE__ */ jsxRuntime.jsxs(
13536
13560
  "div",
13537
13561
  {
13538
13562
  ref: horizontalContainerRef,
13539
13563
  className: styles$2.horizontalContainer,
13540
13564
  style: containerStyle,
13541
- children: /* @__PURE__ */ jsxRuntime.jsx("div", { style: gridStyle, children: /* @__PURE__ */ jsxRuntime.jsxs(
13542
- "svg",
13543
- {
13544
- xmlns: "http://www.w3.org/2000/svg",
13545
- width: fullSvgWidth,
13546
- height: ganttFullHeight,
13547
- fontFamily: "var(--gantt-font-family)",
13548
- ref: ganttSVGRef,
13549
- onContextMenu: (event) => {
13550
- event.preventDefault();
13551
- if (onOpenGanttContextMenu) {
13552
- onOpenGanttContextMenu(event.clientX, event.clientY);
13553
- }
13554
- },
13555
- children: [
13556
- /* @__PURE__ */ jsxRuntime.jsx(GanttToday, { ...ganttTodayProps }),
13557
- /* @__PURE__ */ jsxRuntime.jsx(
13558
- "rect",
13559
- {
13560
- ref: contentRef,
13561
- width: "100%",
13562
- height: "100%",
13563
- fill: "transparent"
13565
+ children: [
13566
+ barProps.isLoading && /* @__PURE__ */ jsxRuntime.jsx(
13567
+ "div",
13568
+ {
13569
+ className: styles$2.loadingOverlayBody,
13570
+ "data-testid": "gantt-loading-overlay-body"
13571
+ }
13572
+ ),
13573
+ /* @__PURE__ */ jsxRuntime.jsx("div", { style: gridStyle, children: /* @__PURE__ */ jsxRuntime.jsxs(
13574
+ "svg",
13575
+ {
13576
+ xmlns: "http://www.w3.org/2000/svg",
13577
+ width: fullSvgWidth,
13578
+ height: ganttFullHeight,
13579
+ fontFamily: "var(--gantt-font-family)",
13580
+ ref: ganttSVGRef,
13581
+ onContextMenu: (event) => {
13582
+ event.preventDefault();
13583
+ if (onOpenGanttContextMenu) {
13584
+ onOpenGanttContextMenu(event.clientX, event.clientY);
13564
13585
  }
13565
- ),
13566
- /* @__PURE__ */ jsxRuntime.jsx(TaskGanttContent, { ...barProps })
13567
- ]
13568
- }
13569
- ) })
13586
+ },
13587
+ children: [
13588
+ /* @__PURE__ */ jsxRuntime.jsx(GanttToday, { ...ganttTodayProps }),
13589
+ /* @__PURE__ */ jsxRuntime.jsx(
13590
+ "rect",
13591
+ {
13592
+ ref: contentRef,
13593
+ width: "100%",
13594
+ height: "100%",
13595
+ fill: "transparent"
13596
+ }
13597
+ ),
13598
+ /* @__PURE__ */ jsxRuntime.jsx(TaskGanttContent, { ...barProps })
13599
+ ]
13600
+ }
13601
+ ) })
13602
+ ]
13570
13603
  }
13571
13604
  )
13572
13605
  ]
@@ -19003,6 +19036,7 @@
19003
19036
  showProgress = true,
19004
19037
  progressColor
19005
19038
  } = props;
19039
+ const { isLoading = false } = props;
19006
19040
  const ganttSVGRef = React.useRef(null);
19007
19041
  const wrapperRef = React.useRef(null);
19008
19042
  const taskListRef = React.useRef(null);
@@ -19317,6 +19351,9 @@
19317
19351
  });
19318
19352
  const handleOpenGanttContextMenu = React.useCallback(
19319
19353
  (task, clientX, clientY) => {
19354
+ if (isLoading) {
19355
+ return;
19356
+ }
19320
19357
  const wrapperNode = wrapperRef.current;
19321
19358
  if (!wrapperNode) {
19322
19359
  return;
@@ -19329,7 +19366,7 @@
19329
19366
  y: clientY - top
19330
19367
  });
19331
19368
  },
19332
- [wrapperRef]
19369
+ [wrapperRef, isLoading]
19333
19370
  );
19334
19371
  const handleCloseGanttContextMenu = React.useCallback(() => {
19335
19372
  setGanttContextMenu({
@@ -19463,6 +19500,10 @@
19463
19500
  horizontalContainerRef
19464
19501
  ]);
19465
19502
  const handleKeyDown = (event) => {
19503
+ if (isLoading) {
19504
+ event.preventDefault();
19505
+ return;
19506
+ }
19466
19507
  const { columnWidth, rowHeight: rowHeight2 } = distances;
19467
19508
  let newScrollY = scrollY;
19468
19509
  let newScrollX = scrollX;
@@ -20128,6 +20169,9 @@
20128
20169
  }, [taskList.contextMenuOptions, locale]);
20129
20170
  const handleOpenContextMenuForRow = React.useCallback(
20130
20171
  (task, clientX, clientY) => {
20172
+ if (isLoading) {
20173
+ return;
20174
+ }
20131
20175
  try {
20132
20176
  if (onRowContextMenu && task) {
20133
20177
  onRowContextMenu(task);
@@ -20145,7 +20189,8 @@
20145
20189
  handleOpenContextMenu,
20146
20190
  selectTask,
20147
20191
  contextMenuOptions,
20148
- selectedIdsMirror
20192
+ selectedIdsMirror,
20193
+ isLoading
20149
20194
  ]
20150
20195
  );
20151
20196
  const ganttContextMenuOptions = React.useMemo(() => {
@@ -20279,6 +20324,7 @@
20279
20324
  onDeleteTask: (taskForDelete) => handleDeleteTasks([taskForDelete]),
20280
20325
  onTaskBarDragStart: handleTaskDragStart,
20281
20326
  onTooltipTask: onChangeTooltipTask,
20327
+ isLoading,
20282
20328
  mapGlobalRowIndexToTask,
20283
20329
  onArrowDoubleClick,
20284
20330
  renderedRowIndexes,
@@ -20331,7 +20377,8 @@
20331
20377
  changeInProgress == null ? void 0 : changeInProgress.action,
20332
20378
  handleDeleteTasks,
20333
20379
  showProgress,
20334
- progressColor
20380
+ progressColor,
20381
+ isLoading
20335
20382
  ]
20336
20383
  );
20337
20384
  const renderTaskListProps = React.useMemo(
@@ -20364,7 +20411,8 @@
20364
20411
  taskListContainerRef,
20365
20412
  taskListRef,
20366
20413
  tasks: visibleTasks,
20367
- ganttRef: wrapperRef
20414
+ ganttRef: wrapperRef,
20415
+ isLoading
20368
20416
  }),
20369
20417
  [
20370
20418
  childTasksMap,
@@ -20392,6 +20440,7 @@
20392
20440
  selectTaskOnMouseDown,
20393
20441
  selectedIdsMirror,
20394
20442
  taskList,
20443
+ isLoading,
20395
20444
  taskListContainerRef,
20396
20445
  visibleTasks
20397
20446
  ]
package/dist/style.css CHANGED
@@ -282,7 +282,7 @@
282
282
  border-bottom: 1px solid var(--gantt-divider-color);
283
283
  table-layout: fixed;
284
284
  }
285
- ._taskListRoot_yoz76_1 {
285
+ ._taskListRoot_6kpxi_1 {
286
286
  position: relative;
287
287
  height: 100%;
288
288
  display: flex;
@@ -291,23 +291,23 @@
291
291
  border-left: 1px solid var(--gantt-table-divider-color, var(--gantt-divider-color));
292
292
  }
293
293
 
294
- ._taskListHorizontalScroll_yoz76_19 {
294
+ ._taskListHorizontalScroll_6kpxi_19 {
295
295
  overflow-x: scroll;
296
296
  height: 100%;
297
297
  display: flex;
298
298
  flex-direction: column;
299
299
  }
300
300
 
301
- ._taskListHorizontalScroll_yoz76_19::-webkit-scrollbar {
301
+ ._taskListHorizontalScroll_6kpxi_19::-webkit-scrollbar {
302
302
  width: 1rem;
303
303
  height: 1rem;
304
304
  }
305
305
 
306
- ._taskListHorizontalScroll_yoz76_19::-webkit-scrollbar-corner {
306
+ ._taskListHorizontalScroll_6kpxi_19::-webkit-scrollbar-corner {
307
307
  background: transparent;
308
308
  }
309
309
 
310
- ._taskListHorizontalScroll_yoz76_19::-webkit-scrollbar-thumb {
310
+ ._taskListHorizontalScroll_6kpxi_19::-webkit-scrollbar-thumb {
311
311
  border: 4px solid transparent;
312
312
  /*noinspection CssUnresolvedCustomProperty*/
313
313
  background: var(--gantt-scrollbar-thumb-color);
@@ -315,14 +315,14 @@
315
315
  background-clip: padding-box;
316
316
  }
317
317
 
318
- ._taskListHorizontalScroll_yoz76_19::-webkit-scrollbar-thumb:hover {
318
+ ._taskListHorizontalScroll_6kpxi_19::-webkit-scrollbar-thumb:hover {
319
319
  border: 2px solid transparent;
320
320
  /*noinspection CssUnresolvedCustomProperty*/
321
321
  background: var(--gantt-scrollbar-thumb-color);
322
322
  background-clip: padding-box;
323
323
  }
324
324
 
325
- ._taskListResizer_yoz76_81 {
325
+ ._taskListResizer_6kpxi_81 {
326
326
  position: absolute;
327
327
  top: 0;
328
328
  right: -3px;
@@ -334,16 +334,16 @@
334
334
  }
335
335
 
336
336
  /*noinspection CssUnresolvedCustomProperty*/
337
- ._taskListResizer_yoz76_81:hover {
337
+ ._taskListResizer_6kpxi_81:hover {
338
338
  background-color: var(--gantt-table-hover-action-color);
339
339
  filter: var(--gantt-hover-filter);
340
340
  }
341
341
 
342
- ._taskListResizer_yoz76_81:hover::before {
342
+ ._taskListResizer_6kpxi_81:hover::before {
343
343
  display: none;
344
344
  }
345
345
 
346
- ._taskListResizer_yoz76_81::before {
346
+ ._taskListResizer_6kpxi_81::before {
347
347
  content: "";
348
348
  position: absolute;
349
349
  top: 0;
@@ -354,21 +354,32 @@
354
354
  background-color: var(--gantt-table-resize-color, var(--gantt-divider-color));
355
355
  }
356
356
 
357
- ._horizontalContainer_yoz76_145 {
357
+ ._horizontalContainer_6kpxi_145 {
358
358
  margin: 0;
359
359
  padding: 0;
360
360
  overflow: hidden;
361
361
  flex-grow: 1;
362
362
  }
363
363
 
364
- ._tableWrapper_yoz76_159 {
364
+ ._tableWrapper_6kpxi_159 {
365
365
  position: relative;
366
366
  flex-grow: 1;
367
367
  display: flex;
368
368
  flex-direction: column;
369
369
  }
370
370
 
371
- ._scrollToTop_yoz76_173 {
371
+ ._loadingOverlayBody_6kpxi_173 {
372
+ position: absolute;
373
+ left: 0;
374
+ right: 0;
375
+ top: 0; /* We'll position overlay inside body wrapper so header remains visible */
376
+ bottom: 0;
377
+ background: rgba(255,255,255,0.6);
378
+ z-index: 2;
379
+ pointer-events: auto;
380
+ }
381
+
382
+ ._scrollToTop_6kpxi_195 {
372
383
  position: absolute;
373
384
  top: 0;
374
385
  left: 0;
@@ -376,7 +387,7 @@
376
387
  height: 20px;
377
388
  }
378
389
 
379
- ._scrollToBottom_yoz76_189 {
390
+ ._scrollToBottom_6kpxi_211 {
380
391
  position: absolute;
381
392
  bottom: 0;
382
393
  left: 0;
@@ -384,7 +395,7 @@
384
395
  height: 20px;
385
396
  }
386
397
 
387
- ._hidden_yoz76_205 {
398
+ ._hidden_6kpxi_227 {
388
399
  display: none;
389
400
  }
390
401
  ._ganttToday_1oyhk_1 {
@@ -578,7 +589,7 @@
578
589
  user-select: none;
579
590
  stroke-width: 0;
580
591
  }
581
- ._ganttVerticalContainer_1wr55_1 {
592
+ ._ganttVerticalContainer_19ply_1 {
582
593
  overflow-x: scroll;
583
594
  overflow-y: hidden;
584
595
  font-size: 0;
@@ -590,16 +601,16 @@
590
601
  height: 100%;
591
602
  }
592
603
 
593
- ._ganttVerticalContainer_1wr55_1::-webkit-scrollbar {
604
+ ._ganttVerticalContainer_19ply_1::-webkit-scrollbar {
594
605
  width: 1rem;
595
606
  height: 1rem;
596
607
  }
597
608
 
598
- ._ganttVerticalContainer_1wr55_1::-webkit-scrollbar-corner {
609
+ ._ganttVerticalContainer_19ply_1::-webkit-scrollbar-corner {
599
610
  background: transparent;
600
611
  }
601
612
 
602
- ._ganttVerticalContainer_1wr55_1::-webkit-scrollbar-thumb {
613
+ ._ganttVerticalContainer_19ply_1::-webkit-scrollbar-thumb {
603
614
  border: 4px solid transparent;
604
615
  /*noinspection CssUnresolvedCustomProperty*/
605
616
  background: var(--gantt-scrollbar-thumb-color);
@@ -607,20 +618,24 @@
607
618
  background-clip: padding-box;
608
619
  }
609
620
 
610
- ._ganttVerticalContainer_1wr55_1::-webkit-scrollbar-thumb:hover {
621
+ ._ganttVerticalContainer_19ply_1::-webkit-scrollbar-thumb:hover {
611
622
  border: 2px solid transparent;
612
623
  /*noinspection CssUnresolvedCustomProperty*/
613
624
  background: var(--gantt-scrollbar-thumb-color);
614
625
  background-clip: padding-box;
615
626
  }
616
627
 
617
- ._horizontalContainer_1wr55_73 {
628
+ ._horizontalContainer_19ply_73 {
618
629
  margin: 0;
619
630
  padding: 0;
620
631
  overflow: hidden;
621
632
  }
622
633
 
623
- ._wrapper_1wr55_85 {
634
+ ._horizontalContainer_19ply_73 {
635
+ position: relative;
636
+ }
637
+
638
+ ._wrapper_19ply_93 {
624
639
  display: flex;
625
640
  padding: 0;
626
641
  margin: 0;
@@ -632,9 +647,28 @@
632
647
  border-bottom: 1px solid var(--gantt-divider-color);
633
648
  }
634
649
 
635
- ._calendarDragging_1wr55_109 {
650
+ ._calendarDragging_19ply_117 {
636
651
  cursor: grabbing;
637
652
  }
653
+
654
+ ._loadingOverlay_19ply_125 {
655
+ position: absolute;
656
+ inset: 0;
657
+ background: rgba(255, 255, 255, 0.6);
658
+ z-index: 9999;
659
+ pointer-events: auto;
660
+ }
661
+
662
+ ._loadingOverlayBody_19ply_141 {
663
+ position: absolute;
664
+ left: 0;
665
+ right: 0;
666
+ top: 0;
667
+ bottom: 0;
668
+ background: rgba(255, 255, 255, 0.6);
669
+ z-index: 3;
670
+ pointer-events: auto;
671
+ }
638
672
  /*noinspection CssUnresolvedCustomProperty*/
639
673
  ._menuOption_1c3e3_3 {
640
674
  display: flex;
@@ -368,6 +368,12 @@ export interface GanttProps {
368
368
  * Custom color for progress bars. If not provided, theme progress colors are used.
369
369
  */
370
370
  progressColor?: string;
371
+ /**
372
+ * When true, disables user interactions with the gantt and task list and
373
+ * shows a loading/disabled state. Useful while external updates are in
374
+ * progress to prevent rapid user actions.
375
+ */
376
+ isLoading?: boolean;
371
377
  }
372
378
  export interface GanttTaskBarActions {
373
379
  allowMoveTaskBar?: (action: TaskBarMoveAction, task: RenderTask) => boolean;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "gantt-task-react-v",
3
- "version": "1.1.18",
3
+ "version": "1.1.20",
4
4
  "description": "Interactive Gantt Chart for React with TypeScript.",
5
5
  "author": "aguilanbon",
6
6
  "homepage": "https://github.com/aguilanbon/gantt-task-react-v",