gantt-task-react-powern 0.6.1 → 0.6.3

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.
@@ -1,4 +1,5 @@
1
1
  import React from "react";
2
+ import { VirtualItem } from "@tanstack/react-virtual";
2
3
  import { EventOption } from "../../types/public-types";
3
4
  import { BarTask } from "../../types/bar-task";
4
5
  import { GanttEvent } from "../../types/gantt-task-actions";
@@ -18,6 +19,9 @@ export declare type TaskGanttContentProps = {
18
19
  fontSize: string;
19
20
  fontFamily: string;
20
21
  rtl: boolean;
22
+ virtualItems?: VirtualItem[];
23
+ visibleStartY: number;
24
+ visibleEndY: number;
21
25
  setGanttEvent: (value: GanttEvent) => void;
22
26
  setFailedTask: (value: BarTask | null) => void;
23
27
  setSelectedTask: (taskId: string) => void;
@@ -1,4 +1,5 @@
1
1
  import React from "react";
2
+ import { VirtualItem } from "@tanstack/react-virtual";
2
3
  import { Task } from "../../types/public-types";
3
4
  export declare type GridBodyProps = {
4
5
  tasks: Task[];
@@ -10,5 +11,8 @@ export declare type GridBodyProps = {
10
11
  todayColor: string;
11
12
  weekendColor: string;
12
13
  rtl: boolean;
14
+ virtualItems?: VirtualItem[];
15
+ visibleStartY: number;
16
+ visibleEndY: number;
13
17
  };
14
18
  export declare const GridBody: React.FC<GridBodyProps>;
@@ -1,4 +1,5 @@
1
1
  import React from "react";
2
+ import { VirtualItem } from "@tanstack/react-virtual";
2
3
  import { Task } from "../../types/public-types";
3
4
  export declare const TaskListTableDefault: React.FC<{
4
5
  rowHeight: number;
@@ -15,4 +16,5 @@ export declare const TaskListTableDefault: React.FC<{
15
16
  selectedTasks?: string[];
16
17
  onTaskSelect?: (taskId: string, selected: boolean) => void;
17
18
  taskLabelRenderer?: (Task: Task) => React.ReactNode;
19
+ virtualItems?: VirtualItem[];
18
20
  }>;
@@ -1,4 +1,5 @@
1
1
  import React from "react";
2
+ import { VirtualItem } from "@tanstack/react-virtual";
2
3
  import { EventOption } from "../../types/public-types";
3
4
  import { BarTask } from "../../types/bar-task";
4
5
  import { Task } from "../../types/public-types";
@@ -44,6 +45,7 @@ export declare type TaskListProps = {
44
45
  selectedTasks?: string[];
45
46
  onTaskSelect?: (taskId: string, selected: boolean) => void;
46
47
  taskLabelRenderer?: (Task: Task) => React.ReactNode;
48
+ virtualItems?: VirtualItem[];
47
49
  }>;
48
50
  } & EventOption;
49
51
  export declare const TaskList: React.FC<TaskListProps>;
package/dist/index.js CHANGED
@@ -2,6 +2,7 @@ function _interopDefault (ex) { return (ex && (typeof ex === 'object') && 'defau
2
2
 
3
3
  var React = require('react');
4
4
  var React__default = _interopDefault(React);
5
+ var reactVirtual = require('@tanstack/react-virtual');
5
6
 
6
7
  function _extends() {
7
8
  _extends = Object.assign || function (target) {
@@ -424,7 +425,8 @@ var TaskListTableDefault = function TaskListTableDefault(_ref) {
424
425
  _ref$taskLabelRendere = _ref.taskLabelRenderer,
425
426
  taskLabelRenderer = _ref$taskLabelRendere === void 0 ? function (t) {
426
427
  return " " + t.name;
427
- } : _ref$taskLabelRendere;
428
+ } : _ref$taskLabelRendere,
429
+ virtualItems = _ref.virtualItems;
428
430
  var toLocaleDateString = React.useMemo(function () {
429
431
  return toLocaleDateStringFactory(locale);
430
432
  }, [locale]);
@@ -445,13 +447,25 @@ var TaskListTableDefault = function TaskListTableDefault(_ref) {
445
447
  return hasSelectedAncestor(parentWbs, selectedSet, allTasks);
446
448
  };
447
449
 
450
+ var itemsToRender = virtualItems || tasks.map(function (_, index) {
451
+ return {
452
+ index: index,
453
+ start: index * rowHeight,
454
+ size: rowHeight,
455
+ key: index,
456
+ end: (index + 1) * rowHeight,
457
+ lane: 0,
458
+ measureElement: function measureElement() {}
459
+ };
460
+ });
448
461
  return React__default.createElement("div", {
449
462
  className: styles$1.taskListWrapper,
450
463
  style: {
451
464
  fontFamily: fontFamily,
452
465
  fontSize: fontSize
453
466
  }
454
- }, tasks.map(function (t) {
467
+ }, itemsToRender.map(function (vi) {
468
+ var t = tasks[vi.index];
455
469
  var expanderSymbol = "";
456
470
 
457
471
  if (!(leafTaskIds.has(t.id) || t.type === "milestone")) {
@@ -465,6 +479,17 @@ var TaskListTableDefault = function TaskListTableDefault(_ref) {
465
479
  var isSelected = selectedTasks.includes(t.id);
466
480
  var isAncestorSelected = hasSelectedAncestor(t.id, new Set(selectedTasks), tasks);
467
481
  return React__default.createElement("div", {
482
+ key: "" + vi.key,
483
+ "data-index": vi.index,
484
+ style: {
485
+ position: "absolute",
486
+ top: 0,
487
+ left: 0,
488
+ width: "100%",
489
+ height: vi.size + "px",
490
+ transform: "translateY(" + vi.start + "px)"
491
+ }
492
+ }, React__default.createElement("div", {
468
493
  className: t.type === "milestone" ? styles$1.taskListMilestoneRow : scheduleType === "lookAhead" ? styles$1.taskListLookAheadRow : styles$1.taskListTableRow,
469
494
  style: {
470
495
  height: rowHeight
@@ -568,7 +593,7 @@ var TaskListTableDefault = function TaskListTableDefault(_ref) {
568
593
  }
569
594
  }, React__default.createElement("div", {
570
595
  className: styles$1.taskListText
571
- }, "\xA0", toLocaleDateString(t.actualEnd, dateTimeOptions))));
596
+ }, "\xA0", toLocaleDateString(t.actualEnd, dateTimeOptions)))));
572
597
  }));
573
598
  };
574
599
 
@@ -760,6 +785,16 @@ var TaskList = function TaskList(_ref) {
760
785
 
761
786
  var prevSelectedTasksRef = React.useRef([]);
762
787
  var expandedTasks = React.useRef([]);
788
+ var virtualizer = reactVirtual.useVirtualizer({
789
+ count: tasks.length,
790
+ getScrollElement: function getScrollElement() {
791
+ return horizontalContainerRef.current;
792
+ },
793
+ estimateSize: function estimateSize() {
794
+ return rowHeight;
795
+ },
796
+ overscan: 10
797
+ });
763
798
  React.useEffect(function () {
764
799
  if (horizontalContainerRef.current) {
765
800
  horizontalContainerRef.current.scrollTop = scrollY;
@@ -911,8 +946,10 @@ var TaskList = function TaskList(_ref) {
911
946
  onExpanderClick: onExpanderClick,
912
947
  selectedTasks: onMultiSelect ? selectedTasks : undefined,
913
948
  onTaskSelect: onMultiSelect ? handleTaskSelect : undefined,
914
- taskLabelRenderer: taskLabelRenderer
949
+ taskLabelRenderer: taskLabelRenderer,
950
+ virtualItems: virtualizer.getVirtualItems()
915
951
  };
952
+ console.debug(virtualizer.getTotalSize());
916
953
  return React__default.createElement("div", {
917
954
  ref: taskListRef
918
955
  }, React__default.createElement(TaskListHeader, Object.assign({}, headerProps)), React__default.createElement("div", {
@@ -921,7 +958,13 @@ var TaskList = function TaskList(_ref) {
921
958
  style: ganttHeight ? {
922
959
  height: ganttHeight
923
960
  } : {}
924
- }, React__default.createElement(TaskListTable, Object.assign({}, tableProps))));
961
+ }, React__default.createElement("div", {
962
+ style: {
963
+ height: virtualizer.getTotalSize() + "px",
964
+ width: "100%",
965
+ position: "relative"
966
+ }
967
+ }, React__default.createElement(TaskListTable, Object.assign({}, tableProps)))));
925
968
  };
926
969
 
927
970
  var styles$4 = {"gridRow":"_2dZTy","gridRowLookAhead":"_2RRca","gridRowLine":"_3rUKi","gridTick":"_RuwuK","darkerGridRow":"_2M-tt"};
@@ -935,103 +978,128 @@ var GridBody = function GridBody(_ref) {
935
978
  columnWidth = _ref.columnWidth,
936
979
  todayColor = _ref.todayColor,
937
980
  weekendColor = _ref.weekendColor,
938
- rtl = _ref.rtl;
939
- var y = 0;
940
- var gridRows = [];
941
- var rowLines = [React__default.createElement("line", {
942
- key: "RowLineFirst",
943
- x: "0",
944
- y1: 0,
945
- x2: svgWidth,
946
- y2: 0,
947
- className: styles$4.gridRowLine
948
- })];
949
-
950
- for (var _iterator = _createForOfIteratorHelperLoose(tasks), _step; !(_step = _iterator()).done;) {
951
- var task = _step.value;
952
- var isDarkerRow = task.type === "milestone";
953
- gridRows.push(React__default.createElement("rect", {
954
- key: "Row" + task.id,
955
- x: "0",
956
- y: y,
957
- width: svgWidth,
958
- height: rowHeight,
959
- className: isDarkerRow ? styles$4.darkerGridRow : scheduleType === "lookAhead" ? styles$4.gridRowLookAhead : styles$4.gridRow
960
- }));
961
- rowLines.push(React__default.createElement("line", {
962
- key: "RowLine" + task.id,
963
- x: "0",
964
- y1: y + rowHeight,
965
- x2: svgWidth,
966
- y2: y + rowHeight,
967
- className: styles$4.gridRowLine
968
- }));
969
- y += rowHeight;
970
- }
971
-
981
+ rtl = _ref.rtl,
982
+ _ref$virtualItems = _ref.virtualItems,
983
+ virtualItems = _ref$virtualItems === void 0 ? [] : _ref$virtualItems,
984
+ visibleStartY = _ref.visibleStartY,
985
+ visibleEndY = _ref.visibleEndY;
986
+ var visibleHeight = visibleEndY - visibleStartY;
972
987
  var now = new Date();
973
- var tickX = 0;
974
- var ticks = [];
975
- var today = React__default.createElement("rect", null);
976
- var weekend = [];
988
+ var items = virtualItems.length > 0 ? virtualItems : tasks.map(function (_, i) {
989
+ return {
990
+ index: i,
991
+ start: i * rowHeight,
992
+ end: (i + 1) * rowHeight,
993
+ size: rowHeight,
994
+ key: i
995
+ };
996
+ });
997
+
998
+ var isWeekend = function isWeekend(date) {
999
+ var d = date.getDay();
1000
+ return d === 0 || d === 6;
1001
+ };
977
1002
 
978
- for (var i = 0; i < dates.length; i++) {
1003
+ var isTodayColumn = function isTodayColumn(i) {
979
1004
  var date = dates[i];
980
- ticks.push(React__default.createElement("line", {
981
- key: date.getTime(),
982
- x1: tickX,
983
- y1: 0,
984
- x2: tickX,
985
- y2: y,
986
- className: styles$4.gridTick
987
- }));
1005
+ var next = dates[i + 1];
1006
+ if (next && date <= now && next > now) return true;
1007
+
1008
+ if (!next && date <= now) {
1009
+ var step = date.getTime() - dates[i - 1].getTime();
1010
+ var end = addToDate(date, step, "millisecond");
1011
+ return end > now;
1012
+ }
1013
+
1014
+ return false;
1015
+ };
1016
+
1017
+ var todayRects = [];
1018
+ var weekendRects = [];
988
1019
 
989
- if (i + 1 !== dates.length && date.getTime() < now.getTime() && dates[i + 1].getTime() >= now.getTime() || i !== 0 && i + 1 === dates.length && date.getTime() < now.getTime() && addToDate(date, date.getTime() - dates[i - 1].getTime(), "millisecond").getTime() >= now.getTime()) {
990
- today = React__default.createElement("rect", {
991
- x: tickX,
992
- y: 0,
1020
+ for (var i = 0, x = 0; i < dates.length; i++, x += columnWidth) {
1021
+ if (isTodayColumn(i)) {
1022
+ todayRects.push(React__default.createElement("rect", {
1023
+ key: "today-" + i,
1024
+ x: rtl ? x + columnWidth : x,
1025
+ y: visibleStartY,
993
1026
  width: columnWidth,
994
- height: y,
1027
+ height: visibleHeight,
995
1028
  fill: todayColor
996
- });
1029
+ }));
997
1030
  }
998
1031
 
999
- if (date.getDay() === 6 || date.getDay() === 0) {
1000
- weekend.push(React__default.createElement("rect", {
1001
- x: tickX,
1002
- y: 0,
1032
+ if (isWeekend(dates[i])) {
1033
+ weekendRects.push(React__default.createElement("rect", {
1034
+ key: "weekend-" + i,
1035
+ x: x,
1036
+ y: visibleStartY,
1003
1037
  width: columnWidth,
1004
- height: y,
1038
+ height: visibleHeight,
1005
1039
  fill: weekendColor
1006
1040
  }));
1007
1041
  }
1042
+ }
1008
1043
 
1009
- if (rtl && i + 1 !== dates.length && date.getTime() >= now.getTime() && dates[i + 1].getTime() < now.getTime()) {
1010
- today = React__default.createElement("rect", {
1011
- x: tickX + columnWidth,
1012
- y: 0,
1013
- width: columnWidth,
1014
- height: y,
1015
- fill: todayColor
1016
- });
1017
- }
1044
+ var tickLines = dates.map(function (_, i) {
1045
+ return React__default.createElement("line", {
1046
+ key: "tick-" + i,
1047
+ x1: i * columnWidth,
1048
+ y1: visibleStartY,
1049
+ x2: i * columnWidth,
1050
+ y2: visibleEndY,
1051
+ className: styles$4.gridTick
1052
+ });
1053
+ });
1054
+ var rowBackgrounds = [];
1055
+ var rowLines = [];
1056
+ rowLines.push(React__default.createElement("line", {
1057
+ key: "top-line",
1058
+ x1: 0,
1059
+ y1: visibleStartY,
1060
+ x2: svgWidth,
1061
+ y2: visibleStartY,
1062
+ className: styles$4.gridRowLine
1063
+ }));
1018
1064
 
1019
- tickX += columnWidth;
1065
+ for (var _iterator = _createForOfIteratorHelperLoose(items), _step; !(_step = _iterator()).done;) {
1066
+ var vi = _step.value;
1067
+ var task = tasks[vi.index];
1068
+ if (!task) break;
1069
+ var y = vi.start;
1070
+ var isMilestone = task.type === "milestone";
1071
+ var rowClass = isMilestone ? styles$4.darkerGridRow : scheduleType === "lookAhead" ? styles$4.gridRowLookAhead : styles$4.gridRow;
1072
+ rowBackgrounds.push(React__default.createElement("rect", {
1073
+ key: "bg-" + vi.key,
1074
+ x: 0,
1075
+ y: y,
1076
+ width: svgWidth,
1077
+ height: rowHeight,
1078
+ className: rowClass
1079
+ }));
1080
+ rowLines.push(React__default.createElement("line", {
1081
+ key: "line-" + vi.key,
1082
+ x1: 0,
1083
+ y1: y + rowHeight,
1084
+ x2: svgWidth,
1085
+ y2: y + rowHeight,
1086
+ className: styles$4.gridRowLine
1087
+ }));
1020
1088
  }
1021
1089
 
1022
1090
  return React__default.createElement("g", {
1023
1091
  className: "gridBody"
1024
1092
  }, React__default.createElement("g", {
1025
1093
  className: "rows"
1026
- }, gridRows), React__default.createElement("g", {
1094
+ }, rowBackgrounds), React__default.createElement("g", {
1027
1095
  className: "rowLines"
1028
1096
  }, rowLines), React__default.createElement("g", {
1029
1097
  className: "ticks"
1030
- }, ticks), scheduleType === "lookAhead" && React__default.createElement("g", {
1098
+ }, tickLines), scheduleType === "lookAhead" && React__default.createElement("g", {
1031
1099
  className: "weekend"
1032
- }, weekend), React__default.createElement("g", {
1100
+ }, weekendRects), React__default.createElement("g", {
1033
1101
  className: "today"
1034
- }, today));
1102
+ }, todayRects));
1035
1103
  };
1036
1104
 
1037
1105
  var Grid = function Grid(props) {
@@ -2464,6 +2532,8 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
2464
2532
  fontFamily = _ref.fontFamily,
2465
2533
  fontSize = _ref.fontSize,
2466
2534
  rtl = _ref.rtl,
2535
+ _ref$virtualItems = _ref.virtualItems,
2536
+ virtualItems = _ref$virtualItems === void 0 ? [] : _ref$virtualItems,
2467
2537
  setGanttEvent = _ref.setGanttEvent,
2468
2538
  setFailedTask = _ref.setFailedTask,
2469
2539
  setSelectedTask = _ref.setSelectedTask,
@@ -2471,7 +2541,9 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
2471
2541
  onProgressChange = _ref.onProgressChange,
2472
2542
  onDoubleClick = _ref.onDoubleClick,
2473
2543
  onClick = _ref.onClick,
2474
- onDelete = _ref.onDelete;
2544
+ onDelete = _ref.onDelete,
2545
+ visibleStartY = _ref.visibleStartY,
2546
+ visibleEndY = _ref.visibleEndY;
2475
2547
  var point = svg === null || svg === void 0 ? void 0 : (_svg$current = svg.current) === null || _svg$current === void 0 ? void 0 : _svg$current.createSVGPoint();
2476
2548
 
2477
2549
  var _useState = React.useState(0),
@@ -2683,12 +2755,7 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
2683
2755
  var task = _task.start.getTime() > 0 && _task.end.getTime() > 0 ? _task : undefined;
2684
2756
 
2685
2757
  if (!task) {
2686
- return [React__default.createElement("g", {
2687
- key: _task.id + (isCritical ? "-critical" : "-normal"),
2688
- style: {
2689
- height: taskHeight
2690
- }
2691
- })];
2758
+ return [];
2692
2759
  }
2693
2760
 
2694
2761
  return task.barChildren.map(function (child) {
@@ -2698,6 +2765,15 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
2698
2765
  var criticalTask = (_task$criticalPathArr = task.criticalPathArrows) === null || _task$criticalPathArr === void 0 ? void 0 : _task$criticalPathArr.find(function (arrow) {
2699
2766
  return arrow.taskId === tasks[child.index].id && (!!arrow.criticalPathType ? arrow.criticalPathType === criticalPathType : !criticalPathType);
2700
2767
  });
2768
+ var taskTo = tasks[child.index];
2769
+ var yFrom = task.y + taskHeight / 2;
2770
+ var yTo = taskTo.y + taskHeight / 2;
2771
+ var minY = Math.min(yFrom, yTo);
2772
+ var maxY = Math.max(yFrom, yTo);
2773
+
2774
+ if (maxY < visibleStartY || minY > visibleEndY) {
2775
+ return null;
2776
+ }
2701
2777
 
2702
2778
  if (!!criticalTask === isCritical) {
2703
2779
  return React__default.createElement(Arrow, {
@@ -2726,34 +2802,44 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
2726
2802
  className: "bar",
2727
2803
  fontFamily: fontFamily,
2728
2804
  fontSize: fontSize
2729
- }, tasks.map(function (_task) {
2730
- var task = _task.start.getTime() > 0 && _task.end.getTime() > 0 || _task.actualStart.getTime() > 0 && _task.actualEnd.getTime() > 0 ? _task : undefined;
2805
+ }, virtualItems.map(function (vi) {
2806
+ var _task = tasks[vi.index];
2807
+
2808
+ var task = _extends({}, _task, {
2809
+ y: 0
2810
+ });
2731
2811
 
2732
2812
  if (!task && _task.typeInternal === "milestone") {
2733
- return React__default.createElement(Milestone, {
2734
- task: _task,
2813
+ return React__default.createElement("g", {
2814
+ key: _task.id,
2815
+ transform: "translate(0, " + vi.start + ")"
2816
+ }, React__default.createElement(Milestone, {
2817
+ task: task,
2735
2818
  arrowIndent: arrowIndent,
2736
2819
  taskHeight: taskHeight,
2737
2820
  isProgressChangeable: false,
2738
2821
  isDateChangeable: false,
2739
2822
  isDelete: !_task.isDisabled,
2740
2823
  onEventStart: handleBarEventStart,
2741
- key: _task.id,
2742
2824
  isSelected: !!selectedTask && _task.id === selectedTask.id,
2743
2825
  rtl: rtl
2744
- });
2826
+ }));
2745
2827
  }
2746
2828
 
2747
2829
  if (!task) {
2748
2830
  return React__default.createElement("g", {
2749
2831
  key: _task.id,
2832
+ transform: "translate(0, " + vi.start + ")",
2750
2833
  style: {
2751
2834
  height: taskHeight
2752
2835
  }
2753
2836
  });
2754
2837
  }
2755
2838
 
2756
- return React__default.createElement(TaskItem, {
2839
+ return React__default.createElement("g", {
2840
+ key: task.id,
2841
+ transform: "translate(0, " + vi.start + ")"
2842
+ }, React__default.createElement(TaskItem, {
2757
2843
  task: task,
2758
2844
  arrowIndent: arrowIndent,
2759
2845
  taskHeight: taskHeight,
@@ -2761,10 +2847,9 @@ var TaskGanttContent = function TaskGanttContent(_ref) {
2761
2847
  isDateChangeable: !!onDateChange && !task.isDisabled,
2762
2848
  isDelete: !task.isDisabled,
2763
2849
  onEventStart: handleBarEventStart,
2764
- key: task.id,
2765
2850
  isSelected: !!selectedTask && task.id === selectedTask.id,
2766
2851
  rtl: rtl
2767
- });
2852
+ }));
2768
2853
  })));
2769
2854
  };
2770
2855
 
@@ -2782,9 +2867,24 @@ var TaskGantt = function TaskGantt(_ref) {
2782
2867
  var verticalGanttContainerRef = React.useRef(null);
2783
2868
 
2784
2869
  var newBarProps = _extends({}, barProps, {
2785
- svg: ganttSVGRef
2870
+ svg: ganttSVGRef,
2871
+ ganttHeight: ganttHeight,
2872
+ scrollY: scrollY
2786
2873
  });
2787
2874
 
2875
+ var buffer = barProps.rowHeight * 10;
2876
+ var visibleStartY = scrollY - buffer;
2877
+ var visibleEndY = scrollY + ganttHeight + buffer;
2878
+ var virtualizer = reactVirtual.useVirtualizer({
2879
+ count: barProps.tasks.length,
2880
+ getScrollElement: function getScrollElement() {
2881
+ return horizontalContainerRef.current;
2882
+ },
2883
+ estimateSize: function estimateSize() {
2884
+ return barProps.rowHeight;
2885
+ },
2886
+ overscan: 10
2887
+ });
2788
2888
  React.useEffect(function () {
2789
2889
  if (horizontalContainerRef.current) {
2790
2890
  horizontalContainerRef.current.scrollTop = scrollY;
@@ -2816,10 +2916,18 @@ var TaskGantt = function TaskGantt(_ref) {
2816
2916
  }, React__default.createElement("svg", {
2817
2917
  xmlns: "http://www.w3.org/2000/svg",
2818
2918
  width: gridProps.svgWidth,
2819
- height: barProps.rowHeight * barProps.tasks.length,
2919
+ height: virtualizer.getTotalSize(),
2820
2920
  fontFamily: barProps.fontFamily,
2821
2921
  ref: ganttSVGRef
2822
- }, React__default.createElement(Grid, Object.assign({}, gridProps)), React__default.createElement(TaskGanttContent, Object.assign({}, newBarProps)))));
2922
+ }, React__default.createElement(Grid, Object.assign({}, gridProps, {
2923
+ virtualItems: virtualizer.getVirtualItems(),
2924
+ visibleStartY: visibleStartY,
2925
+ visibleEndY: visibleEndY
2926
+ })), React__default.createElement(TaskGanttContent, Object.assign({}, newBarProps, {
2927
+ visibleStartY: visibleStartY,
2928
+ visibleEndY: visibleEndY,
2929
+ virtualItems: virtualizer.getVirtualItems()
2930
+ })))));
2823
2931
  };
2824
2932
 
2825
2933
  var styles$a = {"scrollWrapper":"_2k9Ys","scroll":"_19jgW"};
@@ -3020,6 +3128,9 @@ var Gantt = function Gantt(_ref) {
3020
3128
  lastTouchY = _useState14[0],
3021
3129
  setLastTouchY = _useState14[1];
3022
3130
 
3131
+ var buffer = rowHeight * 10;
3132
+ var visibleStartY = scrollY - buffer;
3133
+ var visibleEndY = scrollY + ganttHeight + buffer;
3023
3134
  React.useEffect(function () {
3024
3135
  if (scheduleType === "lookAhead" && startDate && endDate) {
3025
3136
  setDateSetup({
@@ -3076,7 +3187,7 @@ var Gantt = function Gantt(_ref) {
3076
3187
  }
3077
3188
 
3078
3189
  setBarTasks(convertToBarTasks(filteredTasks, newDates, columnWidth, rowHeight, taskHeight, barCornerRadius, handleWidth, rtl, barProgressColor, barProgressSelectedColor, barBackgroundColor, barBackgroundSelectedColor, projectProgressColor, projectProgressSelectedColor, projectBackgroundColor, projectBackgroundSelectedColor, milestoneBackgroundColor, milestoneBackgroundSelectedColor));
3079
- }, [tasks, viewMode, preStepsCount, rowHeight, barCornerRadius, columnWidth, taskHeight, handleWidth, barProgressColor, barProgressSelectedColor, barBackgroundColor, barBackgroundSelectedColor, projectProgressColor, projectProgressSelectedColor, projectBackgroundColor, projectBackgroundSelectedColor, milestoneBackgroundColor, milestoneBackgroundSelectedColor, rtl, scrollX, onExpanderClick]);
3190
+ }, [tasks, viewMode, preStepsCount, rowHeight, barCornerRadius, columnWidth, taskHeight, handleWidth, barProgressColor, barProgressSelectedColor, barBackgroundColor, barBackgroundSelectedColor, projectProgressColor, projectProgressSelectedColor, projectBackgroundColor, projectBackgroundSelectedColor, milestoneBackgroundColor, milestoneBackgroundSelectedColor, rtl, onExpanderClick]);
3080
3191
  React.useEffect(function () {
3081
3192
  if (viewMode === dateSetup.viewMode && (viewDate && !currentViewDate || viewDate && (currentViewDate === null || currentViewDate === void 0 ? void 0 : currentViewDate.valueOf()) !== viewDate.valueOf())) {
3082
3193
  var dates = dateSetup.dates;
@@ -3351,7 +3462,9 @@ var Gantt = function Gantt(_ref) {
3351
3462
  dates: dateSetup.dates,
3352
3463
  todayColor: todayColor,
3353
3464
  weekendColor: weekendColor,
3354
- rtl: rtl
3465
+ rtl: rtl,
3466
+ visibleStartY: visibleStartY,
3467
+ visibleEndY: visibleEndY
3355
3468
  };
3356
3469
  var calendarProps = {
3357
3470
  dateSetup: dateSetup,
@@ -3385,7 +3498,9 @@ var Gantt = function Gantt(_ref) {
3385
3498
  onProgressChange: onProgressChange,
3386
3499
  onDoubleClick: onDoubleClick,
3387
3500
  onClick: onClick,
3388
- onDelete: onDelete
3501
+ onDelete: onDelete,
3502
+ visibleStartY: visibleStartY,
3503
+ visibleEndY: visibleEndY
3389
3504
  };
3390
3505
  var tableProps = {
3391
3506
  rowHeight: rowHeight,